@memberjunction/ng-explorer-core 5.24.0 → 5.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-routing.module.d.ts.map +1 -1
- package/dist/app-routing.module.js +14 -19
- package/dist/app-routing.module.js.map +1 -1
- package/dist/generated/lazy-feature-config.js +3 -3
- package/dist/generated/lazy-feature-config.js.map +1 -1
- package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/artifact-resource.component.js +1 -0
- package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +16 -17
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js +56 -62
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +2 -4
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +9 -13
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +2 -15
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +18 -52
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +2 -3
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +7 -9
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/list-detail-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/list-detail-resource.component.js +1 -0
- package/dist/lib/resource-wrappers/list-detail-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/notifications-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/notifications-resource.component.js +1 -0
- package/dist/lib/resource-wrappers/notifications-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/query-resource.component.js +1 -0
- package/dist/lib/resource-wrappers/query-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +74 -4
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.js +786 -25
- package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.d.ts +7 -4
- package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +30 -14
- package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.js +10 -3
- package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
- package/dist/lib/shell/shell.component.d.ts +28 -8
- package/dist/lib/shell/shell.component.d.ts.map +1 -1
- package/dist/lib/shell/shell.component.js +416 -218
- package/dist/lib/shell/shell.component.js.map +1 -1
- package/dist/lib/shell/shell.module.d.ts +2 -1
- package/dist/lib/shell/shell.module.d.ts.map +1 -1
- package/dist/lib/shell/shell.module.js +7 -3
- package/dist/lib/shell/shell.module.js.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +6 -0
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +63 -38
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.js +1 -0
- package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
- package/dist/lib/user-menu/base-user-menu.d.ts +7 -7
- package/dist/lib/user-menu/base-user-menu.d.ts.map +1 -1
- package/dist/lib/user-menu/base-user-menu.js +8 -1
- package/dist/lib/user-menu/base-user-menu.js.map +1 -1
- package/dist/lib/user-menu/user-menu.types.d.ts +15 -0
- package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
- package/dist/lib/user-menu/user-menu.types.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.d.ts +6 -3
- package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +46 -19
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/module.d.ts +3 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +8 -0
- package/dist/module.js.map +1 -1
- package/package.json +40 -38
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-conversations-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, OnDestroy, ViewChild, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended, MJConversationEntity, MJUserSettingEntity, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';\nimport { ConversationChatAreaComponent, ConversationListComponent, MentionAutocompleteService, ConversationStreamingService, ActiveTasksService, PendingAttachment, UICommandHandlerService, ConversationBridgeService } from '@memberjunction/ng-conversations';\nimport { ActionableCommand, OpenResourceCommand } from '@memberjunction/ai-core-plus';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { Subject, takeUntil } from 'rxjs';\n/**\n * Chat Conversations Resource - wraps the conversation chat area for tab-based display\n * Extends BaseResourceComponent to work with the resource type system\n * Displays conversation list sidebar + active conversation chat interface\n * Designed to work with the tab system for multi-tab conversation management\n *\n * This component manages its own selection state locally, following the encapsulation pattern:\n * - ConversationEngine singleton is used for shared DATA (caching, loading, saving)\n * - Local state variables manage SELECTION state (which conversation is active)\n * - State flows down to children via @Input, events flow up via @Output\n */\n@RegisterClass(BaseResourceComponent, 'ChatConversationsResource')\n@Component({\n standalone: false,\n selector: 'mj-chat-conversations-resource',\n template: `\n @if (isReady) {\n <div class=\"chat-conversations-container\">\n <!-- Left sidebar: Conversation list -->\n @if (isSidebarSettingsLoaded) {\n <div class=\"conversation-sidebar\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n @if (currentUser) {\n <mj-conversation-list\n #conversationList\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (conversationDeleted)=\"onConversationDeleted($event)\"\n (newConversationRequested)=\"onNewConversationRequested()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\"\n (refreshRequested)=\"onRefreshRequested()\">\n </mj-conversation-list>\n }\n </div>\n }\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (!isSidebarCollapsed && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n <!-- Main area: Chat interface -->\n <div class=\"conversation-main\">\n @if (currentUser) {\n <mj-conversation-chat-area\n #chatArea\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n [showSidebarToggle]=\"isSidebarCollapsed && isSidebarSettingsLoaded\"\n (sidebarToggleClicked)=\"expandSidebar()\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"onPendingArtifactConsumed()\"\n (pendingMessageConsumed)=\"onPendingMessageConsumed()\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\"\n (artifactLinkClicked)=\"onArtifactLinkClicked($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\">\n </mj-conversation-chat-area>\n }\n </div>\n </div>\n } @else {\n <div class=\"initializing-container\">\n <mj-loading text=\"Initializing...\" size=\"large\"></mj-loading>\n </div>\n }\n \n <!-- Toast notifications container -->\n <mj-toast></mj-toast>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-conversations-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n\n .conversation-sidebar {\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Disable transitions during initial load to prevent jarring animation */\n .conversation-sidebar.no-transition {\n transition: none !important;\n }\n\n .conversation-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n }\n\n /* Resize handle for sidebar */\n .sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n }\n\n .sidebar-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n }\n\n .conversation-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .initializing-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n flex: 1;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ChatConversationsResource extends BaseResourceComponent implements OnDestroy {\n @ViewChild('conversationList') conversationList?: ConversationListComponent;\n @ViewChild('chatArea') chatArea?: ConversationChatAreaComponent;\n\n public currentUser: any = null;\n private destroy$ = new Subject<void>();\n private skipUrlUpdate = true; // Skip URL updates during initialization\n\n // Ready flag - blocks child rendering until AIEngine is initialized\n public isReady: boolean = false;\n\n // LOCAL SELECTION STATE - each wrapper instance manages its own selection\n public selectedConversationId: string | null = null;\n public selectedConversation: MJConversationEntity | null = null;\n public selectedThreadId: string | null = null;\n public isNewUnsavedConversation: boolean = false;\n public renamedConversationId: string | null = null;\n public isSidebarCollapsed: boolean = false;\n public isSidebarPinned: boolean = true; // Whether sidebar stays open after selection\n public isMobileView: boolean = false;\n public sidebarTransitionsEnabled: boolean = false; // Disabled during initial load to prevent jarring animation\n public isSidebarSettingsLoaded: boolean = false; // Prevents UI flash while loading settings\n\n // Sidebar resize state\n public sidebarWidth: number = 300; // Default width in pixels\n private isSidebarResizing: boolean = false;\n private sidebarResizeStartX: number = 0;\n private sidebarResizeStartWidth: number = 0;\n private readonly SIDEBAR_MIN_WIDTH = 200;\n private readonly SIDEBAR_MAX_WIDTH = 500;\n\n // Pending navigation state\n public pendingArtifactId: string | null = null;\n public pendingArtifactVersionNumber: number | null = null;\n public pendingMessageToSend: string | null = null;\n public pendingAttachmentsToSend: PendingAttachment[] | null = null;\n\n // User Settings persistence\n private readonly USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private engine = ConversationEngine.Instance;\n\n constructor(\n private navigationService: NavigationService,\n private mentionAutocompleteService: MentionAutocompleteService,\n private cdr: ChangeDetectorRef,\n private streamingService: ConversationStreamingService,\n private activeTasksService: ActiveTasksService,\n private uiCommandHandler: UICommandHandlerService,\n private bridge: ConversationBridgeService\n ) {\n super();\n }\n\n async ngOnInit() {\n const md = new Metadata();\n this.currentUser = md.CurrentUser;\n\n // Check initial mobile state and set default collapsed\n this.checkMobileView();\n if (this.isMobileView) {\n this.isSidebarCollapsed = true;\n this.isSidebarSettingsLoaded = true; // Mobile uses defaults, no need to load from server\n // Enable transitions after a brief delay to ensure initial state is applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n } else {\n // Load sidebar state from User Settings (non-blocking)\n this.loadSidebarState().then(() => {\n this.cdr.detectChanges();\n // Enable transitions after state is loaded and applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n });\n }\n\n // CRITICAL: Initialize AIEngine and mention service BEFORE children render\n // This prevents the slow first-load issue where each child would trigger initialization\n await this.initializeEngines();\n\n // Initialize global streaming service for PubSub updates\n // This enables reconnection to in-progress agents after browser refresh\n this.streamingService.initialize();\n\n // Apply initial state from tab configuration (populated by shell from URL or nav params)\n this.applyConfigurationParams();\n\n // Subscribe to actionable commands (open:resource) from the UI command handler service.\n // open:url commands are handled directly by the service; open:resource needs NavigationService.\n this.uiCommandHandler.actionableCommandRequested\n .pipe(takeUntil(this.destroy$))\n .subscribe(command => this.handleActionableCommand(command));\n\n // Subscribe to bridge switch events so the overlay can hand off a conversation to this workspace\n this.bridge.SwitchEvent$\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n if (event.Target === 'workspace' && event.ConversationID) {\n void this.selectConversation(event.ConversationID);\n this.updateTabTitle();\n this.cdr.detectChanges();\n }\n });\n\n // Notify the bridge that the workspace is active\n this.bridge.NotifyWorkspaceActive(true);\n\n // Enable URL updates after initialization\n this.skipUrlUpdate = false;\n\n // Update URL to reflect current state\n this.updateUrl();\n\n // Notify load complete after user is set\n setTimeout(() => {\n this.NotifyLoadComplete();\n }, 100);\n }\n\n ngOnDestroy() {\n this.bridge.NotifyWorkspaceActive(false);\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n\n // Clean up resize event listeners\n document.removeEventListener('mousemove', this.onSidebarResizeMove);\n document.removeEventListener('mouseup', this.onSidebarResizeEnd);\n }\n\n /**\n * Initialize AI Engine, conversations, and services BEFORE child components render.\n * This prevents the slow first-load issue where initialization would block conversation loading.\n * The `false` parameter means \"don't force refresh if already initialized\".\n */\n private async initializeEngines(): Promise<void> {\n try {\n // Initialize AIEngine, conversations, and mention service in parallel\n await Promise.all([\n AIEngineBase.Instance.Config(false),\n this.engine.LoadConversations(this.environmentId, this.currentUser, false),\n this.mentionAutocompleteService.initialize(this.currentUser)\n ]);\n\n // Restore active tasks AFTER conversations are cached (uses in-memory lookup)\n await this.activeTasksService.restoreFromDatabase(this.currentUser);\n\n // Mark as ready - child components can now render\n this.isReady = true;\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to initialize AI engines:', error);\n // Still mark as ready so UI isn't blocked forever\n this.isReady = true;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Load the conversation entity asynchronously (non-blocking).\n * The conversationId is already set synchronously, this just loads the full entity.\n */\n private async loadConversationEntity(conversationId: string | undefined): Promise<void> {\n if (!conversationId) return;\n\n // Try to get from cache first\n const conversation = this.engine.GetConversation(conversationId);\n if (conversation) {\n this.selectedConversation = conversation;\n this.updateTabTitle();\n }\n // If not in cache, the chat area component will handle loading it\n }\n\n /**\n * Apply initial state from tab configuration.\n * The shell populates queryParams from the URL, and nav params come from cross-resource linking.\n * Sets state synchronously so child components see values immediately.\n */\n private applyConfigurationParams(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n // Check queryParams first (shell populates these from the URL for deep-linking)\n const qp = config['queryParams'] as Record<string, string> | undefined;\n const conversationId = qp?.['conversationId'] || (config.conversationId as string);\n const artifactId = qp?.['artifactId'] || (config.artifactId as string);\n const versionNumber = qp?.['versionNumber'] ? parseInt(qp['versionNumber'], 10)\n : config.versionNumber ? (config.versionNumber as number) : null;\n\n // Set pending artifact if provided\n if (artifactId) {\n this.pendingArtifactId = artifactId;\n this.pendingArtifactVersionNumber = versionNumber;\n }\n\n // Set conversationId synchronously so child components see it immediately\n if (conversationId) {\n this.selectedConversationId = conversationId;\n this.bridge.SetActiveFromWorkspace(conversationId);\n this.isNewUnsavedConversation = false;\n // Load entity asynchronously\n this.loadConversationEntity(conversationId);\n }\n }\n\n /**\n * Apply navigation state to local selection state.\n * Sets state synchronously so child components see values immediately.\n */\n /**\n * Select a conversation by ID - loads the entity and updates local state\n */\n private async selectConversation(conversationId: string): Promise<void> {\n this.selectedConversationId = conversationId;\n this.isNewUnsavedConversation = false;\n\n // Keep bridge in sync so other consumers (toast suppression, overlay) know\n // which conversation the workspace is viewing\n this.bridge.SetActiveFromWorkspace(conversationId);\n\n // Load the conversation entity from data service\n const conversation = this.engine.GetConversation(conversationId);\n if (conversation) {\n this.selectedConversation = conversation;\n } else {\n // Conversation might not be loaded yet - the chat area will handle loading\n this.selectedConversation = null;\n }\n\n // Update URL if not skipping\n if (!this.skipUrlUpdate) {\n this.updateUrl();\n }\n }\n\n /**\n * Update URL query string to reflect current state.\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateUrl(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Add conversation ID\n if (this.selectedConversationId) {\n queryParams['conversationId'] = this.selectedConversationId;\n } else {\n queryParams['conversationId'] = null;\n }\n\n // Add artifact ID if we have a pending artifact (will be cleared once opened)\n if (this.pendingArtifactId) {\n queryParams['artifactId'] = this.pendingArtifactId;\n if (this.pendingArtifactVersionNumber) {\n queryParams['versionNumber'] = this.pendingArtifactVersionNumber.toString();\n }\n } else {\n queryParams['artifactId'] = null;\n queryParams['versionNumber'] = null;\n }\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n /**\n * Update the tab/browser title based on the currently selected conversation.\n */\n private updateTabTitle(): void {\n if (this.isNewUnsavedConversation || !this.selectedConversation) {\n this.NotifyDisplayNameChanged('Conversations');\n return;\n }\n const name = this.selectedConversation.Name;\n if (name) {\n this.NotifyDisplayNameChanged(name);\n }\n }\n\n\n /**\n * Get the environment ID from configuration or use default\n */\n get environmentId(): string {\n return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /**\n * Get the display name for chat conversations\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n // If we have a specific conversation ID, we could load the conversation name\n // For now, just return a generic name\n if (data.Configuration?.conversationId) {\n return `Conversation: ${(data.Configuration.conversationId as string).substring(0, 8)}...`;\n }\n return 'Conversations';\n }\n\n /**\n * Get the icon class for chat conversations\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-comments';\n }\n\n // ============================================\n // EVENT HANDLERS FROM CHILD COMPONENTS\n // ============================================\n\n /**\n * Handle refresh request from the conversation list.\n * After the list refreshes, also reload messages in the active chat area so any\n * new agent responses are visible without a full page reload.\n */\n onRefreshRequested(): void {\n void this.chatArea?.reloadMessages();\n }\n\n /**\n * Handle conversation deletion from the list.\n * If the deleted conversation was selected, navigate to the first remaining conversation.\n */\n onConversationDeleted(deletedId: string): void {\n if (this.selectedConversationId === deletedId) {\n const remaining = this.engine.Conversations.filter(c => !UUIDsEqual(c.ID, deletedId));\n if (remaining.length > 0) {\n void this.selectConversation(remaining[0].ID);\n this.updateUrl();\n } else {\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.isNewUnsavedConversation = true;\n this.updateUrl();\n }\n }\n }\n\n /**\n * Handle conversation selection from the list\n */\n async onConversationSelected(conversationId: string): Promise<void> {\n await this.selectConversation(conversationId);\n this.selectedThreadId = null; // Clear thread when switching conversations\n this.isNewUnsavedConversation = false;\n this.updateUrl();\n this.updateTabTitle();\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n @HostListener('window:resize')\n onWindowResize(): void {\n this.checkMobileView();\n }\n\n /**\n * Handle clicks outside the sidebar to auto-collapse when unpinned\n */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n // Only handle when sidebar is expanded but unpinned\n if (this.isSidebarCollapsed || this.isSidebarPinned) {\n return;\n }\n\n // Check if click is outside the sidebar\n const target = event.target as HTMLElement;\n const sidebarElement = target.closest('.conversation-sidebar');\n const expandHandle = target.closest('.sidebar-expand-handle');\n\n // If click is outside sidebar and expand handle, collapse it\n if (!sidebarElement && !expandHandle) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Check if we're in mobile view and handle state accordingly\n */\n private checkMobileView(): void {\n const wasMobile = this.isMobileView;\n this.isMobileView = window.innerWidth < 768;\n\n if (this.isMobileView && !wasMobile) {\n // Switched to mobile - default to collapsed\n this.isSidebarCollapsed = true;\n }\n }\n\n /**\n * Collapse sidebar\n */\n collapseSidebar(): void {\n this.isSidebarCollapsed = true;\n }\n\n /**\n * Expand sidebar (pinned - stays open until unpinned)\n */\n expandSidebar(): void {\n this.isSidebarCollapsed = false;\n this.isSidebarPinned = true; // Pin it so it stays open\n this.saveSidebarState();\n }\n\n /**\n * Handle sidebar resize start\n */\n onSidebarResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.isSidebarResizing = true;\n this.sidebarResizeStartX = event.clientX;\n this.sidebarResizeStartWidth = this.sidebarWidth;\n\n // Disable transitions during resize for immediate feedback\n this.sidebarTransitionsEnabled = false;\n\n // Add event listeners for mousemove and mouseup\n document.addEventListener('mousemove', this.onSidebarResizeMove);\n document.addEventListener('mouseup', this.onSidebarResizeEnd);\n }\n\n /**\n * Handle sidebar resize move (bound method for proper 'this' context)\n */\n private onSidebarResizeMove = (event: MouseEvent): void => {\n if (!this.isSidebarResizing) return;\n\n const delta = event.clientX - this.sidebarResizeStartX;\n const newWidth = this.sidebarResizeStartWidth + delta;\n\n // Clamp to min/max bounds\n this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, newWidth));\n this.cdr.detectChanges();\n };\n\n /**\n * Handle sidebar resize end (bound method for proper 'this' context)\n */\n private onSidebarResizeEnd = (): void => {\n if (!this.isSidebarResizing) return;\n\n this.isSidebarResizing = false;\n\n // Re-enable transitions for collapse/expand animations\n this.sidebarTransitionsEnabled = true;\n\n // Remove event listeners\n document.removeEventListener('mousemove', this.onSidebarResizeMove);\n document.removeEventListener('mouseup', this.onSidebarResizeEnd);\n\n // Save the new width to User Settings\n this.saveSidebarState();\n };\n\n /**\n * Pin sidebar - keep it open after selection\n */\n pinSidebar(): void {\n this.isSidebarPinned = true;\n this.saveSidebarState();\n }\n\n /**\n * Unpin sidebar - will auto-collapse on next selection\n */\n unpinSidebar(): void {\n this.isSidebarPinned = false;\n this.collapseSidebar();\n this.saveSidebarState();\n }\n\n /**\n * Save sidebar state to User Settings (server only - no localStorage fallback)\n * Uses debouncing to avoid excessive database writes\n */\n private saveSidebarState(): void {\n // Debounce the server save to avoid excessive writes\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveSidebarStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save sidebar state to User Settings entity on server using UserInfoEngine for cached lookup\n */\n private async saveSidebarStateToServer(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (!userId) {\n return;\n }\n\n const stateToSave = {\n collapsed: this.isSidebarCollapsed,\n pinned: this.isSidebarPinned,\n width: this.sidebarWidth\n };\n\n const engine = UserInfoEngine.Instance;\n const md = new Metadata();\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_SIDEBAR_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save sidebar state to User Settings:', error);\n }\n }\n\n /**\n * Load sidebar state from User Settings (server) using UserInfoEngine\n * For new users with no saved state, defaults to collapsed with new conversation\n */\n private async loadSidebarState(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (userId) {\n // Load from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value);\n this.isSidebarCollapsed = state.collapsed ?? true;\n this.isSidebarPinned = state.pinned ?? false;\n this.sidebarWidth = state.width ?? 300;\n // Clamp width to valid range\n this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, this.sidebarWidth));\n this.isSidebarSettingsLoaded = true;\n return;\n }\n }\n\n // No saved state found - NEW USER DEFAULT:\n // Start with sidebar collapsed and show new conversation screen\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.sidebarWidth = 300;\n this.isNewUnsavedConversation = true;\n this.isSidebarSettingsLoaded = true;\n } catch (error) {\n console.warn('Failed to load sidebar state:', error);\n // Default to collapsed for new users on error\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.sidebarWidth = 300;\n this.isSidebarSettingsLoaded = true;\n }\n }\n\n /**\n * Handle new conversation request from the list\n */\n onNewConversationRequested(): void {\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.isNewUnsavedConversation = true;\n this.updateUrl();\n this.NotifyDisplayNameChanged('New Conversation');\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Handle conversation created from chat area (after first message in new conversation).\n * The event now includes pending message and attachments for atomic state update.\n */\n async onConversationCreated(event: {\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }): Promise<void> {\n // Set ALL state atomically before Angular change detection runs\n this.pendingMessageToSend = event.pendingMessage || null;\n this.pendingAttachmentsToSend = event.pendingAttachments || null;\n this.selectedConversationId = event.conversation.ID;\n this.selectedConversation = event.conversation;\n this.isNewUnsavedConversation = false;\n this.bridge.SetActiveFromWorkspace(event.conversation.ID);\n this.updateUrl();\n this.updateTabTitle();\n }\n\n /**\n * Handle conversation rename event\n */\n onConversationRenamed(event: { conversationId: string; name: string; description: string }): void {\n // Trigger rename animation in the list\n this.renamedConversationId = event.conversationId;\n\n // Update tab title with the new name\n if (event.name) {\n this.NotifyDisplayNameChanged(event.name);\n }\n\n // Clear the animation trigger after it completes\n setTimeout(() => {\n this.renamedConversationId = null;\n }, 1500);\n }\n\n /**\n * Handle thread opened event\n */\n onThreadOpened(threadId: string): void {\n this.selectedThreadId = threadId;\n }\n\n /**\n * Handle thread closed event\n */\n onThreadClosed(): void {\n this.selectedThreadId = null;\n }\n\n /**\n * Handle pending artifact consumed event\n */\n onPendingArtifactConsumed(): void {\n this.pendingArtifactId = null;\n this.pendingArtifactVersionNumber = null;\n // Update URL to remove artifact params\n this.updateUrl();\n }\n\n /**\n * Handle pending message consumed event\n */\n onPendingMessageConsumed(): void {\n this.pendingMessageToSend = null;\n this.pendingAttachmentsToSend = null;\n }\n\n /**\n * Handle pending message requested event (from empty state creating conversation).\n * @deprecated Use onConversationCreated with pendingMessage instead - this is kept for backwards compatibility.\n */\n onPendingMessageRequested(event: {text: string; attachments: PendingAttachment[]}): void {\n this.pendingMessageToSend = event.text;\n this.pendingAttachmentsToSend = event.attachments || null;\n }\n\n /**\n * Handle navigation request from artifact viewer panel within the chat area.\n * Converts the link event to a generic navigation request and uses NavigationService.\n */\n onArtifactLinkClicked(event: {\n type: 'conversation' | 'collection';\n id: string;\n artifactId?: string;\n versionNumber?: number;\n }): void {\n // Map the link type to the nav item name\n const navItemName = event.type === 'conversation' ? 'Conversations' : 'Collections';\n\n // Build configuration params to pass to the target resource\n const params: Record<string, unknown> = {};\n if (event.type === 'conversation') {\n params['conversationId'] = event.id;\n } else {\n params['collectionId'] = event.id;\n }\n\n // Include artifact info so destination can open it\n if (event.artifactId) {\n params['artifactId'] = event.artifactId;\n if (event.versionNumber) {\n params['versionNumber'] = event.versionNumber;\n }\n }\n\n // Navigate using the generic nav item method\n this.navigationService.OpenNavItemByName(navItemName, params);\n }\n\n /**\n * Handle entity record open request from chat area (from React component grids).\n * Uses NavigationService to open the record in a new tab.\n */\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n this.navigationService.OpenEntityRecord(event.entityName, event.compositeKey);\n }\n\n /**\n * Handle navigation request from artifact viewer plugins.\n * Opens the target nav item (switching apps if needed) then applies query params to the URL.\n */\n async onNavigationRequest(event: NavigationRequest): Promise<void> {\n const appId = event.appName ? this.resolveAppId(event.appName) : undefined;\n await this.navigationService.OpenNavItemByName(event.navItemName, undefined, appId, {\n queryParams: event.queryParams\n });\n }\n\n /**\n * Resolve an application name to its ID.\n */\n private resolveAppId(appName: string): string | undefined {\n const md = new Metadata();\n const apps = md.Applications;\n const app = apps.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle actionable commands that require app-specific navigation (open:resource).\n * open:url commands are already handled directly by UICommandHandlerService.\n */\n private handleActionableCommand(command: ActionableCommand): void {\n if (command.type === 'open:resource') {\n const resourceCommand = command as OpenResourceCommand;\n if (resourceCommand.resourceType === 'Record' && resourceCommand.entityName) {\n const compositeKey = new CompositeKey([{\n FieldName: 'ID',\n Value: resourceCommand.resourceId\n }]);\n this.navigationService.OpenEntityRecord(resourceCommand.entityName, compositeKey);\n } else if (resourceCommand.resourceType === 'Report' || resourceCommand.resourceType === 'Dashboard') {\n // Reports and dashboards from agents are stored as conversation artifacts.\n // Find the most recent artifact in the active conversation and open it.\n this.openMostRecentArtifact();\n }\n }\n }\n\n /**\n * Open the most recent artifact in the active conversation's artifact viewer.\n * Used for open:resource commands with resourceType Report/Dashboard where\n * the resourceId is an agent-internal ID, not a database artifact ID.\n */\n private openMostRecentArtifact(): void {\n if (!this.chatArea) return;\n\n // Find the last artifact across all messages\n const artifactMap = this.chatArea.artifactsByDetailId;\n let latestArtifact: { artifactId: string; versionId?: string } | null = null;\n for (const artifacts of artifactMap.values()) {\n if (artifacts.length > 0) {\n const last = artifacts[artifacts.length - 1];\n latestArtifact = {\n artifactId: last.artifactId,\n versionId: last.artifactVersionId\n };\n }\n }\n\n if (latestArtifact) {\n this.chatArea.onArtifactClicked(latestArtifact);\n } else {\n console.warn('No artifacts found in conversation to open for Report/Dashboard command');\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chat-conversations-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, OnDestroy, ViewChild, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended, MJConversationEntity, MJUserSettingEntity, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';\nimport { ConversationChatAreaComponent, ConversationListComponent, MentionAutocompleteService, ConversationStreamingService, ActiveTasksService, PendingAttachment, UICommandHandlerService, ConversationBridgeService } from '@memberjunction/ng-conversations';\nimport { ActionableCommand, OpenResourceCommand } from '@memberjunction/ai-core-plus';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { Subject, takeUntil } from 'rxjs';\n/**\n * Chat Conversations Resource - wraps the conversation chat area for tab-based display\n * Extends BaseResourceComponent to work with the resource type system\n * Displays conversation list sidebar + active conversation chat interface\n * Designed to work with the tab system for multi-tab conversation management\n *\n * This component manages its own selection state locally, following the encapsulation pattern:\n * - ConversationEngine singleton is used for shared DATA (caching, loading, saving)\n * - Local state variables manage SELECTION state (which conversation is active)\n * - State flows down to children via @Input, events flow up via @Output\n */\n@RegisterClass(BaseResourceComponent, 'ChatConversationsResource')\n@Component({\n standalone: false,\n selector: 'mj-chat-conversations-resource',\n template: `\n @if (isReady) {\n <div class=\"chat-conversations-container\">\n <!-- Left sidebar: Conversation list -->\n @if (isSidebarSettingsLoaded) {\n <div class=\"conversation-sidebar\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n @if (currentUser) {\n <mj-conversation-list\n #conversationList\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (conversationDeleted)=\"onConversationDeleted($event)\"\n (newConversationRequested)=\"onNewConversationRequested()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\"\n (refreshRequested)=\"onRefreshRequested()\">\n </mj-conversation-list>\n }\n </div>\n }\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (!isSidebarCollapsed && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n <!-- Main area: Chat interface -->\n <div class=\"conversation-main\">\n @if (currentUser) {\n <mj-conversation-chat-area\n #chatArea\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n [showSidebarToggle]=\"isSidebarCollapsed && isSidebarSettingsLoaded\"\n (sidebarToggleClicked)=\"expandSidebar()\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"onPendingArtifactConsumed()\"\n (pendingMessageConsumed)=\"onPendingMessageConsumed()\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\"\n (artifactLinkClicked)=\"onArtifactLinkClicked($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\">\n </mj-conversation-chat-area>\n }\n </div>\n </div>\n } @else {\n <div class=\"initializing-container\">\n <mj-loading text=\"Initializing...\" size=\"large\"></mj-loading>\n </div>\n }\n \n <!-- Toast notifications container -->\n <mj-toast></mj-toast>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-conversations-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n\n .conversation-sidebar {\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Disable transitions during initial load to prevent jarring animation */\n .conversation-sidebar.no-transition {\n transition: none !important;\n }\n\n .conversation-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n }\n\n /* Resize handle for sidebar */\n .sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n }\n\n .sidebar-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n }\n\n .conversation-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .initializing-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n flex: 1;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ChatConversationsResource extends BaseResourceComponent implements OnDestroy {\n @ViewChild('conversationList') conversationList?: ConversationListComponent;\n @ViewChild('chatArea') chatArea?: ConversationChatAreaComponent;\n\n public currentUser: any = null;\n private skipUrlUpdate = true; // Skip URL updates during initialization\n\n // Ready flag - blocks child rendering until AIEngine is initialized\n public isReady: boolean = false;\n\n // LOCAL SELECTION STATE - each wrapper instance manages its own selection\n public selectedConversationId: string | null = null;\n public selectedConversation: MJConversationEntity | null = null;\n public selectedThreadId: string | null = null;\n public isNewUnsavedConversation: boolean = false;\n public renamedConversationId: string | null = null;\n public isSidebarCollapsed: boolean = false;\n public isSidebarPinned: boolean = true; // Whether sidebar stays open after selection\n public isMobileView: boolean = false;\n public sidebarTransitionsEnabled: boolean = false; // Disabled during initial load to prevent jarring animation\n public isSidebarSettingsLoaded: boolean = false; // Prevents UI flash while loading settings\n\n // Sidebar resize state\n public sidebarWidth: number = 300; // Default width in pixels\n private isSidebarResizing: boolean = false;\n private sidebarResizeStartX: number = 0;\n private sidebarResizeStartWidth: number = 0;\n private readonly SIDEBAR_MIN_WIDTH = 200;\n private readonly SIDEBAR_MAX_WIDTH = 500;\n\n // Pending navigation state\n public pendingArtifactId: string | null = null;\n public pendingArtifactVersionNumber: number | null = null;\n public pendingMessageToSend: string | null = null;\n public pendingAttachmentsToSend: PendingAttachment[] | null = null;\n\n // User Settings persistence\n private readonly USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n\n private engine = ConversationEngine.Instance;\n\n constructor(\n private mentionAutocompleteService: MentionAutocompleteService,\n private cdr: ChangeDetectorRef,\n private streamingService: ConversationStreamingService,\n private activeTasksService: ActiveTasksService,\n private uiCommandHandler: UICommandHandlerService,\n private bridge: ConversationBridgeService\n ) {\n super();\n }\n\n async ngOnInit() {\n super.ngOnInit();\n const md = new Metadata();\n this.currentUser = md.CurrentUser;\n\n // Check initial mobile state and set default collapsed\n this.checkMobileView();\n if (this.isMobileView) {\n this.isSidebarCollapsed = true;\n this.isSidebarSettingsLoaded = true; // Mobile uses defaults, no need to load from server\n // Enable transitions after a brief delay to ensure initial state is applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n } else {\n // Load sidebar state from User Settings (non-blocking)\n this.loadSidebarState().then(() => {\n this.cdr.detectChanges();\n // Enable transitions after state is loaded and applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n });\n }\n\n // CRITICAL: Initialize AIEngine and mention service BEFORE children render\n // This prevents the slow first-load issue where each child would trigger initialization\n await this.initializeEngines();\n\n // Initialize global streaming service for PubSub updates\n // This enables reconnection to in-progress agents after browser refresh\n this.streamingService.initialize();\n\n // Apply initial state from tab configuration (populated by shell from URL or nav params)\n this.applyConfigurationParams();\n\n // Subscribe to actionable commands (open:resource) from the UI command handler service.\n // open:url commands are handled directly by the service; open:resource needs NavigationService.\n this.uiCommandHandler.actionableCommandRequested\n .pipe(takeUntil(this.destroy$))\n .subscribe(command => this.handleActionableCommand(command));\n\n // Subscribe to bridge switch events so the overlay can hand off a conversation to this workspace\n this.bridge.SwitchEvent$\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n if (event.Target === 'workspace' && event.ConversationID) {\n void this.selectConversation(event.ConversationID);\n this.updateTabTitle();\n this.cdr.detectChanges();\n }\n });\n\n // Notify the bridge that the workspace is active\n this.bridge.NotifyWorkspaceActive(true);\n\n // Enable URL updates after initialization\n this.skipUrlUpdate = false;\n\n // Update URL to reflect current state\n this.updateUrl();\n\n // Notify load complete after user is set\n setTimeout(() => {\n this.NotifyLoadComplete();\n }, 100);\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.bridge.NotifyWorkspaceActive(false);\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n\n // Clean up resize event listeners\n document.removeEventListener('mousemove', this.onSidebarResizeMove);\n document.removeEventListener('mouseup', this.onSidebarResizeEnd);\n }\n\n /**\n * Initialize AI Engine, conversations, and services BEFORE child components render.\n * This prevents the slow first-load issue where initialization would block conversation loading.\n * The `false` parameter means \"don't force refresh if already initialized\".\n */\n private async initializeEngines(): Promise<void> {\n try {\n // Initialize AIEngine, conversations, and mention service in parallel\n await Promise.all([\n AIEngineBase.Instance.Config(false),\n this.engine.LoadConversations(this.environmentId, this.currentUser, false),\n this.mentionAutocompleteService.initialize(this.currentUser)\n ]);\n\n // Restore active tasks AFTER conversations are cached (uses in-memory lookup)\n await this.activeTasksService.restoreFromDatabase(this.currentUser);\n\n // Mark as ready - child components can now render\n this.isReady = true;\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to initialize AI engines:', error);\n // Still mark as ready so UI isn't blocked forever\n this.isReady = true;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Load the conversation entity asynchronously (non-blocking).\n * The conversationId is already set synchronously, this just loads the full entity.\n */\n private async loadConversationEntity(conversationId: string | undefined): Promise<void> {\n if (!conversationId) return;\n\n // Try to get from cache first\n const conversation = this.engine.GetConversation(conversationId);\n if (conversation) {\n this.selectedConversation = conversation;\n this.updateTabTitle();\n }\n // If not in cache, the chat area component will handle loading it\n }\n\n /**\n * Apply initial state from tab configuration.\n * The shell populates queryParams from the URL, and nav params come from cross-resource linking.\n * Sets state synchronously so child components see values immediately.\n */\n private applyConfigurationParams(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n // Check queryParams first (shell populates these from the URL for deep-linking)\n const qp = config['queryParams'] as Record<string, string> | undefined;\n const conversationId = qp?.['conversationId'] || (config.conversationId as string);\n const artifactId = qp?.['artifactId'] || (config.artifactId as string);\n const versionNumber = qp?.['versionNumber'] ? parseInt(qp['versionNumber'], 10)\n : config.versionNumber ? (config.versionNumber as number) : null;\n\n // Set pending artifact if provided\n if (artifactId) {\n this.pendingArtifactId = artifactId;\n this.pendingArtifactVersionNumber = versionNumber;\n }\n\n // Set conversationId synchronously so child components see it immediately\n if (conversationId) {\n this.selectedConversationId = conversationId;\n this.bridge.SetActiveFromWorkspace(conversationId);\n this.isNewUnsavedConversation = false;\n // Load entity asynchronously\n this.loadConversationEntity(conversationId);\n }\n }\n\n /**\n * Apply navigation state to local selection state.\n * Sets state synchronously so child components see values immediately.\n */\n /**\n * Select a conversation by ID - loads the entity and updates local state\n */\n private async selectConversation(conversationId: string): Promise<void> {\n this.selectedConversationId = conversationId;\n this.isNewUnsavedConversation = false;\n\n // Keep bridge in sync so other consumers (toast suppression, overlay) know\n // which conversation the workspace is viewing\n this.bridge.SetActiveFromWorkspace(conversationId);\n\n // Load the conversation entity from data service\n const conversation = this.engine.GetConversation(conversationId);\n if (conversation) {\n this.selectedConversation = conversation;\n } else {\n // Conversation might not be loaded yet - the chat area will handle loading\n this.selectedConversation = null;\n }\n\n // Update URL if not skipping\n if (!this.skipUrlUpdate) {\n this.updateUrl();\n }\n }\n\n /**\n * Update URL query string to reflect current state.\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateUrl(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Add conversation ID\n if (this.selectedConversationId) {\n queryParams['conversationId'] = this.selectedConversationId;\n } else {\n queryParams['conversationId'] = null;\n }\n\n // Add artifact ID if we have a pending artifact (will be cleared once opened)\n if (this.pendingArtifactId) {\n queryParams['artifactId'] = this.pendingArtifactId;\n if (this.pendingArtifactVersionNumber) {\n queryParams['versionNumber'] = this.pendingArtifactVersionNumber.toString();\n }\n } else {\n queryParams['artifactId'] = null;\n queryParams['versionNumber'] = null;\n }\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n /**\n * Update the tab/browser title based on the currently selected conversation.\n */\n private updateTabTitle(): void {\n if (this.isNewUnsavedConversation || !this.selectedConversation) {\n this.NotifyDisplayNameChanged('Conversations');\n return;\n }\n const name = this.selectedConversation.Name;\n if (name) {\n this.NotifyDisplayNameChanged(name);\n }\n }\n\n\n /**\n * Get the environment ID from configuration or use default\n */\n get environmentId(): string {\n return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /**\n * Get the display name for chat conversations\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n // If we have a specific conversation ID, we could load the conversation name\n // For now, just return a generic name\n if (data.Configuration?.conversationId) {\n return `Conversation: ${(data.Configuration.conversationId as string).substring(0, 8)}...`;\n }\n return 'Conversations';\n }\n\n /**\n * Get the icon class for chat conversations\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-comments';\n }\n\n // ============================================\n // EVENT HANDLERS FROM CHILD COMPONENTS\n // ============================================\n\n /**\n * Handle refresh request from the conversation list.\n * After the list refreshes, also reload messages in the active chat area so any\n * new agent responses are visible without a full page reload.\n */\n onRefreshRequested(): void {\n void this.chatArea?.reloadMessages();\n }\n\n /**\n * Handle conversation deletion from the list.\n * If the deleted conversation was selected, navigate to the first remaining conversation.\n */\n onConversationDeleted(deletedId: string): void {\n if (this.selectedConversationId === deletedId) {\n const remaining = this.engine.Conversations.filter(c => !UUIDsEqual(c.ID, deletedId));\n if (remaining.length > 0) {\n void this.selectConversation(remaining[0].ID);\n this.updateUrl();\n } else {\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.isNewUnsavedConversation = true;\n this.updateUrl();\n }\n }\n }\n\n /**\n * Handle conversation selection from the list\n */\n async onConversationSelected(conversationId: string): Promise<void> {\n await this.selectConversation(conversationId);\n this.selectedThreadId = null; // Clear thread when switching conversations\n this.isNewUnsavedConversation = false;\n this.updateUrl();\n this.updateTabTitle();\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n @HostListener('window:resize')\n onWindowResize(): void {\n this.checkMobileView();\n }\n\n /**\n * Handle clicks outside the sidebar to auto-collapse when unpinned\n */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n // Only handle when sidebar is expanded but unpinned\n if (this.isSidebarCollapsed || this.isSidebarPinned) {\n return;\n }\n\n // Check if click is outside the sidebar\n const target = event.target as HTMLElement;\n const sidebarElement = target.closest('.conversation-sidebar');\n const expandHandle = target.closest('.sidebar-expand-handle');\n\n // If click is outside sidebar and expand handle, collapse it\n if (!sidebarElement && !expandHandle) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Check if we're in mobile view and handle state accordingly\n */\n private checkMobileView(): void {\n const wasMobile = this.isMobileView;\n this.isMobileView = window.innerWidth < 768;\n\n if (this.isMobileView && !wasMobile) {\n // Switched to mobile - default to collapsed\n this.isSidebarCollapsed = true;\n }\n }\n\n /**\n * Collapse sidebar\n */\n collapseSidebar(): void {\n this.isSidebarCollapsed = true;\n }\n\n /**\n * Expand sidebar (pinned - stays open until unpinned)\n */\n expandSidebar(): void {\n this.isSidebarCollapsed = false;\n this.isSidebarPinned = true; // Pin it so it stays open\n this.saveSidebarState();\n }\n\n /**\n * Handle sidebar resize start\n */\n onSidebarResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.isSidebarResizing = true;\n this.sidebarResizeStartX = event.clientX;\n this.sidebarResizeStartWidth = this.sidebarWidth;\n\n // Disable transitions during resize for immediate feedback\n this.sidebarTransitionsEnabled = false;\n\n // Add event listeners for mousemove and mouseup\n document.addEventListener('mousemove', this.onSidebarResizeMove);\n document.addEventListener('mouseup', this.onSidebarResizeEnd);\n }\n\n /**\n * Handle sidebar resize move (bound method for proper 'this' context)\n */\n private onSidebarResizeMove = (event: MouseEvent): void => {\n if (!this.isSidebarResizing) return;\n\n const delta = event.clientX - this.sidebarResizeStartX;\n const newWidth = this.sidebarResizeStartWidth + delta;\n\n // Clamp to min/max bounds\n this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, newWidth));\n this.cdr.detectChanges();\n };\n\n /**\n * Handle sidebar resize end (bound method for proper 'this' context)\n */\n private onSidebarResizeEnd = (): void => {\n if (!this.isSidebarResizing) return;\n\n this.isSidebarResizing = false;\n\n // Re-enable transitions for collapse/expand animations\n this.sidebarTransitionsEnabled = true;\n\n // Remove event listeners\n document.removeEventListener('mousemove', this.onSidebarResizeMove);\n document.removeEventListener('mouseup', this.onSidebarResizeEnd);\n\n // Save the new width to User Settings\n this.saveSidebarState();\n };\n\n /**\n * Pin sidebar - keep it open after selection\n */\n pinSidebar(): void {\n this.isSidebarPinned = true;\n this.saveSidebarState();\n }\n\n /**\n * Unpin sidebar - will auto-collapse on next selection\n */\n unpinSidebar(): void {\n this.isSidebarPinned = false;\n this.collapseSidebar();\n this.saveSidebarState();\n }\n\n /**\n * Save sidebar state to User Settings (server only - no localStorage fallback)\n * Uses debouncing to avoid excessive database writes\n */\n private saveSidebarState(): void {\n // Debounce the server save to avoid excessive writes\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveSidebarStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save sidebar state to User Settings entity on server using UserInfoEngine for cached lookup\n */\n private async saveSidebarStateToServer(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (!userId) {\n return;\n }\n\n const stateToSave = {\n collapsed: this.isSidebarCollapsed,\n pinned: this.isSidebarPinned,\n width: this.sidebarWidth\n };\n\n const engine = UserInfoEngine.Instance;\n const md = new Metadata();\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_SIDEBAR_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save sidebar state to User Settings:', error);\n }\n }\n\n /**\n * Load sidebar state from User Settings (server) using UserInfoEngine\n * For new users with no saved state, defaults to collapsed with new conversation\n */\n private async loadSidebarState(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (userId) {\n // Load from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value);\n this.isSidebarCollapsed = state.collapsed ?? true;\n this.isSidebarPinned = state.pinned ?? false;\n this.sidebarWidth = state.width ?? 300;\n // Clamp width to valid range\n this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, this.sidebarWidth));\n this.isSidebarSettingsLoaded = true;\n return;\n }\n }\n\n // No saved state found - NEW USER DEFAULT:\n // Start with sidebar collapsed and show new conversation screen\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.sidebarWidth = 300;\n this.isNewUnsavedConversation = true;\n this.isSidebarSettingsLoaded = true;\n } catch (error) {\n console.warn('Failed to load sidebar state:', error);\n // Default to collapsed for new users on error\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.sidebarWidth = 300;\n this.isSidebarSettingsLoaded = true;\n }\n }\n\n /**\n * Handle new conversation request from the list\n */\n onNewConversationRequested(): void {\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.isNewUnsavedConversation = true;\n this.updateUrl();\n this.NotifyDisplayNameChanged('New Conversation');\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Handle conversation created from chat area (after first message in new conversation).\n * The event now includes pending message and attachments for atomic state update.\n */\n async onConversationCreated(event: {\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }): Promise<void> {\n // Set ALL state atomically before Angular change detection runs\n this.pendingMessageToSend = event.pendingMessage || null;\n this.pendingAttachmentsToSend = event.pendingAttachments || null;\n this.selectedConversationId = event.conversation.ID;\n this.selectedConversation = event.conversation;\n this.isNewUnsavedConversation = false;\n this.bridge.SetActiveFromWorkspace(event.conversation.ID);\n this.updateUrl();\n this.updateTabTitle();\n }\n\n /**\n * Handle conversation rename event\n */\n onConversationRenamed(event: { conversationId: string; name: string; description: string }): void {\n // Trigger rename animation in the list\n this.renamedConversationId = event.conversationId;\n\n // Update tab title with the new name\n if (event.name) {\n this.NotifyDisplayNameChanged(event.name);\n }\n\n // Clear the animation trigger after it completes\n setTimeout(() => {\n this.renamedConversationId = null;\n }, 1500);\n }\n\n /**\n * Handle thread opened event\n */\n onThreadOpened(threadId: string): void {\n this.selectedThreadId = threadId;\n }\n\n /**\n * Handle thread closed event\n */\n onThreadClosed(): void {\n this.selectedThreadId = null;\n }\n\n /**\n * Handle pending artifact consumed event\n */\n onPendingArtifactConsumed(): void {\n this.pendingArtifactId = null;\n this.pendingArtifactVersionNumber = null;\n // Update URL to remove artifact params\n this.updateUrl();\n }\n\n /**\n * Handle pending message consumed event\n */\n onPendingMessageConsumed(): void {\n this.pendingMessageToSend = null;\n this.pendingAttachmentsToSend = null;\n }\n\n /**\n * Handle pending message requested event (from empty state creating conversation).\n * @deprecated Use onConversationCreated with pendingMessage instead - this is kept for backwards compatibility.\n */\n onPendingMessageRequested(event: {text: string; attachments: PendingAttachment[]}): void {\n this.pendingMessageToSend = event.text;\n this.pendingAttachmentsToSend = event.attachments || null;\n }\n\n /**\n * Handle navigation request from artifact viewer panel within the chat area.\n * Converts the link event to a generic navigation request and uses NavigationService.\n */\n onArtifactLinkClicked(event: {\n type: 'conversation' | 'collection';\n id: string;\n artifactId?: string;\n versionNumber?: number;\n }): void {\n // Map the link type to the nav item name\n const navItemName = event.type === 'conversation' ? 'Conversations' : 'Collections';\n\n // Build configuration params to pass to the target resource\n const params: Record<string, unknown> = {};\n if (event.type === 'conversation') {\n params['conversationId'] = event.id;\n } else {\n params['collectionId'] = event.id;\n }\n\n // Include artifact info so destination can open it\n if (event.artifactId) {\n params['artifactId'] = event.artifactId;\n if (event.versionNumber) {\n params['versionNumber'] = event.versionNumber;\n }\n }\n\n // Navigate using the generic nav item method\n this.navigationService.OpenNavItemByName(navItemName, params);\n }\n\n /**\n * Handle entity record open request from chat area (from React component grids).\n * Uses NavigationService to open the record in a new tab.\n */\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n this.navigationService.OpenEntityRecord(event.entityName, event.compositeKey);\n }\n\n /**\n * Handle navigation request from artifact viewer plugins.\n * Opens the target nav item (switching apps if needed) then applies query params to the URL.\n */\n async onNavigationRequest(event: NavigationRequest): Promise<void> {\n const appId = event.appName ? this.resolveAppId(event.appName) : undefined;\n await this.navigationService.OpenNavItemByName(event.navItemName, undefined, appId, {\n queryParams: event.queryParams\n });\n }\n\n /**\n * Resolve an application name to its ID.\n */\n private resolveAppId(appName: string): string | undefined {\n const md = new Metadata();\n const apps = md.Applications;\n const app = apps.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle actionable commands that require app-specific navigation (open:resource).\n * open:url commands are already handled directly by UICommandHandlerService.\n */\n private handleActionableCommand(command: ActionableCommand): void {\n if (command.type === 'open:resource') {\n const resourceCommand = command as OpenResourceCommand;\n if (resourceCommand.resourceType === 'Record' && resourceCommand.entityName) {\n const compositeKey = new CompositeKey([{\n FieldName: 'ID',\n Value: resourceCommand.resourceId\n }]);\n this.navigationService.OpenEntityRecord(resourceCommand.entityName, compositeKey);\n } else if (resourceCommand.resourceType === 'Report' || resourceCommand.resourceType === 'Dashboard') {\n // Reports and dashboards from agents are stored as conversation artifacts.\n // Find the most recent artifact in the active conversation and open it.\n this.openMostRecentArtifact();\n }\n }\n }\n\n /**\n * Open the most recent artifact in the active conversation's artifact viewer.\n * Used for open:resource commands with resourceType Report/Dashboard where\n * the resourceId is an agent-internal ID, not a database artifact ID.\n */\n private openMostRecentArtifact(): void {\n if (!this.chatArea) return;\n\n // Find the last artifact across all messages\n const artifactMap = this.chatArea.artifactsByDetailId;\n let latestArtifact: { artifactId: string; versionId?: string } | null = null;\n for (const artifacts of artifactMap.values()) {\n if (artifacts.length > 0) {\n const last = artifacts[artifacts.length - 1];\n latestArtifact = {\n artifactId: last.artifactId,\n versionId: last.artifactVersionId\n };\n }\n }\n\n if (latestArtifact) {\n this.chatArea.onArtifactClicked(latestArtifact);\n } else {\n console.warn('No artifacts found in conversation to open for Report/Dashboard command');\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OnDestroy } from '@angular/core';
|
|
2
|
-
import { BaseResourceComponent
|
|
2
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
3
3
|
import { ResourceData } from '@memberjunction/core-entities';
|
|
4
4
|
import { TasksFullViewComponent } from '@memberjunction/ng-conversations';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
@@ -10,29 +10,16 @@ import * as i0 from "@angular/core";
|
|
|
10
10
|
* Supports URL deep-linking via taskId query parameter
|
|
11
11
|
*/
|
|
12
12
|
export declare class ChatTasksResource extends BaseResourceComponent implements OnDestroy {
|
|
13
|
-
private navigationService;
|
|
14
13
|
tasksView?: TasksFullViewComponent;
|
|
15
14
|
currentUser: any;
|
|
16
15
|
activeTaskId?: string;
|
|
17
|
-
private skipUrlUpdate;
|
|
18
|
-
private destroy$;
|
|
19
|
-
constructor(navigationService: NavigationService);
|
|
20
16
|
ngOnInit(): void;
|
|
21
17
|
ngOnDestroy(): void;
|
|
22
|
-
|
|
23
|
-
* Apply initial state from tab configuration.
|
|
24
|
-
* The shell populates queryParams from the URL, and nav params come from cross-resource linking.
|
|
25
|
-
*/
|
|
26
|
-
private applyNavigationParams;
|
|
18
|
+
protected OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void;
|
|
27
19
|
/**
|
|
28
20
|
* Handle task selection from the tasks view.
|
|
29
21
|
*/
|
|
30
22
|
onTaskSelected(taskId: string | null): void;
|
|
31
|
-
/**
|
|
32
|
-
* Update URL query string to reflect current state.
|
|
33
|
-
* Uses NavigationService for proper URL management that respects app-scoped routes.
|
|
34
|
-
*/
|
|
35
|
-
private updateUrl;
|
|
36
23
|
/**
|
|
37
24
|
* Get the environment ID from configuration or use default
|
|
38
25
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-tasks-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-tasks-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,SAAS,EAAa,MAAM,eAAe,CAAC;AAGnF,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"chat-tasks-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-tasks-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,SAAS,EAAa,MAAM,eAAe,CAAC;AAGnF,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;;AAE1E;;;;;GAKG;AACH,qBAsCa,iBAAkB,SAAQ,qBAAsB,YAAW,SAAS;IACvD,SAAS,CAAC,EAAE,sBAAsB,CAAC;IAEpD,WAAW,EAAE,GAAG,CAAQ;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IAE7B,QAAQ;IAsBR,WAAW;cAIQ,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAI9G;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAM3C;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACG,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjE;;OAEG;IACG,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCA9DpD,iBAAiB;2CAAjB,iBAAiB;CAiE7B"}
|
|
@@ -9,10 +9,8 @@ import { Metadata } from '@memberjunction/core';
|
|
|
9
9
|
import { RegisterClass } from '@memberjunction/global';
|
|
10
10
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
11
11
|
import { MJEnvironmentEntityExtended } from '@memberjunction/core-entities';
|
|
12
|
-
import { Subject } from 'rxjs';
|
|
13
12
|
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@memberjunction/ng-
|
|
15
|
-
import * as i2 from "@memberjunction/ng-conversations";
|
|
13
|
+
import * as i1 from "@memberjunction/ng-conversations";
|
|
16
14
|
const _c0 = ["tasksView"];
|
|
17
15
|
function ChatTasksResource_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
18
16
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
@@ -30,71 +28,39 @@ function ChatTasksResource_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
|
30
28
|
* Supports URL deep-linking via taskId query parameter
|
|
31
29
|
*/
|
|
32
30
|
let ChatTasksResource = class ChatTasksResource extends BaseResourceComponent {
|
|
33
|
-
navigationService;
|
|
34
31
|
tasksView;
|
|
35
32
|
currentUser = null;
|
|
36
33
|
activeTaskId;
|
|
37
|
-
skipUrlUpdate = true;
|
|
38
|
-
destroy$ = new Subject();
|
|
39
|
-
constructor(navigationService) {
|
|
40
|
-
super();
|
|
41
|
-
this.navigationService = navigationService;
|
|
42
|
-
}
|
|
43
34
|
ngOnInit() {
|
|
35
|
+
super.ngOnInit();
|
|
44
36
|
const md = new Metadata();
|
|
45
37
|
this.currentUser = md.CurrentUser;
|
|
46
|
-
// Apply initial state from
|
|
47
|
-
this.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
38
|
+
// Apply initial state from query params or tab config
|
|
39
|
+
const params = this.GetQueryParams();
|
|
40
|
+
const config = this.Data?.Configuration;
|
|
41
|
+
const taskId = params['taskId'] || config?.taskId;
|
|
42
|
+
if (taskId) {
|
|
43
|
+
this.activeTaskId = taskId;
|
|
44
|
+
}
|
|
45
|
+
// Push initial state to URL
|
|
46
|
+
this.UpdateQueryParams({ taskId: this.activeTaskId ?? null });
|
|
52
47
|
// Notify load complete after user is set
|
|
53
48
|
setTimeout(() => {
|
|
54
49
|
this.NotifyLoadComplete();
|
|
55
50
|
}, 100);
|
|
56
51
|
}
|
|
57
52
|
ngOnDestroy() {
|
|
58
|
-
|
|
59
|
-
this.destroy$.complete();
|
|
53
|
+
super.ngOnDestroy();
|
|
60
54
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
* The shell populates queryParams from the URL, and nav params come from cross-resource linking.
|
|
64
|
-
*/
|
|
65
|
-
applyNavigationParams() {
|
|
66
|
-
const config = this.Data?.Configuration;
|
|
67
|
-
if (!config)
|
|
68
|
-
return;
|
|
69
|
-
const qp = config['queryParams'];
|
|
70
|
-
const taskId = qp?.['taskId'] || config.taskId;
|
|
71
|
-
if (taskId) {
|
|
72
|
-
this.activeTaskId = taskId;
|
|
73
|
-
}
|
|
55
|
+
OnQueryParamsChanged(params, source) {
|
|
56
|
+
this.activeTaskId = params['taskId'] || undefined;
|
|
74
57
|
}
|
|
75
58
|
/**
|
|
76
59
|
* Handle task selection from the tasks view.
|
|
77
60
|
*/
|
|
78
61
|
onTaskSelected(taskId) {
|
|
79
62
|
this.activeTaskId = taskId || undefined;
|
|
80
|
-
|
|
81
|
-
this.updateUrl();
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Update URL query string to reflect current state.
|
|
86
|
-
* Uses NavigationService for proper URL management that respects app-scoped routes.
|
|
87
|
-
*/
|
|
88
|
-
updateUrl() {
|
|
89
|
-
const queryParams = {};
|
|
90
|
-
if (this.activeTaskId) {
|
|
91
|
-
queryParams['taskId'] = this.activeTaskId;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
queryParams['taskId'] = null;
|
|
95
|
-
}
|
|
96
|
-
// Use NavigationService to update query params properly
|
|
97
|
-
this.navigationService.UpdateActiveTabQueryParams(queryParams);
|
|
63
|
+
this.UpdateQueryParams({ taskId: this.activeTaskId ?? null });
|
|
98
64
|
}
|
|
99
65
|
/**
|
|
100
66
|
* Get the environment ID from configuration or use default
|
|
@@ -114,7 +80,7 @@ let ChatTasksResource = class ChatTasksResource extends BaseResourceComponent {
|
|
|
114
80
|
async GetResourceIconClass(data) {
|
|
115
81
|
return 'fa-solid fa-tasks';
|
|
116
82
|
}
|
|
117
|
-
static ɵfac = function ChatTasksResource_Factory(__ngFactoryType__) { return
|
|
83
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵChatTasksResource_BaseFactory; return function ChatTasksResource_Factory(__ngFactoryType__) { return (ɵChatTasksResource_BaseFactory || (ɵChatTasksResource_BaseFactory = i0.ɵɵgetInheritedFactory(ChatTasksResource)))(__ngFactoryType__ || ChatTasksResource); }; })();
|
|
118
84
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ChatTasksResource, selectors: [["mj-chat-tasks-resource"]], viewQuery: function ChatTasksResource_Query(rf, ctx) { if (rf & 1) {
|
|
119
85
|
i0.ɵɵviewQuery(_c0, 5);
|
|
120
86
|
} if (rf & 2) {
|
|
@@ -127,7 +93,7 @@ let ChatTasksResource = class ChatTasksResource extends BaseResourceComponent {
|
|
|
127
93
|
} if (rf & 2) {
|
|
128
94
|
i0.ɵɵadvance();
|
|
129
95
|
i0.ɵɵconditional(ctx.currentUser ? 1 : -1);
|
|
130
|
-
} }, dependencies: [
|
|
96
|
+
} }, dependencies: [i1.TasksFullViewComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-tasks-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n }\n "], encapsulation: 2 });
|
|
131
97
|
};
|
|
132
98
|
ChatTasksResource = __decorate([
|
|
133
99
|
RegisterClass(BaseResourceComponent, 'ChatTasksResource')
|
|
@@ -150,7 +116,7 @@ export { ChatTasksResource };
|
|
|
150
116
|
}
|
|
151
117
|
</div>
|
|
152
118
|
`, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-tasks-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n }\n "] }]
|
|
153
|
-
}],
|
|
119
|
+
}], null, { tasksView: [{
|
|
154
120
|
type: ViewChild,
|
|
155
121
|
args: ['tasksView']
|
|
156
122
|
}] }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-tasks-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-tasks-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAa,SAAS,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC
|
|
1
|
+
{"version":3,"file":"chat-tasks-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-tasks-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAa,SAAS,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;;;;;;IAgBpE,gDAOwB;IADtB,qNAAgB,6BAA4B,KAAC;IAE/C,iBAAqB;;;IAHnB,AADA,AADA,AADA,oDAA+B,mCACJ,qBACP,qCACS;;AAlBvC;;;;;GAKG;AAuCI,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,qBAAqB;IAClC,SAAS,CAA0B;IAEpD,WAAW,GAAQ,IAAI,CAAC;IACxB,YAAY,CAAU;IAE7B,QAAQ;QACN,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;QAElC,sDAAsD;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAK,MAAM,EAAE,MAAiB,CAAC;QAC9D,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC7B,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC;QAE9D,yCAAyC;QACzC,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,WAAW;QACT,KAAK,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;IAEkB,oBAAoB,CAAC,MAA8B,EAAE,MAA+B;QACrG,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAqB;QAClC,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,SAAS,CAAC;QACxC,IAAI,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAGD;;OAEG;IACH,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,IAAI,2BAA2B,CAAC,oBAAoB,CAAC;IACrG,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,mBAAmB,CAAC;IAC7B,CAAC;iPAhEU,iBAAiB,yBAAjB,iBAAiB;6DAAjB,iBAAiB;;;;;;YAjC1B,8BAAkC;YAChC,kGAAmB;YAWrB,iBAAM;;YAXJ,cAUC;YAVD,0CAUC;;;AAsBM,iBAAiB;IAtC7B,aAAa,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;GAsC7C,iBAAiB,CAiE7B;;iFAjEY,iBAAiB;cArC7B,SAAS;6BACI,KAAK,YACP,wBAAwB,YACxB;;;;;;;;;;;;;;KAcP,iBAkBY,iBAAiB,CAAC,IAAI;;kBAGpC,SAAS;mBAAC,WAAW;;kFADX,iBAAiB","sourcesContent":["import { Component, ViewEncapsulation, OnDestroy, ViewChild } from '@angular/core';\nimport { Metadata } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { MJEnvironmentEntityExtended } from '@memberjunction/core-entities';\nimport { TasksFullViewComponent } from '@memberjunction/ng-conversations';\nimport { Subject } from 'rxjs';\n/**\n * Chat Tasks Resource - displays the tasks full view for tab-based display\n * Extends BaseResourceComponent to work with the resource type system\n * Shows all tasks associated with conversations and artifacts\n * Supports URL deep-linking via taskId query parameter\n */\n@RegisterClass(BaseResourceComponent, 'ChatTasksResource')\n@Component({\n standalone: false,\n selector: 'mj-chat-tasks-resource',\n template: `\n <div class=\"chat-tasks-container\">\n @if (currentUser) {\n <mj-tasks-full-view\n #tasksView\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"'1=1'\"\n [activeTaskId]=\"activeTaskId\"\n (taskSelected)=\"onTaskSelected($any($event))\"\n style=\"height: 100%;\">\n </mj-tasks-full-view>\n }\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-tasks-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ChatTasksResource extends BaseResourceComponent implements OnDestroy {\n @ViewChild('tasksView') tasksView?: TasksFullViewComponent;\n\n public currentUser: any = null;\n public activeTaskId?: string;\n\n ngOnInit() {\n super.ngOnInit();\n const md = new Metadata();\n this.currentUser = md.CurrentUser;\n\n // Apply initial state from query params or tab config\n const params = this.GetQueryParams();\n const config = this.Data?.Configuration;\n const taskId = params['taskId'] || (config?.taskId as string);\n if (taskId) {\n this.activeTaskId = taskId;\n }\n\n // Push initial state to URL\n this.UpdateQueryParams({ taskId: this.activeTaskId ?? null });\n\n // Notify load complete after user is set\n setTimeout(() => {\n this.NotifyLoadComplete();\n }, 100);\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n }\n\n protected override OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void {\n this.activeTaskId = params['taskId'] || undefined;\n }\n\n /**\n * Handle task selection from the tasks view.\n */\n onTaskSelected(taskId: string | null): void {\n this.activeTaskId = taskId || undefined;\n this.UpdateQueryParams({ taskId: this.activeTaskId ?? null });\n }\n\n\n /**\n * Get the environment ID from configuration or use default\n */\n get environmentId(): string {\n return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /**\n * Get the display name for chat tasks\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Tasks';\n }\n\n /**\n * Get the icon class for chat tasks\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-tasks';\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ViewContainerRef, ElementRef, ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import { BaseResourceComponent
|
|
2
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
3
3
|
import { ResourceData, MJDashboardEntity, MJDashboardUserStateEntity, DashboardUserPermissions } from '@memberjunction/core-entities';
|
|
4
4
|
import type { ShareDialogResult } from '@memberjunction/ng-dashboards/core-dashboards.module';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
@@ -10,7 +10,6 @@ import * as i0 from "@angular/core";
|
|
|
10
10
|
*/
|
|
11
11
|
export declare class DashboardResource extends BaseResourceComponent {
|
|
12
12
|
private viewContainer;
|
|
13
|
-
private navigationService;
|
|
14
13
|
private cdr;
|
|
15
14
|
private componentRef;
|
|
16
15
|
private dataLoaded;
|
|
@@ -42,7 +41,7 @@ export declare class DashboardResource extends BaseResourceComponent {
|
|
|
42
41
|
* Clears any previous error state
|
|
43
42
|
*/
|
|
44
43
|
private clearError;
|
|
45
|
-
constructor(viewContainer: ViewContainerRef,
|
|
44
|
+
constructor(viewContainer: ViewContainerRef, cdr: ChangeDetectorRef);
|
|
46
45
|
set Data(value: ResourceData);
|
|
47
46
|
get Data(): ResourceData;
|
|
48
47
|
ngOnDestroy(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAA2B,UAAU,EAAE,iBAAiB,EAAU,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"dashboard-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAA2B,UAAU,EAAE,iBAAiB,EAAU,MAAM,eAAe,CAAC;AAC5H,OAAO,EAAE,qBAAqB,EAAqD,MAAM,2BAA2B,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAmB,0BAA0B,EAAwD,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAI7M,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sDAAsD,CAAC;;AAE9F;;;;GAIG;AACH,qBA4Ya,iBAAkB,SAAQ,qBAAqB;IAgEpD,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,GAAG;IAhEf,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,UAAU,CAAS;IACe,gBAAgB,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAExF,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4DAA4D;IAC5D,OAAO,CAAC,UAAU,CAAmC;IAErD,gFAAgF;IAChF,OAAO,CAAC,cAAc,CAAyC;IAE/D,yEAAyE;IAClE,eAAe,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAExD,iCAAiC;IAC1B,UAAU,UAAS;IAE1B,qBAAqB;IACd,WAAW,SAAM;IACjB,kBAAkB,SAAM;IAE/B,oDAAoD;IAC7C,oBAAoB,EAAE,wBAAwB,CAQnD;IAEF,0CAA0C;IACnC,eAAe,UAAS;IAE/B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACH,OAAO,CAAC,UAAU;gBAMN,aAAa,EAAE,gBAAgB,EAC/B,GAAG,EAAE,iBAAiB;IAKlC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAmBpC;IAGD,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED,WAAW,IAAI,IAAI;IAWnB;;OAEG;IACI,cAAc,IAAI,IAAI;IAQ7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACI,UAAU,IAAI,IAAI;IAWzB;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3C;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACI,eAAe,IAAI,IAAI;IAK9B;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAe3D;;;OAGG;YACW,aAAa;IAiD3B;;;;;OAKG;YACW,gBAAgB;IA6D9B;;OAEG;YACW,sBAAsB;cAwEpB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAiBhG;;OAEG;YACW,wBAAwB;IAuEtC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4B/B;;;OAGG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB1E;;OAEG;IACG,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAjjBtD,iBAAiB;2CAAjB,iBAAiB;CAojB7B"}
|