@acorex-platform/module-document-management-client 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-LQjccofO.mjs +7849 -0
- package/fesm2022/acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-LQjccofO.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-attachment-view-skeleton.component-CEC9HdMa.mjs +27 -0
- package/fesm2022/acorex-platform-module-document-management-client-attachment-view-skeleton.component-CEC9HdMa.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-attachment-widget.component-CBpWl_FH.mjs +36 -0
- package/fesm2022/acorex-platform-module-document-management-client-attachment-widget.component-CBpWl_FH.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-contracts.mjs +313 -0
- package/fesm2022/acorex-platform-module-document-management-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-drive-choose.component-Deduhl99.mjs +250 -0
- package/fesm2022/acorex-platform-module-document-management-client-drive-choose.component-Deduhl99.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-large-icons-view-skeleton.component-wZG913_E.mjs +27 -0
- package/fesm2022/acorex-platform-module-document-management-client-large-icons-view-skeleton.component-wZG913_E.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-large-icons-view.component-Bv5JFRtL.mjs +30 -0
- package/fesm2022/acorex-platform-module-document-management-client-large-icons-view.component-Bv5JFRtL.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-large-tiles-view.component-DTEIhPcT.mjs +35 -0
- package/fesm2022/acorex-platform-module-document-management-client-large-tiles-view.component-DTEIhPcT.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-link-dialog.component-DXwE55QU.mjs +68 -0
- package/fesm2022/acorex-platform-module-document-management-client-link-dialog.component-DXwE55QU.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-list-view-skeleton.component-C3-7rgTu.mjs +27 -0
- package/fesm2022/acorex-platform-module-document-management-client-list-view-skeleton.component-C3-7rgTu.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-list-view.component-_r7VP4i8.mjs +30 -0
- package/fesm2022/acorex-platform-module-document-management-client-list-view.component-_r7VP4i8.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-open-document.command-BbMZf6zo.mjs +96 -0
- package/fesm2022/acorex-platform-module-document-management-client-open-document.command-BbMZf6zo.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-share-dialog.component-D0D75M7u.mjs +143 -0
- package/fesm2022/acorex-platform-module-document-management-client-share-dialog.component-D0D75M7u.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-share-email-dialog.component-CTP-r-4w.mjs +54 -0
- package/fesm2022/acorex-platform-module-document-management-client-share-email-dialog.component-CTP-r-4w.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-small-icons-view-skeleton.component-Dskk_B96.mjs +27 -0
- package/fesm2022/acorex-platform-module-document-management-client-small-icons-view-skeleton.component-Dskk_B96.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-small-icons-view.component-RMDX74O9.mjs +30 -0
- package/fesm2022/acorex-platform-module-document-management-client-small-icons-view.component-RMDX74O9.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-small-tiles-view-skeleton.component-DQW2VZJH.mjs +27 -0
- package/fesm2022/acorex-platform-module-document-management-client-small-tiles-view-skeleton.component-DQW2VZJH.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-small-tiles-view.component-BT6fRWVH.mjs +35 -0
- package/fesm2022/acorex-platform-module-document-management-client-small-tiles-view.component-BT6fRWVH.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client-upload-document.command-CFFOw4gM.mjs +88 -0
- package/fesm2022/acorex-platform-module-document-management-client-upload-document.command-CFFOw4gM.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-document-management-client.mjs +3 -0
- package/fesm2022/acorex-platform-module-document-management-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-document-management-client-contracts.d.ts +375 -0
- package/types/acorex-platform-module-document-management-client.d.ts +2401 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as i1 from '@acorex/components/skeleton';
|
|
2
|
+
import { AXSkeletonModule } from '@acorex/components/skeleton';
|
|
3
|
+
import * as i3 from '@acorex/core/translation';
|
|
4
|
+
import { AXTranslationModule } from '@acorex/core/translation';
|
|
5
|
+
import * as i1$1 from '@angular/common';
|
|
6
|
+
import { CommonModule } from '@angular/common';
|
|
7
|
+
import * as i0 from '@angular/core';
|
|
8
|
+
import { inject, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
9
|
+
import { A as AXPDocumentExplorerViewModel } from './acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-LQjccofO.mjs';
|
|
10
|
+
|
|
11
|
+
class AXMDocumentExplorerAttachmentViewSkeletonComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.vm = inject(AXPDocumentExplorerViewModel);
|
|
14
|
+
this.folderPlaceholders = [0, 1, 2];
|
|
15
|
+
this.filePlaceholders = [0, 1];
|
|
16
|
+
this.flatPlaceholders = [0, 1, 2, 3, 4];
|
|
17
|
+
}
|
|
18
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMDocumentExplorerAttachmentViewSkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
19
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMDocumentExplorerAttachmentViewSkeletonComponent, isStandalone: true, selector: "axm-document-explorer-attachment-view-skeleton", ngImport: i0, template: "@if (vm.groupByType()) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.folders' | translate | async }}</h3>\n </div>\n <div class=\"__content\">\n @for (item of folderPlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n </div>\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.files' | translate | async }}</h3>\n </div>\n <div class=\"__content\">\n @for (item of filePlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n </div>\n} @else {\n <div class=\"__content\">\n @for (item of flatPlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n}\n", styles: ["@layer properties;:host{display:block;width:100%}:host .__section{margin-bottom:calc(var(--spacing, .25rem) * 8);width:100%}:host .__section:last-child{margin-bottom:0}:host .__section .__header .__title{margin-bottom:calc(var(--spacing, .25rem) * 4);font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}:host .__content{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}:host .__item{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-md, .375rem);padding:calc(var(--spacing, .25rem) * 2)}:host .__icon{height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;border-radius:.25rem}:host .__name{height:calc(var(--spacing, .25rem) * 4);width:50%;border-radius:.25rem}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
20
|
+
}
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMDocumentExplorerAttachmentViewSkeletonComponent, decorators: [{
|
|
22
|
+
type: Component,
|
|
23
|
+
args: [{ selector: 'axm-document-explorer-attachment-view-skeleton', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, AXSkeletonModule, AXTranslationModule], template: "@if (vm.groupByType()) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.folders' | translate | async }}</h3>\n </div>\n <div class=\"__content\">\n @for (item of folderPlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n </div>\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.files' | translate | async }}</h3>\n </div>\n <div class=\"__content\">\n @for (item of filePlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n </div>\n} @else {\n <div class=\"__content\">\n @for (item of flatPlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n}\n", styles: ["@layer properties;:host{display:block;width:100%}:host .__section{margin-bottom:calc(var(--spacing, .25rem) * 8);width:100%}:host .__section:last-child{margin-bottom:0}:host .__section .__header .__title{margin-bottom:calc(var(--spacing, .25rem) * 4);font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}:host .__content{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}:host .__item{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-md, .375rem);padding:calc(var(--spacing, .25rem) * 2)}:host .__icon{height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);flex-shrink:0;border-radius:.25rem}:host .__name{height:calc(var(--spacing, .25rem) * 4);width:50%;border-radius:.25rem}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
24
|
+
}] });
|
|
25
|
+
|
|
26
|
+
export { AXMDocumentExplorerAttachmentViewSkeletonComponent };
|
|
27
|
+
//# sourceMappingURL=acorex-platform-module-document-management-client-attachment-view-skeleton.component-CEC9HdMa.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-document-management-client-attachment-view-skeleton.component-CEC9HdMa.mjs","sources":["../../../../libs/modules/document-management/client/src/lib/features/document-explorer/views/attachement-widget/attachment-view-skeleton.component.ts","../../../../libs/modules/document-management/client/src/lib/features/document-explorer/views/attachement-widget/attachment-view-skeleton.component.html"],"sourcesContent":["import { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { AXPDocumentExplorerViewModel } from '../../document-explorer.viewmodel';\n\n@Component({\n selector: 'axm-document-explorer-attachment-view-skeleton',\n templateUrl: './attachment-view-skeleton.component.html',\n styleUrl: './attachment-view-skeleton.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXSkeletonModule, AXTranslationModule],\n})\nexport class AXMDocumentExplorerAttachmentViewSkeletonComponent {\n protected readonly vm = inject(AXPDocumentExplorerViewModel);\n\n protected readonly folderPlaceholders = [0, 1, 2];\n protected readonly filePlaceholders = [0, 1];\n protected readonly flatPlaceholders = [0, 1, 2, 3, 4];\n}\n","@if (vm.groupByType()) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.folders' | translate | async }}</h3>\n </div>\n <div class=\"__content\">\n @for (item of folderPlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n </div>\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.files' | translate | async }}</h3>\n </div>\n <div class=\"__content\">\n @for (item of filePlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n </div>\n} @else {\n <div class=\"__content\">\n @for (item of flatPlaceholders; track item) {\n <div class=\"__item\">\n <ax-skeleton [animated]=\"true\" class=\"__icon\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"__name\"></ax-skeleton>\n </div>\n }\n </div>\n}\n"],"names":["i2"],"mappings":";;;;;;;;;;MAaa,kDAAkD,CAAA;AAP/D,IAAA,WAAA,GAAA;AAQqB,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,4BAA4B,CAAC;QAEzC,IAAA,CAAA,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9B,QAAA,IAAA,CAAA,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AACzB,QAAA,IAAA,CAAA,gBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACtD,IAAA;8GANY,kDAAkD,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlD,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kDAAkD,0GCb/D,+xCAqCA,EAAA,MAAA,EAAA,CAAA,6uCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1BY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,kIAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAElD,kDAAkD,EAAA,UAAA,EAAA,CAAA;kBAP9D,SAAS;+BACE,gDAAgD,EAAA,eAAA,EAGzC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,+xCAAA,EAAA,MAAA,EAAA,CAAA,6uCAAA,CAAA,EAAA;;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AXButtonModule } from '@acorex/components/button';
|
|
2
|
+
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
3
|
+
import { AXFormatModule } from '@acorex/core/format';
|
|
4
|
+
import * as i3 from '@acorex/core/translation';
|
|
5
|
+
import { AXTranslationModule } from '@acorex/core/translation';
|
|
6
|
+
import { AXPElementDataDirective } from '@acorex-platform/framework-client/core';
|
|
7
|
+
import * as i0 from '@angular/core';
|
|
8
|
+
import { inject, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
9
|
+
import * as i1 from '@angular/common';
|
|
10
|
+
import { CommonModule } from '@angular/common';
|
|
11
|
+
import { A as AXPDocumentExplorerViewModel, c as AXMDocumentManagerService, a as AXMDocumentExpirationBadgeComponent, b as AXMFolderExpirationBadgesComponent } from './acorex-platform-module-document-management-client-acorex-platform-module-document-management-client-LQjccofO.mjs';
|
|
12
|
+
|
|
13
|
+
class AXMDocumentExplorerAttachmentComponent {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.vm = inject(AXPDocumentExplorerViewModel);
|
|
16
|
+
this.driveService = inject(AXMDocumentManagerService);
|
|
17
|
+
}
|
|
18
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMDocumentExplorerAttachmentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
19
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMDocumentExplorerAttachmentComponent, isStandalone: true, selector: "axm-document-explorer-attachment-widget", ngImport: i0, template: "@if (vm.groupByType()) {\n @if (vm.filteredFolders().length > 0) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.folders' | translate | async }}</h3>\n </div>\n <div class=\"__content fa-xl\">\n @for (folder of vm.filteredFolders(); track folder.id) {\n <div\n class=\"__explorer-item\"\n [class.--selected]=\"vm.isItemSelected(folder)\"\n [axp-data]=\"folder\"\n (click)=\"vm.toggleSelect(folder)\"\n (onDblClick)=\"vm.navigateToFolder(folder.id)\"\n >\n <div class=\"__icon\" [style.color]=\"vm.getFolderColor(folder)\">\n @if (vm.isLoadingFolder(folder.id)) {\n <i class=\"fa-light fa-spinner fa-spin-pulse\"></i>\n } @else {\n <i class=\"fas fa-folder-closed\"></i>\n }\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ folder.name }}</div>\n <!-- ----- Expiration counts after folder name ----- -->\n <axm-folder-expiration-badges [node]=\"folder\" />\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (vm.filteredFiles().length > 0) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.files' | translate | async }}</h3>\n </div>\n <div class=\"__content fa-xl\">\n @for (file of vm.filteredFiles(); track file.id) {\n @let fileInfo = vm.getFileInfo(file.name);\n <div\n [class.--selected]=\"vm.isItemSelected(file)\"\n class=\"__explorer-item group\"\n [axp-data]=\"file\"\n (click)=\"vm.toggleSelect(file)\"\n (onDblClick)=\"vm.openFile(file)\"\n >\n <div class=\"name-bar\">\n <div class=\"__icon\">\n <i class=\"fa-fw {{ fileInfo.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ file.name }}</div>\n <axm-document-expiration-badge [node]=\"file\" />\n </div>\n </div>\n <div class=\"action-bar group-hover:visible invisible\">\n <div>\n <i class=\"fa-regular fa-trash\" (click)=\"vm.deleteNodes([file])\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-download\" (click)=\"driveService.downloadFile(file)\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-info\" (click)=\"vm.openFile(file)\"></i>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n} @else {\n <div class=\"__content fa-xl\">\n @for (folder of vm.filteredFolders(); track folder.id) {\n <div\n class=\"__explorer-item\"\n [class.--selected]=\"vm.isItemSelected(folder)\"\n [axp-data]=\"folder\"\n (click)=\"vm.toggleSelect(folder)\"\n (onDblClick)=\"vm.navigateToFolder(folder.id)\"\n >\n <div class=\"__icon\" [style.color]=\"vm.getFolderColor(folder)\">\n @if (vm.isLoadingFolder(folder.id)) {\n <i class=\"fa-light fa-spinner fa-spin-pulse\"></i>\n } @else {\n <i class=\"fas fa-folder-closed\"></i>\n }\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ folder.name }}</div>\n <!-- ----- Expiration counts after folder name ----- -->\n <axm-folder-expiration-badges [node]=\"folder\" />\n </div>\n </div>\n }\n @for (file of vm.filteredFiles(); track file.id) {\n @let fileInfo = vm.getFileInfo(file.name);\n <div\n [class.--selected]=\"vm.isItemSelected(file)\"\n class=\"__explorer-item group\"\n [axp-data]=\"file\"\n (click)=\"vm.toggleSelect(file)\"\n (onDblClick)=\"vm.openFile(file)\"\n >\n <div class=\"name-bar\">\n <div class=\"__icon\">\n <i class=\"fa-fw {{ fileInfo.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ file.name }}</div>\n <axm-document-expiration-badge [node]=\"file\" />\n </div>\n </div>\n <div class=\"action-bar group-hover:visible invisible\">\n <div>\n <i class=\"fa-regular fa-trash\" (click)=\"vm.deleteNodes([file])\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-download\" (click)=\"driveService.downloadFile(file)\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-info\" (click)=\"vm.openFile(file)\"></i>\n </div>\n </div>\n </div>\n }\n </div>\n}\n", styles: ["@layer properties;:host{width:100%}:host .__section{margin-bottom:calc(var(--spacing, .25rem) * 8);width:100%}:host .__section:last-child{margin-bottom:0}:host .__section .__header .__title{margin-bottom:calc(var(--spacing, .25rem) * 4);font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}:host .__content{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}:host .__content .__explorer-item{display:flex;cursor:pointer;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-md, .375rem);padding:calc(var(--spacing, .25rem) * 2)}:host .__content .__explorer-item:hover{background-color:var(--color-light);color:var(--color-on-light);border-color:var(--color-border-light)}:host .__content .__explorer-item .name-bar,:host .__content .__explorer-item .action-bar{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}:host .__content .__explorer-item .__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0}:host .__content .__explorer-item .__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}:host .__content .__explorer-item.--selected{background-color:var(--color-darker);color:var(--color-on-darker);border-color:var(--color-border-darker)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: AXPElementDataDirective, selector: "[axp-data]", inputs: ["axp-data", "axp-data-path"] }, { kind: "component", type: AXMDocumentExpirationBadgeComponent, selector: "axm-document-expiration-badge", inputs: ["node"] }, { kind: "component", type: AXMFolderExpirationBadgesComponent, selector: "axm-folder-expiration-badges", inputs: ["node"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
20
|
+
}
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMDocumentExplorerAttachmentComponent, decorators: [{
|
|
22
|
+
type: Component,
|
|
23
|
+
args: [{ selector: 'axm-document-explorer-attachment-widget', standalone: true, changeDetection: ChangeDetectionStrategy.Eager, imports: [
|
|
24
|
+
CommonModule,
|
|
25
|
+
AXDecoratorModule,
|
|
26
|
+
AXFormatModule,
|
|
27
|
+
AXButtonModule,
|
|
28
|
+
AXTranslationModule,
|
|
29
|
+
AXPElementDataDirective,
|
|
30
|
+
AXMDocumentExpirationBadgeComponent,
|
|
31
|
+
AXMFolderExpirationBadgesComponent,
|
|
32
|
+
], template: "@if (vm.groupByType()) {\n @if (vm.filteredFolders().length > 0) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.folders' | translate | async }}</h3>\n </div>\n <div class=\"__content fa-xl\">\n @for (folder of vm.filteredFolders(); track folder.id) {\n <div\n class=\"__explorer-item\"\n [class.--selected]=\"vm.isItemSelected(folder)\"\n [axp-data]=\"folder\"\n (click)=\"vm.toggleSelect(folder)\"\n (onDblClick)=\"vm.navigateToFolder(folder.id)\"\n >\n <div class=\"__icon\" [style.color]=\"vm.getFolderColor(folder)\">\n @if (vm.isLoadingFolder(folder.id)) {\n <i class=\"fa-light fa-spinner fa-spin-pulse\"></i>\n } @else {\n <i class=\"fas fa-folder-closed\"></i>\n }\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ folder.name }}</div>\n <!-- ----- Expiration counts after folder name ----- -->\n <axm-folder-expiration-badges [node]=\"folder\" />\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (vm.filteredFiles().length > 0) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.files' | translate | async }}</h3>\n </div>\n <div class=\"__content fa-xl\">\n @for (file of vm.filteredFiles(); track file.id) {\n @let fileInfo = vm.getFileInfo(file.name);\n <div\n [class.--selected]=\"vm.isItemSelected(file)\"\n class=\"__explorer-item group\"\n [axp-data]=\"file\"\n (click)=\"vm.toggleSelect(file)\"\n (onDblClick)=\"vm.openFile(file)\"\n >\n <div class=\"name-bar\">\n <div class=\"__icon\">\n <i class=\"fa-fw {{ fileInfo.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ file.name }}</div>\n <axm-document-expiration-badge [node]=\"file\" />\n </div>\n </div>\n <div class=\"action-bar group-hover:visible invisible\">\n <div>\n <i class=\"fa-regular fa-trash\" (click)=\"vm.deleteNodes([file])\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-download\" (click)=\"driveService.downloadFile(file)\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-info\" (click)=\"vm.openFile(file)\"></i>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n} @else {\n <div class=\"__content fa-xl\">\n @for (folder of vm.filteredFolders(); track folder.id) {\n <div\n class=\"__explorer-item\"\n [class.--selected]=\"vm.isItemSelected(folder)\"\n [axp-data]=\"folder\"\n (click)=\"vm.toggleSelect(folder)\"\n (onDblClick)=\"vm.navigateToFolder(folder.id)\"\n >\n <div class=\"__icon\" [style.color]=\"vm.getFolderColor(folder)\">\n @if (vm.isLoadingFolder(folder.id)) {\n <i class=\"fa-light fa-spinner fa-spin-pulse\"></i>\n } @else {\n <i class=\"fas fa-folder-closed\"></i>\n }\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ folder.name }}</div>\n <!-- ----- Expiration counts after folder name ----- -->\n <axm-folder-expiration-badges [node]=\"folder\" />\n </div>\n </div>\n }\n @for (file of vm.filteredFiles(); track file.id) {\n @let fileInfo = vm.getFileInfo(file.name);\n <div\n [class.--selected]=\"vm.isItemSelected(file)\"\n class=\"__explorer-item group\"\n [axp-data]=\"file\"\n (click)=\"vm.toggleSelect(file)\"\n (onDblClick)=\"vm.openFile(file)\"\n >\n <div class=\"name-bar\">\n <div class=\"__icon\">\n <i class=\"fa-fw {{ fileInfo.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ file.name }}</div>\n <axm-document-expiration-badge [node]=\"file\" />\n </div>\n </div>\n <div class=\"action-bar group-hover:visible invisible\">\n <div>\n <i class=\"fa-regular fa-trash\" (click)=\"vm.deleteNodes([file])\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-download\" (click)=\"driveService.downloadFile(file)\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-info\" (click)=\"vm.openFile(file)\"></i>\n </div>\n </div>\n </div>\n }\n </div>\n}\n", styles: ["@layer properties;:host{width:100%}:host .__section{margin-bottom:calc(var(--spacing, .25rem) * 8);width:100%}:host .__section:last-child{margin-bottom:0}:host .__section .__header .__title{margin-bottom:calc(var(--spacing, .25rem) * 4);font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}:host .__content{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}:host .__content .__explorer-item{display:flex;cursor:pointer;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-md, .375rem);padding:calc(var(--spacing, .25rem) * 2)}:host .__content .__explorer-item:hover{background-color:var(--color-light);color:var(--color-on-light);border-color:var(--color-border-light)}:host .__content .__explorer-item .name-bar,:host .__content .__explorer-item .action-bar{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}:host .__content .__explorer-item .__icon{width:calc(var(--spacing, .25rem) * 6);flex-shrink:0}:host .__content .__explorer-item .__name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:start;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}:host .__content .__explorer-item.--selected{background-color:var(--color-darker);color:var(--color-on-darker);border-color:var(--color-border-darker)}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
33
|
+
}] });
|
|
34
|
+
|
|
35
|
+
export { AXMDocumentExplorerAttachmentComponent };
|
|
36
|
+
//# sourceMappingURL=acorex-platform-module-document-management-client-attachment-widget.component-CBpWl_FH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-document-management-client-attachment-widget.component-CBpWl_FH.mjs","sources":["../../../../libs/modules/document-management/client/src/lib/features/document-explorer/views/attachement-widget/attachment-widget.component.ts","../../../../libs/modules/document-management/client/src/lib/features/document-explorer/views/attachement-widget/attachment-widget.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPElementDataDirective } from '@acorex-platform/framework-client/core';\n\nimport { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AXMDocumentManagerService } from '../../../shared';\nimport { AXMDocumentExpirationBadgeComponent } from '../../../shared/components/document-expiration-badge/document-expiration-badge.component';\nimport { AXMFolderExpirationBadgesComponent } from '../../../shared/components/folder-expiration-badges/folder-expiration-badges.component';\nimport { AXPDocumentExplorerViewModel } from '../../document-explorer.viewmodel';\n\n@Component({\n selector: 'axm-document-explorer-attachment-widget',\n templateUrl: './attachment-widget.component.html',\n styleUrls: ['./attachment-widget.component.css'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n CommonModule,\n AXDecoratorModule,\n AXFormatModule,\n AXButtonModule,\n AXTranslationModule,\n AXPElementDataDirective,\n AXMDocumentExpirationBadgeComponent,\n AXMFolderExpirationBadgesComponent,\n],\n})\nexport class AXMDocumentExplorerAttachmentComponent {\n protected vm = inject(AXPDocumentExplorerViewModel);\n protected readonly driveService = inject(AXMDocumentManagerService);\n}\n","@if (vm.groupByType()) {\n @if (vm.filteredFolders().length > 0) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.folders' | translate | async }}</h3>\n </div>\n <div class=\"__content fa-xl\">\n @for (folder of vm.filteredFolders(); track folder.id) {\n <div\n class=\"__explorer-item\"\n [class.--selected]=\"vm.isItemSelected(folder)\"\n [axp-data]=\"folder\"\n (click)=\"vm.toggleSelect(folder)\"\n (onDblClick)=\"vm.navigateToFolder(folder.id)\"\n >\n <div class=\"__icon\" [style.color]=\"vm.getFolderColor(folder)\">\n @if (vm.isLoadingFolder(folder.id)) {\n <i class=\"fa-light fa-spinner fa-spin-pulse\"></i>\n } @else {\n <i class=\"fas fa-folder-closed\"></i>\n }\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ folder.name }}</div>\n <!-- ----- Expiration counts after folder name ----- -->\n <axm-folder-expiration-badges [node]=\"folder\" />\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (vm.filteredFiles().length > 0) {\n <div class=\"__section\">\n <div class=\"__header\">\n <h3 class=\"__title\">{{ '@document-management:terms.common.files' | translate | async }}</h3>\n </div>\n <div class=\"__content fa-xl\">\n @for (file of vm.filteredFiles(); track file.id) {\n @let fileInfo = vm.getFileInfo(file.name);\n <div\n [class.--selected]=\"vm.isItemSelected(file)\"\n class=\"__explorer-item group\"\n [axp-data]=\"file\"\n (click)=\"vm.toggleSelect(file)\"\n (onDblClick)=\"vm.openFile(file)\"\n >\n <div class=\"name-bar\">\n <div class=\"__icon\">\n <i class=\"fa-fw {{ fileInfo.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ file.name }}</div>\n <axm-document-expiration-badge [node]=\"file\" />\n </div>\n </div>\n <div class=\"action-bar group-hover:visible invisible\">\n <div>\n <i class=\"fa-regular fa-trash\" (click)=\"vm.deleteNodes([file])\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-download\" (click)=\"driveService.downloadFile(file)\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-info\" (click)=\"vm.openFile(file)\"></i>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n} @else {\n <div class=\"__content fa-xl\">\n @for (folder of vm.filteredFolders(); track folder.id) {\n <div\n class=\"__explorer-item\"\n [class.--selected]=\"vm.isItemSelected(folder)\"\n [axp-data]=\"folder\"\n (click)=\"vm.toggleSelect(folder)\"\n (onDblClick)=\"vm.navigateToFolder(folder.id)\"\n >\n <div class=\"__icon\" [style.color]=\"vm.getFolderColor(folder)\">\n @if (vm.isLoadingFolder(folder.id)) {\n <i class=\"fa-light fa-spinner fa-spin-pulse\"></i>\n } @else {\n <i class=\"fas fa-folder-closed\"></i>\n }\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ folder.name }}</div>\n <!-- ----- Expiration counts after folder name ----- -->\n <axm-folder-expiration-badges [node]=\"folder\" />\n </div>\n </div>\n }\n @for (file of vm.filteredFiles(); track file.id) {\n @let fileInfo = vm.getFileInfo(file.name);\n <div\n [class.--selected]=\"vm.isItemSelected(file)\"\n class=\"__explorer-item group\"\n [axp-data]=\"file\"\n (click)=\"vm.toggleSelect(file)\"\n (onDblClick)=\"vm.openFile(file)\"\n >\n <div class=\"name-bar\">\n <div class=\"__icon\">\n <i class=\"fa-fw {{ fileInfo.icon }}\"></i>\n </div>\n <div class=\"flex min-w-0 items-center gap-1.5\">\n <div class=\"__name\">{{ file.name }}</div>\n <axm-document-expiration-badge [node]=\"file\" />\n </div>\n </div>\n <div class=\"action-bar group-hover:visible invisible\">\n <div>\n <i class=\"fa-regular fa-trash\" (click)=\"vm.deleteNodes([file])\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-download\" (click)=\"driveService.downloadFile(file)\"></i>\n </div>\n <div>\n <i class=\"fa-regular fa-info\" (click)=\"vm.openFile(file)\"></i>\n </div>\n </div>\n </div>\n }\n </div>\n}\n"],"names":["i2"],"mappings":";;;;;;;;;;;;MA8Ba,sCAAsC,CAAA;AAjBnD,IAAA,WAAA,GAAA;AAkBY,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,4BAA4B,CAAC;AAChC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC;AACpE,IAAA;8GAHY,sCAAsC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sCAAsC,mGC9BnD,q4JAkIA,EAAA,MAAA,EAAA,CAAA,giEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9GI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,cAAc,8BACd,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,uBAAuB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,mCAAmC,4FACnC,kCAAkC,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAGzB,sCAAsC,EAAA,UAAA,EAAA,CAAA;kBAjBlD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yCAAyC,cAGvC,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,KAAK,EAAA,OAAA,EACrC;wBACP,YAAY;wBACZ,iBAAiB;wBACjB,cAAc;wBACd,cAAc;wBACd,mBAAmB;wBACnB,uBAAuB;wBACvB,mCAAmC;wBACnC,kCAAkC;AACrC,qBAAA,EAAA,QAAA,EAAA,q4JAAA,EAAA,MAAA,EAAA,CAAA,giEAAA,CAAA,EAAA;;;;;"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
const AXPDocumentManagementFeatureKeys = {
|
|
2
|
+
MaxSizeStorage: 'DocumentManagement:Feature:max-size-storage',
|
|
3
|
+
};
|
|
4
|
+
|
|
5
|
+
const AXPDocumentManagementMenuKeys = {
|
|
6
|
+
DocumentTypes: 'document-management:menu:document-types',
|
|
7
|
+
TenantDrive: 'document-management:drive:tenant',
|
|
8
|
+
UserDrive: 'document-management:drive:user',
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Content & Documents capabilities used by this module.
|
|
13
|
+
* Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).
|
|
14
|
+
*/
|
|
15
|
+
const AXPContentDocumentsPermissionKeys = {
|
|
16
|
+
Access: 'ContentDocuments:Permission:Access',
|
|
17
|
+
MaintainDocuments: 'ContentDocuments:Permission:MaintainDocuments',
|
|
18
|
+
MaintainContent: 'ContentDocuments:Permission:MaintainContent',
|
|
19
|
+
MaintainFormTemplates: 'ContentDocuments:Permission:MaintainFormTemplates',
|
|
20
|
+
Setup: 'ContentDocuments:Permission:Setup',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* @deprecated Prefer {@link AXPContentDocumentsPermissionKeys}.
|
|
24
|
+
* Legacy nested shape kept so existing imports compile during migration.
|
|
25
|
+
*/
|
|
26
|
+
const AXMPermissionsKeys = {
|
|
27
|
+
DocumentManagement: {
|
|
28
|
+
Management: AXPContentDocumentsPermissionKeys.MaintainDocuments,
|
|
29
|
+
DocumentType: {
|
|
30
|
+
Management: AXPContentDocumentsPermissionKeys.Setup,
|
|
31
|
+
View: AXPContentDocumentsPermissionKeys.Setup,
|
|
32
|
+
Edit: AXPContentDocumentsPermissionKeys.Setup,
|
|
33
|
+
Delete: AXPContentDocumentsPermissionKeys.Setup,
|
|
34
|
+
Create: AXPContentDocumentsPermissionKeys.Setup,
|
|
35
|
+
},
|
|
36
|
+
Driver: {
|
|
37
|
+
Management: AXPContentDocumentsPermissionKeys.MaintainDocuments,
|
|
38
|
+
View: AXPContentDocumentsPermissionKeys.MaintainDocuments,
|
|
39
|
+
Edit: AXPContentDocumentsPermissionKeys.MaintainDocuments,
|
|
40
|
+
Delete: AXPContentDocumentsPermissionKeys.MaintainDocuments,
|
|
41
|
+
Create: AXPContentDocumentsPermissionKeys.MaintainDocuments,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
//#region ---- Setting Keys ----
|
|
47
|
+
/**
|
|
48
|
+
* Persisted setting keys for the Document Management module (`AXPSettingsService`).
|
|
49
|
+
*/
|
|
50
|
+
var AXPDocumentManagementSettings;
|
|
51
|
+
(function (AXPDocumentManagementSettings) {
|
|
52
|
+
AXPDocumentManagementSettings["ViewMode"] = "DocumentManagement:Setting:DocumentExplorer.Layout.ViewMode";
|
|
53
|
+
AXPDocumentManagementSettings["SortField"] = "DocumentManagement:Setting:DocumentExplorer.Layout.SortField";
|
|
54
|
+
AXPDocumentManagementSettings["SortDirection"] = "DocumentManagement:Setting:DocumentExplorer.Layout.SortDirection";
|
|
55
|
+
AXPDocumentManagementSettings["GroupByType"] = "DocumentManagement:Setting:DocumentExplorer.Layout.GroupByType";
|
|
56
|
+
AXPDocumentManagementSettings["DetailPanelOpen"] = "DocumentManagement:Setting:DocumentExplorer.Layout.DetailPanelOpen";
|
|
57
|
+
})(AXPDocumentManagementSettings || (AXPDocumentManagementSettings = {}));
|
|
58
|
+
//#endregion
|
|
59
|
+
|
|
60
|
+
//#region ---- Document management command keys ----
|
|
61
|
+
const AXMDocumentManagementCommandKeys = {
|
|
62
|
+
DocumentExpirationNotifyRun: 'DocumentManagement:DocumentExpiration:NotifyRun',
|
|
63
|
+
};
|
|
64
|
+
const AXM_DOCUMENT_EXPIRATION_NOTIFY_RUN_COMMAND_KEY = AXMDocumentManagementCommandKeys.DocumentExpirationNotifyRun;
|
|
65
|
+
//#endregion
|
|
66
|
+
|
|
67
|
+
const config = {
|
|
68
|
+
i18n: 'document-management',
|
|
69
|
+
module: 'DocumentManagement',
|
|
70
|
+
};
|
|
71
|
+
const RootConfig = {
|
|
72
|
+
config,
|
|
73
|
+
module: {
|
|
74
|
+
module: config.module,
|
|
75
|
+
name: config.module,
|
|
76
|
+
title: `@${config.i18n}:module.title`,
|
|
77
|
+
icon: 'fa-light fa-books',
|
|
78
|
+
},
|
|
79
|
+
entities: {
|
|
80
|
+
folder: {
|
|
81
|
+
name: 'Folder',
|
|
82
|
+
title: `@${config.i18n}:entities.folder.title`,
|
|
83
|
+
titlePlural: `@${config.i18n}:entities.folder.title-plural`,
|
|
84
|
+
icon: 'fa-light fa-folder',
|
|
85
|
+
},
|
|
86
|
+
document: {
|
|
87
|
+
name: 'Document',
|
|
88
|
+
title: `@${config.i18n}:entities.document.title`,
|
|
89
|
+
titlePlural: `@${config.i18n}:entities.document.title-plural`,
|
|
90
|
+
icon: 'fa-light fa-file',
|
|
91
|
+
},
|
|
92
|
+
documentType: {
|
|
93
|
+
name: 'DocumentType',
|
|
94
|
+
title: `@${config.i18n}:entities.document-type.title`,
|
|
95
|
+
titlePlural: `@${config.i18n}:entities.document-type.title-plural`,
|
|
96
|
+
icon: 'fa-light fa-books',
|
|
97
|
+
},
|
|
98
|
+
documentShortcut: {
|
|
99
|
+
name: 'DocumentShortcut',
|
|
100
|
+
title: `@${config.i18n}:entities.document-shortcut.title`,
|
|
101
|
+
titlePlural: `@${config.i18n}:entities.document-shortcut.title-plural`,
|
|
102
|
+
icon: 'fa-light fa-up-right-from-square',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
queries: {
|
|
106
|
+
dashboard: {
|
|
107
|
+
documentsKpi: `${config.module}:Dashboard:DocumentsKpi`,
|
|
108
|
+
},
|
|
109
|
+
reports: {
|
|
110
|
+
getDocumentsByType: `${config.module}:Reports:GetDocumentsByType`,
|
|
111
|
+
getDocumentExpiration: `${config.module}:Reports:GetDocumentExpiration`,
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
/**
|
|
115
|
+
* Daily document expiration notifier (BackgroundJobSchedule → NotifyRun).
|
|
116
|
+
* Template ids align with AXM_TEXT_TEMPLATE_IDS in content-management contracts.
|
|
117
|
+
*/
|
|
118
|
+
documentExpirationNotify: {
|
|
119
|
+
providerKey: 'document-management',
|
|
120
|
+
defaultCron: '0 0 * * *',
|
|
121
|
+
expiredTemplateId: 'c7100009-0001-4111-b111-090909090909',
|
|
122
|
+
nearExpiryTemplateId: 'c710000a-0001-4111-b111-0a0a0a0a0a0a',
|
|
123
|
+
tenantRoleNames: ['admin', 'safety-manager'],
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
//#region ---- Document management runtime keys ----
|
|
128
|
+
const AXMDocumentManagementQueryKeys = {
|
|
129
|
+
Drive: {
|
|
130
|
+
GetRoot: 'DocumentManagement:Drive:GetRoot',
|
|
131
|
+
GetContents: 'DocumentManagement:Drive:GetContents',
|
|
132
|
+
GetRootByEntityRef: 'DocumentManagement:Drive:GetRootByEntityRef',
|
|
133
|
+
},
|
|
134
|
+
Document: {
|
|
135
|
+
GetPath: 'DocumentManagement:Document:GetPath',
|
|
136
|
+
Search: 'DocumentManagement:Document:Search',
|
|
137
|
+
FindMany: 'DocumentManagement:Document:FindMany',
|
|
138
|
+
GetExpiredCount: 'DocumentManagement:Document:GetExpiredCount',
|
|
139
|
+
},
|
|
140
|
+
Folder: {
|
|
141
|
+
GetPath: 'DocumentManagement:Folder:GetPath',
|
|
142
|
+
Search: 'DocumentManagement:Folder:Search',
|
|
143
|
+
},
|
|
144
|
+
DocumentType: {
|
|
145
|
+
GetByName: 'DocumentManagement:DocumentType:GetByName',
|
|
146
|
+
},
|
|
147
|
+
Metadata: {
|
|
148
|
+
GetUniqueDefinitions: 'DocumentManagement:Metadata:GetUniqueDefinitions',
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
//#endregion
|
|
152
|
+
|
|
153
|
+
//#region ----- Types -----
|
|
154
|
+
//#endregion
|
|
155
|
+
//#region ----- Constants -----
|
|
156
|
+
/**
|
|
157
|
+
* Near-expiry window (days) shared by document badge UI and expiration reports.
|
|
158
|
+
* Documents that expire within this many days (and are not yet past) are "near".
|
|
159
|
+
*/
|
|
160
|
+
const AXM_DOCUMENT_EXPIRATION_NEAR_DAYS = 7;
|
|
161
|
+
//#endregion
|
|
162
|
+
//#region ----- Date helpers -----
|
|
163
|
+
function toDocumentExpirationDate(value) {
|
|
164
|
+
if (value == null) {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
if (value instanceof Date) {
|
|
168
|
+
return Number.isNaN(value.getTime()) ? undefined : value;
|
|
169
|
+
}
|
|
170
|
+
if (typeof value === 'string') {
|
|
171
|
+
const trimmed = value.trim();
|
|
172
|
+
// Date-only (YYYY-MM-DD) → local calendar day (matches date-time-editor)
|
|
173
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(trimmed)) {
|
|
174
|
+
const [y, m, d] = trimmed.split('-').map(Number);
|
|
175
|
+
return new Date(y, m - 1, d);
|
|
176
|
+
}
|
|
177
|
+
const parsed = new Date(trimmed);
|
|
178
|
+
return Number.isNaN(parsed.getTime()) ? undefined : parsed;
|
|
179
|
+
}
|
|
180
|
+
if (typeof value === 'number') {
|
|
181
|
+
const d = new Date(value);
|
|
182
|
+
return Number.isNaN(d.getTime()) ? undefined : d;
|
|
183
|
+
}
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
function startOfLocalDay(date) {
|
|
187
|
+
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Canonical persisted value for `Document.expirationDate`.
|
|
191
|
+
* Matches `date-time-editor`: ISO string at start of local day.
|
|
192
|
+
* Seed mocks and API writes must both use this shape (never BSON `Date`).
|
|
193
|
+
*/
|
|
194
|
+
function toDocumentExpirationStorageValue(value) {
|
|
195
|
+
if (value === undefined) {
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
if (value === null || value === '') {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
const date = toDocumentExpirationDate(value);
|
|
202
|
+
if (!date) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
return startOfLocalDay(date).toISOString();
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Local-day bounds used to query expired vs near-expiry documents.
|
|
209
|
+
* - expired: expirationDate < startOfToday
|
|
210
|
+
* - near: startOfToday <= expirationDate <= nearEndInclusive
|
|
211
|
+
*/
|
|
212
|
+
function getDocumentExpirationQueryBounds(options) {
|
|
213
|
+
const now = options?.now ?? new Date();
|
|
214
|
+
const nearDays = options?.nearDays ?? AXM_DOCUMENT_EXPIRATION_NEAR_DAYS;
|
|
215
|
+
const startOfToday = startOfLocalDay(now);
|
|
216
|
+
const nearEndInclusive = new Date(startOfToday);
|
|
217
|
+
nearEndInclusive.setDate(nearEndInclusive.getDate() + nearDays);
|
|
218
|
+
return { startOfToday, nearEndInclusive };
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Same bounds as {@link getDocumentExpirationQueryBounds}, serialized as ISO strings.
|
|
222
|
+
*
|
|
223
|
+
* Entity storage often persists `expirationDate` as an ISO string. Passing a `Date`
|
|
224
|
+
* into Mongo `$lt` / `$gte` compares different BSON types and under-counts matches.
|
|
225
|
+
* HTTP entity queries stringify dates automatically; in-process drive/middleware
|
|
226
|
+
* queries must use these string bounds explicitly.
|
|
227
|
+
*/
|
|
228
|
+
function getDocumentExpirationQueryBoundValues(options) {
|
|
229
|
+
const { startOfToday, nearEndInclusive } = getDocumentExpirationQueryBounds(options);
|
|
230
|
+
return {
|
|
231
|
+
startOfToday: startOfToday.toISOString(),
|
|
232
|
+
nearEndInclusive: nearEndInclusive.toISOString(),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Calendar day key (YYYY-MM-DD) for `date` in an IANA timezone.
|
|
237
|
+
*/
|
|
238
|
+
function getDocumentExpirationDateKey(date, timeZone = 'UTC') {
|
|
239
|
+
const formatter = new Intl.DateTimeFormat('en-CA', {
|
|
240
|
+
timeZone: timeZone || 'UTC',
|
|
241
|
+
year: 'numeric',
|
|
242
|
+
month: '2-digit',
|
|
243
|
+
day: '2-digit',
|
|
244
|
+
});
|
|
245
|
+
const parts = formatter.formatToParts(date);
|
|
246
|
+
const year = Number(parts.find((part) => part.type === 'year')?.value ?? '0');
|
|
247
|
+
const month = Number(parts.find((part) => part.type === 'month')?.value ?? '0');
|
|
248
|
+
const day = Number(parts.find((part) => part.type === 'day')?.value ?? '0');
|
|
249
|
+
return `${year.toString().padStart(4, '0')}-${month.toString().padStart(2, '0')}-${day
|
|
250
|
+
.toString()
|
|
251
|
+
.padStart(2, '0')}`;
|
|
252
|
+
}
|
|
253
|
+
/** Add whole calendar days to a YYYY-MM-DD key (UTC noon arithmetic). */
|
|
254
|
+
function addDaysToDocumentExpirationDateKey(dateKey, days) {
|
|
255
|
+
const [y, m, d] = dateKey.split('-').map((part) => Number(part));
|
|
256
|
+
const date = new Date(Date.UTC(y, (m ?? 1) - 1, d ?? 1, 12, 0, 0));
|
|
257
|
+
date.setUTCDate(date.getUTCDate() + days);
|
|
258
|
+
return getDocumentExpirationDateKey(date, 'UTC');
|
|
259
|
+
}
|
|
260
|
+
/** Inclusive UTC day window for a YYYY-MM-DD key (for expirationDate range queries). */
|
|
261
|
+
function getUtcDayBoundsForDateKey(dateKey) {
|
|
262
|
+
const [y, m, d] = dateKey.split('-').map((part) => Number(part));
|
|
263
|
+
const start = new Date(Date.UTC(y, (m ?? 1) - 1, d ?? 1, 0, 0, 0, 0));
|
|
264
|
+
const endExclusive = new Date(start);
|
|
265
|
+
endExclusive.setUTCDate(endExclusive.getUTCDate() + 1);
|
|
266
|
+
return { start, endExclusive };
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Whole days from `from` to `to` (start-of-local-day). Negative means `to` is in the past.
|
|
270
|
+
*/
|
|
271
|
+
function getDocumentExpirationRemainingDays(expirationDate, now = new Date()) {
|
|
272
|
+
const msPerDay = 24 * 60 * 60 * 1000;
|
|
273
|
+
return Math.round((startOfLocalDay(expirationDate).getTime() - startOfLocalDay(now).getTime()) / msPerDay);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Classify a document expire date as expired / near / neither.
|
|
277
|
+
* Uses only `Document.expirationDate` (platform field).
|
|
278
|
+
*/
|
|
279
|
+
function classifyDocumentExpirationStatus(expirationDate, options) {
|
|
280
|
+
const date = toDocumentExpirationDate(expirationDate);
|
|
281
|
+
if (!date) {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
const now = options?.now ?? new Date();
|
|
285
|
+
const nearDays = options?.nearDays ?? AXM_DOCUMENT_EXPIRATION_NEAR_DAYS;
|
|
286
|
+
const remainingDays = getDocumentExpirationRemainingDays(date, now);
|
|
287
|
+
if (remainingDays < 0) {
|
|
288
|
+
return 'expired';
|
|
289
|
+
}
|
|
290
|
+
if (remainingDays <= nearDays) {
|
|
291
|
+
return 'near';
|
|
292
|
+
}
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
//#endregion
|
|
296
|
+
|
|
297
|
+
/** Status value constants for use in code. */
|
|
298
|
+
const AXMDocumentManagementDocumentStatusValues = {
|
|
299
|
+
Draft: 'draft',
|
|
300
|
+
InReview: 'in-review',
|
|
301
|
+
Approved: 'approved',
|
|
302
|
+
Rejected: 'rejected',
|
|
303
|
+
RevisionRequested: 'revision-requested',
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
//#region ---- Contracts barrel ----
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Generated bundle index. Do not edit.
|
|
310
|
+
*/
|
|
311
|
+
|
|
312
|
+
export { AXMDocumentManagementCommandKeys, AXMDocumentManagementDocumentStatusValues, AXMDocumentManagementQueryKeys, AXMPermissionsKeys, AXM_DOCUMENT_EXPIRATION_NEAR_DAYS, AXM_DOCUMENT_EXPIRATION_NOTIFY_RUN_COMMAND_KEY, AXPContentDocumentsPermissionKeys, AXPDocumentManagementFeatureKeys, AXPDocumentManagementMenuKeys, AXPDocumentManagementSettings, RootConfig, addDaysToDocumentExpirationDateKey, classifyDocumentExpirationStatus, getDocumentExpirationDateKey, getDocumentExpirationQueryBoundValues, getDocumentExpirationQueryBounds, getDocumentExpirationRemainingDays, getUtcDayBoundsForDateKey, toDocumentExpirationDate, toDocumentExpirationStorageValue };
|
|
313
|
+
//# sourceMappingURL=acorex-platform-module-document-management-client-contracts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-document-management-client-contracts.mjs","sources":["../../../../libs/modules/document-management/contracts/src/features.keys.ts","../../../../libs/modules/document-management/contracts/src/menu.keys.ts","../../../../libs/modules/document-management/contracts/src/permission.keys.ts","../../../../libs/modules/document-management/contracts/src/settings.keys.ts","../../../../libs/modules/document-management/contracts/src/commands.keys.ts","../../../../libs/modules/document-management/contracts/src/root-config.ts","../../../../libs/modules/document-management/contracts/src/runtime.keys.ts","../../../../libs/modules/document-management/contracts/src/document-expiration.ts","../../../../libs/modules/document-management/contracts/src/entities/document/document.types.ts","../../../../libs/modules/document-management/contracts/src/index.ts","../../../../libs/modules/document-management/contracts/src/acorex-platform-module-document-management-client-contracts.ts"],"sourcesContent":["export const AXPDocumentManagementFeatureKeys = {\n MaxSizeStorage: 'DocumentManagement:Feature:max-size-storage',\n} as const;\n","export const AXPDocumentManagementMenuKeys = {\n DocumentTypes: 'document-management:menu:document-types',\n TenantDrive: 'document-management:drive:tenant',\n UserDrive: 'document-management:drive:user',\n} as const;\n\n","/**\n * Content & Documents capabilities used by this module.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPContentDocumentsPermissionKeys = {\n Access: 'ContentDocuments:Permission:Access',\n MaintainDocuments: 'ContentDocuments:Permission:MaintainDocuments',\n MaintainContent: 'ContentDocuments:Permission:MaintainContent',\n MaintainFormTemplates: 'ContentDocuments:Permission:MaintainFormTemplates',\n Setup: 'ContentDocuments:Permission:Setup',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPContentDocumentsPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n */\nexport const AXMPermissionsKeys = {\n DocumentManagement: {\n Management: AXPContentDocumentsPermissionKeys.MaintainDocuments,\n DocumentType: {\n Management: AXPContentDocumentsPermissionKeys.Setup,\n View: AXPContentDocumentsPermissionKeys.Setup,\n Edit: AXPContentDocumentsPermissionKeys.Setup,\n Delete: AXPContentDocumentsPermissionKeys.Setup,\n Create: AXPContentDocumentsPermissionKeys.Setup,\n },\n Driver: {\n Management: AXPContentDocumentsPermissionKeys.MaintainDocuments,\n View: AXPContentDocumentsPermissionKeys.MaintainDocuments,\n Edit: AXPContentDocumentsPermissionKeys.MaintainDocuments,\n Delete: AXPContentDocumentsPermissionKeys.MaintainDocuments,\n Create: AXPContentDocumentsPermissionKeys.MaintainDocuments,\n },\n },\n} as const;\n","//#region ---- Setting Keys ----\n\n/**\n * Persisted setting keys for the Document Management module (`AXPSettingsService`).\n */\nexport enum AXPDocumentManagementSettings {\n ViewMode = 'DocumentManagement:Setting:DocumentExplorer.Layout.ViewMode',\n SortField = 'DocumentManagement:Setting:DocumentExplorer.Layout.SortField',\n SortDirection = 'DocumentManagement:Setting:DocumentExplorer.Layout.SortDirection',\n GroupByType = 'DocumentManagement:Setting:DocumentExplorer.Layout.GroupByType',\n DetailPanelOpen = 'DocumentManagement:Setting:DocumentExplorer.Layout.DetailPanelOpen',\n}\n\n//#endregion\n","//#region ---- Document management command keys ----\n\nexport const AXMDocumentManagementCommandKeys = {\n DocumentExpirationNotifyRun: 'DocumentManagement:DocumentExpiration:NotifyRun',\n} as const;\n\nexport const AXM_DOCUMENT_EXPIRATION_NOTIFY_RUN_COMMAND_KEY =\n AXMDocumentManagementCommandKeys.DocumentExpirationNotifyRun;\n\n//#endregion\n","const config = {\n i18n: 'document-management',\n module: 'DocumentManagement',\n};\nexport const RootConfig = {\n config,\n module: {\n module: config.module,\n name: config.module,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-books',\n },\n entities: {\n folder: {\n name: 'Folder',\n title: `@${config.i18n}:entities.folder.title`,\n titlePlural: `@${config.i18n}:entities.folder.title-plural`,\n icon: 'fa-light fa-folder',\n },\n document: {\n name: 'Document',\n title: `@${config.i18n}:entities.document.title`,\n titlePlural: `@${config.i18n}:entities.document.title-plural`,\n icon: 'fa-light fa-file',\n },\n documentType: {\n name: 'DocumentType',\n title: `@${config.i18n}:entities.document-type.title`,\n titlePlural: `@${config.i18n}:entities.document-type.title-plural`,\n icon: 'fa-light fa-books',\n },\n documentShortcut: {\n name: 'DocumentShortcut',\n title: `@${config.i18n}:entities.document-shortcut.title`,\n titlePlural: `@${config.i18n}:entities.document-shortcut.title-plural`,\n icon: 'fa-light fa-up-right-from-square',\n },\n },\n queries: {\n dashboard: {\n documentsKpi: `${config.module}:Dashboard:DocumentsKpi`,\n },\n reports: {\n getDocumentsByType: `${config.module}:Reports:GetDocumentsByType`,\n getDocumentExpiration: `${config.module}:Reports:GetDocumentExpiration`,\n },\n },\n /**\n * Daily document expiration notifier (BackgroundJobSchedule → NotifyRun).\n * Template ids align with AXM_TEXT_TEMPLATE_IDS in content-management contracts.\n */\n documentExpirationNotify: {\n providerKey: 'document-management',\n defaultCron: '0 0 * * *',\n expiredTemplateId: 'c7100009-0001-4111-b111-090909090909',\n nearExpiryTemplateId: 'c710000a-0001-4111-b111-0a0a0a0a0a0a',\n tenantRoleNames: ['admin', 'safety-manager'] as const,\n },\n} as const;\n","//#region ---- Document management runtime keys ----\n\nexport const AXMDocumentManagementQueryKeys = {\n Drive: {\n GetRoot: 'DocumentManagement:Drive:GetRoot',\n GetContents: 'DocumentManagement:Drive:GetContents',\n GetRootByEntityRef: 'DocumentManagement:Drive:GetRootByEntityRef',\n },\n Document: {\n GetPath: 'DocumentManagement:Document:GetPath',\n Search: 'DocumentManagement:Document:Search',\n FindMany: 'DocumentManagement:Document:FindMany',\n GetExpiredCount: 'DocumentManagement:Document:GetExpiredCount',\n },\n Folder: {\n GetPath: 'DocumentManagement:Folder:GetPath',\n Search: 'DocumentManagement:Folder:Search',\n },\n DocumentType: {\n GetByName: 'DocumentManagement:DocumentType:GetByName',\n },\n Metadata: {\n GetUniqueDefinitions: 'DocumentManagement:Metadata:GetUniqueDefinitions',\n },\n} as const;\n\n//#endregion\n","//#region ----- Types -----\n\nexport type AXMDocumentExpirationStatus = 'expired' | 'near';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/**\n * Near-expiry window (days) shared by document badge UI and expiration reports.\n * Documents that expire within this many days (and are not yet past) are \"near\".\n */\nexport const AXM_DOCUMENT_EXPIRATION_NEAR_DAYS = 7;\n\n//#endregion\n\n//#region ----- Date helpers -----\n\nexport function toDocumentExpirationDate(value: unknown): Date | undefined {\n if (value == null) {\n return undefined;\n }\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? undefined : value;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n // Date-only (YYYY-MM-DD) → local calendar day (matches date-time-editor)\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(trimmed)) {\n const [y, m, d] = trimmed.split('-').map(Number);\n return new Date(y, m - 1, d);\n }\n const parsed = new Date(trimmed);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n if (typeof value === 'number') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? undefined : d;\n }\n return undefined;\n}\n\nfunction startOfLocalDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n/**\n * Canonical persisted value for `Document.expirationDate`.\n * Matches `date-time-editor`: ISO string at start of local day.\n * Seed mocks and API writes must both use this shape (never BSON `Date`).\n */\nexport function toDocumentExpirationStorageValue(value: unknown): string | null | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value === null || value === '') {\n return null;\n }\n\n const date = toDocumentExpirationDate(value);\n if (!date) {\n return null;\n }\n\n return startOfLocalDay(date).toISOString();\n}\n\n/**\n * Local-day bounds used to query expired vs near-expiry documents.\n * - expired: expirationDate < startOfToday\n * - near: startOfToday <= expirationDate <= nearEndInclusive\n */\nexport function getDocumentExpirationQueryBounds(\n options?: { nearDays?: number; now?: Date },\n): { startOfToday: Date; nearEndInclusive: Date } {\n const now = options?.now ?? new Date();\n const nearDays = options?.nearDays ?? AXM_DOCUMENT_EXPIRATION_NEAR_DAYS;\n const startOfToday = startOfLocalDay(now);\n const nearEndInclusive = new Date(startOfToday);\n nearEndInclusive.setDate(nearEndInclusive.getDate() + nearDays);\n return { startOfToday, nearEndInclusive };\n}\n\n/**\n * Same bounds as {@link getDocumentExpirationQueryBounds}, serialized as ISO strings.\n *\n * Entity storage often persists `expirationDate` as an ISO string. Passing a `Date`\n * into Mongo `$lt` / `$gte` compares different BSON types and under-counts matches.\n * HTTP entity queries stringify dates automatically; in-process drive/middleware\n * queries must use these string bounds explicitly.\n */\nexport function getDocumentExpirationQueryBoundValues(\n options?: { nearDays?: number; now?: Date },\n): { startOfToday: string; nearEndInclusive: string } {\n const { startOfToday, nearEndInclusive } = getDocumentExpirationQueryBounds(options);\n return {\n startOfToday: startOfToday.toISOString(),\n nearEndInclusive: nearEndInclusive.toISOString(),\n };\n}\n\n/**\n * Calendar day key (YYYY-MM-DD) for `date` in an IANA timezone.\n */\nexport function getDocumentExpirationDateKey(date: Date, timeZone = 'UTC'): string {\n const formatter = new Intl.DateTimeFormat('en-CA', {\n timeZone: timeZone || 'UTC',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n const parts = formatter.formatToParts(date);\n const year = Number(parts.find((part) => part.type === 'year')?.value ?? '0');\n const month = Number(parts.find((part) => part.type === 'month')?.value ?? '0');\n const day = Number(parts.find((part) => part.type === 'day')?.value ?? '0');\n return `${year.toString().padStart(4, '0')}-${month.toString().padStart(2, '0')}-${day\n .toString()\n .padStart(2, '0')}`;\n}\n\n/** Add whole calendar days to a YYYY-MM-DD key (UTC noon arithmetic). */\nexport function addDaysToDocumentExpirationDateKey(dateKey: string, days: number): string {\n const [y, m, d] = dateKey.split('-').map((part) => Number(part));\n const date = new Date(Date.UTC(y, (m ?? 1) - 1, d ?? 1, 12, 0, 0));\n date.setUTCDate(date.getUTCDate() + days);\n return getDocumentExpirationDateKey(date, 'UTC');\n}\n\n/** Inclusive UTC day window for a YYYY-MM-DD key (for expirationDate range queries). */\nexport function getUtcDayBoundsForDateKey(dateKey: string): { start: Date; endExclusive: Date } {\n const [y, m, d] = dateKey.split('-').map((part) => Number(part));\n const start = new Date(Date.UTC(y, (m ?? 1) - 1, d ?? 1, 0, 0, 0, 0));\n const endExclusive = new Date(start);\n endExclusive.setUTCDate(endExclusive.getUTCDate() + 1);\n return { start, endExclusive };\n}\n\n/**\n * Whole days from `from` to `to` (start-of-local-day). Negative means `to` is in the past.\n */\nexport function getDocumentExpirationRemainingDays(expirationDate: Date, now: Date = new Date()): number {\n const msPerDay = 24 * 60 * 60 * 1000;\n return Math.round(\n (startOfLocalDay(expirationDate).getTime() - startOfLocalDay(now).getTime()) / msPerDay,\n );\n}\n\n/**\n * Classify a document expire date as expired / near / neither.\n * Uses only `Document.expirationDate` (platform field).\n */\nexport function classifyDocumentExpirationStatus(\n expirationDate: unknown,\n options?: { nearDays?: number; now?: Date },\n): AXMDocumentExpirationStatus | null {\n const date = toDocumentExpirationDate(expirationDate);\n if (!date) {\n return null;\n }\n\n const now = options?.now ?? new Date();\n const nearDays = options?.nearDays ?? AXM_DOCUMENT_EXPIRATION_NEAR_DAYS;\n const remainingDays = getDocumentExpirationRemainingDays(date, now);\n\n if (remainingDays < 0) {\n return 'expired';\n }\n if (remainingDays <= nearDays) {\n return 'near';\n }\n return null;\n}\n\n//#endregion\n","import { AXPFileListItem, AXPMetaData, AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n/** Document lifecycle status (EDMS-style review workflow). */\nexport type AXMDocumentManagementDocumentStatus =\n | 'draft'\n | 'in-review'\n | 'approved'\n | 'rejected'\n | 'revision-requested';\n\n/** Status value constants for use in code. */\nexport const AXMDocumentManagementDocumentStatusValues = {\n Draft: 'draft' as const,\n InReview: 'in-review' as const,\n Approved: 'approved' as const,\n Rejected: 'rejected' as const,\n RevisionRequested: 'revision-requested' as const,\n} satisfies Record<string, AXMDocumentManagementDocumentStatus>;\n\nexport interface AXMDocumentDto extends AXPEntityModel<string> {\n name: string;\n title: string;\n documentType: AXMDocumentDocDto;\n parentId: string;\n fileInfo: AXPFileListItem;\n description?: string;\n /** ISO string at start of local day (same as date-time-editor); `Date` accepted on write then normalized. */\n expirationDate?: Date | string;\n statusId?: AXMDocumentManagementDocumentStatus;\n status?: { id: AXMDocumentManagementDocumentStatus; title?: string };\n version?: number;\n metaDataForm?: AXPMetaData;\n /**\n * Optional host-entity binding (same semantics as Folder.refType / Folder.refId).\n * Stamped from the nearest ancestor folder that has a record reference.\n */\n refType?: string;\n refId?: string;\n}\n\nexport interface AXMDocumentDocDto {\n id: string;\n name: string;\n title: AXPMultiLanguageString;\n}\n","//#region ---- Contracts barrel ----\n\nexport * from './features.keys';\nexport * from './menu.keys';\nexport * from './permission.keys';\nexport * from './settings.keys';\nexport * from './commands.keys';\n\nexport * from './root-config';\nexport * from './runtime.keys';\nexport * from './document-expiration';\n\n//#endregion\n\nexport * from './entities';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|