@acorex/modules 21.0.0-next.89 → 21.0.0-next.90

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 (91) hide show
  1. package/fesm2022/acorex-modules-common.mjs +9 -9
  2. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  3. package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-B_JcAHvL.mjs → acorex-modules-conversation-acorex-modules-conversation-Dc8te-PO.mjs} +364 -237
  4. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-Dc8te-PO.mjs.map +1 -0
  5. package/fesm2022/{acorex-modules-conversation-after-message-sent.command-DcrS7_vV.mjs → acorex-modules-conversation-after-message-sent.command-DxDe6o9N.mjs} +2 -2
  6. package/fesm2022/{acorex-modules-conversation-after-message-sent.command-DcrS7_vV.mjs.map → acorex-modules-conversation-after-message-sent.command-DxDe6o9N.mjs.map} +1 -1
  7. package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-BCkJEAmX.mjs → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Dyx_n0bi.mjs} +3 -3
  8. package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-BCkJEAmX.mjs.map → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Dyx_n0bi.mjs.map} +1 -1
  9. package/fesm2022/{acorex-modules-conversation-comments-page.component-B6TJhe4T.mjs → acorex-modules-conversation-comments-page.component--g4ugC_L.mjs} +2 -2
  10. package/fesm2022/{acorex-modules-conversation-comments-page.component-B6TJhe4T.mjs.map → acorex-modules-conversation-comments-page.component--g4ugC_L.mjs.map} +1 -1
  11. package/fesm2022/{acorex-modules-conversation-emit-typing-indicator.command-CWRdPl-S.mjs → acorex-modules-conversation-emit-typing-indicator.command-BOldPLQ0.mjs} +2 -2
  12. package/fesm2022/{acorex-modules-conversation-emit-typing-indicator.command-CWRdPl-S.mjs.map → acorex-modules-conversation-emit-typing-indicator.command-BOldPLQ0.mjs.map} +1 -1
  13. package/fesm2022/{acorex-modules-conversation-mark-conversation-unread.command-CZlsLAsb.mjs → acorex-modules-conversation-mark-conversation-unread.command-O_zPrBQ0.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-conversation-mark-conversation-unread.command-CZlsLAsb.mjs.map → acorex-modules-conversation-mark-conversation-unread.command-O_zPrBQ0.mjs.map} +1 -1
  15. package/fesm2022/{acorex-modules-conversation-retry-assist-response.command-Cly1-RKt.mjs → acorex-modules-conversation-retry-assist-response.command-DsB-CP3R.mjs} +2 -2
  16. package/fesm2022/{acorex-modules-conversation-retry-assist-response.command-Cly1-RKt.mjs.map → acorex-modules-conversation-retry-assist-response.command-DsB-CP3R.mjs.map} +1 -1
  17. package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-D5QWTKqh.mjs → acorex-modules-conversation-send-assist-chat-message.command-g_NgPuxP.mjs} +2 -2
  18. package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-D5QWTKqh.mjs.map → acorex-modules-conversation-send-assist-chat-message.command-g_NgPuxP.mjs.map} +1 -1
  19. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-DkSZj8fj.mjs → acorex-modules-conversation-start-assist-chat.command-DeMmJdd6.mjs} +2 -2
  20. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-DkSZj8fj.mjs.map → acorex-modules-conversation-start-assist-chat.command-DeMmJdd6.mjs.map} +1 -1
  21. package/fesm2022/{acorex-modules-conversation-sync-read-state.command-jiEsdxUB.mjs → acorex-modules-conversation-sync-read-state.command-4YxdwLaE.mjs} +2 -2
  22. package/fesm2022/{acorex-modules-conversation-sync-read-state.command-jiEsdxUB.mjs.map → acorex-modules-conversation-sync-read-state.command-4YxdwLaE.mjs.map} +1 -1
  23. package/fesm2022/acorex-modules-conversation.mjs +1 -1
  24. package/fesm2022/{acorex-modules-dashboard-management-acorex-modules-dashboard-management-DLuhOPFz.mjs → acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs} +94 -41
  25. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs.map +1 -0
  26. package/fesm2022/{acorex-modules-dashboard-management-index-gjCiELmH.mjs → acorex-modules-dashboard-management-index-rp9dgARq.mjs} +2 -2
  27. package/fesm2022/{acorex-modules-dashboard-management-index-gjCiELmH.mjs.map → acorex-modules-dashboard-management-index-rp9dgARq.mjs.map} +1 -1
  28. package/fesm2022/acorex-modules-dashboard-management.mjs +1 -1
  29. package/fesm2022/{acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs → acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs} +3 -3
  30. package/fesm2022/{acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs.map → acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs.map} +1 -1
  31. package/fesm2022/acorex-modules-document-management.mjs +268 -351
  32. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  33. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-VJ2NUSm1.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-BZwLfZkb.mjs} +42 -21
  34. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-BZwLfZkb.mjs.map +1 -0
  35. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-FgXkyZR_.mjs → acorex-modules-human-capital-management-approve-leave-request.command-B_EBDijL.mjs} +2 -2
  36. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-FgXkyZR_.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-B_EBDijL.mjs.map} +1 -1
  37. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-D2yCvifI.mjs → acorex-modules-human-capital-management-assign-position-assignment.command-ZzWBeTv1.mjs} +2 -2
  38. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-D2yCvifI.mjs.map → acorex-modules-human-capital-management-assign-position-assignment.command-ZzWBeTv1.mjs.map} +1 -1
  39. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DnmsVNwU.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-Bd3RvlNm.mjs} +2 -2
  40. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DnmsVNwU.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-Bd3RvlNm.mjs.map} +1 -1
  41. package/fesm2022/{acorex-modules-human-capital-management-edit-personal-info.command-B0ZUfbqn.mjs → acorex-modules-human-capital-management-edit-personal-info.command-Drbi1WMd.mjs} +2 -2
  42. package/fesm2022/{acorex-modules-human-capital-management-edit-personal-info.command-B0ZUfbqn.mjs.map → acorex-modules-human-capital-management-edit-personal-info.command-Drbi1WMd.mjs.map} +1 -1
  43. package/fesm2022/{acorex-modules-human-capital-management-edit-signature.command-h2kTqSg0.mjs → acorex-modules-human-capital-management-edit-signature.command-CRPqnXIj.mjs} +2 -2
  44. package/fesm2022/{acorex-modules-human-capital-management-edit-signature.command-h2kTqSg0.mjs.map → acorex-modules-human-capital-management-edit-signature.command-CRPqnXIj.mjs.map} +1 -1
  45. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-BdrdgvbN.mjs → acorex-modules-human-capital-management-reject-leave-request.command-BC-1Kixd.mjs} +2 -2
  46. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-BdrdgvbN.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-BC-1Kixd.mjs.map} +1 -1
  47. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-S7Px6Y4B.mjs → acorex-modules-human-capital-management-revoke-position-assignment.command-Caylq9Rv.mjs} +2 -2
  48. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-S7Px6Y4B.mjs.map → acorex-modules-human-capital-management-revoke-position-assignment.command-Caylq9Rv.mjs.map} +1 -1
  49. package/fesm2022/{acorex-modules-human-capital-management-start-leave-request-flow.command-C_tE-D_Y.mjs → acorex-modules-human-capital-management-start-leave-request-flow.command-BsEwA1VM.mjs} +2 -2
  50. package/fesm2022/{acorex-modules-human-capital-management-start-leave-request-flow.command-C_tE-D_Y.mjs.map → acorex-modules-human-capital-management-start-leave-request-flow.command-BsEwA1VM.mjs.map} +1 -1
  51. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-mMP3Yy01.mjs → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B8xK2iTn.mjs} +2 -2
  52. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-mMP3Yy01.mjs.map → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B8xK2iTn.mjs.map} +1 -1
  53. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
  54. package/fesm2022/acorex-modules-platform-dev-tools.mjs +2 -2
  55. package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
  56. package/fesm2022/acorex-modules-project-management.mjs +707 -424
  57. package/fesm2022/acorex-modules-project-management.mjs.map +1 -1
  58. package/fesm2022/acorex-modules-report-management.mjs +1 -1
  59. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  60. package/fesm2022/acorex-modules-task-management-start-task-flow.command-HYdQOWDe.mjs +115 -0
  61. package/fesm2022/acorex-modules-task-management-start-task-flow.command-HYdQOWDe.mjs.map +1 -0
  62. package/fesm2022/{acorex-modules-task-management-task-board.page-DTWxd_vG.mjs → acorex-modules-task-management-task-board.page-BMTjJlry.mjs} +3 -3
  63. package/fesm2022/{acorex-modules-task-management-task-board.page-DTWxd_vG.mjs.map → acorex-modules-task-management-task-board.page-BMTjJlry.mjs.map} +1 -1
  64. package/fesm2022/acorex-modules-task-management.mjs +433 -460
  65. package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
  66. package/fesm2022/{acorex-modules-timesheet-management-report-hours-by-project.query-z38wZLKJ.mjs → acorex-modules-timesheet-management-report-hours-by-project.query-CGc1Q6aB.mjs} +2 -2
  67. package/fesm2022/acorex-modules-timesheet-management-report-hours-by-project.query-CGc1Q6aB.mjs.map +1 -0
  68. package/fesm2022/{acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-BDfvz6fH.mjs → acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-AIcAUd3s.mjs} +2 -2
  69. package/fesm2022/{acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-BDfvz6fH.mjs.map → acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-AIcAUd3s.mjs.map} +1 -1
  70. package/fesm2022/acorex-modules-timesheet-management.mjs +8 -8
  71. package/fesm2022/acorex-modules-timesheet-management.mjs.map +1 -1
  72. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-edit.component-CFF7X1MO.mjs +70 -0
  73. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-edit.component-CFF7X1MO.mjs.map +1 -0
  74. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-view.component-DwC2aHVt.mjs +70 -0
  75. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-view.component-DwC2aHVt.mjs.map +1 -0
  76. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram.types-DmzV305e.mjs +195 -0
  77. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram.types-DmzV305e.mjs.map +1 -0
  78. package/fesm2022/acorex-modules-workplacesafety-management.mjs +139 -16
  79. package/fesm2022/acorex-modules-workplacesafety-management.mjs.map +1 -1
  80. package/package.json +2 -2
  81. package/types/acorex-modules-dashboard-management.d.ts +30 -11
  82. package/types/acorex-modules-document-management.d.ts +21 -5
  83. package/types/acorex-modules-human-capital-management.d.ts +4 -0
  84. package/types/acorex-modules-project-management.d.ts +46 -23
  85. package/types/acorex-modules-task-management.d.ts +80 -11
  86. package/types/acorex-modules-timesheet-management.d.ts +2 -2
  87. package/types/acorex-modules-workplacesafety-management.d.ts +7 -2
  88. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-B_JcAHvL.mjs.map +0 -1
  89. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-DLuhOPFz.mjs.map +0 -1
  90. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-VJ2NUSm1.mjs.map +0 -1
  91. package/fesm2022/acorex-modules-timesheet-management-report-hours-by-project.query-z38wZLKJ.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { AXPStateMessageComponent, AXPLayoutSideDetailPanelComponent, AXPLayoutSideDetailPanelSectionDirective, AXP_PAGE_COMPONENT_PROVIDER, AXPThemeLayoutBlockComponent, AXPQueryFiltersComponent } from '@acorex/platform/layout/components';
2
2
  import { AXPEntityService, resolveEntityPluginDetailPageOrder, ensureListActions, AXPEntityDefinitionRegistryService, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_STORAGE_MIDDLEWARE, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
3
- import { AXPHookService, AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER } from '@acorex/platform/core';
3
+ import { AXPHookService, AXPDeviceService, AXPExpressionEvaluatorService, getSmart, AXP_MODULE_MANIFEST_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER } from '@acorex/platform/core';
4
4
  import { AXPSearchCommandProvider, createEntitySearchCommand, AXPFileTypeProviderService, AXP_FILE_TYPE_INFO_PROVIDER, AXPFileStorageService, AXPFilterOperatorMiddlewareService, AXPSettingsService, AXPLockService, UploadFromComputerActionProvider, AXP_FILE_ACTION_PROVIDER, AXP_PROTECTED_ROUTE_GUARDS, AXP_MENU_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex/platform/common';
5
5
  import { AXPSessionService, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
6
6
  import * as i0 from '@angular/core';
@@ -9,11 +9,11 @@ import * as i5 from '@acorex/core/translation';
9
9
  import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
10
10
  import { AXPCommonMenuKeys } from '@acorex/modules/common';
11
11
  import { firstValueFrom } from 'rxjs';
12
- import * as i6 from '@acorex/platform/layout/widget-core';
12
+ import * as i7 from '@acorex/platform/layout/widget-core';
13
13
  import { AXPValueWidgetComponent, AXPWidgetCoreModule, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex/platform/layout/widget-core';
14
14
  import { AXPWidgetsCatalog, AXPPlatformScope, AXPDataGenerator, AXPWidgetsList, resolvePlatformScopeKey, resolvePlatformScopeName } from '@acorex/platform/contracts';
15
15
  import { AXDataSource } from '@acorex/cdk/common';
16
- import * as i7 from '@acorex/components/collapse';
16
+ import * as i8 from '@acorex/components/collapse';
17
17
  import { AXCollapseModule } from '@acorex/components/collapse';
18
18
  import * as i3$1 from '@acorex/components/decorators';
19
19
  import { AXDecoratorModule } from '@acorex/components/decorators';
@@ -21,11 +21,15 @@ import * as i3 from '@acorex/components/form';
21
21
  import { AXFormModule } from '@acorex/components/form';
22
22
  import * as i4 from '@acorex/components/label';
23
23
  import { AXLabelModule } from '@acorex/components/label';
24
+ import * as i6 from '@acorex/components/search-box';
25
+ import { AXSearchBoxModule } from '@acorex/components/search-box';
24
26
  import * as i1 from '@acorex/components/select-box';
25
27
  import { AXSelectBoxModule } from '@acorex/components/select-box';
26
28
  import * as i2 from '@angular/forms';
27
29
  import { FormsModule } from '@angular/forms';
28
30
  import get from 'lodash-es/get';
31
+ import isEmpty from 'lodash-es/isEmpty';
32
+ import isString from 'lodash-es/isString';
29
33
  import set from 'lodash-es/set';
30
34
  import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DISABLED_PROPERTY } from '@acorex/platform/layout/widgets';
31
35
  import * as i1$1 from '@angular/common';
@@ -38,7 +42,7 @@ import { AXPCommandService } from '@acorex/platform/runtime';
38
42
  import * as i2$3 from '@acorex/platform/workflow';
39
43
  import { AXPWorkflowService, AXPWorkflowAction, AXPWorkflowModule } from '@acorex/platform/workflow';
40
44
  import { AXFileService, AXFileModule } from '@acorex/core/file';
41
- import { castArray, get as get$1, set as set$1 } from 'lodash-es';
45
+ import { isArray, castArray, get as get$1, isString as isString$1, set as set$1 } from 'lodash-es';
42
46
  import * as i1$3 from '@acorex/components/media-viewer';
43
47
  import { AXMediaViewerModule } from '@acorex/components/media-viewer';
44
48
  import * as i1$2 from '@acorex/components/button';
@@ -56,7 +60,6 @@ import { AXButtonGroupModule } from '@acorex/components/button-group';
56
60
  import * as i2$2 from '@acorex/components/dropdown';
57
61
  import { AXDropdownModule } from '@acorex/components/dropdown';
58
62
  import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
59
- import { AXSearchBoxModule } from '@acorex/components/search-box';
60
63
  import { AXPPageLayoutBaseComponent, AXPPageLayoutBase, AXPPageLayoutComponent } from '@acorex/platform/layout/views';
61
64
  import { createAllQueryView, entityMasterCrudActions, entityMasterRecordActions } from '@acorex/platform/layout/entity-contracts';
62
65
  import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
@@ -745,6 +748,7 @@ class AXMFileTypeExtensionWidgetEditComponent extends AXPValueWidgetComponent {
745
748
  constructor() {
746
749
  super(...arguments);
747
750
  this.fileTypeService = inject(AXPFileTypeProviderService);
751
+ this.searchValue = signal(undefined, ...(ngDevMode ? [{ debugName: "searchValue" }] : /* istanbul ignore next */ []));
748
752
  this.dataSource = new AXDataSource({
749
753
  load: async (_) => {
750
754
  try {
@@ -763,9 +767,14 @@ class AXMFileTypeExtensionWidgetEditComponent extends AXPValueWidgetComponent {
763
767
  });
764
768
  })
765
769
  .flat();
770
+ const query = this.normalizeSearchQuery(this.searchValue());
771
+ const items = query
772
+ ? types.filter((item) => item.title.toLowerCase().includes(query) ||
773
+ item.name.toLowerCase().includes(query))
774
+ : types;
766
775
  return {
767
- items: types,
768
- total: types.length,
776
+ items,
777
+ total: items.length,
769
778
  };
770
779
  }
771
780
  catch (e) {
@@ -795,6 +804,26 @@ class AXMFileTypeExtensionWidgetEditComponent extends AXPValueWidgetComponent {
795
804
  this.context.set(e.data);
796
805
  this.setValue({ ...this.getValue(), context: e.data });
797
806
  }
807
+ handleSearchQueryChange(value) {
808
+ this.applySearchQuery(value);
809
+ }
810
+ handleSearchValueChange(e) {
811
+ this.applySearchQuery(e.value);
812
+ }
813
+ applySearchQuery(value) {
814
+ const next = isString(value) && !isEmpty(value.trim()) ? value : undefined;
815
+ if (this.searchValue() === next) {
816
+ return;
817
+ }
818
+ this.searchValue.set(next);
819
+ void this.dataSource.refresh();
820
+ }
821
+ normalizeSearchQuery(value) {
822
+ if (!isString(value) || isEmpty(value.trim())) {
823
+ return undefined;
824
+ }
825
+ return value.trim().toLowerCase();
826
+ }
798
827
  async handleValueChange(e) {
799
828
  const selectItems = e.component.selectedItems;
800
829
  this.setValue({ ...this.getValue(), selectedItems: selectItems });
@@ -872,6 +901,14 @@ class AXMFileTypeExtensionWidgetEditComponent extends AXPValueWidgetComponent {
872
901
  [ngModel]="getValue()?.selectedItems"
873
902
  (onValueChanged)="handleValueChange($event)"
874
903
  >
904
+ <ax-search-box
905
+ [autoSearch]="false"
906
+ [ngModel]="searchValue()"
907
+ (ngModelChange)="handleSearchQueryChange($event)"
908
+ (onValueChanged)="handleSearchValueChange($event)"
909
+ >
910
+ <ax-clear-button></ax-clear-button>
911
+ </ax-search-box>
875
912
  </ax-select-box>
876
913
  <div class="ax-py-3"></div>
877
914
  <axp-widgets-container (onContextChanged)="handleOnContextChange($event)" [context]="context()">
@@ -925,7 +962,7 @@ class AXMFileTypeExtensionWidgetEditComponent extends AXPValueWidgetComponent {
925
962
  </ax-collapse-group>
926
963
  }
927
964
  </axp-widgets-container>
928
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i1.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", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i3.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i4.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.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: AXPWidgetCoreModule }, { kind: "component", type: i6.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i6.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXCollapseModule }, { kind: "component", type: i7.AXCollapseComponent, selector: "ax-collapse", inputs: ["disabled", "look", "isCollapsed", "showHeader", "caption", "icon", "isLoading", "headerTemplate"], outputs: ["onClick", "isCollapsedChange"] }, { kind: "component", type: i7.AXCollapseGroupComponent, selector: "ax-collapse-group", inputs: ["look", "accordion", "activeIndex"], outputs: ["accordionChange", "activeIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
965
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i1.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", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i3.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i4.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i3$1.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: AXSearchBoxModule }, { kind: "component", type: i6.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i7.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i7.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXCollapseModule }, { kind: "component", type: i8.AXCollapseComponent, selector: "ax-collapse", inputs: ["disabled", "look", "isCollapsed", "showHeader", "caption", "icon", "isLoading", "headerTemplate"], outputs: ["onClick", "isCollapsedChange"] }, { kind: "component", type: i8.AXCollapseGroupComponent, selector: "ax-collapse-group", inputs: ["look", "accordion", "activeIndex"], outputs: ["accordionChange", "activeIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
929
966
  }
930
967
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMFileTypeExtensionWidgetEditComponent, decorators: [{
931
968
  type: Component,
@@ -940,6 +977,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
940
977
  [ngModel]="getValue()?.selectedItems"
941
978
  (onValueChanged)="handleValueChange($event)"
942
979
  >
980
+ <ax-search-box
981
+ [autoSearch]="false"
982
+ [ngModel]="searchValue()"
983
+ (ngModelChange)="handleSearchQueryChange($event)"
984
+ (onValueChanged)="handleSearchValueChange($event)"
985
+ >
986
+ <ax-clear-button></ax-clear-button>
987
+ </ax-search-box>
943
988
  </ax-select-box>
944
989
  <div class="ax-py-3"></div>
945
990
  <axp-widgets-container (onContextChanged)="handleOnContextChange($event)" [context]="context()">
@@ -1001,6 +1046,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1001
1046
  AXFormModule,
1002
1047
  AXLabelModule,
1003
1048
  AXDecoratorModule,
1049
+ AXSearchBoxModule,
1004
1050
  AXPWidgetCoreModule,
1005
1051
  AXCollapseModule,
1006
1052
  ],
@@ -1294,6 +1340,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1294
1340
  class AXMDocumentDialogService {
1295
1341
  constructor() {
1296
1342
  this.layoutBuilder = inject(AXPLayoutBuilderService);
1343
+ this.translateService = inject(AXTranslationService);
1297
1344
  this.entityService = inject(AXPEntityService);
1298
1345
  this.documentData = this.entityService
1299
1346
  .withEntity(RootConfig.module.name, RootConfig.entities.document.name)
@@ -1556,7 +1603,10 @@ class AXMDocumentDialogService {
1556
1603
  }
1557
1604
  async chooseDocumentType() {
1558
1605
  const res = await this.documentTypeService.query({ skip: 0, take: 100 });
1559
- const items = (res?.items ?? []).map((x) => ({ value: x.id, text: x.title }));
1606
+ const items = (res?.items ?? []).map((x) => ({
1607
+ value: x.id,
1608
+ text: this.translateService.resolve(x.title ?? x.name ?? x.id),
1609
+ }));
1560
1610
  const result = await this.layoutBuilder
1561
1611
  .create()
1562
1612
  .dialog((dialog) => {
@@ -1620,7 +1670,7 @@ class DocumentAttachmentsService {
1620
1670
  version: 0,
1621
1671
  };
1622
1672
  const title = await this.translateService.translateAsync('@document-management:dialogs.attach-file.title', {
1623
- params: { title: fileTypeEntity.title },
1673
+ params: { title: this.translateService.resolve(fileTypeEntity.title) },
1624
1674
  });
1625
1675
  const result = await this.documentDialog.openAttachmentDialog(title, popupData);
1626
1676
  return this.handlePopupResult(result);
@@ -2495,7 +2545,7 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2495
2545
  * Opens the drive folder picker and creates a shortcut to the given node in the selected folder.
2496
2546
  */
2497
2547
  async createShortcutWithPicker(node, scope) {
2498
- const comp = (await import('./acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs')).AXMDocumentDriveChooseComponent;
2548
+ const comp = (await import('./acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs')).AXMDocumentDriveChooseComponent;
2499
2549
  const popup = await this.popupService.open(comp, {
2500
2550
  title: await this.translate.translateAsync('@document-management:actions.choose-folder-for-shortcut'),
2501
2551
  data: {
@@ -2573,7 +2623,7 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2573
2623
  * Moves a node to another location
2574
2624
  */
2575
2625
  async moveTo(options) {
2576
- const comp = (await import('./acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs')).AXMDocumentDriveChooseComponent;
2626
+ const comp = (await import('./acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs')).AXMDocumentDriveChooseComponent;
2577
2627
  const popup = await this.popupService.open(comp, {
2578
2628
  title: `Choose ${options.browseMode == 'file' ? 'File' : 'Folder'}`,
2579
2629
  data: {
@@ -2606,7 +2656,7 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2606
2656
  * Copies a node to another location
2607
2657
  */
2608
2658
  async copyTo(options) {
2609
- const comp = (await import('./acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs')).AXMDocumentDriveChooseComponent;
2659
+ const comp = (await import('./acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs')).AXMDocumentDriveChooseComponent;
2610
2660
  const popup = await this.popupService.open(comp, {
2611
2661
  title: `Choose ${options.browseMode == 'file' ? 'File' : 'Folder'}`,
2612
2662
  data: {
@@ -2854,18 +2904,36 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2854
2904
  */
2855
2905
  initialFolderDialogDocumentTypes(items, existing) {
2856
2906
  if (Array.isArray(existing) && existing.length > 0) {
2857
- return existing;
2907
+ return existing.map((entry) => {
2908
+ const name = typeof entry === 'object' && entry != null && 'name' in entry
2909
+ ? entry.name
2910
+ : String(entry);
2911
+ return items.find((it) => it?.name === name) ?? entry;
2912
+ });
2858
2913
  }
2859
2914
  const anyType = items.find((it) => it?.name === 'any');
2860
2915
  return anyType ? [anyType] : [];
2861
2916
  }
2917
+ mapDocumentTypesForPicker(items) {
2918
+ return items.map((it) => ({
2919
+ ...it,
2920
+ displayTitle: this.resolveDocumentTypeLabel(it),
2921
+ }));
2922
+ }
2923
+ resolveDocumentTypeLabel(item) {
2924
+ const value = item.title ?? item.name ?? item.id;
2925
+ if (value == null || value === '') {
2926
+ return '';
2927
+ }
2928
+ return this.translate.resolve(value);
2929
+ }
2862
2930
  /**
2863
2931
  * Shows folder edit dialog
2864
2932
  */
2865
2933
  async showFolderEditDialog(node) {
2866
2934
  // Load document types for selection
2867
2935
  const res = await this.documentTypeService.query({ skip: 0, take: 1000 });
2868
- const items = res?.items ?? [];
2936
+ const items = this.mapDocumentTypesForPicker(res?.items ?? []);
2869
2937
  const result = await this.layoutBuilder
2870
2938
  .create()
2871
2939
  .dialog((dialog) => {
@@ -2905,7 +2973,7 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2905
2973
  field.path('documentTypes');
2906
2974
  field.selectBox({
2907
2975
  valueField: 'name',
2908
- textField: 'title',
2976
+ textField: 'displayTitle',
2909
2977
  dataSource: items,
2910
2978
  multiple: true,
2911
2979
  allowSearch: true,
@@ -2952,11 +3020,16 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2952
3020
  */
2953
3021
  async showCreateFolderDialog(parentId, options) {
2954
3022
  const res = await this.documentTypeService.query({ skip: 0, take: 1000 });
2955
- let items = res?.items ?? [];
3023
+ let items = this.mapDocumentTypesForPicker(res?.items ?? []);
2956
3024
  const allowedNames = options?.allowedDocumentTypeNames;
2957
- if (Array.isArray(allowedNames) && allowedNames.length > 0) {
2958
- const set = new Set(allowedNames);
2959
- items = items.filter((it) => it?.name && set.has(it.name));
3025
+ if (isArray(allowedNames)) {
3026
+ if (allowedNames.length === 0) {
3027
+ items = [];
3028
+ }
3029
+ else {
3030
+ const set = new Set(allowedNames);
3031
+ items = items.filter((it) => it?.name && set.has(it.name));
3032
+ }
2960
3033
  }
2961
3034
  const defaultDocumentTypes = this.initialFolderDialogDocumentTypes(items, []);
2962
3035
  const result = await this.layoutBuilder
@@ -2998,7 +3071,7 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2998
3071
  field.path('documentTypes');
2999
3072
  field.selectBox({
3000
3073
  valueField: 'name',
3001
- textField: 'title',
3074
+ textField: 'displayTitle',
3002
3075
  dataSource: items,
3003
3076
  multiple: true,
3004
3077
  allowSearch: true,
@@ -3158,7 +3231,7 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
3158
3231
  * Shows choose file dialog
3159
3232
  */
3160
3233
  async showChooseFileDialog(scope) {
3161
- const comp = (await import('./acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs')).AXMDocumentDriveChooseComponent;
3234
+ const comp = (await import('./acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs')).AXMDocumentDriveChooseComponent;
3162
3235
  const result = await this.popupService.open(comp, {
3163
3236
  title: await this.translate.translateAsync('@document-management:actions.choose-from-drive'),
3164
3237
  data: {
@@ -3856,8 +3929,10 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
3856
3929
  : [];
3857
3930
  const folderTypes = store.currentFolder()?.documentTypes ?? [];
3858
3931
  const allowedNames = store.allowedDocumentTypeNames();
3859
- let typesToShow = allowedNames != null && allowedNames.length > 0
3860
- ? folderTypes.filter((t) => t?.name && allowedNames.includes(t.name))
3932
+ let typesToShow = allowedNames != null
3933
+ ? allowedNames.length > 0
3934
+ ? folderTypes.filter((t) => t?.name && allowedNames.includes(t.name))
3935
+ : []
3861
3936
  : folderTypes;
3862
3937
  if (allowedNames != null &&
3863
3938
  allowedNames.length > 0 &&
@@ -3877,7 +3952,7 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
3877
3952
  },
3878
3953
  }] : []),
3879
3954
  ...typesToShow.map((type) => ({
3880
- title: type.title,
3955
+ title: translateService.resolve(type.title),
3881
3956
  icon: 'fa-light fa-file-arrow-up',
3882
3957
  break: true,
3883
3958
  command: {
@@ -4086,7 +4161,7 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
4086
4161
  break: true,
4087
4162
  items: node.documentTypes.map((type, index, array) => ({
4088
4163
  name: `upload.${type.name}`,
4089
- text: type.title,
4164
+ text: translateService.resolve(type.title),
4090
4165
  icon: 'fa-light fa-file-arrow-up',
4091
4166
  break: index !== array.length - 1,
4092
4167
  data: {
@@ -4319,9 +4394,8 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
4319
4394
  const parentId = node?.id ?? store.currentNode()?.id;
4320
4395
  if (parentId) {
4321
4396
  const allowedNames = store.allowedDocumentTypeNames();
4322
- console.log('allowedNames', allowedNames);
4323
4397
  const result = await driveService.showCreateFolderDialog(parentId, {
4324
- allowedDocumentTypeNames: allowedNames != null && allowedNames.length > 0 ? allowedNames : undefined,
4398
+ allowedDocumentTypeNames: allowedNames ?? undefined,
4325
4399
  });
4326
4400
  if (result) {
4327
4401
  await this.refresh();
@@ -4998,7 +5072,7 @@ class AXMDocumentExplorerDetailPanelComponent {
4998
5072
  this.multiSelectLabel.set(`${this.vm.selectedCount()} ${itemsSelected}`);
4999
5073
  }
5000
5074
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDocumentExplorerDetailPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5001
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMDocumentExplorerDetailPanelComponent, isStandalone: true, selector: "axm-document-explorer-detail-panel", ngImport: i0, template: "@if (vm.hasMultipleSelectedItems() && multiSelectLabel(); as multiLabel) {\n <axp-layout-side-detail-panel [multiSelectLabel]=\"multiLabel\" (panelClose)=\"onPanelClose()\" />\n} @else {\n <axp-layout-side-detail-panel\n [header]=\"panelHeader()\"\n [sections]=\"panelSections()\"\n (panelClose)=\"onPanelClose()\"\n >\n @if (metadataWidgetNode(); as widgetNode) {\n <ng-template axpLayoutSideDetailPanelSection=\"metadata\">\n <axp-widgets-container [context]=\"metadataContext()\">\n <ng-container axp-widget-renderer [node]=\"widgetNode\" [mode]=\"'view'\"></ng-container>\n </axp-widgets-container>\n </ng-template>\n }\n </axp-layout-side-detail-panel>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i6.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i6.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXPLayoutSideDetailPanelComponent, selector: "axp-layout-side-detail-panel", inputs: ["multiSelectLabel", "header", "sections", "rows", "rowsSectionTitle", "noRowsMessage", "emptyState"], outputs: ["panelClose"] }, { kind: "directive", type: AXPLayoutSideDetailPanelSectionDirective, selector: "[axpLayoutSideDetailPanelSection]", inputs: ["axpLayoutSideDetailPanelSection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5075
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMDocumentExplorerDetailPanelComponent, isStandalone: true, selector: "axm-document-explorer-detail-panel", ngImport: i0, template: "@if (vm.hasMultipleSelectedItems() && multiSelectLabel(); as multiLabel) {\n <axp-layout-side-detail-panel [multiSelectLabel]=\"multiLabel\" (panelClose)=\"onPanelClose()\" />\n} @else {\n <axp-layout-side-detail-panel\n [header]=\"panelHeader()\"\n [sections]=\"panelSections()\"\n (panelClose)=\"onPanelClose()\"\n >\n @if (metadataWidgetNode(); as widgetNode) {\n <ng-template axpLayoutSideDetailPanelSection=\"metadata\">\n <axp-widgets-container [context]=\"metadataContext()\">\n <ng-container axp-widget-renderer [node]=\"widgetNode\" [mode]=\"'view'\"></ng-container>\n </axp-widgets-container>\n </ng-template>\n }\n </axp-layout-side-detail-panel>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i7.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i7.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged", "onLoad"], exportAs: ["widgetRenderer"] }, { kind: "component", type: AXPLayoutSideDetailPanelComponent, selector: "axp-layout-side-detail-panel", inputs: ["multiSelectLabel", "header", "sections", "rows", "rowsSectionTitle", "noRowsMessage", "emptyState"], outputs: ["panelClose"] }, { kind: "directive", type: AXPLayoutSideDetailPanelSectionDirective, selector: "[axpLayoutSideDetailPanelSection]", inputs: ["axpLayoutSideDetailPanelSection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5002
5076
  }
5003
5077
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMDocumentExplorerDetailPanelComponent, decorators: [{
5004
5078
  type: Component,
@@ -5033,6 +5107,9 @@ class AXMDocumentDrivePageComponent extends AXPPageLayoutBaseComponent {
5033
5107
  this.driveService = inject(AXMDocumentManagerService);
5034
5108
  this.vm = inject(AXPDocumentExplorerViewModel);
5035
5109
  this.route = inject(ActivatedRoute);
5110
+ this.expressionEvaluator = inject(AXPExpressionEvaluatorService);
5111
+ /** Resolved restriction list; null = not configured (allow all). */
5112
+ this.resolvedAllowedDocumentTypeNames = signal(null, ...(ngDevMode ? [{ debugName: "resolvedAllowedDocumentTypeNames" }] : /* istanbul ignore next */ []));
5036
5113
  //#endregion
5037
5114
  //#region ---- View State ----
5038
5115
  this.filterItems = signal([], ...(ngDevMode ? [{ debugName: "filterItems" }] : /* istanbul ignore next */ []));
@@ -5084,12 +5161,23 @@ class AXMDocumentDrivePageComponent extends AXPPageLayoutBaseComponent {
5084
5161
  this.layoutService.setNavigationLoading(isLoading);
5085
5162
  });
5086
5163
  }, ...(ngDevMode ? [{ debugName: "#loadingEffect" }] : /* istanbul ignore next */ []));
5164
+ /** Re-apply document type restrictions when record context or plugin options change. */
5165
+ this.#allowedDocumentTypesEffect = effect(() => {
5166
+ this.rootContext();
5167
+ this.options();
5168
+ this.pageConfig();
5169
+ untracked(() => {
5170
+ void this.applyAllowedDocumentTypeNames();
5171
+ });
5172
+ }, ...(ngDevMode ? [{ debugName: "#allowedDocumentTypesEffect" }] : /* istanbul ignore next */ []));
5087
5173
  }
5088
5174
  //#endregion
5089
5175
  //#region ---- Effects ----
5090
5176
  /** In embedded mode: when VM requests folder navigation, load that folder (no router). */
5091
5177
  #navigateEffect;
5092
5178
  #loadingEffect;
5179
+ /** Re-apply document type restrictions when record context or plugin options change. */
5180
+ #allowedDocumentTypesEffect;
5093
5181
  //#endregion
5094
5182
  //#region ---- Lifecycle ----
5095
5183
  async ngOnInit() {
@@ -5099,25 +5187,56 @@ class AXMDocumentDrivePageComponent extends AXPPageLayoutBaseComponent {
5099
5187
  if (!refType || !refId) {
5100
5188
  return;
5101
5189
  }
5102
- console.log('options: ', this.options());
5103
5190
  await this.vm.initialize({ browseMode: 'file', scope: AXPPlatformScope.Tenant });
5104
- const pageConfigSnapshot = this.pageConfig();
5105
- console.log('[document-drive-page] ngOnInit pageConfig():', pageConfigSnapshot);
5106
- const allowedNames = this.getAllowedDocumentTypeNames();
5107
- console.log('[document-drive-page] getAllowedDocumentTypeNames():', allowedNames);
5108
- if (allowedNames) {
5109
- this.vm.setAllowedDocumentTypeNames(allowedNames);
5110
- }
5191
+ await this.applyAllowedDocumentTypeNames();
5111
5192
  const { result } = await this.driveService.getRootByEntityRef(refType, refId);
5112
5193
  this.pageRootFolderId.set(result.id);
5113
5194
  await this.vm.loadFolderContents(result.id);
5195
+ await this.applyAllowedDocumentTypeNames();
5114
5196
  this.recompute();
5115
5197
  }
5116
- /** Allowed document type names from pageConfig (when plugin is configured with documentTypeNames). */
5117
- getAllowedDocumentTypeNames() {
5198
+ /**
5199
+ * Resolves allowed document type names from static plugin config or an expression evaluated against rootContext.
5200
+ * Returns null when not configured (no restriction).
5201
+ */
5202
+ async resolveAllowedDocumentTypeNames() {
5118
5203
  const config = this.pageConfig();
5119
- const arr = config && config.allowedDocumentTypeNames;
5120
- return Array.isArray(arr) && arr.length > 0 ? arr : undefined;
5204
+ const configNames = config && config.allowedDocumentTypeNames;
5205
+ if (isArray(configNames)) {
5206
+ return configNames.filter((name) => isString$1(name) && name.trim().length > 0);
5207
+ }
5208
+ const raw = this.options()?.['documentTypeNames'];
5209
+ if (raw == null) {
5210
+ return null;
5211
+ }
5212
+ if (isArray(raw)) {
5213
+ return raw.filter((name) => isString$1(name) && name.trim().length > 0);
5214
+ }
5215
+ if (isString$1(raw) && raw.trim()) {
5216
+ const scope = {
5217
+ context: {
5218
+ eval: (path) => getSmart(this.rootContext(), path),
5219
+ },
5220
+ };
5221
+ const evaluated = await this.expressionEvaluator.evaluate(raw.trim(), scope);
5222
+ if (isArray(evaluated)) {
5223
+ return evaluated.filter((name) => isString$1(name) && name.trim().length > 0);
5224
+ }
5225
+ return [];
5226
+ }
5227
+ return null;
5228
+ }
5229
+ async applyAllowedDocumentTypeNames() {
5230
+ const names = await this.resolveAllowedDocumentTypeNames();
5231
+ if (names === null) {
5232
+ return;
5233
+ }
5234
+ this.resolvedAllowedDocumentTypeNames.set(names);
5235
+ this.vm.setAllowedDocumentTypeNames(names);
5236
+ }
5237
+ getAllowedDocumentTypeNames() {
5238
+ const names = this.resolvedAllowedDocumentTypeNames();
5239
+ return names === null ? undefined : names;
5121
5240
  }
5122
5241
  /**
5123
5242
  * Resolves refType and refId for getRootByEntityRef from pageConfig, rootContext, or route.
@@ -5220,8 +5339,7 @@ class AXMDocumentDrivePageComponent extends AXPPageLayoutBaseComponent {
5220
5339
  },
5221
5340
  ];
5222
5341
  }
5223
- const addItemItems = await this.vm.getFolderAddMenuItems({ canAddFolder: false });
5224
- console.log('[document-drive-page] addItemItems:', addItemItems);
5342
+ const addItemItems = await this.vm.getFolderAddMenuItems();
5225
5343
  if (addItemItems.length > 0) {
5226
5344
  addItemItems[addItemItems.length - 1].break = false;
5227
5345
  return [
@@ -6079,11 +6197,18 @@ async function documentTypeFactory() {
6079
6197
  plural: RootConfig.entities.documentType.titlePlural,
6080
6198
  searchResult: {
6081
6199
  title: '{{ title }}',
6082
- description: RootConfig.module.title,
6200
+ description: '{{ description }}',
6083
6201
  },
6084
6202
  },
6085
6203
  plugins: [
6086
6204
  { name: 'history' },
6205
+ {
6206
+ name: 'unique-fields',
6207
+ options: {
6208
+ fields: 'name',
6209
+ scope: 'global',
6210
+ },
6211
+ },
6087
6212
  {
6088
6213
  name: 'meta-data-builder',
6089
6214
  options: {
@@ -6095,7 +6220,11 @@ async function documentTypeFactory() {
6095
6220
  groups: [
6096
6221
  {
6097
6222
  id: 'basic-info',
6098
- title: RootConfig.entities.documentType.title,
6223
+ title: '@general:terms.interface.basic-info',
6224
+ },
6225
+ {
6226
+ id: 'configuration',
6227
+ title: '@general:terms.interface.configuration',
6099
6228
  },
6100
6229
  {
6101
6230
  id: 'management',
@@ -6111,23 +6240,41 @@ async function documentTypeFactory() {
6111
6240
  sort: {
6112
6241
  enabled: true,
6113
6242
  },
6243
+ filter: {
6244
+ advance: { enabled: true },
6245
+ inline: { enabled: true },
6246
+ },
6114
6247
  },
6115
6248
  schema: {
6116
6249
  dataType: 'string',
6250
+ readonly: '{{ !!context.eval("id") }}',
6117
6251
  interface: {
6118
6252
  type: AXPWidgetsList.Editors.TextBox,
6253
+ options: {
6254
+ disabled: '{{ !!context.eval("id") }}',
6255
+ },
6119
6256
  },
6120
6257
  },
6121
6258
  validations: [
6122
6259
  {
6123
6260
  rule: 'required',
6124
6261
  },
6262
+ {
6263
+ rule: 'variable-name',
6264
+ },
6125
6265
  ],
6126
6266
  },
6127
6267
  {
6128
6268
  name: 'title',
6129
6269
  title: '@general:terms.common.title',
6130
6270
  groupId: 'basic-info',
6271
+ options: {
6272
+ sort: { enabled: true },
6273
+ filter: {
6274
+ advance: { enabled: true },
6275
+ inline: { enabled: true },
6276
+ },
6277
+ },
6131
6278
  schema: {
6132
6279
  dataType: 'string',
6133
6280
  interface: {
@@ -6140,12 +6287,31 @@ async function documentTypeFactory() {
6140
6287
  },
6141
6288
  ],
6142
6289
  },
6290
+ {
6291
+ name: 'description',
6292
+ title: '@general:terms.common.description',
6293
+ groupId: 'basic-info',
6294
+ options: {
6295
+ sort: { enabled: false },
6296
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
6297
+ },
6298
+ schema: {
6299
+ dataType: 'string',
6300
+ interface: {
6301
+ type: AXPWidgetsList.Editors.LargeTextBox,
6302
+ options: {
6303
+ rows: 3,
6304
+ },
6305
+ },
6306
+ },
6307
+ },
6143
6308
  {
6144
6309
  name: 'maxSize',
6145
6310
  title: `@${i18n}:terms.document.max-size`,
6146
- groupId: 'basic-info',
6311
+ groupId: 'configuration',
6147
6312
  schema: {
6148
6313
  dataType: 'number',
6314
+ defaultValue: 50000,
6149
6315
  interface: {
6150
6316
  type: AXPWidgetsList.Editors.UnitValueBox,
6151
6317
  options: {
@@ -6181,7 +6347,7 @@ async function documentTypeFactory() {
6181
6347
  {
6182
6348
  name: 'isEncrypted',
6183
6349
  title: `@${i18n}:terms.document.is-encrypted`,
6184
- groupId: 'basic-info',
6350
+ groupId: 'configuration',
6185
6351
  schema: {
6186
6352
  dataType: 'boolean',
6187
6353
  interface: {
@@ -6189,6 +6355,21 @@ async function documentTypeFactory() {
6189
6355
  },
6190
6356
  },
6191
6357
  },
6358
+ {
6359
+ name: 'type',
6360
+ title: `@${i18n}:terms.common.type`,
6361
+ groupId: 'configuration',
6362
+ options: {
6363
+ sort: { enabled: false },
6364
+ },
6365
+ schema: {
6366
+ dataType: 'object',
6367
+ interface: {
6368
+ type: AXPWidgetsList.Editors.FileTypeExtension,
6369
+ options: {},
6370
+ },
6371
+ },
6372
+ },
6192
6373
  {
6193
6374
  name: 'enableExpiration',
6194
6375
  title: `@${i18n}:terms.document.enable-expiration`,
@@ -6242,214 +6423,36 @@ async function documentTypeFactory() {
6242
6423
  // },
6243
6424
  // },
6244
6425
  // },
6245
- {
6246
- name: 'type',
6247
- title: `@${i18n}:terms.common.type`,
6248
- groupId: 'basic-info',
6249
- schema: {
6250
- dataType: 'object',
6251
- interface: {
6252
- type: AXPWidgetsList.Editors.FileTypeExtension,
6253
- options: {},
6254
- },
6255
- },
6256
- },
6257
6426
  ],
6258
- columns: [{ name: 'name' }, { name: 'title' }],
6427
+ columns: [{ name: 'name' }, { name: 'title' }, { name: 'description' }],
6259
6428
  interfaces: {
6260
6429
  master: {
6261
6430
  create: {
6262
- sections: [
6263
- {
6264
- id: 'basic-info',
6265
- },
6266
- {
6267
- id: 'management',
6268
- },
6269
- ],
6431
+ sections: [{ id: 'basic-info' }, { id: 'configuration' }, { id: 'management' }],
6270
6432
  properties: [
6271
- {
6272
- name: 'name',
6273
- layout: {
6274
- positions: {
6275
- lg: {
6276
- colSpan: 6,
6277
- },
6278
- },
6279
- },
6280
- },
6281
- {
6282
- name: 'title',
6283
- layout: {
6284
- positions: {
6285
- lg: {
6286
- colSpan: 6,
6287
- },
6288
- },
6289
- },
6290
- },
6291
- {
6292
- name: 'maxSize',
6293
- layout: {
6294
- positions: {
6295
- lg: {
6296
- colSpan: 6,
6297
- },
6298
- },
6299
- },
6300
- },
6301
- {
6302
- name: 'isEncrypted',
6303
- layout: {
6304
- positions: {
6305
- lg: {
6306
- colSpan: 6,
6307
- },
6308
- },
6309
- },
6310
- },
6311
- {
6312
- name: 'enableExpiration',
6313
- layout: {
6314
- positions: {
6315
- lg: {
6316
- colSpan: 6,
6317
- },
6318
- },
6319
- },
6320
- },
6321
- {
6322
- name: 'requiresReview',
6323
- layout: {
6324
- positions: {
6325
- lg: {
6326
- colSpan: 6,
6327
- },
6328
- },
6329
- },
6330
- },
6331
- {
6332
- name: 'enableVersioning',
6333
- layout: {
6334
- positions: {
6335
- lg: {
6336
- colSpan: 6,
6337
- },
6338
- },
6339
- },
6340
- },
6341
- // {
6342
- // name: 'meta',
6343
- // layout: {
6344
- // positions: {
6345
- // lg: {
6346
- // colSpan: 12,
6347
- // },
6348
- // },
6349
- // },
6350
- // },
6351
- {
6352
- name: 'type',
6353
- layout: {
6354
- positions: {
6355
- lg: {
6356
- colSpan: 12,
6357
- },
6358
- },
6359
- },
6360
- },
6433
+ { name: 'name', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
6434
+ { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 2 } } } },
6435
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6436
+ { name: 'maxSize', layout: { positions: { lg: { colSpan: 4, order: 1 } } } },
6437
+ { name: 'isEncrypted', layout: { positions: { lg: { colSpan: 6, order: 2 } } } },
6438
+ { name: 'type', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6439
+ { name: 'enableExpiration', layout: { positions: { lg: { colSpan: 4, order: 1 } } } },
6440
+ { name: 'requiresReview', layout: { positions: { lg: { colSpan: 4, order: 2 } } } },
6441
+ { name: 'enableVersioning', layout: { positions: { lg: { colSpan: 4, order: 3 } } } },
6361
6442
  ],
6362
6443
  },
6363
6444
  update: {
6364
- sections: [
6365
- {
6366
- id: 'basic-info',
6367
- },
6368
- {
6369
- id: 'management',
6370
- },
6371
- ],
6445
+ sections: [{ id: 'basic-info' }, { id: 'configuration' }, { id: 'management' }],
6372
6446
  properties: [
6373
- {
6374
- name: 'name',
6375
- layout: {
6376
- positions: {
6377
- lg: {
6378
- colSpan: 6,
6379
- },
6380
- },
6381
- },
6382
- },
6383
- {
6384
- name: 'title',
6385
- layout: {
6386
- positions: {
6387
- lg: {
6388
- colSpan: 6,
6389
- },
6390
- },
6391
- },
6392
- },
6393
- {
6394
- name: 'maxSize',
6395
- layout: {
6396
- positions: {
6397
- lg: {
6398
- colSpan: 6,
6399
- },
6400
- },
6401
- },
6402
- },
6403
- {
6404
- name: 'isEncrypted',
6405
- layout: {
6406
- positions: {
6407
- lg: {
6408
- colSpan: 6,
6409
- },
6410
- },
6411
- },
6412
- },
6413
- {
6414
- name: 'enableExpiration',
6415
- layout: {
6416
- positions: {
6417
- lg: {
6418
- colSpan: 6,
6419
- },
6420
- },
6421
- },
6422
- },
6423
- {
6424
- name: 'requiresReview',
6425
- layout: {
6426
- positions: {
6427
- lg: {
6428
- colSpan: 6,
6429
- },
6430
- },
6431
- },
6432
- },
6433
- {
6434
- name: 'enableVersioning',
6435
- layout: {
6436
- positions: {
6437
- lg: {
6438
- colSpan: 6,
6439
- },
6440
- },
6441
- },
6442
- },
6443
- {
6444
- name: 'type',
6445
- layout: {
6446
- positions: {
6447
- lg: {
6448
- colSpan: 12,
6449
- },
6450
- },
6451
- },
6452
- },
6447
+ { name: 'name', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
6448
+ { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 2 } } } },
6449
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6450
+ { name: 'maxSize', layout: { positions: { lg: { colSpan: 4, order: 1 } } } },
6451
+ { name: 'isEncrypted', layout: { positions: { lg: { colSpan: 6, order: 2 } } } },
6452
+ { name: 'type', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6453
+ { name: 'enableExpiration', layout: { positions: { lg: { colSpan: 4, order: 1 } } } },
6454
+ { name: 'requiresReview', layout: { positions: { lg: { colSpan: 4, order: 2 } } } },
6455
+ { name: 'enableVersioning', layout: { positions: { lg: { colSpan: 4, order: 3 } } } },
6453
6456
  ],
6454
6457
  },
6455
6458
  single: {
@@ -6457,116 +6460,30 @@ async function documentTypeFactory() {
6457
6460
  sections: [
6458
6461
  {
6459
6462
  id: 'basic-info',
6460
- layout: {
6461
- positions: {
6462
- lg: {
6463
- colSpan: 12,
6464
- },
6465
- },
6466
- },
6463
+ order: 1,
6464
+ layout: { positions: { lg: { colSpan: 12 } } },
6465
+ },
6466
+ {
6467
+ id: 'configuration',
6468
+ order: 2,
6469
+ layout: { positions: { lg: { colSpan: 12 } } },
6467
6470
  },
6468
6471
  {
6469
6472
  id: 'management',
6470
- layout: {
6471
- positions: {
6472
- lg: {
6473
- colSpan: 12,
6474
- },
6475
- },
6476
- },
6473
+ order: 3,
6474
+ layout: { positions: { lg: { colSpan: 12 } } },
6477
6475
  },
6478
6476
  ],
6479
6477
  properties: [
6480
- {
6481
- name: 'name',
6482
- layout: {
6483
- positions: {
6484
- lg: {
6485
- colSpan: 6,
6486
- },
6487
- },
6488
- },
6489
- },
6490
- {
6491
- name: 'title',
6492
- layout: {
6493
- positions: {
6494
- lg: {
6495
- colSpan: 6,
6496
- },
6497
- },
6498
- },
6499
- },
6500
- {
6501
- name: 'maxSize',
6502
- layout: {
6503
- positions: {
6504
- lg: {
6505
- colSpan: 6,
6506
- },
6507
- },
6508
- },
6509
- },
6510
- {
6511
- name: 'isEncrypted',
6512
- layout: {
6513
- positions: {
6514
- lg: {
6515
- colSpan: 6,
6516
- },
6517
- },
6518
- },
6519
- },
6520
- {
6521
- name: 'enableExpiration',
6522
- layout: {
6523
- positions: {
6524
- lg: {
6525
- colSpan: 6,
6526
- },
6527
- },
6528
- },
6529
- },
6530
- {
6531
- name: 'requiresReview',
6532
- layout: {
6533
- positions: {
6534
- lg: {
6535
- colSpan: 6,
6536
- },
6537
- },
6538
- },
6539
- },
6540
- {
6541
- name: 'enableVersioning',
6542
- layout: {
6543
- positions: {
6544
- lg: {
6545
- colSpan: 6,
6546
- },
6547
- },
6548
- },
6549
- },
6550
- // {
6551
- // name: 'meta',
6552
- // layout: {
6553
- // positions: {
6554
- // lg: {
6555
- // colSpan: 12,
6556
- // },
6557
- // },
6558
- // },
6559
- // },
6560
- {
6561
- name: 'type',
6562
- layout: {
6563
- positions: {
6564
- lg: {
6565
- colSpan: 12,
6566
- },
6567
- },
6568
- },
6569
- },
6478
+ { name: 'name', layout: { positions: { lg: { colSpan: 6, order: 1 } } } },
6479
+ { name: 'title', layout: { positions: { lg: { colSpan: 6, order: 2 } } } },
6480
+ { name: 'description', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6481
+ { name: 'maxSize', layout: { positions: { lg: { colSpan: 4, order: 1 } } } },
6482
+ { name: 'isEncrypted', layout: { positions: { lg: { colSpan: 6, order: 2 } } } },
6483
+ { name: 'type', layout: { positions: { lg: { colSpan: 12, order: 3 } } } },
6484
+ { name: 'enableExpiration', layout: { positions: { lg: { colSpan: 4, order: 1 } } } },
6485
+ { name: 'requiresReview', layout: { positions: { lg: { colSpan: 4, order: 2 } } } },
6486
+ { name: 'enableVersioning', layout: { positions: { lg: { colSpan: 4, order: 3 } } } },
6570
6487
  ],
6571
6488
  actions: [...entityMasterRecordActions()],
6572
6489
  },
@@ -6741,7 +6658,7 @@ class AXMDocumentDriveComponent extends AXPPageLayoutBaseComponent {
6741
6658
  const docTypes = await this.documentTypeService.query({ skip: 0, take: 1000 });
6742
6659
  this.documentTypeFilterOptions.set((docTypes.items ?? []).map((it) => ({
6743
6660
  id: it.id,
6744
- title: (it.title ?? it.name ?? it.id),
6661
+ title: this.translateService.resolve(it.title ?? it.name ?? it.id),
6745
6662
  })));
6746
6663
  await this.loadAdvancedFilterDefinitions([]);
6747
6664
  const searchQuery = snapshot.queryParams['search'];