@acorex/platform 20.9.45 → 20.9.46

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.
@@ -1625,10 +1625,10 @@ class PropertyFilter {
1625
1625
  customFilterDefinitions: relatedEntity.customFilterDefinitions,
1626
1626
  ...(foreignKeyField ? { foreignKeyField } : {}),
1627
1627
  ...(nestedCreateHiddenProperties?.length ? { nestedCreateHiddenProperties } : {}),
1628
- ...(syncRelatedFromRoot && relatedEntity.conditions?.length
1628
+ ...(relatedEntity.conditions?.length
1629
1629
  ? {
1630
1630
  relatedFilterConditionSpecs: cloneDeep(relatedEntity.conditions),
1631
- syncRelatedListFiltersFromDialogContext: true,
1631
+ ...(syncRelatedFromRoot ? { syncRelatedListFiltersFromDialogContext: true } : {}),
1632
1632
  }
1633
1633
  : {}),
1634
1634
  },
@@ -12420,6 +12420,18 @@ function applyIncludeExclude(items, include = [], exclude = []) {
12420
12420
  function getVisibleProperties(entity) {
12421
12421
  return entity.properties.filter((prop) => prop.schema?.visible !== false);
12422
12422
  }
12423
+ /**
12424
+ * Merges toolbar filters by `field`. Overlay entries win and keep parent-scope filters from being dropped.
12425
+ */
12426
+ function mergeEntityListToolbarFilters(baseFilters, overlayFilters) {
12427
+ const byField = new Map(baseFilters.map((filter) => [filter.field, filter]));
12428
+ for (const filter of overlayFilters) {
12429
+ if (filter.field) {
12430
+ byField.set(filter.field, filter);
12431
+ }
12432
+ }
12433
+ return [...byField.values()];
12434
+ }
12423
12435
  //#endregion
12424
12436
 
12425
12437
  class AXPEntityListTableService {
@@ -12873,6 +12885,8 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
12873
12885
  this.initListTimeoutId = null;
12874
12886
  /** Unpatched data-list refresh (hits the grid). Prefer this over the scoped patch to avoid recursion. */
12875
12887
  this.boundDataListRefresh = null;
12888
+ /** Parent-scope filters (related-entity conditions) that must survive user toolbar edits. */
12889
+ this.scopedToolbarFilters = [];
12876
12890
  //options
12877
12891
  this.entitySource = computed(() => this.options()['entity'], ...(ngDevMode ? [{ debugName: "entitySource" }] : /* istanbul ignore next */ []));
12878
12892
  this.excludeColumns = computed(() => this.options()['excludeColumns'], ...(ngDevMode ? [{ debugName: "excludeColumns" }] : /* istanbul ignore next */ []));
@@ -13195,22 +13209,36 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
13195
13209
  return ((!!entityName && pageId === entityName) || pageId === buildPageListWidgetName(entitySource));
13196
13210
  }
13197
13211
  /**
13198
- * Merges route filters into related-entity toolbar filters (route wins per field).
13212
+ * Captures hidden related-entity filters from the widget value before the toolbar can overwrite them.
13199
13213
  */
13200
- mergeToolbarFilters(baseFilters, routeFilters) {
13201
- const byField = new Map(baseFilters.map((filter) => [filter.field, filter]));
13202
- for (const filter of routeFilters) {
13203
- byField.set(filter.field, filter);
13214
+ captureScopedToolbarFiltersFromValue() {
13215
+ if (this.scopedToolbarFilters.length) {
13216
+ return;
13204
13217
  }
13205
- return [...byField.values()];
13218
+ const hidden = (this.getValue()?.toolbar?.filters ?? []).filter((filter) => filter.hidden === true);
13219
+ if (hidden.length) {
13220
+ this.scopedToolbarFilters = hidden;
13221
+ }
13222
+ }
13223
+ /**
13224
+ * Merges overlay filters into base filters (overlay wins per field).
13225
+ */
13226
+ mergeToolbarFilters(baseFilters, overlayFilters) {
13227
+ return mergeEntityListToolbarFilters(baseFilters, overlayFilters);
13206
13228
  }
13229
+ /**
13230
+ * User toolbar filters plus parent-scope (related-entity / route) filters. Scoped fields always win.
13231
+ */
13207
13232
  getMergedToolbarFilters() {
13208
- const base = (this.getValue()?.toolbar?.filters ?? []);
13209
- if (!this.shouldApplyRouteFilters()) {
13210
- return base;
13233
+ const user = (this.getValue()?.toolbar?.filters ?? []).filter((filter) => filter.hidden !== true);
13234
+ let scoped = this.scopedToolbarFilters;
13235
+ if (this.shouldApplyRouteFilters()) {
13236
+ const routeFilters = this.parseFiltersFromRoute();
13237
+ if (routeFilters.length) {
13238
+ scoped = this.mergeToolbarFilters(scoped, routeFilters);
13239
+ }
13211
13240
  }
13212
- const routeFilters = this.parseFiltersFromRoute();
13213
- return routeFilters.length ? this.mergeToolbarFilters(base, routeFilters) : base;
13241
+ return this.mergeToolbarFilters(user, scoped);
13214
13242
  }
13215
13243
  //#region ---- Scoped filter / initial load (race-safe) ----
13216
13244
  beginOp() {
@@ -13312,16 +13340,19 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
13312
13340
  eval: (path) => get(root, path),
13313
13341
  },
13314
13342
  };
13315
- const filters = await Promise.all(specs.map(async (c) => ({
13343
+ const relatedFilters = await Promise.all(specs.map(async (c) => ({
13316
13344
  field: c.name,
13317
13345
  operator: c.operator,
13318
13346
  value: await this.expressionEvaluator.evaluate(c.value, scope),
13319
13347
  hidden: true,
13320
13348
  })));
13349
+ this.scopedToolbarFilters = relatedFilters;
13321
13350
  if (this.isViewDestroyed || !this.fullPath()) {
13322
13351
  return;
13323
13352
  }
13324
13353
  const current = this.getValue();
13354
+ const user = (current?.toolbar?.filters ?? []).filter((filter) => filter.hidden !== true);
13355
+ const filters = this.mergeToolbarFilters(user, relatedFilters);
13325
13356
  if (isEqual(current?.toolbar?.filters, filters)) {
13326
13357
  return;
13327
13358
  }
@@ -13339,11 +13370,11 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
13339
13370
  pushToolbarFiltersToDataSource() {
13340
13371
  const listInstance = this.listWidget()?.instance;
13341
13372
  const dataSource = listInstance?.options?.()?.['dataSource'];
13342
- const toolbar = this.getValue()?.toolbar;
13343
- if (!dataSource?.filter || !toolbar?.filters?.length) {
13373
+ const filters = this.getMergedToolbarFilters();
13374
+ if (!dataSource?.filter || !filters.length) {
13344
13375
  return false;
13345
13376
  }
13346
- dataSource.filter({ filters: toolbar.filters });
13377
+ dataSource.filter({ filters });
13347
13378
  return true;
13348
13379
  }
13349
13380
  /**
@@ -13453,10 +13484,11 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
13453
13484
  * Applies filter and sort changes to the data source
13454
13485
  */
13455
13486
  applyDataSourceChanges(dataSource, queries, changeTracker, isMounted) {
13456
- const shouldApplyFilters = changeTracker.isFilterChanged || (!isMounted && (queries?.filters?.length ?? 0) > 0);
13487
+ const mergedFilters = this.getMergedToolbarFilters();
13488
+ const shouldApplyFilters = changeTracker.isFilterChanged || (!isMounted && mergedFilters.length > 0);
13457
13489
  if (shouldApplyFilters) {
13458
13490
  dataSource.filter({
13459
- filters: queries?.filters,
13491
+ filters: mergedFilters,
13460
13492
  });
13461
13493
  }
13462
13494
  if (changeTracker.isSortChanged) {
@@ -13511,6 +13543,7 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
13511
13543
  }
13512
13544
  async ngOnInit() {
13513
13545
  super.ngOnInit();
13546
+ this.captureScopedToolbarFiltersFromValue();
13514
13547
  const [moduleName, entityName] = this.entitySource().split('.');
13515
13548
  if (!moduleName || !entityName) {
13516
13549
  throw new Error('Invalid entity source');
@@ -23918,6 +23951,9 @@ class AXPPageListConverter extends AXPBaseRelatedEntityConverter {
23918
23951
  relatedTableColumns,
23919
23952
  customFilterDefinitions: relatedEntity.customFilterDefinitions,
23920
23953
  excludeProperties: relatedEntity.excludeProperties,
23954
+ ...(relatedEntity.conditions?.length
23955
+ ? { relatedFilterConditionSpecs: cloneDeep(relatedEntity.conditions) }
23956
+ : {}),
23921
23957
  },
23922
23958
  },
23923
23959
  ],
@@ -24037,6 +24073,9 @@ class AXPTabListConverter extends AXPBaseRelatedEntityConverter {
24037
24073
  relatedTableColumns,
24038
24074
  customFilterDefinitions: relatedEntity.customFilterDefinitions,
24039
24075
  excludeProperties: relatedEntity.excludeProperties,
24076
+ ...(relatedEntity.conditions?.length
24077
+ ? { relatedFilterConditionSpecs: cloneDeep(relatedEntity.conditions) }
24078
+ : {}),
24040
24079
  },
24041
24080
  },
24042
24081
  ],