@memberjunction/ng-dashboards 5.11.0 → 5.13.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 (229) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +586 -223
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  8. package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
  9. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  10. package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
  11. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
  12. package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
  13. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  14. package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
  15. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  16. package/dist/AI/components/charts/time-series-chart.component.js +23 -8
  17. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  18. package/dist/AI/components/execution-monitoring.component.js +2 -2
  19. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  20. package/dist/AI/components/models/model-management.component.js +2 -2
  21. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  22. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  23. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  24. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
  26. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
  27. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
  28. package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
  29. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
  30. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  31. package/dist/AI/components/system/system-configuration.component.js +2 -2
  32. package/dist/AI/components/widgets/kpi-card.component.js +7 -7
  33. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  34. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
  35. package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
  36. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  37. package/dist/AI/index.d.ts +1 -0
  38. package/dist/AI/index.d.ts.map +1 -1
  39. package/dist/AI/index.js +2 -0
  40. package/dist/AI/index.js.map +1 -1
  41. package/dist/APIKeys/api-applications-panel.component.js +3 -3
  42. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  43. package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
  44. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  45. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  46. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  47. package/dist/APIKeys/api-key-list.component.js +3 -3
  48. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  49. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  50. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  51. package/dist/APIKeys/api-scopes-panel.component.js +2 -2
  52. package/dist/APIKeys/api-usage-panel.component.js +2 -2
  53. package/dist/Actions/components/actions-overview.component.js +2 -2
  54. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  55. package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
  56. package/dist/Actions/components/explorer/action-card.component.js +2 -2
  57. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  58. package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
  59. package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
  61. package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
  62. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  63. package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
  64. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  65. package/dist/Communication/communication-dashboard.component.js +2 -2
  66. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  67. package/dist/Communication/communication-logs-resource.component.js +3 -3
  68. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  69. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  70. package/dist/Communication/communication-monitor-resource.component.js +5 -5
  71. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  72. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  73. package/dist/Communication/communication-providers-resource.component.js +3 -3
  74. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  75. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  76. package/dist/Communication/communication-runs-resource.component.js +3 -3
  77. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  78. package/dist/Communication/communication-templates-resource.component.js +2 -2
  79. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  80. package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
  81. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
  82. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
  83. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
  84. package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
  86. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
  88. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
  90. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
  92. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  96. package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  98. package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
  99. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
  100. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
  102. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
  107. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
  109. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
  111. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  112. package/dist/Credentials/credentials-dashboard.component.js +2 -2
  113. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
  114. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
  115. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  116. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
  117. package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
  118. package/dist/DataExplorer/data-explorer-dashboard.component.js +4 -4
  119. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  120. package/dist/Home/home-dashboard.component.js +2 -2
  121. package/dist/Integration/components/activity/activity.component.d.ts +1 -1
  122. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  123. package/dist/Integration/components/activity/activity.component.js +5 -5
  124. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  125. package/dist/Integration/components/connections/connections.component.d.ts +31 -2
  126. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  127. package/dist/Integration/components/connections/connections.component.js +753 -412
  128. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  129. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
  130. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  131. package/dist/Integration/components/overview/overview.component.d.ts +0 -1
  132. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  133. package/dist/Integration/components/overview/overview.component.js +3 -6
  134. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  135. package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
  136. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  137. package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
  138. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  139. package/dist/Integration/components/schedules/schedules.component.js +97 -5
  140. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  141. package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
  142. package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
  143. package/dist/Integration/components/widgets/integration-card.component.js +5 -1
  144. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  145. package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
  146. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  147. package/dist/Integration/integration.module.d.ts +2 -1
  148. package/dist/Integration/integration.module.d.ts.map +1 -1
  149. package/dist/Integration/integration.module.js +7 -3
  150. package/dist/Integration/integration.module.js.map +1 -1
  151. package/dist/Integration/services/integration-data.service.d.ts +27 -2
  152. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  153. package/dist/Integration/services/integration-data.service.js +107 -4
  154. package/dist/Integration/services/integration-data.service.js.map +1 -1
  155. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  156. package/dist/Lists/components/lists-browse-resource.component.js +25 -24
  157. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  158. package/dist/Lists/components/lists-categories-resource.component.js +2 -2
  159. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  160. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  161. package/dist/Lists/components/lists-my-lists-resource.component.js +26 -25
  162. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  163. package/dist/Lists/components/lists-operations-resource.component.js +2 -2
  164. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  165. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
  166. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  167. package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
  168. package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
  169. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  170. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  171. package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
  172. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  173. package/dist/MCP/mcp-dashboard.component.js +2 -2
  174. package/dist/MCP/mcp-filter-panel.component.js +2 -2
  175. package/dist/QueryBrowser/query-browser-resource.component.js +7 -7
  176. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  177. package/dist/Scheduling/components/index.d.ts +0 -1
  178. package/dist/Scheduling/components/index.d.ts.map +1 -1
  179. package/dist/Scheduling/components/index.js +0 -1
  180. package/dist/Scheduling/components/index.js.map +1 -1
  181. package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
  182. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
  183. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  184. package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
  185. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  186. package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
  187. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  188. package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
  189. package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
  190. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  191. package/dist/Testing/components/testing-analytics.component.js +2 -2
  192. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  193. package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
  194. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  195. package/dist/Testing/components/testing-explorer.component.js +2 -2
  196. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  197. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  198. package/dist/Testing/components/testing-review.component.js +5 -5
  199. package/dist/Testing/components/testing-review.component.js.map +1 -1
  200. package/dist/Testing/components/testing-runs.component.js +2 -2
  201. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  202. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
  203. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  204. package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
  205. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  206. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
  207. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  208. package/dist/Testing/testing-dashboard.component.js +2 -2
  209. package/dist/VersionHistory/components/diff-resource.component.js +2 -2
  210. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  211. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  212. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  213. package/dist/VersionHistory/components/restore-resource.component.js +3 -3
  214. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  215. package/dist/__tests__/integration-data-service.test.js +1 -0
  216. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  217. package/dist/module.d.ts +52 -49
  218. package/dist/module.d.ts.map +1 -1
  219. package/dist/module.js +25 -6
  220. package/dist/module.js.map +1 -1
  221. package/dist/public-api.d.ts +1 -1
  222. package/dist/public-api.d.ts.map +1 -1
  223. package/dist/public-api.js +1 -1
  224. package/dist/public-api.js.map +1 -1
  225. package/package.json +42 -40
  226. package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
  227. package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
  228. package/dist/Scheduling/components/job-slideout.component.js +0 -459
  229. package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"query-browser-resource.component.js","sourceRoot":"","sources":["../../src/QueryBrowser/query-browser-resource.component.ts","../../src/QueryBrowser/query-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ElementRef, NgZone, HostListener, ViewChild } from '@angular/core';\nimport { CodeEditorComponent } from '@memberjunction/ng-code-editor';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { Metadata, QueryInfo, QueryCategoryInfo, CompositeKey } from '@memberjunction/core';\nimport { ResourceData, UserInfoEngine, MJQueryEntity } from '@memberjunction/core-entities';\nimport {\n QueryEntityLinkClickEvent,\n QueryRowClickEvent\n} from '@memberjunction/ng-query-viewer';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\n/**\n * Tree node for the query category hierarchy\n */\ninterface CategoryNode {\n category: QueryCategoryInfo;\n children: CategoryNode[];\n queries: QueryInfo[];\n expanded: boolean;\n level: number;\n}\n\n/**\n * A resource component for browsing and executing stored queries.\n * Features:\n * - Hierarchical category navigation\n * - Query search\n * - Query viewer with parameter input\n * - Entity linking for clickable record IDs\n */\n@RegisterClass(BaseResourceComponent, 'QueryBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-query-browser-resource',\n templateUrl: './query-browser-resource.component.html',\n styleUrls: ['./query-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private static readonly SETTINGS_KEY = 'QueryBrowser/panelWidth';\n private static readonly STATUS_FILTERS_KEY = 'QueryBrowser/statusFilters';\n private static readonly EXPANDED_STATE_KEY = 'QueryBrowser/expandedCategories';\n private static readonly DEFAULT_PANEL_WIDTH = 320;\n private static readonly MIN_PANEL_WIDTH = 200;\n private static readonly MAX_PANEL_WIDTH = 600;\n\n public isLoading = true;\n public categories: QueryCategoryInfo[] = [];\n public categoryTree: CategoryNode[] = [];\n /** All queries the user has permission to run */\n public queries: QueryInfo[] = [];\n public filteredQueries: QueryInfo[] = [];\n private filteredQueryIds = new Set<string>();\n public selectedQuery: QueryInfo | null = null;\n public searchText = '';\n public PanelWidth = QueryBrowserResourceComponent.DEFAULT_PANEL_WIDTH;\n public IsResizing = false;\n\n /** Status filter toggles — which statuses to show in the tree */\n public StatusFilters: Record<string, boolean> = {\n 'Approved': true,\n 'Pending': true,\n 'Rejected': false,\n 'Expired': false\n };\n\n /** Ordered list of all possible statuses for the filter bar */\n public readonly AllStatuses: string[] = ['Approved', 'Pending', 'Rejected', 'Expired'];\n\n /** Tracks expanded state by category ID — persisted across sessions */\n private expandedState = new Map<string, boolean>();\n\n private metadata = new Metadata();\n private destroy$ = new Subject<void>();\n private dataLoaded = false;\n private skipUrlUpdate = true; // Skip URL updates during initialization\n private lastNavigatedUrl = ''; // Track URL to avoid reacting to our own navigation\n\n // Bound event handlers for resize (need references for removeEventListener)\n private boundOnResizeMove = this.onResizeMove.bind(this);\n private boundOnResizeEnd = this.onResizeEnd.bind(this);\n\n // ========================================\n // Drawer State (Create / Edit)\n // ========================================\n\n public ShowQueryDrawer = false;\n public DrawerMode: 'create' | 'edit' = 'create';\n public DrawerQueryId: string | null = null;\n public DrawerName = '';\n public DrawerSQL = '';\n @ViewChild('drawerSqlEditor') private drawerSqlEditor: CodeEditorComponent | null = null;\n public DrawerDescription = '';\n public DrawerCategoryID = '';\n public DrawerStatus: 'Pending' | 'Approved' | 'Rejected' | 'Expired' = 'Pending';\n public IsSavingDrawer = false;\n public DrawerNameError = false;\n public DrawerSaveError: string | null = null;\n\n /** Ordered status options for the drawer dropdown — all valid Query statuses */\n public readonly DrawerStatuses: Array<'Pending' | 'Approved' | 'Rejected' | 'Expired'> =\n ['Pending', 'Approved', 'Rejected', 'Expired'];\n\n private initialDrawerSnapshot = '';\n\n constructor(\n private cdr: ChangeDetectorRef,\n private navigationService: NavigationService,\n private router: Router,\n private elementRef: ElementRef,\n private zone: NgZone\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.loadSavedPanelWidth();\n this.loadSavedStatusFilters();\n this.loadSavedExpandedState();\n this.loadData();\n\n // Subscribe to router NavigationEnd events for back/forward button support\n this.router.events\n .pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntil(this.destroy$)\n )\n .subscribe(event => {\n const currentUrl = event.urlAfterRedirects || event.url;\n if (currentUrl !== this.lastNavigatedUrl && this.dataLoaded) {\n this.onExternalNavigation(currentUrl);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n // Ensure any pending debounced settings are flushed\n UserInfoEngine.Instance.FlushPendingSettings();\n // Remove resize listeners if active\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Queries';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-database';\n }\n\n // ========================================\n // Data Loading\n // ========================================\n\n private async loadData(forceRefresh = false): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n // Force re-fetch from server when explicitly refreshing\n if (forceRefresh) {\n await this.metadata.Refresh();\n }\n\n // Load all queries the user has permission to run (regardless of status)\n this.categories = this.metadata.QueryCategories || [];\n this.queries = (this.metadata.Queries || []).filter(q =>\n q.UserCanRun(this.metadata.CurrentUser)\n );\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Mark data as loaded and apply any query params for deep linking\n this.dataLoaded = true;\n\n // Parse initial URL state\n const urlState = this.parseUrlState();\n if (urlState?.queryId) {\n const query = this.queries.find(q => UUIDsEqual(q.ID, urlState.queryId));\n if (query) {\n this.selectedQuery = query;\n this.expandCategoryForQuery(query);\n }\n }\n\n // Enable URL updates after initialization\n this.skipUrlUpdate = false;\n\n } catch (error) {\n console.error('Error loading queries:', error);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private buildCategoryTree(): void {\n const categoryMap = new Map<string, CategoryNode>();\n\n // Use filtered queries (status + search filters applied)\n const visibleQueries = this.filteredQueries;\n\n // Create nodes for all categories, restoring expanded state\n for (const category of this.categories) {\n const queriesInCategory = visibleQueries.filter(q => UUIDsEqual(q.CategoryID, category.ID));\n categoryMap.set(category.ID, {\n category,\n children: [],\n queries: queriesInCategory,\n expanded: this.expandedState.get(category.ID) ?? false,\n level: 0\n });\n }\n\n // Build tree structure\n const roots: CategoryNode[] = [];\n for (const category of this.categories) {\n const node = categoryMap.get(category.ID)!;\n if (category.ParentID) {\n const parent = categoryMap.get(category.ParentID);\n if (parent) {\n node.level = parent.level + 1;\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n // Add uncategorized queries to a virtual root\n const uncategorizedQueries = visibleQueries.filter(q => !q.CategoryID);\n if (uncategorizedQueries.length > 0) {\n const uncategorizedCategory = new QueryCategoryInfo({\n ID: '__uncategorized__',\n Name: 'Uncategorized',\n Description: 'Queries without a category'\n });\n roots.push({\n category: uncategorizedCategory,\n children: [],\n queries: uncategorizedQueries,\n expanded: this.expandedState.get('__uncategorized__') ?? false,\n level: 0\n });\n }\n\n // Sort children recursively\n const sortNodes = (nodes: CategoryNode[]): void => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n for (const node of nodes) {\n node.queries.sort((a, b) => a.Name.localeCompare(b.Name));\n sortNodes(node.children);\n }\n };\n sortNodes(roots);\n\n this.categoryTree = roots;\n }\n\n // ========================================\n // Search\n // ========================================\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n this.buildCategoryTree();\n\n // Expand all categories when searching so results are visible\n if (value) {\n this.expandAll();\n }\n\n this.cdr.markForCheck();\n }\n\n public clearSearch(): void {\n this.searchText = '';\n this.applyFilters();\n this.buildCategoryTree();\n this.cdr.markForCheck();\n }\n\n // ========================================\n // Status Filters\n // ========================================\n\n /** Toggle a status filter on/off and rebuild the tree */\n public toggleStatusFilter(status: string): void {\n this.StatusFilters[status] = !this.StatusFilters[status];\n this.applyFilters();\n this.buildCategoryTree();\n this.saveStatusFilters();\n this.cdr.markForCheck();\n }\n\n /** Get the count of queries with a given status */\n public getStatusCount(status: string): number {\n return this.queries.filter(q => q.Status === status).length;\n }\n\n /** Get the CSS color for a query status */\n public getStatusColor(status: string): string {\n switch (status) {\n case 'Approved': return '#28a745';\n case 'Pending': return '#f59e0b';\n case 'Rejected': return '#dc3545';\n case 'Expired': return '#6c757d';\n default: return '#6c757d';\n }\n }\n\n /** Get the Font Awesome icon for a query status */\n public getStatusIcon(status: string): string {\n switch (status) {\n case 'Approved': return 'fa-check-circle';\n case 'Pending': return 'fa-clock';\n case 'Rejected': return 'fa-times-circle';\n case 'Expired': return 'fa-archive';\n default: return 'fa-question-circle';\n }\n }\n\n /** Apply both status and search filters to produce filteredQueries */\n private applyFilters(): void {\n // First filter by status\n let result = this.queries.filter(q => this.StatusFilters[q.Status] === true);\n\n // Then filter by search text\n if (this.searchText.trim()) {\n const searchLower = this.searchText.toLowerCase();\n result = result.filter(q =>\n q.Name.toLowerCase().includes(searchLower) ||\n q.Description?.toLowerCase().includes(searchLower) ||\n q.Category?.toLowerCase().includes(searchLower)\n );\n }\n\n this.filteredQueries = result;\n this.filteredQueryIds = new Set(result.map(q => q.ID.toLowerCase()));\n }\n\n /** Load saved status filter preferences */\n private loadSavedStatusFilters(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.STATUS_FILTERS_KEY);\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n // Merge saved values onto defaults (preserves any new statuses added later)\n for (const key of Object.keys(this.StatusFilters)) {\n if (typeof parsed[key] === 'boolean') {\n this.StatusFilters[key] = parsed[key];\n }\n }\n } catch {\n // Ignore invalid JSON, keep defaults\n }\n }\n }\n\n /** Save status filter preferences with debouncing */\n private saveStatusFilters(): void {\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.STATUS_FILTERS_KEY,\n JSON.stringify(this.StatusFilters)\n );\n }\n\n /** Load saved expanded/collapsed state for category nodes */\n private loadSavedExpandedState(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.EXPANDED_STATE_KEY);\n if (saved) {\n try {\n const parsed: Record<string, boolean> = JSON.parse(saved);\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'boolean') {\n this.expandedState.set(key, value);\n }\n }\n } catch {\n // Ignore invalid JSON, start fresh\n }\n }\n }\n\n /** Save expanded/collapsed state with debouncing */\n private saveExpandedState(): void {\n const obj: Record<string, boolean> = {};\n for (const [key, value] of this.expandedState.entries()) {\n obj[key] = value;\n }\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.EXPANDED_STATE_KEY,\n JSON.stringify(obj)\n );\n }\n\n // ========================================\n // Tree Navigation\n // ========================================\n\n public toggleExpand(node: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n node.expanded = !node.expanded;\n this.expandedState.set(node.category.ID, node.expanded);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public expandAll(): void {\n const expand = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n expand(node.children);\n }\n };\n expand(this.categoryTree);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public collapseAll(): void {\n const collapse = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = false;\n this.expandedState.set(node.category.ID, false);\n collapse(node.children);\n }\n };\n collapse(this.categoryTree);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public selectQuery(query: QueryInfo, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n this.selectedQuery = query;\n this.updateUrl();\n this.cdr.markForCheck();\n }\n\n public isQueryVisible(query: QueryInfo): boolean {\n if (!this.searchText) return true;\n return this.filteredQueryIds.has(query.ID.toLowerCase());\n }\n\n public hasVisibleContent(node: CategoryNode): boolean {\n if (!this.searchText) return true;\n\n // Check if any queries in this category match\n if (node.queries.some(q => this.isQueryVisible(q))) {\n return true;\n }\n\n // Check if any child categories have visible content\n return node.children.some(child => this.hasVisibleContent(child));\n }\n\n // ========================================\n // Query Viewer Events\n // ========================================\n\n public onEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n // Look up the entity's actual primary key field name from metadata\n const entity = this.metadata.Entities.find(e => e.Name === event.entityName);\n const pkField = entity?.FirstPrimaryKey;\n const pkFieldName = pkField?.Name || 'ID';\n\n const compositeKey = new CompositeKey([{ FieldName: pkFieldName, Value: event.recordId }]);\n this.navigationService.OpenEntityRecord(event.entityName, compositeKey);\n }\n\n public onRowDoubleClick(event: QueryRowClickEvent): void {\n // Could show record details or other action\n }\n\n public onOpenQueryRecord(event: { queryId: string; queryName: string }): void {\n // Open the Query entity record using navigation service\n const compositeKey = CompositeKey.FromID(event.queryId);\n this.navigationService.OpenEntityRecord('MJ: Queries', compositeKey);\n }\n\n public onCompositionTokenClick(event: CompositionTokenClickEvent): void {\n // Find the referenced query by matching name and category path\n const targetQuery = this.findQueryByCompositionPath(event.FullPath);\n if (targetQuery) {\n this.expandTreeToQuery(targetQuery);\n this.selectQuery(targetQuery);\n } else {\n // Query not in the current list — could be filtered out or in a different status\n console.warn(`Composition target query not found: \"${event.FullPath}\"`);\n }\n }\n\n /**\n * Find a query by its composition path (e.g., \"Demos/Active Users\").\n * Matches the last segment as query name and preceding segments as category hierarchy.\n */\n private findQueryByCompositionPath(fullPath: string): QueryInfo | null {\n const segments = fullPath.split('/').map(s => s.trim()).filter(s => s.length > 0);\n if (segments.length === 0) return null;\n\n const queryName = segments[segments.length - 1];\n const categorySegments = segments.slice(0, -1);\n\n // First try: exact match on Name + CategoryPath\n let result = this.queries.find(q => {\n if (q.Name !== queryName) return false;\n if (categorySegments.length === 0) return true;\n const expectedPath = '/' + categorySegments.join('/') + '/';\n return q.CategoryPath === expectedPath;\n });\n\n // Fallback: match on Name alone if category path didn't match\n if (!result) {\n result = this.queries.find(q => q.Name === queryName);\n }\n\n return result ?? null;\n }\n\n /**\n * Expand category tree nodes to reveal a specific query.\n */\n private expandTreeToQuery(query: QueryInfo): void {\n const expandInNodes = (nodes: CategoryNode[]): boolean => {\n for (const node of nodes) {\n // Check if this node directly contains the query\n if (node.queries.some(q => UUIDsEqual(q.ID, query.ID))) {\n node.expanded = true;\n return true;\n }\n // Check children recursively\n if (expandInNodes(node.children)) {\n node.expanded = true;\n return true;\n }\n }\n return false;\n };\n\n expandInNodes(this.categoryTree);\n this.cdr.markForCheck();\n }\n\n /** True when the current user has permission to create new queries. */\n public get CanCreateQuery(): boolean {\n const entity = this.metadata.EntityByName('MJ: Queries');\n if (!entity || !this.metadata.CurrentUser) return false;\n return entity.GetUserPermisions(this.metadata.CurrentUser).CanCreate;\n }\n\n /** True when the current user has permission to edit queries. */\n public get CanEditQuery(): boolean {\n const entity = this.metadata.EntityByName('MJ: Queries');\n if (!entity || !this.metadata.CurrentUser) return false;\n return entity.GetUserPermisions(this.metadata.CurrentUser).CanUpdate;\n }\n\n // ========================================\n // Drawer — Open / Close\n // ========================================\n\n /** Close the drawer when Escape is pressed (if open). */\n @HostListener('document:keydown.escape')\n public OnEscapeKey(): void {\n if (this.ShowQueryDrawer) {\n this.CloseDrawer();\n }\n }\n\n /** Open the drawer in create mode. */\n public OpenCreateDrawer(): void {\n this.DrawerMode = 'create';\n this.DrawerQueryId = null;\n this.DrawerName = '';\n this.DrawerSQL = '';\n this.DrawerDescription = '';\n this.DrawerCategoryID = '';\n this.DrawerStatus = 'Pending';\n this.DrawerNameError = false;\n this.DrawerSaveError = null;\n this.captureDrawerSnapshot();\n this.ShowQueryDrawer = true;\n this.cdr.markForCheck();\n setTimeout(() => this.drawerSqlEditor?.setValue(''), 0);\n }\n\n /**\n * Open the drawer in edit mode, pre-populated from a QueryInfo.\n * Stops event propagation so clicking the edit icon doesn't also select the query.\n */\n public OpenEditDrawer(query: QueryInfo, event?: Event): void {\n if (event) event.stopPropagation();\n this.DrawerMode = 'edit';\n this.DrawerQueryId = query.ID;\n this.DrawerName = query.Name ?? '';\n this.DrawerSQL = query.SQL ?? '';\n this.DrawerDescription = query.Description ?? '';\n this.DrawerCategoryID = query.CategoryID ?? '';\n this.DrawerStatus = query.Status ?? 'Pending';\n this.DrawerNameError = false;\n this.DrawerSaveError = null;\n this.captureDrawerSnapshot();\n this.ShowQueryDrawer = true;\n this.cdr.markForCheck();\n setTimeout(() => this.drawerSqlEditor?.setValue(this.DrawerSQL), 0);\n }\n\n /**\n * Close the drawer. If dirty, ask for confirmation unless force=true.\n */\n public CloseDrawer(force = false): void {\n if (!force && this.IsDrawerDirty) {\n if (!confirm('You have unsaved changes. Discard them?')) return;\n }\n this.ShowQueryDrawer = false;\n this.cdr.markForCheck();\n }\n\n /** Close drawer when clicking the backdrop. */\n public OnDrawerBackdropClick(): void {\n this.CloseDrawer();\n }\n\n // ========================================\n // Drawer — Form Helpers\n // ========================================\n\n /** Update DrawerSQL when the code editor emits a change. */\n public OnDrawerSQLChange(value: string): void {\n this.DrawerSQL = value;\n }\n\n private get currentDrawerSnapshot(): string {\n return JSON.stringify({\n name: this.DrawerName,\n sql: this.DrawerSQL,\n description: this.DrawerDescription,\n categoryID: this.DrawerCategoryID,\n status: this.DrawerStatus,\n });\n }\n\n private captureDrawerSnapshot(): void {\n this.initialDrawerSnapshot = this.currentDrawerSnapshot;\n }\n\n public get IsDrawerDirty(): boolean {\n return this.currentDrawerSnapshot !== this.initialDrawerSnapshot;\n }\n\n // ========================================\n // Drawer — Save\n // ========================================\n\n /** Save the drawer form (create or edit). */\n public async SaveDrawer(): Promise<void> {\n this.DrawerNameError = !this.DrawerName.trim();\n this.DrawerSaveError = null;\n if (this.DrawerNameError) {\n this.cdr.markForCheck();\n return;\n }\n\n this.IsSavingDrawer = true;\n this.cdr.markForCheck();\n\n try {\n const entity = await this.metadata.GetEntityObject<MJQueryEntity>('MJ: Queries');\n\n if (this.DrawerMode === 'edit' && this.DrawerQueryId) {\n const loaded = await entity.Load(this.DrawerQueryId);\n if (!loaded) {\n this.DrawerSaveError = 'Could not load query record. Please refresh and try again.';\n return;\n }\n }\n\n entity.Name = this.DrawerName.trim();\n entity.SQL = this.DrawerSQL;\n entity.Description = this.DrawerDescription;\n entity.CategoryID = this.DrawerCategoryID || null;\n entity.Status = this.DrawerStatus;\n\n const saved = await entity.Save();\n if (saved) {\n const savedId = entity.ID;\n this.ShowQueryDrawer = false;\n await this.loadData(true);\n const refreshed = this.queries.find(q => UUIDsEqual(q.ID, savedId));\n if (refreshed) {\n this.selectedQuery = refreshed;\n this.expandCategoryForQuery(refreshed);\n this.updateUrl();\n }\n } else {\n this.DrawerSaveError = 'Save failed. Please check your inputs and try again.';\n }\n } catch (e) {\n console.error('Error saving query:', e);\n this.DrawerSaveError = 'An unexpected error occurred while saving.';\n } finally {\n this.IsSavingDrawer = false;\n this.cdr.markForCheck();\n }\n }\n\n // ========================================\n // Drawer — Open Full Record\n // ========================================\n\n /** Open the full entity form in a new tab (for sub-entity management). */\n public OpenFullRecord(): void {\n if (!this.DrawerQueryId) return;\n this.navigationService.OpenEntityRecord(\n 'MJ: Queries',\n CompositeKey.FromID(this.DrawerQueryId)\n );\n this.CloseDrawer(true);\n }\n\n // ========================================\n // Utilities\n // ========================================\n\n public getTotalQueryCount(): number {\n return this.queries.length;\n }\n\n public getNodeQueryCount(node: CategoryNode): number {\n let count = node.queries.length;\n for (const child of node.children) {\n count += this.getNodeQueryCount(child);\n }\n return count;\n }\n\n public refresh(): void {\n this.selectedQuery = null;\n this.loadData(true);\n }\n\n public trackByCategory(index: number, node: CategoryNode): string {\n return node.category.ID;\n }\n\n public trackByQuery(index: number, query: QueryInfo): string {\n return query.ID;\n }\n\n // ========================================\n // Deep Linking\n // ========================================\n\n /**\n * Parse URL query string for query state.\n * Query params: queryId\n */\n private parseUrlState(): { queryId?: string } | null {\n return this.parseUrlFromString(this.router.url);\n }\n\n /**\n * Update URL query string to reflect current state.\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateUrl(): void {\n if (this.skipUrlUpdate) return;\n\n const queryParams: Record<string, string | null> = {};\n\n // Add query ID if selected, null to remove\n if (this.selectedQuery?.ID) {\n queryParams['queryId'] = this.selectedQuery.ID;\n } else {\n queryParams['queryId'] = null;\n }\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n /**\n * Handle external navigation (back/forward buttons).\n * Parses the URL and applies the state without triggering a new navigation.\n */\n private onExternalNavigation(url: string): void {\n // Check if this URL is for our component (contains our base path)\n const currentPath = this.router.url.split('?')[0];\n const newPath = url.split('?')[0];\n\n // Only handle if we're still on the same base path (same component instance)\n if (currentPath !== newPath) {\n return; // Different route entirely, shell will handle it\n }\n\n // Parse the new URL state\n const urlState = this.parseUrlFromString(url);\n\n // Apply the state without triggering URL updates\n this.skipUrlUpdate = true;\n if (urlState?.queryId) {\n const query = this.queries.find(q => UUIDsEqual(q.ID, urlState.queryId));\n if (query) {\n if (!UUIDsEqual(this.selectedQuery?.ID, query.ID)) {\n this.selectedQuery = query;\n this.expandCategoryForQuery(query);\n }\n }\n } else {\n // No queryId means clear selection\n this.selectedQuery = null;\n }\n this.skipUrlUpdate = false;\n\n // Update the tracked URL\n this.lastNavigatedUrl = url;\n\n this.cdr.markForCheck();\n }\n\n /**\n * Parse URL state from a URL string (used for external navigation).\n */\n private parseUrlFromString(url: string): { queryId?: string } | null {\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) return null;\n\n const queryString = url.substring(queryIndex + 1);\n const params = new URLSearchParams(queryString);\n const queryId = params.get('queryId');\n\n if (!queryId) return null;\n\n return { queryId };\n }\n\n /**\n * Expands the category tree to show the given query\n */\n private expandCategoryForQuery(query: QueryInfo): void {\n if (!query.CategoryID) return;\n\n const expandToTarget = (nodes: CategoryNode[], targetCategoryId: string): boolean => {\n for (const node of nodes) {\n if (UUIDsEqual(node.category.ID, targetCategoryId)) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n return true;\n }\n if (expandToTarget(node.children, targetCategoryId)) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n return true;\n }\n }\n return false;\n };\n\n if (expandToTarget(this.categoryTree, query.CategoryID)) {\n this.saveExpandedState();\n }\n }\n\n // ========================================\n // Panel Resize\n // ========================================\n\n /**\n * Load saved panel width from user settings\n */\n private loadSavedPanelWidth(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.SETTINGS_KEY);\n if (saved) {\n const width = parseInt(saved, 10);\n if (!isNaN(width) && width >= QueryBrowserResourceComponent.MIN_PANEL_WIDTH && width <= QueryBrowserResourceComponent.MAX_PANEL_WIDTH) {\n this.PanelWidth = width;\n }\n }\n }\n\n /**\n * Start resizing the left panel via drag handle\n */\n public onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n this.cdr.markForCheck();\n\n // Run outside Angular zone for performance during mousemove\n this.zone.runOutsideAngular(() => {\n document.addEventListener('mousemove', this.boundOnResizeMove);\n document.addEventListener('mouseup', this.boundOnResizeEnd);\n });\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n const containerRect = this.elementRef.nativeElement.querySelector('.query-browser-container')?.getBoundingClientRect();\n if (!containerRect) return;\n\n const newWidth = event.clientX - containerRect.left;\n const clamped = Math.max(\n QueryBrowserResourceComponent.MIN_PANEL_WIDTH,\n Math.min(QueryBrowserResourceComponent.MAX_PANEL_WIDTH, newWidth)\n );\n\n this.PanelWidth = clamped;\n this.zone.run(() => this.cdr.markForCheck());\n }\n\n private onResizeEnd(): void {\n if (!this.IsResizing) return;\n this.IsResizing = false;\n\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n\n // Persist width with debouncing\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.SETTINGS_KEY,\n this.PanelWidth.toString()\n );\n\n this.zone.run(() => this.cdr.markForCheck());\n }\n\n /** Case-insensitive UUID check whether a query is the currently selected query. */\n public IsQuerySelected(query: QueryInfo): boolean {\n return UUIDsEqual(this.selectedQuery?.ID, query.ID);\n }\n}\n","<!-- Query Browser Resource -->\n<div class=\"query-browser-container\" [class.resizing]=\"IsResizing\">\n <!-- Left Panel: Query Tree -->\n <div class=\"query-tree-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Header -->\n <div class=\"tree-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-database\"></i>\n <span>Queries</span>\n <span class=\"query-count\">({{ getTotalQueryCount() }})</span>\n </div>\n <div class=\"header-actions\">\n @if (CanCreateQuery) {\n <button class=\"icon-btn\" (click)=\"OpenCreateDrawer()\" title=\"New Query\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n <button class=\"icon-btn\" (click)=\"expandAll()\" title=\"Expand all\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"collapseAll()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-folder\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"tree-search\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n [value]=\"searchText\"\n placeholder=\"Search queries...\"\n (input)=\"onSearchChange($any($event.target).value)\">\n @if (searchText) {\n <button class=\"clear-btn\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Status Filters -->\n <div class=\"status-filter-bar\">\n @for (status of AllStatuses; track status) {\n @if (getStatusCount(status) > 0) {\n <button class=\"status-filter-chip\"\n [class.active]=\"StatusFilters[status]\"\n [style.--chip-color]=\"getStatusColor(status)\"\n (click)=\"toggleStatusFilter(status)\"\n [title]=\"(StatusFilters[status] ? 'Hide' : 'Show') + ' ' + status + ' queries'\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(status)\"></i>\n <span>{{ status }}</span>\n <span class=\"chip-count\">{{ getStatusCount(status) }}</span>\n </button>\n }\n }\n </div>\n\n <!-- Tree Content -->\n <div class=\"tree-content\">\n <!-- Loading -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading queries...\"></mj-loading>\n </div>\n }\n\n <!-- Empty -->\n @if (!isLoading && queries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database empty-icon\"></i>\n <p>No queries available</p>\n </div>\n }\n\n <!-- No results -->\n @if (!isLoading && searchText && filteredQueries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>No queries match \"{{ searchText }}\"</p>\n </div>\n }\n\n <!-- Category Tree -->\n @if (!isLoading && queries.length > 0) {\n <div class=\"category-tree\">\n @for (node of categoryTree; track trackByCategory($index, node)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: node }\"></ng-container>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Resize Handle -->\n <div class=\"resize-handle\"\n [class.active]=\"IsResizing\"\n (mousedown)=\"onResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- Right Panel: Query Viewer -->\n <div class=\"query-viewer-panel\">\n <!-- No query selected -->\n @if (!selectedQuery) {\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-hand-pointer no-selection-icon\"></i>\n <p class=\"no-selection-message\">Select a query from the list</p>\n <p class=\"no-selection-hint\">Click on a query to view and run it</p>\n @if (CanCreateQuery) {\n <button class=\"no-selection-create-btn\" (click)=\"OpenCreateDrawer()\">\n <i class=\"fa-solid fa-plus\"></i> New Query\n </button>\n }\n </div>\n }\n\n <!-- Query Viewer -->\n @if (selectedQuery) {\n <!-- Query Header with Status -->\n <div class=\"query-viewer-header\">\n <div class=\"query-viewer-title\">\n <i class=\"fa-solid fa-file-code\"></i>\n <span>{{ selectedQuery.Name }}</span>\n </div>\n <div class=\"query-viewer-header-actions\">\n @if (selectedQuery.Status !== 'Approved') {\n <span class=\"query-viewer-status-pill\"\n [style.background]=\"getStatusColor(selectedQuery.Status)\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(selectedQuery.Status)\"></i>\n {{ selectedQuery.Status }}\n </span>\n } @else {\n <span class=\"query-viewer-status-pill approved\"\n [style.background]=\"getStatusColor('Approved')\">\n <i class=\"fa-solid fa-check-circle\"></i>\n Approved\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"icon-btn\" (click)=\"OpenEditDrawer(selectedQuery)\" title=\"Edit Query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n </div>\n <mj-query-viewer\n [QueryId]=\"selectedQuery.ID\"\n [AutoRun]=\"true\"\n [SelectionMode]=\"'multiple'\"\n (EntityLinkClick)=\"onEntityLinkClick($event)\"\n (RowDoubleClick)=\"onRowDoubleClick($event)\"\n (OpenQueryRecord)=\"onOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"onCompositionTokenClick($event)\">\n </mj-query-viewer>\n }\n </div>\n</div>\n\n<!-- Category Node Template -->\n<ng-template #categoryNode let-node=\"node\">\n @if (hasVisibleContent(node)) {\n <div class=\"category-item\"\n [class.expanded]=\"node.expanded\"\n [style.padding-left.px]=\"node.level * 16 + 8\">\n <div class=\"category-header\" (click)=\"toggleExpand(node)\">\n <i class=\"fa-solid expand-icon\"\n [class.fa-chevron-down]=\"node.expanded\"\n [class.fa-chevron-right]=\"!node.expanded\"></i>\n <i class=\"fa-solid fa-folder category-icon\"\n [class.fa-folder-open]=\"node.expanded\"></i>\n <span class=\"category-name\">{{ node.category.Name }}</span>\n <span class=\"category-count\">({{ getNodeQueryCount(node) }})</span>\n </div>\n <!-- Queries in this category -->\n @if (node.expanded) {\n <div class=\"category-queries\">\n @for (query of node.queries; track trackByQuery($index, query)) {\n <div class=\"query-item\"\n [class.selected]=\"IsQuerySelected(query)\"\n [class.hidden]=\"!isQueryVisible(query)\"\n (click)=\"selectQuery(query, $event)\">\n <span class=\"status-dot\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\"></span>\n <i class=\"fa-solid fa-file-code query-icon\"></i>\n <div class=\"query-info\" [title]=\"query.Description || query.Name\">\n <span class=\"query-name\">{{ query.Name }}</span>\n @if (query.Description) {\n <span class=\"query-description\">{{ query.Description }}</span>\n }\n </div>\n @if (query.UsesTemplate) {\n <i class=\"fa-solid fa-sliders param-icon\" title=\"Has parameters\"></i>\n }\n @if (query.Status !== 'Approved') {\n <span class=\"query-status-badge\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\">\n {{ query.Status }}\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"query-details-btn\" (click)=\"OpenEditDrawer(query, $event)\" title=\"Edit query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n <!-- Child categories -->\n @if (node.expanded) {\n @for (child of node.children; track trackByCategory($index, child)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n\n<!-- Query Drawer Backdrop -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer-backdrop\" (click)=\"OnDrawerBackdropClick()\"></div>\n}\n\n<!-- Query Drawer Panel -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer\">\n\n <!-- Drawer Header -->\n <div class=\"query-drawer-header\">\n <div class=\"query-drawer-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"DrawerMode === 'create'\" [class.fa-pen-to-square]=\"DrawerMode === 'edit'\"></i>\n <div>\n <div class=\"query-drawer-title-main\">{{ DrawerMode === 'create' ? 'New Query' : 'Edit Query' }}</div>\n @if (DrawerMode === 'edit' && DrawerName) {\n <div class=\"query-drawer-title-sub\">{{ DrawerName }}</div>\n }\n </div>\n </div>\n <button class=\"query-drawer-close\" (click)=\"CloseDrawer()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Drawer Body -->\n <div class=\"query-drawer-body\">\n\n <!-- Name -->\n <div class=\"drawer-field\" [class.drawer-field-error]=\"DrawerNameError\">\n <label class=\"drawer-label\">Name <span class=\"drawer-required\">*</span></label>\n <input class=\"drawer-input\"\n type=\"text\"\n [(ngModel)]=\"DrawerName\"\n (ngModelChange)=\"DrawerNameError = false\"\n placeholder=\"Enter query name\"\n [disabled]=\"IsSavingDrawer\">\n @if (DrawerNameError) {\n <span class=\"drawer-field-hint\">Name is required</span>\n }\n </div>\n\n <!-- Category + Status (side by side) -->\n <div class=\"drawer-row\">\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Category</label>\n <select class=\"drawer-select\"\n [(ngModel)]=\"DrawerCategoryID\"\n [disabled]=\"IsSavingDrawer\">\n <option value=\"\">(none)</option>\n @for (cat of categories; track cat.ID) {\n <option [value]=\"cat.ID\">{{ cat.Name }}</option>\n }\n </select>\n </div>\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Status</label>\n <select class=\"drawer-select\"\n [(ngModel)]=\"DrawerStatus\"\n [disabled]=\"IsSavingDrawer\">\n @for (s of DrawerStatuses; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"drawer-field\">\n <label class=\"drawer-label\">Description</label>\n <textarea class=\"drawer-textarea\"\n rows=\"3\"\n [(ngModel)]=\"DrawerDescription\"\n placeholder=\"Optional description\"\n [disabled]=\"IsSavingDrawer\"></textarea>\n </div>\n\n <!-- SQL -->\n <div class=\"drawer-field drawer-field-sql\">\n <label class=\"drawer-label\">SQL</label>\n <mj-code-editor #drawerSqlEditor\n [language]=\"'sql'\"\n [indentWithTab]=\"true\"\n [readonly]=\"IsSavingDrawer\"\n (change)=\"OnDrawerSQLChange($event)\"\n class=\"drawer-sql-editor\">\n </mj-code-editor>\n </div>\n\n <!-- Open Full Record link (edit mode only) -->\n @if (DrawerMode === 'edit' && DrawerQueryId) {\n <div class=\"drawer-full-record\">\n <i class=\"fa-solid fa-circle-info\"></i>\n To manage Parameters, Fields, and Permissions —\n <button class=\"drawer-link-btn\" (click)=\"OpenFullRecord()\">\n Open full record <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n }\n\n </div>\n\n <!-- Drawer Footer -->\n <div class=\"query-drawer-footer\">\n\n <!-- Error message -->\n @if (DrawerSaveError) {\n <div class=\"drawer-error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> {{ DrawerSaveError }}\n </div>\n }\n\n <!-- Action buttons -->\n <div class=\"drawer-footer-actions\">\n <button class=\"drawer-btn drawer-btn-primary\"\n (click)=\"SaveDrawer()\"\n [disabled]=\"IsSavingDrawer || !DrawerName.trim()\">\n @if (IsSavingDrawer) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n <button class=\"drawer-btn drawer-btn-secondary\"\n (click)=\"CloseDrawer()\"\n [disabled]=\"IsSavingDrawer\">\n Cancel\n </button>\n </div>\n\n </div>\n\n </div>\n}\n"]}
1
+ {"version":3,"file":"query-browser-resource.component.js","sourceRoot":"","sources":["../../src/QueryBrowser/query-browser-resource.component.ts","../../src/QueryBrowser/query-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ElementRef, NgZone, HostListener, ViewChild } from '@angular/core';\nimport { CodeEditorComponent } from '@memberjunction/ng-code-editor';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { Metadata, QueryInfo, QueryCategoryInfo, CompositeKey } from '@memberjunction/core';\nimport { ResourceData, UserInfoEngine, MJQueryEntity } from '@memberjunction/core-entities';\nimport {\n QueryEntityLinkClickEvent,\n QueryRowClickEvent\n} from '@memberjunction/ng-query-viewer';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\n/**\n * Tree node for the query category hierarchy\n */\ninterface CategoryNode {\n category: QueryCategoryInfo;\n children: CategoryNode[];\n queries: QueryInfo[];\n expanded: boolean;\n level: number;\n}\n\n/**\n * A resource component for browsing and executing stored queries.\n * Features:\n * - Hierarchical category navigation\n * - Query search\n * - Query viewer with parameter input\n * - Entity linking for clickable record IDs\n */\n@RegisterClass(BaseResourceComponent, 'QueryBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-query-browser-resource',\n templateUrl: './query-browser-resource.component.html',\n styleUrls: ['./query-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private static readonly SETTINGS_KEY = 'QueryBrowser/panelWidth';\n private static readonly STATUS_FILTERS_KEY = 'QueryBrowser/statusFilters';\n private static readonly EXPANDED_STATE_KEY = 'QueryBrowser/expandedCategories';\n private static readonly DEFAULT_PANEL_WIDTH = 320;\n private static readonly MIN_PANEL_WIDTH = 200;\n private static readonly MAX_PANEL_WIDTH = 600;\n\n public isLoading = true;\n public categories: QueryCategoryInfo[] = [];\n public categoryTree: CategoryNode[] = [];\n /** All queries the user has permission to run */\n public queries: QueryInfo[] = [];\n public filteredQueries: QueryInfo[] = [];\n private filteredQueryIds = new Set<string>();\n public selectedQuery: QueryInfo | null = null;\n public searchText = '';\n public PanelWidth = QueryBrowserResourceComponent.DEFAULT_PANEL_WIDTH;\n public IsResizing = false;\n\n /** Status filter toggles — which statuses to show in the tree */\n public StatusFilters: Record<string, boolean> = {\n 'Approved': true,\n 'Pending': true,\n 'Rejected': false,\n 'Expired': false\n };\n\n /** Ordered list of all possible statuses for the filter bar */\n public readonly AllStatuses: string[] = ['Approved', 'Pending', 'Rejected', 'Expired'];\n\n /** Tracks expanded state by category ID — persisted across sessions */\n private expandedState = new Map<string, boolean>();\n\n private metadata = new Metadata();\n private destroy$ = new Subject<void>();\n private dataLoaded = false;\n private skipUrlUpdate = true; // Skip URL updates during initialization\n private lastNavigatedUrl = ''; // Track URL to avoid reacting to our own navigation\n\n // Bound event handlers for resize (need references for removeEventListener)\n private boundOnResizeMove = this.onResizeMove.bind(this);\n private boundOnResizeEnd = this.onResizeEnd.bind(this);\n\n // ========================================\n // Drawer State (Create / Edit)\n // ========================================\n\n public ShowQueryDrawer = false;\n public DrawerMode: 'create' | 'edit' = 'create';\n public DrawerQueryId: string | null = null;\n public DrawerName = '';\n public DrawerSQL = '';\n @ViewChild('drawerSqlEditor') private drawerSqlEditor: CodeEditorComponent | null = null;\n public DrawerDescription = '';\n public DrawerCategoryID = '';\n public DrawerStatus: 'Pending' | 'Approved' | 'Rejected' | 'Expired' = 'Pending';\n public IsSavingDrawer = false;\n public DrawerNameError = false;\n public DrawerSaveError: string | null = null;\n\n /** Ordered status options for the drawer dropdown — all valid Query statuses */\n public readonly DrawerStatuses: Array<'Pending' | 'Approved' | 'Rejected' | 'Expired'> =\n ['Pending', 'Approved', 'Rejected', 'Expired'];\n\n private initialDrawerSnapshot = '';\n\n constructor(\n private cdr: ChangeDetectorRef,\n private navigationService: NavigationService,\n private router: Router,\n private elementRef: ElementRef,\n private zone: NgZone\n ) {\n super();\n }\n\n ngOnInit(): void {\n this.loadSavedPanelWidth();\n this.loadSavedStatusFilters();\n this.loadSavedExpandedState();\n this.loadData();\n\n // Subscribe to router NavigationEnd events for back/forward button support\n this.router.events\n .pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntil(this.destroy$)\n )\n .subscribe(event => {\n const currentUrl = event.urlAfterRedirects || event.url;\n if (currentUrl !== this.lastNavigatedUrl && this.dataLoaded) {\n this.onExternalNavigation(currentUrl);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n // Ensure any pending debounced settings are flushed\n UserInfoEngine.Instance.FlushPendingSettings();\n // Remove resize listeners if active\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Queries';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-database';\n }\n\n // ========================================\n // Data Loading\n // ========================================\n\n private async loadData(forceRefresh = false): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n // Force re-fetch from server when explicitly refreshing\n if (forceRefresh) {\n await this.metadata.Refresh();\n }\n\n // Load all queries the user has permission to run (regardless of status)\n this.categories = this.metadata.QueryCategories || [];\n this.queries = (this.metadata.Queries || []).filter(q =>\n q.UserCanRun(this.metadata.CurrentUser)\n );\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Mark data as loaded and apply any query params for deep linking\n this.dataLoaded = true;\n\n // Parse initial URL state\n const urlState = this.parseUrlState();\n if (urlState?.queryId) {\n const query = this.queries.find(q => UUIDsEqual(q.ID, urlState.queryId));\n if (query) {\n this.selectedQuery = query;\n this.expandCategoryForQuery(query);\n }\n }\n\n // Enable URL updates after initialization\n this.skipUrlUpdate = false;\n\n } catch (error) {\n console.error('Error loading queries:', error);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private buildCategoryTree(): void {\n const categoryMap = new Map<string, CategoryNode>();\n\n // Use filtered queries (status + search filters applied)\n const visibleQueries = this.filteredQueries;\n\n // Create nodes for all categories, restoring expanded state\n for (const category of this.categories) {\n const queriesInCategory = visibleQueries.filter(q => UUIDsEqual(q.CategoryID, category.ID));\n categoryMap.set(category.ID, {\n category,\n children: [],\n queries: queriesInCategory,\n expanded: this.expandedState.get(category.ID) ?? false,\n level: 0\n });\n }\n\n // Build tree structure\n const roots: CategoryNode[] = [];\n for (const category of this.categories) {\n const node = categoryMap.get(category.ID)!;\n if (category.ParentID) {\n const parent = categoryMap.get(category.ParentID);\n if (parent) {\n node.level = parent.level + 1;\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n // Add uncategorized queries to a virtual root\n const uncategorizedQueries = visibleQueries.filter(q => !q.CategoryID);\n if (uncategorizedQueries.length > 0) {\n const uncategorizedCategory = new QueryCategoryInfo({\n ID: '__uncategorized__',\n Name: 'Uncategorized',\n Description: 'Queries without a category'\n });\n roots.push({\n category: uncategorizedCategory,\n children: [],\n queries: uncategorizedQueries,\n expanded: this.expandedState.get('__uncategorized__') ?? false,\n level: 0\n });\n }\n\n // Sort children recursively\n const sortNodes = (nodes: CategoryNode[]): void => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n for (const node of nodes) {\n node.queries.sort((a, b) => a.Name.localeCompare(b.Name));\n sortNodes(node.children);\n }\n };\n sortNodes(roots);\n\n this.categoryTree = roots;\n }\n\n // ========================================\n // Search\n // ========================================\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n this.buildCategoryTree();\n\n // Expand all categories when searching so results are visible\n if (value) {\n this.expandAll();\n }\n\n this.cdr.markForCheck();\n }\n\n public clearSearch(): void {\n this.searchText = '';\n this.applyFilters();\n this.buildCategoryTree();\n this.cdr.markForCheck();\n }\n\n // ========================================\n // Status Filters\n // ========================================\n\n /** Toggle a status filter on/off and rebuild the tree */\n public toggleStatusFilter(status: string): void {\n this.StatusFilters[status] = !this.StatusFilters[status];\n this.applyFilters();\n this.buildCategoryTree();\n this.saveStatusFilters();\n this.cdr.markForCheck();\n }\n\n /** Get the count of queries with a given status */\n public getStatusCount(status: string): number {\n return this.queries.filter(q => q.Status === status).length;\n }\n\n /** Get the CSS color for a query status */\n public getStatusColor(status: string): string {\n switch (status) {\n case 'Approved': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Rejected': return 'var(--mj-status-error)';\n case 'Expired': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n /** Get the Font Awesome icon for a query status */\n public getStatusIcon(status: string): string {\n switch (status) {\n case 'Approved': return 'fa-check-circle';\n case 'Pending': return 'fa-clock';\n case 'Rejected': return 'fa-times-circle';\n case 'Expired': return 'fa-archive';\n default: return 'fa-question-circle';\n }\n }\n\n /** Apply both status and search filters to produce filteredQueries */\n private applyFilters(): void {\n // First filter by status\n let result = this.queries.filter(q => this.StatusFilters[q.Status] === true);\n\n // Then filter by search text\n if (this.searchText.trim()) {\n const searchLower = this.searchText.toLowerCase();\n result = result.filter(q =>\n q.Name.toLowerCase().includes(searchLower) ||\n q.Description?.toLowerCase().includes(searchLower) ||\n q.Category?.toLowerCase().includes(searchLower)\n );\n }\n\n this.filteredQueries = result;\n this.filteredQueryIds = new Set(result.map(q => q.ID.toLowerCase()));\n }\n\n /** Load saved status filter preferences */\n private loadSavedStatusFilters(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.STATUS_FILTERS_KEY);\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n // Merge saved values onto defaults (preserves any new statuses added later)\n for (const key of Object.keys(this.StatusFilters)) {\n if (typeof parsed[key] === 'boolean') {\n this.StatusFilters[key] = parsed[key];\n }\n }\n } catch {\n // Ignore invalid JSON, keep defaults\n }\n }\n }\n\n /** Save status filter preferences with debouncing */\n private saveStatusFilters(): void {\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.STATUS_FILTERS_KEY,\n JSON.stringify(this.StatusFilters)\n );\n }\n\n /** Load saved expanded/collapsed state for category nodes */\n private loadSavedExpandedState(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.EXPANDED_STATE_KEY);\n if (saved) {\n try {\n const parsed: Record<string, boolean> = JSON.parse(saved);\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'boolean') {\n this.expandedState.set(key, value);\n }\n }\n } catch {\n // Ignore invalid JSON, start fresh\n }\n }\n }\n\n /** Save expanded/collapsed state with debouncing */\n private saveExpandedState(): void {\n const obj: Record<string, boolean> = {};\n for (const [key, value] of this.expandedState.entries()) {\n obj[key] = value;\n }\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.EXPANDED_STATE_KEY,\n JSON.stringify(obj)\n );\n }\n\n // ========================================\n // Tree Navigation\n // ========================================\n\n public toggleExpand(node: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n node.expanded = !node.expanded;\n this.expandedState.set(node.category.ID, node.expanded);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public expandAll(): void {\n const expand = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n expand(node.children);\n }\n };\n expand(this.categoryTree);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public collapseAll(): void {\n const collapse = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = false;\n this.expandedState.set(node.category.ID, false);\n collapse(node.children);\n }\n };\n collapse(this.categoryTree);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public selectQuery(query: QueryInfo, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n this.selectedQuery = query;\n this.updateUrl();\n this.cdr.markForCheck();\n }\n\n public isQueryVisible(query: QueryInfo): boolean {\n if (!this.searchText) return true;\n return this.filteredQueryIds.has(query.ID.toLowerCase());\n }\n\n public hasVisibleContent(node: CategoryNode): boolean {\n if (!this.searchText) return true;\n\n // Check if any queries in this category match\n if (node.queries.some(q => this.isQueryVisible(q))) {\n return true;\n }\n\n // Check if any child categories have visible content\n return node.children.some(child => this.hasVisibleContent(child));\n }\n\n // ========================================\n // Query Viewer Events\n // ========================================\n\n public onEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n // Look up the entity's actual primary key field name from metadata\n const entity = this.metadata.Entities.find(e => e.Name === event.entityName);\n const pkField = entity?.FirstPrimaryKey;\n const pkFieldName = pkField?.Name || 'ID';\n\n const compositeKey = new CompositeKey([{ FieldName: pkFieldName, Value: event.recordId }]);\n this.navigationService.OpenEntityRecord(event.entityName, compositeKey);\n }\n\n public onRowDoubleClick(event: QueryRowClickEvent): void {\n // Could show record details or other action\n }\n\n public onOpenQueryRecord(event: { queryId: string; queryName: string }): void {\n // Open the Query entity record using navigation service\n const compositeKey = CompositeKey.FromID(event.queryId);\n this.navigationService.OpenEntityRecord('MJ: Queries', compositeKey);\n }\n\n public onCompositionTokenClick(event: CompositionTokenClickEvent): void {\n // Find the referenced query by matching name and category path\n const targetQuery = this.findQueryByCompositionPath(event.FullPath);\n if (targetQuery) {\n this.expandTreeToQuery(targetQuery);\n this.selectQuery(targetQuery);\n } else {\n // Query not in the current list — could be filtered out or in a different status\n console.warn(`Composition target query not found: \"${event.FullPath}\"`);\n }\n }\n\n /**\n * Find a query by its composition path (e.g., \"Demos/Active Users\").\n * Matches the last segment as query name and preceding segments as category hierarchy.\n */\n private findQueryByCompositionPath(fullPath: string): QueryInfo | null {\n const segments = fullPath.split('/').map(s => s.trim()).filter(s => s.length > 0);\n if (segments.length === 0) return null;\n\n const queryName = segments[segments.length - 1];\n const categorySegments = segments.slice(0, -1);\n\n // First try: exact match on Name + CategoryPath\n let result = this.queries.find(q => {\n if (q.Name !== queryName) return false;\n if (categorySegments.length === 0) return true;\n const expectedPath = '/' + categorySegments.join('/') + '/';\n return q.CategoryPath === expectedPath;\n });\n\n // Fallback: match on Name alone if category path didn't match\n if (!result) {\n result = this.queries.find(q => q.Name === queryName);\n }\n\n return result ?? null;\n }\n\n /**\n * Expand category tree nodes to reveal a specific query.\n */\n private expandTreeToQuery(query: QueryInfo): void {\n const expandInNodes = (nodes: CategoryNode[]): boolean => {\n for (const node of nodes) {\n // Check if this node directly contains the query\n if (node.queries.some(q => UUIDsEqual(q.ID, query.ID))) {\n node.expanded = true;\n return true;\n }\n // Check children recursively\n if (expandInNodes(node.children)) {\n node.expanded = true;\n return true;\n }\n }\n return false;\n };\n\n expandInNodes(this.categoryTree);\n this.cdr.markForCheck();\n }\n\n /** True when the current user has permission to create new queries. */\n public get CanCreateQuery(): boolean {\n const entity = this.metadata.EntityByName('MJ: Queries');\n if (!entity || !this.metadata.CurrentUser) return false;\n return entity.GetUserPermisions(this.metadata.CurrentUser).CanCreate;\n }\n\n /** True when the current user has permission to edit queries. */\n public get CanEditQuery(): boolean {\n const entity = this.metadata.EntityByName('MJ: Queries');\n if (!entity || !this.metadata.CurrentUser) return false;\n return entity.GetUserPermisions(this.metadata.CurrentUser).CanUpdate;\n }\n\n // ========================================\n // Drawer — Open / Close\n // ========================================\n\n /** Close the drawer when Escape is pressed (if open). */\n @HostListener('document:keydown.escape')\n public OnEscapeKey(): void {\n if (this.ShowQueryDrawer) {\n this.CloseDrawer();\n }\n }\n\n /** Open the drawer in create mode. */\n public OpenCreateDrawer(): void {\n this.DrawerMode = 'create';\n this.DrawerQueryId = null;\n this.DrawerName = '';\n this.DrawerSQL = '';\n this.DrawerDescription = '';\n this.DrawerCategoryID = '';\n this.DrawerStatus = 'Pending';\n this.DrawerNameError = false;\n this.DrawerSaveError = null;\n this.captureDrawerSnapshot();\n this.ShowQueryDrawer = true;\n this.cdr.markForCheck();\n setTimeout(() => this.drawerSqlEditor?.setValue(''), 0);\n }\n\n /**\n * Open the drawer in edit mode, pre-populated from a QueryInfo.\n * Stops event propagation so clicking the edit icon doesn't also select the query.\n */\n public OpenEditDrawer(query: QueryInfo, event?: Event): void {\n if (event) event.stopPropagation();\n this.DrawerMode = 'edit';\n this.DrawerQueryId = query.ID;\n this.DrawerName = query.Name ?? '';\n this.DrawerSQL = query.SQL ?? '';\n this.DrawerDescription = query.Description ?? '';\n this.DrawerCategoryID = query.CategoryID ?? '';\n this.DrawerStatus = query.Status ?? 'Pending';\n this.DrawerNameError = false;\n this.DrawerSaveError = null;\n this.captureDrawerSnapshot();\n this.ShowQueryDrawer = true;\n this.cdr.markForCheck();\n setTimeout(() => this.drawerSqlEditor?.setValue(this.DrawerSQL), 0);\n }\n\n /**\n * Close the drawer. If dirty, ask for confirmation unless force=true.\n */\n public CloseDrawer(force = false): void {\n if (!force && this.IsDrawerDirty) {\n if (!confirm('You have unsaved changes. Discard them?')) return;\n }\n this.ShowQueryDrawer = false;\n this.cdr.markForCheck();\n }\n\n /** Close drawer when clicking the backdrop. */\n public OnDrawerBackdropClick(): void {\n this.CloseDrawer();\n }\n\n // ========================================\n // Drawer — Form Helpers\n // ========================================\n\n /** Update DrawerSQL when the code editor emits a change. */\n public OnDrawerSQLChange(value: string): void {\n this.DrawerSQL = value;\n }\n\n private get currentDrawerSnapshot(): string {\n return JSON.stringify({\n name: this.DrawerName,\n sql: this.DrawerSQL,\n description: this.DrawerDescription,\n categoryID: this.DrawerCategoryID,\n status: this.DrawerStatus,\n });\n }\n\n private captureDrawerSnapshot(): void {\n this.initialDrawerSnapshot = this.currentDrawerSnapshot;\n }\n\n public get IsDrawerDirty(): boolean {\n return this.currentDrawerSnapshot !== this.initialDrawerSnapshot;\n }\n\n // ========================================\n // Drawer — Save\n // ========================================\n\n /** Save the drawer form (create or edit). */\n public async SaveDrawer(): Promise<void> {\n this.DrawerNameError = !this.DrawerName.trim();\n this.DrawerSaveError = null;\n if (this.DrawerNameError) {\n this.cdr.markForCheck();\n return;\n }\n\n this.IsSavingDrawer = true;\n this.cdr.markForCheck();\n\n try {\n const entity = await this.metadata.GetEntityObject<MJQueryEntity>('MJ: Queries');\n\n if (this.DrawerMode === 'edit' && this.DrawerQueryId) {\n const loaded = await entity.Load(this.DrawerQueryId);\n if (!loaded) {\n this.DrawerSaveError = 'Could not load query record. Please refresh and try again.';\n return;\n }\n }\n\n entity.Name = this.DrawerName.trim();\n entity.SQL = this.DrawerSQL;\n entity.Description = this.DrawerDescription;\n entity.CategoryID = this.DrawerCategoryID || null;\n entity.Status = this.DrawerStatus;\n\n const saved = await entity.Save();\n if (saved) {\n const savedId = entity.ID;\n this.ShowQueryDrawer = false;\n await this.loadData(true);\n const refreshed = this.queries.find(q => UUIDsEqual(q.ID, savedId));\n if (refreshed) {\n this.selectedQuery = refreshed;\n this.expandCategoryForQuery(refreshed);\n this.updateUrl();\n }\n } else {\n this.DrawerSaveError = 'Save failed. Please check your inputs and try again.';\n }\n } catch (e) {\n console.error('Error saving query:', e);\n this.DrawerSaveError = 'An unexpected error occurred while saving.';\n } finally {\n this.IsSavingDrawer = false;\n this.cdr.markForCheck();\n }\n }\n\n // ========================================\n // Drawer — Open Full Record\n // ========================================\n\n /** Open the full entity form in a new tab (for sub-entity management). */\n public OpenFullRecord(): void {\n if (!this.DrawerQueryId) return;\n this.navigationService.OpenEntityRecord(\n 'MJ: Queries',\n CompositeKey.FromID(this.DrawerQueryId)\n );\n this.CloseDrawer(true);\n }\n\n // ========================================\n // Utilities\n // ========================================\n\n public getTotalQueryCount(): number {\n return this.queries.length;\n }\n\n public getNodeQueryCount(node: CategoryNode): number {\n let count = node.queries.length;\n for (const child of node.children) {\n count += this.getNodeQueryCount(child);\n }\n return count;\n }\n\n public refresh(): void {\n this.selectedQuery = null;\n this.loadData(true);\n }\n\n public trackByCategory(index: number, node: CategoryNode): string {\n return node.category.ID;\n }\n\n public trackByQuery(index: number, query: QueryInfo): string {\n return query.ID;\n }\n\n // ========================================\n // Deep Linking\n // ========================================\n\n /**\n * Parse URL query string for query state.\n * Query params: queryId\n */\n private parseUrlState(): { queryId?: string } | null {\n return this.parseUrlFromString(this.router.url);\n }\n\n /**\n * Update URL query string to reflect current state.\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateUrl(): void {\n if (this.skipUrlUpdate) return;\n\n const queryParams: Record<string, string | null> = {};\n\n // Add query ID if selected, null to remove\n if (this.selectedQuery?.ID) {\n queryParams['queryId'] = this.selectedQuery.ID;\n } else {\n queryParams['queryId'] = null;\n }\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n /**\n * Handle external navigation (back/forward buttons).\n * Parses the URL and applies the state without triggering a new navigation.\n */\n private onExternalNavigation(url: string): void {\n // Check if this URL is for our component (contains our base path)\n const currentPath = this.router.url.split('?')[0];\n const newPath = url.split('?')[0];\n\n // Only handle if we're still on the same base path (same component instance)\n if (currentPath !== newPath) {\n return; // Different route entirely, shell will handle it\n }\n\n // Parse the new URL state\n const urlState = this.parseUrlFromString(url);\n\n // Apply the state without triggering URL updates\n this.skipUrlUpdate = true;\n if (urlState?.queryId) {\n const query = this.queries.find(q => UUIDsEqual(q.ID, urlState.queryId));\n if (query) {\n if (!UUIDsEqual(this.selectedQuery?.ID, query.ID)) {\n this.selectedQuery = query;\n this.expandCategoryForQuery(query);\n }\n }\n } else {\n // No queryId means clear selection\n this.selectedQuery = null;\n }\n this.skipUrlUpdate = false;\n\n // Update the tracked URL\n this.lastNavigatedUrl = url;\n\n this.cdr.markForCheck();\n }\n\n /**\n * Parse URL state from a URL string (used for external navigation).\n */\n private parseUrlFromString(url: string): { queryId?: string } | null {\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) return null;\n\n const queryString = url.substring(queryIndex + 1);\n const params = new URLSearchParams(queryString);\n const queryId = params.get('queryId');\n\n if (!queryId) return null;\n\n return { queryId };\n }\n\n /**\n * Expands the category tree to show the given query\n */\n private expandCategoryForQuery(query: QueryInfo): void {\n if (!query.CategoryID) return;\n\n const expandToTarget = (nodes: CategoryNode[], targetCategoryId: string): boolean => {\n for (const node of nodes) {\n if (UUIDsEqual(node.category.ID, targetCategoryId)) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n return true;\n }\n if (expandToTarget(node.children, targetCategoryId)) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n return true;\n }\n }\n return false;\n };\n\n if (expandToTarget(this.categoryTree, query.CategoryID)) {\n this.saveExpandedState();\n }\n }\n\n // ========================================\n // Panel Resize\n // ========================================\n\n /**\n * Load saved panel width from user settings\n */\n private loadSavedPanelWidth(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.SETTINGS_KEY);\n if (saved) {\n const width = parseInt(saved, 10);\n if (!isNaN(width) && width >= QueryBrowserResourceComponent.MIN_PANEL_WIDTH && width <= QueryBrowserResourceComponent.MAX_PANEL_WIDTH) {\n this.PanelWidth = width;\n }\n }\n }\n\n /**\n * Start resizing the left panel via drag handle\n */\n public onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n this.cdr.markForCheck();\n\n // Run outside Angular zone for performance during mousemove\n this.zone.runOutsideAngular(() => {\n document.addEventListener('mousemove', this.boundOnResizeMove);\n document.addEventListener('mouseup', this.boundOnResizeEnd);\n });\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n const containerRect = this.elementRef.nativeElement.querySelector('.query-browser-container')?.getBoundingClientRect();\n if (!containerRect) return;\n\n const newWidth = event.clientX - containerRect.left;\n const clamped = Math.max(\n QueryBrowserResourceComponent.MIN_PANEL_WIDTH,\n Math.min(QueryBrowserResourceComponent.MAX_PANEL_WIDTH, newWidth)\n );\n\n this.PanelWidth = clamped;\n this.zone.run(() => this.cdr.markForCheck());\n }\n\n private onResizeEnd(): void {\n if (!this.IsResizing) return;\n this.IsResizing = false;\n\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n\n // Persist width with debouncing\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.SETTINGS_KEY,\n this.PanelWidth.toString()\n );\n\n this.zone.run(() => this.cdr.markForCheck());\n }\n\n /** Case-insensitive UUID check whether a query is the currently selected query. */\n public IsQuerySelected(query: QueryInfo): boolean {\n return UUIDsEqual(this.selectedQuery?.ID, query.ID);\n }\n}\n","<!-- Query Browser Resource -->\n<div class=\"query-browser-container\" [class.resizing]=\"IsResizing\">\n <!-- Left Panel: Query Tree -->\n <div class=\"query-tree-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Header -->\n <div class=\"tree-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-database\"></i>\n <span>Queries</span>\n <span class=\"query-count\">({{ getTotalQueryCount() }})</span>\n </div>\n <div class=\"header-actions\">\n @if (CanCreateQuery) {\n <button class=\"icon-btn\" (click)=\"OpenCreateDrawer()\" title=\"New Query\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n <button class=\"icon-btn\" (click)=\"expandAll()\" title=\"Expand all\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"collapseAll()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-folder\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"tree-search\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n [value]=\"searchText\"\n placeholder=\"Search queries...\"\n (input)=\"onSearchChange($any($event.target).value)\">\n @if (searchText) {\n <button class=\"clear-btn\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Status Filters -->\n <div class=\"status-filter-bar\">\n @for (status of AllStatuses; track status) {\n @if (getStatusCount(status) > 0) {\n <button class=\"status-filter-chip\"\n [class.active]=\"StatusFilters[status]\"\n [style.--chip-color]=\"getStatusColor(status)\"\n (click)=\"toggleStatusFilter(status)\"\n [title]=\"(StatusFilters[status] ? 'Hide' : 'Show') + ' ' + status + ' queries'\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(status)\"></i>\n <span>{{ status }}</span>\n <span class=\"chip-count\">{{ getStatusCount(status) }}</span>\n </button>\n }\n }\n </div>\n\n <!-- Tree Content -->\n <div class=\"tree-content\">\n <!-- Loading -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading queries...\"></mj-loading>\n </div>\n }\n\n <!-- Empty -->\n @if (!isLoading && queries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database empty-icon\"></i>\n <p>No queries available</p>\n </div>\n }\n\n <!-- No results -->\n @if (!isLoading && searchText && filteredQueries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>No queries match \"{{ searchText }}\"</p>\n </div>\n }\n\n <!-- Category Tree -->\n @if (!isLoading && queries.length > 0) {\n <div class=\"category-tree\">\n @for (node of categoryTree; track trackByCategory($index, node)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: node }\"></ng-container>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Resize Handle -->\n <div class=\"resize-handle\"\n [class.active]=\"IsResizing\"\n (mousedown)=\"onResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- Right Panel: Query Viewer -->\n <div class=\"query-viewer-panel\">\n <!-- No query selected -->\n @if (!selectedQuery) {\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-hand-pointer no-selection-icon\"></i>\n <p class=\"no-selection-message\">Select a query from the list</p>\n <p class=\"no-selection-hint\">Click on a query to view and run it</p>\n @if (CanCreateQuery) {\n <button class=\"no-selection-create-btn\" (click)=\"OpenCreateDrawer()\">\n <i class=\"fa-solid fa-plus\"></i> New Query\n </button>\n }\n </div>\n }\n\n <!-- Query Viewer -->\n @if (selectedQuery) {\n <!-- Query Header with Status -->\n <div class=\"query-viewer-header\">\n <div class=\"query-viewer-title\">\n <i class=\"fa-solid fa-file-code\"></i>\n <span>{{ selectedQuery.Name }}</span>\n </div>\n <div class=\"query-viewer-header-actions\">\n @if (selectedQuery.Status !== 'Approved') {\n <span class=\"query-viewer-status-pill\"\n [style.background]=\"getStatusColor(selectedQuery.Status)\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(selectedQuery.Status)\"></i>\n {{ selectedQuery.Status }}\n </span>\n } @else {\n <span class=\"query-viewer-status-pill approved\"\n [style.background]=\"getStatusColor('Approved')\">\n <i class=\"fa-solid fa-check-circle\"></i>\n Approved\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"icon-btn\" (click)=\"OpenEditDrawer(selectedQuery)\" title=\"Edit Query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n </div>\n <mj-query-viewer\n [QueryId]=\"selectedQuery.ID\"\n [AutoRun]=\"true\"\n [SelectionMode]=\"'multiple'\"\n (EntityLinkClick)=\"onEntityLinkClick($event)\"\n (RowDoubleClick)=\"onRowDoubleClick($event)\"\n (OpenQueryRecord)=\"onOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"onCompositionTokenClick($event)\">\n </mj-query-viewer>\n }\n </div>\n</div>\n\n<!-- Category Node Template -->\n<ng-template #categoryNode let-node=\"node\">\n @if (hasVisibleContent(node)) {\n <div class=\"category-item\"\n [class.expanded]=\"node.expanded\"\n [style.padding-left.px]=\"node.level * 16 + 8\">\n <div class=\"category-header\" (click)=\"toggleExpand(node)\">\n <i class=\"fa-solid expand-icon\"\n [class.fa-chevron-down]=\"node.expanded\"\n [class.fa-chevron-right]=\"!node.expanded\"></i>\n <i class=\"fa-solid fa-folder category-icon\"\n [class.fa-folder-open]=\"node.expanded\"></i>\n <span class=\"category-name\">{{ node.category.Name }}</span>\n <span class=\"category-count\">({{ getNodeQueryCount(node) }})</span>\n </div>\n <!-- Queries in this category -->\n @if (node.expanded) {\n <div class=\"category-queries\">\n @for (query of node.queries; track trackByQuery($index, query)) {\n <div class=\"query-item\"\n [class.selected]=\"IsQuerySelected(query)\"\n [class.hidden]=\"!isQueryVisible(query)\"\n (click)=\"selectQuery(query, $event)\">\n <span class=\"status-dot\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\"></span>\n <i class=\"fa-solid fa-file-code query-icon\"></i>\n <div class=\"query-info\" [title]=\"query.Description || query.Name\">\n <span class=\"query-name\">{{ query.Name }}</span>\n @if (query.Description) {\n <span class=\"query-description\">{{ query.Description }}</span>\n }\n </div>\n @if (query.UsesTemplate) {\n <i class=\"fa-solid fa-sliders param-icon\" title=\"Has parameters\"></i>\n }\n @if (query.Status !== 'Approved') {\n <span class=\"query-status-badge\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\">\n {{ query.Status }}\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"query-details-btn\" (click)=\"OpenEditDrawer(query, $event)\" title=\"Edit query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n <!-- Child categories -->\n @if (node.expanded) {\n @for (child of node.children; track trackByCategory($index, child)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n\n<!-- Query Drawer Backdrop -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer-backdrop\" (click)=\"OnDrawerBackdropClick()\"></div>\n}\n\n<!-- Query Drawer Panel -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer\">\n\n <!-- Drawer Header -->\n <div class=\"query-drawer-header\">\n <div class=\"query-drawer-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"DrawerMode === 'create'\" [class.fa-pen-to-square]=\"DrawerMode === 'edit'\"></i>\n <div>\n <div class=\"query-drawer-title-main\">{{ DrawerMode === 'create' ? 'New Query' : 'Edit Query' }}</div>\n @if (DrawerMode === 'edit' && DrawerName) {\n <div class=\"query-drawer-title-sub\">{{ DrawerName }}</div>\n }\n </div>\n </div>\n <button class=\"query-drawer-close\" (click)=\"CloseDrawer()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Drawer Body -->\n <div class=\"query-drawer-body\">\n\n <!-- Name -->\n <div class=\"drawer-field\" [class.drawer-field-error]=\"DrawerNameError\">\n <label class=\"drawer-label\">Name <span class=\"drawer-required\">*</span></label>\n <input class=\"drawer-input\"\n type=\"text\"\n [(ngModel)]=\"DrawerName\"\n (ngModelChange)=\"DrawerNameError = false\"\n placeholder=\"Enter query name\"\n [disabled]=\"IsSavingDrawer\">\n @if (DrawerNameError) {\n <span class=\"drawer-field-hint\">Name is required</span>\n }\n </div>\n\n <!-- Category + Status (side by side) -->\n <div class=\"drawer-row\">\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Category</label>\n <select class=\"drawer-select\"\n [(ngModel)]=\"DrawerCategoryID\"\n [disabled]=\"IsSavingDrawer\">\n <option value=\"\">(none)</option>\n @for (cat of categories; track cat.ID) {\n <option [value]=\"cat.ID\">{{ cat.Name }}</option>\n }\n </select>\n </div>\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Status</label>\n <select class=\"drawer-select\"\n [(ngModel)]=\"DrawerStatus\"\n [disabled]=\"IsSavingDrawer\">\n @for (s of DrawerStatuses; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"drawer-field\">\n <label class=\"drawer-label\">Description</label>\n <textarea class=\"drawer-textarea\"\n rows=\"3\"\n [(ngModel)]=\"DrawerDescription\"\n placeholder=\"Optional description\"\n [disabled]=\"IsSavingDrawer\"></textarea>\n </div>\n\n <!-- SQL -->\n <div class=\"drawer-field drawer-field-sql\">\n <label class=\"drawer-label\">SQL</label>\n <mj-code-editor #drawerSqlEditor\n [language]=\"'sql'\"\n [indentWithTab]=\"true\"\n [readonly]=\"IsSavingDrawer\"\n (change)=\"OnDrawerSQLChange($event)\"\n class=\"drawer-sql-editor\">\n </mj-code-editor>\n </div>\n\n <!-- Open Full Record link (edit mode only) -->\n @if (DrawerMode === 'edit' && DrawerQueryId) {\n <div class=\"drawer-full-record\">\n <i class=\"fa-solid fa-circle-info\"></i>\n To manage Parameters, Fields, and Permissions —\n <button class=\"drawer-link-btn\" (click)=\"OpenFullRecord()\">\n Open full record <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n }\n\n </div>\n\n <!-- Drawer Footer -->\n <div class=\"query-drawer-footer\">\n\n <!-- Error message -->\n @if (DrawerSaveError) {\n <div class=\"drawer-error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> {{ DrawerSaveError }}\n </div>\n }\n\n <!-- Action buttons -->\n <div class=\"drawer-footer-actions\">\n <button class=\"drawer-btn drawer-btn-primary\"\n (click)=\"SaveDrawer()\"\n [disabled]=\"IsSavingDrawer || !DrawerName.trim()\">\n @if (IsSavingDrawer) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n <button class=\"drawer-btn drawer-btn-secondary\"\n (click)=\"CloseDrawer()\"\n [disabled]=\"IsSavingDrawer\">\n Cancel\n </button>\n </div>\n\n </div>\n\n </div>\n}\n"]}
@@ -4,5 +4,4 @@ export * from './scheduling-activity-resource.component';
4
4
  export * from './scheduling-overview.component';
5
5
  export * from './scheduling-jobs.component';
6
6
  export * from './scheduling-activity.component';
7
- export * from './job-slideout.component';
8
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Scheduling/components/index.ts"],"names":[],"mappings":"AACA,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Scheduling/components/index.ts"],"names":[],"mappings":"AACA,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC"}
@@ -6,5 +6,4 @@ export * from './scheduling-activity-resource.component';
6
6
  export * from './scheduling-overview.component';
7
7
  export * from './scheduling-jobs.component';
8
8
  export * from './scheduling-activity.component';
9
- export * from './job-slideout.component';
10
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Scheduling/components/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAEzD,2CAA2C;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,0BAA0B,CAAC","sourcesContent":["// Export all Scheduling resource components\nexport * from './scheduling-overview-resource.component';\nexport * from './scheduling-jobs-resource.component';\nexport * from './scheduling-activity-resource.component';\n\n// Export child components for internal use\nexport * from './scheduling-overview.component';\nexport * from './scheduling-jobs.component';\nexport * from './scheduling-activity.component';\nexport * from './job-slideout.component';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Scheduling/components/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAEzD,2CAA2C;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC","sourcesContent":["// Export all Scheduling resource components\nexport * from './scheduling-overview-resource.component';\nexport * from './scheduling-jobs-resource.component';\nexport * from './scheduling-activity-resource.component';\n\n// Export child components for internal use\nexport * from './scheduling-overview.component';\nexport * from './scheduling-jobs.component';\nexport * from './scheduling-activity.component';\n"]}