@memberjunction/ng-dashboards 5.44.0 → 5.45.0
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/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +5 -3
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +4 -2
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +13 -11
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +3 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +12 -10
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +10 -8
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +1 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +5 -3
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +3 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +11 -5
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +3 -2
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +23 -9
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +3 -2
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +10 -4
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +2 -1
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js +13 -6
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +2 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +10 -8
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +3 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +32 -14
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +4 -2
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +15 -13
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/UserRoutines/user-routines-agent-context.d.ts +44 -0
- package/dist/UserRoutines/user-routines-agent-context.d.ts.map +1 -0
- package/dist/UserRoutines/user-routines-agent-context.js +81 -0
- package/dist/UserRoutines/user-routines-agent-context.js.map +1 -0
- package/dist/UserRoutines/user-routines-resource.component.d.ts +60 -0
- package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -0
- package/dist/UserRoutines/user-routines-resource.component.js +328 -0
- package/dist/UserRoutines/user-routines-resource.component.js.map +1 -0
- package/dist/module.d.ts +16 -15
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/routines-dashboards.module.d.ts +17 -0
- package/dist/routines-dashboards.module.d.ts.map +1 -0
- package/dist/routines-dashboards.module.js +65 -0
- package/dist/routines-dashboards.module.js.map +1 -0
- package/package.json +63 -58
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials-list-resource.component.js","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-list-resource.component.ts","../../../src/Credentials/components/credentials-list-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { ResourceData, MJCredentialEntity, MJCredentialTypeEntity } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialEditPanelComponent } from '@memberjunction/ng-credentials';\nimport { FilterFieldConfig, ViewToggleOption } from '@memberjunction/ng-ui-components';\ntype ViewMode = 'grid' | 'list';\ntype StatusFilter = '' | 'active' | 'inactive' | 'expired' | 'expiring';\n\n@RegisterClass(BaseResourceComponent, 'CredentialsListResource')\n@Component({\n standalone: false,\n selector: 'mj-credentials-list-resource',\n templateUrl: './credentials-list-resource.component.html',\n styleUrls: ['./credentials-list-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CredentialsListResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public credentials: MJCredentialEntity[] = [];\n public filteredCredentials: MJCredentialEntity[] = [];\n public types: MJCredentialTypeEntity[] = [];\n\n // View state\n public viewMode: ViewMode = 'grid';\n public searchText = '';\n public selectedTypeFilter = '';\n public selectedStatusFilter: StatusFilter = '';\n public showActiveOnly = false;\n\n // Selection for bulk operations\n public selectedCredentials = new Set<string>();\n private _isAllSelected = false;\n\n // Permissions\n private _metadata = this.ProviderToUse;\n private _permissionCache = new Map<string, boolean>();\n\n protected override destroy$ = new Subject<void>();\n\n @ViewChild('editPanel') editPanel!: CredentialEditPanelComponent;\n\n public readonly viewOptions: ViewToggleOption[] = [\n { key: 'grid', icon: 'fa-solid fa-grip', title: 'Grid view' },\n { key: 'list', icon: 'fa-solid fa-list', title: 'List view' }\n ];\n\n public get FilterFields(): FilterFieldConfig[] {\n const typeOptions = [\n { text: 'All Types', value: '' as const },\n ...this.types.map(t => ({ text: t.Name, value: t.ID as string }))\n ];\n return [\n {\n key: 'typeFilter',\n type: 'dropdown',\n label: 'Type',\n icon: 'fa-solid fa-shapes',\n placeholder: 'All Types',\n filterable: true,\n options: typeOptions\n },\n {\n key: 'statusFilter',\n type: 'dropdown',\n label: 'Status',\n icon: 'fa-solid fa-circle-info',\n placeholder: 'All Statuses',\n options: [\n { text: 'All Statuses', value: '' },\n { text: 'Active', value: 'active' },\n { text: 'Inactive', value: 'inactive' },\n { text: 'Expiring Soon', value: 'expiring' },\n { text: 'Expired', value: 'expired' }\n ]\n }\n ];\n }\n public get FilterValues(): Record<string, unknown> {\n return { typeFilter: this.selectedTypeFilter, statusFilter: this.selectedStatusFilter };\n }\n public get ActiveFilterCount(): number {\n let n = 0;\n if (this.selectedTypeFilter) n++;\n if (this.selectedStatusFilter) n++;\n return n;\n }\n public onFilterValuesChange(v: Record<string, unknown>): void {\n const next = (v ?? {}) as { typeFilter?: string; statusFilter?: StatusFilter };\n if ((next.typeFilter ?? '') !== this.selectedTypeFilter) {\n this.onTypeFilterChange(next.typeFilter ?? '');\n }\n if ((next.statusFilter ?? '') !== this.selectedStatusFilter) {\n this.onStatusFilterChange(next.statusFilter ?? '');\n }\n }\n public resetFilters(): void {\n if (this.selectedTypeFilter) this.onTypeFilterChange('');\n if (this.selectedStatusFilter) this.onStatusFilterChange('');\n }\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Credentials';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-key';\n }\n\n // === Permission Checks ===\n public get UserCanCreate(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Create');\n }\n\n public get UserCanUpdate(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Update');\n }\n\n public get UserCanDelete(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Delete');\n }\n\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n\n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create': hasPermission = userPermissions.CanCreate; break;\n case 'Read': hasPermission = userPermissions.CanRead; break;\n case 'Update': hasPermission = userPermissions.CanUpdate; break;\n case 'Delete': hasPermission = userPermissions.CanDelete; break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const [credResult, typeResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credentials',\n OrderBy: '__mj_UpdatedAt DESC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Credential Types',\n OrderBy: 'Category, Name',\n ResultType: 'entity_object'\n }\n ]);\n\n if (credResult.Success) {\n this.credentials = credResult.Results as MJCredentialEntity[];\n }\n\n if (typeResult.Success) {\n this.types = typeResult.Results as MJCredentialTypeEntity[];\n }\n\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading credentials:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading credentials', 'error', 3000);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n\n // Handle navigation params from Data.Configuration (passed via NavigationService)\n this.handleNavigationConfig();\n }\n }\n\n // === Navigation Handling ===\n\n private handleNavigationConfig(): void {\n const config = this.Data?.Configuration;\n if (!config) {\n return;\n }\n\n // Apply filters from navigation config\n if (config.typeId) {\n this.selectedTypeFilter = config.typeId as string;\n this.applyFilters();\n }\n\n if (config.openCreatePanel) {\n // Open create panel (optionally with type/category pre-selected)\n setTimeout(() => {\n if (config.categoryId) {\n this.createNewCredentialWithType(config.typeId as string, config.categoryId as string);\n } else if (config.typeId) {\n this.createNewCredentialWithType(config.typeId as string);\n } else {\n this.createNewCredential();\n }\n }, 100);\n }\n }\n\n // === CRUD Operations ===\n\n public createNewCredential(): void {\n if (this.editPanel) {\n this.editPanel.open(null);\n }\n }\n\n public createNewCredentialWithType(typeId?: string, categoryId?: string): void {\n if (this.editPanel) {\n this.editPanel.open(null, typeId, categoryId);\n }\n }\n\n public editCredential(credential: MJCredentialEntity, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.editPanel) {\n this.editPanel.open(credential);\n }\n }\n\n public onCredentialSaved(credential: MJCredentialEntity): void {\n // Check if it's a new credential or update\n const existingIndex = this.credentials.findIndex(c => UUIDsEqual(c.ID, credential.ID));\n if (existingIndex >= 0) {\n // Update existing\n this.credentials[existingIndex] = credential;\n } else {\n // Add new\n this.credentials.unshift(credential);\n }\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n public onCredentialDeleted(credentialId: string): void {\n this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credentialId));\n this.selectedCredentials.delete(credentialId);\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n public async deleteCredential(credential: MJCredentialEntity, event?: Event): Promise<void> {\n if (event) {\n event.stopPropagation();\n }\n\n if (!this.UserCanDelete) {\n MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to delete credentials', 'warning', 3000);\n return;\n }\n\n const confirmed = confirm(`Are you sure you want to delete \"${credential.Name}\"? This action cannot be undone.`);\n if (!confirmed) return;\n\n try {\n const success = await credential.Delete();\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Credential \"${credential.Name}\" deleted successfully`, 'success', 3000);\n this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credential.ID));\n this.selectedCredentials.delete(credential.ID);\n this.applyFilters();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credential', 'error', 3000);\n }\n } catch (error) {\n console.error('Error deleting credential:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error deleting credential', 'error', 3000);\n }\n }\n\n public async toggleCredentialActive(credential: MJCredentialEntity, event?: Event): Promise<void> {\n if (event) {\n event.stopPropagation();\n }\n\n if (!this.UserCanUpdate) {\n MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to update credentials', 'warning', 3000);\n return;\n }\n\n try {\n credential.IsActive = !credential.IsActive;\n const success = await credential.Save();\n\n if (success) {\n const status = credential.IsActive ? 'activated' : 'deactivated';\n MJNotificationService.Instance.CreateSimpleNotification(`Credential \"${credential.Name}\" ${status}`, 'success', 2000);\n this.applyFilters();\n } else {\n // Revert on failure\n credential.IsActive = !credential.IsActive;\n MJNotificationService.Instance.CreateSimpleNotification('Failed to update credential', 'error', 3000);\n }\n } catch (error) {\n console.error('Error updating credential:', error);\n credential.IsActive = !credential.IsActive;\n MJNotificationService.Instance.CreateSimpleNotification('Error updating credential', 'error', 3000);\n }\n this.cdr.markForCheck();\n }\n\n // === Selection ===\n\n public toggleSelection(credential: MJCredentialEntity, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.selectedCredentials.has(credential.ID)) {\n this.selectedCredentials.delete(credential.ID);\n } else {\n this.selectedCredentials.add(credential.ID);\n }\n this.updateAllSelectedState();\n this.cdr.markForCheck();\n }\n\n public toggleSelectAll(): void {\n if (this._isAllSelected) {\n this.selectedCredentials.clear();\n } else {\n this.filteredCredentials.forEach(c => this.selectedCredentials.add(c.ID));\n }\n this._isAllSelected = !this._isAllSelected;\n this.cdr.markForCheck();\n }\n\n public isAllSelected(): boolean {\n return this._isAllSelected;\n }\n\n public isSelected(credential: MJCredentialEntity): boolean {\n return this.selectedCredentials.has(credential.ID);\n }\n\n public clearSelection(): void {\n this.selectedCredentials.clear();\n this._isAllSelected = false;\n this.cdr.markForCheck();\n }\n\n private updateAllSelectedState(): void {\n this._isAllSelected = this.filteredCredentials.length > 0 &&\n this.filteredCredentials.every(c => this.selectedCredentials.has(c.ID));\n }\n\n public async deleteSelected(): Promise<void> {\n if (!this.UserCanDelete || this.selectedCredentials.size === 0) return;\n\n const count = this.selectedCredentials.size;\n const confirmed = confirm(`Are you sure you want to delete ${count} credential(s)? This action cannot be undone.`);\n if (!confirmed) return;\n\n const toDelete = Array.from(this.selectedCredentials)\n .map(id => this.credentials.find(c => UUIDsEqual(c.ID, id)))\n .filter((c): c is MJCredentialEntity => c != null);\n\n if (toDelete.length === 0) return;\n\n const tg = await this._metadata.CreateTransactionGroup();\n for (const credential of toDelete) {\n credential.TransactionGroup = tg;\n await credential.Delete();\n }\n\n if (await tg.Submit()) {\n const deletedIds = new Set(toDelete.map(c => c.ID));\n this.credentials = this.credentials.filter(c => !deletedIds.has(c.ID));\n this.selectedCredentials.clear();\n this.applyFilters();\n MJNotificationService.Instance.CreateSimpleNotification(\n `${toDelete.length} credential(s) deleted`,\n 'success',\n 3000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to delete credentials — all changes have been rolled back',\n 'error',\n 3000\n );\n }\n }\n\n // === Filtering ===\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n }\n\n public onTypeFilterChange(typeId: string): void {\n this.selectedTypeFilter = typeId;\n this.applyFilters();\n }\n\n public onStatusFilterChange(status: StatusFilter): void {\n this.selectedStatusFilter = status;\n this.applyFilters();\n }\n\n public onActiveFilterChange(showActive: boolean): void {\n this.showActiveOnly = showActive;\n this.applyFilters();\n }\n\n public clearFilters(): void {\n this.searchText = '';\n this.selectedTypeFilter = '';\n this.selectedStatusFilter = '';\n this.showActiveOnly = false;\n this.applyFilters();\n }\n\n /** True when search and/or any filter narrow the list. */\n public get IsListNarrowed(): boolean {\n return !!(this.searchText || this.selectedTypeFilter || this.selectedStatusFilter);\n }\n\n /** Empty-state CTA: reset filters when narrowed, otherwise create. */\n public onEmptyStateAction(): void {\n if (this.IsListNarrowed) {\n this.clearFilters();\n } else {\n this.createNewCredential();\n }\n }\n\n public get hasActiveFilters(): boolean {\n return this.searchText !== '' ||\n this.selectedTypeFilter !== '' ||\n this.selectedStatusFilter !== '' ||\n this.showActiveOnly;\n }\n\n private applyFilters(): void {\n let filtered = [...this.credentials];\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n\n // Filter by active status\n if (this.showActiveOnly) {\n filtered = filtered.filter(c => c.IsActive);\n }\n\n // Filter by status\n if (this.selectedStatusFilter) {\n filtered = filtered.filter(c => {\n const statusClass = this.getStatusClass(c);\n switch (this.selectedStatusFilter) {\n case 'active': return statusClass === 'active';\n case 'inactive': return statusClass === 'inactive';\n case 'expired': return statusClass === 'expired';\n case 'expiring': return statusClass === 'expiring';\n default: return true;\n }\n });\n }\n\n // Filter by type\n if (this.selectedTypeFilter) {\n filtered = filtered.filter(c => UUIDsEqual(c.CredentialTypeID, this.selectedTypeFilter));\n }\n\n // Filter by search text\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase().trim();\n filtered = filtered.filter(c =>\n c.Name.toLowerCase().includes(search) ||\n (c.Description && c.Description.toLowerCase().includes(search)) ||\n (c.CredentialType && c.CredentialType.toLowerCase().includes(search))\n );\n }\n\n this.filteredCredentials = filtered;\n this.updateAllSelectedState();\n this.cdr.markForCheck();\n }\n\n // === View Mode ===\n\n public setViewMode(mode: ViewMode): void {\n this.viewMode = mode;\n this.cdr.markForCheck();\n }\n\n // === Helpers ===\n\n public getTypeById(typeId: string): MJCredentialTypeEntity | undefined {\n return this.types.find(t => UUIDsEqual(t.ID, typeId));\n }\n\n public getTypesByCategory(): Map<string, MJCredentialTypeEntity[]> {\n const grouped = new Map<string, MJCredentialTypeEntity[]>();\n for (const type of this.types) {\n const category = type.Category;\n if (!grouped.has(category)) {\n grouped.set(category, []);\n }\n grouped.get(category)!.push(type);\n }\n return grouped;\n }\n\n public getStatusClass(credential: MJCredentialEntity): string {\n if (!credential.IsActive) {\n return 'inactive';\n }\n if (credential.ExpiresAt) {\n const expiresAt = new Date(credential.ExpiresAt);\n const now = new Date();\n const thirtyDays = 30 * 24 * 60 * 60 * 1000;\n if (expiresAt < now) {\n return 'expired';\n }\n if (expiresAt.getTime() - now.getTime() < thirtyDays) {\n return 'expiring';\n }\n }\n return 'active';\n }\n\n public getStatusLabel(credential: MJCredentialEntity): string {\n const statusClass = this.getStatusClass(credential);\n const labels: Record<string, string> = {\n 'active': 'Active',\n 'inactive': 'Inactive',\n 'expired': 'Expired',\n 'expiring': 'Expiring Soon'\n };\n return labels[statusClass] || 'Unknown';\n }\n\n public getStatusIcon(credential: MJCredentialEntity): string {\n const statusClass = this.getStatusClass(credential);\n const icons: Record<string, string> = {\n 'active': 'fa-solid fa-check-circle',\n 'inactive': 'fa-solid fa-minus-circle',\n 'expired': 'fa-solid fa-times-circle',\n 'expiring': 'fa-solid fa-clock'\n };\n return icons[statusClass] || 'fa-solid fa-circle';\n }\n\n public formatDate(date: Date | null | undefined): string {\n if (!date) return 'Never';\n return new Date(date).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n });\n }\n\n public formatDateTime(date: Date | null | undefined): string {\n if (!date) return 'Never';\n return new Date(date).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n public getTimeAgo(date: Date | null | undefined): string {\n if (!date) return 'Never';\n const now = new Date();\n const then = new Date(date);\n const diffMs = now.getTime() - then.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 30) return `${diffDays}d ago`;\n return this.formatDate(date);\n }\n\n public getTypeIcon(credential: MJCredentialEntity): string {\n const type = this.getTypeById(credential.CredentialTypeID);\n if (!type) return 'fa-solid fa-key';\n\n const iconMap: Record<string, string> = {\n 'AI': 'fa-solid fa-brain',\n 'Communication': 'fa-solid fa-envelope',\n 'Storage': 'fa-solid fa-cloud',\n 'Database': 'fa-solid fa-database',\n 'Authentication': 'fa-solid fa-shield-halved',\n 'Integration': 'fa-solid fa-plug'\n };\n return iconMap[type.Category] || 'fa-solid fa-key';\n }\n\n public refresh(): void {\n this.selectedCredentials.clear();\n this.loadData();\n }\n\n // === Stats ===\n\n public get activeCount(): number {\n return this.credentials.filter(c => c.IsActive).length;\n }\n\n public getActiveCount(): number {\n return this.activeCount;\n }\n\n public get expiringCount(): number {\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n return this.credentials.filter(c =>\n c.ExpiresAt &&\n new Date(c.ExpiresAt) >= now &&\n new Date(c.ExpiresAt) <= thirtyDaysFromNow &&\n c.IsActive\n ).length;\n }\n\n public getExpiringSoonCount(): number {\n return this.expiringCount;\n }\n\n public get expiredCount(): number {\n const now = new Date();\n return this.credentials.filter(c =>\n c.ExpiresAt && new Date(c.ExpiresAt) < now\n ).length;\n }\n\n public getExpiredCount(): number {\n return this.expiredCount;\n }\n\n // === Status Helpers ===\n\n public isExpired(credential: MJCredentialEntity): boolean {\n if (!credential.ExpiresAt) return false;\n return new Date(credential.ExpiresAt) < new Date();\n }\n\n public isExpiringSoon(credential: MJCredentialEntity): boolean {\n if (!credential.ExpiresAt) return false;\n const expiresAt = new Date(credential.ExpiresAt);\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n return expiresAt >= now && expiresAt <= thirtyDaysFromNow;\n }\n\n // === Bulk Operations ===\n\n public async bulkToggleActive(active: boolean): Promise<void> {\n if (!this.UserCanUpdate || this.selectedCredentials.size === 0) return;\n\n const toUpdate: MJCredentialEntity[] = [];\n for (const credId of this.selectedCredentials) {\n const credential = this.credentials.find(c => UUIDsEqual(c.ID, credId));\n if (credential && credential.IsActive !== active) {\n toUpdate.push(credential);\n }\n }\n\n const action = active ? 'activated' : 'deactivated';\n\n if (toUpdate.length === 0) {\n this.clearSelection();\n return;\n }\n\n const tg = await this._metadata.CreateTransactionGroup();\n for (const credential of toUpdate) {\n credential.IsActive = active;\n credential.TransactionGroup = tg;\n await credential.Save();\n }\n\n if (await tg.Submit()) {\n this.clearSelection();\n this.applyFilters();\n MJNotificationService.Instance.CreateSimpleNotification(\n `${toUpdate.length} credential(s) ${action}`,\n 'success',\n 3000\n );\n } else {\n // Server rolled back — revert the client-side state to match\n for (const credential of toUpdate) {\n credential.IsActive = !active;\n }\n this.clearSelection();\n this.applyFilters();\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to ${action.slice(0, -1)} credentials — all changes have been rolled back`,\n 'error',\n 3000\n );\n }\n }\n\n public async bulkDelete(): Promise<void> {\n if (!this.UserCanDelete || this.selectedCredentials.size === 0) return;\n\n const count = this.selectedCredentials.size;\n const confirmed = confirm(`Are you sure you want to delete ${count} credential(s)? This action cannot be undone.`);\n if (!confirmed) return;\n\n const toDelete = Array.from(this.selectedCredentials)\n .map(id => this.credentials.find(c => UUIDsEqual(c.ID, id)))\n .filter((c): c is MJCredentialEntity => c != null);\n\n if (toDelete.length === 0) return;\n\n const tg = await this._metadata.CreateTransactionGroup();\n for (const credential of toDelete) {\n credential.TransactionGroup = tg;\n await credential.Delete();\n }\n\n if (await tg.Submit()) {\n const deletedIds = new Set(toDelete.map(c => c.ID));\n this.credentials = this.credentials.filter(c => !deletedIds.has(c.ID));\n this.clearSelection();\n this.applyFilters();\n MJNotificationService.Instance.CreateSimpleNotification(\n `${toDelete.length} credential(s) deleted`,\n 'success',\n 3000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to delete credentials — all changes have been rolled back',\n 'error',\n 3000\n );\n }\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Credentials\"\n Icon=\"fa-solid fa-key\">\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredCredentials.length\"\n [Total]=\"credentials.length\"\n Label=\"credentials\">\n </mj-stat-badge>\n @if (getExpiringSoonCount() > 0) {\n <mj-stat-badge\n Icon=\"fa-solid fa-clock\"\n [Count]=\"getExpiringSoonCount()\"\n Label=\"expiring\"\n Variant=\"warning\">\n </mj-stat-badge>\n }\n @if (getExpiredCount() > 0) {\n <mj-stat-badge\n Icon=\"fa-solid fa-exclamation-circle\"\n [Count]=\"getExpiredCount()\"\n Label=\"expired\"\n Variant=\"error\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n @if (UserCanCreate) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewCredential()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">New Credential</span>\n </button>\n }\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search credentials...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-view-toggle\n [Options]=\"viewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (isLoading) {\n <mj-loading text=\"Loading credentials...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Bulk Actions Bar -->\n @if (selectedCredentials.size > 0) {\n <div class=\"bulk-actions\">\n <div class=\"bulk-info\">\n <span class=\"bulk-count\">{{selectedCredentials.size}} selected</span>\n <button class=\"btn-link\" (click)=\"clearSelection()\">Clear selection</button>\n </div>\n <div class=\"bulk-buttons\">\n @if (UserCanUpdate) {\n <button class=\"btn-bulk\" (click)=\"bulkToggleActive(true)\">\n <i class=\"fa-solid fa-toggle-on\"></i>\n Activate\n </button>\n }\n @if (UserCanUpdate) {\n <button class=\"btn-bulk\" (click)=\"bulkToggleActive(false)\">\n <i class=\"fa-solid fa-toggle-off\"></i>\n Deactivate\n </button>\n }\n @if (UserCanDelete) {\n <button class=\"btn-bulk danger\" (click)=\"bulkDelete()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n }\n </div>\n </div>\n }\n <!-- Grid View -->\n @if (viewMode === 'grid' && filteredCredentials.length > 0) {\n <div class=\"credentials-grid\">\n @for (credential of filteredCredentials; track credential) {\n <div\n class=\"credential-card\"\n [class.selected]=\"selectedCredentials.has(credential.ID)\"\n [class.expired]=\"isExpired(credential)\"\n [class.expiring]=\"isExpiringSoon(credential)\"\n >\n <!-- Selection Checkbox -->\n @if (UserCanUpdate || UserCanDelete) {\n <div class=\"card-select\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedCredentials.has(credential.ID)\"\n (change)=\"toggleSelection(credential)\"\n />\n </div>\n }\n <div class=\"card-header\">\n <div class=\"card-icon\" [ngClass]=\"getStatusClass(credential)\">\n <i [class]=\"credential.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"card-title\">\n <div class=\"credential-name\">{{credential.Name}}</div>\n <div class=\"credential-type\">{{credential.CredentialType || 'Unknown Type'}}</div>\n </div>\n <div class=\"card-actions\">\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"toggleCredentialActive(credential, $event)\"\n [title]=\"credential.IsActive ? 'Deactivate' : 'Activate'\">\n <i [class]=\"credential.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editCredential(credential, $event)\"\n title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"deleteCredential(credential, $event)\"\n title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"card-body\" (click)=\"editCredential(credential)\">\n <div class=\"status-badge\" [ngClass]=\"getStatusClass(credential)\">\n <i [class]=\"getStatusIcon(credential)\"></i>\n {{getStatusLabel(credential)}}\n </div>\n @if (credential.Description) {\n <p class=\"credential-description\">\n {{credential.Description}}\n </p>\n }\n <div class=\"credential-meta\">\n @if (credential.IsDefault) {\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-star\"></i>\n <span>Default</span>\n </div>\n }\n @if (credential.ExpiresAt) {\n <div class=\"meta-item\" [class.warning]=\"isExpiringSoon(credential)\" [class.danger]=\"isExpired(credential)\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{isExpired(credential) ? 'Expired' : 'Expires'}}: {{formatDate(credential.ExpiresAt)}}</span>\n </div>\n }\n @if (credential.LastUsedAt) {\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Last used: {{formatDate(credential.LastUsedAt)}}</span>\n </div>\n }\n </div>\n </div>\n <div class=\"card-footer\">\n @if (credential.Category) {\n <div class=\"category-tag\">\n <i class=\"fa-solid fa-folder\"></i>\n {{credential.Category}}\n </div>\n }\n <div class=\"created-info\">\n Created {{formatDate(credential.__mj_CreatedAt)}}\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- List View -->\n @if (viewMode === 'list' && filteredCredentials.length > 0) {\n <div class=\"credentials-table-container\">\n <table class=\"credentials-table\">\n <thead>\n <tr>\n @if (UserCanUpdate || UserCanDelete) {\n <th class=\"col-select\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllSelected()\"\n (change)=\"toggleSelectAll()\"\n />\n </th>\n }\n <th class=\"col-name\">Name</th>\n <th class=\"col-type\">Type</th>\n <th class=\"col-category\">Category</th>\n <th class=\"col-status\">Status</th>\n <th class=\"col-expires\">Expires</th>\n <th class=\"col-used\">Last Used</th>\n <th class=\"col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (credential of filteredCredentials; track credential) {\n <tr\n [class.selected]=\"selectedCredentials.has(credential.ID)\"\n [class.expired]=\"isExpired(credential)\"\n >\n @if (UserCanUpdate || UserCanDelete) {\n <td class=\"col-select\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedCredentials.has(credential.ID)\"\n (change)=\"toggleSelection(credential)\"\n />\n </td>\n }\n <td class=\"col-name\" (click)=\"editCredential(credential)\">\n <div class=\"name-cell\">\n <i [class]=\"credential.IconClass || 'fa-solid fa-key'\" [ngClass]=\"getStatusClass(credential)\"></i>\n <div class=\"name-info\">\n <span class=\"credential-name\">{{credential.Name}}</span>\n @if (credential.Description) {\n <span class=\"credential-desc\">{{credential.Description}}</span>\n }\n </div>\n @if (credential.IsDefault) {\n <span class=\"default-badge\">Default</span>\n }\n </div>\n </td>\n <td class=\"col-type\">{{credential.CredentialType || '-'}}</td>\n <td class=\"col-category\">\n @if (credential.Category) {\n <span class=\"category-pill\">{{credential.Category}}</span>\n }\n @if (!credential.Category) {\n <span>-</span>\n }\n </td>\n <td class=\"col-status\">\n <span class=\"status-pill\" [ngClass]=\"getStatusClass(credential)\">\n {{getStatusLabel(credential)}}\n </span>\n </td>\n <td class=\"col-expires\" [class.warning]=\"isExpiringSoon(credential)\" [class.danger]=\"isExpired(credential)\">\n {{credential.ExpiresAt ? formatDate(credential.ExpiresAt) : 'Never'}}\n </td>\n <td class=\"col-used\">\n {{credential.LastUsedAt ? formatDate(credential.LastUsedAt) : 'Never'}}\n </td>\n <td class=\"col-actions\">\n <div class=\"table-actions\">\n @if (UserCanUpdate) {\n <button\n class=\"table-action-btn\"\n (click)=\"toggleCredentialActive(credential, $event)\"\n [title]=\"credential.IsActive ? 'Deactivate' : 'Activate'\"\n >\n <i [class]=\"credential.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button\n class=\"table-action-btn\"\n (click)=\"editCredential(credential, $event)\"\n title=\"Edit\"\n >\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete) {\n <button\n class=\"table-action-btn danger\"\n (click)=\"deleteCredential(credential, $event)\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n <!-- Empty State -->\n @if (filteredCredentials.length === 0) {\n <mj-empty-state\n [Variant]=\"IsListNarrowed ? 'no-results' : 'empty'\"\n Icon=\"fa-solid fa-key\"\n Title=\"No Credentials Found\"\n [Message]=\"IsListNarrowed ? 'No credentials match your current filters.' : 'Get started by creating your first credential.'\"\n [ActionText]=\"IsListNarrowed ? 'Reset filters' : (UserCanCreate ? 'Create Credential' : '')\"\n [ActionIcon]=\"IsListNarrowed ? 'fa-solid fa-rotate-left' : 'fa-solid fa-plus'\"\n (Action)=\"onEmptyStateAction()\" />\n }\n }\n\n <!-- Edit Panel -->\n <mj-credential-edit-panel\n #editPanel\n [credentialTypes]=\"types\"\n (saved)=\"onCredentialSaved($event)\"\n (deleted)=\"onCredentialDeleted($event)\"\n ></mj-credential-edit-panel>\n </mj-page-body>\n</mj-page-layout>\n"]}
|
|
1
|
+
{"version":3,"file":"credentials-list-resource.component.js","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-list-resource.component.ts","../../../src/Credentials/components/credentials-list-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { ResourceData, MJCredentialEntity, MJCredentialTypeEntity } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialEditPanelComponent } from '@memberjunction/ng-credentials';\nimport { FilterFieldConfig, ViewToggleOption, MJConfirmService } from '@memberjunction/ng-ui-components';\ntype ViewMode = 'grid' | 'list';\ntype StatusFilter = '' | 'active' | 'inactive' | 'expired' | 'expiring';\n\n@RegisterClass(BaseResourceComponent, 'CredentialsListResource')\n@Component({\n standalone: false,\n selector: 'mj-credentials-list-resource',\n templateUrl: './credentials-list-resource.component.html',\n styleUrls: ['./credentials-list-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CredentialsListResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public credentials: MJCredentialEntity[] = [];\n public filteredCredentials: MJCredentialEntity[] = [];\n public types: MJCredentialTypeEntity[] = [];\n\n // View state\n public viewMode: ViewMode = 'grid';\n public searchText = '';\n public selectedTypeFilter = '';\n public selectedStatusFilter: StatusFilter = '';\n public showActiveOnly = false;\n\n // Selection for bulk operations\n public selectedCredentials = new Set<string>();\n private _isAllSelected = false;\n\n // Permissions\n private _metadata = this.ProviderToUse;\n private _permissionCache = new Map<string, boolean>();\n\n protected override destroy$ = new Subject<void>();\n\n @ViewChild('editPanel') editPanel!: CredentialEditPanelComponent;\n\n public readonly viewOptions: ViewToggleOption[] = [\n { key: 'grid', icon: 'fa-solid fa-grip', title: 'Grid view' },\n { key: 'list', icon: 'fa-solid fa-list', title: 'List view' }\n ];\n\n public get FilterFields(): FilterFieldConfig[] {\n const typeOptions = [\n { text: 'All Types', value: '' as const },\n ...this.types.map(t => ({ text: t.Name, value: t.ID as string }))\n ];\n return [\n {\n key: 'typeFilter',\n type: 'dropdown',\n label: 'Type',\n icon: 'fa-solid fa-shapes',\n placeholder: 'All Types',\n filterable: true,\n options: typeOptions\n },\n {\n key: 'statusFilter',\n type: 'dropdown',\n label: 'Status',\n icon: 'fa-solid fa-circle-info',\n placeholder: 'All Statuses',\n options: [\n { text: 'All Statuses', value: '' },\n { text: 'Active', value: 'active' },\n { text: 'Inactive', value: 'inactive' },\n { text: 'Expiring Soon', value: 'expiring' },\n { text: 'Expired', value: 'expired' }\n ]\n }\n ];\n }\n public get FilterValues(): Record<string, unknown> {\n return { typeFilter: this.selectedTypeFilter, statusFilter: this.selectedStatusFilter };\n }\n public get ActiveFilterCount(): number {\n let n = 0;\n if (this.selectedTypeFilter) n++;\n if (this.selectedStatusFilter) n++;\n return n;\n }\n public onFilterValuesChange(v: Record<string, unknown>): void {\n const next = (v ?? {}) as { typeFilter?: string; statusFilter?: StatusFilter };\n if ((next.typeFilter ?? '') !== this.selectedTypeFilter) {\n this.onTypeFilterChange(next.typeFilter ?? '');\n }\n if ((next.statusFilter ?? '') !== this.selectedStatusFilter) {\n this.onStatusFilterChange(next.statusFilter ?? '');\n }\n }\n public resetFilters(): void {\n if (this.selectedTypeFilter) this.onTypeFilterChange('');\n if (this.selectedStatusFilter) this.onStatusFilterChange('');\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private confirm: MJConfirmService\n ) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Credentials';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-key';\n }\n\n // === Permission Checks ===\n public get UserCanCreate(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Create');\n }\n\n public get UserCanUpdate(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Update');\n }\n\n public get UserCanDelete(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Delete');\n }\n\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n\n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create': hasPermission = userPermissions.CanCreate; break;\n case 'Read': hasPermission = userPermissions.CanRead; break;\n case 'Update': hasPermission = userPermissions.CanUpdate; break;\n case 'Delete': hasPermission = userPermissions.CanDelete; break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const [credResult, typeResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credentials',\n OrderBy: '__mj_UpdatedAt DESC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Credential Types',\n OrderBy: 'Category, Name',\n ResultType: 'entity_object'\n }\n ]);\n\n if (credResult.Success) {\n this.credentials = credResult.Results as MJCredentialEntity[];\n }\n\n if (typeResult.Success) {\n this.types = typeResult.Results as MJCredentialTypeEntity[];\n }\n\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading credentials:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading credentials', 'error', 3000);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n\n // Handle navigation params from Data.Configuration (passed via NavigationService)\n this.handleNavigationConfig();\n }\n }\n\n // === Navigation Handling ===\n\n private handleNavigationConfig(): void {\n const config = this.Data?.Configuration;\n if (!config) {\n return;\n }\n\n // Apply filters from navigation config\n if (config.typeId) {\n this.selectedTypeFilter = config.typeId as string;\n this.applyFilters();\n }\n\n if (config.openCreatePanel) {\n // Open create panel (optionally with type/category pre-selected)\n setTimeout(() => {\n if (config.categoryId) {\n this.createNewCredentialWithType(config.typeId as string, config.categoryId as string);\n } else if (config.typeId) {\n this.createNewCredentialWithType(config.typeId as string);\n } else {\n this.createNewCredential();\n }\n }, 100);\n }\n }\n\n // === CRUD Operations ===\n\n public createNewCredential(): void {\n if (this.editPanel) {\n this.editPanel.open(null);\n }\n }\n\n public createNewCredentialWithType(typeId?: string, categoryId?: string): void {\n if (this.editPanel) {\n this.editPanel.open(null, typeId, categoryId);\n }\n }\n\n public editCredential(credential: MJCredentialEntity, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.editPanel) {\n this.editPanel.open(credential);\n }\n }\n\n public onCredentialSaved(credential: MJCredentialEntity): void {\n // Check if it's a new credential or update\n const existingIndex = this.credentials.findIndex(c => UUIDsEqual(c.ID, credential.ID));\n if (existingIndex >= 0) {\n // Update existing\n this.credentials[existingIndex] = credential;\n } else {\n // Add new\n this.credentials.unshift(credential);\n }\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n public onCredentialDeleted(credentialId: string): void {\n this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credentialId));\n this.selectedCredentials.delete(credentialId);\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n public async deleteCredential(credential: MJCredentialEntity, event?: Event): Promise<void> {\n if (event) {\n event.stopPropagation();\n }\n\n if (!this.UserCanDelete) {\n MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to delete credentials', 'warning', 3000);\n return;\n }\n\n const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete credential',\n message: `Delete \"${credential.Name}\"?`,\n detail: 'This action cannot be undone.',\n });\n if (!confirmed) return;\n\n try {\n const success = await credential.Delete();\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Credential \"${credential.Name}\" deleted successfully`, 'success', 3000);\n this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credential.ID));\n this.selectedCredentials.delete(credential.ID);\n this.applyFilters();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credential', 'error', 3000);\n }\n } catch (error) {\n console.error('Error deleting credential:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error deleting credential', 'error', 3000);\n }\n }\n\n public async toggleCredentialActive(credential: MJCredentialEntity, event?: Event): Promise<void> {\n if (event) {\n event.stopPropagation();\n }\n\n if (!this.UserCanUpdate) {\n MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to update credentials', 'warning', 3000);\n return;\n }\n\n try {\n credential.IsActive = !credential.IsActive;\n const success = await credential.Save();\n\n if (success) {\n const status = credential.IsActive ? 'activated' : 'deactivated';\n MJNotificationService.Instance.CreateSimpleNotification(`Credential \"${credential.Name}\" ${status}`, 'success', 2000);\n this.applyFilters();\n } else {\n // Revert on failure\n credential.IsActive = !credential.IsActive;\n MJNotificationService.Instance.CreateSimpleNotification('Failed to update credential', 'error', 3000);\n }\n } catch (error) {\n console.error('Error updating credential:', error);\n credential.IsActive = !credential.IsActive;\n MJNotificationService.Instance.CreateSimpleNotification('Error updating credential', 'error', 3000);\n }\n this.cdr.markForCheck();\n }\n\n // === Selection ===\n\n public toggleSelection(credential: MJCredentialEntity, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.selectedCredentials.has(credential.ID)) {\n this.selectedCredentials.delete(credential.ID);\n } else {\n this.selectedCredentials.add(credential.ID);\n }\n this.updateAllSelectedState();\n this.cdr.markForCheck();\n }\n\n public toggleSelectAll(): void {\n if (this._isAllSelected) {\n this.selectedCredentials.clear();\n } else {\n this.filteredCredentials.forEach(c => this.selectedCredentials.add(c.ID));\n }\n this._isAllSelected = !this._isAllSelected;\n this.cdr.markForCheck();\n }\n\n public isAllSelected(): boolean {\n return this._isAllSelected;\n }\n\n public isSelected(credential: MJCredentialEntity): boolean {\n return this.selectedCredentials.has(credential.ID);\n }\n\n public clearSelection(): void {\n this.selectedCredentials.clear();\n this._isAllSelected = false;\n this.cdr.markForCheck();\n }\n\n private updateAllSelectedState(): void {\n this._isAllSelected = this.filteredCredentials.length > 0 &&\n this.filteredCredentials.every(c => this.selectedCredentials.has(c.ID));\n }\n\n public async deleteSelected(): Promise<void> {\n if (!this.UserCanDelete || this.selectedCredentials.size === 0) return;\n\n const count = this.selectedCredentials.size;\n const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete credentials',\n message: `Delete ${count} credential(s)?`,\n detail: 'This action cannot be undone.',\n });\n if (!confirmed) return;\n\n const toDelete = Array.from(this.selectedCredentials)\n .map(id => this.credentials.find(c => UUIDsEqual(c.ID, id)))\n .filter((c): c is MJCredentialEntity => c != null);\n\n if (toDelete.length === 0) return;\n\n const tg = await this._metadata.CreateTransactionGroup();\n for (const credential of toDelete) {\n credential.TransactionGroup = tg;\n await credential.Delete();\n }\n\n if (await tg.Submit()) {\n const deletedIds = new Set(toDelete.map(c => c.ID));\n this.credentials = this.credentials.filter(c => !deletedIds.has(c.ID));\n this.selectedCredentials.clear();\n this.applyFilters();\n MJNotificationService.Instance.CreateSimpleNotification(\n `${toDelete.length} credential(s) deleted`,\n 'success',\n 3000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to delete credentials — all changes have been rolled back',\n 'error',\n 3000\n );\n }\n }\n\n // === Filtering ===\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n }\n\n public onTypeFilterChange(typeId: string): void {\n this.selectedTypeFilter = typeId;\n this.applyFilters();\n }\n\n public onStatusFilterChange(status: StatusFilter): void {\n this.selectedStatusFilter = status;\n this.applyFilters();\n }\n\n public onActiveFilterChange(showActive: boolean): void {\n this.showActiveOnly = showActive;\n this.applyFilters();\n }\n\n public clearFilters(): void {\n this.searchText = '';\n this.selectedTypeFilter = '';\n this.selectedStatusFilter = '';\n this.showActiveOnly = false;\n this.applyFilters();\n }\n\n /** True when search and/or any filter narrow the list. */\n public get IsListNarrowed(): boolean {\n return !!(this.searchText || this.selectedTypeFilter || this.selectedStatusFilter);\n }\n\n /** Empty-state CTA: reset filters when narrowed, otherwise create. */\n public onEmptyStateAction(): void {\n if (this.IsListNarrowed) {\n this.clearFilters();\n } else {\n this.createNewCredential();\n }\n }\n\n public get hasActiveFilters(): boolean {\n return this.searchText !== '' ||\n this.selectedTypeFilter !== '' ||\n this.selectedStatusFilter !== '' ||\n this.showActiveOnly;\n }\n\n private applyFilters(): void {\n let filtered = [...this.credentials];\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n\n // Filter by active status\n if (this.showActiveOnly) {\n filtered = filtered.filter(c => c.IsActive);\n }\n\n // Filter by status\n if (this.selectedStatusFilter) {\n filtered = filtered.filter(c => {\n const statusClass = this.getStatusClass(c);\n switch (this.selectedStatusFilter) {\n case 'active': return statusClass === 'active';\n case 'inactive': return statusClass === 'inactive';\n case 'expired': return statusClass === 'expired';\n case 'expiring': return statusClass === 'expiring';\n default: return true;\n }\n });\n }\n\n // Filter by type\n if (this.selectedTypeFilter) {\n filtered = filtered.filter(c => UUIDsEqual(c.CredentialTypeID, this.selectedTypeFilter));\n }\n\n // Filter by search text\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase().trim();\n filtered = filtered.filter(c =>\n c.Name.toLowerCase().includes(search) ||\n (c.Description && c.Description.toLowerCase().includes(search)) ||\n (c.CredentialType && c.CredentialType.toLowerCase().includes(search))\n );\n }\n\n this.filteredCredentials = filtered;\n this.updateAllSelectedState();\n this.cdr.markForCheck();\n }\n\n // === View Mode ===\n\n public setViewMode(mode: ViewMode): void {\n this.viewMode = mode;\n this.cdr.markForCheck();\n }\n\n // === Helpers ===\n\n public getTypeById(typeId: string): MJCredentialTypeEntity | undefined {\n return this.types.find(t => UUIDsEqual(t.ID, typeId));\n }\n\n public getTypesByCategory(): Map<string, MJCredentialTypeEntity[]> {\n const grouped = new Map<string, MJCredentialTypeEntity[]>();\n for (const type of this.types) {\n const category = type.Category;\n if (!grouped.has(category)) {\n grouped.set(category, []);\n }\n grouped.get(category)!.push(type);\n }\n return grouped;\n }\n\n public getStatusClass(credential: MJCredentialEntity): string {\n if (!credential.IsActive) {\n return 'inactive';\n }\n if (credential.ExpiresAt) {\n const expiresAt = new Date(credential.ExpiresAt);\n const now = new Date();\n const thirtyDays = 30 * 24 * 60 * 60 * 1000;\n if (expiresAt < now) {\n return 'expired';\n }\n if (expiresAt.getTime() - now.getTime() < thirtyDays) {\n return 'expiring';\n }\n }\n return 'active';\n }\n\n public getStatusLabel(credential: MJCredentialEntity): string {\n const statusClass = this.getStatusClass(credential);\n const labels: Record<string, string> = {\n 'active': 'Active',\n 'inactive': 'Inactive',\n 'expired': 'Expired',\n 'expiring': 'Expiring Soon'\n };\n return labels[statusClass] || 'Unknown';\n }\n\n public getStatusIcon(credential: MJCredentialEntity): string {\n const statusClass = this.getStatusClass(credential);\n const icons: Record<string, string> = {\n 'active': 'fa-solid fa-check-circle',\n 'inactive': 'fa-solid fa-minus-circle',\n 'expired': 'fa-solid fa-times-circle',\n 'expiring': 'fa-solid fa-clock'\n };\n return icons[statusClass] || 'fa-solid fa-circle';\n }\n\n public formatDate(date: Date | null | undefined): string {\n if (!date) return 'Never';\n return new Date(date).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n });\n }\n\n public formatDateTime(date: Date | null | undefined): string {\n if (!date) return 'Never';\n return new Date(date).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n public getTimeAgo(date: Date | null | undefined): string {\n if (!date) return 'Never';\n const now = new Date();\n const then = new Date(date);\n const diffMs = now.getTime() - then.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return 'Just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 30) return `${diffDays}d ago`;\n return this.formatDate(date);\n }\n\n public getTypeIcon(credential: MJCredentialEntity): string {\n const type = this.getTypeById(credential.CredentialTypeID);\n if (!type) return 'fa-solid fa-key';\n\n const iconMap: Record<string, string> = {\n 'AI': 'fa-solid fa-brain',\n 'Communication': 'fa-solid fa-envelope',\n 'Storage': 'fa-solid fa-cloud',\n 'Database': 'fa-solid fa-database',\n 'Authentication': 'fa-solid fa-shield-halved',\n 'Integration': 'fa-solid fa-plug'\n };\n return iconMap[type.Category] || 'fa-solid fa-key';\n }\n\n public refresh(): void {\n this.selectedCredentials.clear();\n this.loadData();\n }\n\n // === Stats ===\n\n public get activeCount(): number {\n return this.credentials.filter(c => c.IsActive).length;\n }\n\n public getActiveCount(): number {\n return this.activeCount;\n }\n\n public get expiringCount(): number {\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n return this.credentials.filter(c =>\n c.ExpiresAt &&\n new Date(c.ExpiresAt) >= now &&\n new Date(c.ExpiresAt) <= thirtyDaysFromNow &&\n c.IsActive\n ).length;\n }\n\n public getExpiringSoonCount(): number {\n return this.expiringCount;\n }\n\n public get expiredCount(): number {\n const now = new Date();\n return this.credentials.filter(c =>\n c.ExpiresAt && new Date(c.ExpiresAt) < now\n ).length;\n }\n\n public getExpiredCount(): number {\n return this.expiredCount;\n }\n\n // === Status Helpers ===\n\n public isExpired(credential: MJCredentialEntity): boolean {\n if (!credential.ExpiresAt) return false;\n return new Date(credential.ExpiresAt) < new Date();\n }\n\n public isExpiringSoon(credential: MJCredentialEntity): boolean {\n if (!credential.ExpiresAt) return false;\n const expiresAt = new Date(credential.ExpiresAt);\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n return expiresAt >= now && expiresAt <= thirtyDaysFromNow;\n }\n\n // === Bulk Operations ===\n\n public async bulkToggleActive(active: boolean): Promise<void> {\n if (!this.UserCanUpdate || this.selectedCredentials.size === 0) return;\n\n const toUpdate: MJCredentialEntity[] = [];\n for (const credId of this.selectedCredentials) {\n const credential = this.credentials.find(c => UUIDsEqual(c.ID, credId));\n if (credential && credential.IsActive !== active) {\n toUpdate.push(credential);\n }\n }\n\n const action = active ? 'activated' : 'deactivated';\n\n if (toUpdate.length === 0) {\n this.clearSelection();\n return;\n }\n\n const tg = await this._metadata.CreateTransactionGroup();\n for (const credential of toUpdate) {\n credential.IsActive = active;\n credential.TransactionGroup = tg;\n await credential.Save();\n }\n\n if (await tg.Submit()) {\n this.clearSelection();\n this.applyFilters();\n MJNotificationService.Instance.CreateSimpleNotification(\n `${toUpdate.length} credential(s) ${action}`,\n 'success',\n 3000\n );\n } else {\n // Server rolled back — revert the client-side state to match\n for (const credential of toUpdate) {\n credential.IsActive = !active;\n }\n this.clearSelection();\n this.applyFilters();\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to ${action.slice(0, -1)} credentials — all changes have been rolled back`,\n 'error',\n 3000\n );\n }\n }\n\n public async bulkDelete(): Promise<void> {\n if (!this.UserCanDelete || this.selectedCredentials.size === 0) return;\n\n const count = this.selectedCredentials.size;\n const confirmed = await this.confirm.ConfirmDelete({\n title: 'Delete credentials',\n message: `Delete ${count} credential(s)?`,\n detail: 'This action cannot be undone.',\n });\n if (!confirmed) return;\n\n const toDelete = Array.from(this.selectedCredentials)\n .map(id => this.credentials.find(c => UUIDsEqual(c.ID, id)))\n .filter((c): c is MJCredentialEntity => c != null);\n\n if (toDelete.length === 0) return;\n\n const tg = await this._metadata.CreateTransactionGroup();\n for (const credential of toDelete) {\n credential.TransactionGroup = tg;\n await credential.Delete();\n }\n\n if (await tg.Submit()) {\n const deletedIds = new Set(toDelete.map(c => c.ID));\n this.credentials = this.credentials.filter(c => !deletedIds.has(c.ID));\n this.clearSelection();\n this.applyFilters();\n MJNotificationService.Instance.CreateSimpleNotification(\n `${toDelete.length} credential(s) deleted`,\n 'success',\n 3000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to delete credentials — all changes have been rolled back',\n 'error',\n 3000\n );\n }\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Credentials\"\n Icon=\"fa-solid fa-key\">\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredCredentials.length\"\n [Total]=\"credentials.length\"\n Label=\"credentials\">\n </mj-stat-badge>\n @if (getExpiringSoonCount() > 0) {\n <mj-stat-badge\n Icon=\"fa-solid fa-clock\"\n [Count]=\"getExpiringSoonCount()\"\n Label=\"expiring\"\n Variant=\"warning\">\n </mj-stat-badge>\n }\n @if (getExpiredCount() > 0) {\n <mj-stat-badge\n Icon=\"fa-solid fa-exclamation-circle\"\n [Count]=\"getExpiredCount()\"\n Label=\"expired\"\n Variant=\"error\">\n </mj-stat-badge>\n }\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n @if (UserCanCreate) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewCredential()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">New Credential</span>\n </button>\n }\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search credentials...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-view-toggle\n [Options]=\"viewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (isLoading) {\n <mj-loading text=\"Loading credentials...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Bulk Actions Bar -->\n @if (selectedCredentials.size > 0) {\n <div class=\"bulk-actions\">\n <div class=\"bulk-info\">\n <span class=\"bulk-count\">{{selectedCredentials.size}} selected</span>\n <button class=\"btn-link\" (click)=\"clearSelection()\">Clear selection</button>\n </div>\n <div class=\"bulk-buttons\">\n @if (UserCanUpdate) {\n <button class=\"btn-bulk\" (click)=\"bulkToggleActive(true)\">\n <i class=\"fa-solid fa-toggle-on\"></i>\n Activate\n </button>\n }\n @if (UserCanUpdate) {\n <button class=\"btn-bulk\" (click)=\"bulkToggleActive(false)\">\n <i class=\"fa-solid fa-toggle-off\"></i>\n Deactivate\n </button>\n }\n @if (UserCanDelete) {\n <button class=\"btn-bulk danger\" (click)=\"bulkDelete()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n }\n </div>\n </div>\n }\n <!-- Grid View -->\n @if (viewMode === 'grid' && filteredCredentials.length > 0) {\n <div class=\"credentials-grid\">\n @for (credential of filteredCredentials; track credential) {\n <div\n class=\"credential-card\"\n [class.selected]=\"selectedCredentials.has(credential.ID)\"\n [class.expired]=\"isExpired(credential)\"\n [class.expiring]=\"isExpiringSoon(credential)\"\n >\n <!-- Selection Checkbox -->\n @if (UserCanUpdate || UserCanDelete) {\n <div class=\"card-select\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedCredentials.has(credential.ID)\"\n (change)=\"toggleSelection(credential)\"\n />\n </div>\n }\n <div class=\"card-header\">\n <div class=\"card-icon\" [ngClass]=\"getStatusClass(credential)\">\n <i [class]=\"credential.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"card-title\">\n <div class=\"credential-name\">{{credential.Name}}</div>\n <div class=\"credential-type\">{{credential.CredentialType || 'Unknown Type'}}</div>\n </div>\n <div class=\"card-actions\">\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"toggleCredentialActive(credential, $event)\"\n [title]=\"credential.IsActive ? 'Deactivate' : 'Activate'\">\n <i [class]=\"credential.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editCredential(credential, $event)\"\n title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"deleteCredential(credential, $event)\"\n title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"card-body\" (click)=\"editCredential(credential)\">\n <div class=\"status-badge\" [ngClass]=\"getStatusClass(credential)\">\n <i [class]=\"getStatusIcon(credential)\"></i>\n {{getStatusLabel(credential)}}\n </div>\n @if (credential.Description) {\n <p class=\"credential-description\">\n {{credential.Description}}\n </p>\n }\n <div class=\"credential-meta\">\n @if (credential.IsDefault) {\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-star\"></i>\n <span>Default</span>\n </div>\n }\n @if (credential.ExpiresAt) {\n <div class=\"meta-item\" [class.warning]=\"isExpiringSoon(credential)\" [class.danger]=\"isExpired(credential)\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{isExpired(credential) ? 'Expired' : 'Expires'}}: {{formatDate(credential.ExpiresAt)}}</span>\n </div>\n }\n @if (credential.LastUsedAt) {\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Last used: {{formatDate(credential.LastUsedAt)}}</span>\n </div>\n }\n </div>\n </div>\n <div class=\"card-footer\">\n @if (credential.Category) {\n <div class=\"category-tag\">\n <i class=\"fa-solid fa-folder\"></i>\n {{credential.Category}}\n </div>\n }\n <div class=\"created-info\">\n Created {{formatDate(credential.__mj_CreatedAt)}}\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- List View -->\n @if (viewMode === 'list' && filteredCredentials.length > 0) {\n <div class=\"credentials-table-container\">\n <table class=\"credentials-table\">\n <thead>\n <tr>\n @if (UserCanUpdate || UserCanDelete) {\n <th class=\"col-select\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllSelected()\"\n (change)=\"toggleSelectAll()\"\n />\n </th>\n }\n <th class=\"col-name\">Name</th>\n <th class=\"col-type\">Type</th>\n <th class=\"col-category\">Category</th>\n <th class=\"col-status\">Status</th>\n <th class=\"col-expires\">Expires</th>\n <th class=\"col-used\">Last Used</th>\n <th class=\"col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (credential of filteredCredentials; track credential) {\n <tr\n [class.selected]=\"selectedCredentials.has(credential.ID)\"\n [class.expired]=\"isExpired(credential)\"\n >\n @if (UserCanUpdate || UserCanDelete) {\n <td class=\"col-select\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedCredentials.has(credential.ID)\"\n (change)=\"toggleSelection(credential)\"\n />\n </td>\n }\n <td class=\"col-name\" (click)=\"editCredential(credential)\">\n <div class=\"name-cell\">\n <i [class]=\"credential.IconClass || 'fa-solid fa-key'\" [ngClass]=\"getStatusClass(credential)\"></i>\n <div class=\"name-info\">\n <span class=\"credential-name\">{{credential.Name}}</span>\n @if (credential.Description) {\n <span class=\"credential-desc\">{{credential.Description}}</span>\n }\n </div>\n @if (credential.IsDefault) {\n <span class=\"default-badge\">Default</span>\n }\n </div>\n </td>\n <td class=\"col-type\">{{credential.CredentialType || '-'}}</td>\n <td class=\"col-category\">\n @if (credential.Category) {\n <span class=\"category-pill\">{{credential.Category}}</span>\n }\n @if (!credential.Category) {\n <span>-</span>\n }\n </td>\n <td class=\"col-status\">\n <span class=\"status-pill\" [ngClass]=\"getStatusClass(credential)\">\n {{getStatusLabel(credential)}}\n </span>\n </td>\n <td class=\"col-expires\" [class.warning]=\"isExpiringSoon(credential)\" [class.danger]=\"isExpired(credential)\">\n {{credential.ExpiresAt ? formatDate(credential.ExpiresAt) : 'Never'}}\n </td>\n <td class=\"col-used\">\n {{credential.LastUsedAt ? formatDate(credential.LastUsedAt) : 'Never'}}\n </td>\n <td class=\"col-actions\">\n <div class=\"table-actions\">\n @if (UserCanUpdate) {\n <button\n class=\"table-action-btn\"\n (click)=\"toggleCredentialActive(credential, $event)\"\n [title]=\"credential.IsActive ? 'Deactivate' : 'Activate'\"\n >\n <i [class]=\"credential.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button\n class=\"table-action-btn\"\n (click)=\"editCredential(credential, $event)\"\n title=\"Edit\"\n >\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete) {\n <button\n class=\"table-action-btn danger\"\n (click)=\"deleteCredential(credential, $event)\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n <!-- Empty State -->\n @if (filteredCredentials.length === 0) {\n <mj-empty-state\n [Variant]=\"IsListNarrowed ? 'no-results' : 'empty'\"\n Icon=\"fa-solid fa-key\"\n Title=\"No Credentials Found\"\n [Message]=\"IsListNarrowed ? 'No credentials match your current filters.' : 'Get started by creating your first credential.'\"\n [ActionText]=\"IsListNarrowed ? 'Reset filters' : (UserCanCreate ? 'Create Credential' : '')\"\n [ActionIcon]=\"IsListNarrowed ? 'fa-solid fa-rotate-left' : 'fa-solid fa-plus'\"\n (Action)=\"onEmptyStateAction()\" />\n }\n }\n\n <!-- Edit Panel -->\n <mj-credential-edit-panel\n #editPanel\n [credentialTypes]=\"types\"\n (saved)=\"onCredentialSaved($event)\"\n (deleted)=\"onCredentialDeleted($event)\"\n ></mj-credential-edit-panel>\n </mj-page-body>\n</mj-page-layout>\n"]}
|
|
@@ -2,7 +2,7 @@ import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
|
2
2
|
import { ResourceData, MJCredentialTypeEntity, MJCredentialEntity } from '@memberjunction/core-entities';
|
|
3
3
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
4
4
|
import { CredentialTypeEditPanelComponent } from '@memberjunction/ng-credentials';
|
|
5
|
-
import { FilterFieldConfig } from '@memberjunction/ng-ui-components';
|
|
5
|
+
import { FilterFieldConfig, MJConfirmService } from '@memberjunction/ng-ui-components';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
interface FieldSchemaProperty {
|
|
8
8
|
name: string;
|
|
@@ -19,6 +19,7 @@ interface TypeWithStats extends MJCredentialTypeEntity {
|
|
|
19
19
|
}
|
|
20
20
|
export declare class CredentialsTypesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
21
21
|
private cdr;
|
|
22
|
+
private confirm;
|
|
22
23
|
isLoading: boolean;
|
|
23
24
|
types: TypeWithStats[];
|
|
24
25
|
filteredTypes: TypeWithStats[];
|
|
@@ -36,7 +37,7 @@ export declare class CredentialsTypesResourceComponent extends BaseResourceCompo
|
|
|
36
37
|
get ActiveFilterCount(): number;
|
|
37
38
|
onFilterValuesChange(v: Record<string, unknown>): void;
|
|
38
39
|
resetFilters(): void;
|
|
39
|
-
constructor(cdr: ChangeDetectorRef);
|
|
40
|
+
constructor(cdr: ChangeDetectorRef, confirm: MJConfirmService);
|
|
40
41
|
ngOnInit(): void;
|
|
41
42
|
ngOnDestroy(): void;
|
|
42
43
|
GetResourceDisplayName(data: ResourceData): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials-types-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-types-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAsC,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEzG,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AAGrF,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;
|
|
1
|
+
{"version":3,"file":"credentials-types-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-types-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -385,6 +385,7 @@ function CredentialsTypesResourceComponent_Conditional_13_Template(rf, ctx) { if
|
|
|
385
385
|
} }
|
|
386
386
|
let CredentialsTypesResourceComponent = class CredentialsTypesResourceComponent extends BaseResourceComponent {
|
|
387
387
|
cdr;
|
|
388
|
+
confirm;
|
|
388
389
|
isLoading = true;
|
|
389
390
|
types = [];
|
|
390
391
|
filteredTypes = [];
|
|
@@ -431,9 +432,10 @@ let CredentialsTypesResourceComponent = class CredentialsTypesResourceComponent
|
|
|
431
432
|
if (this.selectedCategoryFilter)
|
|
432
433
|
this.onCategoryFilterChange('');
|
|
433
434
|
}
|
|
434
|
-
constructor(cdr) {
|
|
435
|
+
constructor(cdr, confirm) {
|
|
435
436
|
super();
|
|
436
437
|
this.cdr = cdr;
|
|
438
|
+
this.confirm = confirm;
|
|
437
439
|
}
|
|
438
440
|
ngOnInit() {
|
|
439
441
|
super.ngOnInit();
|
|
@@ -585,7 +587,11 @@ let CredentialsTypesResourceComponent = class CredentialsTypesResourceComponent
|
|
|
585
587
|
MJNotificationService.Instance.CreateSimpleNotification(`Cannot delete "${type.Name}" - it has ${type.credentialCount} credential(s) using it`, 'warning', 4000);
|
|
586
588
|
return;
|
|
587
589
|
}
|
|
588
|
-
const confirmed = confirm(
|
|
590
|
+
const confirmed = await this.confirm.ConfirmDelete({
|
|
591
|
+
title: 'Delete credential type',
|
|
592
|
+
message: `Delete "${type.Name}"?`,
|
|
593
|
+
detail: 'This action cannot be undone.',
|
|
594
|
+
});
|
|
589
595
|
if (!confirmed)
|
|
590
596
|
return;
|
|
591
597
|
try {
|
|
@@ -767,7 +773,7 @@ let CredentialsTypesResourceComponent = class CredentialsTypesResourceComponent
|
|
|
767
773
|
refresh() {
|
|
768
774
|
this.loadData();
|
|
769
775
|
}
|
|
770
|
-
static ɵfac = function CredentialsTypesResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CredentialsTypesResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
776
|
+
static ɵfac = function CredentialsTypesResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CredentialsTypesResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MJConfirmService)); };
|
|
771
777
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsTypesResourceComponent, selectors: [["mj-credentials-types-resource"]], viewQuery: function CredentialsTypesResourceComponent_Query(rf, ctx) { if (rf & 1) {
|
|
772
778
|
i0.ɵɵviewQuery(_c0, 5);
|
|
773
779
|
} if (rf & 2) {
|
|
@@ -826,7 +832,7 @@ export { CredentialsTypesResourceComponent };
|
|
|
826
832
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialsTypesResourceComponent, [{
|
|
827
833
|
type: Component,
|
|
828
834
|
args: [{ standalone: false, selector: 'mj-credentials-types-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Credential Types\"\n Icon=\"fa-solid fa-shapes\">\n <div meta>\n <!-- Result-count of the filtered Types list \u2014 passes the meta rule\n (filtered/total is signal about how the filter narrowed the data,\n not visible by glancing at the list). Cross-entity reference\n counts (categories, credentials) dropped per chrome slot\n discipline audit Task B \u2014 those belong on their own pages. -->\n <mj-stat-badge\n [Count]=\"filteredTypes.length\"\n [Total]=\"types.length\"\n Label=\"types\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n @if (UserCanCreate) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">New Type</span>\n </button>\n }\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search types...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n @if (isLoading) {\n <mj-loading text=\"Loading credential types...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <div class=\"types-layout\">\n <!-- Types List -->\n <div class=\"types-list\">\n @for (entry of getTypesByCategory() | keyvalue; track entry) {\n <div class=\"category-section\">\n <div class=\"category-header\" [style.borderLeftColor]=\"getCategoryColor(entry.key)\">\n <i [class]=\"getCategoryIcon(entry.key)\" [style.color]=\"getCategoryColor(entry.key)\"></i>\n <span class=\"category-name\">{{entry.key}}</span>\n <span class=\"count\">{{entry.value.length}}</span>\n </div>\n <div class=\"type-items\">\n @for (type of entry.value; track type) {\n <div\n class=\"type-item\"\n [class.selected]=\"IsTypeSelected(type)\"\n (click)=\"selectType(type)\"\n >\n <div class=\"type-icon\" [style.backgroundColor]=\"getCategoryColor(type.Category) + '15'\" [style.color]=\"getCategoryColor(type.Category)\">\n <i [class]=\"type.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"type-info\">\n <div class=\"type-name\">{{type.Name}}</div>\n @if (type.Description) {\n <div class=\"type-description\">\n {{type.Description | slice:0:60}}{{type.Description.length > 60 ? '...' : ''}}\n </div>\n }\n <div class=\"type-meta\">\n @if (type.credentialCount > 0) {\n <span class=\"meta-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{type.credentialCount}}\n </span>\n }\n @if (type.activeCount > 0) {\n <span class=\"meta-badge active\">\n <i class=\"fa-solid fa-check\"></i>\n {{type.activeCount}} active\n </span>\n }\n @if (type.expiringCount > 0) {\n <span class=\"meta-badge warning\">\n <i class=\"fa-solid fa-clock\"></i>\n {{type.expiringCount}} expiring\n </span>\n }\n </div>\n </div>\n <div class=\"type-actions\">\n @if (UserCanCreateCredential) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"createCredentialForType(type, $event)\"\n title=\"Add Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editType(type, $event)\"\n title=\"Edit Type\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && type.credentialCount === 0) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"deleteType(type, $event)\"\n title=\"Delete Type\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n <i class=\"fa-solid fa-chevron-right arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n @if (filteredTypes.length === 0) {\n <mj-empty-state\n [Variant]=\"IsListNarrowed ? 'no-results' : 'empty'\"\n Icon=\"fa-solid fa-cubes\"\n Title=\"No Credential Types Found\"\n [Message]=\"IsListNarrowed ? 'No types match your current filters.' : 'Get started by creating your first credential type.'\"\n [ActionText]=\"IsListNarrowed ? 'Reset filters' : (UserCanCreate ? 'Create Type' : '')\"\n [ActionIcon]=\"IsListNarrowed ? 'fa-solid fa-rotate-left' : 'fa-solid fa-plus'\"\n (Action)=\"onEmptyStateAction()\" />\n }\n </div>\n <!-- Type Detail -->\n @if (selectedType) {\n <div class=\"type-detail\">\n <div class=\"detail-header\">\n <div class=\"detail-icon\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '15'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"selectedType.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"detail-title\">\n <h2>{{selectedType.Name}}</h2>\n <span class=\"category-badge\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '20'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"getCategoryIcon(selectedType.Category)\"></i>\n {{selectedType.Category}}\n </span>\n </div>\n <div class=\"detail-actions\">\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"editType(selectedType)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n <button class=\"close-btn\" (click)=\"closeDetail()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-body\">\n <!-- Stats Row -->\n <div class=\"detail-stats\">\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedType.credentialCount}}</div>\n <div class=\"stat-label\">Credentials</div>\n </div>\n <div class=\"detail-stat active\">\n <div class=\"stat-value\">{{selectedType.activeCount}}</div>\n <div class=\"stat-label\">Active</div>\n </div>\n @if (selectedType.expiringCount > 0) {\n <div class=\"detail-stat warning\">\n <div class=\"stat-value\">{{selectedType.expiringCount}}</div>\n <div class=\"stat-label\">Expiring</div>\n </div>\n }\n </div>\n @if (selectedType.Description) {\n <p class=\"description\">\n {{selectedType.Description}}\n </p>\n }\n <div class=\"schema-section\">\n <h3>\n <i class=\"fa-solid fa-list-check\"></i>\n Field Schema\n </h3>\n @if (schemaProperties.length > 0) {\n <div class=\"field-list\">\n @for (prop of schemaProperties; track prop) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{prop.title}}</span>\n <span class=\"field-badges\">\n <span class=\"badge type\">{{prop.type}}</span>\n @if (prop.isSecret) {\n <span class=\"badge secret\">\n <i class=\"fa-solid fa-lock\"></i> Secret\n </span>\n }\n @if (prop.required) {\n <span class=\"badge required\">Required</span>\n }\n </span>\n </div>\n @if (prop.description) {\n <p class=\"field-description\">\n {{prop.description}}\n </p>\n }\n </div>\n }\n </div>\n }\n @if (schemaProperties.length === 0) {\n <div class=\"no-fields\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No fields defined in schema</span>\n </div>\n }\n </div>\n @if (selectedType.ValidationEndpoint) {\n <div class=\"validation-section\">\n <h3>\n <i class=\"fa-solid fa-check-circle\"></i>\n Validation\n </h3>\n <div class=\"validation-endpoint\">\n <i class=\"fa-solid fa-link\"></i>\n <span>{{selectedType.ValidationEndpoint}}</span>\n </div>\n </div>\n }\n <!-- Quick Actions -->\n @if (UserCanCreateCredential) {\n <div class=\"detail-quick-actions\">\n <button class=\"btn-primary\" (click)=\"createCredentialForType(selectedType)\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection -->\n @if (!selectedType && filteredTypes.length > 0) {\n <mj-empty-state Icon=\"fa-solid fa-hand-pointer\"\n Title=\"Select a Credential Type\"\n Message=\"Click on a credential type to view its details and field schema\" />\n }\n </div>\n }\n </mj-page-body>\n\n <!-- Type Edit Panel -->\n <mj-credential-type-edit-panel\n #typeEditPanel\n (saved)=\"onTypeSaved($any($event))\"\n (deleted)=\"onTypeDeleted($any($event))\"\n ></mj-credential-type-edit-panel>\n</mj-page-layout>\n", styles: ["/* Layout */\n.types-layout {\n display: grid;\n grid-template-columns: 420px 1fr;\n flex: 1;\n min-height: 0;\n gap: 20px;\n}\n\n/* Types List */\n.types-list {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow-y: auto;\n padding: 16px;\n}\n\n.category-section {\n margin-bottom: 20px;\n}\n\n.category-section:last-child {\n margin-bottom: 0;\n}\n\n.category-header {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n font-size: 12px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-secondary);\n letter-spacing: 0.5px;\n border-left: 3px solid var(--mj-brand-primary);\n background: var(--mj-bg-surface-card);\n border-radius: 0 8px 8px 0;\n margin-bottom: 8px;\n}\n\n.category-header i {\n font-size: 14px;\n}\n\n.category-name {\n flex: 1;\n}\n\n.category-header .count {\n background: var(--mj-bg-surface);\n padding: 2px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.type-items {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.type-item {\n display: flex;\n align-items: center;\n padding: 12px 14px;\n background: var(--mj-bg-surface);\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 2px solid transparent;\n position: relative;\n}\n\n.type-item:hover {\n background: var(--mj-bg-page);\n border-color: var(--mj-border-default);\n}\n\n.type-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.type-icon {\n width: 42px;\n height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n margin-right: 12px;\n flex-shrink: 0;\n}\n\n.type-icon i {\n font-size: 16px;\n}\n\n.type-info {\n flex: 1;\n min-width: 0;\n}\n\n.type-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.type-description {\n font-size: 12px;\n color: var(--mj-text-disabled);\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.type-meta {\n display: flex;\n gap: 8px;\n margin-top: 6px;\n}\n\n.meta-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.meta-badge i {\n font-size: 9px;\n}\n\n.meta-badge.active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.meta-badge.warning {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.type-actions {\n display: flex;\n gap: 4px;\n margin-right: 8px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.type-item:hover .type-actions {\n opacity: 1;\n}\n\n.action-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 12px;\n}\n\n.action-btn:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.action-btn.danger:hover {\n background: var(--mj-status-error);\n}\n\n.arrow {\n color: var(--mj-border-strong);\n font-size: 12px;\n}\n\n/* Type Detail */\n.type-detail {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow-y: auto;\n}\n\n.detail-header {\n display: flex;\n align-items: center;\n padding: 24px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.detail-icon {\n width: 60px;\n height: 60px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 14px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.detail-icon i {\n font-size: 26px;\n}\n\n.detail-title {\n flex: 1;\n}\n\n.detail-title h2 {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n}\n\n.category-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.category-badge i {\n font-size: 11px;\n}\n\n.detail-actions {\n display: flex;\n gap: 8px;\n}\n\n.close-btn {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: all 0.2s ease;\n}\n\n.close-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.detail-body {\n padding: 24px;\n}\n\n/* Detail Stats */\n.detail-stats {\n display: flex;\n gap: 16px;\n margin-bottom: 24px;\n padding-bottom: 24px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.detail-stat {\n flex: 1;\n text-align: center;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n}\n\n.detail-stat .stat-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.detail-stat .stat-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.detail-stat.active {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n}\n\n.detail-stat.active .stat-value {\n color: var(--mj-status-success);\n}\n\n.detail-stat.warning {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface));\n}\n\n.detail-stat.warning .stat-value {\n color: var(--mj-status-warning);\n}\n\n.description {\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.6;\n margin: 0 0 24px 0;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n}\n\n.schema-section,\n.validation-section {\n margin-bottom: 24px;\n}\n\n.schema-section h3,\n.validation-section h3 {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0 0 16px 0;\n}\n\n.schema-section h3 i,\n.validation-section h3 i {\n color: var(--mj-brand-primary);\n}\n\n.field-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.field-item {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n border: 1px solid var(--mj-border-default);\n transition: all 0.2s ease;\n}\n\n.field-item:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.field-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.field-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.field-badges {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.badge {\n padding: 3px 10px;\n border-radius: 6px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.badge.type {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.badge.secret {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.badge.secret i {\n margin-right: 3px;\n}\n\n.badge.required {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.field-description {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin: 10px 0 0 0;\n line-height: 1.5;\n}\n\n.no-fields {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.no-fields i {\n color: var(--mj-brand-primary);\n}\n\n.validation-endpoint {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border-radius: 10px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', monospace;\n border: 1px solid var(--mj-border-default);\n}\n\n.validation-endpoint i {\n color: var(--mj-brand-primary);\n}\n\n.detail-quick-actions {\n margin-top: 24px;\n padding-top: 24px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n/* The detail pane's no-selection placeholder fills the pane and centers. */\n.type-detail mj-empty-state {\n height: 100%;\n}\n\n/* Responsive */\n@media (max-width: 1024px) {\n .types-layout {\n grid-template-columns: 1fr;\n }\n\n .types-list {\n max-height: 400px;\n }\n}\n\n@media (max-width: 768px) {\n .types-container {\n padding: 16px;\n }\n\n .types-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left {\n flex-direction: column;\n }\n\n .search-container {\n min-width: 100%;\n }\n\n .filter-select {\n width: 100%;\n }\n\n .toolbar-right {\n justify-content: space-between;\n }\n\n .detail-stats {\n flex-direction: column;\n }\n}\n"] }]
|
|
829
|
-
}], () => [{ type: i0.ChangeDetectorRef }], { typeEditPanel: [{
|
|
835
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.MJConfirmService }], { typeEditPanel: [{
|
|
830
836
|
type: ViewChild,
|
|
831
837
|
args: ['typeEditPanel']
|
|
832
838
|
}] }); })();
|