@memberjunction/ng-dashboards 5.4.1 → 5.5.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 (121) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +4 -4
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.js +5 -4
  5. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  6. package/dist/AI/components/models/model-management.component.js +3 -3
  7. package/dist/AI/components/models/model-management.component.js.map +1 -1
  8. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  9. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +8 -7
  10. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  11. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  12. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  13. package/dist/AI/components/system/system-configuration.component.js +4 -4
  14. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  15. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.js +3 -2
  17. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  18. package/dist/APIKeys/api-keys-resource.component.js +2 -2
  19. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  20. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-scopes-panel.component.js +4 -3
  22. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +3 -3
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  26. package/dist/Actions/components/categories-list-view.component.js +3 -2
  27. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  28. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  29. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  30. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  31. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  32. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  33. package/dist/Actions/components/explorer/new-action-panel.component.js +3 -2
  34. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  35. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  36. package/dist/Actions/components/explorer/new-category-panel.component.js +3 -2
  37. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  38. package/dist/Communication/communication-templates-resource.component.js +2 -2
  39. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  40. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +6 -0
  41. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  42. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +19 -6
  43. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  44. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -0
  45. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  46. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +13 -4
  47. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  48. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -0
  49. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  50. package/dist/Credentials/components/credentials-categories-resource.component.js +13 -9
  51. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  52. package/dist/Credentials/components/credentials-list-resource.component.js +11 -11
  53. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  54. package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
  55. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  56. package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -0
  57. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  58. package/dist/Credentials/components/credentials-types-resource.component.js +13 -9
  59. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  60. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +11 -11
  61. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  62. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  63. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +4 -3
  64. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  65. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  66. package/dist/DataExplorer/components/view-selector/view-selector.component.js +4 -3
  67. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  68. package/dist/DataExplorer/data-explorer-dashboard.component.js +6 -6
  69. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  70. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  71. package/dist/DataExplorer/data-explorer-resource.component.js +4 -1
  72. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  73. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  74. package/dist/DataExplorer/services/explorer-state.service.js +9 -8
  75. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  76. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  78. package/dist/Home/home-application.js +2 -2
  79. package/dist/Home/home-application.js.map +1 -1
  80. package/dist/Lists/components/lists-browse-resource.component.js +3 -3
  81. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  82. package/dist/Lists/components/lists-categories-resource.component.d.ts +1 -0
  83. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  84. package/dist/Lists/components/lists-categories-resource.component.js +17 -14
  85. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  86. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  87. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  88. package/dist/Lists/components/lists-operations-resource.component.d.ts +1 -0
  89. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  90. package/dist/Lists/components/lists-operations-resource.component.js +15 -12
  91. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  92. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  93. package/dist/MCP/components/mcp-connection-dialog.component.js +3 -2
  94. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  95. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
  96. package/dist/MCP/components/mcp-test-tool-dialog.component.js +8 -7
  97. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  98. package/dist/MCP/mcp-dashboard.component.js +22 -22
  99. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  100. package/dist/QueryBrowser/query-browser-resource.component.d.ts +2 -0
  101. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  102. package/dist/QueryBrowser/query-browser-resource.component.js +14 -10
  103. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  104. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  105. package/dist/Scheduling/services/scheduling-instrumentation.service.js +2 -1
  106. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  107. package/dist/Testing/components/testing-explorer.component.d.ts +1 -0
  108. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  109. package/dist/Testing/components/testing-explorer.component.js +22 -18
  110. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  111. package/dist/Testing/components/testing-review.component.d.ts +1 -0
  112. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  113. package/dist/Testing/components/testing-review.component.js +14 -10
  114. package/dist/Testing/components/testing-review.component.js.map +1 -1
  115. package/dist/VersionHistory/components/diff-resource.component.js +6 -6
  116. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  117. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  118. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  119. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  120. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  121. package/package.json +38 -38
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-management.component.js","sourceRoot":"","sources":["../../../../src/AI/components/prompts/prompt-management.component.ts","../../../../src/AI/components/prompts/prompt-management.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { MJAIPromptTypeEntity, MJAIPromptCategoryEntity, MJTemplateEntity, MJTemplateContentEntity, ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { TemplateEngineBase } from '@memberjunction/templates-base-types';\nimport { SharedService, BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { AITestHarnessDialogService } from '@memberjunction/ng-ai-test-harness';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { RegisterClass } from '@memberjunction/global';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\n\ninterface PromptWithTemplate extends Omit<MJAIPromptEntityExtended, 'Template'> {\n Template: string; // From MJAIPromptEntityExtended (view field)\n MJTemplateEntity?: MJTemplateEntity; // Our added field for the actual template entity\n TemplateContents?: MJTemplateContentEntity[];\n CategoryName?: string;\n TypeName?: string;\n}\n\n/**\n * User preferences for the Prompt Management dashboard\n */\ninterface PromptManagementUserPreferences {\n viewMode: 'grid' | 'list' | 'priority-matrix';\n showFilters: boolean;\n searchTerm: string;\n selectedCategory: string;\n selectedType: string;\n selectedStatus: string;\n sortColumn: string;\n sortDirection: 'asc' | 'desc';\n}\n/**\n * AI Prompts Resource - displays AI prompt management\n * Extends BaseResourceComponent to work with the resource type system\n */\n@RegisterClass(BaseResourceComponent, 'AIPromptsResource')\n@Component({\n standalone: false,\n selector: 'app-prompt-management',\n templateUrl: './prompt-management.component.html',\n styleUrls: ['./prompt-management.component.css']\n})\nexport class PromptManagementComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n // Settings persistence\n private readonly USER_SETTINGS_KEY = 'AI.Prompts.UserPreferences';\n private settingsPersistSubject = new Subject<void>();\n private settingsLoaded = false;\n\n // View state\n public viewMode: 'grid' | 'list' | 'priority-matrix' = 'grid';\n public isLoading = true;\n public showFilters = true;\n public expandedPromptId: string | null = null;\n\n // Data\n public prompts: PromptWithTemplate[] = [];\n public filteredPrompts: PromptWithTemplate[] = [];\n public categories: MJAIPromptCategoryEntity[] = [];\n public types: MJAIPromptTypeEntity[] = [];\n\n // Filtering\n public searchTerm = '';\n private searchSubject = new BehaviorSubject<string>('');\n public selectedCategory = 'all';\n public selectedType = 'all';\n public selectedStatus = 'all';\n\n // Detail panel\n public selectedPrompt: PromptWithTemplate | null = null;\n public detailPanelVisible = false;\n\n // Sorting\n public sortColumn: string = 'Name';\n public sortDirection: 'asc' | 'desc' = 'asc';\n\n // Loading messages\n public loadingMessages = [\n 'Loading AI prompts...',\n 'Fetching templates...',\n 'Organizing categories...',\n 'Almost there...'\n ];\n public currentLoadingMessage = this.loadingMessages[0];\n private loadingMessageIndex = 0;\n private loadingMessageInterval: any;\n\n private destroy$ = new Subject<void>();\n public selectedPromptForTest: MJAIPromptEntityExtended | null = null;\n\n // === Permission Checks ===\n /** Cache for permission checks to avoid repeated calculations */\n private _permissionCache = new Map<string, boolean>();\n private _metadata = new Metadata();\n\n /** Check if user can create AI Prompts */\n public get UserCanCreatePrompts(): boolean {\n return this.checkEntityPermission('MJ: AI Prompts', 'Create');\n }\n\n /** Check if user can read AI Prompts */\n public get UserCanReadPrompts(): boolean {\n return this.checkEntityPermission('MJ: AI Prompts', 'Read');\n }\n\n /** Check if user can update AI Prompts */\n public get UserCanUpdatePrompts(): boolean {\n return this.checkEntityPermission('MJ: AI Prompts', 'Update');\n }\n\n /** Check if user can delete AI Prompts */\n public get UserCanDeletePrompts(): boolean {\n return this.checkEntityPermission('MJ: AI Prompts', 'Delete');\n }\n\n /**\n * Helper method to check entity permissions with caching\n * @param entityName - The name of the entity to check permissions for\n * @param permissionType - The type of permission to check (Create, Read, Update, Delete)\n * @returns boolean indicating if user has the permission\n */\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n \n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n \n if (!entityInfo) {\n console.warn(`Entity '${entityName}' not found for permission check`);\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create':\n hasPermission = userPermissions.CanCreate;\n break;\n case 'Read':\n hasPermission = userPermissions.CanRead;\n break;\n case 'Update':\n hasPermission = userPermissions.CanUpdate;\n break;\n case 'Delete':\n hasPermission = userPermissions.CanDelete;\n break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n console.error(`Error checking ${permissionType} permission for ${entityName}:`, error);\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n /**\n * Clears the permission cache. Call this when user context changes or permissions are updated.\n */\n public clearPermissionCache(): void {\n this._permissionCache.clear();\n }\n\n constructor(\n private sharedService: SharedService,\n private testHarnessService: AITestHarnessDialogService,\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n\n // Set up debounced settings persistence\n this.settingsPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.persistUserPreferences();\n });\n }\n\n ngOnInit(): void {\n // Load saved user preferences first\n this.loadUserPreferences();\n\n this.setupSearchListener();\n this.startLoadingMessages();\n this.loadInitialData();\n\n // Apply initial state from resource configuration if provided (overrides saved prefs)\n if (this.Data?.Configuration) {\n this.applyInitialState(this.Data.Configuration);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n }\n }\n\n private setupSearchListener(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(searchTerm => {\n this.searchTerm = searchTerm;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n });\n }\n\n // ========================================\n // User Settings Persistence\n // ========================================\n\n /**\n * Load saved user preferences from the UserInfoEngine\n */\n private loadUserPreferences(): void {\n try {\n const savedPrefs = UserInfoEngine.Instance.GetSetting(this.USER_SETTINGS_KEY);\n if (savedPrefs) {\n const prefs = JSON.parse(savedPrefs) as PromptManagementUserPreferences;\n this.applyUserPreferencesFromStorage(prefs);\n }\n } catch (error) {\n console.warn('[PromptManagement] Failed to load user preferences:', error);\n } finally {\n this.settingsLoaded = true;\n }\n }\n\n /**\n * Apply loaded preferences to component state\n */\n private applyUserPreferencesFromStorage(prefs: PromptManagementUserPreferences): void {\n if (prefs.viewMode) {\n this.viewMode = prefs.viewMode;\n }\n if (prefs.showFilters !== undefined) {\n this.showFilters = prefs.showFilters;\n }\n if (prefs.searchTerm) {\n this.searchTerm = prefs.searchTerm;\n }\n if (prefs.selectedCategory) {\n this.selectedCategory = prefs.selectedCategory;\n }\n if (prefs.selectedType) {\n this.selectedType = prefs.selectedType;\n }\n if (prefs.selectedStatus) {\n this.selectedStatus = prefs.selectedStatus;\n }\n if (prefs.sortColumn) {\n this.sortColumn = prefs.sortColumn;\n }\n if (prefs.sortDirection) {\n this.sortDirection = prefs.sortDirection;\n }\n }\n\n /**\n * Get current preferences as an object for saving\n */\n private getCurrentPreferences(): PromptManagementUserPreferences {\n return {\n viewMode: this.viewMode,\n showFilters: this.showFilters,\n searchTerm: this.searchTerm,\n selectedCategory: this.selectedCategory,\n selectedType: this.selectedType,\n selectedStatus: this.selectedStatus,\n sortColumn: this.sortColumn,\n sortDirection: this.sortDirection\n };\n }\n\n /**\n * Persist user preferences to storage (debounced)\n */\n private saveUserPreferencesDebounced(): void {\n if (!this.settingsLoaded) return; // Don't save during initial load\n this.settingsPersistSubject.next();\n }\n\n /**\n * Actually persist user preferences to the UserInfoEngine\n */\n private async persistUserPreferences(): Promise<void> {\n try {\n const prefs = this.getCurrentPreferences();\n await UserInfoEngine.Instance.SetSetting(this.USER_SETTINGS_KEY, JSON.stringify(prefs));\n } catch (error) {\n console.warn('[PromptManagement] Failed to persist user preferences:', error);\n }\n }\n\n private startLoadingMessages(): void {\n this.loadingMessageInterval = setInterval(() => {\n this.loadingMessageIndex = (this.loadingMessageIndex + 1) % this.loadingMessages.length;\n this.currentLoadingMessage = this.loadingMessages[this.loadingMessageIndex];\n }, 2000);\n }\n\n private async loadInitialData(): Promise<void> {\n try {\n // Configure both engines in parallel (no-op if already loaded)\n await Promise.all([\n AIEngineBase.Instance.Config(false),\n TemplateEngineBase.Instance.Config(false)\n ]);\n\n // Get cached data from AIEngineBase\n const prompts = AIEngineBase.Instance.Prompts;\n this.categories = AIEngineBase.Instance.PromptCategories;\n this.types = AIEngineBase.Instance.PromptTypes;\n\n // Get cached data from TemplateEngineBase\n const templates = TemplateEngineBase.Instance.Templates as MJTemplateEntity[];\n const templateContents = TemplateEngineBase.Instance.TemplateContents;\n \n // Create lookup maps\n const templateMap = new Map(templates.map(t => [t.ID, t]));\n const templateContentMap = new Map<string, MJTemplateContentEntity[]>();\n \n templateContents.forEach(tc => {\n const contents = templateContentMap.get(tc.TemplateID) || [];\n contents.push(tc);\n templateContentMap.set(tc.TemplateID, contents);\n });\n\n const categoryMap = new Map(this.categories.map(c => [c.ID, c.Name]));\n const typeMap = new Map(this.types.map(t => [t.ID, t.Name]));\n\n // Combine the data - keep the actual entity objects\n this.prompts = prompts.map(prompt => {\n const template = templateMap.get(prompt.ID);\n \n // Add the extra properties directly to the entity\n (prompt as any).MJTemplateEntity = template;\n (prompt as any).TemplateContents = template ? (templateContentMap.get(template.ID) || []) : [];\n (prompt as any).CategoryName = prompt.CategoryID ? categoryMap.get(prompt.CategoryID) || 'Unknown' : 'Uncategorized';\n (prompt as any).TypeName = prompt.TypeID ? typeMap.get(prompt.TypeID) || 'Unknown' : 'Untyped';\n \n return prompt as PromptWithTemplate;\n });\n\n this.filteredPrompts = [...this.prompts];\n this.applyFilters();\n } catch (error) {\n console.error('Error loading prompt data:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading prompts', 'error', 3000);\n } finally {\n this.isLoading = false;\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n }\n this.NotifyLoadComplete();\n }\n }\n\n private applyInitialState(state: any): void {\n if (state.viewMode) this.viewMode = state.viewMode;\n if (state.showFilters !== undefined) this.showFilters = state.showFilters;\n if (state.searchTerm) this.searchTerm = state.searchTerm;\n if (state.selectedCategory) this.selectedCategory = state.selectedCategory;\n if (state.selectedType) this.selectedType = state.selectedType;\n if (state.selectedStatus) this.selectedStatus = state.selectedStatus;\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public toggleFilters(): void {\n this.showFilters = !this.showFilters;\n this.saveUserPreferencesDebounced();\n }\n\n public toggleFilterPanel(): void {\n this.showFilters = !this.showFilters;\n this.saveUserPreferencesDebounced();\n }\n\n public setViewMode(mode: 'grid' | 'list' | 'priority-matrix'): void {\n this.viewMode = mode;\n this.expandedPromptId = null;\n this.saveUserPreferencesDebounced();\n }\n\n public togglePromptExpansion(promptId: string): void {\n this.expandedPromptId = this.expandedPromptId === promptId ? null : promptId;\n }\n\n public applyFilters(): void {\n this.filteredPrompts = this.prompts.filter(prompt => {\n // Search filter\n if (this.searchTerm) {\n const searchLower = this.searchTerm.toLowerCase();\n const matchesSearch = \n prompt.Name?.toLowerCase().includes(searchLower) ||\n prompt.Description?.toLowerCase().includes(searchLower) ||\n prompt.CategoryName?.toLowerCase().includes(searchLower) ||\n prompt.TypeName?.toLowerCase().includes(searchLower);\n \n if (!matchesSearch) return false;\n }\n\n // Category filter\n if (this.selectedCategory !== 'all' && prompt.CategoryID !== this.selectedCategory) {\n return false;\n }\n\n // Type filter\n if (this.selectedType !== 'all' && prompt.TypeID !== this.selectedType) {\n return false;\n }\n\n // Status filter\n if (this.selectedStatus !== 'all') {\n const isActive = prompt.Status === 'Active';\n if (this.selectedStatus === 'active' && !isActive) return false;\n if (this.selectedStatus === 'inactive' && isActive) return false;\n }\n\n return true;\n });\n\n // Apply sorting\n this.filteredPrompts = this.applySorting(this.filteredPrompts);\n this.cdr.detectChanges();\n }\n\n /**\n * Sort the prompts by the specified column\n */\n public sortBy(column: string): void {\n if (this.sortColumn === column) {\n // Toggle direction if same column\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n // New column, default to ascending\n this.sortColumn = column;\n this.sortDirection = 'asc';\n }\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Apply sorting to the filtered list\n */\n private applySorting(prompts: PromptWithTemplate[]): PromptWithTemplate[] {\n return prompts.sort((a, b) => {\n let valueA: string | boolean | null | undefined;\n let valueB: string | boolean | null | undefined;\n\n switch (this.sortColumn) {\n case 'Name':\n valueA = a.Name;\n valueB = b.Name;\n break;\n case 'Category':\n valueA = a.CategoryName;\n valueB = b.CategoryName;\n break;\n case 'Type':\n valueA = a.TypeName;\n valueB = b.TypeName;\n break;\n case 'Status':\n valueA = a.Status;\n valueB = b.Status;\n break;\n default:\n valueA = a.Name;\n valueB = b.Name;\n }\n\n // Handle null/undefined values\n const strA = (valueA ?? '').toString().toLowerCase();\n const strB = (valueB ?? '').toString().toLowerCase();\n\n let comparison = strA.localeCompare(strB);\n return this.sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n public onCategoryChange(categoryId: string): void {\n this.selectedCategory = categoryId;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onTypeChange(typeId: string): void {\n this.selectedType = typeId;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onStatusChange(status: string): void {\n this.selectedStatus = status;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public openPrompt(promptId: string): void {\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: promptId }]);\n this.navigationService.OpenEntityRecord('MJ: AI Prompts', compositeKey);\n }\n\n /**\n * Show the detail panel for a prompt\n */\n public showPromptDetails(prompt: PromptWithTemplate, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n this.selectedPrompt = prompt;\n this.detailPanelVisible = true;\n }\n\n /**\n * Close the detail panel\n */\n public closeDetailPanel(): void {\n this.detailPanelVisible = false;\n // Delay clearing selectedPrompt for smoother animation\n setTimeout(() => {\n if (!this.detailPanelVisible) {\n this.selectedPrompt = null;\n }\n }, 300);\n }\n\n /**\n * Open the full entity record from the detail panel\n */\n public openPromptFromPanel(): void {\n if (this.selectedPrompt) {\n this.openPrompt(this.selectedPrompt.ID);\n }\n }\n\n public testPrompt(promptId: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n \n // Use the test harness service for window management features\n this.testHarnessService.openForPrompt(promptId);\n }\n\n public closeTestHarness(): void {\n // No longer needed - window manages its own closure\n this.selectedPromptForTest = null;\n }\n\n public createNewPrompt(): void {\n // Use the standard MemberJunction pattern to open a new AI Prompt form\n // Empty CompositeKey indicates a new record\n this.navigationService.OpenEntityRecord('MJ: AI Prompts', new CompositeKey([]));\n }\n\n public getPromptIcon(prompt: PromptWithTemplate): string {\n if (prompt.TypeName?.toLowerCase().includes('system')) {\n return 'fa-solid fa-cogs';\n } else if (prompt.TypeName?.toLowerCase().includes('user')) {\n return 'fa-solid fa-user';\n } else if (prompt.TypeName?.toLowerCase().includes('chat')) {\n return 'fa-solid fa-comments';\n }\n return 'fa-solid fa-comment-dots';\n }\n\n public getStatusClass(status: string): string {\n return status === 'Active' ? 'active' : 'inactive';\n }\n\n public get hasActiveFilters(): boolean {\n return this.searchTerm !== '' || \n this.selectedCategory !== 'all' || \n this.selectedType !== 'all' || \n this.selectedStatus !== 'all';\n }\n\n public get filteredPromptsAsEntities(): MJAIPromptEntityExtended[] {\n // The prompts are already MJAIPromptEntityExtended instances with extra properties\n return this.filteredPrompts as MJAIPromptEntityExtended[];\n }\n\n public clearFilters(): void {\n this.searchTerm = '';\n this.selectedCategory = 'all';\n this.selectedType = 'all';\n this.selectedStatus = 'all';\n this.searchSubject.next('');\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n // BaseResourceComponent abstract method implementations\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Prompts';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-comment-dots';\n }\n}","<div class=\"prompt-management-container\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-message\"></i>\n AI Prompts\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredPrompts.length }} prompts</span>\n </div>\n\n <div class=\"header-controls\">\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n\n @if (UserCanCreatePrompts) {\n <button\n type=\"button\"\n class=\"control-btn primary\"\n (click)=\"createNewPrompt()\"\n title=\"Create New Prompt\">\n <i class=\"fa-solid fa-plus\"></i>\n New Prompt\n </button>\n }\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <div class=\"main-content\">\n <kendo-splitter\n class=\"main-splitter\"\n orientation=\"horizontal\">\n\n <!-- Filter Panel (Left) -->\n <kendo-splitter-pane\n [size]=\"showFilters ? '320px' : '0px'\"\n [collapsible]=\"false\"\n [resizable]=\"showFilters\"\n [scrollable]=\"false\"\n [hidden]=\"!showFilters\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Prompt Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredPrompts.length }}</span>\n <span class=\"summary-label\">of {{ prompts.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-search\"></i>\n Name\n </label>\n <input\n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search prompts...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Category Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-folder\"></i>\n Category\n </label>\n <select class=\"filter-select\" [value]=\"selectedCategory\" (change)=\"onCategoryChange($any($event.target).value)\">\n <option value=\"all\">All Categories</option>\n @for (category of categories; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-tag\"></i>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of types; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-toggle-on\"></i>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <i class=\"fa-solid fa-undo\"></i>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Prompts List Panel -->\n <kendo-splitter-pane\n [resizable]=\"true\"\n [scrollable]=\"true\">\n <div class=\"prompts-content\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"currentLoadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Prompts Display -->\n @if (!isLoading) {\n @if (filteredPrompts.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-message\"></i>\n <h3>No prompts found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI prompt to get started' }}</p>\n @if (!hasActiveFilters && UserCanCreatePrompts) {\n <button\n type=\"button\"\n class=\"empty-state-btn\"\n (click)=\"createNewPrompt()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n } @else {\n <!-- Grid View -->\n @if (viewMode === 'grid') {\n <div class=\"prompts-grid\">\n @for (prompt of filteredPrompts; track prompt.ID) {\n <div class=\"prompt-card\" [class.expanded]=\"expandedPromptId === prompt.ID\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"togglePromptExpansion(prompt.ID)\">\n <div class=\"prompt-info\">\n <div class=\"prompt-icon\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n </div>\n <div class=\"prompt-details\">\n <h4 class=\"prompt-name\" [innerHTML]=\"prompt.Name | highlightSearch:searchTerm\"></h4>\n <div class=\"prompt-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ prompt.CategoryName }}\n </span>\n @if (prompt.Status) {\n <span class=\"meta-item\" [class]=\"'status-' + prompt.Status.toLowerCase()\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n {{ prompt.Status }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <i class=\"fa-solid fa-chevron-down expand-icon\"\n [class.rotated]=\"expandedPromptId === prompt.ID\"></i>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (prompt.Description) {\n <p class=\"prompt-description\" [innerHTML]=\"prompt.Description | highlightSearch:searchTerm\"></p>\n } @else {\n <p class=\"prompt-description text-muted\">No description provided</p>\n }\n\n <!-- Expandable Content -->\n @if (expandedPromptId === prompt.ID) {\n <div class=\"expanded-content\">\n <div class=\"prompt-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Type</span>\n <span class=\"stat-value\">{{ prompt.TypeName }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Template</span>\n <span class=\"stat-value\">\n @if (prompt.MJTemplateEntity) {\n <i class=\"fa-solid fa-check\" style=\"color: #28a745;\"></i> Yes\n } @else {\n <i class=\"fa-solid fa-times\" style=\"color: #dc3545;\"></i> No\n }\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\">\n @if (UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn\"\n (click)=\"showPromptDetails(prompt, $event)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n Details\n </button>\n }\n\n @if (prompt.Status === 'Active' && UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn action-btn-primary\"\n (click)=\"testPrompt(prompt.ID, $event)\"\n title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n Run\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (viewMode === 'list') {\n <div class=\"prompts-list\">\n <table class=\"prompts-table\">\n <thead>\n <tr>\n <th (click)=\"sortBy('Name')\"\n [class.sorted]=\"sortColumn === 'Name'\"\n [class.desc]=\"sortColumn === 'Name' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Name\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Category')\"\n [class.sorted]=\"sortColumn === 'Category'\"\n [class.desc]=\"sortColumn === 'Category' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Category\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Type')\"\n [class.sorted]=\"sortColumn === 'Type'\"\n [class.desc]=\"sortColumn === 'Type' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Type\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Status')\"\n [class.sorted]=\"sortColumn === 'Status'\"\n [class.desc]=\"sortColumn === 'Status' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Status\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th>Template</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of filteredPrompts; track prompt.ID) {\n <tr>\n <td>\n <div class=\"prompt-name-cell\">\n <div class=\"prompt-icon-small\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n </div>\n <div>\n <div class=\"prompt-name\" [innerHTML]=\"prompt.Name | highlightSearch:searchTerm\"></div>\n @if (prompt.Description) {\n <div class=\"prompt-description-small\" [innerHTML]=\"prompt.Description | highlightSearch:searchTerm\"></div>\n }\n </div>\n </div>\n </td>\n <td>{{ prompt.CategoryName }}</td>\n <td>{{ prompt.TypeName }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"'status-' + (prompt.Status || 'unknown').toLowerCase()\">\n {{ prompt.Status || 'Unknown' }}\n </span>\n </td>\n <td>\n @if (prompt.MJTemplateEntity) {\n <i class=\"fa-solid fa-check-circle\" style=\"color: #28a745;\"></i>\n } @else {\n <i class=\"fa-solid fa-times-circle\" style=\"color: #6c757d;\"></i>\n }\n </td>\n <td>\n <div class=\"table-actions\">\n @if (UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn-small\"\n (click)=\"showPromptDetails(prompt)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n }\n @if (prompt.Status === 'Active' && UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn-small primary\"\n (click)=\"testPrompt(prompt.ID, $event)\"\n title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n\n <!-- Detail Panel Overlay -->\n @if (detailPanelVisible) {\n <div class=\"detail-panel-overlay\" (click)=\"closeDetailPanel()\"></div>\n }\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" [class.visible]=\"detailPanelVisible\">\n @if (selectedPrompt) {\n <!-- Panel Header -->\n <div class=\"detail-panel-header\">\n <div class=\"detail-panel-title\">\n <div class=\"detail-icon\">\n <i [class]=\"getPromptIcon(selectedPrompt)\"></i>\n </div>\n <div class=\"detail-title-info\">\n <h3>{{ selectedPrompt.Name }}</h3>\n <span class=\"detail-subtitle\">{{ selectedPrompt.TypeName || 'Prompt' }}</span>\n </div>\n </div>\n <button class=\"detail-panel-close\" (click)=\"closeDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"detail-panel-content\">\n <!-- Status Section -->\n <div class=\"detail-section\">\n <div class=\"detail-badges\">\n <span class=\"status-badge\" [class]=\"'status-' + (selectedPrompt.Status || 'unknown').toLowerCase()\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n {{ selectedPrompt.Status || 'Unknown' }}\n </span>\n @if (selectedPrompt.MJTemplateEntity) {\n <span class=\"feature-badge\">\n <i class=\"fa-solid fa-file-code\"></i>\n Has Template\n </span>\n }\n </div>\n </div>\n\n <!-- Description -->\n @if (selectedPrompt.Description) {\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h4>\n <p class=\"detail-description\">{{ selectedPrompt.Description }}</p>\n </div>\n }\n\n <!-- Configuration Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n Configuration\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Category</span>\n <span class=\"detail-value\">{{ selectedPrompt.CategoryName || 'Uncategorized' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Type</span>\n <span class=\"detail-value\">{{ selectedPrompt.TypeName || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Response Format</span>\n <span class=\"detail-value\">{{ selectedPrompt.ResponseFormat }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Selection Strategy</span>\n <span class=\"detail-value\">{{ selectedPrompt.SelectionStrategy }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Power Preference</span>\n <span class=\"detail-value\">{{ selectedPrompt.PowerPreference }}</span>\n </div>\n @if (selectedPrompt.MinPowerRank) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Min Power Rank</span>\n <span class=\"detail-value\">{{ selectedPrompt.MinPowerRank }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Timestamps -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timestamps\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Created</span>\n <span class=\"detail-value\">{{ selectedPrompt.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Updated</span>\n <span class=\"detail-value\">{{ selectedPrompt.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"detail-panel-actions\">\n @if (selectedPrompt.Status === 'Active') {\n <button\n type=\"button\"\n class=\"detail-action-btn secondary\"\n (click)=\"testPrompt(selectedPrompt.ID)\">\n <i class=\"fa-solid fa-play\"></i>\n Run Prompt\n </button>\n }\n <button\n type=\"button\"\n class=\"detail-action-btn primary\"\n (click)=\"openPromptFromPanel()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n }\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"prompt-management.component.js","sourceRoot":"","sources":["../../../../src/AI/components/prompts/prompt-management.component.ts","../../../../src/AI/components/prompts/prompt-management.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAA2G,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACxK,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAiB,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AAEpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAG,UAAU,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;;;;ICK1D,8BACF;;;IACE,8BACF;;;;IA0BA,kCAI4B;IAD1B,8LAAS,wBAAiB,KAAC;IAE3B,wBAAgC;IAChC,4BACF;IAAA,iBAAS;;;IAuDC,kCAA8B;IAAA,YAAmB;IAAA,iBAAS;;;IAAlD,sCAAqB;IAAC,cAAmB;IAAnB,sCAAmB;;;IAcjD,kCAA0B;IAAA,YAAe;IAAA,iBAAS;;;IAA1C,kCAAiB;IAAC,cAAe;IAAf,kCAAe;;;IAoC/C,+BAA+B;IAC7B,iCAAqE;IACvE,iBAAM;;;IADQ,cAA8B;IAA9B,mDAA8B;;;;IAYtC,kCAG8B;IAA5B,2NAAS,wBAAiB,KAAC;IAC3B,wBAAgC;IAChC,mCACF;IAAA,iBAAS;;;IAXb,+BAAyB;IACvB,uBAAmC;IACnC,0BAAI;IAAA,gCAAgB;IAAA,iBAAK;IACzB,yBAAG;IAAA,YAAoG;IAAA,iBAAI;IAC3G,4HAAiD;IASnD,iBAAM;;;IAVD,eAAoG;IAApG,2HAAoG;IACvG,cAQC;IARD,kFAQC;;;IAsBe,gCAA0E;IACxE,wBAA0D;IAC1D,YACF;IAAA,iBAAO;;;IAHiB,yDAAiD;IAEvE,eACF;IADE,iDACF;;;IAaN,wBAAgG;;;;;IAAlE,6GAA6D;;;IAE3F,6BAAyC;IAAA,uCAAuB;IAAA,iBAAI;;;IAe1D,wBAAyD;IAAC,qBAC5D;;;IACE,wBAAyD;IAAC,oBAC5D;;;IAVF,AADF,AADF,AADF,+BAA8B,cACF,cACD,eACI;IAAA,oBAAI;IAAA,iBAAO;IACpC,gCAAyB;IAAA,YAAqB;IAChD,AADgD,iBAAO,EACjD;IAEJ,AADF,+BAAuB,eACI;IAAA,wBAAQ;IAAA,iBAAO;IACxC,iCAAyB;IAGrB,AAFF,mJAA+B,6HAEtB;IAMjB,AADE,AADE,AADE,iBAAO,EACH,EACF,EACF;;;IAbyB,eAAqB;IAArB,wCAAqB;IAK5C,eAIC;IAJD,sDAIC;;;;IAWT,kCAIuB;IADrB,sSAAS,2CAAiC,KAAC;IAE3C,wBAA+B;IAC/B,yBACF;IAAA,iBAAS;;;;IAIT,kCAIqB;IADnB,sSAAS,uCAA6B,KAAC;IAEvC,wBAAgC;IAChC,qBACF;IAAA,iBAAS;;;;IA9Eb,AAFF,+BAA2E,cAEL;IAA3C,0PAAS,0CAAgC,KAAC;IAE/D,AADF,+BAAyB,cACE;IACvB,oBAAuC;IACzC,iBAAM;IACN,+BAA4B;IAC1B,yBAAoF;;IAElF,AADF,+BAAyB,eACC;IACtB,yBAAkC;IAClC,aACF;IAAA,iBAAO;IACP,gJAAqB;IAQ3B,AADE,AADE,iBAAM,EACF,EACF;IAEN,yBACwD;IAC1D,iBAAM;IAGN,gCAAuB;IAGnB,AAFF,6IAA0B,uHAEjB;IAKT,gJAAsC;IAoBxC,iBAAM;IAGN,gCAA0B;IACxB,kJAA0B;IAW1B,kJAAwD;IAW5D,AADE,iBAAM,EACF;;;;IAnFmB,oEAAiD;IAK/D,eAA+B;IAA/B,8CAA+B;IAGV,eAAsD;IAAtD,uGAAsD;IAI1E,eACF;IADE,uDACF;IACA,cAKC;IALD,4CAKC;IAMJ,cAAgD;IAAhD,mEAAgD;IAKnD,eAIC;IAJD,iDAIC;IAGD,eAmBC;IAnBD,oEAmBC;IAKD,eASC;IATD,qDASC;IAED,cASC;IATD,sFASC;;;IAnFT,+BAA0B;IACxB,0IAqFC;IACH,iBAAM;;;IAtFJ,cAqFC;IArFD,qCAqFC;;;IAyDe,0BAA0G;;;;;IAApE,8GAA6D;;;IAcvG,wBAAgE;;;IAEhE,wBAAgE;;;;IAM9D,kCAIuB;IADrB,mSAAS,oCAAyB,KAAC;IAEnC,wBAA+B;IACjC,iBAAS;;;;IAGT,kCAIqB;IADnB,ySAAS,wCAA6B,KAAC;IAEvC,wBAAgC;IAClC,iBAAS;;;IA3CX,AADF,AADF,AADF,0BAAI,SACE,cAC4B,cACG;IAC7B,oBAAuC;IACzC,iBAAM;IACN,2BAAK;IACH,0BAAsF;;IACtF,8IAA0B;IAKhC,AADE,AADE,iBAAM,EACF,EACH;IACL,0BAAI;IAAA,aAAyB;IAAA,iBAAK;IAClC,2BAAI;IAAA,aAAqB;IAAA,iBAAK;IAE5B,AADF,2BAAI,gBAC0F;IAC1F,aACF;IACF,AADE,iBAAO,EACJ;IACL,2BAAI;IAGA,AAFF,8IAA+B,wHAEtB;IAGX,iBAAK;IAEH,AADF,2BAAI,eACyB;IACzB,mJAA0B;IAS1B,mJAAwD;IAW9D,AADE,AADE,iBAAM,EACH,EACF;;;;IA9CM,eAA+B;IAA/B,+CAA+B;IAGT,eAAsD;IAAtD,wGAAsD;IAC/E,eAEC;IAFD,iDAEC;IAIH,eAAyB;IAAzB,6CAAyB;IACzB,eAAqB;IAArB,yCAAqB;IAEI,eAAgE;IAAhE,yEAAgE;IACzF,cACF;IADE,+DACF;IAGA,eAIC;IAJD,uDAIC;IAIC,eAQC;IARD,qDAQC;IACD,cAQC;IARD,uFAQC;;;;IArFP,AADF,AADF,AADF,AADF,+BAA0B,gBACK,YACpB,SACD,aAGmE;IAFjE,wNAAS,cAAO,MAAM,CAAC,KAAC;IAG1B,gCAA0B;IACxB,sBACA;IAAA,wBAAgD;IAEpD,AADE,iBAAO,EACJ;IACL,8BAEyE;IAFrE,wNAAS,cAAO,UAAU,CAAC,KAAC;IAG9B,gCAA0B;IACxB,2BACA;IAAA,yBAAgD;IAEpD,AADE,iBAAO,EACJ;IACL,+BAEqE;IAFjE,yNAAS,cAAO,MAAM,CAAC,KAAC;IAG1B,iCAA0B;IACxB,uBACA;IAAA,yBAAgD;IAEpD,AADE,iBAAO,EACJ;IACL,+BAEuE;IAFnE,yNAAS,cAAO,QAAQ,CAAC,KAAC;IAG5B,iCAA0B;IACxB,yBACA;IAAA,yBAAgD;IAEpD,AADE,iBAAO,EACJ;IACL,2BAAI;IAAA,yBAAQ;IAAA,iBAAK;IACjB,2BAAI;IAAA,wBAAO;IAEf,AADE,AADa,iBAAK,EACb,EACC;IACR,8BAAO;IACL,6IAoDC;IAGP,AADE,AADE,iBAAQ,EACF,EACJ;;;IA3FM,eAAsC;IACtC,AADA,sDAAsC,yEAC0B;IAOhE,eAA0C;IAC1C,AADA,0DAA0C,6EAC0B;IAOpE,eAAsC;IACtC,AADA,sDAAsC,yEAC0B;IAOhE,eAAwC;IACxC,AADA,wDAAwC,2EAC0B;IAWxE,eAoDC;IApDD,qCAoDC;;;IA1LT,yHAA2B;IA4F3B,2HAA2B;;;IA5F3B,qDAyFC;IAGD,cAkGC;IAlGD,qDAkGC;;;IAhMD,AAfF,2GAAoC,0EAe3B;;;IAfT,6DAgNC;;;;IAST,+BAA+D;IAA7B,4LAAS,yBAAkB,KAAC;IAAC,iBAAM;;;IAgC3D,iCAA4B;IAC1B,yBAAqC;IACrC,8BACF;IAAA,iBAAO;;;IAQT,AADF,gCAA4B,cACO;IAC/B,yBAAsC;IACtC,6BACF;IAAA,iBAAK;IACL,8BAA8B;IAAA,YAAgC;IAChE,AADgE,iBAAI,EAC9D;;;IAD0B,eAAgC;IAAhC,uDAAgC;;;IAiC1D,AADF,gCAAyB,gBACI;IAAA,8BAAc;IAAA,iBAAO;IAChD,iCAA2B;IAAA,YAAiC;IAC9D,AAD8D,iBAAO,EAC/D;;;IADuB,eAAiC;IAAjC,wDAAiC;;;;IA4BlE,mCAG0C;IAAxC,+MAAS,2CAA6B,KAAC;IACvC,wBAAgC;IAChC,4BACF;IAAA,iBAAS;;;;IA1GT,AADF,AADF,+BAAiC,eACC,eACL;IACvB,oBAA+C;IACjD,iBAAM;IAEJ,AADF,gCAA+B,SACzB;IAAA,YAAyB;IAAA,iBAAK;IAClC,iCAA8B;IAAA,YAAyC;IAE3E,AADE,AADyE,iBAAO,EAC1E,EACF;IACN,mCAAgE;IAA7B,+LAAS,yBAAkB,KAAC;IAC7D,yBAAiC;IAErC,AADE,iBAAS,EACL;IAOA,AADF,AADF,AAFF,iCAAkC,gBAEJ,gBACC,gBAC2E;IAClG,yBAA0D;IAC1D,aACF;IAAA,iBAAO;IACP,+GAAuC;IAO3C,AADE,iBAAM,EACF;IAGN,8GAAkC;IAYhC,AADF,iCAA4B,eACO;IAC/B,0BAA+B;IAC/B,gCACF;IAAA,iBAAK;IAGD,AADF,AADF,iCAAyB,gBACE,iBACI;IAAA,yBAAQ;IAAA,iBAAO;IAC1C,kCAA2B;IAAA,aAAoD;IACjF,AADiF,iBAAO,EAClF;IAEJ,AADF,iCAAyB,iBACI;IAAA,qBAAI;IAAA,iBAAO;IACtC,kCAA2B;IAAA,aAA0C;IACvE,AADuE,iBAAO,EACxE;IAEJ,AADF,iCAAyB,iBACI;IAAA,gCAAe;IAAA,iBAAO;IACjD,kCAA2B;IAAA,aAAmC;IAChE,AADgE,iBAAO,EACjE;IAEJ,AADF,iCAAyB,iBACI;IAAA,mCAAkB;IAAA,iBAAO;IACpD,kCAA2B;IAAA,aAAsC;IACnE,AADmE,iBAAO,EACpE;IAEJ,AADF,iCAAyB,iBACI;IAAA,iCAAgB;IAAA,iBAAO;IAClD,kCAA2B;IAAA,aAAoC;IACjE,AADiE,iBAAO,EAClE;IACN,8GAAmC;IAOvC,AADE,iBAAM,EACF;IAIJ,AADF,iCAA4B,eACO;IAC/B,0BAAiC;IACjC,6BACF;IAAA,iBAAK;IAGD,AADF,AADF,iCAAyB,gBACE,iBACI;IAAA,wBAAO;IAAA,iBAAO;IACzC,kCAA2B;IAAA,aAAmD;;IAChF,AADgF,iBAAO,EACjF;IAEJ,AADF,iCAAyB,iBACI;IAAA,wBAAO;IAAA,iBAAO;IACzC,kCAA2B;IAAA,aAAmD;;IAItF,AADE,AADE,AADE,AADgF,iBAAO,EACjF,EACF,EACF,EACF;IAGN,iCAAkC;IAChC,iHAA0C;IAS1C,oCAGkC;IAAhC,gMAAS,4BAAqB,KAAC;IAC/B,0BAA6C;IAC7C,mCACF;IACF,AADE,iBAAS,EACL;;;IAlHG,eAAuC;IAAvC,0DAAuC;IAGtC,eAAyB;IAAzB,gDAAyB;IACC,eAAyC;IAAzC,gEAAyC;IAa5C,eAAwE;IAAxE,oFAAwE;IAEjG,eACF;IADE,0EACF;IACA,cAKC;IALD,kEAKC;IAKL,cAQC;IARD,6DAQC;IAWgC,gBAAoD;IAApD,2EAAoD;IAIpD,eAA0C;IAA1C,iEAA0C;IAI1C,eAAmC;IAAnC,0DAAmC;IAInC,eAAsC;IAAtC,6DAAsC;IAItC,eAAoC;IAApC,2DAAoC;IAEjE,cAKC;IALD,8DAKC;IAa4B,gBAAmD;IAAnD,4FAAmD;IAInD,eAAmD;IAAnD,4FAAmD;IAQpF,eAQC;IARD,qEAQC;;AD9cT;;;GAGG;AAQI,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,qBAAqB;IAkIxD;IACA;IACA;IACA;IAnIV,uBAAuB;IACN,iBAAiB,GAAG,4BAA4B,CAAC;IAC1D,sBAAsB,GAAG,IAAI,OAAO,EAAQ,CAAC;IAC7C,cAAc,GAAG,KAAK,CAAC;IAE/B,aAAa;IACN,QAAQ,GAAwC,MAAM,CAAC;IACvD,SAAS,GAAG,IAAI,CAAC;IACjB,WAAW,GAAG,IAAI,CAAC;IACnB,gBAAgB,GAAkB,IAAI,CAAC;IAE9C,OAAO;IACA,OAAO,GAAyB,EAAE,CAAC;IACnC,eAAe,GAAyB,EAAE,CAAC;IAC3C,UAAU,GAA+B,EAAE,CAAC;IAC5C,KAAK,GAA2B,EAAE,CAAC;IAE1C,YAAY;IACL,UAAU,GAAG,EAAE,CAAC;IACf,aAAa,GAAG,IAAI,eAAe,CAAS,EAAE,CAAC,CAAC;IACjD,gBAAgB,GAAG,KAAK,CAAC;IACzB,YAAY,GAAG,KAAK,CAAC;IACrB,cAAc,GAAG,KAAK,CAAC;IAE9B,eAAe;IACR,cAAc,GAA8B,IAAI,CAAC;IACjD,kBAAkB,GAAG,KAAK,CAAC;IAElC,UAAU;IACH,UAAU,GAAW,MAAM,CAAC;IAC5B,aAAa,GAAmB,KAAK,CAAC;IAE7C,mBAAmB;IACZ,eAAe,GAAG;QACvB,uBAAuB;QACvB,uBAAuB;QACvB,0BAA0B;QAC1B,iBAAiB;KAClB,CAAC;IACK,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/C,mBAAmB,GAAG,CAAC,CAAC;IACxB,sBAAsB,CAAM;IAE5B,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAChC,qBAAqB,GAAoC,IAAI,CAAC;IAErE,4BAA4B;IAC5B,iEAAiE;IACzD,gBAAgB,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC9C,SAAS,GAAG,IAAI,QAAQ,EAAE,CAAC;IAEnC,0CAA0C;IAC1C,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,wCAAwC;IACxC,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,0CAA0C;IAC1C,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,0CAA0C;IAC1C,IAAW,oBAAoB;QAC7B,OAAO,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED;;;;;OAKG;IACK,qBAAqB,CAAC,UAAkB,EAAE,cAAuD;QACvG,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;QAEnD,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAE5E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,WAAW,UAAU,kCAAkC,CAAC,CAAC;gBACtE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,eAAe,GAAG,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACjF,IAAI,aAAa,GAAG,KAAK,CAAC;YAE1B,QAAQ,cAAc,EAAE,CAAC;gBACvB,KAAK,QAAQ;oBACX,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC;oBAC1C,MAAM;gBACR,KAAK,MAAM;oBACT,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC;oBACxC,MAAM;gBACR,KAAK,QAAQ;oBACX,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC;oBAC1C,MAAM;gBACR,KAAK,QAAQ;oBACX,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC;oBAC1C,MAAM;YACV,CAAC;YAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,cAAc,mBAAmB,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YACvF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACI,oBAAoB;QACzB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,YACU,aAA4B,EAC5B,kBAA8C,EAC9C,iBAAoC,EACpC,GAAsB;QAE9B,KAAK,EAAE,CAAC;QALA,kBAAa,GAAb,aAAa,CAAe;QAC5B,uBAAkB,GAAlB,kBAAkB,CAA4B;QAC9C,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,QAAG,GAAH,GAAG,CAAmB;QAI9B,wCAAwC;QACxC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC9B,YAAY,CAAC,GAAG,CAAC,EACjB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,oCAAoC;QACpC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,sFAAsF;QACtF,IAAI,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;YAC7B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,YAAY,CAAC,GAAG,CAAC,EACjB,oBAAoB,EAAE,EACtB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,4BAA4B;IAC5B,2CAA2C;IAE3C;;OAEG;IACK,mBAAmB;QACzB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9E,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAoC,CAAC;gBACxE,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,KAAK,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,+BAA+B,CAAC,KAAsC;QAC5E,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACjC,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACrC,CAAC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;QACjD,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACzC,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC7C,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACrC,CAAC;QACD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,4BAA4B;QAClC,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,CAAC,iCAAiC;QACnE,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB;QAClC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3C,MAAM,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,wDAAwD,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7C,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;YACxF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC9E,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,+DAA+D;YAC/D,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;gBACnC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;aAC1C,CAAC,CAAC;YAEH,oCAAoC;YACpC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC9C,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACzD,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;YAE/C,0CAA0C;YAC1C,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,SAA+B,CAAC;YAC9E,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAEtE,qBAAqB;YACrB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAqC,CAAC;YAExE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;gBAC5B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClB,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7D,oDAAoD;YACpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAE5C,kDAAkD;gBACjD,MAAc,CAAC,gBAAgB,GAAG,QAAQ,CAAC;gBAC3C,MAAc,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9F,MAAc,CAAC,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC;gBACpH,MAAc,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBAE/F,OAAO,MAA4B,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,uBAAuB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAClG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAChC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAU;QAClC,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACnD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC1E,IAAI,KAAK,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACzD,IAAI,KAAK,CAAC,gBAAgB;YAAE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC3E,IAAI,KAAK,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAC/D,IAAI,KAAK,CAAC,cAAc;YAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IACvE,CAAC;IAEM,cAAc,CAAC,KAAa;QACjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAEM,iBAAiB;QACtB,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAEM,WAAW,CAAC,IAAyC;QAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAEM,qBAAqB,CAAC,QAAgB;QAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/E,CAAC;IAEM,YAAY;QACjB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAClD,gBAAgB;YAChB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;gBAClD,MAAM,aAAa,GACjB,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAChD,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACvD,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACxD,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAEvD,IAAI,CAAC,aAAa;oBAAE,OAAO,KAAK,CAAC;YACnC,CAAC;YAED,kBAAkB;YAClB,IAAI,IAAI,CAAC,gBAAgB,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC7F,OAAO,KAAK,CAAC;YACf,CAAC;YAED,cAAc;YACd,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACjF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,gBAAgB;YAChB,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;gBAC5C,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,CAAC,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAChE,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,IAAI,QAAQ;oBAAE,OAAO,KAAK,CAAC;YACnE,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,MAAc;QAC1B,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC/B,kCAAkC;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,mCAAmC;YACnC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;YACzB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAA6B;QAChD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI,MAA2C,CAAC;YAChD,IAAI,MAA2C,CAAC;YAEhD,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxB,KAAK,MAAM;oBACT,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;oBAChB,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;oBAChB,MAAM;gBACR,KAAK,UAAU;oBACb,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC;oBACxB,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC;oBACxB,MAAM;gBACR,KAAK,MAAM;oBACT,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC;oBACpB,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC;oBACpB,MAAM;gBACR,KAAK,QAAQ;oBACX,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;oBAClB,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;oBAClB,MAAM;gBACR;oBACE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;oBAChB,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;YACpB,CAAC;YAED,+BAA+B;YAC/B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;YAErD,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,gBAAgB,CAAC,UAAkB;QACxC,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;QACnC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAEM,YAAY,CAAC,MAAc;QAChC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAEM,cAAc,CAAC,MAAc;QAClC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAEM,UAAU,CAAC,QAAgB;QAChC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,MAA0B,EAAE,KAAa;QAChE,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,gBAAgB;QACrB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,uDAAuD;QACvD,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED;;OAEG;IACI,mBAAmB;QACxB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,KAAa;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,CAAC;QAED,8DAA8D;QAC9D,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAEM,gBAAgB;QACrB,oDAAoD;QACpD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACpC,CAAC;IAEM,eAAe;QACpB,uEAAuE;QACvE,4CAA4C;QAC5C,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;IAEM,aAAa,CAAC,MAA0B;QAC7C,IAAI,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,OAAO,kBAAkB,CAAC;QAC5B,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,OAAO,kBAAkB,CAAC;QAC5B,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,OAAO,sBAAsB,CAAC;QAChC,CAAC;QACD,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAEM,cAAc,CAAC,MAAc;QAClC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IACrD,CAAC;IAED,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,UAAU,KAAK,EAAE;YACtB,IAAI,CAAC,gBAAgB,KAAK,KAAK;YAC/B,IAAI,CAAC,YAAY,KAAK,KAAK;YAC3B,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC;IACvC,CAAC;IAED,IAAW,yBAAyB;QAClC,mFAAmF;QACnF,OAAO,IAAI,CAAC,eAA6C,CAAC;IAC5D,CAAC;IAEM,YAAY;QACjB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,4BAA4B,EAAE,CAAC;IACtC,CAAC;IAED,wDAAwD;IACxD,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QAC3C,OAAO,0BAA0B,CAAC;IACpC,CAAC;mHAlkBU,yBAAyB;6DAAzB,yBAAyB;YCzChC,AADF,AADF,AAFF,8BAAyC,aAET,aACH,YACK;YAC1B,uBAAmC;YACnC,4BACF;YAAA,iBAAK;YACL,iCAIyB;YADvB,sGAAS,mBAAe,IAAC;YAEzB,uBAAkC;YAGhC,AAFF,iFAAmB,2DAEV;YAGX,iBAAS;YACT,gCAAyB;YAAA,aAAoC;YAC/D,AAD+D,iBAAO,EAChE;YAIF,AADF,AADF,+BAA6B,cACF,kBAMH;YADlB,uGAAS,gBAAY,MAAM,CAAC,IAAC;YAE7B,yBAAgC;YAClC,iBAAS;YACT,mCAKoB;YADlB,uGAAS,gBAAY,MAAM,CAAC,IAAC;YAE7B,yBAAgC;YAEpC,AADE,iBAAS,EACL;YAEN,iGAA4B;YAWhC,AADE,iBAAM,EACF;YAiBI,AADF,AADF,AANF,AALF,AADF,gCAA0B,0BAGG,+BAQC,eACE,eACS,UAC3B;YAAA,+BAAc;YAAA,iBAAK;YAErB,AADF,gCAAmC,gBACL;YAAA,aAA4B;YAAA,iBAAO;YAC/D,iCAA4B;YAAA,aAAuB;YACrD,AADqD,iBAAO,EACtD;YACN,mCAAwD;YAA9B,uGAAS,uBAAmB,IAAC;YACrD,yBAAiC;YAErC,AADE,iBAAS,EACL;YAKF,AADF,AAFF,gCAA4B,eAEA,iBACI;YAC1B,yBAAkC;YAClC,uBACF;YAAA,iBAAQ;YACR,kCAME;YADA,4GAAS,uCAAyC,IAAC;YAEvD,AAPE,iBAME,EACE;YAIJ,AADF,gCAA0B,iBACI;YAC1B,yBAAkC;YAClC,2BACF;YAAA,iBAAQ;YACR,mCAAgH;YAAvD,+GAAU,yCAA2C,IAAC;YAC7G,mCAAoB;YAAA,+BAAc;YAAA,iBAAS;YAC3C,kGAEC;YAEL,AADE,iBAAS,EACL;YAIJ,AADF,gCAA0B,iBACI;YAC1B,yBAA+B;YAC/B,uBACF;YAAA,iBAAQ;YACR,mCAAwG;YAAnD,+GAAU,qCAAuC,IAAC;YACrG,mCAAoB;YAAA,0BAAS;YAAA,iBAAS;YACtC,kGAEC;YAEL,AADE,iBAAS,EACL;YAIJ,AADF,gCAA0B,iBACI;YAC1B,yBAAqC;YACrC,yBACF;YAAA,iBAAQ;YACR,mCAA4G;YAArD,+GAAU,uCAAyC,IAAC;YACzG,mCAAoB;YAAA,6BAAY;YAAA,iBAAS;YACzC,mCAAuB;YAAA,uBAAM;YAAA,iBAAS;YACtC,mCAAyB;YAAA,yBAAQ;YAErC,AADE,AADmC,iBAAS,EACnC,EACL;YAIJ,AADF,gCAA4B,kBACmD;YAAnD,uGAAS,kBAAc,IAAC;YAChD,yBAAgC;YAChC,gCACF;YAIR,AADE,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF,EACc;YAMpB,AAHF,gDAEsB,eACS;YAE3B,8FAAiB;YAOjB,mFAAkB;YAsN1B,AADE,AADE,AADE,iBAAM,EACc,EACP,EACb;YAGN,8FAA0B;YAK1B,gCAA+D;YAC7D,qFAAsB;YA0H1B,AADE,iBAAM,EACF;;YA7eE,eAIC;YAJD,yCAIC;YAEsB,eAAoC;YAApC,iEAAoC;YAQzD,eAAoC;YAApC,iDAAoC;YAQpC,eAAoC;YAApC,iDAAoC;YAOxC,eASC;YATD,oDASC;YAYC,eAAsC;YAItC,AADA,AADA,AADA,AADA,wDAAsC,sBACjB,8BACI,qBACL,4BACG;YAKW,eAA4B;YAA5B,gDAA4B;YAC5B,eAAuB;YAAvB,gDAAuB;YAkBjD,eAAoB;YAApB,sCAAoB;YAWQ,eAA0B;YAA1B,4CAA0B;YAEtD,eAEC;YAFD,6BAEC;YAU2B,eAAsB;YAAtB,wCAAsB;YAElD,eAEC;YAFD,wBAEC;YAU2B,eAAwB;YAAxB,0CAAwB;YAoB5D,gBAAkB;YAClB,AADA,gCAAkB,oBACC;YAGjB,eAIC;YAJD,yCAIC;YAGD,cAkNC;YAlND,0CAkNC;YAOT,cAEC;YAFD,kDAEC;YAGyB,cAAoC;YAApC,iDAAoC;YAC5D,cAwHC;YAxHD,8CAwHC;;;AD5cQ,yBAAyB;IAPrC,aAAa,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;GAO7C,yBAAyB,CAmkBrC;;iFAnkBY,yBAAyB;cANrC,SAAS;6BACI,KAAK,YACP,uBAAuB;;kFAItB,yBAAyB","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { MJAIPromptTypeEntity, MJAIPromptCategoryEntity, MJTemplateEntity, MJTemplateContentEntity, ResourceData, UserInfoEngine } from '@memberjunction/core-entities';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { TemplateEngineBase } from '@memberjunction/templates-base-types';\nimport { SharedService, BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { AITestHarnessDialogService } from '@memberjunction/ng-ai-test-harness';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { MJAIPromptEntityExtended } from '@memberjunction/ai-core-plus';\n\ninterface PromptWithTemplate extends Omit<MJAIPromptEntityExtended, 'Template'> {\n Template: string; // From MJAIPromptEntityExtended (view field)\n MJTemplateEntity?: MJTemplateEntity; // Our added field for the actual template entity\n TemplateContents?: MJTemplateContentEntity[];\n CategoryName?: string;\n TypeName?: string;\n}\n\n/**\n * User preferences for the Prompt Management dashboard\n */\ninterface PromptManagementUserPreferences {\n viewMode: 'grid' | 'list' | 'priority-matrix';\n showFilters: boolean;\n searchTerm: string;\n selectedCategory: string;\n selectedType: string;\n selectedStatus: string;\n sortColumn: string;\n sortDirection: 'asc' | 'desc';\n}\n/**\n * AI Prompts Resource - displays AI prompt management\n * Extends BaseResourceComponent to work with the resource type system\n */\n@RegisterClass(BaseResourceComponent, 'AIPromptsResource')\n@Component({\n standalone: false,\n selector: 'app-prompt-management',\n templateUrl: './prompt-management.component.html',\n styleUrls: ['./prompt-management.component.css']\n})\nexport class PromptManagementComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n // Settings persistence\n private readonly USER_SETTINGS_KEY = 'AI.Prompts.UserPreferences';\n private settingsPersistSubject = new Subject<void>();\n private settingsLoaded = false;\n\n // View state\n public viewMode: 'grid' | 'list' | 'priority-matrix' = 'grid';\n public isLoading = true;\n public showFilters = true;\n public expandedPromptId: string | null = null;\n\n // Data\n public prompts: PromptWithTemplate[] = [];\n public filteredPrompts: PromptWithTemplate[] = [];\n public categories: MJAIPromptCategoryEntity[] = [];\n public types: MJAIPromptTypeEntity[] = [];\n\n // Filtering\n public searchTerm = '';\n private searchSubject = new BehaviorSubject<string>('');\n public selectedCategory = 'all';\n public selectedType = 'all';\n public selectedStatus = 'all';\n\n // Detail panel\n public selectedPrompt: PromptWithTemplate | null = null;\n public detailPanelVisible = false;\n\n // Sorting\n public sortColumn: string = 'Name';\n public sortDirection: 'asc' | 'desc' = 'asc';\n\n // Loading messages\n public loadingMessages = [\n 'Loading AI prompts...',\n 'Fetching templates...',\n 'Organizing categories...',\n 'Almost there...'\n ];\n public currentLoadingMessage = this.loadingMessages[0];\n private loadingMessageIndex = 0;\n private loadingMessageInterval: any;\n\n private destroy$ = new Subject<void>();\n public selectedPromptForTest: MJAIPromptEntityExtended | null = null;\n\n // === Permission Checks ===\n /** Cache for permission checks to avoid repeated calculations */\n private _permissionCache = new Map<string, boolean>();\n private _metadata = new Metadata();\n\n /** Check if user can create AI Prompts */\n public get UserCanCreatePrompts(): boolean {\n return this.checkEntityPermission('MJ: AI Prompts', 'Create');\n }\n\n /** Check if user can read AI Prompts */\n public get UserCanReadPrompts(): boolean {\n return this.checkEntityPermission('MJ: AI Prompts', 'Read');\n }\n\n /** Check if user can update AI Prompts */\n public get UserCanUpdatePrompts(): boolean {\n return this.checkEntityPermission('MJ: AI Prompts', 'Update');\n }\n\n /** Check if user can delete AI Prompts */\n public get UserCanDeletePrompts(): boolean {\n return this.checkEntityPermission('MJ: AI Prompts', 'Delete');\n }\n\n /**\n * Helper method to check entity permissions with caching\n * @param entityName - The name of the entity to check permissions for\n * @param permissionType - The type of permission to check (Create, Read, Update, Delete)\n * @returns boolean indicating if user has the permission\n */\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n \n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n \n if (!entityInfo) {\n console.warn(`Entity '${entityName}' not found for permission check`);\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create':\n hasPermission = userPermissions.CanCreate;\n break;\n case 'Read':\n hasPermission = userPermissions.CanRead;\n break;\n case 'Update':\n hasPermission = userPermissions.CanUpdate;\n break;\n case 'Delete':\n hasPermission = userPermissions.CanDelete;\n break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n console.error(`Error checking ${permissionType} permission for ${entityName}:`, error);\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n /**\n * Clears the permission cache. Call this when user context changes or permissions are updated.\n */\n public clearPermissionCache(): void {\n this._permissionCache.clear();\n }\n\n constructor(\n private sharedService: SharedService,\n private testHarnessService: AITestHarnessDialogService,\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n\n // Set up debounced settings persistence\n this.settingsPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.persistUserPreferences();\n });\n }\n\n ngOnInit(): void {\n // Load saved user preferences first\n this.loadUserPreferences();\n\n this.setupSearchListener();\n this.startLoadingMessages();\n this.loadInitialData();\n\n // Apply initial state from resource configuration if provided (overrides saved prefs)\n if (this.Data?.Configuration) {\n this.applyInitialState(this.Data.Configuration);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n }\n }\n\n private setupSearchListener(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n ).subscribe(searchTerm => {\n this.searchTerm = searchTerm;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n });\n }\n\n // ========================================\n // User Settings Persistence\n // ========================================\n\n /**\n * Load saved user preferences from the UserInfoEngine\n */\n private loadUserPreferences(): void {\n try {\n const savedPrefs = UserInfoEngine.Instance.GetSetting(this.USER_SETTINGS_KEY);\n if (savedPrefs) {\n const prefs = JSON.parse(savedPrefs) as PromptManagementUserPreferences;\n this.applyUserPreferencesFromStorage(prefs);\n }\n } catch (error) {\n console.warn('[PromptManagement] Failed to load user preferences:', error);\n } finally {\n this.settingsLoaded = true;\n }\n }\n\n /**\n * Apply loaded preferences to component state\n */\n private applyUserPreferencesFromStorage(prefs: PromptManagementUserPreferences): void {\n if (prefs.viewMode) {\n this.viewMode = prefs.viewMode;\n }\n if (prefs.showFilters !== undefined) {\n this.showFilters = prefs.showFilters;\n }\n if (prefs.searchTerm) {\n this.searchTerm = prefs.searchTerm;\n }\n if (prefs.selectedCategory) {\n this.selectedCategory = prefs.selectedCategory;\n }\n if (prefs.selectedType) {\n this.selectedType = prefs.selectedType;\n }\n if (prefs.selectedStatus) {\n this.selectedStatus = prefs.selectedStatus;\n }\n if (prefs.sortColumn) {\n this.sortColumn = prefs.sortColumn;\n }\n if (prefs.sortDirection) {\n this.sortDirection = prefs.sortDirection;\n }\n }\n\n /**\n * Get current preferences as an object for saving\n */\n private getCurrentPreferences(): PromptManagementUserPreferences {\n return {\n viewMode: this.viewMode,\n showFilters: this.showFilters,\n searchTerm: this.searchTerm,\n selectedCategory: this.selectedCategory,\n selectedType: this.selectedType,\n selectedStatus: this.selectedStatus,\n sortColumn: this.sortColumn,\n sortDirection: this.sortDirection\n };\n }\n\n /**\n * Persist user preferences to storage (debounced)\n */\n private saveUserPreferencesDebounced(): void {\n if (!this.settingsLoaded) return; // Don't save during initial load\n this.settingsPersistSubject.next();\n }\n\n /**\n * Actually persist user preferences to the UserInfoEngine\n */\n private async persistUserPreferences(): Promise<void> {\n try {\n const prefs = this.getCurrentPreferences();\n await UserInfoEngine.Instance.SetSetting(this.USER_SETTINGS_KEY, JSON.stringify(prefs));\n } catch (error) {\n console.warn('[PromptManagement] Failed to persist user preferences:', error);\n }\n }\n\n private startLoadingMessages(): void {\n this.loadingMessageInterval = setInterval(() => {\n this.loadingMessageIndex = (this.loadingMessageIndex + 1) % this.loadingMessages.length;\n this.currentLoadingMessage = this.loadingMessages[this.loadingMessageIndex];\n }, 2000);\n }\n\n private async loadInitialData(): Promise<void> {\n try {\n // Configure both engines in parallel (no-op if already loaded)\n await Promise.all([\n AIEngineBase.Instance.Config(false),\n TemplateEngineBase.Instance.Config(false)\n ]);\n\n // Get cached data from AIEngineBase\n const prompts = AIEngineBase.Instance.Prompts;\n this.categories = AIEngineBase.Instance.PromptCategories;\n this.types = AIEngineBase.Instance.PromptTypes;\n\n // Get cached data from TemplateEngineBase\n const templates = TemplateEngineBase.Instance.Templates as MJTemplateEntity[];\n const templateContents = TemplateEngineBase.Instance.TemplateContents;\n \n // Create lookup maps\n const templateMap = new Map(templates.map(t => [t.ID, t]));\n const templateContentMap = new Map<string, MJTemplateContentEntity[]>();\n \n templateContents.forEach(tc => {\n const contents = templateContentMap.get(tc.TemplateID) || [];\n contents.push(tc);\n templateContentMap.set(tc.TemplateID, contents);\n });\n\n const categoryMap = new Map(this.categories.map(c => [c.ID, c.Name]));\n const typeMap = new Map(this.types.map(t => [t.ID, t.Name]));\n\n // Combine the data - keep the actual entity objects\n this.prompts = prompts.map(prompt => {\n const template = templateMap.get(prompt.ID);\n \n // Add the extra properties directly to the entity\n (prompt as any).MJTemplateEntity = template;\n (prompt as any).TemplateContents = template ? (templateContentMap.get(template.ID) || []) : [];\n (prompt as any).CategoryName = prompt.CategoryID ? categoryMap.get(prompt.CategoryID) || 'Unknown' : 'Uncategorized';\n (prompt as any).TypeName = prompt.TypeID ? typeMap.get(prompt.TypeID) || 'Unknown' : 'Untyped';\n \n return prompt as PromptWithTemplate;\n });\n\n this.filteredPrompts = [...this.prompts];\n this.applyFilters();\n } catch (error) {\n console.error('Error loading prompt data:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading prompts', 'error', 3000);\n } finally {\n this.isLoading = false;\n if (this.loadingMessageInterval) {\n clearInterval(this.loadingMessageInterval);\n }\n this.NotifyLoadComplete();\n }\n }\n\n private applyInitialState(state: any): void {\n if (state.viewMode) this.viewMode = state.viewMode;\n if (state.showFilters !== undefined) this.showFilters = state.showFilters;\n if (state.searchTerm) this.searchTerm = state.searchTerm;\n if (state.selectedCategory) this.selectedCategory = state.selectedCategory;\n if (state.selectedType) this.selectedType = state.selectedType;\n if (state.selectedStatus) this.selectedStatus = state.selectedStatus;\n }\n\n public onSearchChange(value: string): void {\n this.searchSubject.next(value);\n }\n\n public toggleFilters(): void {\n this.showFilters = !this.showFilters;\n this.saveUserPreferencesDebounced();\n }\n\n public toggleFilterPanel(): void {\n this.showFilters = !this.showFilters;\n this.saveUserPreferencesDebounced();\n }\n\n public setViewMode(mode: 'grid' | 'list' | 'priority-matrix'): void {\n this.viewMode = mode;\n this.expandedPromptId = null;\n this.saveUserPreferencesDebounced();\n }\n\n public togglePromptExpansion(promptId: string): void {\n this.expandedPromptId = this.expandedPromptId === promptId ? null : promptId;\n }\n\n public applyFilters(): void {\n this.filteredPrompts = this.prompts.filter(prompt => {\n // Search filter\n if (this.searchTerm) {\n const searchLower = this.searchTerm.toLowerCase();\n const matchesSearch = \n prompt.Name?.toLowerCase().includes(searchLower) ||\n prompt.Description?.toLowerCase().includes(searchLower) ||\n prompt.CategoryName?.toLowerCase().includes(searchLower) ||\n prompt.TypeName?.toLowerCase().includes(searchLower);\n \n if (!matchesSearch) return false;\n }\n\n // Category filter\n if (this.selectedCategory !== 'all' && !UUIDsEqual(prompt.CategoryID, this.selectedCategory)) {\n return false;\n }\n\n // Type filter\n if (this.selectedType !== 'all' && !UUIDsEqual(prompt.TypeID, this.selectedType)) {\n return false;\n }\n\n // Status filter\n if (this.selectedStatus !== 'all') {\n const isActive = prompt.Status === 'Active';\n if (this.selectedStatus === 'active' && !isActive) return false;\n if (this.selectedStatus === 'inactive' && isActive) return false;\n }\n\n return true;\n });\n\n // Apply sorting\n this.filteredPrompts = this.applySorting(this.filteredPrompts);\n this.cdr.detectChanges();\n }\n\n /**\n * Sort the prompts by the specified column\n */\n public sortBy(column: string): void {\n if (this.sortColumn === column) {\n // Toggle direction if same column\n this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n // New column, default to ascending\n this.sortColumn = column;\n this.sortDirection = 'asc';\n }\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n /**\n * Apply sorting to the filtered list\n */\n private applySorting(prompts: PromptWithTemplate[]): PromptWithTemplate[] {\n return prompts.sort((a, b) => {\n let valueA: string | boolean | null | undefined;\n let valueB: string | boolean | null | undefined;\n\n switch (this.sortColumn) {\n case 'Name':\n valueA = a.Name;\n valueB = b.Name;\n break;\n case 'Category':\n valueA = a.CategoryName;\n valueB = b.CategoryName;\n break;\n case 'Type':\n valueA = a.TypeName;\n valueB = b.TypeName;\n break;\n case 'Status':\n valueA = a.Status;\n valueB = b.Status;\n break;\n default:\n valueA = a.Name;\n valueB = b.Name;\n }\n\n // Handle null/undefined values\n const strA = (valueA ?? '').toString().toLowerCase();\n const strB = (valueB ?? '').toString().toLowerCase();\n\n let comparison = strA.localeCompare(strB);\n return this.sortDirection === 'desc' ? -comparison : comparison;\n });\n }\n\n public onCategoryChange(categoryId: string): void {\n this.selectedCategory = categoryId;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onTypeChange(typeId: string): void {\n this.selectedType = typeId;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public onStatusChange(status: string): void {\n this.selectedStatus = status;\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n public openPrompt(promptId: string): void {\n const compositeKey = new CompositeKey([{ FieldName: 'ID', Value: promptId }]);\n this.navigationService.OpenEntityRecord('MJ: AI Prompts', compositeKey);\n }\n\n /**\n * Show the detail panel for a prompt\n */\n public showPromptDetails(prompt: PromptWithTemplate, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n this.selectedPrompt = prompt;\n this.detailPanelVisible = true;\n }\n\n /**\n * Close the detail panel\n */\n public closeDetailPanel(): void {\n this.detailPanelVisible = false;\n // Delay clearing selectedPrompt for smoother animation\n setTimeout(() => {\n if (!this.detailPanelVisible) {\n this.selectedPrompt = null;\n }\n }, 300);\n }\n\n /**\n * Open the full entity record from the detail panel\n */\n public openPromptFromPanel(): void {\n if (this.selectedPrompt) {\n this.openPrompt(this.selectedPrompt.ID);\n }\n }\n\n public testPrompt(promptId: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n \n // Use the test harness service for window management features\n this.testHarnessService.openForPrompt(promptId);\n }\n\n public closeTestHarness(): void {\n // No longer needed - window manages its own closure\n this.selectedPromptForTest = null;\n }\n\n public createNewPrompt(): void {\n // Use the standard MemberJunction pattern to open a new AI Prompt form\n // Empty CompositeKey indicates a new record\n this.navigationService.OpenEntityRecord('MJ: AI Prompts', new CompositeKey([]));\n }\n\n public getPromptIcon(prompt: PromptWithTemplate): string {\n if (prompt.TypeName?.toLowerCase().includes('system')) {\n return 'fa-solid fa-cogs';\n } else if (prompt.TypeName?.toLowerCase().includes('user')) {\n return 'fa-solid fa-user';\n } else if (prompt.TypeName?.toLowerCase().includes('chat')) {\n return 'fa-solid fa-comments';\n }\n return 'fa-solid fa-comment-dots';\n }\n\n public getStatusClass(status: string): string {\n return status === 'Active' ? 'active' : 'inactive';\n }\n\n public get hasActiveFilters(): boolean {\n return this.searchTerm !== '' || \n this.selectedCategory !== 'all' || \n this.selectedType !== 'all' || \n this.selectedStatus !== 'all';\n }\n\n public get filteredPromptsAsEntities(): MJAIPromptEntityExtended[] {\n // The prompts are already MJAIPromptEntityExtended instances with extra properties\n return this.filteredPrompts as MJAIPromptEntityExtended[];\n }\n\n public clearFilters(): void {\n this.searchTerm = '';\n this.selectedCategory = 'all';\n this.selectedType = 'all';\n this.selectedStatus = 'all';\n this.searchSubject.next('');\n this.applyFilters();\n this.saveUserPreferencesDebounced();\n }\n\n // BaseResourceComponent abstract method implementations\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Prompts';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-comment-dots';\n }\n}","<div class=\"prompt-management-container\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-message\"></i>\n AI Prompts\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredPrompts.length }} prompts</span>\n </div>\n\n <div class=\"header-controls\">\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n\n @if (UserCanCreatePrompts) {\n <button\n type=\"button\"\n class=\"control-btn primary\"\n (click)=\"createNewPrompt()\"\n title=\"Create New Prompt\">\n <i class=\"fa-solid fa-plus\"></i>\n New Prompt\n </button>\n }\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <div class=\"main-content\">\n <kendo-splitter\n class=\"main-splitter\"\n orientation=\"horizontal\">\n\n <!-- Filter Panel (Left) -->\n <kendo-splitter-pane\n [size]=\"showFilters ? '320px' : '0px'\"\n [collapsible]=\"false\"\n [resizable]=\"showFilters\"\n [scrollable]=\"false\"\n [hidden]=\"!showFilters\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Prompt Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredPrompts.length }}</span>\n <span class=\"summary-label\">of {{ prompts.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-search\"></i>\n Name\n </label>\n <input\n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search prompts...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Category Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-folder\"></i>\n Category\n </label>\n <select class=\"filter-select\" [value]=\"selectedCategory\" (change)=\"onCategoryChange($any($event.target).value)\">\n <option value=\"all\">All Categories</option>\n @for (category of categories; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-tag\"></i>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of types; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <i class=\"fa-solid fa-toggle-on\"></i>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <i class=\"fa-solid fa-undo\"></i>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Prompts List Panel -->\n <kendo-splitter-pane\n [resizable]=\"true\"\n [scrollable]=\"true\">\n <div class=\"prompts-content\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"currentLoadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Prompts Display -->\n @if (!isLoading) {\n @if (filteredPrompts.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-message\"></i>\n <h3>No prompts found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI prompt to get started' }}</p>\n @if (!hasActiveFilters && UserCanCreatePrompts) {\n <button\n type=\"button\"\n class=\"empty-state-btn\"\n (click)=\"createNewPrompt()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Prompt\n </button>\n }\n </div>\n } @else {\n <!-- Grid View -->\n @if (viewMode === 'grid') {\n <div class=\"prompts-grid\">\n @for (prompt of filteredPrompts; track prompt.ID) {\n <div class=\"prompt-card\" [class.expanded]=\"expandedPromptId === prompt.ID\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"togglePromptExpansion(prompt.ID)\">\n <div class=\"prompt-info\">\n <div class=\"prompt-icon\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n </div>\n <div class=\"prompt-details\">\n <h4 class=\"prompt-name\" [innerHTML]=\"prompt.Name | highlightSearch:searchTerm\"></h4>\n <div class=\"prompt-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ prompt.CategoryName }}\n </span>\n @if (prompt.Status) {\n <span class=\"meta-item\" [class]=\"'status-' + prompt.Status.toLowerCase()\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n {{ prompt.Status }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <i class=\"fa-solid fa-chevron-down expand-icon\"\n [class.rotated]=\"expandedPromptId === prompt.ID\"></i>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (prompt.Description) {\n <p class=\"prompt-description\" [innerHTML]=\"prompt.Description | highlightSearch:searchTerm\"></p>\n } @else {\n <p class=\"prompt-description text-muted\">No description provided</p>\n }\n\n <!-- Expandable Content -->\n @if (expandedPromptId === prompt.ID) {\n <div class=\"expanded-content\">\n <div class=\"prompt-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Type</span>\n <span class=\"stat-value\">{{ prompt.TypeName }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Template</span>\n <span class=\"stat-value\">\n @if (prompt.MJTemplateEntity) {\n <i class=\"fa-solid fa-check\" style=\"color: #28a745;\"></i> Yes\n } @else {\n <i class=\"fa-solid fa-times\" style=\"color: #dc3545;\"></i> No\n }\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\">\n @if (UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn\"\n (click)=\"showPromptDetails(prompt, $event)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n Details\n </button>\n }\n\n @if (prompt.Status === 'Active' && UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn action-btn-primary\"\n (click)=\"testPrompt(prompt.ID, $event)\"\n title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n Run\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- List View -->\n @if (viewMode === 'list') {\n <div class=\"prompts-list\">\n <table class=\"prompts-table\">\n <thead>\n <tr>\n <th (click)=\"sortBy('Name')\"\n [class.sorted]=\"sortColumn === 'Name'\"\n [class.desc]=\"sortColumn === 'Name' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Name\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Category')\"\n [class.sorted]=\"sortColumn === 'Category'\"\n [class.desc]=\"sortColumn === 'Category' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Category\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Type')\"\n [class.sorted]=\"sortColumn === 'Type'\"\n [class.desc]=\"sortColumn === 'Type' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Type\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"sortBy('Status')\"\n [class.sorted]=\"sortColumn === 'Status'\"\n [class.desc]=\"sortColumn === 'Status' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Status\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th>Template</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (prompt of filteredPrompts; track prompt.ID) {\n <tr>\n <td>\n <div class=\"prompt-name-cell\">\n <div class=\"prompt-icon-small\">\n <i [class]=\"getPromptIcon(prompt)\"></i>\n </div>\n <div>\n <div class=\"prompt-name\" [innerHTML]=\"prompt.Name | highlightSearch:searchTerm\"></div>\n @if (prompt.Description) {\n <div class=\"prompt-description-small\" [innerHTML]=\"prompt.Description | highlightSearch:searchTerm\"></div>\n }\n </div>\n </div>\n </td>\n <td>{{ prompt.CategoryName }}</td>\n <td>{{ prompt.TypeName }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"'status-' + (prompt.Status || 'unknown').toLowerCase()\">\n {{ prompt.Status || 'Unknown' }}\n </span>\n </td>\n <td>\n @if (prompt.MJTemplateEntity) {\n <i class=\"fa-solid fa-check-circle\" style=\"color: #28a745;\"></i>\n } @else {\n <i class=\"fa-solid fa-times-circle\" style=\"color: #6c757d;\"></i>\n }\n </td>\n <td>\n <div class=\"table-actions\">\n @if (UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn-small\"\n (click)=\"showPromptDetails(prompt)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n }\n @if (prompt.Status === 'Active' && UserCanReadPrompts) {\n <button\n type=\"button\"\n class=\"action-btn-small primary\"\n (click)=\"testPrompt(prompt.ID, $event)\"\n title=\"Run Prompt\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n }\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </div>\n\n <!-- Detail Panel Overlay -->\n @if (detailPanelVisible) {\n <div class=\"detail-panel-overlay\" (click)=\"closeDetailPanel()\"></div>\n }\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" [class.visible]=\"detailPanelVisible\">\n @if (selectedPrompt) {\n <!-- Panel Header -->\n <div class=\"detail-panel-header\">\n <div class=\"detail-panel-title\">\n <div class=\"detail-icon\">\n <i [class]=\"getPromptIcon(selectedPrompt)\"></i>\n </div>\n <div class=\"detail-title-info\">\n <h3>{{ selectedPrompt.Name }}</h3>\n <span class=\"detail-subtitle\">{{ selectedPrompt.TypeName || 'Prompt' }}</span>\n </div>\n </div>\n <button class=\"detail-panel-close\" (click)=\"closeDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"detail-panel-content\">\n <!-- Status Section -->\n <div class=\"detail-section\">\n <div class=\"detail-badges\">\n <span class=\"status-badge\" [class]=\"'status-' + (selectedPrompt.Status || 'unknown').toLowerCase()\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n {{ selectedPrompt.Status || 'Unknown' }}\n </span>\n @if (selectedPrompt.MJTemplateEntity) {\n <span class=\"feature-badge\">\n <i class=\"fa-solid fa-file-code\"></i>\n Has Template\n </span>\n }\n </div>\n </div>\n\n <!-- Description -->\n @if (selectedPrompt.Description) {\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h4>\n <p class=\"detail-description\">{{ selectedPrompt.Description }}</p>\n </div>\n }\n\n <!-- Configuration Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n Configuration\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Category</span>\n <span class=\"detail-value\">{{ selectedPrompt.CategoryName || 'Uncategorized' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Type</span>\n <span class=\"detail-value\">{{ selectedPrompt.TypeName || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Response Format</span>\n <span class=\"detail-value\">{{ selectedPrompt.ResponseFormat }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Selection Strategy</span>\n <span class=\"detail-value\">{{ selectedPrompt.SelectionStrategy }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Power Preference</span>\n <span class=\"detail-value\">{{ selectedPrompt.PowerPreference }}</span>\n </div>\n @if (selectedPrompt.MinPowerRank) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Min Power Rank</span>\n <span class=\"detail-value\">{{ selectedPrompt.MinPowerRank }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Timestamps -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timestamps\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Created</span>\n <span class=\"detail-value\">{{ selectedPrompt.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Updated</span>\n <span class=\"detail-value\">{{ selectedPrompt.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"detail-panel-actions\">\n @if (selectedPrompt.Status === 'Active') {\n <button\n type=\"button\"\n class=\"detail-action-btn secondary\"\n (click)=\"testPrompt(selectedPrompt.ID)\">\n <i class=\"fa-solid fa-play\"></i>\n Run Prompt\n </button>\n }\n <button\n type=\"button\"\n class=\"detail-action-btn primary\"\n (click)=\"openPromptFromPanel()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n }\n </div>\n</div>\n"]}
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { Component } from '@angular/core';
8
8
  import { LogError, LogStatus, CompositeKey } from '@memberjunction/core';
9
9
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
10
- import { RegisterClass } from '@memberjunction/global';
10
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
11
11
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
12
12
  import * as i0 from "@angular/core";
13
13
  import * as i1 from "@memberjunction/ng-shared";
@@ -650,14 +650,14 @@ let SystemConfigurationComponent = class SystemConfigurationComponent extends Ba
650
650
  // Create extended configurations with associated data
651
651
  this.configurations = configs.map(config => {
652
652
  const extended = config;
653
- extended.params = params.filter(p => p.ConfigurationID === config.ID);
653
+ extended.params = params.filter(p => UUIDsEqual(p.ConfigurationID, config.ID));
654
654
  extended.isExpanded = false;
655
655
  // Find linked prompts
656
656
  if (config.DefaultPromptForContextCompressionID) {
657
- extended.compressionPrompt = prompts.find(p => p.ID === config.DefaultPromptForContextCompressionID) || null;
657
+ extended.compressionPrompt = prompts.find(p => UUIDsEqual(p.ID, config.DefaultPromptForContextCompressionID)) || null;
658
658
  }
659
659
  if (config.DefaultPromptForContextSummarizationID) {
660
- extended.summarizationPrompt = prompts.find(p => p.ID === config.DefaultPromptForContextSummarizationID) || null;
660
+ extended.summarizationPrompt = prompts.find(p => UUIDsEqual(p.ID, config.DefaultPromptForContextSummarizationID)) || null;
661
661
  }
662
662
  return extended;
663
663
  });