@acorex/platform 20.9.19 → 20.9.21

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.
@@ -5442,12 +5442,16 @@ class AXPEntityMasterListViewModel {
5442
5442
  const entitySetting = await this.settings.get(this.settingEntityKey);
5443
5443
  selectedViewName = entitySetting?.list?.currentView;
5444
5444
  }
5445
+ // URL `view` wins; fall back to persisted currentView when the query param is absent.
5445
5446
  const resolvedViewName = viewName ?? selectedViewName;
5446
5447
  const currentViewName = this.view().name;
5447
5448
  const currentViewUnavailable = !availableViews.some((v) => v.name === currentViewName);
5448
5449
  const nextView = availableViews.find((c) => c.name == resolvedViewName) ??
5449
5450
  (currentViewUnavailable ? availableViews[0] : this.view());
5450
- const shouldApplyViewState = viewName != currentViewName || nextView.name !== currentViewName || currentViewUnavailable;
5451
+ // Columns start empty; bootstrap them on first setView even when the view name is unchanged
5452
+ // (e.g. URL already has ?view=all matching the default view).
5453
+ const needsColumnBootstrap = this.columns().length === 0;
5454
+ const shouldApplyViewState = nextView.name !== currentViewName || currentViewUnavailable || needsColumnBootstrap;
5451
5455
  if (shouldApplyViewState) {
5452
5456
  this.view.set(nextView);
5453
5457
  this.applyViewSorts();
@@ -5491,6 +5495,8 @@ class AXPEntityMasterListViewModel {
5491
5495
  /** When true, pager changes are not persisted (programmatic UI sync). */
5492
5496
  this.skipListPagingPersistence = false;
5493
5497
  this.listPersistenceMode = null;
5498
+ /** Serializes user-setting updates for this entity list to avoid lost merges (e.g. filters vs paging). */
5499
+ this.settingsUpdateChain = Promise.resolve();
5494
5500
  this.events$ = new Subject();
5495
5501
  //****************** Views ******************//
5496
5502
  this.allViews = computed(() => {
@@ -5774,7 +5780,10 @@ class AXPEntityMasterListViewModel {
5774
5780
  return this.listPersistenceMode;
5775
5781
  }
5776
5782
  const value = await this.settings.get(AXPCommonSettings.EntityListPersistenceMode);
5777
- this.listPersistenceMode = normalizeEntityListPersistenceMode(value);
5783
+ const resolved = value != null && typeof value === 'object' && 'value' in value
5784
+ ? value.value
5785
+ : value;
5786
+ this.listPersistenceMode = normalizeEntityListPersistenceMode(resolved);
5778
5787
  return this.listPersistenceMode;
5779
5788
  }
5780
5789
  async shouldLoadPersistedListState() {
@@ -5820,17 +5829,16 @@ class AXPEntityMasterListViewModel {
5820
5829
  }
5821
5830
  this.loadListPagingFromViewSettings(listViewSetting);
5822
5831
  if (columns && columnVisibilityMap && columnWidthsMap) {
5823
- this.columns.update((prev) => prev
5824
- .map((c) => {
5825
- const columnKey = c.column?.options?.dataPath ?? c.name;
5826
- return {
5827
- ...c,
5828
- width: defaultTo(columnWidthsMap.get(columnKey), c.column?.options?.width),
5829
- visible: columnVisibilityMap.get(columnKey) ?? c.visible,
5830
- };
5831
- }) // Update visibility
5832
- .sort((a, b) => columns.findIndex((col) => col.name === (a.column?.options?.dataPath ?? a.name)) -
5833
- columns.findIndex((col) => col.name === (b.column?.options?.dataPath ?? b.name))));
5832
+ this.columns.update((prev) => {
5833
+ const next = [...prev].sort((a, b) => columns.findIndex((col) => col.name === (a.column?.options?.dataPath ?? a.name)) -
5834
+ columns.findIndex((col) => col.name === (b.column?.options?.dataPath ?? b.name)));
5835
+ for (const column of next) {
5836
+ const columnKey = column.column?.options?.dataPath ?? column.name;
5837
+ column.width = defaultTo(columnWidthsMap.get(columnKey), column.column?.options?.width);
5838
+ column.visible = columnVisibilityMap.get(columnKey) ?? column.visible;
5839
+ }
5840
+ return next;
5841
+ });
5834
5842
  }
5835
5843
  if (Array.isArray(sorts) && sorts.length) {
5836
5844
  this.setActiveSortsFromQueries(sorts);
@@ -5923,17 +5931,41 @@ class AXPEntityMasterListViewModel {
5923
5931
  const wasExpanded = meta?.['expanded'] === true;
5924
5932
  this.updateExpandedRowId(rowId, !wasExpanded);
5925
5933
  }
5934
+ /**
5935
+ * User-applied filters to persist (excludes hidden view conditions and empty values).
5936
+ */
5937
+ getPersistableFilterQueries(queries = this.filterQueries()) {
5938
+ return queries.filter((f) => {
5939
+ if (f.hidden === true) {
5940
+ return false;
5941
+ }
5942
+ if (f.readOnly === true) {
5943
+ return false;
5944
+ }
5945
+ const value = f.value;
5946
+ if (value === undefined || value === null || value === '') {
5947
+ return false;
5948
+ }
5949
+ if (Array.isArray(value) && value.length === 0) {
5950
+ return false;
5951
+ }
5952
+ return true;
5953
+ });
5954
+ }
5955
+ enqueueSettingsUpdate(updateFn) {
5956
+ const run = () => this.settings.scope(AXPPlatformScope.User).update(this.settingEntityKey, updateFn);
5957
+ const next = this.settingsUpdateChain.then(run);
5958
+ this.settingsUpdateChain = next.catch(() => undefined);
5959
+ return next;
5960
+ }
5926
5961
  async saveSettings(changesType, data) {
5927
5962
  if (!(await this.shouldPersistListState())) {
5928
5963
  return;
5929
5964
  }
5930
- const updateSettings = (updateFn) => {
5931
- this.settings.scope(AXPPlatformScope.User).update(this.settingEntityKey, updateFn);
5932
- };
5933
5965
  switch (changesType) {
5934
5966
  case 'columnSizes': {
5935
5967
  const columnSizeData = data;
5936
- updateSettings((prev) => {
5968
+ await this.enqueueSettingsUpdate((prev) => {
5937
5969
  const field = columnSizeData.dataField.split('-')[1];
5938
5970
  const newSettings = { ...prev };
5939
5971
  const existingColumns = prev?.list?.views?.[this.view().name]?.columns;
@@ -5960,7 +5992,7 @@ class AXPEntityMasterListViewModel {
5960
5992
  }
5961
5993
  case 'columnOrders': {
5962
5994
  const orderedColumns = data;
5963
- updateSettings((prev) => {
5995
+ await this.enqueueSettingsUpdate((prev) => {
5964
5996
  const newSettings = { ...prev };
5965
5997
  set(newSettings, `list.views.${this.view().name}.columns`, orderedColumns.map((c) => ({
5966
5998
  name: c.column?.options?.dataPath ?? c.name,
@@ -5972,7 +6004,7 @@ class AXPEntityMasterListViewModel {
5972
6004
  break;
5973
6005
  }
5974
6006
  case 'view':
5975
- updateSettings((prev) => ({
6007
+ await this.enqueueSettingsUpdate((prev) => ({
5976
6008
  ...prev,
5977
6009
  list: {
5978
6010
  ...prev?.list,
@@ -5981,7 +6013,7 @@ class AXPEntityMasterListViewModel {
5981
6013
  }));
5982
6014
  break;
5983
6015
  case 'pageSize':
5984
- updateSettings((prev) => ({
6016
+ await this.enqueueSettingsUpdate((prev) => ({
5985
6017
  ...prev,
5986
6018
  list: {
5987
6019
  ...prev?.list,
@@ -6000,7 +6032,7 @@ class AXPEntityMasterListViewModel {
6000
6032
  }));
6001
6033
  break;
6002
6034
  case 'listPaging':
6003
- updateSettings((prev) => ({
6035
+ await this.enqueueSettingsUpdate((prev) => ({
6004
6036
  ...prev,
6005
6037
  list: {
6006
6038
  ...prev?.list,
@@ -6016,7 +6048,7 @@ class AXPEntityMasterListViewModel {
6016
6048
  }));
6017
6049
  break;
6018
6050
  case 'filters':
6019
- updateSettings((prev) => ({
6051
+ await this.enqueueSettingsUpdate((prev) => ({
6020
6052
  ...prev,
6021
6053
  list: {
6022
6054
  ...prev?.list,
@@ -6031,7 +6063,7 @@ class AXPEntityMasterListViewModel {
6031
6063
  }));
6032
6064
  break;
6033
6065
  case 'sorts':
6034
- updateSettings((prev) => ({
6066
+ await this.enqueueSettingsUpdate((prev) => ({
6035
6067
  ...prev,
6036
6068
  list: {
6037
6069
  ...prev?.list,
@@ -6046,7 +6078,7 @@ class AXPEntityMasterListViewModel {
6046
6078
  }));
6047
6079
  break;
6048
6080
  case 'expandedRows':
6049
- updateSettings((prev) => ({
6081
+ await this.enqueueSettingsUpdate((prev) => ({
6050
6082
  ...prev,
6051
6083
  list: {
6052
6084
  ...prev?.list,
@@ -6061,7 +6093,7 @@ class AXPEntityMasterListViewModel {
6061
6093
  }));
6062
6094
  break;
6063
6095
  case 'listLayout':
6064
- updateSettings((prev) => ({
6096
+ await this.enqueueSettingsUpdate((prev) => ({
6065
6097
  ...prev,
6066
6098
  list: {
6067
6099
  ...prev?.list,
@@ -6070,7 +6102,7 @@ class AXPEntityMasterListViewModel {
6070
6102
  }));
6071
6103
  break;
6072
6104
  case 'cardContentExpanded':
6073
- updateSettings((prev) => ({
6105
+ await this.enqueueSettingsUpdate((prev) => ({
6074
6106
  ...prev,
6075
6107
  list: {
6076
6108
  ...prev?.list,
@@ -6302,9 +6334,10 @@ class AXPEntityMasterListViewModel {
6302
6334
  /**
6303
6335
  * Records the current route query context after initial resolver / view init so the first
6304
6336
  * subscription emission does not re-sync unnecessarily.
6337
+ * Pass `overrides` when about to `replaceUrl` query params so the upcoming emission is treated as synced.
6305
6338
  */
6306
- markRouteQueryContextSynced(queryParamMap) {
6307
- this.routeQueryContextKey = this.buildRouteQueryContextKey(queryParamMap);
6339
+ markRouteQueryContextSynced(queryParamMap, overrides) {
6340
+ this.routeQueryContextKey = this.buildRouteQueryContextKey(queryParamMap, overrides);
6308
6341
  }
6309
6342
  /**
6310
6343
  * Reacts to any route query param change while the list route is reused (`reuse: queryParamsChange`).
@@ -6324,21 +6357,36 @@ class AXPEntityMasterListViewModel {
6324
6357
  if (filtersChanged || viewChanged) {
6325
6358
  this.lastAppliedFilterKey = null;
6326
6359
  this.lastAppliedSortKey = null;
6360
+ // applyFilterAndSort already emits refresh — avoid a second reloadListData in the host.
6327
6361
  await this.applyFilterAndSort();
6362
+ return { reloadList: false };
6328
6363
  }
6364
+ // Other query-param context changes (e.g. expression-driven visibility) still need a list reload.
6329
6365
  return { reloadList: true };
6330
6366
  }
6331
- buildRouteQueryContextKey(queryParamMap) {
6332
- return [...queryParamMap.keys]
6367
+ buildRouteQueryContextKey(queryParamMap, overrides) {
6368
+ const params = {};
6369
+ for (const key of queryParamMap.keys) {
6370
+ params[key] = queryParamMap.get(key) ?? '';
6371
+ }
6372
+ if (overrides) {
6373
+ for (const [key, value] of Object.entries(overrides)) {
6374
+ if (value == null) {
6375
+ delete params[key];
6376
+ }
6377
+ else {
6378
+ params[key] = value;
6379
+ }
6380
+ }
6381
+ }
6382
+ return Object.keys(params)
6333
6383
  .sort()
6334
- .map((key) => `${key}=${queryParamMap.get(key) ?? ''}`)
6384
+ .map((key) => `${key}=${params[key]}`)
6335
6385
  .join('&');
6336
6386
  }
6337
6387
  async syncFiltersFromRouteQueryParam(filtersJson) {
6338
6388
  const nextCanonical = AXPEntityMasterListViewModel.parseQueryParamFiltersToCanonical(filtersJson);
6339
- const currentCanonical = this.hasQueryParamsFilters
6340
- ? this.filtersQueryParamCanonical(this.filterQueries())
6341
- : null;
6389
+ const currentCanonical = this.filtersQueryParamCanonical(this.filterQueries());
6342
6390
  if (nextCanonical === currentCanonical) {
6343
6391
  return false;
6344
6392
  }
@@ -6855,12 +6903,12 @@ const AXPEntityListViewModelResolver = async (route, state, service = inject(AXP
6855
6903
  const entityName = route.paramMap.get('entity');
6856
6904
  try {
6857
6905
  const vm = await service.create(moduleName, entityName);
6858
- // Check if filters are provided in query params
6906
+ // URL `filters` are for one-off deep links only; persisted list state loads from user settings.
6859
6907
  const filtersParam = route.queryParamMap.get('filters');
6860
- if (filtersParam) {
6908
+ const shouldLoadPersisted = await vm.shouldLoadPersistedListState();
6909
+ if (filtersParam && !shouldLoadPersisted) {
6861
6910
  const applied = vm.applyFiltersFromQueryParams(filtersParam);
6862
6911
  if (applied) {
6863
- // Trigger filter and sort application
6864
6912
  await vm.applyFilterAndSort();
6865
6913
  }
6866
6914
  }
@@ -19522,11 +19570,74 @@ function resolveFileUploaderEntityScope(options, rowData, fieldFallback) {
19522
19570
  }
19523
19571
  return { name: entityName.trim(), id: entityId, field: field.trim() };
19524
19572
  }
19573
+ /**
19574
+ * Attachment field names registered by the attachments plugin (`extensions.attachments`)
19575
+ * or properties using the `attachments` widget interface.
19576
+ */
19577
+ function resolveEntityAttachmentFieldNames(def) {
19578
+ const fields = new Set();
19579
+ const attachCfg = def?.extensions?.attachments;
19580
+ if (attachCfg != null && typeof attachCfg === 'object') {
19581
+ for (const key of Object.keys(attachCfg)) {
19582
+ if (key.trim()) {
19583
+ fields.add(key);
19584
+ }
19585
+ }
19586
+ }
19587
+ const props = def?.properties ?? [];
19588
+ for (const prop of props) {
19589
+ if (prop?.name?.trim() && prop.schema?.interface?.type === 'attachments') {
19590
+ fields.add(prop.name);
19591
+ }
19592
+ }
19593
+ return fields;
19594
+ }
19595
+ /** True when a hydrated key path belongs to a lazy attachment plugin field (top-level property). */
19596
+ function isLazyAttachmentFieldPath(keyPath, lazyFields) {
19597
+ if (!lazyFields.size || !keyPath.trim()) {
19598
+ return false;
19599
+ }
19600
+ const root = keyPath.split(/[.[\]]/)[0];
19601
+ return lazyFields.has(root);
19602
+ }
19525
19603
  //#endregion
19526
19604
 
19527
19605
  /** Trace namespace for file-uploader attachment column, load/save, and hydration. */
19528
19606
  const FILE_UPLOADER_TRACE_NS = 'file-uploader-attachments';
19529
19607
 
19608
+ /**
19609
+ * Loads and hydrates entity attachment field values via `FileUploader:LoadFiles`.
19610
+ * Used when read middleware keeps storage refs and the UI mounts the attachments widget.
19611
+ */
19612
+ async function fetchHydratedEntityAttachments(queryExecutor, scope) {
19613
+ AXPDebugService.instance?.trace(FILE_UPLOADER_TRACE_NS, 'lazy-hydrate', 'Loading attachments on widget display', () => ({
19614
+ entity: scope.name,
19615
+ entityId: scope.id,
19616
+ field: scope.field,
19617
+ }));
19618
+ try {
19619
+ const result = await queryExecutor.fetch('FileUploader:LoadFiles', scope);
19620
+ const files = result?.files ?? [];
19621
+ AXPDebugService.instance?.trace(FILE_UPLOADER_TRACE_NS, 'lazy-hydrate', 'Attachments loaded on widget display', () => ({
19622
+ entity: scope.name,
19623
+ entityId: scope.id,
19624
+ field: scope.field,
19625
+ fileCount: files.length,
19626
+ fileNames: files.map((file) => file.name),
19627
+ }));
19628
+ return files;
19629
+ }
19630
+ catch (error) {
19631
+ AXPDebugService.instance?.warn(FILE_UPLOADER_TRACE_NS, 'lazy-hydrate', 'Failed to load attachments on widget display', () => ({
19632
+ entity: scope.name,
19633
+ entityId: scope.id,
19634
+ field: scope.field,
19635
+ error: error instanceof Error ? error.message : String(error),
19636
+ }));
19637
+ throw error;
19638
+ }
19639
+ }
19640
+
19530
19641
  class AXPFileUploaderLoadFilesQuery {
19531
19642
  constructor() {
19532
19643
  //#region ---- Services & Dependencies ----
@@ -19839,6 +19950,7 @@ class AXPFileUploaderWidgetEditComponent extends AXPValueWidgetComponent {
19839
19950
  this.hooks = inject(AXPHookService);
19840
19951
  this.fileActionsService = inject(AXPFileActionsService);
19841
19952
  this.commandExecutor = inject(AXPCommandExecutor);
19953
+ this.queryExecutor = inject(AXPQueryExecutor);
19842
19954
  this.toastService = inject(AXToastService);
19843
19955
  this.translateService = inject(AXTranslationService);
19844
19956
  //#region ---- Dirty tracking (deferred save pages) ----
@@ -19852,17 +19964,30 @@ class AXPFileUploaderWidgetEditComponent extends AXPValueWidgetComponent {
19852
19964
  /** Status before soft-delete; used for restore when baseline was not synced (section layout). */
19853
19965
  this.statusBeforeDelete = new Map();
19854
19966
  this.autoBaselineSynced = signal(false, ...(ngDevMode ? [{ debugName: "autoBaselineSynced" }] : /* istanbul ignore next */ []));
19967
+ this.hydrateRequestId = 0;
19855
19968
  /** Sync baseline from context when not wired by a deferred-save page (section layout). */
19856
19969
  this.baselineInitEffect = effect(() => {
19857
19970
  if (this.autoBaselineSynced()) {
19858
19971
  return;
19859
19972
  }
19860
19973
  const value = this.getValue();
19861
- if (value == null) {
19974
+ if (value == null || attachmentNeedsHydration(value)) {
19862
19975
  return;
19863
19976
  }
19864
19977
  this.syncBaseline(value);
19865
19978
  }, ...(ngDevMode ? [{ debugName: "baselineInitEffect" }] : /* istanbul ignore next */ []));
19979
+ /** Hydrate attachment refs when the widget is shown (read middleware keeps refs lazy). */
19980
+ this.lazyHydrateEffect = effect(() => {
19981
+ const value = this.getValue();
19982
+ if (!attachmentNeedsHydration(value)) {
19983
+ return;
19984
+ }
19985
+ const scope = resolveFileUploaderEntityScope(this.options(), this.contextService.snapshot(), resolveAttachmentFieldPath(this.options(), this.path));
19986
+ if (!scope?.id) {
19987
+ return;
19988
+ }
19989
+ void this.hydrateAttachments(scope);
19990
+ }, ...(ngDevMode ? [{ debugName: "lazyHydrateEffect" }] : /* istanbul ignore next */ []));
19866
19991
  //#endregion
19867
19992
  this.multiple = computed(() => this.options()['multiple'], ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
19868
19993
  this.acceptOverride = signal(undefined, ...(ngDevMode ? [{ debugName: "acceptOverride" }] : /* istanbul ignore next */ []));
@@ -19939,6 +20064,24 @@ class AXPFileUploaderWidgetEditComponent extends AXPValueWidgetComponent {
19939
20064
  this.configureFromHooks();
19940
20065
  this.loadActions();
19941
20066
  }
20067
+ async hydrateAttachments(scope) {
20068
+ const requestId = ++this.hydrateRequestId;
20069
+ try {
20070
+ const files = await fetchHydratedEntityAttachments(this.queryExecutor, scope);
20071
+ if (requestId !== this.hydrateRequestId) {
20072
+ return;
20073
+ }
20074
+ this.skipDirtyEvaluation = true;
20075
+ this.setValue(cloneDeep(files));
20076
+ this.skipDirtyEvaluation = false;
20077
+ this.syncBaseline(files);
20078
+ }
20079
+ catch {
20080
+ if (requestId !== this.hydrateRequestId) {
20081
+ return;
20082
+ }
20083
+ }
20084
+ }
19942
20085
  setValue(value) {
19943
20086
  super.setValue(value);
19944
20087
  if (this.skipDirtyEvaluation) {
@@ -20496,8 +20639,21 @@ var fileUploaderWidgetEdit_component = /*#__PURE__*/Object.freeze({
20496
20639
 
20497
20640
  class AXPFileUploaderWidgetViewComponent extends AXPValueWidgetComponent {
20498
20641
  constructor() {
20499
- super(...arguments);
20642
+ super();
20643
+ this.queryExecutor = inject(AXPQueryExecutor);
20644
+ this.hydrateRequestId = 0;
20500
20645
  this.files = computed(() => (this.getValue() ?? []).filter(file => file.status !== 'deleted') ?? [], ...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
20646
+ effect(() => {
20647
+ const value = this.getValue();
20648
+ if (!attachmentNeedsHydration(value)) {
20649
+ return;
20650
+ }
20651
+ const scope = resolveFileUploaderEntityScope(this.options(), this.contextService.snapshot(), resolveAttachmentFieldPath(this.options(), this.path));
20652
+ if (!scope?.id) {
20653
+ return;
20654
+ }
20655
+ void this.hydrateAttachments(scope);
20656
+ });
20501
20657
  }
20502
20658
  get __class() {
20503
20659
  const cls = {};
@@ -20505,7 +20661,24 @@ class AXPFileUploaderWidgetViewComponent extends AXPValueWidgetComponent {
20505
20661
  cls[`ax-flex-1`] = true;
20506
20662
  return cls;
20507
20663
  }
20508
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFileUploaderWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
20664
+ async hydrateAttachments(scope) {
20665
+ const requestId = ++this.hydrateRequestId;
20666
+ try {
20667
+ const files = await fetchHydratedEntityAttachments(this.queryExecutor, scope);
20668
+ if (requestId !== this.hydrateRequestId) {
20669
+ return;
20670
+ }
20671
+ const path = this.fullPath();
20672
+ if (!path) {
20673
+ return;
20674
+ }
20675
+ this.contextService.update(path, files, { origin: 'system' });
20676
+ }
20677
+ catch {
20678
+ /* keep refs; popover / edit can retry */
20679
+ }
20680
+ }
20681
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFileUploaderWidgetViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
20509
20682
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPFileUploaderWidgetViewComponent, isStandalone: true, selector: "axp-file-uploader-widget-view", host: { properties: { "class": "this.__class" } }, usesInheritance: true, ngImport: i0, template: `
20510
20683
  <axp-file-list [files]="files()" [readonly]="true"></axp-file-list>
20511
20684
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXUploaderModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPFileListComponent, selector: "axp-file-list", inputs: ["readonly", "fileEditable", "enableTitleDescription", "multiple", "look", "titleKey", "showLabel", "linksLayout", "files", "plugins", "excludePlugins", "capabilities"], outputs: ["onRemove", "onRevert", "onRename"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -20530,7 +20703,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
20530
20703
  ],
20531
20704
  inputs: [],
20532
20705
  }]
20533
- }], propDecorators: { __class: [{
20706
+ }], ctorParameters: () => [], propDecorators: { __class: [{
20534
20707
  type: HostBinding,
20535
20708
  args: ['class']
20536
20709
  }] } });
@@ -20698,10 +20871,12 @@ var index = /*#__PURE__*/Object.freeze({
20698
20871
  AXPFileUploaderWidgetEditComponent: AXPFileUploaderWidgetEditComponent,
20699
20872
  AXPFileUploaderWidgetService: AXPFileUploaderWidgetService,
20700
20873
  AXPFileUploaderWidgetViewComponent: AXPFileUploaderWidgetViewComponent,
20874
+ FILE_UPLOADER_TRACE_NS: FILE_UPLOADER_TRACE_NS,
20701
20875
  attachmentFieldCount: attachmentFieldCount,
20702
20876
  attachmentNeedsHydration: attachmentNeedsHydration,
20703
20877
  attachmentsSemanticallyEqual: attachmentsSemanticallyEqual,
20704
20878
  committedAttachments: committedAttachments,
20879
+ fetchHydratedEntityAttachments: fetchHydratedEntityAttachments,
20705
20880
  fingerprintAttachmentItem: fingerprintAttachmentItem,
20706
20881
  fingerprintAttachments: fingerprintAttachments,
20707
20882
  hasFileUploaderTitleOrDescriptionFields: hasFileUploaderTitleOrDescriptionFields,
@@ -20711,9 +20886,11 @@ var index = /*#__PURE__*/Object.freeze({
20711
20886
  isAttachmentStorageRef: isAttachmentStorageRef,
20712
20887
  isFileListItem: isFileListItem,
20713
20888
  isFileUploaderEditDialogAuto: isFileUploaderEditDialogAuto,
20889
+ isLazyAttachmentFieldPath: isLazyAttachmentFieldPath,
20714
20890
  normalizeEntityFieldToFileList: normalizeEntityFieldToFileList,
20715
20891
  persistedAttachments: persistedAttachments,
20716
20892
  resolveAttachmentFieldPath: resolveAttachmentFieldPath,
20893
+ resolveEntityAttachmentFieldNames: resolveEntityAttachmentFieldNames,
20717
20894
  resolveFileUploaderEditDialog: resolveFileUploaderEditDialog,
20718
20895
  resolveFileUploaderEntityScope: resolveFileUploaderEntityScope
20719
20896
  });
@@ -25020,7 +25197,7 @@ const AXPCrudModifier = {
25020
25197
  queries.list = {
25021
25198
  execute: async (e) => {
25022
25199
  const res = await dataService.query(e);
25023
- //console.log('query', res, ctx.module.get() + '.' + ctx.name.get(), e);
25200
+ // console.log('query', res, ctx.module.get() + '.' + ctx.name.get(), e);
25024
25201
  return res;
25025
25202
  },
25026
25203
  type: AXPEntityQueryType.List,
@@ -26508,5 +26685,5 @@ function detectEntityChanges(oldObj, newObj) {
26508
26685
  * Generated bundle index. Do not edit.
26509
26686
  */
26510
26687
 
26511
- export { ATTACHMENTS_PAGE_COMPONENT_KEY, AXMEntityCrudService, AXMEntityCrudServiceImpl, AXPCategoryTreeService, AXPCreateEntityCommand, AXPCreateEntityWorkflow, AXPDataSeederService, AXPDeleteEntityWorkflow, AXPEditFileUploaderCommand, AXPEntitiesListDataSourceDefinition, AXPEntityApplyUpdatesAction, AXPEntityCategoryTreeSelectorComponent, AXPEntityCategoryWidget, AXPEntityCategoryWidgetColumnComponent, AXPEntityCategoryWidgetEditComponent, AXPEntityCategoryWidgetViewComponent, AXPEntityCommandTriggerViewModel, AXPEntityCreateEvent, AXPEntityCreatePopupAction, AXPEntityCreateSubmittedAction, AXPEntityCreateViewElementViewModel, AXPEntityCreateViewModelFactory, AXPEntityCreateViewSectionViewModel, AXPEntityDataProvider, AXPEntityDataProviderImpl, AXPEntityDataSelectorRowActionsService, AXPEntityDataSelectorService, AXPEntityDefinitionProviderWidget, AXPEntityDefinitionProviderWidgetEditComponent, AXPEntityDefinitionRegistryService, AXPEntityDeletedEvent, AXPEntityDetailListViewModel, AXPEntityDetailPopoverComponent, AXPEntityDetailPopoverService, AXPEntityDetailViewModelFactory, AXPEntityDetailViewModelResolver, AXPEntityEventDispatcherService, AXPEntityFormBuilderService, AXPEntityListPersistenceModeDefault, AXPEntityListTableService, AXPEntityListToolbarService, AXPEntityListViewCardFieldViewModel, AXPEntityListViewColumnViewModel, AXPEntityListViewModelFactory, AXPEntityListViewModelResolver, AXPEntityListWidget, AXPEntityListWidgetViewComponent, AXPEntityMasterCreateViewModel, AXPEntityMasterListCardSelectActionName, AXPEntityMasterListViewModel, AXPEntityMasterListViewQueryViewModel, AXPEntityMasterSingleElementViewModel, AXPEntityMasterSingleViewGroupViewModel, AXPEntityMasterSingleViewModel, AXPEntityMasterUpdateElementViewModel, AXPEntityMasterUpdateViewModel, AXPEntityMasterUpdateViewModelFactory, AXPEntityMiddleware, AXPEntityModifyConfirmedAction, AXPEntityModifyEvent, AXPEntityModifySectionPopupAction, AXPEntityModule, AXPEntityPerformDeleteAction, AXPEntityPreloadFiltersContainerComponent, AXPEntityPreloadFiltersViewModel, AXPEntityPreloadFiltersViewModelResolver, AXPEntityResolver, AXPEntityService, AXPEntityStorageService, AXPEntityUpdateViewSectionViewModel, AXPFileListComponent, AXPFileUploaderLoadFilesQuery, AXPFileUploaderSaveFilesCommand, AXPFileUploaderWidget, AXPFileUploaderWidgetColumnComponent, AXPFileUploaderWidgetEditComponent, AXPFileUploaderWidgetService, AXPFileUploaderWidgetViewComponent, AXPGetEntityDetailsQuery, AXPLayoutOrderingConfigService, AXPLookupWidget, AXPLookupWidgetColumnComponent, AXPLookupWidgetEditComponent, AXPLookupWidgetViewComponent, AXPMiddlewareAbortError, AXPMiddlewareEntityStorageService, AXPModifyEntitySectionWorkflow, AXPMultiSourceDefinitionProviderContext, AXPMultiSourceDefinitionProviderService, AXPMultiSourceFederatedSearchService, AXPMultiSourceSelectorComponent, AXPMultiSourceSelectorService, AXPMultiSourceSelectorWidget, AXPMultiSourceSelectorWidgetColumnComponent, AXPMultiSourceSelectorWidgetEditComponent, AXPMultiSourceSelectorWidgetViewComponent, AXPMultiSourceType, AXPOpenEntityDetailsCommand, AXPQuickEntityModifyPopupAction, AXPQuickModifyEntityWorkflow, AXPRelatedColumnEnrichmentService, AXPRelatedColumnMetadataResolver, AXPSelectorStructureWidget, AXPSelectorStructureWidgetColumnComponent, AXPSelectorStructureWidgetEditComponent, AXPSelectorStructureWidgetViewComponent, AXPShowDetailViewAction, AXPShowDetailsViewWorkflow, AXPShowListViewAction, AXPShowListViewWorkflow, AXPTruncatedBreadcrumbComponent, AXPUpdateEntityCommand, AXPViewEntityDetailsCommand, AXP_APPEARANCE_SECTION_ORDER, AXP_CATEGORY_TREE_ROOT_TITLE_I18N_KEY, AXP_CLASSIFICATION_SECTION_ORDER, AXP_DATA_SEEDER_TOKEN, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_DEFINITION_LOADER, AXP_ENTITY_MODIFIER, AXP_ENTITY_STORAGE_BACKEND, AXP_ENTITY_STORAGE_MIDDLEWARE, AXP_MULTI_SOURCE_DEFINITION_PROVIDER, DEFAULT_COLUMN_ORDER, DEFAULT_PAIR_SPAN_RULES, DEFAULT_PROPERTY_ORDER, DEFAULT_SECTION_ORDER, ENTITY_FORM_ACTION_FIRST_STEP_CONTINUE, ENTITY_LIST_ROUTE_CONTEXT_SESSION_KEY, EntityBuilder, EntityDataAccessor, actionExists, applyDataSourcePagingWithoutLoad, attachmentFieldCount, attachmentNeedsHydration, attachmentsPlugin, attachmentsSemanticallyEqual, axpCreateEntityAiToolInputDefaults, axpCreateEntityCommandDefinition, canPersistEntityListState, cloneLayoutArrays, columnOrderingMiddleware, columnOrderingMiddlewareProvider, columnWidthMiddleware, columnWidthMiddlewareProvider, commandMessageTextForError, committedAttachments, computeEntityAggregates, createColumnOrderingMiddlewareProvider, createLayoutOrderingMiddlewareProvider, createModifierContext, defaultCardLayoutMiddleware, defaultCardLayoutMiddlewareProvider, defaultMultiLanguageMiddleware, defaultMultiLanguageMiddlewareProvider, detectEntityChanges, ensureLayoutPropertyView, ensureLayoutSection, ensureListActions, eventDispatchMiddleware, filterSortEntityRows, findEntityListRowDataInTree, fingerprintAttachmentItem, fingerprintAttachments, formatLookupItemDisplay, formatLookupItemDisplayAsync, getDataSourcePageIndex, getEntityListRowId, getMasterInterfacePropertySortKey, hasFileUploaderTitleOrDescriptionFields, hydrateAttachmentFieldToFileList, isAXPMiddlewareAbortError, isAttachmentFieldPresentOnRow, isAttachmentListEntry, isAttachmentStorageRef, isCategoryEntity, isCategoryFilter, isFileListItem, isFileUploaderEditDialogAuto, isLegacyEntityDataSelectorOptions, layoutOrderingMiddlewareFactory, layoutOrderingMiddlewareProvider, mapEntityStorageErrorToCommandResult, mapLegacyEntityDataSelectorOptions, normalizeEntityDataSelectorOptions, normalizeEntityFieldToFileList, normalizeEntityListPersistenceMode, normalizeListPaging, persistedAttachments, provideEntity, resolveAttachmentFieldPath, resolveEntityPluginDetailPageOrder, resolveFileUploaderEditDialog, resolveFileUploaderEntityScope, resolveLookupDisplayField, resolveLookupDisplayTemplate, restoreEntityListExpandedRows, runEntityQuery, searchResultDescriptionMiddleware, searchResultDescriptionMiddlewareProvider, shouldLoadEntityListStateFromStorage, shouldResetEntityListStateOnRouteEntry };
26688
+ export { ATTACHMENTS_PAGE_COMPONENT_KEY, AXMEntityCrudService, AXMEntityCrudServiceImpl, AXPCategoryTreeService, AXPCreateEntityCommand, AXPCreateEntityWorkflow, AXPDataSeederService, AXPDeleteEntityWorkflow, AXPEditFileUploaderCommand, AXPEntitiesListDataSourceDefinition, AXPEntityApplyUpdatesAction, AXPEntityCategoryTreeSelectorComponent, AXPEntityCategoryWidget, AXPEntityCategoryWidgetColumnComponent, AXPEntityCategoryWidgetEditComponent, AXPEntityCategoryWidgetViewComponent, AXPEntityCommandTriggerViewModel, AXPEntityCreateEvent, AXPEntityCreatePopupAction, AXPEntityCreateSubmittedAction, AXPEntityCreateViewElementViewModel, AXPEntityCreateViewModelFactory, AXPEntityCreateViewSectionViewModel, AXPEntityDataProvider, AXPEntityDataProviderImpl, AXPEntityDataSelectorRowActionsService, AXPEntityDataSelectorService, AXPEntityDefinitionProviderWidget, AXPEntityDefinitionProviderWidgetEditComponent, AXPEntityDefinitionRegistryService, AXPEntityDeletedEvent, AXPEntityDetailListViewModel, AXPEntityDetailPopoverComponent, AXPEntityDetailPopoverService, AXPEntityDetailViewModelFactory, AXPEntityDetailViewModelResolver, AXPEntityEventDispatcherService, AXPEntityFormBuilderService, AXPEntityListPersistenceModeDefault, AXPEntityListTableService, AXPEntityListToolbarService, AXPEntityListViewCardFieldViewModel, AXPEntityListViewColumnViewModel, AXPEntityListViewModelFactory, AXPEntityListViewModelResolver, AXPEntityListWidget, AXPEntityListWidgetViewComponent, AXPEntityMasterCreateViewModel, AXPEntityMasterListCardSelectActionName, AXPEntityMasterListViewModel, AXPEntityMasterListViewQueryViewModel, AXPEntityMasterSingleElementViewModel, AXPEntityMasterSingleViewGroupViewModel, AXPEntityMasterSingleViewModel, AXPEntityMasterUpdateElementViewModel, AXPEntityMasterUpdateViewModel, AXPEntityMasterUpdateViewModelFactory, AXPEntityMiddleware, AXPEntityModifyConfirmedAction, AXPEntityModifyEvent, AXPEntityModifySectionPopupAction, AXPEntityModule, AXPEntityPerformDeleteAction, AXPEntityPreloadFiltersContainerComponent, AXPEntityPreloadFiltersViewModel, AXPEntityPreloadFiltersViewModelResolver, AXPEntityResolver, AXPEntityService, AXPEntityStorageService, AXPEntityUpdateViewSectionViewModel, AXPFileListComponent, AXPFileUploaderLoadFilesQuery, AXPFileUploaderSaveFilesCommand, AXPFileUploaderWidget, AXPFileUploaderWidgetColumnComponent, AXPFileUploaderWidgetEditComponent, AXPFileUploaderWidgetService, AXPFileUploaderWidgetViewComponent, AXPGetEntityDetailsQuery, AXPLayoutOrderingConfigService, AXPLookupWidget, AXPLookupWidgetColumnComponent, AXPLookupWidgetEditComponent, AXPLookupWidgetViewComponent, AXPMiddlewareAbortError, AXPMiddlewareEntityStorageService, AXPModifyEntitySectionWorkflow, AXPMultiSourceDefinitionProviderContext, AXPMultiSourceDefinitionProviderService, AXPMultiSourceFederatedSearchService, AXPMultiSourceSelectorComponent, AXPMultiSourceSelectorService, AXPMultiSourceSelectorWidget, AXPMultiSourceSelectorWidgetColumnComponent, AXPMultiSourceSelectorWidgetEditComponent, AXPMultiSourceSelectorWidgetViewComponent, AXPMultiSourceType, AXPOpenEntityDetailsCommand, AXPQuickEntityModifyPopupAction, AXPQuickModifyEntityWorkflow, AXPRelatedColumnEnrichmentService, AXPRelatedColumnMetadataResolver, AXPSelectorStructureWidget, AXPSelectorStructureWidgetColumnComponent, AXPSelectorStructureWidgetEditComponent, AXPSelectorStructureWidgetViewComponent, AXPShowDetailViewAction, AXPShowDetailsViewWorkflow, AXPShowListViewAction, AXPShowListViewWorkflow, AXPTruncatedBreadcrumbComponent, AXPUpdateEntityCommand, AXPViewEntityDetailsCommand, AXP_APPEARANCE_SECTION_ORDER, AXP_CATEGORY_TREE_ROOT_TITLE_I18N_KEY, AXP_CLASSIFICATION_SECTION_ORDER, AXP_DATA_SEEDER_TOKEN, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_DEFINITION_LOADER, AXP_ENTITY_MODIFIER, AXP_ENTITY_STORAGE_BACKEND, AXP_ENTITY_STORAGE_MIDDLEWARE, AXP_MULTI_SOURCE_DEFINITION_PROVIDER, DEFAULT_COLUMN_ORDER, DEFAULT_PAIR_SPAN_RULES, DEFAULT_PROPERTY_ORDER, DEFAULT_SECTION_ORDER, ENTITY_FORM_ACTION_FIRST_STEP_CONTINUE, ENTITY_LIST_ROUTE_CONTEXT_SESSION_KEY, EntityBuilder, EntityDataAccessor, FILE_UPLOADER_TRACE_NS, actionExists, applyDataSourcePagingWithoutLoad, attachmentFieldCount, attachmentNeedsHydration, attachmentsPlugin, attachmentsSemanticallyEqual, axpCreateEntityAiToolInputDefaults, axpCreateEntityCommandDefinition, canPersistEntityListState, cloneLayoutArrays, columnOrderingMiddleware, columnOrderingMiddlewareProvider, columnWidthMiddleware, columnWidthMiddlewareProvider, commandMessageTextForError, committedAttachments, computeEntityAggregates, createColumnOrderingMiddlewareProvider, createLayoutOrderingMiddlewareProvider, createModifierContext, defaultCardLayoutMiddleware, defaultCardLayoutMiddlewareProvider, defaultMultiLanguageMiddleware, defaultMultiLanguageMiddlewareProvider, detectEntityChanges, ensureLayoutPropertyView, ensureLayoutSection, ensureListActions, eventDispatchMiddleware, fetchHydratedEntityAttachments, filterSortEntityRows, findEntityListRowDataInTree, fingerprintAttachmentItem, fingerprintAttachments, formatLookupItemDisplay, formatLookupItemDisplayAsync, getDataSourcePageIndex, getEntityListRowId, getMasterInterfacePropertySortKey, hasFileUploaderTitleOrDescriptionFields, hydrateAttachmentFieldToFileList, isAXPMiddlewareAbortError, isAttachmentFieldPresentOnRow, isAttachmentListEntry, isAttachmentStorageRef, isCategoryEntity, isCategoryFilter, isFileListItem, isFileUploaderEditDialogAuto, isLazyAttachmentFieldPath, isLegacyEntityDataSelectorOptions, layoutOrderingMiddlewareFactory, layoutOrderingMiddlewareProvider, mapEntityStorageErrorToCommandResult, mapLegacyEntityDataSelectorOptions, normalizeEntityDataSelectorOptions, normalizeEntityFieldToFileList, normalizeEntityListPersistenceMode, normalizeListPaging, persistedAttachments, provideEntity, resolveAttachmentFieldPath, resolveEntityAttachmentFieldNames, resolveEntityPluginDetailPageOrder, resolveFileUploaderEditDialog, resolveFileUploaderEntityScope, resolveLookupDisplayField, resolveLookupDisplayTemplate, restoreEntityListExpandedRows, runEntityQuery, searchResultDescriptionMiddleware, searchResultDescriptionMiddlewareProvider, shouldLoadEntityListStateFromStorage, shouldResetEntityListStateOnRouteEntry };
26512
26689
  //# sourceMappingURL=acorex-platform-layout-entity.mjs.map