@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.
- package/LICENSE +180 -4
- package/README.md +60 -15
- package/dist/lib/admin/storage-admin-dialog.component.d.ts +63 -0
- package/dist/lib/admin/storage-admin-dialog.component.d.ts.map +1 -0
- package/dist/lib/admin/storage-admin-dialog.component.js +917 -0
- package/dist/lib/admin/storage-admin-dialog.component.js.map +1 -0
- package/dist/lib/file-browser/file-browser-resource.component.d.ts.map +1 -1
- package/dist/lib/file-browser/file-browser-resource.component.js +11 -21
- package/dist/lib/file-browser/file-browser-resource.component.js.map +1 -1
- package/dist/lib/file-browser/file-browser.component.js +2 -2
- package/dist/lib/file-browser/file-grid.component.d.ts +63 -3
- package/dist/lib/file-browser/file-grid.component.d.ts.map +1 -1
- package/dist/lib/file-browser/file-grid.component.js +1088 -735
- package/dist/lib/file-browser/file-grid.component.js.map +1 -1
- package/dist/lib/file-browser/folder-tree.component.js +32 -30
- package/dist/lib/file-browser/folder-tree.component.js.map +1 -1
- package/dist/lib/file-browser/storage-providers-list.component.d.ts +37 -3
- package/dist/lib/file-browser/storage-providers-list.component.d.ts.map +1 -1
- package/dist/lib/file-browser/storage-providers-list.component.js +191 -65
- package/dist/lib/file-browser/storage-providers-list.component.js.map +1 -1
- package/dist/lib/module.d.ts +10 -7
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +27 -7
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.d.ts +203 -0
- package/dist/lib/record-attachments/record-attachments.component.d.ts.map +1 -0
- package/dist/lib/record-attachments/record-attachments.component.js +2270 -0
- package/dist/lib/record-attachments/record-attachments.component.js.map +1 -0
- package/dist/lib/record-attachments/record-attachments.events.d.ts +124 -0
- package/dist/lib/record-attachments/record-attachments.events.d.ts.map +1 -0
- package/dist/lib/record-attachments/record-attachments.events.js +178 -0
- package/dist/lib/record-attachments/record-attachments.events.js.map +1 -0
- package/dist/lib/record-attachments/record-attachments.types.d.ts +90 -0
- package/dist/lib/record-attachments/record-attachments.types.d.ts.map +1 -0
- package/dist/lib/record-attachments/record-attachments.types.js +57 -0
- package/dist/lib/record-attachments/record-attachments.types.js.map +1 -0
- package/dist/public-api.d.ts +4 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- 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,
|
|
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 "
|
|
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:
|
|
62
|
-
i0.ɵɵelementStart(0, "
|
|
63
|
-
i0.ɵɵelement(1, "mj-
|
|
64
|
-
i0.ɵɵ
|
|
65
|
-
|
|
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
|
-
<
|
|
77
|
-
<mj-
|
|
78
|
-
|
|
79
|
-
|
|
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:
|
|
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
|
|
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
|
|
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: ["/*
|
|
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
|
|
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
|
-
|
|
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;;
|
|
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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"}
|