@memberjunction/ng-file-storage 6.1.0-edge.2 → 6.1.0-edge.3

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 (41) hide show
  1. package/LICENSE +180 -4
  2. package/README.md +60 -15
  3. package/dist/lib/admin/storage-admin-dialog.component.d.ts +63 -0
  4. package/dist/lib/admin/storage-admin-dialog.component.d.ts.map +1 -0
  5. package/dist/lib/admin/storage-admin-dialog.component.js +917 -0
  6. package/dist/lib/admin/storage-admin-dialog.component.js.map +1 -0
  7. package/dist/lib/file-browser/file-browser-resource.component.d.ts.map +1 -1
  8. package/dist/lib/file-browser/file-browser-resource.component.js +11 -21
  9. package/dist/lib/file-browser/file-browser-resource.component.js.map +1 -1
  10. package/dist/lib/file-browser/file-browser.component.js +2 -2
  11. package/dist/lib/file-browser/file-grid.component.d.ts +63 -3
  12. package/dist/lib/file-browser/file-grid.component.d.ts.map +1 -1
  13. package/dist/lib/file-browser/file-grid.component.js +1088 -735
  14. package/dist/lib/file-browser/file-grid.component.js.map +1 -1
  15. package/dist/lib/file-browser/folder-tree.component.js +32 -30
  16. package/dist/lib/file-browser/folder-tree.component.js.map +1 -1
  17. package/dist/lib/file-browser/storage-providers-list.component.d.ts +37 -3
  18. package/dist/lib/file-browser/storage-providers-list.component.d.ts.map +1 -1
  19. package/dist/lib/file-browser/storage-providers-list.component.js +191 -65
  20. package/dist/lib/file-browser/storage-providers-list.component.js.map +1 -1
  21. package/dist/lib/module.d.ts +10 -7
  22. package/dist/lib/module.d.ts.map +1 -1
  23. package/dist/lib/module.js +27 -7
  24. package/dist/lib/module.js.map +1 -1
  25. package/dist/lib/record-attachments/record-attachments.component.d.ts +203 -0
  26. package/dist/lib/record-attachments/record-attachments.component.d.ts.map +1 -0
  27. package/dist/lib/record-attachments/record-attachments.component.js +2270 -0
  28. package/dist/lib/record-attachments/record-attachments.component.js.map +1 -0
  29. package/dist/lib/record-attachments/record-attachments.events.d.ts +124 -0
  30. package/dist/lib/record-attachments/record-attachments.events.d.ts.map +1 -0
  31. package/dist/lib/record-attachments/record-attachments.events.js +178 -0
  32. package/dist/lib/record-attachments/record-attachments.events.js.map +1 -0
  33. package/dist/lib/record-attachments/record-attachments.types.d.ts +90 -0
  34. package/dist/lib/record-attachments/record-attachments.types.d.ts.map +1 -0
  35. package/dist/lib/record-attachments/record-attachments.types.js +57 -0
  36. package/dist/lib/record-attachments/record-attachments.types.js.map +1 -0
  37. package/dist/public-api.d.ts +4 -0
  38. package/dist/public-api.d.ts.map +1 -1
  39. package/dist/public-api.js +4 -0
  40. package/dist/public-api.js.map +1 -1
  41. package/package.json +14 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-admin-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/admin/storage-admin-dialog.component.ts","../../../src/lib/admin/storage-admin-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewContainerRef,\n inject,\n ChangeDetectorRef,\n} from '@angular/core';\nimport {\n Metadata,\n RunView,\n type IMetadataProvider,\n} from '@memberjunction/core';\nimport {\n FileStorageEngineBase,\n MJFileStorageAccountEntity,\n MJFileStorageProviderEntity,\n MJFileStorageAccountPermissionEntity,\n MJCredentialEntity,\n MJRoleEntity,\n} from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialDialogService } from '@memberjunction/ng-credentials';\n\nexport type StorageAdminTab = 'accounts' | 'providers';\n\nexport interface StorageAccountRow {\n account: MJFileStorageAccountEntity;\n provider?: MJFileStorageProviderEntity;\n credentialName?: string;\n roleCount: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-storage-admin-dialog',\n templateUrl: './storage-admin-dialog.component.html',\n styleUrls: ['./storage-admin-dialog.component.css'],\n})\nexport class StorageAdminDialogComponent implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n private viewContainerRef = inject(ViewContainerRef);\n private credentialDialog = inject(CredentialDialogService);\n\n @Input() Visible: boolean = false;\n @Input() ActiveTab: StorageAdminTab = 'accounts';\n @Input() Provider: IMetadataProvider | null = null;\n\n @Output() Close = new EventEmitter<void>();\n @Output() AccountsChanged = new EventEmitter<void>();\n\n public get ProviderToUse(): IMetadataProvider {\n return this.Provider ?? Metadata.Provider;\n }\n\n // ── State ───────────────────────────────────────────────────────────\n public IsLoading: boolean = false;\n public IsSaving: boolean = false;\n public SearchTerm: string = '';\n\n public Providers: MJFileStorageProviderEntity[] = [];\n public Accounts: MJFileStorageAccountEntity[] = [];\n public Credentials: MJCredentialEntity[] = [];\n public Roles: MJRoleEntity[] = [];\n public AccountPermissions: MJFileStorageAccountPermissionEntity[] = [];\n\n // ── Account Editor Sub-View / Modal ─────────────────────────────────\n public IsEditingAccount: boolean = false;\n public EditingAccount: MJFileStorageAccountEntity | null = null;\n public EditingAccountName: string = '';\n public EditingAccountDescription: string = '';\n public EditingAccountProviderID: string = '';\n public EditingAccountCredentialID: string = '';\n public EditingAccountIncludeInGlobalSearch: boolean = false;\n public EditingAccountSelectedRoleIDs: string[] = [];\n\n // ── Delete Confirmation ─────────────────────────────────────────────\n public AccountToDelete: MJFileStorageAccountEntity | null = null;\n public IsDeleting: boolean = false;\n\n async ngOnInit(): Promise<void> {\n if (this.Visible) {\n await this.LoadAllData();\n }\n }\n\n public async Open(tab: StorageAdminTab = 'accounts', accountToEdit?: MJFileStorageAccountEntity | null): Promise<void> {\n this.ActiveTab = tab;\n this.Visible = true;\n this.IsEditingAccount = false;\n this.AccountToDelete = null;\n await this.LoadAllData();\n\n if (accountToEdit) {\n this.StartEditAccount(accountToEdit);\n }\n this.cdr.markForCheck();\n }\n\n public async LoadAllData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n\n // Load providers and accounts via FileStorageEngineBase + RunView\n await FileStorageEngineBase.Instance.Config(true);\n this.Providers = [...FileStorageEngineBase.Instance.Providers].sort(\n (a, b) => (a.Priority ?? 0) - (b.Priority ?? 0) || a.Name.localeCompare(b.Name)\n );\n this.Accounts = [...FileStorageEngineBase.Instance.Accounts].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Load Credentials\n const credResult = await rv.RunView<MJCredentialEntity>({\n EntityName: 'MJ: Credentials',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (credResult.Success) {\n this.Credentials = credResult.Results;\n }\n\n // Load Roles\n const roleResult = await rv.RunView<MJRoleEntity>({\n EntityName: 'MJ: Roles',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (roleResult.Success) {\n this.Roles = roleResult.Results;\n }\n\n // Load Account Permissions\n const permResult = await rv.RunView<MJFileStorageAccountPermissionEntity>({\n EntityName: 'MJ: File Storage Account Permissions',\n ResultType: 'entity_object',\n });\n if (permResult.Success) {\n this.AccountPermissions = permResult.Results;\n }\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error loading storage data:', err);\n this.notifications.CreateSimpleNotification('Failed to load storage configuration.', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ── Computed Rows & Filters ─────────────────────────────────────────\n\n public get FilteredAccountRows(): StorageAccountRow[] {\n const term = (this.SearchTerm || '').toLowerCase().trim();\n\n return this.Accounts.filter((a) => {\n if (!term) return true;\n const prov = this.Providers.find((p) => UUIDsEqual(p.ID, a.ProviderID));\n const cred = this.Credentials.find((c) => UUIDsEqual(c.ID, a.CredentialID));\n const credName = cred?.Name || '';\n return (\n a.Name.toLowerCase().includes(term) ||\n (a.Description || '').toLowerCase().includes(term) ||\n (prov?.Name || '').toLowerCase().includes(term) ||\n credName.toLowerCase().includes(term)\n );\n }).map((account) => {\n const provider = this.Providers.find((p) => UUIDsEqual(p.ID, account.ProviderID));\n const credential = this.Credentials.find((c) => UUIDsEqual(c.ID, account.CredentialID));\n const credentialName = credential?.Name;\n const roleCount = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, account.ID)).length;\n return { account, provider, credentialName, roleCount };\n });\n }\n\n public get ActiveProviders(): MJFileStorageProviderEntity[] {\n return this.Providers.filter((p) => p.IsActive);\n }\n\n // ── Account Editing ─────────────────────────────────────────────────\n\n public StartCreateAccount(): void {\n this.EditingAccount = null;\n this.EditingAccountName = '';\n this.EditingAccountDescription = '';\n this.EditingAccountProviderID = this.ActiveProviders[0]?.ID || (this.Providers[0]?.ID ?? '');\n this.EditingAccountCredentialID = '';\n this.EditingAccountIncludeInGlobalSearch = false;\n this.EditingAccountSelectedRoleIDs = [];\n this.IsEditingAccount = true;\n this.cdr.markForCheck();\n }\n\n public StartEditAccount(account: MJFileStorageAccountEntity): void {\n this.EditingAccount = account;\n this.EditingAccountName = account.Name || '';\n this.EditingAccountDescription = account.Description || '';\n this.EditingAccountProviderID = account.ProviderID || '';\n this.EditingAccountCredentialID = account.CredentialID || '';\n this.EditingAccountIncludeInGlobalSearch = !!account.IncludeInGlobalSearch;\n\n const accountPerms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, account.ID));\n this.EditingAccountSelectedRoleIDs = accountPerms\n .map((p) => p.RoleID)\n .filter((roleId): roleId is string => roleId !== null && roleId !== undefined);\n\n this.IsEditingAccount = true;\n this.cdr.markForCheck();\n }\n\n public CancelEditAccount(): void {\n this.IsEditingAccount = false;\n this.EditingAccount = null;\n this.cdr.markForCheck();\n }\n\n public ToggleRoleSelection(roleId: string): void {\n const idx = this.EditingAccountSelectedRoleIDs.findIndex((id) => UUIDsEqual(id, roleId));\n if (idx >= 0) {\n this.EditingAccountSelectedRoleIDs.splice(idx, 1);\n } else {\n this.EditingAccountSelectedRoleIDs.push(roleId);\n }\n }\n\n public IsRoleSelected(roleId: string): boolean {\n return this.EditingAccountSelectedRoleIDs.some((id) => UUIDsEqual(id, roleId));\n }\n\n public async OpenCreateCredentialDialog(): Promise<void> {\n try {\n const result = await this.credentialDialog.openDialog(this.viewContainerRef, {\n title: 'Create Credential for Storage Account',\n });\n if (result.success && result.credential) {\n // Refresh credentials list\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const credResult = await rv.RunView<MJCredentialEntity>({\n EntityName: 'MJ: Credentials',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (credResult.Success) {\n this.Credentials = credResult.Results;\n }\n this.EditingAccountCredentialID = result.credential.ID;\n this.notifications.CreateSimpleNotification(`Credential \"${result.credential.Name}\" created.`, 'success');\n this.cdr.markForCheck();\n }\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error creating credential:', err);\n }\n }\n\n public async SaveAccount(): Promise<void> {\n const name = this.EditingAccountName.trim();\n if (!name) {\n this.notifications.CreateSimpleNotification('Account name is required.', 'warning');\n return;\n }\n if (!this.EditingAccountProviderID) {\n this.notifications.CreateSimpleNotification('Storage provider is required.', 'warning');\n return;\n }\n\n this.IsSaving = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const user = md.CurrentUser;\n let accountEntity: MJFileStorageAccountEntity;\n\n if (this.EditingAccount) {\n accountEntity = this.EditingAccount;\n } else {\n accountEntity = await md.GetEntityObject<MJFileStorageAccountEntity>(\n 'MJ: File Storage Accounts',\n user\n );\n }\n\n accountEntity.Name = name;\n accountEntity.Description = this.EditingAccountDescription.trim() || null;\n accountEntity.ProviderID = this.EditingAccountProviderID;\n accountEntity.CredentialID = this.EditingAccountCredentialID || '';\n accountEntity.IncludeInGlobalSearch = this.EditingAccountIncludeInGlobalSearch;\n\n const saved = await accountEntity.Save();\n if (!saved) {\n throw new Error(accountEntity.LatestResult?.Message || 'Failed to save storage account.');\n }\n\n // Sync Role Permissions\n await this.SyncAccountPermissions(accountEntity.ID, this.EditingAccountSelectedRoleIDs);\n\n // Force engine refresh\n await FileStorageEngineBase.Instance.Config(true);\n await this.LoadAllData();\n\n this.IsEditingAccount = false;\n this.EditingAccount = null;\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(`Storage account \"${name}\" saved successfully.`, 'success');\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error saving account:', err);\n const msg = err instanceof Error ? err.message : 'Failed to save storage account.';\n this.notifications.CreateSimpleNotification(msg, 'error');\n } finally {\n this.IsSaving = false;\n this.cdr.markForCheck();\n }\n }\n\n private async SyncAccountPermissions(accountId: string, desiredRoleIds: string[]): Promise<void> {\n const md = this.ProviderToUse;\n const user = md.CurrentUser;\n\n const existingPerms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, accountId));\n const existingRoleMap = new Map<string, MJFileStorageAccountPermissionEntity>();\n for (const p of existingPerms) {\n if (p.RoleID) {\n existingRoleMap.set(p.RoleID, p);\n }\n }\n\n // Delete permissions for unselected roles\n for (const p of existingPerms) {\n if (!p.RoleID || !desiredRoleIds.some((rId) => UUIDsEqual(rId, p.RoleID))) {\n await p.Delete();\n }\n }\n\n // Add permissions for newly selected roles\n for (const roleId of desiredRoleIds) {\n if (!existingRoleMap.has(roleId)) {\n const newPerm = await md.GetEntityObject<MJFileStorageAccountPermissionEntity>(\n 'MJ: File Storage Account Permissions',\n user\n );\n newPerm.FileStorageAccountID = accountId;\n newPerm.Type = 'Role';\n newPerm.RoleID = roleId;\n newPerm.CanRead = true;\n newPerm.CanWrite = true;\n await newPerm.Save();\n }\n }\n }\n\n // ── Account Deletion ────────────────────────────────────────────────\n\n public ConfirmDeleteAccount(account: MJFileStorageAccountEntity): void {\n this.AccountToDelete = account;\n this.cdr.markForCheck();\n }\n\n public CancelDeleteAccount(): void {\n this.AccountToDelete = null;\n this.cdr.markForCheck();\n }\n\n public async ExecuteDeleteAccount(): Promise<void> {\n if (!this.AccountToDelete) return;\n this.IsDeleting = true;\n this.cdr.markForCheck();\n\n try {\n const accountName = this.AccountToDelete.Name;\n const accountId = this.AccountToDelete.ID;\n\n // Delete associated permissions first\n const perms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, accountId));\n for (const p of perms) {\n await p.Delete();\n }\n\n const deleted = await this.AccountToDelete.Delete();\n if (!deleted) {\n throw new Error('Failed to delete storage account.');\n }\n\n await FileStorageEngineBase.Instance.Config(true);\n await this.LoadAllData();\n\n this.AccountToDelete = null;\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(`Storage account \"${accountName}\" removed.`, 'info');\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Delete error:', err);\n const msg = err instanceof Error ? err.message : 'Failed to delete storage account.';\n this.notifications.CreateSimpleNotification(msg, 'error');\n } finally {\n this.IsDeleting = false;\n this.cdr.markForCheck();\n }\n }\n\n // ── Provider Management ─────────────────────────────────────────────\n\n public async ToggleProviderActive(provider: MJFileStorageProviderEntity): Promise<void> {\n const newState = !provider.IsActive;\n provider.IsActive = newState;\n this.cdr.markForCheck();\n\n try {\n const saved = await provider.Save();\n if (!saved) {\n provider.IsActive = !newState; // rollback\n throw new Error(provider.LatestResult?.Message || 'Failed to update provider status.');\n }\n await FileStorageEngineBase.Instance.Config(true);\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(\n `Provider \"${provider.Name}\" is now ${newState ? 'active' : 'inactive'}.`,\n 'info'\n );\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Provider toggle error:', err);\n this.notifications.CreateSimpleNotification('Failed to update provider status.', 'error');\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n // ── UI Helpers ──────────────────────────────────────────────────────\n\n public GetProviderIcon(providerName: string): string {\n const name = (providerName || '').toLowerCase();\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')) return 'fa-brands fa-google';\n if (name.includes('dropbox')) return 'fa-brands fa-dropbox';\n if (name.includes('box')) return 'fa-solid fa-box';\n if (name.includes('sharepoint') || name.includes('onedrive')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-cloud';\n }\n\n public OnDialogClose(): void {\n this.Visible = false;\n this.IsEditingAccount = false;\n this.AccountToDelete = null;\n this.Close.emit();\n }\n}\n","<mj-dialog\n [Visible]=\"Visible\"\n Title=\"Manage File Storage\"\n [Width]=\"880\"\n [MinWidth]=\"600\"\n (Close)=\"OnDialogClose()\">\n\n <div class=\"mj-storage-admin-container\">\n <!-- Tab Navigation -->\n <div class=\"mj-storage-admin-tabs\">\n <button\n type=\"button\"\n class=\"mj-tab-btn\"\n [class.active]=\"ActiveTab === 'accounts'\"\n (click)=\"ActiveTab = 'accounts'\">\n <i class=\"fa-solid fa-server\"></i>\n <span>Storage Accounts</span>\n <span class=\"mj-tab-count\">{{ Accounts.length }}</span>\n </button>\n\n <button\n type=\"button\"\n class=\"mj-tab-btn\"\n [class.active]=\"ActiveTab === 'providers'\"\n (click)=\"ActiveTab = 'providers'\">\n <i class=\"fa-solid fa-cubes\"></i>\n <span>Storage Providers</span>\n <span class=\"mj-tab-count\">{{ Providers.length }}</span>\n </button>\n </div>\n\n <!-- ── TAB 1: STORAGE ACCOUNTS ────────────────────────────────────── -->\n @if (ActiveTab === 'accounts') {\n <div class=\"mj-tab-pane\">\n <!-- Toolbar -->\n <div class=\"mj-admin-pane-toolbar\">\n <div class=\"mj-admin-search-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"SearchTerm\"\n placeholder=\"Search storage accounts by name, provider, or credential...\" />\n @if (SearchTerm) {\n <button type=\"button\" class=\"mj-clear-btn\" (click)=\"SearchTerm = ''\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary\"\n (click)=\"StartCreateAccount()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Storage Account</span>\n </button>\n </div>\n\n <!-- Loading -->\n @if (IsLoading) {\n <div class=\"mj-admin-loading\">\n <mj-loading text=\"Loading storage accounts...\"></mj-loading>\n </div>\n } @else if (FilteredAccountRows.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-folder-plus\"\n [Title]=\"SearchTerm ? 'No matching storage accounts' : 'No storage accounts configured'\"\n [Message]=\"SearchTerm ? 'Try adjusting your search query.' : 'Configure storage accounts to connect MemberJunction to cloud storage services like AWS S3, Azure Blob Storage, Box, Dropbox, or Google Drive.'\">\n @if (!SearchTerm) {\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary mj-empty-cta\"\n (click)=\"StartCreateAccount()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Configure First Account</span>\n </button>\n }\n </mj-empty-state>\n } @else {\n <!-- Accounts List -->\n <div class=\"mj-admin-table-container\">\n <table class=\"mj-admin-table\">\n <thead>\n <tr>\n <th>Account Name</th>\n <th>Provider</th>\n <th>Credential</th>\n <th>Global Search</th>\n <th>Role Access</th>\n <th class=\"mj-text-right\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredAccountRows; track row.account.ID) {\n <tr>\n <td>\n <div class=\"mj-account-name-cell\">\n <span class=\"mj-account-title\">{{ row.account.Name }}</span>\n @if (row.account.Description) {\n <span class=\"mj-account-desc\">{{ row.account.Description }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"mj-provider-badge\">\n <i [class]=\"GetProviderIcon(row.provider?.Name || row.account.Provider)\"></i>\n <span>{{ row.provider?.Name || row.account.Provider }}</span>\n </span>\n </td>\n <td>\n @if (row.credentialName) {\n <span class=\"mj-status-badge mj-status-badge--success\" [title]=\"'Credential: ' + row.credentialName\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ row.credentialName }}</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--warning\" title=\"No credential configured\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>No Credential</span>\n </span>\n }\n </td>\n <td>\n @if (row.account.IncludeInGlobalSearch) {\n <span class=\"mj-status-badge mj-status-badge--info\">\n <i class=\"fa-solid fa-check\"></i>\n <span>Enabled</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--muted\">\n <span>Disabled</span>\n </span>\n }\n </td>\n <td>\n <span class=\"mj-role-count-badge\">\n <i class=\"fa-solid fa-user-shield\"></i>\n <span>{{ row.roleCount === 0 ? 'All Users' : row.roleCount + ' Role(s)' }}</span>\n </span>\n </td>\n <td class=\"mj-text-right\">\n <div class=\"mj-action-button-group\">\n <button\n type=\"button\"\n class=\"mj-action-icon-btn\"\n title=\"Edit Account\"\n (click)=\"StartEditAccount(row.account)\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n <button\n type=\"button\"\n class=\"mj-action-icon-btn mj-action-icon-btn--danger\"\n title=\"Delete Account\"\n (click)=\"ConfirmDeleteAccount(row.account)\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n <!-- ── TAB 2: STORAGE PROVIDERS ────────────────────────────────────── -->\n @if (ActiveTab === 'providers') {\n <div class=\"mj-tab-pane\">\n <div class=\"mj-admin-pane-desc\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span>Enable or disable storage provider integrations for your organization. Only active providers are available when configuring accounts.</span>\n </div>\n\n <div class=\"mj-admin-table-container\">\n <table class=\"mj-admin-table\">\n <thead>\n <tr>\n <th>Status</th>\n <th>Provider Driver</th>\n <th>Server Driver Key</th>\n <th>Client Driver Key</th>\n <th>Search Support</th>\n <th class=\"mj-text-center\">Priority</th>\n </tr>\n </thead>\n <tbody>\n @for (prov of Providers; track prov.ID) {\n <tr [class.mj-row-inactive]=\"!prov.IsActive\">\n <td>\n <label class=\"mj-toggle-switch\" [title]=\"prov.IsActive ? 'Deactivate provider' : 'Activate provider'\">\n <input\n type=\"checkbox\"\n [checked]=\"prov.IsActive\"\n (change)=\"ToggleProviderActive(prov)\" />\n <span class=\"mj-toggle-slider\"></span>\n </label>\n </td>\n <td>\n <div class=\"mj-provider-cell\">\n <div class=\"mj-provider-icon-circle\">\n <i [class]=\"GetProviderIcon(prov.Name)\"></i>\n </div>\n <div>\n <div class=\"mj-provider-name\">{{ prov.Name }}</div>\n @if (prov.Description) {\n <div class=\"mj-provider-desc\">{{ prov.Description }}</div>\n }\n </div>\n </div>\n </td>\n <td>\n <code class=\"mj-code-pill\">{{ prov.ServerDriverKey || '—' }}</code>\n </td>\n <td>\n <code class=\"mj-code-pill\">{{ prov.ClientDriverKey || '—' }}</code>\n </td>\n <td>\n @if (prov.SupportsSearch) {\n <span class=\"mj-status-badge mj-status-badge--success\" title=\"Provider supports full-text file search\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>Native Search</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--muted\">\n <span>Standard</span>\n </span>\n }\n </td>\n <td class=\"mj-text-center\">\n <span class=\"mj-priority-pill\">{{ prov.Priority }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button type=\"button\" class=\"mj-admin-btn mj-admin-btn-secondary\" (click)=\"OnDialogClose()\">\n Close\n </button>\n </mj-dialog-actions>\n</mj-dialog>\n\n<!-- ── ACCOUNT CREATE / EDIT SUB-DIALOG ──────────────────────────────── -->\n@if (IsEditingAccount) {\n <mj-dialog\n [Visible]=\"IsEditingAccount\"\n [Title]=\"EditingAccount ? 'Edit Storage Account: ' + EditingAccount.Name : 'Add Storage Account'\"\n [Width]=\"640\"\n (Close)=\"CancelEditAccount()\">\n\n <div class=\"mj-account-editor-form\">\n <!-- Provider Selection -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Storage Provider <span class=\"mj-required\">*</span></label>\n <select\n class=\"mj-form-select\"\n [(ngModel)]=\"EditingAccountProviderID\"\n [disabled]=\"!!EditingAccount\">\n @for (prov of ActiveProviders; track prov.ID) {\n <option [value]=\"prov.ID\">{{ prov.Name }}</option>\n }\n </select>\n <div class=\"mj-form-hint\">Select the cloud storage engine driver for this account.</div>\n </div>\n\n <!-- Account Name -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Account Name <span class=\"mj-required\">*</span></label>\n <input\n type=\"text\"\n class=\"mj-form-input\"\n [(ngModel)]=\"EditingAccountName\"\n placeholder=\"e.g., Corporate Azure Blob Storage, Marketing S3 Bucket\" />\n </div>\n\n <!-- Account Description -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Description</label>\n <textarea\n class=\"mj-form-textarea\"\n rows=\"2\"\n [(ngModel)]=\"EditingAccountDescription\"\n placeholder=\"Optional notes or details about the intended purpose of this storage account...\"></textarea>\n </div>\n\n <!-- Credential Picker with Inline Create -->\n <div class=\"mj-form-group\">\n <div class=\"mj-form-label-row\">\n <label class=\"mj-form-label\">Storage Credentials</label>\n <button\n type=\"button\"\n class=\"mj-admin-btn-link\"\n (click)=\"OpenCreateCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Credential</span>\n </button>\n </div>\n <div class=\"mj-credential-input-row\">\n <select class=\"mj-form-select\" [(ngModel)]=\"EditingAccountCredentialID\">\n <option value=\"\">-- No Credential Assigned --</option>\n @for (cred of Credentials; track cred.ID) {\n <option [value]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n </div>\n <div class=\"mj-form-hint\">\n Credentials manage authentication tokens, connection strings, or API keys securely via the Credential Engine.\n </div>\n </div>\n\n <!-- Global Search Toggle -->\n <div class=\"mj-form-checkbox-group\">\n <label class=\"mj-checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"EditingAccountIncludeInGlobalSearch\" />\n <span>Include in Global Search</span>\n </label>\n <div class=\"mj-form-hint mj-checkbox-hint\">\n When enabled, file contents and metadata in this account will be indexed for universal MemberJunction search.\n </div>\n </div>\n\n <!-- Role Permissions -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Role Access Permissions</label>\n <div class=\"mj-form-hint\">\n Select specific roles permitted to access this storage account. If no roles are selected, all authorized users have access.\n </div>\n <div class=\"mj-roles-checklist\">\n @for (role of Roles; track role.ID) {\n <label class=\"mj-role-check-item\">\n <input\n type=\"checkbox\"\n [checked]=\"IsRoleSelected(role.ID)\"\n (change)=\"ToggleRoleSelection(role.ID)\" />\n <span>{{ role.Name }}</span>\n </label>\n }\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-secondary\"\n [disabled]=\"IsSaving\"\n (click)=\"CancelEditAccount()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary\"\n [disabled]=\"IsSaving || !EditingAccountName.trim() || !EditingAccountProviderID\"\n (click)=\"SaveAccount()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Saving...</span>\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n <span>{{ EditingAccount ? 'Save Changes' : 'Create Account' }}</span>\n }\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- ── DELETE CONFIRMATION DIALOG ────────────────────────────────────── -->\n@if (AccountToDelete) {\n <mj-dialog\n [Visible]=\"!!AccountToDelete\"\n Title=\"Delete Storage Account\"\n [Width]=\"460\"\n (Close)=\"CancelDeleteAccount()\">\n\n <div class=\"mj-delete-confirm-body\">\n <div class=\"mj-delete-confirm-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <div class=\"mj-delete-confirm-text\">\n <p class=\"mj-delete-confirm-title\">\n Are you sure you want to delete <strong>{{ AccountToDelete.Name }}</strong>?\n </p>\n <p class=\"mj-delete-confirm-subtitle\">\n This will remove the storage account connection and role permissions. Existing files in the remote storage service will not be deleted, but will no longer be accessible via this account in MemberJunction.\n </p>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-secondary\"\n [disabled]=\"IsDeleting\"\n (click)=\"CancelDeleteAccount()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-danger\"\n [disabled]=\"IsDeleting\"\n (click)=\"ExecuteDeleteAccount()\">\n @if (IsDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Deleting...</span>\n } @else {\n <i class=\"fa-solid fa-trash-can\"></i>\n <span>Delete Account</span>\n }\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file-browser-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser-resource.component.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAG7D;;;GAGG;AACH,qBAqCa,mBAAoB,SAAQ,qBAAqB;IAC5D,OAAO,CAAC,UAAU,CAAS;;IAM3B,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAMpC;IAED,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED;;;OAGG;YACW,eAAe;IAO7B;;OAEG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1E;;OAEG;IACY,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAxC7D,mBAAmB;2CAAnB,mBAAmB;CA2C/B"}
1
+ {"version":3,"file":"file-browser-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser-resource.component.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAG7D;;;GAGG;AACH,qBA8Ba,mBAAoB,SAAQ,qBAAqB;IAC5D,OAAO,CAAC,UAAU,CAAS;;IAM3B,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAMpC;IAED,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED;;;OAGG;YACW,eAAe;IAO7B;;OAEG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1E;;OAEG;IACY,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAxC7D,mBAAmB;2CAAnB,mBAAmB;CA2C/B"}
@@ -14,8 +14,7 @@ import { Component } from '@angular/core';
14
14
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
15
15
  import { RegisterClass } from '@memberjunction/global';
16
16
  import * as i0 from "@angular/core";
17
- import * as i1 from "@memberjunction/ng-ui-components";
18
- import * as i2 from "./file-browser.component";
17
+ import * as i1 from "./file-browser.component";
19
18
  /**
20
19
  * File Browser Resource Wrapper - displays the file browser in a tab
21
20
  * Extends BaseResourceComponent to work with the MJ resource type system
@@ -58,13 +57,11 @@ let FileBrowserResource = class FileBrowserResource extends BaseResourceComponen
58
57
  return 'fa-solid fa-folder-tree';
59
58
  }
60
59
  static ɵfac = function FileBrowserResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FileBrowserResource)(); };
61
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FileBrowserResource, selectors: [["mj-file-browser-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 0, consts: [["Title", "File Browser", "Icon", "fa-solid fa-folder-tree", "Subtitle", "Browse and manage files across storage providers"], [1, "file-browser-body"]], template: function FileBrowserResource_Template(rf, ctx) { if (rf & 1) {
62
- i0.ɵɵelementStart(0, "mj-page-layout");
63
- i0.ɵɵelement(1, "mj-page-header", 0);
64
- i0.ɵɵelementStart(2, "div", 1);
65
- i0.ɵɵelement(3, "mj-file-browser");
66
- i0.ɵɵelementEnd()();
67
- } }, dependencies: [i1.MJPageHeaderComponent, i1.MJPageLayoutComponent, i2.FileBrowserComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n padding: 0 24px 24px;\n display: flex;\n }\n \n\n .file-browser-body[_ngcontent-%COMP%] :is(mj-file-browser[_ngcontent-%COMP%]) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }"] });
60
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FileBrowserResource, selectors: [["mj-file-browser-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 0, consts: [[1, "file-browser-resource-container"]], template: function FileBrowserResource_Template(rf, ctx) { if (rf & 1) {
61
+ i0.ɵɵelementStart(0, "div", 0);
62
+ i0.ɵɵelement(1, "mj-file-browser");
63
+ i0.ɵɵelementEnd();
64
+ } }, dependencies: [i1.FileBrowserComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-resource-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n\n .file-browser-resource-container[_ngcontent-%COMP%] :is(mj-file-browser[_ngcontent-%COMP%]) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }"] });
68
65
  };
69
66
  FileBrowserResource = __decorate([
70
67
  RegisterClass(BaseResourceComponent, 'FileBrowserResource')
@@ -73,17 +70,10 @@ export { FileBrowserResource };
73
70
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FileBrowserResource, [{
74
71
  type: Component,
75
72
  args: [{ standalone: false, selector: 'mj-file-browser-resource', template: `
76
- <mj-page-layout>
77
- <mj-page-header
78
- Title="File Browser"
79
- Icon="fa-solid fa-folder-tree"
80
- Subtitle="Browse and manage files across storage providers">
81
- </mj-page-header>
82
- <div class="file-browser-body">
83
- <mj-file-browser></mj-file-browser>
84
- </div>
85
- </mj-page-layout>
86
- `, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-body {\n flex: 1;\n min-height: 0;\n padding: 0 24px 24px;\n display: flex;\n }\n /* The inner mj-file-browser needs to fill the body container. */\n .file-browser-body :is(mj-file-browser) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }\n "] }]
73
+ <div class="file-browser-resource-container">
74
+ <mj-file-browser></mj-file-browser>
75
+ </div>
76
+ `, styles: ["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-resource-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n /* The inner mj-file-browser needs to fill the container. */\n .file-browser-resource-container :is(mj-file-browser) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }\n "] }]
87
77
  }], () => [], null); })();
88
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FileBrowserResource, { className: "FileBrowserResource", filePath: "src/lib/file-browser/file-browser-resource.component.ts", lineNumber: 53 }); })();
78
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FileBrowserResource, { className: "FileBrowserResource", filePath: "src/lib/file-browser/file-browser-resource.component.ts", lineNumber: 46 }); })();
89
79
  //# sourceMappingURL=file-browser-resource.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-browser-resource.component.js","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,qFAAqF;AACrF,2FAA2F;AAC3F,oFAAoF;AACpF,6FAA6F;AAC7F,0FAA0F;AAC1F,aAAa;AACb,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;;AAEvD;;;GAGG;AAsCI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,qBAAqB;IACpD,UAAU,GAAG,KAAK,CAAC;IAE3B;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAa,IAAI,CAAC,KAAmB;QACnC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAa,IAAI;QACf,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe;QAC3B,oEAAoE;QACpE,6CAA6C;QAC7C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QACtD,OAAO,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC;IACrC,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACpD,OAAO,yBAAyB,CAAC;IACnC,CAAC;6GA1CU,mBAAmB;6DAAnB,mBAAmB;YAhC5B,sCAAgB;YACd,oCAIiB;YACjB,8BAA+B;YAC7B,kCAAmC;YAEvC,AADE,iBAAM,EACS;;;AAuBR,mBAAmB;IArC/B,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;GAqC/C,mBAAmB,CA2C/B;;iFA3CY,mBAAmB;cApC/B,SAAS;6BACI,KAAK,YACP,0BAA0B,YAC1B;;;;;;;;;;;GAWT;;kFAsBU,mBAAmB","sourcesContent":["import { Component } from '@angular/core';\n// This component is an Explorer surface (layer 3), which is why the package declares\n// \"mjUILayer\": \"surface\" rather than \"widgets\" — a package holding a BaseResourceComponent\n// subclass cannot be widgets by the gate's own table, and ng-shared is legal at L3.\n// Splitting the surface out from the widgets in this package is still worth doing (MJ#3404);\n// it is registered in three CodeGen-generated manifests, so it needs a CodeGen run, not a\n// hand edit.\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\n\n/**\n * File Browser Resource Wrapper - displays the file browser in a tab\n * Extends BaseResourceComponent to work with the MJ resource type system\n */\n@RegisterClass(BaseResourceComponent, 'FileBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-file-browser-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"File Browser\"\n Icon=\"fa-solid fa-folder-tree\"\n Subtitle=\"Browse and manage files across storage providers\">\n </mj-page-header>\n <div class=\"file-browser-body\">\n <mj-file-browser></mj-file-browser>\n </div>\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-body {\n flex: 1;\n min-height: 0;\n padding: 0 24px 24px;\n display: flex;\n }\n /* The inner mj-file-browser needs to fill the body container. */\n .file-browser-body :is(mj-file-browser) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }\n `]\n})\nexport class FileBrowserResource extends BaseResourceComponent {\n private dataLoaded = false;\n\n constructor() {\n super();\n }\n\n override set Data(value: ResourceData) {\n super.Data = value;\n if (!this.dataLoaded) {\n this.dataLoaded = true;\n this.loadFileBrowser();\n }\n }\n\n override get Data(): ResourceData {\n return super.Data;\n }\n\n /**\n * Load the file browser (currently just notifies load complete)\n * In future phases, this could pass configuration from ResourceData\n */\n private async loadFileBrowser(): Promise<void> {\n // Defer to next microtask so the shell's LoadCompleteEvent callback\n // is wired before we fire NotifyLoadComplete\n await Promise.resolve();\n this.NotifyLoadComplete();\n }\n\n /**\n * Get the display name for the file browser resource\n */\n override async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return data.Name || 'File Browser';\n }\n\n /**\n * Get the icon class for file browser resources\n */\n override async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-folder-tree';\n }\n}\n"]}
1
+ {"version":3,"file":"file-browser-resource.component.js","sourceRoot":"","sources":["../../../src/lib/file-browser/file-browser-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,qFAAqF;AACrF,2FAA2F;AAC3F,oFAAoF;AACpF,6FAA6F;AAC7F,0FAA0F;AAC1F,aAAa;AACb,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;AAEvD;;;GAGG;AA+BI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,qBAAqB;IACpD,UAAU,GAAG,KAAK,CAAC;IAE3B;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAa,IAAI,CAAC,KAAmB;QACnC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAa,IAAI;QACf,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,eAAe;QAC3B,oEAAoE;QACpE,6CAA6C;QAC7C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QACtD,OAAO,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC;IACrC,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACpD,OAAO,yBAAyB,CAAC;IACnC,CAAC;6GA1CU,mBAAmB;6DAAnB,mBAAmB;YAzB5B,8BAA6C;YAC3C,kCAAmC;YACrC,iBAAM;;;AAuBG,mBAAmB;IA9B/B,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;GA8B/C,mBAAmB,CA2C/B;;iFA3CY,mBAAmB;cA7B/B,SAAS;6BACI,KAAK,YACP,0BAA0B,YAC1B;;;;GAIT;;kFAsBU,mBAAmB","sourcesContent":["import { Component } from '@angular/core';\n// This component is an Explorer surface (layer 3), which is why the package declares\n// \"mjUILayer\": \"surface\" rather than \"widgets\" — a package holding a BaseResourceComponent\n// subclass cannot be widgets by the gate's own table, and ng-shared is legal at L3.\n// Splitting the surface out from the widgets in this package is still worth doing (MJ#3404);\n// it is registered in three CodeGen-generated manifests, so it needs a CodeGen run, not a\n// hand edit.\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\n\n/**\n * File Browser Resource Wrapper - displays the file browser in a tab\n * Extends BaseResourceComponent to work with the MJ resource type system\n */\n@RegisterClass(BaseResourceComponent, 'FileBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-file-browser-resource',\n template: `\n <div class=\"file-browser-resource-container\">\n <mj-file-browser></mj-file-browser>\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .file-browser-resource-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n /* The inner mj-file-browser needs to fill the container. */\n .file-browser-resource-container :is(mj-file-browser) {\n flex: 1;\n min-height: 0;\n min-width: 0;\n display: flex;\n }\n `]\n})\nexport class FileBrowserResource extends BaseResourceComponent {\n private dataLoaded = false;\n\n constructor() {\n super();\n }\n\n override set Data(value: ResourceData) {\n super.Data = value;\n if (!this.dataLoaded) {\n this.dataLoaded = true;\n this.loadFileBrowser();\n }\n }\n\n override get Data(): ResourceData {\n return super.Data;\n }\n\n /**\n * Load the file browser (currently just notifies load complete)\n * In future phases, this could pass configuration from ResourceData\n */\n private async loadFileBrowser(): Promise<void> {\n // Defer to next microtask so the shell's LoadCompleteEvent callback\n // is wired before we fire NotifyLoadComplete\n await Promise.resolve();\n this.NotifyLoadComplete();\n }\n\n /**\n * Get the display name for the file browser resource\n */\n override async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return data.Name || 'File Browser';\n }\n\n /**\n * Get the icon class for file browser resources\n */\n override async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-folder-tree';\n }\n}\n"]}
@@ -119,11 +119,11 @@ export class FileBrowserComponent {
119
119
  i0.ɵɵproperty("account", ctx.selectedAccount);
120
120
  i0.ɵɵadvance(2);
121
121
  i0.ɵɵproperty("account", ctx.selectedAccount)("folderPath", ctx.selectedFolderPath);
122
- } }, dependencies: [i1.StorageProvidersListComponent, i2.FolderTreeComponent, i3.FileGridComponent], styles: ["\n\n\n\n\n\n.file-browser[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mj-bg-surface-sunken);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n border: 1px solid var(--mj-border-strong);\n}\n\n\n\n.mobile-header[_ngcontent-%COMP%] {\n display: none;\n align-items: center;\n padding: 8px 12px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.mobile-header[_ngcontent-%COMP%] .browser-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.sidebar-toggle[_ngcontent-%COMP%] {\n margin-right: 12px;\n background: none;\n border: 1px solid var(--mj-border-strong);\n padding: 6px 12px;\n cursor: pointer;\n border-radius: 3px;\n}\n\n.sidebar-toggle[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n\n\n.browser-container[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow: hidden;\n gap: 0;\n}\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-card);\n border-right: 1px solid var(--mj-border-strong);\n width: 220px;\n min-width: 220px;\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.sidebar.collapsed[_ngcontent-%COMP%] {\n width: 0;\n min-width: 0;\n border-right: none;\n opacity: 0;\n}\n\n\n\n.sidebar-section[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.sidebar-section[_ngcontent-%COMP%]:last-child {\n flex: 1;\n border-bottom: none;\n}\n\n.section-header[_ngcontent-%COMP%] {\n padding: 8px 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n\n\n.main-panel[_ngcontent-%COMP%] {\n flex: 1;\n background-color: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-strong);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n\n\n\n\n\n\n\n@media screen and (max-width: 1024px) {\n .sidebar[_ngcontent-%COMP%] {\n width: 200px;\n min-width: 200px;\n }\n}\n\n\n\n@media screen and (max-width: 768px) {\n .mobile-header[_ngcontent-%COMP%] {\n display: flex;\n }\n\n .browser-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n \n\n .sidebar[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 45px; \n\n bottom: 0;\n width: 280px;\n min-width: 280px;\n z-index: 1000;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);\n }\n\n .sidebar.collapsed[_ngcontent-%COMP%] {\n transform: translateX(-100%);\n }\n\n \n\n .main-panel[_ngcontent-%COMP%] {\n flex: 1;\n }\n}\n\n\n\n@media screen and (max-width: 480px) {\n .mobile-header[_ngcontent-%COMP%] {\n padding: 6px 10px;\n }\n\n .mobile-header[_ngcontent-%COMP%] .browser-title[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .section-header[_ngcontent-%COMP%] {\n padding: 6px 10px;\n }\n\n .section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .sidebar[_ngcontent-%COMP%] {\n width: 260px;\n min-width: 260px;\n }\n}"] });
122
+ } }, dependencies: [i1.StorageProvidersListComponent, i2.FolderTreeComponent, i3.FileGridComponent], styles: ["\n\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.file-browser[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mj-bg-surface);\n border: none;\n border-radius: 0;\n overflow: hidden;\n box-shadow: none;\n}\n\n\n\n.mobile-header[_ngcontent-%COMP%] {\n display: none;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mobile-header[_ngcontent-%COMP%] .browser-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.sidebar-toggle[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n padding: 6px 10px;\n cursor: pointer;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.sidebar-toggle[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n\n\n.browser-container[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n}\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface)));\n border-right: 1px solid var(--mj-border-default);\n width: 250px;\n min-width: 250px;\n max-width: 250px;\n overflow: hidden;\n transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s ease, opacity 0.2s ease;\n z-index: 10;\n}\n\n.sidebar.collapsed[_ngcontent-%COMP%] {\n width: 0;\n min-width: 0;\n border-right: none;\n opacity: 0;\n pointer-events: none;\n}\n\n\n\n.sidebar-section[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-height: 180px;\n max-height: 48%;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.sidebar-section[_ngcontent-%COMP%]:last-child {\n flex: 1;\n max-height: none;\n border-bottom: none;\n}\n\n.section-header[_ngcontent-%COMP%] {\n padding: 8px 14px;\n background-color: transparent;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.section-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.section-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n\n\n.main-panel[_ngcontent-%COMP%] {\n flex: 1;\n background-color: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 5px;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.section-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-muted);\n}\n\n\n\n\n\n\n\n\n@media screen and (max-width: 1024px) {\n .sidebar[_ngcontent-%COMP%] {\n width: 220px;\n min-width: 220px;\n max-width: 220px;\n }\n}\n\n\n\n@media screen and (max-width: 768px) {\n .mobile-header[_ngcontent-%COMP%] {\n display: flex;\n }\n\n .browser-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .sidebar[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 270px;\n min-width: 270px;\n max-width: 270px;\n z-index: 1000;\n box-shadow: var(--mj-shadow-lg, 0 10px 25px rgba(0, 0, 0, 0.2));\n background-color: var(--mj-bg-surface);\n }\n\n .sidebar.collapsed[_ngcontent-%COMP%] {\n transform: translateX(-100%);\n }\n\n .main-panel[_ngcontent-%COMP%] {\n flex: 1;\n }\n}"] });
123
123
  }
124
124
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FileBrowserComponent, [{
125
125
  type: Component,
126
- args: [{ standalone: false, selector: 'mj-file-browser', template: "<div class=\"file-browser\">\n <!-- Mobile header with sidebar toggle -->\n <div class=\"mobile-header\">\n <button (click)=\"toggleSidebar()\" class=\"sidebar-toggle\">\n <i class=\"fa-solid fa-bars\"></i>\n </button>\n <h2 class=\"browser-title\">File Browser</h2>\n </div>\n\n <!-- Main two-panel layout -->\n <div class=\"browser-container\">\n <!-- Left Sidebar: Accounts + Categories -->\n <div class=\"sidebar\" [class.collapsed]=\"isSidebarCollapsed\">\n <!-- Accounts Section -->\n <div class=\"sidebar-section\">\n <div class=\"section-header\">\n <h3>ACCOUNTS</h3>\n </div>\n <div class=\"section-content\">\n <mj-storage-providers-list\n (accountSelected)=\"onAccountSelected($event)\"\n ></mj-storage-providers-list>\n </div>\n </div>\n\n <!-- Categories Section -->\n <div class=\"sidebar-section\">\n <div class=\"section-header\">\n <h3>FOLDERS</h3>\n </div>\n <div class=\"section-content\">\n <mj-folder-tree\n [account]=\"selectedAccount\"\n (folderSelected)=\"onFolderSelected($event)\"\n ></mj-folder-tree>\n </div>\n </div>\n </div>\n\n <!-- Right Panel: File Grid -->\n <div class=\"main-panel\">\n <mj-file-grid\n [account]=\"selectedAccount\"\n [folderPath]=\"selectedFolderPath\"\n (folderNavigate)=\"onFolderNavigate($event)\"\n (folderStructureChanged)=\"onFolderStructureChanged()\"\n ></mj-file-grid>\n </div>\n </div>\n</div>\n", styles: ["/* ===========================\n File Browser Shell Styles\n Traditional dual-pane file manager layout\n =========================== */\n\n.file-browser {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mj-bg-surface-sunken);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n border: 1px solid var(--mj-border-strong);\n}\n\n/* Mobile Header */\n.mobile-header {\n display: none;\n align-items: center;\n padding: 8px 12px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.mobile-header .browser-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.sidebar-toggle {\n margin-right: 12px;\n background: none;\n border: 1px solid var(--mj-border-strong);\n padding: 6px 12px;\n cursor: pointer;\n border-radius: 3px;\n}\n\n.sidebar-toggle:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n/* Main Container - Two Panel Layout */\n.browser-container {\n display: flex;\n flex: 1;\n overflow: hidden;\n gap: 0;\n}\n\n/* Left Sidebar */\n.sidebar {\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-card);\n border-right: 1px solid var(--mj-border-strong);\n width: 220px;\n min-width: 220px;\n overflow: hidden;\n transition: all 0.3s ease;\n}\n\n.sidebar.collapsed {\n width: 0;\n min-width: 0;\n border-right: none;\n opacity: 0;\n}\n\n/* Sidebar Sections */\n.sidebar-section {\n display: flex;\n flex-direction: column;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.sidebar-section:last-child {\n flex: 1;\n border-bottom: none;\n}\n\n.section-header {\n padding: 8px 12px;\n background-color: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-strong);\n}\n\n.section-header h3 {\n margin: 0;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n/* Right Main Panel */\n.main-panel {\n flex: 1;\n background-color: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-strong);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* Custom Scrollbar Styling */\n.section-content::-webkit-scrollbar {\n width: 8px;\n}\n\n.section-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-sunken);\n}\n\n.section-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n}\n\n.section-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n/* ===========================\n Responsive Design\n =========================== */\n\n/* Tablet (768px - 1024px) */\n@media screen and (max-width: 1024px) {\n .sidebar {\n width: 200px;\n min-width: 200px;\n }\n}\n\n/* Mobile (below 768px) */\n@media screen and (max-width: 768px) {\n .mobile-header {\n display: flex;\n }\n\n .browser-container {\n flex-direction: column;\n }\n\n /* Sidebar becomes overlay on mobile */\n .sidebar {\n position: absolute;\n left: 0;\n top: 45px; /* Height of mobile header */\n bottom: 0;\n width: 280px;\n min-width: 280px;\n z-index: 1000;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);\n }\n\n .sidebar.collapsed {\n transform: translateX(-100%);\n }\n\n /* File grid takes full space on mobile */\n .main-panel {\n flex: 1;\n }\n}\n\n/* Small Mobile (below 480px) */\n@media screen and (max-width: 480px) {\n .mobile-header {\n padding: 6px 10px;\n }\n\n .mobile-header .browser-title {\n font-size: 14px;\n }\n\n .section-header {\n padding: 6px 10px;\n }\n\n .section-header h3 {\n font-size: 10px;\n }\n\n .sidebar {\n width: 260px;\n min-width: 260px;\n }\n}\n"] }]
126
+ args: [{ standalone: false, selector: 'mj-file-browser', template: "<div class=\"file-browser\">\n <!-- Mobile header with sidebar toggle -->\n <div class=\"mobile-header\">\n <button (click)=\"toggleSidebar()\" class=\"sidebar-toggle\">\n <i class=\"fa-solid fa-bars\"></i>\n </button>\n <h2 class=\"browser-title\">File Browser</h2>\n </div>\n\n <!-- Main two-panel layout -->\n <div class=\"browser-container\">\n <!-- Left Sidebar: Accounts + Categories -->\n <div class=\"sidebar\" [class.collapsed]=\"isSidebarCollapsed\">\n <!-- Accounts Section -->\n <div class=\"sidebar-section\">\n <div class=\"section-header\">\n <h3>ACCOUNTS</h3>\n </div>\n <div class=\"section-content\">\n <mj-storage-providers-list\n (accountSelected)=\"onAccountSelected($event)\"\n ></mj-storage-providers-list>\n </div>\n </div>\n\n <!-- Categories Section -->\n <div class=\"sidebar-section\">\n <div class=\"section-header\">\n <h3>FOLDERS</h3>\n </div>\n <div class=\"section-content\">\n <mj-folder-tree\n [account]=\"selectedAccount\"\n (folderSelected)=\"onFolderSelected($event)\"\n ></mj-folder-tree>\n </div>\n </div>\n </div>\n\n <!-- Right Panel: File Grid -->\n <div class=\"main-panel\">\n <mj-file-grid\n [account]=\"selectedAccount\"\n [folderPath]=\"selectedFolderPath\"\n (folderNavigate)=\"onFolderNavigate($event)\"\n (folderStructureChanged)=\"onFolderStructureChanged()\"\n ></mj-file-grid>\n </div>\n </div>\n</div>\n", styles: ["/* ==========================================================================\n File Browser Shell Component\n Modern macOS Finder / Cloud Storage multi-panel layout\n ========================================================================== */\n\n:host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.file-browser {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mj-bg-surface);\n border: none;\n border-radius: 0;\n overflow: hidden;\n box-shadow: none;\n}\n\n/* Mobile Header */\n.mobile-header {\n display: none;\n align-items: center;\n gap: 12px;\n padding: 10px 16px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mobile-header .browser-title {\n margin: 0;\n font-size: 0.95rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.sidebar-toggle {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n padding: 6px 10px;\n cursor: pointer;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 0.85rem;\n transition: all 0.15s ease;\n}\n\n.sidebar-toggle:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 6%, var(--mj-bg-surface));\n color: var(--mj-text-primary);\n}\n\n/* Main Container - Two Panel Layout */\n.browser-container {\n display: flex;\n flex: 1;\n overflow: hidden;\n position: relative;\n}\n\n/* Left Sidebar: Accounts & Folders */\n.sidebar {\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-sunken, color-mix(in srgb, var(--mj-text-primary) 2%, var(--mj-bg-surface)));\n border-right: 1px solid var(--mj-border-default);\n width: 250px;\n min-width: 250px;\n max-width: 250px;\n overflow: hidden;\n transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s ease, opacity 0.2s ease;\n z-index: 10;\n}\n\n.sidebar.collapsed {\n width: 0;\n min-width: 0;\n border-right: none;\n opacity: 0;\n pointer-events: none;\n}\n\n/* Sidebar Sections */\n.sidebar-section {\n display: flex;\n flex-direction: column;\n min-height: 180px;\n max-height: 48%;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.sidebar-section:last-child {\n flex: 1;\n max-height: none;\n border-bottom: none;\n}\n\n.section-header {\n padding: 8px 14px;\n background-color: transparent;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.section-header h3 {\n margin: 0;\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.section-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n/* Right Main Panel: File Grid & Command Bar */\n.main-panel {\n flex: 1;\n background-color: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Custom Scrollbar Styling */\n.section-content::-webkit-scrollbar {\n width: 5px;\n}\n\n.section-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.section-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.section-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-muted);\n}\n\n/* ==========================================================================\n Responsive Design\n ========================================================================== */\n\n/* Tablet (768px - 1024px) */\n@media screen and (max-width: 1024px) {\n .sidebar {\n width: 220px;\n min-width: 220px;\n max-width: 220px;\n }\n}\n\n/* Mobile (below 768px) */\n@media screen and (max-width: 768px) {\n .mobile-header {\n display: flex;\n }\n\n .browser-container {\n flex-direction: column;\n }\n\n .sidebar {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 270px;\n min-width: 270px;\n max-width: 270px;\n z-index: 1000;\n box-shadow: var(--mj-shadow-lg, 0 10px 25px rgba(0, 0, 0, 0.2));\n background-color: var(--mj-bg-surface);\n }\n\n .sidebar.collapsed {\n transform: translateX(-100%);\n }\n\n .main-panel {\n flex: 1;\n }\n}\n"] }]
127
127
  }], () => [], { folderTree: [{
128
128
  type: ViewChild,
129
129
  args: [FolderTreeComponent]
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { StorageAccountWithProvider } from '@memberjunction/core-entities';
3
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
3
4
  import * as i0 from "@angular/core";
4
5
  /**
5
6
  * Represents a file or folder item in the grid
@@ -177,10 +178,22 @@ export declare class FileGridComponent implements OnInit, OnChanges {
177
178
  selectedSearchProviders: Set<string>;
178
179
  isSearching: boolean;
179
180
  multiProviderSearchResults: MultiProviderSearchResult | null;
181
+ /**
182
+ * Preview modal state
183
+ */
184
+ showPreviewModal: boolean;
185
+ previewItem: FileGridItem | null;
186
+ previewUrl: string | null;
187
+ isLoadingPreview: boolean;
188
+ previewMediaType: string;
180
189
  /**
181
190
  * GraphQL client for file storage operations
182
191
  */
183
192
  private storageClient;
193
+ /**
194
+ * Global notifications service for user toast feedback
195
+ */
196
+ protected notifications: MJNotificationService;
184
197
  constructor();
185
198
  ngOnInit(): void;
186
199
  ngOnChanges(changes: SimpleChanges): void;
@@ -226,13 +239,13 @@ export declare class FileGridComponent implements OnInit, OnChanges {
226
239
  onTileClick(item: FileGridItem, event: MouseEvent): void;
227
240
  /**
228
241
  * Handles double-click on an item
229
- * For folders, navigate into them. For files, open/download them.
242
+ * For folders, navigate into them. For files, open in-browser preview.
230
243
  */
231
244
  onItemDoubleClick(item: FileGridItem): void;
232
245
  /**
233
246
  * Downloads a file by creating a pre-authenticated download URL
234
247
  */
235
- private downloadFile;
248
+ downloadFile(item: FileGridItem): Promise<void>;
236
249
  /**
237
250
  * Toggles between grid and list view
238
251
  */
@@ -285,9 +298,13 @@ export declare class FileGridComponent implements OnInit, OnChanges {
285
298
  */
286
299
  private uploadFiles;
287
300
  /**
288
- * Uploads a single file
301
+ * Uploads a single file using server-side MJ Storage (supports all providers)
289
302
  */
290
303
  private uploadSingleFile;
304
+ /**
305
+ * Reads a browser File object as a base64 encoded string
306
+ */
307
+ private readFileAsBase64;
291
308
  /**
292
309
  * Uploads file to the pre-authenticated URL with progress tracking
293
310
  */
@@ -424,6 +441,49 @@ export declare class FileGridComponent implements OnInit, OnChanges {
424
441
  * Formats date for search results
425
442
  */
426
443
  formatSearchResultDate(dateStr: string): string;
444
+ /**
445
+ * Determines media category for a file item
446
+ */
447
+ getMediaType(item: FileGridItem): string;
448
+ /**
449
+ * Gets specific badge class for media type
450
+ */
451
+ getItemColorClass(item: FileGridItem): string;
452
+ /**
453
+ * Generates clickable path breadcrumbs
454
+ */
455
+ getPathBreadcrumbs(): Array<{
456
+ name: string;
457
+ path: string;
458
+ }>;
459
+ /**
460
+ * Navigates to a specific breadcrumb path
461
+ */
462
+ navigateToBreadcrumb(path: string): void;
463
+ /**
464
+ * Toggles selection of a file/folder item
465
+ */
466
+ toggleItemSelection(item: FileGridItem, event?: Event): void;
467
+ /**
468
+ * Selects all current filtered items
469
+ */
470
+ selectAll(): void;
471
+ /**
472
+ * Clears selection
473
+ */
474
+ deselectAll(): void;
475
+ /**
476
+ * Checks if all items are selected
477
+ */
478
+ areAllSelected(): boolean;
479
+ /**
480
+ * Opens in-browser preview modal
481
+ */
482
+ openPreview(item: FileGridItem): Promise<void>;
483
+ /**
484
+ * Closes the preview modal
485
+ */
486
+ closePreview(): void;
427
487
  static ɵfac: i0.ɵɵFactoryDeclaration<FileGridComponent, never>;
428
488
  static ɵcmp: i0.ɵɵComponentDeclaration<FileGridComponent, "mj-file-grid", never, { "account": { "alias": "account"; "required": false; }; "folderPath": { "alias": "folderPath"; "required": false; }; }, { "folderNavigate": "folderNavigate"; "folderStructureChanged": "folderStructureChanged"; }, never, never, false, never>;
429
489
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAA6B,MAAM,eAAe,CAAC;AAEpI,OAAO,EAAyB,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;;AAGlG;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAMa,iBAAkB,YAAW,MAAM,EAAE,SAAS;IACzD;;OAEG;IACM,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAQ;IAE3D;;OAEG;IACM,UAAU,EAAE,MAAM,CAAM;IAEjC;;OAEG;IACO,cAAc,uBAA8B;IAEtD;;;OAGG;IACO,sBAAsB,qBAA4B;IAE5D;;OAEG;IACI,KAAK,EAAE,YAAY,EAAE,CAAM;IAElC;;OAEG;IACI,aAAa,EAAE,MAAM,EAAE,CAAM;IAEpC,OAAO,CAAC,GAAG,CAA6B;IAExC;;OAEG;IACI,SAAS,EAAE,OAAO,CAAS;IAElC;;OAEG;IACI,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C;;OAEG;IACI,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAU;IAE1C;;OAEG;IACI,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC,CAEzD;IAEF;;OAEG;IACI,WAAW,EAAE,MAAM,CAAM;IAEhC;;OAEG;IACI,cAAc,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAS;IAE3D;;OAEG;IACI,aAAa,EAAE,YAAY,EAAE,CAAM;IAE1C;;OAEG;IACI,UAAU,EAAE,OAAO,CAAS;IAEnC;;OAEG;IACI,WAAW,EAAE,OAAO,CAAS;IAC7B,cAAc,EAAE,MAAM,CAAK;IAC3B,iBAAiB,EAAE,MAAM,CAAM;IAEtC;;OAEG;IACI,mBAAmB,EAAE,OAAO,CAAS;IACrC,aAAa,EAAE,MAAM,CAAM;IAC3B,gBAAgB,EAAE,OAAO,CAAS;IAEzC;;OAEG;IACI,gBAAgB,EAAE,OAAO,CAAS;IAClC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IACzC,UAAU,EAAE,OAAO,CAAS;IAEnC;;OAEG;IACI,gBAAgB,EAAE,OAAO,CAAS;IAClC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IACzC,WAAW,EAAE,MAAM,CAAM;IACzB,UAAU,EAAE,OAAO,CAAS;IAEnC;;OAEG;IACI,cAAc,EAAE,OAAO,CAAS;IAChC,UAAU,EAAE,YAAY,GAAG,IAAI,CAAQ;IACvC,mBAAmB,EAAE,MAAM,CAAM;IACjC,SAAS,EAAE,OAAO,CAAS;IAElC;;OAEG;IACI,cAAc,EAAE,OAAO,CAAS;IAChC,UAAU,EAAE,YAAY,GAAG,IAAI,CAAQ;IACvC,mBAAmB,EAAE,MAAM,CAAM;IACjC,QAAQ,EAAE,OAAO,CAAS;IAEjC;;OAEG;IACI,wBAAwB,EAAE,OAAO,CAAS;IAC1C,oBAAoB,EAAE,YAAY,GAAG,IAAI,CAAQ;IACjD,iBAAiB,EAAE,0BAA0B,EAAE,CAAM;IACrD,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IACrD,4BAA4B,EAAE,MAAM,CAAM;IAC1C,kBAAkB,EAAE,OAAO,CAAS;IACpC,qBAAqB,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IAEvG;;OAEG;IACI,yBAAyB,EAAE,OAAO,CAAS;IAC3C,wBAAwB,EAAE,MAAM,CAAM;IACtC,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IACjD,WAAW,EAAE,OAAO,CAAS;IAC7B,0BAA0B,EAAE,yBAAyB,GAAG,IAAI,CAAQ;IAE3E;;OAEG;IACH,OAAO,CAAC,aAAa,CAA2B;;IAMhD,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC;;OAEG;YACW,SAAS;IAiFvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1C;;OAEG;IACI,WAAW,IAAI,IAAI;IAK1B;;OAEG;IACI,sBAAsB,CAAC,UAAU,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI;IAK5E;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAU5C;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAIrC;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAqC9C;;OAEG;IACI,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI;IAItD;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IA0B/D;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAWlD;;OAEG;YACW,YAAY;IA4C1B;;OAEG;IACI,cAAc,IAAI,IAAI;IAI7B;;OAEG;IACI,OAAO,IAAI,IAAI;IAItB;;OAEG;IACI,UAAU,IAAI,IAAI;IAqBzB;;OAEG;IACI,aAAa,IAAI,OAAO;IAI/B;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAI/E;;OAEG;IACI,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAuD9C;;OAEG;IACI,aAAa,IAAI,IAAI;IAa5B;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAM1C;;OAEG;IACI,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKzC;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAU1C;;OAEG;IACI,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAWrC;;OAEG;YACW,WAAW;IAgBzB;;OAEG;YACW,gBAAgB;IA8D9B;;OAEG;IACH,OAAO,CAAC,eAAe;IA0CvB;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA0D5C;;OAEG;IACI,aAAa,IAAI,IAAI;IAmB5B;;OAEG;IACI,cAAc,IAAI,IAAI;IAK7B;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAqE7C;;OAEG;IACI,aAAa,IAAI,IAAI;IAoB5B;;OAEG;IACI,cAAc,IAAI,IAAI;IAM7B;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA2E7C;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAmE7C;;OAEG;IACI,WAAW,IAAI,IAAI;IAkB1B;;OAEG;IACI,YAAY,IAAI,IAAI;IAM3B;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C3C;;OAEG;IACI,WAAW,IAAI,IAAI;IAmB1B;;OAEG;IACI,YAAY,IAAI,IAAI;IAM3B;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD3C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACI,eAAe,IAAI,YAAY,GAAG,IAAI;IAO7C;;OAEG;IACU,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoClD;;OAEG;IACI,qBAAqB,IAAI,IAAI;IAQpC;;OAEG;IACI,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQxD;;OAEG;IACI,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/D;;OAEG;IACU,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6FpD;;OAEG;IACI,4BAA4B,IAAI,IAAI;IAmB3C;;OAEG;YACW,8BAA8B;IAU5C;;OAEG;IACI,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQnD;;OAEG;IACI,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI7D;;OAEG;IACI,qBAAqB,CAAC,mBAAmB,EAAE,0BAA0B,GAAG,OAAO;IAItF;;OAEG;IACU,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8DvD;;OAEG;IACI,wBAAwB,IAAI,IAAI;IAKvC;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM;IAwBhE;;OAEG;IACI,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpD;;OAEG;IACI,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;yCAvnD3C,iBAAiB;2CAAjB,iBAAiB;CA0nD7B"}
1
+ {"version":3,"file":"file-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/file-browser/file-grid.component.ts"],"names":[],"mappings":"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"}