@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.
- package/fesm2022/acorex-platform-layout-entity.mjs +58 -19
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widgets.mjs +57 -24
- package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-platform-layout-entity.d.ts +10 -1
|
@@ -1625,10 +1625,10 @@ class PropertyFilter {
|
|
|
1625
1625
|
customFilterDefinitions: relatedEntity.customFilterDefinitions,
|
|
1626
1626
|
...(foreignKeyField ? { foreignKeyField } : {}),
|
|
1627
1627
|
...(nestedCreateHiddenProperties?.length ? { nestedCreateHiddenProperties } : {}),
|
|
1628
|
-
...(
|
|
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
|
-
*
|
|
13212
|
+
* Captures hidden related-entity filters from the widget value before the toolbar can overwrite them.
|
|
13199
13213
|
*/
|
|
13200
|
-
|
|
13201
|
-
|
|
13202
|
-
|
|
13203
|
-
byField.set(filter.field, filter);
|
|
13214
|
+
captureScopedToolbarFiltersFromValue() {
|
|
13215
|
+
if (this.scopedToolbarFilters.length) {
|
|
13216
|
+
return;
|
|
13204
13217
|
}
|
|
13205
|
-
|
|
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
|
|
13209
|
-
|
|
13210
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
13343
|
-
if (!dataSource?.filter || !
|
|
13373
|
+
const filters = this.getMergedToolbarFilters();
|
|
13374
|
+
if (!dataSource?.filter || !filters.length) {
|
|
13344
13375
|
return false;
|
|
13345
13376
|
}
|
|
13346
|
-
dataSource.filter({ 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
|
|
13487
|
+
const mergedFilters = this.getMergedToolbarFilters();
|
|
13488
|
+
const shouldApplyFilters = changeTracker.isFilterChanged || (!isMounted && mergedFilters.length > 0);
|
|
13457
13489
|
if (shouldApplyFilters) {
|
|
13458
13490
|
dataSource.filter({
|
|
13459
|
-
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
|
],
|