@memberjunction/ng-explorer-core 5.43.0 → 5.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/generated/lazy-feature-config.d.ts +1 -1
  2. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  3. package/dist/generated/lazy-feature-config.js +15 -3
  4. package/dist/generated/lazy-feature-config.js.map +1 -1
  5. package/dist/lib/about/about-dialog.component.d.ts +0 -1
  6. package/dist/lib/about/about-dialog.component.d.ts.map +1 -1
  7. package/dist/lib/about/about-dialog.component.js +217 -218
  8. package/dist/lib/about/about-dialog.component.js.map +1 -1
  9. package/dist/lib/command-palette/command-palette.component.js +8 -14
  10. package/dist/lib/command-palette/command-palette.component.js.map +1 -1
  11. package/dist/lib/conversation-feedback/conversation-feedback.js +66 -73
  12. package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
  13. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +35 -45
  14. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  15. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +6 -4
  16. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  17. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +33 -17
  18. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  19. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  20. package/dist/lib/resource-wrappers/dashboard-resource.component.js +9 -8
  21. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  22. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
  23. package/dist/lib/resource-wrappers/search-results-resource.component.js +35 -43
  24. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  25. package/dist/lib/shell/components/header/app-switcher.component.d.ts +6 -1
  26. package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
  27. package/dist/lib/shell/components/header/app-switcher.component.js +6 -3
  28. package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
  29. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +10 -2
  30. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  31. package/dist/lib/shell/components/tabs/component-cache-manager.js +19 -1
  32. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  33. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +1 -0
  34. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  35. package/dist/lib/shell/components/tabs/tab-container.component.js +3 -2
  36. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  37. package/dist/lib/shell/shell.module.d.ts +1 -1
  38. package/dist/lib/shell/shell.module.d.ts.map +1 -1
  39. package/dist/lib/shell/shell.module.js +4 -1
  40. package/dist/lib/shell/shell.module.js.map +1 -1
  41. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +5 -7
  42. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  43. package/dist/lib/single-dashboard/single-dashboard.component.js +17 -27
  44. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  45. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +6 -2
  46. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  47. package/dist/lib/single-list-detail/single-list-detail.component.js +48 -57
  48. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  49. package/dist/lib/single-search-result/single-search-result.component.js +17 -22
  50. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  51. package/dist/lib/user-notifications/user-notifications.component.d.ts +65 -9
  52. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  53. package/dist/lib/user-notifications/user-notifications.component.js +441 -261
  54. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  55. package/dist/module.d.ts +33 -32
  56. package/dist/module.d.ts.map +1 -1
  57. package/dist/module.js +18 -7
  58. package/dist/module.js.map +1 -1
  59. package/package.json +49 -47
  60. package/dist/lib/__tests__/explorer-core.test.d.ts +0 -2
  61. package/dist/lib/__tests__/explorer-core.test.d.ts.map +0 -1
  62. package/dist/lib/__tests__/explorer-core.test.js +0 -229
  63. package/dist/lib/__tests__/explorer-core.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-preferences-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts","../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\nimport { LogError, Metadata, RunView } from '@memberjunction/core';\nimport { MJDashboardEntityExtended, MJDashboardUserPreferenceEntity, MJApplicationEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface DashboardPreferencesResult {\n saved: boolean;\n preferences?: MJDashboardUserPreferenceEntity[];\n}\n\n@Component({\n standalone: false,\n selector: 'mj-dashboard-preferences-dialog',\n templateUrl: './dashboard-preferences-dialog.component.html',\n styleUrls: ['./dashboard-preferences-dialog.component.css']\n})\nexport class DashboardPreferencesDialogComponent extends BaseAngularComponent implements OnInit {\n @Input() public applicationId: string | null = null;\n @Input() public scope: 'Global' | 'App' = 'Global';\n @Output() public result = new EventEmitter<DashboardPreferencesResult>();\n\n public availableDashboards: MJDashboardEntityExtended[] = [];\n public configuredDashboards: MJDashboardEntityExtended[] = [];\n public applicationName: string = '';\n public loading: boolean = true;\n public saving: boolean = false;\n public error: string | null = null;\n public hasChanges: boolean = false;\n public isSysAdmin: boolean = false;\n public preferenceMode: 'personal' | 'system' = 'personal';\n\n private originalConfiguredIds: string[] = [];\n private currentUserPreferences: MJDashboardUserPreferenceEntity[] = [];\n private allAvailableDashboards: MJDashboardEntityExtended[] = [];\n\n async ngOnInit(): Promise<void> {\n try {\n await this.loadData();\n } catch (error) {\n LogError('Error initializing dashboard preferences dialog', null, error);\n this.error = 'Failed to load dashboard preferences';\n } finally {\n this.loading = false;\n }\n }\n\n private async loadData(): Promise<void> {\n const md = this.ProviderToUse;\n \n // Check if current user is sysadmin\n this.isSysAdmin = md.CurrentUser.Type.trim().toLowerCase() === 'owner';\n console.log('User is sysadmin:', this.isSysAdmin);\n \n // Default to personal preferences for all users (including sysadmin)\n this.preferenceMode = 'personal';\n \n // Load application name if we're in app scope\n if (this.scope === 'App' && this.applicationId) {\n await this.loadApplicationName();\n }\n\n // Get cached dashboards from MJ_Metadata dataset\n const ds = await md.GetAndCacheDatasetByName(\"MJ_Metadata\");\n if (!ds || !ds.Success) {\n throw new Error(ds?.Status || 'Failed to load metadata dataset');\n }\n\n const dashList = ds.Results.find(r => r.Code === 'Dashboards');\n if (!dashList) {\n throw new Error('Dashboards dataset not found');\n }\n\n // Filter dashboards by scope\n const appFilter = this.applicationId ? ` AND ApplicationID='${this.applicationId}'` : ' AND ApplicationID IS NULL';\n this.allAvailableDashboards = dashList.Results.filter((d: MJDashboardEntityExtended) => {\n if (this.scope === 'Global') {\n return d.Scope === 'Global' && !d.ApplicationID;\n } else {\n return UUIDsEqual(d.ApplicationID, this.applicationId) // ignore scope for dashboards that match app id, sometimes they have a global scope as they can be shown globally as well as app specific\n }\n });\n\n // Load current user preferences\n await this.loadCurrentPreferences();\n \n // Split dashboards into available and configured\n this.splitDashboards();\n \n // Store original state to detect changes\n this.originalConfiguredIds = this.configuredDashboards.map(d => d.ID);\n }\n\n private async loadApplicationName(): Promise<void> {\n if (!this.applicationId) return;\n \n try {\n const md = this.ProviderToUse;\n const ds = await md.GetAndCacheDatasetByName(\"MJ_Metadata\");\n const appList = ds.Results.find(r => r.Code === 'Applications');\n if (appList) {\n const app = appList.Results.find((a: MJApplicationEntity) => UUIDsEqual(a.ID, this.applicationId));\n this.applicationName = app?.Name || 'Unknown Application';\n }\n } catch (error) {\n LogError('Error loading application name', null, error);\n this.applicationName = 'Unknown Application';\n }\n }\n\n private async loadCurrentPreferences(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n \n const appFilter = this.applicationId ? ` AND ApplicationID='${this.applicationId}'` : '';\n const baseCondition = `Scope='${this.scope}'${appFilter}`;\n \n let filter: string;\n \n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n // Load system defaults only (UserID IS NULL)\n filter = `UserID IS NULL AND ${baseCondition}`;\n } else {\n // Load personal user preferences (including for sysadmin when in personal mode)\n // For personal mode, we ONLY load the user's specific preferences, no fallback to system defaults\n // This allows sysadmin to see their actual personal preferences vs system defaults\n filter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;\n }\n\n console.log('Loading preferences with filter:', filter);\n\n const prefsResult = await rv.RunView<MJDashboardUserPreferenceEntity>({\n EntityName: 'MJ: Dashboard User Preferences',\n ExtraFilter: filter,\n ResultType: 'entity_object',\n OrderBy: 'DisplayOrder',\n });\n\n this.currentUserPreferences = prefsResult?.Results || [];\n console.log('Loaded preferences:', this.currentUserPreferences.length);\n }\n\n private splitDashboards(): void {\n const configuredIds = new Set(this.currentUserPreferences.map(p => p.DashboardID));\n \n // Get configured dashboards in the right order\n this.configuredDashboards = this.currentUserPreferences\n .map(pref => this.allAvailableDashboards.find(d => UUIDsEqual(d.ID, pref.DashboardID)))\n .filter((d): d is MJDashboardEntityExtended => d !== undefined);\n \n // Get available dashboards (not configured)\n this.availableDashboards = this.allAvailableDashboards\n .filter(d => !configuredIds.has(d.ID))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n }\n\n public onDrop(event: CdkDragDrop<MJDashboardEntityExtended[]>): void {\n try {\n if (event.previousContainer === event.container) {\n // Reordering within the same list\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n // Moving between lists\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n \n // If moving to configured dashboards, sort the available list\n if (event.container.data === this.configuredDashboards) {\n this.availableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));\n }\n }\n \n this.checkForChanges();\n } catch (error) {\n LogError('Error in drag drop operation', null, error);\n this.error = 'Error reordering dashboards. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public addDashboard(dashboard: MJDashboardEntityExtended): void {\n try {\n const index = this.availableDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index !== -1) {\n this.availableDashboards.splice(index, 1);\n this.configuredDashboards.push(dashboard);\n this.checkForChanges();\n }\n } catch (error) {\n LogError('Error adding dashboard', null, error);\n this.error = 'Error adding dashboard. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public removeDashboard(dashboard: MJDashboardEntityExtended): void {\n try {\n const index = this.configuredDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index !== -1) {\n this.configuredDashboards.splice(index, 1);\n this.availableDashboards.push(dashboard);\n this.availableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));\n this.checkForChanges();\n }\n } catch (error) {\n LogError('Error removing dashboard', null, error);\n this.error = 'Error removing dashboard. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public async onPreferenceModeChange(): Promise<void> {\n try {\n this.loading = true;\n this.error = null;\n \n // Reload preferences with new mode\n await this.loadCurrentPreferences();\n this.splitDashboards();\n this.originalConfiguredIds = this.configuredDashboards.map(d => d.ID);\n this.hasChanges = false;\n \n } catch (error) {\n LogError('Error changing preference mode', null, error);\n this.error = 'Error loading preferences. Please try again.';\n } finally {\n this.loading = false;\n }\n }\n\n private checkForChanges(): void {\n try {\n const currentConfiguredIds = this.configuredDashboards.map(d => d.ID);\n \n // Check if the order or selection has changed\n this.hasChanges = currentConfiguredIds.length !== this.originalConfiguredIds.length ||\n currentConfiguredIds.some((id, index) => id !== this.originalConfiguredIds[index]);\n \n // Debug logging\n console.log('Dashboard preferences change check:', {\n original: this.originalConfiguredIds,\n current: currentConfiguredIds,\n hasChanges: this.hasChanges\n });\n } catch (error) {\n LogError('Error checking for changes', null, error);\n this.hasChanges = false;\n }\n }\n\n public async onSave(): Promise<void> {\n if (this.saving || !this.hasChanges) {\n console.log('Save cancelled:', { saving: this.saving, hasChanges: this.hasChanges });\n return;\n }\n\n try {\n this.saving = true;\n console.log('Starting save process with configured dashboards:', this.configuredDashboards.map(d => ({ id: d.ID, name: d.Name })));\n \n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Get existing preferences for this scope\n const baseCondition = this.scope === 'Global' \n ? `Scope='Global' AND ApplicationID IS NULL`\n : `Scope='App' AND ApplicationID='${this.applicationId}'`;\n \n let userFilter: string;\n \n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n // Managing system defaults\n userFilter = `UserID IS NULL AND ${baseCondition}`;\n } else {\n // Managing personal preferences\n userFilter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;\n }\n \n console.log('Loading existing preferences with filter:', userFilter);\n \n const existingPrefs = await rv.RunView<MJDashboardUserPreferenceEntity>({\n EntityName: 'MJ: Dashboard User Preferences',\n ExtraFilter: userFilter,\n ResultType: 'entity_object',\n });\n\n const existingPreferences = existingPrefs?.Results || [];\n console.log('Found existing preferences:', existingPreferences.length);\n\n // Create maps for efficient lookups\n const existingByDashboardId = new Map<string, MJDashboardUserPreferenceEntity>();\n existingPreferences.forEach(pref => {\n existingByDashboardId.set(pref.DashboardID, pref);\n });\n\n const configuredDashboardIds = new Set(this.configuredDashboards.map(d => d.ID));\n\n // Step 1: Delete preferences that are no longer configured\n const prefsToDelete = existingPreferences.filter(pref => !configuredDashboardIds.has(pref.DashboardID));\n console.log('Preferences to delete:', prefsToDelete.length);\n \n for (const pref of prefsToDelete) {\n console.log('Deleting preference for dashboard:', pref.DashboardID);\n if (!await pref.Delete()) {\n const errorMsg = pref.LatestResult?.Error || pref.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to delete preference: ${errorMsg}`);\n }\n }\n\n // Step 2: Update existing preferences or create new ones\n const newPreferences: MJDashboardUserPreferenceEntity[] = [];\n \n for (let i = 0; i < this.configuredDashboards.length; i++) {\n const dashboard = this.configuredDashboards[i];\n const newDisplayOrder = i + 1;\n \n let prefEntity = existingByDashboardId.get(dashboard.ID);\n \n if (prefEntity) {\n // Update existing preference\n console.log(`Updating existing preference for dashboard ${dashboard.Name}, new order: ${newDisplayOrder}`);\n prefEntity.DisplayOrder = newDisplayOrder;\n \n if (!await prefEntity.Save()) {\n const errorMsg = prefEntity.LatestResult?.Error || prefEntity.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to update preference for dashboard ${dashboard.Name}: ${errorMsg}`);\n }\n } else {\n // Create new preference\n console.log(`Creating new preference for dashboard ${dashboard.Name}, order: ${newDisplayOrder}`);\n prefEntity = await md.GetEntityObject<MJDashboardUserPreferenceEntity>('MJ: Dashboard User Preferences');\n \n // Set UserID based on preference mode\n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n prefEntity.UserID = null; // System default\n } else {\n prefEntity.UserID = md.CurrentUser.ID; // Personal preference\n }\n \n prefEntity.DashboardID = dashboard.ID;\n prefEntity.DisplayOrder = newDisplayOrder;\n prefEntity.Scope = this.scope;\n prefEntity.ApplicationID = this.applicationId;\n\n console.log('Creating preference entity:', {\n UserID: prefEntity.UserID,\n DashboardID: prefEntity.DashboardID,\n DisplayOrder: prefEntity.DisplayOrder,\n Scope: prefEntity.Scope,\n ApplicationID: prefEntity.ApplicationID\n });\n\n if (!await prefEntity.Save()) {\n const errorMsg = prefEntity.LatestResult?.Error || prefEntity.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to create preference for dashboard ${dashboard.Name}: ${errorMsg}`);\n }\n }\n \n newPreferences.push(prefEntity);\n }\n\n console.log('Successfully processed', newPreferences.length, 'preferences');\n\n // Emit success result\n this.result.emit({\n saved: true,\n preferences: newPreferences\n });\n\n } catch (error) {\n console.error('Save error:', error);\n LogError('Error saving dashboard preferences', null, error);\n this.error = `Failed to save preferences: ${error instanceof Error ? error.message : 'Unknown error'}`;\n \n // Clear error after 5 seconds\n setTimeout(() => {\n this.error = null;\n }, 5000);\n } finally {\n this.saving = false;\n }\n }\n\n public onCancel(): void {\n this.result.emit({ saved: false });\n }\n}","<mj-dialog [Visible]=\"true\" Title=\"Dashboard Preferences\"\n [Width]=\"800\"\n [Height]=\"600\"\n [MinWidth]=\"600\"\n (Close)=\"onCancel()\">\n<div class=\"dashboard-preferences-dialog\">\n <div class=\"dialog-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Dashboard Preferences</h3>\n <p class=\"scope-indicator\">\n @if (scope === 'Global') {\n <i class=\"fa-solid fa-globe\"></i> Global Scope\n } @else {\n <i class=\"fa-solid fa-layer-group\"></i> Application: {{ applicationName }}\n }\n </p>\n @if (isSysAdmin && scope === 'Global') {\n <div class=\"preference-mode-selector\">\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"personal\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n Personal Preferences\n </label>\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"system\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n System Defaults\n </label>\n </div>\n }\n </div>\n\n <div class=\"dialog-content\">\n @if (loading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading preferences...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ error }}\n </div>\n }\n\n @if (!loading && !error) {\n <div class=\"preferences-panels\">\n <!-- Available Dashboards Panel -->\n <div class=\"panel available-panel\">\n <h4><i class=\"fa-solid fa-list\"></i> Available Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #availableList=\"cdkDropList\"\n [cdkDropListData]=\"availableDashboards\"\n [cdkDropListConnectedTo]=\"[configuredList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (availableDashboards.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n All dashboards are configured\n </div>\n }\n\n @for (dashboard of availableDashboards; track dashboard.ID) {\n <div class=\"dashboard-item available-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"add-button\"\n (click)=\"addDashboard(dashboard)\"\n title=\"Add to configured dashboards\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Configured Dashboards Panel -->\n <div class=\"panel configured-panel\">\n <h4><i class=\"fa-solid fa-list-ol\"></i> Configured Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #configuredList=\"cdkDropList\"\n [cdkDropListData]=\"configuredDashboards\"\n [cdkDropListConnectedTo]=\"[availableList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (configuredDashboards.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No dashboards configured\n </div>\n }\n\n @for (dashboard of configuredDashboards; track dashboard.ID; let i = $index) {\n <div class=\"dashboard-item configured-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <span class=\"order-number\">{{ i + 1 }}</span>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"remove-button\"\n (click)=\"removeDashboard(dashboard)\"\n title=\"Remove from configured dashboards\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!hasChanges || saving\"\n (click)=\"onSave()\">\n @if (saving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Save Changes\n }\n </button>\n </mj-dialog-actions>\n</div>\n</mj-dialog>\n"]}
1
+ {"version":3,"file":"dashboard-preferences-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts","../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\nimport { LogError, Metadata, RunView } from '@memberjunction/core';\nimport { MJDashboardEntityExtended, MJDashboardUserPreferenceEntity, MJApplicationEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface DashboardPreferencesResult {\n saved: boolean;\n preferences?: MJDashboardUserPreferenceEntity[];\n}\n\n@Component({\n standalone: false,\n selector: 'mj-dashboard-preferences-dialog',\n templateUrl: './dashboard-preferences-dialog.component.html',\n styleUrls: ['./dashboard-preferences-dialog.component.css']\n})\nexport class DashboardPreferencesDialogComponent extends BaseAngularComponent implements OnInit {\n @Input() public applicationId: string | null = null;\n @Input() public scope: 'Global' | 'App' = 'Global';\n @Output() public result = new EventEmitter<DashboardPreferencesResult>();\n\n public availableDashboards: MJDashboardEntityExtended[] = [];\n public configuredDashboards: MJDashboardEntityExtended[] = [];\n public applicationName: string = '';\n public loading: boolean = true;\n public saving: boolean = false;\n public error: string | null = null;\n public hasChanges: boolean = false;\n public isSysAdmin: boolean = false;\n public preferenceMode: 'personal' | 'system' = 'personal';\n\n private originalConfiguredIds: string[] = [];\n private currentUserPreferences: MJDashboardUserPreferenceEntity[] = [];\n private allAvailableDashboards: MJDashboardEntityExtended[] = [];\n\n async ngOnInit(): Promise<void> {\n try {\n await this.loadData();\n } catch (error) {\n LogError('Error initializing dashboard preferences dialog', null, error);\n this.error = 'Failed to load dashboard preferences';\n } finally {\n this.loading = false;\n }\n }\n\n private async loadData(): Promise<void> {\n const md = this.ProviderToUse;\n \n // Check if current user is sysadmin\n this.isSysAdmin = md.CurrentUser.Type.trim().toLowerCase() === 'owner';\n console.log('User is sysadmin:', this.isSysAdmin);\n \n // Default to personal preferences for all users (including sysadmin)\n this.preferenceMode = 'personal';\n \n // Load application name if we're in app scope\n if (this.scope === 'App' && this.applicationId) {\n await this.loadApplicationName();\n }\n\n // Get cached dashboards from MJ_Metadata dataset\n const ds = await md.GetAndCacheDatasetByName(\"MJ_Metadata\");\n if (!ds || !ds.Success) {\n throw new Error(ds?.Status || 'Failed to load metadata dataset');\n }\n\n const dashList = ds.Results.find(r => r.Code === 'Dashboards');\n if (!dashList) {\n throw new Error('Dashboards dataset not found');\n }\n\n // Filter dashboards by scope\n const appFilter = this.applicationId ? ` AND ApplicationID='${this.applicationId}'` : ' AND ApplicationID IS NULL';\n this.allAvailableDashboards = dashList.Results.filter((d: MJDashboardEntityExtended) => {\n if (this.scope === 'Global') {\n return d.Scope === 'Global' && !d.ApplicationID;\n } else {\n return UUIDsEqual(d.ApplicationID, this.applicationId) // ignore scope for dashboards that match app id, sometimes they have a global scope as they can be shown globally as well as app specific\n }\n });\n\n // Load current user preferences\n await this.loadCurrentPreferences();\n \n // Split dashboards into available and configured\n this.splitDashboards();\n \n // Store original state to detect changes\n this.originalConfiguredIds = this.configuredDashboards.map(d => d.ID);\n }\n\n private async loadApplicationName(): Promise<void> {\n if (!this.applicationId) return;\n \n try {\n const md = this.ProviderToUse;\n const ds = await md.GetAndCacheDatasetByName(\"MJ_Metadata\");\n const appList = ds.Results.find(r => r.Code === 'Applications');\n if (appList) {\n const app = appList.Results.find((a: MJApplicationEntity) => UUIDsEqual(a.ID, this.applicationId));\n this.applicationName = app?.Name || 'Unknown Application';\n }\n } catch (error) {\n LogError('Error loading application name', null, error);\n this.applicationName = 'Unknown Application';\n }\n }\n\n private async loadCurrentPreferences(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const md = this.ProviderToUse;\n \n const appFilter = this.applicationId ? ` AND ApplicationID='${this.applicationId}'` : '';\n const baseCondition = `Scope='${this.scope}'${appFilter}`;\n \n let filter: string;\n \n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n // Load system defaults only (UserID IS NULL)\n filter = `UserID IS NULL AND ${baseCondition}`;\n } else {\n // Load personal user preferences (including for sysadmin when in personal mode)\n // For personal mode, we ONLY load the user's specific preferences, no fallback to system defaults\n // This allows sysadmin to see their actual personal preferences vs system defaults\n filter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;\n }\n\n console.log('Loading preferences with filter:', filter);\n\n const prefsResult = await rv.RunView<MJDashboardUserPreferenceEntity>({\n EntityName: 'MJ: Dashboard User Preferences',\n ExtraFilter: filter,\n ResultType: 'entity_object',\n OrderBy: 'DisplayOrder',\n });\n\n this.currentUserPreferences = prefsResult?.Results || [];\n console.log('Loaded preferences:', this.currentUserPreferences.length);\n }\n\n private splitDashboards(): void {\n const configuredIds = new Set(this.currentUserPreferences.map(p => p.DashboardID));\n \n // Get configured dashboards in the right order\n this.configuredDashboards = this.currentUserPreferences\n .map(pref => this.allAvailableDashboards.find(d => UUIDsEqual(d.ID, pref.DashboardID)))\n .filter((d): d is MJDashboardEntityExtended => d !== undefined);\n \n // Get available dashboards (not configured)\n this.availableDashboards = this.allAvailableDashboards\n .filter(d => !configuredIds.has(d.ID))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n }\n\n public onDrop(event: CdkDragDrop<MJDashboardEntityExtended[]>): void {\n try {\n if (event.previousContainer === event.container) {\n // Reordering within the same list\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n // Moving between lists\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n \n // If moving to configured dashboards, sort the available list\n if (event.container.data === this.configuredDashboards) {\n this.availableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));\n }\n }\n \n this.checkForChanges();\n } catch (error) {\n LogError('Error in drag drop operation', null, error);\n this.error = 'Error reordering dashboards. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public addDashboard(dashboard: MJDashboardEntityExtended): void {\n try {\n const index = this.availableDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index !== -1) {\n this.availableDashboards.splice(index, 1);\n this.configuredDashboards.push(dashboard);\n this.checkForChanges();\n }\n } catch (error) {\n LogError('Error adding dashboard', null, error);\n this.error = 'Error adding dashboard. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public removeDashboard(dashboard: MJDashboardEntityExtended): void {\n try {\n const index = this.configuredDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index !== -1) {\n this.configuredDashboards.splice(index, 1);\n this.availableDashboards.push(dashboard);\n this.availableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));\n this.checkForChanges();\n }\n } catch (error) {\n LogError('Error removing dashboard', null, error);\n this.error = 'Error removing dashboard. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public async onPreferenceModeChange(): Promise<void> {\n try {\n this.loading = true;\n this.error = null;\n \n // Reload preferences with new mode\n await this.loadCurrentPreferences();\n this.splitDashboards();\n this.originalConfiguredIds = this.configuredDashboards.map(d => d.ID);\n this.hasChanges = false;\n \n } catch (error) {\n LogError('Error changing preference mode', null, error);\n this.error = 'Error loading preferences. Please try again.';\n } finally {\n this.loading = false;\n }\n }\n\n private checkForChanges(): void {\n try {\n const currentConfiguredIds = this.configuredDashboards.map(d => d.ID);\n \n // Check if the order or selection has changed\n this.hasChanges = currentConfiguredIds.length !== this.originalConfiguredIds.length ||\n currentConfiguredIds.some((id, index) => id !== this.originalConfiguredIds[index]);\n \n // Debug logging\n console.log('Dashboard preferences change check:', {\n original: this.originalConfiguredIds,\n current: currentConfiguredIds,\n hasChanges: this.hasChanges\n });\n } catch (error) {\n LogError('Error checking for changes', null, error);\n this.hasChanges = false;\n }\n }\n\n public async onSave(): Promise<void> {\n if (this.saving || !this.hasChanges) {\n console.log('Save cancelled:', { saving: this.saving, hasChanges: this.hasChanges });\n return;\n }\n\n try {\n this.saving = true;\n console.log('Starting save process with configured dashboards:', this.configuredDashboards.map(d => ({ id: d.ID, name: d.Name })));\n \n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Get existing preferences for this scope\n const baseCondition = this.scope === 'Global' \n ? `Scope='Global' AND ApplicationID IS NULL`\n : `Scope='App' AND ApplicationID='${this.applicationId}'`;\n \n let userFilter: string;\n \n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n // Managing system defaults\n userFilter = `UserID IS NULL AND ${baseCondition}`;\n } else {\n // Managing personal preferences\n userFilter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;\n }\n \n console.log('Loading existing preferences with filter:', userFilter);\n \n const existingPrefs = await rv.RunView<MJDashboardUserPreferenceEntity>({\n EntityName: 'MJ: Dashboard User Preferences',\n ExtraFilter: userFilter,\n ResultType: 'entity_object',\n });\n\n const existingPreferences = existingPrefs?.Results || [];\n console.log('Found existing preferences:', existingPreferences.length);\n\n // Create maps for efficient lookups\n const existingByDashboardId = new Map<string, MJDashboardUserPreferenceEntity>();\n existingPreferences.forEach(pref => {\n existingByDashboardId.set(pref.DashboardID, pref);\n });\n\n const configuredDashboardIds = new Set(this.configuredDashboards.map(d => d.ID));\n\n // Step 1: Delete preferences that are no longer configured\n const prefsToDelete = existingPreferences.filter(pref => !configuredDashboardIds.has(pref.DashboardID));\n console.log('Preferences to delete:', prefsToDelete.length);\n \n for (const pref of prefsToDelete) {\n console.log('Deleting preference for dashboard:', pref.DashboardID);\n if (!await pref.Delete()) {\n const errorMsg = pref.LatestResult?.Error || pref.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to delete preference: ${errorMsg}`);\n }\n }\n\n // Step 2: Update existing preferences or create new ones\n const newPreferences: MJDashboardUserPreferenceEntity[] = [];\n \n for (let i = 0; i < this.configuredDashboards.length; i++) {\n const dashboard = this.configuredDashboards[i];\n const newDisplayOrder = i + 1;\n \n let prefEntity = existingByDashboardId.get(dashboard.ID);\n \n if (prefEntity) {\n // Update existing preference\n console.log(`Updating existing preference for dashboard ${dashboard.Name}, new order: ${newDisplayOrder}`);\n prefEntity.DisplayOrder = newDisplayOrder;\n \n if (!await prefEntity.Save()) {\n const errorMsg = prefEntity.LatestResult?.Error || prefEntity.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to update preference for dashboard ${dashboard.Name}: ${errorMsg}`);\n }\n } else {\n // Create new preference\n console.log(`Creating new preference for dashboard ${dashboard.Name}, order: ${newDisplayOrder}`);\n prefEntity = await md.GetEntityObject<MJDashboardUserPreferenceEntity>('MJ: Dashboard User Preferences');\n \n // Set UserID based on preference mode\n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n prefEntity.UserID = null; // System default\n } else {\n prefEntity.UserID = md.CurrentUser.ID; // Personal preference\n }\n \n prefEntity.DashboardID = dashboard.ID;\n prefEntity.DisplayOrder = newDisplayOrder;\n prefEntity.Scope = this.scope;\n prefEntity.ApplicationID = this.applicationId;\n\n console.log('Creating preference entity:', {\n UserID: prefEntity.UserID,\n DashboardID: prefEntity.DashboardID,\n DisplayOrder: prefEntity.DisplayOrder,\n Scope: prefEntity.Scope,\n ApplicationID: prefEntity.ApplicationID\n });\n\n if (!await prefEntity.Save()) {\n const errorMsg = prefEntity.LatestResult?.Error || prefEntity.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to create preference for dashboard ${dashboard.Name}: ${errorMsg}`);\n }\n }\n \n newPreferences.push(prefEntity);\n }\n\n console.log('Successfully processed', newPreferences.length, 'preferences');\n\n // Emit success result\n this.result.emit({\n saved: true,\n preferences: newPreferences\n });\n\n } catch (error) {\n console.error('Save error:', error);\n LogError('Error saving dashboard preferences', null, error);\n this.error = `Failed to save preferences: ${error instanceof Error ? error.message : 'Unknown error'}`;\n \n // Clear error after 5 seconds\n setTimeout(() => {\n this.error = null;\n }, 5000);\n } finally {\n this.saving = false;\n }\n }\n\n public onCancel(): void {\n this.result.emit({ saved: false });\n }\n}","<mj-dialog [Visible]=\"true\" Title=\"Dashboard Preferences\"\n [Width]=\"800\"\n [Height]=\"600\"\n [MinWidth]=\"600\"\n (Close)=\"onCancel()\">\n<div class=\"dashboard-preferences-dialog\">\n <div class=\"dialog-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Dashboard Preferences</h3>\n <p class=\"scope-indicator\">\n @if (scope === 'Global') {\n <i class=\"fa-solid fa-globe\"></i> Global Scope\n } @else {\n <i class=\"fa-solid fa-layer-group\"></i> Application: {{ applicationName }}\n }\n </p>\n @if (isSysAdmin && scope === 'Global') {\n <div class=\"preference-mode-selector\">\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"personal\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n Personal Preferences\n </label>\n <label>\n <input type=\"radio\"\n name=\"preferenceMode\"\n value=\"system\"\n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n System Defaults\n </label>\n </div>\n }\n </div>\n\n <div class=\"dialog-content\">\n @if (loading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading preferences...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <mj-empty-state\n Variant=\"error\"\n Size=\"compact\"\n Icon=\"fa-solid fa-triangle-exclamation\"\n [Title]=\"error\" />\n }\n\n @if (!loading && !error) {\n <div class=\"preferences-panels\">\n <!-- Available Dashboards Panel -->\n <div class=\"panel available-panel\">\n <h4><i class=\"fa-solid fa-list\"></i> Available Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #availableList=\"cdkDropList\"\n [cdkDropListData]=\"availableDashboards\"\n [cdkDropListConnectedTo]=\"[configuredList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (availableDashboards.length === 0) {\n <mj-empty-state\n Variant=\"success\"\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-check\"\n Title=\"All dashboards are configured\" />\n }\n\n @for (dashboard of availableDashboards; track dashboard.ID) {\n <div class=\"dashboard-item available-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"add-button\"\n (click)=\"addDashboard(dashboard)\"\n title=\"Add to configured dashboards\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Configured Dashboards Panel -->\n <div class=\"panel configured-panel\">\n <h4><i class=\"fa-solid fa-list-ol\"></i> Configured Dashboards</h4>\n <div class=\"dashboard-list\"\n cdkDropList\n #configuredList=\"cdkDropList\"\n [cdkDropListData]=\"configuredDashboards\"\n [cdkDropListConnectedTo]=\"[availableList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n\n @if (configuredDashboards.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-info\"\n Title=\"No dashboards configured\" />\n }\n\n @for (dashboard of configuredDashboards; track dashboard.ID; let i = $index) {\n <div class=\"dashboard-item configured-item\"\n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <span class=\"order-number\">{{ i + 1 }}</span>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\"\n class=\"remove-button\"\n (click)=\"removeDashboard(dashboard)\"\n title=\"Remove from configured dashboards\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button type=\"button\"\n class=\"btn btn-secondary\"\n (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!hasChanges || saving\"\n (click)=\"onSave()\">\n @if (saving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Save Changes\n }\n </button>\n </mj-dialog-actions>\n</div>\n</mj-dialog>\n"]}
@@ -2,7 +2,8 @@ import { OnDestroy, ChangeDetectorRef } from '@angular/core';
2
2
  import { CompositeKey } from '@memberjunction/core';
3
3
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
4
4
  import { ResourceData, MJConversationEntity } from '@memberjunction/core-entities';
5
- import { ConversationChatAreaComponent, ConversationListComponent, MentionAutocompleteService, ConversationStreamingService, ActiveTasksService, PendingAttachment, UICommandHandlerService, ConversationBridgeService } from '@memberjunction/ng-conversations';
5
+ import { ConversationChatAreaComponent, ConversationListComponent, ConversationStreamingService, ActiveTasksService, UICommandHandlerService, ConversationBridgeService } from '@memberjunction/ng-conversations';
6
+ import { PendingAttachment } from '@memberjunction/ng-composer';
6
7
  import { NavigationRequest } from '@memberjunction/ng-artifacts';
7
8
  import * as i0 from "@angular/core";
8
9
  /**
@@ -17,7 +18,6 @@ import * as i0 from "@angular/core";
17
18
  * - State flows down to children via @Input, events flow up via @Output
18
19
  */
19
20
  export declare class ChatConversationsResource extends BaseResourceComponent implements OnDestroy {
20
- private mentionAutocompleteService;
21
21
  private cdr;
22
22
  private streamingService;
23
23
  private activeTasksService;
@@ -45,13 +45,14 @@ export declare class ChatConversationsResource extends BaseResourceComponent imp
45
45
  private readonly SIDEBAR_MIN_WIDTH;
46
46
  private readonly SIDEBAR_MAX_WIDTH;
47
47
  pendingArtifactId: string | null;
48
+ pendingArtifactConversationId: string | null;
48
49
  /**
49
50
  * A pending request to open the REALTIME SESSION REVIEW overlay (deep link /
50
51
  * cross-resource nav with `realtimeSessionId`, e.g. the AI Agent Session form's
51
52
  * "open session" pill). Applied once after the chat area renders — this is also the
52
53
  * reference example for invoking an EXISTING realtime session programmatically:
53
54
  * `await chatArea.OpenRealtimeSessionReview(agentSessionId)` (a NEW session starts
54
- * through the composer's phone button / `RealtimeSessionService.StartVoiceSession`).
55
+ * through the composer's phone button / `RealtimeSessionService.StartRealtimeSession`).
55
56
  */
56
57
  pendingRealtimeSessionId: string | null;
57
58
  pendingArtifactVersionNumber: number | null;
@@ -60,7 +61,8 @@ export declare class ChatConversationsResource extends BaseResourceComponent imp
60
61
  private readonly USER_SETTING_SIDEBAR_KEY;
61
62
  private saveSettingsTimeout;
62
63
  private engine;
63
- constructor(mentionAutocompleteService: MentionAutocompleteService, cdr: ChangeDetectorRef, streamingService: ConversationStreamingService, activeTasksService: ActiveTasksService, uiCommandHandler: UICommandHandlerService, bridge: ConversationBridgeService);
64
+ private mentionAutocompleteService;
65
+ constructor(cdr: ChangeDetectorRef, streamingService: ConversationStreamingService, activeTasksService: ActiveTasksService, uiCommandHandler: UICommandHandlerService, bridge: ConversationBridgeService);
64
66
  ngOnInit(): Promise<void>;
65
67
  ngOnDestroy(): void;
66
68
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"chat-conversations-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,SAAS,EAAa,iBAAiB,EAAgB,MAAM,eAAe,CAAC;AACpH,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,YAAY,EAA+B,oBAAoB,EAA2D,MAAM,+BAA+B,CAAC;AACzK,OAAO,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAEjQ,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;;AAGjE;;;;;;;;;;GAUG;AACH,qBAuNa,yBAA0B,SAAQ,qBAAsB,YAAW,SAAS;IAoDrF,OAAO,CAAC,0BAA0B;IAClC,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,MAAM;IAxDe,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IACrD,QAAQ,CAAC,EAAE,6BAA6B,CAAC;IAEzD,WAAW,EAAE,GAAG,CAAQ;IAC/B,OAAO,CAAC,aAAa,CAAQ;IAGtB,OAAO,EAAE,OAAO,CAAS;IAGzB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7C,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IACzD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,wBAAwB,EAAE,OAAO,CAAS;IAC1C,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5C,kBAAkB,EAAE,OAAO,CAAS;IACpC,eAAe,EAAE,OAAO,CAAQ;IAChC,YAAY,EAAE,OAAO,CAAS;IAC9B,yBAAyB,EAAE,OAAO,CAAS;IAC3C,uBAAuB,EAAE,OAAO,CAAS;IAGzC,YAAY,EAAE,MAAM,CAAO;IAClC,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,mBAAmB,CAAa;IACxC,OAAO,CAAC,uBAAuB,CAAa;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAGlC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C;;;;;;;OAOG;IACI,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,4BAA4B,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnD,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3C,wBAAwB,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAQ;IAGnE,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAgC;IACzE,OAAO,CAAC,mBAAmB,CAA8C;IAEzE,OAAO,CAAC,MAAM,CAA+B;gBAGnC,0BAA0B,EAAE,0BAA0B,EACtD,GAAG,EAAE,iBAAiB,EACtB,gBAAgB,EAAE,4BAA4B,EAC9C,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,yBAAyB;IAKrC,QAAQ;IAoEd,WAAW;IAcX;;;;OAIG;YACW,iBAAiB;IAuB/B;;;OAGG;YACW,sBAAsB;IAYpC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAiChC,gHAAgH;IAChH,OAAO,CAAC,iCAAiC;IAiBzC;;;;;;OAMG;cACgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IA0B/G;;;OAGG;IACH;;OAEG;YACW,kBAAkB;IAuBhC;;;OAGG;IACH,OAAO,CAAC,SAAS;IA+BjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACG,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IASjE;;OAEG;IACG,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ/D;;;;OAIG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;;OAGG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAgB9C;;OAEG;IACG,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnE,cAAc,IAAI,IAAI;IAItB;;OAEG;IAEH,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAiBxC;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,aAAa,IAAI,IAAI;IAMrB;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAc7C;;OAEG;IACH,OAAO,CAAC,mBAAmB,CASzB;IAEF;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAcxB;IAEF;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,YAAY,IAAI,IAAI;IAMpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;YACW,wBAAwB;IAiCtC;;;OAGG;YACW,gBAAgB;IAqC9B;;OAEG;IACH,0BAA0B,IAAI,IAAI;IAclC;;;OAGG;IACG,qBAAqB,CAAC,KAAK,EAAE;QACjC,YAAY,EAAE,oBAAoB,CAAC;QACnC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjB;;OAEG;IACH,qBAAqB,CAAC,KAAK,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAejG;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,yBAAyB,IAAI,IAAI;IAOjC;;OAEG;IACH,wBAAwB,IAAI,IAAI;IAKhC;;;OAGG;IACH,yBAAyB,CAAC,KAAK,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,iBAAiB,EAAE,CAAA;KAAC,GAAG,IAAI;IAKxF;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE;QAC3B,IAAI,EAAE,cAAc,GAAG,YAAY,CAAC;QACpC,EAAE,EAAE,MAAM,CAAC;QACX,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI;IAwBR;;;OAGG;IACH,kBAAkB,CAAC,KAAK,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAC,GAAG,IAAI;IAIjF;;;OAGG;IACG,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiB/B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;yCA7zBnB,yBAAyB;2CAAzB,yBAAyB;CAm1BrC"}
1
+ {"version":3,"file":"chat-conversations-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import { CompositeKey } from '@memberjunction/core';
9
9
  import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
10
10
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
11
11
  import { MJEnvironmentEntityExtended, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';
12
+ import { MentionAutocompleteService } from '@memberjunction/ng-conversations';
12
13
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
13
14
  import { takeUntil } from 'rxjs';
14
15
  import * as i0 from "@angular/core";
@@ -24,16 +25,19 @@ function ChatConversationsResource_Conditional_0_Conditional_1_Template(rf, ctx)
24
25
  } }
25
26
  function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
26
27
  const _r3 = i0.ɵɵgetCurrentView();
27
- i0.ɵɵelementStart(0, "mj-conversation-list", 12, 0);
28
+ i0.ɵɵelementStart(0, "mj-conversation-list", 11, 0);
28
29
  i0.ɵɵlistener("conversationSelected", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationSelected_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); })("conversationDeleted", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationDeleted_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationDeleted($event)); })("newConversationRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_newConversationRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onNewConversationRequested()); })("pinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_pinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.pinSidebar()); })("unpinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_unpinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.unpinSidebar()); })("refreshRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_refreshRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRefreshRequested()); });
29
30
  i0.ɵɵelementEnd();
31
+ i0.ɵɵelementStart(2, "mj-conversation-routines-section", 12);
32
+ i0.ɵɵlistener("openEntityRecord", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_routines_section_openEntityRecord_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("openConversation", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_routines_section_openConversation_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); });
33
+ i0.ɵɵelementEnd();
30
34
  } if (rf & 2) {
31
35
  const ctx_r1 = i0.ɵɵnextContext(3);
32
36
  i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("selectedConversationId", ctx_r1.selectedConversationId)("renamedConversationId", ctx_r1.renamedConversationId)("isSidebarPinned", ctx_r1.isSidebarPinned)("isMobileView", ctx_r1.isMobileView);
33
37
  } }
34
38
  function ChatConversationsResource_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
35
39
  i0.ɵɵelementStart(0, "div", 10);
36
- i0.ɵɵconditionalCreate(1, ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template, 2, 6, "mj-conversation-list", 11);
40
+ i0.ɵɵconditionalCreate(1, ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template, 3, 6);
37
41
  i0.ɵɵelementEnd();
38
42
  } if (rf & 2) {
39
43
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -55,7 +59,7 @@ function ChatConversationsResource_Conditional_0_Conditional_5_Template(rf, ctx)
55
59
  i0.ɵɵelementEnd();
56
60
  } if (rf & 2) {
57
61
  const ctx_r1 = i0.ɵɵnextContext(2);
58
- i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("conversationId", ctx_r1.selectedConversationId)("conversation", ctx_r1.selectedConversation)("threadId", ctx_r1.selectedThreadId)("isNewConversation", ctx_r1.isNewUnsavedConversation)("pendingMessage", ctx_r1.pendingMessageToSend)("pendingAttachments", ctx_r1.pendingAttachmentsToSend)("pendingArtifactId", ctx_r1.pendingArtifactId)("pendingArtifactVersionNumber", ctx_r1.pendingArtifactVersionNumber)("showSidebarToggle", ctx_r1.isSidebarCollapsed && ctx_r1.isSidebarSettingsLoaded);
62
+ i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("conversationId", ctx_r1.selectedConversationId)("conversation", ctx_r1.selectedConversation)("threadId", ctx_r1.selectedThreadId)("isNewConversation", ctx_r1.isNewUnsavedConversation)("pendingMessage", ctx_r1.pendingMessageToSend)("pendingAttachments", ctx_r1.pendingAttachmentsToSend)("pendingArtifactId", ctx_r1.pendingArtifactId)("pendingArtifactConversationId", ctx_r1.pendingArtifactConversationId)("pendingArtifactVersionNumber", ctx_r1.pendingArtifactVersionNumber)("showSidebarToggle", ctx_r1.isSidebarCollapsed && ctx_r1.isSidebarSettingsLoaded);
59
63
  } }
60
64
  function ChatConversationsResource_Conditional_0_Template(rf, ctx) { if (rf & 1) {
61
65
  i0.ɵɵelementStart(0, "div", 2);
@@ -63,7 +67,7 @@ function ChatConversationsResource_Conditional_0_Template(rf, ctx) { if (rf & 1)
63
67
  i0.ɵɵconditionalCreate(2, ChatConversationsResource_Conditional_0_Conditional_2_Template, 2, 7, "div", 5);
64
68
  i0.ɵɵconditionalCreate(3, ChatConversationsResource_Conditional_0_Conditional_3_Template, 1, 0, "div", 6);
65
69
  i0.ɵɵelementStart(4, "div", 7);
66
- i0.ɵɵconditionalCreate(5, ChatConversationsResource_Conditional_0_Conditional_5_Template, 2, 11, "mj-conversation-chat-area", 8);
70
+ i0.ɵɵconditionalCreate(5, ChatConversationsResource_Conditional_0_Conditional_5_Template, 2, 12, "mj-conversation-chat-area", 8);
67
71
  i0.ɵɵelementEnd()();
68
72
  } if (rf & 2) {
69
73
  const ctx_r1 = i0.ɵɵnextContext();
@@ -93,7 +97,6 @@ function ChatConversationsResource_Conditional_1_Template(rf, ctx) { if (rf & 1)
93
97
  * - State flows down to children via @Input, events flow up via @Output
94
98
  */
95
99
  let ChatConversationsResource = class ChatConversationsResource extends BaseResourceComponent {
96
- mentionAutocompleteService;
97
100
  cdr;
98
101
  streamingService;
99
102
  activeTasksService;
@@ -125,13 +128,14 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
125
128
  SIDEBAR_MAX_WIDTH = 500;
126
129
  // Pending navigation state
127
130
  pendingArtifactId = null;
131
+ pendingArtifactConversationId = null;
128
132
  /**
129
133
  * A pending request to open the REALTIME SESSION REVIEW overlay (deep link /
130
134
  * cross-resource nav with `realtimeSessionId`, e.g. the AI Agent Session form's
131
135
  * "open session" pill). Applied once after the chat area renders — this is also the
132
136
  * reference example for invoking an EXISTING realtime session programmatically:
133
137
  * `await chatArea.OpenRealtimeSessionReview(agentSessionId)` (a NEW session starts
134
- * through the composer's phone button / `RealtimeSessionService.StartVoiceSession`).
138
+ * through the composer's phone button / `RealtimeSessionService.StartRealtimeSession`).
135
139
  */
136
140
  pendingRealtimeSessionId = null;
137
141
  pendingArtifactVersionNumber = null;
@@ -141,9 +145,10 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
141
145
  USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';
142
146
  saveSettingsTimeout = null;
143
147
  engine = ConversationEngine.Instance;
144
- constructor(mentionAutocompleteService, cdr, streamingService, activeTasksService, uiCommandHandler, bridge) {
148
+ // Shared AI mention/suggestion engine (BaseSingleton same instance the composer plugins use)
149
+ mentionAutocompleteService = MentionAutocompleteService.Instance;
150
+ constructor(cdr, streamingService, activeTasksService, uiCommandHandler, bridge) {
145
151
  super();
146
- this.mentionAutocompleteService = mentionAutocompleteService;
147
152
  this.cdr = cdr;
148
153
  this.streamingService = streamingService;
149
154
  this.activeTasksService = activeTasksService;
@@ -186,7 +191,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
186
191
  // open:url commands are handled directly by the service; open:resource needs NavigationService.
187
192
  this.uiCommandHandler.actionableCommandRequested
188
193
  .pipe(takeUntil(this.destroy$))
189
- .subscribe(command => this.handleActionableCommand(command));
194
+ .subscribe(request => this.handleActionableCommand(request.command));
190
195
  // Subscribe to bridge switch events so the overlay can hand off a conversation to this workspace
191
196
  this.bridge.SwitchEvent$
192
197
  .pipe(takeUntil(this.destroy$))
@@ -278,6 +283,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
278
283
  // Set pending artifact if provided
279
284
  if (artifactId) {
280
285
  this.pendingArtifactId = artifactId;
286
+ this.pendingArtifactConversationId = conversationId || null;
281
287
  this.pendingArtifactVersionNumber = versionNumber;
282
288
  }
283
289
  // Set conversationId synchronously so child components see it immediately
@@ -329,6 +335,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
329
335
  const versionNumber = params['versionNumber'] ? parseInt(params['versionNumber'], 10) : null;
330
336
  // Reflect any artifact intent so the chat area can open it.
331
337
  this.pendingArtifactId = artifactId;
338
+ this.pendingArtifactConversationId = artifactId ? conversationId : null;
332
339
  this.pendingArtifactVersionNumber = versionNumber;
333
340
  if (conversationId && conversationId !== this.selectedConversationId) {
334
341
  // The URL is already the source of truth here — suppress the echo back to it.
@@ -397,8 +404,9 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
397
404
  // it on every tab re-focus / popstate, which reopened the review overlay forever
398
405
  // (the live-tested "stuck overlay" bug).
399
406
  queryParams['realtimeSessionId'] = null;
400
- // Use NavigationService to update query params properly
401
- this.navigationService.UpdateActiveTabQueryParams(queryParams);
407
+ // Use the resource-scoped helper so a cached conversation component cannot
408
+ // write conversation params onto a tab that has since been reused for a record.
409
+ this.UpdateQueryParams(queryParams);
402
410
  }
403
411
  /**
404
412
  * Update the tab/browser title based on the currently selected conversation.
@@ -727,6 +735,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
727
735
  */
728
736
  onPendingArtifactConsumed() {
729
737
  this.pendingArtifactId = null;
738
+ this.pendingArtifactConversationId = null;
730
739
  this.pendingArtifactVersionNumber = null;
731
740
  // Update URL to remove artifact params
732
741
  this.updateUrl();
@@ -845,7 +854,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
845
854
  console.warn('No artifacts found in conversation to open for Report/Dashboard command');
846
855
  }
847
856
  }
848
- static ɵfac = function ChatConversationsResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ChatConversationsResource)(i0.ɵɵdirectiveInject(i1.MentionAutocompleteService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ConversationStreamingService), i0.ɵɵdirectiveInject(i1.ActiveTasksService), i0.ɵɵdirectiveInject(i1.UICommandHandlerService), i0.ɵɵdirectiveInject(i1.ConversationBridgeService)); };
857
+ static ɵfac = function ChatConversationsResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ChatConversationsResource)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ConversationStreamingService), i0.ɵɵdirectiveInject(i1.ActiveTasksService), i0.ɵɵdirectiveInject(i1.UICommandHandlerService), i0.ɵɵdirectiveInject(i1.ConversationBridgeService)); };
849
858
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ChatConversationsResource, selectors: [["mj-chat-conversations-resource"]], viewQuery: function ChatConversationsResource_Query(rf, ctx) { if (rf & 1) {
850
859
  i0.ɵɵviewQuery(_c0, 5)(_c1, 5);
851
860
  } if (rf & 2) {
@@ -854,12 +863,12 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
854
863
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.chatArea = _t.first);
855
864
  } }, hostBindings: function ChatConversationsResource_HostBindings(rf, ctx) { if (rf & 1) {
856
865
  i0.ɵɵlistener("resize", function ChatConversationsResource_resize_HostBindingHandler() { return ctx.onWindowResize(); }, i0.ɵɵresolveWindow)("click", function ChatConversationsResource_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument);
857
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [["conversationList", ""], ["chatArea", ""], [1, "chat-conversations-container"], [1, "initializing-container"], [1, "mobile-sidebar-backdrop"], [1, "conversation-sidebar", 3, "collapsed", "no-transition", "width"], [1, "sidebar-resize-handle"], [1, "conversation-main"], [3, "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactVersionNumber", "showSidebarToggle"], [1, "mobile-sidebar-backdrop", 3, "click"], [1, "conversation-sidebar"], [3, "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], [3, "conversationSelected", "conversationDeleted", "newConversationRequested", "pinSidebarRequested", "unpinSidebarRequested", "refreshRequested", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "sidebarToggleClicked", "conversationRenamed", "conversationCreated", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "artifactLinkClicked", "openEntityRecord", "navigationRequest", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactVersionNumber", "showSidebarToggle"], ["text", "Initializing...", "size", "large"]], template: function ChatConversationsResource_Template(rf, ctx) { if (rf & 1) {
866
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [["conversationList", ""], ["chatArea", ""], [1, "chat-conversations-container"], [1, "initializing-container"], [1, "mobile-sidebar-backdrop"], [1, "conversation-sidebar", 3, "collapsed", "no-transition", "width"], [1, "sidebar-resize-handle"], [1, "conversation-main"], [3, "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber", "showSidebarToggle"], [1, "mobile-sidebar-backdrop", 3, "click"], [1, "conversation-sidebar"], [3, "conversationSelected", "conversationDeleted", "newConversationRequested", "pinSidebarRequested", "unpinSidebarRequested", "refreshRequested", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], [3, "openEntityRecord", "openConversation"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "sidebarToggleClicked", "conversationRenamed", "conversationCreated", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "artifactLinkClicked", "openEntityRecord", "navigationRequest", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber", "showSidebarToggle"], ["text", "Initializing...", "size", "large"]], template: function ChatConversationsResource_Template(rf, ctx) { if (rf & 1) {
858
867
  i0.ɵɵconditionalCreate(0, ChatConversationsResource_Conditional_0_Template, 6, 4, "div", 2)(1, ChatConversationsResource_Conditional_1_Template, 2, 0, "div", 3);
859
868
  i0.ɵɵelement(2, "mj-toast");
860
869
  } if (rf & 2) {
861
870
  i0.ɵɵconditional(ctx.isReady ? 0 : 1);
862
- } }, dependencies: [i1.ConversationListComponent, i1.ConversationChatAreaComponent, i1.ToastComponent, i2.LoadingComponent], 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 /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "], encapsulation: 2 });
871
+ } }, dependencies: [i1.RoutinesSectionComponent, i1.ConversationListComponent, i1.ConversationChatAreaComponent, i1.ToastComponent, i2.LoadingComponent], 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 display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Conversation list scrolls; the routines section stays pinned at the bottom */\n .conversation-sidebar mj-conversation-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n\n .conversation-sidebar mj-conversation-routines-section {\n flex-shrink: 0;\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 /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "], encapsulation: 2 });
863
872
  };
864
873
  ChatConversationsResource = __decorate([
865
874
  RegisterClass(BaseResourceComponent, 'ChatConversationsResource')
@@ -896,6 +905,12 @@ export { ChatConversationsResource };
896
905
  (unpinSidebarRequested)="unpinSidebar()"
897
906
  (refreshRequested)="onRefreshRequested()">
898
907
  </mj-conversation-list>
908
+ <!-- Routines — pinned at the very bottom of the sidebar. Gated inside the
909
+ section component by Read permission on 'MJ: User Routines'. -->
910
+ <mj-conversation-routines-section
911
+ (openEntityRecord)="onOpenEntityRecord($event)"
912
+ (openConversation)="onConversationSelected($event)">
913
+ </mj-conversation-routines-section>
899
914
  }
900
915
  </div>
901
916
  }
@@ -918,6 +933,7 @@ export { ChatConversationsResource };
918
933
  [pendingMessage]="pendingMessageToSend"
919
934
  [pendingAttachments]="pendingAttachmentsToSend"
920
935
  [pendingArtifactId]="pendingArtifactId"
936
+ [pendingArtifactConversationId]="pendingArtifactConversationId"
921
937
  [pendingArtifactVersionNumber]="pendingArtifactVersionNumber"
922
938
  [showSidebarToggle]="isSidebarCollapsed && isSidebarSettingsLoaded"
923
939
  (sidebarToggleClicked)="expandSidebar()"
@@ -943,8 +959,8 @@ export { ChatConversationsResource };
943
959
 
944
960
  <!-- Toast notifications container -->
945
961
  <mj-toast></mj-toast>
946
- `, encapsulation: ViewEncapsulation.None, 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 /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "] }]
947
- }], () => [{ type: i1.MentionAutocompleteService }, { type: i0.ChangeDetectorRef }, { type: i1.ConversationStreamingService }, { type: i1.ActiveTasksService }, { type: i1.UICommandHandlerService }, { type: i1.ConversationBridgeService }], { conversationList: [{
962
+ `, encapsulation: ViewEncapsulation.None, 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 display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Conversation list scrolls; the routines section stays pinned at the bottom */\n .conversation-sidebar mj-conversation-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n\n .conversation-sidebar mj-conversation-routines-section {\n flex-shrink: 0;\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 /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "] }]
963
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ConversationStreamingService }, { type: i1.ActiveTasksService }, { type: i1.UICommandHandlerService }, { type: i1.ConversationBridgeService }], { conversationList: [{
948
964
  type: ViewChild,
949
965
  args: ['conversationList']
950
966
  }], chatArea: [{
@@ -957,5 +973,5 @@ export { ChatConversationsResource };
957
973
  type: HostListener,
958
974
  args: ['document:click', ['$event']]
959
975
  }] }); })();
960
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatConversationsResource, { className: "ChatConversationsResource", filePath: "src/lib/resource-wrappers/chat-conversations-resource.component.ts", lineNumber: 237 }); })();
976
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatConversationsResource, { className: "ChatConversationsResource", filePath: "src/lib/resource-wrappers/chat-conversations-resource.component.ts", lineNumber: 259 }); })();
961
977
  //# sourceMappingURL=chat-conversations-resource.component.js.map