@memberjunction/ng-dashboards 5.44.0 → 5.45.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +5 -3
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +4 -2
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +13 -11
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +3 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +12 -10
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +10 -8
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +1 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +5 -3
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +3 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +11 -5
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +3 -2
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +23 -9
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +3 -2
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +10 -4
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +2 -1
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js +13 -6
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +2 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +10 -8
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +3 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +32 -14
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +4 -2
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +15 -13
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/UserRoutines/user-routines-agent-context.d.ts +44 -0
- package/dist/UserRoutines/user-routines-agent-context.d.ts.map +1 -0
- package/dist/UserRoutines/user-routines-agent-context.js +81 -0
- package/dist/UserRoutines/user-routines-agent-context.js.map +1 -0
- package/dist/UserRoutines/user-routines-resource.component.d.ts +60 -0
- package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -0
- package/dist/UserRoutines/user-routines-resource.component.js +328 -0
- package/dist/UserRoutines/user-routines-resource.component.js.map +1 -0
- package/dist/module.d.ts +16 -15
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/routines-dashboards.module.d.ts +17 -0
- package/dist/routines-dashboards.module.d.ts.map +1 -0
- package/dist/routines-dashboards.module.js +65 -0
- package/dist/routines-dashboards.module.js.map +1 -0
- package/package.json +63 -58
|
@@ -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 { Subject } from 'rxjs';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { Metadata, CompositeKey, RunQuery, RunQueryResult } from '@memberjunction/core';\nimport { TreeBranchConfig } from '@memberjunction/ng-trees';\nimport { ResourceData, UserInfoEngine, MJQueryEntityExtended, MJQueryCategoryEntity, QueryEngine } from '@memberjunction/core-entities';\nimport {\n QueryEntityLinkClickEvent,\n QueryRowClickEvent\n} from '@memberjunction/ng-query-viewer';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\nimport { validateStringParam, boundNameList } from '../shared/agent-tool-validation';\nimport {\n DEFAULT_QUERY_MAX_ROWS,\n QUERY_MAX_ROWS_HARD_CAP,\n DEFAULT_QUERY_PAGE_SIZE,\n normalizeMaxRows,\n computePaging,\n boundResultRows,\n normalizeQueryParameters,\n resolveTotalRowCount,\n} from './query-execution-helpers';\n/**\n * Tree node for the query category hierarchy\n */\ninterface CategoryNode {\n category: MJQueryCategoryEntity;\n children: CategoryNode[];\n queries: MJQueryEntityExtended[];\n expanded: boolean;\n level: number;\n}\n\n/**\n * Tolerant result returned by the stored-query execution tools (RunStoredQuery /\n * PageQueryResults). Results are ALWAYS bounded to the hard cap; SQL is never\n * included.\n */\ninterface QueryExecutionToolResult {\n Success: boolean;\n Results?: unknown[];\n /** Rows actually returned in this (bounded) response. */\n RowCount?: number;\n /**\n * The TRUE total number of rows the query would return, independent of the\n * MaxRows / page cap — read from RunQueryResult.TotalRowCount. This is what\n * answers \"how many rows does this query return?\".\n */\n TotalRowCount?: number;\n PageNumber?: number;\n PageSize?: number;\n ErrorMessage?: string;\n}\n\n/** A single query parameter definition surfaced by GetQueryMetadata (no SQL). */\ninterface QueryParameterMetadata {\n Name: string;\n Type: 'array' | 'boolean' | 'date' | 'number' | 'string';\n IsRequired: boolean;\n Description: string | null;\n}\n\n/** Result returned by GetQueryMetadata — definitions only, never SQL or data. */\ninterface QueryMetadataToolResult {\n Success: boolean;\n QueryName?: string;\n Description?: string | null;\n Parameters?: QueryParameterMetadata[];\n Fields?: string[];\n ErrorMessage?: string;\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: MJQueryCategoryEntity[] = [];\n public categoryTree: CategoryNode[] = [];\n /** All queries the user has permission to run */\n public queries: MJQueryEntityExtended[] = [];\n public filteredQueries: MJQueryEntityExtended[] = [];\n private filteredQueryIds = new Set<string>();\n public selectedQuery: MJQueryEntityExtended | 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': false,\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 /**\n * The id/name of the most recent query executed via an agent execution tool\n * (RunStoredQuery / PageQueryResults). Published in the agent context so the\n * agent has continuity (\"the query I just ran\") WITHOUT ever putting result\n * data or SQL into the always-on snapshot. Null until the first execution.\n */\n private lastExecutedQueryId: string | null = null;\n private lastExecutedQueryName: string | null = null;\n\n /**\n * The embedded query VIEWER's executed state for the CURRENTLY SELECTED\n * query, captured from its QueryComplete output. The viewer auto-runs on\n * select (when params are satisfied) or on user-run, at which point it emits\n * its result and we record the TRUE total row count here. Reset to \"not run\"\n * whenever the selection changes so the published context never reports a\n * stale count for a freshly-selected query.\n *\n * 🚨 SAFETY: only the COUNT + a has-run flag are kept — never SQL, never the\n * result rows. These feed `SelectedQueryHasRun` / `SelectedQueryRowCount`\n * in the agent context so the agent can answer \"how many rows\" from context\n * WITHOUT re-running, while honoring the same no-SQL / no-rows boundary.\n */\n private selectedQueryHasRun = false;\n private selectedQueryRowCount: number | null = null;\n\n private metadata = this.ProviderToUse;\n protected override destroy$ = new Subject<void>();\n private dataLoaded = false;\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 DrawerReusable = false;\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 /** The category ID of the most recently interacted-with folder in the tree */\n private activeCategoryID: string | null = null;\n\n /** Tree dropdown config for Query Categories (branches only, no leaves) */\n public CategoryBranchConfig: TreeBranchConfig = {\n EntityName: 'MJ: Query Categories',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n /** The DrawerCategoryID as a CompositeKey for the tree dropdown binding */\n public get DrawerCategoryIDAsKey(): CompositeKey | null {\n return this.DrawerCategoryID ? CompositeKey.FromID(this.DrawerCategoryID) : null;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private zone: NgZone\n ) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadSavedPanelWidth();\n this.loadSavedStatusFilters();\n this.loadSavedExpandedState();\n this.registerAgentClientTools();\n this.loadData();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools\n //\n // 🚨 SAFETY BOUNDARY — CATALOG NAVIGATION + BOUNDED STORED-QUERY EXECUTION 🚨\n // Query Browser is an ADMIN surface backed by a stored-query catalog. The\n // agent context + client tools fall into two safe tiers:\n //\n // TIER 1 — Navigational / read-only catalog tools (search, filter by\n // status/category, select to view, open record, clear filters,\n // expand/collapse, refresh). These never execute anything.\n //\n // TIER 2 — Bounded execution of *STORED* queries only:\n // • RunStoredQuery — runs a pre-vetted, permission-checked stored query\n // and returns AT MOST QUERY_MAX_ROWS_HARD_CAP rows.\n // • GetQueryMetadata — returns a query's parameter + field definitions so\n // the agent knows what to pass / what it returns. No SQL, no data.\n // • PageQueryResults — same stored query, offset by page (StartRow).\n // Why this is safe: stored queries are pre-authored SELECTs, permission-\n // gated (we DEFENSIVELY re-check UserCanRun before every run), and the\n // server rejects mutations via SQLExpressionValidator on a read-only\n // connection. Results are HARD-CAPPED so the agent can't exfiltrate a\n // whole table. We resolve queries ONLY from `this.queries` — the list\n // already filtered to what the current user may run.\n //\n // DELIBERATELY STILL NOT exposed to the agent (do NOT wire any of these):\n // • RAW / AD-HOC SQL execution — RunQueryParams.SQL is NEVER set from a\n // tool. The agent cannot supply arbitrary SQL; it may only name a\n // stored query. Arbitrary SQL against the DB is exactly what this\n // boundary exists to prevent.\n // • Creating / editing / deleting queries (the drawer + SaveDrawer path).\n // • Exposing SQL TEXT in context or tool output (definitions/params only).\n // • Putting query RESULT data or SQL into the PUBLISHED CONTEXT — results\n // flow back only as a tool's return value (bounded), never streamed in\n // the always-on context snapshot.\n //\n // Selecting/opening a query only DISPLAYS its definition; it never executes\n // it. Context exposes catalog metadata (query/category names, counts, filter\n // state) plus the LAST-EXECUTED query id/name — never SQL or result data.\n //\n // SELECTED-QUERY ROW COUNT: the embedded viewer auto-runs the selected query\n // (when params are satisfied) and emits its result via QueryComplete. We\n // capture ONLY the COUNT (TotalRowCount) + a has-run flag from that event and\n // publish them as SelectedQueryHasRun / SelectedQueryRowCount so the agent can\n // answer \"how many rows?\" from context without re-running. Still NO SQL and NO\n // result rows — the same boundary as everything else here.\n // ================================================================\n\n /**\n * Publish the current Query Browser state to the AI agent. Re-invoked on\n * every meaningful state change (selection, search, refresh, filter). Only\n * catalog METADATA is exposed — query NAMES, CATEGORY names, counts, and the\n * active filter state — NEVER SQL text or query RESULTS. Name lists are\n * bounded (see {@link AGENT_CONTEXT_NAME_LIST_CAP}); companion total/filtered\n * counts tell the agent the true sizes when the lists are truncated.\n */\n private publishAgentContext(): void {\n // Active status filters (the statuses currently toggled ON in the tree).\n const activeStatusFilters = this.AllStatuses.filter(s => this.StatusFilters[s] === true);\n\n // Bounded list of category names the user can navigate (excludes the\n // virtual Uncategorized bucket, which has no real category record).\n const categoryNames = boundNameList(\n this.categories.map(c => c.Name).filter((n): n is string => !!n)\n );\n\n // Bounded list of the query names currently visible (status + search\n // filters applied) — what the agent would see in the tree right now.\n const visibleQueryNames = boundNameList(this.filteredQueries.map(q => q.Name));\n\n // Whether the SELECTED query has actually executed in the embedded viewer\n // and, if so, its TRUE total row count. Only meaningful while a query is\n // selected; null/false otherwise. NO SQL, NO rows — just the count + flag.\n const hasSelection = this.selectedQuery != null;\n const selectedQueryHasRun = hasSelection && this.selectedQueryHasRun;\n const selectedQueryRowCount = selectedQueryHasRun ? this.selectedQueryRowCount : null;\n\n this.navigationService.SetAgentContext(this, {\n // — Selection —\n SelectedQueryId: this.selectedQuery?.ID ?? null,\n SelectedQueryName: this.selectedQuery?.Name ?? null,\n SelectedCategory: this.selectedQuery?.Category ?? null,\n // — Selected query's executed row count (when run in the viewer) —\n // The agent can answer \"how many rows?\" from these WITHOUT re-running.\n // SelectedQueryHasRun=false means \"select-only; run it to get the count\"\n // (the agent can then call RunStoredQuery and read TotalRowCount).\n SelectedQueryHasRun: selectedQueryHasRun,\n SelectedQueryRowCount: selectedQueryRowCount,\n // — Filter state —\n SearchText: this.searchText,\n ActiveStatusFilters: activeStatusFilters,\n // — Counts —\n TotalQueryCount: this.queries.length,\n FilteredQueryCount: this.filteredQueries.length,\n CategoryCount: this.categories.length,\n // — Bounded navigable name lists (NO SQL, NO results) —\n AvailableCategories: categoryNames,\n VisibleQueryNames: visibleQueryNames,\n // — Last execution continuity (identity ONLY — never SQL or rows) —\n LastExecutedQueryId: this.lastExecutedQueryId,\n LastExecutedQueryName: this.lastExecutedQueryName,\n });\n }\n\n /**\n * Register the read-only / navigational client tools the agent may invoke.\n * Every Handler is tolerant: validates input and returns\n * `{ Success: false, ErrorMessage }` rather than throwing. No tool here runs\n * a query.\n */\n private registerAgentClientTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SearchQueries',\n Description: 'Free-text search across the stored-query catalog (name, description, category). Read-only — does not run any query.',\n ParameterSchema: { type: 'object', properties: { searchText: { type: 'string' } }, required: ['searchText'] },\n Handler: async (params: Record<string, unknown>) => this.handleSearchTool(params),\n },\n {\n Name: 'FilterQueriesByStatus',\n Description: 'Show only queries with the given status in the catalog tree. Valid values: Approved, Pending, Rejected, Expired.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string', enum: ['Approved', 'Pending', 'Rejected', 'Expired'] } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.handleFilterByStatusTool(params),\n },\n {\n Name: 'FilterQueriesByCategory',\n Description: 'Narrow the visible catalog to a single category by its NAME (case-insensitive). Use AvailableCategories from context for valid names. Read-only navigation.',\n ParameterSchema: { type: 'object', properties: { category: { type: 'string' } }, required: ['category'] },\n Handler: async (params: Record<string, unknown>) => this.handleFilterByCategoryTool(params),\n },\n {\n Name: 'SelectQuery',\n Description: 'Open a stored query in the viewer by its NAME or ID. This only DISPLAYS the query definition; it does NOT run the query.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.handleSelectQueryTool(params),\n },\n {\n Name: 'OpenQuery',\n Description: 'Open the full query record (for viewing/editing in its own tab) by query NAME or ID. Opens the entity form; it does NOT run the query.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.handleOpenQueryTool(params),\n },\n {\n Name: 'ClearQueryFilters',\n Description: 'Clear the search text and reset status filters to the default (Approved only). Read-only navigation.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.handleClearFiltersTool(),\n },\n {\n Name: 'ExpandAllCategories',\n Description: 'Expand every category node in the catalog tree so all queries are visible. Read-only navigation.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.handleExpandAllTool(),\n },\n {\n Name: 'CollapseAllCategories',\n Description: 'Collapse every category node in the catalog tree. Read-only navigation.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.handleCollapseAllTool(),\n },\n {\n Name: 'RefreshQueries',\n Description: 'Reload the stored-query catalog from the server. Read-only.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.handleRefreshTool(),\n },\n // ---- TIER 2: bounded execution of STORED queries only (see SAFETY BOUNDARY) ----\n {\n Name: 'GetQueryMetadata',\n Description: 'Return a stored query\\'s parameter definitions (Name/Type/IsRequired/Description) and result field names, plus its description — so you know what to pass to RunStoredQuery and what columns it returns. Identify the query by NAME or ID. Does NOT run the query and NEVER returns SQL text.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.handleGetQueryMetadataTool(params),\n },\n {\n Name: 'RunStoredQuery',\n Description: `Execute a PRE-VETTED, permission-checked STORED query (by NAME or ID) and return bounded results. Optional Parameters object is passed to the query's template parameters (see GetQueryMetadata). MaxRows defaults to ${DEFAULT_QUERY_MAX_ROWS} and is hard-capped at ${QUERY_MAX_ROWS_HARD_CAP}. You CANNOT supply raw SQL — only name an existing stored query. Returns { Success, Results, RowCount, TotalRowCount, ErrorMessage? }, where RowCount = rows returned (bounded by MaxRows) and TotalRowCount = the total rows the query would return overall. To answer \"how many rows does this query return?\", run it and read TotalRowCount.`,\n ParameterSchema: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n Parameters: { type: 'object' },\n MaxRows: { type: 'number' },\n },\n required: ['query'],\n },\n Handler: async (params: Record<string, unknown>) => this.handleRunStoredQueryTool(params),\n },\n {\n Name: 'PageQueryResults',\n Description: `Run the same STORED query (by NAME or ID) for a given 1-based PageNumber, returning that page of bounded results. PageSize defaults to ${DEFAULT_QUERY_PAGE_SIZE} and is hard-capped at ${QUERY_MAX_ROWS_HARD_CAP}. Optional Parameters as in RunStoredQuery. Returns { Success, Results, RowCount, TotalRowCount, PageNumber, PageSize, ErrorMessage? }, where RowCount = rows on THIS page (bounded) and TotalRowCount = the total rows across ALL pages — use TotalRowCount to answer \"how many rows in total?\".`,\n ParameterSchema: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n PageNumber: { type: 'number' },\n PageSize: { type: 'number' },\n Parameters: { type: 'object' },\n },\n required: ['query', 'PageNumber'],\n },\n Handler: async (params: Record<string, unknown>) => this.handlePageQueryResultsTool(params),\n },\n ]);\n }\n\n private handleSearchTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const v = validateStringParam(params?.['searchText'], 'searchText');\n if (!v.ok) return v.result;\n this.onSearchChange(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleFilterByStatusTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const status = String(params?.['status'] ?? '');\n if (!this.AllStatuses.includes(status)) {\n return { Success: false, ErrorMessage: `Invalid status \"${status}\". Expected one of: ${this.AllStatuses.join(', ')}.` };\n }\n // Show only the requested status — enable it, disable the others.\n for (const s of this.AllStatuses) {\n this.StatusFilters[s] = s === status;\n }\n this.applyFilters();\n this.buildCategoryTree();\n this.saveStatusFilters();\n this.cdr.markForCheck();\n this.publishAgentContext();\n return { Success: true };\n }\n\n /**\n * Resolve an agent-supplied identifier (query NAME or ID) to a query the\n * current user can view. Prefers an exact ID match, then a case-insensitive\n * NAME match — mirrors DataExplorer's SelectView resolution. Returns null\n * when nothing matches.\n */\n private resolveQuery(raw: string): MJQueryEntityExtended | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n const lowered = trimmed.toLowerCase();\n return (\n this.queries.find(q => UUIDsEqual(q.ID, trimmed)) ??\n this.queries.find(q => q.Name.toLowerCase() === lowered) ??\n null\n );\n }\n\n private handleSelectQueryTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? '');\n if (!raw.trim()) {\n return { Success: false, ErrorMessage: 'A query name or ID is required.' };\n }\n const query = this.resolveQuery(raw);\n if (!query) {\n return { Success: false, ErrorMessage: `No query named or identified by \"${raw}\" (or you lack permission to view it).` };\n }\n this.selectQuery(query);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenQueryTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? '');\n if (!raw.trim()) {\n return { Success: false, ErrorMessage: 'A query name or ID is required.' };\n }\n const query = this.resolveQuery(raw);\n if (!query) {\n return { Success: false, ErrorMessage: `No query named or identified by \"${raw}\" (or you lack permission to view it).` };\n }\n // Opens the full Query entity record for viewing — does NOT execute it.\n this.onOpenQueryRecord({ queryId: query.ID, queryName: query.Name });\n return { Success: true };\n }\n\n private handleFilterByCategoryTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const v = validateStringParam(params?.['category'], 'category');\n if (!v.ok) return v.result;\n const raw = v.value.trim();\n if (!raw) {\n return { Success: false, ErrorMessage: 'A category name is required.' };\n }\n const lowered = raw.toLowerCase();\n const category = this.categories.find(c => (c.Name ?? '').toLowerCase() === lowered);\n if (!category) {\n const available = boundNameList(this.categories.map(c => c.Name).filter((n): n is string => !!n)).join(', ') || '(none)';\n return { Success: false, ErrorMessage: `No category named \"${raw}\". Available categories: ${available}.` };\n }\n // The search filter already matches on category name (applyFilters), so\n // scoping the visible tree to a category reuses that read-only path.\n this.onSearchChange(category.Name);\n return { Success: true };\n }\n\n private handleClearFiltersTool(): { Success: boolean; ErrorMessage?: string } {\n // Clear search text and reset status filters to the default (Approved only).\n this.searchText = '';\n for (const s of this.AllStatuses) {\n this.StatusFilters[s] = s === 'Approved';\n }\n this.applyFilters();\n this.buildCategoryTree();\n this.saveStatusFilters();\n this.cdr.markForCheck();\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleExpandAllTool(): { Success: boolean; ErrorMessage?: string } {\n this.expandAll();\n return { Success: true };\n }\n\n private handleCollapseAllTool(): { Success: boolean; ErrorMessage?: string } {\n this.collapseAll();\n return { Success: true };\n }\n\n private async handleRefreshTool(): Promise<{ Success: boolean; ErrorMessage?: string }> {\n try {\n await this.loadData(true);\n this.publishAgentContext();\n return { Success: true };\n } catch (e) {\n return { Success: false, ErrorMessage: e instanceof Error ? e.message : 'Refresh failed.' };\n }\n }\n\n // ================================================================\n // TIER 2 — Bounded STORED-QUERY execution tool handlers\n //\n // Every handler is tolerant (never throws), resolves the query ONLY from the\n // already-permission-filtered `this.queries` list, DEFENSIVELY re-checks\n // UserCanRun before running, threads the component's RunQuery provider via\n // `this.RunQueryToUse`, and HARD-CAPS the returned rows. SQL text is never\n // returned; result data is never written to the published context.\n // ================================================================\n\n /** Tolerant result shape for the stored-query execution tools. */\n private resolveRunnableQuery(raw: string):\n { ok: true; query: MJQueryEntityExtended } | { ok: false; result: QueryExecutionToolResult } {\n const trimmed = raw.trim();\n if (!trimmed) {\n return { ok: false, result: { Success: false, ErrorMessage: 'A query name or ID is required.' } };\n }\n const query = this.resolveQuery(trimmed);\n if (!query) {\n return { ok: false, result: { Success: false, ErrorMessage: `No query named or identified by \"${raw}\" (or you lack permission to run it).` } };\n }\n // DEFENSIVE permission re-check — `this.queries` was already filtered to\n // runnable queries at load time, but dependencies/permissions may have\n // changed since. Re-verify before every execution.\n const user = this.metadata.CurrentUser;\n const permission = query.UserCanRun(user);\n if (!permission.canRun) {\n const denied = permission.deniedEntities.length > 0\n ? ` Denied on: ${permission.deniedEntities.join(', ')}.`\n : '';\n return { ok: false, result: { Success: false, ErrorMessage: `You do not have permission to run \"${query.Name}\".${denied}` } };\n }\n return { ok: true, query };\n }\n\n /**\n * Execute a stored query with a bounded row count and optional StartRow\n * offset, returning a tolerant, hard-capped result. Centralizes the\n * RunQuery call + double row-bounding shared by RunStoredQuery and\n * PageQueryResults. Never throws; never sets RunQueryParams.SQL.\n */\n private async executeStoredQuery(\n query: MJQueryEntityExtended,\n maxRows: number,\n parameters: Record<string, unknown> | undefined,\n startRow?: number,\n ): Promise<{ Success: boolean; Results: unknown[]; RowCount: number; TotalRowCount: number; ErrorMessage?: string }> {\n try {\n // Thread the component's provider (multi-provider safe) — NEVER set SQL.\n const runQuery = new RunQuery(this.RunQueryToUse);\n const result = await runQuery.RunQuery(\n {\n QueryID: query.ID,\n Parameters: parameters,\n MaxRows: maxRows,\n StartRow: startRow,\n },\n this.metadata.CurrentUser,\n );\n\n if (!result.Success) {\n return { Success: false, Results: [], RowCount: 0, TotalRowCount: 0, ErrorMessage: result.ErrorMessage || 'Query execution failed.' };\n }\n\n // Record execution for context continuity (identity only).\n this.lastExecutedQueryId = query.ID;\n this.lastExecutedQueryName = query.Name;\n\n // Defensive second bound: a provider that ignored MaxRows can never\n // leak more than the cap to the agent.\n const bounded = boundResultRows(result.Results, maxRows);\n // The TRUE total available, independent of the MaxRows/page cap —\n // this is what answers \"how many rows does this query return?\".\n const totalRowCount = resolveTotalRowCount(result.TotalRowCount, bounded.length);\n return { Success: true, Results: bounded, RowCount: bounded.length, TotalRowCount: totalRowCount };\n } catch (e) {\n return { Success: false, Results: [], RowCount: 0, TotalRowCount: 0, ErrorMessage: e instanceof Error ? e.message : 'Query execution failed.' };\n }\n }\n\n private async handleRunStoredQueryTool(params: Record<string, unknown>): Promise<QueryExecutionToolResult> {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? params?.['QueryId'] ?? '');\n const resolved = this.resolveRunnableQuery(raw);\n if (!resolved.ok) return resolved.result;\n\n const maxRows = normalizeMaxRows(params?.['MaxRows'], DEFAULT_QUERY_MAX_ROWS);\n const parameters = normalizeQueryParameters(params?.['Parameters']);\n\n const exec = await this.executeStoredQuery(resolved.query, maxRows, parameters);\n if (exec.Success) {\n this.publishAgentContext();\n }\n return exec;\n }\n\n private async handlePageQueryResultsTool(params: Record<string, unknown>): Promise<QueryExecutionToolResult> {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? params?.['QueryId'] ?? '');\n const resolved = this.resolveRunnableQuery(raw);\n if (!resolved.ok) return resolved.result;\n\n const { startRow, pageNumber, pageSize } = computePaging(params?.['PageNumber'], params?.['PageSize']);\n const parameters = normalizeQueryParameters(params?.['Parameters']);\n\n const exec = await this.executeStoredQuery(resolved.query, pageSize, parameters, startRow);\n if (exec.Success) {\n this.publishAgentContext();\n }\n return { ...exec, PageNumber: pageNumber, PageSize: pageSize };\n }\n\n /**\n * Return a stored query's parameter + result-field definitions so the agent\n * knows what to pass and what it gets back. Read-only — NEVER returns SQL.\n */\n private handleGetQueryMetadataTool(params: Record<string, unknown>): QueryMetadataToolResult {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? params?.['QueryId'] ?? '');\n if (!raw.trim()) {\n return { Success: false, ErrorMessage: 'A query name or ID is required.' };\n }\n const query = this.resolveQuery(raw);\n if (!query) {\n return { Success: false, ErrorMessage: `No query named or identified by \"${raw}\" (or you lack permission to view it).` };\n }\n const parameters: QueryParameterMetadata[] = query.QueryParameters.map(p => ({\n Name: p.Name,\n Type: p.Type,\n IsRequired: p.IsRequired === true,\n Description: p.Description ?? null,\n }));\n const fields: string[] = query.QueryFields.map(f => f.Name);\n return {\n Success: true,\n QueryName: query.Name,\n Description: query.Description ?? null,\n Parameters: parameters,\n Fields: fields,\n };\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\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 QueryEngine refresh when explicitly refreshing (user clicked Refresh)\n if (forceRefresh) {\n await QueryEngine.Instance.Config(true);\n }\n\n // Load all queries from QueryEngine (event-driven cache, returns MJQueryEntityExtended[])\n const qe = QueryEngine.Instance;\n this.categories = qe.Categories || [];\n this.queries = (qe.Queries || []).filter(q =>\n q.UserCanRun(this.metadata.CurrentUser).canRun\n );\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Mark data as loaded\n this.dataLoaded = true;\n\n // Apply initial query params for deep linking\n const params = this.GetQueryParams();\n if (params['queryId']) {\n this.selectQueryById(params['queryId']);\n }\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 this.publishAgentContext();\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 = {\n ID: '__uncategorized__',\n Name: 'Uncategorized',\n Description: 'Queries without a category'\n } as unknown as MJQueryCategoryEntity;\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 this.publishAgentContext();\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 // Track the most recently expanded folder as the active category context\n if (node.expanded && node.category.ID !== '__uncategorized__') {\n this.activeCategoryID = node.category.ID;\n }\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: MJQueryEntityExtended, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n const changed = !UUIDsEqual(this.selectedQuery?.ID, query.ID);\n this.selectedQuery = query;\n if (changed) {\n // New selection — the viewer will re-run; clear any prior run state.\n this.resetSelectedQueryRunState();\n }\n if (query.CategoryID) {\n this.activeCategoryID = query.CategoryID;\n }\n this.UpdateQueryParams({ queryId: query.ID });\n this.NotifyDisplayNameChanged(query.Name || 'Query');\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n public isQueryVisible(query: MJQueryEntityExtended): 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 /**\n * Capture the embedded viewer's executed row count when it finishes running\n * the SELECTED query (auto-run on select, or user-run). We read the TRUE\n * total (TotalRowCount, falling back to the returned row count) so the agent\n * can answer \"how many rows?\" from context without re-running.\n *\n * 🚨 SAFETY: we store ONLY the count + a has-run flag here — never the SQL,\n * never the result rows. The published context honors the same boundary.\n */\n public onViewerQueryComplete(result: RunQueryResult): void {\n this.selectedQueryHasRun = true;\n this.selectedQueryRowCount = resolveTotalRowCount(result?.TotalRowCount, result?.RowCount ?? 0);\n this.publishAgentContext();\n }\n\n /**\n * Reset the SELECTED query's executed-run state. Called whenever the\n * selection changes so the published context never reports a stale row count\n * for a freshly-selected (not-yet-run) query.\n */\n private resetSelectedQueryRunState(): void {\n this.selectedQueryHasRun = false;\n this.selectedQueryRowCount = null;\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): MJQueryEntityExtended | 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: MJQueryEntityExtended): 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 /** No-results message for the query list (echoes the search term). */\n public get NoQueryResultsMessage(): string {\n return `No queries match \"${this.searchText}\".`;\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, optionally pre-selecting a category. */\n public OpenCreateDrawer(categoryID?: string): void {\n this.DrawerMode = 'create';\n this.DrawerQueryId = null;\n this.DrawerName = '';\n this.DrawerSQL = '';\n this.DrawerDescription = '';\n // Default to the explicit category, or the most recently active category\n this.DrawerCategoryID = categoryID ?? this.activeCategoryID ?? '';\n this.DrawerStatus = 'Pending';\n this.DrawerReusable = false;\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 MJQueryEntityExtended.\n * Stops event propagation so clicking the edit icon doesn't also select the query.\n */\n public OpenEditDrawer(query: MJQueryEntityExtended, 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.DrawerReusable = query.Reusable ?? false;\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 /** Update DrawerCategoryID when the tree dropdown selection changes. */\n public OnDrawerCategoryChange(value: CompositeKey | CompositeKey[] | null): void {\n if (value instanceof CompositeKey && value.HasValue) {\n this.DrawerCategoryID = value.KeyValuePairs[0]?.Value ?? '';\n } else {\n this.DrawerCategoryID = '';\n }\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 reusable: this.DrawerReusable,\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<MJQueryEntityExtended>('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 entity.Reusable = this.DrawerReusable;\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.UpdateQueryParams({ queryId: refreshed.ID });\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.resetSelectedQueryRunState();\n this.UpdateQueryParams({ queryId: null });\n this.NotifyDisplayNameChanged('Queries');\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: MJQueryEntityExtended): string {\n return query.ID;\n }\n\n // ========================================\n // Deep Linking\n // ========================================\n\n /**\n * Select a query by ID, expanding the tree to show it.\n * Clears selection if no matching query is found.\n */\n private selectQueryById(queryId: string): void {\n const query = this.queries.find(q => UUIDsEqual(q.ID, queryId));\n if (query) {\n if (!UUIDsEqual(this.selectedQuery?.ID, query.ID)) {\n this.selectedQuery = query;\n this.resetSelectedQueryRunState();\n this.expandCategoryForQuery(query);\n this.NotifyDisplayNameChanged(query.Name || 'Query');\n }\n } else {\n this.selectedQuery = null;\n this.resetSelectedQueryRunState();\n this.NotifyDisplayNameChanged('Queries');\n }\n this.cdr.markForCheck();\n }\n\n /**\n * React to back/forward navigation or deep-link activation.\n * Called by the base class when the URL query params change externally.\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void {\n if (!this.dataLoaded) return;\n if (params['queryId']) {\n this.selectQueryById(params['queryId']);\n } else {\n this.selectedQuery = null;\n this.resetSelectedQueryRunState();\n this.NotifyDisplayNameChanged('Queries');\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Expands the category tree to show the given query\n */\n private expandCategoryForQuery(query: MJQueryEntityExtended): 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: MJQueryEntityExtended): 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 <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-database\"\n Title=\"No queries available\" />\n }\n\n <!-- No results -->\n @if (!isLoading && searchText && filteredQueries.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"no-results\"\n Title=\"No queries found\"\n [Message]=\"NoQueryResultsMessage\" />\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 <mj-empty-state class=\"no-selection\" Icon=\"fa-solid fa-hand-pointer\"\n Title=\"Select a query from the list\"\n Message=\"Click on a query to view and run it\"\n [ActionText]=\"CanCreateQuery ? 'New Query' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"OpenCreateDrawer()\" />\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 (QueryComplete)=\"onViewerQueryComplete($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 @if (CanCreateQuery && node.category.ID !== '__uncategorized__') {\n <button class=\"category-add-btn\"\n (click)=\"OpenCreateDrawer(node.category.ID); $event.stopPropagation()\"\n title=\"New query in {{ node.category.Name }}\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\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\" aria-label=\"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 <mj-tree-dropdown\n [BranchConfig]=\"CategoryBranchConfig\"\n [Value]=\"DrawerCategoryIDAsKey\"\n [SelectableTypes]=\"'branch'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Select category...'\"\n [EnableSearch]=\"true\"\n [Clearable]=\"true\"\n [Disabled]=\"IsSavingDrawer\"\n (ValueChange)=\"OnDrawerCategoryChange($event)\">\n </mj-tree-dropdown>\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 <!-- Reusable -->\n <div class=\"drawer-field drawer-field-inline\">\n <label class=\"mj-checkbox drawer-reusable-label\">\n <input type=\"checkbox\"\n [(ngModel)]=\"DrawerReusable\"\n [disabled]=\"IsSavingDrawer\">\n <span>Reusable</span>\n </label>\n <span class=\"drawer-field-hint\">Allow other queries to reference this query using composition syntax</span>\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 { Subject } from 'rxjs';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { Metadata, CompositeKey, RunQuery, RunQueryResult } from '@memberjunction/core';\nimport { TreeBranchConfig } from '@memberjunction/ng-trees';\nimport { ResourceData, UserInfoEngine, MJQueryEntityExtended, MJQueryCategoryEntity, QueryEngine } from '@memberjunction/core-entities';\nimport {\n QueryEntityLinkClickEvent,\n QueryRowClickEvent\n} from '@memberjunction/ng-query-viewer';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\nimport { MJConfirmService } from '@memberjunction/ng-ui-components';\nimport { validateStringParam, boundNameList } from '../shared/agent-tool-validation';\nimport {\n DEFAULT_QUERY_MAX_ROWS,\n QUERY_MAX_ROWS_HARD_CAP,\n DEFAULT_QUERY_PAGE_SIZE,\n normalizeMaxRows,\n computePaging,\n boundResultRows,\n normalizeQueryParameters,\n resolveTotalRowCount,\n} from './query-execution-helpers';\n/**\n * Tree node for the query category hierarchy\n */\ninterface CategoryNode {\n category: MJQueryCategoryEntity;\n children: CategoryNode[];\n queries: MJQueryEntityExtended[];\n expanded: boolean;\n level: number;\n}\n\n/**\n * Tolerant result returned by the stored-query execution tools (RunStoredQuery /\n * PageQueryResults). Results are ALWAYS bounded to the hard cap; SQL is never\n * included.\n */\ninterface QueryExecutionToolResult {\n Success: boolean;\n Results?: unknown[];\n /** Rows actually returned in this (bounded) response. */\n RowCount?: number;\n /**\n * The TRUE total number of rows the query would return, independent of the\n * MaxRows / page cap — read from RunQueryResult.TotalRowCount. This is what\n * answers \"how many rows does this query return?\".\n */\n TotalRowCount?: number;\n PageNumber?: number;\n PageSize?: number;\n ErrorMessage?: string;\n}\n\n/** A single query parameter definition surfaced by GetQueryMetadata (no SQL). */\ninterface QueryParameterMetadata {\n Name: string;\n Type: 'array' | 'boolean' | 'date' | 'number' | 'string';\n IsRequired: boolean;\n Description: string | null;\n}\n\n/** Result returned by GetQueryMetadata — definitions only, never SQL or data. */\ninterface QueryMetadataToolResult {\n Success: boolean;\n QueryName?: string;\n Description?: string | null;\n Parameters?: QueryParameterMetadata[];\n Fields?: string[];\n ErrorMessage?: string;\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: MJQueryCategoryEntity[] = [];\n public categoryTree: CategoryNode[] = [];\n /** All queries the user has permission to run */\n public queries: MJQueryEntityExtended[] = [];\n public filteredQueries: MJQueryEntityExtended[] = [];\n private filteredQueryIds = new Set<string>();\n public selectedQuery: MJQueryEntityExtended | 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': false,\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 /**\n * The id/name of the most recent query executed via an agent execution tool\n * (RunStoredQuery / PageQueryResults). Published in the agent context so the\n * agent has continuity (\"the query I just ran\") WITHOUT ever putting result\n * data or SQL into the always-on snapshot. Null until the first execution.\n */\n private lastExecutedQueryId: string | null = null;\n private lastExecutedQueryName: string | null = null;\n\n /**\n * The embedded query VIEWER's executed state for the CURRENTLY SELECTED\n * query, captured from its QueryComplete output. The viewer auto-runs on\n * select (when params are satisfied) or on user-run, at which point it emits\n * its result and we record the TRUE total row count here. Reset to \"not run\"\n * whenever the selection changes so the published context never reports a\n * stale count for a freshly-selected query.\n *\n * 🚨 SAFETY: only the COUNT + a has-run flag are kept — never SQL, never the\n * result rows. These feed `SelectedQueryHasRun` / `SelectedQueryRowCount`\n * in the agent context so the agent can answer \"how many rows\" from context\n * WITHOUT re-running, while honoring the same no-SQL / no-rows boundary.\n */\n private selectedQueryHasRun = false;\n private selectedQueryRowCount: number | null = null;\n\n private metadata = this.ProviderToUse;\n protected override destroy$ = new Subject<void>();\n private dataLoaded = false;\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 DrawerReusable = false;\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 /** The category ID of the most recently interacted-with folder in the tree */\n private activeCategoryID: string | null = null;\n\n /** Tree dropdown config for Query Categories (branches only, no leaves) */\n public CategoryBranchConfig: TreeBranchConfig = {\n EntityName: 'MJ: Query Categories',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n /** The DrawerCategoryID as a CompositeKey for the tree dropdown binding */\n public get DrawerCategoryIDAsKey(): CompositeKey | null {\n return this.DrawerCategoryID ? CompositeKey.FromID(this.DrawerCategoryID) : null;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private zone: NgZone,\n private confirmService: MJConfirmService\n ) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadSavedPanelWidth();\n this.loadSavedStatusFilters();\n this.loadSavedExpandedState();\n this.registerAgentClientTools();\n this.loadData();\n }\n\n // ================================================================\n // AI Agent Context & Client Tools\n //\n // 🚨 SAFETY BOUNDARY — CATALOG NAVIGATION + BOUNDED STORED-QUERY EXECUTION 🚨\n // Query Browser is an ADMIN surface backed by a stored-query catalog. The\n // agent context + client tools fall into two safe tiers:\n //\n // TIER 1 — Navigational / read-only catalog tools (search, filter by\n // status/category, select to view, open record, clear filters,\n // expand/collapse, refresh). These never execute anything.\n //\n // TIER 2 — Bounded execution of *STORED* queries only:\n // • RunStoredQuery — runs a pre-vetted, permission-checked stored query\n // and returns AT MOST QUERY_MAX_ROWS_HARD_CAP rows.\n // • GetQueryMetadata — returns a query's parameter + field definitions so\n // the agent knows what to pass / what it returns. No SQL, no data.\n // • PageQueryResults — same stored query, offset by page (StartRow).\n // Why this is safe: stored queries are pre-authored SELECTs, permission-\n // gated (we DEFENSIVELY re-check UserCanRun before every run), and the\n // server rejects mutations via SQLExpressionValidator on a read-only\n // connection. Results are HARD-CAPPED so the agent can't exfiltrate a\n // whole table. We resolve queries ONLY from `this.queries` — the list\n // already filtered to what the current user may run.\n //\n // DELIBERATELY STILL NOT exposed to the agent (do NOT wire any of these):\n // • RAW / AD-HOC SQL execution — RunQueryParams.SQL is NEVER set from a\n // tool. The agent cannot supply arbitrary SQL; it may only name a\n // stored query. Arbitrary SQL against the DB is exactly what this\n // boundary exists to prevent.\n // • Creating / editing / deleting queries (the drawer + SaveDrawer path).\n // • Exposing SQL TEXT in context or tool output (definitions/params only).\n // • Putting query RESULT data or SQL into the PUBLISHED CONTEXT — results\n // flow back only as a tool's return value (bounded), never streamed in\n // the always-on context snapshot.\n //\n // Selecting/opening a query only DISPLAYS its definition; it never executes\n // it. Context exposes catalog metadata (query/category names, counts, filter\n // state) plus the LAST-EXECUTED query id/name — never SQL or result data.\n //\n // SELECTED-QUERY ROW COUNT: the embedded viewer auto-runs the selected query\n // (when params are satisfied) and emits its result via QueryComplete. We\n // capture ONLY the COUNT (TotalRowCount) + a has-run flag from that event and\n // publish them as SelectedQueryHasRun / SelectedQueryRowCount so the agent can\n // answer \"how many rows?\" from context without re-running. Still NO SQL and NO\n // result rows — the same boundary as everything else here.\n // ================================================================\n\n /**\n * Publish the current Query Browser state to the AI agent. Re-invoked on\n * every meaningful state change (selection, search, refresh, filter). Only\n * catalog METADATA is exposed — query NAMES, CATEGORY names, counts, and the\n * active filter state — NEVER SQL text or query RESULTS. Name lists are\n * bounded (see {@link AGENT_CONTEXT_NAME_LIST_CAP}); companion total/filtered\n * counts tell the agent the true sizes when the lists are truncated.\n */\n private publishAgentContext(): void {\n // Active status filters (the statuses currently toggled ON in the tree).\n const activeStatusFilters = this.AllStatuses.filter(s => this.StatusFilters[s] === true);\n\n // Bounded list of category names the user can navigate (excludes the\n // virtual Uncategorized bucket, which has no real category record).\n const categoryNames = boundNameList(\n this.categories.map(c => c.Name).filter((n): n is string => !!n)\n );\n\n // Bounded list of the query names currently visible (status + search\n // filters applied) — what the agent would see in the tree right now.\n const visibleQueryNames = boundNameList(this.filteredQueries.map(q => q.Name));\n\n // Whether the SELECTED query has actually executed in the embedded viewer\n // and, if so, its TRUE total row count. Only meaningful while a query is\n // selected; null/false otherwise. NO SQL, NO rows — just the count + flag.\n const hasSelection = this.selectedQuery != null;\n const selectedQueryHasRun = hasSelection && this.selectedQueryHasRun;\n const selectedQueryRowCount = selectedQueryHasRun ? this.selectedQueryRowCount : null;\n\n this.navigationService.SetAgentContext(this, {\n // — Selection —\n SelectedQueryId: this.selectedQuery?.ID ?? null,\n SelectedQueryName: this.selectedQuery?.Name ?? null,\n SelectedCategory: this.selectedQuery?.Category ?? null,\n // — Selected query's executed row count (when run in the viewer) —\n // The agent can answer \"how many rows?\" from these WITHOUT re-running.\n // SelectedQueryHasRun=false means \"select-only; run it to get the count\"\n // (the agent can then call RunStoredQuery and read TotalRowCount).\n SelectedQueryHasRun: selectedQueryHasRun,\n SelectedQueryRowCount: selectedQueryRowCount,\n // — Filter state —\n SearchText: this.searchText,\n ActiveStatusFilters: activeStatusFilters,\n // — Counts —\n TotalQueryCount: this.queries.length,\n FilteredQueryCount: this.filteredQueries.length,\n CategoryCount: this.categories.length,\n // — Bounded navigable name lists (NO SQL, NO results) —\n AvailableCategories: categoryNames,\n VisibleQueryNames: visibleQueryNames,\n // — Last execution continuity (identity ONLY — never SQL or rows) —\n LastExecutedQueryId: this.lastExecutedQueryId,\n LastExecutedQueryName: this.lastExecutedQueryName,\n });\n }\n\n /**\n * Register the read-only / navigational client tools the agent may invoke.\n * Every Handler is tolerant: validates input and returns\n * `{ Success: false, ErrorMessage }` rather than throwing. No tool here runs\n * a query.\n */\n private registerAgentClientTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SearchQueries',\n Description: 'Free-text search across the stored-query catalog (name, description, category). Read-only — does not run any query.',\n ParameterSchema: { type: 'object', properties: { searchText: { type: 'string' } }, required: ['searchText'] },\n Handler: async (params: Record<string, unknown>) => this.handleSearchTool(params),\n },\n {\n Name: 'FilterQueriesByStatus',\n Description: 'Show only queries with the given status in the catalog tree. Valid values: Approved, Pending, Rejected, Expired.',\n ParameterSchema: { type: 'object', properties: { status: { type: 'string', enum: ['Approved', 'Pending', 'Rejected', 'Expired'] } }, required: ['status'] },\n Handler: async (params: Record<string, unknown>) => this.handleFilterByStatusTool(params),\n },\n {\n Name: 'FilterQueriesByCategory',\n Description: 'Narrow the visible catalog to a single category by its NAME (case-insensitive). Use AvailableCategories from context for valid names. Read-only navigation.',\n ParameterSchema: { type: 'object', properties: { category: { type: 'string' } }, required: ['category'] },\n Handler: async (params: Record<string, unknown>) => this.handleFilterByCategoryTool(params),\n },\n {\n Name: 'SelectQuery',\n Description: 'Open a stored query in the viewer by its NAME or ID. This only DISPLAYS the query definition; it does NOT run the query.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.handleSelectQueryTool(params),\n },\n {\n Name: 'OpenQuery',\n Description: 'Open the full query record (for viewing/editing in its own tab) by query NAME or ID. Opens the entity form; it does NOT run the query.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.handleOpenQueryTool(params),\n },\n {\n Name: 'ClearQueryFilters',\n Description: 'Clear the search text and reset status filters to the default (Approved only). Read-only navigation.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.handleClearFiltersTool(),\n },\n {\n Name: 'ExpandAllCategories',\n Description: 'Expand every category node in the catalog tree so all queries are visible. Read-only navigation.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.handleExpandAllTool(),\n },\n {\n Name: 'CollapseAllCategories',\n Description: 'Collapse every category node in the catalog tree. Read-only navigation.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.handleCollapseAllTool(),\n },\n {\n Name: 'RefreshQueries',\n Description: 'Reload the stored-query catalog from the server. Read-only.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.handleRefreshTool(),\n },\n // ---- TIER 2: bounded execution of STORED queries only (see SAFETY BOUNDARY) ----\n {\n Name: 'GetQueryMetadata',\n Description: 'Return a stored query\\'s parameter definitions (Name/Type/IsRequired/Description) and result field names, plus its description — so you know what to pass to RunStoredQuery and what columns it returns. Identify the query by NAME or ID. Does NOT run the query and NEVER returns SQL text.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.handleGetQueryMetadataTool(params),\n },\n {\n Name: 'RunStoredQuery',\n Description: `Execute a PRE-VETTED, permission-checked STORED query (by NAME or ID) and return bounded results. Optional Parameters object is passed to the query's template parameters (see GetQueryMetadata). MaxRows defaults to ${DEFAULT_QUERY_MAX_ROWS} and is hard-capped at ${QUERY_MAX_ROWS_HARD_CAP}. You CANNOT supply raw SQL — only name an existing stored query. Returns { Success, Results, RowCount, TotalRowCount, ErrorMessage? }, where RowCount = rows returned (bounded by MaxRows) and TotalRowCount = the total rows the query would return overall. To answer \"how many rows does this query return?\", run it and read TotalRowCount.`,\n ParameterSchema: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n Parameters: { type: 'object' },\n MaxRows: { type: 'number' },\n },\n required: ['query'],\n },\n Handler: async (params: Record<string, unknown>) => this.handleRunStoredQueryTool(params),\n },\n {\n Name: 'PageQueryResults',\n Description: `Run the same STORED query (by NAME or ID) for a given 1-based PageNumber, returning that page of bounded results. PageSize defaults to ${DEFAULT_QUERY_PAGE_SIZE} and is hard-capped at ${QUERY_MAX_ROWS_HARD_CAP}. Optional Parameters as in RunStoredQuery. Returns { Success, Results, RowCount, TotalRowCount, PageNumber, PageSize, ErrorMessage? }, where RowCount = rows on THIS page (bounded) and TotalRowCount = the total rows across ALL pages — use TotalRowCount to answer \"how many rows in total?\".`,\n ParameterSchema: {\n type: 'object',\n properties: {\n query: { type: 'string' },\n PageNumber: { type: 'number' },\n PageSize: { type: 'number' },\n Parameters: { type: 'object' },\n },\n required: ['query', 'PageNumber'],\n },\n Handler: async (params: Record<string, unknown>) => this.handlePageQueryResultsTool(params),\n },\n ]);\n }\n\n private handleSearchTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const v = validateStringParam(params?.['searchText'], 'searchText');\n if (!v.ok) return v.result;\n this.onSearchChange(v.value);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleFilterByStatusTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const status = String(params?.['status'] ?? '');\n if (!this.AllStatuses.includes(status)) {\n return { Success: false, ErrorMessage: `Invalid status \"${status}\". Expected one of: ${this.AllStatuses.join(', ')}.` };\n }\n // Show only the requested status — enable it, disable the others.\n for (const s of this.AllStatuses) {\n this.StatusFilters[s] = s === status;\n }\n this.applyFilters();\n this.buildCategoryTree();\n this.saveStatusFilters();\n this.cdr.markForCheck();\n this.publishAgentContext();\n return { Success: true };\n }\n\n /**\n * Resolve an agent-supplied identifier (query NAME or ID) to a query the\n * current user can view. Prefers an exact ID match, then a case-insensitive\n * NAME match — mirrors DataExplorer's SelectView resolution. Returns null\n * when nothing matches.\n */\n private resolveQuery(raw: string): MJQueryEntityExtended | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n const lowered = trimmed.toLowerCase();\n return (\n this.queries.find(q => UUIDsEqual(q.ID, trimmed)) ??\n this.queries.find(q => q.Name.toLowerCase() === lowered) ??\n null\n );\n }\n\n private handleSelectQueryTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? '');\n if (!raw.trim()) {\n return { Success: false, ErrorMessage: 'A query name or ID is required.' };\n }\n const query = this.resolveQuery(raw);\n if (!query) {\n return { Success: false, ErrorMessage: `No query named or identified by \"${raw}\" (or you lack permission to view it).` };\n }\n this.selectQuery(query);\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleOpenQueryTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? '');\n if (!raw.trim()) {\n return { Success: false, ErrorMessage: 'A query name or ID is required.' };\n }\n const query = this.resolveQuery(raw);\n if (!query) {\n return { Success: false, ErrorMessage: `No query named or identified by \"${raw}\" (or you lack permission to view it).` };\n }\n // Opens the full Query entity record for viewing — does NOT execute it.\n this.onOpenQueryRecord({ queryId: query.ID, queryName: query.Name });\n return { Success: true };\n }\n\n private handleFilterByCategoryTool(params: Record<string, unknown>): { Success: boolean; ErrorMessage?: string } {\n const v = validateStringParam(params?.['category'], 'category');\n if (!v.ok) return v.result;\n const raw = v.value.trim();\n if (!raw) {\n return { Success: false, ErrorMessage: 'A category name is required.' };\n }\n const lowered = raw.toLowerCase();\n const category = this.categories.find(c => (c.Name ?? '').toLowerCase() === lowered);\n if (!category) {\n const available = boundNameList(this.categories.map(c => c.Name).filter((n): n is string => !!n)).join(', ') || '(none)';\n return { Success: false, ErrorMessage: `No category named \"${raw}\". Available categories: ${available}.` };\n }\n // The search filter already matches on category name (applyFilters), so\n // scoping the visible tree to a category reuses that read-only path.\n this.onSearchChange(category.Name);\n return { Success: true };\n }\n\n private handleClearFiltersTool(): { Success: boolean; ErrorMessage?: string } {\n // Clear search text and reset status filters to the default (Approved only).\n this.searchText = '';\n for (const s of this.AllStatuses) {\n this.StatusFilters[s] = s === 'Approved';\n }\n this.applyFilters();\n this.buildCategoryTree();\n this.saveStatusFilters();\n this.cdr.markForCheck();\n this.publishAgentContext();\n return { Success: true };\n }\n\n private handleExpandAllTool(): { Success: boolean; ErrorMessage?: string } {\n this.expandAll();\n return { Success: true };\n }\n\n private handleCollapseAllTool(): { Success: boolean; ErrorMessage?: string } {\n this.collapseAll();\n return { Success: true };\n }\n\n private async handleRefreshTool(): Promise<{ Success: boolean; ErrorMessage?: string }> {\n try {\n await this.loadData(true);\n this.publishAgentContext();\n return { Success: true };\n } catch (e) {\n return { Success: false, ErrorMessage: e instanceof Error ? e.message : 'Refresh failed.' };\n }\n }\n\n // ================================================================\n // TIER 2 — Bounded STORED-QUERY execution tool handlers\n //\n // Every handler is tolerant (never throws), resolves the query ONLY from the\n // already-permission-filtered `this.queries` list, DEFENSIVELY re-checks\n // UserCanRun before running, threads the component's RunQuery provider via\n // `this.RunQueryToUse`, and HARD-CAPS the returned rows. SQL text is never\n // returned; result data is never written to the published context.\n // ================================================================\n\n /** Tolerant result shape for the stored-query execution tools. */\n private resolveRunnableQuery(raw: string):\n { ok: true; query: MJQueryEntityExtended } | { ok: false; result: QueryExecutionToolResult } {\n const trimmed = raw.trim();\n if (!trimmed) {\n return { ok: false, result: { Success: false, ErrorMessage: 'A query name or ID is required.' } };\n }\n const query = this.resolveQuery(trimmed);\n if (!query) {\n return { ok: false, result: { Success: false, ErrorMessage: `No query named or identified by \"${raw}\" (or you lack permission to run it).` } };\n }\n // DEFENSIVE permission re-check — `this.queries` was already filtered to\n // runnable queries at load time, but dependencies/permissions may have\n // changed since. Re-verify before every execution.\n const user = this.metadata.CurrentUser;\n const permission = query.UserCanRun(user);\n if (!permission.canRun) {\n const denied = permission.deniedEntities.length > 0\n ? ` Denied on: ${permission.deniedEntities.join(', ')}.`\n : '';\n return { ok: false, result: { Success: false, ErrorMessage: `You do not have permission to run \"${query.Name}\".${denied}` } };\n }\n return { ok: true, query };\n }\n\n /**\n * Execute a stored query with a bounded row count and optional StartRow\n * offset, returning a tolerant, hard-capped result. Centralizes the\n * RunQuery call + double row-bounding shared by RunStoredQuery and\n * PageQueryResults. Never throws; never sets RunQueryParams.SQL.\n */\n private async executeStoredQuery(\n query: MJQueryEntityExtended,\n maxRows: number,\n parameters: Record<string, unknown> | undefined,\n startRow?: number,\n ): Promise<{ Success: boolean; Results: unknown[]; RowCount: number; TotalRowCount: number; ErrorMessage?: string }> {\n try {\n // Thread the component's provider (multi-provider safe) — NEVER set SQL.\n const runQuery = new RunQuery(this.RunQueryToUse);\n const result = await runQuery.RunQuery(\n {\n QueryID: query.ID,\n Parameters: parameters,\n MaxRows: maxRows,\n StartRow: startRow,\n },\n this.metadata.CurrentUser,\n );\n\n if (!result.Success) {\n return { Success: false, Results: [], RowCount: 0, TotalRowCount: 0, ErrorMessage: result.ErrorMessage || 'Query execution failed.' };\n }\n\n // Record execution for context continuity (identity only).\n this.lastExecutedQueryId = query.ID;\n this.lastExecutedQueryName = query.Name;\n\n // Defensive second bound: a provider that ignored MaxRows can never\n // leak more than the cap to the agent.\n const bounded = boundResultRows(result.Results, maxRows);\n // The TRUE total available, independent of the MaxRows/page cap —\n // this is what answers \"how many rows does this query return?\".\n const totalRowCount = resolveTotalRowCount(result.TotalRowCount, bounded.length);\n return { Success: true, Results: bounded, RowCount: bounded.length, TotalRowCount: totalRowCount };\n } catch (e) {\n return { Success: false, Results: [], RowCount: 0, TotalRowCount: 0, ErrorMessage: e instanceof Error ? e.message : 'Query execution failed.' };\n }\n }\n\n private async handleRunStoredQueryTool(params: Record<string, unknown>): Promise<QueryExecutionToolResult> {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? params?.['QueryId'] ?? '');\n const resolved = this.resolveRunnableQuery(raw);\n if (!resolved.ok) return resolved.result;\n\n const maxRows = normalizeMaxRows(params?.['MaxRows'], DEFAULT_QUERY_MAX_ROWS);\n const parameters = normalizeQueryParameters(params?.['Parameters']);\n\n const exec = await this.executeStoredQuery(resolved.query, maxRows, parameters);\n if (exec.Success) {\n this.publishAgentContext();\n }\n return exec;\n }\n\n private async handlePageQueryResultsTool(params: Record<string, unknown>): Promise<QueryExecutionToolResult> {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? params?.['QueryId'] ?? '');\n const resolved = this.resolveRunnableQuery(raw);\n if (!resolved.ok) return resolved.result;\n\n const { startRow, pageNumber, pageSize } = computePaging(params?.['PageNumber'], params?.['PageSize']);\n const parameters = normalizeQueryParameters(params?.['Parameters']);\n\n const exec = await this.executeStoredQuery(resolved.query, pageSize, parameters, startRow);\n if (exec.Success) {\n this.publishAgentContext();\n }\n return { ...exec, PageNumber: pageNumber, PageSize: pageSize };\n }\n\n /**\n * Return a stored query's parameter + result-field definitions so the agent\n * knows what to pass and what it gets back. Read-only — NEVER returns SQL.\n */\n private handleGetQueryMetadataTool(params: Record<string, unknown>): QueryMetadataToolResult {\n const raw = String(params?.['query'] ?? params?.['queryId'] ?? params?.['QueryId'] ?? '');\n if (!raw.trim()) {\n return { Success: false, ErrorMessage: 'A query name or ID is required.' };\n }\n const query = this.resolveQuery(raw);\n if (!query) {\n return { Success: false, ErrorMessage: `No query named or identified by \"${raw}\" (or you lack permission to view it).` };\n }\n const parameters: QueryParameterMetadata[] = query.QueryParameters.map(p => ({\n Name: p.Name,\n Type: p.Type,\n IsRequired: p.IsRequired === true,\n Description: p.Description ?? null,\n }));\n const fields: string[] = query.QueryFields.map(f => f.Name);\n return {\n Success: true,\n QueryName: query.Name,\n Description: query.Description ?? null,\n Parameters: parameters,\n Fields: fields,\n };\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\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 QueryEngine refresh when explicitly refreshing (user clicked Refresh)\n if (forceRefresh) {\n await QueryEngine.Instance.Config(true);\n }\n\n // Load all queries from QueryEngine (event-driven cache, returns MJQueryEntityExtended[])\n const qe = QueryEngine.Instance;\n this.categories = qe.Categories || [];\n this.queries = (qe.Queries || []).filter(q =>\n q.UserCanRun(this.metadata.CurrentUser).canRun\n );\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Mark data as loaded\n this.dataLoaded = true;\n\n // Apply initial query params for deep linking\n const params = this.GetQueryParams();\n if (params['queryId']) {\n this.selectQueryById(params['queryId']);\n }\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 this.publishAgentContext();\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 = {\n ID: '__uncategorized__',\n Name: 'Uncategorized',\n Description: 'Queries without a category'\n } as unknown as MJQueryCategoryEntity;\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 this.publishAgentContext();\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 // Track the most recently expanded folder as the active category context\n if (node.expanded && node.category.ID !== '__uncategorized__') {\n this.activeCategoryID = node.category.ID;\n }\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: MJQueryEntityExtended, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n const changed = !UUIDsEqual(this.selectedQuery?.ID, query.ID);\n this.selectedQuery = query;\n if (changed) {\n // New selection — the viewer will re-run; clear any prior run state.\n this.resetSelectedQueryRunState();\n }\n if (query.CategoryID) {\n this.activeCategoryID = query.CategoryID;\n }\n this.UpdateQueryParams({ queryId: query.ID });\n this.NotifyDisplayNameChanged(query.Name || 'Query');\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n public isQueryVisible(query: MJQueryEntityExtended): 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 /**\n * Capture the embedded viewer's executed row count when it finishes running\n * the SELECTED query (auto-run on select, or user-run). We read the TRUE\n * total (TotalRowCount, falling back to the returned row count) so the agent\n * can answer \"how many rows?\" from context without re-running.\n *\n * 🚨 SAFETY: we store ONLY the count + a has-run flag here — never the SQL,\n * never the result rows. The published context honors the same boundary.\n */\n public onViewerQueryComplete(result: RunQueryResult): void {\n this.selectedQueryHasRun = true;\n this.selectedQueryRowCount = resolveTotalRowCount(result?.TotalRowCount, result?.RowCount ?? 0);\n this.publishAgentContext();\n }\n\n /**\n * Reset the SELECTED query's executed-run state. Called whenever the\n * selection changes so the published context never reports a stale row count\n * for a freshly-selected (not-yet-run) query.\n */\n private resetSelectedQueryRunState(): void {\n this.selectedQueryHasRun = false;\n this.selectedQueryRowCount = null;\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): MJQueryEntityExtended | 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: MJQueryEntityExtended): 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 /** No-results message for the query list (echoes the search term). */\n public get NoQueryResultsMessage(): string {\n return `No queries match \"${this.searchText}\".`;\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 void this.CloseDrawer();\n }\n }\n\n /** Open the drawer in create mode, optionally pre-selecting a category. */\n public OpenCreateDrawer(categoryID?: string): void {\n this.DrawerMode = 'create';\n this.DrawerQueryId = null;\n this.DrawerName = '';\n this.DrawerSQL = '';\n this.DrawerDescription = '';\n // Default to the explicit category, or the most recently active category\n this.DrawerCategoryID = categoryID ?? this.activeCategoryID ?? '';\n this.DrawerStatus = 'Pending';\n this.DrawerReusable = false;\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 MJQueryEntityExtended.\n * Stops event propagation so clicking the edit icon doesn't also select the query.\n */\n public OpenEditDrawer(query: MJQueryEntityExtended, 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.DrawerReusable = query.Reusable ?? false;\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 async CloseDrawer(force = false): Promise<void> {\n if (!force && this.IsDrawerDirty) {\n if (!(await this.confirmService.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 void 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 /** Update DrawerCategoryID when the tree dropdown selection changes. */\n public OnDrawerCategoryChange(value: CompositeKey | CompositeKey[] | null): void {\n if (value instanceof CompositeKey && value.HasValue) {\n this.DrawerCategoryID = value.KeyValuePairs[0]?.Value ?? '';\n } else {\n this.DrawerCategoryID = '';\n }\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 reusable: this.DrawerReusable,\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<MJQueryEntityExtended>('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 entity.Reusable = this.DrawerReusable;\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.UpdateQueryParams({ queryId: refreshed.ID });\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 void 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.resetSelectedQueryRunState();\n this.UpdateQueryParams({ queryId: null });\n this.NotifyDisplayNameChanged('Queries');\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: MJQueryEntityExtended): string {\n return query.ID;\n }\n\n // ========================================\n // Deep Linking\n // ========================================\n\n /**\n * Select a query by ID, expanding the tree to show it.\n * Clears selection if no matching query is found.\n */\n private selectQueryById(queryId: string): void {\n const query = this.queries.find(q => UUIDsEqual(q.ID, queryId));\n if (query) {\n if (!UUIDsEqual(this.selectedQuery?.ID, query.ID)) {\n this.selectedQuery = query;\n this.resetSelectedQueryRunState();\n this.expandCategoryForQuery(query);\n this.NotifyDisplayNameChanged(query.Name || 'Query');\n }\n } else {\n this.selectedQuery = null;\n this.resetSelectedQueryRunState();\n this.NotifyDisplayNameChanged('Queries');\n }\n this.cdr.markForCheck();\n }\n\n /**\n * React to back/forward navigation or deep-link activation.\n * Called by the base class when the URL query params change externally.\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void {\n if (!this.dataLoaded) return;\n if (params['queryId']) {\n this.selectQueryById(params['queryId']);\n } else {\n this.selectedQuery = null;\n this.resetSelectedQueryRunState();\n this.NotifyDisplayNameChanged('Queries');\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Expands the category tree to show the given query\n */\n private expandCategoryForQuery(query: MJQueryEntityExtended): 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: MJQueryEntityExtended): 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 <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-database\"\n Title=\"No queries available\" />\n }\n\n <!-- No results -->\n @if (!isLoading && searchText && filteredQueries.length === 0) {\n <mj-empty-state Size=\"compact\" Variant=\"no-results\"\n Title=\"No queries found\"\n [Message]=\"NoQueryResultsMessage\" />\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 <mj-empty-state class=\"no-selection\" Icon=\"fa-solid fa-hand-pointer\"\n Title=\"Select a query from the list\"\n Message=\"Click on a query to view and run it\"\n [ActionText]=\"CanCreateQuery ? 'New Query' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"OpenCreateDrawer()\" />\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 (QueryComplete)=\"onViewerQueryComplete($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 @if (CanCreateQuery && node.category.ID !== '__uncategorized__') {\n <button class=\"category-add-btn\"\n (click)=\"OpenCreateDrawer(node.category.ID); $event.stopPropagation()\"\n title=\"New query in {{ node.category.Name }}\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\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\" aria-label=\"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 <mj-tree-dropdown\n [BranchConfig]=\"CategoryBranchConfig\"\n [Value]=\"DrawerCategoryIDAsKey\"\n [SelectableTypes]=\"'branch'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Select category...'\"\n [EnableSearch]=\"true\"\n [Clearable]=\"true\"\n [Disabled]=\"IsSavingDrawer\"\n (ValueChange)=\"OnDrawerCategoryChange($event)\">\n </mj-tree-dropdown>\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 <!-- Reusable -->\n <div class=\"drawer-field drawer-field-inline\">\n <label class=\"mj-checkbox drawer-reusable-label\">\n <input type=\"checkbox\"\n [(ngModel)]=\"DrawerReusable\"\n [disabled]=\"IsSavingDrawer\">\n <span>Reusable</span>\n </label>\n <span class=\"drawer-field-hint\">Allow other queries to reference this query using composition syntax</span>\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"]}
|