@memberjunction/ng-explorer-core 5.10.0 → 5.11.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.
@@ -1 +1 @@
1
- {"version":3,"file":"shell.component.js","sourceRoot":"","sources":["../../../src/lib/shell/shell.component.ts","../../../src/lib/shell/shell.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, ViewContainerRef, ViewChild, ElementRef, HostListener } from '@angular/core';\nimport { ActivatedRoute, Router, NavigationEnd } from '@angular/router';\nimport { Subscription, combineLatest, Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport {\n ApplicationManager,\n WorkspaceStateManager,\n GoldenLayoutManager,\n BaseApplication,\n TabService,\n WorkspaceConfiguration,\n WorkspaceTab,\n AppAccessResult,\n NavItem\n} from '@memberjunction/ng-base-application';\nimport { Metadata, EntityInfo, LogStatus, StartupManager, CompositeKey } from '@memberjunction/core';\nimport { MJEventType, MJGlobal, uuidv4 , UUIDsEqual } from '@memberjunction/global';\nimport { EventCodes, NavigationService, SYSTEM_APP_ID, TitleService, DeveloperModeService, ThemeService } from '@memberjunction/ng-shared';\nimport { LogoGradient } from '@memberjunction/ng-shared-generic';\nimport { NavItemClickEvent } from './components/header/app-nav.component';\nimport { MJAuthBase } from '@memberjunction/ng-auth-services';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UserAvatarService } from '@memberjunction/ng-user-avatar';\nimport { SettingsDialogService } from './services/settings-dialog.service';\nimport { LoadingTheme, LoadingAnimationType, AnimationStep, getActiveTheme } from './loading-themes';\nimport { AppAccessDialogComponent, AppAccessDialogConfig, AppAccessDialogResult } from './components/dialogs/app-access-dialog.component';\nimport { BaseUserMenu, UserMenuElement, UserMenuItem, UserMenuContext, isUserMenuDivider, ApplicationInfoRef } from '../user-menu';\nimport { MJUserEntity } from '@memberjunction/core-entities';\nimport { CommandPaletteService } from '../command-palette/command-palette.service';\n\n/**\n * Main shell component for the new Explorer UX.\n *\n * Provides:\n * - App-centric header with app switcher and nav items\n * - Golden Layout-based tab container\n * - Unified workspace state management\n */\n@Component({\n standalone: false,\n selector: 'mj-shell',\n templateUrl: './shell.component.html',\n styleUrls: ['./shell.component.css']\n})\nexport class ShellComponent implements OnInit, OnDestroy, AfterViewInit {\n private subscriptions: Subscription[] = [];\n private urlBasedNavigation = false; // Track if we're loading from a URL\n private initialNavigationComplete = false; // Track if initial navigation has completed\n private firstUrlSync = true; // Track if this is the first URL sync (for replaceUrl behavior)\n\n activeApp: BaseApplication | null = null;\n loading = true;\n initialized = false;\n private waitingForFirstResource = false;\n tabBarVisible = true; // Controlled by workspace manager\n userMenuVisible = false; // User avatar context menu\n mobileNavOpen = false; // Mobile navigation drawer\n unreadNotificationCount = 0; // Notification badge count\n isViewingSystemTab = false; // True when viewing a resource tab (not associated with a registered app)\n loadingAppId: string | null = null; // ID of app currently being loaded (for app switcher loading indicator)\n\n // Loading animation state\n private loadingMessageInterval: ReturnType<typeof setInterval> | null = null;\n private loadingMessageIndex = 0;\n private usedMessageIndices: number[] = [];\n private usedGradientIndices: number[] = [];\n private messageCycleCount = 0; // Track message cycles for color changes\n private activeTheme: LoadingTheme;\n private readonly messageIntervalMs = 2500; // 2.5 seconds per message\n private readonly colorChangeEveryNMessages = 2; // Change color every 2 messages (5 seconds)\n // All available animation types (used for random selection when theme doesn't specify)\n private readonly allAnimationTypes: LoadingAnimationType[] = ['pulse', 'spin', 'bounce', 'pulse-spin'];\n // Animation sequencing\n private animationSequence: AnimationStep[] = [];\n private currentAnimationIndex = 0;\n private animationSequenceTimeout: ReturnType<typeof setTimeout> | null = null;\n currentLoadingText: string;\n currentLoadingColor: string;\n currentLoadingTextColor: string;\n currentLoadingGradient: LogoGradient | null;\n currentLoadingAnimation: 'pulse' | 'spin' | 'bounce' | 'pulse-spin' = 'pulse';\n\n // User avatar state\n userImageURL = '';\n userIconClass: string | null = null;\n userName = '';\n userEmail = '';\n private userEntity: MJUserEntity | null = null;\n\n // User menu plugin system\n private userMenu: BaseUserMenu | null = null;\n public userMenuElements: UserMenuElement[] = [];\n private destroy$ = new Subject<void>();\n\n // Search state\n isSearchOpen = false;\n searchableEntities: EntityInfo[] = [];\n selectedEntity: EntityInfo | null = null;\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\n\n // App access dialog\n @ViewChild('appAccessDialog') appAccessDialog!: AppAccessDialogComponent;\n private pendingAppPath: string | null = null; // Store the app path we tried to access\n\n /**\n * Get Nav Bar apps positioned to the left of the app switcher\n * Filters out apps that have HideNavBarIconWhenActive=true and are currently active\n */\n get leftOfSwitcherApps(): BaseApplication[] {\n return this.appManager.GetNavBarApps('Left of App Switcher')\n .filter(app => !(app.HideNavBarIconWhenActive && UUIDsEqual(app.ID, this.activeApp?.ID)));\n }\n\n /**\n * Get Nav Bar apps positioned to the left of the user menu\n * Filters out apps that have HideNavBarIconWhenActive=true and are currently active\n */\n get leftOfUserMenuApps(): BaseApplication[] {\n return this.appManager.GetNavBarApps('Left of User Menu')\n .filter(app => !(app.HideNavBarIconWhenActive && UUIDsEqual(app.ID, this.activeApp?.ID)));\n }\n\n constructor(\n private appManager: ApplicationManager,\n private workspaceManager: WorkspaceStateManager,\n private layoutManager: GoldenLayoutManager,\n private tabService: TabService,\n private navigationService: NavigationService,\n private route: ActivatedRoute,\n private router: Router,\n private authBase: MJAuthBase,\n private cdr: ChangeDetectorRef,\n private userAvatarService: UserAvatarService,\n private settingsDialogService: SettingsDialogService,\n private viewContainerRef: ViewContainerRef,\n private titleService: TitleService,\n public developerModeService: DeveloperModeService,\n private commandPaletteService: CommandPaletteService,\n private themeService: ThemeService\n ) {\n // Initialize theme immediately so loading UI shows correct colors from the start\n this.activeTheme = getActiveTheme();\n\n // Initialize animation based on theme configuration\n this.initializeAnimationFromTheme();\n\n // Set first message\n this.currentLoadingText = this.activeTheme.messages[0];\n\n if (this.activeTheme.staticColors) {\n // Standard theme: keep MJ blue, no gradient\n this.currentLoadingColor = this.activeTheme.colors[0];\n this.currentLoadingTextColor = '#757575'; // Default gray text\n this.currentLoadingGradient = null;\n } else {\n // Themed period: use theme colors and first gradient from the start\n this.currentLoadingColor = this.activeTheme.colors[0];\n this.currentLoadingTextColor = this.activeTheme.colors[0];\n\n // Set initial gradient if theme has gradients\n if (this.activeTheme.gradients && this.activeTheme.gradients.length > 0) {\n this.currentLoadingGradient = this.activeTheme.gradients[0];\n } else {\n this.currentLoadingGradient = null;\n }\n }\n }\n\n async ngOnInit(): Promise<void> {\n try {\n MJGlobal.Instance.GetEventListener(true).subscribe(async (loginEvent) => {\n if (loginEvent.event === MJEventType.LoggedIn) {\n if (this.authBase.initialPath === \"/\") {\n // Base route - no need to wait for NavigationEnd\n await this.initializeShell();\n }\n else {\n // Deep link route - wait for NavigationEnd to ensure router URL is correct\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n filter(() => !this.initialNavigationComplete)\n ).subscribe(async () => {\n this.initialNavigationComplete = true;\n await this.initializeShell();\n });\n }\n }\n });\n \n } catch (error) {\n console.error('Failed to initialize shell:', error);\n this.loading = false;\n }\n }\n\n async initializeShell(): Promise<void> {\n // Start the loading animation with cycling messages\n this.startLoadingAnimation();\n\n // Initialize application manager (subscribes to LoggedIn event)\n this.appManager.Initialize();\n\n await StartupManager.Instance.Startup(); \n\n // Get current user\n const md = new Metadata();\n const user = md.CurrentUser;\n if (!user) {\n throw new Error('No current user found');\n }\n\n // Check the current URL to determine if we're loading from a URL-based navigation\n const currentUrl = this.router.url;\n this.urlBasedNavigation = currentUrl.includes('/app/') || currentUrl.includes('/resource/');\n\n // Wait for workspace initialization to complete before allowing any tab operations\n await this.workspaceManager.Initialize(user.ID);\n\n // Subscribe to tab bar visibility changes\n this.subscriptions.push(\n this.workspaceManager.TabBarVisible.subscribe(visible => {\n this.tabBarVisible = visible;\n })\n );\n\n // Subscribe to unread notification count changes\n this.subscriptions.push(\n MJNotificationService.UnreadCount$.subscribe(count => {\n this.unreadNotificationCount = count;\n this.cdr.detectChanges();\n })\n );\n\n // Subscribe to active app changes\n this.subscriptions.push(\n this.appManager.ActiveApp.subscribe(async app => {\n this.activeApp = app;\n this.cdr.detectChanges();\n\n // Create default tab when app is activated ONLY if:\n // 1. App has no tabs yet\n // 2. We're not loading from a URL that will create its own tab\n if (app) {\n const existingTabs = this.workspaceManager.GetAppTabs(app.ID);\n\n if (existingTabs.length === 0) {\n // Check if we're loading from a URL that will create a tab\n const currentUrl = this.router.url;\n const hasResourceUrl = currentUrl.includes('/app/') ||\n currentUrl.includes('/resource/');\n\n // Only create default tab if we're NOT loading from a resource URL\n if (!hasResourceUrl) {\n const tabRequest = await app.CreateDefaultTab();\n if (tabRequest) {\n this.tabService.OpenTab(tabRequest);\n }\n }\n }\n }\n })\n );\n\n // Subscribe to applications loading - set app based on URL or default to first\n // Use combineLatest to wait for loading to complete before deciding there are no apps\n this.subscriptions.push(\n combineLatest([this.appManager.Applications, this.appManager.Loading]).subscribe(async ([apps, isLoading]) => {\n // Don't make decisions while still loading - wait for load to complete\n if (isLoading) {\n return;\n }\n\n // Handle the case where user has no apps at all (only after loading is complete)\n if (apps.length === 0) {\n await this.handleNoAppsAvailable();\n return;\n }\n\n // Check if URL specifies an app by parsing the browser URL\n const currentUrl = this.router.url;\n const appMatch = currentUrl.match(/\\/app\\/([^\\/]+)/);\n\n if (appMatch) {\n const routeAppPath = decodeURIComponent(appMatch[1]);\n // Find the app from the URL by Path (or Name for backwards compatibility)\n const urlApp = this.appManager.GetAppByPath(routeAppPath);\n\n if (urlApp) {\n // Set the app from URL - takes precedence over workspace restoration\n await this.appManager.SetActiveApp(urlApp.ID);\n\n // If the URL is just /app/:appName (no nav item), create default tab\n const hasNavItem = currentUrl.match(/\\/app\\/[^\\/]+\\/[^\\/]+/);\n\n if (!hasNavItem) {\n const existingTabs = this.workspaceManager.GetAppTabs(urlApp.ID);\n if (existingTabs.length === 0) {\n const tabRequest = await urlApp.CreateDefaultTab();\n if (tabRequest) {\n this.tabService.OpenTab(tabRequest);\n }\n }\n }\n\n return;\n } else {\n // App not found in user's list - check why and show appropriate dialog\n await this.handleAppAccessError(routeAppPath, apps);\n return;\n }\n }\n\n // Set default app if URL doesn't specify one AND no app is active yet\n const currentActiveApp = this.appManager.GetActiveApp();\n if (!appMatch && !currentActiveApp) {\n await this.appManager.SetActiveApp(apps[0].ID);\n }\n })\n );\n\n // Subscribe to tab open requests from TabService\n this.subscriptions.push(\n this.tabService.TabRequests.subscribe(async request => {\n await this.processTabRequest(request);\n })\n );\n\n // Replay any tab requests that were queued before we subscribed\n // This handles the case where ResourceResolver creates requests before shell is ready\n const queuedRequests = this.tabService.GetQueuedRequests();\n if (queuedRequests.length > 0) {\n for (const request of queuedRequests) {\n await this.processTabRequest(request);\n }\n this.tabService.ClearQueue();\n }\n\n // Clear urlBasedNavigation flag after initial setup completes\n // This must happen regardless of whether there were queued requests,\n // because apps with zero nav items create tabs directly (not via ResourceResolver)\n // and we still need URL sync to work for subsequent navigation\n if (this.urlBasedNavigation) {\n this.urlBasedNavigation = false;\n }\n\n // Subscribe to workspace configuration changes to sync URL and active app\n this.subscriptions.push(\n this.workspaceManager.Configuration.subscribe(async config => {\n if (config && this.initialized) {\n // Sync active app with active tab's application\n await this.syncActiveAppWithTab(config);\n this.syncUrlWithWorkspace(config);\n // Update browser tab title\n this.updateBrowserTitle(config);\n }\n })\n );\n\n // Subscribe to router navigation events (for browser back/forward)\n this.subscriptions.push(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd)\n ).subscribe(event => {\n if (this.initialized) {\n this.syncWorkspaceWithUrl(event.urlAfterRedirects || event.url);\n }\n })\n );\n\n // Check for deep link parameters on initialization\n this.handleDeepLink();\n\n // Load user avatar and initialize user menu\n await this.loadUserAvatar(user);\n await this.initializeUserMenu();\n\n // Listen for avatar updates from settings page\n this.subscriptions.push(\n MJGlobal.Instance.GetEventListener(false).subscribe(async (updateEvent) => {\n if (updateEvent.eventCode === EventCodes.AvatarUpdated) {\n const md = new Metadata();\n const currentUserInfo = md.CurrentUser;\n const userEntity = await md.GetEntityObject<any>('MJ: Users');\n await userEntity.Load(currentUserInfo.ID);\n this.applyUserAvatar(userEntity);\n }\n })\n );\n\n // Load searchable entities for search functionality\n await this.loadSearchableEntities();\n\n this.initialized = true;\n this.waitingForFirstResource = true;\n\n // Trigger initial URL sync: the Configuration BehaviorSubject already emitted\n // its value when the shell subscribed (line above), but this.initialized was false\n // at that point so syncUrlWithWorkspace() was skipped. Now that we're initialized,\n // manually trigger the first URL sync to set the browser URL from workspace state.\n const initConfig = this.workspaceManager.GetConfiguration();\n if (initConfig && initConfig.activeTabId) {\n await this.syncActiveAppWithTab(initConfig);\n this.syncUrlWithWorkspace(initConfig);\n }\n\n // Force change detection to sync Angular's expected values after all async\n // state changes (apps loaded, searchableEntities populated, etc.) to prevent\n // NG0100 ExpressionChangedAfterItHasBeenCheckedError in dev mode\n this.cdr.detectChanges();\n }\n\n /**\n * Handle deep links from URL\n * Resource URLs like /resource/record/Companies/123 are handled by ResourceResolver\n * Legacy ?tab= params are supported for backward compatibility\n */\n private handleDeepLink(): void {\n const queryParams = this.route.snapshot.queryParams;\n const tabParam = queryParams['tab'];\n\n // Legacy support for ?tab= parameters\n if (tabParam) {\n const tabIds = Array.isArray(tabParam) ? tabParam : [tabParam];\n if (tabIds.length > 0) {\n this.workspaceManager.SetActiveTab(tabIds[0]);\n }\n }\n\n // Note: Resource URLs like /resource/record/EntityName/123 are automatically\n // handled by the ResourceResolver which raises MJ events that the workspace\n // manager listens to. No additional handling needed here.\n }\n\n /**\n * Process a tab request (from subscription or replay)\n */\n private async processTabRequest(request: any): Promise<void> {\n const app = this.appManager.GetAppById(request.ApplicationId);\n const appColor = app?.GetColor() || '#757575';\n\n // Determine if this is a URL-based tab request\n // URL-based tabs have appName/resourceType BUT NOT isAppDefault\n // (isAppDefault indicates workspace restoration, not URL navigation)\n const isUrlBasedTab = (request.Configuration?.appName || request.Configuration?.resourceType) &&\n !request.Configuration?.isAppDefault;\n\n const currentActiveApp = this.appManager.GetActiveApp();\n\n // Only set the app as active if:\n // 1. We're initialized (past the startup phase)\n // 2. App is different from current\n // 3. Either NOT in URL-based navigation mode, OR this IS a URL-based tab\n const shouldSetActiveApp = this.initialized &&\n app &&\n !UUIDsEqual(currentActiveApp?.ID, request.ApplicationId) &&\n (!this.urlBasedNavigation || isUrlBasedTab);\n\n if (shouldSetActiveApp) {\n await this.appManager.SetActiveApp(request.ApplicationId);\n }\n\n this.workspaceManager.OpenTab(request, appColor);\n }\n\n /**\n * Sync active app with the active tab's application\n * Called when workspace configuration changes (e.g., user clicks on a tab in Golden Layout)\n */\n private async syncActiveAppWithTab(config: WorkspaceConfiguration): Promise<void> {\n if (!config.activeTabId) {\n this.titleService.reset();\n return;\n }\n\n // Find the active tab\n const activeTab = config.tabs?.find(tab => tab.id === config.activeTabId);\n if (!activeTab) {\n this.titleService.reset();\n return;\n }\n\n // Get the tab's application ID\n const tabAppId = activeTab.applicationId;\n if (!tabAppId) {\n this.titleService.setResourceName(activeTab.title || null);\n return;\n }\n\n // Check if this is a system tab (not associated with a registered app)\n if (tabAppId === SYSTEM_APP_ID) {\n this.isViewingSystemTab = true;\n this.cdr.detectChanges();\n\n // Don't try to set active app - SYSTEM_APP_ID has no registered app\n // Update browser title with just the tab title (no app context)\n this.titleService.setContext(null, activeTab.title || 'Explorer');\n return;\n }\n\n // Not a system tab - clear the flag\n this.isViewingSystemTab = false;\n this.cdr.detectChanges();\n\n // Check if active app needs to be updated\n const currentActiveApp = this.appManager.GetActiveApp();\n if (!UUIDsEqual(currentActiveApp?.ID, tabAppId)) {\n // Update the active app to match the tab's application\n await this.appManager.SetActiveApp(tabAppId);\n }\n\n // Update browser title with app and tab context\n const app = this.appManager.GetAppById(tabAppId);\n const appName = app?.Name || null;\n const tabTitle = activeTab.title || null;\n this.titleService.setContext(appName, tabTitle);\n }\n\n /**\n * Sync URL with active tab's resource\n */\n private async syncUrlWithWorkspace(config: WorkspaceConfiguration): Promise<void> {\n // Don't sync URL during URL-based navigation initialization\n if (this.urlBasedNavigation) {\n return;\n }\n\n if (!config.activeTabId) {\n return;\n }\n\n // Find the active tab\n const activeTab = config.tabs?.find(tab => tab.id === config.activeTabId);\n if (!activeTab) {\n return;\n }\n\n // Build resource URL from tab configuration\n const resourceUrl = await this.buildResourceUrl(activeTab);\n if (resourceUrl) {\n // Compare full URLs including query params to detect changes\n const currentUrl = this.router.url;\n const newUrl = resourceUrl;\n\n // Only update if URL is different (path or query params changed)\n if (currentUrl !== newUrl) {\n // Suppress ResourceResolver for this navigation - we're just syncing the URL\n // to reflect the current active tab, not requesting a new tab to be opened\n this.tabService.SuppressNextResolve();\n\n // Replace URL on first sync (initialization), push new history entries after that\n const replaceUrl = this.firstUrlSync;\n this.firstUrlSync = false;\n this.router.navigateByUrl(resourceUrl, { replaceUrl });\n }\n }\n }\n\n /**\n * Sync workspace state with the current URL (for browser back/forward navigation).\n * Finds and activates the tab that matches the URL.\n */\n private async syncWorkspaceWithUrl(url: string): Promise<void> {\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.tabs?.length) {\n return;\n }\n\n // Find the tab that matches this URL\n const matchingTab = await this.findTabForUrl(url, config.tabs);\n\n if (matchingTab && matchingTab.id !== config.activeTabId) {\n // Activate the matching tab\n this.workspaceManager.SetActiveTab(matchingTab.id);\n } else if (!matchingTab) {\n // No matching tab found - check if this is an app-only URL for an app with zero nav items\n // If so, we need to create a new tab for it (the old one was replaced when navigating away)\n await this.handleMissingTabForUrl(url);\n }\n }\n\n /**\n * Handle the case where no tab matches the URL during back/forward navigation.\n * Creates new tabs for resources when the original tab was replaced.\n */\n private async handleMissingTabForUrl(url: string): Promise<void> {\n const urlPath = url.split('?')[0];\n const queryString = url.split('?')[1] || '';\n const queryParams = new URLSearchParams(queryString);\n\n // Use urlBasedNavigation flag to prevent syncUrlWithWorkspace from triggering again\n this.urlBasedNavigation = true;\n try {\n // Check for app-scoped record URL: /app/:appName/record/:entityName/:recordId\n const appRecordMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/record\\/([^\\/]+)\\/(.+)$/);\n if (appRecordMatch) {\n const entityName = decodeURIComponent(appRecordMatch[2]);\n const recordId = decodeURIComponent(appRecordMatch[3]);\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(recordId);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n return;\n }\n\n // Check for app-scoped view URL: /app/:appName/view/:viewId\n const appViewMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/view\\/([^\\/]+)$/);\n if (appViewMatch && appViewMatch[2] !== 'dynamic') {\n const viewId = appViewMatch[2];\n this.navigationService.OpenView(viewId, 'View');\n return;\n }\n\n // Check for app-scoped dynamic view URL: /app/:appName/view/dynamic/:entityName\n const appDynamicViewMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/view\\/dynamic\\/(.+)$/);\n if (appDynamicViewMatch) {\n const entityName = decodeURIComponent(appDynamicViewMatch[2]);\n const extraFilter = queryParams.get('ExtraFilter') || undefined;\n this.navigationService.OpenDynamicView(entityName, extraFilter);\n return;\n }\n\n // Check for app-scoped dashboard URL: /app/:appName/dashboard/:dashboardId\n const appDashboardMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/dashboard\\/(.+)$/);\n if (appDashboardMatch) {\n const dashboardId = appDashboardMatch[2];\n this.navigationService.OpenDashboard(dashboardId, 'Dashboard');\n return;\n }\n\n // Check for app-scoped artifact URL: /app/:appName/artifact/:artifactId\n const appArtifactMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/artifact\\/(.+)$/);\n if (appArtifactMatch) {\n const artifactId = appArtifactMatch[2];\n this.navigationService.OpenArtifact(artifactId, 'Artifact');\n return;\n }\n\n // Check for app-scoped query URL: /app/:appName/query/:queryId\n const appQueryMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/query\\/(.+)$/);\n if (appQueryMatch) {\n const queryId = appQueryMatch[2];\n this.navigationService.OpenQuery(queryId, 'Query');\n return;\n }\n\n // Check for app-scoped report URL: /app/:appName/report/:reportId\n const appReportMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/report\\/(.+)$/);\n if (appReportMatch) {\n const reportId = appReportMatch[2];\n this.navigationService.OpenReport(reportId, 'Report');\n return;\n }\n\n // Check for app-only URL: /app/:appName\n const appOnlyMatch = urlPath.match(/^\\/app\\/([^\\/]+)$/);\n if (appOnlyMatch) {\n const appPath = decodeURIComponent(appOnlyMatch[1]);\n const app = this.appManager.GetAppByPath(appPath) || this.appManager.GetAppByName(appPath);\n\n if (app) {\n const navItems = await app.GetNavItems();\n // Only auto-create tabs for apps with zero nav items\n // Apps with nav items should have had their tabs preserved\n if (navItems.length === 0) {\n // Set the app as active and create its default tab\n await this.appManager.SetActiveApp(app.ID);\n const defaultTab = await app.CreateDefaultTab();\n if (defaultTab) {\n this.workspaceManager.OpenTab(defaultTab, app.GetColor());\n }\n }\n }\n return;\n }\n\n // Legacy resource URLs (backward compatibility)\n // Check for legacy record URL: /resource/record/:entityName/:recordId\n const legacyRecordMatch = urlPath.match(/^\\/resource\\/record\\/([^\\/]+)\\/(.+)$/);\n if (legacyRecordMatch) {\n const entityName = decodeURIComponent(legacyRecordMatch[1]);\n const recordId = decodeURIComponent(legacyRecordMatch[2]);\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(recordId);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n return;\n }\n\n // Check for legacy view URL: /resource/view/:viewId\n const legacyViewMatch = urlPath.match(/^\\/resource\\/view\\/([^\\/]+)$/);\n if (legacyViewMatch && legacyViewMatch[1] !== 'dynamic') {\n const viewId = legacyViewMatch[1];\n this.navigationService.OpenView(viewId, 'View');\n return;\n }\n\n // Check for legacy dashboard URL: /resource/dashboard/:dashboardId\n const legacyDashboardMatch = urlPath.match(/^\\/resource\\/dashboard\\/(.+)$/);\n if (legacyDashboardMatch) {\n const dashboardId = legacyDashboardMatch[1];\n this.navigationService.OpenDashboard(dashboardId, 'Dashboard');\n return;\n }\n } finally {\n this.urlBasedNavigation = false;\n }\n }\n\n /**\n * Find the tab that matches a given URL\n */\n private async findTabForUrl(url: string, tabs: WorkspaceTab[]): Promise<WorkspaceTab | null> {\n // Parse the URL to extract resource info\n const urlPath = url.split('?')[0];\n\n // Check for app nav item URL: /app/:appName/:navItemName\n const appNavMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/([^\\/]+)$/);\n if (appNavMatch) {\n const appPath = decodeURIComponent(appNavMatch[1]);\n const navItemName = decodeURIComponent(appNavMatch[2]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const tabAppName = tabConfig['appName'] as string | undefined;\n const tabNavItemName = tabConfig['navItemName'] as string | undefined;\n\n if (!tabAppName || !tabNavItemName) return false;\n\n // Match by app path/name and nav item name (case-insensitive)\n const app = this.appManager.GetAppByPath(appPath) || this.appManager.GetAppByName(appPath);\n if (!app) return false;\n\n const appMatches = tabAppName.toLowerCase() === app.Name.toLowerCase() ||\n UUIDsEqual(tab.applicationId, app.ID);\n const navMatches = tabNavItemName.toLowerCase() === navItemName.toLowerCase();\n\n return appMatches && navMatches;\n }) || null;\n }\n\n // Check for app-only URL: /app/:appName\n const appOnlyMatch = urlPath.match(/^\\/app\\/([^\\/]+)$/);\n if (appOnlyMatch) {\n const appPath = decodeURIComponent(appOnlyMatch[1]);\n const app = this.appManager.GetAppByPath(appPath) || this.appManager.GetAppByName(appPath);\n\n if (app) {\n // First, try to find a tab with isAppDefault for this app\n const defaultTab = tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n return UUIDsEqual(tab.applicationId, app.ID) && tabConfig['isAppDefault'] === true;\n });\n if (defaultTab) {\n return defaultTab;\n }\n\n // Fallback for apps with zero nav items: match ANY tab belonging to this app\n // This handles the case where the default tab was replaced when navigating away\n const navItems = await app.GetNavItems();\n if (navItems.length === 0) {\n return tabs.find(tab => UUIDsEqual(tab.applicationId, app.ID)) || null;\n }\n\n return null;\n }\n }\n\n // Check for app-scoped resource URLs (new pattern)\n // Pattern: /app/:appName/:resourceType/:param1/:param2?\n\n // Dashboard: /app/:appName/dashboard/:dashboardId\n const appDashboardMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/dashboard\\/(.+)$/);\n if (appDashboardMatch) {\n const dashboardId = appDashboardMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabDashboardId = (tabConfig['dashboardId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'dashboards' && tabDashboardId === dashboardId;\n }) || null;\n }\n\n // Record: /app/:appName/record/:entityName/:recordId\n const appRecordMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/record\\/([^\\/]+)\\/(.+)$/);\n if (appRecordMatch) {\n const entityName = decodeURIComponent(appRecordMatch[2]);\n const recordId = decodeURIComponent(appRecordMatch[3]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const tabEntity = (tabConfig['Entity'] || tabConfig['entity']) as string | undefined;\n const tabRecordId = (tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return tabEntity?.toLowerCase() === entityName.toLowerCase() &&\n tabRecordId === recordId;\n }) || null;\n }\n\n // Dynamic view: /app/:appName/view/dynamic/:entityName\n const appDynamicViewMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/view\\/dynamic\\/(.+)$/);\n if (appDynamicViewMatch) {\n const entityName = decodeURIComponent(appDynamicViewMatch[2]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabEntity = (tabConfig['Entity'] || tabConfig['entity']) as string | undefined;\n const isDynamic = tabConfig['isDynamic'] as boolean | undefined;\n\n return resourceType === 'user views' && isDynamic && tabEntity?.toLowerCase() === entityName.toLowerCase();\n }) || null;\n }\n\n // Saved view: /app/:appName/view/:viewId\n const appViewMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/view\\/([^\\/]+)$/);\n if (appViewMatch) {\n const viewId = appViewMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabViewId = (tabConfig['viewId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'user views' && tabViewId === viewId;\n }) || null;\n }\n\n // Query: /app/:appName/query/:queryId\n const appQueryMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/query\\/(.+)$/);\n if (appQueryMatch) {\n const queryId = appQueryMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabQueryId = (tabConfig['queryId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'queries' && tabQueryId === queryId;\n }) || null;\n }\n\n // Report: /app/:appName/report/:reportId\n const appReportMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/report\\/(.+)$/);\n if (appReportMatch) {\n const reportId = appReportMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabReportId = (tabConfig['reportId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'reports' && tabReportId === reportId;\n }) || null;\n }\n\n // Artifact: /app/:appName/artifact/:artifactId\n const appArtifactMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/artifact\\/(.+)$/);\n if (appArtifactMatch) {\n const artifactId = appArtifactMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabArtifactId = (tabConfig['artifactId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'artifacts' && tabArtifactId === artifactId;\n }) || null;\n }\n\n // Search: /app/:appName/search/:searchInput\n const appSearchMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/search\\/(.+)$/);\n if (appSearchMatch) {\n const searchInput = decodeURIComponent(appSearchMatch[2]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabSearchInput = (tabConfig['SearchInput'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'search results' && tabSearchInput === searchInput;\n }) || null;\n }\n\n // Legacy resource URLs (kept for backward compatibility)\n // Check for resource record URL: /resource/record/:entityName/:recordId\n const recordMatch = urlPath.match(/^\\/resource\\/record\\/([^\\/]+)\\/(.+)$/);\n if (recordMatch) {\n const entityName = decodeURIComponent(recordMatch[1]);\n const recordId = decodeURIComponent(recordMatch[2]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const tabEntity = (tabConfig['Entity'] || tabConfig['entity']) as string | undefined;\n const tabRecordId = (tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return tabEntity?.toLowerCase() === entityName.toLowerCase() &&\n tabRecordId === recordId;\n }) || null;\n }\n\n // Check for view URL: /resource/view/:viewId\n const viewMatch = urlPath.match(/^\\/resource\\/view\\/([^\\/]+)$/);\n if (viewMatch) {\n const viewId = viewMatch[1];\n\n // Check if it's a dynamic view\n if (viewId === 'dynamic') {\n // Dynamic views include entity name in a different path\n return null; // Let the resolver handle dynamic views\n }\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabViewId = (tabConfig['viewId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'user views' && tabViewId === viewId;\n }) || null;\n }\n\n // Check for dashboard URL: /resource/dashboard/:dashboardId\n const dashboardMatch = urlPath.match(/^\\/resource\\/dashboard\\/(.+)$/);\n if (dashboardMatch) {\n const dashboardId = dashboardMatch[1];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabDashboardId = (tabConfig['dashboardId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'dashboards' && tabDashboardId === dashboardId;\n }) || null;\n }\n\n // Check for artifact URL: /resource/artifact/:artifactId\n const artifactMatch = urlPath.match(/^\\/resource\\/artifact\\/(.+)$/);\n if (artifactMatch) {\n const artifactId = artifactMatch[1];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabArtifactId = (tabConfig['artifactId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'artifacts' && tabArtifactId === artifactId;\n }) || null;\n }\n\n // Check for query URL: /resource/query/:queryId\n const queryMatch = urlPath.match(/^\\/resource\\/query\\/(.+)$/);\n if (queryMatch) {\n const queryId = queryMatch[1];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabQueryId = (tabConfig['queryId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'queries' && tabQueryId === queryId;\n }) || null;\n }\n\n return null;\n }\n\n /**\n * Build a shareable resource URL from tab data.\n * Uses app.Path for cleaner URLs (e.g., /app/data-explorer instead of /app/Data%20Explorer)\n */\n private async buildResourceUrl(tab: WorkspaceTab): Promise<string | null> {\n const config = tab.configuration || {};\n const resourceType = (config['resourceType'] as string | undefined)?.toLowerCase();\n const recordId = tab.resourceRecordId;\n const appName = config['appName'] as string | undefined;\n const navItemName = config['navItemName'] as string | undefined;\n const queryParams = config['queryParams'] as Record<string, string> | undefined;\n const isAppDefault = config['isAppDefault'] as boolean | undefined;\n const tabAppId = tab.applicationId;\n\n // Helper function to get app path for URL\n const getAppPath = (appIdOrName: string): string | null => {\n // First try by ID\n let app = this.appManager.GetAppById(appIdOrName);\n if (!app) {\n // Try by name\n app = this.appManager.GetAppByName(appIdOrName);\n }\n if (app) {\n // Prefer Path, fall back to Name for backwards compatibility\n return app.Path || app.Name;\n }\n return null;\n };\n\n // If this is an app nav item, build app-based URL\n if (appName && navItemName) {\n // Look up the app to get its Path\n const appPath = getAppPath(appName) || appName;\n let url = `/app/${encodeURIComponent(appPath)}/${encodeURIComponent(navItemName)}`;\n\n // Add query params if present\n if (queryParams && Object.keys(queryParams).length > 0) {\n const params = new URLSearchParams(queryParams);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n\n // If this is an app's default dashboard (no nav items), use app-level URL\n if (isAppDefault && appName) {\n const appPath = getAppPath(appName) || appName;\n return `/app/${encodeURIComponent(appPath)}`;\n }\n\n // Fallback: If tab belongs to a non-system app but doesn't have appName/navItemName,\n // try to reconstruct the URL from the ApplicationId and tab title\n if (tabAppId && tabAppId !== '__explorer') {\n const app = this.appManager.GetAppById(tabAppId);\n if (app) {\n // Prefer Path, fall back to Name\n const appPath = app.Path || app.Name;\n const navItems = await app.GetNavItems();\n\n // If app has nav items, try to find the matching one\n // Filter out dynamic nav items - they're generated from tab state and shouldn't affect URL building\n const staticNavItems = navItems.filter(item => !(item as { isDynamic?: boolean }).isDynamic);\n if (staticNavItems.length > 0) {\n const driverClass = config['driverClass'] as string | undefined;\n\n // Match by DriverClass for Custom resources (more reliable than title matching)\n // or by ResourceType + RecordID for other resource types\n const navItem = staticNavItems.find(item => {\n if (item.ResourceType === 'Custom' && item.DriverClass && driverClass) {\n return item.DriverClass === driverClass;\n }\n // For non-Custom resources, match by ResourceType + RecordID\n if (item.ResourceType && item.RecordID) {\n return item.ResourceType.toLowerCase() === resourceType && UUIDsEqual(item.RecordID, recordId);\n }\n return false;\n });\n\n if (navItem) {\n let url = `/app/${encodeURIComponent(appPath)}/${encodeURIComponent(navItem.Label)}`;\n\n // Add query params if present\n if (queryParams && Object.keys(queryParams).length > 0) {\n const params = new URLSearchParams(queryParams);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n // No matching nav item found - fall through to orphan resource handling\n }\n\n // Handle apps with no static nav items that show a default dashboard (custom resource type)\n if (staticNavItems.length === 0 && (!resourceType || resourceType === 'custom')) {\n // App has zero static nav items AND this is not an orphan resource (no resourceType or custom)\n // Use app-level URL - this handles apps that only have a default dashboard\n return `/app/${encodeURIComponent(appPath)}`;\n }\n // Fall through to orphan resource URL building below\n }\n }\n\n const entityName = (config['Entity'] || config['entity']) as string | undefined;\n const isDynamic = config['isDynamic'] as boolean | undefined;\n const extraFilter = (config['ExtraFilter'] || config['extraFilter']) as string | undefined;\n\n // For orphan resources (not tied to a specific nav item), use app-scoped URLs\n // Get the app path for the URL\n let appPath: string | null = null;\n if (tabAppId && tabAppId !== SYSTEM_APP_ID) {\n const app = this.appManager.GetAppById(tabAppId);\n if (app) {\n appPath = app.Path || app.Name;\n }\n }\n\n // If no app path found, try to use Home app as the default\n if (!appPath) {\n const homeApp = this.appManager.GetAppByName('Home');\n if (homeApp) {\n appPath = homeApp.Path || homeApp.Name;\n }\n }\n\n // Build app-scoped URLs (new pattern) if we have an app context\n if (appPath) {\n switch (resourceType) {\n case 'records':\n // /app/:appName/record/:entityName/:recordId\n if (entityName && recordId) {\n return `/app/${encodeURIComponent(appPath)}/record/${encodeURIComponent(entityName)}/${recordId}`;\n }\n break;\n\n case 'user views':\n // Check if it's a dynamic view\n if (isDynamic || recordId === 'dynamic') {\n // /app/:appName/view/dynamic/:entityName?ExtraFilter=...\n if (entityName) {\n let url = `/app/${encodeURIComponent(appPath)}/view/dynamic/${encodeURIComponent(entityName)}`;\n if (extraFilter) {\n url += `?ExtraFilter=${encodeURIComponent(extraFilter)}`;\n }\n return url;\n }\n } else if (recordId) {\n // /app/:appName/view/:viewId (saved view)\n return `/app/${encodeURIComponent(appPath)}/view/${recordId}`;\n }\n break;\n\n case 'dashboards':\n // /app/:appName/dashboard/:dashboardId\n if (recordId) {\n return `/app/${encodeURIComponent(appPath)}/dashboard/${recordId}`;\n }\n break;\n\n case 'artifacts':\n // /app/:appName/artifact/:artifactId\n if (recordId) {\n return `/app/${encodeURIComponent(appPath)}/artifact/${recordId}`;\n }\n break;\n\n case 'queries':\n // /app/:appName/query/:queryId\n if (recordId) {\n return `/app/${encodeURIComponent(appPath)}/query/${recordId}`;\n }\n break;\n\n case 'reports':\n // /app/:appName/report/:reportId\n if (recordId) {\n return `/app/${encodeURIComponent(appPath)}/report/${recordId}`;\n }\n break;\n\n case 'search results':\n // /app/:appName/search/:searchInput?Entity=...\n const searchInput = config['SearchInput'] as string | undefined;\n if (searchInput) {\n let url = `/app/${encodeURIComponent(appPath)}/search/${encodeURIComponent(searchInput)}`;\n if (entityName) {\n url += `?Entity=${encodeURIComponent(entityName)}`;\n }\n return url;\n }\n break;\n }\n }\n\n // Fallback to legacy routes (for backward compatibility during transition)\n switch (resourceType) {\n case 'records':\n if (entityName && recordId) {\n return `/resource/record/${encodeURIComponent(entityName)}/${recordId}`;\n }\n break;\n\n case 'user views':\n if (isDynamic || recordId === 'dynamic') {\n if (entityName) {\n let url = `/resource/view/dynamic/${encodeURIComponent(entityName)}`;\n if (extraFilter) {\n url += `?ExtraFilter=${encodeURIComponent(extraFilter)}`;\n }\n return url;\n }\n } else if (recordId) {\n return `/resource/view/${recordId}`;\n }\n break;\n\n case 'dashboards':\n if (recordId) {\n return `/resource/dashboard/${recordId}`;\n }\n break;\n\n case 'artifacts':\n if (recordId) {\n return `/resource/artifact/${recordId}`;\n }\n break;\n\n case 'queries':\n if (recordId) {\n return `/resource/query/${recordId}`;\n }\n break;\n }\n\n return null;\n }\n\n ngAfterViewInit(): void {\n // Layout initialization happens in TabContainerComponent\n }\n\n /**\n * Called when the first resource component finishes loading.\n * We accept subsequent calls to this method in ordre to ensure we are\n * not forever showing animation for loading - this can happen if there is\n * a race condition in components we DO NOT control, so while the naming\n * is intended to imply the goal it doesn't \"hurt\" to have this work this way\n */\n onFirstResourceLoadComplete(): void {\n this.waitingForFirstResource = false;\n this.loading = false;\n this.stopLoadingAnimation();\n this.cdr.detectChanges();\n }\n\n /**\n * Start the loading message cycling animation.\n * Messages cycle every 2.5 seconds without repeating until all are used.\n * Colors change every 5 seconds (every 2nd message cycle).\n * For themed periods: use theme colors/gradients from the start.\n * For standard theme: keep MJ blue throughout (no color changes).\n * Animation is randomly selected from pulse, spin, and pulse-spin.\n * Theme is selected based on current date and user's browser locale.\n */\n private startLoadingAnimation(): void {\n // Select the appropriate theme based on date and locale\n this.activeTheme = getActiveTheme();\n\n // Reset state\n this.usedMessageIndices = [0]; // Mark first message as used\n this.usedGradientIndices = [];\n this.loadingMessageIndex = 0;\n this.messageCycleCount = 0;\n\n // Initialize display with first message and initial color/gradient\n this.initializeLoadingDisplay();\n\n // Initialize animation based on theme configuration\n this.initializeAnimationFromTheme();\n\n // Start the animation sequence (if there are multiple steps)\n this.startAnimationSequence();\n\n // Start cycling every 2.5 seconds\n this.loadingMessageInterval = setInterval(() => {\n this.cycleToNextMessage();\n this.cdr.detectChanges();\n }, this.messageIntervalMs);\n }\n\n /**\n * Stop the loading message cycling animation.\n */\n private stopLoadingAnimation(): void {\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n this.loadingMessageInterval = null;\n }\n // Also clear any animation sequence timeout\n if (this.animationSequenceTimeout) {\n clearTimeout(this.animationSequenceTimeout);\n this.animationSequenceTimeout = null;\n }\n }\n\n /**\n * Initialize the loading display with first message and initial color/gradient.\n * For themed periods, applies theme styling from the start.\n * For standard theme, keeps MJ blue throughout.\n */\n private initializeLoadingDisplay(): void {\n // Set first message\n this.currentLoadingText = this.activeTheme.messages[0];\n\n if (this.activeTheme.staticColors) {\n // Standard theme: keep MJ blue, no gradient\n this.currentLoadingColor = this.activeTheme.colors[0];\n this.currentLoadingTextColor = '#757575'; // Default gray text\n this.currentLoadingGradient = null;\n } else {\n // Themed period: use theme colors and first gradient from the start\n this.currentLoadingColor = this.activeTheme.colors[0];\n this.currentLoadingTextColor = this.activeTheme.colors[0];\n\n // Set initial gradient if theme has gradients\n if (this.activeTheme.gradients && this.activeTheme.gradients.length > 0) {\n this.currentLoadingGradient = this.activeTheme.gradients[0];\n this.usedGradientIndices = [0];\n } else {\n this.currentLoadingGradient = null;\n }\n }\n }\n\n /**\n * Cycle to the next loading message, avoiding repeats until all are used.\n * Colors change every colorChangeEveryNMessages cycles (5 seconds).\n * For standard theme, colors remain static.\n */\n private cycleToNextMessage(): void {\n const messages = this.activeTheme.messages;\n this.messageCycleCount++;\n\n // If we've used all messages, reset the used list (but exclude current to avoid immediate repeat)\n if (this.usedMessageIndices.length >= messages.length) {\n this.usedMessageIndices = [this.loadingMessageIndex];\n }\n\n // Find a random unused message index\n const availableIndices = messages\n .map((_, i) => i)\n .filter(i => !this.usedMessageIndices.includes(i));\n\n if (availableIndices.length > 0) {\n const randomIndex = availableIndices[Math.floor(Math.random() * availableIndices.length)];\n this.usedMessageIndices.push(randomIndex);\n this.loadingMessageIndex = randomIndex;\n\n // Update the message\n this.currentLoadingText = this.activeTheme.messages[randomIndex];\n\n // Check if it's time to change colors (every 2nd message = every 5 seconds)\n // But only for non-static themes\n if (!this.activeTheme.staticColors && this.messageCycleCount % this.colorChangeEveryNMessages === 0) {\n this.cycleToNextColor();\n }\n }\n }\n\n /**\n * Cycle to the next color/gradient from the theme.\n * Alternates through gradients if available.\n */\n private cycleToNextColor(): void {\n // Cycle to next gradient if available\n if (this.activeTheme.gradients && this.activeTheme.gradients.length > 0) {\n const gradients = this.activeTheme.gradients;\n\n // If we've used all gradients, reset (but exclude current to avoid immediate repeat)\n if (this.usedGradientIndices.length >= gradients.length) {\n const lastUsed = this.usedGradientIndices[this.usedGradientIndices.length - 1];\n this.usedGradientIndices = [lastUsed];\n }\n\n // Find next gradient (simple rotation for gradients)\n const currentIndex = this.usedGradientIndices[this.usedGradientIndices.length - 1] ?? -1;\n const nextIndex = (currentIndex + 1) % gradients.length;\n this.usedGradientIndices.push(nextIndex);\n this.currentLoadingGradient = gradients[nextIndex];\n }\n\n // Also cycle text color through theme colors\n const colors = this.activeTheme.colors;\n if (colors.length > 1) {\n // Get a random color from the theme for text\n const randomIndex = Math.floor(Math.random() * colors.length);\n this.currentLoadingColor = colors[randomIndex];\n this.currentLoadingTextColor = colors[randomIndex];\n }\n }\n\n /**\n * Initialize animation configuration from the current theme.\n * Converts the theme's animation config (string or array) to a normalized sequence.\n */\n private initializeAnimationFromTheme(): void {\n this.currentAnimationIndex = 0;\n\n const themeAnimations = this.activeTheme.animations;\n\n if (!themeAnimations) {\n // No animation config - use random selection for non-standard themes\n if (this.activeTheme.id === 'standard') {\n // Standard theme defaults to pulse only\n this.animationSequence = [{ type: 'pulse' }];\n } else {\n // Random selection for themed holidays without explicit config\n const randomType = this.allAnimationTypes[\n Math.floor(Math.random() * this.allAnimationTypes.length)\n ];\n this.animationSequence = [{ type: randomType }];\n }\n } else if (typeof themeAnimations === 'string') {\n // Single animation type specified\n this.animationSequence = [{ type: themeAnimations }];\n } else {\n // Array of animation steps\n this.animationSequence = themeAnimations;\n }\n\n // Set initial animation\n if (this.animationSequence.length > 0) {\n this.currentLoadingAnimation = this.animationSequence[0].type;\n }\n }\n\n /**\n * Start the animation sequence, scheduling transitions between animation steps.\n */\n private startAnimationSequence(): void {\n // Clear any existing timeout\n if (this.animationSequenceTimeout) {\n clearTimeout(this.animationSequenceTimeout);\n this.animationSequenceTimeout = null;\n }\n\n this.currentAnimationIndex = 0;\n this.scheduleNextAnimationStep();\n }\n\n /**\n * Schedule the transition to the next animation step based on current step's duration.\n */\n private scheduleNextAnimationStep(): void {\n if (this.animationSequence.length <= 1) {\n // Only one step - no transitions needed\n return;\n }\n\n const currentStep = this.animationSequence[this.currentAnimationIndex];\n const durationMs = currentStep.durationMs;\n\n // If no duration specified (or 0), this step runs indefinitely\n if (!durationMs || durationMs <= 0) {\n return;\n }\n\n // Schedule transition to next step\n this.animationSequenceTimeout = setTimeout(() => {\n this.transitionToNextAnimation();\n }, durationMs);\n }\n\n /**\n * Transition to the next animation in the sequence.\n */\n private transitionToNextAnimation(): void {\n this.currentAnimationIndex++;\n\n if (this.currentAnimationIndex >= this.animationSequence.length) {\n // Sequence complete - stay on last animation\n return;\n }\n\n const nextStep = this.animationSequence[this.currentAnimationIndex];\n this.currentLoadingAnimation = nextStep.type;\n this.cdr.detectChanges();\n\n // Schedule the next transition if this step has a duration\n this.scheduleNextAnimationStep();\n }\n\n ngOnDestroy(): void {\n this.stopLoadingAnimation();\n this.subscriptions.forEach(sub => sub.unsubscribe());\n this.layoutManager.Destroy();\n\n // Clean up user menu\n this.userMenu?.Destroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Handle app switch from app switcher\n */\n async onAppSwitch(appId: string): Promise<void> {\n // Clear the system tab flag since we're switching to a real app\n this.isViewingSystemTab = false;\n\n // Show loading indicator in app switcher\n this.loadingAppId = appId;\n this.cdr.detectChanges();\n\n try {\n\n const app = this.appManager.GetAppById(appId);\n if (!app) {\n // Get app info from all system apps to show the name\n const systemApp = this.appManager.GetAllSystemApps().find(a => UUIDsEqual(a.ID, appId));\n const appName = systemApp?.Name || 'this application';\n\n // Clear loading indicator before showing dialog\n this.loadingAppId = null;\n this.cdr.detectChanges();\n\n // Show \"Add Application?\" dialog\n if (this.appAccessDialog) {\n this.appAccessDialog.show({\n type: 'not_installed',\n appName: appName,\n appId: appId\n });\n }\n return;\n }\n\n await this.appManager.SetActiveApp(appId);\n\n // Get the default nav item for this app (if any)\n const navItems = await app.GetNavItems();\n const defaultNavItem = navItems.find(item => item.isDefault);\n\n // Check if app has any tabs\n const appTabs = this.workspaceManager.GetAppTabs(appId);\n\n if (appTabs.length === 0) {\n // No tabs - create default tab (will trigger URL sync via workspace config subscription)\n const defaultTab = await app.CreateDefaultTab();\n if (defaultTab) {\n this.workspaceManager.OpenTab(defaultTab, app.GetColor());\n }\n } else if (defaultNavItem) {\n // App has tabs AND has a default nav item - try to find/create tab for default nav item\n // This ensures clicking the app icon always goes to the \"home\" of that app\n const defaultNavItemTab = this.findTabForDefaultNavItem(appTabs, defaultNavItem);\n\n if (defaultNavItemTab) {\n // Found existing tab for default nav item - activate it\n this.workspaceManager.SetActiveTab(defaultNavItemTab.id);\n const resourceUrl = await this.buildResourceUrl(defaultNavItemTab);\n if (resourceUrl) {\n this.router.navigateByUrl(resourceUrl, { replaceUrl: true });\n }\n } else {\n // No tab for default nav item - create one via NavigationService\n this.navigationService.OpenNavItem(appId, defaultNavItem, app.GetColor());\n }\n } else {\n // App has existing tabs but no default nav item - activate the first one\n const firstTab = appTabs[0];\n this.workspaceManager.SetActiveTab(firstTab.id);\n\n // The workspace configuration subscription will trigger URL sync\n // but we can also manually trigger it here to ensure immediate update\n const resourceUrl = await this.buildResourceUrl(firstTab);\n if (resourceUrl) {\n this.router.navigateByUrl(resourceUrl, { replaceUrl: true });\n }\n }\n } finally {\n // Clear loading indicator\n this.loadingAppId = null;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Find an existing tab that matches the default nav item\n */\n private findTabForDefaultNavItem(tabs: WorkspaceTab[], defaultNavItem: NavItem): WorkspaceTab | null {\n return tabs.find(tab => {\n const config = tab.configuration || {};\n\n // For Custom resource type, match by DriverClass\n if (defaultNavItem.ResourceType === 'Custom' && defaultNavItem.DriverClass) {\n return config['driverClass'] === defaultNavItem.DriverClass ||\n config['resourceTypeDriverClass'] === defaultNavItem.DriverClass;\n }\n\n // For other resource types, match by navItemName or by ResourceType + RecordID\n if (config['navItemName'] === defaultNavItem.Label) {\n return true;\n }\n\n if (defaultNavItem.ResourceType && defaultNavItem.RecordID) {\n const tabResourceType = (config['resourceType'] as string)?.toLowerCase();\n const tabRecordId = config['recordId'] || tab.resourceRecordId;\n return tabResourceType === defaultNavItem.ResourceType.toLowerCase() &&\n tabRecordId === defaultNavItem.RecordID;\n }\n\n return false;\n }) || null;\n }\n\n /**\n * Handle Nav Bar app icon click (single click switches to app)\n */\n onNavBarAppClick(app: BaseApplication, event: MouseEvent): void {\n // If shift key is held, force new tab\n if (event.shiftKey) {\n this.openNavBarAppInNewTab(app);\n } else {\n this.onAppSwitch(app.ID);\n }\n }\n\n /**\n * Handle Nav Bar app icon double-click (opens in new tab)\n */\n onNavBarAppDblClick(app: BaseApplication, event: MouseEvent): void {\n event.preventDefault();\n this.openNavBarAppInNewTab(app);\n }\n\n /**\n * Open a nav bar app's default content in a new tab\n */\n private async openNavBarAppInNewTab(app: BaseApplication): Promise<void> {\n // Create the default tab for this app with forceNewTab\n const tabRequest = await app.CreateDefaultTab();\n if (tabRequest) {\n // Set the app as active first if it isn't already\n if (!UUIDsEqual(this.activeApp?.ID, app.ID)) {\n await this.appManager.SetActiveApp(app.ID);\n }\n\n // Open in new tab by adding to workspace\n this.workspaceManager.OpenTab(tabRequest, app.GetColor());\n }\n }\n\n /**\n * Handle navigation item click with shift-key detection\n */\n onNavItemClick(event: NavItemClickEvent): void {\n if (!this.activeApp) {\n return;\n }\n\n const { item, shiftKey } = event;\n\n // Close mobile nav if open\n this.mobileNavOpen = false;\n\n // Use NavigationService with forceNewTab option if shift was pressed\n this.navigationService.OpenNavItem(\n this.activeApp.ID,\n item,\n this.activeApp.GetColor(),\n { forceNewTab: shiftKey }\n );\n }\n\n /**\n * Handle dismiss of a dynamic nav item (remove from recent stack)\n */\n onNavItemDismiss(item: NavItem): void {\n if (!this.activeApp) {\n return;\n }\n\n // Delegate to HomeApplication's RemoveDynamicNavItem if available\n const appWithRemove = this.activeApp as BaseApplication & {\n RemoveDynamicNavItem?: (item: NavItem) => void;\n };\n if (typeof appWithRemove.RemoveDynamicNavItem === 'function') {\n appWithRemove.RemoveDynamicNavItem(item);\n }\n }\n\n /**\n * Toggle mobile navigation drawer\n */\n toggleMobileNav(): void {\n this.mobileNavOpen = !this.mobileNavOpen;\n }\n\n /**\n * Close mobile navigation drawer\n */\n closeMobileNav(): void {\n this.mobileNavOpen = false;\n }\n\n /**\n * Toggle user menu visibility\n */\n toggleUserMenu(event: Event): void {\n event.stopPropagation();\n this.userMenuVisible = !this.userMenuVisible;\n\n if (this.userMenuVisible) {\n // Close menu when clicking outside\n const closeHandler = () => {\n this.userMenuVisible = false;\n document.removeEventListener('click', closeHandler);\n };\n setTimeout(() => {\n document.addEventListener('click', closeHandler);\n }, 0);\n }\n }\n\n /**\n * Initialize the user menu plugin system\n */\n private async initializeUserMenu(): Promise<void> {\n // Get the highest priority user menu implementation via ClassFactory\n this.userMenu = MJGlobal.Instance.ClassFactory.CreateInstance<BaseUserMenu>(BaseUserMenu);\n\n if (!this.userMenu) {\n console.error('No user menu implementation found');\n return;\n }\n\n // Initialize developer mode service\n if (this.userEntity) {\n await this.developerModeService.Initialize(this.userEntity);\n }\n\n // Build context for the menu\n const context: UserMenuContext = {\n user: new Metadata().CurrentUser,\n userEntity: this.userEntity!,\n shell: this as unknown as Record<string, unknown>,\n viewContainerRef: this.viewContainerRef,\n isDeveloper: this.developerModeService.IsDeveloper,\n developerModeEnabled: this.developerModeService.IsEnabled,\n currentApplication: this.activeApp as unknown as ApplicationInfoRef | null,\n workspaceManager: this.workspaceManager,\n authService: this.authBase,\n openSettings: () => this.openSettingsDialog(),\n themePreference: this.themeService.Preference,\n availableThemes: this.themeService.AvailableThemes,\n appliedTheme: this.themeService.AppliedTheme\n };\n\n // Initialize menu\n await this.userMenu.Initialize(context);\n\n // Get initial menu elements\n this.refreshMenuElements();\n\n // Subscribe to developer mode changes to refresh menu\n this.developerModeService.IsEnabled$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n // Update context and refresh menu\n if (this.userMenu) {\n this.userMenu.UpdateContext({\n developerModeEnabled: this.developerModeService.IsEnabled\n });\n }\n this.refreshMenuElements();\n this.cdr.detectChanges();\n });\n\n // Subscribe to theme preference changes to refresh menu\n this.themeService.Preference$.pipe(\n takeUntil(this.destroy$)\n ).subscribe((pref) => {\n if (this.userMenu) {\n this.userMenu.UpdateContext({\n themePreference: pref,\n availableThemes: this.themeService.AvailableThemes,\n appliedTheme: this.themeService.AppliedTheme\n });\n }\n this.refreshMenuElements();\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Refresh the user menu elements from the menu instance\n */\n private refreshMenuElements(): void {\n if (this.userMenu) {\n this.userMenuElements = this.userMenu.GetMenuElements();\n }\n }\n\n /**\n * Handle user menu item click\n */\n async onUserMenuItemClick(itemId: string): Promise<void> {\n if (!this.userMenu) return;\n\n const result = await this.userMenu.HandleItemClick(itemId);\n\n // Handle special signals from menu handlers\n if (result.message === 'toggle-dev-mode') {\n await this.developerModeService.Toggle();\n // Menu will refresh via the subscription above\n return;\n }\n\n if (result.message?.startsWith('select-theme-')) {\n const themeId = result.message.substring('select-theme-'.length);\n await this.themeService.SetTheme(themeId);\n // Explicitly update context after SetTheme completes, then fall through\n // to the standard refresh below (subscription also refreshes, but this\n // guarantees the menu updates even if the subscription's detectChanges\n // runs at an awkward point in Angular's change detection cycle)\n if (this.userMenu) {\n this.userMenu.UpdateContext({\n themePreference: this.themeService.Preference,\n availableThemes: this.themeService.AvailableThemes,\n appliedTheme: this.themeService.AppliedTheme\n });\n }\n }\n\n if (result.message === 'reset-layout') {\n await this.onResetLayout();\n return;\n }\n\n if (result.closeMenu) {\n this.userMenuVisible = false;\n }\n\n // Refresh menu elements (some items may have changed state)\n this.refreshMenuElements();\n this.cdr.detectChanges();\n }\n\n /**\n * Whether the currently applied theme is dark (used by the toggle switch in the template)\n */\n get IsDarkMode(): boolean {\n const theme = this.themeService.GetThemeDefinition(this.themeService.AppliedTheme);\n return theme?.BaseTheme === 'dark';\n }\n\n /**\n * Get user menu options for template\n */\n getUserMenuOptions() {\n return this.userMenu?.GetOptions();\n }\n\n /**\n * Get user display info for template\n */\n getUserDisplayInfo() {\n return this.userMenu?.GetUserDisplayInfo();\n }\n\n /**\n * Check if an element is a divider (for template)\n */\n isMenuDivider(element: UserMenuElement): boolean {\n return isUserMenuDivider(element);\n }\n\n /**\n * Cast element to UserMenuItem (for template type safety)\n * Call this only after checking !isMenuDivider(element)\n */\n asMenuItem(element: UserMenuElement): UserMenuItem {\n return element as UserMenuItem;\n }\n\n /**\n * Open the settings dialog\n */\n private openSettingsDialog(): void {\n this.settingsDialogService.open(this.viewContainerRef);\n }\n\n /**\n * Open Settings in a full-screen modal dialog\n */\n onSettings(): void {\n this.userMenuVisible = false;\n this.openSettingsDialog();\n }\n\n /**\n * Log current workspace configuration to console (debug)\n */\n onLogLayout(): void {\n const config = this.workspaceManager.GetConfiguration();\n console.log('📋 Workspace Configuration:', JSON.stringify(config, null, 2));\n console.log('📋 Workspace Configuration (object):', config);\n this.userMenuVisible = false;\n }\n\n /**\n * Reset workspace layout - clears all tabs and switches to single-resource mode\n */\n async onResetLayout(): Promise<void> {\n this.userMenuVisible = false;\n\n // Get current active app to create a fresh default tab\n const currentApp = this.activeApp;\n if (!currentApp) {\n console.warn('No active app to reset to');\n return;\n }\n\n // Create a fresh configuration with just one default tab\n const defaultTabRequest = await currentApp.CreateDefaultTab();\n if (!defaultTabRequest) {\n console.warn('Could not create default tab for app');\n return;\n }\n\n // Generate a new tab ID\n const newTabId = uuidv4();\n\n // Create minimal configuration with single tab (will trigger single-resource mode)\n const freshConfig = {\n version: 1,\n layout: {\n root: {\n type: 'row' as const,\n content: []\n }\n },\n activeTabId: newTabId,\n theme: 'light' as const,\n preferences: {\n tabPosition: 'top' as const,\n showTabIcons: true,\n autoSaveInterval: 5000\n },\n tabs: [{\n id: newTabId,\n applicationId: defaultTabRequest.ApplicationId,\n title: defaultTabRequest.Title,\n resourceTypeId: defaultTabRequest.ResourceTypeId || '',\n resourceRecordId: defaultTabRequest.ResourceRecordId || '',\n isPinned: false,\n sequence: 0,\n lastAccessedAt: new Date().toISOString(),\n configuration: defaultTabRequest.Configuration || {}\n }]\n };\n\n // Update workspace configuration\n this.workspaceManager.UpdateConfiguration(freshConfig);\n }\n\n /**\n * Logout user and clear authentication data\n */\n async onLogout(): Promise<void> {\n this.userMenuVisible = false;\n this.authBase.logout();\n localStorage.removeItem('auth');\n localStorage.removeItem('claims');\n }\n\n /**\n * Global keyboard shortcut handler\n * Cmd+/ (Mac) or Ctrl+/ (Windows) opens the command palette\n */\n @HostListener('document:keydown', ['$event'])\n handleGlobalKeyboardShortcuts(event: KeyboardEvent): void {\n // Skip if user is typing in an input/textarea\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return;\n }\n\n // Platform detection\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n const isCtrlOrCmd = isMac ? event.metaKey : event.ctrlKey;\n\n // Cmd+/ or Ctrl+/ opens command palette\n if (isCtrlOrCmd && event.key === '/') {\n event.preventDefault();\n event.stopPropagation();\n this.commandPaletteService.Open();\n }\n }\n\n /**\n * Load user avatar from database, auto-sync from auth provider if needed\n */\n private async loadUserAvatar(currentUserInfo: { ID: string; FirstLast?: string; Name?: string; Email?: string }): Promise<void> {\n try {\n const md = new Metadata();\n this.userName = currentUserInfo.FirstLast || currentUserInfo.Name || 'User';\n this.userEmail = currentUserInfo.Email || '';\n\n // Load the full MJUserEntity to access avatar fields\n const currentUserEntity = await md.GetEntityObject<MJUserEntity>('MJ: Users');\n await currentUserEntity.Load(currentUserInfo.ID);\n\n // Store reference for user menu\n this.userEntity = currentUserEntity;\n\n // Auto-sync avatar from auth provider if user has no avatar settings in DB\n if (!currentUserEntity.UserImageURL && !currentUserEntity.UserImageIconClass) {\n const synced = await this.syncAvatarFromAuthProvider(currentUserEntity);\n if (synced) {\n // Reload user entity to get saved values\n await currentUserEntity.Load(currentUserInfo.ID);\n }\n }\n\n // Load avatar for display (always from DB after potential sync)\n this.applyUserAvatar(currentUserEntity);\n } catch (error) {\n console.warn('Could not load user avatar:', error);\n // Use fallback\n this.userImageURL = '';\n this.userIconClass = null;\n }\n }\n\n /**\n * Syncs avatar from auth provider (Microsoft, Google, etc.)\n */\n private async syncAvatarFromAuthProvider(user: any): Promise<boolean> {\n try {\n // v3.0 API - Clean encapsulation! No provider-specific logic needed!\n // The provider handles whether it's Graph API, Auth0, or Okta internally\n const pictureUrl = await this.authBase.getProfilePictureUrl();\n\n if (pictureUrl) {\n return await this.userAvatarService.syncFromImageUrl(user, pictureUrl);\n }\n\n return false;\n } catch (error) {\n console.warn('Could not sync avatar from auth provider:', error);\n return false;\n }\n }\n\n /**\n * Apply user avatar to component state\n * Priority: UserImageURL > UserImageIconClass > default icon\n */\n private applyUserAvatar(user: any): void {\n if (user.UserImageURL) {\n this.userImageURL = user.UserImageURL;\n this.userIconClass = null;\n } else if (user.UserImageIconClass) {\n this.userIconClass = user.UserImageIconClass;\n this.userImageURL = '';\n } else {\n // Default fallback - show icon\n this.userImageURL = '';\n this.userIconClass = null;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Update browser tab title based on current app and active tab.\n * Format: \"Resource Name - App Name - MemberJunction\"\n */\n private updateBrowserTitle(config: WorkspaceConfiguration): void {\n // Find the active tab\n const activeTab = config.tabs?.find(tab => tab.id === config.activeTabId);\n\n // Get app name\n const appName = this.activeApp?.Name || null;\n\n // Get resource name from active tab\n let resourceName: string | null = null;\n if (activeTab) {\n resourceName = activeTab.title || null;\n }\n\n // Update title via TitleService\n this.titleService.setContext(appName, resourceName);\n }\n\n // ========================================\n // SEARCH FUNCTIONALITY\n // ========================================\n\n /**\n * Load searchable entities from metadata\n */\n private async loadSearchableEntities(): Promise<void> {\n const md = new Metadata();\n this.searchableEntities = md.Entities.filter((e) => e.AllowUserSearchAPI).sort((a, b) => a.Name.localeCompare(b.Name));\n if (this.searchableEntities.length > 0) {\n this.selectedEntity = this.searchableEntities[0];\n }\n }\n\n /**\n * Toggle search popup visibility\n */\n toggleSearch(): void {\n this.isSearchOpen = !this.isSearchOpen;\n\n // Focus on search input when opened\n if (this.isSearchOpen) {\n setTimeout(() => {\n if (this.searchInput && this.searchInput.nativeElement) {\n this.searchInput.nativeElement.focus();\n }\n }, 100);\n }\n }\n\n /**\n * Close search popup\n */\n closeSearch(): void {\n this.isSearchOpen = false;\n }\n\n /**\n * Handle search submission\n */\n onSearch(event: Event): void {\n if (!this.searchInput) {\n return;\n }\n\n const inputValue = this.searchInput.nativeElement.value;\n if (inputValue && inputValue.length > 0 && inputValue.trim().length > 2) {\n this.searchInput.nativeElement.value = ''; // Clear input\n this.isSearchOpen = false; // Close search popup\n\n // Navigate to search results\n if (this.selectedEntity) {\n this.router.navigate(['resource', 'search', inputValue], { queryParams: { Entity: this.selectedEntity.Name } });\n }\n } else {\n // Show warning notification\n MJGlobal.Instance.RaiseEvent({\n component: this,\n event: MJEventType.DisplaySimpleNotificationRequest,\n eventCode: \"\",\n args: {\n message: 'Please enter at least 3 characters to search',\n style: 'warning',\n DisplayDuration: 1500\n }\n });\n }\n }\n\n // ========================================\n // NOTIFICATION FUNCTIONALITY\n // ========================================\n\n /**\n * Show notifications page as a tab\n */\n showNotifications(): void {\n MJGlobal.Instance.RaiseEvent({\n event: MJEventType.ComponentEvent,\n component: this,\n eventCode: EventCodes.ViewNotifications,\n args: {}\n });\n\n // Open notifications in a tab\n // Use 'Custom' resource type with explicit driverClass to load NotificationsResource component\n this.tabService.OpenTab({\n ApplicationId: SYSTEM_APP_ID,\n Title: 'Notifications',\n Configuration: {\n resourceType: 'Custom',\n driverClass: 'NotificationsResource',\n route: 'notifications'\n },\n IsPinned: false\n });\n }\n\n // ========================================\n // APP ACCESS ERROR HANDLING\n // ========================================\n\n /**\n * Handle app access error by showing the appropriate dialog based on the access check result.\n * IMPORTANT: This keeps the loading screen visible and does NOT navigate to any app\n * until the user makes a decision in the dialog.\n * @param appPath The app path from the URL that the user tried to access\n * @param availableApps The list of apps the user has access to (for fallback)\n */\n private async handleAppAccessError(appPath: string, availableApps: BaseApplication[]): Promise<void> {\n // Prevent showing the dialog multiple times for the same app path\n // This can happen when the applications$ observable emits multiple times during reload\n if (this.pendingAppPath === appPath) {\n return;\n }\n\n const accessResult = this.appManager.CheckAppAccess(appPath);\n this.pendingAppPath = appPath;\n\n LogStatus(`App access check for \"${appPath}\": ${accessResult.status} - ${accessResult.message}`);\n\n const dialogConfig = this.mapAccessResultToDialogConfig(accessResult);\n\n // IMPORTANT: Keep loading screen visible while dialog is shown\n // Do NOT set any active app or create any tabs yet\n // The loading screen stays visible because we haven't called onFirstResourceLoadComplete\n\n // Show the dialog on top of the loading screen\n // Use setTimeout to ensure the dialog component is ready after view init\n setTimeout(() => {\n if (this.appAccessDialog) {\n this.appAccessDialog.show(dialogConfig);\n } else {\n // Fallback if dialog not available - redirect to first app\n console.warn('App access dialog not available, redirecting to first app');\n this.redirectToFirstApp(availableApps);\n }\n }, 0);\n }\n\n /**\n * Map an AppAccessResult to the dialog configuration\n */\n private mapAccessResultToDialogConfig(accessResult: AppAccessResult): AppAccessDialogConfig {\n switch (accessResult.status) {\n case 'not_found':\n return {\n type: 'not_found',\n appName: accessResult.appName\n };\n\n case 'inactive':\n return {\n type: 'inactive',\n appName: accessResult.appName,\n appId: accessResult.appId\n };\n\n case 'not_installed':\n return {\n type: 'not_installed',\n appName: accessResult.appName,\n appId: accessResult.appId\n };\n\n case 'disabled':\n return {\n type: 'disabled',\n appName: accessResult.appName,\n appId: accessResult.appId\n };\n\n default:\n // 'accessible' shouldn't reach here, but handle it as a generic error\n return {\n type: 'no_access',\n appName: accessResult.appName\n };\n }\n }\n\n /**\n * Handle when user has no apps available at all\n */\n private async handleNoAppsAvailable(): Promise<void> {\n LogStatus('User has no applications available');\n\n // Stop loading animation and show the dialog\n this.stopLoadingAnimation();\n this.loading = false;\n this.cdr.detectChanges();\n\n setTimeout(() => {\n if (this.appAccessDialog) {\n this.appAccessDialog.show({ type: 'no_apps' });\n }\n }, 0);\n }\n\n /**\n * Handle Golden Layout initialization failure\n */\n handleLayoutError(): void {\n LogStatus('Golden Layout initialization failed');\n\n const availableApps = this.appManager.GetAllApps();\n if (availableApps.length > 0) {\n setTimeout(() => {\n if (this.appAccessDialog) {\n this.appAccessDialog.show({ type: 'layout_error' });\n } else {\n // Direct redirect if dialog not available\n this.redirectToFirstApp(availableApps);\n }\n }, 0);\n }\n }\n\n /**\n * Handle dialog result (install, enable, or redirect)\n */\n async onAppAccessDialogResult(result: AppAccessDialogResult): Promise<void> {\n const availableApps = this.appManager.GetAllApps();\n\n switch (result.action) {\n case 'install':\n if (result.appId) {\n await this.installAndNavigateToApp(result.appId);\n }\n break;\n\n case 'enable':\n if (result.appId) {\n await this.enableAndNavigateToApp(result.appId);\n }\n break;\n\n case 'redirect':\n case 'dismissed':\n default:\n this.redirectToFirstApp(availableApps);\n break;\n }\n }\n\n /**\n * Install an app for the user and navigate to it\n */\n private async installAndNavigateToApp(appId: string): Promise<void> {\n // Clear pendingAppPath to allow fresh handling after installation\n this.pendingAppPath = null;\n\n try {\n const userApp = await this.appManager.InstallAppForUser(appId);\n\n if (userApp) {\n // Force refresh the app list to ensure the new app is in the observable\n await this.appManager.ReloadUserApplications();\n\n // App added successfully - wait for observable to sync then navigate\n await this.waitForAppAndNavigate(appId);\n\n } else {\n \n console.error('[ShellComponent] Failed to add application');\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n } catch (error) {\n console.error('Error adding app:', error);\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n }\n\n /**\n * Enable a disabled app for the user and navigate to it\n */\n private async enableAndNavigateToApp(appId: string): Promise<void> {\n try {\n const success = await this.appManager.EnableAppForUser(appId);\n\n if (success) {\n // App enabled successfully - wait for observable to sync then navigate\n await this.waitForAppAndNavigate(appId);\n } else {\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n } catch (error) {\n console.error('Error enabling app:', error);\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n }\n\n /**\n * Wait for an app to appear in the applications observable and then navigate to it.\n * This handles the async nature of observable updates after install/enable.\n */\n private async waitForAppAndNavigate(appId: string, maxWaitMs: number = 3000): Promise<void> {\n const startTime = Date.now();\n const pollInterval = 100;\n\n // Poll for the app to appear in the observable\n while (Date.now() - startTime < maxWaitMs) {\n const app = this.appManager.GetAppById(appId);\n if (app) {\n await this.navigateToApp(app);\n this.appAccessDialog?.completeProcessing();\n return;\n }\n // Wait a bit before checking again\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n\n // Timeout - try to get from system apps as fallback\n const systemApp = this.appManager.GetAllSystemApps().find(a => UUIDsEqual(a.ID, appId));\n if (systemApp) {\n await this.navigateToApp(systemApp);\n this.appAccessDialog?.completeProcessing();\n } else {\n console.warn(`[ShellComponent] App ${appId} not found after waiting, redirecting to first app`);\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n }\n\n /**\n * Navigate to a specific app and create its default tab\n */\n private async navigateToApp(app: BaseApplication): Promise<void> {\n await this.appManager.SetActiveApp(app.ID);\n\n const existingTabs = this.workspaceManager.GetAppTabs(app.ID);\n if (existingTabs.length === 0) {\n const tabRequest = await app.CreateDefaultTab();\n if (tabRequest) {\n this.tabService.OpenTab(tabRequest);\n }\n }\n\n // Update URL to reflect the new app\n const appPath = app.Path || app.Name;\n this.router.navigateByUrl(`/app/${encodeURIComponent(appPath)}`, { replaceUrl: true });\n }\n\n /**\n * Redirect to the first available app (fallback)\n */\n /** Case-insensitive UUID check whether an app is the currently active app. */\n public IsActiveApp(app: BaseApplication): boolean {\n return UUIDsEqual(app.ID, this.activeApp?.ID);\n }\n\n private async redirectToFirstApp(apps: BaseApplication[]): Promise<void> {\n if (apps.length > 0) {\n const firstApp = apps[0];\n await this.navigateToApp(firstApp);\n } else {\n // No apps available - this shouldn't happen, but handle gracefully\n this.loading = false;\n this.cdr.detectChanges();\n }\n }\n}\n","<div class=\"shell-container\" [class.hidden]=\"loading\" [class.tabs-visible]=\"tabBarVisible\" kendoDialogContainer>\n <!-- Header -->\n <header class=\"shell-header\">\n <!-- MJ Logo -->\n <div class=\"mj-logo\" title=\"MemberJunction\"></div>\n\n <!-- Mobile Hamburger Button -->\n <button class=\"hamburger-btn\" (click)=\"toggleMobileNav()\" title=\"Menu\">\n <i class=\"fa-solid fa-bars\"></i>\n </button>\n\n <!-- Nav Bar Apps: Left of App Switcher -->\n @if (leftOfSwitcherApps.length > 0) {\n <div class=\"nav-bar-apps left-of-switcher\">\n @for (app of leftOfSwitcherApps; track app) {\n <button\n class=\"nav-bar-app-btn\"\n [class.active]=\"IsActiveApp(app)\"\n [title]=\"app.Name\"\n [style.--app-color]=\"app.GetColor()\"\n (click)=\"onNavBarAppClick(app, $event)\"\n (dblclick)=\"onNavBarAppDblClick(app, $event)\">\n <i [class]=\"app.Icon\"></i>\n </button>\n }\n </div>\n }\n\n <!-- App Switcher -->\n <mj-app-switcher\n [activeApp]=\"activeApp\"\n [isViewingSystemTab]=\"isViewingSystemTab\"\n [loadingAppId]=\"loadingAppId\"\n (appSelected)=\"onAppSwitch($event)\">\n </mj-app-switcher>\n\n <!-- App Navigation (desktop only) -->\n @if (activeApp) {\n <mj-app-nav\n class=\"desktop-nav\"\n [app]=\"activeApp\"\n (navItemClick)=\"onNavItemClick($event)\"\n (navItemDismiss)=\"onNavItemDismiss($event)\">\n </mj-app-nav>\n }\n\n <!-- Spacer -->\n <div class=\"spacer\"></div>\n\n <!-- Actions (search, notifications, user menu) -->\n <div class=\"header-actions\">\n <button class=\"icon-btn desktop-only search-toggle-btn\" title=\"Search\" (click)=\"toggleSearch()\">\n <i class=\"fa-solid fa-search\"></i>\n </button>\n <button class=\"icon-btn desktop-only notification-btn\" title=\"Notifications\" (click)=\"showNotifications()\">\n <i class=\"fa-solid fa-bell\"></i>\n @if (unreadNotificationCount > 0) {\n <span class=\"notification-badge\">\n {{ unreadNotificationCount > 99 ? '99+' : unreadNotificationCount }}\n </span>\n }\n </button>\n\n <!-- Nav Bar Apps: Left of User Menu -->\n @if (leftOfUserMenuApps.length > 0) {\n <div class=\"nav-bar-apps left-of-user-menu\">\n @for (app of leftOfUserMenuApps; track app) {\n <button\n class=\"nav-bar-app-btn\"\n [class.active]=\"IsActiveApp(app)\"\n [title]=\"app.Name\"\n [style.--app-color]=\"app.GetColor()\"\n (click)=\"onNavBarAppClick(app, $event)\"\n (dblclick)=\"onNavBarAppDblClick(app, $event)\">\n <i [class]=\"app.Icon\"></i>\n </button>\n }\n </div>\n }\n\n <div class=\"user-menu\">\n <button class=\"avatar-btn\" (click)=\"toggleUserMenu($event)\">\n @if (userImageURL) {\n <img [src]=\"userImageURL\" alt=\"User avatar\" class=\"avatar-img\" />\n } @else {\n <div class=\"icon-fallback\">\n <i [class]=\"userIconClass || 'fa-solid fa-user'\"></i>\n </div>\n }\n </button>\n <!-- User Context Menu (Dynamic) -->\n @if (userMenuVisible) {\n <div class=\"user-context-menu\"\n [class.menu-fade]=\"getUserMenuOptions()?.animationStyle === 'fade'\"\n [class.menu-slide]=\"getUserMenuOptions()?.animationStyle === 'slide'\">\n <!-- User Header -->\n @if (getUserMenuOptions()?.showUserName) {\n <div class=\"user-menu-header\">\n <div class=\"user-info\">\n <span class=\"user-name\">{{ getUserDisplayInfo()?.name || userName }}</span>\n @if (getUserMenuOptions()?.showUserEmail && getUserDisplayInfo()?.email) {\n <span class=\"user-email\">\n {{ getUserDisplayInfo()?.email }}\n </span>\n }\n </div>\n </div>\n <div class=\"user-menu-divider\"></div>\n }\n <!-- Dynamic Menu Items -->\n @for (element of userMenuElements; track element) {\n <!-- Divider -->\n @if (isMenuDivider(element)) {\n <div class=\"user-menu-divider\"></div>\n }\n <!-- Menu Item -->\n @if (!isMenuDivider(element)) {\n @if (asMenuItem(element); as item) {\n @if (item.id === 'toggle-theme') {\n <div class=\"user-menu-item theme-toggle-item\"\n [title]=\"item.tooltip || ''\"\n (click)=\"onUserMenuItemClick(item.id)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"menu-label\">{{ item.label }}</span>\n <div class=\"theme-toggle-track\" [class.dark]=\"IsDarkMode\">\n <div class=\"theme-toggle-thumb\">\n <i [class]=\"IsDarkMode ? 'fa-solid fa-moon' : 'fa-solid fa-sun'\" class=\"theme-toggle-icon\"></i>\n </div>\n </div>\n </div>\n } @else {\n <div class=\"user-menu-item\"\n [class.disabled]=\"!item.enabled\"\n [class.danger]=\"item.cssClass === 'danger'\"\n [style.color]=\"item.color || null\"\n [title]=\"item.tooltip || ''\"\n (click)=\"item.enabled && onUserMenuItemClick(item.id)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"menu-label\">{{ item.label }}</span>\n @if (item.shortcut) {\n <span class=\"menu-shortcut\">{{ item.shortcut }}</span>\n }\n </div>\n }\n }\n }\n }\n </div>\n }\n </div>\n </div>\n </header>\n\n <!-- Search Popup -->\n @if (isSearchOpen) {\n <div class=\"search-popup-overlay\" (click)=\"closeSearch()\"></div>\n }\n <div class=\"search-popup\" [class.open]=\"isSearchOpen\">\n <div class=\"search-popup-content\" (click)=\"$event.stopPropagation()\">\n <kendo-dropdownlist\n [data]=\"searchableEntities\"\n textField=\"Name\"\n valueField=\"ID\"\n class=\"search-entity-dropdown\"\n [(ngModel)]=\"selectedEntity\">\n </kendo-dropdownlist>\n <input\n type=\"text\"\n #searchInput\n placeholder=\"Search...\"\n kendoTextBox\n class=\"search-input\"\n (keydown.enter)=\"onSearch($event)\"\n />\n <button class=\"search-submit-btn\" (click)=\"onSearch($event)\" title=\"Search\">\n <i class=\"fa-solid fa-search\"></i>\n </button>\n </div>\n </div>\n\n <!-- Mobile Navigation Drawer -->\n @if (mobileNavOpen) {\n <div class=\"mobile-nav-overlay\" (click)=\"closeMobileNav()\"></div>\n }\n <div class=\"mobile-nav-drawer\" [class.open]=\"mobileNavOpen\">\n <div class=\"mobile-nav-header\">\n <span>Navigation</span>\n <button class=\"close-btn\" (click)=\"closeMobileNav()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n @if (activeApp) {\n <div class=\"mobile-nav-content\">\n <div class=\"mobile-nav-section-title\">{{ activeApp.Name }}</div>\n <mj-app-nav\n [app]=\"activeApp\"\n (navItemClick)=\"onNavItemClick($event)\"\n (navItemDismiss)=\"onNavItemDismiss($event)\">\n </mj-app-nav>\n </div>\n }\n <div class=\"mobile-nav-footer\">\n <button class=\"mobile-nav-action\" title=\"Search\" (click)=\"toggleSearch(); closeMobileNav()\">\n <i class=\"fa-solid fa-search\"></i>\n <span>Search</span>\n </button>\n <button class=\"mobile-nav-action\" title=\"Notifications\" (click)=\"showNotifications(); closeMobileNav()\">\n <i class=\"fa-solid fa-bell\"></i>\n <span>Notifications</span>\n @if (unreadNotificationCount > 0) {\n <span class=\"notification-badge-mobile\">\n {{ unreadNotificationCount > 99 ? '99+' : unreadNotificationCount }}\n </span>\n }\n </button>\n </div>\n </div>\n\n <!-- Tab Container - with dynamic tab bar visibility -->\n <mj-tab-container\n [class.hide-tab-bar]=\"!tabBarVisible\"\n (firstResourceLoadComplete)=\"onFirstResourceLoadComplete()\"\n (layoutInitError)=\"handleLayoutError()\">\n </mj-tab-container>\n</div>\n\n<!-- Loading State -->\n@if (loading) {\n <div class=\"shell-loading\">\n <mj-loading\n [text]=\"currentLoadingText\"\n [textColor]=\"currentLoadingTextColor\"\n [logoColor]=\"currentLoadingColor\"\n [logoGradient]=\"currentLoadingGradient\"\n [animation]=\"currentLoadingAnimation\"\n size=\"large\">\n </mj-loading>\n </div>\n}\n\n<!-- App Access Error Dialog -->\n<mj-app-access-dialog\n #appAccessDialog\n (result)=\"onAppAccessDialogResult($event)\">\n</mj-app-access-dialog>\n\n<!-- Command Palette -->\n<mj-command-palette (AppSelected)=\"onAppSwitch($event)\"></mj-command-palette>\n"]}
1
+ {"version":3,"file":"shell.component.js","sourceRoot":"","sources":["../../../src/lib/shell/shell.component.ts","../../../src/lib/shell/shell.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, ViewContainerRef, ViewChild, ElementRef, HostListener } from '@angular/core';\nimport { ActivatedRoute, Router, NavigationEnd } from '@angular/router';\nimport { Subscription, combineLatest, Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport {\n ApplicationManager,\n WorkspaceStateManager,\n GoldenLayoutManager,\n BaseApplication,\n TabService,\n WorkspaceConfiguration,\n WorkspaceTab,\n AppAccessResult,\n NavItem\n} from '@memberjunction/ng-base-application';\nimport { Metadata, EntityInfo, LogStatus, StartupManager, CompositeKey } from '@memberjunction/core';\nimport { MJEventType, MJGlobal, uuidv4 , UUIDsEqual } from '@memberjunction/global';\nimport { EventCodes, NavigationService, SYSTEM_APP_ID, TitleService, DeveloperModeService, ThemeService } from '@memberjunction/ng-shared';\nimport { LogoGradient } from '@memberjunction/ng-shared-generic';\nimport { NavItemClickEvent } from './components/header/app-nav.component';\nimport { MJAuthBase } from '@memberjunction/ng-auth-services';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UserAvatarService } from '@memberjunction/ng-user-avatar';\nimport { SettingsDialogService } from './services/settings-dialog.service';\nimport { LoadingTheme, LoadingAnimationType, AnimationStep, getActiveTheme } from './loading-themes';\nimport { AppAccessDialogComponent, AppAccessDialogConfig, AppAccessDialogResult } from './components/dialogs/app-access-dialog.component';\nimport { BaseUserMenu, UserMenuElement, UserMenuItem, UserMenuContext, isUserMenuDivider, ApplicationInfoRef } from '../user-menu';\nimport { MJUserEntity } from '@memberjunction/core-entities';\nimport { CommandPaletteService } from '../command-palette/command-palette.service';\n\n/**\n * Main shell component for the new Explorer UX.\n *\n * Provides:\n * - App-centric header with app switcher and nav items\n * - Golden Layout-based tab container\n * - Unified workspace state management\n */\n@Component({\n standalone: false,\n selector: 'mj-shell',\n templateUrl: './shell.component.html',\n styleUrls: ['./shell.component.css']\n})\nexport class ShellComponent implements OnInit, OnDestroy, AfterViewInit {\n private subscriptions: Subscription[] = [];\n private urlBasedNavigation = false; // Track if we're loading from a URL\n private initialNavigationComplete = false; // Track if initial navigation has completed\n private firstUrlSync = true; // Track if this is the first URL sync (for replaceUrl behavior)\n\n activeApp: BaseApplication | null = null;\n loading = true;\n initialized = false;\n private waitingForFirstResource = false;\n tabBarVisible = true; // Controlled by workspace manager\n userMenuVisible = false; // User avatar context menu\n mobileNavOpen = false; // Mobile navigation drawer\n unreadNotificationCount = 0; // Notification badge count\n isViewingSystemTab = false; // True when viewing a resource tab (not associated with a registered app)\n loadingAppId: string | null = null; // ID of app currently being loaded (for app switcher loading indicator)\n\n // Loading animation state\n private loadingMessageInterval: ReturnType<typeof setInterval> | null = null;\n private loadingMessageIndex = 0;\n private usedMessageIndices: number[] = [];\n private usedGradientIndices: number[] = [];\n private messageCycleCount = 0; // Track message cycles for color changes\n private activeTheme: LoadingTheme;\n private readonly messageIntervalMs = 2500; // 2.5 seconds per message\n private readonly colorChangeEveryNMessages = 2; // Change color every 2 messages (5 seconds)\n // All available animation types (used for random selection when theme doesn't specify)\n private readonly allAnimationTypes: LoadingAnimationType[] = ['pulse', 'spin', 'bounce', 'pulse-spin'];\n // Animation sequencing\n private animationSequence: AnimationStep[] = [];\n private currentAnimationIndex = 0;\n private animationSequenceTimeout: ReturnType<typeof setTimeout> | null = null;\n // Loading recovery reset\n ShowResetOption = false;\n private loadingResetTimeout: ReturnType<typeof setTimeout> | null = null;\n private readonly loadingResetDelayMs = 20_000; // 20 seconds before showing reset option\n currentLoadingText: string;\n currentLoadingColor: string;\n currentLoadingTextColor: string;\n currentLoadingGradient: LogoGradient | null;\n currentLoadingAnimation: 'pulse' | 'spin' | 'bounce' | 'pulse-spin' = 'pulse';\n\n // User avatar state\n userImageURL = '';\n userIconClass: string | null = null;\n userName = '';\n userEmail = '';\n private userEntity: MJUserEntity | null = null;\n\n // User menu plugin system\n private userMenu: BaseUserMenu | null = null;\n public userMenuElements: UserMenuElement[] = [];\n private destroy$ = new Subject<void>();\n\n // Search state\n isSearchOpen = false;\n searchableEntities: EntityInfo[] = [];\n selectedEntity: EntityInfo | null = null;\n @ViewChild('searchInput') searchInput!: ElementRef<HTMLInputElement>;\n\n // App access dialog\n @ViewChild('appAccessDialog') appAccessDialog!: AppAccessDialogComponent;\n private pendingAppPath: string | null = null; // Store the app path we tried to access\n\n /**\n * Get Nav Bar apps positioned to the left of the app switcher\n * Filters out apps that have HideNavBarIconWhenActive=true and are currently active\n */\n get leftOfSwitcherApps(): BaseApplication[] {\n return this.appManager.GetNavBarApps('Left of App Switcher')\n .filter(app => !(app.HideNavBarIconWhenActive && UUIDsEqual(app.ID, this.activeApp?.ID)));\n }\n\n /**\n * Get Nav Bar apps positioned to the left of the user menu\n * Filters out apps that have HideNavBarIconWhenActive=true and are currently active\n */\n get leftOfUserMenuApps(): BaseApplication[] {\n return this.appManager.GetNavBarApps('Left of User Menu')\n .filter(app => !(app.HideNavBarIconWhenActive && UUIDsEqual(app.ID, this.activeApp?.ID)));\n }\n\n constructor(\n private appManager: ApplicationManager,\n private workspaceManager: WorkspaceStateManager,\n private layoutManager: GoldenLayoutManager,\n private tabService: TabService,\n private navigationService: NavigationService,\n private route: ActivatedRoute,\n private router: Router,\n private authBase: MJAuthBase,\n private cdr: ChangeDetectorRef,\n private userAvatarService: UserAvatarService,\n private settingsDialogService: SettingsDialogService,\n private viewContainerRef: ViewContainerRef,\n private titleService: TitleService,\n public developerModeService: DeveloperModeService,\n private commandPaletteService: CommandPaletteService,\n private themeService: ThemeService\n ) {\n // Initialize theme immediately so loading UI shows correct colors from the start\n this.activeTheme = getActiveTheme();\n\n // Initialize animation based on theme configuration\n this.initializeAnimationFromTheme();\n\n // Set first message\n this.currentLoadingText = this.activeTheme.messages[0];\n\n if (this.activeTheme.staticColors) {\n // Standard theme: keep MJ blue, no gradient\n this.currentLoadingColor = this.activeTheme.colors[0];\n this.currentLoadingTextColor = '#757575'; // Default gray text\n this.currentLoadingGradient = null;\n } else {\n // Themed period: use theme colors and first gradient from the start\n this.currentLoadingColor = this.activeTheme.colors[0];\n this.currentLoadingTextColor = this.activeTheme.colors[0];\n\n // Set initial gradient if theme has gradients\n if (this.activeTheme.gradients && this.activeTheme.gradients.length > 0) {\n this.currentLoadingGradient = this.activeTheme.gradients[0];\n } else {\n this.currentLoadingGradient = null;\n }\n }\n }\n\n async ngOnInit(): Promise<void> {\n try {\n MJGlobal.Instance.GetEventListener(true).subscribe(async (loginEvent) => {\n if (loginEvent.event === MJEventType.LoggedIn) {\n if (this.authBase.initialPath === \"/\") {\n // Base route - no need to wait for NavigationEnd\n await this.initializeShell();\n }\n else {\n // Deep link route - wait for NavigationEnd to ensure router URL is correct\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n filter(() => !this.initialNavigationComplete)\n ).subscribe(async () => {\n this.initialNavigationComplete = true;\n await this.initializeShell();\n });\n }\n }\n });\n \n } catch (error) {\n console.error('Failed to initialize shell:', error);\n this.loading = false;\n }\n }\n\n async initializeShell(): Promise<void> {\n // Start the loading animation with cycling messages\n this.startLoadingAnimation();\n\n // Initialize application manager (subscribes to LoggedIn event)\n this.appManager.Initialize();\n\n await StartupManager.Instance.Startup(); \n\n // Get current user\n const md = new Metadata();\n const user = md.CurrentUser;\n if (!user) {\n throw new Error('No current user found');\n }\n\n // Check the current URL to determine if we're loading from a URL-based navigation\n const currentUrl = this.router.url;\n this.urlBasedNavigation = currentUrl.includes('/app/') || currentUrl.includes('/resource/');\n\n // Wait for workspace initialization to complete before allowing any tab operations\n await this.workspaceManager.Initialize(user.ID);\n\n // Subscribe to tab bar visibility changes\n this.subscriptions.push(\n this.workspaceManager.TabBarVisible.subscribe(visible => {\n this.tabBarVisible = visible;\n })\n );\n\n // Subscribe to unread notification count changes\n this.subscriptions.push(\n MJNotificationService.UnreadCount$.subscribe(count => {\n this.unreadNotificationCount = count;\n this.cdr.detectChanges();\n })\n );\n\n // Subscribe to active app changes\n this.subscriptions.push(\n this.appManager.ActiveApp.subscribe(async app => {\n this.activeApp = app;\n this.cdr.detectChanges();\n\n // Create default tab when app is activated ONLY if:\n // 1. App has no tabs yet\n // 2. We're not loading from a URL that will create its own tab\n if (app) {\n const existingTabs = this.workspaceManager.GetAppTabs(app.ID);\n\n if (existingTabs.length === 0) {\n // Check if we're loading from a URL that will create a tab\n const currentUrl = this.router.url;\n const hasResourceUrl = currentUrl.includes('/app/') ||\n currentUrl.includes('/resource/');\n\n // Only create default tab if we're NOT loading from a resource URL\n if (!hasResourceUrl) {\n const tabRequest = await app.CreateDefaultTab();\n if (tabRequest) {\n this.tabService.OpenTab(tabRequest);\n }\n }\n }\n }\n })\n );\n\n // Subscribe to applications loading - set app based on URL or default to first\n // Use combineLatest to wait for loading to complete before deciding there are no apps\n this.subscriptions.push(\n combineLatest([this.appManager.Applications, this.appManager.Loading]).subscribe(async ([apps, isLoading]) => {\n // Don't make decisions while still loading - wait for load to complete\n if (isLoading) {\n return;\n }\n\n // Handle the case where user has no apps at all (only after loading is complete)\n if (apps.length === 0) {\n await this.handleNoAppsAvailable();\n return;\n }\n\n // Check if URL specifies an app by parsing the browser URL\n const currentUrl = this.router.url;\n const appMatch = currentUrl.match(/\\/app\\/([^\\/]+)/);\n\n if (appMatch) {\n const routeAppPath = decodeURIComponent(appMatch[1]);\n // Find the app from the URL by Path (or Name for backwards compatibility)\n const urlApp = this.appManager.GetAppByPath(routeAppPath);\n\n if (urlApp) {\n // Set the app from URL - takes precedence over workspace restoration\n await this.appManager.SetActiveApp(urlApp.ID);\n\n // If the URL is just /app/:appName (no nav item), create default tab\n const hasNavItem = currentUrl.match(/\\/app\\/[^\\/]+\\/[^\\/]+/);\n\n if (!hasNavItem) {\n const existingTabs = this.workspaceManager.GetAppTabs(urlApp.ID);\n if (existingTabs.length === 0) {\n const tabRequest = await urlApp.CreateDefaultTab();\n if (tabRequest) {\n this.tabService.OpenTab(tabRequest);\n }\n }\n }\n\n return;\n } else {\n // App not found in user's list - check why and show appropriate dialog\n await this.handleAppAccessError(routeAppPath, apps);\n return;\n }\n }\n\n // Set default app if URL doesn't specify one AND no app is active yet\n const currentActiveApp = this.appManager.GetActiveApp();\n if (!appMatch && !currentActiveApp) {\n await this.appManager.SetActiveApp(apps[0].ID);\n }\n })\n );\n\n // Subscribe to tab open requests from TabService\n this.subscriptions.push(\n this.tabService.TabRequests.subscribe(async request => {\n await this.processTabRequest(request);\n })\n );\n\n // Replay any tab requests that were queued before we subscribed\n // This handles the case where ResourceResolver creates requests before shell is ready\n const queuedRequests = this.tabService.GetQueuedRequests();\n if (queuedRequests.length > 0) {\n for (const request of queuedRequests) {\n await this.processTabRequest(request);\n }\n this.tabService.ClearQueue();\n }\n\n // Clear urlBasedNavigation flag after initial setup completes\n // This must happen regardless of whether there were queued requests,\n // because apps with zero nav items create tabs directly (not via ResourceResolver)\n // and we still need URL sync to work for subsequent navigation\n if (this.urlBasedNavigation) {\n this.urlBasedNavigation = false;\n }\n\n // Subscribe to workspace configuration changes to sync URL and active app\n this.subscriptions.push(\n this.workspaceManager.Configuration.subscribe(async config => {\n if (config && this.initialized) {\n // Sync active app with active tab's application\n await this.syncActiveAppWithTab(config);\n this.syncUrlWithWorkspace(config);\n // Update browser tab title\n this.updateBrowserTitle(config);\n }\n })\n );\n\n // Subscribe to router navigation events (for browser back/forward)\n this.subscriptions.push(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd)\n ).subscribe(event => {\n if (this.initialized) {\n this.syncWorkspaceWithUrl(event.urlAfterRedirects || event.url);\n }\n })\n );\n\n // Check for deep link parameters on initialization\n this.handleDeepLink();\n\n // Load user avatar and initialize user menu\n await this.loadUserAvatar(user);\n await this.initializeUserMenu();\n\n // Listen for avatar updates from settings page\n this.subscriptions.push(\n MJGlobal.Instance.GetEventListener(false).subscribe(async (updateEvent) => {\n if (updateEvent.eventCode === EventCodes.AvatarUpdated) {\n const md = new Metadata();\n const currentUserInfo = md.CurrentUser;\n const userEntity = await md.GetEntityObject<any>('MJ: Users');\n await userEntity.Load(currentUserInfo.ID);\n this.applyUserAvatar(userEntity);\n }\n })\n );\n\n // Load searchable entities for search functionality\n await this.loadSearchableEntities();\n\n this.initialized = true;\n this.waitingForFirstResource = true;\n\n // Trigger initial URL sync: the Configuration BehaviorSubject already emitted\n // its value when the shell subscribed (line above), but this.initialized was false\n // at that point so syncUrlWithWorkspace() was skipped. Now that we're initialized,\n // manually trigger the first URL sync to set the browser URL from workspace state.\n const initConfig = this.workspaceManager.GetConfiguration();\n if (initConfig && initConfig.activeTabId) {\n await this.syncActiveAppWithTab(initConfig);\n this.syncUrlWithWorkspace(initConfig);\n }\n\n // Force change detection to sync Angular's expected values after all async\n // state changes (apps loaded, searchableEntities populated, etc.) to prevent\n // NG0100 ExpressionChangedAfterItHasBeenCheckedError in dev mode\n this.cdr.detectChanges();\n }\n\n /**\n * Handle deep links from URL\n * Resource URLs like /resource/record/Companies/123 are handled by ResourceResolver\n * Legacy ?tab= params are supported for backward compatibility\n */\n private handleDeepLink(): void {\n const queryParams = this.route.snapshot.queryParams;\n const tabParam = queryParams['tab'];\n\n // Legacy support for ?tab= parameters\n if (tabParam) {\n const tabIds = Array.isArray(tabParam) ? tabParam : [tabParam];\n if (tabIds.length > 0) {\n this.workspaceManager.SetActiveTab(tabIds[0]);\n }\n }\n\n // Note: Resource URLs like /resource/record/EntityName/123 are automatically\n // handled by the ResourceResolver which raises MJ events that the workspace\n // manager listens to. No additional handling needed here.\n }\n\n /**\n * Process a tab request (from subscription or replay)\n */\n private async processTabRequest(request: any): Promise<void> {\n const app = this.appManager.GetAppById(request.ApplicationId);\n const appColor = app?.GetColor() || '#757575';\n\n // Determine if this is a URL-based tab request\n // URL-based tabs have appName/resourceType BUT NOT isAppDefault\n // (isAppDefault indicates workspace restoration, not URL navigation)\n const isUrlBasedTab = (request.Configuration?.appName || request.Configuration?.resourceType) &&\n !request.Configuration?.isAppDefault;\n\n const currentActiveApp = this.appManager.GetActiveApp();\n\n // Only set the app as active if:\n // 1. We're initialized (past the startup phase)\n // 2. App is different from current\n // 3. Either NOT in URL-based navigation mode, OR this IS a URL-based tab\n const shouldSetActiveApp = this.initialized &&\n app &&\n !UUIDsEqual(currentActiveApp?.ID, request.ApplicationId) &&\n (!this.urlBasedNavigation || isUrlBasedTab);\n\n if (shouldSetActiveApp) {\n await this.appManager.SetActiveApp(request.ApplicationId);\n }\n\n this.workspaceManager.OpenTab(request, appColor);\n }\n\n /**\n * Sync active app with the active tab's application\n * Called when workspace configuration changes (e.g., user clicks on a tab in Golden Layout)\n */\n private async syncActiveAppWithTab(config: WorkspaceConfiguration): Promise<void> {\n if (!config.activeTabId) {\n this.titleService.reset();\n return;\n }\n\n // Find the active tab\n const activeTab = config.tabs?.find(tab => tab.id === config.activeTabId);\n if (!activeTab) {\n this.titleService.reset();\n return;\n }\n\n // Get the tab's application ID\n const tabAppId = activeTab.applicationId;\n if (!tabAppId) {\n this.titleService.setResourceName(activeTab.title || null);\n return;\n }\n\n // Check if this is a system tab (not associated with a registered app)\n if (tabAppId === SYSTEM_APP_ID) {\n this.isViewingSystemTab = true;\n this.cdr.detectChanges();\n\n // Don't try to set active app - SYSTEM_APP_ID has no registered app\n // Update browser title with just the tab title (no app context)\n this.titleService.setContext(null, activeTab.title || 'Explorer');\n return;\n }\n\n // Not a system tab - clear the flag\n this.isViewingSystemTab = false;\n this.cdr.detectChanges();\n\n // Check if active app needs to be updated\n const currentActiveApp = this.appManager.GetActiveApp();\n if (!UUIDsEqual(currentActiveApp?.ID, tabAppId)) {\n // Update the active app to match the tab's application\n await this.appManager.SetActiveApp(tabAppId);\n }\n\n // Update browser title with app and tab context\n const app = this.appManager.GetAppById(tabAppId);\n const appName = app?.Name || null;\n const tabTitle = activeTab.title || null;\n this.titleService.setContext(appName, tabTitle);\n }\n\n /**\n * Sync URL with active tab's resource\n */\n private async syncUrlWithWorkspace(config: WorkspaceConfiguration): Promise<void> {\n // Don't sync URL during URL-based navigation initialization\n if (this.urlBasedNavigation) {\n return;\n }\n\n if (!config.activeTabId) {\n return;\n }\n\n // Find the active tab\n const activeTab = config.tabs?.find(tab => tab.id === config.activeTabId);\n if (!activeTab) {\n return;\n }\n\n // Build resource URL from tab configuration\n const resourceUrl = await this.buildResourceUrl(activeTab);\n if (resourceUrl) {\n // Compare full URLs including query params to detect changes\n const currentUrl = this.router.url;\n const newUrl = resourceUrl;\n\n // Only update if URL is different (path or query params changed)\n if (currentUrl !== newUrl) {\n // Suppress ResourceResolver for this navigation - we're just syncing the URL\n // to reflect the current active tab, not requesting a new tab to be opened\n this.tabService.SuppressNextResolve();\n\n // Replace URL on first sync (initialization), push new history entries after that\n const replaceUrl = this.firstUrlSync;\n this.firstUrlSync = false;\n this.router.navigateByUrl(resourceUrl, { replaceUrl });\n }\n }\n }\n\n /**\n * Sync workspace state with the current URL (for browser back/forward navigation).\n * Finds and activates the tab that matches the URL.\n */\n private async syncWorkspaceWithUrl(url: string): Promise<void> {\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.tabs?.length) {\n return;\n }\n\n // Find the tab that matches this URL\n const matchingTab = await this.findTabForUrl(url, config.tabs);\n\n if (matchingTab && matchingTab.id !== config.activeTabId) {\n // Activate the matching tab\n this.workspaceManager.SetActiveTab(matchingTab.id);\n } else if (!matchingTab) {\n // No matching tab found - check if this is an app-only URL for an app with zero nav items\n // If so, we need to create a new tab for it (the old one was replaced when navigating away)\n await this.handleMissingTabForUrl(url);\n }\n }\n\n /**\n * Handle the case where no tab matches the URL during back/forward navigation.\n * Creates new tabs for resources when the original tab was replaced.\n */\n private async handleMissingTabForUrl(url: string): Promise<void> {\n const urlPath = url.split('?')[0];\n const queryString = url.split('?')[1] || '';\n const queryParams = new URLSearchParams(queryString);\n\n // Use urlBasedNavigation flag to prevent syncUrlWithWorkspace from triggering again\n this.urlBasedNavigation = true;\n try {\n // Check for app-scoped record URL: /app/:appName/record/:entityName/:recordId\n const appRecordMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/record\\/([^\\/]+)\\/(.+)$/);\n if (appRecordMatch) {\n const entityName = decodeURIComponent(appRecordMatch[2]);\n const recordId = decodeURIComponent(appRecordMatch[3]);\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(recordId);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n return;\n }\n\n // Check for app-scoped view URL: /app/:appName/view/:viewId\n const appViewMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/view\\/([^\\/]+)$/);\n if (appViewMatch && appViewMatch[2] !== 'dynamic') {\n const viewId = appViewMatch[2];\n this.navigationService.OpenView(viewId, 'View');\n return;\n }\n\n // Check for app-scoped dynamic view URL: /app/:appName/view/dynamic/:entityName\n const appDynamicViewMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/view\\/dynamic\\/(.+)$/);\n if (appDynamicViewMatch) {\n const entityName = decodeURIComponent(appDynamicViewMatch[2]);\n const extraFilter = queryParams.get('ExtraFilter') || undefined;\n this.navigationService.OpenDynamicView(entityName, extraFilter);\n return;\n }\n\n // Check for app-scoped dashboard URL: /app/:appName/dashboard/:dashboardId\n const appDashboardMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/dashboard\\/(.+)$/);\n if (appDashboardMatch) {\n const dashboardId = appDashboardMatch[2];\n this.navigationService.OpenDashboard(dashboardId, 'Dashboard');\n return;\n }\n\n // Check for app-scoped artifact URL: /app/:appName/artifact/:artifactId\n const appArtifactMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/artifact\\/(.+)$/);\n if (appArtifactMatch) {\n const artifactId = appArtifactMatch[2];\n this.navigationService.OpenArtifact(artifactId, 'Artifact');\n return;\n }\n\n // Check for app-scoped query URL: /app/:appName/query/:queryId\n const appQueryMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/query\\/(.+)$/);\n if (appQueryMatch) {\n const queryId = appQueryMatch[2];\n this.navigationService.OpenQuery(queryId, 'Query');\n return;\n }\n\n // Check for app-scoped report URL: /app/:appName/report/:reportId\n const appReportMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/report\\/(.+)$/);\n if (appReportMatch) {\n const reportId = appReportMatch[2];\n this.navigationService.OpenReport(reportId, 'Report');\n return;\n }\n\n // Check for app-only URL: /app/:appName\n const appOnlyMatch = urlPath.match(/^\\/app\\/([^\\/]+)$/);\n if (appOnlyMatch) {\n const appPath = decodeURIComponent(appOnlyMatch[1]);\n const app = this.appManager.GetAppByPath(appPath) || this.appManager.GetAppByName(appPath);\n\n if (app) {\n const navItems = await app.GetNavItems();\n // Only auto-create tabs for apps with zero nav items\n // Apps with nav items should have had their tabs preserved\n if (navItems.length === 0) {\n // Set the app as active and create its default tab\n await this.appManager.SetActiveApp(app.ID);\n const defaultTab = await app.CreateDefaultTab();\n if (defaultTab) {\n this.workspaceManager.OpenTab(defaultTab, app.GetColor());\n }\n }\n }\n return;\n }\n\n // Legacy resource URLs (backward compatibility)\n // Check for legacy record URL: /resource/record/:entityName/:recordId\n const legacyRecordMatch = urlPath.match(/^\\/resource\\/record\\/([^\\/]+)\\/(.+)$/);\n if (legacyRecordMatch) {\n const entityName = decodeURIComponent(legacyRecordMatch[1]);\n const recordId = decodeURIComponent(legacyRecordMatch[2]);\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(recordId);\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n return;\n }\n\n // Check for legacy view URL: /resource/view/:viewId\n const legacyViewMatch = urlPath.match(/^\\/resource\\/view\\/([^\\/]+)$/);\n if (legacyViewMatch && legacyViewMatch[1] !== 'dynamic') {\n const viewId = legacyViewMatch[1];\n this.navigationService.OpenView(viewId, 'View');\n return;\n }\n\n // Check for legacy dashboard URL: /resource/dashboard/:dashboardId\n const legacyDashboardMatch = urlPath.match(/^\\/resource\\/dashboard\\/(.+)$/);\n if (legacyDashboardMatch) {\n const dashboardId = legacyDashboardMatch[1];\n this.navigationService.OpenDashboard(dashboardId, 'Dashboard');\n return;\n }\n } finally {\n this.urlBasedNavigation = false;\n }\n }\n\n /**\n * Find the tab that matches a given URL\n */\n private async findTabForUrl(url: string, tabs: WorkspaceTab[]): Promise<WorkspaceTab | null> {\n // Parse the URL to extract resource info\n const urlPath = url.split('?')[0];\n\n // Check for app nav item URL: /app/:appName/:navItemName\n const appNavMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/([^\\/]+)$/);\n if (appNavMatch) {\n const appPath = decodeURIComponent(appNavMatch[1]);\n const navItemName = decodeURIComponent(appNavMatch[2]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const tabAppName = tabConfig['appName'] as string | undefined;\n const tabNavItemName = tabConfig['navItemName'] as string | undefined;\n\n if (!tabAppName || !tabNavItemName) return false;\n\n // Match by app path/name and nav item name (case-insensitive)\n const app = this.appManager.GetAppByPath(appPath) || this.appManager.GetAppByName(appPath);\n if (!app) return false;\n\n const appMatches = tabAppName.toLowerCase() === app.Name.toLowerCase() ||\n UUIDsEqual(tab.applicationId, app.ID);\n const navMatches = tabNavItemName.toLowerCase() === navItemName.toLowerCase();\n\n return appMatches && navMatches;\n }) || null;\n }\n\n // Check for app-only URL: /app/:appName\n const appOnlyMatch = urlPath.match(/^\\/app\\/([^\\/]+)$/);\n if (appOnlyMatch) {\n const appPath = decodeURIComponent(appOnlyMatch[1]);\n const app = this.appManager.GetAppByPath(appPath) || this.appManager.GetAppByName(appPath);\n\n if (app) {\n // First, try to find a tab with isAppDefault for this app\n const defaultTab = tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n return UUIDsEqual(tab.applicationId, app.ID) && tabConfig['isAppDefault'] === true;\n });\n if (defaultTab) {\n return defaultTab;\n }\n\n // Fallback for apps with zero nav items: match ANY tab belonging to this app\n // This handles the case where the default tab was replaced when navigating away\n const navItems = await app.GetNavItems();\n if (navItems.length === 0) {\n return tabs.find(tab => UUIDsEqual(tab.applicationId, app.ID)) || null;\n }\n\n return null;\n }\n }\n\n // Check for app-scoped resource URLs (new pattern)\n // Pattern: /app/:appName/:resourceType/:param1/:param2?\n\n // Dashboard: /app/:appName/dashboard/:dashboardId\n const appDashboardMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/dashboard\\/(.+)$/);\n if (appDashboardMatch) {\n const dashboardId = appDashboardMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabDashboardId = (tabConfig['dashboardId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'dashboards' && tabDashboardId === dashboardId;\n }) || null;\n }\n\n // Record: /app/:appName/record/:entityName/:recordId\n const appRecordMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/record\\/([^\\/]+)\\/(.+)$/);\n if (appRecordMatch) {\n const entityName = decodeURIComponent(appRecordMatch[2]);\n const recordId = decodeURIComponent(appRecordMatch[3]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const tabEntity = (tabConfig['Entity'] || tabConfig['entity']) as string | undefined;\n const tabRecordId = (tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return tabEntity?.toLowerCase() === entityName.toLowerCase() &&\n tabRecordId === recordId;\n }) || null;\n }\n\n // Dynamic view: /app/:appName/view/dynamic/:entityName\n const appDynamicViewMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/view\\/dynamic\\/(.+)$/);\n if (appDynamicViewMatch) {\n const entityName = decodeURIComponent(appDynamicViewMatch[2]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabEntity = (tabConfig['Entity'] || tabConfig['entity']) as string | undefined;\n const isDynamic = tabConfig['isDynamic'] as boolean | undefined;\n\n return resourceType === 'user views' && isDynamic && tabEntity?.toLowerCase() === entityName.toLowerCase();\n }) || null;\n }\n\n // Saved view: /app/:appName/view/:viewId\n const appViewMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/view\\/([^\\/]+)$/);\n if (appViewMatch) {\n const viewId = appViewMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabViewId = (tabConfig['viewId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'user views' && tabViewId === viewId;\n }) || null;\n }\n\n // Query: /app/:appName/query/:queryId\n const appQueryMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/query\\/(.+)$/);\n if (appQueryMatch) {\n const queryId = appQueryMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabQueryId = (tabConfig['queryId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'queries' && tabQueryId === queryId;\n }) || null;\n }\n\n // Report: /app/:appName/report/:reportId\n const appReportMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/report\\/(.+)$/);\n if (appReportMatch) {\n const reportId = appReportMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabReportId = (tabConfig['reportId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'reports' && tabReportId === reportId;\n }) || null;\n }\n\n // Artifact: /app/:appName/artifact/:artifactId\n const appArtifactMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/artifact\\/(.+)$/);\n if (appArtifactMatch) {\n const artifactId = appArtifactMatch[2];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabArtifactId = (tabConfig['artifactId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'artifacts' && tabArtifactId === artifactId;\n }) || null;\n }\n\n // Search: /app/:appName/search/:searchInput\n const appSearchMatch = urlPath.match(/^\\/app\\/([^\\/]+)\\/search\\/(.+)$/);\n if (appSearchMatch) {\n const searchInput = decodeURIComponent(appSearchMatch[2]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabSearchInput = (tabConfig['SearchInput'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'search results' && tabSearchInput === searchInput;\n }) || null;\n }\n\n // Legacy resource URLs (kept for backward compatibility)\n // Check for resource record URL: /resource/record/:entityName/:recordId\n const recordMatch = urlPath.match(/^\\/resource\\/record\\/([^\\/]+)\\/(.+)$/);\n if (recordMatch) {\n const entityName = decodeURIComponent(recordMatch[1]);\n const recordId = decodeURIComponent(recordMatch[2]);\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const tabEntity = (tabConfig['Entity'] || tabConfig['entity']) as string | undefined;\n const tabRecordId = (tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return tabEntity?.toLowerCase() === entityName.toLowerCase() &&\n tabRecordId === recordId;\n }) || null;\n }\n\n // Check for view URL: /resource/view/:viewId\n const viewMatch = urlPath.match(/^\\/resource\\/view\\/([^\\/]+)$/);\n if (viewMatch) {\n const viewId = viewMatch[1];\n\n // Check if it's a dynamic view\n if (viewId === 'dynamic') {\n // Dynamic views include entity name in a different path\n return null; // Let the resolver handle dynamic views\n }\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabViewId = (tabConfig['viewId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'user views' && tabViewId === viewId;\n }) || null;\n }\n\n // Check for dashboard URL: /resource/dashboard/:dashboardId\n const dashboardMatch = urlPath.match(/^\\/resource\\/dashboard\\/(.+)$/);\n if (dashboardMatch) {\n const dashboardId = dashboardMatch[1];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabDashboardId = (tabConfig['dashboardId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'dashboards' && tabDashboardId === dashboardId;\n }) || null;\n }\n\n // Check for artifact URL: /resource/artifact/:artifactId\n const artifactMatch = urlPath.match(/^\\/resource\\/artifact\\/(.+)$/);\n if (artifactMatch) {\n const artifactId = artifactMatch[1];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabArtifactId = (tabConfig['artifactId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'artifacts' && tabArtifactId === artifactId;\n }) || null;\n }\n\n // Check for query URL: /resource/query/:queryId\n const queryMatch = urlPath.match(/^\\/resource\\/query\\/(.+)$/);\n if (queryMatch) {\n const queryId = queryMatch[1];\n\n return tabs.find(tab => {\n const tabConfig = tab.configuration || {};\n const resourceType = (tabConfig['resourceType'] as string | undefined)?.toLowerCase();\n const tabQueryId = (tabConfig['queryId'] || tabConfig['recordId'] || tab.resourceRecordId) as string | undefined;\n\n return resourceType === 'queries' && tabQueryId === queryId;\n }) || null;\n }\n\n return null;\n }\n\n /**\n * Build a shareable resource URL from tab data.\n * Uses app.Path for cleaner URLs (e.g., /app/data-explorer instead of /app/Data%20Explorer)\n */\n private async buildResourceUrl(tab: WorkspaceTab): Promise<string | null> {\n const config = tab.configuration || {};\n const resourceType = (config['resourceType'] as string | undefined)?.toLowerCase();\n const recordId = tab.resourceRecordId;\n const appName = config['appName'] as string | undefined;\n const navItemName = config['navItemName'] as string | undefined;\n const queryParams = config['queryParams'] as Record<string, string> | undefined;\n const isAppDefault = config['isAppDefault'] as boolean | undefined;\n const tabAppId = tab.applicationId;\n\n // Helper function to get app path for URL\n const getAppPath = (appIdOrName: string): string | null => {\n // First try by ID\n let app = this.appManager.GetAppById(appIdOrName);\n if (!app) {\n // Try by name\n app = this.appManager.GetAppByName(appIdOrName);\n }\n if (app) {\n // Prefer Path, fall back to Name for backwards compatibility\n return app.Path || app.Name;\n }\n return null;\n };\n\n // If this is an app nav item, build app-based URL\n if (appName && navItemName) {\n // Look up the app to get its Path\n const appPath = getAppPath(appName) || appName;\n let url = `/app/${encodeURIComponent(appPath)}/${encodeURIComponent(navItemName)}`;\n\n // Add query params if present\n if (queryParams && Object.keys(queryParams).length > 0) {\n const params = new URLSearchParams(queryParams);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n\n // If this is an app's default dashboard (no nav items), use app-level URL\n if (isAppDefault && appName) {\n const appPath = getAppPath(appName) || appName;\n return `/app/${encodeURIComponent(appPath)}`;\n }\n\n // Fallback: If tab belongs to a non-system app but doesn't have appName/navItemName,\n // try to reconstruct the URL from the ApplicationId and tab title\n if (tabAppId && tabAppId !== '__explorer') {\n const app = this.appManager.GetAppById(tabAppId);\n if (app) {\n // Prefer Path, fall back to Name\n const appPath = app.Path || app.Name;\n const navItems = await app.GetNavItems();\n\n // If app has nav items, try to find the matching one\n // Filter out dynamic nav items - they're generated from tab state and shouldn't affect URL building\n const staticNavItems = navItems.filter(item => !(item as { isDynamic?: boolean }).isDynamic);\n if (staticNavItems.length > 0) {\n const driverClass = config['driverClass'] as string | undefined;\n\n // Match by DriverClass for Custom resources (more reliable than title matching)\n // or by ResourceType + RecordID for other resource types\n const navItem = staticNavItems.find(item => {\n if (item.ResourceType === 'Custom' && item.DriverClass && driverClass) {\n return item.DriverClass === driverClass;\n }\n // For non-Custom resources, match by ResourceType + RecordID\n if (item.ResourceType && item.RecordID) {\n return item.ResourceType.toLowerCase() === resourceType && UUIDsEqual(item.RecordID, recordId);\n }\n return false;\n });\n\n if (navItem) {\n let url = `/app/${encodeURIComponent(appPath)}/${encodeURIComponent(navItem.Label)}`;\n\n // Add query params if present\n if (queryParams && Object.keys(queryParams).length > 0) {\n const params = new URLSearchParams(queryParams);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n // No matching nav item found - fall through to orphan resource handling\n }\n\n // Handle apps with no static nav items that show a default dashboard (custom resource type)\n if (staticNavItems.length === 0 && (!resourceType || resourceType === 'custom')) {\n // App has zero static nav items AND this is not an orphan resource (no resourceType or custom)\n // Use app-level URL - this handles apps that only have a default dashboard\n return `/app/${encodeURIComponent(appPath)}`;\n }\n // Fall through to orphan resource URL building below\n }\n }\n\n const entityName = (config['Entity'] || config['entity']) as string | undefined;\n const isDynamic = config['isDynamic'] as boolean | undefined;\n const extraFilter = (config['ExtraFilter'] || config['extraFilter']) as string | undefined;\n\n // For orphan resources (not tied to a specific nav item), use app-scoped URLs\n // Get the app path for the URL\n let appPath: string | null = null;\n if (tabAppId && tabAppId !== SYSTEM_APP_ID) {\n const app = this.appManager.GetAppById(tabAppId);\n if (app) {\n appPath = app.Path || app.Name;\n }\n }\n\n // If no app path found, try to use Home app as the default\n if (!appPath) {\n const homeApp = this.appManager.GetAppByName('Home');\n if (homeApp) {\n appPath = homeApp.Path || homeApp.Name;\n }\n }\n\n // Build app-scoped URLs (new pattern) if we have an app context\n if (appPath) {\n switch (resourceType) {\n case 'records':\n // /app/:appName/record/:entityName/:recordId\n if (entityName && recordId) {\n return `/app/${encodeURIComponent(appPath)}/record/${encodeURIComponent(entityName)}/${recordId}`;\n }\n break;\n\n case 'user views':\n // Check if it's a dynamic view\n if (isDynamic || recordId === 'dynamic') {\n // /app/:appName/view/dynamic/:entityName?ExtraFilter=...\n if (entityName) {\n let url = `/app/${encodeURIComponent(appPath)}/view/dynamic/${encodeURIComponent(entityName)}`;\n if (extraFilter) {\n url += `?ExtraFilter=${encodeURIComponent(extraFilter)}`;\n }\n return url;\n }\n } else if (recordId) {\n // /app/:appName/view/:viewId (saved view)\n return `/app/${encodeURIComponent(appPath)}/view/${recordId}`;\n }\n break;\n\n case 'dashboards':\n // /app/:appName/dashboard/:dashboardId\n if (recordId) {\n return `/app/${encodeURIComponent(appPath)}/dashboard/${recordId}`;\n }\n break;\n\n case 'artifacts':\n // /app/:appName/artifact/:artifactId\n if (recordId) {\n return `/app/${encodeURIComponent(appPath)}/artifact/${recordId}`;\n }\n break;\n\n case 'queries':\n // /app/:appName/query/:queryId\n if (recordId) {\n return `/app/${encodeURIComponent(appPath)}/query/${recordId}`;\n }\n break;\n\n case 'reports':\n // /app/:appName/report/:reportId\n if (recordId) {\n return `/app/${encodeURIComponent(appPath)}/report/${recordId}`;\n }\n break;\n\n case 'search results':\n // /app/:appName/search/:searchInput?Entity=...\n const searchInput = config['SearchInput'] as string | undefined;\n if (searchInput) {\n let url = `/app/${encodeURIComponent(appPath)}/search/${encodeURIComponent(searchInput)}`;\n if (entityName) {\n url += `?Entity=${encodeURIComponent(entityName)}`;\n }\n return url;\n }\n break;\n }\n }\n\n // Fallback to legacy routes (for backward compatibility during transition)\n switch (resourceType) {\n case 'records':\n if (entityName && recordId) {\n return `/resource/record/${encodeURIComponent(entityName)}/${recordId}`;\n }\n break;\n\n case 'user views':\n if (isDynamic || recordId === 'dynamic') {\n if (entityName) {\n let url = `/resource/view/dynamic/${encodeURIComponent(entityName)}`;\n if (extraFilter) {\n url += `?ExtraFilter=${encodeURIComponent(extraFilter)}`;\n }\n return url;\n }\n } else if (recordId) {\n return `/resource/view/${recordId}`;\n }\n break;\n\n case 'dashboards':\n if (recordId) {\n return `/resource/dashboard/${recordId}`;\n }\n break;\n\n case 'artifacts':\n if (recordId) {\n return `/resource/artifact/${recordId}`;\n }\n break;\n\n case 'queries':\n if (recordId) {\n return `/resource/query/${recordId}`;\n }\n break;\n }\n\n return null;\n }\n\n ngAfterViewInit(): void {\n // Layout initialization happens in TabContainerComponent\n }\n\n /**\n * Called when the first resource component finishes loading.\n * We accept subsequent calls to this method in ordre to ensure we are\n * not forever showing animation for loading - this can happen if there is\n * a race condition in components we DO NOT control, so while the naming\n * is intended to imply the goal it doesn't \"hurt\" to have this work this way\n */\n onFirstResourceLoadComplete(): void {\n this.waitingForFirstResource = false;\n this.loading = false;\n this.stopLoadingAnimation();\n this.cdr.detectChanges();\n }\n\n /**\n * Start the loading message cycling animation.\n * Messages cycle every 2.5 seconds without repeating until all are used.\n * Colors change every 5 seconds (every 2nd message cycle).\n * For themed periods: use theme colors/gradients from the start.\n * For standard theme: keep MJ blue throughout (no color changes).\n * Animation is randomly selected from pulse, spin, and pulse-spin.\n * Theme is selected based on current date and user's browser locale.\n */\n private startLoadingAnimation(): void {\n // Select the appropriate theme based on date and locale\n this.activeTheme = getActiveTheme();\n\n // Reset state\n this.usedMessageIndices = [0]; // Mark first message as used\n this.usedGradientIndices = [];\n this.loadingMessageIndex = 0;\n this.messageCycleCount = 0;\n\n // Initialize display with first message and initial color/gradient\n this.initializeLoadingDisplay();\n\n // Initialize animation based on theme configuration\n this.initializeAnimationFromTheme();\n\n // Start the animation sequence (if there are multiple steps)\n this.startAnimationSequence();\n\n // Start cycling every 2.5 seconds\n this.loadingMessageInterval = setInterval(() => {\n this.cycleToNextMessage();\n this.cdr.detectChanges();\n }, this.messageIntervalMs);\n\n // Start the recovery reset timer - if loading hasn't completed after\n // the delay, offer the user an option to clear cached data and reload\n this.startLoadingResetTimer();\n }\n\n /**\n * Stop the loading message cycling animation.\n */\n private stopLoadingAnimation(): void {\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n this.loadingMessageInterval = null;\n }\n // Also clear any animation sequence timeout\n if (this.animationSequenceTimeout) {\n clearTimeout(this.animationSequenceTimeout);\n this.animationSequenceTimeout = null;\n }\n // Cancel the recovery reset timer since loading completed successfully\n this.cancelLoadingResetTimer();\n }\n\n /**\n * Start a timer that shows a recovery reset option if loading takes too long.\n * This helps users recover from stuck loading states caused by upgrades,\n * corrupted cache, or bad stored state.\n */\n private startLoadingResetTimer(): void {\n this.cancelLoadingResetTimer();\n this.loadingResetTimeout = setTimeout(() => {\n if (this.loading) {\n this.ShowResetOption = true;\n this.cdr.detectChanges();\n }\n }, this.loadingResetDelayMs);\n }\n\n /**\n * Cancel the recovery reset timer.\n */\n private cancelLoadingResetTimer(): void {\n if (this.loadingResetTimeout) {\n clearTimeout(this.loadingResetTimeout);\n this.loadingResetTimeout = null;\n }\n this.ShowResetOption = false;\n }\n\n /**\n * Nuclear recovery: clear all browser-side cached data and reload the page.\n * This clears localStorage, sessionStorage, and IndexedDB to recover\n * from stuck loading states caused by corrupted or stale cached data.\n */\n ResetApplication(): void {\n try {\n // 1. Clear localStorage\n localStorage.clear();\n\n // 2. Clear sessionStorage\n sessionStorage.clear();\n\n // 3. Delete all IndexedDB databases\n if (window.indexedDB?.databases) {\n window.indexedDB.databases().then(databases => {\n for (const db of databases) {\n if (db.name) {\n window.indexedDB.deleteDatabase(db.name);\n }\n }\n }).catch(() => {\n // databases() not supported in all browsers - proceed with reload\n });\n }\n } catch (e) {\n console.warn('Error during cache reset:', e);\n }\n\n // Give IndexedDB deletions a moment to initiate, then hard reload\n setTimeout(() => {\n location.reload();\n }, 100);\n }\n\n /**\n * Initialize the loading display with first message and initial color/gradient.\n * For themed periods, applies theme styling from the start.\n * For standard theme, keeps MJ blue throughout.\n */\n private initializeLoadingDisplay(): void {\n // Set first message\n this.currentLoadingText = this.activeTheme.messages[0];\n\n if (this.activeTheme.staticColors) {\n // Standard theme: keep MJ blue, no gradient\n this.currentLoadingColor = this.activeTheme.colors[0];\n this.currentLoadingTextColor = '#757575'; // Default gray text\n this.currentLoadingGradient = null;\n } else {\n // Themed period: use theme colors and first gradient from the start\n this.currentLoadingColor = this.activeTheme.colors[0];\n this.currentLoadingTextColor = this.activeTheme.colors[0];\n\n // Set initial gradient if theme has gradients\n if (this.activeTheme.gradients && this.activeTheme.gradients.length > 0) {\n this.currentLoadingGradient = this.activeTheme.gradients[0];\n this.usedGradientIndices = [0];\n } else {\n this.currentLoadingGradient = null;\n }\n }\n }\n\n /**\n * Cycle to the next loading message, avoiding repeats until all are used.\n * Colors change every colorChangeEveryNMessages cycles (5 seconds).\n * For standard theme, colors remain static.\n */\n private cycleToNextMessage(): void {\n const messages = this.activeTheme.messages;\n this.messageCycleCount++;\n\n // If we've used all messages, reset the used list (but exclude current to avoid immediate repeat)\n if (this.usedMessageIndices.length >= messages.length) {\n this.usedMessageIndices = [this.loadingMessageIndex];\n }\n\n // Find a random unused message index\n const availableIndices = messages\n .map((_, i) => i)\n .filter(i => !this.usedMessageIndices.includes(i));\n\n if (availableIndices.length > 0) {\n const randomIndex = availableIndices[Math.floor(Math.random() * availableIndices.length)];\n this.usedMessageIndices.push(randomIndex);\n this.loadingMessageIndex = randomIndex;\n\n // Update the message\n this.currentLoadingText = this.activeTheme.messages[randomIndex];\n\n // Check if it's time to change colors (every 2nd message = every 5 seconds)\n // But only for non-static themes\n if (!this.activeTheme.staticColors && this.messageCycleCount % this.colorChangeEveryNMessages === 0) {\n this.cycleToNextColor();\n }\n }\n }\n\n /**\n * Cycle to the next color/gradient from the theme.\n * Alternates through gradients if available.\n */\n private cycleToNextColor(): void {\n // Cycle to next gradient if available\n if (this.activeTheme.gradients && this.activeTheme.gradients.length > 0) {\n const gradients = this.activeTheme.gradients;\n\n // If we've used all gradients, reset (but exclude current to avoid immediate repeat)\n if (this.usedGradientIndices.length >= gradients.length) {\n const lastUsed = this.usedGradientIndices[this.usedGradientIndices.length - 1];\n this.usedGradientIndices = [lastUsed];\n }\n\n // Find next gradient (simple rotation for gradients)\n const currentIndex = this.usedGradientIndices[this.usedGradientIndices.length - 1] ?? -1;\n const nextIndex = (currentIndex + 1) % gradients.length;\n this.usedGradientIndices.push(nextIndex);\n this.currentLoadingGradient = gradients[nextIndex];\n }\n\n // Also cycle text color through theme colors\n const colors = this.activeTheme.colors;\n if (colors.length > 1) {\n // Get a random color from the theme for text\n const randomIndex = Math.floor(Math.random() * colors.length);\n this.currentLoadingColor = colors[randomIndex];\n this.currentLoadingTextColor = colors[randomIndex];\n }\n }\n\n /**\n * Initialize animation configuration from the current theme.\n * Converts the theme's animation config (string or array) to a normalized sequence.\n */\n private initializeAnimationFromTheme(): void {\n this.currentAnimationIndex = 0;\n\n const themeAnimations = this.activeTheme.animations;\n\n if (!themeAnimations) {\n // No animation config - use random selection for non-standard themes\n if (this.activeTheme.id === 'standard') {\n // Standard theme defaults to pulse only\n this.animationSequence = [{ type: 'pulse' }];\n } else {\n // Random selection for themed holidays without explicit config\n const randomType = this.allAnimationTypes[\n Math.floor(Math.random() * this.allAnimationTypes.length)\n ];\n this.animationSequence = [{ type: randomType }];\n }\n } else if (typeof themeAnimations === 'string') {\n // Single animation type specified\n this.animationSequence = [{ type: themeAnimations }];\n } else {\n // Array of animation steps\n this.animationSequence = themeAnimations;\n }\n\n // Set initial animation\n if (this.animationSequence.length > 0) {\n this.currentLoadingAnimation = this.animationSequence[0].type;\n }\n }\n\n /**\n * Start the animation sequence, scheduling transitions between animation steps.\n */\n private startAnimationSequence(): void {\n // Clear any existing timeout\n if (this.animationSequenceTimeout) {\n clearTimeout(this.animationSequenceTimeout);\n this.animationSequenceTimeout = null;\n }\n\n this.currentAnimationIndex = 0;\n this.scheduleNextAnimationStep();\n }\n\n /**\n * Schedule the transition to the next animation step based on current step's duration.\n */\n private scheduleNextAnimationStep(): void {\n if (this.animationSequence.length <= 1) {\n // Only one step - no transitions needed\n return;\n }\n\n const currentStep = this.animationSequence[this.currentAnimationIndex];\n const durationMs = currentStep.durationMs;\n\n // If no duration specified (or 0), this step runs indefinitely\n if (!durationMs || durationMs <= 0) {\n return;\n }\n\n // Schedule transition to next step\n this.animationSequenceTimeout = setTimeout(() => {\n this.transitionToNextAnimation();\n }, durationMs);\n }\n\n /**\n * Transition to the next animation in the sequence.\n */\n private transitionToNextAnimation(): void {\n this.currentAnimationIndex++;\n\n if (this.currentAnimationIndex >= this.animationSequence.length) {\n // Sequence complete - stay on last animation\n return;\n }\n\n const nextStep = this.animationSequence[this.currentAnimationIndex];\n this.currentLoadingAnimation = nextStep.type;\n this.cdr.detectChanges();\n\n // Schedule the next transition if this step has a duration\n this.scheduleNextAnimationStep();\n }\n\n ngOnDestroy(): void {\n this.stopLoadingAnimation();\n this.subscriptions.forEach(sub => sub.unsubscribe());\n this.layoutManager.Destroy();\n\n // Clean up user menu\n this.userMenu?.Destroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Handle app switch from app switcher\n */\n async onAppSwitch(appId: string): Promise<void> {\n // Clear the system tab flag since we're switching to a real app\n this.isViewingSystemTab = false;\n\n // Show loading indicator in app switcher\n this.loadingAppId = appId;\n this.cdr.detectChanges();\n\n try {\n\n const app = this.appManager.GetAppById(appId);\n if (!app) {\n // Get app info from all system apps to show the name\n const systemApp = this.appManager.GetAllSystemApps().find(a => UUIDsEqual(a.ID, appId));\n const appName = systemApp?.Name || 'this application';\n\n // Clear loading indicator before showing dialog\n this.loadingAppId = null;\n this.cdr.detectChanges();\n\n // Show \"Add Application?\" dialog\n if (this.appAccessDialog) {\n this.appAccessDialog.show({\n type: 'not_installed',\n appName: appName,\n appId: appId\n });\n }\n return;\n }\n\n await this.appManager.SetActiveApp(appId);\n\n // Get the default nav item for this app (if any)\n const navItems = await app.GetNavItems();\n const defaultNavItem = navItems.find(item => item.isDefault);\n\n // Check if app has any tabs\n const appTabs = this.workspaceManager.GetAppTabs(appId);\n\n if (appTabs.length === 0) {\n // No tabs - create default tab (will trigger URL sync via workspace config subscription)\n const defaultTab = await app.CreateDefaultTab();\n if (defaultTab) {\n this.workspaceManager.OpenTab(defaultTab, app.GetColor());\n }\n } else if (defaultNavItem) {\n // App has tabs AND has a default nav item - try to find/create tab for default nav item\n // This ensures clicking the app icon always goes to the \"home\" of that app\n const defaultNavItemTab = this.findTabForDefaultNavItem(appTabs, defaultNavItem);\n\n if (defaultNavItemTab) {\n // Found existing tab for default nav item - activate it\n this.workspaceManager.SetActiveTab(defaultNavItemTab.id);\n const resourceUrl = await this.buildResourceUrl(defaultNavItemTab);\n if (resourceUrl) {\n this.router.navigateByUrl(resourceUrl, { replaceUrl: true });\n }\n } else {\n // No tab for default nav item - create one via NavigationService\n this.navigationService.OpenNavItem(appId, defaultNavItem, app.GetColor());\n }\n } else {\n // App has existing tabs but no default nav item - activate the first one\n const firstTab = appTabs[0];\n this.workspaceManager.SetActiveTab(firstTab.id);\n\n // The workspace configuration subscription will trigger URL sync\n // but we can also manually trigger it here to ensure immediate update\n const resourceUrl = await this.buildResourceUrl(firstTab);\n if (resourceUrl) {\n this.router.navigateByUrl(resourceUrl, { replaceUrl: true });\n }\n }\n } finally {\n // Clear loading indicator\n this.loadingAppId = null;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Find an existing tab that matches the default nav item\n */\n private findTabForDefaultNavItem(tabs: WorkspaceTab[], defaultNavItem: NavItem): WorkspaceTab | null {\n return tabs.find(tab => {\n const config = tab.configuration || {};\n\n // For Custom resource type, match by DriverClass\n if (defaultNavItem.ResourceType === 'Custom' && defaultNavItem.DriverClass) {\n return config['driverClass'] === defaultNavItem.DriverClass ||\n config['resourceTypeDriverClass'] === defaultNavItem.DriverClass;\n }\n\n // For other resource types, match by navItemName or by ResourceType + RecordID\n if (config['navItemName'] === defaultNavItem.Label) {\n return true;\n }\n\n if (defaultNavItem.ResourceType && defaultNavItem.RecordID) {\n const tabResourceType = (config['resourceType'] as string)?.toLowerCase();\n const tabRecordId = config['recordId'] || tab.resourceRecordId;\n return tabResourceType === defaultNavItem.ResourceType.toLowerCase() &&\n tabRecordId === defaultNavItem.RecordID;\n }\n\n return false;\n }) || null;\n }\n\n /**\n * Handle Nav Bar app icon click (single click switches to app)\n */\n onNavBarAppClick(app: BaseApplication, event: MouseEvent): void {\n // If shift key is held, force new tab\n if (event.shiftKey) {\n this.openNavBarAppInNewTab(app);\n } else {\n this.onAppSwitch(app.ID);\n }\n }\n\n /**\n * Handle Nav Bar app icon double-click (opens in new tab)\n */\n onNavBarAppDblClick(app: BaseApplication, event: MouseEvent): void {\n event.preventDefault();\n this.openNavBarAppInNewTab(app);\n }\n\n /**\n * Open a nav bar app's default content in a new tab\n */\n private async openNavBarAppInNewTab(app: BaseApplication): Promise<void> {\n // Create the default tab for this app with forceNewTab\n const tabRequest = await app.CreateDefaultTab();\n if (tabRequest) {\n // Set the app as active first if it isn't already\n if (!UUIDsEqual(this.activeApp?.ID, app.ID)) {\n await this.appManager.SetActiveApp(app.ID);\n }\n\n // Open in new tab by adding to workspace\n this.workspaceManager.OpenTab(tabRequest, app.GetColor());\n }\n }\n\n /**\n * Handle navigation item click with shift-key detection\n */\n onNavItemClick(event: NavItemClickEvent): void {\n if (!this.activeApp) {\n return;\n }\n\n const { item, shiftKey } = event;\n\n // Close mobile nav if open\n this.mobileNavOpen = false;\n\n // Use NavigationService with forceNewTab option if shift was pressed\n this.navigationService.OpenNavItem(\n this.activeApp.ID,\n item,\n this.activeApp.GetColor(),\n { forceNewTab: shiftKey }\n );\n }\n\n /**\n * Handle dismiss of a dynamic nav item (remove from recent stack)\n */\n onNavItemDismiss(item: NavItem): void {\n if (!this.activeApp) {\n return;\n }\n\n // Delegate to HomeApplication's RemoveDynamicNavItem if available\n const appWithRemove = this.activeApp as BaseApplication & {\n RemoveDynamicNavItem?: (item: NavItem) => void;\n };\n if (typeof appWithRemove.RemoveDynamicNavItem === 'function') {\n appWithRemove.RemoveDynamicNavItem(item);\n }\n }\n\n /**\n * Toggle mobile navigation drawer\n */\n toggleMobileNav(): void {\n this.mobileNavOpen = !this.mobileNavOpen;\n }\n\n /**\n * Close mobile navigation drawer\n */\n closeMobileNav(): void {\n this.mobileNavOpen = false;\n }\n\n /**\n * Toggle user menu visibility\n */\n toggleUserMenu(event: Event): void {\n event.stopPropagation();\n this.userMenuVisible = !this.userMenuVisible;\n\n if (this.userMenuVisible) {\n // Close menu when clicking outside\n const closeHandler = () => {\n this.userMenuVisible = false;\n document.removeEventListener('click', closeHandler);\n };\n setTimeout(() => {\n document.addEventListener('click', closeHandler);\n }, 0);\n }\n }\n\n /**\n * Initialize the user menu plugin system\n */\n private async initializeUserMenu(): Promise<void> {\n // Get the highest priority user menu implementation via ClassFactory\n this.userMenu = MJGlobal.Instance.ClassFactory.CreateInstance<BaseUserMenu>(BaseUserMenu);\n\n if (!this.userMenu) {\n console.error('No user menu implementation found');\n return;\n }\n\n // Initialize developer mode service\n if (this.userEntity) {\n await this.developerModeService.Initialize(this.userEntity);\n }\n\n // Build context for the menu\n const context: UserMenuContext = {\n user: new Metadata().CurrentUser,\n userEntity: this.userEntity!,\n shell: this as unknown as Record<string, unknown>,\n viewContainerRef: this.viewContainerRef,\n isDeveloper: this.developerModeService.IsDeveloper,\n developerModeEnabled: this.developerModeService.IsEnabled,\n currentApplication: this.activeApp as unknown as ApplicationInfoRef | null,\n workspaceManager: this.workspaceManager,\n authService: this.authBase,\n openSettings: () => this.openSettingsDialog(),\n themePreference: this.themeService.Preference,\n availableThemes: this.themeService.AvailableThemes,\n appliedTheme: this.themeService.AppliedTheme\n };\n\n // Initialize menu\n await this.userMenu.Initialize(context);\n\n // Get initial menu elements\n this.refreshMenuElements();\n\n // Subscribe to developer mode changes to refresh menu\n this.developerModeService.IsEnabled$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n // Update context and refresh menu\n if (this.userMenu) {\n this.userMenu.UpdateContext({\n developerModeEnabled: this.developerModeService.IsEnabled\n });\n }\n this.refreshMenuElements();\n this.cdr.detectChanges();\n });\n\n // Subscribe to theme preference changes to refresh menu\n this.themeService.Preference$.pipe(\n takeUntil(this.destroy$)\n ).subscribe((pref) => {\n if (this.userMenu) {\n this.userMenu.UpdateContext({\n themePreference: pref,\n availableThemes: this.themeService.AvailableThemes,\n appliedTheme: this.themeService.AppliedTheme\n });\n }\n this.refreshMenuElements();\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Refresh the user menu elements from the menu instance\n */\n private refreshMenuElements(): void {\n if (this.userMenu) {\n this.userMenuElements = this.userMenu.GetMenuElements();\n }\n }\n\n /**\n * Handle user menu item click\n */\n async onUserMenuItemClick(itemId: string): Promise<void> {\n if (!this.userMenu) return;\n\n const result = await this.userMenu.HandleItemClick(itemId);\n\n // Handle special signals from menu handlers\n if (result.message === 'toggle-dev-mode') {\n await this.developerModeService.Toggle();\n // Menu will refresh via the subscription above\n return;\n }\n\n if (result.message?.startsWith('select-theme-')) {\n const themeId = result.message.substring('select-theme-'.length);\n await this.themeService.SetTheme(themeId);\n // Explicitly update context after SetTheme completes, then fall through\n // to the standard refresh below (subscription also refreshes, but this\n // guarantees the menu updates even if the subscription's detectChanges\n // runs at an awkward point in Angular's change detection cycle)\n if (this.userMenu) {\n this.userMenu.UpdateContext({\n themePreference: this.themeService.Preference,\n availableThemes: this.themeService.AvailableThemes,\n appliedTheme: this.themeService.AppliedTheme\n });\n }\n }\n\n if (result.message === 'reset-layout') {\n await this.onResetLayout();\n return;\n }\n\n if (result.closeMenu) {\n this.userMenuVisible = false;\n }\n\n // Refresh menu elements (some items may have changed state)\n this.refreshMenuElements();\n this.cdr.detectChanges();\n }\n\n /**\n * Whether the currently applied theme is dark (used by the toggle switch in the template)\n */\n get IsDarkMode(): boolean {\n const theme = this.themeService.GetThemeDefinition(this.themeService.AppliedTheme);\n return theme?.BaseTheme === 'dark';\n }\n\n /**\n * Get user menu options for template\n */\n getUserMenuOptions() {\n return this.userMenu?.GetOptions();\n }\n\n /**\n * Get user display info for template\n */\n getUserDisplayInfo() {\n return this.userMenu?.GetUserDisplayInfo();\n }\n\n /**\n * Check if an element is a divider (for template)\n */\n isMenuDivider(element: UserMenuElement): boolean {\n return isUserMenuDivider(element);\n }\n\n /**\n * Cast element to UserMenuItem (for template type safety)\n * Call this only after checking !isMenuDivider(element)\n */\n asMenuItem(element: UserMenuElement): UserMenuItem {\n return element as UserMenuItem;\n }\n\n /**\n * Open the settings dialog\n */\n private openSettingsDialog(): void {\n this.settingsDialogService.open(this.viewContainerRef);\n }\n\n /**\n * Open Settings in a full-screen modal dialog\n */\n onSettings(): void {\n this.userMenuVisible = false;\n this.openSettingsDialog();\n }\n\n /**\n * Log current workspace configuration to console (debug)\n */\n onLogLayout(): void {\n const config = this.workspaceManager.GetConfiguration();\n console.log('📋 Workspace Configuration:', JSON.stringify(config, null, 2));\n console.log('📋 Workspace Configuration (object):', config);\n this.userMenuVisible = false;\n }\n\n /**\n * Reset workspace layout - clears all tabs and switches to single-resource mode\n */\n async onResetLayout(): Promise<void> {\n this.userMenuVisible = false;\n\n // Get current active app to create a fresh default tab\n const currentApp = this.activeApp;\n if (!currentApp) {\n console.warn('No active app to reset to');\n return;\n }\n\n // Create a fresh configuration with just one default tab\n const defaultTabRequest = await currentApp.CreateDefaultTab();\n if (!defaultTabRequest) {\n console.warn('Could not create default tab for app');\n return;\n }\n\n // Generate a new tab ID\n const newTabId = uuidv4();\n\n // Create minimal configuration with single tab (will trigger single-resource mode)\n const freshConfig = {\n version: 1,\n layout: {\n root: {\n type: 'row' as const,\n content: []\n }\n },\n activeTabId: newTabId,\n theme: 'light' as const,\n preferences: {\n tabPosition: 'top' as const,\n showTabIcons: true,\n autoSaveInterval: 5000\n },\n tabs: [{\n id: newTabId,\n applicationId: defaultTabRequest.ApplicationId,\n title: defaultTabRequest.Title,\n resourceTypeId: defaultTabRequest.ResourceTypeId || '',\n resourceRecordId: defaultTabRequest.ResourceRecordId || '',\n isPinned: false,\n sequence: 0,\n lastAccessedAt: new Date().toISOString(),\n configuration: defaultTabRequest.Configuration || {}\n }]\n };\n\n // Update workspace configuration\n this.workspaceManager.UpdateConfiguration(freshConfig);\n }\n\n /**\n * Logout user and clear authentication data\n */\n async onLogout(): Promise<void> {\n this.userMenuVisible = false;\n this.authBase.logout();\n localStorage.removeItem('auth');\n localStorage.removeItem('claims');\n }\n\n /**\n * Global keyboard shortcut handler\n * Cmd+/ (Mac) or Ctrl+/ (Windows) opens the command palette\n */\n @HostListener('document:keydown', ['$event'])\n handleGlobalKeyboardShortcuts(event: KeyboardEvent): void {\n // Skip if user is typing in an input/textarea\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return;\n }\n\n // Platform detection\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n const isCtrlOrCmd = isMac ? event.metaKey : event.ctrlKey;\n\n // Cmd+/ or Ctrl+/ opens command palette\n if (isCtrlOrCmd && event.key === '/') {\n event.preventDefault();\n event.stopPropagation();\n this.commandPaletteService.Open();\n }\n }\n\n /**\n * Load user avatar from database, auto-sync from auth provider if needed\n */\n private async loadUserAvatar(currentUserInfo: { ID: string; FirstLast?: string; Name?: string; Email?: string }): Promise<void> {\n try {\n const md = new Metadata();\n this.userName = currentUserInfo.FirstLast || currentUserInfo.Name || 'User';\n this.userEmail = currentUserInfo.Email || '';\n\n // Load the full MJUserEntity to access avatar fields\n const currentUserEntity = await md.GetEntityObject<MJUserEntity>('MJ: Users');\n await currentUserEntity.Load(currentUserInfo.ID);\n\n // Store reference for user menu\n this.userEntity = currentUserEntity;\n\n // Auto-sync avatar from auth provider if user has no avatar settings in DB\n if (!currentUserEntity.UserImageURL && !currentUserEntity.UserImageIconClass) {\n const synced = await this.syncAvatarFromAuthProvider(currentUserEntity);\n if (synced) {\n // Reload user entity to get saved values\n await currentUserEntity.Load(currentUserInfo.ID);\n }\n }\n\n // Load avatar for display (always from DB after potential sync)\n this.applyUserAvatar(currentUserEntity);\n } catch (error) {\n console.warn('Could not load user avatar:', error);\n // Use fallback\n this.userImageURL = '';\n this.userIconClass = null;\n }\n }\n\n /**\n * Syncs avatar from auth provider (Microsoft, Google, etc.)\n */\n private async syncAvatarFromAuthProvider(user: any): Promise<boolean> {\n try {\n // v3.0 API - Clean encapsulation! No provider-specific logic needed!\n // The provider handles whether it's Graph API, Auth0, or Okta internally\n const pictureUrl = await this.authBase.getProfilePictureUrl();\n\n if (pictureUrl) {\n return await this.userAvatarService.syncFromImageUrl(user, pictureUrl);\n }\n\n return false;\n } catch (error) {\n console.warn('Could not sync avatar from auth provider:', error);\n return false;\n }\n }\n\n /**\n * Apply user avatar to component state\n * Priority: UserImageURL > UserImageIconClass > default icon\n */\n private applyUserAvatar(user: any): void {\n if (user.UserImageURL) {\n this.userImageURL = user.UserImageURL;\n this.userIconClass = null;\n } else if (user.UserImageIconClass) {\n this.userIconClass = user.UserImageIconClass;\n this.userImageURL = '';\n } else {\n // Default fallback - show icon\n this.userImageURL = '';\n this.userIconClass = null;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Update browser tab title based on current app and active tab.\n * Format: \"Resource Name - App Name - MemberJunction\"\n */\n private updateBrowserTitle(config: WorkspaceConfiguration): void {\n // Find the active tab\n const activeTab = config.tabs?.find(tab => tab.id === config.activeTabId);\n\n // Get app name\n const appName = this.activeApp?.Name || null;\n\n // Get resource name from active tab\n let resourceName: string | null = null;\n if (activeTab) {\n resourceName = activeTab.title || null;\n }\n\n // Update title via TitleService\n this.titleService.setContext(appName, resourceName);\n }\n\n // ========================================\n // SEARCH FUNCTIONALITY\n // ========================================\n\n /**\n * Load searchable entities from metadata\n */\n private async loadSearchableEntities(): Promise<void> {\n const md = new Metadata();\n this.searchableEntities = md.Entities.filter((e) => e.AllowUserSearchAPI).sort((a, b) => a.Name.localeCompare(b.Name));\n if (this.searchableEntities.length > 0) {\n this.selectedEntity = this.searchableEntities[0];\n }\n }\n\n /**\n * Toggle search popup visibility\n */\n toggleSearch(): void {\n this.isSearchOpen = !this.isSearchOpen;\n\n // Focus on search input when opened\n if (this.isSearchOpen) {\n setTimeout(() => {\n if (this.searchInput && this.searchInput.nativeElement) {\n this.searchInput.nativeElement.focus();\n }\n }, 100);\n }\n }\n\n /**\n * Close search popup\n */\n closeSearch(): void {\n this.isSearchOpen = false;\n }\n\n /**\n * Handle search submission\n */\n onSearch(event: Event): void {\n if (!this.searchInput) {\n return;\n }\n\n const inputValue = this.searchInput.nativeElement.value;\n if (inputValue && inputValue.length > 0 && inputValue.trim().length > 2) {\n this.searchInput.nativeElement.value = ''; // Clear input\n this.isSearchOpen = false; // Close search popup\n\n // Navigate to search results\n if (this.selectedEntity) {\n this.router.navigate(['resource', 'search', inputValue], { queryParams: { Entity: this.selectedEntity.Name } });\n }\n } else {\n // Show warning notification\n MJGlobal.Instance.RaiseEvent({\n component: this,\n event: MJEventType.DisplaySimpleNotificationRequest,\n eventCode: \"\",\n args: {\n message: 'Please enter at least 3 characters to search',\n style: 'warning',\n DisplayDuration: 1500\n }\n });\n }\n }\n\n // ========================================\n // NOTIFICATION FUNCTIONALITY\n // ========================================\n\n /**\n * Show notifications page as a tab\n */\n showNotifications(): void {\n MJGlobal.Instance.RaiseEvent({\n event: MJEventType.ComponentEvent,\n component: this,\n eventCode: EventCodes.ViewNotifications,\n args: {}\n });\n\n // Open notifications in a tab\n // Use 'Custom' resource type with explicit driverClass to load NotificationsResource component\n this.tabService.OpenTab({\n ApplicationId: SYSTEM_APP_ID,\n Title: 'Notifications',\n Configuration: {\n resourceType: 'Custom',\n driverClass: 'NotificationsResource',\n route: 'notifications'\n },\n IsPinned: false\n });\n }\n\n // ========================================\n // APP ACCESS ERROR HANDLING\n // ========================================\n\n /**\n * Handle app access error by showing the appropriate dialog based on the access check result.\n * IMPORTANT: This keeps the loading screen visible and does NOT navigate to any app\n * until the user makes a decision in the dialog.\n * @param appPath The app path from the URL that the user tried to access\n * @param availableApps The list of apps the user has access to (for fallback)\n */\n private async handleAppAccessError(appPath: string, availableApps: BaseApplication[]): Promise<void> {\n // Prevent showing the dialog multiple times for the same app path\n // This can happen when the applications$ observable emits multiple times during reload\n if (this.pendingAppPath === appPath) {\n return;\n }\n\n const accessResult = this.appManager.CheckAppAccess(appPath);\n this.pendingAppPath = appPath;\n\n LogStatus(`App access check for \"${appPath}\": ${accessResult.status} - ${accessResult.message}`);\n\n const dialogConfig = this.mapAccessResultToDialogConfig(accessResult);\n\n // IMPORTANT: Keep loading screen visible while dialog is shown\n // Do NOT set any active app or create any tabs yet\n // The loading screen stays visible because we haven't called onFirstResourceLoadComplete\n\n // Show the dialog on top of the loading screen\n // Use setTimeout to ensure the dialog component is ready after view init\n setTimeout(() => {\n if (this.appAccessDialog) {\n this.appAccessDialog.show(dialogConfig);\n } else {\n // Fallback if dialog not available - redirect to first app\n console.warn('App access dialog not available, redirecting to first app');\n this.redirectToFirstApp(availableApps);\n }\n }, 0);\n }\n\n /**\n * Map an AppAccessResult to the dialog configuration\n */\n private mapAccessResultToDialogConfig(accessResult: AppAccessResult): AppAccessDialogConfig {\n switch (accessResult.status) {\n case 'not_found':\n return {\n type: 'not_found',\n appName: accessResult.appName\n };\n\n case 'inactive':\n return {\n type: 'inactive',\n appName: accessResult.appName,\n appId: accessResult.appId\n };\n\n case 'not_installed':\n return {\n type: 'not_installed',\n appName: accessResult.appName,\n appId: accessResult.appId\n };\n\n case 'disabled':\n return {\n type: 'disabled',\n appName: accessResult.appName,\n appId: accessResult.appId\n };\n\n default:\n // 'accessible' shouldn't reach here, but handle it as a generic error\n return {\n type: 'no_access',\n appName: accessResult.appName\n };\n }\n }\n\n /**\n * Handle when user has no apps available at all\n */\n private async handleNoAppsAvailable(): Promise<void> {\n LogStatus('User has no applications available');\n\n // Stop loading animation and show the dialog\n this.stopLoadingAnimation();\n this.loading = false;\n this.cdr.detectChanges();\n\n setTimeout(() => {\n if (this.appAccessDialog) {\n this.appAccessDialog.show({ type: 'no_apps' });\n }\n }, 0);\n }\n\n /**\n * Handle Golden Layout initialization failure\n */\n handleLayoutError(): void {\n LogStatus('Golden Layout initialization failed');\n\n const availableApps = this.appManager.GetAllApps();\n if (availableApps.length > 0) {\n setTimeout(() => {\n if (this.appAccessDialog) {\n this.appAccessDialog.show({ type: 'layout_error' });\n } else {\n // Direct redirect if dialog not available\n this.redirectToFirstApp(availableApps);\n }\n }, 0);\n }\n }\n\n /**\n * Handle dialog result (install, enable, or redirect)\n */\n async onAppAccessDialogResult(result: AppAccessDialogResult): Promise<void> {\n const availableApps = this.appManager.GetAllApps();\n\n switch (result.action) {\n case 'install':\n if (result.appId) {\n await this.installAndNavigateToApp(result.appId);\n }\n break;\n\n case 'enable':\n if (result.appId) {\n await this.enableAndNavigateToApp(result.appId);\n }\n break;\n\n case 'redirect':\n case 'dismissed':\n default:\n this.redirectToFirstApp(availableApps);\n break;\n }\n }\n\n /**\n * Install an app for the user and navigate to it\n */\n private async installAndNavigateToApp(appId: string): Promise<void> {\n // Clear pendingAppPath to allow fresh handling after installation\n this.pendingAppPath = null;\n\n try {\n const userApp = await this.appManager.InstallAppForUser(appId);\n\n if (userApp) {\n // Force refresh the app list to ensure the new app is in the observable\n await this.appManager.ReloadUserApplications();\n\n // App added successfully - wait for observable to sync then navigate\n await this.waitForAppAndNavigate(appId);\n\n } else {\n \n console.error('[ShellComponent] Failed to add application');\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n } catch (error) {\n console.error('Error adding app:', error);\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n }\n\n /**\n * Enable a disabled app for the user and navigate to it\n */\n private async enableAndNavigateToApp(appId: string): Promise<void> {\n try {\n const success = await this.appManager.EnableAppForUser(appId);\n\n if (success) {\n // App enabled successfully - wait for observable to sync then navigate\n await this.waitForAppAndNavigate(appId);\n } else {\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n } catch (error) {\n console.error('Error enabling app:', error);\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n }\n\n /**\n * Wait for an app to appear in the applications observable and then navigate to it.\n * This handles the async nature of observable updates after install/enable.\n */\n private async waitForAppAndNavigate(appId: string, maxWaitMs: number = 3000): Promise<void> {\n const startTime = Date.now();\n const pollInterval = 100;\n\n // Poll for the app to appear in the observable\n while (Date.now() - startTime < maxWaitMs) {\n const app = this.appManager.GetAppById(appId);\n if (app) {\n await this.navigateToApp(app);\n this.appAccessDialog?.completeProcessing();\n return;\n }\n // Wait a bit before checking again\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n\n // Timeout - try to get from system apps as fallback\n const systemApp = this.appManager.GetAllSystemApps().find(a => UUIDsEqual(a.ID, appId));\n if (systemApp) {\n await this.navigateToApp(systemApp);\n this.appAccessDialog?.completeProcessing();\n } else {\n console.warn(`[ShellComponent] App ${appId} not found after waiting, redirecting to first app`);\n this.appAccessDialog?.completeProcessing();\n this.redirectToFirstApp(this.appManager.GetAllApps());\n }\n }\n\n /**\n * Navigate to a specific app and create its default tab\n */\n private async navigateToApp(app: BaseApplication): Promise<void> {\n await this.appManager.SetActiveApp(app.ID);\n\n const existingTabs = this.workspaceManager.GetAppTabs(app.ID);\n if (existingTabs.length === 0) {\n const tabRequest = await app.CreateDefaultTab();\n if (tabRequest) {\n this.tabService.OpenTab(tabRequest);\n }\n }\n\n // Update URL to reflect the new app\n const appPath = app.Path || app.Name;\n this.router.navigateByUrl(`/app/${encodeURIComponent(appPath)}`, { replaceUrl: true });\n }\n\n /**\n * Redirect to the first available app (fallback)\n */\n /** Case-insensitive UUID check whether an app is the currently active app. */\n public IsActiveApp(app: BaseApplication): boolean {\n return UUIDsEqual(app.ID, this.activeApp?.ID);\n }\n\n private async redirectToFirstApp(apps: BaseApplication[]): Promise<void> {\n if (apps.length > 0) {\n const firstApp = apps[0];\n await this.navigateToApp(firstApp);\n } else {\n // No apps available - this shouldn't happen, but handle gracefully\n this.loading = false;\n this.cdr.detectChanges();\n }\n }\n}\n","<div class=\"shell-container\" [class.hidden]=\"loading\" [class.tabs-visible]=\"tabBarVisible\" kendoDialogContainer>\n <!-- Header -->\n <header class=\"shell-header\">\n <!-- MJ Logo -->\n <div class=\"mj-logo\" title=\"MemberJunction\"></div>\n\n <!-- Mobile Hamburger Button -->\n <button class=\"hamburger-btn\" (click)=\"toggleMobileNav()\" title=\"Menu\">\n <i class=\"fa-solid fa-bars\"></i>\n </button>\n\n <!-- Nav Bar Apps: Left of App Switcher -->\n @if (leftOfSwitcherApps.length > 0) {\n <div class=\"nav-bar-apps left-of-switcher\">\n @for (app of leftOfSwitcherApps; track app) {\n <button\n class=\"nav-bar-app-btn\"\n [class.active]=\"IsActiveApp(app)\"\n [title]=\"app.Name\"\n [style.--app-color]=\"app.GetColor()\"\n (click)=\"onNavBarAppClick(app, $event)\"\n (dblclick)=\"onNavBarAppDblClick(app, $event)\">\n <i [class]=\"app.Icon\"></i>\n </button>\n }\n </div>\n }\n\n <!-- App Switcher -->\n <mj-app-switcher\n [activeApp]=\"activeApp\"\n [isViewingSystemTab]=\"isViewingSystemTab\"\n [loadingAppId]=\"loadingAppId\"\n (appSelected)=\"onAppSwitch($event)\">\n </mj-app-switcher>\n\n <!-- App Navigation (desktop only) -->\n @if (activeApp) {\n <mj-app-nav\n class=\"desktop-nav\"\n [app]=\"activeApp\"\n (navItemClick)=\"onNavItemClick($event)\"\n (navItemDismiss)=\"onNavItemDismiss($event)\">\n </mj-app-nav>\n }\n\n <!-- Spacer -->\n <div class=\"spacer\"></div>\n\n <!-- Actions (search, notifications, user menu) -->\n <div class=\"header-actions\">\n <button class=\"icon-btn desktop-only search-toggle-btn\" title=\"Search\" (click)=\"toggleSearch()\">\n <i class=\"fa-solid fa-search\"></i>\n </button>\n <button class=\"icon-btn desktop-only notification-btn\" title=\"Notifications\" (click)=\"showNotifications()\">\n <i class=\"fa-solid fa-bell\"></i>\n @if (unreadNotificationCount > 0) {\n <span class=\"notification-badge\">\n {{ unreadNotificationCount > 99 ? '99+' : unreadNotificationCount }}\n </span>\n }\n </button>\n\n <!-- Nav Bar Apps: Left of User Menu -->\n @if (leftOfUserMenuApps.length > 0) {\n <div class=\"nav-bar-apps left-of-user-menu\">\n @for (app of leftOfUserMenuApps; track app) {\n <button\n class=\"nav-bar-app-btn\"\n [class.active]=\"IsActiveApp(app)\"\n [title]=\"app.Name\"\n [style.--app-color]=\"app.GetColor()\"\n (click)=\"onNavBarAppClick(app, $event)\"\n (dblclick)=\"onNavBarAppDblClick(app, $event)\">\n <i [class]=\"app.Icon\"></i>\n </button>\n }\n </div>\n }\n\n <div class=\"user-menu\">\n <button class=\"avatar-btn\" (click)=\"toggleUserMenu($event)\">\n @if (userImageURL) {\n <img [src]=\"userImageURL\" alt=\"User avatar\" class=\"avatar-img\" />\n } @else {\n <div class=\"icon-fallback\">\n <i [class]=\"userIconClass || 'fa-solid fa-user'\"></i>\n </div>\n }\n </button>\n <!-- User Context Menu (Dynamic) -->\n @if (userMenuVisible) {\n <div class=\"user-context-menu\"\n [class.menu-fade]=\"getUserMenuOptions()?.animationStyle === 'fade'\"\n [class.menu-slide]=\"getUserMenuOptions()?.animationStyle === 'slide'\">\n <!-- User Header -->\n @if (getUserMenuOptions()?.showUserName) {\n <div class=\"user-menu-header\">\n <div class=\"user-info\">\n <span class=\"user-name\">{{ getUserDisplayInfo()?.name || userName }}</span>\n @if (getUserMenuOptions()?.showUserEmail && getUserDisplayInfo()?.email) {\n <span class=\"user-email\">\n {{ getUserDisplayInfo()?.email }}\n </span>\n }\n </div>\n </div>\n <div class=\"user-menu-divider\"></div>\n }\n <!-- Dynamic Menu Items -->\n @for (element of userMenuElements; track element) {\n <!-- Divider -->\n @if (isMenuDivider(element)) {\n <div class=\"user-menu-divider\"></div>\n }\n <!-- Menu Item -->\n @if (!isMenuDivider(element)) {\n @if (asMenuItem(element); as item) {\n @if (item.id === 'toggle-theme') {\n <div class=\"user-menu-item theme-toggle-item\"\n [title]=\"item.tooltip || ''\"\n (click)=\"onUserMenuItemClick(item.id)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"menu-label\">{{ item.label }}</span>\n <div class=\"theme-toggle-track\" [class.dark]=\"IsDarkMode\">\n <div class=\"theme-toggle-thumb\">\n <i [class]=\"IsDarkMode ? 'fa-solid fa-moon' : 'fa-solid fa-sun'\" class=\"theme-toggle-icon\"></i>\n </div>\n </div>\n </div>\n } @else {\n <div class=\"user-menu-item\"\n [class.disabled]=\"!item.enabled\"\n [class.danger]=\"item.cssClass === 'danger'\"\n [style.color]=\"item.color || null\"\n [title]=\"item.tooltip || ''\"\n (click)=\"item.enabled && onUserMenuItemClick(item.id)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"menu-label\">{{ item.label }}</span>\n @if (item.shortcut) {\n <span class=\"menu-shortcut\">{{ item.shortcut }}</span>\n }\n </div>\n }\n }\n }\n }\n </div>\n }\n </div>\n </div>\n </header>\n\n <!-- Search Popup -->\n @if (isSearchOpen) {\n <div class=\"search-popup-overlay\" (click)=\"closeSearch()\"></div>\n }\n <div class=\"search-popup\" [class.open]=\"isSearchOpen\">\n <div class=\"search-popup-content\" (click)=\"$event.stopPropagation()\">\n <kendo-dropdownlist\n [data]=\"searchableEntities\"\n textField=\"Name\"\n valueField=\"ID\"\n class=\"search-entity-dropdown\"\n [(ngModel)]=\"selectedEntity\">\n </kendo-dropdownlist>\n <input\n type=\"text\"\n #searchInput\n placeholder=\"Search...\"\n kendoTextBox\n class=\"search-input\"\n (keydown.enter)=\"onSearch($event)\"\n />\n <button class=\"search-submit-btn\" (click)=\"onSearch($event)\" title=\"Search\">\n <i class=\"fa-solid fa-search\"></i>\n </button>\n </div>\n </div>\n\n <!-- Mobile Navigation Drawer -->\n @if (mobileNavOpen) {\n <div class=\"mobile-nav-overlay\" (click)=\"closeMobileNav()\"></div>\n }\n <div class=\"mobile-nav-drawer\" [class.open]=\"mobileNavOpen\">\n <div class=\"mobile-nav-header\">\n <span>Navigation</span>\n <button class=\"close-btn\" (click)=\"closeMobileNav()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n @if (activeApp) {\n <div class=\"mobile-nav-content\">\n <div class=\"mobile-nav-section-title\">{{ activeApp.Name }}</div>\n <mj-app-nav\n [app]=\"activeApp\"\n (navItemClick)=\"onNavItemClick($event)\"\n (navItemDismiss)=\"onNavItemDismiss($event)\">\n </mj-app-nav>\n </div>\n }\n <div class=\"mobile-nav-footer\">\n <button class=\"mobile-nav-action\" title=\"Search\" (click)=\"toggleSearch(); closeMobileNav()\">\n <i class=\"fa-solid fa-search\"></i>\n <span>Search</span>\n </button>\n <button class=\"mobile-nav-action\" title=\"Notifications\" (click)=\"showNotifications(); closeMobileNav()\">\n <i class=\"fa-solid fa-bell\"></i>\n <span>Notifications</span>\n @if (unreadNotificationCount > 0) {\n <span class=\"notification-badge-mobile\">\n {{ unreadNotificationCount > 99 ? '99+' : unreadNotificationCount }}\n </span>\n }\n </button>\n </div>\n </div>\n\n <!-- Tab Container - with dynamic tab bar visibility -->\n <mj-tab-container\n [class.hide-tab-bar]=\"!tabBarVisible\"\n (firstResourceLoadComplete)=\"onFirstResourceLoadComplete()\"\n (layoutInitError)=\"handleLayoutError()\">\n </mj-tab-container>\n</div>\n\n<!-- Loading State -->\n@if (loading) {\n <div class=\"shell-loading\">\n <mj-loading\n [text]=\"currentLoadingText\"\n [textColor]=\"currentLoadingTextColor\"\n [logoColor]=\"currentLoadingColor\"\n [logoGradient]=\"currentLoadingGradient\"\n [animation]=\"currentLoadingAnimation\"\n size=\"large\">\n </mj-loading>\n @if (ShowResetOption) {\n <div class=\"loading-reset-panel\">\n <p class=\"loading-reset-message\">\n <i class=\"fa-regular fa-clock\"></i>\n Taking longer than expected\n </p>\n <p class=\"loading-reset-hint\">\n This can happen after updates or due to cached data issues.\n </p>\n <button class=\"loading-reset-btn\" (click)=\"ResetApplication()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Clear cache &amp; reload\n </button>\n </div>\n }\n </div>\n}\n\n<!-- App Access Error Dialog -->\n<mj-app-access-dialog\n #appAccessDialog\n (result)=\"onAppAccessDialogResult($event)\">\n</mj-app-access-dialog>\n\n<!-- Command Palette -->\n<mj-command-palette (AppSelected)=\"onAppSwitch($event)\"></mj-command-palette>\n"]}