@masterteam/document-library 0.0.2 → 0.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-document-library.mjs","sources":["../../../../packages/masterteam/document-library/document-library/utils/document-library.utils.ts","../../../../packages/masterteam/document-library/document-library/services/document-library.api.service.ts","../../../../packages/masterteam/document-library/document-library/modals/folder-dialog/document-library-folder-dialog.ts","../../../../packages/masterteam/document-library/document-library/modals/folder-dialog/document-library-folder-dialog.html","../../../../packages/masterteam/document-library/document-library/modals/upload-dialog/document-library-upload-dialog.ts","../../../../packages/masterteam/document-library/document-library/modals/upload-dialog/document-library-upload-dialog.html","../../../../packages/masterteam/document-library/document-library/components/document-library/document-library.ts","../../../../packages/masterteam/document-library/document-library/components/document-library/document-library.html","../../../../packages/masterteam/document-library/document-library/models/document-library.model.ts","../../../../packages/masterteam/document-library/document-library/masterteam-document-library.ts"],"sourcesContent":["import type {\r\n DocumentLibraryEntry,\r\n DocumentLibraryFile,\r\n DocumentLibraryFolder,\r\n DocumentLibraryFolderEntry,\r\n DocumentLibraryLabel,\r\n} from '../models/document-library.model';\r\n\r\nexport function normalizeDocumentLibraryLabel(\r\n label: DocumentLibraryLabel | null | undefined,\r\n): DocumentLibraryLabel {\r\n if (!label) {\r\n return { display: '' };\r\n }\r\n\r\n return {\r\n display: label.display ?? label.en ?? label.ar ?? '',\r\n en: label.en ?? label.display ?? label.ar ?? '',\r\n ar: label.ar ?? label.display ?? label.en ?? '',\r\n };\r\n}\r\n\r\nexport function getDocumentLibraryFolderLabel(\r\n folder: DocumentLibraryFolder,\r\n lang: 'en' | 'ar' = 'en',\r\n): string {\r\n const label = folder.label ?? {};\r\n return label[lang] ?? label.display ?? label.en ?? label.ar ?? '';\r\n}\r\n\r\nexport function toDocumentLibraryFolderEntry(\r\n folder: DocumentLibraryFolder,\r\n): DocumentLibraryFolderEntry {\r\n return {\r\n ...folder,\r\n isFolder: true,\r\n };\r\n}\r\n\r\nexport function normalizeDocumentLibraryFolder(\r\n folder: DocumentLibraryFolder,\r\n): DocumentLibraryFolder {\r\n return {\r\n ...folder,\r\n label: normalizeDocumentLibraryLabel(folder.label),\r\n isEditableFolder: folder.isEditableFolder ?? false,\r\n isNameEditable: folder.isNameEditable ?? false,\r\n isPrimaryFolder: folder.isPrimaryFolder ?? false,\r\n };\r\n}\r\n\r\nexport function normalizeDocumentLibraryFile(file: DocumentLibraryFile) {\r\n return {\r\n ...file,\r\n created: file.created || new Date().toISOString(),\r\n isFolder: false as const,\r\n };\r\n}\r\n\r\nexport function normalizeDocumentLibraryEntry(entry: DocumentLibraryEntry) {\r\n if (entry.isFolder) {\r\n return toDocumentLibraryFolderEntry(normalizeDocumentLibraryFolder(entry));\r\n }\r\n\r\n return normalizeDocumentLibraryFile(entry);\r\n}\r\n\r\nexport function getDocumentLibraryEntryTitle(\r\n entry: DocumentLibraryEntry,\r\n lang: 'en' | 'ar' = 'en',\r\n): string {\r\n if (entry.isFolder) {\r\n return getDocumentLibraryFolderLabel(entry, lang);\r\n }\r\n\r\n return entry.fileName;\r\n}\r\n\r\nexport function getDocumentLibraryFileExtension(fileName: string): string {\r\n const extension = fileName.split('.').pop();\r\n return (extension ?? 'file').toLowerCase();\r\n}\r\n\r\nexport function formatDocumentLibraryFileSize(size: number): string {\r\n if (!size) {\r\n return '0 B';\r\n }\r\n\r\n const units = ['B', 'KB', 'MB', 'GB'];\r\n let value = size;\r\n let unitIndex = 0;\r\n\r\n while (value >= 1024 && unitIndex < units.length - 1) {\r\n value /= 1024;\r\n unitIndex += 1;\r\n }\r\n\r\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;\r\n}\r\n","import {\r\n HttpClient,\r\n HttpContext,\r\n HttpEventType,\r\n HttpHeaders,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { REQUEST_CONTEXT } from '@masterteam/components';\r\nimport { filter, map, type Observable } from 'rxjs';\r\n\r\nimport type {\r\n DocumentLibraryAddDocumentRequest,\r\n DocumentLibraryDeleteFileRequest,\r\n DocumentLibraryDeleteFolderRequest,\r\n DocumentLibraryDownloadFileRequest,\r\n DocumentLibraryEntry,\r\n DocumentLibraryFile,\r\n DocumentLibraryFolder,\r\n DocumentLibraryFolderId,\r\n DocumentLibraryRenameFolderRequest,\r\n DocumentLibraryResponse,\r\n DocumentLibraryUploadedAsset,\r\n} from '../models/document-library.model';\r\n\r\ninterface DocumentLibraryApiFileDto {\r\n name?: string | null;\r\n id?: string | null;\r\n fileName: string;\r\n contentType: string;\r\n size: number;\r\n createdBy?: string | null;\r\n created: string;\r\n path?: string | null;\r\n}\r\n\r\ntype DocumentLibraryApiEntryDto =\r\n | (DocumentLibraryFolder & { isFolder: true })\r\n | (DocumentLibraryApiFileDto & { isFolder: false });\r\n\r\nexport interface DocumentLibraryUploadAssetEvent {\r\n progress: number;\r\n completed: boolean;\r\n asset?: DocumentLibraryUploadedAsset;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DocumentLibraryApiService {\r\n private readonly http = inject(HttpClient);\r\n private readonly defaultContext = new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n });\r\n\r\n loadRoots(\r\n levelId: number,\r\n levelDataId: number | null,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryFolder[]> {\r\n const endpoint =\r\n levelDataId == null\r\n ? `levels/${levelId}/document-library/default`\r\n : `levels/${levelId}/${levelDataId}/document-library`;\r\n\r\n return this.http\r\n .get<DocumentLibraryResponse<DocumentLibraryFolder[]>>(endpoint, {\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(map((response) => this.unwrap(response) ?? []));\r\n }\r\n\r\n loadFolderEntries(\r\n levelId: number,\r\n folderId: DocumentLibraryFolderId,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryEntry[]> {\r\n return this.http\r\n .get<DocumentLibraryResponse<DocumentLibraryApiEntryDto[]>>(\r\n `levels/${levelId}/document-library/folders/${folderId}/documents`,\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) => this.unwrap(response) ?? []),\r\n map((entries) => entries.map((entry) => this.mapEntry(entry))),\r\n );\r\n }\r\n\r\n createFolder(\r\n levelId: number,\r\n levelDataId: number | null,\r\n request: { parentId: DocumentLibraryFolderId | null; folderName: string },\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryFolder> {\r\n const endpoint =\r\n levelDataId == null\r\n ? `levels/${levelId}/document-library/folders`\r\n : `levels/${levelId}/${levelDataId}/document-library/folders`;\r\n\r\n return this.http\r\n .post<DocumentLibraryResponse<DocumentLibraryFolder>>(endpoint, request, {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-create-folder'),\r\n })\r\n .pipe(map((response) => this.unwrap(response)));\r\n }\r\n\r\n addDocument(\r\n levelId: number,\r\n levelDataId: number,\r\n request: DocumentLibraryAddDocumentRequest,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryFile> {\r\n return this.http\r\n .post<DocumentLibraryResponse<DocumentLibraryApiFileDto>>(\r\n `levels/${levelId}/${levelDataId}/document-library/folders/${request.folderId}/documents`,\r\n {\r\n documentGuid: request.documentGuid,\r\n },\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-add-document'),\r\n },\r\n )\r\n .pipe(map((response) => this.mapFile(this.unwrap(response))));\r\n }\r\n\r\n uploadAsset(\r\n file: File,\r\n endPoint: string,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryUploadAssetEvent> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n return this.http\r\n .post<DocumentLibraryResponse<DocumentLibraryUploadedAsset>>(\r\n endPoint,\r\n formData,\r\n {\r\n reportProgress: true,\r\n observe: 'events',\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((event): DocumentLibraryUploadAssetEvent | null => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n return {\r\n progress: event.total\r\n ? Math.round((100 * event.loaded) / event.total)\r\n : 0,\r\n completed: false,\r\n } satisfies DocumentLibraryUploadAssetEvent;\r\n }\r\n\r\n if (event.type === HttpEventType.Response && event.body) {\r\n const asset = this.mapUploadedAsset(this.unwrap(event.body), file);\r\n return {\r\n progress: 100,\r\n completed: true,\r\n asset,\r\n } satisfies DocumentLibraryUploadAssetEvent;\r\n }\r\n\r\n return null;\r\n }),\r\n filter(\r\n (event): event is DocumentLibraryUploadAssetEvent => event !== null,\r\n ),\r\n );\r\n }\r\n\r\n renameFolder(\r\n levelId: number,\r\n levelDataId: number,\r\n request: DocumentLibraryRenameFolderRequest,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryFolder> {\r\n return this.http\r\n .put<DocumentLibraryResponse<DocumentLibraryFolder>>(\r\n `levels/${levelId}/${levelDataId}/document-library/folders/${request.folderId}`,\r\n {\r\n folderName: request.folderName,\r\n },\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-rename-folder'),\r\n },\r\n )\r\n .pipe(map((response) => this.unwrap(response)));\r\n }\r\n\r\n deleteFolder(\r\n levelId: number,\r\n levelDataId: number,\r\n request: DocumentLibraryDeleteFolderRequest,\r\n context?: HttpContext,\r\n ): Observable<boolean> {\r\n return this.http\r\n .delete<DocumentLibraryResponse<boolean>>(\r\n `levels/${levelId}/${levelDataId}/document-library/folders/${request.folderId}`,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-delete-folder'),\r\n },\r\n )\r\n .pipe(map((response) => this.unwrap(response)));\r\n }\r\n\r\n deleteDocument(\r\n levelId: number,\r\n levelDataId: number,\r\n request: DocumentLibraryDeleteFileRequest,\r\n context?: HttpContext,\r\n ): Observable<boolean> {\r\n return this.http\r\n .delete<DocumentLibraryResponse<boolean>>(\r\n `levels/${levelId}/${levelDataId}/document-library/documents/${request.fileId}`,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-delete-file'),\r\n },\r\n )\r\n .pipe(map((response) => this.unwrap(response)));\r\n }\r\n\r\n downloadFile(\r\n request: DocumentLibraryDownloadFileRequest,\r\n context?: HttpContext,\r\n ): Observable<void> {\r\n const endpoint = this.resolveDownloadEndpoint(\r\n request.file.path,\r\n request.file.id,\r\n );\r\n\r\n return this.http\r\n .get(endpoint, {\r\n responseType: 'blob',\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(\r\n map((blob) => {\r\n const objectUrl = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = objectUrl;\r\n link.download = request.file.fileName;\r\n link.click();\r\n window.URL.revokeObjectURL(objectUrl);\r\n }),\r\n );\r\n }\r\n\r\n private unwrap<T>(response: DocumentLibraryResponse<T>): T {\r\n if (response.code === 2) {\r\n throw new Error(\r\n response.errors?.message ||\r\n response.message ||\r\n 'Document library request failed.',\r\n );\r\n }\r\n\r\n return response.data;\r\n }\r\n\r\n private resolveContext(context?: HttpContext): HttpContext {\r\n return context ?? this.defaultContext;\r\n }\r\n\r\n private mutationHeaders(seed: string): HttpHeaders {\r\n return new HttpHeaders({\r\n 'X-Idempotency-Key': this.idempotencyKey(seed),\r\n });\r\n }\r\n\r\n private idempotencyKey(seed: string): string {\r\n if (\r\n typeof crypto !== 'undefined' &&\r\n typeof crypto.randomUUID === 'function'\r\n ) {\r\n return `${seed}-${crypto.randomUUID()}`;\r\n }\r\n\r\n return `${seed}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\r\n }\r\n\r\n private mapEntry(entry: DocumentLibraryApiEntryDto): DocumentLibraryEntry {\r\n return entry.isFolder\r\n ? entry\r\n : {\r\n ...this.mapFile(entry),\r\n isFolder: false,\r\n };\r\n }\r\n\r\n private mapFile(file: DocumentLibraryApiFileDto): DocumentLibraryFile {\r\n return {\r\n id: file.name ?? file.id ?? '',\r\n name: file.name ?? file.id ?? null,\r\n fileName: file.fileName,\r\n contentType: file.contentType,\r\n size: file.size,\r\n createdBy: file.createdBy ?? null,\r\n created: file.created,\r\n path: this.normalizeDownloadPath(file.path),\r\n };\r\n }\r\n\r\n private mapUploadedAsset(\r\n asset: DocumentLibraryUploadedAsset,\r\n file: File,\r\n ): DocumentLibraryUploadedAsset {\r\n return {\r\n id: asset.id ?? asset.name ?? file.name,\r\n name: asset.name ?? asset.id ?? file.name,\r\n fileName: asset.fileName ?? file.name,\r\n contentType: asset.contentType ?? file.type,\r\n size: asset.size ?? file.size,\r\n };\r\n }\r\n\r\n private resolveDownloadEndpoint(\r\n path: string | null | undefined,\r\n fileId: string,\r\n ): string {\r\n return this.normalizeDownloadPath(path) ?? `uploader/${fileId}`;\r\n }\r\n\r\n private normalizeDownloadPath(\r\n path: string | null | undefined,\r\n ): string | null {\r\n if (!path) {\r\n return null;\r\n }\r\n\r\n const trimmed = path.trim();\r\n if (!trimmed) {\r\n return null;\r\n }\r\n\r\n if (/^https?:\\/\\//i.test(trimmed)) {\r\n return trimmed;\r\n }\r\n\r\n if (/^\\/?api\\/uploader\\//i.test(trimmed)) {\r\n return trimmed.replace(/^\\/?api\\//i, '');\r\n }\r\n\r\n return trimmed.replace(/^\\//, '');\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, effect, inject, input, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\n\r\nexport type DocumentLibraryFolderDialogMode = 'create' | 'rename';\r\n\r\nexport interface DocumentLibraryFolderDialogResult {\r\n folderName: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-document-library-folder-dialog',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, Button, TextField, TranslocoDirective],\r\n templateUrl: './document-library-folder-dialog.html',\r\n})\r\nexport class DocumentLibraryFolderDialog {\r\n readonly mode = input<DocumentLibraryFolderDialogMode>('create');\r\n readonly contextLabel = input('');\r\n readonly initialName = input('');\r\n\r\n readonly modal = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n\r\n readonly folderName = signal('');\r\n\r\n constructor() {\r\n effect(() => {\r\n this.folderName.set(this.initialName());\r\n });\r\n }\r\n\r\n submit(): void {\r\n const folderName = this.folderName().trim();\r\n if (!folderName) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n folderName,\r\n } satisfies DocumentLibraryFolderDialogResult);\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'document-library.modals.folder'\">\r\n <div [class]=\"[modal.contentClass, 'flex', 'flex-col', 'gap-4', 'p-4']\">\r\n @if (mode() === \"create\") {\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"parent\") }}:\r\n <span class=\"font-medium text-color\">{{ contextLabel() }}</span>\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"renameDescription\") }}\r\n </div>\r\n }\r\n\r\n <mt-text-field\r\n [ngModel]=\"folderName()\"\r\n (ngModelChange)=\"folderName.set($event)\"\r\n [label]=\"t('folderName')\"\r\n [placeholder]=\"\r\n mode() === 'create'\r\n ? t('placeholders.create')\r\n : t('placeholders.rename')\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n [class]=\"[\r\n modal.footerClass,\r\n 'flex',\r\n 'items-center',\r\n 'justify-end',\r\n 'gap-2',\r\n ]\"\r\n >\r\n <mt-button [label]=\"t('cancel')\" variant=\"outlined\" (onClick)=\"cancel()\" />\r\n\r\n <mt-button\r\n [label]=\"mode() === 'create' ? t('create') : t('save')\"\r\n [icon]=\"mode() === 'create' ? 'file.folder-plus' : 'general.edit-02'\"\r\n [disabled]=\"!folderName().trim()\"\r\n (onClick)=\"submit()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { Component, computed, inject, input, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { UploadField } from '@masterteam/components/upload-field';\r\nimport { type MTIcon } from '@masterteam/icons';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\n\r\nimport { DocumentLibraryApiService } from '../../services/document-library.api.service';\r\nimport type { DocumentLibraryUploadedAsset } from '../../models/document-library.model';\r\nimport {\r\n formatDocumentLibraryFileSize,\r\n getDocumentLibraryFileExtension,\r\n} from '../../utils/document-library.utils';\r\n\r\nexport type DocumentLibraryUploadDialogMode = 'file' | 'folder';\r\n\r\nexport interface DocumentLibraryUploadDialogResultItem {\r\n documentGuid: string;\r\n fileName: string;\r\n relativePath: string;\r\n}\r\n\r\nexport interface DocumentLibraryUploadDialogResult {\r\n uploads: DocumentLibraryUploadDialogResultItem[];\r\n}\r\n\r\ntype DocumentLibraryFolderUploadItem = {\r\n id: string;\r\n file: File;\r\n relativePath: string;\r\n pathLabel: string;\r\n enabled: boolean;\r\n progress: number;\r\n uploading: boolean;\r\n uploadedAsset: DocumentLibraryUploadedAsset | null;\r\n error: string | null;\r\n};\r\n\r\n@Component({\r\n selector: 'mt-document-library-upload-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n Button,\r\n TextField,\r\n ToggleField,\r\n UploadField,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './document-library-upload-dialog.html',\r\n})\r\nexport class DocumentLibraryUploadDialog {\r\n readonly mode = input<DocumentLibraryUploadDialogMode>('file');\r\n readonly folderLabel = input('');\r\n readonly uploadEndPoint = input('uploader');\r\n readonly requestContext = input<HttpContext | undefined>(undefined);\r\n\r\n readonly modal = inject(ModalService);\r\n private readonly api = inject(DocumentLibraryApiService);\r\n private readonly ref = inject(ModalRef);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly uploadedFile = signal<DocumentLibraryUploadedAsset | null>(null);\r\n readonly folderItems = signal<DocumentLibraryFolderUploadItem[]>([]);\r\n readonly targetRootFolderName = signal('');\r\n readonly submitting = signal(false);\r\n readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang() || 'en',\r\n });\r\n\r\n readonly selectedFolderName = computed(() => {\r\n const firstItem = this.folderItems()[0];\r\n return firstItem\r\n ? (this.getRelativePathSegments(firstItem.relativePath)[0] ?? '')\r\n : '';\r\n });\r\n\r\n readonly hasTargetRootFolderName = computed(\r\n () => !!this.targetRootFolderName().trim(),\r\n );\r\n\r\n readonly selectedCount = computed(\r\n () => this.folderItems().filter((item) => item.enabled).length,\r\n );\r\n\r\n readonly uploadedCount = computed(\r\n () =>\r\n this.folderItems().filter((item) => item.enabled && item.uploadedAsset)\r\n .length,\r\n );\r\n\r\n readonly pendingCount = computed(\r\n () =>\r\n this.folderItems().filter(\r\n (item) => item.enabled && !item.uploadedAsset && !item.uploading,\r\n ).length,\r\n );\r\n\r\n readonly failedCount = computed(\r\n () =>\r\n this.folderItems().filter(\r\n (item) => item.enabled && !item.uploadedAsset && !!item.error,\r\n ).length,\r\n );\r\n\r\n readonly canCloseWithUploads = computed(\r\n () => this.uploadedCount() > 0 && this.pendingCount() === 0,\r\n );\r\n\r\n readonly primaryActionLabel = computed(() => {\r\n if (this.mode() === 'file') {\r\n return this.translate('primary.attachFile');\r\n }\r\n\r\n return this.canCloseWithUploads()\r\n ? this.translate('primary.attachUploadedFiles')\r\n : this.translate('primary.uploadSelectedFiles');\r\n });\r\n\r\n submit(): void {\r\n if (this.mode() === 'file') {\r\n const documentGuid =\r\n this.uploadedFile()?.id?.trim() || this.uploadedFile()?.name?.trim();\r\n\r\n if (!documentGuid) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n uploads: [\r\n {\r\n documentGuid,\r\n fileName:\r\n this.uploadedFile()?.fileName?.trim() ||\r\n this.uploadedFile()?.name?.trim() ||\r\n documentGuid,\r\n relativePath:\r\n this.uploadedFile()?.fileName?.trim() ||\r\n this.uploadedFile()?.name?.trim() ||\r\n documentGuid,\r\n },\r\n ],\r\n } satisfies DocumentLibraryUploadDialogResult);\r\n return;\r\n }\r\n\r\n if (this.canCloseWithUploads()) {\r\n this.closeWithFolderUploads();\r\n return;\r\n }\r\n\r\n void this.uploadSelectedFolderItems();\r\n }\r\n\r\n cancel(): void {\r\n if (this.submitting()) {\r\n return;\r\n }\r\n\r\n this.ref.close(null);\r\n }\r\n\r\n openFolderPicker(folderInput: HTMLInputElement): void {\r\n if (this.submitting()) {\r\n return;\r\n }\r\n\r\n folderInput.value = '';\r\n folderInput.click();\r\n }\r\n\r\n onFolderSelect(event: Event): void {\r\n const input = event.target as HTMLInputElement | null;\r\n const files = Array.from(input?.files ?? []);\r\n const nextItems = files\r\n .map((file, index) => this.createFolderUploadItem(file, index))\r\n .sort((left, right) =>\r\n left.relativePath.localeCompare(right.relativePath),\r\n );\r\n\r\n this.folderItems.set(nextItems);\r\n this.targetRootFolderName.set(\r\n nextItems[0]\r\n ? (this.getRelativePathSegments(nextItems[0].relativePath)[0] ?? '')\r\n : '',\r\n );\r\n }\r\n\r\n toggleFolderItem(itemId: string, enabled: boolean | null): void {\r\n this.folderItems.update((items) =>\r\n items.map((item) =>\r\n item.id === itemId\r\n ? {\r\n ...item,\r\n enabled: enabled !== false,\r\n }\r\n : item,\r\n ),\r\n );\r\n }\r\n\r\n setAllFolderItems(enabled: boolean): void {\r\n this.folderItems.update((items) =>\r\n items.map((item) => ({\r\n ...item,\r\n enabled,\r\n })),\r\n );\r\n }\r\n\r\n getFolderItemIcon(item: DocumentLibraryFolderUploadItem): MTIcon {\r\n const extension = getDocumentLibraryFileExtension(item.file.name);\r\n\r\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(extension)) {\r\n return 'image.image-03';\r\n }\r\n\r\n if (['ts', 'js', 'json', 'html', 'css', 'scss'].includes(extension)) {\r\n return 'dev.file-code-02';\r\n }\r\n\r\n if (item.file.type.toLowerCase().includes('pdf')) {\r\n return 'file.file-06';\r\n }\r\n\r\n return 'file.file-01';\r\n }\r\n\r\n getFolderItemStatus(item: DocumentLibraryFolderUploadItem): string {\r\n if (item.uploading) {\r\n return this.translate('status.uploading', {\r\n progress: item.progress,\r\n });\r\n }\r\n\r\n if (item.uploadedAsset) {\r\n return this.translate('status.uploaded');\r\n }\r\n\r\n if (item.error) {\r\n return item.error;\r\n }\r\n\r\n if (!item.enabled) {\r\n return this.translate('status.excluded');\r\n }\r\n\r\n return this.translate('status.waiting');\r\n }\r\n\r\n getFolderItemStatusClass(item: DocumentLibraryFolderUploadItem): string {\r\n if (item.uploadedAsset) {\r\n return 'text-emerald-600';\r\n }\r\n\r\n if (item.error) {\r\n return 'text-red-600';\r\n }\r\n\r\n if (!item.enabled) {\r\n return 'text-slate-400';\r\n }\r\n\r\n return 'text-muted-color';\r\n }\r\n\r\n formatFileSize(size: number): string {\r\n return formatDocumentLibraryFileSize(size);\r\n }\r\n\r\n private createFolderUploadItem(\r\n file: File,\r\n index: number,\r\n ): DocumentLibraryFolderUploadItem {\r\n const relativePath = file.webkitRelativePath || file.name;\r\n const pathSegments = relativePath.split('/');\r\n const pathLabel = pathSegments.slice(1).join('/') || file.name;\r\n\r\n return {\r\n id:\r\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\r\n ? crypto.randomUUID()\r\n : `${index}-${relativePath}`,\r\n file,\r\n relativePath,\r\n pathLabel,\r\n enabled: true,\r\n progress: 0,\r\n uploading: false,\r\n uploadedAsset: null,\r\n error: null,\r\n };\r\n }\r\n\r\n private async uploadSelectedFolderItems(): Promise<void> {\r\n const queuedItems = this.folderItems().filter(\r\n (item) => item.enabled && !item.uploadedAsset,\r\n );\r\n\r\n if (!queuedItems.length) {\r\n return;\r\n }\r\n\r\n this.submitting.set(true);\r\n\r\n try {\r\n for (const item of queuedItems) {\r\n await this.uploadFolderItem(item.id);\r\n }\r\n\r\n if (this.failedCount() === 0 && this.canCloseWithUploads()) {\r\n this.closeWithFolderUploads();\r\n }\r\n } finally {\r\n this.submitting.set(false);\r\n }\r\n }\r\n\r\n private uploadFolderItem(itemId: string): Promise<void> {\r\n const item = this.folderItems().find(\r\n (candidate) => candidate.id === itemId,\r\n );\r\n if (!item) {\r\n return Promise.resolve();\r\n }\r\n\r\n this.patchFolderItem(itemId, {\r\n uploading: true,\r\n progress: 10,\r\n error: null,\r\n });\r\n\r\n return new Promise((resolve) => {\r\n this.api\r\n .uploadAsset(item.file, this.uploadEndPoint(), this.requestContext())\r\n .subscribe({\r\n next: (event) => {\r\n if (event.completed && event.asset) {\r\n this.patchFolderItem(itemId, {\r\n uploading: false,\r\n progress: 100,\r\n uploadedAsset: event.asset,\r\n error: null,\r\n });\r\n return;\r\n }\r\n\r\n this.patchFolderItem(itemId, {\r\n progress: Math.max(event.progress, 10),\r\n });\r\n },\r\n error: (error) => {\r\n this.patchFolderItem(itemId, {\r\n uploading: false,\r\n progress: 0,\r\n error: this.getErrorMessage(error),\r\n });\r\n resolve();\r\n },\r\n complete: () => {\r\n this.patchFolderItem(itemId, {\r\n uploading: false,\r\n });\r\n resolve();\r\n },\r\n });\r\n });\r\n }\r\n\r\n private patchFolderItem(\r\n itemId: string,\r\n patch: Partial<DocumentLibraryFolderUploadItem>,\r\n ): void {\r\n this.folderItems.update((items) =>\r\n items.map((item) =>\r\n item.id === itemId\r\n ? {\r\n ...item,\r\n ...patch,\r\n }\r\n : item,\r\n ),\r\n );\r\n }\r\n\r\n private closeWithFolderUploads(): void {\r\n const uploads = this.folderItems()\r\n .filter((item) => item.enabled && item.uploadedAsset)\r\n .map((item) => ({\r\n documentGuid:\r\n item.uploadedAsset?.id?.trim() ||\r\n item.uploadedAsset?.name?.trim() ||\r\n '',\r\n fileName: item.uploadedAsset?.fileName?.trim() || item.file.name,\r\n relativePath: this.applyTargetRootFolderName(item.relativePath),\r\n }))\r\n .filter((item) => !!item.documentGuid);\r\n\r\n if (!uploads.length) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n uploads,\r\n } satisfies DocumentLibraryUploadDialogResult);\r\n }\r\n\r\n private getErrorMessage(error: unknown): string {\r\n if (error instanceof Error && error.message) {\r\n return error.message;\r\n }\r\n\r\n return this.translate('status.uploadFailed');\r\n }\r\n\r\n private applyTargetRootFolderName(relativePath: string): string {\r\n const targetRootFolderName = this.targetRootFolderName().trim();\r\n if (!targetRootFolderName) {\r\n return relativePath;\r\n }\r\n\r\n const segments = this.getRelativePathSegments(relativePath);\r\n if (!segments.length) {\r\n return relativePath;\r\n }\r\n\r\n if (segments.length === 1) {\r\n return [targetRootFolderName, segments[0]].join('/');\r\n }\r\n\r\n segments[0] = targetRootFolderName;\r\n return segments.join('/');\r\n }\r\n\r\n private getRelativePathSegments(relativePath: string): string[] {\r\n return relativePath\r\n .split(/[\\\\/]/)\r\n .map((segment) => segment.trim())\r\n .filter(Boolean);\r\n }\r\n\r\n private translate(\r\n key: string,\r\n params?: Record<string, string | number | null | undefined>,\r\n ): string {\r\n this.activeLanguage();\r\n return this.transloco.translate(\r\n `document-library.modals.upload.${key}`,\r\n params,\r\n );\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'document-library.modals.upload'\">\r\n <div [class]=\"[modal.contentClass, 'flex', 'flex-col', 'gap-4', 'p-4']\">\r\n @if (mode() === \"file\") {\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"fileIntro\") }}\r\n <span class=\"font-medium text-color\">{{ folderLabel() }}</span\r\n >.\r\n </div>\r\n\r\n <mt-upload-field\r\n [ngModel]=\"uploadedFile()\"\r\n (ngModelChange)=\"uploadedFile.set($event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [shape]=\"'card'\"\r\n [title]=\"t('uploadFileTitle')\"\r\n [description]=\"t('uploadFileDescription')\"\r\n [endPoint]=\"uploadEndPoint()\"\r\n [context]=\"requestContext()\"\r\n />\r\n } @else {\r\n <input\r\n #folderInput\r\n type=\"file\"\r\n directory\r\n webkitdirectory\r\n multiple\r\n class=\"hidden\"\r\n (change)=\"onFolderSelect($event)\"\r\n />\r\n\r\n <div class=\"rounded-2xl border border-surface bg-surface/30 p-4\">\r\n <div class=\"flex flex-wrap items-start justify-between gap-3\">\r\n <div class=\"space-y-1\">\r\n <div class=\"text-sm font-semibold\">{{ t(\"folderTitle\") }}</div>\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"folderDescription\") }}\r\n <span class=\"font-medium text-color\">{{ folderLabel() }}</span\r\n >.\r\n </div>\r\n @if (selectedFolderName()) {\r\n <div class=\"text-sm text-color\">\r\n {{ t(\"selectedFolder\") }}:\r\n <span class=\"font-medium\">{{ selectedFolderName() }}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-wrap items-center gap-2\">\r\n <mt-button\r\n [label]=\"t('selectFolder')\"\r\n icon=\"file.folder-plus\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"openFolderPicker(folderInput)\"\r\n />\r\n\r\n @if (folderItems().length > 0) {\r\n <mt-button\r\n [label]=\"t('selectAll')\"\r\n variant=\"outlined\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"setAllFolderItems(true)\"\r\n />\r\n <mt-button\r\n [label]=\"t('clearAll')\"\r\n variant=\"outlined\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"setAllFolderItems(false)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (folderItems().length > 0) {\r\n <div\r\n class=\"grid max-h-[28rem] content-start grid-cols-1 gap-3 overflow-y-auto rounded-2xl border border-surface bg-content p-3 md:grid-cols-2 xl:grid-cols-4\"\r\n >\r\n <div\r\n class=\"col-span-full flex flex-wrap items-center justify-between gap-2 px-1\"\r\n >\r\n <div class=\"text-sm text-muted-color\">\r\n {{\r\n t(\"selectionSummary\", {\r\n selected: selectedCount(),\r\n total: folderItems().length,\r\n })\r\n }}\r\n </div>\r\n <div\r\n class=\"flex flex-wrap items-center gap-3 text-xs text-muted-color\"\r\n >\r\n <span>{{ t(\"uploadedCount\", { count: uploadedCount() }) }}</span>\r\n <span>{{ t(\"failedCount\", { count: failedCount() }) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-span-full px-1\">\r\n <mt-text-field\r\n [ngModel]=\"targetRootFolderName()\"\r\n (ngModelChange)=\"targetRootFolderName.set($event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [label]=\"t('targetFolderName')\"\r\n [placeholder]=\"t('targetFolderPlaceholder')\"\r\n [disabled]=\"submitting()\"\r\n />\r\n </div>\r\n\r\n @for (item of folderItems(); track item.id) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n size=\"small\"\r\n [icon]=\"getFolderItemIcon(item)\"\r\n [label]=\"item.file.name\"\r\n [descriptionCard]=\"item.pathLabel\"\r\n [readonly]=\"item.uploading\"\r\n [ngModel]=\"item.enabled\"\r\n (ngModelChange)=\"toggleFolderItem(item.id, $event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n >\r\n <ng-template #toggleCardBottom>\r\n <div\r\n class=\"mt-3 flex flex-wrap items-center justify-between gap-2 border-t border-surface pt-3 text-xs\"\r\n >\r\n <div class=\"text-muted-color\">\r\n {{ formatFileSize(item.file.size) }}\r\n </div>\r\n <div [class]=\"getFolderItemStatusClass(item)\">\r\n {{ getFolderItemStatus(item) }}\r\n </div>\r\n </div>\r\n\r\n @if (item.uploading) {\r\n <div class=\"mt-2 h-2 overflow-hidden rounded-full bg-surface\">\r\n <div\r\n class=\"h-full rounded-full bg-primary transition-all duration-200\"\r\n [style.width.%]=\"item.progress\"\r\n ></div>\r\n </div>\r\n }\r\n </ng-template>\r\n </mt-toggle-field>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[16rem] items-center justify-center rounded-2xl border border-dashed border-surface bg-surface/20 p-6 text-center text-sm text-muted-color\"\r\n >\r\n {{ t(\"emptyFolderSelection\") }}\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n <div\r\n [class]=\"[\r\n modal.footerClass,\r\n 'flex',\r\n 'items-center',\r\n 'justify-end',\r\n 'gap-2',\r\n ]\"\r\n >\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n variant=\"outlined\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"cancel()\"\r\n />\r\n\r\n <mt-button\r\n [label]=\"primaryActionLabel()\"\r\n icon=\"general.upload-01\"\r\n [loading]=\"submitting()\"\r\n [disabled]=\"\r\n mode() === 'file'\r\n ? !uploadedFile()?.id && !uploadedFile()?.name\r\n : !selectedCount() ||\r\n !hasTargetRootFolderName() ||\r\n (pendingCount() === 0 && !canCloseWithUploads())\r\n \"\r\n (onClick)=\"submit()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import { CommonModule, DatePipe } from '@angular/common';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n Component,\r\n TemplateRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { firstValueFrom, isObservable } from 'rxjs';\r\n\r\nimport {\r\n Breadcrumb,\r\n type BreadcrumbItem,\r\n} from '@masterteam/components/breadcrumb';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Table, type ColumnDef } from '@masterteam/components/table';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { Icon, type MTIcon } from '@masterteam/icons';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Popover } from 'primeng/popover';\r\n\r\nimport type {\r\n DocumentLibraryActionEvent,\r\n DocumentLibraryAsyncResult,\r\n DocumentLibraryEntry,\r\n DocumentLibraryFileEntry,\r\n DocumentLibraryFolder,\r\n DocumentLibraryFolderEntry,\r\n DocumentLibraryFolderId,\r\n DocumentLibrarySelectionChangeEvent,\r\n} from '../../models/document-library.model';\r\nimport {\r\n formatDocumentLibraryFileSize,\r\n getDocumentLibraryEntryTitle,\r\n getDocumentLibraryFileExtension,\r\n getDocumentLibraryFolderLabel,\r\n normalizeDocumentLibraryEntry,\r\n normalizeDocumentLibraryFile,\r\n normalizeDocumentLibraryFolder,\r\n normalizeDocumentLibraryLabel,\r\n toDocumentLibraryFolderEntry,\r\n} from '../../utils/document-library.utils';\r\nimport { DocumentLibraryApiService } from '../../services/document-library.api.service';\r\nimport {\r\n DocumentLibraryFolderDialog,\r\n type DocumentLibraryFolderDialogMode,\r\n type DocumentLibraryFolderDialogResult,\r\n} from '../../modals/folder-dialog/document-library-folder-dialog';\r\nimport {\r\n DocumentLibraryUploadDialog,\r\n type DocumentLibraryUploadDialogMode,\r\n type DocumentLibraryUploadDialogResult,\r\n} from '../../modals/upload-dialog/document-library-upload-dialog';\r\n\r\ntype FolderKey = string;\r\n\r\ntype DocumentLibraryBreadcrumbItem = BreadcrumbItem & {\r\n folderId?: DocumentLibraryFolderId | null;\r\n};\r\n\r\ntype DocumentLibraryTableRow = {\r\n id: string;\r\n entry: DocumentLibraryEntry;\r\n name: string;\r\n owner: string;\r\n size: string;\r\n updatedAt: string;\r\n};\r\n\r\ntype DocumentLibraryActionItem = {\r\n id?: string | number;\r\n label: string;\r\n icon?: MTIcon;\r\n disabled?: boolean;\r\n visible?: boolean;\r\n separator?: boolean;\r\n severity?: 'danger';\r\n command?: () => void;\r\n};\r\n\r\n@Component({\r\n selector: 'mt-document-library',\r\n standalone: true,\r\n host: {\r\n class: 'block',\r\n },\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n Avatar,\r\n Breadcrumb,\r\n Button,\r\n Card,\r\n DatePipe,\r\n Icon,\r\n Popover,\r\n Table,\r\n TextField,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './document-library.html',\r\n})\r\nexport class DocumentLibrary {\r\n private readonly api = inject(DocumentLibraryApiService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly modalService = inject(ModalService);\r\n private readonly toast = inject(ToastService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly levelId = input.required<number>();\r\n readonly levelDataId = input<number | null>(null);\r\n readonly title = input<string>('');\r\n readonly description = input<string>('');\r\n readonly lang = input<'en' | 'ar'>('en');\r\n readonly requestContext = input<HttpContext | undefined>(undefined);\r\n readonly uploadEndPoint = input<string>('uploader');\r\n readonly emptyTitle = input<string>('');\r\n readonly emptyDescription = input<string>('');\r\n\r\n readonly loaded = output<void>();\r\n readonly errored = output<string>();\r\n readonly selectionChanged = output<DocumentLibrarySelectionChangeEvent>();\r\n readonly actionExecuted = output<DocumentLibraryActionEvent>();\r\n\r\n readonly nameCellTpl = viewChild<TemplateRef<any>>('nameCellTpl');\r\n readonly updatedCellTpl = viewChild<TemplateRef<any>>('updatedCellTpl');\r\n readonly actionsCellTpl = viewChild<TemplateRef<any>>('actionsCellTpl');\r\n readonly addPopover = viewChild<Popover>('addPopover');\r\n readonly folderPopover = viewChild<Popover>('folderPopover');\r\n readonly contextPopover = viewChild<Popover>('contextPopover');\r\n\r\n readonly roots = signal<DocumentLibraryFolder[]>([]);\r\n readonly folderRegistry = signal<Map<FolderKey, DocumentLibraryFolder>>(\r\n new Map(),\r\n );\r\n readonly folderEntriesCache = signal<Map<FolderKey, DocumentLibraryEntry[]>>(\r\n new Map(),\r\n );\r\n readonly expandedFolderKeys = signal<Set<FolderKey>>(new Set());\r\n readonly busyKeys = signal<Set<string>>(new Set());\r\n readonly selectedFolderId = signal<DocumentLibraryFolderId | null>(null);\r\n readonly selectedEntry = signal<DocumentLibraryEntry | null>(null);\r\n readonly error = signal<string | null>(null);\r\n\r\n readonly contextMenuItems = signal<DocumentLibraryActionItem[]>([]);\r\n readonly railSearch = signal('');\r\n readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang() || 'en',\r\n });\r\n readonly canMutateLevelData = computed(() => this.levelDataId() != null);\r\n readonly uiLang = computed<'en' | 'ar'>(() => {\r\n const activeLang = this.activeLanguage();\r\n return activeLang === 'ar'\r\n ? 'ar'\r\n : activeLang === 'en'\r\n ? 'en'\r\n : this.lang();\r\n });\r\n readonly resolvedTitle = computed(\r\n () => this.title().trim() || this.translate('title'),\r\n );\r\n readonly resolvedEmptyTitle = computed(\r\n () => this.emptyTitle().trim() || this.translate('empty.title'),\r\n );\r\n readonly resolvedEmptyDescription = computed(\r\n () => this.emptyDescription().trim() || this.translate('empty.description'),\r\n );\r\n readonly capabilities = computed(() => ({\r\n canCreateRootFolders: true,\r\n canUploadFiles: this.canMutateLevelData(),\r\n canDownloadFiles: true,\r\n canDeleteFiles: this.canMutateLevelData(),\r\n }));\r\n\r\n readonly columns = computed<ColumnDef[]>(() => {\r\n const nameCellTpl = this.nameCellTpl();\r\n const updatedCellTpl = this.updatedCellTpl();\r\n const actionsCellTpl = this.actionsCellTpl();\r\n\r\n if (!nameCellTpl || !updatedCellTpl || !actionsCellTpl) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n key: 'name',\r\n label: this.translate('columns.name'),\r\n type: 'custom',\r\n customCellTpl: nameCellTpl,\r\n },\r\n {\r\n key: 'owner',\r\n label: this.translate('columns.owner'),\r\n },\r\n {\r\n key: 'size',\r\n label: this.translate('columns.size'),\r\n },\r\n {\r\n key: 'updatedAt',\r\n label: this.translate('columns.lastUpdated'),\r\n type: 'custom',\r\n customCellTpl: updatedCellTpl,\r\n },\r\n {\r\n key: 'actions',\r\n label: this.translate('columns.actions'),\r\n type: 'custom',\r\n customCellTpl: actionsCellTpl,\r\n },\r\n ];\r\n });\r\n\r\n readonly selectedFolder = computed(() => {\r\n const folderId = this.selectedFolderId();\r\n if (folderId == null) {\r\n return null;\r\n }\r\n\r\n return this.folderRegistry().get(this.toFolderKey(folderId)) ?? null;\r\n });\r\n\r\n readonly currentEntries = computed<DocumentLibraryEntry[]>(() => {\r\n const folderId = this.selectedFolderId();\r\n if (folderId == null) {\r\n return this.roots().map((folder) => toDocumentLibraryFolderEntry(folder));\r\n }\r\n\r\n return this.folderEntriesCache().get(this.toFolderKey(folderId)) ?? [];\r\n });\r\n\r\n readonly tableRows = computed<DocumentLibraryTableRow[]>(() =>\r\n this.currentEntries().map((entry) => ({\r\n id: this.getEntryKey(entry),\r\n entry,\r\n name: this.getEntryTitle(entry),\r\n owner: this.getEntryOwner(entry),\r\n size: entry.isFolder ? '-' : this.formatFileSize(entry.size),\r\n updatedAt: this.getEntryUpdatedAt(entry),\r\n })),\r\n );\r\n\r\n readonly breadcrumbs = computed<DocumentLibraryBreadcrumbItem[]>(() => {\r\n const items: DocumentLibraryBreadcrumbItem[] = [\r\n {\r\n icon: 'general.home-05',\r\n label: this.resolvedTitle(),\r\n folderId: null,\r\n },\r\n ];\r\n\r\n this.getFolderTrail(this.selectedFolderId()).forEach((folder) => {\r\n items.push({\r\n label: this.getFolderLabel(folder),\r\n folderId: folder.id,\r\n });\r\n });\r\n\r\n return items;\r\n });\r\n\r\n readonly currentFolderTitle = computed(() => {\r\n const selectedFolder = this.selectedFolder();\r\n return selectedFolder\r\n ? this.getFolderLabel(selectedFolder)\r\n : this.resolvedTitle();\r\n });\r\n\r\n readonly currentFolderSubtitle = computed(() => {\r\n const selectedFolder = this.selectedFolder();\r\n if (!selectedFolder) {\r\n return this.translate('summary.rootFolders', {\r\n count: this.roots().length,\r\n });\r\n }\r\n\r\n const entries = this.currentEntries();\r\n const folderCount = entries.filter((entry) => entry.isFolder).length;\r\n const fileCount = entries.length - folderCount;\r\n return this.translate('summary.folderContents', {\r\n folderCount,\r\n fileCount,\r\n });\r\n });\r\n\r\n readonly rootSummary = computed(() => {\r\n return this.translate('summary.rootFolders', {\r\n count: this.roots().length,\r\n });\r\n });\r\n\r\n readonly visibleRoots = computed(() => {\r\n const query = this.railSearch().trim().toLowerCase();\r\n if (!query) {\r\n return this.roots();\r\n }\r\n\r\n return this.roots().filter((folder) =>\r\n this.getFolderLabel(folder).toLowerCase().includes(query),\r\n );\r\n });\r\n\r\n readonly addMenuItems = computed<DocumentLibraryActionItem[]>(() => [\r\n {\r\n label: this.translate('actions.newFolder'),\r\n icon: 'file.folder-plus',\r\n command: () => this.openCreateFolderDialog(this.selectedFolder()),\r\n visible: this.canCreateFolderInSelection(),\r\n },\r\n {\r\n label: this.translate('actions.fileUpload'),\r\n icon: 'general.upload-01',\r\n command: () => this.openUploadDialog('file'),\r\n visible: this.canUploadIntoCurrentFolder(),\r\n },\r\n {\r\n label: this.translate('actions.folderUpload'),\r\n icon: 'file.folder',\r\n command: () => this.openUploadDialog('folder'),\r\n visible: this.canUploadIntoCurrentFolder(),\r\n },\r\n ]);\r\n\r\n readonly currentFolderMenuItems = computed<DocumentLibraryActionItem[]>(\r\n () => {\r\n const folder = this.selectedFolder();\r\n return folder ? this.getFolderMenuItems(folder) : [];\r\n },\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n this.levelId();\r\n this.levelDataId();\r\n this.requestContext();\r\n untracked(() => {\r\n void this.reload();\r\n });\r\n });\r\n }\r\n\r\n async reload(): Promise<void> {\r\n try {\r\n await this.withBusy('roots', async () => {\r\n this.error.set(null);\r\n this.roots.set([]);\r\n this.folderRegistry.set(new Map());\r\n this.folderEntriesCache.set(new Map());\r\n this.expandedFolderKeys.set(new Set());\r\n this.selectedFolderId.set(null);\r\n this.selectedEntry.set(null);\r\n\r\n const folders = (\r\n await this.resolveAsync(\r\n this.api.loadRoots(\r\n this.levelId(),\r\n this.levelDataId(),\r\n this.requestContext(),\r\n ),\r\n )\r\n ).map((folder) => normalizeDocumentLibraryFolder(folder));\r\n\r\n this.roots.set(folders);\r\n this.upsertFolders(folders);\r\n });\r\n\r\n this.loaded.emit();\r\n this.actionExecuted.emit({ action: 'reload', target: null });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.loadLibrary'));\r\n }\r\n }\r\n\r\n async goToRoot(): Promise<void> {\r\n this.selectedFolderId.set(null);\r\n this.selectedEntry.set(null);\r\n this.selectionChanged.emit({\r\n folder: null,\r\n entry: null,\r\n });\r\n }\r\n\r\n async openFolder(folder: DocumentLibraryFolder): Promise<void> {\r\n this.selectedFolderId.set(folder.id);\r\n this.selectedEntry.set(toDocumentLibraryFolderEntry(folder));\r\n this.expandFolderPath(folder);\r\n\r\n if (!this.folderEntriesCache().has(this.toFolderKey(folder.id))) {\r\n await this.loadFolderEntries(folder.id);\r\n }\r\n\r\n this.selectionChanged.emit({\r\n folder,\r\n entry: toDocumentLibraryFolderEntry(folder),\r\n });\r\n this.actionExecuted.emit({\r\n action: 'open-folder',\r\n target: folder,\r\n });\r\n }\r\n\r\n async toggleExpanded(folder: DocumentLibraryFolder): Promise<void> {\r\n const folderKey = this.toFolderKey(folder.id);\r\n\r\n if (!this.expandedFolderKeys().has(folderKey)) {\r\n if (!this.folderEntriesCache().has(folderKey)) {\r\n await this.loadFolderEntries(folder.id);\r\n }\r\n\r\n this.expandedFolderKeys.update((state) => {\r\n const next = new Set(state);\r\n next.add(folderKey);\r\n return next;\r\n });\r\n return;\r\n }\r\n\r\n this.expandedFolderKeys.update((state) => {\r\n const next = new Set(state);\r\n next.delete(folderKey);\r\n return next;\r\n });\r\n }\r\n\r\n async onRailFolderClick(folder: DocumentLibraryFolder): Promise<void> {\r\n await this.openFolder(folder);\r\n }\r\n\r\n async onRowClick(row: DocumentLibraryTableRow): Promise<void> {\r\n this.selectedEntry.set(row.entry);\r\n\r\n if (row.entry.isFolder) {\r\n await this.openFolder(row.entry);\r\n return;\r\n }\r\n\r\n this.selectionChanged.emit({\r\n folder: this.selectedFolder(),\r\n entry: row.entry,\r\n });\r\n }\r\n\r\n openAddPopover(event: Event): void {\r\n if (!this.hasVisibleActionItems(this.addMenuItems())) {\r\n return;\r\n }\r\n\r\n this.addPopover()?.toggle(event);\r\n }\r\n\r\n openFolderPopover(event: Event): void {\r\n if (!this.hasVisibleActionItems(this.currentFolderMenuItems())) {\r\n return;\r\n }\r\n\r\n this.folderPopover()?.toggle(event);\r\n }\r\n\r\n openContextMenu(\r\n event: MouseEvent,\r\n target: DocumentLibraryFolder | DocumentLibraryEntry,\r\n ): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const items = this.getTargetMenuItems(target);\r\n if (!this.hasVisibleActionItems(items)) {\r\n return;\r\n }\r\n\r\n this.contextMenuItems.set(items);\r\n this.showPopover(this.contextPopover(), event);\r\n }\r\n\r\n executePopoverItem(\r\n item: DocumentLibraryActionItem,\r\n popover: Popover | undefined,\r\n ): void {\r\n if (item.disabled) {\r\n return;\r\n }\r\n\r\n popover?.hide();\r\n item.command?.();\r\n }\r\n\r\n openCreateFolderDialog(parent: DocumentLibraryFolder | null): void {\r\n if (!this.canCreateFolderInSelection(parent)) {\r\n return;\r\n }\r\n this.openFolderDialog('create', {\r\n contextLabel: parent ? this.getFolderLabel(parent) : this.resolvedTitle(),\r\n initialName: '',\r\n onSubmit: (folderName) => this.createFolder(parent, folderName),\r\n });\r\n }\r\n\r\n openRenameFolderDialog(folder: DocumentLibraryFolder): void {\r\n if (!this.canRenameFolder(folder)) {\r\n return;\r\n }\r\n\r\n this.openFolderDialog('rename', {\r\n contextLabel: this.getFolderLabel(folder),\r\n initialName: this.getFolderLabel(folder),\r\n onSubmit: (folderName) => this.renameFolder(folder, folderName),\r\n });\r\n }\r\n\r\n private async createFolder(\r\n parent: DocumentLibraryFolder | null,\r\n folderName: string,\r\n ): Promise<void> {\r\n try {\r\n const created = await this.createFolderInBackend(parent, folderName);\r\n this.toast.success(\r\n this.translate('messages.folderCreated', {\r\n name: this.getFolderLabel(created),\r\n }),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'create-folder',\r\n target: created,\r\n });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.createFolder'));\r\n }\r\n }\r\n\r\n private async renameFolder(\r\n target: DocumentLibraryFolder,\r\n folderName: string,\r\n ): Promise<void> {\r\n const levelDataId = this.levelDataId();\r\n\r\n if (!folderName || levelDataId == null) {\r\n return;\r\n }\r\n\r\n try {\r\n const response = await this.withBusy(\r\n this.renameFolderBusyKey(target.id),\r\n async () =>\r\n this.resolveAsync(\r\n this.api.renameFolder(\r\n this.levelId(),\r\n levelDataId,\r\n {\r\n folderId: target.id,\r\n folderName,\r\n },\r\n this.requestContext(),\r\n ),\r\n ),\r\n );\r\n\r\n const updated = normalizeDocumentLibraryFolder(\r\n response && typeof response === 'object' && 'id' in response\r\n ? response\r\n : {\r\n ...target,\r\n label: normalizeDocumentLibraryLabel({\r\n ...target.label,\r\n display: folderName,\r\n en: target.label.en ?? folderName,\r\n ar: target.label.ar ?? folderName,\r\n }),\r\n },\r\n );\r\n\r\n this.replaceFolder(updated);\r\n this.syncSelectedFolderEntry(updated);\r\n this.toast.success(\r\n this.translate('messages.folderRenamed', {\r\n name: this.getFolderLabel(updated),\r\n }),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'rename-folder',\r\n target: updated,\r\n });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.renameFolder'));\r\n }\r\n }\r\n\r\n confirmDeleteFolder(folder: DocumentLibraryFolder): void {\r\n this.confirmationService.confirmDelete({\r\n type: 'dialog',\r\n accept: () => {\r\n void this.deleteFolder(folder);\r\n },\r\n });\r\n }\r\n\r\n async deleteFolder(folder: DocumentLibraryFolder): Promise<void> {\r\n const levelDataId = this.levelDataId();\r\n if (levelDataId == null) {\r\n return;\r\n }\r\n\r\n try {\r\n await this.withBusy(this.deleteFolderBusyKey(folder.id), async () => {\r\n await this.resolveAsync(\r\n this.api.deleteFolder(\r\n this.levelId(),\r\n levelDataId,\r\n {\r\n folderId: folder.id,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n });\r\n\r\n const removedFolderKeys = this.removeFolderTree(folder.id);\r\n if (this.isSelectedFolderInTree(removedFolderKeys)) {\r\n await this.goToRoot();\r\n } else {\r\n this.clearSelectionForRemovedFolders(removedFolderKeys);\r\n }\r\n\r\n this.toast.success(\r\n this.translate('messages.folderDeleted', {\r\n name: this.getFolderLabel(folder),\r\n }),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'delete-folder',\r\n target: folder,\r\n });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.deleteFolder'));\r\n }\r\n }\r\n\r\n confirmDeleteFile(file: DocumentLibraryFileEntry): void {\r\n this.confirmationService.confirmDelete({\r\n type: 'dialog',\r\n accept: () => {\r\n void this.deleteFile(file);\r\n },\r\n });\r\n }\r\n\r\n async deleteFile(file: DocumentLibraryFileEntry): Promise<void> {\r\n const levelDataId = this.levelDataId();\r\n if (levelDataId == null) {\r\n return;\r\n }\r\n\r\n try {\r\n await this.withBusy(this.deleteFileBusyKey(file.id), async () => {\r\n await this.resolveAsync(\r\n this.api.deleteDocument(\r\n this.levelId(),\r\n levelDataId,\r\n {\r\n fileId: file.id,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n });\r\n\r\n const folderId = this.selectedFolderId();\r\n if (folderId != null) {\r\n this.patchFolderEntries(folderId, (entries) =>\r\n entries.filter(\r\n (entry) => !(entry.isFolder === false && entry.id === file.id),\r\n ),\r\n );\r\n }\r\n\r\n const selectedEntry = this.selectedEntry();\r\n if (\r\n selectedEntry &&\r\n !selectedEntry.isFolder &&\r\n selectedEntry.id === file.id\r\n ) {\r\n this.selectedEntry.set(null);\r\n }\r\n\r\n this.toast.success(\r\n this.translate('messages.fileDeleted', {\r\n name: file.fileName,\r\n }),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'delete-file',\r\n target: file,\r\n });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.deleteFile'));\r\n }\r\n }\r\n\r\n async downloadFile(file: DocumentLibraryFileEntry): Promise<void> {\r\n try {\r\n await this.resolveAsync(\r\n this.api.downloadFile(\r\n {\r\n file,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.actionExecuted.emit({\r\n action: 'download-file',\r\n target: file,\r\n });\r\n } catch (error) {\r\n this.handleError(\r\n error,\r\n this.translate('errors.downloadFile', { name: file.fileName }),\r\n );\r\n }\r\n }\r\n\r\n openUploadDialog(mode: DocumentLibraryUploadDialogMode = 'file'): void {\r\n const selectedFolder = this.selectedFolder();\r\n if (!selectedFolder || !this.canUploadIntoFolder(selectedFolder)) {\r\n return;\r\n }\r\n\r\n const ref = this.modalService.openModal(\r\n DocumentLibraryUploadDialog,\r\n 'dialog',\r\n {\r\n header:\r\n mode === 'folder'\r\n ? this.translate('modals.upload.headerFolder')\r\n : this.translate('modals.upload.headerFile'),\r\n styleClass: mode === 'folder' ? '!w-[60rem]' : '!w-[34rem]',\r\n inputValues: {\r\n mode,\r\n folderLabel: this.getFolderLabel(selectedFolder),\r\n uploadEndPoint: this.uploadEndPoint(),\r\n requestContext: this.requestContext(),\r\n },\r\n },\r\n );\r\n\r\n if (!ref) {\r\n return;\r\n }\r\n\r\n ref.onClose.subscribe(\r\n (result: DocumentLibraryUploadDialogResult | null) => {\r\n if (result?.uploads?.length) {\r\n void this.attachUploadedDocuments(selectedFolder, result.uploads);\r\n }\r\n },\r\n );\r\n }\r\n\r\n foldersForRail(\r\n parentId: DocumentLibraryFolderId | null,\r\n ): DocumentLibraryFolder[] {\r\n const query = this.railSearch().trim().toLowerCase();\r\n const folders =\r\n parentId == null\r\n ? this.visibleRoots()\r\n : (this.folderEntriesCache().get(this.toFolderKey(parentId)) ?? [])\r\n .filter(\r\n (entry): entry is DocumentLibraryFolderEntry => entry.isFolder,\r\n )\r\n .map((entry) => normalizeDocumentLibraryFolder(entry));\r\n\r\n if (!query || parentId == null) {\r\n return folders;\r\n }\r\n\r\n return folders.filter((folder) =>\r\n this.getFolderLabel(folder).toLowerCase().includes(query),\r\n );\r\n }\r\n\r\n isExpanded(folderId: DocumentLibraryFolderId): boolean {\r\n return this.expandedFolderKeys().has(this.toFolderKey(folderId));\r\n }\r\n\r\n isSelectedFolder(folderId: DocumentLibraryFolderId): boolean {\r\n const selectedFolderId = this.selectedFolderId();\r\n if (selectedFolderId == null) {\r\n return false;\r\n }\r\n\r\n return this.toFolderKey(selectedFolderId) === this.toFolderKey(folderId);\r\n }\r\n\r\n hasLoadedChildren(folderId: DocumentLibraryFolderId): boolean {\r\n return this.folderEntriesCache().has(this.toFolderKey(folderId));\r\n }\r\n\r\n folderHasChildFolders(folderId: DocumentLibraryFolderId): boolean {\r\n const entries = this.folderEntriesCache().get(this.toFolderKey(folderId));\r\n if (!entries) {\r\n return true;\r\n }\r\n\r\n return entries.some((entry) => entry.isFolder);\r\n }\r\n\r\n canCreateFolderInSelection(\r\n folder: DocumentLibraryFolder | null = this.selectedFolder(),\r\n ): boolean {\r\n if (folder == null) {\r\n return !!this.capabilities().canCreateRootFolders;\r\n }\r\n\r\n return !!folder.isEditableFolder;\r\n }\r\n\r\n canUploadIntoCurrentFolder(): boolean {\r\n return this.canUploadIntoFolder(this.selectedFolder());\r\n }\r\n\r\n canUploadIntoFolder(folder: DocumentLibraryFolder | null): boolean {\r\n if (!folder) {\r\n return false;\r\n }\r\n\r\n return (\r\n !!this.capabilities().canUploadFiles &&\r\n !!folder.isEditableFolder &&\r\n !folder.isPrimaryFolder\r\n );\r\n }\r\n\r\n canDeleteFolder(folder: DocumentLibraryFolder): boolean {\r\n return (\r\n this.levelDataId() != null &&\r\n !!folder.isEditableFolder &&\r\n !folder.isPrimaryFolder\r\n );\r\n }\r\n\r\n canDeleteFile(_file: DocumentLibraryFileEntry): boolean {\r\n return !!this.capabilities().canDeleteFiles;\r\n }\r\n\r\n canDownloadFile(_file: DocumentLibraryFileEntry): boolean {\r\n return !!this.capabilities().canDownloadFiles;\r\n }\r\n\r\n getFolderLabel(folder: DocumentLibraryFolder): string {\r\n return (\r\n getDocumentLibraryFolderLabel(folder, this.uiLang()).trim() ||\r\n this.translate('fallback.folder', { id: folder.id })\r\n );\r\n }\r\n\r\n getEntryTitle(entry: DocumentLibraryEntry): string {\r\n return entry.isFolder\r\n ? this.getFolderLabel(entry)\r\n : getDocumentLibraryEntryTitle(entry, this.uiLang());\r\n }\r\n\r\n getEntryOwner(entry: DocumentLibraryEntry): string {\r\n if (entry.isFolder) {\r\n return entry.isEditableFolder\r\n ? this.translate('owner.workspace')\r\n : this.translate('owner.system');\r\n }\r\n\r\n return entry.createdBy ?? this.translate('owner.unknown');\r\n }\r\n\r\n getEntryUpdatedAt(entry: DocumentLibraryEntry): string {\r\n return entry.isFolder ? '' : entry.created;\r\n }\r\n\r\n getEntryKey(entry: DocumentLibraryEntry): string {\r\n return entry.isFolder\r\n ? `folder:${this.toFolderKey(entry.id)}`\r\n : `file:${entry.id}`;\r\n }\r\n\r\n getFolderMenuItems(\r\n folder: DocumentLibraryFolder,\r\n ): DocumentLibraryActionItem[] {\r\n return [\r\n {\r\n label: this.translate('actions.open'),\r\n icon: 'file.folder',\r\n command: () => void this.openFolder(folder),\r\n },\r\n {\r\n label: this.translate('actions.newSubfolder'),\r\n icon: 'file.folder-plus',\r\n command: () => this.openCreateFolderDialog(folder),\r\n visible: this.canCreateFolderInSelection(folder),\r\n },\r\n {\r\n label: this.translate('actions.uploadFile'),\r\n icon: 'general.upload-01',\r\n command: () => {\r\n void this.openFolder(folder).then(() =>\r\n this.openUploadDialog('file'),\r\n );\r\n },\r\n visible: this.canUploadIntoFolder(folder),\r\n },\r\n {\r\n label: this.translate('actions.uploadFolder'),\r\n icon: 'file.folder',\r\n command: () => {\r\n void this.openFolder(folder).then(() =>\r\n this.openUploadDialog('folder'),\r\n );\r\n },\r\n visible: this.canUploadIntoFolder(folder),\r\n },\r\n {\r\n label: this.translate('actions.rename'),\r\n icon: 'general.edit-02',\r\n command: () => this.openRenameFolderDialog(folder),\r\n visible: this.canRenameFolder(folder),\r\n },\r\n {\r\n label: this.translate('actions.delete'),\r\n icon: 'general.trash-01',\r\n severity: 'danger',\r\n command: () => this.confirmDeleteFolder(folder),\r\n visible: this.canDeleteFolder(folder),\r\n },\r\n ];\r\n }\r\n\r\n getEntryMenuItems(entry: DocumentLibraryEntry): DocumentLibraryActionItem[] {\r\n if (entry.isFolder) {\r\n return this.getFolderMenuItems(entry);\r\n }\r\n\r\n return [\r\n {\r\n label: this.translate('actions.download'),\r\n icon: 'general.download-01',\r\n command: () => void this.downloadFile(entry),\r\n visible: this.canDownloadFile(entry),\r\n },\r\n {\r\n label: this.translate('actions.delete'),\r\n icon: 'general.trash-01',\r\n severity: 'danger',\r\n command: () => this.confirmDeleteFile(entry),\r\n visible: this.canDeleteFile(entry),\r\n },\r\n ];\r\n }\r\n\r\n getFolderIcon(folder: DocumentLibraryFolder): MTIcon {\r\n if (!folder.isEditableFolder && folder.isPrimaryFolder) {\r\n return 'file.folder-lock';\r\n }\r\n\r\n if (!folder.isEditableFolder) {\r\n return 'security.folder-shield';\r\n }\r\n\r\n return this.isSelectedFolder(folder.id)\r\n ? 'file.folder'\r\n : 'file.folder-closed';\r\n }\r\n\r\n getFileIcon(entry: DocumentLibraryFileEntry): MTIcon {\r\n const extension = this.getFileExtension(entry);\r\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(extension)) {\r\n return 'image.image-03';\r\n }\r\n\r\n if (['ts', 'js', 'json', 'html', 'css', 'scss'].includes(extension)) {\r\n return 'dev.file-code-02';\r\n }\r\n\r\n if (entry.contentType.toLowerCase().includes('pdf')) {\r\n return 'file.file-06';\r\n }\r\n\r\n return 'file.file-01';\r\n }\r\n\r\n private getFileAvatarPalette(entry: DocumentLibraryFileEntry): {\r\n background: string;\r\n color: string;\r\n } {\r\n const extension = this.getFileExtension(entry);\r\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(extension)) {\r\n return {\r\n background: '#d1fae5',\r\n color: '#047857',\r\n };\r\n }\r\n\r\n if (entry.contentType.toLowerCase().includes('pdf')) {\r\n return {\r\n background: '#ffe4e6',\r\n color: '#be123c',\r\n };\r\n }\r\n\r\n if (['xls', 'xlsx', 'csv'].includes(extension)) {\r\n return {\r\n background: '#dcfce7',\r\n color: '#15803d',\r\n };\r\n }\r\n\r\n if (['doc', 'docx'].includes(extension)) {\r\n return {\r\n background: '#dbeafe',\r\n color: '#1d4ed8',\r\n };\r\n }\r\n\r\n return {\r\n background: '#f1f5f9',\r\n color: '#334155',\r\n };\r\n }\r\n\r\n getHomeAvatarStyle(): string {\r\n return `\r\n --p-avatar-background: var(--p-primary-50);\r\n --p-avatar-color: var(--p-primary-700);\r\n `;\r\n }\r\n\r\n getFolderAvatarStyle(folder: DocumentLibraryFolder): string {\r\n if (!folder.isEditableFolder && folder.isPrimaryFolder) {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-primary-color) 12%, white);\r\n --p-avatar-color: color-mix(in srgb, var(--p-primary-color) 78%, black);\r\n `;\r\n }\r\n\r\n if (!folder.isEditableFolder) {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-surface-500) 14%, white);\r\n --p-avatar-color: color-mix(in srgb, var(--p-surface-900) 72%, black);\r\n `;\r\n }\r\n\r\n return `\r\n --p-avatar-background: #fef3c7;\r\n --p-avatar-color: #d97706;\r\n `;\r\n }\r\n\r\n getFileAvatarStyle(entry: DocumentLibraryFileEntry): string {\r\n const palette = this.getFileAvatarPalette(entry);\r\n\r\n return `\r\n --p-avatar-background: ${palette.background};\r\n --p-avatar-color: ${palette.color};\r\n `;\r\n }\r\n\r\n getActionAvatarStyle(): string {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-surface-100) 88%, white);\r\n --p-avatar-color: var(--p-surface-500);\r\n `;\r\n }\r\n\r\n getActionPopoverStyle(): Record<string, string> {\r\n return {\r\n width: '15rem',\r\n };\r\n }\r\n\r\n getActionItemButtonClass(item: DocumentLibraryActionItem): string {\r\n const baseClass =\r\n 'flex w-full cursor-pointer items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-sm text-left transition-colors';\r\n\r\n if (item.disabled) {\r\n return `${baseClass} cursor-not-allowed opacity-45`;\r\n }\r\n\r\n if (item.severity === 'danger') {\r\n return `${baseClass} text-red-600 hover:bg-red-50`;\r\n }\r\n\r\n return `${baseClass} text-color hover:bg-surface`;\r\n }\r\n\r\n getActionItemAvatarStyle(item: DocumentLibraryActionItem): string {\r\n if (item.disabled) {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-surface-200) 76%, white);\r\n --p-avatar-color: var(--p-surface-400);\r\n `;\r\n }\r\n\r\n if (item.severity === 'danger') {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, #ef4444 12%, white);\r\n --p-avatar-color: #dc2626;\r\n `;\r\n }\r\n\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-primary-color) 10%, white);\r\n --p-avatar-color: color-mix(in srgb, var(--p-primary-color) 82%, black);\r\n `;\r\n }\r\n\r\n getVisibleActionItems(\r\n items: DocumentLibraryActionItem[],\r\n ): DocumentLibraryActionItem[] {\r\n return items.filter((item) => item.visible !== false && !item.separator);\r\n }\r\n\r\n hasVisibleActionItems(items: DocumentLibraryActionItem[]): boolean {\r\n return this.getVisibleActionItems(items).length > 0;\r\n }\r\n\r\n trackActionItem(\r\n item: DocumentLibraryActionItem,\r\n index: number,\r\n ): string | number {\r\n return item.id ?? item.label ?? index;\r\n }\r\n\r\n getIconButtonClass(): string {\r\n return 'inline-flex items-center justify-center border-0 bg-transparent p-0 cursor-pointer disabled:cursor-not-allowed disabled:opacity-55';\r\n }\r\n\r\n getRailItemClass(active: boolean): string {\r\n const baseClass =\r\n 'w-full rounded-xl text-left text-sm font-medium text-color transition-[background-color,color,box-shadow] duration-150 hover:bg-[color-mix(in_srgb,var(--p-primary-color)_8%,transparent)]';\r\n\r\n if (!active) {\r\n return baseClass;\r\n }\r\n\r\n return `${baseClass} bg-[color-mix(in_srgb,var(--p-primary-color)_14%,white)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--p-primary-color)_20%,transparent)] text-[color-mix(in_srgb,var(--p-primary-color)_82%,black)]`;\r\n }\r\n\r\n getFileExtension(entry: DocumentLibraryFileEntry): string {\r\n return getDocumentLibraryFileExtension(entry.fileName);\r\n }\r\n\r\n formatFileSize(size: number): string {\r\n return formatDocumentLibraryFileSize(size);\r\n }\r\n\r\n onBreadcrumbClick(item: BreadcrumbItem): void {\r\n const targetItem = item as DocumentLibraryBreadcrumbItem;\r\n if (targetItem.folderId == null) {\r\n void this.goToRoot();\r\n return;\r\n }\r\n\r\n const targetFolder =\r\n this.folderRegistry().get(this.toFolderKey(targetItem.folderId)) ?? null;\r\n if (!targetFolder) {\r\n void this.goToRoot();\r\n return;\r\n }\r\n\r\n void this.openFolder(targetFolder);\r\n }\r\n\r\n isBusy(key: string): boolean {\r\n return this.busyKeys().has(key);\r\n }\r\n\r\n createFolderBusyKey(folderId: DocumentLibraryFolderId | 'root'): string {\r\n return `create-folder:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n renameFolderBusyKey(folderId: DocumentLibraryFolderId): string {\r\n return `rename-folder:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n loadFolderBusyKey(folderId: DocumentLibraryFolderId): string {\r\n return `load-folder:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n private openFolderDialog(\r\n mode: DocumentLibraryFolderDialogMode,\r\n options: {\r\n contextLabel: string;\r\n initialName: string;\r\n onSubmit: (folderName: string) => Promise<void>;\r\n },\r\n ): void {\r\n const ref = this.modalService.openModal(\r\n DocumentLibraryFolderDialog,\r\n 'dialog',\r\n {\r\n header:\r\n mode === 'create'\r\n ? this.translate('modals.folder.headerCreate')\r\n : this.translate('modals.folder.headerRename'),\r\n styleClass: '!w-[28rem]',\r\n inputValues: {\r\n mode,\r\n contextLabel: options.contextLabel,\r\n initialName: options.initialName,\r\n },\r\n },\r\n );\r\n\r\n if (!ref) {\r\n return;\r\n }\r\n\r\n ref.onClose.subscribe(\r\n (result: DocumentLibraryFolderDialogResult | null) => {\r\n if (result?.folderName) {\r\n void options.onSubmit(result.folderName);\r\n }\r\n },\r\n );\r\n }\r\n\r\n private async loadFolderEntries(\r\n folderId: DocumentLibraryFolderId,\r\n ): Promise<void> {\r\n try {\r\n await this.fetchFolderEntries(folderId);\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.loadFolderContents'));\r\n }\r\n }\r\n\r\n private async fetchFolderEntries(\r\n folderId: DocumentLibraryFolderId,\r\n ): Promise<DocumentLibraryEntry[]> {\r\n const folderKey = this.toFolderKey(folderId);\r\n const entries = await this.withBusy(\r\n this.loadFolderBusyKey(folderId),\r\n async () =>\r\n (\r\n await this.resolveAsync(\r\n this.api.loadFolderEntries(\r\n this.levelId(),\r\n folderId,\r\n this.requestContext(),\r\n ),\r\n )\r\n ).map((entry) => normalizeDocumentLibraryEntry(entry)),\r\n );\r\n\r\n const next = new Map(this.folderEntriesCache());\r\n next.set(folderKey, entries);\r\n this.folderEntriesCache.set(next);\r\n\r\n const childFolders = entries\r\n .filter((entry): entry is DocumentLibraryFolderEntry => entry.isFolder)\r\n .map((entry) => normalizeDocumentLibraryFolder(entry));\r\n\r\n this.upsertFolders(childFolders);\r\n return entries;\r\n }\r\n\r\n private async ensureFolderEntries(\r\n folderId: DocumentLibraryFolderId,\r\n ): Promise<DocumentLibraryEntry[]> {\r\n return (\r\n this.folderEntriesCache().get(this.toFolderKey(folderId)) ??\r\n (await this.fetchFolderEntries(folderId))\r\n );\r\n }\r\n\r\n private async attachUploadedDocuments(\r\n folder: DocumentLibraryFolder,\r\n uploads: DocumentLibraryUploadDialogResult['uploads'],\r\n ): Promise<void> {\r\n const levelDataId = this.levelDataId();\r\n if (levelDataId == null || !uploads.length) {\r\n return;\r\n }\r\n\r\n try {\r\n const attached: DocumentLibraryFileEntry[] = [];\r\n const failures: string[] = [];\r\n const uploadFolderCache = new Map<string, DocumentLibraryFolder>();\r\n const hydratedTargetFolders = new Set<string>();\r\n\r\n await this.withBusy(this.uploadBusyKey(folder.id), async () => {\r\n for (const upload of uploads) {\r\n if (!upload.documentGuid) {\r\n continue;\r\n }\r\n\r\n try {\r\n const targetFolder = await this.resolveUploadTargetFolder(\r\n folder,\r\n upload.relativePath,\r\n uploadFolderCache,\r\n );\r\n const targetFolderKey = this.toFolderKey(targetFolder.id);\r\n\r\n if (!hydratedTargetFolders.has(targetFolderKey)) {\r\n await this.ensureFolderEntries(targetFolder.id);\r\n hydratedTargetFolders.add(targetFolderKey);\r\n }\r\n\r\n const uploaded = normalizeDocumentLibraryFile(\r\n await this.resolveAsync(\r\n this.api.addDocument(\r\n this.levelId(),\r\n levelDataId,\r\n {\r\n folderId: targetFolder.id,\r\n documentGuid: upload.documentGuid,\r\n },\r\n this.requestContext(),\r\n ),\r\n ),\r\n );\r\n\r\n attached.push(uploaded);\r\n this.patchFolderEntries(targetFolder.id, (entries) =>\r\n this.mergeEntriesWithUploadedFiles(entries, [uploaded]),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'upload-file',\r\n target: uploaded,\r\n });\r\n } catch {\r\n failures.push(upload.fileName);\r\n }\r\n }\r\n });\r\n\r\n if (attached.length) {\r\n this.toast.success(\r\n attached.length === 1\r\n ? this.translate('messages.fileAttached', {\r\n name: attached[0].fileName,\r\n })\r\n : this.translate('messages.filesAttached', {\r\n count: attached.length,\r\n }),\r\n );\r\n }\r\n\r\n if (failures.length) {\r\n throw new Error(\r\n failures.length === 1\r\n ? this.translate('errors.attachFile', {\r\n name: failures[0],\r\n })\r\n : this.translate('errors.attachFiles', {\r\n count: failures.length,\r\n }),\r\n );\r\n }\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.attachUploadedFiles'));\r\n }\r\n }\r\n\r\n private async createFolderInBackend(\r\n parent: DocumentLibraryFolder | null,\r\n folderName: string,\r\n ): Promise<DocumentLibraryFolder> {\r\n const trimmedName = folderName.trim();\r\n const parentId = parent?.id ?? null;\r\n\r\n if (\r\n parentId != null &&\r\n !this.folderEntriesCache().has(this.toFolderKey(parentId))\r\n ) {\r\n await this.ensureFolderEntries(parentId);\r\n }\r\n\r\n const created = await this.withBusy(\r\n this.createFolderBusyKey(parentId ?? 'root'),\r\n async () =>\r\n normalizeDocumentLibraryFolder(\r\n await this.resolveAsync(\r\n this.api.createFolder(\r\n this.levelId(),\r\n this.levelDataId(),\r\n {\r\n parentId,\r\n folderName: trimmedName,\r\n },\r\n this.requestContext(),\r\n ),\r\n ),\r\n ),\r\n );\r\n\r\n this.upsertFolders([created]);\r\n this.insertFolderIntoParent(created);\r\n this.expandParentForNewFolder(created.parentId);\r\n\r\n return created;\r\n }\r\n\r\n private insertFolderIntoParent(folder: DocumentLibraryFolder): void {\r\n if (folder.parentId == null) {\r\n this.roots.update((folders) => this.sortFolders([...folders, folder]));\r\n return;\r\n }\r\n\r\n this.patchFolderEntries(folder.parentId, (entries) =>\r\n this.sortEntries([...entries, toDocumentLibraryFolderEntry(folder)]),\r\n );\r\n }\r\n\r\n private replaceFolder(folder: DocumentLibraryFolder): void {\r\n this.upsertFolders([folder]);\r\n\r\n if (folder.parentId == null) {\r\n this.roots.update((folders) =>\r\n this.sortFolders(\r\n folders.map((item) =>\r\n this.toFolderKey(item.id) === this.toFolderKey(folder.id)\r\n ? folder\r\n : item,\r\n ),\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n this.patchFolderEntries(folder.parentId, (entries) =>\r\n this.sortEntries(\r\n entries.map((entry) =>\r\n entry.isFolder &&\r\n this.toFolderKey(entry.id) === this.toFolderKey(folder.id)\r\n ? toDocumentLibraryFolderEntry(folder)\r\n : entry,\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n private removeFolderTree(folderId: DocumentLibraryFolderId): Set<FolderKey> {\r\n const folderKey = this.toFolderKey(folderId);\r\n const parentId = this.folderRegistry().get(folderKey)?.parentId ?? null;\r\n const folderKeys = new Set(this.collectFolderKeys(folderId));\r\n const nextRegistry = new Map(this.folderRegistry());\r\n const nextCache = new Map(this.folderEntriesCache());\r\n const nextExpanded = new Set(this.expandedFolderKeys());\r\n\r\n folderKeys.forEach((key) => {\r\n nextRegistry.delete(key);\r\n nextCache.delete(key);\r\n nextExpanded.delete(key);\r\n });\r\n\r\n this.folderRegistry.set(nextRegistry);\r\n this.folderEntriesCache.set(nextCache);\r\n this.expandedFolderKeys.set(nextExpanded);\r\n\r\n this.roots.update((folders) =>\r\n folders.filter(\r\n (folder) => this.toFolderKey(folder.id) !== this.toFolderKey(folderId),\r\n ),\r\n );\r\n\r\n if (parentId != null) {\r\n this.patchFolderEntries(parentId, (entries) =>\r\n entries.filter(\r\n (entry) =>\r\n !(entry.isFolder && this.toFolderKey(entry.id) === folderKey),\r\n ),\r\n );\r\n }\r\n\r\n return folderKeys;\r\n }\r\n\r\n private patchFolderEntries(\r\n folderId: DocumentLibraryFolderId | FolderKey,\r\n updater: (entries: DocumentLibraryEntry[]) => DocumentLibraryEntry[],\r\n ): void {\r\n const folderKey = this.toFolderKey(folderId);\r\n const next = new Map(this.folderEntriesCache());\r\n const current = next.get(folderKey) ?? [];\r\n next.set(folderKey, updater(current));\r\n this.folderEntriesCache.set(next);\r\n }\r\n\r\n private upsertFolders(folders: DocumentLibraryFolder[]): void {\r\n const next = new Map(this.folderRegistry());\r\n folders.forEach((folder) => {\r\n next.set(this.toFolderKey(folder.id), folder);\r\n });\r\n this.folderRegistry.set(next);\r\n }\r\n\r\n private expandFolderPath(folder: DocumentLibraryFolder): void {\r\n const next = new Set(this.expandedFolderKeys());\r\n let current: DocumentLibraryFolder | null = folder;\r\n\r\n while (current) {\r\n next.add(this.toFolderKey(current.id));\r\n current = this.getParentFolder(current.id);\r\n }\r\n\r\n this.expandedFolderKeys.set(next);\r\n }\r\n\r\n private expandParentForNewFolder(\r\n parentId: DocumentLibraryFolderId | null,\r\n ): void {\r\n if (parentId == null) {\r\n return;\r\n }\r\n\r\n this.expandedFolderKeys.update((state) => {\r\n const next = new Set(state);\r\n next.add(this.toFolderKey(parentId));\r\n return next;\r\n });\r\n }\r\n\r\n private syncSelectedFolderEntry(folder: DocumentLibraryFolder): void {\r\n const selectedEntry = this.selectedEntry();\r\n if (\r\n !selectedEntry?.isFolder ||\r\n this.toFolderKey(selectedEntry.id) !== this.toFolderKey(folder.id)\r\n ) {\r\n return;\r\n }\r\n\r\n const nextEntry = toDocumentLibraryFolderEntry(folder);\r\n this.selectedEntry.set(nextEntry);\r\n this.selectionChanged.emit({\r\n folder: this.selectedFolder(),\r\n entry: nextEntry,\r\n });\r\n }\r\n\r\n private getFolderTrail(\r\n folderId: DocumentLibraryFolderId | null,\r\n ): DocumentLibraryFolder[] {\r\n const trail: DocumentLibraryFolder[] = [];\r\n let currentId = folderId;\r\n\r\n while (currentId != null) {\r\n const folder = this.folderRegistry().get(this.toFolderKey(currentId));\r\n if (!folder) {\r\n break;\r\n }\r\n\r\n trail.unshift(folder);\r\n currentId = folder.parentId;\r\n }\r\n\r\n return trail;\r\n }\r\n\r\n private getParentFolder(\r\n folderId: DocumentLibraryFolderId,\r\n ): DocumentLibraryFolder | null {\r\n const folder = this.folderRegistry().get(this.toFolderKey(folderId));\r\n if (folder?.parentId == null) {\r\n return null;\r\n }\r\n\r\n return this.folderRegistry().get(this.toFolderKey(folder.parentId)) ?? null;\r\n }\r\n\r\n private async resolveUploadTargetFolder(\r\n folder: DocumentLibraryFolder,\r\n relativePath: string,\r\n cache: Map<string, DocumentLibraryFolder>,\r\n ): Promise<DocumentLibraryFolder> {\r\n const segments = this.getUploadFolderSegments(relativePath);\r\n if (!segments.length) {\r\n return folder;\r\n }\r\n\r\n let currentFolder = folder;\r\n\r\n for (const segment of segments) {\r\n const cacheKey = `${this.toFolderKey(currentFolder.id)}::${segment.toLowerCase()}`;\r\n const cachedFolder = cache.get(cacheKey);\r\n\r\n if (cachedFolder) {\r\n currentFolder = cachedFolder;\r\n continue;\r\n }\r\n\r\n const nextFolder = await this.findOrCreateChildFolder(\r\n currentFolder,\r\n segment,\r\n );\r\n\r\n cache.set(cacheKey, nextFolder);\r\n currentFolder = nextFolder;\r\n }\r\n\r\n return currentFolder;\r\n }\r\n\r\n private async findOrCreateChildFolder(\r\n parent: DocumentLibraryFolder,\r\n folderName: string,\r\n ): Promise<DocumentLibraryFolder> {\r\n const childFolders = await this.ensureFolderEntries(parent.id);\r\n const existingFolder = childFolders.find(\r\n (entry): entry is DocumentLibraryFolderEntry =>\r\n entry.isFolder && this.folderNameMatches(entry, folderName),\r\n );\r\n\r\n if (existingFolder) {\r\n const normalizedFolder = normalizeDocumentLibraryFolder(existingFolder);\r\n\r\n if (!normalizedFolder.isEditableFolder) {\r\n throw new Error(\r\n this.translate('errors.protectedFolderUpload', {\r\n name: this.getFolderLabel(normalizedFolder),\r\n }),\r\n );\r\n }\r\n\r\n return normalizedFolder;\r\n }\r\n\r\n return this.createFolderInBackend(parent, folderName);\r\n }\r\n\r\n private folderNameMatches(\r\n folder: DocumentLibraryFolder,\r\n folderName: string,\r\n ): boolean {\r\n const normalizedTarget = folderName.trim().toLocaleLowerCase();\r\n const label = normalizeDocumentLibraryLabel(folder.label);\r\n\r\n return [label.display, label.en, label.ar]\r\n .filter(Boolean)\r\n .some((value) => value!.trim().toLocaleLowerCase() === normalizedTarget);\r\n }\r\n\r\n private getUploadFolderSegments(relativePath: string): string[] {\r\n return relativePath\r\n .split(/[\\\\/]/)\r\n .map((segment) => segment.trim())\r\n .filter(Boolean)\r\n .slice(0, -1);\r\n }\r\n\r\n private mergeEntriesWithUploadedFiles(\r\n entries: DocumentLibraryEntry[],\r\n uploaded: DocumentLibraryFileEntry[],\r\n ): DocumentLibraryEntry[] {\r\n const uploadedIds = new Set(uploaded.map((file) => file.id));\r\n return this.sortEntries([\r\n ...entries.filter((entry) => entry.isFolder),\r\n ...entries.filter(\r\n (entry): entry is DocumentLibraryFileEntry =>\r\n !entry.isFolder && !uploadedIds.has(entry.id),\r\n ),\r\n ...uploaded,\r\n ]);\r\n }\r\n\r\n private sortFolders(\r\n folders: DocumentLibraryFolder[],\r\n ): DocumentLibraryFolder[] {\r\n return [...folders].sort((left, right) =>\r\n this.getFolderLabel(left).localeCompare(this.getFolderLabel(right)),\r\n );\r\n }\r\n\r\n private sortEntries(entries: DocumentLibraryEntry[]): DocumentLibraryEntry[] {\r\n return [...entries].sort((left, right) => {\r\n if (left.isFolder !== right.isFolder) {\r\n return left.isFolder ? 1 : -1;\r\n }\r\n\r\n return this.getEntryTitle(left).localeCompare(this.getEntryTitle(right));\r\n });\r\n }\r\n\r\n private getTargetMenuItems(\r\n target: DocumentLibraryFolder | DocumentLibraryEntry,\r\n ): DocumentLibraryActionItem[] {\r\n return this.isEntryTarget(target)\r\n ? this.getEntryMenuItems(target)\r\n : this.getFolderMenuItems(target);\r\n }\r\n\r\n private isEntryTarget(\r\n target: DocumentLibraryFolder | DocumentLibraryEntry,\r\n ): target is DocumentLibraryEntry {\r\n return 'isFolder' in target;\r\n }\r\n\r\n private isSelectedFolderInTree(folderKeys: Set<FolderKey>): boolean {\r\n const selectedFolderId = this.selectedFolderId();\r\n return (\r\n selectedFolderId != null &&\r\n folderKeys.has(this.toFolderKey(selectedFolderId))\r\n );\r\n }\r\n\r\n private clearSelectionForRemovedFolders(folderKeys: Set<FolderKey>): void {\r\n const selectedEntry = this.selectedEntry();\r\n if (\r\n !selectedEntry?.isFolder ||\r\n !folderKeys.has(this.toFolderKey(selectedEntry.id))\r\n ) {\r\n return;\r\n }\r\n\r\n this.selectedEntry.set(null);\r\n this.selectionChanged.emit({\r\n folder: this.selectedFolder(),\r\n entry: null,\r\n });\r\n }\r\n\r\n private canRenameFolder(folder: DocumentLibraryFolder): boolean {\r\n return this.levelDataId() != null && !!folder.isNameEditable;\r\n }\r\n\r\n private collectFolderKeys(folderId: DocumentLibraryFolderId): FolderKey[] {\r\n const targetKey = this.toFolderKey(folderId);\r\n const collected = [targetKey];\r\n const queue = [targetKey];\r\n\r\n while (queue.length > 0) {\r\n const current = queue.shift()!;\r\n this.folderRegistry().forEach((folder, key) => {\r\n if (\r\n folder.parentId != null &&\r\n this.toFolderKey(folder.parentId) === current &&\r\n !collected.includes(key)\r\n ) {\r\n collected.push(key);\r\n queue.push(key);\r\n }\r\n });\r\n }\r\n\r\n return collected;\r\n }\r\n\r\n private toFolderKey(\r\n folderId: DocumentLibraryFolderId | FolderKey,\r\n ): FolderKey {\r\n return String(folderId);\r\n }\r\n\r\n private deleteFolderBusyKey(folderId: DocumentLibraryFolderId): string {\r\n return `delete-folder:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n private deleteFileBusyKey(fileId: string): string {\r\n return `delete-file:${fileId}`;\r\n }\r\n\r\n private uploadBusyKey(folderId: DocumentLibraryFolderId): string {\r\n return `upload-file:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n private async withBusy<T>(key: string, task: () => Promise<T>): Promise<T> {\r\n this.busyKeys.update((state) => {\r\n const next = new Set(state);\r\n next.add(key);\r\n return next;\r\n });\r\n\r\n try {\r\n return await task();\r\n } finally {\r\n this.busyKeys.update((state) => {\r\n const next = new Set(state);\r\n next.delete(key);\r\n return next;\r\n });\r\n }\r\n }\r\n\r\n private async resolveAsync<T>(\r\n value: DocumentLibraryAsyncResult<T>,\r\n ): Promise<T> {\r\n if (isObservable(value)) {\r\n return firstValueFrom(value);\r\n }\r\n\r\n return Promise.resolve(value);\r\n }\r\n\r\n private handleError(error: unknown, fallbackMessage: string): void {\r\n const message =\r\n error instanceof Error\r\n ? error.message\r\n : typeof error === 'string'\r\n ? error\r\n : fallbackMessage;\r\n this.error.set(message);\r\n this.toast.error(message);\r\n this.errored.emit(message);\r\n }\r\n\r\n private translate(\r\n key: string,\r\n params?: Record<string, string | number | null | undefined>,\r\n ): string {\r\n this.activeLanguage();\r\n return this.transloco.translate(`document-library.${key}`, params);\r\n }\r\n\r\n private showPopover(popover: Popover | undefined, event: Event): void {\r\n if (!popover) {\r\n return;\r\n }\r\n\r\n popover.hide();\r\n setTimeout(() => popover.show(event), 0);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'document-library'\">\r\n <div class=\"flex h-full min-h-[42rem] flex-col gap-4\">\r\n <div class=\"grid gap-4 xl:grid-cols-[19rem_minmax(0,1fr)]\">\r\n <mt-card class=\"h-full\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full flex-col\">\r\n <div class=\"border-b border-surface px-5 py-5\">\r\n <div class=\"flex items-start justify-between gap-3\">\r\n <div>\r\n <div class=\"text-base font-semibold\">\r\n {{ resolvedTitle() }}\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n [class]=\"getIconButtonClass()\"\r\n [attr.aria-label]=\"\r\n t('aria.refresh', { title: resolvedTitle() })\r\n \"\r\n [disabled]=\"isBusy('roots')\"\r\n (click)=\"reload()\"\r\n >\r\n <mt-avatar\r\n icon=\"arrow.refresh-cw-01\"\r\n [shape]=\"'circle'\"\r\n [style]=\"getActionAvatarStyle()\"\r\n />\r\n </button>\r\n </div>\r\n <div class=\"mt-3\">\r\n <mt-text-field\r\n [ngModel]=\"railSearch()\"\r\n (ngModelChange)=\"railSearch.set($event)\"\r\n icon=\"general.search-lg\"\r\n [placeholder]=\"t('searchFolders')\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto px-2.5 py-2.5\">\r\n <button\r\n type=\"button\"\r\n [class]=\"\r\n getRailItemClass(selectedFolderId() === null) +\r\n ' mb-0.5 flex items-center gap-2.5 px-2.5 py-2'\r\n \"\r\n (click)=\"goToRoot()\"\r\n >\r\n <mt-avatar\r\n class=\"[&_.p-avatar]:h-9 [&_.p-avatar]:w-9 [&_.p-avatar]:text-sm\"\r\n icon=\"general.home-05\"\r\n size=\"small\"\r\n [shape]=\"'square'\"\r\n [style]=\"getHomeAvatarStyle()\"\r\n />\r\n <span class=\"truncate\">{{ resolvedTitle() }}</span>\r\n </button>\r\n\r\n <ng-template #folderNodeTpl let-folder let-depth=\"depth\">\r\n <div class=\"mt-px\">\r\n <div\r\n class=\"flex items-center gap-1.5 rounded-lg\"\r\n [style.padding-inline-start.rem]=\"0.1 + depth * 0.72\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-color transition hover:bg-surface\"\r\n [class.invisible]=\"\r\n !folderHasChildFolders(folder.id) &&\r\n !hasLoadedChildren(folder.id)\r\n \"\r\n (click)=\"toggleExpanded(folder)\"\r\n >\r\n <mt-icon\r\n class=\"text-[0.85rem]\"\r\n [icon]=\"\r\n isExpanded(folder.id)\r\n ? 'arrow.chevron-down'\r\n : 'arrow.chevron-right'\r\n \"\r\n />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n [class]=\"\r\n getRailItemClass(isSelectedFolder(folder.id)) +\r\n ' flex min-w-0 flex-1 items-center gap-2.5 px-2.5 py-2'\r\n \"\r\n (click)=\"onRailFolderClick(folder)\"\r\n (contextmenu)=\"openContextMenu($event, folder)\"\r\n >\r\n <mt-avatar\r\n class=\"shrink-0 [&_.p-avatar]:h-9 [&_.p-avatar]:w-9 [&_.p-avatar]:text-sm\"\r\n size=\"small\"\r\n [icon]=\"getFolderIcon(folder)\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFolderAvatarStyle(folder)\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">\r\n {{ getFolderLabel(folder) }}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n @if (isExpanded(folder.id)) {\r\n <div class=\"space-y-px\">\r\n @for (\r\n child of foldersForRail(folder.id);\r\n track child.id\r\n ) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n folderNodeTpl;\r\n context: { $implicit: child, depth: depth + 1 }\r\n \"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n @for (folder of visibleRoots(); track folder.id) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n folderNodeTpl;\r\n context: { $implicit: folder, depth: 0 }\r\n \"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <div class=\"flex min-w-0 flex-col gap-4\">\r\n <mt-card>\r\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\r\n <div class=\"min-w-0 flex-1\">\r\n <mt-breadcrumb\r\n [items]=\"breadcrumbs()\"\r\n (onItemClick)=\"onBreadcrumbClick($event)\"\r\n />\r\n <div class=\"mt-2 flex items-start gap-3\">\r\n <mt-avatar\r\n [icon]=\"\r\n selectedFolder()\r\n ? getFolderIcon(selectedFolder()!)\r\n : 'general.home-05'\r\n \"\r\n size=\"normal\"\r\n [shape]=\"'square'\"\r\n [style]=\"\r\n selectedFolder()\r\n ? getFolderAvatarStyle(selectedFolder()!)\r\n : getHomeAvatarStyle()\r\n \"\r\n />\r\n <div class=\"min-w-0\">\r\n <div class=\"truncate text-lg font-semibold\">\r\n {{ currentFolderTitle() }}\r\n </div>\r\n <div class=\"truncate text-sm text-muted-color\">\r\n {{ currentFolderSubtitle() }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-wrap items-center gap-2 self-start\">\r\n @if (hasVisibleActionItems(addMenuItems())) {\r\n <mt-button\r\n [label]=\"t('actions.add')\"\r\n icon=\"general.plus\"\r\n size=\"small\"\r\n (onClick)=\"openAddPopover($event)\"\r\n />\r\n <p-popover\r\n #addPopover\r\n [style]=\"getActionPopoverStyle()\"\r\n appendTo=\"body\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n actionListTpl;\r\n context: { items: addMenuItems(), popover: addPopover }\r\n \"\r\n />\r\n </p-popover>\r\n }\r\n\r\n @if (\r\n selectedFolder() &&\r\n hasVisibleActionItems(currentFolderMenuItems())\r\n ) {\r\n <button\r\n type=\"button\"\r\n [class]=\"getIconButtonClass()\"\r\n [attr.aria-label]=\"t('aria.folderActions')\"\r\n (click)=\"openFolderPopover($event)\"\r\n >\r\n <mt-avatar\r\n icon=\"general.dots-horizontal\"\r\n [shape]=\"'circle'\"\r\n [style]=\"getActionAvatarStyle()\"\r\n />\r\n </button>\r\n <p-popover\r\n #folderPopover\r\n [style]=\"getActionPopoverStyle()\"\r\n appendTo=\"body\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n actionListTpl;\r\n context: {\r\n items: currentFolderMenuItems(),\r\n popover: folderPopover,\r\n }\r\n \"\r\n />\r\n </p-popover>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (error()) {\r\n <div\r\n class=\"mt-4 rounded-2xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700\"\r\n >\r\n {{ error() }}\r\n </div>\r\n }\r\n </mt-card>\r\n\r\n <mt-card class=\"min-w-0\">\r\n <div class=\"grid gap-4 xl:grid-cols-[minmax(0,1fr)_18rem]\">\r\n <div class=\"min-w-0\">\r\n <mt-table\r\n [columns]=\"columns()\"\r\n [data]=\"tableRows()\"\r\n [loading]=\"\r\n selectedFolderId() === null\r\n ? isBusy('roots')\r\n : isBusy(loadFolderBusyKey(selectedFolderId()!))\r\n \"\r\n [clickableRows]=\"true\"\r\n (rowClick)=\"onRowClick($event)\"\r\n >\r\n <ng-template #empty>\r\n <div class=\"flex flex-col items-center gap-3 py-10\">\r\n <mt-avatar\r\n icon=\"file.folder-question\"\r\n size=\"large\"\r\n [shape]=\"'square'\"\r\n [style]=\"getHomeAvatarStyle()\"\r\n />\r\n <div class=\"text-base font-semibold\">\r\n {{ resolvedEmptyTitle() }}\r\n </div>\r\n <div class=\"max-w-md text-center text-sm text-muted-color\">\r\n {{ resolvedEmptyDescription() }}\r\n </div>\r\n @if (\r\n canCreateFolderInSelection() ||\r\n canUploadIntoCurrentFolder()\r\n ) {\r\n <div class=\"flex flex-wrap justify-center gap-2\">\r\n @if (canCreateFolderInSelection()) {\r\n <mt-button\r\n [label]=\"t('actions.newFolder')\"\r\n icon=\"file.folder-plus\"\r\n (onClick)=\"openCreateFolderDialog(selectedFolder())\"\r\n />\r\n }\r\n @if (canUploadIntoCurrentFolder()) {\r\n <mt-button\r\n [label]=\"t('actions.uploadFile')\"\r\n icon=\"general.upload-01\"\r\n [outlined]=\"true\"\r\n (onClick)=\"openUploadDialog('file')\"\r\n />\r\n <mt-button\r\n [label]=\"t('actions.uploadFolder')\"\r\n icon=\"file.folder\"\r\n [outlined]=\"true\"\r\n (onClick)=\"openUploadDialog('folder')\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-table>\r\n </div>\r\n\r\n <div\r\n class=\"min-w-0 rounded-2xl border border-surface bg-surface/30 p-4\"\r\n >\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"selection.title\") }}\r\n </div>\r\n\r\n @if (selectedEntry(); as entry) {\r\n <div class=\"mt-4 space-y-4\">\r\n <div class=\"flex items-center gap-3\">\r\n @if (entry.isFolder) {\r\n <mt-avatar\r\n [icon]=\"getFolderIcon(entry)\"\r\n size=\"large\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFolderAvatarStyle(entry)\"\r\n />\r\n } @else {\r\n <mt-avatar\r\n [icon]=\"getFileIcon(entry)\"\r\n size=\"large\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFileAvatarStyle(entry)\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0\">\r\n <div class=\"truncate text-base font-semibold\">\r\n {{ getEntryTitle(entry) }}\r\n </div>\r\n <div class=\"truncate text-sm text-muted-color\">\r\n {{\r\n entry.isFolder\r\n ? t(\"selection.folder\")\r\n : t(\"selection.file\")\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (entry.isFolder) {\r\n <div class=\"grid gap-3 text-sm\">\r\n <div\r\n class=\"rounded-2xl border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.permissions\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium\">\r\n {{\r\n entry.isEditableFolder\r\n ? t(\"selection.editableArea\")\r\n : t(\"selection.systemManaged\")\r\n }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"rounded-2xl border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.rename\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium\">\r\n {{\r\n entry.isNameEditable\r\n ? t(\"selection.allowed\")\r\n : t(\"selection.protected\")\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-3 text-sm\">\r\n <div\r\n class=\"rounded-2xl border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.type\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium uppercase\">\r\n {{ getFileExtension(entry) }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"rounded-2xl border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.size\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium\">\r\n {{ formatFileSize(entry.size) }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"rounded-2xl border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.owner\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium\">\r\n {{ entry.createdBy || t(\"owner.unknown\") }}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"mt-4 text-sm text-muted-color\">\r\n {{ t(\"selection.inspectHint\") }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n\r\n <ng-template #actionListTpl let-items=\"items\" let-popover=\"popover\">\r\n <div class=\"flex flex-col gap-0.5 p-0.5\">\r\n @for (\r\n item of getVisibleActionItems(items);\r\n track trackActionItem(item, $index)\r\n ) {\r\n <button\r\n type=\"button\"\r\n [class]=\"getActionItemButtonClass(item)\"\r\n (click)=\"executePopoverItem(item, popover)\"\r\n >\r\n @if (item.icon) {\r\n <mt-avatar\r\n class=\"[&_.p-avatar]:h-8 [&_.p-avatar]:w-8 [&_.p-avatar]:text-xs\"\r\n [icon]=\"item.icon\"\r\n [shape]=\"'square'\"\r\n [style]=\"getActionItemAvatarStyle(item)\"\r\n />\r\n }\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #nameCellTpl let-row>\r\n <div\r\n class=\"flex min-w-0 items-center gap-3\"\r\n (contextmenu)=\"openContextMenu($event, row.entry)\"\r\n >\r\n @if (row.entry.isFolder) {\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"getFolderIcon(row.entry)\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFolderAvatarStyle(row.entry)\"\r\n />\r\n } @else {\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"getFileIcon(row.entry)\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFileAvatarStyle(row.entry)\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0\">\r\n <div class=\"truncate text-sm font-semibold\">\r\n {{ row.name }}\r\n </div>\r\n @if (row.entry.isFolder) {\r\n <div class=\"truncate text-xs text-muted-color\">\r\n {{\r\n row.entry.isEditableFolder\r\n ? t(\"selection.manualFolder\")\r\n : t(\"selection.protectedFolder\")\r\n }}\r\n </div>\r\n } @else {\r\n <div class=\"truncate text-xs text-muted-color uppercase\">\r\n {{ getFileExtension(row.entry) }} -\r\n {{ formatFileSize(row.entry.size) }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #updatedCellTpl let-row>\r\n @if (row.entry.isFolder) {\r\n <span class=\"text-sm text-muted-color\">-</span>\r\n } @else {\r\n <div class=\"text-sm\">\r\n {{ row.updatedAt | date: \"dd MMM, y\" }}\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #actionsCellTpl let-row>\r\n @if (hasVisibleActionItems(getEntryMenuItems(row.entry))) {\r\n <div\r\n class=\"flex w-full items-center justify-center\"\r\n data-row-click-ignore=\"true\"\r\n >\r\n <button\r\n type=\"button\"\r\n [class]=\"getIconButtonClass()\"\r\n [attr.aria-label]=\"t('aria.rowActions')\"\r\n (click)=\"rowPopover.toggle($event)\"\r\n >\r\n <mt-avatar\r\n icon=\"general.dots-vertical\"\r\n [shape]=\"'circle'\"\r\n [style]=\"getActionAvatarStyle()\"\r\n />\r\n </button>\r\n <p-popover\r\n #rowPopover\r\n [style]=\"getActionPopoverStyle()\"\r\n appendTo=\"body\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n actionListTpl;\r\n context: {\r\n items: getEntryMenuItems(row.entry),\r\n popover: rowPopover,\r\n }\r\n \"\r\n />\r\n </p-popover>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <p-popover\r\n #contextPopover\r\n [style]=\"getActionPopoverStyle()\"\r\n appendTo=\"body\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n actionListTpl;\r\n context: { items: contextMenuItems(), popover: contextPopover }\r\n \"\r\n />\r\n </p-popover>\r\n </div>\r\n</ng-container>\r\n","import type { Observable } from 'rxjs';\r\n\r\nexport type DocumentLibraryFolderId = number | string;\r\n\r\nexport interface DocumentLibraryLabel {\r\n display?: string;\r\n en?: string;\r\n ar?: string;\r\n}\r\n\r\nexport interface DocumentLibraryFolder {\r\n id: DocumentLibraryFolderId;\r\n label: DocumentLibraryLabel;\r\n parentId: DocumentLibraryFolderId | null;\r\n isPrimaryFolder?: boolean;\r\n isEditableFolder?: boolean;\r\n isNameEditable?: boolean;\r\n}\r\n\r\nexport interface DocumentLibraryFile {\r\n id: string;\r\n name?: string | null;\r\n fileName: string;\r\n contentType: string;\r\n size: number;\r\n createdBy?: string | null;\r\n created: string;\r\n path?: string | null;\r\n}\r\n\r\nexport interface DocumentLibraryFolderEntry extends DocumentLibraryFolder {\r\n isFolder: true;\r\n}\r\n\r\nexport interface DocumentLibraryFileEntry extends DocumentLibraryFile {\r\n isFolder: false;\r\n}\r\n\r\nexport type DocumentLibraryEntry =\r\n | DocumentLibraryFolderEntry\r\n | DocumentLibraryFileEntry;\r\n\r\nexport type DocumentLibraryAsyncResult<T> = T | Promise<T> | Observable<T>;\r\n\r\nexport interface DocumentLibraryCapabilities {\r\n canCreateRootFolders?: boolean;\r\n canUploadFiles?: boolean;\r\n canDownloadFiles?: boolean;\r\n canDeleteFiles?: boolean;\r\n}\r\n\r\nexport interface DocumentLibraryCreateFolderRequest {\r\n parentId: DocumentLibraryFolderId | null;\r\n folderName: string;\r\n}\r\n\r\nexport interface DocumentLibraryRenameFolderRequest {\r\n folderId: DocumentLibraryFolderId;\r\n folderName: string;\r\n}\r\n\r\nexport interface DocumentLibraryDeleteFolderRequest {\r\n folderId: DocumentLibraryFolderId;\r\n}\r\n\r\nexport interface DocumentLibraryAddDocumentRequest {\r\n folderId: DocumentLibraryFolderId;\r\n documentGuid: string;\r\n}\r\n\r\nexport interface DocumentLibraryDeleteFileRequest {\r\n fileId: string;\r\n}\r\n\r\nexport interface DocumentLibraryDownloadFileRequest {\r\n file: DocumentLibraryFileEntry;\r\n}\r\n\r\nexport interface DocumentLibrarySelectionChangeEvent {\r\n folder: DocumentLibraryFolder | null;\r\n entry: DocumentLibraryEntry | null;\r\n}\r\n\r\nexport type DocumentLibraryActionName =\r\n | 'open-folder'\r\n | 'create-folder'\r\n | 'rename-folder'\r\n | 'delete-folder'\r\n | 'upload-file'\r\n | 'download-file'\r\n | 'delete-file'\r\n | 'reload';\r\n\r\nexport interface DocumentLibraryApiError {\r\n code?: string;\r\n message?: string;\r\n details?: unknown;\r\n}\r\n\r\nexport interface DocumentLibraryResponse<T> {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message?: string | null;\r\n errors?: DocumentLibraryApiError | null;\r\n data: T;\r\n cacheSession?: string;\r\n}\r\n\r\nexport interface DocumentLibraryUploadedAsset {\r\n id?: string | null;\r\n name?: string | null;\r\n fileName?: string | null;\r\n contentType?: string | null;\r\n size?: number | null;\r\n}\r\n\r\nexport interface DocumentLibraryActionEvent {\r\n action: DocumentLibraryActionName;\r\n target: DocumentLibraryFolder | DocumentLibraryEntry | null;\r\n}\r\n\r\nexport function isDocumentLibraryFolderEntry(\r\n entry: DocumentLibraryEntry | DocumentLibraryFolder | null | undefined,\r\n): entry is DocumentLibraryFolderEntry {\r\n return !!entry && 'isFolder' in entry && entry.isFolder;\r\n}\r\n\r\nexport function isDocumentLibraryFileEntry(\r\n entry: DocumentLibraryEntry | null | undefined,\r\n): entry is DocumentLibraryFileEntry {\r\n return !!entry && !entry.isFolder;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-document-library.mjs","sources":["../../../../packages/masterteam/document-library/document-library/utils/document-library.utils.ts","../../../../packages/masterteam/document-library/document-library/services/document-library.api.service.ts","../../../../packages/masterteam/document-library/document-library/modals/folder-dialog/document-library-folder-dialog.ts","../../../../packages/masterteam/document-library/document-library/modals/folder-dialog/document-library-folder-dialog.html","../../../../packages/masterteam/document-library/document-library/modals/upload-dialog/document-library-upload-dialog.ts","../../../../packages/masterteam/document-library/document-library/modals/upload-dialog/document-library-upload-dialog.html","../../../../packages/masterteam/document-library/document-library/components/document-library/document-library.ts","../../../../packages/masterteam/document-library/document-library/components/document-library/document-library.html","../../../../packages/masterteam/document-library/document-library/models/document-library.model.ts","../../../../packages/masterteam/document-library/document-library/masterteam-document-library.ts"],"sourcesContent":["import type {\r\n DocumentLibraryEntry,\r\n DocumentLibraryFile,\r\n DocumentLibraryFolder,\r\n DocumentLibraryFolderEntry,\r\n DocumentLibraryLabel,\r\n} from '../models/document-library.model';\r\n\r\nexport function normalizeDocumentLibraryLabel(\r\n label: DocumentLibraryLabel | null | undefined,\r\n): DocumentLibraryLabel {\r\n if (!label) {\r\n return { display: '' };\r\n }\r\n\r\n return {\r\n display: label.display ?? label.en ?? label.ar ?? '',\r\n en: label.en ?? label.display ?? label.ar ?? '',\r\n ar: label.ar ?? label.display ?? label.en ?? '',\r\n };\r\n}\r\n\r\nexport function getDocumentLibraryFolderLabel(\r\n folder: DocumentLibraryFolder,\r\n lang: 'en' | 'ar' = 'en',\r\n): string {\r\n const label = folder.label ?? {};\r\n return label[lang] ?? label.display ?? label.en ?? label.ar ?? '';\r\n}\r\n\r\nexport function toDocumentLibraryFolderEntry(\r\n folder: DocumentLibraryFolder,\r\n): DocumentLibraryFolderEntry {\r\n return {\r\n ...folder,\r\n isFolder: true,\r\n };\r\n}\r\n\r\nexport function normalizeDocumentLibraryFolder(\r\n folder: DocumentLibraryFolder,\r\n): DocumentLibraryFolder {\r\n return {\r\n ...folder,\r\n label: normalizeDocumentLibraryLabel(folder.label),\r\n isEditableFolder: folder.isEditableFolder ?? false,\r\n isNameEditable: folder.isNameEditable ?? false,\r\n isPrimaryFolder: folder.isPrimaryFolder ?? false,\r\n };\r\n}\r\n\r\nexport function normalizeDocumentLibraryFile(file: DocumentLibraryFile) {\r\n return {\r\n ...file,\r\n created: file.created || new Date().toISOString(),\r\n isFolder: false as const,\r\n };\r\n}\r\n\r\nexport function normalizeDocumentLibraryEntry(entry: DocumentLibraryEntry) {\r\n if (entry.isFolder) {\r\n return toDocumentLibraryFolderEntry(normalizeDocumentLibraryFolder(entry));\r\n }\r\n\r\n return normalizeDocumentLibraryFile(entry);\r\n}\r\n\r\nexport function getDocumentLibraryEntryTitle(\r\n entry: DocumentLibraryEntry,\r\n lang: 'en' | 'ar' = 'en',\r\n): string {\r\n if (entry.isFolder) {\r\n return getDocumentLibraryFolderLabel(entry, lang);\r\n }\r\n\r\n return entry.fileName;\r\n}\r\n\r\nexport function getDocumentLibraryFileExtension(fileName: string): string {\r\n const extension = fileName.split('.').pop();\r\n return (extension ?? 'file').toLowerCase();\r\n}\r\n\r\nexport function formatDocumentLibraryFileSize(size: number): string {\r\n if (!size) {\r\n return '0 B';\r\n }\r\n\r\n const units = ['B', 'KB', 'MB', 'GB'];\r\n let value = size;\r\n let unitIndex = 0;\r\n\r\n while (value >= 1024 && unitIndex < units.length - 1) {\r\n value /= 1024;\r\n unitIndex += 1;\r\n }\r\n\r\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;\r\n}\r\n","import {\r\n HttpClient,\r\n HttpContext,\r\n HttpEventType,\r\n HttpHeaders,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { REQUEST_CONTEXT } from '@masterteam/components';\r\nimport { filter, map, type Observable } from 'rxjs';\r\n\r\nimport type {\r\n DocumentLibraryAddDocumentRequest,\r\n DocumentLibraryDeleteFileRequest,\r\n DocumentLibraryDeleteFolderRequest,\r\n DocumentLibraryDownloadFileRequest,\r\n DocumentLibraryEntry,\r\n DocumentLibraryFile,\r\n DocumentLibraryFolder,\r\n DocumentLibraryFolderId,\r\n DocumentLibraryRenameFolderRequest,\r\n DocumentLibraryResponse,\r\n DocumentLibraryUploadedAsset,\r\n} from '../models/document-library.model';\r\n\r\ninterface DocumentLibraryApiFileDto {\r\n name?: string | null;\r\n id?: string | null;\r\n fileName: string;\r\n contentType: string;\r\n size: number;\r\n createdBy?: string | null;\r\n created: string;\r\n path?: string | null;\r\n}\r\n\r\ntype DocumentLibraryApiEntryDto =\r\n | (DocumentLibraryFolder & { isFolder: true })\r\n | (DocumentLibraryApiFileDto & { isFolder: false });\r\n\r\nexport interface DocumentLibraryUploadAssetEvent {\r\n progress: number;\r\n completed: boolean;\r\n asset?: DocumentLibraryUploadedAsset;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DocumentLibraryApiService {\r\n private readonly http = inject(HttpClient);\r\n private readonly defaultContext = new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n });\r\n\r\n loadRoots(\r\n levelId: number,\r\n levelDataId: number | null,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryFolder[]> {\r\n const endpoint =\r\n levelDataId == null\r\n ? `levels/${levelId}/document-library/default`\r\n : `levels/${levelId}/${levelDataId}/document-library`;\r\n\r\n return this.http\r\n .get<DocumentLibraryResponse<DocumentLibraryFolder[]>>(endpoint, {\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(map((response) => this.unwrap(response) ?? []));\r\n }\r\n\r\n loadFolderEntries(\r\n levelId: number,\r\n folderId: DocumentLibraryFolderId,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryEntry[]> {\r\n return this.http\r\n .get<DocumentLibraryResponse<DocumentLibraryApiEntryDto[]>>(\r\n `levels/${levelId}/document-library/folders/${folderId}/documents`,\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) => this.unwrap(response) ?? []),\r\n map((entries) => entries.map((entry) => this.mapEntry(entry))),\r\n );\r\n }\r\n\r\n createFolder(\r\n levelId: number,\r\n levelDataId: number | null,\r\n request: { parentId: DocumentLibraryFolderId | null; folderName: string },\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryFolder> {\r\n const endpoint =\r\n levelDataId == null\r\n ? `levels/${levelId}/document-library/folders`\r\n : `levels/${levelId}/${levelDataId}/document-library/folders`;\r\n\r\n return this.http\r\n .post<DocumentLibraryResponse<DocumentLibraryFolder>>(endpoint, request, {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-create-folder'),\r\n })\r\n .pipe(map((response) => this.unwrap(response)));\r\n }\r\n\r\n addDocument(\r\n levelId: number,\r\n levelDataId: number,\r\n request: DocumentLibraryAddDocumentRequest,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryFile> {\r\n return this.http\r\n .post<DocumentLibraryResponse<DocumentLibraryApiFileDto>>(\r\n `levels/${levelId}/${levelDataId}/document-library/folders/${request.folderId}/documents`,\r\n {\r\n documentGuid: request.documentGuid,\r\n },\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-add-document'),\r\n },\r\n )\r\n .pipe(map((response) => this.mapFile(this.unwrap(response))));\r\n }\r\n\r\n uploadAsset(\r\n file: File,\r\n endPoint: string,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryUploadAssetEvent> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n return this.http\r\n .post<DocumentLibraryResponse<DocumentLibraryUploadedAsset>>(\r\n endPoint,\r\n formData,\r\n {\r\n reportProgress: true,\r\n observe: 'events',\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((event): DocumentLibraryUploadAssetEvent | null => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n return {\r\n progress: event.total\r\n ? Math.round((100 * event.loaded) / event.total)\r\n : 0,\r\n completed: false,\r\n } satisfies DocumentLibraryUploadAssetEvent;\r\n }\r\n\r\n if (event.type === HttpEventType.Response && event.body) {\r\n const asset = this.mapUploadedAsset(this.unwrap(event.body), file);\r\n return {\r\n progress: 100,\r\n completed: true,\r\n asset,\r\n } satisfies DocumentLibraryUploadAssetEvent;\r\n }\r\n\r\n return null;\r\n }),\r\n filter(\r\n (event): event is DocumentLibraryUploadAssetEvent => event !== null,\r\n ),\r\n );\r\n }\r\n\r\n renameFolder(\r\n levelId: number,\r\n levelDataId: number,\r\n request: DocumentLibraryRenameFolderRequest,\r\n context?: HttpContext,\r\n ): Observable<DocumentLibraryFolder> {\r\n return this.http\r\n .put<DocumentLibraryResponse<DocumentLibraryFolder>>(\r\n `levels/${levelId}/${levelDataId}/document-library/folders/${request.folderId}`,\r\n {\r\n folderName: request.folderName,\r\n },\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-rename-folder'),\r\n },\r\n )\r\n .pipe(map((response) => this.unwrap(response)));\r\n }\r\n\r\n deleteFolder(\r\n levelId: number,\r\n levelDataId: number,\r\n request: DocumentLibraryDeleteFolderRequest,\r\n context?: HttpContext,\r\n ): Observable<boolean> {\r\n return this.http\r\n .delete<DocumentLibraryResponse<boolean>>(\r\n `levels/${levelId}/${levelDataId}/document-library/folders/${request.folderId}`,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-delete-folder'),\r\n },\r\n )\r\n .pipe(map((response) => this.unwrap(response)));\r\n }\r\n\r\n deleteDocument(\r\n levelId: number,\r\n levelDataId: number,\r\n request: DocumentLibraryDeleteFileRequest,\r\n context?: HttpContext,\r\n ): Observable<boolean> {\r\n return this.http\r\n .delete<DocumentLibraryResponse<boolean>>(\r\n `levels/${levelId}/${levelDataId}/document-library/documents/${request.fileId}`,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('document-library-delete-file'),\r\n },\r\n )\r\n .pipe(map((response) => this.unwrap(response)));\r\n }\r\n\r\n downloadFile(\r\n request: DocumentLibraryDownloadFileRequest,\r\n context?: HttpContext,\r\n ): Observable<void> {\r\n const endpoint = this.resolveDownloadEndpoint(\r\n request.file.path,\r\n request.file.id,\r\n );\r\n\r\n return this.http\r\n .get(endpoint, {\r\n responseType: 'blob',\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(\r\n map((blob) => {\r\n const objectUrl = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = objectUrl;\r\n link.download = request.file.fileName;\r\n link.click();\r\n window.URL.revokeObjectURL(objectUrl);\r\n }),\r\n );\r\n }\r\n\r\n private unwrap<T>(response: DocumentLibraryResponse<T>): T {\r\n if (response.code === 2) {\r\n throw new Error(\r\n response.errors?.message ||\r\n response.message ||\r\n 'Document library request failed.',\r\n );\r\n }\r\n\r\n return response.data;\r\n }\r\n\r\n private resolveContext(context?: HttpContext): HttpContext {\r\n return context ?? this.defaultContext;\r\n }\r\n\r\n private mutationHeaders(seed: string): HttpHeaders {\r\n return new HttpHeaders({\r\n 'X-Idempotency-Key': this.idempotencyKey(seed),\r\n });\r\n }\r\n\r\n private idempotencyKey(seed: string): string {\r\n if (\r\n typeof crypto !== 'undefined' &&\r\n typeof crypto.randomUUID === 'function'\r\n ) {\r\n return `${seed}-${crypto.randomUUID()}`;\r\n }\r\n\r\n return `${seed}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\r\n }\r\n\r\n private mapEntry(entry: DocumentLibraryApiEntryDto): DocumentLibraryEntry {\r\n return entry.isFolder\r\n ? entry\r\n : {\r\n ...this.mapFile(entry),\r\n isFolder: false,\r\n };\r\n }\r\n\r\n private mapFile(file: DocumentLibraryApiFileDto): DocumentLibraryFile {\r\n return {\r\n id: file.name ?? file.id ?? '',\r\n name: file.name ?? file.id ?? null,\r\n fileName: file.fileName,\r\n contentType: file.contentType,\r\n size: file.size,\r\n createdBy: file.createdBy ?? null,\r\n created: file.created,\r\n path: this.normalizeDownloadPath(file.path),\r\n };\r\n }\r\n\r\n private mapUploadedAsset(\r\n asset: DocumentLibraryUploadedAsset,\r\n file: File,\r\n ): DocumentLibraryUploadedAsset {\r\n return {\r\n id: asset.id ?? asset.name ?? file.name,\r\n name: asset.name ?? asset.id ?? file.name,\r\n fileName: asset.fileName ?? file.name,\r\n contentType: asset.contentType ?? file.type,\r\n size: asset.size ?? file.size,\r\n };\r\n }\r\n\r\n private resolveDownloadEndpoint(\r\n path: string | null | undefined,\r\n fileId: string,\r\n ): string {\r\n return this.normalizeDownloadPath(path) ?? `uploader/${fileId}`;\r\n }\r\n\r\n private normalizeDownloadPath(\r\n path: string | null | undefined,\r\n ): string | null {\r\n if (!path) {\r\n return null;\r\n }\r\n\r\n const trimmed = path.trim();\r\n if (!trimmed) {\r\n return null;\r\n }\r\n\r\n if (/^https?:\\/\\//i.test(trimmed)) {\r\n return trimmed;\r\n }\r\n\r\n if (/^\\/?api\\/uploader\\//i.test(trimmed)) {\r\n return trimmed.replace(/^\\/?api\\//i, '');\r\n }\r\n\r\n return trimmed.replace(/^\\//, '');\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, effect, inject, input, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\n\r\nexport type DocumentLibraryFolderDialogMode = 'create' | 'rename';\r\n\r\nexport interface DocumentLibraryFolderDialogResult {\r\n folderName: string;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-document-library-folder-dialog',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, Button, TextField, TranslocoDirective],\r\n templateUrl: './document-library-folder-dialog.html',\r\n})\r\nexport class DocumentLibraryFolderDialog {\r\n readonly mode = input<DocumentLibraryFolderDialogMode>('create');\r\n readonly contextLabel = input('');\r\n readonly initialName = input('');\r\n\r\n readonly modal = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n\r\n readonly folderName = signal('');\r\n\r\n constructor() {\r\n effect(() => {\r\n this.folderName.set(this.initialName());\r\n });\r\n }\r\n\r\n submit(): void {\r\n const folderName = this.folderName().trim();\r\n if (!folderName) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n folderName,\r\n } satisfies DocumentLibraryFolderDialogResult);\r\n }\r\n\r\n cancel(): void {\r\n this.ref.close(null);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'document-library.modals.folder'\">\r\n <div [class]=\"[modal.contentClass, 'flex', 'flex-col', 'gap-4', 'p-4']\">\r\n @if (mode() === \"create\") {\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"parent\") }}:\r\n <span class=\"font-medium text-color\">{{ contextLabel() }}</span>\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"renameDescription\") }}\r\n </div>\r\n }\r\n\r\n <mt-text-field\r\n [ngModel]=\"folderName()\"\r\n (ngModelChange)=\"folderName.set($event)\"\r\n [label]=\"t('folderName')\"\r\n [placeholder]=\"\r\n mode() === 'create'\r\n ? t('placeholders.create')\r\n : t('placeholders.rename')\r\n \"\r\n />\r\n </div>\r\n\r\n <div\r\n [class]=\"[\r\n modal.footerClass,\r\n 'flex',\r\n 'items-center',\r\n 'justify-end',\r\n 'gap-2',\r\n ]\"\r\n >\r\n <mt-button [label]=\"t('cancel')\" variant=\"outlined\" (onClick)=\"cancel()\" />\r\n\r\n <mt-button\r\n [label]=\"mode() === 'create' ? t('create') : t('save')\"\r\n [icon]=\"mode() === 'create' ? 'file.folder-plus' : 'general.edit-02'\"\r\n [disabled]=\"!folderName().trim()\"\r\n (onClick)=\"submit()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import { CommonModule } from '@angular/common';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { Component, computed, inject, input, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { UploadField } from '@masterteam/components/upload-field';\r\nimport { type MTIcon } from '@masterteam/icons';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\n\r\nimport { DocumentLibraryApiService } from '../../services/document-library.api.service';\r\nimport type { DocumentLibraryUploadedAsset } from '../../models/document-library.model';\r\nimport {\r\n formatDocumentLibraryFileSize,\r\n getDocumentLibraryFileExtension,\r\n} from '../../utils/document-library.utils';\r\n\r\nexport type DocumentLibraryUploadDialogMode = 'file' | 'folder';\r\n\r\nexport interface DocumentLibraryUploadDialogResultItem {\r\n documentGuid: string;\r\n fileName: string;\r\n relativePath: string;\r\n}\r\n\r\nexport interface DocumentLibraryUploadDialogResult {\r\n uploads: DocumentLibraryUploadDialogResultItem[];\r\n}\r\n\r\ntype DocumentLibraryFolderUploadItem = {\r\n id: string;\r\n file: File;\r\n relativePath: string;\r\n pathLabel: string;\r\n enabled: boolean;\r\n progress: number;\r\n uploading: boolean;\r\n uploadedAsset: DocumentLibraryUploadedAsset | null;\r\n error: string | null;\r\n};\r\n\r\n@Component({\r\n selector: 'mt-document-library-upload-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n Button,\r\n TextField,\r\n ToggleField,\r\n UploadField,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './document-library-upload-dialog.html',\r\n})\r\nexport class DocumentLibraryUploadDialog {\r\n readonly mode = input<DocumentLibraryUploadDialogMode>('file');\r\n readonly folderLabel = input('');\r\n readonly uploadEndPoint = input('uploader');\r\n readonly requestContext = input<HttpContext | undefined>(undefined);\r\n\r\n readonly modal = inject(ModalService);\r\n private readonly api = inject(DocumentLibraryApiService);\r\n private readonly ref = inject(ModalRef);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly uploadedFile = signal<DocumentLibraryUploadedAsset | null>(null);\r\n readonly folderItems = signal<DocumentLibraryFolderUploadItem[]>([]);\r\n readonly targetRootFolderName = signal('');\r\n readonly submitting = signal(false);\r\n readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang() || 'en',\r\n });\r\n\r\n readonly selectedFolderName = computed(() => {\r\n const firstItem = this.folderItems()[0];\r\n return firstItem\r\n ? (this.getRelativePathSegments(firstItem.relativePath)[0] ?? '')\r\n : '';\r\n });\r\n\r\n readonly hasTargetRootFolderName = computed(\r\n () => !!this.targetRootFolderName().trim(),\r\n );\r\n\r\n readonly selectedCount = computed(\r\n () => this.folderItems().filter((item) => item.enabled).length,\r\n );\r\n\r\n readonly uploadedCount = computed(\r\n () =>\r\n this.folderItems().filter((item) => item.enabled && item.uploadedAsset)\r\n .length,\r\n );\r\n\r\n readonly pendingCount = computed(\r\n () =>\r\n this.folderItems().filter(\r\n (item) => item.enabled && !item.uploadedAsset && !item.uploading,\r\n ).length,\r\n );\r\n\r\n readonly failedCount = computed(\r\n () =>\r\n this.folderItems().filter(\r\n (item) => item.enabled && !item.uploadedAsset && !!item.error,\r\n ).length,\r\n );\r\n\r\n readonly canCloseWithUploads = computed(\r\n () => this.uploadedCount() > 0 && this.pendingCount() === 0,\r\n );\r\n\r\n readonly primaryActionLabel = computed(() => {\r\n if (this.mode() === 'file') {\r\n return this.translate('primary.attachFile');\r\n }\r\n\r\n return this.canCloseWithUploads()\r\n ? this.translate('primary.attachUploadedFiles')\r\n : this.translate('primary.uploadSelectedFiles');\r\n });\r\n\r\n submit(): void {\r\n if (this.mode() === 'file') {\r\n const documentGuid =\r\n this.uploadedFile()?.id?.trim() || this.uploadedFile()?.name?.trim();\r\n\r\n if (!documentGuid) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n uploads: [\r\n {\r\n documentGuid,\r\n fileName:\r\n this.uploadedFile()?.fileName?.trim() ||\r\n this.uploadedFile()?.name?.trim() ||\r\n documentGuid,\r\n relativePath:\r\n this.uploadedFile()?.fileName?.trim() ||\r\n this.uploadedFile()?.name?.trim() ||\r\n documentGuid,\r\n },\r\n ],\r\n } satisfies DocumentLibraryUploadDialogResult);\r\n return;\r\n }\r\n\r\n if (this.canCloseWithUploads()) {\r\n this.closeWithFolderUploads();\r\n return;\r\n }\r\n\r\n void this.uploadSelectedFolderItems();\r\n }\r\n\r\n cancel(): void {\r\n if (this.submitting()) {\r\n return;\r\n }\r\n\r\n this.ref.close(null);\r\n }\r\n\r\n openFolderPicker(folderInput: HTMLInputElement): void {\r\n if (this.submitting()) {\r\n return;\r\n }\r\n\r\n folderInput.value = '';\r\n folderInput.click();\r\n }\r\n\r\n onFolderSelect(event: Event): void {\r\n const input = event.target as HTMLInputElement | null;\r\n const files = Array.from(input?.files ?? []);\r\n const nextItems = files\r\n .map((file, index) => this.createFolderUploadItem(file, index))\r\n .sort((left, right) =>\r\n left.relativePath.localeCompare(right.relativePath),\r\n );\r\n\r\n this.folderItems.set(nextItems);\r\n this.targetRootFolderName.set(\r\n nextItems[0]\r\n ? (this.getRelativePathSegments(nextItems[0].relativePath)[0] ?? '')\r\n : '',\r\n );\r\n }\r\n\r\n toggleFolderItem(itemId: string, enabled: boolean | null): void {\r\n this.folderItems.update((items) =>\r\n items.map((item) =>\r\n item.id === itemId\r\n ? {\r\n ...item,\r\n enabled: enabled !== false,\r\n }\r\n : item,\r\n ),\r\n );\r\n }\r\n\r\n setAllFolderItems(enabled: boolean): void {\r\n this.folderItems.update((items) =>\r\n items.map((item) => ({\r\n ...item,\r\n enabled,\r\n })),\r\n );\r\n }\r\n\r\n getFolderItemIcon(item: DocumentLibraryFolderUploadItem): MTIcon {\r\n const extension = getDocumentLibraryFileExtension(item.file.name);\r\n\r\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(extension)) {\r\n return 'image.image-03';\r\n }\r\n\r\n if (['ts', 'js', 'json', 'html', 'css', 'scss'].includes(extension)) {\r\n return 'dev.file-code-02';\r\n }\r\n\r\n if (item.file.type.toLowerCase().includes('pdf')) {\r\n return 'file.file-06';\r\n }\r\n\r\n return 'file.file-01';\r\n }\r\n\r\n getFolderItemStatus(item: DocumentLibraryFolderUploadItem): string {\r\n if (item.uploading) {\r\n return this.translate('status.uploading', {\r\n progress: item.progress,\r\n });\r\n }\r\n\r\n if (item.uploadedAsset) {\r\n return this.translate('status.uploaded');\r\n }\r\n\r\n if (item.error) {\r\n return item.error;\r\n }\r\n\r\n if (!item.enabled) {\r\n return this.translate('status.excluded');\r\n }\r\n\r\n return this.translate('status.waiting');\r\n }\r\n\r\n getFolderItemStatusClass(item: DocumentLibraryFolderUploadItem): string {\r\n if (item.uploadedAsset) {\r\n return 'text-emerald-600';\r\n }\r\n\r\n if (item.error) {\r\n return 'text-red-600';\r\n }\r\n\r\n if (!item.enabled) {\r\n return 'text-slate-400';\r\n }\r\n\r\n return 'text-muted-color';\r\n }\r\n\r\n formatFileSize(size: number): string {\r\n return formatDocumentLibraryFileSize(size);\r\n }\r\n\r\n private createFolderUploadItem(\r\n file: File,\r\n index: number,\r\n ): DocumentLibraryFolderUploadItem {\r\n const relativePath = file.webkitRelativePath || file.name;\r\n const pathSegments = relativePath.split('/');\r\n const pathLabel = pathSegments.slice(1).join('/') || file.name;\r\n\r\n return {\r\n id:\r\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\r\n ? crypto.randomUUID()\r\n : `${index}-${relativePath}`,\r\n file,\r\n relativePath,\r\n pathLabel,\r\n enabled: true,\r\n progress: 0,\r\n uploading: false,\r\n uploadedAsset: null,\r\n error: null,\r\n };\r\n }\r\n\r\n private async uploadSelectedFolderItems(): Promise<void> {\r\n const queuedItems = this.folderItems().filter(\r\n (item) => item.enabled && !item.uploadedAsset,\r\n );\r\n\r\n if (!queuedItems.length) {\r\n return;\r\n }\r\n\r\n this.submitting.set(true);\r\n\r\n try {\r\n for (const item of queuedItems) {\r\n await this.uploadFolderItem(item.id);\r\n }\r\n\r\n if (this.failedCount() === 0 && this.canCloseWithUploads()) {\r\n this.closeWithFolderUploads();\r\n }\r\n } finally {\r\n this.submitting.set(false);\r\n }\r\n }\r\n\r\n private uploadFolderItem(itemId: string): Promise<void> {\r\n const item = this.folderItems().find(\r\n (candidate) => candidate.id === itemId,\r\n );\r\n if (!item) {\r\n return Promise.resolve();\r\n }\r\n\r\n this.patchFolderItem(itemId, {\r\n uploading: true,\r\n progress: 10,\r\n error: null,\r\n });\r\n\r\n return new Promise((resolve) => {\r\n this.api\r\n .uploadAsset(item.file, this.uploadEndPoint(), this.requestContext())\r\n .subscribe({\r\n next: (event) => {\r\n if (event.completed && event.asset) {\r\n this.patchFolderItem(itemId, {\r\n uploading: false,\r\n progress: 100,\r\n uploadedAsset: event.asset,\r\n error: null,\r\n });\r\n return;\r\n }\r\n\r\n this.patchFolderItem(itemId, {\r\n progress: Math.max(event.progress, 10),\r\n });\r\n },\r\n error: (error) => {\r\n this.patchFolderItem(itemId, {\r\n uploading: false,\r\n progress: 0,\r\n error: this.getErrorMessage(error),\r\n });\r\n resolve();\r\n },\r\n complete: () => {\r\n this.patchFolderItem(itemId, {\r\n uploading: false,\r\n });\r\n resolve();\r\n },\r\n });\r\n });\r\n }\r\n\r\n private patchFolderItem(\r\n itemId: string,\r\n patch: Partial<DocumentLibraryFolderUploadItem>,\r\n ): void {\r\n this.folderItems.update((items) =>\r\n items.map((item) =>\r\n item.id === itemId\r\n ? {\r\n ...item,\r\n ...patch,\r\n }\r\n : item,\r\n ),\r\n );\r\n }\r\n\r\n private closeWithFolderUploads(): void {\r\n const uploads = this.folderItems()\r\n .filter((item) => item.enabled && item.uploadedAsset)\r\n .map((item) => ({\r\n documentGuid:\r\n item.uploadedAsset?.id?.trim() ||\r\n item.uploadedAsset?.name?.trim() ||\r\n '',\r\n fileName: item.uploadedAsset?.fileName?.trim() || item.file.name,\r\n relativePath: this.applyTargetRootFolderName(item.relativePath),\r\n }))\r\n .filter((item) => !!item.documentGuid);\r\n\r\n if (!uploads.length) {\r\n return;\r\n }\r\n\r\n this.ref.close({\r\n uploads,\r\n } satisfies DocumentLibraryUploadDialogResult);\r\n }\r\n\r\n private getErrorMessage(error: unknown): string {\r\n if (error instanceof Error && error.message) {\r\n return error.message;\r\n }\r\n\r\n return this.translate('status.uploadFailed');\r\n }\r\n\r\n private applyTargetRootFolderName(relativePath: string): string {\r\n const targetRootFolderName = this.targetRootFolderName().trim();\r\n if (!targetRootFolderName) {\r\n return relativePath;\r\n }\r\n\r\n const segments = this.getRelativePathSegments(relativePath);\r\n if (!segments.length) {\r\n return relativePath;\r\n }\r\n\r\n if (segments.length === 1) {\r\n return [targetRootFolderName, segments[0]].join('/');\r\n }\r\n\r\n segments[0] = targetRootFolderName;\r\n return segments.join('/');\r\n }\r\n\r\n private getRelativePathSegments(relativePath: string): string[] {\r\n return relativePath\r\n .split(/[\\\\/]/)\r\n .map((segment) => segment.trim())\r\n .filter(Boolean);\r\n }\r\n\r\n private translate(\r\n key: string,\r\n params?: Record<string, string | number | null | undefined>,\r\n ): string {\r\n this.activeLanguage();\r\n return this.transloco.translate(\r\n `document-library.modals.upload.${key}`,\r\n params,\r\n );\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'document-library.modals.upload'\">\r\n <div [class]=\"[modal.contentClass, 'flex', 'flex-col', 'gap-4', 'p-4']\">\r\n @if (mode() === \"file\") {\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"fileIntro\") }}\r\n <span class=\"font-medium text-color\">{{ folderLabel() }}</span\r\n >.\r\n </div>\r\n\r\n <mt-upload-field\r\n [ngModel]=\"uploadedFile()\"\r\n (ngModelChange)=\"uploadedFile.set($event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [shape]=\"'card'\"\r\n [title]=\"t('uploadFileTitle')\"\r\n [description]=\"t('uploadFileDescription')\"\r\n [endPoint]=\"uploadEndPoint()\"\r\n [context]=\"requestContext()\"\r\n />\r\n } @else {\r\n <input\r\n #folderInput\r\n type=\"file\"\r\n directory\r\n webkitdirectory\r\n multiple\r\n class=\"hidden\"\r\n (change)=\"onFolderSelect($event)\"\r\n />\r\n\r\n <div class=\"rounded-lg border border-surface bg-surface/30 p-4\">\r\n <div class=\"flex flex-wrap items-start justify-between gap-3\">\r\n <div class=\"space-y-1\">\r\n <div class=\"text-sm font-semibold\">{{ t(\"folderTitle\") }}</div>\r\n <div class=\"text-sm text-muted-color\">\r\n {{ t(\"folderDescription\") }}\r\n <span class=\"font-medium text-color\">{{ folderLabel() }}</span\r\n >.\r\n </div>\r\n @if (selectedFolderName()) {\r\n <div class=\"text-sm text-color\">\r\n {{ t(\"selectedFolder\") }}:\r\n <span class=\"font-medium\">{{ selectedFolderName() }}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-wrap items-center gap-2\">\r\n <mt-button\r\n [label]=\"t('selectFolder')\"\r\n icon=\"file.folder-plus\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"openFolderPicker(folderInput)\"\r\n />\r\n\r\n @if (folderItems().length > 0) {\r\n <mt-button\r\n [label]=\"t('selectAll')\"\r\n variant=\"outlined\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"setAllFolderItems(true)\"\r\n />\r\n <mt-button\r\n [label]=\"t('clearAll')\"\r\n variant=\"outlined\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"setAllFolderItems(false)\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (folderItems().length > 0) {\r\n <div\r\n class=\"grid max-h-[28rem] content-start grid-cols-1 gap-3 overflow-y-auto rounded-lg border border-surface bg-content p-3 md:grid-cols-2 xl:grid-cols-4\"\r\n >\r\n <div\r\n class=\"col-span-full flex flex-wrap items-center justify-between gap-2 px-1\"\r\n >\r\n <div class=\"text-sm text-muted-color\">\r\n {{\r\n t(\"selectionSummary\", {\r\n selected: selectedCount(),\r\n total: folderItems().length,\r\n })\r\n }}\r\n </div>\r\n <div\r\n class=\"flex flex-wrap items-center gap-3 text-xs text-muted-color\"\r\n >\r\n <span>{{ t(\"uploadedCount\", { count: uploadedCount() }) }}</span>\r\n <span>{{ t(\"failedCount\", { count: failedCount() }) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-span-full px-1\">\r\n <mt-text-field\r\n [ngModel]=\"targetRootFolderName()\"\r\n (ngModelChange)=\"targetRootFolderName.set($event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [label]=\"t('targetFolderName')\"\r\n [placeholder]=\"t('targetFolderPlaceholder')\"\r\n [disabled]=\"submitting()\"\r\n />\r\n </div>\r\n\r\n @for (item of folderItems(); track item.id) {\r\n <mt-toggle-field\r\n toggleShape=\"card\"\r\n size=\"small\"\r\n [icon]=\"getFolderItemIcon(item)\"\r\n [label]=\"item.file.name\"\r\n [descriptionCard]=\"item.pathLabel\"\r\n [readonly]=\"item.uploading\"\r\n [ngModel]=\"item.enabled\"\r\n (ngModelChange)=\"toggleFolderItem(item.id, $event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n >\r\n <ng-template #toggleCardBottom>\r\n <div\r\n class=\"mt-3 flex flex-wrap items-center justify-between gap-2 border-t border-surface pt-3 text-xs\"\r\n >\r\n <div class=\"text-muted-color\">\r\n {{ formatFileSize(item.file.size) }}\r\n </div>\r\n <div [class]=\"getFolderItemStatusClass(item)\">\r\n {{ getFolderItemStatus(item) }}\r\n </div>\r\n </div>\r\n\r\n @if (item.uploading) {\r\n <div class=\"mt-2 h-2 overflow-hidden rounded-full bg-surface\">\r\n <div\r\n class=\"h-full rounded-full bg-primary transition-all duration-200\"\r\n [style.width.%]=\"item.progress\"\r\n ></div>\r\n </div>\r\n }\r\n </ng-template>\r\n </mt-toggle-field>\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"flex min-h-[16rem] items-center justify-center rounded-lg border border-dashed border-surface bg-surface/20 p-6 text-center text-sm text-muted-color\"\r\n >\r\n {{ t(\"emptyFolderSelection\") }}\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n <div\r\n [class]=\"[\r\n modal.footerClass,\r\n 'flex',\r\n 'items-center',\r\n 'justify-end',\r\n 'gap-2',\r\n ]\"\r\n >\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n variant=\"outlined\"\r\n [disabled]=\"submitting()\"\r\n (onClick)=\"cancel()\"\r\n />\r\n\r\n <mt-button\r\n [label]=\"primaryActionLabel()\"\r\n icon=\"general.upload-01\"\r\n [loading]=\"submitting()\"\r\n [disabled]=\"\r\n mode() === 'file'\r\n ? !uploadedFile()?.id && !uploadedFile()?.name\r\n : !selectedCount() ||\r\n !hasTargetRootFolderName() ||\r\n (pendingCount() === 0 && !canCloseWithUploads())\r\n \"\r\n (onClick)=\"submit()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import { CommonModule, DatePipe } from '@angular/common';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n Component,\r\n TemplateRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { firstValueFrom, isObservable } from 'rxjs';\r\n\r\nimport {\r\n Breadcrumb,\r\n type BreadcrumbItem,\r\n} from '@masterteam/components/breadcrumb';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Table, type ColumnDef } from '@masterteam/components/table';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { Icon, type MTIcon } from '@masterteam/icons';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Popover } from 'primeng/popover';\r\n\r\nimport type {\r\n DocumentLibraryActionEvent,\r\n DocumentLibraryAsyncResult,\r\n DocumentLibraryEntry,\r\n DocumentLibraryFileEntry,\r\n DocumentLibraryFolder,\r\n DocumentLibraryFolderEntry,\r\n DocumentLibraryFolderId,\r\n DocumentLibrarySelectionChangeEvent,\r\n} from '../../models/document-library.model';\r\nimport {\r\n formatDocumentLibraryFileSize,\r\n getDocumentLibraryEntryTitle,\r\n getDocumentLibraryFileExtension,\r\n getDocumentLibraryFolderLabel,\r\n normalizeDocumentLibraryEntry,\r\n normalizeDocumentLibraryFile,\r\n normalizeDocumentLibraryFolder,\r\n normalizeDocumentLibraryLabel,\r\n toDocumentLibraryFolderEntry,\r\n} from '../../utils/document-library.utils';\r\nimport { DocumentLibraryApiService } from '../../services/document-library.api.service';\r\nimport {\r\n DocumentLibraryFolderDialog,\r\n type DocumentLibraryFolderDialogMode,\r\n type DocumentLibraryFolderDialogResult,\r\n} from '../../modals/folder-dialog/document-library-folder-dialog';\r\nimport {\r\n DocumentLibraryUploadDialog,\r\n type DocumentLibraryUploadDialogMode,\r\n type DocumentLibraryUploadDialogResult,\r\n} from '../../modals/upload-dialog/document-library-upload-dialog';\r\n\r\ntype FolderKey = string;\r\n\r\ntype DocumentLibraryBreadcrumbItem = BreadcrumbItem & {\r\n folderId?: DocumentLibraryFolderId | null;\r\n};\r\n\r\ntype DocumentLibraryTableRow = {\r\n id: string;\r\n entry: DocumentLibraryEntry;\r\n name: string;\r\n owner: string;\r\n size: string;\r\n updatedAt: string;\r\n};\r\n\r\ntype DocumentLibraryActionItem = {\r\n id?: string | number;\r\n label: string;\r\n icon?: MTIcon;\r\n disabled?: boolean;\r\n visible?: boolean;\r\n separator?: boolean;\r\n severity?: 'danger';\r\n command?: () => void;\r\n};\r\n\r\n@Component({\r\n selector: 'mt-document-library',\r\n standalone: true,\r\n host: {\r\n class: 'block',\r\n },\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n Avatar,\r\n Breadcrumb,\r\n Button,\r\n Card,\r\n DatePipe,\r\n Icon,\r\n Popover,\r\n Table,\r\n TextField,\r\n TranslocoDirective,\r\n ],\r\n templateUrl: './document-library.html',\r\n})\r\nexport class DocumentLibrary {\r\n private readonly api = inject(DocumentLibraryApiService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly modalService = inject(ModalService);\r\n private readonly toast = inject(ToastService);\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n readonly levelId = input.required<number>();\r\n readonly levelDataId = input<number | null>(null);\r\n readonly title = input<string>('');\r\n readonly description = input<string>('');\r\n readonly lang = input<'en' | 'ar'>('en');\r\n readonly requestContext = input<HttpContext | undefined>(undefined);\r\n readonly uploadEndPoint = input<string>('uploader');\r\n readonly emptyTitle = input<string>('');\r\n readonly emptyDescription = input<string>('');\r\n\r\n readonly loaded = output<void>();\r\n readonly errored = output<string>();\r\n readonly selectionChanged = output<DocumentLibrarySelectionChangeEvent>();\r\n readonly actionExecuted = output<DocumentLibraryActionEvent>();\r\n\r\n readonly nameCellTpl = viewChild<TemplateRef<any>>('nameCellTpl');\r\n readonly updatedCellTpl = viewChild<TemplateRef<any>>('updatedCellTpl');\r\n readonly actionsCellTpl = viewChild<TemplateRef<any>>('actionsCellTpl');\r\n readonly addPopover = viewChild<Popover>('addPopover');\r\n readonly folderPopover = viewChild<Popover>('folderPopover');\r\n readonly contextPopover = viewChild<Popover>('contextPopover');\r\n\r\n readonly roots = signal<DocumentLibraryFolder[]>([]);\r\n readonly folderRegistry = signal<Map<FolderKey, DocumentLibraryFolder>>(\r\n new Map(),\r\n );\r\n readonly folderEntriesCache = signal<Map<FolderKey, DocumentLibraryEntry[]>>(\r\n new Map(),\r\n );\r\n readonly expandedFolderKeys = signal<Set<FolderKey>>(new Set());\r\n readonly busyKeys = signal<Set<string>>(new Set());\r\n readonly selectedFolderId = signal<DocumentLibraryFolderId | null>(null);\r\n readonly selectedEntry = signal<DocumentLibraryEntry | null>(null);\r\n readonly error = signal<string | null>(null);\r\n\r\n readonly contextMenuItems = signal<DocumentLibraryActionItem[]>([]);\r\n readonly railSearch = signal('');\r\n readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang() || 'en',\r\n });\r\n readonly canMutateLevelData = computed(() => this.levelDataId() != null);\r\n readonly uiLang = computed<'en' | 'ar'>(() => {\r\n const activeLang = this.activeLanguage();\r\n return activeLang === 'ar'\r\n ? 'ar'\r\n : activeLang === 'en'\r\n ? 'en'\r\n : this.lang();\r\n });\r\n readonly resolvedTitle = computed(\r\n () => this.title().trim() || this.translate('title'),\r\n );\r\n readonly resolvedEmptyTitle = computed(\r\n () => this.emptyTitle().trim() || this.translate('empty.title'),\r\n );\r\n readonly resolvedEmptyDescription = computed(\r\n () => this.emptyDescription().trim() || this.translate('empty.description'),\r\n );\r\n readonly capabilities = computed(() => ({\r\n canCreateRootFolders: true,\r\n canUploadFiles: this.canMutateLevelData(),\r\n canDownloadFiles: true,\r\n canDeleteFiles: this.canMutateLevelData(),\r\n }));\r\n\r\n readonly columns = computed<ColumnDef[]>(() => {\r\n const nameCellTpl = this.nameCellTpl();\r\n const updatedCellTpl = this.updatedCellTpl();\r\n const actionsCellTpl = this.actionsCellTpl();\r\n\r\n if (!nameCellTpl || !updatedCellTpl || !actionsCellTpl) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n key: 'name',\r\n label: this.translate('columns.name'),\r\n type: 'custom',\r\n customCellTpl: nameCellTpl,\r\n },\r\n {\r\n key: 'owner',\r\n label: this.translate('columns.owner'),\r\n },\r\n {\r\n key: 'size',\r\n label: this.translate('columns.size'),\r\n },\r\n {\r\n key: 'updatedAt',\r\n label: this.translate('columns.lastUpdated'),\r\n type: 'custom',\r\n customCellTpl: updatedCellTpl,\r\n },\r\n {\r\n key: 'actions',\r\n label: this.translate('columns.actions'),\r\n type: 'custom',\r\n customCellTpl: actionsCellTpl,\r\n },\r\n ];\r\n });\r\n\r\n readonly selectedFolder = computed(() => {\r\n const folderId = this.selectedFolderId();\r\n if (folderId == null) {\r\n return null;\r\n }\r\n\r\n return this.folderRegistry().get(this.toFolderKey(folderId)) ?? null;\r\n });\r\n\r\n readonly currentEntries = computed<DocumentLibraryEntry[]>(() => {\r\n const folderId = this.selectedFolderId();\r\n if (folderId == null) {\r\n return this.roots().map((folder) => toDocumentLibraryFolderEntry(folder));\r\n }\r\n\r\n return this.folderEntriesCache().get(this.toFolderKey(folderId)) ?? [];\r\n });\r\n\r\n readonly tableRows = computed<DocumentLibraryTableRow[]>(() =>\r\n this.currentEntries().map((entry) => ({\r\n id: this.getEntryKey(entry),\r\n entry,\r\n name: this.getEntryTitle(entry),\r\n owner: this.getEntryOwner(entry),\r\n size: entry.isFolder ? '-' : this.formatFileSize(entry.size),\r\n updatedAt: this.getEntryUpdatedAt(entry),\r\n })),\r\n );\r\n\r\n readonly breadcrumbs = computed<DocumentLibraryBreadcrumbItem[]>(() => {\r\n const items: DocumentLibraryBreadcrumbItem[] = [\r\n {\r\n icon: 'general.home-05',\r\n label: this.resolvedTitle(),\r\n folderId: null,\r\n },\r\n ];\r\n\r\n this.getFolderTrail(this.selectedFolderId()).forEach((folder) => {\r\n items.push({\r\n label: this.getFolderLabel(folder),\r\n folderId: folder.id,\r\n });\r\n });\r\n\r\n return items;\r\n });\r\n\r\n readonly currentFolderTitle = computed(() => {\r\n const selectedFolder = this.selectedFolder();\r\n return selectedFolder\r\n ? this.getFolderLabel(selectedFolder)\r\n : this.resolvedTitle();\r\n });\r\n\r\n readonly currentFolderSubtitle = computed(() => {\r\n const selectedFolder = this.selectedFolder();\r\n if (!selectedFolder) {\r\n return this.translate('summary.rootFolders', {\r\n count: this.roots().length,\r\n });\r\n }\r\n\r\n const entries = this.currentEntries();\r\n const folderCount = entries.filter((entry) => entry.isFolder).length;\r\n const fileCount = entries.length - folderCount;\r\n return this.translate('summary.folderContents', {\r\n folderCount,\r\n fileCount,\r\n });\r\n });\r\n\r\n readonly rootSummary = computed(() => {\r\n return this.translate('summary.rootFolders', {\r\n count: this.roots().length,\r\n });\r\n });\r\n\r\n readonly visibleRoots = computed(() => {\r\n const query = this.railSearch().trim().toLowerCase();\r\n if (!query) {\r\n return this.roots();\r\n }\r\n\r\n return this.roots().filter((folder) =>\r\n this.getFolderLabel(folder).toLowerCase().includes(query),\r\n );\r\n });\r\n\r\n readonly addMenuItems = computed<DocumentLibraryActionItem[]>(() => [\r\n {\r\n label: this.translate('actions.newFolder'),\r\n icon: 'file.folder-plus',\r\n command: () => this.openCreateFolderDialog(this.selectedFolder()),\r\n visible: this.canCreateFolderInSelection(),\r\n },\r\n {\r\n label: this.translate('actions.fileUpload'),\r\n icon: 'general.upload-01',\r\n command: () => this.openUploadDialog('file'),\r\n visible: this.canUploadIntoCurrentFolder(),\r\n },\r\n {\r\n label: this.translate('actions.folderUpload'),\r\n icon: 'file.folder',\r\n command: () => this.openUploadDialog('folder'),\r\n visible: this.canUploadIntoCurrentFolder(),\r\n },\r\n ]);\r\n\r\n readonly currentFolderMenuItems = computed<DocumentLibraryActionItem[]>(\r\n () => {\r\n const folder = this.selectedFolder();\r\n return folder ? this.getFolderMenuItems(folder) : [];\r\n },\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n this.levelId();\r\n this.levelDataId();\r\n this.requestContext();\r\n untracked(() => {\r\n void this.reload();\r\n });\r\n });\r\n }\r\n\r\n async reload(): Promise<void> {\r\n try {\r\n await this.withBusy('roots', async () => {\r\n this.error.set(null);\r\n this.roots.set([]);\r\n this.folderRegistry.set(new Map());\r\n this.folderEntriesCache.set(new Map());\r\n this.expandedFolderKeys.set(new Set());\r\n this.selectedFolderId.set(null);\r\n this.selectedEntry.set(null);\r\n\r\n const folders = (\r\n await this.resolveAsync(\r\n this.api.loadRoots(\r\n this.levelId(),\r\n this.levelDataId(),\r\n this.requestContext(),\r\n ),\r\n )\r\n ).map((folder) => normalizeDocumentLibraryFolder(folder));\r\n\r\n this.roots.set(folders);\r\n this.upsertFolders(folders);\r\n });\r\n\r\n this.loaded.emit();\r\n this.actionExecuted.emit({ action: 'reload', target: null });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.loadLibrary'));\r\n }\r\n }\r\n\r\n async goToRoot(): Promise<void> {\r\n this.selectedFolderId.set(null);\r\n this.selectedEntry.set(null);\r\n this.selectionChanged.emit({\r\n folder: null,\r\n entry: null,\r\n });\r\n }\r\n\r\n async openFolder(folder: DocumentLibraryFolder): Promise<void> {\r\n this.selectedFolderId.set(folder.id);\r\n this.selectedEntry.set(toDocumentLibraryFolderEntry(folder));\r\n this.expandFolderPath(folder);\r\n\r\n if (!this.folderEntriesCache().has(this.toFolderKey(folder.id))) {\r\n await this.loadFolderEntries(folder.id);\r\n }\r\n\r\n this.selectionChanged.emit({\r\n folder,\r\n entry: toDocumentLibraryFolderEntry(folder),\r\n });\r\n this.actionExecuted.emit({\r\n action: 'open-folder',\r\n target: folder,\r\n });\r\n }\r\n\r\n async toggleExpanded(folder: DocumentLibraryFolder): Promise<void> {\r\n const folderKey = this.toFolderKey(folder.id);\r\n\r\n if (!this.expandedFolderKeys().has(folderKey)) {\r\n if (!this.folderEntriesCache().has(folderKey)) {\r\n await this.loadFolderEntries(folder.id);\r\n }\r\n\r\n this.expandedFolderKeys.update((state) => {\r\n const next = new Set(state);\r\n next.add(folderKey);\r\n return next;\r\n });\r\n return;\r\n }\r\n\r\n this.expandedFolderKeys.update((state) => {\r\n const next = new Set(state);\r\n next.delete(folderKey);\r\n return next;\r\n });\r\n }\r\n\r\n async onRailFolderClick(folder: DocumentLibraryFolder): Promise<void> {\r\n await this.openFolder(folder);\r\n }\r\n\r\n async onRowClick(row: DocumentLibraryTableRow): Promise<void> {\r\n this.selectedEntry.set(row.entry);\r\n\r\n if (row.entry.isFolder) {\r\n await this.openFolder(row.entry);\r\n return;\r\n }\r\n\r\n this.selectionChanged.emit({\r\n folder: this.selectedFolder(),\r\n entry: row.entry,\r\n });\r\n }\r\n\r\n openAddPopover(event: Event): void {\r\n if (!this.hasVisibleActionItems(this.addMenuItems())) {\r\n return;\r\n }\r\n\r\n this.addPopover()?.toggle(event);\r\n }\r\n\r\n openFolderPopover(event: Event): void {\r\n if (!this.hasVisibleActionItems(this.currentFolderMenuItems())) {\r\n return;\r\n }\r\n\r\n this.folderPopover()?.toggle(event);\r\n }\r\n\r\n openContextMenu(\r\n event: MouseEvent,\r\n target: DocumentLibraryFolder | DocumentLibraryEntry,\r\n ): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const items = this.getTargetMenuItems(target);\r\n if (!this.hasVisibleActionItems(items)) {\r\n return;\r\n }\r\n\r\n this.contextMenuItems.set(items);\r\n this.showPopover(this.contextPopover(), event);\r\n }\r\n\r\n executePopoverItem(\r\n item: DocumentLibraryActionItem,\r\n popover: Popover | undefined,\r\n ): void {\r\n if (item.disabled) {\r\n return;\r\n }\r\n\r\n popover?.hide();\r\n item.command?.();\r\n }\r\n\r\n openCreateFolderDialog(parent: DocumentLibraryFolder | null): void {\r\n if (!this.canCreateFolderInSelection(parent)) {\r\n return;\r\n }\r\n this.openFolderDialog('create', {\r\n contextLabel: parent ? this.getFolderLabel(parent) : this.resolvedTitle(),\r\n initialName: '',\r\n onSubmit: (folderName) => this.createFolder(parent, folderName),\r\n });\r\n }\r\n\r\n openRenameFolderDialog(folder: DocumentLibraryFolder): void {\r\n if (!this.canRenameFolder(folder)) {\r\n return;\r\n }\r\n\r\n this.openFolderDialog('rename', {\r\n contextLabel: this.getFolderLabel(folder),\r\n initialName: this.getFolderLabel(folder),\r\n onSubmit: (folderName) => this.renameFolder(folder, folderName),\r\n });\r\n }\r\n\r\n private async createFolder(\r\n parent: DocumentLibraryFolder | null,\r\n folderName: string,\r\n ): Promise<void> {\r\n try {\r\n const created = await this.createFolderInBackend(parent, folderName);\r\n this.toast.success(\r\n this.translate('messages.folderCreated', {\r\n name: this.getFolderLabel(created),\r\n }),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'create-folder',\r\n target: created,\r\n });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.createFolder'));\r\n }\r\n }\r\n\r\n private async renameFolder(\r\n target: DocumentLibraryFolder,\r\n folderName: string,\r\n ): Promise<void> {\r\n const levelDataId = this.levelDataId();\r\n\r\n if (!folderName || levelDataId == null) {\r\n return;\r\n }\r\n\r\n try {\r\n const response = await this.withBusy(\r\n this.renameFolderBusyKey(target.id),\r\n async () =>\r\n this.resolveAsync(\r\n this.api.renameFolder(\r\n this.levelId(),\r\n levelDataId,\r\n {\r\n folderId: target.id,\r\n folderName,\r\n },\r\n this.requestContext(),\r\n ),\r\n ),\r\n );\r\n\r\n const updated = normalizeDocumentLibraryFolder(\r\n response && typeof response === 'object' && 'id' in response\r\n ? response\r\n : {\r\n ...target,\r\n label: normalizeDocumentLibraryLabel({\r\n ...target.label,\r\n display: folderName,\r\n en: target.label.en ?? folderName,\r\n ar: target.label.ar ?? folderName,\r\n }),\r\n },\r\n );\r\n\r\n this.replaceFolder(updated);\r\n this.syncSelectedFolderEntry(updated);\r\n this.toast.success(\r\n this.translate('messages.folderRenamed', {\r\n name: this.getFolderLabel(updated),\r\n }),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'rename-folder',\r\n target: updated,\r\n });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.renameFolder'));\r\n }\r\n }\r\n\r\n confirmDeleteFolder(folder: DocumentLibraryFolder): void {\r\n this.confirmationService.confirmDelete({\r\n type: 'dialog',\r\n accept: () => {\r\n void this.deleteFolder(folder);\r\n },\r\n });\r\n }\r\n\r\n async deleteFolder(folder: DocumentLibraryFolder): Promise<void> {\r\n const levelDataId = this.levelDataId();\r\n if (levelDataId == null) {\r\n return;\r\n }\r\n\r\n try {\r\n await this.withBusy(this.deleteFolderBusyKey(folder.id), async () => {\r\n await this.resolveAsync(\r\n this.api.deleteFolder(\r\n this.levelId(),\r\n levelDataId,\r\n {\r\n folderId: folder.id,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n });\r\n\r\n const removedFolderKeys = this.removeFolderTree(folder.id);\r\n if (this.isSelectedFolderInTree(removedFolderKeys)) {\r\n await this.goToRoot();\r\n } else {\r\n this.clearSelectionForRemovedFolders(removedFolderKeys);\r\n }\r\n\r\n this.toast.success(\r\n this.translate('messages.folderDeleted', {\r\n name: this.getFolderLabel(folder),\r\n }),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'delete-folder',\r\n target: folder,\r\n });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.deleteFolder'));\r\n }\r\n }\r\n\r\n confirmDeleteFile(file: DocumentLibraryFileEntry): void {\r\n this.confirmationService.confirmDelete({\r\n type: 'dialog',\r\n accept: () => {\r\n void this.deleteFile(file);\r\n },\r\n });\r\n }\r\n\r\n async deleteFile(file: DocumentLibraryFileEntry): Promise<void> {\r\n const levelDataId = this.levelDataId();\r\n if (levelDataId == null) {\r\n return;\r\n }\r\n\r\n try {\r\n await this.withBusy(this.deleteFileBusyKey(file.id), async () => {\r\n await this.resolveAsync(\r\n this.api.deleteDocument(\r\n this.levelId(),\r\n levelDataId,\r\n {\r\n fileId: file.id,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n });\r\n\r\n const folderId = this.selectedFolderId();\r\n if (folderId != null) {\r\n this.patchFolderEntries(folderId, (entries) =>\r\n entries.filter(\r\n (entry) => !(entry.isFolder === false && entry.id === file.id),\r\n ),\r\n );\r\n }\r\n\r\n const selectedEntry = this.selectedEntry();\r\n if (\r\n selectedEntry &&\r\n !selectedEntry.isFolder &&\r\n selectedEntry.id === file.id\r\n ) {\r\n this.selectedEntry.set(null);\r\n }\r\n\r\n this.toast.success(\r\n this.translate('messages.fileDeleted', {\r\n name: file.fileName,\r\n }),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'delete-file',\r\n target: file,\r\n });\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.deleteFile'));\r\n }\r\n }\r\n\r\n async downloadFile(file: DocumentLibraryFileEntry): Promise<void> {\r\n try {\r\n await this.resolveAsync(\r\n this.api.downloadFile(\r\n {\r\n file,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.actionExecuted.emit({\r\n action: 'download-file',\r\n target: file,\r\n });\r\n } catch (error) {\r\n this.handleError(\r\n error,\r\n this.translate('errors.downloadFile', { name: file.fileName }),\r\n );\r\n }\r\n }\r\n\r\n openUploadDialog(mode: DocumentLibraryUploadDialogMode = 'file'): void {\r\n const selectedFolder = this.selectedFolder();\r\n if (!selectedFolder || !this.canUploadIntoFolder(selectedFolder)) {\r\n return;\r\n }\r\n\r\n const ref = this.modalService.openModal(\r\n DocumentLibraryUploadDialog,\r\n 'dialog',\r\n {\r\n header:\r\n mode === 'folder'\r\n ? this.translate('modals.upload.headerFolder')\r\n : this.translate('modals.upload.headerFile'),\r\n styleClass: mode === 'folder' ? '!w-[60rem]' : '!w-[34rem]',\r\n inputValues: {\r\n mode,\r\n folderLabel: this.getFolderLabel(selectedFolder),\r\n uploadEndPoint: this.uploadEndPoint(),\r\n requestContext: this.requestContext(),\r\n },\r\n },\r\n );\r\n\r\n if (!ref) {\r\n return;\r\n }\r\n\r\n ref.onClose.subscribe(\r\n (result: DocumentLibraryUploadDialogResult | null) => {\r\n if (result?.uploads?.length) {\r\n void this.attachUploadedDocuments(selectedFolder, result.uploads);\r\n }\r\n },\r\n );\r\n }\r\n\r\n foldersForRail(\r\n parentId: DocumentLibraryFolderId | null,\r\n ): DocumentLibraryFolder[] {\r\n const query = this.railSearch().trim().toLowerCase();\r\n const folders =\r\n parentId == null\r\n ? this.visibleRoots()\r\n : (this.folderEntriesCache().get(this.toFolderKey(parentId)) ?? [])\r\n .filter(\r\n (entry): entry is DocumentLibraryFolderEntry => entry.isFolder,\r\n )\r\n .map((entry) => normalizeDocumentLibraryFolder(entry));\r\n\r\n if (!query || parentId == null) {\r\n return folders;\r\n }\r\n\r\n return folders.filter((folder) =>\r\n this.getFolderLabel(folder).toLowerCase().includes(query),\r\n );\r\n }\r\n\r\n isExpanded(folderId: DocumentLibraryFolderId): boolean {\r\n return this.expandedFolderKeys().has(this.toFolderKey(folderId));\r\n }\r\n\r\n isSelectedFolder(folderId: DocumentLibraryFolderId): boolean {\r\n const selectedFolderId = this.selectedFolderId();\r\n if (selectedFolderId == null) {\r\n return false;\r\n }\r\n\r\n return this.toFolderKey(selectedFolderId) === this.toFolderKey(folderId);\r\n }\r\n\r\n hasLoadedChildren(folderId: DocumentLibraryFolderId): boolean {\r\n return this.folderEntriesCache().has(this.toFolderKey(folderId));\r\n }\r\n\r\n folderHasChildFolders(folderId: DocumentLibraryFolderId): boolean {\r\n const entries = this.folderEntriesCache().get(this.toFolderKey(folderId));\r\n if (!entries) {\r\n return true;\r\n }\r\n\r\n return entries.some((entry) => entry.isFolder);\r\n }\r\n\r\n canCreateFolderInSelection(\r\n folder: DocumentLibraryFolder | null = this.selectedFolder(),\r\n ): boolean {\r\n if (folder == null) {\r\n return !!this.capabilities().canCreateRootFolders;\r\n }\r\n\r\n return !!folder.isEditableFolder;\r\n }\r\n\r\n canUploadIntoCurrentFolder(): boolean {\r\n return this.canUploadIntoFolder(this.selectedFolder());\r\n }\r\n\r\n canUploadIntoFolder(folder: DocumentLibraryFolder | null): boolean {\r\n if (!folder) {\r\n return false;\r\n }\r\n\r\n return (\r\n !!this.capabilities().canUploadFiles &&\r\n !!folder.isEditableFolder &&\r\n !folder.isPrimaryFolder\r\n );\r\n }\r\n\r\n canDeleteFolder(folder: DocumentLibraryFolder): boolean {\r\n return (\r\n this.levelDataId() != null &&\r\n !!folder.isEditableFolder &&\r\n !folder.isPrimaryFolder\r\n );\r\n }\r\n\r\n canDeleteFile(_file: DocumentLibraryFileEntry): boolean {\r\n return !!this.capabilities().canDeleteFiles;\r\n }\r\n\r\n canDownloadFile(_file: DocumentLibraryFileEntry): boolean {\r\n return !!this.capabilities().canDownloadFiles;\r\n }\r\n\r\n getFolderLabel(folder: DocumentLibraryFolder): string {\r\n return (\r\n getDocumentLibraryFolderLabel(folder, this.uiLang()).trim() ||\r\n this.translate('fallback.folder', { id: folder.id })\r\n );\r\n }\r\n\r\n getEntryTitle(entry: DocumentLibraryEntry): string {\r\n return entry.isFolder\r\n ? this.getFolderLabel(entry)\r\n : getDocumentLibraryEntryTitle(entry, this.uiLang());\r\n }\r\n\r\n getEntryOwner(entry: DocumentLibraryEntry): string {\r\n if (entry.isFolder) {\r\n return entry.isEditableFolder\r\n ? this.translate('owner.workspace')\r\n : this.translate('owner.system');\r\n }\r\n\r\n return entry.createdBy ?? this.translate('owner.unknown');\r\n }\r\n\r\n getEntryUpdatedAt(entry: DocumentLibraryEntry): string {\r\n return entry.isFolder ? '' : entry.created;\r\n }\r\n\r\n getEntryKey(entry: DocumentLibraryEntry): string {\r\n return entry.isFolder\r\n ? `folder:${this.toFolderKey(entry.id)}`\r\n : `file:${entry.id}`;\r\n }\r\n\r\n getFolderMenuItems(\r\n folder: DocumentLibraryFolder,\r\n ): DocumentLibraryActionItem[] {\r\n return [\r\n {\r\n label: this.translate('actions.open'),\r\n icon: 'file.folder',\r\n command: () => void this.openFolder(folder),\r\n },\r\n {\r\n label: this.translate('actions.newSubfolder'),\r\n icon: 'file.folder-plus',\r\n command: () => this.openCreateFolderDialog(folder),\r\n visible: this.canCreateFolderInSelection(folder),\r\n },\r\n {\r\n label: this.translate('actions.uploadFile'),\r\n icon: 'general.upload-01',\r\n command: () => {\r\n void this.openFolder(folder).then(() =>\r\n this.openUploadDialog('file'),\r\n );\r\n },\r\n visible: this.canUploadIntoFolder(folder),\r\n },\r\n {\r\n label: this.translate('actions.uploadFolder'),\r\n icon: 'file.folder',\r\n command: () => {\r\n void this.openFolder(folder).then(() =>\r\n this.openUploadDialog('folder'),\r\n );\r\n },\r\n visible: this.canUploadIntoFolder(folder),\r\n },\r\n {\r\n label: this.translate('actions.rename'),\r\n icon: 'general.edit-02',\r\n command: () => this.openRenameFolderDialog(folder),\r\n visible: this.canRenameFolder(folder),\r\n },\r\n {\r\n label: this.translate('actions.delete'),\r\n icon: 'general.trash-01',\r\n severity: 'danger',\r\n command: () => this.confirmDeleteFolder(folder),\r\n visible: this.canDeleteFolder(folder),\r\n },\r\n ];\r\n }\r\n\r\n getEntryMenuItems(entry: DocumentLibraryEntry): DocumentLibraryActionItem[] {\r\n if (entry.isFolder) {\r\n return this.getFolderMenuItems(entry);\r\n }\r\n\r\n return [\r\n {\r\n label: this.translate('actions.download'),\r\n icon: 'general.download-01',\r\n command: () => void this.downloadFile(entry),\r\n visible: this.canDownloadFile(entry),\r\n },\r\n {\r\n label: this.translate('actions.delete'),\r\n icon: 'general.trash-01',\r\n severity: 'danger',\r\n command: () => this.confirmDeleteFile(entry),\r\n visible: this.canDeleteFile(entry),\r\n },\r\n ];\r\n }\r\n\r\n getFolderIcon(folder: DocumentLibraryFolder): MTIcon {\r\n if (!folder.isEditableFolder && folder.isPrimaryFolder) {\r\n return 'file.folder-lock';\r\n }\r\n\r\n if (!folder.isEditableFolder) {\r\n return 'security.folder-shield';\r\n }\r\n\r\n return this.isSelectedFolder(folder.id)\r\n ? 'file.folder'\r\n : 'file.folder-closed';\r\n }\r\n\r\n getFileIcon(entry: DocumentLibraryFileEntry): MTIcon {\r\n const extension = this.getFileExtension(entry);\r\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(extension)) {\r\n return 'image.image-03';\r\n }\r\n\r\n if (['ts', 'js', 'json', 'html', 'css', 'scss'].includes(extension)) {\r\n return 'dev.file-code-02';\r\n }\r\n\r\n if (entry.contentType.toLowerCase().includes('pdf')) {\r\n return 'file.file-06';\r\n }\r\n\r\n return 'file.file-01';\r\n }\r\n\r\n private getFileAvatarPalette(entry: DocumentLibraryFileEntry): {\r\n background: string;\r\n color: string;\r\n } {\r\n const extension = this.getFileExtension(entry);\r\n if (['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg'].includes(extension)) {\r\n return {\r\n background: '#d1fae5',\r\n color: '#047857',\r\n };\r\n }\r\n\r\n if (entry.contentType.toLowerCase().includes('pdf')) {\r\n return {\r\n background: '#ffe4e6',\r\n color: '#be123c',\r\n };\r\n }\r\n\r\n if (['xls', 'xlsx', 'csv'].includes(extension)) {\r\n return {\r\n background: '#dcfce7',\r\n color: '#15803d',\r\n };\r\n }\r\n\r\n if (['doc', 'docx'].includes(extension)) {\r\n return {\r\n background: '#dbeafe',\r\n color: '#1d4ed8',\r\n };\r\n }\r\n\r\n return {\r\n background: '#f1f5f9',\r\n color: '#334155',\r\n };\r\n }\r\n\r\n getHomeAvatarStyle(): string {\r\n return `\r\n --p-avatar-background: var(--p-primary-50);\r\n --p-avatar-color: var(--p-primary-700);\r\n `;\r\n }\r\n\r\n getFolderAvatarStyle(folder: DocumentLibraryFolder): string {\r\n if (!folder.isEditableFolder && folder.isPrimaryFolder) {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-primary-color) 12%, white);\r\n --p-avatar-color: color-mix(in srgb, var(--p-primary-color) 78%, black);\r\n `;\r\n }\r\n\r\n if (!folder.isEditableFolder) {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-surface-500) 14%, white);\r\n --p-avatar-color: color-mix(in srgb, var(--p-surface-900) 72%, black);\r\n `;\r\n }\r\n\r\n return `\r\n --p-avatar-background: #fef3c7;\r\n --p-avatar-color: #d97706;\r\n `;\r\n }\r\n\r\n getFileAvatarStyle(entry: DocumentLibraryFileEntry): string {\r\n const palette = this.getFileAvatarPalette(entry);\r\n\r\n return `\r\n --p-avatar-background: ${palette.background};\r\n --p-avatar-color: ${palette.color};\r\n `;\r\n }\r\n\r\n getActionAvatarStyle(): string {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-surface-100) 88%, white);\r\n --p-avatar-color: var(--p-surface-500);\r\n `;\r\n }\r\n\r\n getActionPopoverStyle(): Record<string, string> {\r\n return {\r\n width: '15rem',\r\n };\r\n }\r\n\r\n getActionItemButtonClass(item: DocumentLibraryActionItem): string {\r\n const baseClass =\r\n 'flex w-full cursor-pointer items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-sm text-left transition-colors';\r\n\r\n if (item.disabled) {\r\n return `${baseClass} cursor-not-allowed opacity-45`;\r\n }\r\n\r\n if (item.severity === 'danger') {\r\n return `${baseClass} text-red-600 hover:bg-red-50`;\r\n }\r\n\r\n return `${baseClass} text-color hover:bg-surface`;\r\n }\r\n\r\n getActionItemAvatarStyle(item: DocumentLibraryActionItem): string {\r\n if (item.disabled) {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-surface-200) 76%, white);\r\n --p-avatar-color: var(--p-surface-400);\r\n `;\r\n }\r\n\r\n if (item.severity === 'danger') {\r\n return `\r\n --p-avatar-background: color-mix(in srgb, #ef4444 12%, white);\r\n --p-avatar-color: #dc2626;\r\n `;\r\n }\r\n\r\n return `\r\n --p-avatar-background: color-mix(in srgb, var(--p-primary-color) 10%, white);\r\n --p-avatar-color: color-mix(in srgb, var(--p-primary-color) 82%, black);\r\n `;\r\n }\r\n\r\n getVisibleActionItems(\r\n items: DocumentLibraryActionItem[],\r\n ): DocumentLibraryActionItem[] {\r\n return items.filter((item) => item.visible !== false && !item.separator);\r\n }\r\n\r\n hasVisibleActionItems(items: DocumentLibraryActionItem[]): boolean {\r\n return this.getVisibleActionItems(items).length > 0;\r\n }\r\n\r\n trackActionItem(\r\n item: DocumentLibraryActionItem,\r\n index: number,\r\n ): string | number {\r\n return item.id ?? item.label ?? index;\r\n }\r\n\r\n getIconButtonClass(): string {\r\n return 'inline-flex items-center justify-center border-0 bg-transparent p-0 cursor-pointer disabled:cursor-not-allowed disabled:opacity-55';\r\n }\r\n\r\n getRailItemClass(active: boolean): string {\r\n const baseClass =\r\n 'w-full rounded-xl text-left text-sm font-medium text-color transition-[background-color,color,box-shadow] duration-150 hover:bg-[color-mix(in_srgb,var(--p-primary-color)_8%,transparent)]';\r\n\r\n if (!active) {\r\n return baseClass;\r\n }\r\n\r\n return `${baseClass} bg-[color-mix(in_srgb,var(--p-primary-color)_14%,white)] shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--p-primary-color)_20%,transparent)] text-[color-mix(in_srgb,var(--p-primary-color)_82%,black)]`;\r\n }\r\n\r\n getFileExtension(entry: DocumentLibraryFileEntry): string {\r\n return getDocumentLibraryFileExtension(entry.fileName);\r\n }\r\n\r\n formatFileSize(size: number): string {\r\n return formatDocumentLibraryFileSize(size);\r\n }\r\n\r\n onBreadcrumbClick(item: BreadcrumbItem): void {\r\n const targetItem = item as DocumentLibraryBreadcrumbItem;\r\n if (targetItem.folderId == null) {\r\n void this.goToRoot();\r\n return;\r\n }\r\n\r\n const targetFolder =\r\n this.folderRegistry().get(this.toFolderKey(targetItem.folderId)) ?? null;\r\n if (!targetFolder) {\r\n void this.goToRoot();\r\n return;\r\n }\r\n\r\n void this.openFolder(targetFolder);\r\n }\r\n\r\n isBusy(key: string): boolean {\r\n return this.busyKeys().has(key);\r\n }\r\n\r\n createFolderBusyKey(folderId: DocumentLibraryFolderId | 'root'): string {\r\n return `create-folder:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n renameFolderBusyKey(folderId: DocumentLibraryFolderId): string {\r\n return `rename-folder:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n loadFolderBusyKey(folderId: DocumentLibraryFolderId): string {\r\n return `load-folder:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n private openFolderDialog(\r\n mode: DocumentLibraryFolderDialogMode,\r\n options: {\r\n contextLabel: string;\r\n initialName: string;\r\n onSubmit: (folderName: string) => Promise<void>;\r\n },\r\n ): void {\r\n const ref = this.modalService.openModal(\r\n DocumentLibraryFolderDialog,\r\n 'dialog',\r\n {\r\n header:\r\n mode === 'create'\r\n ? this.translate('modals.folder.headerCreate')\r\n : this.translate('modals.folder.headerRename'),\r\n styleClass: '!w-[28rem]',\r\n inputValues: {\r\n mode,\r\n contextLabel: options.contextLabel,\r\n initialName: options.initialName,\r\n },\r\n },\r\n );\r\n\r\n if (!ref) {\r\n return;\r\n }\r\n\r\n ref.onClose.subscribe(\r\n (result: DocumentLibraryFolderDialogResult | null) => {\r\n if (result?.folderName) {\r\n void options.onSubmit(result.folderName);\r\n }\r\n },\r\n );\r\n }\r\n\r\n private async loadFolderEntries(\r\n folderId: DocumentLibraryFolderId,\r\n ): Promise<void> {\r\n try {\r\n await this.fetchFolderEntries(folderId);\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.loadFolderContents'));\r\n }\r\n }\r\n\r\n private async fetchFolderEntries(\r\n folderId: DocumentLibraryFolderId,\r\n ): Promise<DocumentLibraryEntry[]> {\r\n const folderKey = this.toFolderKey(folderId);\r\n const entries = await this.withBusy(\r\n this.loadFolderBusyKey(folderId),\r\n async () =>\r\n (\r\n await this.resolveAsync(\r\n this.api.loadFolderEntries(\r\n this.levelId(),\r\n folderId,\r\n this.requestContext(),\r\n ),\r\n )\r\n ).map((entry) => normalizeDocumentLibraryEntry(entry)),\r\n );\r\n\r\n const next = new Map(this.folderEntriesCache());\r\n next.set(folderKey, entries);\r\n this.folderEntriesCache.set(next);\r\n\r\n const childFolders = entries\r\n .filter((entry): entry is DocumentLibraryFolderEntry => entry.isFolder)\r\n .map((entry) => normalizeDocumentLibraryFolder(entry));\r\n\r\n this.upsertFolders(childFolders);\r\n return entries;\r\n }\r\n\r\n private async ensureFolderEntries(\r\n folderId: DocumentLibraryFolderId,\r\n ): Promise<DocumentLibraryEntry[]> {\r\n return (\r\n this.folderEntriesCache().get(this.toFolderKey(folderId)) ??\r\n (await this.fetchFolderEntries(folderId))\r\n );\r\n }\r\n\r\n private async attachUploadedDocuments(\r\n folder: DocumentLibraryFolder,\r\n uploads: DocumentLibraryUploadDialogResult['uploads'],\r\n ): Promise<void> {\r\n const levelDataId = this.levelDataId();\r\n if (levelDataId == null || !uploads.length) {\r\n return;\r\n }\r\n\r\n try {\r\n const attached: DocumentLibraryFileEntry[] = [];\r\n const failures: string[] = [];\r\n const uploadFolderCache = new Map<string, DocumentLibraryFolder>();\r\n const hydratedTargetFolders = new Set<string>();\r\n\r\n await this.withBusy(this.uploadBusyKey(folder.id), async () => {\r\n for (const upload of uploads) {\r\n if (!upload.documentGuid) {\r\n continue;\r\n }\r\n\r\n try {\r\n const targetFolder = await this.resolveUploadTargetFolder(\r\n folder,\r\n upload.relativePath,\r\n uploadFolderCache,\r\n );\r\n const targetFolderKey = this.toFolderKey(targetFolder.id);\r\n\r\n if (!hydratedTargetFolders.has(targetFolderKey)) {\r\n await this.ensureFolderEntries(targetFolder.id);\r\n hydratedTargetFolders.add(targetFolderKey);\r\n }\r\n\r\n const uploaded = normalizeDocumentLibraryFile(\r\n await this.resolveAsync(\r\n this.api.addDocument(\r\n this.levelId(),\r\n levelDataId,\r\n {\r\n folderId: targetFolder.id,\r\n documentGuid: upload.documentGuid,\r\n },\r\n this.requestContext(),\r\n ),\r\n ),\r\n );\r\n\r\n attached.push(uploaded);\r\n this.patchFolderEntries(targetFolder.id, (entries) =>\r\n this.mergeEntriesWithUploadedFiles(entries, [uploaded]),\r\n );\r\n this.actionExecuted.emit({\r\n action: 'upload-file',\r\n target: uploaded,\r\n });\r\n } catch {\r\n failures.push(upload.fileName);\r\n }\r\n }\r\n });\r\n\r\n if (attached.length) {\r\n this.toast.success(\r\n attached.length === 1\r\n ? this.translate('messages.fileAttached', {\r\n name: attached[0].fileName,\r\n })\r\n : this.translate('messages.filesAttached', {\r\n count: attached.length,\r\n }),\r\n );\r\n }\r\n\r\n if (failures.length) {\r\n throw new Error(\r\n failures.length === 1\r\n ? this.translate('errors.attachFile', {\r\n name: failures[0],\r\n })\r\n : this.translate('errors.attachFiles', {\r\n count: failures.length,\r\n }),\r\n );\r\n }\r\n } catch (error) {\r\n this.handleError(error, this.translate('errors.attachUploadedFiles'));\r\n }\r\n }\r\n\r\n private async createFolderInBackend(\r\n parent: DocumentLibraryFolder | null,\r\n folderName: string,\r\n ): Promise<DocumentLibraryFolder> {\r\n const trimmedName = folderName.trim();\r\n const parentId = parent?.id ?? null;\r\n\r\n if (\r\n parentId != null &&\r\n !this.folderEntriesCache().has(this.toFolderKey(parentId))\r\n ) {\r\n await this.ensureFolderEntries(parentId);\r\n }\r\n\r\n const created = await this.withBusy(\r\n this.createFolderBusyKey(parentId ?? 'root'),\r\n async () =>\r\n normalizeDocumentLibraryFolder(\r\n await this.resolveAsync(\r\n this.api.createFolder(\r\n this.levelId(),\r\n this.levelDataId(),\r\n {\r\n parentId,\r\n folderName: trimmedName,\r\n },\r\n this.requestContext(),\r\n ),\r\n ),\r\n ),\r\n );\r\n\r\n this.upsertFolders([created]);\r\n this.insertFolderIntoParent(created);\r\n this.expandParentForNewFolder(created.parentId);\r\n\r\n return created;\r\n }\r\n\r\n private insertFolderIntoParent(folder: DocumentLibraryFolder): void {\r\n if (folder.parentId == null) {\r\n this.roots.update((folders) => this.sortFolders([...folders, folder]));\r\n return;\r\n }\r\n\r\n this.patchFolderEntries(folder.parentId, (entries) =>\r\n this.sortEntries([...entries, toDocumentLibraryFolderEntry(folder)]),\r\n );\r\n }\r\n\r\n private replaceFolder(folder: DocumentLibraryFolder): void {\r\n this.upsertFolders([folder]);\r\n\r\n if (folder.parentId == null) {\r\n this.roots.update((folders) =>\r\n this.sortFolders(\r\n folders.map((item) =>\r\n this.toFolderKey(item.id) === this.toFolderKey(folder.id)\r\n ? folder\r\n : item,\r\n ),\r\n ),\r\n );\r\n return;\r\n }\r\n\r\n this.patchFolderEntries(folder.parentId, (entries) =>\r\n this.sortEntries(\r\n entries.map((entry) =>\r\n entry.isFolder &&\r\n this.toFolderKey(entry.id) === this.toFolderKey(folder.id)\r\n ? toDocumentLibraryFolderEntry(folder)\r\n : entry,\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n private removeFolderTree(folderId: DocumentLibraryFolderId): Set<FolderKey> {\r\n const folderKey = this.toFolderKey(folderId);\r\n const parentId = this.folderRegistry().get(folderKey)?.parentId ?? null;\r\n const folderKeys = new Set(this.collectFolderKeys(folderId));\r\n const nextRegistry = new Map(this.folderRegistry());\r\n const nextCache = new Map(this.folderEntriesCache());\r\n const nextExpanded = new Set(this.expandedFolderKeys());\r\n\r\n folderKeys.forEach((key) => {\r\n nextRegistry.delete(key);\r\n nextCache.delete(key);\r\n nextExpanded.delete(key);\r\n });\r\n\r\n this.folderRegistry.set(nextRegistry);\r\n this.folderEntriesCache.set(nextCache);\r\n this.expandedFolderKeys.set(nextExpanded);\r\n\r\n this.roots.update((folders) =>\r\n folders.filter(\r\n (folder) => this.toFolderKey(folder.id) !== this.toFolderKey(folderId),\r\n ),\r\n );\r\n\r\n if (parentId != null) {\r\n this.patchFolderEntries(parentId, (entries) =>\r\n entries.filter(\r\n (entry) =>\r\n !(entry.isFolder && this.toFolderKey(entry.id) === folderKey),\r\n ),\r\n );\r\n }\r\n\r\n return folderKeys;\r\n }\r\n\r\n private patchFolderEntries(\r\n folderId: DocumentLibraryFolderId | FolderKey,\r\n updater: (entries: DocumentLibraryEntry[]) => DocumentLibraryEntry[],\r\n ): void {\r\n const folderKey = this.toFolderKey(folderId);\r\n const next = new Map(this.folderEntriesCache());\r\n const current = next.get(folderKey) ?? [];\r\n next.set(folderKey, updater(current));\r\n this.folderEntriesCache.set(next);\r\n }\r\n\r\n private upsertFolders(folders: DocumentLibraryFolder[]): void {\r\n const next = new Map(this.folderRegistry());\r\n folders.forEach((folder) => {\r\n next.set(this.toFolderKey(folder.id), folder);\r\n });\r\n this.folderRegistry.set(next);\r\n }\r\n\r\n private expandFolderPath(folder: DocumentLibraryFolder): void {\r\n const next = new Set(this.expandedFolderKeys());\r\n let current: DocumentLibraryFolder | null = folder;\r\n\r\n while (current) {\r\n next.add(this.toFolderKey(current.id));\r\n current = this.getParentFolder(current.id);\r\n }\r\n\r\n this.expandedFolderKeys.set(next);\r\n }\r\n\r\n private expandParentForNewFolder(\r\n parentId: DocumentLibraryFolderId | null,\r\n ): void {\r\n if (parentId == null) {\r\n return;\r\n }\r\n\r\n this.expandedFolderKeys.update((state) => {\r\n const next = new Set(state);\r\n next.add(this.toFolderKey(parentId));\r\n return next;\r\n });\r\n }\r\n\r\n private syncSelectedFolderEntry(folder: DocumentLibraryFolder): void {\r\n const selectedEntry = this.selectedEntry();\r\n if (\r\n !selectedEntry?.isFolder ||\r\n this.toFolderKey(selectedEntry.id) !== this.toFolderKey(folder.id)\r\n ) {\r\n return;\r\n }\r\n\r\n const nextEntry = toDocumentLibraryFolderEntry(folder);\r\n this.selectedEntry.set(nextEntry);\r\n this.selectionChanged.emit({\r\n folder: this.selectedFolder(),\r\n entry: nextEntry,\r\n });\r\n }\r\n\r\n private getFolderTrail(\r\n folderId: DocumentLibraryFolderId | null,\r\n ): DocumentLibraryFolder[] {\r\n const trail: DocumentLibraryFolder[] = [];\r\n let currentId = folderId;\r\n\r\n while (currentId != null) {\r\n const folder = this.folderRegistry().get(this.toFolderKey(currentId));\r\n if (!folder) {\r\n break;\r\n }\r\n\r\n trail.unshift(folder);\r\n currentId = folder.parentId;\r\n }\r\n\r\n return trail;\r\n }\r\n\r\n private getParentFolder(\r\n folderId: DocumentLibraryFolderId,\r\n ): DocumentLibraryFolder | null {\r\n const folder = this.folderRegistry().get(this.toFolderKey(folderId));\r\n if (folder?.parentId == null) {\r\n return null;\r\n }\r\n\r\n return this.folderRegistry().get(this.toFolderKey(folder.parentId)) ?? null;\r\n }\r\n\r\n private async resolveUploadTargetFolder(\r\n folder: DocumentLibraryFolder,\r\n relativePath: string,\r\n cache: Map<string, DocumentLibraryFolder>,\r\n ): Promise<DocumentLibraryFolder> {\r\n const segments = this.getUploadFolderSegments(relativePath);\r\n if (!segments.length) {\r\n return folder;\r\n }\r\n\r\n let currentFolder = folder;\r\n\r\n for (const segment of segments) {\r\n const cacheKey = `${this.toFolderKey(currentFolder.id)}::${segment.toLowerCase()}`;\r\n const cachedFolder = cache.get(cacheKey);\r\n\r\n if (cachedFolder) {\r\n currentFolder = cachedFolder;\r\n continue;\r\n }\r\n\r\n const nextFolder = await this.findOrCreateChildFolder(\r\n currentFolder,\r\n segment,\r\n );\r\n\r\n cache.set(cacheKey, nextFolder);\r\n currentFolder = nextFolder;\r\n }\r\n\r\n return currentFolder;\r\n }\r\n\r\n private async findOrCreateChildFolder(\r\n parent: DocumentLibraryFolder,\r\n folderName: string,\r\n ): Promise<DocumentLibraryFolder> {\r\n const childFolders = await this.ensureFolderEntries(parent.id);\r\n const existingFolder = childFolders.find(\r\n (entry): entry is DocumentLibraryFolderEntry =>\r\n entry.isFolder && this.folderNameMatches(entry, folderName),\r\n );\r\n\r\n if (existingFolder) {\r\n const normalizedFolder = normalizeDocumentLibraryFolder(existingFolder);\r\n\r\n if (!normalizedFolder.isEditableFolder) {\r\n throw new Error(\r\n this.translate('errors.protectedFolderUpload', {\r\n name: this.getFolderLabel(normalizedFolder),\r\n }),\r\n );\r\n }\r\n\r\n return normalizedFolder;\r\n }\r\n\r\n return this.createFolderInBackend(parent, folderName);\r\n }\r\n\r\n private folderNameMatches(\r\n folder: DocumentLibraryFolder,\r\n folderName: string,\r\n ): boolean {\r\n const normalizedTarget = folderName.trim().toLocaleLowerCase();\r\n const label = normalizeDocumentLibraryLabel(folder.label);\r\n\r\n return [label.display, label.en, label.ar]\r\n .filter(Boolean)\r\n .some((value) => value!.trim().toLocaleLowerCase() === normalizedTarget);\r\n }\r\n\r\n private getUploadFolderSegments(relativePath: string): string[] {\r\n return relativePath\r\n .split(/[\\\\/]/)\r\n .map((segment) => segment.trim())\r\n .filter(Boolean)\r\n .slice(0, -1);\r\n }\r\n\r\n private mergeEntriesWithUploadedFiles(\r\n entries: DocumentLibraryEntry[],\r\n uploaded: DocumentLibraryFileEntry[],\r\n ): DocumentLibraryEntry[] {\r\n const uploadedIds = new Set(uploaded.map((file) => file.id));\r\n return this.sortEntries([\r\n ...entries.filter((entry) => entry.isFolder),\r\n ...entries.filter(\r\n (entry): entry is DocumentLibraryFileEntry =>\r\n !entry.isFolder && !uploadedIds.has(entry.id),\r\n ),\r\n ...uploaded,\r\n ]);\r\n }\r\n\r\n private sortFolders(\r\n folders: DocumentLibraryFolder[],\r\n ): DocumentLibraryFolder[] {\r\n return [...folders].sort((left, right) =>\r\n this.getFolderLabel(left).localeCompare(this.getFolderLabel(right)),\r\n );\r\n }\r\n\r\n private sortEntries(entries: DocumentLibraryEntry[]): DocumentLibraryEntry[] {\r\n return [...entries].sort((left, right) => {\r\n if (left.isFolder !== right.isFolder) {\r\n return left.isFolder ? 1 : -1;\r\n }\r\n\r\n return this.getEntryTitle(left).localeCompare(this.getEntryTitle(right));\r\n });\r\n }\r\n\r\n private getTargetMenuItems(\r\n target: DocumentLibraryFolder | DocumentLibraryEntry,\r\n ): DocumentLibraryActionItem[] {\r\n return this.isEntryTarget(target)\r\n ? this.getEntryMenuItems(target)\r\n : this.getFolderMenuItems(target);\r\n }\r\n\r\n private isEntryTarget(\r\n target: DocumentLibraryFolder | DocumentLibraryEntry,\r\n ): target is DocumentLibraryEntry {\r\n return 'isFolder' in target;\r\n }\r\n\r\n private isSelectedFolderInTree(folderKeys: Set<FolderKey>): boolean {\r\n const selectedFolderId = this.selectedFolderId();\r\n return (\r\n selectedFolderId != null &&\r\n folderKeys.has(this.toFolderKey(selectedFolderId))\r\n );\r\n }\r\n\r\n private clearSelectionForRemovedFolders(folderKeys: Set<FolderKey>): void {\r\n const selectedEntry = this.selectedEntry();\r\n if (\r\n !selectedEntry?.isFolder ||\r\n !folderKeys.has(this.toFolderKey(selectedEntry.id))\r\n ) {\r\n return;\r\n }\r\n\r\n this.selectedEntry.set(null);\r\n this.selectionChanged.emit({\r\n folder: this.selectedFolder(),\r\n entry: null,\r\n });\r\n }\r\n\r\n private canRenameFolder(folder: DocumentLibraryFolder): boolean {\r\n return this.levelDataId() != null && !!folder.isNameEditable;\r\n }\r\n\r\n private collectFolderKeys(folderId: DocumentLibraryFolderId): FolderKey[] {\r\n const targetKey = this.toFolderKey(folderId);\r\n const collected = [targetKey];\r\n const queue = [targetKey];\r\n\r\n while (queue.length > 0) {\r\n const current = queue.shift()!;\r\n this.folderRegistry().forEach((folder, key) => {\r\n if (\r\n folder.parentId != null &&\r\n this.toFolderKey(folder.parentId) === current &&\r\n !collected.includes(key)\r\n ) {\r\n collected.push(key);\r\n queue.push(key);\r\n }\r\n });\r\n }\r\n\r\n return collected;\r\n }\r\n\r\n private toFolderKey(\r\n folderId: DocumentLibraryFolderId | FolderKey,\r\n ): FolderKey {\r\n return String(folderId);\r\n }\r\n\r\n private deleteFolderBusyKey(folderId: DocumentLibraryFolderId): string {\r\n return `delete-folder:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n private deleteFileBusyKey(fileId: string): string {\r\n return `delete-file:${fileId}`;\r\n }\r\n\r\n private uploadBusyKey(folderId: DocumentLibraryFolderId): string {\r\n return `upload-file:${this.toFolderKey(folderId)}`;\r\n }\r\n\r\n private async withBusy<T>(key: string, task: () => Promise<T>): Promise<T> {\r\n this.busyKeys.update((state) => {\r\n const next = new Set(state);\r\n next.add(key);\r\n return next;\r\n });\r\n\r\n try {\r\n return await task();\r\n } finally {\r\n this.busyKeys.update((state) => {\r\n const next = new Set(state);\r\n next.delete(key);\r\n return next;\r\n });\r\n }\r\n }\r\n\r\n private async resolveAsync<T>(\r\n value: DocumentLibraryAsyncResult<T>,\r\n ): Promise<T> {\r\n if (isObservable(value)) {\r\n return firstValueFrom(value);\r\n }\r\n\r\n return Promise.resolve(value);\r\n }\r\n\r\n private handleError(error: unknown, fallbackMessage: string): void {\r\n const message =\r\n error instanceof Error\r\n ? error.message\r\n : typeof error === 'string'\r\n ? error\r\n : fallbackMessage;\r\n this.error.set(message);\r\n this.toast.error(message);\r\n this.errored.emit(message);\r\n }\r\n\r\n private translate(\r\n key: string,\r\n params?: Record<string, string | number | null | undefined>,\r\n ): string {\r\n this.activeLanguage();\r\n return this.transloco.translate(`document-library.${key}`, params);\r\n }\r\n\r\n private showPopover(popover: Popover | undefined, event: Event): void {\r\n if (!popover) {\r\n return;\r\n }\r\n\r\n popover.hide();\r\n setTimeout(() => popover.show(event), 0);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'document-library'\">\r\n <div class=\"flex h-full min-h-[42rem] flex-col gap-4\">\r\n <div class=\"grid gap-4 xl:grid-cols-[19rem_minmax(0,1fr)]\">\r\n <mt-card class=\"h-full\">\r\n <ng-template #headless>\r\n <div class=\"flex h-full flex-col\">\r\n <div class=\"border-b border-surface px-5 py-5\">\r\n <div class=\"flex items-start justify-between gap-3\">\r\n <div>\r\n <div class=\"text-base font-semibold\">\r\n {{ resolvedTitle() }}\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n [class]=\"getIconButtonClass()\"\r\n [attr.aria-label]=\"\r\n t('aria.refresh', { title: resolvedTitle() })\r\n \"\r\n [disabled]=\"isBusy('roots')\"\r\n (click)=\"reload()\"\r\n >\r\n <mt-avatar\r\n icon=\"arrow.refresh-cw-01\"\r\n [shape]=\"'circle'\"\r\n [style]=\"getActionAvatarStyle()\"\r\n />\r\n </button>\r\n </div>\r\n <div class=\"mt-3\">\r\n <mt-text-field\r\n [ngModel]=\"railSearch()\"\r\n (ngModelChange)=\"railSearch.set($event)\"\r\n icon=\"general.search-lg\"\r\n [placeholder]=\"t('searchFolders')\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto px-2.5 py-2.5\">\r\n <button\r\n type=\"button\"\r\n [class]=\"\r\n getRailItemClass(selectedFolderId() === null) +\r\n ' mb-0.5 flex items-center gap-2.5 px-2.5 py-2'\r\n \"\r\n (click)=\"goToRoot()\"\r\n >\r\n <mt-avatar\r\n class=\"[&_.p-avatar]:h-9 [&_.p-avatar]:w-9 [&_.p-avatar]:text-sm\"\r\n icon=\"general.home-05\"\r\n size=\"small\"\r\n [shape]=\"'square'\"\r\n [style]=\"getHomeAvatarStyle()\"\r\n />\r\n <span class=\"truncate\">{{ resolvedTitle() }}</span>\r\n </button>\r\n\r\n <ng-template #folderNodeTpl let-folder let-depth=\"depth\">\r\n <div class=\"mt-px\">\r\n <div\r\n class=\"flex items-center gap-1.5 rounded-lg\"\r\n [style.padding-inline-start.rem]=\"0.1 + depth * 0.72\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-color transition hover:bg-surface\"\r\n [class.invisible]=\"\r\n !folderHasChildFolders(folder.id) &&\r\n !hasLoadedChildren(folder.id)\r\n \"\r\n (click)=\"toggleExpanded(folder)\"\r\n >\r\n <mt-icon\r\n class=\"text-[0.85rem]\"\r\n [icon]=\"\r\n isExpanded(folder.id)\r\n ? 'arrow.chevron-down'\r\n : 'arrow.chevron-right'\r\n \"\r\n />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n [class]=\"\r\n getRailItemClass(isSelectedFolder(folder.id)) +\r\n ' flex min-w-0 flex-1 items-center gap-2.5 px-2.5 py-2'\r\n \"\r\n (click)=\"onRailFolderClick(folder)\"\r\n (contextmenu)=\"openContextMenu($event, folder)\"\r\n >\r\n <mt-avatar\r\n class=\"shrink-0 [&_.p-avatar]:h-9 [&_.p-avatar]:w-9 [&_.p-avatar]:text-sm\"\r\n size=\"small\"\r\n [icon]=\"getFolderIcon(folder)\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFolderAvatarStyle(folder)\"\r\n />\r\n <span class=\"min-w-0 flex-1 truncate\">\r\n {{ getFolderLabel(folder) }}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n @if (isExpanded(folder.id)) {\r\n <div class=\"space-y-px\">\r\n @for (\r\n child of foldersForRail(folder.id);\r\n track child.id\r\n ) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n folderNodeTpl;\r\n context: { $implicit: child, depth: depth + 1 }\r\n \"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n @for (folder of visibleRoots(); track folder.id) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n folderNodeTpl;\r\n context: { $implicit: folder, depth: 0 }\r\n \"\r\n />\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n </mt-card>\r\n\r\n <div class=\"flex min-w-0 flex-col gap-4\">\r\n <mt-card>\r\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\r\n <div class=\"min-w-0 flex-1\">\r\n <mt-breadcrumb\r\n [items]=\"breadcrumbs()\"\r\n (onItemClick)=\"onBreadcrumbClick($event)\"\r\n />\r\n <div class=\"mt-2 flex items-start gap-3\">\r\n <mt-avatar\r\n [icon]=\"\r\n selectedFolder()\r\n ? getFolderIcon(selectedFolder()!)\r\n : 'general.home-05'\r\n \"\r\n size=\"normal\"\r\n [shape]=\"'square'\"\r\n [style]=\"\r\n selectedFolder()\r\n ? getFolderAvatarStyle(selectedFolder()!)\r\n : getHomeAvatarStyle()\r\n \"\r\n />\r\n <div class=\"min-w-0\">\r\n <div class=\"truncate text-lg font-semibold\">\r\n {{ currentFolderTitle() }}\r\n </div>\r\n <div class=\"truncate text-sm text-muted-color\">\r\n {{ currentFolderSubtitle() }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-wrap items-center gap-2 self-start\">\r\n @if (hasVisibleActionItems(addMenuItems())) {\r\n <mt-button\r\n [label]=\"t('actions.add')\"\r\n icon=\"general.plus\"\r\n size=\"small\"\r\n (onClick)=\"openAddPopover($event)\"\r\n />\r\n <p-popover\r\n #addPopover\r\n [style]=\"getActionPopoverStyle()\"\r\n appendTo=\"body\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n actionListTpl;\r\n context: { items: addMenuItems(), popover: addPopover }\r\n \"\r\n />\r\n </p-popover>\r\n }\r\n\r\n @if (\r\n selectedFolder() &&\r\n hasVisibleActionItems(currentFolderMenuItems())\r\n ) {\r\n <button\r\n type=\"button\"\r\n [class]=\"getIconButtonClass()\"\r\n [attr.aria-label]=\"t('aria.folderActions')\"\r\n (click)=\"openFolderPopover($event)\"\r\n >\r\n <mt-avatar\r\n icon=\"general.dots-horizontal\"\r\n [shape]=\"'circle'\"\r\n [style]=\"getActionAvatarStyle()\"\r\n />\r\n </button>\r\n <p-popover\r\n #folderPopover\r\n [style]=\"getActionPopoverStyle()\"\r\n appendTo=\"body\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n actionListTpl;\r\n context: {\r\n items: currentFolderMenuItems(),\r\n popover: folderPopover,\r\n }\r\n \"\r\n />\r\n </p-popover>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (error()) {\r\n <div\r\n class=\"mt-4 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700\"\r\n >\r\n {{ error() }}\r\n </div>\r\n }\r\n </mt-card>\r\n\r\n <mt-card class=\"min-w-0\">\r\n <div class=\"grid gap-4 xl:grid-cols-[minmax(0,1fr)_18rem]\">\r\n <div class=\"min-w-0\">\r\n <mt-table\r\n [columns]=\"columns()\"\r\n [data]=\"tableRows()\"\r\n storageKey=\"document-library-entries-table\"\r\n [loading]=\"\r\n selectedFolderId() === null\r\n ? isBusy('roots')\r\n : isBusy(loadFolderBusyKey(selectedFolderId()!))\r\n \"\r\n [clickableRows]=\"true\"\r\n (rowClick)=\"onRowClick($event)\"\r\n >\r\n <ng-template #empty>\r\n <div class=\"flex flex-col items-center gap-3 py-10\">\r\n <mt-avatar\r\n icon=\"file.folder-question\"\r\n size=\"large\"\r\n [shape]=\"'square'\"\r\n [style]=\"getHomeAvatarStyle()\"\r\n />\r\n <div class=\"text-base font-semibold\">\r\n {{ resolvedEmptyTitle() }}\r\n </div>\r\n <div class=\"max-w-md text-center text-sm text-muted-color\">\r\n {{ resolvedEmptyDescription() }}\r\n </div>\r\n @if (\r\n canCreateFolderInSelection() ||\r\n canUploadIntoCurrentFolder()\r\n ) {\r\n <div class=\"flex flex-wrap justify-center gap-2\">\r\n @if (canCreateFolderInSelection()) {\r\n <mt-button\r\n [label]=\"t('actions.newFolder')\"\r\n icon=\"file.folder-plus\"\r\n (onClick)=\"openCreateFolderDialog(selectedFolder())\"\r\n />\r\n }\r\n @if (canUploadIntoCurrentFolder()) {\r\n <mt-button\r\n [label]=\"t('actions.uploadFile')\"\r\n icon=\"general.upload-01\"\r\n [outlined]=\"true\"\r\n (onClick)=\"openUploadDialog('file')\"\r\n />\r\n <mt-button\r\n [label]=\"t('actions.uploadFolder')\"\r\n icon=\"file.folder\"\r\n [outlined]=\"true\"\r\n (onClick)=\"openUploadDialog('folder')\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n </mt-table>\r\n </div>\r\n\r\n <div\r\n class=\"min-w-0 rounded-lg border border-surface bg-surface/30 p-4\"\r\n >\r\n <div class=\"text-sm font-semibold\">\r\n {{ t(\"selection.title\") }}\r\n </div>\r\n\r\n @if (selectedEntry(); as entry) {\r\n <div class=\"mt-4 space-y-4\">\r\n <div class=\"flex items-center gap-3\">\r\n @if (entry.isFolder) {\r\n <mt-avatar\r\n [icon]=\"getFolderIcon(entry)\"\r\n size=\"large\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFolderAvatarStyle(entry)\"\r\n />\r\n } @else {\r\n <mt-avatar\r\n [icon]=\"getFileIcon(entry)\"\r\n size=\"large\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFileAvatarStyle(entry)\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0\">\r\n <div class=\"truncate text-base font-semibold\">\r\n {{ getEntryTitle(entry) }}\r\n </div>\r\n <div class=\"truncate text-sm text-muted-color\">\r\n {{\r\n entry.isFolder\r\n ? t(\"selection.folder\")\r\n : t(\"selection.file\")\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (entry.isFolder) {\r\n <div class=\"grid gap-3 text-sm\">\r\n <div\r\n class=\"rounded-lg border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.permissions\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium\">\r\n {{\r\n entry.isEditableFolder\r\n ? t(\"selection.editableArea\")\r\n : t(\"selection.systemManaged\")\r\n }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"rounded-lg border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.rename\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium\">\r\n {{\r\n entry.isNameEditable\r\n ? t(\"selection.allowed\")\r\n : t(\"selection.protected\")\r\n }}\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"grid gap-3 text-sm\">\r\n <div\r\n class=\"rounded-lg border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.type\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium uppercase\">\r\n {{ getFileExtension(entry) }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"rounded-lg border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.size\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium\">\r\n {{ formatFileSize(entry.size) }}\r\n </div>\r\n </div>\r\n <div\r\n class=\"rounded-lg border border-surface bg-content px-3 py-3\"\r\n >\r\n <div\r\n class=\"text-xs uppercase tracking-wide text-muted-color\"\r\n >\r\n {{ t(\"selection.owner\") }}\r\n </div>\r\n <div class=\"mt-1 font-medium\">\r\n {{ entry.createdBy || t(\"owner.unknown\") }}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"mt-4 text-sm text-muted-color\">\r\n {{ t(\"selection.inspectHint\") }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n\r\n <ng-template #actionListTpl let-items=\"items\" let-popover=\"popover\">\r\n <div class=\"flex flex-col gap-0.5 p-0.5\">\r\n @for (\r\n item of getVisibleActionItems(items);\r\n track trackActionItem(item, $index)\r\n ) {\r\n <button\r\n type=\"button\"\r\n [class]=\"getActionItemButtonClass(item)\"\r\n (click)=\"executePopoverItem(item, popover)\"\r\n >\r\n @if (item.icon) {\r\n <mt-avatar\r\n class=\"[&_.p-avatar]:h-8 [&_.p-avatar]:w-8 [&_.p-avatar]:text-xs\"\r\n [icon]=\"item.icon\"\r\n [shape]=\"'square'\"\r\n [style]=\"getActionItemAvatarStyle(item)\"\r\n />\r\n }\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #nameCellTpl let-row>\r\n <div\r\n class=\"flex min-w-0 items-center gap-3\"\r\n (contextmenu)=\"openContextMenu($event, row.entry)\"\r\n >\r\n @if (row.entry.isFolder) {\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"getFolderIcon(row.entry)\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFolderAvatarStyle(row.entry)\"\r\n />\r\n } @else {\r\n <mt-avatar\r\n class=\"shrink-0\"\r\n [icon]=\"getFileIcon(row.entry)\"\r\n [shape]=\"'square'\"\r\n [style]=\"getFileAvatarStyle(row.entry)\"\r\n />\r\n }\r\n\r\n <div class=\"min-w-0\">\r\n <div class=\"truncate text-sm font-semibold\">\r\n {{ row.name }}\r\n </div>\r\n @if (row.entry.isFolder) {\r\n <div class=\"truncate text-xs text-muted-color\">\r\n {{\r\n row.entry.isEditableFolder\r\n ? t(\"selection.manualFolder\")\r\n : t(\"selection.protectedFolder\")\r\n }}\r\n </div>\r\n } @else {\r\n <div class=\"truncate text-xs text-muted-color uppercase\">\r\n {{ getFileExtension(row.entry) }} -\r\n {{ formatFileSize(row.entry.size) }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #updatedCellTpl let-row>\r\n @if (row.entry.isFolder) {\r\n <span class=\"text-sm text-muted-color\">-</span>\r\n } @else {\r\n <div class=\"text-sm\">\r\n {{ row.updatedAt | date: \"dd MMM, y\" }}\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #actionsCellTpl let-row>\r\n @if (hasVisibleActionItems(getEntryMenuItems(row.entry))) {\r\n <div\r\n class=\"flex w-full items-center justify-center\"\r\n data-row-click-ignore=\"true\"\r\n >\r\n <button\r\n type=\"button\"\r\n [class]=\"getIconButtonClass()\"\r\n [attr.aria-label]=\"t('aria.rowActions')\"\r\n (click)=\"rowPopover.toggle($event)\"\r\n >\r\n <mt-avatar\r\n icon=\"general.dots-vertical\"\r\n [shape]=\"'circle'\"\r\n [style]=\"getActionAvatarStyle()\"\r\n />\r\n </button>\r\n <p-popover\r\n #rowPopover\r\n [style]=\"getActionPopoverStyle()\"\r\n appendTo=\"body\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n actionListTpl;\r\n context: {\r\n items: getEntryMenuItems(row.entry),\r\n popover: rowPopover,\r\n }\r\n \"\r\n />\r\n </p-popover>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <p-popover\r\n #contextPopover\r\n [style]=\"getActionPopoverStyle()\"\r\n appendTo=\"body\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n actionListTpl;\r\n context: { items: contextMenuItems(), popover: contextPopover }\r\n \"\r\n />\r\n </p-popover>\r\n </div>\r\n</ng-container>\r\n","import type { Observable } from 'rxjs';\r\n\r\nexport type DocumentLibraryFolderId = number | string;\r\n\r\nexport interface DocumentLibraryLabel {\r\n display?: string;\r\n en?: string;\r\n ar?: string;\r\n}\r\n\r\nexport interface DocumentLibraryFolder {\r\n id: DocumentLibraryFolderId;\r\n label: DocumentLibraryLabel;\r\n parentId: DocumentLibraryFolderId | null;\r\n isPrimaryFolder?: boolean;\r\n isEditableFolder?: boolean;\r\n isNameEditable?: boolean;\r\n}\r\n\r\nexport interface DocumentLibraryFile {\r\n id: string;\r\n name?: string | null;\r\n fileName: string;\r\n contentType: string;\r\n size: number;\r\n createdBy?: string | null;\r\n created: string;\r\n path?: string | null;\r\n}\r\n\r\nexport interface DocumentLibraryFolderEntry extends DocumentLibraryFolder {\r\n isFolder: true;\r\n}\r\n\r\nexport interface DocumentLibraryFileEntry extends DocumentLibraryFile {\r\n isFolder: false;\r\n}\r\n\r\nexport type DocumentLibraryEntry =\r\n | DocumentLibraryFolderEntry\r\n | DocumentLibraryFileEntry;\r\n\r\nexport type DocumentLibraryAsyncResult<T> = T | Promise<T> | Observable<T>;\r\n\r\nexport interface DocumentLibraryCapabilities {\r\n canCreateRootFolders?: boolean;\r\n canUploadFiles?: boolean;\r\n canDownloadFiles?: boolean;\r\n canDeleteFiles?: boolean;\r\n}\r\n\r\nexport interface DocumentLibraryCreateFolderRequest {\r\n parentId: DocumentLibraryFolderId | null;\r\n folderName: string;\r\n}\r\n\r\nexport interface DocumentLibraryRenameFolderRequest {\r\n folderId: DocumentLibraryFolderId;\r\n folderName: string;\r\n}\r\n\r\nexport interface DocumentLibraryDeleteFolderRequest {\r\n folderId: DocumentLibraryFolderId;\r\n}\r\n\r\nexport interface DocumentLibraryAddDocumentRequest {\r\n folderId: DocumentLibraryFolderId;\r\n documentGuid: string;\r\n}\r\n\r\nexport interface DocumentLibraryDeleteFileRequest {\r\n fileId: string;\r\n}\r\n\r\nexport interface DocumentLibraryDownloadFileRequest {\r\n file: DocumentLibraryFileEntry;\r\n}\r\n\r\nexport interface DocumentLibrarySelectionChangeEvent {\r\n folder: DocumentLibraryFolder | null;\r\n entry: DocumentLibraryEntry | null;\r\n}\r\n\r\nexport type DocumentLibraryActionName =\r\n | 'open-folder'\r\n | 'create-folder'\r\n | 'rename-folder'\r\n | 'delete-folder'\r\n | 'upload-file'\r\n | 'download-file'\r\n | 'delete-file'\r\n | 'reload';\r\n\r\nexport interface DocumentLibraryApiError {\r\n code?: string;\r\n message?: string;\r\n details?: unknown;\r\n}\r\n\r\nexport interface DocumentLibraryResponse<T> {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message?: string | null;\r\n errors?: DocumentLibraryApiError | null;\r\n data: T;\r\n cacheSession?: string;\r\n}\r\n\r\nexport interface DocumentLibraryUploadedAsset {\r\n id?: string | null;\r\n name?: string | null;\r\n fileName?: string | null;\r\n contentType?: string | null;\r\n size?: number | null;\r\n}\r\n\r\nexport interface DocumentLibraryActionEvent {\r\n action: DocumentLibraryActionName;\r\n target: DocumentLibraryFolder | DocumentLibraryEntry | null;\r\n}\r\n\r\nexport function isDocumentLibraryFolderEntry(\r\n entry: DocumentLibraryEntry | DocumentLibraryFolder | null | undefined,\r\n): entry is DocumentLibraryFolderEntry {\r\n return !!entry && 'isFolder' in entry && entry.isFolder;\r\n}\r\n\r\nexport function isDocumentLibraryFileEntry(\r\n entry: DocumentLibraryEntry | null | undefined,\r\n): entry is DocumentLibraryFileEntry {\r\n return !!entry && !entry.isFolder;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1"],"mappings":"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"}