@acorex/platform 20.3.0-next.8 → 20.3.0-next.9

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 (50) hide show
  1. package/common/index.d.ts +0 -2
  2. package/core/index.d.ts +72 -62
  3. package/fesm2022/acorex-platform-common.mjs +5 -10
  4. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-core.mjs +115 -115
  6. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-layout-builder.mjs +420 -24
  8. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-layout-components.mjs +1266 -153
  10. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-designer.mjs +19 -12
  12. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-entity.mjs +454 -505
  14. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-layout-views.mjs +14 -21
  16. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  17. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-BXbkGGei.mjs → acorex-platform-themes-default-entity-master-create-view.component-Ct-ri59W.mjs} +3 -3
  18. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Ct-ri59W.mjs.map +1 -0
  19. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-gQIK6PIx.mjs → acorex-platform-themes-default-entity-master-list-view.component-7BB4LdjK.mjs} +9 -9
  20. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-7BB4LdjK.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BDJR088o.mjs +101 -0
  22. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BDJR088o.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-themes-default.mjs +8 -8
  24. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  25. package/fesm2022/{acorex-platform-themes-shared-settings.provider-CXiRmniv.mjs → acorex-platform-themes-shared-settings.provider-CLUKU4y0.mjs} +2 -2
  26. package/fesm2022/acorex-platform-themes-shared-settings.provider-CLUKU4y0.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-themes-shared.mjs +154 -23
  28. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  29. package/fesm2022/{acorex-platform-widgets-file-list-popup.component-rW2RD35f.mjs → acorex-platform-widgets-file-list-popup.component-Cmtq2bBV.mjs} +3 -3
  30. package/fesm2022/acorex-platform-widgets-file-list-popup.component-Cmtq2bBV.mjs.map +1 -0
  31. package/fesm2022/{acorex-platform-widgets-page-widget-designer.component-DNvnQ4Mc.mjs → acorex-platform-widgets-page-widget-designer.component-D8ivmxzT.mjs} +2 -2
  32. package/fesm2022/acorex-platform-widgets-page-widget-designer.component-D8ivmxzT.mjs.map +1 -0
  33. package/fesm2022/{acorex-platform-widgets-tabular-data-edit-popup.component-CPVRbE8B.mjs → acorex-platform-widgets-tabular-data-edit-popup.component-CMqq_iOj.mjs} +8 -8
  34. package/fesm2022/acorex-platform-widgets-tabular-data-edit-popup.component-CMqq_iOj.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-widgets.mjs +4943 -4858
  36. package/fesm2022/acorex-platform-widgets.mjs.map +1 -1
  37. package/layout/builder/index.d.ts +60 -5
  38. package/layout/components/index.d.ts +501 -54
  39. package/layout/designer/index.d.ts +4 -2
  40. package/layout/entity/index.d.ts +45 -9
  41. package/package.json +9 -9
  42. package/widgets/index.d.ts +352 -300
  43. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-BXbkGGei.mjs.map +0 -1
  44. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-gQIK6PIx.mjs.map +0 -1
  45. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Bp1JLsj1.mjs +0 -101
  46. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Bp1JLsj1.mjs.map +0 -1
  47. package/fesm2022/acorex-platform-themes-shared-settings.provider-CXiRmniv.mjs.map +0 -1
  48. package/fesm2022/acorex-platform-widgets-file-list-popup.component-rW2RD35f.mjs.map +0 -1
  49. package/fesm2022/acorex-platform-widgets-page-widget-designer.component-DNvnQ4Mc.mjs.map +0 -1
  50. package/fesm2022/acorex-platform-widgets-tabular-data-edit-popup.component-CPVRbE8B.mjs.map +0 -1
@@ -1,11 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, Injectable, computed, signal, Injector, runInInjectionContext, EnvironmentInjector, viewChild, viewChildren, linkedSignal, effect, untracked, ChangeDetectionStrategy, Component, HostBinding, input, ElementRef, ApplicationRef, createComponent, ViewChild, NgModule } from '@angular/core';
3
3
  import { castArray, get, cloneDeep, set, merge, isNil, isEmpty, sortBy } from 'lodash-es';
4
- import * as i1$1 from '@acorex/cdk/common';
5
- import { AXDataSource, AXCommonModule } from '@acorex/cdk/common';
4
+ import { AXDataSource } from '@acorex/cdk/common';
6
5
  import { AXFormatService } from '@acorex/core/format';
7
6
  import { AXPFilterOperatorMiddlewareService, AXPEntityCommandScope, getEntityInfo, AXPSettingService, AXPRefreshEvent, AXPReloadEvent, AXPCleanNestedFilters, AXPWorkflowNavigateAction, AXPToastAction, AXP_SEARCH_DEFINITION_PROVIDER } from '@acorex/platform/common';
8
- import * as i1$3 from '@acorex/platform/core';
7
+ import * as i1$2 from '@acorex/platform/core';
9
8
  import { resolveActionLook, AXPExpressionEvaluatorService, AXPPlatformScope, AXPDistributedEventListenerService, getChangedPaths, extractValue, setSmart, AXPSystemActionType } from '@acorex/platform/core';
10
9
  import * as i2$2 from '@acorex/platform/workflow';
11
10
  import { AXPWorkflowService, ofType, createWorkFlowEvent, AXPWorkflowAction, AXPWorkflowModule } from '@acorex/platform/workflow';
@@ -16,7 +15,7 @@ import { Subject, takeUntil } from 'rxjs';
16
15
  import { AXPSessionService, AXPAuthGuard } from '@acorex/platform/auth';
17
16
  import { AXPCommandService, AXPQueryService, provideCommandSetups, provideQuerySetups } from '@acorex/platform/runtime';
18
17
  import { moveItemInArray } from '@angular/cdk/drag-drop';
19
- import * as i8 from '@acorex/core/translation';
18
+ import * as i6 from '@acorex/core/translation';
20
19
  import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
21
20
  import { AXDialogService } from '@acorex/components/dialog';
22
21
  import { AXLoadingDialogService } from '@acorex/components/loading-dialog';
@@ -29,10 +28,10 @@ import * as i3 from '@acorex/components/decorators';
29
28
  import { AXDecoratorModule } from '@acorex/components/decorators';
30
29
  import * as i4 from '@acorex/components/dropdown';
31
30
  import { AXDropdownModule } from '@acorex/components/dropdown';
32
- import * as i7 from '@angular/common';
31
+ import * as i5 from '@angular/common';
33
32
  import { CommonModule } from '@angular/common';
34
33
  import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY, AXP_ALLOW_CLEAR_PROPERTY, AXP_DATA_PROPERTY_GROUP, AXP_ALLOW_MULTIPLE_PROPERTY, AXPFileUploaderWidgetService } from '@acorex/platform/widgets';
35
- import * as i1$2 from '@angular/forms';
34
+ import * as i1$1 from '@angular/forms';
36
35
  import { FormsModule } from '@angular/forms';
37
36
  import * as i4$1 from '@acorex/components/loading';
38
37
  import { AXLoadingModule } from '@acorex/components/loading';
@@ -40,22 +39,18 @@ import * as i1 from '@acorex/components/badge';
40
39
  import { AXBadgeModule } from '@acorex/components/badge';
41
40
  import * as i5$1 from '@acorex/components/form';
42
41
  import { AXFormModule } from '@acorex/components/form';
43
- import * as i5 from '@acorex/components/search-box';
44
- import { AXSearchBoxModule, AXSearchBoxComponent } from '@acorex/components/search-box';
45
- import * as i7$1 from '@acorex/components/select-box';
42
+ import * as i6$2 from '@acorex/components/search-box';
43
+ import { AXSearchBoxComponent, AXSearchBoxModule } from '@acorex/components/search-box';
44
+ import * as i7 from '@acorex/components/select-box';
46
45
  import { AXSelectBoxModule } from '@acorex/components/select-box';
47
- import * as i6 from '@acorex/components/tag-box';
46
+ import * as i6$1 from '@acorex/components/tag-box';
48
47
  import { AXTagBoxComponent, AXTagBoxModule } from '@acorex/components/tag-box';
49
48
  import { AXValidationModule } from '@acorex/core/validation';
50
- import * as i4$2 from '@acorex/components/data-table';
51
- import { AXDataTableModule } from '@acorex/components/data-table';
52
- import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
53
- import { AXBasePageComponent } from '@acorex/components/page';
49
+ import { AXPDataSelectorService, AXPWidgetPropertyViewerComponent } from '@acorex/platform/layout/components';
54
50
  import * as i2 from '@acorex/components/popover';
55
51
  import { AXPopoverModule } from '@acorex/components/popover';
56
52
  import * as i2$1 from '@acorex/components/text-box';
57
53
  import { AXTextBoxModule, AXTextBoxComponent } from '@acorex/components/text-box';
58
- import { AXPWidgetPropertyViewerComponent } from '@acorex/platform/layout/components';
59
54
  import { transform, isEqual } from 'lodash';
60
55
 
61
56
  const AXP_DATA_SEEDER_TOKEN = new InjectionToken('AXP_DATA_SEEDER_TOKEN');
@@ -369,7 +364,7 @@ class AXPEntityDetailListViewModel {
369
364
  module: this.detailEntity()?.module,
370
365
  title: this.detailEntity()?.title,
371
366
  parentKey: this.detailEntity()?.parentKey,
372
- source: this.detailEntity()?.source,
367
+ source: `${this.detailEntity()?.module}.${this.detailEntity()?.name}`,
373
368
  },
374
369
  options,
375
370
  });
@@ -437,13 +432,6 @@ function createModifierContext(entity) {
437
432
  return ctx;
438
433
  },
439
434
  },
440
- source: {
441
- get: () => entity.source,
442
- set: (newValue) => {
443
- entity.source = newValue;
444
- return ctx;
445
- },
446
- },
447
435
  parentKey: {
448
436
  get: () => entity.parentKey,
449
437
  set: (newValue) => {
@@ -1542,7 +1530,7 @@ class AXPEntityMasterListViewModel {
1542
1530
  module: this.entityDef.module,
1543
1531
  title: this.entityDef.title,
1544
1532
  parentKey: this.entityDef.parentKey,
1545
- source: this.entityDef.source,
1533
+ source: `${this.entityDef.module}.${this.entityDef.name}`,
1546
1534
  },
1547
1535
  data: action?.scope == AXPEntityCommandScope.Selected ? this.selectedItems() : data,
1548
1536
  options: options,
@@ -1550,7 +1538,20 @@ class AXPEntityMasterListViewModel {
1550
1538
  });
1551
1539
  }
1552
1540
  else {
1553
- this.commandService.execute(command, options);
1541
+ // this.commandService.execute(command, options);
1542
+ this.commandService.execute(command, {
1543
+ entity: getEntityInfo(this.entityDef).source,
1544
+ entityInfo: {
1545
+ name: this.entityDef.name,
1546
+ module: this.entityDef.module,
1547
+ title: this.entityDef.title,
1548
+ parentKey: this.entityDef.parentKey,
1549
+ source: `${this.entityDef.module}.${this.entityDef.name}`,
1550
+ },
1551
+ data: action?.scope == AXPEntityCommandScope.Selected ? this.selectedItems() : data,
1552
+ options: options,
1553
+ metadata: action?.metadata,
1554
+ });
1554
1555
  }
1555
1556
  }
1556
1557
  async execute(command) {
@@ -1661,14 +1662,14 @@ class AXPEntityPerformDeleteAction extends AXPWorkflowAction {
1661
1662
  // Create dialog config but don't show it yet
1662
1663
  const createDialog = async () => {
1663
1664
  dialog = this.loadingDialog.show({
1664
- title: await this.translationService.translateAsync('workflow.deleting'),
1665
+ title: await this.translationService.translateAsync('@general:workflow.deleting'),
1665
1666
  mode: 'determinate',
1666
1667
  status: 'Deleting...',
1667
1668
  progressValue: 0,
1668
1669
  text: `0/${idLength}`,
1669
1670
  buttons: [
1670
1671
  {
1671
- text: await this.translationService.translateAsync('cancel'),
1672
+ text: await this.translationService.translateAsync('@general:actions.cancel.title'),
1672
1673
  color: 'danger',
1673
1674
  onClick: () => {
1674
1675
  if (dialog) {
@@ -1729,7 +1730,7 @@ class AXPEntityPerformDeleteAction extends AXPWorkflowAction {
1729
1730
  if (successfulPromises > 0 && failedPromises === 0) {
1730
1731
  // All items deleted successfully
1731
1732
  if (showResult) {
1732
- await this.dialogService.alert(await this.translationService.translateAsync('workflow.success-delete-title'), await this.translationService.translateAsync('workflow.success-delete-body', {
1733
+ await this.dialogService.alert(await this.translationService.translateAsync('@general:workflow.success-delete-title'), await this.translationService.translateAsync('@general:workflow.success-delete-body', {
1733
1734
  params: { item: successfulPromises },
1734
1735
  }), //TODO test translation
1735
1736
  'success');
@@ -1741,7 +1742,7 @@ class AXPEntityPerformDeleteAction extends AXPWorkflowAction {
1741
1742
  else if (successfulPromises > 0 && failedPromises > 0) {
1742
1743
  // Some items deleted successfully, some failed
1743
1744
  if (showResult) {
1744
- await this.dialogService.alert(await this.translationService.translateAsync('workflow.success-partial-delete-title'), await this.translationService.translateAsync('workflow.partial-delete-body', {
1745
+ await this.dialogService.alert(await this.translationService.translateAsync('@general:workflow.success-partial-delete-title'), await this.translationService.translateAsync('@general:workflow.partial-delete-body', {
1745
1746
  params: { success: successfulPromises, fail: failedPromises },
1746
1747
  }), 'warning');
1747
1748
  }
@@ -1751,7 +1752,7 @@ class AXPEntityPerformDeleteAction extends AXPWorkflowAction {
1751
1752
  else if (successfulPromises === 0 && failedPromises > 0) {
1752
1753
  // No items deleted, all failed
1753
1754
  if (showResult) {
1754
- await this.dialogService.alert(await this.translationService.translateAsync('workflow.fail-delete-title'), await this.translationService.translateAsync('workflow.fail-delete-body', {
1755
+ await this.dialogService.alert(await this.translationService.translateAsync('@general:workflow.fail-delete-title'), await this.translationService.translateAsync('@general:workflow.fail-delete-body', {
1755
1756
  params: { item: failedPromises },
1756
1757
  }), 'danger');
1757
1758
  }
@@ -1759,7 +1760,7 @@ class AXPEntityPerformDeleteAction extends AXPWorkflowAction {
1759
1760
  else {
1760
1761
  // No items to delete (no successful or failed promises)
1761
1762
  if (showResult) {
1762
- await this.dialogService.alert(await this.translationService.translateAsync('workflow.no-need'), await this.translationService.translateAsync('workflow.no-item'), 'primary');
1763
+ await this.dialogService.alert(await this.translationService.translateAsync('@general:workflow.no-need'), await this.translationService.translateAsync('@general:workflow.no-item'), 'primary');
1763
1764
  }
1764
1765
  }
1765
1766
  }
@@ -1797,6 +1798,35 @@ const AXPDeleteEntityWorkflow = {
1797
1798
  },
1798
1799
  };
1799
1800
 
1801
+ class AXPEntityUpdateViewSectionViewModel {
1802
+ constructor(entity, section) {
1803
+ this.entity = entity;
1804
+ this.section = section;
1805
+ this.group = this.entity.groups?.find((c) => c.id == this.section.id);
1806
+ this.name = signal(this.group.id, ...(ngDevMode ? [{ debugName: "name" }] : []));
1807
+ this.title = computed(() => {
1808
+ return this.group.title ?? this.group.id;
1809
+ }, ...(ngDevMode ? [{ debugName: "title" }] : []));
1810
+ this.description = computed(() => {
1811
+ return this.group.description;
1812
+ }, ...(ngDevMode ? [{ debugName: "description" }] : []));
1813
+ this.layout = computed(() => {
1814
+ const source = cloneDeep(this.section.layout ?? {});
1815
+ set(source, 'positions.default.colSpan', 12);
1816
+ return source;
1817
+ }, ...(ngDevMode ? [{ debugName: "layout" }] : []));
1818
+ this.elements = computed(() => {
1819
+ const { interfaces, properties } = this.entity;
1820
+ const updateProps = interfaces?.master?.update?.properties ?? [];
1821
+ const updatePropNames = new Set(updateProps.map(({ name }) => name));
1822
+ const filteredProperties = properties.filter(({ groupId, schema, name }) => groupId === this.group.id && !schema.hidden && updatePropNames.has(name));
1823
+ return filteredProperties.map((property) => {
1824
+ const updateProp = updateProps.find(({ name }) => name === property.name);
1825
+ return new AXPEntityMasterUpdateElementViewModel(this.entity, property);
1826
+ });
1827
+ }, ...(ngDevMode ? [{ debugName: "elements" }] : []));
1828
+ }
1829
+ }
1800
1830
  class AXPEntityMasterUpdateElementViewModel {
1801
1831
  constructor(entity, property) {
1802
1832
  this.entity = entity;
@@ -1862,6 +1892,13 @@ class AXPEntityMasterUpdateViewModel {
1862
1892
  return new AXPEntityMasterUpdateElementViewModel(this.entityDef, e);
1863
1893
  });
1864
1894
  }, ...(ngDevMode ? [{ debugName: "elements" }] : []));
1895
+ this.sections = computed(() => {
1896
+ const { interfaces, properties } = this.entityDef;
1897
+ const updateProps = interfaces?.master?.update?.properties?.map(({ name }) => name) ?? [];
1898
+ const visibleProperties = properties.filter(({ groupId, schema, name }) => groupId && !schema.hidden && updateProps.includes(name));
1899
+ const sections = interfaces?.master?.update?.sections?.filter(({ id }) => visibleProperties.some(({ groupId }) => groupId === id)) ?? [];
1900
+ return sections.map((section) => new AXPEntityUpdateViewSectionViewModel(this.entityDef, section));
1901
+ }, ...(ngDevMode ? [{ debugName: "sections" }] : []));
1865
1902
  }
1866
1903
  async save() {
1867
1904
  this.isInProgress.set(true);
@@ -2284,6 +2321,34 @@ const AXPEntityDetailViewModelResolver = (route, state, service = inject(AXPEnti
2284
2321
  return service.create(moduleName, entityName, id);
2285
2322
  };
2286
2323
 
2324
+ /**
2325
+ * Error type that can be thrown by middlewares to abort the chain with a structured payload.
2326
+ */
2327
+ class AXPMiddlewareAbortError extends Error {
2328
+ constructor(message, options = {}) {
2329
+ super(message);
2330
+ this.message = message;
2331
+ this.options = options;
2332
+ this.name = 'AXPMiddlewareAbortError';
2333
+ }
2334
+ toResponse() {
2335
+ return {
2336
+ success: false,
2337
+ error: {
2338
+ code: this.options.code,
2339
+ message: this.message,
2340
+ status: this.options.status,
2341
+ details: this.options.details,
2342
+ },
2343
+ };
2344
+ }
2345
+ }
2346
+ /** Type guard for AXPMiddlewareAbortError */
2347
+ function isAXPMiddlewareAbortError(error) {
2348
+ return error instanceof AXPMiddlewareAbortError;
2349
+ }
2350
+ //#endregion
2351
+
2287
2352
  const AXP_ENTITY_STORAGE_BACKEND = new InjectionToken('AXP_ENTITY_STORAGE_BACKEND');
2288
2353
  const AXP_ENTITY_STORAGE_MIDDLEWARE = new InjectionToken('AXP_ENTITY_STORAGE_MIDDLEWARE');
2289
2354
 
@@ -2326,6 +2391,7 @@ class AXMEntityCrudServiceImpl {
2326
2391
  this._storageService = inject(AXPEntityStorageService);
2327
2392
  this.entityRegistery = inject(AXPEntityDefinitionRegistryService);
2328
2393
  this._entityDataProvider = new AXPEntityDataProviderImpl(this._storageService, this.entityName);
2394
+ this._entityCategoryDataProvider = new AXPEntityDataProviderImpl(this._storageService, `${this.entityName}Category`);
2329
2395
  }
2330
2396
  async insertOne(request) {
2331
2397
  return this._entityDataProvider.insertOne(request);
@@ -2405,6 +2471,9 @@ class AXMEntityCrudServiceImpl {
2405
2471
  const result = await this._entityDataProvider.query(queryRequest);
2406
2472
  return result;
2407
2473
  }
2474
+ async getCategoriesList(request = { skip: 0, take: 1000 }) {
2475
+ return this._entityCategoryDataProvider.query(request);
2476
+ }
2408
2477
  get storageService() {
2409
2478
  return this._storageService;
2410
2479
  }
@@ -2461,8 +2530,10 @@ class AXPMiddlewareEntityStorageService extends AXPEntityStorageService {
2461
2530
  entityName,
2462
2531
  locals: new Map(),
2463
2532
  backend: {
2464
- getOneRaw: (name, id) => this.backend.getOne(name, id),
2465
- insertOneRaw: (name, e) => this.backend.insertOne(name, e),
2533
+ getOne: (name, id) => this.backend.getOne(name, id),
2534
+ insertOne: (name, e) => this.backend.insertOne(name, e),
2535
+ query: (name, request) => this.backend.query(name, request),
2536
+ updateOne: (name, id, data) => this.backend.updateOne(name, id, data),
2466
2537
  },
2467
2538
  ...init,
2468
2539
  };
@@ -2865,13 +2936,13 @@ class AXPPageDetailsConverter extends AXPBaseRelatedEntityConverter {
2865
2936
  return {
2866
2937
  commands: {
2867
2938
  reject: {
2868
- title: 't("discard")',
2939
+ title: '@general:actions.discard.title',
2869
2940
  color: 'default',
2870
2941
  visible: '{{context.isDirty()}}',
2871
2942
  command: { name: 'discard' },
2872
2943
  },
2873
2944
  accept: {
2874
- title: 't("confirm")',
2945
+ title: '@general:actions.confirm.title',
2875
2946
  color: 'secondary',
2876
2947
  visible: '{{context.isDirty()}}',
2877
2948
  command: { name: 'update-entity' },
@@ -3016,7 +3087,7 @@ class AXPPageListConverter extends AXPBaseRelatedEntityConverter {
3016
3087
  module: entityDef.module,
3017
3088
  title: entityDef.title,
3018
3089
  parentKey: entityDef.parentKey,
3019
- source: entityDef.source,
3090
+ source: `${entityDef.module}.${entityDef.name}`,
3020
3091
  },
3021
3092
  data: action.scope == AXPEntityCommandScope.Selected
3022
3093
  ? executeContext
@@ -3488,7 +3559,7 @@ class AXPMainEntityContentBuilder {
3488
3559
  settings: {
3489
3560
  commands: {
3490
3561
  reject: {
3491
- title: 't("discard")',
3562
+ title: '@general:actions.discard.title',
3492
3563
  color: 'default',
3493
3564
  visible: '{{context.isDirty()}}',
3494
3565
  command: {
@@ -3496,7 +3567,7 @@ class AXPMainEntityContentBuilder {
3496
3567
  },
3497
3568
  },
3498
3569
  accept: {
3499
- title: 't("confirm")',
3570
+ title: '@general:actions.confirm.title',
3500
3571
  color: 'secondary',
3501
3572
  visible: '{{context.isDirty()}}',
3502
3573
  command: {
@@ -3518,57 +3589,68 @@ class AXPMainEntityContentBuilder {
3518
3589
  };
3519
3590
  },
3520
3591
  execute: async (e, context) => {
3521
- if (e.name == 'update-entity') {
3522
- const fn = entity?.commands?.update?.execute;
3523
- const result = await fn(context);
3524
- return {
3525
- success: true,
3526
- result: result,
3527
- };
3528
- }
3529
- else {
3530
- // Find action in single interface actions
3531
- const action = actions.find((a) => a.name === e.name);
3532
- if (action && dependencies?.workflowService) {
3533
- // Evaluate action options with current context
3534
- let evaluatedOptions = action.options;
3535
- if (evaluateExpressions && action.options) {
3536
- try {
3537
- evaluatedOptions = await evaluateExpressions(action.options);
3592
+ try {
3593
+ if (e.name == 'update-entity') {
3594
+ const fn = entity?.commands?.update?.execute;
3595
+ const result = await fn(context);
3596
+ return {
3597
+ success: true,
3598
+ result: result,
3599
+ };
3600
+ }
3601
+ else {
3602
+ // Find action in single interface actions
3603
+ const action = actions.find((a) => a.name === e.name);
3604
+ if (action && dependencies?.workflowService) {
3605
+ // Evaluate action options with current context
3606
+ let evaluatedOptions = action.options;
3607
+ if (evaluateExpressions && action.options) {
3608
+ try {
3609
+ evaluatedOptions = await evaluateExpressions(action.options);
3610
+ }
3611
+ catch {
3612
+ // Keep original options if evaluation fails
3613
+ }
3538
3614
  }
3539
- catch {
3540
- // Keep original options if evaluation fails
3615
+ const commandName = e.name.split('&')[0];
3616
+ if (this.workflowService.exists(commandName)) {
3617
+ await this.workflowService.execute(commandName, {
3618
+ entity: getEntityInfo(entity).source,
3619
+ data: context,
3620
+ entityInfo: {
3621
+ name: entity.name,
3622
+ module: entity.module,
3623
+ title: entity.title,
3624
+ parentKey: entity.parentKey,
3625
+ source: `${entity.module}.${entity.name}`,
3626
+ },
3627
+ options: evaluatedOptions,
3628
+ metadata: action.metadata,
3629
+ });
3630
+ return {
3631
+ success: true,
3632
+ };
3633
+ }
3634
+ if (this.commandService.exists(commandName)) {
3635
+ // check options for evaluation
3636
+ await this.commandService.execute(commandName, e.options);
3541
3637
  }
3542
3638
  }
3543
- const commandName = e.name.split('&')[0];
3544
- if (this.workflowService.exists(commandName)) {
3545
- await this.workflowService.execute(commandName, {
3546
- entity: getEntityInfo(entity).source,
3547
- data: context,
3548
- entityInfo: {
3549
- name: entity.name,
3550
- module: entity.module,
3551
- title: entity.title,
3552
- parentKey: entity.parentKey,
3553
- source: entity.source,
3554
- },
3555
- options: evaluatedOptions,
3556
- metadata: action.metadata,
3557
- });
3558
- return {
3559
- success: true,
3560
- };
3561
- }
3562
- if (this.commandService.exists(commandName)) {
3563
- // check options for evaluation
3564
- await this.commandService.execute(commandName, e.options);
3565
- }
3639
+ return {
3640
+ success: false,
3641
+ error: {
3642
+ code: 'invalid_command',
3643
+ message: 'Invalid command',
3644
+ },
3645
+ };
3566
3646
  }
3647
+ }
3648
+ catch (error) {
3567
3649
  return {
3568
3650
  success: false,
3569
3651
  error: {
3570
- code: 'invalid_command',
3571
- message: 'Invalid command',
3652
+ //TODO: handle error as object
3653
+ message: error,
3572
3654
  },
3573
3655
  };
3574
3656
  }
@@ -4239,7 +4321,7 @@ class AXPEntityListTableService {
4239
4321
  module: entity.module,
4240
4322
  title: entity.title,
4241
4323
  parentKey: entity.parentKey,
4242
- source: entity.source,
4324
+ source: `${entity.module}.${entity.name}`,
4243
4325
  },
4244
4326
  data: action?.scope == AXPEntityCommandScope.Selected ? selectedRows : data,
4245
4327
  options: options,
@@ -4515,7 +4597,7 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
4515
4597
  module: this.entity()?.module,
4516
4598
  title: this.entity()?.title,
4517
4599
  parentKey: this.entity()?.parentKey,
4518
- source: this.entity()?.source,
4600
+ source: `${this.entity()?.module}.${this.entity()?.name}`,
4519
4601
  },
4520
4602
  data: action?.scope == AXPEntityCommandScope.Selected
4521
4603
  ? this.selectedItems()
@@ -4720,7 +4802,7 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
4720
4802
  <ax-button
4721
4803
  [class.ax-sm]="layoutThemeService.isSmall()"
4722
4804
  [iconOnly]="layoutThemeService.isSmall()"
4723
- [text]="'actions'"
4805
+ [text]="'@general:terms.workflow.actions' | translate | async"
4724
4806
  [look]="layoutThemeService.isSmall() ? 'blank' : 'solid'"
4725
4807
  [color]="'default'"
4726
4808
  >
@@ -4774,7 +4856,7 @@ class AXPEntityListWidgetViewComponent extends AXPValueWidgetComponent {
4774
4856
  ></ng-container>
4775
4857
  }
4776
4858
  </div>
4777
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", 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: AXPLayoutBuilderModule }, { kind: "directive", type: i3$1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i3$2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i3$2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4859
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", 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: AXPLayoutBuilderModule }, { kind: "directive", type: i3$1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i3$2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i3$2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i4.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4778
4860
  }
4779
4861
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityListWidgetViewComponent, decorators: [{
4780
4862
  type: Component,
@@ -4826,7 +4908,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
4826
4908
  <ax-button
4827
4909
  [class.ax-sm]="layoutThemeService.isSmall()"
4828
4910
  [iconOnly]="layoutThemeService.isSmall()"
4829
- [text]="'actions'"
4911
+ [text]="'@general:terms.workflow.actions' | translate | async"
4830
4912
  [look]="layoutThemeService.isSmall() ? 'blank' : 'solid'"
4831
4913
  [color]="'default'"
4832
4914
  >
@@ -4887,7 +4969,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
4887
4969
  },
4888
4970
  changeDetection: ChangeDetectionStrategy.OnPush,
4889
4971
  providers: [AXPEntityListTableService, AXPEntityListToolbarService],
4890
- imports: [CommonModule, AXDecoratorModule, AXPLayoutBuilderModule, AXButtonModule, AXDropdownModule],
4972
+ imports: [CommonModule, AXDecoratorModule, AXPLayoutBuilderModule, AXButtonModule, AXDropdownModule, AXTranslationModule],
4891
4973
  }]
4892
4974
  }] });
4893
4975
 
@@ -5178,383 +5260,193 @@ var lookupWidgetView_component = /*#__PURE__*/Object.freeze({
5178
5260
  AXPLookupWidgetViewComponent: AXPLookupWidgetViewComponent
5179
5261
  });
5180
5262
 
5181
- class AXPLookupWidgetSelectorComponent extends AXBasePageComponent {
5263
+ //#endregion
5264
+ class AXPEntityDataSelectorService {
5182
5265
  constructor() {
5183
- super(...arguments);
5184
- this.grid = viewChild('grid', ...(ngDevMode ? [{ debugName: "grid" }] : []));
5185
- this.initialSelectedItems = [];
5186
- this.selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
5187
- this.allowSelect = computed(() => this.selectedItems().length > 0, ...(ngDevMode ? [{ debugName: "allowSelect" }] : []));
5188
- }
5189
- ngAfterViewInit() {
5190
- if (this.initialSelectedItems.length > 0 && this.grid()) {
5191
- this.grid()?.selectRows(...this.initialSelectedItems);
5192
- }
5193
- if (this.searchTerm) {
5194
- this.vm.applyInlineFilter(this.searchTerm);
5195
- }
5196
- else {
5197
- this.vm.applyFilterAndSort();
5198
- }
5266
+ //#region ---- Services & Dependencies ----
5267
+ this.dataSelectorService = inject(AXPDataSelectorService);
5268
+ this.filterOperatorMiddleware = inject(AXPFilterOperatorMiddlewareService);
5269
+ this.widgetResolver = inject(AXPWidgetRegistryService);
5199
5270
  }
5200
- handleRowDbClick(e) {
5201
- this.close({ items: [e.data] });
5271
+ //#endregion
5272
+ //#region ---- Public Methods ----
5273
+ /**
5274
+ * Open entity data selector popup
5275
+ */
5276
+ async open(options) {
5277
+ const config = this.createDataSelectorConfig(options);
5278
+ const result = await this.dataSelectorService.open(config);
5279
+ return result;
5202
5280
  }
5203
- handleRowClick(e) {
5204
- if (this.vm.allowMultiple()) {
5205
- this.selectedItems.set([...this.selectedItems(), e.data]);
5206
- }
5207
- else if (this.selectedItems().length > 0) {
5208
- const selected = this.selectedItems().find((item) => item.id === e.data.id);
5209
- if (selected) {
5210
- this.selectedItems.set(this.selectedItems().filter((item) => item.id !== selected.id));
5211
- }
5212
- else {
5213
- this.selectedItems.set([e.data]);
5214
- }
5215
- }
5216
- else if (this.selectedItems().length === 0) {
5217
- this.selectedItems.set([e.data]);
5218
- }
5219
- else {
5220
- this.selectedItems.set([e.data]);
5221
- }
5281
+ /**
5282
+ * Open entity data selector with category filter
5283
+ */
5284
+ async openWithCategoryFilter(options, categoryFilterConfig) {
5285
+ const config = this.createDataSelectorConfig({
5286
+ ...options,
5287
+ allowCreate: false
5288
+ });
5289
+ // Add category filter to config
5290
+ config.categoryFilter = {
5291
+ enabled: true,
5292
+ ...categoryFilterConfig
5293
+ };
5294
+ const result = await this.dataSelectorService.open(config);
5295
+ return result;
5222
5296
  }
5223
- async handleSelectedRowsChange(rows) {
5224
- this.selectedItems.set(rows);
5297
+ //#endregion
5298
+ //#region ---- Private Methods ----
5299
+ /**
5300
+ * Create data selector configuration from entity options
5301
+ */
5302
+ createDataSelectorConfig(options) {
5303
+ const dataSource = this.createDataSource(options);
5304
+ const columns = this.createColumns(options);
5305
+ const searchFields = this.getSearchFields(options);
5306
+ return {
5307
+ title: options.title,
5308
+ dataSource,
5309
+ columns,
5310
+ selectionMode: options.allowMultiple ? 'multiple' : 'single',
5311
+ searchFields,
5312
+ parentField: options.entity.parentKey,
5313
+ allowCreate: options.allowCreate ?? this.canCreate(options.entity),
5314
+ // Note: Custom filters will be applied to the dataSource in createDataSource
5315
+ };
5225
5316
  }
5226
- handleChangeSearchValue(e) {
5227
- if (e.isUserInteraction) {
5228
- this.vm.applyInlineFilter(e.value);
5229
- }
5230
- }
5231
- async handleCreateNewClick() {
5232
- this.close();
5233
- await this.vm.create();
5234
- }
5235
- handleCloseClick() {
5236
- this.close();
5237
- }
5238
- handleSelectClick() {
5239
- this.close({ items: this.selectedItems() });
5240
- }
5241
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPLookupWidgetSelectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5242
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.8", type: AXPLookupWidgetSelectorComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
5243
- <div class="ax-p-4 ax-flex ax-flex-col ax-gap-4 ax-overflow-hidden">
5244
- @if (vm.hasInlineFilters()) {
5245
- <div class="ax-w-full">
5246
- <ax-search-box
5247
- [placeholder]="('widget.lookup.search' | translate | async) + vm.inlineFiltersPlaceholders().join(', ')"
5248
- [value]="searchTerm"
5249
- (onValueChanged)="handleChangeSearchValue($event)"
5250
- [axAutoFocus]="true"
5251
- ><ax-clear-button></ax-clear-button
5252
- ></ax-search-box>
5253
- </div>
5254
- }
5255
- <ax-data-table
5256
- #grid
5257
- [showFooter]="false"
5258
- class="ax-h-[50vh]"
5259
- [paging]="true"
5260
- [fetchDataMode]="'manual'"
5261
- [loading]="{ enabled: true, animation: true }"
5262
- [dataSource]="vm.dataSource"
5263
- [parentField]="vm.parentKey()"
5264
- (selectedRowsChange)="handleSelectedRowsChange($event)"
5265
- (onRowClick)="handleRowClick($event)"
5266
- (onRowDbClick)="handleRowDbClick($event)"
5267
- >
5268
- @if (vm.allowMultiple()) {
5269
- <ax-select-column fixed="start" [width]="'50px'"></ax-select-column>
5270
- }
5271
- @for (col of vm.columns(); track col.name) {
5272
- @if (col.visible) {
5273
- <axp-widget-column-renderer
5274
- [expandHandler]="$index === 0 && vm.parentKey() ? true : false"
5275
- [caption]="col.title | translate | async"
5276
- [node]="col.node()"
5277
- ></axp-widget-column-renderer>
5278
- }
5279
- }
5280
- </ax-data-table>
5281
- </div>
5282
- <ax-footer>
5283
- <ax-suffix>
5284
- <ax-button look="solid" [text]="('close' | translate | async)!" (onClick)="handleCloseClick()"> </ax-button>
5285
- <ax-button
5286
- look="solid"
5287
- color="primary"
5288
- [text]="('select' | translate | async)!"
5289
- (onClick)="handleSelectClick()"
5290
- [disabled]="allowSelect() === false"
5291
- >
5292
- </ax-button>
5293
- @if (!vm.canCreate()) {
5294
- <ax-button
5295
- look="solid"
5296
- color="primary"
5297
- [text]="'Create-New' | translate | async"
5298
- (onClick)="handleCreateNewClick()"
5299
- >
5300
- <ax-prefix>
5301
- <ax-icon icon="fa-solid fa-add"></ax-icon>
5302
- </ax-prefix>
5303
- </ax-button>
5304
- }
5305
- </ax-suffix>
5306
- </ax-footer>
5307
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXCommonModule }, { kind: "directive", type: i1$1.AXAutoFocusDirective, selector: "[axAutoFocus]", inputs: ["axAutoFocus", "axAutoFocusTime"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXFormModule }, { 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: AXDropdownButtonModule }, { kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i4$2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "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: i4$2.AXRowSelectColumnComponent, selector: "ax-select-column", inputs: ["width", "caption", "fixed"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXPLayoutBuilderModule }, { kind: "component", type: i3$1.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "node", "footerTemplate", "expandHandler", "cellTemplate", "headerTemplate"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5308
- }
5309
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPLookupWidgetSelectorComponent, decorators: [{
5310
- type: Component,
5311
- args: [{
5312
- template: `
5313
- <div class="ax-p-4 ax-flex ax-flex-col ax-gap-4 ax-overflow-hidden">
5314
- @if (vm.hasInlineFilters()) {
5315
- <div class="ax-w-full">
5316
- <ax-search-box
5317
- [placeholder]="('widget.lookup.search' | translate | async) + vm.inlineFiltersPlaceholders().join(', ')"
5318
- [value]="searchTerm"
5319
- (onValueChanged)="handleChangeSearchValue($event)"
5320
- [axAutoFocus]="true"
5321
- ><ax-clear-button></ax-clear-button
5322
- ></ax-search-box>
5323
- </div>
5324
- }
5325
- <ax-data-table
5326
- #grid
5327
- [showFooter]="false"
5328
- class="ax-h-[50vh]"
5329
- [paging]="true"
5330
- [fetchDataMode]="'manual'"
5331
- [loading]="{ enabled: true, animation: true }"
5332
- [dataSource]="vm.dataSource"
5333
- [parentField]="vm.parentKey()"
5334
- (selectedRowsChange)="handleSelectedRowsChange($event)"
5335
- (onRowClick)="handleRowClick($event)"
5336
- (onRowDbClick)="handleRowDbClick($event)"
5337
- >
5338
- @if (vm.allowMultiple()) {
5339
- <ax-select-column fixed="start" [width]="'50px'"></ax-select-column>
5340
- }
5341
- @for (col of vm.columns(); track col.name) {
5342
- @if (col.visible) {
5343
- <axp-widget-column-renderer
5344
- [expandHandler]="$index === 0 && vm.parentKey() ? true : false"
5345
- [caption]="col.title | translate | async"
5346
- [node]="col.node()"
5347
- ></axp-widget-column-renderer>
5348
- }
5349
- }
5350
- </ax-data-table>
5351
- </div>
5352
- <ax-footer>
5353
- <ax-suffix>
5354
- <ax-button look="solid" [text]="('close' | translate | async)!" (onClick)="handleCloseClick()"> </ax-button>
5355
- <ax-button
5356
- look="solid"
5357
- color="primary"
5358
- [text]="('select' | translate | async)!"
5359
- (onClick)="handleSelectClick()"
5360
- [disabled]="allowSelect() === false"
5361
- >
5362
- </ax-button>
5363
- @if (!vm.canCreate()) {
5364
- <ax-button
5365
- look="solid"
5366
- color="primary"
5367
- [text]="'Create-New' | translate | async"
5368
- (onClick)="handleCreateNewClick()"
5369
- >
5370
- <ax-prefix>
5371
- <ax-icon icon="fa-solid fa-add"></ax-icon>
5372
- </ax-prefix>
5373
- </ax-button>
5374
- }
5375
- </ax-suffix>
5376
- </ax-footer>
5377
- `,
5378
- changeDetection: ChangeDetectionStrategy.OnPush,
5379
- imports: [
5380
- CommonModule,
5381
- AXCommonModule,
5382
- AXButtonModule,
5383
- AXFormModule,
5384
- AXDecoratorModule,
5385
- AXDropdownButtonModule,
5386
- AXDataTableModule,
5387
- AXSearchBoxModule,
5388
- AXPLayoutBuilderModule,
5389
- AXTranslationModule,
5390
- ],
5391
- inputs: [],
5392
- }]
5393
- }] });
5394
-
5395
- class AXPLookupWidgetSelectorViewModel {
5396
- constructor(injector, entityDef, options = {
5397
- parentFilters: null,
5398
- customFilter: null,
5399
- sortedFields: [],
5400
- columns: [],
5401
- }) {
5402
- this.injector = injector;
5403
- this.entityDef = entityDef;
5404
- this.options = options;
5405
- this.workflow = this.injector.get(AXPWorkflowService);
5406
- this.filterOperatorMiddleware = this.injector.get(AXPFilterOperatorMiddlewareService);
5407
- this.widgetResolver = this.injector.get(AXPWidgetRegistryService);
5408
- this.dataSource = new AXDataSource({
5317
+ /**
5318
+ * Create data source from entity definition
5319
+ */
5320
+ createDataSource(options) {
5321
+ const { entity, customFilter, parentFilters } = options;
5322
+ return new AXDataSource({
5409
5323
  byKey: (key) => {
5410
- const func = this.entityDef.queries.byKey.execute;
5324
+ const func = entity.queries.byKey.execute;
5411
5325
  return func();
5412
5326
  },
5413
5327
  load: (e) => {
5414
- const func = this.entityDef.queries.list?.execute;
5415
- this.mergeFilter(e, this.options.customFilter);
5328
+ const func = entity.queries.list?.execute;
5329
+ this.mergeFilters(e, customFilter, parentFilters);
5416
5330
  return func(e);
5417
5331
  },
5418
5332
  pageSize: 10,
5419
5333
  key: 'id',
5420
5334
  });
5421
- this.canCreate = computed(() => {
5422
- return this.entityDef.commands?.create?.execute != null;
5423
- }, ...(ngDevMode ? [{ debugName: "canCreate" }] : []));
5424
- this.parentKey = computed(() => {
5425
- return this.entityDef.parentKey;
5426
- }, ...(ngDevMode ? [{ debugName: "parentKey" }] : []));
5427
- this.allowMultiple = computed(() => {
5428
- return this.options.allowMultiple ?? false;
5429
- }, ...(ngDevMode ? [{ debugName: "allowMultiple" }] : []));
5430
- this.inlineFiltersPlaceholders = computed(() => {
5431
- return (this.entityDef?.properties.filter((p) => p.options?.filter?.inline?.enabled).map((c) => c.title ?? c.name) ?? []);
5432
- }, ...(ngDevMode ? [{ debugName: "inlineFiltersPlaceholders" }] : []));
5433
- this.hasInlineFilters = computed(() => {
5434
- return this.inlineFiltersPlaceholders().length > 0;
5435
- }, ...(ngDevMode ? [{ debugName: "hasInlineFilters" }] : []));
5436
- this.columns = () => {
5437
- const { columns = [], properties } = this.entityDef;
5438
- const visibleProperties = properties.filter(({ schema }) => !schema?.hidden);
5439
- const visiblePropNames = new Set(visibleProperties.map(({ name }) => name));
5440
- return columns
5441
- .filter(({ name, showAs }) => visiblePropNames.has(name) || showAs)
5442
- .filter(({ name }) => ((this.options.columns?.length ?? 0) == 0) || this.options.columns?.includes(name))
5443
- .map((column) => {
5444
- if (column.showAs) {
5445
- const widgetConfig = this.widgetResolver.resolve(column.showAs.type);
5446
- const property = {
5447
- ...widgetConfig,
5448
- name: column.name,
5449
- title: column.title ?? '',
5450
- schema: {
5451
- dataType: 'string',
5452
- interface: {
5453
- type: column.showAs.type,
5454
- options: column.showAs.options,
5455
- },
5335
+ }
5336
+ /**
5337
+ * Create columns configuration from entity definition
5338
+ */
5339
+ createColumns(options) {
5340
+ const { entity, columns = [] } = options;
5341
+ const { columns: entityColumns = [], properties } = entity;
5342
+ const visibleProperties = properties.filter(({ schema }) => !schema?.hidden);
5343
+ const visiblePropNames = new Set(visibleProperties.map(({ name }) => name));
5344
+ return entityColumns
5345
+ .filter(({ name, showAs }) => visiblePropNames.has(name) || showAs)
5346
+ .filter(({ name }) => columns.length === 0 || columns.includes(name))
5347
+ .map((column) => {
5348
+ let property;
5349
+ let widgetType;
5350
+ let widgetOptions;
5351
+ if (column.showAs) {
5352
+ // Use custom column configuration
5353
+ const widgetConfig = this.widgetResolver.resolve(column.showAs.type);
5354
+ property = {
5355
+ ...widgetConfig,
5356
+ name: column.name,
5357
+ title: column.title ?? '',
5358
+ schema: {
5359
+ dataType: 'string',
5360
+ interface: {
5361
+ type: column.showAs.type,
5362
+ options: column.showAs.options,
5456
5363
  },
5457
- };
5458
- return new AXPEntityListViewColumnViewModel(property, column);
5459
- }
5460
- else {
5461
- const property = visibleProperties.find(({ name }) => name === column.name);
5462
- return new AXPEntityListViewColumnViewModel(property, column);
5364
+ },
5365
+ };
5366
+ widgetType = column.showAs.type;
5367
+ widgetOptions = column.showAs.options;
5368
+ }
5369
+ else {
5370
+ // Use entity property configuration
5371
+ property = visibleProperties.find(({ name }) => name === column.name);
5372
+ widgetType = property.schema?.interface?.type || 'text';
5373
+ widgetOptions = property.schema?.interface?.options || {};
5374
+ }
5375
+ return {
5376
+ name: column.name,
5377
+ title: property.title || column.title || column.name,
5378
+ visible: true,
5379
+ widget: {
5380
+ type: widgetType,
5381
+ options: widgetOptions
5463
5382
  }
5464
- });
5465
- };
5466
- this.inlineFilters = {
5467
- field: null,
5468
- logic: 'or',
5469
- operator: null,
5470
- filters: [],
5471
- };
5472
- this.advanceFilters = {
5473
- field: null,
5474
- logic: 'and',
5475
- operator: null,
5476
- filters: [],
5477
- };
5478
- }
5479
- async create() {
5480
- await this.workflow.execute('create-entity', {
5481
- entity: getEntityInfo(this.entityDef).source,
5383
+ };
5482
5384
  });
5483
5385
  }
5484
- applyInlineFilter(value, refresh = true) {
5485
- const props = this.entityDef.properties.filter((c) => c.options?.filter?.inline?.enabled);
5486
- this.inlineFilters.filters = [];
5487
- if (value) {
5488
- props.forEach((p) => {
5489
- this.inlineFilters.filters?.push({
5490
- field: p.name,
5491
- operator: {
5492
- type: 'contains',
5493
- },
5494
- value,
5495
- });
5496
- });
5386
+ /**
5387
+ * Get searchable fields from entity properties
5388
+ */
5389
+ getSearchFields(options) {
5390
+ const { entity, searchFields } = options;
5391
+ if (searchFields && searchFields.length > 0) {
5392
+ return searchFields;
5497
5393
  }
5498
- if (refresh)
5499
- this.applyFilterAndSort();
5394
+ // Auto-detect searchable fields from entity properties
5395
+ return entity.properties
5396
+ .filter(p => p.options?.filter?.inline?.enabled)
5397
+ .map(p => p.name);
5500
5398
  }
5501
- applyFilterAndSort() {
5502
- // this.dataSource.clearFilter();
5503
- //
5504
- //this.dataSource.sort(...this.sortedFields().map(s => ({ dir: s.dir, field: s.name } as AXDataSourceSortOption)));
5505
- //
5506
- // Check if inlineFilters or parentFilters have any filters
5507
- const hasInlineFilters = (this.inlineFilters?.filters?.length ?? 0) > 0;
5508
- const hasParentFilters = (this.options.parentFilters?.filters?.length ?? 0) > 0;
5509
- // Construct the filters array based on the presence of filters
5399
+ /**
5400
+ * Check if entity supports create operation
5401
+ */
5402
+ canCreate(entity) {
5403
+ return entity.commands?.create?.execute != null;
5404
+ }
5405
+ /**
5406
+ * Merge custom and parent filters into data source query
5407
+ */
5408
+ mergeFilters(request, customFilter, parentFilters) {
5409
+ if (!customFilter && !parentFilters) {
5410
+ return request;
5411
+ }
5510
5412
  const filters = [];
5511
- if (this.options.customFilter) {
5512
- const cleanedFilters = AXPCleanNestedFilters([this.options.customFilter]);
5413
+ // Add custom filter
5414
+ if (customFilter) {
5415
+ const cleanedFilters = AXPCleanNestedFilters([customFilter]);
5513
5416
  if (cleanedFilters.length > 0) {
5514
5417
  filters.push(this.filterOperatorMiddleware.transformFilter(cleanedFilters[0]));
5515
5418
  }
5516
5419
  }
5517
- if (hasInlineFilters) {
5518
- filters.push(this.inlineFilters);
5519
- }
5520
- if (hasParentFilters && this.options.parentFilters) {
5521
- filters.push(this.options.parentFilters);
5522
- }
5523
- // Apply the filters to the dataSource
5524
- this.dataSource.filter({
5525
- field: null,
5526
- logic: 'and',
5527
- operator: null,
5528
- filters: filters,
5529
- });
5530
- // Refresh the dataSource
5531
- this.dataSource.refresh();
5532
- }
5533
- async find(value) {
5534
- this.applyInlineFilter(value.trim(), false);
5535
- const func = this.entityDef.queries.list?.execute;
5536
- return (await func({ filter: this.inlineFilters, take: 10 })) ?? [];
5537
- }
5538
- setCustomFilter(filter) {
5539
- this.options.customFilter = filter;
5540
- this.applyFilterAndSort();
5541
- }
5542
- mergeFilter(request, filter) {
5543
- if (!filter) {
5544
- return request;
5420
+ // Add parent filters
5421
+ if (parentFilters) {
5422
+ filters.push(parentFilters);
5545
5423
  }
5424
+ // Merge with existing filter
5546
5425
  if (request.filter) {
5547
5426
  request.filter = {
5548
5427
  logic: 'and',
5549
- filters: [...[request.filter], ...(filter.filters ?? [])]
5428
+ filters: [...[request.filter], ...filters]
5550
5429
  };
5551
5430
  }
5552
5431
  else {
5553
- request.filter = filter;
5432
+ request.filter = {
5433
+ field: null,
5434
+ logic: 'and',
5435
+ operator: null,
5436
+ filters: filters,
5437
+ };
5554
5438
  }
5555
5439
  return request;
5556
5440
  }
5441
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityDataSelectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5442
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityDataSelectorService, providedIn: 'root' }); }
5557
5443
  }
5444
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityDataSelectorService, decorators: [{
5445
+ type: Injectable,
5446
+ args: [{
5447
+ providedIn: 'root'
5448
+ }]
5449
+ }] });
5558
5450
 
5559
5451
  class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5560
5452
  constructor() {
@@ -5563,6 +5455,7 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5563
5455
  this.entityResolver = inject(AXPEntityResolver);
5564
5456
  this.formatService = inject(AXFormatService);
5565
5457
  this.popupService = inject(AXPopupService);
5458
+ this.entityDataSelectorService = inject(AXPEntityDataSelectorService);
5566
5459
  this.translateService = inject(AXTranslationService);
5567
5460
  this.expose = computed(() => this.options()['expose'], ...(ngDevMode ? [{ debugName: "expose" }] : []));
5568
5461
  this.entity = computed(() => this.options()['entity'], ...(ngDevMode ? [{ debugName: "entity" }] : []));
@@ -5588,24 +5481,37 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5588
5481
  }, ...(ngDevMode ? [{ debugName: "selectedItemsText" }] : []));
5589
5482
  this.valueField = computed(() => this.entityDef()?.properties.find((c) => c.name == 'id')?.name ?? 'id', ...(ngDevMode ? [{ debugName: "valueField" }] : []));
5590
5483
  this.entityDef = signal(null, ...(ngDevMode ? [{ debugName: "entityDef" }] : []));
5484
+ this.dataSource = computed(() => {
5485
+ const entity = this.entityDef();
5486
+ if (!entity)
5487
+ return null;
5488
+ return new AXDataSource({
5489
+ byKey: (key) => {
5490
+ const func = entity.queries.byKey.execute;
5491
+ return func();
5492
+ },
5493
+ load: (e) => {
5494
+ const func = entity.queries.list?.execute;
5495
+ this.mergeFilter(e, this.customFilter());
5496
+ return func(e);
5497
+ },
5498
+ pageSize: 10,
5499
+ key: 'id',
5500
+ });
5501
+ }, ...(ngDevMode ? [{ debugName: "dataSource" }] : []));
5591
5502
  this.searchTerm = signal(null, ...(ngDevMode ? [{ debugName: "searchTerm" }] : []));
5592
5503
  this.selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
5593
5504
  this.textbox = viewChild(AXTagBoxComponent, ...(ngDevMode ? [{ debugName: "textbox" }] : []));
5594
5505
  this.isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
5595
5506
  this.isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
5596
- this.vm = signal(null, ...(ngDevMode ? [{ debugName: "vm" }] : []));
5597
5507
  this.placeholder = computed(() => {
5598
5508
  return this.selectedItems().length
5599
5509
  ? ''
5600
- : this.translateService.translateSync('widget.lookup.search') + this.vm()?.inlineFiltersPlaceholders().join(', ');
5510
+ : this.translateService.translateSync('@general:widgets.lookup.search');
5601
5511
  }, ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
5602
5512
  this.#efEntity = effect(async () => {
5603
5513
  const [module, entity] = this.entity().split('.');
5604
5514
  this.entityDef.set(await this.entityResolver.get(module, entity));
5605
- this.vm.set(new AXPLookupWidgetSelectorViewModel(this.injector, this.entityDef(), {
5606
- parentFilters: this.filter,
5607
- allowMultiple: this.multiple(),
5608
- }));
5609
5515
  }, ...(ngDevMode ? [{ debugName: "#efEntity" }] : []));
5610
5516
  this.#efValue = effect(() => {
5611
5517
  if (this.getValue()) {
@@ -5615,15 +5521,9 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5615
5521
  this.clear();
5616
5522
  }
5617
5523
  }, ...(ngDevMode ? [{ debugName: "#efValue" }] : []));
5618
- this.#efCustomFilter = effect(() => {
5619
- if (this.customFilter()) {
5620
- this.vm()?.setCustomFilter(this.customFilter());
5621
- }
5622
- }, ...(ngDevMode ? [{ debugName: "#efCustomFilter" }] : []));
5623
5524
  }
5624
5525
  #efEntity;
5625
5526
  #efValue;
5626
- #efCustomFilter;
5627
5527
  async findByValue() {
5628
5528
  this.isLoading.set(true);
5629
5529
  const rawValue = this.getValue();
@@ -5648,31 +5548,29 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5648
5548
  handleOnClick(e) {
5649
5549
  this.showSelector();
5650
5550
  }
5651
- showSelector() {
5551
+ async showSelector() {
5652
5552
  this.isOpen.set(true);
5653
- const columnsCount = this.columns().length > 0 ? this.columns().length : (this.vm()?.columns().length ?? 0);
5654
- this.popupService
5655
- .open(AXPLookupWidgetSelectorComponent, {
5656
- title: `${this.translateService.translateSync('widget.lookup.search')} ${this.translateService.translateSync(this.entityDef()?.formats.plural ?? '')}`,
5657
- size: columnsCount < 3 ? 'md' : 'lg',
5658
- data: {
5659
- vm: new AXPLookupWidgetSelectorViewModel(this.injector, this.entityDef(), {
5660
- customFilter: this.customFilter(),
5661
- parentFilters: this.filter,
5662
- allowMultiple: this.multiple(),
5663
- columns: this.columns(),
5664
- }),
5665
- searchTerm: this.searchTerm(),
5666
- initialSelectedItems: this.selectedItems(),
5667
- },
5668
- })
5669
- .then((e) => {
5553
+ try {
5554
+ const result = await this.entityDataSelectorService.open({
5555
+ entity: this.entityDef(),
5556
+ title: `${this.translateService.translateSync('@general:widgets.lookup.search')} ${this.translateService.translateSync(this.entityDef()?.formats.plural ?? '')}`,
5557
+ allowMultiple: this.multiple(),
5558
+ customFilter: this.customFilter(),
5559
+ parentFilters: this.filter,
5560
+ columns: this.columns(),
5561
+ allowCreate: true
5562
+ });
5563
+ if (result && 'items' in result) {
5564
+ this.setItems(result.items);
5565
+ }
5566
+ }
5567
+ catch (error) {
5568
+ console.error('Error opening entity data selector:', error);
5569
+ }
5570
+ finally {
5670
5571
  this.isOpen.set(false);
5671
5572
  this.textbox()?.focus();
5672
- if (e.data?.items) {
5673
- this.setItems(e.data?.items);
5674
- }
5675
- });
5573
+ }
5676
5574
  }
5677
5575
  selectBoxValueChange(e) {
5678
5576
  const items = e.component.selectedItems;
@@ -5701,7 +5599,7 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5701
5599
  this.searchTerm.set(value);
5702
5600
  if ((keyEvent.code == 'Enter' || keyEvent.code == 'NumpadEnter') && value) {
5703
5601
  this.isLoading.set(true);
5704
- const result = await this.vm()?.find(value);
5602
+ const result = await this.searchByValue(value);
5705
5603
  if (result?.total == 1) {
5706
5604
  this.setItems(result.items[0]);
5707
5605
  }
@@ -5758,10 +5656,7 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5758
5656
  }
5759
5657
  refresh() {
5760
5658
  this.clear();
5761
- if (this.customFilter()) {
5762
- this.vm()?.setCustomFilter(this.customFilter());
5763
- }
5764
- this.vm()?.dataSource.refresh();
5659
+ this.dataSource()?.refresh();
5765
5660
  }
5766
5661
  clear() {
5767
5662
  this.setValue(null);
@@ -5772,15 +5667,53 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5772
5667
  this.textbox()?.inputValue.set('');
5773
5668
  this.searchTerm.set('');
5774
5669
  }
5670
+ async searchByValue(value) {
5671
+ if (!this.entityDef())
5672
+ return null;
5673
+ const entity = this.entityDef();
5674
+ const searchFields = entity.properties.filter(p => p.options?.filter?.inline?.enabled);
5675
+ const inlineFilters = {
5676
+ field: null,
5677
+ logic: 'or',
5678
+ operator: null,
5679
+ filters: [],
5680
+ };
5681
+ if (value && searchFields.length > 0) {
5682
+ searchFields.forEach((p) => {
5683
+ inlineFilters.filters?.push({
5684
+ field: p.name,
5685
+ operator: { type: 'contains' },
5686
+ value,
5687
+ });
5688
+ });
5689
+ }
5690
+ const func = entity.queries.list?.execute;
5691
+ return await func({ filter: inlineFilters, take: 10 });
5692
+ }
5693
+ mergeFilter(request, filter) {
5694
+ if (!filter) {
5695
+ return request;
5696
+ }
5697
+ if (request.filter) {
5698
+ request.filter = {
5699
+ logic: 'and',
5700
+ filters: [...[request.filter], ...(filter.filters ?? [])]
5701
+ };
5702
+ }
5703
+ else {
5704
+ request.filter = filter;
5705
+ }
5706
+ return request;
5707
+ }
5775
5708
  singleOrMultiple(values) {
5776
5709
  return this.multiple() ? values : values[0];
5777
5710
  }
5778
5711
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPLookupWidgetEditComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5779
5712
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.8", type: AXPLookupWidgetEditComponent, isStandalone: true, selector: "axp-lookup-widget-edit", viewQueries: [{ propertyName: "textbox", first: true, predicate: AXTagBoxComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
5780
- @if(vm()) {
5713
+ @if(dataSource()) {
5781
5714
  @if (look() == 'select') {
5782
5715
  <ax-select-box
5783
- [dataSource]="vm()?.dataSource!"
5716
+ [dataSource]="dataSource()!"
5784
5717
  [ngModel]="selectedItems()"
5785
5718
  [textField]="displayField()"
5786
5719
  [valueField]="valueField()"
@@ -5843,19 +5776,19 @@ class AXPLookupWidgetEditComponent extends AXPValueWidgetComponent {
5843
5776
  </ax-tag-box>
5844
5777
  }
5845
5778
  }
5846
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type:
5779
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type:
5847
5780
  //
5848
- AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "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: AXLoadingModule }, { kind: "component", type: i4$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i5$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTagBoxModule }, { kind: "component", type: i6.AXTagBoxComponent, selector: "ax-tag-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "allowNull", "type", "look", "addOnComma", "addOnEnter", "valueField", "textField", "readonlyField", "allowDuplicateValues"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i7$1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5781
+ AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "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: AXLoadingModule }, { kind: "component", type: i4$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i5$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { 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"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i7.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5849
5782
  }
5850
5783
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPLookupWidgetEditComponent, decorators: [{
5851
5784
  type: Component,
5852
5785
  args: [{
5853
5786
  selector: 'axp-lookup-widget-edit',
5854
5787
  template: `
5855
- @if(vm()) {
5788
+ @if(dataSource()) {
5856
5789
  @if (look() == 'select') {
5857
5790
  <ax-select-box
5858
- [dataSource]="vm()?.dataSource!"
5791
+ [dataSource]="dataSource()!"
5859
5792
  [ngModel]="selectedItems()"
5860
5793
  [textField]="displayField()"
5861
5794
  [valueField]="valueField()"
@@ -5992,7 +5925,7 @@ class AXPEntityDetailPopoverComponent {
5992
5925
  try {
5993
5926
  const result = await this.queryService.fetch('Entity:GetDetails', {
5994
5927
  entity: this.entity(),
5995
- id: this.entityId()
5928
+ id: this.entityId(),
5996
5929
  });
5997
5930
  if (result?.success) {
5998
5931
  this.entityDetails.set(result);
@@ -6025,7 +5958,7 @@ class AXPEntityDetailPopoverComponent {
6025
5958
  }
6026
5959
  async navigateToDetails() {
6027
5960
  if (this.entityId()) {
6028
- await this.commandService.execute("Entity:OpenDetails", {
5961
+ await this.commandService.execute('Entity:OpenDetails', {
6029
5962
  entity: this.entity(),
6030
5963
  data: { id: this.entityId() },
6031
5964
  });
@@ -6058,9 +5991,6 @@ class AXPEntityDetailPopoverComponent {
6058
5991
  [AXPWidgetsCatalog.text]: 100,
6059
5992
  [AXPWidgetsCatalog.select]: 95,
6060
5993
  [AXPWidgetsCatalog.number]: 90,
6061
- [AXPWidgetsCatalog.email]: 88,
6062
- [AXPWidgetsCatalog.phone]: 87,
6063
- [AXPWidgetsCatalog.link]: 86,
6064
5994
  [AXPWidgetsCatalog.dateTime]: 85,
6065
5995
  [AXPWidgetsCatalog.richText]: 80,
6066
5996
  [AXPWidgetsCatalog.largeText]: 75,
@@ -6100,7 +6030,7 @@ class AXPEntityDetailPopoverComponent {
6100
6030
  { keys: ['owner', 'assignee', 'assignedto'], score: 92 },
6101
6031
  { keys: ['email', 'phone', 'mobile', 'contact'], score: 90 },
6102
6032
  { keys: ['category', 'type', 'label', 'tag', 'note', 'notes'], score: 85 },
6103
- { keys: ['primary', 'active', 'active', 'enabled', 'archived', 'deleted', 'locked', 'disabled'], score: -2 } // send to bottom,
6033
+ { keys: ['primary', 'active', 'active', 'enabled', 'archived', 'deleted', 'locked', 'disabled'], score: -2 }, // send to bottom,
6104
6034
  ];
6105
6035
  for (const group of priorities) {
6106
6036
  for (const key of group.keys) {
@@ -6127,16 +6057,16 @@ class AXPEntityDetailPopoverComponent {
6127
6057
  const importantProperties = (entityDefinition.columns ?? [])
6128
6058
  .map((prop, index) => {
6129
6059
  const propName = prop.options?.dataPath ?? prop.name;
6130
- const schema = prop.showAs?.type ?? entityDefinition.properties.find(p => p.name === propName)?.schema.interface?.type;
6131
- const title = prop.title ?? entityDefinition.properties.find(p => p.name === propName)?.title ?? prop.name;
6060
+ const schema = prop.showAs?.type ?? entityDefinition.properties.find((p) => p.name === propName)?.schema.interface?.type;
6061
+ const title = prop.title ?? entityDefinition.properties.find((p) => p.name === propName)?.title ?? prop.name;
6132
6062
  return {
6133
6063
  ...prop,
6134
6064
  schema,
6135
6065
  title,
6136
- orderIndex: index
6066
+ orderIndex: index,
6137
6067
  };
6138
6068
  })
6139
- .filter(prop => {
6069
+ .filter((prop) => {
6140
6070
  // Exclude technical fields
6141
6071
  if (prop.name === 'id' || prop.name === this.textField() || prop.name === this.valueField()) {
6142
6072
  return false;
@@ -6146,7 +6076,7 @@ class AXPEntityDetailPopoverComponent {
6146
6076
  return false;
6147
6077
  }
6148
6078
  // Filter by property importance based on schema and options
6149
- const schema = prop.showAs?.type ?? entityDefinition.properties.find(p => p.name === prop.name)?.schema.interface?.type;
6079
+ const schema = prop.showAs?.type ?? entityDefinition.properties.find((p) => p.name === prop.name)?.schema.interface?.type;
6150
6080
  // Include common important field types
6151
6081
  const importantWidgets = [
6152
6082
  AXPWidgetsCatalog.text,
@@ -6163,9 +6093,6 @@ class AXPEntityDetailPopoverComponent {
6163
6093
  AXPWidgetsCatalog.dateTime,
6164
6094
  AXPWidgetsCatalog.color,
6165
6095
  AXPWidgetsCatalog.contact,
6166
- AXPWidgetsCatalog.email,
6167
- AXPWidgetsCatalog.link,
6168
- AXPWidgetsCatalog.phone,
6169
6096
  ];
6170
6097
  //
6171
6098
  if (importantWidgets.includes(schema)) {
@@ -6196,13 +6123,13 @@ class AXPEntityDetailPopoverComponent {
6196
6123
  return (a.orderIndex ?? 0) - (b.orderIndex ?? 0);
6197
6124
  return a.name.localeCompare(b.name);
6198
6125
  })
6199
- .map(prop => {
6126
+ .map((prop) => {
6200
6127
  // Create widget node based on property schema
6201
6128
  const widgetNode = {
6202
6129
  type: prop.schema || AXPWidgetsCatalog.text,
6203
6130
  path: prop.options?.dataPath || prop.name,
6204
6131
  options: prop.options ?? {},
6205
- mode: 'view'
6132
+ mode: 'view',
6206
6133
  };
6207
6134
  return {
6208
6135
  name: prop.name,
@@ -6214,11 +6141,18 @@ class AXPEntityDetailPopoverComponent {
6214
6141
  return importantProperties;
6215
6142
  }
6216
6143
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityDetailPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6217
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.8", type: AXPEntityDetailPopoverComponent, isStandalone: true, selector: "axp-entity-detail-popover", inputs: { entity: { classPropertyName: "entity", publicName: "entity", isSignal: true, isRequired: true, transformFunction: null }, entityId: { classPropertyName: "entityId", publicName: "entityId", isSignal: true, isRequired: true, transformFunction: null }, textField: { classPropertyName: "textField", publicName: "textField", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "detailPopover", first: true, predicate: ["detailPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "<ax-popover [openOn]=\"'manual'\" #detailPopover (openChange)=\"onDetailPopoverOpenChange($event)\">\n <div class=\"ax-lightest-surface ax-border ax-rounded-lg ax-shadow-lg ax-p-4 ax-min-w-[400px]\">\n <div class=\"ax-mb-4 ax-border-b ax-pb-2\">\n <h3 class=\"ax-text-base ax-font-semibold ax-text-on-lightest-surface\">\n @if (entityDetails()?.entityData?.[textField()]) {\n {{ entityDetails()?.entityData[textField()] }}\n } @else {\n {{ item()?.[textField()] }}\n }\n </h3>\n </div>\n @if (isLoadingDetails()) {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-py-8\">\n <ax-loading>Loading details...</ax-loading>\n </div>\n } @else if (entityDetails()) {\n <div class=\"ax-space-y-3 ax-mb-4\">\n <!-- Important Entity Data -->\n @if (entityDetails()?.entityData) {\n <axp-widgets-container [context]=\"entityDetails()?.entityData\">\n <div class=\"ax-space-y-2\">\n @for (item of getEntityPropertiesWithWidgets(); track item.name) {\n <div class=\"ax-flex ax-justify-between ax-items-center\">\n <span class=\"ax-text-sm ax-font-medium\">{{ item.title | translate | async }}:</span>\n <div class=\"ax-flex-1 ax-ml-2 ax-max-w-48\">\n <ng-container axp-widget-renderer [node]=\"item.node\" [mode]=\"'view'\"></ng-container>\n </div>\n </div>\n }\n </div>\n </axp-widgets-container>\n }\n </div>\n <div class=\"ax-flex ax-gap-2 ax-justify-end ax-sm\">\n <ax-button [color]=\"'primary'\" [look]=\"'solid'\" text=\"Open Details\" (click)=\"navigateToDetails()\"> </ax-button>\n </div>\n }\n </div>\n</ax-popover>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPLayoutBuilderModule }, { kind: "component", type: i3$1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i3$1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i4$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6144
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.8", type: AXPEntityDetailPopoverComponent, isStandalone: true, selector: "axp-entity-detail-popover", inputs: { entity: { classPropertyName: "entity", publicName: "entity", isSignal: true, isRequired: true, transformFunction: null }, entityId: { classPropertyName: "entityId", publicName: "entityId", isSignal: true, isRequired: true, transformFunction: null }, textField: { classPropertyName: "textField", publicName: "textField", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "detailPopover", first: true, predicate: ["detailPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "<ax-popover [openOn]=\"'manual'\" #detailPopover (openChange)=\"onDetailPopoverOpenChange($event)\">\n <div class=\"ax-lightest-surface ax-border ax-rounded-lg ax-shadow-lg ax-p-4 ax-min-w-[400px]\">\n <div class=\"ax-mb-4 ax-border-b ax-pb-2\">\n <h3 class=\"ax-text-base ax-font-semibold ax-text-on-lightest-surface\">\n @if (entityDetails()?.entityData?.[textField()]) {\n {{ entityDetails()?.entityData[textField()] }}\n } @else {\n {{ item()?.[textField()] }}\n }\n </h3>\n </div>\n @if (isLoadingDetails()) {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-py-8\">\n <ax-loading>Loading details...</ax-loading>\n </div>\n } @else if (entityDetails()) {\n <div class=\"ax-space-y-3 ax-mb-4\">\n <!-- Important Entity Data -->\n @if (entityDetails()?.entityData) {\n <axp-widgets-container [context]=\"entityDetails()?.entityData\">\n <div class=\"ax-space-y-2\">\n @for (item of getEntityPropertiesWithWidgets(); track item.name) {\n <div class=\"ax-flex ax-justify-between ax-items-center\">\n <span class=\"ax-text-sm ax-font-medium\">{{ item.title | translate | async }}:</span>\n <div class=\"ax-flex-1 ax-ml-2 ax-max-w-48\">\n <ng-container axp-widget-renderer [node]=\"item.node\" [mode]=\"'view'\"></ng-container>\n </div>\n </div>\n }\n </div>\n </axp-widgets-container>\n }\n </div>\n <div class=\"ax-flex ax-gap-2 ax-justify-end ax-sm\">\n <ax-button [color]=\"'primary'\" [look]=\"'solid'\" text=\"Open Details\" (click)=\"navigateToDetails()\"> </ax-button>\n </div>\n }\n </div>\n</ax-popover>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXPLayoutBuilderModule }, { kind: "component", type: i3$1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i3$1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i4$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6218
6145
  }
6219
6146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityDetailPopoverComponent, decorators: [{
6220
6147
  type: Component,
6221
- args: [{ selector: 'axp-entity-detail-popover', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, AXButtonModule, AXPopoverModule, AXPLayoutBuilderModule, AXTranslationModule, AXLoadingModule], template: "<ax-popover [openOn]=\"'manual'\" #detailPopover (openChange)=\"onDetailPopoverOpenChange($event)\">\n <div class=\"ax-lightest-surface ax-border ax-rounded-lg ax-shadow-lg ax-p-4 ax-min-w-[400px]\">\n <div class=\"ax-mb-4 ax-border-b ax-pb-2\">\n <h3 class=\"ax-text-base ax-font-semibold ax-text-on-lightest-surface\">\n @if (entityDetails()?.entityData?.[textField()]) {\n {{ entityDetails()?.entityData[textField()] }}\n } @else {\n {{ item()?.[textField()] }}\n }\n </h3>\n </div>\n @if (isLoadingDetails()) {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-py-8\">\n <ax-loading>Loading details...</ax-loading>\n </div>\n } @else if (entityDetails()) {\n <div class=\"ax-space-y-3 ax-mb-4\">\n <!-- Important Entity Data -->\n @if (entityDetails()?.entityData) {\n <axp-widgets-container [context]=\"entityDetails()?.entityData\">\n <div class=\"ax-space-y-2\">\n @for (item of getEntityPropertiesWithWidgets(); track item.name) {\n <div class=\"ax-flex ax-justify-between ax-items-center\">\n <span class=\"ax-text-sm ax-font-medium\">{{ item.title | translate | async }}:</span>\n <div class=\"ax-flex-1 ax-ml-2 ax-max-w-48\">\n <ng-container axp-widget-renderer [node]=\"item.node\" [mode]=\"'view'\"></ng-container>\n </div>\n </div>\n }\n </div>\n </axp-widgets-container>\n }\n </div>\n <div class=\"ax-flex ax-gap-2 ax-justify-end ax-sm\">\n <ax-button [color]=\"'primary'\" [look]=\"'solid'\" text=\"Open Details\" (click)=\"navigateToDetails()\"> </ax-button>\n </div>\n }\n </div>\n</ax-popover>\n" }]
6148
+ args: [{ selector: 'axp-entity-detail-popover', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
6149
+ CommonModule,
6150
+ AXButtonModule,
6151
+ AXPopoverModule,
6152
+ AXPLayoutBuilderModule,
6153
+ AXTranslationModule,
6154
+ AXLoadingModule,
6155
+ ], template: "<ax-popover [openOn]=\"'manual'\" #detailPopover (openChange)=\"onDetailPopoverOpenChange($event)\">\n <div class=\"ax-lightest-surface ax-border ax-rounded-lg ax-shadow-lg ax-p-4 ax-min-w-[400px]\">\n <div class=\"ax-mb-4 ax-border-b ax-pb-2\">\n <h3 class=\"ax-text-base ax-font-semibold ax-text-on-lightest-surface\">\n @if (entityDetails()?.entityData?.[textField()]) {\n {{ entityDetails()?.entityData[textField()] }}\n } @else {\n {{ item()?.[textField()] }}\n }\n </h3>\n </div>\n @if (isLoadingDetails()) {\n <div class=\"ax-flex ax-items-center ax-justify-center ax-py-8\">\n <ax-loading>Loading details...</ax-loading>\n </div>\n } @else if (entityDetails()) {\n <div class=\"ax-space-y-3 ax-mb-4\">\n <!-- Important Entity Data -->\n @if (entityDetails()?.entityData) {\n <axp-widgets-container [context]=\"entityDetails()?.entityData\">\n <div class=\"ax-space-y-2\">\n @for (item of getEntityPropertiesWithWidgets(); track item.name) {\n <div class=\"ax-flex ax-justify-between ax-items-center\">\n <span class=\"ax-text-sm ax-font-medium\">{{ item.title | translate | async }}:</span>\n <div class=\"ax-flex-1 ax-ml-2 ax-max-w-48\">\n <ng-container axp-widget-renderer [node]=\"item.node\" [mode]=\"'view'\"></ng-container>\n </div>\n </div>\n }\n </div>\n </axp-widgets-container>\n }\n </div>\n <div class=\"ax-flex ax-gap-2 ax-justify-end ax-sm\">\n <ax-button [color]=\"'primary'\" [look]=\"'solid'\" text=\"Open Details\" (click)=\"navigateToDetails()\"> </ax-button>\n </div>\n }\n </div>\n</ax-popover>\n" }]
6222
6156
  }] });
6223
6157
 
6224
6158
  class AXPEntityDetailPopoverService {
@@ -6587,7 +6521,7 @@ class AXPTagableBoxWidgetEditComponent extends AXPValueWidgetComponent {
6587
6521
  </ax-prefix>
6588
6522
  </ax-button>
6589
6523
  </div>
6590
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i5$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { 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: AXValidationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i7$1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6524
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i5$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { 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: AXValidationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i7.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i6$2.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6591
6525
  }
6592
6526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPTagableBoxWidgetEditComponent, decorators: [{
6593
6527
  type: Component,
@@ -6884,7 +6818,7 @@ class AXPWidgetSelectorWidgetEditComponent extends AXPValueWidgetComponent {
6884
6818
  <axp-widget-property-viewer [widget]="selectedWidgetNode()!" (onChanged)="handleChangeWidget($event)">
6885
6819
  </axp-widget-property-viewer>
6886
6820
  }
6887
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2$1.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "mask-options", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "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.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: AXLoadingModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i5$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "component", type: AXPWidgetPropertyViewerComponent, selector: "axp-widget-property-viewer", inputs: ["widget", "mode"], outputs: ["onChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6821
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2$1.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "mask-options", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "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.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: AXLoadingModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "directive", type: i5$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "component", type: AXPWidgetPropertyViewerComponent, selector: "axp-widget-property-viewer", inputs: ["widget", "mode"], outputs: ["onChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6888
6822
  }
6889
6823
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPWidgetSelectorWidgetEditComponent, decorators: [{
6890
6824
  type: Component,
@@ -6995,7 +6929,7 @@ class AXPEntityCreatePopupAction extends AXPWorkflowAction {
6995
6929
  const result = await this.popupService.open(com, {
6996
6930
  title: headerTitle
6997
6931
  ? headerTitle
6998
- : `${await this.translateService.translateAsync('create-new')} ${await this.translateService.translateAsync(entityRef.formats.individual)}`,
6932
+ : `${await this.translateService.translateAsync('@general:actions.create.title')} ${await this.translateService.translateAsync(entityRef.formats.individual)}`,
6999
6933
  size: this.platform.is('Mobile') || this.platform.is('SM') ? 'full' : size ? size : 'md',
7000
6934
  data: {
7001
6935
  vm: await this.factory.create(module, entity, data, options),
@@ -7403,7 +7337,7 @@ class AXPEntityModule {
7403
7337
  },
7404
7338
  });
7405
7339
  }
7406
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityModule, deps: [{ token: i1$3.AXPAppStartUpService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
7340
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityModule, deps: [{ token: i1$2.AXPAppStartUpService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
7407
7341
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityModule, imports: [RouterModule, i2$2.AXPWorkflowModule, i3$1.AXPLayoutBuilderModule] }); }
7408
7342
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXPEntityModule, providers: [
7409
7343
  {
@@ -7555,7 +7489,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImpor
7555
7489
  ]),
7556
7490
  ],
7557
7491
  }]
7558
- }], ctorParameters: () => [{ type: i1$3.AXPAppStartUpService }, { type: i0.Injector }] });
7492
+ }], ctorParameters: () => [{ type: i1$2.AXPAppStartUpService }, { type: i0.Injector }] });
7559
7493
 
7560
7494
  //#endregion
7561
7495
  //#region ---- Entity Open Details Command ----
@@ -7722,13 +7656,28 @@ function entityMasterDeleteAction() {
7722
7656
  scope: AXPEntityCommandScope.Individual,
7723
7657
  };
7724
7658
  }
7725
- function entityMasterCrudActions() {
7726
- return [
7727
- entityMasterCreateAction(),
7728
- entityMasterBulkDeleteAction(),
7729
- entityMasterViewAction(),
7730
- entityMasterDeleteAction(),
7731
- ];
7659
+ function entityMasterCrudActions(options) {
7660
+ const opts = {
7661
+ create: true,
7662
+ delete: true,
7663
+ view: true,
7664
+ edit: true,
7665
+ ...options,
7666
+ };
7667
+ const actions = [];
7668
+ if (opts.create) {
7669
+ actions.push(entityMasterCreateAction());
7670
+ }
7671
+ if (opts.delete) {
7672
+ actions.push(entityMasterBulkDeleteAction());
7673
+ }
7674
+ if (opts.view) {
7675
+ actions.push(entityMasterViewAction());
7676
+ }
7677
+ if (opts.edit) {
7678
+ actions.push(entityMasterDeleteAction());
7679
+ }
7680
+ return actions;
7732
7681
  }
7733
7682
  function entityMasterRecordActions() {
7734
7683
  return [entityMasterDeleteAction()];
@@ -7886,5 +7835,5 @@ const eventDispatchMiddleware = {
7886
7835
  * Generated bundle index. Do not edit.
7887
7836
  */
7888
7837
 
7889
- export { AXMEntityCrudService, AXMEntityCrudServiceImpl, AXPCreateEntityWorkflow, AXPDataSeederService, AXPDeleteEntityWorkflow, AXPEntityApplyUpdatesAction, AXPEntityCommandTriggerViewModel, AXPEntityCreateEvent, AXPEntityCreatePopupAction, AXPEntityCreateSubmittedAction, AXPEntityCreateViewElementViewModel, AXPEntityCreateViewModelFactory, AXPEntityCreateViewSectionViewModel, AXPEntityDataProvider, AXPEntityDataProviderImpl, AXPEntityDefinitionRegistryService, AXPEntityDeletedEvent, AXPEntityDetailListViewModel, AXPEntityDetailPopoverComponent, AXPEntityDetailPopoverService, AXPEntityDetailViewModelFactory, AXPEntityDetailViewModelResolver, AXPEntityEventDispatcherService, AXPEntityListViewColumnViewModel, AXPEntityListViewModelFactory, AXPEntityListViewModelResolver, AXPEntityMasterCreateViewModel, AXPEntityMasterListViewModel, AXPEntityMasterListViewQueryViewModel, AXPEntityMasterSingleElementViewModel, AXPEntityMasterSingleViewGroupViewModel, AXPEntityMasterSingleViewModel, AXPEntityMasterUpdateElementViewModel, AXPEntityMasterUpdateViewModel, AXPEntityMasterUpdateViewModelFactory, AXPEntityMiddleware, AXPEntityModifyConfirmedAction, AXPEntityModifyEvent, AXPEntityModifySectionPopupAction, AXPEntityModule, AXPEntityPerformDeleteAction, AXPEntityResolver, AXPEntityService, AXPEntityStorageService, AXPGetEntityDetailsQuery, AXPMiddlewareEntityStorageService, AXPModifyEntitySectionWorkflow, AXPOpenEntityDetailsCommand, AXPQuickEntityModifyPopupAction, AXPQuickModifyEntityWorkflow, AXPShowDetailViewAction, AXPShowDetailsViewWorkflow, AXPShowListViewAction, AXPShowListViewWorkflow, 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, DEFAULT_COLUMN_WIDTHS, actionExists, columnWidthMiddlewareFactory, columnWidthMiddlewareProvider, createColumnWidthMiddlewareProvider, createModifierContext, detectEntityChanges, ensureListActions, entityDetailsCreateActions, entityDetailsCrudActions, entityDetailsEditAction, entityDetailsReferenceCondition, entityDetailsReferenceCreateActions, entityDetailsSimpleCondition, entityMasterBulkDeleteAction, entityMasterCreateAction, entityMasterCrudActions, entityMasterDeleteAction, entityMasterRecordActions, entityMasterViewAction, entityOverrideDetailsViewAction, eventDispatchMiddleware };
7838
+ export { AXMEntityCrudService, AXMEntityCrudServiceImpl, AXPCreateEntityWorkflow, AXPDataSeederService, AXPDeleteEntityWorkflow, AXPEntityApplyUpdatesAction, AXPEntityCommandTriggerViewModel, AXPEntityCreateEvent, AXPEntityCreatePopupAction, AXPEntityCreateSubmittedAction, AXPEntityCreateViewElementViewModel, AXPEntityCreateViewModelFactory, AXPEntityCreateViewSectionViewModel, AXPEntityDataProvider, AXPEntityDataProviderImpl, AXPEntityDefinitionRegistryService, AXPEntityDeletedEvent, AXPEntityDetailListViewModel, AXPEntityDetailPopoverComponent, AXPEntityDetailPopoverService, AXPEntityDetailViewModelFactory, AXPEntityDetailViewModelResolver, AXPEntityEventDispatcherService, AXPEntityListViewColumnViewModel, AXPEntityListViewModelFactory, AXPEntityListViewModelResolver, AXPEntityMasterCreateViewModel, AXPEntityMasterListViewModel, AXPEntityMasterListViewQueryViewModel, AXPEntityMasterSingleElementViewModel, AXPEntityMasterSingleViewGroupViewModel, AXPEntityMasterSingleViewModel, AXPEntityMasterUpdateElementViewModel, AXPEntityMasterUpdateViewModel, AXPEntityMasterUpdateViewModelFactory, AXPEntityMiddleware, AXPEntityModifyConfirmedAction, AXPEntityModifyEvent, AXPEntityModifySectionPopupAction, AXPEntityModule, AXPEntityPerformDeleteAction, AXPEntityResolver, AXPEntityService, AXPEntityStorageService, AXPEntityUpdateViewSectionViewModel, AXPGetEntityDetailsQuery, AXPMiddlewareAbortError, AXPMiddlewareEntityStorageService, AXPModifyEntitySectionWorkflow, AXPOpenEntityDetailsCommand, AXPQuickEntityModifyPopupAction, AXPQuickModifyEntityWorkflow, AXPShowDetailViewAction, AXPShowDetailsViewWorkflow, AXPShowListViewAction, AXPShowListViewWorkflow, 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, DEFAULT_COLUMN_WIDTHS, actionExists, columnWidthMiddlewareFactory, columnWidthMiddlewareProvider, createColumnWidthMiddlewareProvider, createModifierContext, detectEntityChanges, ensureListActions, entityDetailsCreateActions, entityDetailsCrudActions, entityDetailsEditAction, entityDetailsReferenceCondition, entityDetailsReferenceCreateActions, entityDetailsSimpleCondition, entityMasterBulkDeleteAction, entityMasterCreateAction, entityMasterCrudActions, entityMasterDeleteAction, entityMasterRecordActions, entityMasterViewAction, entityOverrideDetailsViewAction, eventDispatchMiddleware, isAXPMiddlewareAbortError };
7890
7839
  //# sourceMappingURL=acorex-platform-layout-entity.mjs.map