@acorex-platform/module-document-management-client 0.0.57 → 0.0.59

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/fesm2022/{acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-qhcOFKFu.mjs → acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-DHVvb5hG.mjs} +445 -143
  2. package/fesm2022/acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-DHVvb5hG.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-document-management-client-attachment-view-skeleton.component-BeQSbax5.mjs → acorex-platform-module-document-management-client-attachment-view-skeleton.component-DD0Lceid.mjs} +2 -2
  4. package/fesm2022/{acorex-platform-module-document-management-client-attachment-view-skeleton.component-BeQSbax5.mjs.map → acorex-platform-module-document-management-client-attachment-view-skeleton.component-DD0Lceid.mjs.map} +1 -1
  5. package/fesm2022/{acorex-platform-module-document-management-client-attachment-widget.component-CsrcMMC9.mjs → acorex-platform-module-document-management-client-attachment-widget.component-YAoJdiMV.mjs} +2 -2
  6. package/fesm2022/{acorex-platform-module-document-management-client-attachment-widget.component-CsrcMMC9.mjs.map → acorex-platform-module-document-management-client-attachment-widget.component-YAoJdiMV.mjs.map} +1 -1
  7. package/fesm2022/acorex-platform-module-document-management-client-contracts.mjs +161 -1
  8. package/fesm2022/acorex-platform-module-document-management-client-contracts.mjs.map +1 -1
  9. package/fesm2022/{acorex-platform-module-document-management-client-details-view.component-DkCD8RSd.mjs → acorex-platform-module-document-management-client-details-view.component-DVrr-Jcx.mjs} +111 -37
  10. package/fesm2022/acorex-platform-module-document-management-client-details-view.component-DVrr-Jcx.mjs.map +1 -0
  11. package/fesm2022/{acorex-platform-module-document-management-client-distribute-document.command-BaCdm2YF.mjs → acorex-platform-module-document-management-client-distribute-document.command-dTEExoVn.mjs} +2 -2
  12. package/fesm2022/{acorex-platform-module-document-management-client-distribute-document.command-BaCdm2YF.mjs.map → acorex-platform-module-document-management-client-distribute-document.command-dTEExoVn.mjs.map} +1 -1
  13. package/fesm2022/{acorex-platform-module-document-management-client-drive-choose.component-up9sAsei.mjs → acorex-platform-module-document-management-client-drive-choose.component-B-CVJk4t.mjs} +2 -2
  14. package/fesm2022/{acorex-platform-module-document-management-client-drive-choose.component-up9sAsei.mjs.map → acorex-platform-module-document-management-client-drive-choose.component-B-CVJk4t.mjs.map} +1 -1
  15. package/fesm2022/{acorex-platform-module-document-management-client-large-icons-view-skeleton.component-C_VbFRKl.mjs → acorex-platform-module-document-management-client-large-icons-view-skeleton.component-DLW69Mgy.mjs} +2 -2
  16. package/fesm2022/{acorex-platform-module-document-management-client-large-icons-view-skeleton.component-C_VbFRKl.mjs.map → acorex-platform-module-document-management-client-large-icons-view-skeleton.component-DLW69Mgy.mjs.map} +1 -1
  17. package/fesm2022/{acorex-platform-module-document-management-client-large-icons-view.component-Cece4n22.mjs → acorex-platform-module-document-management-client-large-icons-view.component-CSgo6Q03.mjs} +2 -2
  18. package/fesm2022/{acorex-platform-module-document-management-client-large-icons-view.component-Cece4n22.mjs.map → acorex-platform-module-document-management-client-large-icons-view.component-CSgo6Q03.mjs.map} +1 -1
  19. package/fesm2022/{acorex-platform-module-document-management-client-large-tiles-view.component-DzWIUZtv.mjs → acorex-platform-module-document-management-client-large-tiles-view.component-CzlMERYd.mjs} +2 -2
  20. package/fesm2022/{acorex-platform-module-document-management-client-large-tiles-view.component-DzWIUZtv.mjs.map → acorex-platform-module-document-management-client-large-tiles-view.component-CzlMERYd.mjs.map} +1 -1
  21. package/fesm2022/{acorex-platform-module-document-management-client-list-view-skeleton.component-Dgx8lVyN.mjs → acorex-platform-module-document-management-client-list-view-skeleton.component-DgFCBi89.mjs} +2 -2
  22. package/fesm2022/{acorex-platform-module-document-management-client-list-view-skeleton.component-Dgx8lVyN.mjs.map → acorex-platform-module-document-management-client-list-view-skeleton.component-DgFCBi89.mjs.map} +1 -1
  23. package/fesm2022/{acorex-platform-module-document-management-client-list-view.component-DVUfHWHB.mjs → acorex-platform-module-document-management-client-list-view.component-bgDPFpLU.mjs} +2 -2
  24. package/fesm2022/{acorex-platform-module-document-management-client-list-view.component-DVUfHWHB.mjs.map → acorex-platform-module-document-management-client-list-view.component-bgDPFpLU.mjs.map} +1 -1
  25. package/fesm2022/{acorex-platform-module-document-management-client-open-document.command-Bimm2bzt.mjs → acorex-platform-module-document-management-client-open-document.command-CObrpooD.mjs} +83 -20
  26. package/fesm2022/acorex-platform-module-document-management-client-open-document.command-CObrpooD.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-module-document-management-client-request-document-review.command-DNq2mYIx.mjs +456 -0
  28. package/fesm2022/acorex-platform-module-document-management-client-request-document-review.command-DNq2mYIx.mjs.map +1 -0
  29. package/fesm2022/acorex-platform-module-document-management-client-sign-document-review.command-B08sgrRi.mjs +121 -0
  30. package/fesm2022/acorex-platform-module-document-management-client-sign-document-review.command-B08sgrRi.mjs.map +1 -0
  31. package/fesm2022/{acorex-platform-module-document-management-client-small-icons-view-skeleton.component-CU2MiVUi.mjs → acorex-platform-module-document-management-client-small-icons-view-skeleton.component-CiYITmkk.mjs} +2 -2
  32. package/fesm2022/{acorex-platform-module-document-management-client-small-icons-view-skeleton.component-CU2MiVUi.mjs.map → acorex-platform-module-document-management-client-small-icons-view-skeleton.component-CiYITmkk.mjs.map} +1 -1
  33. package/fesm2022/{acorex-platform-module-document-management-client-small-icons-view.component-CL5cNRtI.mjs → acorex-platform-module-document-management-client-small-icons-view.component-ILdKPBoz.mjs} +2 -2
  34. package/fesm2022/{acorex-platform-module-document-management-client-small-icons-view.component-CL5cNRtI.mjs.map → acorex-platform-module-document-management-client-small-icons-view.component-ILdKPBoz.mjs.map} +1 -1
  35. package/fesm2022/{acorex-platform-module-document-management-client-small-tiles-view-skeleton.component-DBJldDaS.mjs → acorex-platform-module-document-management-client-small-tiles-view-skeleton.component-DKOxhUoZ.mjs} +2 -2
  36. package/fesm2022/{acorex-platform-module-document-management-client-small-tiles-view-skeleton.component-DBJldDaS.mjs.map → acorex-platform-module-document-management-client-small-tiles-view-skeleton.component-DKOxhUoZ.mjs.map} +1 -1
  37. package/fesm2022/{acorex-platform-module-document-management-client-small-tiles-view.component-DtsBSVCq.mjs → acorex-platform-module-document-management-client-small-tiles-view.component-yv_uqUPM.mjs} +2 -2
  38. package/fesm2022/{acorex-platform-module-document-management-client-small-tiles-view.component-DtsBSVCq.mjs.map → acorex-platform-module-document-management-client-small-tiles-view.component-yv_uqUPM.mjs.map} +1 -1
  39. package/fesm2022/{acorex-platform-module-document-management-client-upload-document.command-D3L6x6CQ.mjs → acorex-platform-module-document-management-client-upload-document.command-CrtRTjke.mjs} +2 -2
  40. package/fesm2022/{acorex-platform-module-document-management-client-upload-document.command-D3L6x6CQ.mjs.map → acorex-platform-module-document-management-client-upload-document.command-CrtRTjke.mjs.map} +1 -1
  41. package/fesm2022/acorex-platform-module-document-management-client.mjs +1 -1
  42. package/i18n/en-AU/document-management.json +63 -2
  43. package/i18n/en-US/document-management.json +63 -2
  44. package/i18n/fa-IR/document-management.json +63 -2
  45. package/package.json +2 -2
  46. package/types/acorex-platform-module-document-management-client-contracts.d.ts +34 -2
  47. package/types/acorex-platform-module-document-management-client.d.ts +10 -1
  48. package/fesm2022/acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-qhcOFKFu.mjs.map +0 -1
  49. package/fesm2022/acorex-platform-module-document-management-client-details-view.component-DkCD8RSd.mjs.map +0 -1
  50. package/fesm2022/acorex-platform-module-document-management-client-open-document.command-Bimm2bzt.mjs.map +0 -1
@@ -1,11 +1,11 @@
1
1
  import { AXPTaskBadgeProvider, resolveFileChooserExtension, AXPFileChooserService, AXPFileViewerService, AXPFileViewerFallbackContentComponent, AXP_FILE_CHOOSER_PROVIDERS, AXP_FILE_UPLOADER_PROVIDERS, isUnrestrictedFileAccept, fileNameMatchesAccept, AXPStateMessageComponent, AXPLayoutSideDetailPanelComponent, AXPLayoutSideDetailPanelSectionDirective, AXP_PAGE_COMPONENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS, provideFileViewer, AXPThemeLayoutBlockComponent, AXPQueryFiltersComponent } from '@acorex-platform/framework-client/layout/components';
2
2
  import { AXPEntityService, resolveEntityPluginDetailPageOrder, ensureListActions, AXPEntityDefinitionRegistryService, AXPMiddlewareAbortError, AXP_ENTITY_CONFIG_TOKEN, AXP_ENTITY_ACTION_PLUGIN, AXP_ENTITY_STORAGE_MIDDLEWARE } from '@acorex-platform/framework-client/layout/entity';
3
- import { AXPEntityBroadcastService, AXPHookService, AXPDataGenerator as AXPDataGenerator$1, AXPDeviceService, AXPExpressionEvaluatorService, AXPDebugService, AXP_FEATURE_DEFINITION_PROVIDER, AXP_HOOK_PROVIDER } from '@acorex-platform/framework-client/core';
3
+ import { AXPEntityBroadcastService, AXPHookService, AXPDialogOpener as AXPDialogOpener$1, AXPDataGenerator as AXPDataGenerator$1, AXPDeviceService, AXPExpressionEvaluatorService, AXPDebugService, AXP_FEATURE_DEFINITION_PROVIDER, AXP_HOOK_PROVIDER } from '@acorex-platform/framework-client/core';
4
4
  import { AXPSearchCommandProvider, createEntitySearchCommand, AXPFileTypeProviderService, AXP_FILE_TYPE_INFO_PROVIDER, AXPFileStorageService, extractRequestErrorInfo, platformErrorI18nKey, resolveExplorerFileDisplayName, tryOpenFileByCatalogType, createFileTypeOpenContext, FILE_VIEWER_PREVIEW_EXTENSIONS, isFileNameShownInViewer, normalizeDocumentToFileListItem, UploadFromComputerActionProvider, AXP_FILE_ACTION_PROVIDER, hasFileTypeOpenHandler, resolveFileTypeDisplay, AXPSettingsService, AXPLockService, AXP_PROTECTED_ROUTE_GUARDS, AXP_STATUS_PROVIDERS, AXP_MENU_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';
5
5
  import { AXPSessionService, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';
6
6
  import * as i0 from '@angular/core';
7
7
  import { Injectable, inject, DestroyRef, signal, ChangeDetectionStrategy, Component, NgModule, viewChild, computed, Injector, PLATFORM_ID, input, effect, ViewEncapsulation, untracked, HostListener } from '@angular/core';
8
- import { AXPDocumentManagementFeatureKeys, AXPContentDocumentsPermissionKeys, RootConfig, AXPDocumentManagementMenuKeys, AXPDocumentManagementSettings, AXMDocumentManagementCommandKeys } from '@acorex-platform/module-document-management-client/contracts';
8
+ import { AXPDocumentManagementFeatureKeys, AXPContentDocumentsPermissionKeys, RootConfig, AXPDocumentManagementMenuKeys, AXPDocumentManagementSettings, documentReviewReadonlyFieldNames, documentTypeHasReviewMetadataForAppliesTo, AXMDocumentManagementCommandKeys } from '@acorex-platform/module-document-management-client/contracts';
9
9
  import { AXPCommonPermissionGroupKeys, AXPCommonMenuKeys, AXP_VERSIONING_ERROR_I18N, AXPVersioningField, AXPVersioningStatus, AXPCommonCommandKeys, isMaintainVersioningPermissionGranted } from '@acorex-platform/module-common-client/contracts';
10
10
  import { firstValueFrom, combineLatest } from 'rxjs';
11
11
  import { AXPCommandEventsService, AXPCommandService, AXPQueryService, provideCommandSetups } from '@acorex-platform/framework-client/runtime';
@@ -39,7 +39,7 @@ import { CommonModule, AsyncPipe } from '@angular/common';
39
39
  import { RouterModule, ActivatedRoute, ROUTES } from '@angular/router';
40
40
  import { AXDialogService } from '@acorex/components/dialog';
41
41
  import { AXPopupService } from '@acorex/components/popup';
42
- import { AXPLayoutBuilderService, resolveLayoutBuilderDialogResult } from '@acorex-platform/framework-client/layout/builder';
42
+ import { AXPLayoutBuilderService, AXPDialogOpener, resolveLayoutBuilderDialogResult } from '@acorex-platform/framework-client/layout/builder';
43
43
  import { unset, castArray, isArray, defaultTo, isEmpty as isEmpty$1, set, get as get$1, isString as isString$1 } from 'lodash';
44
44
  import { toDocumentExpirationDate, AXM_DOCUMENT_EXPIRATION_NEAR_DAYS, getDocumentExpirationRemainingDays, extractDocumentTypeFileKindNames, AXMDocumentManagementQueryKeys } from '@acorex-platform/module-document-management-client/contracts';
45
45
  import { mergeMetaDataLists, filterMetaDataListByAppliesTo, hasMetaDataListFields } from '@acorex-platform/module-data-management-client/contracts';
@@ -119,6 +119,8 @@ class AXMPermissionDefinitionProvider {
119
119
  .endPermission()
120
120
  .addPermission(keys.DistributeDocuments, `${P}.distribute-documents.title`, `${P}.distribute-documents.description`)
121
121
  .endPermission()
122
+ .addPermission(keys.ManageDocumentReview, `${P}.manage-document-review.title`, `${P}.manage-document-review.description`)
123
+ .endPermission()
122
124
  .addPermission(keys.Setup, `${P}.setup.title`, `${P}.setup.description`)
123
125
  .endPermission()
124
126
  .endGroup();
@@ -306,11 +308,12 @@ class AXMSearchCommandProvider extends AXPSearchCommandProvider {
306
308
  //#region ---- Module Constants ----
307
309
  const I18N = '@document-management:settings';
308
310
  const VIEW_MODE_OPTIONS = [
311
+ { value: 'large-icons', text: `${I18N}.items.view-mode.options.large-icons` },
312
+ { value: 'small-icons', text: `${I18N}.items.view-mode.options.small-icons` },
309
313
  { value: 'large-tiles', text: `${I18N}.items.view-mode.options.large-tiles` },
310
314
  { value: 'small-tiles', text: `${I18N}.items.view-mode.options.small-tiles` },
311
315
  { value: 'list', text: `${I18N}.items.view-mode.options.list` },
312
- { value: 'large-icons', text: `${I18N}.items.view-mode.options.large-icons` },
313
- { value: 'small-icons', text: `${I18N}.items.view-mode.options.small-icons` },
316
+ { value: 'details', text: `${I18N}.items.view-mode.options.details` },
314
317
  ];
315
318
  const SORT_FIELD_OPTIONS = [
316
319
  { value: 'name', text: `${I18N}.items.sort-field.options.name` },
@@ -339,7 +342,7 @@ class AXPDocumentManagementSettingProvider {
339
342
  scope: 'U',
340
343
  overridableAt: [],
341
344
  isInherited: false,
342
- defaultValue: 'large-tiles',
345
+ defaultValue: 'large-icons',
343
346
  widget: {
344
347
  type: AXPWidgetsList.Editors.SelectBox,
345
348
  options: {
@@ -1254,8 +1257,13 @@ function resolveDocumentStorageFileId(fileInfo) {
1254
1257
  const storedId = item.source.value.replace(/^file:/, '').trim();
1255
1258
  return storedId || undefined;
1256
1259
  }
1257
- // Chooser items use a client UUID on `id` with `source.kind === 'blob'` — that is not storage.
1258
- if (item.source?.kind === 'blob') {
1260
+ // Blob, URL, and reference items are not file-storage records. Seeded documents use
1261
+ // `source.kind === 'url'` with a mock row `id` — that id must not be sent to storage.
1262
+ if (item.source?.kind === 'blob' ||
1263
+ item.source?.kind === 'url' ||
1264
+ item.source?.kind === 'preview' ||
1265
+ item.source?.kind === 'reference' ||
1266
+ item.source?.kind === 'none') {
1259
1267
  return undefined;
1260
1268
  }
1261
1269
  if (typeof item.id === 'string' && item.id.trim() !== '') {
@@ -1352,17 +1360,21 @@ function folderColorToRgbChannels(color) {
1352
1360
  //#region ----- Imports -----
1353
1361
  //#endregion
1354
1362
  //#region ----- Schema helpers -----
1355
- function toEditableMetaDataList(list) {
1363
+ function toEditableMetaDataList(list, readonlyFieldNames = []) {
1364
+ const readonly = new Set(readonlyFieldNames);
1356
1365
  return {
1357
1366
  groups: (list?.groups ?? []).map((group) => ({
1358
1367
  ...group,
1359
1368
  fields: (group.fields ?? []).map((field) => ({
1360
1369
  ...field,
1361
- mode: 'edit',
1370
+ mode: readonly.has(String(field.name ?? '')) ? 'view' : 'edit',
1362
1371
  })),
1363
1372
  })),
1364
1373
  };
1365
1374
  }
1375
+ function reviewReadonlyFieldNames(canManageReview) {
1376
+ return documentReviewReadonlyFieldNames(canManageReview);
1377
+ }
1366
1378
  function toViewMetaDataList(list) {
1367
1379
  return {
1368
1380
  groups: (list?.groups ?? []).map((group) => ({
@@ -1508,6 +1520,7 @@ class AXMDocumentDialogService {
1508
1520
  constructor() {
1509
1521
  //#region ---- Services & Dependencies ----
1510
1522
  this.layoutBuilder = inject(AXPLayoutBuilderService);
1523
+ this.sessionService = inject(AXPSessionService);
1511
1524
  this.translateService = inject(AXTranslationService);
1512
1525
  this.toastService = inject(AXToastService);
1513
1526
  this.entityService = inject(AXPEntityService);
@@ -1528,7 +1541,8 @@ class AXMDocumentDialogService {
1528
1541
  const { accept } = await buildFileChooserOptionsFromDocumentType(documentType, this.fileService);
1529
1542
  const fileList = Array.isArray(files) ? files : [];
1530
1543
  const enableExpiration = !!documentType?.enableExpiration;
1531
- const editableMetaDataList = toEditableMetaDataList(collectDocumentScopedMetaDataList(documentType?.metaDataList));
1544
+ const reviewReadonly = this.reviewReadonlyNames();
1545
+ const editableMetaDataList = toEditableMetaDataList(collectDocumentScopedMetaDataList(documentType?.metaDataList), reviewReadonly);
1532
1546
  const hasMetaFields = (editableMetaDataList.groups ?? []).some((g) => (g.fields?.length ?? 0) > 0);
1533
1547
  const initialContext = {};
1534
1548
  fileList.forEach((item, index) => {
@@ -1590,7 +1604,7 @@ class AXMDocumentDialogService {
1590
1604
  if (showMeta && hasMetaFields) {
1591
1605
  flex.customWidget('meta-data-form-editor', (widget) => {
1592
1606
  widget.path(`file-${index}.metaDataForm`);
1593
- widget.options(editableMetaDataList);
1607
+ widget.options({ ...editableMetaDataList, readonlyFieldNames: reviewReadonly });
1594
1608
  });
1595
1609
  }
1596
1610
  flex.formField('@document-management:terms.common.file', (field) => {
@@ -1624,11 +1638,12 @@ class AXMDocumentDialogService {
1624
1638
  });
1625
1639
  const sourceFile = fileList[0];
1626
1640
  const synced = fileInfoWithTitle(sourceFile, userFields.title);
1627
- await this.syncStoredFileName(sourceFile, synced.name);
1641
+ if (replaceFile) {
1642
+ await this.syncStoredFileName(sourceFile, synced.name);
1643
+ }
1628
1644
  const identity = {
1629
1645
  title: userFields.title,
1630
1646
  name: synced.name,
1631
- ...(!replaceFile && synced.file ? { fileInfo: synced.file } : {}),
1632
1647
  };
1633
1648
  const content = {
1634
1649
  description: userFields.description,
@@ -1722,7 +1737,8 @@ class AXMDocumentDialogService {
1722
1737
  const enableExpiration = !!documentType?.enableExpiration;
1723
1738
  /** Get metaDataForm from a file item (widget may store under meta or metaDataForm). */
1724
1739
  const getFileMeta = (item) => item?.metaDataForm ?? (item?.meta && typeof item.meta === 'object' && !Array.isArray(item.meta) ? item.meta : undefined);
1725
- const editableMetaDataList = toEditableMetaDataList(collectDocumentScopedMetaDataList(documentType?.metaDataList));
1740
+ const reviewReadonly = this.reviewReadonlyNames();
1741
+ const editableMetaDataList = toEditableMetaDataList(collectDocumentScopedMetaDataList(documentType?.metaDataList), reviewReadonly);
1726
1742
  const hasMetaFields = (editableMetaDataList.groups ?? []).some((g) => (g.fields?.length ?? 0) > 0);
1727
1743
  const initialContext = {};
1728
1744
  fileList.forEach((item, index) => {
@@ -1780,7 +1796,7 @@ class AXMDocumentDialogService {
1780
1796
  if (showMeta && hasMetaFields) {
1781
1797
  flex.customWidget('meta-data-form-editor', (widget) => {
1782
1798
  widget.path(`file-${index}.metaDataForm`);
1783
- widget.options(editableMetaDataList);
1799
+ widget.options({ ...editableMetaDataList, readonlyFieldNames: reviewReadonly });
1784
1800
  });
1785
1801
  }
1786
1802
  flex.formField('@document-management:terms.common.file', (field) => {
@@ -1869,7 +1885,10 @@ class AXMDocumentDialogService {
1869
1885
  //#region ---- Private helpers ----
1870
1886
  async syncStoredFileName(file, nextName) {
1871
1887
  const storageId = resolveDocumentStorageFileId(file);
1872
- if (!storageId || !nextName) {
1888
+ const currentName = file && typeof file === 'object' && typeof file.name === 'string'
1889
+ ? file.name.trim()
1890
+ : '';
1891
+ if (!storageId || !nextName || nextName === currentName) {
1873
1892
  return;
1874
1893
  }
1875
1894
  try {
@@ -1893,6 +1912,9 @@ class AXMDocumentDialogService {
1893
1912
  : undefined;
1894
1913
  return { title, description, metaDataForm: meta, expirationDate };
1895
1914
  }
1915
+ reviewReadonlyNames() {
1916
+ return reviewReadonlyFieldNames(this.sessionService.authorize(AXPContentDocumentsPermissionKeys.ManageDocumentReview));
1917
+ }
1896
1918
  async notifyAttachFailed(error) {
1897
1919
  const info = extractRequestErrorInfo(error);
1898
1920
  const contentKey = (info?.code ? AXP_VERSIONING_ERROR_I18N[info.code] : undefined) ??
@@ -1910,6 +1932,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1910
1932
  args: [{ providedIn: 'root' }]
1911
1933
  }] });
1912
1934
 
1935
+ function cloneDocumentFileInfo(fileInfo) {
1936
+ if (!fileInfo || typeof fileInfo !== 'object') {
1937
+ return fileInfo;
1938
+ }
1939
+ return { ...fileInfo };
1940
+ }
1913
1941
  class DocumentAttachmentsService {
1914
1942
  constructor() {
1915
1943
  this.fileChooserService = inject(AXPFileChooserService);
@@ -1952,7 +1980,7 @@ class DocumentAttachmentsService {
1952
1980
  const documentTypeEntity = await this.resolveFileType(file.documentType);
1953
1981
  const popupData = {
1954
1982
  documentType: documentTypeEntity,
1955
- files: [file.fileInfo],
1983
+ files: [cloneDocumentFileInfo(file.fileInfo)],
1956
1984
  parentId: options?.folderId ?? '',
1957
1985
  metaData: file.metaDataForm,
1958
1986
  documentId: fileId,
@@ -2094,6 +2122,7 @@ class AXMFolderMetadataDialogService {
2094
2122
  constructor() {
2095
2123
  //#region ----- Services & Dependencies -----
2096
2124
  this.entityService = inject(AXPEntityService);
2125
+ this.sessionService = inject(AXPSessionService);
2097
2126
  this.documentTypeData = this.entityService
2098
2127
  .withEntity(RootConfig.module.name, RootConfig.entities.documentType.name)
2099
2128
  .data();
@@ -2138,6 +2167,9 @@ class AXMFolderMetadataDialogService {
2138
2167
  appliesTo: 'folder',
2139
2168
  hideEmpty: true,
2140
2169
  sourceCatalog: catalog,
2170
+ readonlyFieldNames: [
2171
+ ...reviewReadonlyFieldNames(this.sessionService.authorize(AXPContentDocumentsPermissionKeys.ManageDocumentReview)),
2172
+ ],
2141
2173
  });
2142
2174
  });
2143
2175
  }
@@ -2179,6 +2211,7 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2179
2211
  this.documentTypeService = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.documentType.name).data();
2180
2212
  this.documentManagementService = inject(AXPDocumentManagementService);
2181
2213
  this.popupService = inject(AXPopupService);
2214
+ this.dialogOpener = inject(AXPDialogOpener);
2182
2215
  this.dialogService = inject(AXDialogService);
2183
2216
  this.fileService = inject(AXPFileStorageService);
2184
2217
  this.fileManagerService = inject(AXFileService);
@@ -2990,20 +3023,32 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
2990
3023
  * Opens the drive picker popup with consistent layout (large dialog, optional embedded header).
2991
3024
  */
2992
3025
  async openDriveFolderPicker(options) {
2993
- const comp = (await import('./acorex-platform-module-document-management-client-drive-choose.component-up9sAsei.mjs')).AXMDocumentDriveChooseComponent;
2994
- const popup = await this.popupService.open(comp, {
2995
- title: await this.translate.translateAsync(options.titleKey),
2996
- size: 'lg',
3026
+ let title = '';
3027
+ const popup = await this.dialogOpener.openPopup({
3028
+ load: () => import('./acorex-platform-module-document-management-client-drive-choose.component-B-CVJk4t.mjs').then((module) => module.AXMDocumentDriveChooseComponent),
2997
3029
  data: {
3030
+ titleKey: options.titleKey,
2998
3031
  scope: options.scope,
2999
3032
  selectionMode: options.selectionMode ?? 'single',
3000
3033
  browseMode: options.browseMode ?? 'folder',
3001
- hideHeader: options.hideHeader ?? true,
3002
3034
  },
3035
+ prepare: async () => {
3036
+ title = await this.translate.translateAsync(options.titleKey);
3037
+ },
3038
+ show: (component) => this.popupService.open(component, {
3039
+ title,
3040
+ size: 'lg',
3041
+ data: {
3042
+ scope: options.scope,
3043
+ selectionMode: options.selectionMode ?? 'single',
3044
+ browseMode: options.browseMode ?? 'folder',
3045
+ hideHeader: options.hideHeader ?? true,
3046
+ },
3047
+ }),
3003
3048
  });
3004
3049
  return {
3005
- result: Boolean(popup.data?.result),
3006
- items: popup.data?.result ? (popup.data?.items ?? []) : [],
3050
+ result: Boolean(popup?.data?.result),
3051
+ items: popup?.data?.result ? (popup.data?.items ?? []) : [],
3007
3052
  };
3008
3053
  }
3009
3054
  /**
@@ -3263,14 +3308,21 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
3263
3308
  * Shows share dialog for a node
3264
3309
  */
3265
3310
  async showShareDialog(node) {
3266
- const comp = (await import('./acorex-platform-module-document-management-client-share-dialog.component-CFI4hK3T.mjs')).AXMShareDialogComponent;
3267
- const popup = await this.popupService.open(comp, {
3268
- title: await this.translate.translateAsync('@document-management:dialogs.share-dialog.title'),
3269
- data: {
3270
- node,
3311
+ let title = '';
3312
+ const popup = await this.dialogOpener.openPopup({
3313
+ load: () => import('./acorex-platform-module-document-management-client-share-dialog.component-CFI4hK3T.mjs').then((module) => module.AXMShareDialogComponent),
3314
+ data: { nodeId: node.id, dialog: 'share' },
3315
+ prepare: async () => {
3316
+ title = await this.translate.translateAsync('@document-management:dialogs.share-dialog.title');
3271
3317
  },
3318
+ show: (component) => this.popupService.open(component, {
3319
+ title,
3320
+ data: {
3321
+ node,
3322
+ },
3323
+ }),
3272
3324
  });
3273
- if (popup.data?.result) {
3325
+ if (popup?.data?.result) {
3274
3326
  // Handle the share action with popup.data.data
3275
3327
  }
3276
3328
  }
@@ -3278,14 +3330,21 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
3278
3330
  * Shows share via email dialog for a node
3279
3331
  */
3280
3332
  async showShareWithEmailDialog(node) {
3281
- const comp = (await import('./acorex-platform-module-document-management-client-share-email-dialog.component-CUvlAcp6.mjs')).AXMShareEmailDialogComponent;
3282
- const popup = await this.popupService.open(comp, {
3283
- title: await this.translate.translateAsync('@document-management:dialogs.share-email-dialog.title'),
3284
- data: {
3285
- node,
3333
+ let title = '';
3334
+ const popup = await this.dialogOpener.openPopup({
3335
+ load: () => import('./acorex-platform-module-document-management-client-share-email-dialog.component-CUvlAcp6.mjs').then((module) => module.AXMShareEmailDialogComponent),
3336
+ data: { nodeId: node.id, dialog: 'share-email' },
3337
+ prepare: async () => {
3338
+ title = await this.translate.translateAsync('@document-management:dialogs.share-email-dialog.title');
3286
3339
  },
3340
+ show: (component) => this.popupService.open(component, {
3341
+ title,
3342
+ data: {
3343
+ node,
3344
+ },
3345
+ }),
3287
3346
  });
3288
- if (popup.data?.result) {
3347
+ if (popup?.data?.result) {
3289
3348
  // Handle the share via email action with popup.data.data
3290
3349
  }
3291
3350
  }
@@ -3293,14 +3352,21 @@ class AXMDocumentManagerServiceImpl extends AXMDocumentManagerService {
3293
3352
  * Shows link dialog for a node
3294
3353
  */
3295
3354
  async showLinkDialog(node) {
3296
- const comp = (await import('./acorex-platform-module-document-management-client-link-dialog.component-EYoimqRD.mjs')).AXMLinkDialogComponent;
3297
- const popup = await this.popupService.open(comp, {
3298
- title: await this.translate.translateAsync('@document-management:dialogs.share-link-dialog.title'),
3299
- data: {
3300
- node,
3355
+ let title = '';
3356
+ const popup = await this.dialogOpener.openPopup({
3357
+ load: () => import('./acorex-platform-module-document-management-client-link-dialog.component-EYoimqRD.mjs').then((module) => module.AXMLinkDialogComponent),
3358
+ data: { nodeId: node.id, dialog: 'link' },
3359
+ prepare: async () => {
3360
+ title = await this.translate.translateAsync('@document-management:dialogs.share-link-dialog.title');
3301
3361
  },
3362
+ show: (component) => this.popupService.open(component, {
3363
+ title,
3364
+ data: {
3365
+ node,
3366
+ },
3367
+ }),
3302
3368
  });
3303
- if (popup.data?.result) {
3369
+ if (popup?.data?.result) {
3304
3370
  // Handle the link generation with popup.data.data
3305
3371
  }
3306
3372
  }
@@ -4086,6 +4152,12 @@ class AXMDocumentManagementApiService extends AXPDocumentManagementService {
4086
4152
  options,
4087
4153
  });
4088
4154
  }
4155
+ listFolderReviewDocuments(folderId, taskId) {
4156
+ return this.fetchArray(AXMDocumentManagementQueryKeys.DocumentReview.ListFolderDocuments, {
4157
+ folderId,
4158
+ taskId,
4159
+ });
4160
+ }
4089
4161
  findManyDocuments(ids) {
4090
4162
  return this.fetchArray(AXMDocumentManagementQueryKeys.Document.FindMany, { ids });
4091
4163
  }
@@ -4177,27 +4249,36 @@ const AXM_DRIVE_FILE_CHOOSER_PROVIDER = {
4177
4249
  order: 2,
4178
4250
  choose: async (context) => {
4179
4251
  const popupService = inject(AXPopupService);
4252
+ const dialogOpener = inject(AXPDialogOpener$1);
4180
4253
  const translate = inject(AXTranslationService);
4181
4254
  const scope = defaultTo(context.options['scope'], AXPPlatformScope.Tenant);
4182
4255
  const multiple = Boolean(context.options['multiple']);
4183
4256
  const browseMode = defaultTo(context.options['browseMode'], 'file');
4184
4257
  const accept = context.options['accept'];
4185
- const component = (await import('./acorex-platform-module-document-management-client-drive-choose.component-up9sAsei.mjs')).AXMDocumentDriveChooseComponent;
4186
- const popup = await popupService.open(component, {
4187
- title: await translate.translateAsync('@document-management:actions.choose-from-drive'),
4188
- size: 'lg',
4189
- data: {
4190
- scope,
4191
- selectionMode: multiple ? 'multiple' : 'single',
4192
- browseMode,
4193
- hideHeader: true,
4194
- accept,
4258
+ let title = '';
4259
+ const popup = await dialogOpener.openPopup({
4260
+ load: () => import('./acorex-platform-module-document-management-client-drive-choose.component-B-CVJk4t.mjs').then((module) => module.AXMDocumentDriveChooseComponent),
4261
+ data: { scope, multiple, browseMode, accept: accept ?? '' },
4262
+ prepare: async () => {
4263
+ title = await translate.translateAsync('@document-management:actions.choose-from-drive');
4195
4264
  },
4265
+ show: (component) => popupService.open(component, {
4266
+ title,
4267
+ size: 'lg',
4268
+ data: {
4269
+ scope,
4270
+ selectionMode: multiple ? 'multiple' : 'single',
4271
+ browseMode,
4272
+ hideHeader: true,
4273
+ accept,
4274
+ },
4275
+ }),
4196
4276
  });
4197
- if (!popup.data?.result) {
4277
+ const picked = popup?.data;
4278
+ if (!picked?.result) {
4198
4279
  return undefined;
4199
4280
  }
4200
- const selected = castArray(popup.data.items ?? []);
4281
+ const selected = castArray(picked.items ?? []);
4201
4282
  if (isEmpty$1(selected)) {
4202
4283
  return undefined;
4203
4284
  }
@@ -4687,7 +4768,11 @@ const DocumentFileUploaderEditDialogAfterFormProvider = {
4687
4768
  : undefined;
4688
4769
  if (!docType && (!metaObj || Object.keys(metaObj).length === 0))
4689
4770
  return payload;
4690
- const metaDataList = toEditableMetaDataList(collectDocumentScopedMetaDataList(docType?.metaDataList));
4771
+ const sessionService = injector.get(AXPSessionService);
4772
+ const reviewReadonly = [
4773
+ ...reviewReadonlyFieldNames(sessionService.authorize(AXPContentDocumentsPermissionKeys.ManageDocumentReview)),
4774
+ ];
4775
+ const metaDataList = toEditableMetaDataList(collectDocumentScopedMetaDataList(docType?.metaDataList), reviewReadonly);
4691
4776
  const hasDefinitions = Array.isArray(metaDataList.groups) && metaDataList.groups.length > 0;
4692
4777
  const fields = [
4693
4778
  {
@@ -4696,7 +4781,7 @@ const DocumentFileUploaderEditDialogAfterFormProvider = {
4696
4781
  widget: {
4697
4782
  name: 'metaDataForm',
4698
4783
  type: 'meta-data-form-editor',
4699
- options: metaDataList,
4784
+ options: { ...metaDataList, readonlyFieldNames: reviewReadonly },
4700
4785
  defaultValue: metaObj,
4701
4786
  },
4702
4787
  },
@@ -4817,6 +4902,105 @@ const documentPlugin = {
4817
4902
  },
4818
4903
  };
4819
4904
 
4905
+ //#endregion
4906
+ //#region ----- Explorer review eligibility -----
4907
+ function asRecord(value) {
4908
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
4909
+ return null;
4910
+ }
4911
+ return value;
4912
+ }
4913
+ function rememberId(target, value) {
4914
+ const id = typeof value === 'string' ? value.trim() : '';
4915
+ if (id && !target.includes(id)) {
4916
+ target.push(id);
4917
+ }
4918
+ }
4919
+ function rememberType(ids, names, type) {
4920
+ const row = asRecord(type);
4921
+ if (!row) {
4922
+ return;
4923
+ }
4924
+ rememberId(ids, row['id']);
4925
+ const name = typeof row['name'] === 'string' ? row['name'].trim() : '';
4926
+ if (name && !names.includes(name)) {
4927
+ names.push(name);
4928
+ }
4929
+ }
4930
+ function collectDocumentTypeKeys(...sources) {
4931
+ const ids = [];
4932
+ const names = [];
4933
+ for (const source of sources) {
4934
+ const row = asRecord(source);
4935
+ if (!row) {
4936
+ continue;
4937
+ }
4938
+ rememberType(ids, names, row['documentType']);
4939
+ const types = row['documentTypes'];
4940
+ if (Array.isArray(types)) {
4941
+ for (const type of types) {
4942
+ rememberType(ids, names, type);
4943
+ }
4944
+ }
4945
+ }
4946
+ return { ids, names };
4947
+ }
4948
+ function isReviewEnabledDocumentType(type, appliesTo) {
4949
+ if (!type) {
4950
+ return false;
4951
+ }
4952
+ return documentTypeHasReviewMetadataForAppliesTo(type.metaDataList, appliesTo);
4953
+ }
4954
+ function sourceHasReviewEnabledType(source, appliesTo) {
4955
+ const row = asRecord(source);
4956
+ if (!row) {
4957
+ return false;
4958
+ }
4959
+ if (isReviewEnabledDocumentType(row, appliesTo)) {
4960
+ return true;
4961
+ }
4962
+ if (isReviewEnabledDocumentType(asRecord(row['documentType']), appliesTo)) {
4963
+ return true;
4964
+ }
4965
+ const types = row['documentTypes'];
4966
+ return (Array.isArray(types) &&
4967
+ types.some((type) => isReviewEnabledDocumentType(asRecord(type), appliesTo)));
4968
+ }
4969
+ async function sourcesAllowDocumentReview(sources, load, appliesTo) {
4970
+ if (sources.some((source) => sourceHasReviewEnabledType(source, appliesTo))) {
4971
+ return true;
4972
+ }
4973
+ const keys = collectDocumentTypeKeys(...sources);
4974
+ if (load.byKey) {
4975
+ for (const id of keys.ids) {
4976
+ try {
4977
+ const type = await load.byKey(id);
4978
+ if (isReviewEnabledDocumentType(type, appliesTo)) {
4979
+ return true;
4980
+ }
4981
+ }
4982
+ catch {
4983
+ // Keep checking remaining types when one lookup misses.
4984
+ }
4985
+ }
4986
+ }
4987
+ if (keys.names.length) {
4988
+ const types = await load.byNames(keys.names);
4989
+ if (types.some((type) => isReviewEnabledDocumentType(type, appliesTo))) {
4990
+ return true;
4991
+ }
4992
+ }
4993
+ return false;
4994
+ }
4995
+ async function explorerNodeAllowsDocumentReview(node, load) {
4996
+ if (!node || node.storageType === 'shortcut' || node.isShortcut) {
4997
+ return false;
4998
+ }
4999
+ const appliesTo = node.type === 'folder' ? 'folder' : 'document';
5000
+ return sourcesAllowDocumentReview([node], load, appliesTo);
5001
+ }
5002
+ //#endregion
5003
+
4820
5004
  //#region ----- Types -----
4821
5005
  //#endregion
4822
5006
  //#region ----- Public API -----
@@ -4913,26 +5097,57 @@ function collectDocumentTypeNames(nodes) {
4913
5097
  }
4914
5098
  //#endregion
4915
5099
  //#region ----- Columns -----
4916
- function parseInterfaceType(interfaceValue) {
5100
+ function asInterfaceObject(interfaceValue) {
4917
5101
  if (interfaceValue == null) {
4918
- return '';
5102
+ return null;
4919
5103
  }
4920
5104
  if (typeof interfaceValue === 'string') {
4921
5105
  try {
4922
5106
  const parsed = JSON.parse(interfaceValue);
4923
- return String(parsed?.type ?? parsed?.name ?? '');
5107
+ return parsed && typeof parsed === 'object' ? parsed : null;
4924
5108
  }
4925
5109
  catch {
4926
- return interfaceValue;
5110
+ return { type: interfaceValue };
4927
5111
  }
4928
5112
  }
4929
5113
  if (typeof interfaceValue === 'object') {
4930
- const row = interfaceValue;
4931
- return String(row.type ?? row.name ?? '');
5114
+ return interfaceValue;
5115
+ }
5116
+ return null;
5117
+ }
5118
+ function parseInterfaceType(interfaceValue) {
5119
+ const iface = asInterfaceObject(interfaceValue);
5120
+ if (!iface) {
5121
+ return '';
5122
+ }
5123
+ return String(iface.type ?? iface.name ?? '');
5124
+ }
5125
+ function lookupFromInterface(interfaceValue) {
5126
+ const iface = asInterfaceObject(interfaceValue);
5127
+ if (!iface) {
5128
+ return undefined;
5129
+ }
5130
+ const type = String(iface.type ?? iface.name ?? '').toLowerCase();
5131
+ if (!type.includes('lookup')) {
5132
+ return undefined;
5133
+ }
5134
+ const options = iface.options ?? {};
5135
+ const entity = typeof options['entity'] === 'string' ? options['entity'].trim() : '';
5136
+ if (!entity) {
5137
+ return undefined;
4932
5138
  }
4933
- return '';
5139
+ const valueField = typeof options['valueField'] === 'string' && options['valueField'].trim()
5140
+ ? options['valueField'].trim()
5141
+ : 'id';
5142
+ const textField = typeof options['textField'] === 'string' && options['textField'].trim()
5143
+ ? options['textField'].trim()
5144
+ : 'displayName';
5145
+ return { entity, valueField, textField };
4934
5146
  }
4935
5147
  function formatFromInterface(interfaceValue) {
5148
+ if (lookupFromInterface(interfaceValue)) {
5149
+ return 'lookup';
5150
+ }
4936
5151
  const type = parseInterfaceType(interfaceValue).toLowerCase();
4937
5152
  if (type.includes('date-time') || type.includes('datetime')) {
4938
5153
  return 'datetime';
@@ -4960,6 +5175,7 @@ function flattenMetaDataColumns(list, resolveTitle) {
4960
5175
  title: resolveTitle(field.title) || name,
4961
5176
  kind: 'metadata',
4962
5177
  format: formatFromInterface(field.interface),
5178
+ lookup: lookupFromInterface(field.interface),
4963
5179
  });
4964
5180
  }
4965
5181
  }
@@ -4968,6 +5184,23 @@ function flattenMetaDataColumns(list, resolveTitle) {
4968
5184
  function readNodeMetaDataValue(node, fieldName) {
4969
5185
  return readMetaDataFormValue(node.metaDataForm, fieldName);
4970
5186
  }
5187
+ function collectLookupKeys(value, valueField = 'id') {
5188
+ if (value == null || value === '') {
5189
+ return [];
5190
+ }
5191
+ if (Array.isArray(value)) {
5192
+ return value.flatMap((item) => collectLookupKeys(item, valueField));
5193
+ }
5194
+ if (typeof value === 'object') {
5195
+ const row = value;
5196
+ const id = row[valueField] ?? row['id'];
5197
+ return typeof id === 'string' && id.trim() ? [id.trim()] : [];
5198
+ }
5199
+ if (typeof value === 'string' && value.trim()) {
5200
+ return [value.trim()];
5201
+ }
5202
+ return [];
5203
+ }
4971
5204
  function readMetaDataFormValue(form, fieldName) {
4972
5205
  if (form == null || typeof form !== 'object' || Array.isArray(form)) {
4973
5206
  return undefined;
@@ -5028,8 +5261,8 @@ function canCreateFolderUnder(folder, scopeRootId, parentFolder) {
5028
5261
  const DOCUMENT_EXPLORER_LAYOUT_SETTINGS_SCOPE = AXPPlatformScope.User;
5029
5262
  const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withState(() => ({
5030
5263
  // View State
5031
- viewMode: 'large-tiles',
5032
- preferredViewMode: 'large-tiles',
5264
+ viewMode: 'large-icons',
5265
+ preferredViewMode: 'large-icons',
5033
5266
  viewModeLocked: false,
5034
5267
  homogeneousGrid: null,
5035
5268
  isLoading: false,
@@ -5126,7 +5359,10 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
5126
5359
  selectedNode: computed(() => store.selectedNodes()[0] ?? null),
5127
5360
  isDetailPanelOpen: computed(() => store.detailPanel()),
5128
5361
  // groupByType: computed(() => store.groupByType()),
5129
- })), withMethods((store, fileTypeService = inject(AXPFileTypeProviderService), fileService = inject(AXFileService), driveService = inject(AXMDocumentManagerService), commandService = inject(AXPCommandService), settingsService = inject(AXPSettingsService), translateService = inject(AXTranslationService), lockService = inject(AXPLockService), sessionService = inject(AXPSessionService)) => {
5362
+ })), withMethods((store, fileTypeService = inject(AXPFileTypeProviderService), fileService = inject(AXFileService), driveService = inject(AXMDocumentManagerService), commandService = inject(AXPCommandService), entityService = inject(AXPEntityService), settingsService = inject(AXPSettingsService), translateService = inject(AXTranslationService), lockService = inject(AXPLockService), sessionService = inject(AXPSessionService)) => {
5363
+ const documentTypeData = entityService
5364
+ .withEntity(RootConfig.module.name, RootConfig.entities.documentType.name)
5365
+ .data();
5130
5366
  /** In-flight folder load; duplicate requests for the same folder reuse the same promise. */
5131
5367
  let inflightLoad = null;
5132
5368
  const applyExplorerNode = (node) => {
@@ -5164,18 +5400,8 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
5164
5400
  };
5165
5401
  const resolveHomogeneousGridViewState = (folders, files) => {
5166
5402
  const homogeneousGrid = resolveHomogeneousExplorerGrid(folders, files);
5167
- if (store.viewModeLocked()) {
5168
- return { homogeneousGrid, viewMode: store.viewMode() };
5169
- }
5170
- if (homogeneousGrid) {
5171
- return { homogeneousGrid, viewMode: 'details' };
5172
- }
5173
- const preferred = store.preferredViewMode();
5174
- const fallback = preferred !== 'details' ? preferred : 'large-tiles';
5175
- return {
5176
- homogeneousGrid: null,
5177
- viewMode: store.viewMode() === 'details' ? fallback : store.viewMode(),
5178
- };
5403
+ const viewMode = store.viewModeLocked() ? store.viewMode() : store.preferredViewMode();
5404
+ return { homogeneousGrid, viewMode };
5179
5405
  };
5180
5406
  return {
5181
5407
  setAllowedDocumentTypeNames(names) {
@@ -5216,7 +5442,7 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
5216
5442
  const sortDirection = await layoutSettings.get(AXPDocumentManagementSettings.SortDirection);
5217
5443
  const groupByType = await layoutSettings.get(AXPDocumentManagementSettings.GroupByType);
5218
5444
  const detailPanel = await layoutSettings.get(AXPDocumentManagementSettings.DetailPanelOpen);
5219
- const savedViewMode = viewMode === 'details' || !viewMode ? 'large-tiles' : viewMode;
5445
+ const savedViewMode = viewMode || 'large-icons';
5220
5446
  patchState(store, {
5221
5447
  viewMode: savedViewMode,
5222
5448
  preferredViewMode: savedViewMode,
@@ -5309,15 +5535,17 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
5309
5535
  },
5310
5536
  setViewMode(mode) {
5311
5537
  const nextMode = mode;
5538
+ const locked = store.viewModeLocked();
5312
5539
  patchState(store, {
5313
5540
  viewMode: nextMode,
5314
- ...(nextMode !== 'details' ? { preferredViewMode: nextMode } : {}),
5541
+ ...(!locked ? { preferredViewMode: nextMode } : {}),
5315
5542
  });
5316
- if (nextMode !== 'details') {
5317
- void settingsService
5318
- .scope(DOCUMENT_EXPLORER_LAYOUT_SETTINGS_SCOPE)
5319
- .set(AXPDocumentManagementSettings.ViewMode, nextMode);
5543
+ if (locked) {
5544
+ return;
5320
5545
  }
5546
+ void settingsService
5547
+ .scope(DOCUMENT_EXPLORER_LAYOUT_SETTINGS_SCOPE)
5548
+ .set(AXPDocumentManagementSettings.ViewMode, nextMode);
5321
5549
  },
5322
5550
  isViewMode(mode) {
5323
5551
  return store.viewMode() === mode;
@@ -5851,16 +6079,12 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
5851
6079
  text: await trans('view-modes.list'),
5852
6080
  icon: 'fa-light fa-list',
5853
6081
  }, store.viewMode() === 'list'),
5854
- ...(store.homogeneousGrid()
5855
- ? [
5856
- withMenuItemCheck({
5857
- name: 'view.details',
5858
- text: await trans('view-modes.details'),
5859
- icon: 'fa-light fa-table',
5860
- break: true,
5861
- }, store.viewMode() === 'details'),
5862
- ]
5863
- : []),
6082
+ withMenuItemCheck({
6083
+ name: 'view.details',
6084
+ text: await trans('view-modes.details'),
6085
+ icon: 'fa-light fa-table',
6086
+ break: true,
6087
+ }, store.viewMode() === 'details'),
5864
6088
  ];
5865
6089
  const groupByItems = [
5866
6090
  withMenuItemCheck({
@@ -6051,6 +6275,11 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
6051
6275
  node.storageType !== 'shortcut' &&
6052
6276
  !node.isShortcut &&
6053
6277
  sessionService.authorize(AXPContentDocumentsPermissionKeys.DistributeDocuments);
6278
+ const canRequestReview = sessionService.authorize(AXPContentDocumentsPermissionKeys.ManageDocumentReview) &&
6279
+ (await explorerNodeAllowsDocumentReview(node, {
6280
+ byNames: (names) => driveService.getDocumentTypesByNames(names),
6281
+ byKey: (id) => documentTypeData.byKey(id),
6282
+ }));
6054
6283
  const actionItems = [];
6055
6284
  if (canDistribute) {
6056
6285
  actionItems.push({
@@ -6060,6 +6289,14 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
6060
6289
  data: node,
6061
6290
  });
6062
6291
  }
6292
+ if (canRequestReview) {
6293
+ actionItems.push({
6294
+ name: 'request-review',
6295
+ text: await trans('menus.context.request-review'),
6296
+ icon: 'fa-light fa-file-check',
6297
+ data: node,
6298
+ });
6299
+ }
6063
6300
  const menuItems = [
6064
6301
  ...(canOpen
6065
6302
  ? [
@@ -6217,6 +6454,26 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
6217
6454
  data: node,
6218
6455
  },
6219
6456
  ];
6457
+ const canRequestReview = sessionService.authorize(AXPContentDocumentsPermissionKeys.ManageDocumentReview) &&
6458
+ (await explorerNodeAllowsDocumentReview(node, {
6459
+ byNames: (names) => driveService.getDocumentTypesByNames(names),
6460
+ byKey: (id) => documentTypeData.byKey(id),
6461
+ }));
6462
+ if (canRequestReview) {
6463
+ items.push({
6464
+ name: 'actions',
6465
+ text: await trans('menus.context.actions'),
6466
+ icon: 'fa-light fa-bolt',
6467
+ items: [
6468
+ {
6469
+ name: 'request-review',
6470
+ text: await trans('menus.context.request-review'),
6471
+ icon: 'fa-light fa-file-check',
6472
+ data: node,
6473
+ },
6474
+ ],
6475
+ });
6476
+ }
6220
6477
  // Add upload menu only if not locked
6221
6478
  if (!isNodeLocked && node?.documentTypes?.length && !node.childFolderDocumentTypes?.length) {
6222
6479
  items.push({
@@ -6453,6 +6710,13 @@ const AXPDocumentExplorerViewModel = signalStore({ providedIn: 'root' }, withSta
6453
6710
  documentId: node.id,
6454
6711
  });
6455
6712
  break;
6713
+ case 'request-review':
6714
+ await commandService.execute(AXMDocumentManagementCommandKeys.DocumentReviewRequest, {
6715
+ data: node,
6716
+ documentId: node.type === 'file' ? node.id : undefined,
6717
+ folderId: node.type === 'folder' ? node.id : undefined,
6718
+ });
6719
+ break;
6456
6720
  case 'show-version-history':
6457
6721
  await driveService.showVersionHistory(node);
6458
6722
  break;
@@ -6706,26 +6970,26 @@ class AXMDocumentExplorerComponent {
6706
6970
  /** Drops stale async open results when the user right-clicks again before items resolve. */
6707
6971
  this.contextMenuOpenToken = 0;
6708
6972
  this.viewMap = {
6709
- list: async () => (await import('./acorex-platform-module-document-management-client-list-view.component-DVUfHWHB.mjs')).AXMDocumentExplorerListViewComponent,
6710
- 'small-tiles': async () => (await import('./acorex-platform-module-document-management-client-small-tiles-view.component-DtsBSVCq.mjs')).AXMDocumentExplorerSmallTilesViewComponent,
6711
- 'large-tiles': async () => (await import('./acorex-platform-module-document-management-client-large-tiles-view.component-DzWIUZtv.mjs')).AXMDocumentExplorerLargeTilesViewComponent,
6712
- details: async () => (await import('./acorex-platform-module-document-management-client-details-view.component-DkCD8RSd.mjs')).AXMDocumentExplorerDetailsViewComponent,
6713
- 'large-icons': async () => (await import('./acorex-platform-module-document-management-client-large-icons-view.component-Cece4n22.mjs')).AXMDocumentExplorerLargeIconsViewComponent,
6714
- 'small-icons': async () => (await import('./acorex-platform-module-document-management-client-small-icons-view.component-CL5cNRtI.mjs')).AXMDocumentExplorerSmallIconsViewComponent,
6715
- 'attachment': async () => (await import('./acorex-platform-module-document-management-client-attachment-widget.component-CsrcMMC9.mjs')).AXMDocumentExplorerAttachmentComponent,
6973
+ list: async () => (await import('./acorex-platform-module-document-management-client-list-view.component-bgDPFpLU.mjs')).AXMDocumentExplorerListViewComponent,
6974
+ 'small-tiles': async () => (await import('./acorex-platform-module-document-management-client-small-tiles-view.component-yv_uqUPM.mjs')).AXMDocumentExplorerSmallTilesViewComponent,
6975
+ 'large-tiles': async () => (await import('./acorex-platform-module-document-management-client-large-tiles-view.component-CzlMERYd.mjs')).AXMDocumentExplorerLargeTilesViewComponent,
6976
+ details: async () => (await import('./acorex-platform-module-document-management-client-details-view.component-DVrr-Jcx.mjs')).AXMDocumentExplorerDetailsViewComponent,
6977
+ 'large-icons': async () => (await import('./acorex-platform-module-document-management-client-large-icons-view.component-CSgo6Q03.mjs')).AXMDocumentExplorerLargeIconsViewComponent,
6978
+ 'small-icons': async () => (await import('./acorex-platform-module-document-management-client-small-icons-view.component-ILdKPBoz.mjs')).AXMDocumentExplorerSmallIconsViewComponent,
6979
+ 'attachment': async () => (await import('./acorex-platform-module-document-management-client-attachment-widget.component-YAoJdiMV.mjs')).AXMDocumentExplorerAttachmentComponent,
6716
6980
  };
6717
6981
  this.skeletonViewMap = {
6718
- list: async () => (await import('./acorex-platform-module-document-management-client-list-view-skeleton.component-Dgx8lVyN.mjs')).AXMDocumentExplorerListViewSkeletonComponent,
6719
- 'small-tiles': async () => (await import('./acorex-platform-module-document-management-client-small-tiles-view-skeleton.component-DBJldDaS.mjs'))
6982
+ list: async () => (await import('./acorex-platform-module-document-management-client-list-view-skeleton.component-DgFCBi89.mjs')).AXMDocumentExplorerListViewSkeletonComponent,
6983
+ 'small-tiles': async () => (await import('./acorex-platform-module-document-management-client-small-tiles-view-skeleton.component-DKOxhUoZ.mjs'))
6720
6984
  .AXMDocumentExplorerSmallTilesViewSkeletonComponent,
6721
6985
  'large-tiles': async () => (await Promise.resolve().then(function () { return largeTilesViewSkeleton_component; }))
6722
6986
  .AXMDocumentExplorerLargeTilesViewSkeletonComponent,
6723
6987
  details: async () => (await import('./acorex-platform-module-document-management-client-details-view-skeleton.component-BnRZrzCX.mjs')).AXMDocumentExplorerDetailsViewSkeletonComponent,
6724
- 'large-icons': async () => (await import('./acorex-platform-module-document-management-client-large-icons-view-skeleton.component-C_VbFRKl.mjs'))
6988
+ 'large-icons': async () => (await import('./acorex-platform-module-document-management-client-large-icons-view-skeleton.component-DLW69Mgy.mjs'))
6725
6989
  .AXMDocumentExplorerLargeIconsViewSkeletonComponent,
6726
- 'small-icons': async () => (await import('./acorex-platform-module-document-management-client-small-icons-view-skeleton.component-CU2MiVUi.mjs'))
6990
+ 'small-icons': async () => (await import('./acorex-platform-module-document-management-client-small-icons-view-skeleton.component-CiYITmkk.mjs'))
6727
6991
  .AXMDocumentExplorerSmallIconsViewSkeletonComponent,
6728
- attachment: async () => (await import('./acorex-platform-module-document-management-client-attachment-view-skeleton.component-BeQSbax5.mjs'))
6992
+ attachment: async () => (await import('./acorex-platform-module-document-management-client-attachment-view-skeleton.component-DD0Lceid.mjs'))
6729
6993
  .AXMDocumentExplorerAttachmentViewSkeletonComponent,
6730
6994
  };
6731
6995
  this.#effect2 = effect(() => {
@@ -6774,9 +7038,9 @@ class AXMDocumentExplorerComponent {
6774
7038
  const openToken = ++this.contextMenuOpenToken;
6775
7039
  const point = { x: event.clientX, y: event.clientY };
6776
7040
  const target = event.target;
6777
- const itemEl = target?.closest('.__explorer-item');
7041
+ const itemEl = this.resolveExplorerItemElement(target);
6778
7042
  if (itemEl) {
6779
- const node = (get$1(itemEl, '__data__') ?? get$1(itemEl.closest?.('.__explorer-item'), '__data__'));
7043
+ const node = this.resolveExplorerNode(itemEl);
6780
7044
  if (!node) {
6781
7045
  return;
6782
7046
  }
@@ -6821,6 +7085,38 @@ class AXMDocumentExplorerComponent {
6821
7085
  await this.vm.handleMenuItemClick(e.item.name, e.item.data);
6822
7086
  }
6823
7087
  }
7088
+ resolveExplorerItemElement(target) {
7089
+ const itemEl = target?.closest('.__explorer-item');
7090
+ if (itemEl) {
7091
+ return itemEl;
7092
+ }
7093
+ const tableRow = target?.closest('tr');
7094
+ if (!tableRow) {
7095
+ return null;
7096
+ }
7097
+ const fromRow = tableRow.querySelector('.__explorer-item');
7098
+ if (fromRow) {
7099
+ return fromRow;
7100
+ }
7101
+ const rowId = tableRow.getAttribute('data-id') ?? tableRow.getAttribute('id');
7102
+ if (!rowId) {
7103
+ return null;
7104
+ }
7105
+ return this.vm.filteredFolders().concat(this.vm.filteredFiles()).find((node) => node.id === rowId)
7106
+ ? tableRow
7107
+ : null;
7108
+ }
7109
+ resolveExplorerNode(itemEl) {
7110
+ const fromElement = (get$1(itemEl, '__data__') ?? get$1(itemEl.closest?.('.__explorer-item'), '__data__'));
7111
+ if (fromElement) {
7112
+ return fromElement;
7113
+ }
7114
+ const rowId = itemEl.getAttribute('data-id') ?? itemEl.getAttribute('id');
7115
+ if (!rowId) {
7116
+ return undefined;
7117
+ }
7118
+ return this.vm.filteredFolders().concat(this.vm.filteredFiles()).find((node) => node.id === rowId);
7119
+ }
6824
7120
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMDocumentExplorerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6825
7121
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMDocumentExplorerComponent, isStandalone: true, selector: "axm-document-explorer", inputs: { browseMode: { classPropertyName: "browseMode", publicName: "browseMode", isSignal: true, isRequired: false, transformFunction: null }, viewMode: { classPropertyName: "viewMode", publicName: "viewMode", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, showContextMenu: { classPropertyName: "showContextMenu", publicName: "showContextMenu", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "handleExplorerClick($event)", "contextmenu": "handleExplorerContextMenu($event)" }, classAttribute: "flex min-h-0 min-w-0 flex-1 flex-col" }, viewQueries: [{ propertyName: "contextMenu", first: true, predicate: ["itemsContextMenu"], descendants: true, isSignal: true }, { propertyName: "rootContextMenu", first: true, predicate: ["rootContextMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"view-container\">\n @if (showSkeleton()) {\n @if (skeletonView(); as skeleton) {\n <ng-container [ngComponentOutlet]=\"skeleton\"></ng-container>\n } @else {\n <axm-document-explorer-large-tiles-view-skeleton></axm-document-explorer-large-tiles-view-skeleton>\n }\n } @else if (showEmptyState()) {\n <axp-state-message\n icon=\"fa-light fa-folder-open\"\n [title]=\"'@document-management:empty-states.no-items.title'\"\n [description]=\"'@document-management:empty-states.no-items.description'\"\n >\n </axp-state-message>\n } @else {\n <ng-container [ngComponentOutlet]=\"view()\"></ng-container>\n }\n</div>\n\n<!-- Context Menu: opened via host contextmenu after items are resolved (not via [target]/onOpening). -->\n@if (showContextMenu()) {\n <ax-context-menu\n #itemsContextMenu\n [orientation]=\"'vertical'\"\n [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n <ax-context-menu\n #rootContextMenu\n [orientation]=\"'vertical'\"\n [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n >\n </ax-context-menu>\n}\n", styles: ["axm-document-explorer>.view-container{display:flex;min-height:0px;min-width:0px;flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * 4);-webkit-user-select:none;user-select:none}axm-document-explorer .animation-duration-2s{--fa-animation-duration: 2s}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXMenuModule }, { kind: "component", type: i2$1.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "closeOnRouteChange", "items", "target"], outputs: ["onItemClick", "onOpening", "onClose"] }, { kind: "ngmodule", type: AXMFileTypeModule }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "component", type: AXMDocumentExplorerLargeTilesViewSkeletonComponent, selector: "axm-document-explorer-large-tiles-view-skeleton" }], changeDetection: i0.ChangeDetectionStrategy.Eager, encapsulation: i0.ViewEncapsulation.None }); }
6826
7122
  }
@@ -7241,19 +7537,14 @@ class AXMDocumentDrivePageComponent extends AXPPageLayoutBaseComponent {
7241
7537
  { key: 'size', textKey: 'actions.sort-by-size', icon: 'fa-light fa-weight-hanging' },
7242
7538
  ], /* @ts-ignore */
7243
7539
  ...(ngDevMode ? [{ debugName: "sortItems" }] : /* istanbul ignore next */ []));
7244
- this.viewsItems = computed(() => {
7245
- const items = [
7246
- { key: 'large-icons', icon: 'fa-light fa-grid' },
7247
- { key: 'small-icons', icon: 'fa-light fa-grid', break: true },
7248
- { key: 'large-tiles', icon: 'fa-grid-2' },
7249
- { key: 'small-tiles', icon: 'fa-grid-2', break: true },
7250
- { key: 'list', icon: 'fa-list' },
7251
- ];
7252
- if (this.vm.canUseHomogeneousGrid()) {
7253
- items.splice(items.length - 1, 0, { key: 'details', icon: 'fa-light fa-table', break: true });
7254
- }
7255
- return items;
7256
- }, /* @ts-ignore */
7540
+ this.viewsItems = computed(() => [
7541
+ { key: 'large-icons', icon: 'fa-light fa-grid' },
7542
+ { key: 'small-icons', icon: 'fa-light fa-grid', break: true },
7543
+ { key: 'large-tiles', icon: 'fa-grid-2' },
7544
+ { key: 'small-tiles', icon: 'fa-grid-2', break: true },
7545
+ { key: 'list', icon: 'fa-list' },
7546
+ { key: 'details', icon: 'fa-light fa-table', break: true },
7547
+ ], /* @ts-ignore */
7257
7548
  ...(ngDevMode ? [{ debugName: "viewsItems" }] : /* istanbul ignore next */ []));
7258
7549
  this.selectedViewMode = computed(() => this.viewsItems().find((item) => item.key === this.vm.viewMode()) ?? this.viewsItems()[0], /* @ts-ignore */
7259
7550
  ...(ngDevMode ? [{ debugName: "selectedViewMode" }] : /* istanbul ignore next */ []));
@@ -8005,20 +8296,28 @@ class AXMDocumentManagementModule {
8005
8296
  provideCommandSetups([
8006
8297
  {
8007
8298
  key: 'DocumentManagement.Document:Upload',
8008
- command: () => import('./acorex-platform-module-document-management-client-upload-document.command-D3L6x6CQ.mjs').then((c) => c.AXMUploadDocumentCommand),
8299
+ command: () => import('./acorex-platform-module-document-management-client-upload-document.command-CrtRTjke.mjs').then((c) => c.AXMUploadDocumentCommand),
8009
8300
  },
8010
8301
  {
8011
8302
  key: 'DocumentManagement.Document:Open',
8012
- command: () => import('./acorex-platform-module-document-management-client-open-document.command-Bimm2bzt.mjs').then((c) => c.AXMOpenDocumentCommand),
8303
+ command: () => import('./acorex-platform-module-document-management-client-open-document.command-CObrpooD.mjs').then((c) => c.AXMOpenDocumentCommand),
8013
8304
  },
8014
8305
  {
8015
8306
  key: 'DocumentManagement.Document:Distribute',
8016
- command: () => import('./acorex-platform-module-document-management-client-distribute-document.command-BaCdm2YF.mjs').then((c) => c.AXMDistributeDocumentCommand),
8307
+ command: () => import('./acorex-platform-module-document-management-client-distribute-document.command-dTEExoVn.mjs').then((c) => c.AXMDistributeDocumentCommand),
8017
8308
  },
8018
8309
  {
8019
8310
  key: 'DocumentManagement.DocumentDistribution:SignOff',
8020
8311
  command: () => import('./acorex-platform-module-document-management-client-sign-distributed-document.command-DpQ-Un7q.mjs').then((c) => c.AXMSignDistributedDocumentCommand),
8021
8312
  },
8313
+ {
8314
+ key: 'DocumentManagement.Document:RequestReview',
8315
+ command: () => import('./acorex-platform-module-document-management-client-request-document-review.command-DNq2mYIx.mjs').then((c) => c.AXMRequestDocumentReviewCommand),
8316
+ },
8317
+ {
8318
+ key: 'DocumentManagement.DocumentReview:SignOff',
8319
+ command: () => import('./acorex-platform-module-document-management-client-sign-document-review.command-B08sgrRi.mjs').then((c) => c.AXMSignDocumentReviewCommand),
8320
+ },
8022
8321
  ]),
8023
8322
  ], imports: [AXMDriveChooseModule,
8024
8323
  AXMFileTypeModule,
@@ -8104,20 +8403,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
8104
8403
  provideCommandSetups([
8105
8404
  {
8106
8405
  key: 'DocumentManagement.Document:Upload',
8107
- command: () => import('./acorex-platform-module-document-management-client-upload-document.command-D3L6x6CQ.mjs').then((c) => c.AXMUploadDocumentCommand),
8406
+ command: () => import('./acorex-platform-module-document-management-client-upload-document.command-CrtRTjke.mjs').then((c) => c.AXMUploadDocumentCommand),
8108
8407
  },
8109
8408
  {
8110
8409
  key: 'DocumentManagement.Document:Open',
8111
- command: () => import('./acorex-platform-module-document-management-client-open-document.command-Bimm2bzt.mjs').then((c) => c.AXMOpenDocumentCommand),
8410
+ command: () => import('./acorex-platform-module-document-management-client-open-document.command-CObrpooD.mjs').then((c) => c.AXMOpenDocumentCommand),
8112
8411
  },
8113
8412
  {
8114
8413
  key: 'DocumentManagement.Document:Distribute',
8115
- command: () => import('./acorex-platform-module-document-management-client-distribute-document.command-BaCdm2YF.mjs').then((c) => c.AXMDistributeDocumentCommand),
8414
+ command: () => import('./acorex-platform-module-document-management-client-distribute-document.command-dTEExoVn.mjs').then((c) => c.AXMDistributeDocumentCommand),
8116
8415
  },
8117
8416
  {
8118
8417
  key: 'DocumentManagement.DocumentDistribution:SignOff',
8119
8418
  command: () => import('./acorex-platform-module-document-management-client-sign-distributed-document.command-DpQ-Un7q.mjs').then((c) => c.AXMSignDistributedDocumentCommand),
8120
8419
  },
8420
+ {
8421
+ key: 'DocumentManagement.Document:RequestReview',
8422
+ command: () => import('./acorex-platform-module-document-management-client-request-document-review.command-DNq2mYIx.mjs').then((c) => c.AXMRequestDocumentReviewCommand),
8423
+ },
8424
+ {
8425
+ key: 'DocumentManagement.DocumentReview:SignOff',
8426
+ command: () => import('./acorex-platform-module-document-management-client-sign-document-review.command-B08sgrRi.mjs').then((c) => c.AXMSignDocumentReviewCommand),
8427
+ },
8121
8428
  ]),
8122
8429
  ],
8123
8430
  }]
@@ -8200,19 +8507,14 @@ class AXMDocumentDriveComponent extends AXPPageLayoutBaseComponent {
8200
8507
  { key: 'size', textKey: 'actions.sort-by-size', icon: 'fa-light fa-weight-hanging' },
8201
8508
  ], /* @ts-ignore */
8202
8509
  ...(ngDevMode ? [{ debugName: "sortItems" }] : /* istanbul ignore next */ []));
8203
- this.viewsItems = computed(() => {
8204
- const items = [
8205
- { key: 'large-icons', icon: 'fa-light fa-grid' },
8206
- { key: 'small-icons', icon: 'fa-light fa-grid', break: true },
8207
- { key: 'large-tiles', icon: 'fa-grid-2' },
8208
- { key: 'small-tiles', icon: 'fa-grid-2', break: true },
8209
- { key: 'list', icon: 'fa-list' },
8210
- ];
8211
- if (this.vm.canUseHomogeneousGrid()) {
8212
- items.splice(items.length - 1, 0, { key: 'details', icon: 'fa-light fa-table', break: true });
8213
- }
8214
- return items;
8215
- }, /* @ts-ignore */
8510
+ this.viewsItems = computed(() => [
8511
+ { key: 'large-icons', icon: 'fa-light fa-grid' },
8512
+ { key: 'small-icons', icon: 'fa-light fa-grid', break: true },
8513
+ { key: 'large-tiles', icon: 'fa-grid-2' },
8514
+ { key: 'small-tiles', icon: 'fa-grid-2', break: true },
8515
+ { key: 'list', icon: 'fa-list' },
8516
+ { key: 'details', icon: 'fa-light fa-table', break: true },
8517
+ ], /* @ts-ignore */
8216
8518
  ...(ngDevMode ? [{ debugName: "viewsItems" }] : /* istanbul ignore next */ []));
8217
8519
  this.selectedViewMode = computed(() => this.viewsItems().find((item) => item.key === this.vm.viewMode()) || this.viewsItems()[0], /* @ts-ignore */
8218
8520
  ...(ngDevMode ? [{ debugName: "selectedViewMode" }] : /* istanbul ignore next */ []));
@@ -8919,5 +9221,5 @@ var drive_component = /*#__PURE__*/Object.freeze({
8919
9221
  * Generated bundle index. Do not edit.
8920
9222
  */
8921
9223
 
8922
- export { AXPDocumentExplorerViewModel as A, AXMFileTypeModule as B, AXMMenuProvider as C, AXMSearchCommandProvider as D, AXM_DOCUMENT_ATTACHMENT_DIALOG_ON_ACTION_HOOK_KEY as E, AXM_DOCUMENT_DIALOG_SURFACE_ATTACHMENT as F, AXM_DOCUMENT_DIALOG_SURFACE_ATTACHMENT_NO_SAVE as G, AXM_DOCUMENT_EXPIRATION_STATUS as H, AXM_DOCUMENT_EXPIRATION_STATUS_DEFINITION_KEY as I, AXPDocumentManagementService as J, AXPDocumentManagementSettingProvider as K, AXmFileTypeExtensionWidget as L, DM_AUDIO_EXTENSION_ICONS as M, DM_DOCUMENT_EXTENSION_ICONS as N, DM_FILE_EXTENSION_ICONS as O, DM_FILE_TYPE_ICONS as P, DM_VIDEO_EXTENSION_ICONS as Q, DOCUMENT_DRIVE_PAGE_COMPONENT_KEY as R, ScopedDriveService as S, buildDocumentManagementFileTypeCatalog as T, documentPlugin as U, resolveDocumentExpirationBadge as V, resolveDocumentVersionNumber as W, resolveFolderExpirationCountBadges as X, AXMDocumentExpirationBadgeComponent as a, AXMDocumentVersionBadgeComponent as b, AXMFolderExpirationBadgesComponent as c, collectFolderScopedMetaDataList as d, collectDocumentScopedMetaDataList as e, flattenMetaDataColumns as f, collectDocumentTypeIds as g, collectDocumentTypeNames as h, AXMDocumentManagerService as i, AXMDocumentDialogService as j, buildFileChooserOptionsFromDocumentType as k, AXMDocumentExplorerComponent as l, AXMFolderPathBreadcrumbsComponent as m, AXMDocumentDriveComponent as n, AXMDocumentDrivePageComponent as o, AXMDocumentDrivePageComponentProvider as p, AXMDocumentExpirationStatusProvider as q, readNodeMetaDataValue as r, AXMDocumentManagementApiService as s, AXMDocumentManagementFileTypeProvider as t, AXMDocumentManagementModule as u, AXMDocumentManagerServiceImpl as v, AXMFileTypeExtensionWidgetColumnComponent as w, AXMFileTypeExtensionWidgetDesignerComponent as x, AXMFileTypeExtensionWidgetEditComponent as y, AXMFileTypeExtensionWidgetViewComponent as z };
8923
- //# sourceMappingURL=acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-qhcOFKFu.mjs.map
9224
+ export { AXPDocumentExplorerViewModel as A, AXMFileTypeExtensionWidgetDesignerComponent as B, AXMFileTypeExtensionWidgetEditComponent as C, AXMFileTypeExtensionWidgetViewComponent as D, AXMFileTypeModule as E, AXMMenuProvider as F, AXMSearchCommandProvider as G, AXM_DOCUMENT_ATTACHMENT_DIALOG_ON_ACTION_HOOK_KEY as H, AXM_DOCUMENT_DIALOG_SURFACE_ATTACHMENT as I, AXM_DOCUMENT_DIALOG_SURFACE_ATTACHMENT_NO_SAVE as J, AXM_DOCUMENT_EXPIRATION_STATUS as K, AXM_DOCUMENT_EXPIRATION_STATUS_DEFINITION_KEY as L, AXPDocumentManagementSettingProvider as M, AXmFileTypeExtensionWidget as N, DM_AUDIO_EXTENSION_ICONS as O, DM_DOCUMENT_EXTENSION_ICONS as P, DM_FILE_EXTENSION_ICONS as Q, DM_FILE_TYPE_ICONS as R, DM_VIDEO_EXTENSION_ICONS as S, DOCUMENT_DRIVE_PAGE_COMPONENT_KEY as T, ScopedDriveService as U, buildDocumentManagementFileTypeCatalog as V, documentPlugin as W, resolveDocumentExpirationBadge as X, resolveDocumentVersionNumber as Y, resolveFolderExpirationCountBadges as Z, AXMDocumentExpirationBadgeComponent as a, AXMDocumentVersionBadgeComponent as b, AXMFolderExpirationBadgesComponent as c, collectFolderScopedMetaDataList as d, collectDocumentScopedMetaDataList as e, flattenMetaDataColumns as f, collectLookupKeys as g, collectDocumentTypeIds as h, collectDocumentTypeNames as i, AXMDocumentManagerService as j, AXMDocumentDialogService as k, buildFileChooserOptionsFromDocumentType as l, AXPDocumentManagementService as m, AXMDocumentExplorerComponent as n, AXMFolderPathBreadcrumbsComponent as o, AXMDocumentDriveComponent as p, AXMDocumentDrivePageComponent as q, readNodeMetaDataValue as r, sourcesAllowDocumentReview as s, AXMDocumentDrivePageComponentProvider as t, AXMDocumentExpirationStatusProvider as u, AXMDocumentManagementApiService as v, AXMDocumentManagementFileTypeProvider as w, AXMDocumentManagementModule as x, AXMDocumentManagerServiceImpl as y, AXMFileTypeExtensionWidgetColumnComponent as z };
9225
+ //# sourceMappingURL=acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-DHVvb5hG.mjs.map