@memberjunction/ng-file-storage 6.1.4 → 6.2.0-edge.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/lib/admin/storage-admin-dialog.component.d.ts +1 -1
  2. package/dist/lib/admin/storage-admin-dialog.component.js +2 -2
  3. package/dist/lib/admin/storage-admin-dialog.component.js.map +1 -1
  4. package/dist/lib/category-tree/category-tree.d.ts +83 -9
  5. package/dist/lib/category-tree/category-tree.d.ts.map +1 -1
  6. package/dist/lib/category-tree/category-tree.js +192 -50
  7. package/dist/lib/category-tree/category-tree.js.map +1 -1
  8. package/dist/lib/file-browser/file-browser.component.d.ts +30 -4
  9. package/dist/lib/file-browser/file-browser.component.d.ts.map +1 -1
  10. package/dist/lib/file-browser/file-browser.component.js +68 -16
  11. package/dist/lib/file-browser/file-browser.component.js.map +1 -1
  12. package/dist/lib/file-browser/file-grid.component.d.ts +404 -58
  13. package/dist/lib/file-browser/file-grid.component.d.ts.map +1 -1
  14. package/dist/lib/file-browser/file-grid.component.js +1040 -396
  15. package/dist/lib/file-browser/file-grid.component.js.map +1 -1
  16. package/dist/lib/file-browser/folder-tree.component.d.ts +65 -9
  17. package/dist/lib/file-browser/folder-tree.component.d.ts.map +1 -1
  18. package/dist/lib/file-browser/folder-tree.component.js +166 -58
  19. package/dist/lib/file-browser/folder-tree.component.js.map +1 -1
  20. package/dist/lib/file-browser/storage-providers-list.component.d.ts +55 -7
  21. package/dist/lib/file-browser/storage-providers-list.component.d.ts.map +1 -1
  22. package/dist/lib/file-browser/storage-providers-list.component.js +124 -34
  23. package/dist/lib/file-browser/storage-providers-list.component.js.map +1 -1
  24. package/dist/lib/file-upload/file-upload.d.ts +22 -2
  25. package/dist/lib/file-upload/file-upload.d.ts.map +1 -1
  26. package/dist/lib/file-upload/file-upload.js +40 -10
  27. package/dist/lib/file-upload/file-upload.js.map +1 -1
  28. package/dist/lib/files-grid/files-grid.d.ts +28 -4
  29. package/dist/lib/files-grid/files-grid.d.ts.map +1 -1
  30. package/dist/lib/files-grid/files-grid.js +71 -23
  31. package/dist/lib/files-grid/files-grid.js.map +1 -1
  32. package/dist/lib/record-attachments/record-attachments.component.d.ts +15 -7
  33. package/dist/lib/record-attachments/record-attachments.component.d.ts.map +1 -1
  34. package/dist/lib/record-attachments/record-attachments.component.js +34 -18
  35. package/dist/lib/record-attachments/record-attachments.component.js.map +1 -1
  36. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"record-attachments.component.js","sourceRoot":"","sources":["../../../src/lib/record-attachments/record-attachments.component.ts","../../../src/lib/record-attachments/record-attachments.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n inject,\n ViewChild,\n ElementRef,\n HostListener,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, RunView, CompositeKey } from '@memberjunction/core';\nimport {\n MJFileEntity,\n MJFileEntityRecordLinkEntity,\n MJFileStorageProviderEntity,\n MJFileStorageAccountEntity,\n FileStorageEngineBase,\n StorageAccountWithProvider,\n UserInfoEngine,\n} from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { NavigationService, SharedService } from '@memberjunction/ng-shared';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { z } from 'zod';\nimport {\n RecordAttachmentItem,\n RecordAttachmentsConfig,\n AttachmentViewMode,\n AttachmentMediaType,\n GetAttachmentMediaType,\n FormatAttachmentFileSize,\n} from './record-attachments.types';\nimport {\n BeforeUploadAttachmentEventArgs,\n AfterUploadAttachmentEventArgs,\n BeforeDeleteAttachmentEventArgs,\n AfterDeleteAttachmentEventArgs,\n BeforeUnlinkAttachmentEventArgs,\n AfterUnlinkAttachmentEventArgs,\n BeforeDownloadAttachmentEventArgs,\n AfterDownloadAttachmentEventArgs,\n BeforePreviewAttachmentEventArgs,\n AfterPreviewAttachmentEventArgs,\n BeforeReplaceAttachmentEventArgs,\n AfterReplaceAttachmentEventArgs,\n} from './record-attachments.events';\n\nconst FileFieldsFragment = gql`\n fragment FileFields on MJFile_ {\n Category\n CategoryID\n ContentType\n _mj__CreatedAt\n Description\n ID\n Name\n Provider\n ProviderID\n ProviderKey\n Status\n _mj__UpdatedAt\n }\n`;\n\nconst UploadStorageFileMutation = gql`\n mutation UploadStorageFile($input: UploadStorageFileInput!) {\n UploadStorageFile(input: $input) {\n Success\n FileID\n ErrorMessage\n File {\n Category\n CategoryID\n ContentType\n _mj__CreatedAt\n Description\n ID\n Name\n Provider\n ProviderID\n ProviderKey\n Status\n _mj__UpdatedAt\n }\n }\n }\n`;\n\nconst UploadStorageFileMutationSchema = z.object({\n UploadStorageFile: z.object({\n Success: z.boolean(),\n FileID: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n File: z.object({\n ID: z.string(),\n Name: z.string().optional().nullable(),\n ProviderID: z.string().optional().nullable(),\n Provider: z.string().optional().nullable(),\n ContentType: z.string().optional().nullable(),\n Description: z.string().optional().nullable(),\n Status: z.string().optional().nullable(),\n CategoryID: z.string().optional().nullable(),\n Category: z.string().optional().nullable(),\n }).passthrough().optional().nullable(),\n }),\n});\n\nconst CreateUploadStageTokenMutation = `\n mutation CreateUploadStageToken {\n CreateUploadStageToken {\n Success\n Token\n Url\n ErrorMessage\n }\n }\n`;\n\nconst CreateUploadStageTokenMutationSchema = z.object({\n CreateUploadStageToken: z.object({\n Success: z.boolean(),\n Token: z.string().optional().nullable(),\n Url: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n }),\n});\n\nconst FileDownloadQuery = gql`\n query FileDownloadUrl($FileID: String!) {\n MJFile(ID: $FileID) {\n ContentType\n DownloadUrl\n }\n }\n`;\n\nconst FileDownloadQuerySchema = z.object({\n MJFile: z.object({\n ContentType: z.string().optional().nullable(),\n DownloadUrl: z.string(),\n }),\n});\n\nconst CreateMediaAccessTokenMutation = gql`\n mutation CreateMediaAccessToken($fileId: String!) {\n CreateMediaAccessToken(fileId: $fileId) {\n Success\n Token\n Url\n MimeType\n ErrorMessage\n }\n }\n`;\n\nconst CreateMediaAccessTokenMutationSchema = z.object({\n CreateMediaAccessToken: z.object({\n Success: z.boolean(),\n Token: z.string().optional().nullable(),\n Url: z.string().optional().nullable(),\n MimeType: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n }),\n});\n\nconst CreatePreAuthUploadUrlMutation = gql`\n mutation CreatePreAuthUploadUrl($input: CreatePreAuthUploadUrlInput!) {\n CreatePreAuthUploadUrl(input: $input) {\n UploadUrl\n ProviderKey\n }\n }\n`;\n\nconst CreatePreAuthUploadUrlMutationSchema = z.object({\n CreatePreAuthUploadUrl: z.object({\n UploadUrl: z.string().optional().nullable(),\n ProviderKey: z.string().optional().nullable(),\n }),\n});\n\n/**\n * World-class Angular component for displaying, previewing, uploading,\n * and managing file attachments linked to an entity record.\n *\n * Selector: `mj-record-attachments`\n */\n@Component({\n standalone: false,\n selector: 'mj-record-attachments',\n templateUrl: './record-attachments.component.html',\n styleUrls: ['./record-attachments.component.css'],\n})\nexport class RecordAttachmentsComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n private sanitizer = inject(DomSanitizer);\n\n private static readonly PREF_WIDTH_KEY = 'mj.recordAttachments.width';\n private static readonly PREF_VIEW_MODE_KEY = 'mj.recordAttachments.viewMode';\n\n // ────────────────────────────────────────────────────────────────────\n // Inputs\n // ────────────────────────────────────────────────────────────────────\n\n /** Entity record to load attachments for */\n @Input() Record?: BaseEntity;\n\n /** Explicit EntityID (alternative to passing Record) */\n @Input() EntityID?: string;\n\n /** Explicit RecordID (alternative to passing Record) */\n @Input() RecordID?: string;\n\n /** Bound attachment items (supports direct data-binding / manipulation) */\n @Input() Attachments: RecordAttachmentItem[] = [];\n\n /** Attachment configuration bag */\n @Input() Config?: RecordAttachmentsConfig;\n\n /** Whether the slide panel is visible */\n @Input() Visible: boolean = true;\n\n /** Whether the slide panel is resizable */\n @Input() Resizable: boolean = true;\n\n /** Initial width in px. 0 = auto/persisted setting */\n @Input() WidthPx: number = 0;\n\n /** Minimum panel width in px */\n @Input() MinWidthPx: number = 420;\n\n /** Maximum panel width ratio of viewport */\n @Input() MaxWidthRatio: number = 0.65;\n\n /** Panel title */\n @Input() Title: string = 'Attachments';\n\n /** Permissions / Feature flags */\n @Input() AllowUpload: boolean = true;\n @Input() AllowDelete: boolean = true;\n @Input() AllowUnlink: boolean = true;\n @Input() AllowDownload: boolean = true;\n @Input() AllowPreview: boolean = true;\n @Input() AllowReplace: boolean = true;\n @Input() AllowEditMetadata: boolean = true;\n\n /** UI Controls */\n @Input() ShowProviderFilter: boolean = true;\n @Input() ShowSearch: boolean = true;\n @Input() ViewMode: AttachmentViewMode = 'grid';\n\n // ────────────────────────────────────────────────────────────────────\n // Outputs / Events\n // ────────────────────────────────────────────────────────────────────\n\n @Output() PanelClosed = new EventEmitter<void>();\n @Output() WidthChanged = new EventEmitter<number>();\n @Output() AttachmentCountChanged = new EventEmitter<number>();\n @Output() ViewModeChanged = new EventEmitter<AttachmentViewMode>();\n\n @Output() BeforeUpload = new EventEmitter<BeforeUploadAttachmentEventArgs>();\n @Output() AfterUpload = new EventEmitter<AfterUploadAttachmentEventArgs>();\n\n @Output() BeforeDelete = new EventEmitter<BeforeDeleteAttachmentEventArgs>();\n @Output() AfterDelete = new EventEmitter<AfterDeleteAttachmentEventArgs>();\n\n @Output() BeforeUnlink = new EventEmitter<BeforeUnlinkAttachmentEventArgs>();\n @Output() AfterUnlink = new EventEmitter<AfterUnlinkAttachmentEventArgs>();\n\n @Output() BeforeDownload = new EventEmitter<BeforeDownloadAttachmentEventArgs>();\n @Output() AfterDownload = new EventEmitter<AfterDownloadAttachmentEventArgs>();\n\n @Output() BeforePreview = new EventEmitter<BeforePreviewAttachmentEventArgs>();\n @Output() AfterPreview = new EventEmitter<AfterPreviewAttachmentEventArgs>();\n\n @Output() BeforeReplace = new EventEmitter<BeforeReplaceAttachmentEventArgs>();\n @Output() AfterReplace = new EventEmitter<AfterReplaceAttachmentEventArgs>();\n\n // ────────────────────────────────────────────────────────────────────\n // Internal State\n // ────────────────────────────────────────────────────────────────────\n\n @ViewChild('fileInputRef') fileInputRef?: ElementRef<HTMLInputElement>;\n @ViewChild('replaceInputRef') replaceInputRef?: ElementRef<HTMLInputElement>;\n\n public IsLoading: boolean = false;\n public IsUploading: boolean = false;\n public UploadProgressPercent: number = 0;\n public UploadStatusText: string = '';\n public UploadingFileName: string = '';\n public SearchTerm: string = '';\n public SelectedProviderFilter: string = 'all'; // 'all' or ProviderID\n\n public StorageAccounts: StorageAccountWithProvider[] = [];\n public ActiveProviders: MJFileStorageProviderEntity[] = [];\n public SelectedStorageAccountID: string = '';\n\n /** User Permissions */\n public UserCanCreateFile: boolean = true;\n public UserCanDeleteFile: boolean = true;\n public UserCanUpdateFile: boolean = true;\n public UserCanCreateLink: boolean = true;\n public UserCanDeleteLink: boolean = true;\n\n /** Active Preview State */\n public PreviewModalOpen: boolean = false;\n public IsLoadingPreview: boolean = false;\n public IsMediaLoaded: boolean = false;\n public ActivePreviewItem: RecordAttachmentItem | null = null;\n public ActivePreviewUrl: string | null = null;\n public ActivePreviewSafeUrl: SafeResourceUrl | null = null;\n public ActivePreviewTextContent: string | null = null;\n\n /** Replace Target */\n private pendingReplaceItem: RecordAttachmentItem | null = null;\n private navigationService = inject(NavigationService, { optional: true });\n private mediaLoadedTimer?: ReturnType<typeof setTimeout>;\n\n /** Edit Metadata Dialog */\n public EditMetadataModalOpen: boolean = false;\n public EditMetadataItem: RecordAttachmentItem | null = null;\n public EditMetadataName: string = '';\n public EditMetadataDescription: string = '';\n\n /** Active Overflow Menu */\n public ActiveMenuLinkID: string | null = null;\n\n // ────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ────────────────────────────────────────────────────────────────────\n\n async ngOnInit(): Promise<void> {\n this.RestoreUserPreferences();\n await this.CheckStorageAndPermissions();\n if (this.Attachments.length === 0 && (this.Record || (this.EntityID && this.RecordID))) {\n await this.Refresh();\n }\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['Record'] || changes['EntityID'] || changes['RecordID']) {\n if (!changes['Record']?.firstChange && !changes['EntityID']?.firstChange && !changes['RecordID']?.firstChange) {\n await this.Refresh();\n }\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Preferences & Permissions\n // ────────────────────────────────────────────────────────────────────\n\n private RestoreUserPreferences(): void {\n const savedWidth = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_WIDTH_KEY);\n if (savedWidth && !this.WidthPx) {\n this.WidthPx = parseInt(savedWidth, 10) || 520;\n } else if (!this.WidthPx) {\n this.WidthPx = 520;\n }\n\n const savedMode = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_VIEW_MODE_KEY);\n if (savedMode === 'grid' || savedMode === 'list') {\n this.ViewMode = savedMode;\n }\n }\n\n public OnWidthChanged(width: number): void {\n this.WidthPx = width;\n UserInfoEngine.Instance.SetSettingDebounced(RecordAttachmentsComponent.PREF_WIDTH_KEY, String(width));\n this.WidthChanged.emit(width);\n }\n\n public SetViewMode(mode: AttachmentViewMode): void {\n this.ViewMode = mode;\n UserInfoEngine.Instance.SetSettingDebounced(RecordAttachmentsComponent.PREF_VIEW_MODE_KEY, mode);\n this.ViewModeChanged.emit(mode);\n this.cdr.markForCheck();\n }\n\n private async CheckStorageAndPermissions(): Promise<void> {\n try {\n await FileStorageEngineBase.Instance.Config(false);\n this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);\n this.StorageAccounts = FileStorageEngineBase.Instance.AccountsWithProviders.filter((ap) => ap.provider.IsActive !== false);\n\n // If initial cached check returns 0 accounts, force refresh from server in case cache was cold or stale\n if (this.StorageAccounts.length === 0) {\n await FileStorageEngineBase.Instance.Config(true);\n this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);\n this.StorageAccounts = FileStorageEngineBase.Instance.AccountsWithProviders.filter((ap) => ap.provider.IsActive !== false);\n }\n\n if (this.StorageAccounts.length > 0) {\n const preferredId = this.Config?.DefaultStorageAccountID;\n const matching = this.StorageAccounts.find((sa) => UUIDsEqual(sa.account.ID, preferredId));\n this.SelectedStorageAccountID = matching ? matching.account.ID : this.StorageAccounts[0].account.ID;\n }\n\n // Check Entity Permissions\n const md = this.ProviderToUse;\n const fileEntity = md.Entities.find((e) => e.Name === 'MJ: Files');\n const linkEntity = md.Entities.find((e) => e.Name === 'MJ: File Entity Record Links');\n const user = md.CurrentUser;\n\n if (fileEntity && user) {\n const perm = fileEntity.GetUserPermisions(user);\n this.UserCanCreateFile = perm.CanCreate;\n this.UserCanDeleteFile = perm.CanDelete;\n this.UserCanUpdateFile = perm.CanUpdate;\n }\n if (linkEntity && user) {\n const perm = linkEntity.GetUserPermisions(user);\n this.UserCanCreateLink = perm.CanCreate;\n this.UserCanDeleteLink = perm.CanDelete;\n }\n } catch (err) {\n console.warn('[RecordAttachmentsComponent] Storage check error:', err);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Effective IDs\n // ────────────────────────────────────────────────────────────────────\n\n public get EffectiveEntityID(): string | null {\n if (this.Record?.EntityInfo?.ID) return this.Record.EntityInfo.ID;\n return this.EntityID ?? null;\n }\n\n public get EffectiveRecordID(): string | null {\n if (this.Record) {\n if (this.Record.PrimaryKey?.KeyValuePairs?.length > 0) {\n const val = this.Record.PrimaryKey.KeyValuePairs[0].Value;\n if (val !== null && val !== undefined && String(val).length > 0) return String(val);\n }\n const pkVal = this.Record.PrimaryKey?.GetValueByIndex(0);\n if (pkVal !== null && pkVal !== undefined && String(pkVal).length > 0) return String(pkVal);\n if ('ID' in this.Record && (this.Record as unknown as { ID: string }).ID) {\n return String((this.Record as unknown as { ID: string }).ID);\n }\n }\n return this.RecordID ?? null;\n }\n\n public get EffectiveAllowUpload(): boolean {\n return this.AllowUpload && this.UserCanCreateFile && this.UserCanCreateLink && this.StorageAccounts.length > 0;\n }\n\n public get EffectiveAllowDelete(): boolean {\n return this.AllowDelete && this.UserCanDeleteFile && this.UserCanDeleteLink;\n }\n\n public get EffectiveAllowUnlink(): boolean {\n return this.AllowUnlink && this.UserCanDeleteLink;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Filtering & Computed Lists\n // ────────────────────────────────────────────────────────────────────\n\n public get FilteredAttachments(): RecordAttachmentItem[] {\n const term = (this.SearchTerm || '').toLowerCase().trim();\n const provider = this.SelectedProviderFilter;\n\n return this.Attachments.filter((item) => {\n const matchesProvider =\n provider === 'all' ||\n UUIDsEqual(item.ProviderID, provider) ||\n UUIDsEqual(item.StorageAccountID, provider);\n\n const matchesSearch =\n !term ||\n item.Name.toLowerCase().includes(term) ||\n (item.Description && item.Description.toLowerCase().includes(term)) ||\n (item.CategoryName && item.CategoryName.toLowerCase().includes(term)) ||\n (item.ContentType && item.ContentType.toLowerCase().includes(term));\n\n return matchesProvider && matchesSearch;\n });\n }\n\n public get ProviderCounts(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.Attachments) {\n const pid = item.ProviderID || 'unknown';\n counts.set(pid, (counts.get(pid) ?? 0) + 1);\n }\n return counts;\n }\n\n public GetProviderItemCount(providerId: string): number {\n return this.ProviderCounts.get(providerId) ?? 0;\n }\n\n public get TotalSizeFormatted(): string {\n const totalBytes = this.Attachments.reduce((acc, curr) => acc + (curr.FileSize ?? 0), 0);\n return FormatAttachmentFileSize(totalBytes);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public Verbs / Methods\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Refreshes the linked attachments list by querying `MJ: File Entity Record Links` and `MJ: Files`.\n */\n public async Refresh(): Promise<void> {\n const entityId = this.EffectiveEntityID;\n const recordId = this.EffectiveRecordID;\n\n if (!entityId || !recordId) {\n return;\n }\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n await this.CheckStorageAndPermissions();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const linksResult = await rv.RunView<MJFileEntityRecordLinkEntity>({\n EntityName: 'MJ: File Entity Record Links',\n ExtraFilter: `EntityID='${entityId}' AND RecordID='${recordId}'`,\n ResultType: 'entity_object',\n });\n\n if (!linksResult.Success || !linksResult.Results) {\n this.Attachments = [];\n this.AttachmentCountChanged.emit(0);\n return;\n }\n\n const fileIds = linksResult.Results.map((link) => link.FileID).filter((id): id is string => !!id);\n\n if (fileIds.length === 0) {\n this.Attachments = [];\n this.AttachmentCountChanged.emit(0);\n return;\n }\n\n // Batch load files\n const fileFilter = fileIds.map((id) => `ID='${id}'`).join(' OR ');\n const filesResult = await rv.RunView<MJFileEntity>({\n EntityName: 'MJ: Files',\n ExtraFilter: fileFilter,\n ResultType: 'entity_object',\n });\n\n const filesMap = new Map<string, MJFileEntity>();\n if (filesResult.Success && filesResult.Results) {\n for (const file of filesResult.Results) {\n filesMap.set(NormalizeUUID(file.ID), file);\n }\n }\n\n // Map to RecordAttachmentItem\n this.Attachments = linksResult.Results.map((link) => {\n const file = link.FileID ? filesMap.get(NormalizeUUID(link.FileID)) : undefined;\n const provider = file?.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, file.ProviderID)) : undefined;\n const config = provider?.ConfigurationObject;\n return {\n LinkID: link.ID,\n FileID: link.FileID,\n Name: file?.Name ?? 'Untitled File',\n Description: file?.Description,\n ContentType: file?.ContentType,\n Status: file?.Status,\n ProviderName: file?.Provider,\n ProviderID: file?.ProviderID,\n ProviderIconClass: config?.IconClass || this.GetFallbackProviderIcon(file?.Provider),\n ProviderBrandColor: config?.BrandColor || undefined,\n CategoryID: file?.CategoryID,\n CategoryName: file?.Category,\n CreatedAt: file?.__mj_CreatedAt ? new Date(file.__mj_CreatedAt) : link.__mj_CreatedAt ? new Date(link.__mj_CreatedAt) : null,\n UpdatedAt: file?.__mj_UpdatedAt ? new Date(file.__mj_UpdatedAt) : null,\n FileEntity: file,\n LinkEntity: link,\n };\n });\n\n this.AttachmentCountChanged.emit(this.Attachments.length);\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Refresh error:', err);\n this.notifications.CreateSimpleNotification('Failed to load attachments', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Uploads one or more files and links them to the active record.\n */\n public async UploadFiles(files: File[], storageAccountId?: string, categoryId?: string): Promise<RecordAttachmentItem[]> {\n console.log('[RecordAttachmentsComponent] UploadFiles called with', files.length, 'file(s):', files.map(f => ({ name: f.name, size: f.size, type: f.type })));\n\n if (!files || files.length === 0) return [];\n\n const entityId = this.EffectiveEntityID;\n const recordId = this.EffectiveRecordID;\n\n console.log('[RecordAttachmentsComponent] Resolved upload context:', {\n entityId,\n recordId,\n recordName: this.Record?.EntityInfo?.Name,\n explicitEntityID: this.EntityID,\n explicitRecordID: this.RecordID,\n storageAccountsAvailable: this.StorageAccounts.length,\n selectedStorageAccountID: this.SelectedStorageAccountID\n });\n\n if (!entityId || !recordId) {\n const errMsg = `Cannot upload attachments: Missing record context (EntityID: ${entityId}, RecordID: ${recordId})`;\n console.error(`[RecordAttachmentsComponent] ${errMsg}`);\n this.notifications.CreateSimpleNotification('Cannot upload attachments: No record context available', 'error');\n return [];\n }\n\n if (this.StorageAccounts.length === 0) {\n const errMsg = 'Cannot upload attachments: No active file storage accounts are configured. Please configure a storage provider in system settings.';\n console.warn(`[RecordAttachmentsComponent] ${errMsg}`);\n this.notifications.CreateSimpleNotification(errMsg, 'warning');\n return [];\n }\n\n const targetAccountID = storageAccountId ?? this.SelectedStorageAccountID ?? this.StorageAccounts[0]?.account?.ID;\n const targetCategoryID = categoryId ?? this.Config?.DefaultCategoryID;\n\n // Fire BeforeUpload event\n const beforeEvent = new BeforeUploadAttachmentEventArgs(files, targetAccountID, targetCategoryID);\n this.BeforeUpload.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n console.log('[RecordAttachmentsComponent] Upload cancelled by BeforeUpload event');\n return [];\n }\n\n this.IsUploading = true;\n this.UploadProgressPercent = 5;\n this.UploadStatusText = `Preparing ${files.length} file${files.length === 1 ? '' : 's'}...`;\n this.cdr.markForCheck();\n\n const uploadedItems: RecordAttachmentItem[] = [];\n const uploadedFileEntities: MJFileEntity[] = [];\n\n try {\n const md = this.ProviderToUse;\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const fileIndex = i + 1;\n const progressBase = Math.round((i / files.length) * 100);\n\n this.UploadingFileName = file.name;\n this.UploadStatusText = `Reading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 10);\n this.cdr.markForCheck();\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Starting upload for '${file.name}' (${FormatAttachmentFileSize(file.size)}, type: '${file.type}')`);\n\n // Enforce max size if configured\n if (this.Config?.MaxFileSizeBytes && file.size > this.Config.MaxFileSizeBytes) {\n const maxStr = FormatAttachmentFileSize(this.Config.MaxFileSizeBytes);\n console.warn(`[RecordAttachmentsComponent] File '${file.name}' exceeds max size of ${maxStr}`);\n this.notifications.CreateSimpleNotification(`File '${file.name}' exceeds max size of ${maxStr}`, 'error');\n continue;\n }\n\n let fileId: string | null = null;\n let fileEntity: MJFileEntity | null = null;\n let directUploadSucceeded = false;\n\n const targetAccount = this.StorageAccounts.find((a) => UUIDsEqual(a.account.ID, targetAccountID));\n const timestamp = new Date().toISOString().slice(0, 10);\n const uniqueId = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 11);\n const objectPath = `artifacts/${timestamp}/${uniqueId}/${file.name}`;\n\n // ─────────────────────────────────────────────────────────────────────\n // 1. Try Direct Binary Upload via Pre-Authenticated URL (for S3, Azure Blob, GCS)\n // ─────────────────────────────────────────────────────────────────────\n const supportsDirectPreAuth = this.ProviderSupportsDirectUpload(targetAccount?.provider);\n if (supportsDirectPreAuth) {\n try {\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Requesting pre-auth upload URL for '${file.name}' on account '${targetAccountID}'...`);\n const preAuthResult = await GraphQLDataProvider.ExecuteGQL(CreatePreAuthUploadUrlMutation, {\n input: {\n AccountID: targetAccountID,\n ObjectName: objectPath,\n ContentType: file.type || 'application/octet-stream',\n },\n });\n\n const parsedPreAuth = CreatePreAuthUploadUrlMutationSchema.safeParse(preAuthResult);\n if (\n parsedPreAuth.success &&\n parsedPreAuth.data.CreatePreAuthUploadUrl.UploadUrl\n ) {\n const preAuth = parsedPreAuth.data.CreatePreAuthUploadUrl;\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Direct binary upload URL obtained. Streaming raw bytes...`);\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}) directly to storage...`;\n this.cdr.markForCheck();\n\n if (preAuth.UploadUrl) {\n await this.uploadBinaryDirect(\n preAuth.UploadUrl,\n file,\n (loaded, total) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const percent = Math.round((loaded / total) * 100);\n const computedPercent = Math.min(95, Math.round(currentFileBase + (percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(loaded);\n const totalStr = FormatAttachmentFileSize(total);\n if (percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${percent}%)...`;\n } else {\n this.UploadStatusText = `Registering ${file.name} in MemberJunction...`;\n }\n this.cdr.markForCheck();\n }\n );\n\n // Raw binary upload to cloud storage succeeded! Create MJ: Files database record\n this.UploadStatusText = `Saving ${file.name} record...`;\n this.cdr.markForCheck();\n\n const newFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n newFile.Name = file.name;\n newFile.ContentType = file.type || 'application/octet-stream';\n newFile.ProviderID = targetAccount?.provider?.ID || '';\n newFile.ProviderKey = preAuth.ProviderKey || objectPath;\n if (targetCategoryID) {\n newFile.CategoryID = targetCategoryID;\n }\n newFile.Status = 'Uploaded';\n const saved = await newFile.Save();\n if (saved) {\n fileEntity = newFile;\n fileId = newFile.ID;\n directUploadSucceeded = true;\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Direct binary upload & file record created (FileID: ${fileId})`);\n }\n }\n }\n } catch (preAuthErr) {\n console.warn(`[RecordAttachmentsComponent] Direct binary upload failed for '${file.name}', falling back to server upload:`, preAuthErr);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // 2. Tier 2: Ephemeral Binary Upload Staging + GraphQL Token Commit\n // ─────────────────────────────────────────────────────────────────────\n if (!directUploadSucceeded || !fileId) {\n try {\n // Mint a cryptographically signed media-upload staging token\n const mintResult = await GraphQLDataProvider.ExecuteGQL(CreateUploadStageTokenMutation, {});\n const parsedMint = CreateUploadStageTokenMutationSchema.safeParse(mintResult);\n const stageToken = parsedMint.success && parsedMint.data.CreateUploadStageToken.Success\n ? parsedMint.data.CreateUploadStageToken.Token\n : null;\n\n if (!stageToken) {\n throw new Error('Failed to obtain authenticated upload staging token.');\n }\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Staging binary bytes via /media/upload-stage...`);\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 2);\n this.cdr.markForCheck();\n\n const uploadToken = await this.uploadBinaryStage(file, stageToken, (loaded, total) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const percent = Math.round((loaded / total) * 100);\n const computedPercent = Math.min(95, Math.round(currentFileBase + (percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(loaded);\n const totalStr = FormatAttachmentFileSize(total);\n if (percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${percent}%)...`;\n } else {\n this.UploadStatusText = `Saving ${file.name} to storage provider...`;\n }\n this.cdr.markForCheck();\n });\n\n this.UploadStatusText = `Finalizing ${file.name} in MemberJunction...`;\n this.cdr.markForCheck();\n\n const gqlResult = await GraphQLDataProvider.ExecuteGQL(UploadStorageFileMutation, {\n input: {\n UploadToken: uploadToken,\n FileName: file.name,\n MimeType: file.type || 'application/octet-stream',\n AccountID: beforeEvent.StorageAccountID || undefined,\n CategoryID: beforeEvent.CategoryID || undefined,\n },\n });\n\n const parsed = UploadStorageFileMutationSchema.safeParse(gqlResult);\n if (parsed.success && parsed.data.UploadStorageFile.Success && parsed.data.UploadStorageFile.FileID) {\n fileId = parsed.data.UploadStorageFile.FileID;\n const loadedFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n const ok = await loadedFile.Load(fileId);\n if (ok) {\n fileEntity = loadedFile;\n directUploadSucceeded = true;\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Tier 2 binary staging & upload completed (FileID: ${fileId})`);\n }\n }\n } catch (stageErr) {\n console.warn(`[RecordAttachmentsComponent] Tier 2 binary staging failed, falling back to base64:`, stageErr);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // 3. Tier 3 (Fallback): Base64 Upload via UploadStorageFile mutation\n // ─────────────────────────────────────────────────────────────────────\n if (!directUploadSucceeded || !fileId) {\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Using Tier 3 fallback base64 server upload...`);\n const base64Data = await this.fileToBase64(file);\n\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 2);\n this.cdr.markForCheck();\n\n const input = {\n FileName: file.name,\n Base64Data: base64Data,\n MimeType: file.type || 'application/octet-stream',\n AccountID: beforeEvent.StorageAccountID || undefined,\n CategoryID: beforeEvent.CategoryID || undefined,\n };\n\n const gqlResult = await GraphQLDataProvider.ExecuteGQLWithProgress(\n UploadStorageFileMutation,\n { input },\n (progress) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const computedPercent = Math.min(95, Math.round(currentFileBase + (progress.percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(progress.loaded);\n const totalStr = FormatAttachmentFileSize(progress.total);\n if (progress.percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${progress.percent}%)...`;\n } else {\n this.UploadStatusText = `Processing ${file.name} on storage server...`;\n }\n this.cdr.markForCheck();\n }\n );\n\n const parsed = UploadStorageFileMutationSchema.safeParse(gqlResult);\n if (!parsed.success || !parsed.data.UploadStorageFile.Success || !parsed.data.UploadStorageFile.FileID) {\n const errorMsg = parsed.success ? parsed.data.UploadStorageFile.ErrorMessage : 'Upload response parsing failed';\n console.error(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Failed to upload '${file.name}':`, errorMsg, parsed);\n this.notifications.CreateSimpleNotification(`Failed to upload '${file.name}': ${errorMsg || 'Unknown error'}`, 'error');\n continue;\n }\n\n fileId = parsed.data.UploadStorageFile.FileID;\n const loadedFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n const ok = await loadedFile.Load(fileId);\n if (ok) {\n fileEntity = loadedFile;\n }\n }\n\n if (!fileId || !fileEntity) {\n console.error(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] File record unavailable for '${file.name}'`);\n continue;\n }\n\n uploadedFileEntities.push(fileEntity);\n\n this.UploadStatusText = `Linking ${file.name} to record...`;\n this.UploadProgressPercent = progressBase + Math.round((1 / files.length) * 95);\n this.cdr.markForCheck();\n\n // Create Link Entity\n const linkEntity: MJFileEntityRecordLinkEntity = await md.GetEntityObject('MJ: File Entity Record Links');\n linkEntity.FileID = fileId;\n linkEntity.EntityID = entityId;\n linkEntity.RecordID = recordId;\n const linkSuccess = await linkEntity.Save();\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Record link saved (success: ${linkSuccess}, LinkID: ${linkEntity.ID})`);\n\n if (linkSuccess && fileEntity) {\n const provider = fileEntity.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, fileEntity.ProviderID)) : undefined;\n const config = provider?.ConfigurationObject;\n const newItem: RecordAttachmentItem = {\n LinkID: linkEntity.ID,\n FileID: fileEntity.ID,\n Name: fileEntity.Name,\n Description: fileEntity.Description,\n ContentType: fileEntity.ContentType,\n Status: fileEntity.Status,\n ProviderName: fileEntity.Provider,\n ProviderID: fileEntity.ProviderID,\n ProviderIconClass: config?.IconClass || this.GetFallbackProviderIcon(fileEntity.Provider),\n ProviderBrandColor: config?.BrandColor || undefined,\n CategoryID: fileEntity.CategoryID,\n CategoryName: fileEntity.Category,\n CreatedAt: new Date(),\n FileSize: file.size,\n FileEntity: fileEntity,\n LinkEntity: linkEntity,\n };\n uploadedItems.push(newItem);\n this.Attachments.unshift(newItem);\n }\n }\n\n this.UploadProgressPercent = 100;\n this.UploadStatusText = 'Upload complete!';\n this.cdr.markForCheck();\n\n if (uploadedItems.length > 0) {\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterUpload.emit(new AfterUploadAttachmentEventArgs(uploadedItems, uploadedFileEntities));\n this.notifications.CreateSimpleNotification(\n `Successfully attached ${uploadedItems.length} file${uploadedItems.length === 1 ? '' : 's'}`,\n 'success'\n );\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Upload error:', err);\n const errMsg = err instanceof Error ? err.message : 'Error uploading attachments';\n this.notifications.CreateSimpleNotification(errMsg, 'error');\n } finally {\n this.IsUploading = false;\n this.UploadProgressPercent = 0;\n this.UploadStatusText = '';\n this.UploadingFileName = '';\n this.cdr.markForCheck();\n }\n\n return uploadedItems;\n }\n\n /**\n * Unlinks an attachment from the record (keeps file in storage).\n */\n public async UnlinkAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforeUnlinkAttachmentEventArgs(attachment);\n this.BeforeUnlink.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const linkEntity: MJFileEntityRecordLinkEntity = attachment.LinkEntity ?? (await md.GetEntityObject('MJ: File Entity Record Links'));\n if (!attachment.LinkEntity) {\n await linkEntity.Load(attachment.LinkID);\n }\n\n const success = await linkEntity.Delete();\n if (success) {\n this.Attachments = this.Attachments.filter((a) => !UUIDsEqual(a.LinkID, attachment.LinkID));\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterUnlink.emit(new AfterUnlinkAttachmentEventArgs(attachment));\n this.notifications.CreateSimpleNotification(`Unlinked '${attachment.Name}' from record`, 'info');\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Failed to unlink '${attachment.Name}'`, 'error');\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Unlink error:', err);\n this.notifications.CreateSimpleNotification('Failed to unlink attachment', 'error');\n return false;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Deletes an attachment completely (unlinks and deletes from storage provider).\n */\n public async DeleteAttachment(attachment: RecordAttachmentItem, hardDelete: boolean = true): Promise<boolean> {\n const beforeEvent = new BeforeDeleteAttachmentEventArgs(attachment, hardDelete);\n this.BeforeDelete.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n\n // 1. Delete link\n if (attachment.LinkID) {\n const linkEntity: MJFileEntityRecordLinkEntity = attachment.LinkEntity ?? (await md.GetEntityObject('MJ: File Entity Record Links'));\n if (!attachment.LinkEntity) {\n await linkEntity.Load(attachment.LinkID);\n }\n await linkEntity.Delete();\n }\n\n // 2. Delete file if hardDelete requested\n if (hardDelete && attachment.FileID) {\n const fileEntity: MJFileEntity = attachment.FileEntity ?? (await md.GetEntityObject('MJ: Files'));\n if (!attachment.FileEntity) {\n await fileEntity.Load(attachment.FileID);\n }\n await fileEntity.Delete();\n }\n\n this.Attachments = this.Attachments.filter((a) => !UUIDsEqual(a.LinkID, attachment.LinkID));\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterDelete.emit(new AfterDeleteAttachmentEventArgs(attachment, hardDelete));\n this.notifications.CreateSimpleNotification(`Deleted '${attachment.Name}'`, 'info');\n return true;\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Delete error:', err);\n this.notifications.CreateSimpleNotification('Failed to delete attachment', 'error');\n return false;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Resolves an authenticated inline URL for streaming, previewing, and opening in a new tab.\n * Prefers the inline streaming endpoint (/media/:fileId?token=...) so the browser renders\n * the document/media natively without triggering forced attachment downloads or Save As dialogs.\n */\n private async GetInlineFileUrl(fileId: string): Promise<string | null> {\n try {\n const mediaResult = await GraphQLDataProvider.ExecuteGQL(CreateMediaAccessTokenMutation, { fileId });\n const parsedMedia = CreateMediaAccessTokenMutationSchema.safeParse(mediaResult);\n if (parsedMedia.success && parsedMedia.data.CreateMediaAccessToken.Success && parsedMedia.data.CreateMediaAccessToken.Url) {\n return parsedMedia.data.CreateMediaAccessToken.Url;\n }\n } catch (err) {\n console.warn('[RecordAttachmentsComponent] CreateMediaAccessToken failed, trying fallback DownloadUrl:', err);\n }\n\n try {\n const gqlResult = await GraphQLDataProvider.ExecuteGQL(FileDownloadQuery, { FileID: fileId });\n const parsed = FileDownloadQuerySchema.safeParse(gqlResult);\n if (parsed.success && parsed.data.MJFile?.DownloadUrl) {\n return parsed.data.MJFile.DownloadUrl;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] GetInlineFileUrl fallback failed:', err);\n }\n\n return null;\n }\n\n /**\n * Opens the attachment in a new browser tab for direct viewing.\n */\n public async DownloadAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforeDownloadAttachmentEventArgs(attachment);\n this.BeforeDownload.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n try {\n const url = await this.GetInlineFileUrl(attachment.FileID);\n if (url) {\n // Open directly in a new tab so the browser displays the document\n window.open(url, '_blank', 'noopener,noreferrer');\n this.AfterDownload.emit(new AfterDownloadAttachmentEventArgs(attachment, url));\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Unable to open '${attachment.Name}'`, 'error');\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Open in tab error:', err);\n this.notifications.CreateSimpleNotification('Failed to open file', 'error');\n return false;\n }\n }\n\n /**\n * Opens the in-app rich media preview modal for an attachment.\n */\n public async PreviewAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforePreviewAttachmentEventArgs(attachment);\n this.BeforePreview.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.ActivePreviewItem = attachment;\n this.IsLoadingPreview = true;\n this.IsMediaLoaded = false;\n this.PreviewModalOpen = true;\n this.ActivePreviewUrl = null;\n this.ActivePreviewSafeUrl = null;\n this.ActivePreviewTextContent = null;\n this.cdr.markForCheck();\n\n try {\n const url = await this.GetInlineFileUrl(attachment.FileID);\n if (url) {\n this.ActivePreviewUrl = url;\n this.ActivePreviewSafeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);\n\n // For text media types, fetch content directly for syntax preview\n const mediaType = this.GetMediaType(attachment);\n if (mediaType === 'text') {\n try {\n const resp = await window.fetch(url);\n if (resp.ok) {\n this.ActivePreviewTextContent = await resp.text();\n }\n } catch {\n // Text fetch failed, fallback to viewer\n }\n this.IsMediaLoaded = true;\n }\n\n this.AfterPreview.emit(new AfterPreviewAttachmentEventArgs(attachment));\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Unable to load preview for '${attachment.Name}'`, 'error');\n this.IsMediaLoaded = true;\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Preview error:', err);\n this.notifications.CreateSimpleNotification('Preview failed', 'error');\n this.IsMediaLoaded = true;\n return false;\n } finally {\n this.IsLoadingPreview = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnPreviewMediaLoaded(): void {\n if (this.mediaLoadedTimer) clearTimeout(this.mediaLoadedTimer);\n // Smoothly retain loading spinner for ~350ms so internal iframe/canvas rasterization finishes before fade-in\n this.mediaLoadedTimer = setTimeout(() => {\n this.IsMediaLoaded = true;\n this.cdr.markForCheck();\n }, 350);\n }\n\n /**\n * Opens the file record in a dedicated MJ Explorer workspace tab and closes the attachments slide-in panel.\n * If running standalone/outside Explorer, falls back to opening the in-app media preview modal.\n */\n public OpenAttachmentRecord(attachment: RecordAttachmentItem): void {\n if (attachment.FileID) {\n const pkey = CompositeKey.FromID(attachment.FileID); // first-pk-ok: FileID is the FK to MJ: Files (opened two lines below) — core entity keyed by ID\n if (this.navigationService) {\n this.navigationService.OpenEntityRecord('MJ: Files', pkey);\n } else {\n SharedService.Instance.OpenEntityRecord('MJ: Files', pkey);\n }\n this.ClosePanel();\n this.ClosePreviewModal();\n } else {\n void this.PreviewAttachment(attachment);\n }\n }\n\n /**\n * Initiates replace workflow for an existing attachment.\n */\n public RequestReplace(attachment: RecordAttachmentItem): void {\n this.pendingReplaceItem = attachment;\n this.replaceInputRef?.nativeElement.click();\n }\n\n /**\n * Replaces an existing attachment with a newly uploaded file.\n */\n public async ReplaceAttachment(attachment: RecordAttachmentItem, newFile: File): Promise<RecordAttachmentItem | null> {\n const beforeEvent = new BeforeReplaceAttachmentEventArgs(attachment, newFile);\n this.BeforeReplace.emit(beforeEvent);\n if (beforeEvent.Cancel) return null;\n\n this.IsUploading = true;\n this.cdr.markForCheck();\n\n try {\n // 1. Upload new file\n const uploaded = await this.UploadFiles([newFile], attachment.StorageAccountID || undefined, attachment.CategoryID || undefined);\n if (uploaded.length === 0) return null;\n\n const newAttachment = uploaded[0];\n\n // 2. Unlink old file\n await this.UnlinkAttachment(attachment);\n\n this.AfterReplace.emit(new AfterReplaceAttachmentEventArgs(attachment, newAttachment));\n this.notifications.CreateSimpleNotification(`Replaced '${attachment.Name}' with '${newAttachment.Name}'`, 'success');\n return newAttachment;\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Replace error:', err);\n this.notifications.CreateSimpleNotification('Replace failed', 'error');\n return null;\n } finally {\n this.IsUploading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // UI Actions & Helpers\n // ────────────────────────────────────────────────────────────────────\n\n public ClosePanel(): void {\n this.PanelClosed.emit();\n }\n\n public ClosePreviewModal(): void {\n if (this.mediaLoadedTimer) {\n clearTimeout(this.mediaLoadedTimer);\n }\n this.PreviewModalOpen = false;\n this.IsLoadingPreview = false;\n this.IsMediaLoaded = false;\n this.ActivePreviewItem = null;\n this.ActivePreviewUrl = null;\n this.ActivePreviewSafeUrl = null;\n this.ActivePreviewTextContent = null;\n this.cdr.markForCheck();\n }\n\n public OpenEditMetadata(attachment: RecordAttachmentItem): void {\n this.EditMetadataItem = attachment;\n this.EditMetadataName = attachment.Name;\n this.EditMetadataDescription = attachment.Description || '';\n this.EditMetadataModalOpen = true;\n this.cdr.markForCheck();\n }\n\n public CloseEditMetadataModal(): void {\n this.EditMetadataModalOpen = false;\n this.EditMetadataItem = null;\n this.cdr.markForCheck();\n }\n\n public async SaveEditMetadata(): Promise<void> {\n if (!this.EditMetadataItem || !this.EditMetadataName.trim()) return;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const fileEntity: MJFileEntity = this.EditMetadataItem.FileEntity ?? (await md.GetEntityObject('MJ: Files'));\n if (!this.EditMetadataItem.FileEntity) {\n await fileEntity.Load(this.EditMetadataItem.FileID);\n }\n\n fileEntity.Name = this.EditMetadataName.trim();\n fileEntity.Description = this.EditMetadataDescription.trim() || null;\n\n const success = await fileEntity.Save();\n if (success) {\n this.EditMetadataItem.Name = fileEntity.Name;\n this.EditMetadataItem.Description = fileEntity.Description;\n this.notifications.CreateSimpleNotification('Attachment details updated', 'success');\n this.CloseEditMetadataModal();\n } else {\n this.notifications.CreateSimpleNotification('Failed to update attachment details', 'error');\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Save metadata error:', err);\n this.notifications.CreateSimpleNotification('Update failed', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnFilesSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n console.log('[RecordAttachmentsComponent] OnFilesSelected event fired, files count:', input.files?.length);\n if (input.files && input.files.length > 0) {\n const filesArray = Array.from(input.files);\n input.value = '';\n void this.UploadFiles(filesArray);\n }\n }\n\n public OnReplaceFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n console.log('[RecordAttachmentsComponent] OnReplaceFileSelected event fired, files count:', input.files?.length);\n if (input.files && input.files.length > 0 && this.pendingReplaceItem) {\n const file = input.files[0];\n const target = this.pendingReplaceItem;\n this.pendingReplaceItem = null;\n input.value = '';\n void this.ReplaceAttachment(target, file);\n }\n }\n\n public OnDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n public OnDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n console.log('[RecordAttachmentsComponent] OnDrop event fired, dataTransfer files count:', event.dataTransfer?.files?.length);\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\n const filesArray = Array.from(event.dataTransfer.files);\n void this.UploadFiles(filesArray);\n }\n }\n\n public GetMediaType(attachment: RecordAttachmentItem): AttachmentMediaType {\n return GetAttachmentMediaType(attachment.ContentType, attachment.Name);\n }\n\n public FormatSize(bytes?: number | null): string {\n return FormatAttachmentFileSize(bytes);\n }\n\n public GetFileIcon(attachment: RecordAttachmentItem): string {\n const mediaType = this.GetMediaType(attachment);\n switch (mediaType) {\n case 'pdf':\n return 'fa-solid fa-file-pdf';\n case 'image':\n return 'fa-solid fa-file-image';\n case 'video':\n return 'fa-solid fa-file-video';\n case 'audio':\n return 'fa-solid fa-file-audio';\n case 'text':\n return 'fa-solid fa-file-code';\n case 'document':\n return 'fa-solid fa-file-word';\n default:\n return 'fa-solid fa-file';\n }\n }\n\n public GetFileColorClass(attachment: RecordAttachmentItem): string {\n const mediaType = this.GetMediaType(attachment);\n return `mj-attachment-thumb--${mediaType}`;\n }\n\n @HostListener('document:click')\n public OnDocumentClick(): void {\n this.CloseItemMenu();\n }\n\n @HostListener('document:keydown.escape')\n public OnEscapePress(): void {\n this.CloseItemMenu();\n }\n\n public ToggleItemMenu(event: MouseEvent, item: RecordAttachmentItem): void {\n event.stopPropagation();\n this.ActiveMenuLinkID = this.ActiveMenuLinkID === item.LinkID ? null : item.LinkID;\n this.cdr.markForCheck();\n }\n\n public CloseItemMenu(): void {\n if (this.ActiveMenuLinkID !== null) {\n this.ActiveMenuLinkID = null;\n this.cdr.markForCheck();\n }\n }\n\n public GetProviderIcon(item: RecordAttachmentItem): string {\n if (item.ProviderIconClass) {\n return item.ProviderIconClass;\n }\n const provider = item.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, item.ProviderID)) : null;\n const config = provider?.ConfigurationObject;\n if (config?.IconClass) {\n return config.IconClass;\n }\n return this.GetFallbackProviderIcon(item.ProviderName);\n }\n\n public GetProviderBrandColor(item: RecordAttachmentItem): string | undefined {\n if (item.ProviderBrandColor) {\n return item.ProviderBrandColor;\n }\n const provider = item.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, item.ProviderID)) : null;\n const config = provider?.ConfigurationObject;\n return config?.BrandColor || undefined;\n }\n\n public GetFallbackProviderIcon(providerName?: string | null): string {\n const name = (providerName || '').toLowerCase();\n if (name.includes('box')) return 'fa-solid fa-box';\n if (name.includes('aws') || name.includes('s3')) return 'fa-brands fa-aws';\n if (name.includes('azure')) return 'fa-brands fa-microsoft';\n if (name.includes('google drive')) return 'fa-brands fa-google-drive';\n if (name.includes('google cloud') || name.includes('gcs') || name.includes('google')) return 'fa-brands fa-google';\n if (name.includes('dropbox')) return 'fa-brands fa-dropbox';\n if (name.includes('sharepoint') || name.includes('onedrive')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-cloud';\n }\n\n private ProviderSupportsDirectUpload(provider?: MJFileStorageProviderEntity | null): boolean {\n if (!provider) return false;\n const key = (provider.ServerDriverKey || '').toLowerCase();\n const name = (provider.Name || '').toLowerCase();\n return (\n key.includes('aws') ||\n key.includes('azure') ||\n key.includes('google cloud') ||\n name.includes('aws') ||\n name.includes('s3') ||\n name.includes('azure') ||\n name.includes('google cloud')\n );\n }\n\n private TriggerBrowserDownload(url: string, fileName: string): void {\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n link.parentNode?.removeChild(link);\n }\n\n /**\n * Performs an authenticated direct binary upload of a raw File/Blob to a pre-authenticated cloud storage URL.\n */\n private uploadBinaryDirect(\n uploadUrl: string,\n file: File,\n onProgress?: (loaded: number, total: number) => void\n ): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('PUT', uploadUrl, true);\n\n // Set standard content type\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n\n // For Azure Blob Storage SAS uploads, add the required block blob header\n if (uploadUrl.includes('.blob.core.windows.net')) {\n xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');\n }\n\n if (xhr.upload && onProgress) {\n xhr.upload.onprogress = (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded, event.total);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(true);\n } else {\n reject(new Error(`Direct binary upload failed with HTTP status ${xhr.status}: ${xhr.statusText}`));\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred during direct binary upload.'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('Direct binary upload timed out.'));\n };\n\n xhr.send(file);\n });\n }\n\n /**\n * Performs an authenticated raw binary streaming upload to the /media/upload-stage REST endpoint.\n * Uses the cryptographically signed media-upload token minted by CreateUploadStageToken.\n * Returns an ephemeral single-use upload token to pass to the GraphQL UploadStorageFile mutation.\n */\n private uploadBinaryStage(\n file: File,\n stageToken: string,\n onProgress?: (loaded: number, total: number) => void\n ): Promise<string> {\n return new Promise((resolve, reject) => {\n let uploadUrl = '/media/upload-stage';\n const gqlUrl = GraphQLDataProvider.Instance?.ConfigData?.URL;\n if (gqlUrl && gqlUrl.startsWith('http')) {\n uploadUrl = gqlUrl.replace(/\\/graphql\\/?$/i, '').replace(/\\/+$/, '') + '/media/upload-stage';\n }\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', uploadUrl, true);\n\n // Signed media-upload token\n xhr.setRequestHeader('Authorization', `Bearer ${stageToken}`);\n\n // Metadata headers\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n xhr.setRequestHeader('x-file-name', encodeURIComponent(file.name));\n\n if (xhr.upload && onProgress) {\n xhr.upload.onprogress = (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded, event.total);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const res = JSON.parse(xhr.responseText) as { Success?: boolean; UploadToken?: string; ErrorMessage?: string };\n if (res.Success && res.UploadToken) {\n resolve(res.UploadToken);\n } else {\n reject(new Error(res.ErrorMessage || 'Upload staging returned unsuccessful status'));\n }\n } catch {\n reject(new Error('Failed to parse upload staging response JSON'));\n }\n } else {\n let errorDetail = xhr.statusText;\n try {\n const errRes = JSON.parse(xhr.responseText) as { ErrorMessage?: string };\n if (errRes.ErrorMessage) {\n errorDetail = errRes.ErrorMessage;\n }\n } catch {\n // keep statusText\n }\n reject(new Error(`Upload staging failed with HTTP status ${xhr.status}: ${errorDetail}`));\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred during upload staging.'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('Upload staging timed out.'));\n };\n\n xhr.send(file);\n });\n }\n\n private fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n const base64 = result.substring(result.indexOf(',') + 1);\n resolve(base64);\n } else {\n reject(new Error('Failed to read file as base64 string'));\n }\n };\n reader.onerror = (err) => reject(err);\n reader.readAsDataURL(file);\n });\n }\n}\n","<mj-slide-panel\n [Mode]=\"'slide'\"\n [Title]=\"Title\"\n [Visible]=\"Visible\"\n [Resizable]=\"Resizable\"\n [MinWidthPx]=\"MinWidthPx\"\n [MaxWidthRatio]=\"MaxWidthRatio\"\n [WidthPx]=\"WidthPx\"\n (Closed)=\"ClosePanel()\"\n (WidthChanged)=\"OnWidthChanged($event)\">\n\n <div class=\"mj-record-attachments-wrapper\">\n \n <!-- Top Meta Strip -->\n <div class=\"mj-record-attachments-meta-strip\">\n <div class=\"mj-record-attachments-summary\">\n <span class=\"mj-record-attachments-badge\">\n {{ Attachments.length }} {{ Attachments.length === 1 ? 'attachment' : 'attachments' }}\n @if (Attachments.length > 0) {\n &bull; {{ TotalSizeFormatted }}\n }\n </span>\n </div>\n\n <div class=\"mj-record-attachments-top-actions\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"Refresh()\" [disabled]=\"IsLoading\" title=\"Refresh attachments\">\n <i class=\"fa-solid fa-rotate-right\" [class.fa-spin]=\"IsLoading\"></i>\n </button>\n </div>\n </div>\n\n <!-- Provider Filter Pills & View Toggle -->\n <div class=\"mj-record-attachments-controls-bar\">\n @if (ShowProviderFilter && ActiveProviders.length > 1) {\n <div class=\"mj-provider-pills\">\n <button type=\"button\" class=\"mj-provider-pill\" [class.active]=\"SelectedProviderFilter === 'all'\" (click)=\"SelectedProviderFilter = 'all'\">\n <span>All Providers</span>\n <span class=\"mj-pill-count\">({{ Attachments.length }})</span>\n </button>\n @for (provider of ActiveProviders; track provider.ID) {\n <button type=\"button\" class=\"mj-provider-pill\" [class.active]=\"SelectedProviderFilter === provider.ID\" (click)=\"SelectedProviderFilter = provider.ID\">\n <span>{{ provider.Name }}</span>\n <span class=\"mj-pill-count\">({{ GetProviderItemCount(provider.ID) }})</span>\n </button>\n }\n </div>\n }\n\n <div class=\"mj-view-controls\">\n <button type=\"button\" class=\"mj-view-toggle-btn\" [class.active]=\"ViewMode === 'grid'\" (click)=\"SetViewMode('grid')\" title=\"Card Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button type=\"button\" class=\"mj-view-toggle-btn\" [class.active]=\"ViewMode === 'list'\" (click)=\"SetViewMode('list')\" title=\"Detailed List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"mj-record-attachments-content\">\n \n @if (!IsLoading && StorageAccounts.length === 0) {\n <div class=\"mj-record-attachments-alert\">\n <mj-alert\n Type=\"warning\"\n Title=\"No Active Storage Providers Configured\"\n Message=\"No active file storage providers or accounts were found. Configure a storage provider (such as Azure Blob Storage, AWS S3, or Box) in the Storage Subsystem settings to enable uploading files.\">\n </mj-alert>\n </div>\n }\n\n <!-- Upload Progress Status Banner -->\n @if (IsUploading) {\n <div class=\"mj-upload-progress-banner\">\n <div class=\"mj-upload-progress-header\">\n <div class=\"mj-upload-progress-info\">\n <i class=\"fa-solid fa-cloud-arrow-up fa-bounce mj-upload-progress-icon\"></i>\n <span class=\"mj-upload-progress-text\">{{ UploadStatusText }}</span>\n </div>\n <span class=\"mj-upload-progress-pct\">{{ UploadProgressPercent }}%</span>\n </div>\n <div class=\"mj-upload-progress-track\">\n <div class=\"mj-upload-progress-bar\" [style.width.%]=\"UploadProgressPercent\"></div>\n </div>\n </div>\n }\n\n <!-- Drag & Drop Upload Zone -->\n @if (EffectiveAllowUpload) {\n <div class=\"mj-upload-dropzone\" [class.disabled]=\"IsUploading\" (dragover)=\"OnDragOver($event)\" (drop)=\"OnDrop($event)\" (click)=\"!IsUploading && fileInputRef.click()\">\n <i class=\"fa-solid fa-cloud-arrow-up mj-upload-dropzone-icon\"></i>\n <div class=\"mj-upload-dropzone-title\">\n Drop files to attach, or <span class=\"mj-upload-dropzone-link\">Browse</span>\n </div>\n <div class=\"mj-upload-dropzone-subtitle\">\n Direct secure storage upload &bull; Max {{ Config?.MaxFileSizeBytes ? FormatSize(Config?.MaxFileSizeBytes) : '50 MB' }}\n </div>\n\n @if (StorageAccounts.length > 1) {\n <div class=\"mj-upload-storage-row\" (click)=\"$event.stopPropagation()\">\n <span>Target storage:</span>\n <select class=\"mj-upload-storage-select\" [(ngModel)]=\"SelectedStorageAccountID\" [disabled]=\"IsUploading\">\n @for (sa of StorageAccounts; track sa.account.ID) {\n <option [value]=\"sa.account.ID\">{{ sa.account.Name }} ({{ sa.provider.Name }})</option>\n }\n </select>\n </div>\n }\n <input type=\"file\" #fileInputRef multiple style=\"display: none;\" (change)=\"OnFilesSelected($event)\" />\n </div>\n }\n\n <!-- Search Filter -->\n @if (ShowSearch && Attachments.length > 0) {\n <div class=\"mj-attachments-search-bar\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input type=\"text\" [(ngModel)]=\"SearchTerm\" placeholder=\"Filter attachments by name, category, extension...\" />\n @if (SearchTerm) {\n <button type=\"button\" class=\"mj-clear-search-btn\" (click)=\"SearchTerm = ''\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Hidden Input for Replace Action -->\n <input type=\"file\" #replaceInputRef style=\"display: none;\" (change)=\"OnReplaceFileSelected($event)\" />\n\n <!-- Attachments List / Grid -->\n @if (IsLoading) {\n <div class=\"mj-record-attachments-loading\">\n <mj-loading text=\"Loading attachments...\"></mj-loading>\n </div>\n } @else if (FilteredAttachments.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-paperclip\"\n [Title]=\"SearchTerm ? 'No matching attachments' : 'No attachments yet'\"\n [Message]=\"SearchTerm ? 'Try adjusting your search query or provider filter.' : (StorageAccounts.length === 0 ? 'No active file storage accounts are configured. Uploads are disabled until a storage account is configured.' : (EffectiveAllowUpload ? 'Upload or drop files above to link attachments to this record.' : 'No attachments are linked to this record.'))\">\n </mj-empty-state>\n } @else {\n <div class=\"mj-attachments-container\" [class.mj-attachments-grid-mode]=\"ViewMode === 'grid'\">\n @for (item of FilteredAttachments; track item.LinkID) {\n <div class=\"mj-attachment-card\" [class.mj-attachment-card--list]=\"ViewMode === 'list'\">\n <div class=\"mj-attachment-card-top\" (click)=\"AllowPreview ? PreviewAttachment(item) : OpenAttachmentRecord(item)\">\n <div class=\"mj-attachment-thumb\" [ngClass]=\"GetFileColorClass(item)\" [title]=\"'Preview ' + item.Name\">\n <i [class]=\"GetFileIcon(item)\"></i>\n </div>\n <div class=\"mj-attachment-info\">\n <div class=\"mj-attachment-name\" [title]=\"item.Name\">\n {{ item.Name }}\n </div>\n <div class=\"mj-attachment-meta\">\n @if (item.FileSize) {\n <span>{{ FormatSize(item.FileSize) }}</span>\n <span>&bull;</span>\n }\n @if (item.CategoryName) {\n <span class=\"mj-attachment-cat-badge\">{{ item.CategoryName }}</span>\n <span>&bull;</span>\n }\n <span>{{ item.ContentType || 'File' }}</span>\n </div>\n @if (item.ProviderName) {\n <div class=\"mj-attachment-provider-tag\" [style.--provider-color]=\"GetProviderBrandColor(item)\">\n <i [class]=\"GetProviderIcon(item)\"></i>\n <span>{{ item.ProviderName }}</span>\n </div>\n }\n @if (item.Description) {\n <div class=\"mj-attachment-description\" [title]=\"item.Description\">\n {{ item.Description }}\n </div>\n }\n </div>\n </div>\n\n <!-- Streamlined Action Toolbar (Preview + Download + Overflow Menu) -->\n <div class=\"mj-attachment-actions\" (click)=\"$event.stopPropagation()\">\n @if (AllowPreview) {\n <button type=\"button\" class=\"mj-attachment-action-btn\" (click)=\"PreviewAttachment(item)\" title=\"Quick preview\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n }\n @if (AllowDownload) {\n <button type=\"button\" class=\"mj-attachment-action-btn\" (click)=\"DownloadAttachment(item)\" title=\"Download file\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n\n <!-- Overflow Menu Trigger -->\n <div class=\"mj-attachment-menu-container\">\n <button\n type=\"button\"\n class=\"mj-attachment-action-btn mj-attachment-action-btn--more\"\n [class.mj-attachment-action-btn--active]=\"ActiveMenuLinkID === item.LinkID\"\n (click)=\"ToggleItemMenu($event, item)\"\n title=\"More actions\"\n [attr.aria-expanded]=\"ActiveMenuLinkID === item.LinkID\"\n >\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n\n <!-- Dropdown Menu -->\n @if (ActiveMenuLinkID === item.LinkID) {\n <div class=\"mj-attachment-dropdown\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"OpenAttachmentRecord(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open in Workspace</span>\n </button>\n @if (AllowEditMetadata && UserCanUpdateFile) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"OpenEditMetadata(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-pen\"></i>\n <span>Edit Details</span>\n </button>\n }\n @if (AllowReplace && EffectiveAllowUpload) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"RequestReplace(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n <span>Replace File</span>\n </button>\n }\n @if (EffectiveAllowUnlink || EffectiveAllowDelete) {\n <div class=\"mj-attachment-dropdown-divider\"></div>\n }\n @if (EffectiveAllowUnlink) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item mj-attachment-dropdown-item--warning\" (click)=\"UnlinkAttachment(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-link-slash\"></i>\n <span>Unlink from Record</span>\n </button>\n }\n @if (EffectiveAllowDelete) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item mj-attachment-dropdown-item--danger\" (click)=\"DeleteAttachment(item, true); CloseItemMenu()\">\n <i class=\"fa-regular fa-trash-can\"></i>\n <span>Delete Completely</span>\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n\n <!-- ====================================================================\n EDIT ATTACHMENT DETAILS SUB-PANEL (Slide-in inside slide-panel)\n ==================================================================== -->\n @if (EditMetadataModalOpen && EditMetadataItem) {\n <div class=\"mj-record-attachments-subpanel\">\n <!-- Sub-Panel Top Navigation Bar -->\n <div class=\"mj-subpanel-header\">\n <button type=\"button\" class=\"mj-subpanel-back-btn\" (click)=\"CloseEditMetadataModal()\" title=\"Back to attachments\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <span>Back</span>\n </button>\n <div class=\"mj-subpanel-title\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span>Attachment Details</span>\n </div>\n <button type=\"button\" class=\"mj-subpanel-close-btn\" (click)=\"CloseEditMetadataModal()\" title=\"Close details\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Sub-Panel Body -->\n <div class=\"mj-subpanel-body\">\n <!-- File Info Summary Hero -->\n <div class=\"mj-subpanel-hero\">\n <div class=\"mj-subpanel-icon\" [ngClass]=\"GetFileColorClass(EditMetadataItem)\">\n <i [class]=\"GetFileIcon(EditMetadataItem)\"></i>\n </div>\n <div class=\"mj-subpanel-hero-info\">\n <div class=\"mj-subpanel-hero-name\" [title]=\"EditMetadataItem.Name\">{{ EditMetadataItem.Name }}</div>\n <div class=\"mj-subpanel-hero-meta\">\n <span>{{ FormatSize(EditMetadataItem.FileSize) }}</span>\n <span class=\"mj-subpanel-dot\">&bull;</span>\n <span>{{ EditMetadataItem.ContentType || 'Document' }}</span>\n @if (EditMetadataItem.ProviderName) {\n <span class=\"mj-subpanel-dot\">&bull;</span>\n <span class=\"mj-subpanel-storage-tag\">{{ EditMetadataItem.ProviderName }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- Edit Form -->\n <div class=\"mj-subpanel-form\">\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">File Name</label>\n <input\n type=\"text\"\n class=\"mj-form-input\"\n [(ngModel)]=\"EditMetadataName\"\n placeholder=\"e.g. document.pdf\"\n (keydown.enter)=\"EditMetadataName.trim() && !IsLoading && SaveEditMetadata()\"\n />\n <div class=\"mj-form-hint\">Changing the name updates the display title across all record views.</div>\n </div>\n\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Description (Optional)</label>\n <textarea\n class=\"mj-form-textarea\"\n [(ngModel)]=\"EditMetadataDescription\"\n rows=\"4\"\n placeholder=\"Add notes, tags, or context about this attachment...\"\n ></textarea>\n </div>\n\n <!-- Metadata Properties Card -->\n <div class=\"mj-subpanel-details-card\">\n <div class=\"mj-details-card-title\">Storage Information</div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Storage Account:</span>\n <span class=\"mj-details-value\">{{ EditMetadataItem.ProviderName || 'Default Storage' }}</span>\n </div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Attached On:</span>\n <span class=\"mj-details-value\">{{ EditMetadataItem.CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Status:</span>\n <span class=\"mj-details-badge\">{{ EditMetadataItem.Status || 'Active' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sub-Panel Footer Actions -->\n <div class=\"mj-subpanel-footer\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"CloseEditMetadataModal()\">\n Cancel\n </button>\n <div class=\"mj-subpanel-footer-right\">\n @if (AllowDownload) {\n <button\n type=\"button\"\n class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-secondary\"\n (click)=\"DownloadAttachment(EditMetadataItem)\"\n title=\"Open in new tab\"\n >\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-primary\"\n (click)=\"SaveEditMetadata()\"\n [disabled]=\"!EditMetadataName.trim() || IsLoading\"\n >\n <i class=\"fa-solid fa-check\"></i>\n <span>{{ IsLoading ? 'Saving...' : 'Save Changes' }}</span>\n </button>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n</mj-slide-panel>\n\n<!-- ====================================================================\n RICH MEDIA PREVIEW MODAL\n ==================================================================== -->\n@if (PreviewModalOpen && ActivePreviewItem) {\n <div class=\"mj-preview-modal-backdrop\" (click)=\"ClosePreviewModal()\">\n <div class=\"mj-preview-dialog\" (click)=\"$event.stopPropagation()\">\n \n <div class=\"mj-preview-dialog-header\">\n <div class=\"mj-preview-dialog-title\">\n <i [class]=\"GetFileIcon(ActivePreviewItem)\" [ngClass]=\"GetFileColorClass(ActivePreviewItem)\"></i>\n <span>{{ ActivePreviewItem.Name }}</span>\n </div>\n <button type=\"button\" class=\"mj-preview-close-btn\" (click)=\"ClosePreviewModal()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"mj-preview-dialog-body\">\n @if (IsLoadingPreview || !IsMediaLoaded) {\n <div class=\"mj-preview-loading-overlay\">\n <mj-loading [text]=\"'Loading ' + (ActivePreviewItem.Name || 'preview') + '...'\"></mj-loading>\n </div>\n }\n\n @switch (GetMediaType(ActivePreviewItem)) {\n @case ('image') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-image-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <img [src]=\"ActivePreviewUrl\" [alt]=\"ActivePreviewItem.Name\" (load)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\" />\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-image mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Preview could not be loaded</div>\n </div>\n }\n }\n @case ('pdf') {\n @if (ActivePreviewSafeUrl) {\n <div class=\"mj-preview-frame-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <iframe [src]=\"ActivePreviewSafeUrl\" title=\"PDF Preview\" (load)=\"OnPreviewMediaLoaded()\"></iframe>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-pdf mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">PDF preview could not be loaded</div>\n </div>\n }\n }\n @case ('video') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-media-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <video controls autoplay [src]=\"ActivePreviewUrl\" (loadeddata)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\"></video>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-video mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Video preview could not be loaded</div>\n </div>\n }\n }\n @case ('audio') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-media-container mj-preview-audio-box\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <div class=\"mj-preview-audio-icon\"><i class=\"fa-solid fa-headphones\"></i></div>\n <audio controls [src]=\"ActivePreviewUrl\" (loadeddata)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\"></audio>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-audio mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Audio preview could not be loaded</div>\n </div>\n }\n }\n @case ('text') {\n <div class=\"mj-preview-text-container\">\n <pre><code>{{ ActivePreviewTextContent || 'Loading content...' }}</code></pre>\n </div>\n }\n @default {\n <div class=\"mj-preview-generic-box\">\n <i [class]=\"GetFileIcon(ActivePreviewItem)\" class=\"mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">{{ ActivePreviewItem.ContentType || 'Document' }} &bull; {{ FormatSize(ActivePreviewItem.FileSize) }}</div>\n <div class=\"mj-preview-generic-desc\">{{ ActivePreviewItem.Description || 'Preview not available for this binary file format.' }}</div>\n </div>\n }\n }\n </div>\n\n <div class=\"mj-preview-dialog-footer\">\n <div class=\"mj-preview-footer-meta\">\n @if (ActivePreviewItem.ProviderName) {\n <span>Storage: <strong>{{ ActivePreviewItem.ProviderName }}</strong></span>\n }\n </div>\n <div class=\"mj-preview-footer-actions\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"ClosePreviewModal()\">Close</button>\n @if (AllowDownload) {\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-primary\" (click)=\"DownloadAttachment(ActivePreviewItem)\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download</span>\n </button>\n }\n </div>\n </div>\n\n </div>\n </div>\n}\n"]}
1
+ {"version":3,"file":"record-attachments.component.js","sourceRoot":"","sources":["../../../src/lib/record-attachments/record-attachments.component.ts","../../../src/lib/record-attachments/record-attachments.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n inject,\n ViewChild,\n ElementRef,\n HostListener,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, RunView, CompositeKey } from '@memberjunction/core';\nimport {\n MJFileEntity,\n MJFileEntityRecordLinkEntity,\n MJFileStorageProviderEntity,\n MJFileStorageAccountEntity,\n FileStorageEngineBase,\n StorageAccountWithProvider,\n UserInfoEngine,\n} from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { NavigationService, SharedService } from '@memberjunction/ng-shared';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { z } from 'zod';\nimport {\n RecordAttachmentItem,\n RecordAttachmentsConfig,\n AttachmentViewMode,\n AttachmentMediaType,\n GetAttachmentMediaType,\n FormatAttachmentFileSize,\n} from './record-attachments.types';\nimport {\n BeforeUploadAttachmentEventArgs,\n AfterUploadAttachmentEventArgs,\n BeforeDeleteAttachmentEventArgs,\n AfterDeleteAttachmentEventArgs,\n BeforeUnlinkAttachmentEventArgs,\n AfterUnlinkAttachmentEventArgs,\n BeforeDownloadAttachmentEventArgs,\n AfterDownloadAttachmentEventArgs,\n BeforePreviewAttachmentEventArgs,\n AfterPreviewAttachmentEventArgs,\n BeforeReplaceAttachmentEventArgs,\n AfterReplaceAttachmentEventArgs,\n} from './record-attachments.events';\n\nconst FileFieldsFragment = gql`\n fragment FileFields on MJFile_ {\n Category\n CategoryID\n ContentType\n _mj__CreatedAt\n Description\n ID\n Name\n Provider\n ProviderID\n ProviderKey\n Status\n _mj__UpdatedAt\n }\n`;\n\nconst UploadStorageFileMutation = gql`\n mutation UploadStorageFile($input: UploadStorageFileInput!) {\n UploadStorageFile(input: $input) {\n Success\n FileID\n ErrorMessage\n File {\n Category\n CategoryID\n ContentType\n _mj__CreatedAt\n Description\n ID\n Name\n Provider\n ProviderID\n ProviderKey\n Status\n _mj__UpdatedAt\n }\n }\n }\n`;\n\nconst UploadStorageFileMutationSchema = z.object({\n UploadStorageFile: z.object({\n Success: z.boolean(),\n FileID: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n File: z.object({\n ID: z.string(),\n Name: z.string().optional().nullable(),\n ProviderID: z.string().optional().nullable(),\n Provider: z.string().optional().nullable(),\n ContentType: z.string().optional().nullable(),\n Description: z.string().optional().nullable(),\n Status: z.string().optional().nullable(),\n CategoryID: z.string().optional().nullable(),\n Category: z.string().optional().nullable(),\n }).passthrough().optional().nullable(),\n }),\n});\n\nconst CreateUploadStageTokenMutation = `\n mutation CreateUploadStageToken {\n CreateUploadStageToken {\n Success\n Token\n Url\n ErrorMessage\n }\n }\n`;\n\nconst CreateUploadStageTokenMutationSchema = z.object({\n CreateUploadStageToken: z.object({\n Success: z.boolean(),\n Token: z.string().optional().nullable(),\n Url: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n }),\n});\n\nconst FileDownloadQuery = gql`\n query FileDownloadUrl($FileID: String!) {\n MJFile(ID: $FileID) {\n ContentType\n DownloadUrl\n }\n }\n`;\n\nconst FileDownloadQuerySchema = z.object({\n MJFile: z.object({\n ContentType: z.string().optional().nullable(),\n DownloadUrl: z.string(),\n }),\n});\n\nconst CreateMediaAccessTokenMutation = gql`\n mutation CreateMediaAccessToken($fileId: String!) {\n CreateMediaAccessToken(fileId: $fileId) {\n Success\n Token\n Url\n MimeType\n ErrorMessage\n }\n }\n`;\n\nconst CreateMediaAccessTokenMutationSchema = z.object({\n CreateMediaAccessToken: z.object({\n Success: z.boolean(),\n Token: z.string().optional().nullable(),\n Url: z.string().optional().nullable(),\n MimeType: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n }),\n});\n\nconst CreatePreAuthUploadUrlMutation = gql`\n mutation CreatePreAuthUploadUrl($input: CreatePreAuthUploadUrlInput!) {\n CreatePreAuthUploadUrl(input: $input) {\n UploadUrl\n ProviderKey\n }\n }\n`;\n\nconst CreatePreAuthUploadUrlMutationSchema = z.object({\n CreatePreAuthUploadUrl: z.object({\n UploadUrl: z.string().optional().nullable(),\n ProviderKey: z.string().optional().nullable(),\n }),\n});\n\n/**\n * World-class Angular component for displaying, previewing, uploading,\n * and managing file attachments linked to an entity record.\n *\n * Selector: `mj-record-attachments`\n */\n@Component({\n standalone: false,\n selector: 'mj-record-attachments',\n templateUrl: './record-attachments.component.html',\n styleUrls: ['./record-attachments.component.css'],\n})\nexport class RecordAttachmentsComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n private sanitizer = inject(DomSanitizer);\n\n private static readonly PREF_WIDTH_KEY = 'mj.recordAttachments.width';\n private static readonly PREF_VIEW_MODE_KEY = 'mj.recordAttachments.viewMode';\n\n // ────────────────────────────────────────────────────────────────────\n // Inputs\n // ────────────────────────────────────────────────────────────────────\n\n /** Entity record to load attachments for */\n @Input() Record?: BaseEntity;\n\n /** Explicit EntityID (alternative to passing Record) */\n @Input() EntityID?: string;\n\n /** Explicit RecordID (alternative to passing Record) */\n @Input() RecordID?: string;\n\n /** Bound attachment items (supports direct data-binding / manipulation) */\n @Input() Attachments: RecordAttachmentItem[] = [];\n\n /** Attachment configuration bag */\n @Input() Config?: RecordAttachmentsConfig;\n\n /** Whether the slide panel is visible */\n @Input() Visible: boolean = true;\n\n /** Whether the slide panel is resizable */\n @Input() Resizable: boolean = true;\n\n /** Initial width in px. 0 = auto/persisted setting */\n @Input() WidthPx: number = 0;\n\n /** Minimum panel width in px */\n @Input() MinWidthPx: number = 420;\n\n /** Maximum panel width ratio of viewport */\n @Input() MaxWidthRatio: number = 0.65;\n\n /** Panel title */\n @Input() Title: string = 'Attachments';\n\n /** Permissions / Feature flags */\n @Input() AllowUpload: boolean = true;\n @Input() AllowDelete: boolean = true;\n @Input() AllowUnlink: boolean = true;\n @Input() AllowDownload: boolean = true;\n @Input() AllowPreview: boolean = true;\n @Input() AllowReplace: boolean = true;\n @Input() AllowEditMetadata: boolean = true;\n\n /** UI Controls */\n @Input() ShowProviderFilter: boolean = true;\n @Input() ShowSearch: boolean = true;\n @Input() ViewMode: AttachmentViewMode = 'grid';\n\n // ────────────────────────────────────────────────────────────────────\n // Outputs / Events\n // ────────────────────────────────────────────────────────────────────\n\n @Output() PanelClosed = new EventEmitter<void>();\n @Output() WidthChanged = new EventEmitter<number>();\n @Output() AttachmentCountChanged = new EventEmitter<number>();\n @Output() ViewModeChanged = new EventEmitter<AttachmentViewMode>();\n\n @Output() BeforeUpload = new EventEmitter<BeforeUploadAttachmentEventArgs>();\n @Output() AfterUpload = new EventEmitter<AfterUploadAttachmentEventArgs>();\n\n @Output() BeforeDelete = new EventEmitter<BeforeDeleteAttachmentEventArgs>();\n @Output() AfterDelete = new EventEmitter<AfterDeleteAttachmentEventArgs>();\n\n @Output() BeforeUnlink = new EventEmitter<BeforeUnlinkAttachmentEventArgs>();\n @Output() AfterUnlink = new EventEmitter<AfterUnlinkAttachmentEventArgs>();\n\n @Output() BeforeDownload = new EventEmitter<BeforeDownloadAttachmentEventArgs>();\n @Output() AfterDownload = new EventEmitter<AfterDownloadAttachmentEventArgs>();\n\n @Output() BeforePreview = new EventEmitter<BeforePreviewAttachmentEventArgs>();\n @Output() AfterPreview = new EventEmitter<AfterPreviewAttachmentEventArgs>();\n\n @Output() BeforeReplace = new EventEmitter<BeforeReplaceAttachmentEventArgs>();\n @Output() AfterReplace = new EventEmitter<AfterReplaceAttachmentEventArgs>();\n\n // ────────────────────────────────────────────────────────────────────\n // Internal State\n // ────────────────────────────────────────────────────────────────────\n\n @ViewChild('fileInputRef') FileInputRef?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link FileInputRef}. */\n get fileInputRef(): ElementRef<HTMLInputElement> | undefined {\n return this.FileInputRef;\n }\n /** @deprecated Use {@link FileInputRef}. */\n set fileInputRef(value: ElementRef<HTMLInputElement> | undefined) {\n this.FileInputRef = value;\n }\n @ViewChild('replaceInputRef') ReplaceInputRef?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link ReplaceInputRef}. */\n get replaceInputRef(): ElementRef<HTMLInputElement> | undefined {\n return this.ReplaceInputRef;\n }\n /** @deprecated Use {@link ReplaceInputRef}. */\n set replaceInputRef(value: ElementRef<HTMLInputElement> | undefined) {\n this.ReplaceInputRef = value;\n }\n\n public IsLoading: boolean = false;\n public IsUploading: boolean = false;\n public UploadProgressPercent: number = 0;\n public UploadStatusText: string = '';\n public UploadingFileName: string = '';\n public SearchTerm: string = '';\n public SelectedProviderFilter: string = 'all'; // 'all' or ProviderID\n\n public StorageAccounts: StorageAccountWithProvider[] = [];\n public ActiveProviders: MJFileStorageProviderEntity[] = [];\n public SelectedStorageAccountID: string = '';\n\n /** User Permissions */\n public UserCanCreateFile: boolean = true;\n public UserCanDeleteFile: boolean = true;\n public UserCanUpdateFile: boolean = true;\n public UserCanCreateLink: boolean = true;\n public UserCanDeleteLink: boolean = true;\n\n /** Active Preview State */\n public PreviewModalOpen: boolean = false;\n public IsLoadingPreview: boolean = false;\n public IsMediaLoaded: boolean = false;\n public ActivePreviewItem: RecordAttachmentItem | null = null;\n public ActivePreviewUrl: string | null = null;\n public ActivePreviewSafeUrl: SafeResourceUrl | null = null;\n public ActivePreviewTextContent: string | null = null;\n\n /** Replace Target */\n private pendingReplaceItem: RecordAttachmentItem | null = null;\n private navigationService = inject(NavigationService, { optional: true });\n private mediaLoadedTimer?: ReturnType<typeof setTimeout>;\n\n /** Edit Metadata Dialog */\n public EditMetadataModalOpen: boolean = false;\n public EditMetadataItem: RecordAttachmentItem | null = null;\n public EditMetadataName: string = '';\n public EditMetadataDescription: string = '';\n\n /** Active Overflow Menu */\n public ActiveMenuLinkID: string | null = null;\n\n // ────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ────────────────────────────────────────────────────────────────────\n\n async ngOnInit(): Promise<void> {\n this.restoreUserPreferences();\n await this.checkStorageAndPermissions();\n if (this.Attachments.length === 0 && (this.Record || (this.EntityID && this.RecordID))) {\n await this.Refresh();\n }\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['Record'] || changes['EntityID'] || changes['RecordID']) {\n if (!changes['Record']?.firstChange && !changes['EntityID']?.firstChange && !changes['RecordID']?.firstChange) {\n await this.Refresh();\n }\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Preferences & Permissions\n // ────────────────────────────────────────────────────────────────────\n\n private restoreUserPreferences(): void {\n const savedWidth = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_WIDTH_KEY);\n if (savedWidth && !this.WidthPx) {\n this.WidthPx = parseInt(savedWidth, 10) || 520;\n } else if (!this.WidthPx) {\n this.WidthPx = 520;\n }\n\n const savedMode = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_VIEW_MODE_KEY);\n if (savedMode === 'grid' || savedMode === 'list') {\n this.ViewMode = savedMode;\n }\n }\n\n public OnWidthChanged(width: number): void {\n this.WidthPx = width;\n UserInfoEngine.Instance.SetSettingDebounced(RecordAttachmentsComponent.PREF_WIDTH_KEY, String(width));\n this.WidthChanged.emit(width);\n }\n\n public SetViewMode(mode: AttachmentViewMode): void {\n this.ViewMode = mode;\n UserInfoEngine.Instance.SetSettingDebounced(RecordAttachmentsComponent.PREF_VIEW_MODE_KEY, mode);\n this.ViewModeChanged.emit(mode);\n this.cdr.markForCheck();\n }\n\n private async checkStorageAndPermissions(): Promise<void> {\n try {\n await FileStorageEngineBase.Instance.Config(false);\n this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);\n this.StorageAccounts = FileStorageEngineBase.Instance.AccountsWithProviders.filter((ap) => ap.provider.IsActive !== false);\n\n // If initial cached check returns 0 accounts, force refresh from server in case cache was cold or stale\n if (this.StorageAccounts.length === 0) {\n await FileStorageEngineBase.Instance.Config(true);\n this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);\n this.StorageAccounts = FileStorageEngineBase.Instance.AccountsWithProviders.filter((ap) => ap.provider.IsActive !== false);\n }\n\n if (this.StorageAccounts.length > 0) {\n const preferredId = this.Config?.DefaultStorageAccountID;\n const matching = this.StorageAccounts.find((sa) => UUIDsEqual(sa.account.ID, preferredId));\n this.SelectedStorageAccountID = matching ? matching.account.ID : this.StorageAccounts[0].account.ID;\n }\n\n // Check Entity Permissions\n const md = this.ProviderToUse;\n const fileEntity = md.Entities.find((e) => e.Name === 'MJ: Files');\n const linkEntity = md.Entities.find((e) => e.Name === 'MJ: File Entity Record Links');\n const user = md.CurrentUser;\n\n if (fileEntity && user) {\n const perm = fileEntity.GetUserPermisions(user);\n this.UserCanCreateFile = perm.CanCreate;\n this.UserCanDeleteFile = perm.CanDelete;\n this.UserCanUpdateFile = perm.CanUpdate;\n }\n if (linkEntity && user) {\n const perm = linkEntity.GetUserPermisions(user);\n this.UserCanCreateLink = perm.CanCreate;\n this.UserCanDeleteLink = perm.CanDelete;\n }\n } catch (err) {\n console.warn('[RecordAttachmentsComponent] Storage check error:', err);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Effective IDs\n // ────────────────────────────────────────────────────────────────────\n\n public get EffectiveEntityID(): string | null {\n if (this.Record?.EntityInfo?.ID) return this.Record.EntityInfo.ID;\n return this.EntityID ?? null;\n }\n\n public get EffectiveRecordID(): string | null {\n if (this.Record) {\n if (this.Record.PrimaryKey?.KeyValuePairs?.length > 0) {\n const val = this.Record.PrimaryKey.KeyValuePairs[0].Value;\n if (val !== null && val !== undefined && String(val).length > 0) return String(val);\n }\n const pkVal = this.Record.PrimaryKey?.GetValueByIndex(0);\n if (pkVal !== null && pkVal !== undefined && String(pkVal).length > 0) return String(pkVal);\n if ('ID' in this.Record && (this.Record as unknown as { ID: string }).ID) {\n return String((this.Record as unknown as { ID: string }).ID);\n }\n }\n return this.RecordID ?? null;\n }\n\n public get EffectiveAllowUpload(): boolean {\n return this.AllowUpload && this.UserCanCreateFile && this.UserCanCreateLink && this.StorageAccounts.length > 0;\n }\n\n public get EffectiveAllowDelete(): boolean {\n return this.AllowDelete && this.UserCanDeleteFile && this.UserCanDeleteLink;\n }\n\n public get EffectiveAllowUnlink(): boolean {\n return this.AllowUnlink && this.UserCanDeleteLink;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Filtering & Computed Lists\n // ────────────────────────────────────────────────────────────────────\n\n public get FilteredAttachments(): RecordAttachmentItem[] {\n const term = (this.SearchTerm || '').toLowerCase().trim();\n const provider = this.SelectedProviderFilter;\n\n return this.Attachments.filter((item) => {\n const matchesProvider =\n provider === 'all' ||\n UUIDsEqual(item.ProviderID, provider) ||\n UUIDsEqual(item.StorageAccountID, provider);\n\n const matchesSearch =\n !term ||\n item.Name.toLowerCase().includes(term) ||\n (item.Description && item.Description.toLowerCase().includes(term)) ||\n (item.CategoryName && item.CategoryName.toLowerCase().includes(term)) ||\n (item.ContentType && item.ContentType.toLowerCase().includes(term));\n\n return matchesProvider && matchesSearch;\n });\n }\n\n public get ProviderCounts(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.Attachments) {\n const pid = item.ProviderID || 'unknown';\n counts.set(pid, (counts.get(pid) ?? 0) + 1);\n }\n return counts;\n }\n\n public GetProviderItemCount(providerId: string): number {\n return this.ProviderCounts.get(providerId) ?? 0;\n }\n\n public get TotalSizeFormatted(): string {\n const totalBytes = this.Attachments.reduce((acc, curr) => acc + (curr.FileSize ?? 0), 0);\n return FormatAttachmentFileSize(totalBytes);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public Verbs / Methods\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Refreshes the linked attachments list by querying `MJ: File Entity Record Links` and `MJ: Files`.\n */\n public async Refresh(): Promise<void> {\n const entityId = this.EffectiveEntityID;\n const recordId = this.EffectiveRecordID;\n\n if (!entityId || !recordId) {\n return;\n }\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n await this.checkStorageAndPermissions();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const linksResult = await rv.RunView<MJFileEntityRecordLinkEntity>({\n EntityName: 'MJ: File Entity Record Links',\n ExtraFilter: `EntityID='${entityId}' AND RecordID='${recordId}'`,\n ResultType: 'entity_object',\n });\n\n if (!linksResult.Success || !linksResult.Results) {\n this.Attachments = [];\n this.AttachmentCountChanged.emit(0);\n return;\n }\n\n const fileIds = linksResult.Results.map((link) => link.FileID).filter((id): id is string => !!id);\n\n if (fileIds.length === 0) {\n this.Attachments = [];\n this.AttachmentCountChanged.emit(0);\n return;\n }\n\n // Batch load files\n const fileFilter = fileIds.map((id) => `ID='${id}'`).join(' OR ');\n const filesResult = await rv.RunView<MJFileEntity>({\n EntityName: 'MJ: Files',\n ExtraFilter: fileFilter,\n ResultType: 'entity_object',\n });\n\n const filesMap = new Map<string, MJFileEntity>();\n if (filesResult.Success && filesResult.Results) {\n for (const file of filesResult.Results) {\n filesMap.set(NormalizeUUID(file.ID), file);\n }\n }\n\n // Map to RecordAttachmentItem\n this.Attachments = linksResult.Results.map((link) => {\n const file = link.FileID ? filesMap.get(NormalizeUUID(link.FileID)) : undefined;\n const provider = file?.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, file.ProviderID)) : undefined;\n const config = provider?.ConfigurationObject;\n return {\n LinkID: link.ID,\n FileID: link.FileID,\n Name: file?.Name ?? 'Untitled File',\n Description: file?.Description,\n ContentType: file?.ContentType,\n Status: file?.Status,\n ProviderName: file?.Provider,\n ProviderID: file?.ProviderID,\n ProviderIconClass: config?.IconClass || this.GetFallbackProviderIcon(file?.Provider),\n ProviderBrandColor: config?.BrandColor || undefined,\n CategoryID: file?.CategoryID,\n CategoryName: file?.Category,\n CreatedAt: file?.__mj_CreatedAt ? new Date(file.__mj_CreatedAt) : link.__mj_CreatedAt ? new Date(link.__mj_CreatedAt) : null,\n UpdatedAt: file?.__mj_UpdatedAt ? new Date(file.__mj_UpdatedAt) : null,\n FileEntity: file,\n LinkEntity: link,\n };\n });\n\n this.AttachmentCountChanged.emit(this.Attachments.length);\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Refresh error:', err);\n this.notifications.CreateSimpleNotification('Failed to load attachments', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Uploads one or more files and links them to the active record.\n */\n public async UploadFiles(files: File[], storageAccountId?: string, categoryId?: string): Promise<RecordAttachmentItem[]> {\n console.log('[RecordAttachmentsComponent] UploadFiles called with', files.length, 'file(s):', files.map(f => ({ name: f.name, size: f.size, type: f.type })));\n\n if (!files || files.length === 0) return [];\n\n const entityId = this.EffectiveEntityID;\n const recordId = this.EffectiveRecordID;\n\n console.log('[RecordAttachmentsComponent] Resolved upload context:', {\n entityId,\n recordId,\n recordName: this.Record?.EntityInfo?.Name,\n explicitEntityID: this.EntityID,\n explicitRecordID: this.RecordID,\n storageAccountsAvailable: this.StorageAccounts.length,\n selectedStorageAccountID: this.SelectedStorageAccountID\n });\n\n if (!entityId || !recordId) {\n const errMsg = `Cannot upload attachments: Missing record context (EntityID: ${entityId}, RecordID: ${recordId})`;\n console.error(`[RecordAttachmentsComponent] ${errMsg}`);\n this.notifications.CreateSimpleNotification('Cannot upload attachments: No record context available', 'error');\n return [];\n }\n\n if (this.StorageAccounts.length === 0) {\n const errMsg = 'Cannot upload attachments: No active file storage accounts are configured. Please configure a storage provider in system settings.';\n console.warn(`[RecordAttachmentsComponent] ${errMsg}`);\n this.notifications.CreateSimpleNotification(errMsg, 'warning');\n return [];\n }\n\n const targetAccountID = storageAccountId ?? this.SelectedStorageAccountID ?? this.StorageAccounts[0]?.account?.ID;\n const targetCategoryID = categoryId ?? this.Config?.DefaultCategoryID;\n\n // Fire BeforeUpload event\n const beforeEvent = new BeforeUploadAttachmentEventArgs(files, targetAccountID, targetCategoryID);\n this.BeforeUpload.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n console.log('[RecordAttachmentsComponent] Upload cancelled by BeforeUpload event');\n return [];\n }\n\n this.IsUploading = true;\n this.UploadProgressPercent = 5;\n this.UploadStatusText = `Preparing ${files.length} file${files.length === 1 ? '' : 's'}...`;\n this.cdr.markForCheck();\n\n const uploadedItems: RecordAttachmentItem[] = [];\n const uploadedFileEntities: MJFileEntity[] = [];\n\n try {\n const md = this.ProviderToUse;\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const fileIndex = i + 1;\n const progressBase = Math.round((i / files.length) * 100);\n\n this.UploadingFileName = file.name;\n this.UploadStatusText = `Reading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 10);\n this.cdr.markForCheck();\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Starting upload for '${file.name}' (${FormatAttachmentFileSize(file.size)}, type: '${file.type}')`);\n\n // Enforce max size if configured\n if (this.Config?.MaxFileSizeBytes && file.size > this.Config.MaxFileSizeBytes) {\n const maxStr = FormatAttachmentFileSize(this.Config.MaxFileSizeBytes);\n console.warn(`[RecordAttachmentsComponent] File '${file.name}' exceeds max size of ${maxStr}`);\n this.notifications.CreateSimpleNotification(`File '${file.name}' exceeds max size of ${maxStr}`, 'error');\n continue;\n }\n\n let fileId: string | null = null;\n let fileEntity: MJFileEntity | null = null;\n let directUploadSucceeded = false;\n\n const targetAccount = this.StorageAccounts.find((a) => UUIDsEqual(a.account.ID, targetAccountID));\n const timestamp = new Date().toISOString().slice(0, 10);\n const uniqueId = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 11);\n const objectPath = `artifacts/${timestamp}/${uniqueId}/${file.name}`;\n\n // ─────────────────────────────────────────────────────────────────────\n // 1. Try Direct Binary Upload via Pre-Authenticated URL (for S3, Azure Blob, GCS)\n // ─────────────────────────────────────────────────────────────────────\n const supportsDirectPreAuth = this.providerSupportsDirectUpload(targetAccount?.provider);\n if (supportsDirectPreAuth) {\n try {\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Requesting pre-auth upload URL for '${file.name}' on account '${targetAccountID}'...`);\n const preAuthResult = await GraphQLDataProvider.ExecuteGQL(CreatePreAuthUploadUrlMutation, {\n input: {\n AccountID: targetAccountID,\n ObjectName: objectPath,\n ContentType: file.type || 'application/octet-stream',\n },\n });\n\n const parsedPreAuth = CreatePreAuthUploadUrlMutationSchema.safeParse(preAuthResult);\n if (\n parsedPreAuth.success &&\n parsedPreAuth.data.CreatePreAuthUploadUrl.UploadUrl\n ) {\n const preAuth = parsedPreAuth.data.CreatePreAuthUploadUrl;\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Direct binary upload URL obtained. Streaming raw bytes...`);\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}) directly to storage...`;\n this.cdr.markForCheck();\n\n if (preAuth.UploadUrl) {\n await this.uploadBinaryDirect(\n preAuth.UploadUrl,\n file,\n (loaded, total) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const percent = Math.round((loaded / total) * 100);\n const computedPercent = Math.min(95, Math.round(currentFileBase + (percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(loaded);\n const totalStr = FormatAttachmentFileSize(total);\n if (percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${percent}%)...`;\n } else {\n this.UploadStatusText = `Registering ${file.name} in MemberJunction...`;\n }\n this.cdr.markForCheck();\n }\n );\n\n // Raw binary upload to cloud storage succeeded! Create MJ: Files database record\n this.UploadStatusText = `Saving ${file.name} record...`;\n this.cdr.markForCheck();\n\n const newFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n newFile.Name = file.name;\n newFile.ContentType = file.type || 'application/octet-stream';\n newFile.ProviderID = targetAccount?.provider?.ID || '';\n newFile.ProviderKey = preAuth.ProviderKey || objectPath;\n if (targetCategoryID) {\n newFile.CategoryID = targetCategoryID;\n }\n newFile.Status = 'Uploaded';\n const saved = await newFile.Save();\n if (saved) {\n fileEntity = newFile;\n fileId = newFile.ID;\n directUploadSucceeded = true;\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Direct binary upload & file record created (FileID: ${fileId})`);\n }\n }\n }\n } catch (preAuthErr) {\n console.warn(`[RecordAttachmentsComponent] Direct binary upload failed for '${file.name}', falling back to server upload:`, preAuthErr);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // 2. Tier 2: Ephemeral Binary Upload Staging + GraphQL Token Commit\n // ─────────────────────────────────────────────────────────────────────\n if (!directUploadSucceeded || !fileId) {\n try {\n // Mint a cryptographically signed media-upload staging token\n const mintResult = await GraphQLDataProvider.ExecuteGQL(CreateUploadStageTokenMutation, {});\n const parsedMint = CreateUploadStageTokenMutationSchema.safeParse(mintResult);\n const stageToken = parsedMint.success && parsedMint.data.CreateUploadStageToken.Success\n ? parsedMint.data.CreateUploadStageToken.Token\n : null;\n\n if (!stageToken) {\n throw new Error('Failed to obtain authenticated upload staging token.');\n }\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Staging binary bytes via /media/upload-stage...`);\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 2);\n this.cdr.markForCheck();\n\n const uploadToken = await this.uploadBinaryStage(file, stageToken, (loaded, total) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const percent = Math.round((loaded / total) * 100);\n const computedPercent = Math.min(95, Math.round(currentFileBase + (percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(loaded);\n const totalStr = FormatAttachmentFileSize(total);\n if (percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${percent}%)...`;\n } else {\n this.UploadStatusText = `Saving ${file.name} to storage provider...`;\n }\n this.cdr.markForCheck();\n });\n\n this.UploadStatusText = `Finalizing ${file.name} in MemberJunction...`;\n this.cdr.markForCheck();\n\n const gqlResult = await GraphQLDataProvider.ExecuteGQL(UploadStorageFileMutation, {\n input: {\n UploadToken: uploadToken,\n FileName: file.name,\n MimeType: file.type || 'application/octet-stream',\n AccountID: beforeEvent.StorageAccountID || undefined,\n CategoryID: beforeEvent.CategoryID || undefined,\n },\n });\n\n const parsed = UploadStorageFileMutationSchema.safeParse(gqlResult);\n if (parsed.success && parsed.data.UploadStorageFile.Success && parsed.data.UploadStorageFile.FileID) {\n fileId = parsed.data.UploadStorageFile.FileID;\n const loadedFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n const ok = await loadedFile.Load(fileId);\n if (ok) {\n fileEntity = loadedFile;\n directUploadSucceeded = true;\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Tier 2 binary staging & upload completed (FileID: ${fileId})`);\n }\n }\n } catch (stageErr) {\n console.warn(`[RecordAttachmentsComponent] Tier 2 binary staging failed, falling back to base64:`, stageErr);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // 3. Tier 3 (Fallback): Base64 Upload via UploadStorageFile mutation\n // ─────────────────────────────────────────────────────────────────────\n if (!directUploadSucceeded || !fileId) {\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Using Tier 3 fallback base64 server upload...`);\n const base64Data = await this.fileToBase64(file);\n\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 2);\n this.cdr.markForCheck();\n\n const input = {\n FileName: file.name,\n Base64Data: base64Data,\n MimeType: file.type || 'application/octet-stream',\n AccountID: beforeEvent.StorageAccountID || undefined,\n CategoryID: beforeEvent.CategoryID || undefined,\n };\n\n const gqlResult = await GraphQLDataProvider.ExecuteGQLWithProgress(\n UploadStorageFileMutation,\n { input },\n (progress) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const computedPercent = Math.min(95, Math.round(currentFileBase + (progress.percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(progress.loaded);\n const totalStr = FormatAttachmentFileSize(progress.total);\n if (progress.percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${progress.percent}%)...`;\n } else {\n this.UploadStatusText = `Processing ${file.name} on storage server...`;\n }\n this.cdr.markForCheck();\n }\n );\n\n const parsed = UploadStorageFileMutationSchema.safeParse(gqlResult);\n if (!parsed.success || !parsed.data.UploadStorageFile.Success || !parsed.data.UploadStorageFile.FileID) {\n const errorMsg = parsed.success ? parsed.data.UploadStorageFile.ErrorMessage : 'Upload response parsing failed';\n console.error(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Failed to upload '${file.name}':`, errorMsg, parsed);\n this.notifications.CreateSimpleNotification(`Failed to upload '${file.name}': ${errorMsg || 'Unknown error'}`, 'error');\n continue;\n }\n\n fileId = parsed.data.UploadStorageFile.FileID;\n const loadedFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n const ok = await loadedFile.Load(fileId);\n if (ok) {\n fileEntity = loadedFile;\n }\n }\n\n if (!fileId || !fileEntity) {\n console.error(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] File record unavailable for '${file.name}'`);\n continue;\n }\n\n uploadedFileEntities.push(fileEntity);\n\n this.UploadStatusText = `Linking ${file.name} to record...`;\n this.UploadProgressPercent = progressBase + Math.round((1 / files.length) * 95);\n this.cdr.markForCheck();\n\n // Create Link Entity\n const linkEntity: MJFileEntityRecordLinkEntity = await md.GetEntityObject('MJ: File Entity Record Links');\n linkEntity.FileID = fileId;\n linkEntity.EntityID = entityId;\n linkEntity.RecordID = recordId;\n const linkSuccess = await linkEntity.Save();\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Record link saved (success: ${linkSuccess}, LinkID: ${linkEntity.ID})`);\n\n if (linkSuccess && fileEntity) {\n const provider = fileEntity.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, fileEntity.ProviderID)) : undefined;\n const config = provider?.ConfigurationObject;\n const newItem: RecordAttachmentItem = {\n LinkID: linkEntity.ID,\n FileID: fileEntity.ID,\n Name: fileEntity.Name,\n Description: fileEntity.Description,\n ContentType: fileEntity.ContentType,\n Status: fileEntity.Status,\n ProviderName: fileEntity.Provider,\n ProviderID: fileEntity.ProviderID,\n ProviderIconClass: config?.IconClass || this.GetFallbackProviderIcon(fileEntity.Provider),\n ProviderBrandColor: config?.BrandColor || undefined,\n CategoryID: fileEntity.CategoryID,\n CategoryName: fileEntity.Category,\n CreatedAt: new Date(),\n FileSize: file.size,\n FileEntity: fileEntity,\n LinkEntity: linkEntity,\n };\n uploadedItems.push(newItem);\n this.Attachments.unshift(newItem);\n }\n }\n\n this.UploadProgressPercent = 100;\n this.UploadStatusText = 'Upload complete!';\n this.cdr.markForCheck();\n\n if (uploadedItems.length > 0) {\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterUpload.emit(new AfterUploadAttachmentEventArgs(uploadedItems, uploadedFileEntities));\n this.notifications.CreateSimpleNotification(\n `Successfully attached ${uploadedItems.length} file${uploadedItems.length === 1 ? '' : 's'}`,\n 'success'\n );\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Upload error:', err);\n const errMsg = err instanceof Error ? err.message : 'Error uploading attachments';\n this.notifications.CreateSimpleNotification(errMsg, 'error');\n } finally {\n this.IsUploading = false;\n this.UploadProgressPercent = 0;\n this.UploadStatusText = '';\n this.UploadingFileName = '';\n this.cdr.markForCheck();\n }\n\n return uploadedItems;\n }\n\n /**\n * Unlinks an attachment from the record (keeps file in storage).\n */\n public async UnlinkAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforeUnlinkAttachmentEventArgs(attachment);\n this.BeforeUnlink.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const linkEntity: MJFileEntityRecordLinkEntity = attachment.LinkEntity ?? (await md.GetEntityObject('MJ: File Entity Record Links'));\n if (!attachment.LinkEntity) {\n await linkEntity.Load(attachment.LinkID);\n }\n\n const success = await linkEntity.Delete();\n if (success) {\n this.Attachments = this.Attachments.filter((a) => !UUIDsEqual(a.LinkID, attachment.LinkID));\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterUnlink.emit(new AfterUnlinkAttachmentEventArgs(attachment));\n this.notifications.CreateSimpleNotification(`Unlinked '${attachment.Name}' from record`, 'info');\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Failed to unlink '${attachment.Name}'`, 'error');\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Unlink error:', err);\n this.notifications.CreateSimpleNotification('Failed to unlink attachment', 'error');\n return false;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Deletes an attachment completely (unlinks and deletes from storage provider).\n */\n public async DeleteAttachment(attachment: RecordAttachmentItem, hardDelete: boolean = true): Promise<boolean> {\n const beforeEvent = new BeforeDeleteAttachmentEventArgs(attachment, hardDelete);\n this.BeforeDelete.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n\n // 1. Delete link\n if (attachment.LinkID) {\n const linkEntity: MJFileEntityRecordLinkEntity = attachment.LinkEntity ?? (await md.GetEntityObject('MJ: File Entity Record Links'));\n if (!attachment.LinkEntity) {\n await linkEntity.Load(attachment.LinkID);\n }\n await linkEntity.Delete();\n }\n\n // 2. Delete file if hardDelete requested\n if (hardDelete && attachment.FileID) {\n const fileEntity: MJFileEntity = attachment.FileEntity ?? (await md.GetEntityObject('MJ: Files'));\n if (!attachment.FileEntity) {\n await fileEntity.Load(attachment.FileID);\n }\n await fileEntity.Delete();\n }\n\n this.Attachments = this.Attachments.filter((a) => !UUIDsEqual(a.LinkID, attachment.LinkID));\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterDelete.emit(new AfterDeleteAttachmentEventArgs(attachment, hardDelete));\n this.notifications.CreateSimpleNotification(`Deleted '${attachment.Name}'`, 'info');\n return true;\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Delete error:', err);\n this.notifications.CreateSimpleNotification('Failed to delete attachment', 'error');\n return false;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Resolves an authenticated inline URL for streaming, previewing, and opening in a new tab.\n * Prefers the inline streaming endpoint (/media/:fileId?token=...) so the browser renders\n * the document/media natively without triggering forced attachment downloads or Save As dialogs.\n */\n private async getInlineFileUrl(fileId: string): Promise<string | null> {\n try {\n const mediaResult = await GraphQLDataProvider.ExecuteGQL(CreateMediaAccessTokenMutation, { fileId });\n const parsedMedia = CreateMediaAccessTokenMutationSchema.safeParse(mediaResult);\n if (parsedMedia.success && parsedMedia.data.CreateMediaAccessToken.Success && parsedMedia.data.CreateMediaAccessToken.Url) {\n return parsedMedia.data.CreateMediaAccessToken.Url;\n }\n } catch (err) {\n console.warn('[RecordAttachmentsComponent] CreateMediaAccessToken failed, trying fallback DownloadUrl:', err);\n }\n\n try {\n const gqlResult = await GraphQLDataProvider.ExecuteGQL(FileDownloadQuery, { FileID: fileId });\n const parsed = FileDownloadQuerySchema.safeParse(gqlResult);\n if (parsed.success && parsed.data.MJFile?.DownloadUrl) {\n return parsed.data.MJFile.DownloadUrl;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] GetInlineFileUrl fallback failed:', err);\n }\n\n return null;\n }\n\n /**\n * Opens the attachment in a new browser tab for direct viewing.\n */\n public async DownloadAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforeDownloadAttachmentEventArgs(attachment);\n this.BeforeDownload.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n try {\n const url = await this.getInlineFileUrl(attachment.FileID);\n if (url) {\n // Open directly in a new tab so the browser displays the document\n window.open(url, '_blank', 'noopener,noreferrer');\n this.AfterDownload.emit(new AfterDownloadAttachmentEventArgs(attachment, url));\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Unable to open '${attachment.Name}'`, 'error');\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Open in tab error:', err);\n this.notifications.CreateSimpleNotification('Failed to open file', 'error');\n return false;\n }\n }\n\n /**\n * Opens the in-app rich media preview modal for an attachment.\n */\n public async PreviewAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforePreviewAttachmentEventArgs(attachment);\n this.BeforePreview.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.ActivePreviewItem = attachment;\n this.IsLoadingPreview = true;\n this.IsMediaLoaded = false;\n this.PreviewModalOpen = true;\n this.ActivePreviewUrl = null;\n this.ActivePreviewSafeUrl = null;\n this.ActivePreviewTextContent = null;\n this.cdr.markForCheck();\n\n try {\n const url = await this.getInlineFileUrl(attachment.FileID);\n if (url) {\n this.ActivePreviewUrl = url;\n this.ActivePreviewSafeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);\n\n // For text media types, fetch content directly for syntax preview\n const mediaType = this.GetMediaType(attachment);\n if (mediaType === 'text') {\n try {\n const resp = await window.fetch(url);\n if (resp.ok) {\n this.ActivePreviewTextContent = await resp.text();\n }\n } catch {\n // Text fetch failed, fallback to viewer\n }\n this.IsMediaLoaded = true;\n }\n\n this.AfterPreview.emit(new AfterPreviewAttachmentEventArgs(attachment));\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Unable to load preview for '${attachment.Name}'`, 'error');\n this.IsMediaLoaded = true;\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Preview error:', err);\n this.notifications.CreateSimpleNotification('Preview failed', 'error');\n this.IsMediaLoaded = true;\n return false;\n } finally {\n this.IsLoadingPreview = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnPreviewMediaLoaded(): void {\n if (this.mediaLoadedTimer) clearTimeout(this.mediaLoadedTimer);\n // Smoothly retain loading spinner for ~350ms so internal iframe/canvas rasterization finishes before fade-in\n this.mediaLoadedTimer = setTimeout(() => {\n this.IsMediaLoaded = true;\n this.cdr.markForCheck();\n }, 350);\n }\n\n /**\n * Opens the file record in a dedicated MJ Explorer workspace tab and closes the attachments slide-in panel.\n * If running standalone/outside Explorer, falls back to opening the in-app media preview modal.\n */\n public OpenAttachmentRecord(attachment: RecordAttachmentItem): void {\n if (attachment.FileID) {\n const pkey = CompositeKey.FromID(attachment.FileID); // first-pk-ok: FileID is the FK to MJ: Files (opened two lines below) — core entity keyed by ID\n if (this.navigationService) {\n this.navigationService.OpenEntityRecord('MJ: Files', pkey);\n } else {\n SharedService.Instance.OpenEntityRecord('MJ: Files', pkey);\n }\n this.ClosePanel();\n this.ClosePreviewModal();\n } else {\n void this.PreviewAttachment(attachment);\n }\n }\n\n /**\n * Initiates replace workflow for an existing attachment.\n */\n public RequestReplace(attachment: RecordAttachmentItem): void {\n this.pendingReplaceItem = attachment;\n this.ReplaceInputRef?.nativeElement.click();\n }\n\n /**\n * Replaces an existing attachment with a newly uploaded file.\n */\n public async ReplaceAttachment(attachment: RecordAttachmentItem, newFile: File): Promise<RecordAttachmentItem | null> {\n const beforeEvent = new BeforeReplaceAttachmentEventArgs(attachment, newFile);\n this.BeforeReplace.emit(beforeEvent);\n if (beforeEvent.Cancel) return null;\n\n this.IsUploading = true;\n this.cdr.markForCheck();\n\n try {\n // 1. Upload new file\n const uploaded = await this.UploadFiles([newFile], attachment.StorageAccountID || undefined, attachment.CategoryID || undefined);\n if (uploaded.length === 0) return null;\n\n const newAttachment = uploaded[0];\n\n // 2. Unlink old file\n await this.UnlinkAttachment(attachment);\n\n this.AfterReplace.emit(new AfterReplaceAttachmentEventArgs(attachment, newAttachment));\n this.notifications.CreateSimpleNotification(`Replaced '${attachment.Name}' with '${newAttachment.Name}'`, 'success');\n return newAttachment;\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Replace error:', err);\n this.notifications.CreateSimpleNotification('Replace failed', 'error');\n return null;\n } finally {\n this.IsUploading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // UI Actions & Helpers\n // ────────────────────────────────────────────────────────────────────\n\n public ClosePanel(): void {\n this.PanelClosed.emit();\n }\n\n public ClosePreviewModal(): void {\n if (this.mediaLoadedTimer) {\n clearTimeout(this.mediaLoadedTimer);\n }\n this.PreviewModalOpen = false;\n this.IsLoadingPreview = false;\n this.IsMediaLoaded = false;\n this.ActivePreviewItem = null;\n this.ActivePreviewUrl = null;\n this.ActivePreviewSafeUrl = null;\n this.ActivePreviewTextContent = null;\n this.cdr.markForCheck();\n }\n\n public OpenEditMetadata(attachment: RecordAttachmentItem): void {\n this.EditMetadataItem = attachment;\n this.EditMetadataName = attachment.Name;\n this.EditMetadataDescription = attachment.Description || '';\n this.EditMetadataModalOpen = true;\n this.cdr.markForCheck();\n }\n\n public CloseEditMetadataModal(): void {\n this.EditMetadataModalOpen = false;\n this.EditMetadataItem = null;\n this.cdr.markForCheck();\n }\n\n public async SaveEditMetadata(): Promise<void> {\n if (!this.EditMetadataItem || !this.EditMetadataName.trim()) return;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const fileEntity: MJFileEntity = this.EditMetadataItem.FileEntity ?? (await md.GetEntityObject('MJ: Files'));\n if (!this.EditMetadataItem.FileEntity) {\n await fileEntity.Load(this.EditMetadataItem.FileID);\n }\n\n fileEntity.Name = this.EditMetadataName.trim();\n fileEntity.Description = this.EditMetadataDescription.trim() || null;\n\n const success = await fileEntity.Save();\n if (success) {\n this.EditMetadataItem.Name = fileEntity.Name;\n this.EditMetadataItem.Description = fileEntity.Description;\n this.notifications.CreateSimpleNotification('Attachment details updated', 'success');\n this.CloseEditMetadataModal();\n } else {\n this.notifications.CreateSimpleNotification('Failed to update attachment details', 'error');\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Save metadata error:', err);\n this.notifications.CreateSimpleNotification('Update failed', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnFilesSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n console.log('[RecordAttachmentsComponent] OnFilesSelected event fired, files count:', input.files?.length);\n if (input.files && input.files.length > 0) {\n const filesArray = Array.from(input.files);\n input.value = '';\n void this.UploadFiles(filesArray);\n }\n }\n\n public OnReplaceFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n console.log('[RecordAttachmentsComponent] OnReplaceFileSelected event fired, files count:', input.files?.length);\n if (input.files && input.files.length > 0 && this.pendingReplaceItem) {\n const file = input.files[0];\n const target = this.pendingReplaceItem;\n this.pendingReplaceItem = null;\n input.value = '';\n void this.ReplaceAttachment(target, file);\n }\n }\n\n public OnDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n public OnDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n console.log('[RecordAttachmentsComponent] OnDrop event fired, dataTransfer files count:', event.dataTransfer?.files?.length);\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\n const filesArray = Array.from(event.dataTransfer.files);\n void this.UploadFiles(filesArray);\n }\n }\n\n public GetMediaType(attachment: RecordAttachmentItem): AttachmentMediaType {\n return GetAttachmentMediaType(attachment.ContentType, attachment.Name);\n }\n\n public FormatSize(bytes?: number | null): string {\n return FormatAttachmentFileSize(bytes);\n }\n\n public GetFileIcon(attachment: RecordAttachmentItem): string {\n const mediaType = this.GetMediaType(attachment);\n switch (mediaType) {\n case 'pdf':\n return 'fa-solid fa-file-pdf';\n case 'image':\n return 'fa-solid fa-file-image';\n case 'video':\n return 'fa-solid fa-file-video';\n case 'audio':\n return 'fa-solid fa-file-audio';\n case 'text':\n return 'fa-solid fa-file-code';\n case 'document':\n return 'fa-solid fa-file-word';\n default:\n return 'fa-solid fa-file';\n }\n }\n\n public GetFileColorClass(attachment: RecordAttachmentItem): string {\n const mediaType = this.GetMediaType(attachment);\n return `mj-attachment-thumb--${mediaType}`;\n }\n\n @HostListener('document:click')\n public OnDocumentClick(): void {\n this.CloseItemMenu();\n }\n\n @HostListener('document:keydown.escape')\n public OnEscapePress(): void {\n this.CloseItemMenu();\n }\n\n public ToggleItemMenu(event: MouseEvent, item: RecordAttachmentItem): void {\n event.stopPropagation();\n this.ActiveMenuLinkID = this.ActiveMenuLinkID === item.LinkID ? null : item.LinkID;\n this.cdr.markForCheck();\n }\n\n public CloseItemMenu(): void {\n if (this.ActiveMenuLinkID !== null) {\n this.ActiveMenuLinkID = null;\n this.cdr.markForCheck();\n }\n }\n\n public GetProviderIcon(item: RecordAttachmentItem): string {\n if (item.ProviderIconClass) {\n return item.ProviderIconClass;\n }\n const provider = item.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, item.ProviderID)) : null;\n const config = provider?.ConfigurationObject;\n if (config?.IconClass) {\n return config.IconClass;\n }\n return this.GetFallbackProviderIcon(item.ProviderName);\n }\n\n public GetProviderBrandColor(item: RecordAttachmentItem): string | undefined {\n if (item.ProviderBrandColor) {\n return item.ProviderBrandColor;\n }\n const provider = item.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, item.ProviderID)) : null;\n const config = provider?.ConfigurationObject;\n return config?.BrandColor || undefined;\n }\n\n public GetFallbackProviderIcon(providerName?: string | null): string {\n const name = (providerName || '').toLowerCase();\n if (name.includes('box')) return 'fa-solid fa-box';\n if (name.includes('aws') || name.includes('s3')) return 'fa-brands fa-aws';\n if (name.includes('azure')) return 'fa-brands fa-microsoft';\n if (name.includes('google drive')) return 'fa-brands fa-google-drive';\n if (name.includes('google cloud') || name.includes('gcs') || name.includes('google')) return 'fa-brands fa-google';\n if (name.includes('dropbox')) return 'fa-brands fa-dropbox';\n if (name.includes('sharepoint') || name.includes('onedrive')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-cloud';\n }\n\n private providerSupportsDirectUpload(provider?: MJFileStorageProviderEntity | null): boolean {\n if (!provider) return false;\n const key = (provider.ServerDriverKey || '').toLowerCase();\n const name = (provider.Name || '').toLowerCase();\n return (\n key.includes('aws') ||\n key.includes('azure') ||\n key.includes('google cloud') ||\n name.includes('aws') ||\n name.includes('s3') ||\n name.includes('azure') ||\n name.includes('google cloud')\n );\n }\n\n private triggerBrowserDownload(url: string, fileName: string): void {\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n link.parentNode?.removeChild(link);\n }\n\n /**\n * Performs an authenticated direct binary upload of a raw File/Blob to a pre-authenticated cloud storage URL.\n */\n private uploadBinaryDirect(\n uploadUrl: string,\n file: File,\n onProgress?: (loaded: number, total: number) => void\n ): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('PUT', uploadUrl, true);\n\n // Set standard content type\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n\n // For Azure Blob Storage SAS uploads, add the required block blob header\n if (uploadUrl.includes('.blob.core.windows.net')) {\n xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');\n }\n\n if (xhr.upload && onProgress) {\n xhr.upload.onprogress = (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded, event.total);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(true);\n } else {\n reject(new Error(`Direct binary upload failed with HTTP status ${xhr.status}: ${xhr.statusText}`));\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred during direct binary upload.'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('Direct binary upload timed out.'));\n };\n\n xhr.send(file);\n });\n }\n\n /**\n * Performs an authenticated raw binary streaming upload to the /media/upload-stage REST endpoint.\n * Uses the cryptographically signed media-upload token minted by CreateUploadStageToken.\n * Returns an ephemeral single-use upload token to pass to the GraphQL UploadStorageFile mutation.\n */\n private uploadBinaryStage(\n file: File,\n stageToken: string,\n onProgress?: (loaded: number, total: number) => void\n ): Promise<string> {\n return new Promise((resolve, reject) => {\n let uploadUrl = '/media/upload-stage';\n const gqlUrl = GraphQLDataProvider.Instance?.ConfigData?.URL;\n if (gqlUrl && gqlUrl.startsWith('http')) {\n uploadUrl = gqlUrl.replace(/\\/graphql\\/?$/i, '').replace(/\\/+$/, '') + '/media/upload-stage';\n }\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', uploadUrl, true);\n\n // Signed media-upload token\n xhr.setRequestHeader('Authorization', `Bearer ${stageToken}`);\n\n // Metadata headers\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n xhr.setRequestHeader('x-file-name', encodeURIComponent(file.name));\n\n if (xhr.upload && onProgress) {\n xhr.upload.onprogress = (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded, event.total);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const res = JSON.parse(xhr.responseText) as { Success?: boolean; UploadToken?: string; ErrorMessage?: string };\n if (res.Success && res.UploadToken) {\n resolve(res.UploadToken);\n } else {\n reject(new Error(res.ErrorMessage || 'Upload staging returned unsuccessful status'));\n }\n } catch {\n reject(new Error('Failed to parse upload staging response JSON'));\n }\n } else {\n let errorDetail = xhr.statusText;\n try {\n const errRes = JSON.parse(xhr.responseText) as { ErrorMessage?: string };\n if (errRes.ErrorMessage) {\n errorDetail = errRes.ErrorMessage;\n }\n } catch {\n // keep statusText\n }\n reject(new Error(`Upload staging failed with HTTP status ${xhr.status}: ${errorDetail}`));\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred during upload staging.'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('Upload staging timed out.'));\n };\n\n xhr.send(file);\n });\n }\n\n private fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n const base64 = result.substring(result.indexOf(',') + 1);\n resolve(base64);\n } else {\n reject(new Error('Failed to read file as base64 string'));\n }\n };\n reader.onerror = (err) => reject(err);\n reader.readAsDataURL(file);\n });\n }\n}\n","<mj-slide-panel\n [Mode]=\"'slide'\"\n [Title]=\"Title\"\n [Visible]=\"Visible\"\n [Resizable]=\"Resizable\"\n [MinWidthPx]=\"MinWidthPx\"\n [MaxWidthRatio]=\"MaxWidthRatio\"\n [WidthPx]=\"WidthPx\"\n (Closed)=\"ClosePanel()\"\n (WidthChanged)=\"OnWidthChanged($event)\">\n\n <div class=\"mj-record-attachments-wrapper\">\n \n <!-- Top Meta Strip -->\n <div class=\"mj-record-attachments-meta-strip\">\n <div class=\"mj-record-attachments-summary\">\n <span class=\"mj-record-attachments-badge\">\n {{ Attachments.length }} {{ Attachments.length === 1 ? 'attachment' : 'attachments' }}\n @if (Attachments.length > 0) {\n &bull; {{ TotalSizeFormatted }}\n }\n </span>\n </div>\n\n <div class=\"mj-record-attachments-top-actions\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"Refresh()\" [disabled]=\"IsLoading\" title=\"Refresh attachments\">\n <i class=\"fa-solid fa-rotate-right\" [class.fa-spin]=\"IsLoading\"></i>\n </button>\n </div>\n </div>\n\n <!-- Provider Filter Pills & View Toggle -->\n <div class=\"mj-record-attachments-controls-bar\">\n @if (ShowProviderFilter && ActiveProviders.length > 1) {\n <div class=\"mj-provider-pills\">\n <button type=\"button\" class=\"mj-provider-pill\" [class.active]=\"SelectedProviderFilter === 'all'\" (click)=\"SelectedProviderFilter = 'all'\">\n <span>All Providers</span>\n <span class=\"mj-pill-count\">({{ Attachments.length }})</span>\n </button>\n @for (provider of ActiveProviders; track provider.ID) {\n <button type=\"button\" class=\"mj-provider-pill\" [class.active]=\"SelectedProviderFilter === provider.ID\" (click)=\"SelectedProviderFilter = provider.ID\">\n <span>{{ provider.Name }}</span>\n <span class=\"mj-pill-count\">({{ GetProviderItemCount(provider.ID) }})</span>\n </button>\n }\n </div>\n }\n\n <div class=\"mj-view-controls\">\n <button type=\"button\" class=\"mj-view-toggle-btn\" [class.active]=\"ViewMode === 'grid'\" (click)=\"SetViewMode('grid')\" title=\"Card Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button type=\"button\" class=\"mj-view-toggle-btn\" [class.active]=\"ViewMode === 'list'\" (click)=\"SetViewMode('list')\" title=\"Detailed List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"mj-record-attachments-content\">\n \n @if (!IsLoading && StorageAccounts.length === 0) {\n <div class=\"mj-record-attachments-alert\">\n <mj-alert\n Type=\"warning\"\n Title=\"No Active Storage Providers Configured\"\n Message=\"No active file storage providers or accounts were found. Configure a storage provider (such as Azure Blob Storage, AWS S3, or Box) in the Storage Subsystem settings to enable uploading files.\">\n </mj-alert>\n </div>\n }\n\n <!-- Upload Progress Status Banner -->\n @if (IsUploading) {\n <div class=\"mj-upload-progress-banner\">\n <div class=\"mj-upload-progress-header\">\n <div class=\"mj-upload-progress-info\">\n <i class=\"fa-solid fa-cloud-arrow-up fa-bounce mj-upload-progress-icon\"></i>\n <span class=\"mj-upload-progress-text\">{{ UploadStatusText }}</span>\n </div>\n <span class=\"mj-upload-progress-pct\">{{ UploadProgressPercent }}%</span>\n </div>\n <div class=\"mj-upload-progress-track\">\n <div class=\"mj-upload-progress-bar\" [style.width.%]=\"UploadProgressPercent\"></div>\n </div>\n </div>\n }\n\n <!-- Drag & Drop Upload Zone -->\n @if (EffectiveAllowUpload) {\n <div class=\"mj-upload-dropzone\" [class.disabled]=\"IsUploading\" (dragover)=\"OnDragOver($event)\" (drop)=\"OnDrop($event)\" (click)=\"!IsUploading && fileInputRef.click()\">\n <i class=\"fa-solid fa-cloud-arrow-up mj-upload-dropzone-icon\"></i>\n <div class=\"mj-upload-dropzone-title\">\n Drop files to attach, or <span class=\"mj-upload-dropzone-link\">Browse</span>\n </div>\n <div class=\"mj-upload-dropzone-subtitle\">\n Direct secure storage upload &bull; Max {{ Config?.MaxFileSizeBytes ? FormatSize(Config?.MaxFileSizeBytes) : '50 MB' }}\n </div>\n\n @if (StorageAccounts.length > 1) {\n <div class=\"mj-upload-storage-row\" (click)=\"$event.stopPropagation()\">\n <span>Target storage:</span>\n <select class=\"mj-upload-storage-select\" [(ngModel)]=\"SelectedStorageAccountID\" [disabled]=\"IsUploading\">\n @for (sa of StorageAccounts; track sa.account.ID) {\n <option [value]=\"sa.account.ID\">{{ sa.account.Name }} ({{ sa.provider.Name }})</option>\n }\n </select>\n </div>\n }\n <input type=\"file\" #fileInputRef multiple style=\"display: none;\" (change)=\"OnFilesSelected($event)\" />\n </div>\n }\n\n <!-- Search Filter -->\n @if (ShowSearch && Attachments.length > 0) {\n <div class=\"mj-attachments-search-bar\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input type=\"text\" [(ngModel)]=\"SearchTerm\" placeholder=\"Filter attachments by name, category, extension...\" />\n @if (SearchTerm) {\n <button type=\"button\" class=\"mj-clear-search-btn\" (click)=\"SearchTerm = ''\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Hidden Input for Replace Action -->\n <input type=\"file\" #replaceInputRef style=\"display: none;\" (change)=\"OnReplaceFileSelected($event)\" />\n\n <!-- Attachments List / Grid -->\n @if (IsLoading) {\n <div class=\"mj-record-attachments-loading\">\n <mj-loading text=\"Loading attachments...\"></mj-loading>\n </div>\n } @else if (FilteredAttachments.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-paperclip\"\n [Title]=\"SearchTerm ? 'No matching attachments' : 'No attachments yet'\"\n [Message]=\"SearchTerm ? 'Try adjusting your search query or provider filter.' : (StorageAccounts.length === 0 ? 'No active file storage accounts are configured. Uploads are disabled until a storage account is configured.' : (EffectiveAllowUpload ? 'Upload or drop files above to link attachments to this record.' : 'No attachments are linked to this record.'))\">\n </mj-empty-state>\n } @else {\n <div class=\"mj-attachments-container\" [class.mj-attachments-grid-mode]=\"ViewMode === 'grid'\">\n @for (item of FilteredAttachments; track item.LinkID) {\n <div class=\"mj-attachment-card\" [class.mj-attachment-card--list]=\"ViewMode === 'list'\">\n <div class=\"mj-attachment-card-top\" (click)=\"AllowPreview ? PreviewAttachment(item) : OpenAttachmentRecord(item)\">\n <div class=\"mj-attachment-thumb\" [ngClass]=\"GetFileColorClass(item)\" [title]=\"'Preview ' + item.Name\">\n <i [class]=\"GetFileIcon(item)\"></i>\n </div>\n <div class=\"mj-attachment-info\">\n <div class=\"mj-attachment-name\" [title]=\"item.Name\">\n {{ item.Name }}\n </div>\n <div class=\"mj-attachment-meta\">\n @if (item.FileSize) {\n <span>{{ FormatSize(item.FileSize) }}</span>\n <span>&bull;</span>\n }\n @if (item.CategoryName) {\n <span class=\"mj-attachment-cat-badge\">{{ item.CategoryName }}</span>\n <span>&bull;</span>\n }\n <span>{{ item.ContentType || 'File' }}</span>\n </div>\n @if (item.ProviderName) {\n <div class=\"mj-attachment-provider-tag\" [style.--provider-color]=\"GetProviderBrandColor(item)\">\n <i [class]=\"GetProviderIcon(item)\"></i>\n <span>{{ item.ProviderName }}</span>\n </div>\n }\n @if (item.Description) {\n <div class=\"mj-attachment-description\" [title]=\"item.Description\">\n {{ item.Description }}\n </div>\n }\n </div>\n </div>\n\n <!-- Streamlined Action Toolbar (Preview + Download + Overflow Menu) -->\n <div class=\"mj-attachment-actions\" (click)=\"$event.stopPropagation()\">\n @if (AllowPreview) {\n <button type=\"button\" class=\"mj-attachment-action-btn\" (click)=\"PreviewAttachment(item)\" title=\"Quick preview\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n }\n @if (AllowDownload) {\n <button type=\"button\" class=\"mj-attachment-action-btn\" (click)=\"DownloadAttachment(item)\" title=\"Download file\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n\n <!-- Overflow Menu Trigger -->\n <div class=\"mj-attachment-menu-container\">\n <button\n type=\"button\"\n class=\"mj-attachment-action-btn mj-attachment-action-btn--more\"\n [class.mj-attachment-action-btn--active]=\"ActiveMenuLinkID === item.LinkID\"\n (click)=\"ToggleItemMenu($event, item)\"\n title=\"More actions\"\n [attr.aria-expanded]=\"ActiveMenuLinkID === item.LinkID\"\n >\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n\n <!-- Dropdown Menu -->\n @if (ActiveMenuLinkID === item.LinkID) {\n <div class=\"mj-attachment-dropdown\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"OpenAttachmentRecord(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open in Workspace</span>\n </button>\n @if (AllowEditMetadata && UserCanUpdateFile) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"OpenEditMetadata(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-pen\"></i>\n <span>Edit Details</span>\n </button>\n }\n @if (AllowReplace && EffectiveAllowUpload) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"RequestReplace(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n <span>Replace File</span>\n </button>\n }\n @if (EffectiveAllowUnlink || EffectiveAllowDelete) {\n <div class=\"mj-attachment-dropdown-divider\"></div>\n }\n @if (EffectiveAllowUnlink) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item mj-attachment-dropdown-item--warning\" (click)=\"UnlinkAttachment(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-link-slash\"></i>\n <span>Unlink from Record</span>\n </button>\n }\n @if (EffectiveAllowDelete) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item mj-attachment-dropdown-item--danger\" (click)=\"DeleteAttachment(item, true); CloseItemMenu()\">\n <i class=\"fa-regular fa-trash-can\"></i>\n <span>Delete Completely</span>\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n\n <!-- ====================================================================\n EDIT ATTACHMENT DETAILS SUB-PANEL (Slide-in inside slide-panel)\n ==================================================================== -->\n @if (EditMetadataModalOpen && EditMetadataItem) {\n <div class=\"mj-record-attachments-subpanel\">\n <!-- Sub-Panel Top Navigation Bar -->\n <div class=\"mj-subpanel-header\">\n <button type=\"button\" class=\"mj-subpanel-back-btn\" (click)=\"CloseEditMetadataModal()\" title=\"Back to attachments\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <span>Back</span>\n </button>\n <div class=\"mj-subpanel-title\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span>Attachment Details</span>\n </div>\n <button type=\"button\" class=\"mj-subpanel-close-btn\" (click)=\"CloseEditMetadataModal()\" title=\"Close details\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Sub-Panel Body -->\n <div class=\"mj-subpanel-body\">\n <!-- File Info Summary Hero -->\n <div class=\"mj-subpanel-hero\">\n <div class=\"mj-subpanel-icon\" [ngClass]=\"GetFileColorClass(EditMetadataItem)\">\n <i [class]=\"GetFileIcon(EditMetadataItem)\"></i>\n </div>\n <div class=\"mj-subpanel-hero-info\">\n <div class=\"mj-subpanel-hero-name\" [title]=\"EditMetadataItem.Name\">{{ EditMetadataItem.Name }}</div>\n <div class=\"mj-subpanel-hero-meta\">\n <span>{{ FormatSize(EditMetadataItem.FileSize) }}</span>\n <span class=\"mj-subpanel-dot\">&bull;</span>\n <span>{{ EditMetadataItem.ContentType || 'Document' }}</span>\n @if (EditMetadataItem.ProviderName) {\n <span class=\"mj-subpanel-dot\">&bull;</span>\n <span class=\"mj-subpanel-storage-tag\">{{ EditMetadataItem.ProviderName }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- Edit Form -->\n <div class=\"mj-subpanel-form\">\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">File Name</label>\n <input\n type=\"text\"\n class=\"mj-form-input\"\n [(ngModel)]=\"EditMetadataName\"\n placeholder=\"e.g. document.pdf\"\n (keydown.enter)=\"EditMetadataName.trim() && !IsLoading && SaveEditMetadata()\"\n />\n <div class=\"mj-form-hint\">Changing the name updates the display title across all record views.</div>\n </div>\n\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Description (Optional)</label>\n <textarea\n class=\"mj-form-textarea\"\n [(ngModel)]=\"EditMetadataDescription\"\n rows=\"4\"\n placeholder=\"Add notes, tags, or context about this attachment...\"\n ></textarea>\n </div>\n\n <!-- Metadata Properties Card -->\n <div class=\"mj-subpanel-details-card\">\n <div class=\"mj-details-card-title\">Storage Information</div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Storage Account:</span>\n <span class=\"mj-details-value\">{{ EditMetadataItem.ProviderName || 'Default Storage' }}</span>\n </div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Attached On:</span>\n <span class=\"mj-details-value\">{{ EditMetadataItem.CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Status:</span>\n <span class=\"mj-details-badge\">{{ EditMetadataItem.Status || 'Active' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sub-Panel Footer Actions -->\n <div class=\"mj-subpanel-footer\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"CloseEditMetadataModal()\">\n Cancel\n </button>\n <div class=\"mj-subpanel-footer-right\">\n @if (AllowDownload) {\n <button\n type=\"button\"\n class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-secondary\"\n (click)=\"DownloadAttachment(EditMetadataItem)\"\n title=\"Open in new tab\"\n >\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-primary\"\n (click)=\"SaveEditMetadata()\"\n [disabled]=\"!EditMetadataName.trim() || IsLoading\"\n >\n <i class=\"fa-solid fa-check\"></i>\n <span>{{ IsLoading ? 'Saving...' : 'Save Changes' }}</span>\n </button>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n</mj-slide-panel>\n\n<!-- ====================================================================\n RICH MEDIA PREVIEW MODAL\n ==================================================================== -->\n@if (PreviewModalOpen && ActivePreviewItem) {\n <div class=\"mj-preview-modal-backdrop\" (click)=\"ClosePreviewModal()\">\n <div class=\"mj-preview-dialog\" (click)=\"$event.stopPropagation()\">\n \n <div class=\"mj-preview-dialog-header\">\n <div class=\"mj-preview-dialog-title\">\n <i [class]=\"GetFileIcon(ActivePreviewItem)\" [ngClass]=\"GetFileColorClass(ActivePreviewItem)\"></i>\n <span>{{ ActivePreviewItem.Name }}</span>\n </div>\n <button type=\"button\" class=\"mj-preview-close-btn\" (click)=\"ClosePreviewModal()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"mj-preview-dialog-body\">\n @if (IsLoadingPreview || !IsMediaLoaded) {\n <div class=\"mj-preview-loading-overlay\">\n <mj-loading [text]=\"'Loading ' + (ActivePreviewItem.Name || 'preview') + '...'\"></mj-loading>\n </div>\n }\n\n @switch (GetMediaType(ActivePreviewItem)) {\n @case ('image') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-image-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <img [src]=\"ActivePreviewUrl\" [alt]=\"ActivePreviewItem.Name\" (load)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\" />\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-image mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Preview could not be loaded</div>\n </div>\n }\n }\n @case ('pdf') {\n @if (ActivePreviewSafeUrl) {\n <div class=\"mj-preview-frame-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <iframe [src]=\"ActivePreviewSafeUrl\" title=\"PDF Preview\" (load)=\"OnPreviewMediaLoaded()\"></iframe>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-pdf mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">PDF preview could not be loaded</div>\n </div>\n }\n }\n @case ('video') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-media-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <video controls autoplay [src]=\"ActivePreviewUrl\" (loadeddata)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\"></video>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-video mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Video preview could not be loaded</div>\n </div>\n }\n }\n @case ('audio') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-media-container mj-preview-audio-box\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <div class=\"mj-preview-audio-icon\"><i class=\"fa-solid fa-headphones\"></i></div>\n <audio controls [src]=\"ActivePreviewUrl\" (loadeddata)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\"></audio>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-audio mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Audio preview could not be loaded</div>\n </div>\n }\n }\n @case ('text') {\n <div class=\"mj-preview-text-container\">\n <pre><code>{{ ActivePreviewTextContent || 'Loading content...' }}</code></pre>\n </div>\n }\n @default {\n <div class=\"mj-preview-generic-box\">\n <i [class]=\"GetFileIcon(ActivePreviewItem)\" class=\"mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">{{ ActivePreviewItem.ContentType || 'Document' }} &bull; {{ FormatSize(ActivePreviewItem.FileSize) }}</div>\n <div class=\"mj-preview-generic-desc\">{{ ActivePreviewItem.Description || 'Preview not available for this binary file format.' }}</div>\n </div>\n }\n }\n </div>\n\n <div class=\"mj-preview-dialog-footer\">\n <div class=\"mj-preview-footer-meta\">\n @if (ActivePreviewItem.ProviderName) {\n <span>Storage: <strong>{{ ActivePreviewItem.ProviderName }}</strong></span>\n }\n </div>\n <div class=\"mj-preview-footer-actions\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"ClosePreviewModal()\">Close</button>\n @if (AllowDownload) {\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-primary\" (click)=\"DownloadAttachment(ActivePreviewItem)\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download</span>\n </button>\n }\n </div>\n </div>\n\n </div>\n </div>\n}\n"]}