@memberjunction/ng-dashboards 5.7.0 → 5.9.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/models/model-management.component.d.ts +2 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +44 -2
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +5 -2
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +10 -7
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +96 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -0
- package/dist/Integration/components/activity/activity.component.js +961 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -0
- package/dist/Integration/components/connections/connections.component.d.ts +194 -0
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -0
- package/dist/Integration/components/connections/connections.component.js +2368 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +241 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2373 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -0
- package/dist/Integration/components/overview/overview.component.d.ts +60 -0
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -0
- package/dist/Integration/components/overview/overview.component.js +628 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +203 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js +2057 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts +110 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -0
- package/dist/Integration/components/schedules/schedules.component.js +842 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -0
- package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +141 -0
- package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -0
- package/dist/Integration/components/visual-editor/visual-editor.component.js +1538 -0
- package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -0
- package/dist/Integration/components/widgets/integration-card.component.d.ts +22 -0
- package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -0
- package/dist/Integration/components/widgets/integration-card.component.js +262 -0
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -0
- package/dist/Integration/components/widgets/run-history-panel.component.d.ts +29 -0
- package/dist/Integration/components/widgets/run-history-panel.component.d.ts.map +1 -0
- package/dist/Integration/components/widgets/run-history-panel.component.js +399 -0
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -0
- package/dist/Integration/index.d.ts +11 -0
- package/dist/Integration/index.d.ts.map +1 -0
- package/dist/Integration/index.js +20 -0
- package/dist/Integration/index.js.map +1 -0
- package/dist/Integration/integration.module.d.ts +26 -0
- package/dist/Integration/integration.module.d.ts.map +1 -0
- package/dist/Integration/integration.module.js +107 -0
- package/dist/Integration/integration.module.js.map +1 -0
- package/dist/Integration/services/integration-data.service.d.ts +268 -0
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -0
- package/dist/Integration/services/integration-data.service.js +697 -0
- package/dist/Integration/services/integration-data.service.js.map +1 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +27 -4
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +338 -144
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/__tests__/integration-data-service.test.d.ts +2 -0
- package/dist/__tests__/integration-data-service.test.d.ts.map +1 -0
- package/dist/__tests__/integration-data-service.test.js +131 -0
- package/dist/__tests__/integration-data-service.test.js.map +1 -0
- package/dist/__tests__/mapping-validation.test.d.ts +2 -0
- package/dist/__tests__/mapping-validation.test.d.ts.map +1 -0
- package/dist/__tests__/mapping-validation.test.js +170 -0
- package/dist/__tests__/mapping-validation.test.js.map +1 -0
- package/dist/module.d.ts +2 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +17 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +2 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +42 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home-dashboard.component.js","sourceRoot":"","sources":["../../src/Home/home-dashboard.component.ts","../../src/Home/home-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseResourceComponent, NavigationService, RecentAccessService, RecentAccessItem } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Metadata, CompositeKey, EntityRecordNameInput } from '@memberjunction/core';\nimport { ResourceData, MJUserFavoriteEntity, MJUserNotificationEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { UserAppConfigComponent } from '@memberjunction/ng-explorer-settings';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * Cached app data with pre-computed values for optimal rendering performance\n */\ninterface AppDisplayData {\n app: BaseApplication;\n color: string;\n icon: string;\n navItemsCount: number;\n navItemsPreview: { Label: string; Icon: string }[];\n showMoreItems: boolean;\n moreItemsCount: number;\n}\n\n/**\n * Home Dashboard - Personalized home screen showing all available applications\n * with quick access navigation and configuration options.\n *\n * Uses OnPush change detection and cached computed values for optimal performance.\n * Registered as a BaseResourceComponent so it can be used as a Custom resource type\n * in nav items, allowing users to return to the Home dashboard after viewing orphan resources.\n */\n@Component({\n standalone: false,\n selector: 'mj-home-dashboard',\n templateUrl: './home-dashboard.component.html',\n styleUrls: ['./home-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseResourceComponent, 'HomeDashboard')\nexport class HomeDashboardComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private destroy$ = new Subject<void>();\n private metadata = new Metadata();\n\n @ViewChild('appConfigDialog') appConfigDialog!: UserAppConfigComponent;\n\n // State\n public isLoading = true;\n public apps: BaseApplication[] = [];\n public appsDisplayData: AppDisplayData[] = []; // Pre-computed display data\n public currentUser: { Name: string; Email: string } | null = null;\n public showConfigDialog = false;\n\n // Favorites\n public favorites: MJUserFavoriteEntity[] = [];\n public favoritesLoading = true;\n\n // Recents\n public recentItems: RecentAccessItem[] = [];\n public recentsLoading = true;\n\n // Notifications\n public unreadNotifications: MJUserNotificationEntity[] = [];\n public notificationsLoading = true;\n\n // Sidebar state - default closed on all screen sizes\n public sidebarOpen = false;\n\n // Cached icon lookups to avoid repeated method calls\n private favoriteIconCache = new Map<string, string>();\n private resourceIconCache = new Map<string, string>();\n\n // Resolved display names for favorites (keyed by favorite ID)\n public favoriteDisplayNames = new Map<string, string>();\n\n /**\n * Check if sidebar has any content to show\n */\n get hasSidebarContent(): boolean {\n return this.unreadNotifications.length > 0 ||\n this.favorites.length > 0 ||\n this.recentItems.length > 0 ||\n this.favoritesLoading ||\n this.recentsLoading;\n }\n\n /**\n * Toggle sidebar visibility\n */\n toggleSidebar(): void {\n this.sidebarOpen = !this.sidebarOpen;\n }\n\n /**\n * Check if current device is mobile (width <= 768px)\n */\n private isMobileDevice(): boolean {\n return typeof window !== 'undefined' && window.innerWidth <= 768;\n }\n\n constructor(\n private appManager: ApplicationManager,\n private navigationService: NavigationService,\n private recentAccessService: RecentAccessService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Home';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return '';\n }\n\n async ngAfterViewInit(): Promise<void> {\n // Get current user info\n this.currentUser = {\n Name: this.metadata.CurrentUser?.Name || 'User',\n Email: this.metadata.CurrentUser?.Email || ''\n };\n\n // Subscribe to loading state from ApplicationManager\n this.appManager.Loading\n .pipe(takeUntil(this.destroy$))\n .subscribe(loading => {\n // Only update isLoading if manager is actively loading\n // (we start with isLoading=true and only set to false when we have apps)\n if (loading) {\n this.isLoading = true;\n this.cdr.markForCheck();\n }\n });\n\n // Subscribe to applications list, filtering out the Home app\n this.appManager.Applications\n .pipe(takeUntil(this.destroy$))\n .subscribe(async apps => {\n // Exclude the Home app from the list (users are already on Home)\n this.apps = apps.filter(app => app.Name !== 'Home');\n\n // Pre-compute display data for all apps\n await this.computeAppsDisplayData();\n\n this.isLoading = false;\n this.NotifyLoadComplete();\n\n this.cdr.markForCheck();\n });\n\n // Subscribe to unread notifications\n MJNotificationService.Notifications$\n .pipe(takeUntil(this.destroy$))\n .subscribe(notifications => {\n this.unreadNotifications = notifications.filter(n => n.Unread).slice(0, 5);\n this.notificationsLoading = false;\n this.cdr.markForCheck();\n });\n\n // Subscribe to recent items\n this.recentAccessService.RecentItems\n .pipe(takeUntil(this.destroy$))\n .subscribe(items => {\n this.recentItems = this.deduplicateRecents(items).slice(0, 5);\n this.recentsLoading = false;\n this.cdr.markForCheck();\n });\n\n // Favorites and recents load asynchronously in the sidebar\n this.NotifyLoadComplete();\n\n // Load favorites and recents asynchronously (don't block rendering)\n this.loadFavorites();\n this.loadRecents();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Get a greeting based on time of day\n */\n get greeting(): string {\n const hour = new Date().getHours();\n if (hour < 12) return 'Good morning';\n if (hour < 17) return 'Good afternoon';\n return 'Good evening';\n }\n\n /**\n * Get formatted date string\n */\n get formattedDate(): string {\n return new Date().toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric'\n });\n }\n\n /**\n * Navigate to an application\n */\n async onAppClick(app: BaseApplication): Promise<void> {\n // Use NavigationService to switch to the app (handles tab creation if needed)\n await this.navigationService.SwitchToApp(app.ID);\n }\n\n /**\n * Open app configuration dialog\n */\n openConfigDialog(): void {\n this.showConfigDialog = true;\n setTimeout(() => {\n if (this.appConfigDialog) {\n this.appConfigDialog.Open();\n }\n }, 0);\n }\n\n /**\n * Handle when config is saved\n */\n onConfigSaved(): void {\n this.showConfigDialog = false;\n }\n\n /**\n * Pre-compute display data for all apps to avoid repeated calculations during change detection\n */\n private async computeAppsDisplayData(): Promise<void> {\n this.appsDisplayData = await Promise.all(this.apps.map(async app => {\n const navItems = await app.GetNavItems();\n const navItemsCount = navItems.length;\n const navItemsPreview = navItems.slice(0, 3).map(item => ({\n Label: item.Label,\n Icon: item.Icon || 'fa-solid fa-circle'\n }));\n\n return {\n app,\n color: app.GetColor() || '#1976d2',\n icon: app.Icon || 'fa-solid fa-cube',\n navItemsCount,\n navItemsPreview,\n showMoreItems: navItemsCount > 3,\n moreItemsCount: navItemsCount - 3\n };\n }));\n }\n\n /**\n * Track function for apps loop\n */\n trackByApp(_index: number, item: AppDisplayData): string {\n return item.app.ID;\n }\n\n /**\n * Track function for nav items preview\n */\n trackByNavItem(_index: number, item: { Label: string; Icon: string }): string {\n return item.Label;\n }\n\n /**\n * Load user favorites from UserInfoEngine (cached) and resolve record display names\n */\n private async loadFavorites(): Promise<void> {\n try {\n this.favoritesLoading = true;\n\n // Get first 10 favorites (already ordered by __mj_CreatedAt DESC in engine)\n this.favorites = UserInfoEngine.Instance.UserFavorites.slice(0, 10);\n\n // Batch-resolve record names for all favorites\n await this.resolveFavoriteNames();\n } catch (error) {\n console.error('Error loading favorites:', error);\n } finally {\n this.favoritesLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Batch-resolve record display names for favorites using GetEntityRecordNames()\n */\n private async resolveFavoriteNames(): Promise<void> {\n const nameInputs: EntityRecordNameInput[] = [];\n const favoriteIdByKey = new Map<string, string>(); // map key -> favorite ID\n\n for (const fav of this.favorites) {\n if (!fav.Entity || !fav.RecordID) continue;\n const compositeKey = this.buildCompositeKeyForRecord(fav.Entity, fav.RecordID);\n if (!compositeKey) continue;\n\n nameInputs.push({ EntityName: fav.Entity, CompositeKey: compositeKey });\n favoriteIdByKey.set(`${fav.Entity}||${compositeKey.ToConcatenatedString()}`, fav.ID);\n }\n\n if (nameInputs.length === 0) return;\n\n try {\n const nameResults = await this.metadata.GetEntityRecordNames(nameInputs);\n for (const result of nameResults) {\n if (result.Success && result.RecordName) {\n const key = `${result.EntityName}||${result.CompositeKey.ToConcatenatedString()}`;\n const favId = favoriteIdByKey.get(key);\n if (favId) {\n this.favoriteDisplayNames.set(favId, result.RecordName);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to resolve favorite record names:', error);\n }\n }\n\n /**\n * Build a CompositeKey for a record. RecordID may be stored as either:\n * - Concatenated format: \"FieldName|Value\" or \"Field1|Val1||Field2|Val2\"\n * - Plain value: just the raw value (e.g. a GUID)\n */\n private buildCompositeKeyForRecord(entityName: string, recordId: string): CompositeKey | null {\n if (!recordId) return null;\n\n // If recordId contains '|', it's in concatenated format\n if (recordId.includes('|')) {\n try {\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(recordId);\n if (compositeKey.KeyValuePairs.length > 0) return compositeKey;\n } catch {\n // Fall through to entity-based lookup\n }\n }\n\n // Plain value — look up entity primary key field(s) to construct the key\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) return null;\n\n const pkField = entityInfo.FirstPrimaryKey;\n if (!pkField) return null;\n\n const compositeKey = new CompositeKey();\n compositeKey.KeyValuePairs = [{ FieldName: pkField.Name, Value: recordId }];\n return compositeKey;\n }\n\n /**\n * Get the display name for a favorite (resolved name or entity name fallback)\n */\n getFavoriteDisplayName(favorite: MJUserFavoriteEntity): string {\n return this.favoriteDisplayNames.get(favorite.ID) || favorite.Entity || favorite.RecordID;\n }\n\n /**\n * Load recent items via the RecentAccessService\n */\n private async loadRecents(): Promise<void> {\n try {\n this.recentsLoading = true;\n this.cdr.markForCheck();\n await this.recentAccessService.loadRecentItems(10);\n } catch (error) {\n console.error('Error loading recents:', error);\n } finally {\n this.recentsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Navigate to a favorite item using NavigationService\n */\n onFavoriteClick(favorite: MJUserFavoriteEntity): void {\n // Navigate based on entity type using NavigationService\n const entityName = favorite.Entity?.toLowerCase();\n const recordId = favorite.RecordID;\n\n if (entityName === 'dashboards') {\n this.navigationService.OpenDashboard(recordId, 'Dashboard');\n } else if (entityName === 'user views') {\n this.navigationService.OpenView(recordId, 'View');\n } else if (entityName === 'reports') {\n this.navigationService.OpenReport(recordId, 'Report');\n } else if (entityName?.includes('artifact')) {\n this.navigationService.OpenArtifact(recordId, 'Artifact');\n } else {\n // Default: navigate to record\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromSingleKeyValuePair('ID', recordId);\n this.navigationService.OpenEntityRecord(favorite.Entity, compositeKey);\n }\n }\n\n /**\n * Navigate to a recent item using NavigationService\n */\n onRecentClick(item: RecentAccessItem): void {\n // Use recordName if available, otherwise fall back to generic titles\n const name = item.recordName;\n\n switch (item.resourceType) {\n case 'view':\n this.navigationService.OpenView(item.recordId, name || 'View');\n break;\n case 'dashboard':\n this.navigationService.OpenDashboard(item.recordId, name || 'Dashboard');\n break;\n case 'artifact':\n this.navigationService.OpenArtifact(item.recordId, name || 'Artifact');\n break;\n case 'report':\n this.navigationService.OpenReport(item.recordId, name || 'Report');\n break;\n default:\n // Regular record\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromSingleKeyValuePair('ID', item.recordId);\n this.navigationService.OpenEntityRecord(item.entityName, compositeKey);\n }\n }\n\n /**\n * Navigate to a notification using NavigationService\n */\n onNotificationClick(notification: MJUserNotificationEntity): void {\n // Navigate to the notifications view using NavigationService\n this.navigationService.OpenDynamicView('MJ: User Notifications');\n }\n\n /**\n * Get icon for an entity by name, using entity metadata Icon field (cached)\n */\n getEntityIconByName(entityName: string): string {\n if (!entityName) return 'fa-solid fa-file';\n\n const cached = this.resourceIconCache.get(entityName);\n if (cached) return cached;\n\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n const icon = entityInfo ? this.resolveEntityIcon(entityInfo.Icon) : 'fa-solid fa-file';\n\n this.resourceIconCache.set(entityName, icon);\n return icon;\n }\n\n /**\n * Resolve an entity's Icon field to a full Font Awesome class string\n */\n private resolveEntityIcon(icon: string | undefined): string {\n if (!icon) return 'fa-solid fa-table';\n\n // Already has a style prefix\n if (icon.startsWith('fa-solid') || icon.startsWith('fa-regular') ||\n icon.startsWith('fa-light') || icon.startsWith('fa-brands') ||\n icon.startsWith('fa ')) {\n return icon;\n }\n // Has fa- prefix but no style\n if (icon.startsWith('fa-')) {\n return `fa-solid ${icon}`;\n }\n // Just an icon name like \"table\" or \"users\"\n return `fa-solid fa-${icon}`;\n }\n\n /**\n * Format a date for display (pure function, safe to call in template)\n */\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n return new Date(date).toLocaleDateString();\n }\n\n /**\n * Track function for favorites\n */\n trackByFavorite(_index: number, item: MJUserFavoriteEntity): string {\n return item.ID;\n }\n\n /**\n * Remove duplicate recent items (same entity + recordId). Keeps the first occurrence.\n */\n private deduplicateRecents(items: RecentAccessItem[]): RecentAccessItem[] {\n const seen = new Set<string>();\n return items.filter(item => {\n const key = `${item.entityName}-${item.recordId}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }\n\n /**\n * Track function for recent items\n */\n trackByRecent(_index: number, item: RecentAccessItem): string {\n return `${item.entityName}-${item.recordId}`;\n }\n\n /**\n * Track function for notifications\n */\n trackByNotification(_index: number, item: MJUserNotificationEntity): string {\n return item.ID;\n }\n}\n","<div class=\"home-dashboard\" [class.sidebar-open]=\"sidebarOpen && hasSidebarContent\">\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Header Section -->\n <div class=\"home-header\">\n <div class=\"greeting-section\">\n <h1>{{ greeting }}, {{ currentUser?.Name }}</h1>\n <p class=\"date\">{{ formattedDate }}</p>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading your applications...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Apps Grid -->\n @if (!isLoading) {\n <div class=\"apps-section\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-grid-2\"></i>\n Your Applications\n </h2>\n <div class=\"apps-grid\">\n @for (appData of appsDisplayData; track trackByApp($index, appData)) {\n <div\n class=\"app-card\"\n [style.--app-color]=\"appData.color\"\n (click)=\"onAppClick(appData.app)\">\n <!-- App Icon -->\n <div class=\"app-icon-wrapper\">\n <div class=\"app-icon\">\n <i [class]=\"appData.icon\"></i>\n </div>\n </div>\n <!-- App Info -->\n <div class=\"app-info\">\n <h3 class=\"app-name\">{{ appData.app.Name }}</h3>\n @if (appData.app.Description) {\n <p class=\"app-description\">{{ appData.app.Description }}</p>\n }\n <!-- Nav Items Preview -->\n @if (appData.navItemsCount > 0) {\n <div class=\"nav-preview\">\n @for (item of appData.navItemsPreview; track trackByNavItem($index, item)) {\n <div class=\"nav-item-chip\">\n <i [class]=\"item.Icon\"></i>\n <span>{{ item.Label }}</span>\n </div>\n }\n @if (appData.showMoreItems) {\n <span class=\"more-items\">\n +{{ appData.moreItemsCount }} more\n </span>\n }\n </div>\n }\n </div>\n <!-- Hover Arrow -->\n <div class=\"app-arrow\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n </div>\n }\n </div>\n <!-- Empty State -->\n @if (apps.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Applications Available</h3>\n <p>You don't have any applications configured yet.</p>\n <button kendoButton\n themeColor=\"primary\"\n (click)=\"openConfigDialog()\">\n <i class=\"fa-solid fa-gear\"></i>\n Configure Applications\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Collapsible Right Sidebar -->\n @if (hasSidebarContent) {\n <div class=\"quick-access-sidebar\">\n <div class=\"sidebar-header\">\n <h3>\n <i class=\"fa-solid fa-bolt\"></i>\n Quick Access\n </h3>\n <button class=\"sidebar-close-btn\" (click)=\"toggleSidebar()\" title=\"Close panel\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sidebar-content\">\n <!-- Unread Notifications Section -->\n @if (unreadNotifications.length > 0) {\n <div class=\"sidebar-section notifications-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-bell\"></i>\n Notifications\n <span class=\"section-badge\">{{ unreadNotifications.length }}</span>\n </h4>\n <div class=\"sidebar-items\">\n @for (notification of unreadNotifications; track trackByNotification($index, notification)) {\n <div\n class=\"sidebar-item notification-item\"\n (click)=\"onNotificationClick(notification)\">\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ notification.Title }}</span>\n <span class=\"sidebar-item-subtitle\">{{ notification.Message | slice:0:40 }}{{ (notification.Message?.length || 0) > 40 ? '...' : '' }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Favorites Section -->\n @if (favorites.length > 0 || favoritesLoading) {\n <div class=\"sidebar-section favorites-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-star\"></i>\n Favorites\n </h4>\n @if (!favoritesLoading) {\n <div class=\"sidebar-items\">\n @for (favorite of favorites; track trackByFavorite($index, favorite)) {\n <div\n class=\"sidebar-item favorite-item\"\n (click)=\"onFavoriteClick(favorite)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(favorite.Entity)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ getFavoriteDisplayName(favorite) }}</span>\n <span class=\"sidebar-item-subtitle\">{{ favorite.Entity }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (favoritesLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Recents Section -->\n @if (recentItems.length > 0 || recentsLoading) {\n <div class=\"sidebar-section recents-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Recent\n </h4>\n @if (!recentsLoading) {\n <div class=\"sidebar-items\">\n @for (item of recentItems; track trackByRecent($index, item)) {\n <div\n class=\"sidebar-item recent-item\"\n (click)=\"onRecentClick(item)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(item.entityName)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ item.recordName || item.recordId }}</span>\n <span class=\"sidebar-item-subtitle\">{{ item.entityName }} · {{ formatDate(item.latestAt) }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (recentsLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Empty sidebar state -->\n @if (!favoritesLoading && !recentsLoading && unreadNotifications.length === 0 && favorites.length === 0 && recentItems.length === 0) {\n <div class=\"sidebar-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No quick access items</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Quick Access FAB Toggle (Fixed Button) -->\n @if (hasSidebarContent && !sidebarOpen) {\n <button class=\"sidebar-fab-toggle\"\n (click)=\"toggleSidebar()\"\n title=\"Quick Access\">\n <i class=\"fa-solid fa-bolt\"></i>\n @if (unreadNotifications.length > 0) {\n <span class=\"fab-badge\">{{ unreadNotifications.length }}</span>\n }\n </button>\n }\n\n <!-- App Configuration Dialog -->\n <mj-user-app-config\n #appConfigDialog\n [(ShowDialog)]=\"showConfigDialog\"\n (ConfigSaved)=\"onConfigSaved()\">\n </mj-user-app-config>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"home-dashboard.component.js","sourceRoot":"","sources":["../../src/Home/home-dashboard.component.ts","../../src/Home/home-dashboard.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAA+C,SAAS,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC3H,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAA4D,MAAM,2BAA2B,CAAC;AAC5H,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAyB,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAgE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAG7H,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;;;;;;;;;;ICInE,8BAA+B;IAC7B,iCAA0E;IAC5E,iBAAM;;;IA0BM,6BAA2B;IAAA,YAA6B;IAAA,iBAAI;;;IAAjC,cAA6B;IAA7B,gDAA6B;;;IAMpD,+BAA2B;IACzB,oBAA2B;IAC3B,4BAAM;IAAA,YAAgB;IACxB,AADwB,iBAAO,EACzB;;;IAFD,cAAmB;IAAnB,2BAAmB;IAChB,eAAgB;IAAhB,mCAAgB;;;IAIxB,gCAAyB;IACvB,YACF;IAAA,iBAAO;;;IADL,cACF;IADE,gEACF;;;IAVJ,+BAAyB;IACvB,+JAKC;IACD,4HAA6B;IAK/B,iBAAM;;;IAXJ,cAKC;IALD,yCAKC;IACD,eAIC;IAJD,mDAIC;;;;IA7BT,+BAGoC;IAAlC,2NAAS,iCAAuB,KAAC;IAG/B,AADF,+BAA8B,cACN;IACpB,oBAA8B;IAElC,AADE,iBAAM,EACF;IAGJ,AADF,+BAAsB,aACC;IAAA,YAAsB;IAAA,iBAAK;IAChD,2GAA+B;IAI/B,6GAAiC;IAenC,iBAAM;IAEN,+BAAuB;IACrB,yBAAuC;IAE3C,AADE,iBAAM,EACF;;;IAnCJ,+CAAmC;IAK5B,eAAsB;IAAtB,8BAAsB;IAKN,eAAsB;IAAtB,yCAAsB;IAC3C,cAEC;IAFD,qDAEC;IAED,cAcC;IAdD,uDAcC;;;;IAYL,AADF,+BAAyB,cACC;IACtB,wBAAuC;IACzC,iBAAM;IACN,0BAAI;IAAA,yCAAyB;IAAA,iBAAK;IAClC,yBAAG;IAAA,+DAA+C;IAAA,iBAAI;IACtD,kCAE+B;IAA7B,yMAAS,yBAAkB,KAAC;IAC5B,wBAAgC;IAChC,wCACF;IACF,AADE,iBAAS,EACL;;;IA5DR,AADF,8BAA0B,aACE;IACxB,wBAAkC;IAClC,mCACF;IAAA,iBAAK;IACL,+BAAuB;IACrB,wIAuCC;IACH,iBAAM;IAEN,wGAAyB;IAe3B,iBAAM;;;IAzDF,eAuCC;IAvCD,qCAuCC;IAGH,eAcC;IAdD,mDAcC;;;;IA4BO,+BAE8C;IAA5C,+OAAS,2CAAiC,KAAC;IAEzC,AADF,+BAA+B,eACI;IAAA,YAAwB;IAAA,iBAAO;IAChE,gCAAoC;IAAA,YAAkG;;IAE1I,AADE,AADwI,iBAAO,EACzI,EACF;;;IAH+B,eAAwB;IAAxB,2CAAwB;IACrB,eAAkG;IAAlG,uLAAkG;;;IAZ9I,AADF,+BAAmD,aACf;IAChC,wBAAgC;IAChC,+BACA;IAAA,gCAA4B;IAAA,YAAgC;IAC9D,AAD8D,iBAAO,EAChE;IACL,+BAA2B;IACzB,+JASC;IAEL,AADE,iBAAM,EACF;;;IAd0B,eAAgC;IAAhC,uDAAgC;IAG5D,eASC;IATD,yCASC;;;;IAcG,+BAEsC;IAApC,2PAAS,oCAAyB,KAAC;IACnC,+BAA+B;IAC7B,oBAAsD;IACxD,iBAAM;IAEJ,AADF,+BAA+B,eACI;IAAA,YAAsC;IAAA,iBAAO;IAC9E,gCAAoC;IAAA,YAAqB;IAE7D,AADE,AAD2D,iBAAO,EAC5D,EACF;;;;IANC,eAA8C;IAA9C,8DAA8C;IAGhB,eAAsC;IAAtC,iEAAsC;IACnC,eAAqB;IAArB,yCAAqB;;;IAVjE,+BAA2B;IACzB,yKAYC;IACH,iBAAM;;;IAbJ,cAYC;IAZD,+BAYC;;;IAIH,+BAA6B;IAC3B,wBAA2C;IAC3C,4BAAM;IAAA,0BAAU;IAClB,AADkB,iBAAO,EACnB;;;IAzBR,AADF,+BAA+C,aACX;IAChC,wBAAgC;IAChC,2BACF;IAAA,iBAAK;IACL,sHAAyB;IAiBzB,sHAAwB;IAM1B,iBAAM;;;IAvBJ,eAgBC;IAhBD,mDAgBC;IACD,cAKC;IALD,kDAKC;;;;IAaK,+BAEgC;IAA9B,wPAAS,8BAAmB,KAAC;IAC7B,+BAA+B;IAC7B,oBAAsD;IACxD,iBAAM;IAEJ,AADF,+BAA+B,eACI;IAAA,YAAsC;IAAA,iBAAO;IAC9E,gCAAoC;IAAA,YAAuD;IAE/F,AADE,AAD6F,iBAAO,EAC9F,EACF;;;;IANC,eAA8C;IAA9C,8DAA8C;IAGhB,eAAsC;IAAtC,8DAAsC;IACnC,eAAuD;IAAvD,gGAAuD;;;IAVnG,+BAA2B;IACzB,wKAYC;IACH,iBAAM;;;IAbJ,cAYC;IAZD,iCAYC;;;IAIH,+BAA6B;IAC3B,wBAA2C;IAC3C,4BAAM;IAAA,0BAAU;IAClB,AADkB,iBAAO,EACnB;;;IAzBR,AADF,+BAA6C,aACT;IAChC,wBAA6C;IAC7C,wBACF;IAAA,iBAAK;IACL,uHAAuB;IAiBvB,uHAAsB;IAMxB,iBAAM;;;IAvBJ,eAgBC;IAhBD,iDAgBC;IACD,cAKC;IALD,gDAKC;;;IAKH,+BAA2B;IACzB,wBAAiC;IACjC,yBAAG;IAAA,qCAAqB;IAC1B,AAD0B,iBAAI,EACxB;;;;IApGR,AADF,AADF,8BAAkC,cACJ,SACtB;IACF,wBAAgC;IAChC,8BACF;IAAA,iBAAK;IACL,kCAAgF;IAA9C,2LAAS,sBAAe,KAAC;IACzD,wBAAiC;IAErC,AADE,iBAAS,EACL;IACN,+BAA6B;IAE3B,wGAAsC;IAsBtC,wGAAgD;IAgChD,0GAAgD;IAgChD,0GAAsI;IAO1I,AADE,iBAAM,EACF;;;IA7FF,eAoBC;IApBD,gEAoBC;IAED,cA8BC;IA9BD,iFA8BC;IAED,cA8BC;IA9BD,kFA8BC;IAED,cAKC;IALD,6LAKC;;;IAYD,gCAAwB;IAAA,YAAgC;IAAA,iBAAO;;;IAAvC,cAAgC;IAAhC,uDAAgC;;;;IAL5D,kCAEuB;IADrB,4LAAS,sBAAe,KAAC;IAEzB,wBAAgC;IAChC,yGAAsC;IAGxC,iBAAS;;;IAHP,eAEC;IAFD,gEAEC;;ADrLP;;;;;;;GAOG;AASI,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,qBAAqB;IA6DrD;IACA;IACA;IACA;IA/DF,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAC/B,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAEJ,eAAe,CAA0B;IAEvE,QAAQ;IACD,SAAS,GAAG,IAAI,CAAC;IACjB,IAAI,GAAsB,EAAE,CAAC;IAC7B,eAAe,GAAqB,EAAE,CAAC,CAAC,4BAA4B;IACpE,WAAW,GAA2C,IAAI,CAAC;IAC3D,gBAAgB,GAAG,KAAK,CAAC;IAEhC,YAAY;IACL,SAAS,GAA2B,EAAE,CAAC;IACvC,gBAAgB,GAAG,IAAI,CAAC;IAE/B,UAAU;IACH,WAAW,GAAuB,EAAE,CAAC;IACrC,cAAc,GAAG,IAAI,CAAC;IAE7B,gBAAgB;IACT,mBAAmB,GAA+B,EAAE,CAAC;IACrD,oBAAoB,GAAG,IAAI,CAAC;IAEnC,qDAAqD;IAC9C,WAAW,GAAG,KAAK,CAAC;IAE3B,qDAAqD;IAC7C,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEtD,8DAA8D;IACvD,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExD;;OAEG;IACH,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC3B,IAAI,CAAC,gBAAgB;YACrB,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;IACnE,CAAC;IAED,YACU,UAA8B,EAC9B,iBAAoC,EACpC,mBAAwC,EACxC,GAAsB;QAE9B,KAAK,EAAE,CAAC;QALA,eAAU,GAAV,UAAU,CAAoB;QAC9B,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,QAAG,GAAH,GAAG,CAAmB;IAGhC,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,wBAAwB;QACxB,IAAI,CAAC,WAAW,GAAG;YACjB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,IAAI,MAAM;YAC/C,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;SAC9C,CAAC;QAEF,qDAAqD;QACrD,IAAI,CAAC,UAAU,CAAC,OAAO;aACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,OAAO,CAAC,EAAE;YACnB,uDAAuD;YACvD,yEAAyE;YACzE,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,6DAA6D;QAC7D,IAAI,CAAC,UAAU,CAAC,YAAY;aACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;YACtB,iEAAiE;YACjE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAEpD,wCAAwC;YACxC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAEpC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEL,oCAAoC;QACpC,qBAAqB,CAAC,cAAc;aACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,aAAa,CAAC,EAAE;YACzB,IAAI,CAAC,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3E,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEL,4BAA4B;QAC5B,IAAI,CAAC,mBAAmB,CAAC,WAAW;aACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC9B,SAAS,CAAC,KAAK,CAAC,EAAE;YACjB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEL,2DAA2D;QAC3D,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,oEAAoE;QACpE,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,IAAI,GAAG,EAAE;YAAE,OAAO,cAAc,CAAC;QACrC,IAAI,IAAI,GAAG,EAAE;YAAE,OAAO,gBAAgB,CAAC;QACvC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACf,OAAO,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE;YAC5C,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,SAAS;SACf,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,GAAoB;QACnC,8EAA8E;QAC9E,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB;QAClC,IAAI,CAAC,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;YACjE,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;YACtC,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,oBAAoB;aACxC,CAAC,CAAC,CAAC;YAEJ,OAAO;gBACL,GAAG;gBACH,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,SAAS;gBAClC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,kBAAkB;gBACpC,aAAa;gBACb,eAAe;gBACf,aAAa,EAAE,aAAa,GAAG,CAAC;gBAChC,cAAc,EAAE,aAAa,GAAG,CAAC;aAClC,CAAC;QACJ,CAAC,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc,EAAE,IAAoB;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAc,EAAE,IAAqC;QAClE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC;YACH,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAE7B,4EAA4E;YAC5E,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEpE,+CAA+C;YAC/C,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB;QAChC,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,yBAAyB;QAE5E,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ;gBAAE,SAAS;YAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/E,IAAI,CAAC,YAAY;gBAAE,SAAS;YAE5B,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;YACxE,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,oBAAoB,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEpC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACzE,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACxC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,CAAC;oBAClF,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACvC,IAAI,KAAK,EAAE,CAAC;wBACV,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,0BAA0B,CAAC,UAAkB,EAAE,QAAgB;QACrE,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,wDAAwD;QACxD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,YAAY,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;gBAClD,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,YAAY,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAC3E,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,YAAY,CAAC,aAAa,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,QAA8B;QACnD,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC5F,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAA8B;QAC5C,wDAAwD;QACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAEnC,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAChF,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAsB;QAClC,qEAAqE;QACrE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAE7B,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1B,KAAK,MAAM;gBACT,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAC,CAAC;gBAC/D,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC;gBACzE,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,UAAU,CAAC,CAAC;gBACvE,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC,CAAC;gBACnE,MAAM;YACR,OAAO,CAAC,CAAC,CAAC;gBACR,iBAAiB;gBACjB,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrF,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,YAAsC;QACxD,6DAA6D;QAC7D,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,UAAkB;QACpC,IAAI,CAAC,UAAU;YAAE,OAAO,kBAAkB,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAEvF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,IAAwB;QAChD,IAAI,CAAC,IAAI;YAAE,OAAO,mBAAmB,CAAC;QAEtC,6BAA6B;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAC3D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,8BAA8B;QAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,YAAY,IAAI,EAAE,CAAC;QAC5B,CAAC;QACD,4CAA4C;QAC5C,OAAO,eAAe,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAU;QACnB,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEtD,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAC/B,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QACnC,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,GAAG,IAAI,WAAW,CAAC;QACxC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAc,EAAE,IAA0B;QACxD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,KAAyB;QAClD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACzB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAAc,EAAE,IAAsB;QAClD,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,MAAc,EAAE,IAA8B;QAChE,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;gHAreU,sBAAsB;6DAAtB,sBAAsB;;;;;;;YClC3B,AADF,AADF,AAFF,AAFF,8BAAoF,aAExD,aAEC,aACO,SACxB;YAAA,YAAuC;YAAA,iBAAK;YAChD,4BAAgB;YAAA,YAAmB;YAEvC,AADE,AADqC,iBAAI,EACnC,EACF;YAGN,wFAAiB;YAOjB,wFAAkB;YAkEpB,iBAAM;YAGN,2FAAyB;YA8GzB,6FAAyC;YAYzC,kDAGkC;YADhC,2RAAiC;YACjC,kKAAe,mBAAe,KAAC;YAEnC,AADE,iBAAqB,EACjB;;YAvNsB,wEAAuD;YAMvE,eAAuC;YAAvC,oGAAuC;YAC3B,eAAmB;YAAnB,uCAAmB;YAKvC,cAIC;YAJD,wCAIC;YAGD,cAiEC;YAjED,yCAiEC;YAIH,cA2GC;YA3GD,iDA2GC;YAGD,cASC;YATD,qEASC;YAKC,cAAiC;YAAjC,uDAAiC;;;AD5KxB,sBAAsB;IADlC,aAAa,CAAC,qBAAqB,EAAE,eAAe,CAAC;GACzC,sBAAsB,CAselC;;iFAteY,sBAAsB;cARlC,SAAS;6BACI,KAAK,YACP,mBAAmB,mBAGZ,uBAAuB,CAAC,MAAM;;kBAO9C,SAAS;mBAAC,iBAAiB;;kFAJjB,sBAAsB","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseResourceComponent, NavigationService, RecentAccessService, RecentAccessItem } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Metadata, CompositeKey, EntityRecordNameInput } from '@memberjunction/core';\nimport { ResourceData, MJUserFavoriteEntity, MJUserNotificationEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { UserAppConfigComponent } from '@memberjunction/ng-explorer-settings';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * Cached app data with pre-computed values for optimal rendering performance\n */\ninterface AppDisplayData {\n app: BaseApplication;\n color: string;\n icon: string;\n navItemsCount: number;\n navItemsPreview: { Label: string; Icon: string }[];\n showMoreItems: boolean;\n moreItemsCount: number;\n}\n\n/**\n * Home Dashboard - Personalized home screen showing all available applications\n * with quick access navigation and configuration options.\n *\n * Uses OnPush change detection and cached computed values for optimal performance.\n * Registered as a BaseResourceComponent so it can be used as a Custom resource type\n * in nav items, allowing users to return to the Home dashboard after viewing orphan resources.\n */\n@Component({\n standalone: false,\n selector: 'mj-home-dashboard',\n templateUrl: './home-dashboard.component.html',\n styleUrls: ['./home-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseResourceComponent, 'HomeDashboard')\nexport class HomeDashboardComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private destroy$ = new Subject<void>();\n private metadata = new Metadata();\n\n @ViewChild('appConfigDialog') appConfigDialog!: UserAppConfigComponent;\n\n // State\n public isLoading = true;\n public apps: BaseApplication[] = [];\n public appsDisplayData: AppDisplayData[] = []; // Pre-computed display data\n public currentUser: { Name: string; Email: string } | null = null;\n public showConfigDialog = false;\n\n // Favorites\n public favorites: MJUserFavoriteEntity[] = [];\n public favoritesLoading = true;\n\n // Recents\n public recentItems: RecentAccessItem[] = [];\n public recentsLoading = true;\n\n // Notifications\n public unreadNotifications: MJUserNotificationEntity[] = [];\n public notificationsLoading = true;\n\n // Sidebar state - default closed on all screen sizes\n public sidebarOpen = false;\n\n // Cached icon lookups to avoid repeated method calls\n private favoriteIconCache = new Map<string, string>();\n private resourceIconCache = new Map<string, string>();\n\n // Resolved display names for favorites (keyed by favorite ID)\n public favoriteDisplayNames = new Map<string, string>();\n\n /**\n * Check if sidebar has any content to show\n */\n get hasSidebarContent(): boolean {\n return this.unreadNotifications.length > 0 ||\n this.favorites.length > 0 ||\n this.recentItems.length > 0 ||\n this.favoritesLoading ||\n this.recentsLoading;\n }\n\n /**\n * Toggle sidebar visibility\n */\n toggleSidebar(): void {\n this.sidebarOpen = !this.sidebarOpen;\n }\n\n /**\n * Check if current device is mobile (width <= 768px)\n */\n private isMobileDevice(): boolean {\n return typeof window !== 'undefined' && window.innerWidth <= 768;\n }\n\n constructor(\n private appManager: ApplicationManager,\n private navigationService: NavigationService,\n private recentAccessService: RecentAccessService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Home';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return '';\n }\n\n async ngAfterViewInit(): Promise<void> {\n // Get current user info\n this.currentUser = {\n Name: this.metadata.CurrentUser?.Name || 'User',\n Email: this.metadata.CurrentUser?.Email || ''\n };\n\n // Subscribe to loading state from ApplicationManager\n this.appManager.Loading\n .pipe(takeUntil(this.destroy$))\n .subscribe(loading => {\n // Only update isLoading if manager is actively loading\n // (we start with isLoading=true and only set to false when we have apps)\n if (loading) {\n this.isLoading = true;\n this.cdr.markForCheck();\n }\n });\n\n // Subscribe to applications list, filtering out the Home app\n this.appManager.Applications\n .pipe(takeUntil(this.destroy$))\n .subscribe(async apps => {\n // Exclude the Home app from the list (users are already on Home)\n this.apps = apps.filter(app => app.Name !== 'Home');\n\n // Pre-compute display data for all apps\n await this.computeAppsDisplayData();\n\n this.isLoading = false;\n this.NotifyLoadComplete();\n\n this.cdr.markForCheck();\n });\n\n // Subscribe to unread notifications\n MJNotificationService.Notifications$\n .pipe(takeUntil(this.destroy$))\n .subscribe(notifications => {\n this.unreadNotifications = notifications.filter(n => n.Unread).slice(0, 5);\n this.notificationsLoading = false;\n this.cdr.markForCheck();\n });\n\n // Subscribe to recent items\n this.recentAccessService.RecentItems\n .pipe(takeUntil(this.destroy$))\n .subscribe(items => {\n this.recentItems = this.deduplicateRecents(items).slice(0, 5);\n this.recentsLoading = false;\n this.cdr.markForCheck();\n });\n\n // Favorites and recents load asynchronously in the sidebar\n this.NotifyLoadComplete();\n\n // Load favorites and recents asynchronously (don't block rendering)\n this.loadFavorites();\n this.loadRecents();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Get a greeting based on time of day\n */\n get greeting(): string {\n const hour = new Date().getHours();\n if (hour < 12) return 'Good morning';\n if (hour < 17) return 'Good afternoon';\n return 'Good evening';\n }\n\n /**\n * Get formatted date string\n */\n get formattedDate(): string {\n return new Date().toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric'\n });\n }\n\n /**\n * Navigate to an application\n */\n async onAppClick(app: BaseApplication): Promise<void> {\n // Use NavigationService to switch to the app (handles tab creation if needed)\n await this.navigationService.SwitchToApp(app.ID);\n }\n\n /**\n * Open app configuration dialog\n */\n openConfigDialog(): void {\n this.showConfigDialog = true;\n setTimeout(() => {\n if (this.appConfigDialog) {\n this.appConfigDialog.Open();\n }\n }, 0);\n }\n\n /**\n * Handle when config is saved\n */\n onConfigSaved(): void {\n this.showConfigDialog = false;\n }\n\n /**\n * Pre-compute display data for all apps to avoid repeated calculations during change detection\n */\n private async computeAppsDisplayData(): Promise<void> {\n this.appsDisplayData = await Promise.all(this.apps.map(async app => {\n const navItems = await app.GetNavItems();\n const navItemsCount = navItems.length;\n const navItemsPreview = navItems.slice(0, 3).map(item => ({\n Label: item.Label,\n Icon: item.Icon || 'fa-solid fa-circle'\n }));\n\n return {\n app,\n color: app.GetColor() || '#1976d2',\n icon: app.Icon || 'fa-solid fa-cube',\n navItemsCount,\n navItemsPreview,\n showMoreItems: navItemsCount > 3,\n moreItemsCount: navItemsCount - 3\n };\n }));\n }\n\n /**\n * Track function for apps loop\n */\n trackByApp(_index: number, item: AppDisplayData): string {\n return item.app.ID;\n }\n\n /**\n * Track function for nav items preview\n */\n trackByNavItem(_index: number, item: { Label: string; Icon: string }): string {\n return item.Label;\n }\n\n /**\n * Load user favorites from UserInfoEngine (cached) and resolve record display names\n */\n private async loadFavorites(): Promise<void> {\n try {\n this.favoritesLoading = true;\n\n // Get first 10 favorites (already ordered by __mj_CreatedAt DESC in engine)\n this.favorites = UserInfoEngine.Instance.UserFavorites.slice(0, 10);\n\n // Batch-resolve record names for all favorites\n await this.resolveFavoriteNames();\n } catch (error) {\n console.error('Error loading favorites:', error);\n } finally {\n this.favoritesLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Batch-resolve record display names for favorites using GetEntityRecordNames()\n */\n private async resolveFavoriteNames(): Promise<void> {\n const nameInputs: EntityRecordNameInput[] = [];\n const favoriteIdByKey = new Map<string, string>(); // map key -> favorite ID\n\n for (const fav of this.favorites) {\n if (!fav.Entity || !fav.RecordID) continue;\n const compositeKey = this.buildCompositeKeyForRecord(fav.Entity, fav.RecordID);\n if (!compositeKey) continue;\n\n nameInputs.push({ EntityName: fav.Entity, CompositeKey: compositeKey });\n favoriteIdByKey.set(`${fav.Entity}||${compositeKey.ToConcatenatedString()}`, fav.ID);\n }\n\n if (nameInputs.length === 0) return;\n\n try {\n const nameResults = await this.metadata.GetEntityRecordNames(nameInputs);\n for (const result of nameResults) {\n if (result.Success && result.RecordName) {\n const key = `${result.EntityName}||${result.CompositeKey.ToConcatenatedString()}`;\n const favId = favoriteIdByKey.get(key);\n if (favId) {\n this.favoriteDisplayNames.set(favId, result.RecordName);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to resolve favorite record names:', error);\n }\n }\n\n /**\n * Build a CompositeKey for a record. RecordID may be stored as either:\n * - Concatenated format: \"FieldName|Value\" or \"Field1|Val1||Field2|Val2\"\n * - Plain value: just the raw value (e.g. a GUID)\n */\n private buildCompositeKeyForRecord(entityName: string, recordId: string): CompositeKey | null {\n if (!recordId) return null;\n\n // If recordId contains '|', it's in concatenated format\n if (recordId.includes('|')) {\n try {\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(recordId);\n if (compositeKey.KeyValuePairs.length > 0) return compositeKey;\n } catch {\n // Fall through to entity-based lookup\n }\n }\n\n // Plain value — look up entity primary key field(s) to construct the key\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) return null;\n\n const pkField = entityInfo.FirstPrimaryKey;\n if (!pkField) return null;\n\n const compositeKey = new CompositeKey();\n compositeKey.KeyValuePairs = [{ FieldName: pkField.Name, Value: recordId }];\n return compositeKey;\n }\n\n /**\n * Get the display name for a favorite (resolved name or entity name fallback)\n */\n getFavoriteDisplayName(favorite: MJUserFavoriteEntity): string {\n return this.favoriteDisplayNames.get(favorite.ID) || favorite.Entity || favorite.RecordID;\n }\n\n /**\n * Load recent items via the RecentAccessService\n */\n private async loadRecents(): Promise<void> {\n try {\n this.recentsLoading = true;\n this.cdr.markForCheck();\n await this.recentAccessService.loadRecentItems(10);\n } catch (error) {\n console.error('Error loading recents:', error);\n } finally {\n this.recentsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Navigate to a favorite item using NavigationService\n */\n onFavoriteClick(favorite: MJUserFavoriteEntity): void {\n // Navigate based on entity type using NavigationService\n const entityName = favorite.Entity?.toLowerCase();\n const recordId = favorite.RecordID;\n\n if (entityName === 'dashboards') {\n this.navigationService.OpenDashboard(recordId, 'Dashboard');\n } else if (entityName === 'user views') {\n this.navigationService.OpenView(recordId, 'View');\n } else if (entityName === 'reports') {\n this.navigationService.OpenReport(recordId, 'Report');\n } else if (entityName?.includes('artifact')) {\n this.navigationService.OpenArtifact(recordId, 'Artifact');\n } else {\n // Default: navigate to record\n const compositeKey = this.buildCompositeKeyForRecord(favorite.Entity, recordId);\n if (compositeKey) {\n this.navigationService.OpenEntityRecord(favorite.Entity, compositeKey);\n }\n }\n }\n\n /**\n * Navigate to a recent item using NavigationService\n */\n onRecentClick(item: RecentAccessItem): void {\n // Use recordName if available, otherwise fall back to generic titles\n const name = item.recordName;\n\n switch (item.resourceType) {\n case 'view':\n this.navigationService.OpenView(item.recordId, name || 'View');\n break;\n case 'dashboard':\n this.navigationService.OpenDashboard(item.recordId, name || 'Dashboard');\n break;\n case 'artifact':\n this.navigationService.OpenArtifact(item.recordId, name || 'Artifact');\n break;\n case 'report':\n this.navigationService.OpenReport(item.recordId, name || 'Report');\n break;\n default: {\n // Regular record\n const compositeKey = this.buildCompositeKeyForRecord(item.entityName, item.recordId);\n if (compositeKey) {\n this.navigationService.OpenEntityRecord(item.entityName, compositeKey);\n }\n }\n }\n }\n\n /**\n * Navigate to a notification using NavigationService\n */\n onNotificationClick(notification: MJUserNotificationEntity): void {\n // Navigate to the notifications view using NavigationService\n this.navigationService.OpenDynamicView('MJ: User Notifications');\n }\n\n /**\n * Get icon for an entity by name, using entity metadata Icon field (cached)\n */\n getEntityIconByName(entityName: string): string {\n if (!entityName) return 'fa-solid fa-file';\n\n const cached = this.resourceIconCache.get(entityName);\n if (cached) return cached;\n\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n const icon = entityInfo ? this.resolveEntityIcon(entityInfo.Icon) : 'fa-solid fa-file';\n\n this.resourceIconCache.set(entityName, icon);\n return icon;\n }\n\n /**\n * Resolve an entity's Icon field to a full Font Awesome class string\n */\n private resolveEntityIcon(icon: string | undefined): string {\n if (!icon) return 'fa-solid fa-table';\n\n // Already has a style prefix\n if (icon.startsWith('fa-solid') || icon.startsWith('fa-regular') ||\n icon.startsWith('fa-light') || icon.startsWith('fa-brands') ||\n icon.startsWith('fa ')) {\n return icon;\n }\n // Has fa- prefix but no style\n if (icon.startsWith('fa-')) {\n return `fa-solid ${icon}`;\n }\n // Just an icon name like \"table\" or \"users\"\n return `fa-solid fa-${icon}`;\n }\n\n /**\n * Format a date for display (pure function, safe to call in template)\n */\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n return new Date(date).toLocaleDateString();\n }\n\n /**\n * Track function for favorites\n */\n trackByFavorite(_index: number, item: MJUserFavoriteEntity): string {\n return item.ID;\n }\n\n /**\n * Remove duplicate recent items (same entity + recordId). Keeps the first occurrence.\n */\n private deduplicateRecents(items: RecentAccessItem[]): RecentAccessItem[] {\n const seen = new Set<string>();\n return items.filter(item => {\n const key = `${item.entityName}-${item.recordId}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }\n\n /**\n * Track function for recent items\n */\n trackByRecent(_index: number, item: RecentAccessItem): string {\n return `${item.entityName}-${item.recordId}`;\n }\n\n /**\n * Track function for notifications\n */\n trackByNotification(_index: number, item: MJUserNotificationEntity): string {\n return item.ID;\n }\n}\n","<div class=\"home-dashboard\" [class.sidebar-open]=\"sidebarOpen && hasSidebarContent\">\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Header Section -->\n <div class=\"home-header\">\n <div class=\"greeting-section\">\n <h1>{{ greeting }}, {{ currentUser?.Name }}</h1>\n <p class=\"date\">{{ formattedDate }}</p>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading your applications...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Apps Grid -->\n @if (!isLoading) {\n <div class=\"apps-section\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-grid-2\"></i>\n Your Applications\n </h2>\n <div class=\"apps-grid\">\n @for (appData of appsDisplayData; track trackByApp($index, appData)) {\n <div\n class=\"app-card\"\n [style.--app-color]=\"appData.color\"\n (click)=\"onAppClick(appData.app)\">\n <!-- App Icon -->\n <div class=\"app-icon-wrapper\">\n <div class=\"app-icon\">\n <i [class]=\"appData.icon\"></i>\n </div>\n </div>\n <!-- App Info -->\n <div class=\"app-info\">\n <h3 class=\"app-name\">{{ appData.app.Name }}</h3>\n @if (appData.app.Description) {\n <p class=\"app-description\">{{ appData.app.Description }}</p>\n }\n <!-- Nav Items Preview -->\n @if (appData.navItemsCount > 0) {\n <div class=\"nav-preview\">\n @for (item of appData.navItemsPreview; track trackByNavItem($index, item)) {\n <div class=\"nav-item-chip\">\n <i [class]=\"item.Icon\"></i>\n <span>{{ item.Label }}</span>\n </div>\n }\n @if (appData.showMoreItems) {\n <span class=\"more-items\">\n +{{ appData.moreItemsCount }} more\n </span>\n }\n </div>\n }\n </div>\n <!-- Hover Arrow -->\n <div class=\"app-arrow\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n </div>\n }\n </div>\n <!-- Empty State -->\n @if (apps.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Applications Available</h3>\n <p>You don't have any applications configured yet.</p>\n <button kendoButton\n themeColor=\"primary\"\n (click)=\"openConfigDialog()\">\n <i class=\"fa-solid fa-gear\"></i>\n Configure Applications\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Collapsible Right Sidebar -->\n @if (hasSidebarContent) {\n <div class=\"quick-access-sidebar\">\n <div class=\"sidebar-header\">\n <h3>\n <i class=\"fa-solid fa-bolt\"></i>\n Quick Access\n </h3>\n <button class=\"sidebar-close-btn\" (click)=\"toggleSidebar()\" title=\"Close panel\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sidebar-content\">\n <!-- Unread Notifications Section -->\n @if (unreadNotifications.length > 0) {\n <div class=\"sidebar-section notifications-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-bell\"></i>\n Notifications\n <span class=\"section-badge\">{{ unreadNotifications.length }}</span>\n </h4>\n <div class=\"sidebar-items\">\n @for (notification of unreadNotifications; track trackByNotification($index, notification)) {\n <div\n class=\"sidebar-item notification-item\"\n (click)=\"onNotificationClick(notification)\">\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ notification.Title }}</span>\n <span class=\"sidebar-item-subtitle\">{{ notification.Message | slice:0:40 }}{{ (notification.Message?.length || 0) > 40 ? '...' : '' }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Favorites Section -->\n @if (favorites.length > 0 || favoritesLoading) {\n <div class=\"sidebar-section favorites-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-star\"></i>\n Favorites\n </h4>\n @if (!favoritesLoading) {\n <div class=\"sidebar-items\">\n @for (favorite of favorites; track trackByFavorite($index, favorite)) {\n <div\n class=\"sidebar-item favorite-item\"\n (click)=\"onFavoriteClick(favorite)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(favorite.Entity)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ getFavoriteDisplayName(favorite) }}</span>\n <span class=\"sidebar-item-subtitle\">{{ favorite.Entity }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (favoritesLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Recents Section -->\n @if (recentItems.length > 0 || recentsLoading) {\n <div class=\"sidebar-section recents-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Recent\n </h4>\n @if (!recentsLoading) {\n <div class=\"sidebar-items\">\n @for (item of recentItems; track trackByRecent($index, item)) {\n <div\n class=\"sidebar-item recent-item\"\n (click)=\"onRecentClick(item)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(item.entityName)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ item.recordName || item.recordId }}</span>\n <span class=\"sidebar-item-subtitle\">{{ item.entityName }} · {{ formatDate(item.latestAt) }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (recentsLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Empty sidebar state -->\n @if (!favoritesLoading && !recentsLoading && unreadNotifications.length === 0 && favorites.length === 0 && recentItems.length === 0) {\n <div class=\"sidebar-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No quick access items</p>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Quick Access FAB Toggle (Fixed Button) -->\n @if (hasSidebarContent && !sidebarOpen) {\n <button class=\"sidebar-fab-toggle\"\n (click)=\"toggleSidebar()\"\n title=\"Quick Access\">\n <i class=\"fa-solid fa-bolt\"></i>\n @if (unreadNotifications.length > 0) {\n <span class=\"fab-badge\">{{ unreadNotifications.length }}</span>\n }\n </button>\n }\n\n <!-- App Configuration Dialog -->\n <mj-user-app-config\n #appConfigDialog\n [(ShowDialog)]=\"showConfigDialog\"\n (ConfigSaved)=\"onConfigSaved()\">\n </mj-user-app-config>\n</div>\n"]}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
3
|
+
import { ResourceData } from '@memberjunction/core-entities';
|
|
4
|
+
import { IntegrationRunRow, RunDetailRow } from '../../services/integration-data.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
type StatusFilterType = 'All' | 'Success' | 'Failed' | 'In Progress' | 'Pending';
|
|
7
|
+
type DateFilterType = 'today' | '7d' | '30d' | 'all';
|
|
8
|
+
interface WatermarkRow {
|
|
9
|
+
ID: string;
|
|
10
|
+
EntityMapID: string;
|
|
11
|
+
WatermarkType: string;
|
|
12
|
+
WatermarkValue: string | null;
|
|
13
|
+
LastAppliedAt: string | null;
|
|
14
|
+
EntityMap: string;
|
|
15
|
+
}
|
|
16
|
+
interface IntegrationOption {
|
|
17
|
+
ID: string;
|
|
18
|
+
Name: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class ActivityComponent extends BaseResourceComponent implements OnInit {
|
|
21
|
+
AllRuns: IntegrationRunRow[];
|
|
22
|
+
FilteredRuns: IntegrationRunRow[];
|
|
23
|
+
Integrations: IntegrationOption[];
|
|
24
|
+
SelectedRunID: string | null;
|
|
25
|
+
SelectedRunDetails: RunDetailRow[];
|
|
26
|
+
WatermarkData: WatermarkRow[];
|
|
27
|
+
IsLoading: boolean;
|
|
28
|
+
IsLoadingDetail: boolean;
|
|
29
|
+
StatusFilter: StatusFilterType;
|
|
30
|
+
IntegrationFilter: string | null;
|
|
31
|
+
DateFilter: DateFilterType;
|
|
32
|
+
SearchQuery: string;
|
|
33
|
+
ExpandedRunID: string | null;
|
|
34
|
+
private expandedDetails;
|
|
35
|
+
private isLoadingExpanded;
|
|
36
|
+
ActiveDetailTab: 'entities' | 'watermarks';
|
|
37
|
+
IsLoadingWatermarks: boolean;
|
|
38
|
+
StatusOptions: StatusFilterType[];
|
|
39
|
+
DateOptions: {
|
|
40
|
+
Value: DateFilterType;
|
|
41
|
+
Label: string;
|
|
42
|
+
}[];
|
|
43
|
+
private dataService;
|
|
44
|
+
private cdr;
|
|
45
|
+
ngOnInit(): Promise<void>;
|
|
46
|
+
LoadData(): Promise<void>;
|
|
47
|
+
private loadAllRuns;
|
|
48
|
+
private buildIntegrationOptions;
|
|
49
|
+
LoadRunDetails(runID: string): Promise<RunDetailRow[]>;
|
|
50
|
+
LoadWatermarks(companyIntegrationID: string): Promise<void>;
|
|
51
|
+
private loadWatermarkData;
|
|
52
|
+
private mergeWatermarksWithEntityMaps;
|
|
53
|
+
ApplyFilters(): void;
|
|
54
|
+
private filterByStatus;
|
|
55
|
+
private filterByIntegration;
|
|
56
|
+
private filterByDate;
|
|
57
|
+
private filterBySearch;
|
|
58
|
+
private getDateCutoff;
|
|
59
|
+
SetStatusFilter(status: StatusFilterType): void;
|
|
60
|
+
SetDateFilter(range: DateFilterType): void;
|
|
61
|
+
SetIntegrationFilter(id: string | null): void;
|
|
62
|
+
OnSearchChange(): void;
|
|
63
|
+
Refresh(): Promise<void>;
|
|
64
|
+
SelectRun(runID: string): Promise<void>;
|
|
65
|
+
ToggleExpand(runID: string): Promise<void>;
|
|
66
|
+
IsExpanded(runID: string): boolean;
|
|
67
|
+
IsSelectedRun(runID: string): boolean;
|
|
68
|
+
GetExpandedDetails(): RunDetailRow[];
|
|
69
|
+
IsLoadingExpandedDetails(): boolean;
|
|
70
|
+
GetSelectedRun(): IntegrationRunRow | null;
|
|
71
|
+
SetDetailTab(tab: 'entities' | 'watermarks'): void;
|
|
72
|
+
private findRunByID;
|
|
73
|
+
FormatDuration(startedAt: string | null, endedAt: string | null): string;
|
|
74
|
+
GetRelativeTime(dateStr: string | null): string;
|
|
75
|
+
FormatAbsoluteDate(dateStr: string | null): string;
|
|
76
|
+
FormatWatermark(value: string | null): string;
|
|
77
|
+
FormatDate(dateStr: string | null): string;
|
|
78
|
+
GetStatusIcon(status: string): string;
|
|
79
|
+
GetStatusColor(status: string): string;
|
|
80
|
+
GetStatusDotClass(status: string): string;
|
|
81
|
+
StatusChipClass(status: string): string;
|
|
82
|
+
GetErrorCount(run: IntegrationRunRow): number;
|
|
83
|
+
get TotalRuns(): number;
|
|
84
|
+
get SuccessfulRuns(): number;
|
|
85
|
+
get FailedRuns(): number;
|
|
86
|
+
get TotalRecordsProcessed(): number;
|
|
87
|
+
GetDurationBarWidth(run: IntegrationRunRow): number;
|
|
88
|
+
GetDurationBarLabel(run: IntegrationRunRow): string;
|
|
89
|
+
GetResourceDisplayName(_data: ResourceData): Promise<string>;
|
|
90
|
+
GetResourceIconClass(_data: ResourceData): Promise<string>;
|
|
91
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ActivityComponent, never>;
|
|
92
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ActivityComponent, "app-integration-activity", never, {}, {}, never, never, false, never>;
|
|
93
|
+
}
|
|
94
|
+
export declare function LoadActivityComponent(): void;
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=activity.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.component.d.ts","sourceRoot":"","sources":["../../../../src/Integration/components/activity/activity.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAGL,iBAAiB,EACjB,YAAY,EAEb,MAAM,yCAAyC,CAAC;;AAEjD,KAAK,gBAAgB,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;AACjF,KAAK,cAAc,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAErD,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAOa,iBAAkB,SAAQ,qBAAsB,YAAW,MAAM;IAG5E,OAAO,EAAE,iBAAiB,EAAE,CAAM;IAClC,YAAY,EAAE,iBAAiB,EAAE,CAAM;IACvC,YAAY,EAAE,iBAAiB,EAAE,CAAM;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,kBAAkB,EAAE,YAAY,EAAE,CAAM;IACxC,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,SAAS,UAAQ;IACjB,eAAe,UAAS;IAGxB,YAAY,EAAE,gBAAgB,CAAS;IACvC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,UAAU,EAAE,cAAc,CAAQ;IAClC,WAAW,SAAM;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGpC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,iBAAiB,CAAS;IAGlC,eAAe,EAAE,UAAU,GAAG,YAAY,CAAc;IACxD,mBAAmB,UAAS;IAE5B,aAAa,EAAE,gBAAgB,EAAE,CAA0D;IAC3F,WAAW,EAAE;QAAE,KAAK,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAKrD;IAEF,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,GAAG,CAA6B;IAElC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAMzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAoBjB,WAAW;IAczB,OAAO,CAAC,uBAAuB;IAOzB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAStD,cAAc,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAanD,iBAAiB;IAiB/B,OAAO,CAAC,6BAA6B;IAarC,YAAY,IAAI,IAAI;IASpB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAcrB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAK/C,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAK1C,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAK7C,cAAc,IAAI,IAAI;IAIhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIlC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIrC,kBAAkB,IAAI,YAAY,EAAE;IAIpC,wBAAwB,IAAI,OAAO;IAInC,cAAc,IAAI,iBAAiB,GAAG,IAAI;IAI1C,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI;IAIlD,OAAO,CAAC,WAAW;IAOnB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAMxE,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAI/C,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAQlD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAM7C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAQ1C,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOrC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOtC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIzC,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIvC,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM;IAM7C,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,qBAAqB,IAAI,MAAM,CAElC;IAID,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM;IAKnD,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM;IAM7C,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAvXrD,iBAAiB;2CAAjB,iBAAiB;CA0X7B;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
|