@memberjunction/ng-dashboards 6.2.0-edge.6 → 6.2.0-edge.8
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/README.md +23 -16
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +2 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js +3 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js +3 -3
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +6 -4
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.js +8 -2
- package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +31 -10
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +14 -24
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +14 -7
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +4 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Actions/action-result-code.d.ts +80 -0
- package/dist/Actions/action-result-code.d.ts.map +1 -0
- package/dist/Actions/action-result-code.js +163 -0
- package/dist/Actions/action-result-code.js.map +1 -0
- package/dist/Actions/components/actions-overview.component.d.ts +8 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +12 -9
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +29 -9
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +65 -42
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +5 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +92 -130
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +189 -274
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts +29 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js +666 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts +56 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js +515 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts +14 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js +39 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts +17 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js +485 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts +139 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js +602 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js.map +1 -0
- package/dist/ChiefOfStaff/index.d.ts +4 -1
- package/dist/ChiefOfStaff/index.d.ts.map +1 -1
- package/dist/ChiefOfStaff/index.js +4 -1
- package/dist/ChiefOfStaff/index.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +3 -3
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +3 -0
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +21 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +32 -5
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +2 -2
- package/dist/DevTools/lazy-module-status.component.js +2 -2
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +5 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -2
- package/dist/Integration/services/integration-data.service.d.ts +1 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +4 -3
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +11 -3
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +16 -16
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts +113 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js +1184 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +21 -10
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.js +1 -0
- package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +1 -0
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +3 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js +1 -0
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +1 -0
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +26 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +375 -252
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts +8 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.js +22 -4
- package/dist/UserRoutines/user-routines-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +1 -0
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts +162 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js +1105 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts +27 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js +119 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts +105 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js +560 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts +163 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js +1054 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts +43 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js +412 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts +73 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js +271 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js.map +1 -0
- package/dist/VideoStudio/index.d.ts +12 -0
- package/dist/VideoStudio/index.d.ts.map +1 -0
- package/dist/VideoStudio/index.js +12 -0
- package/dist/VideoStudio/index.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts +118 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js +964 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts +70 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js +600 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts +182 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js +1481 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts +102 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js +240 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts +495 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.js +992 -0
- package/dist/VideoStudio/video-studio-agent-context.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +46 -41
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +33 -7
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- 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 +8 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +10 -2
- package/dist/public-api.js.map +1 -1
- package/dist/shared/action-scheduled-job.d.ts.map +1 -1
- package/dist/shared/action-scheduled-job.js +2 -0
- package/dist/shared/action-scheduled-job.js.map +1 -1
- package/dist/video-studio-dashboards.module.d.ts +40 -0
- package/dist/video-studio-dashboards.module.d.ts.map +1 -0
- package/dist/video-studio-dashboards.module.js +159 -0
- package/dist/video-studio-dashboards.module.js.map +1 -0
- package/package.json +78 -71
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +0 -195
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +0 -1
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +0 -2910
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +0 -1
|
@@ -7,10 +7,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var QueryBrowserResourceComponent_1;
|
|
8
8
|
import { Component, ChangeDetectionStrategy, HostListener, ViewChild } from '@angular/core';
|
|
9
9
|
import { Subject } from 'rxjs';
|
|
10
|
-
import { GroupByUUID, RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
10
|
+
import { GroupByUUID, IndexByUUID, RegisterClass, UUIDSet, UUIDsEqual } from '@memberjunction/global';
|
|
11
11
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
12
12
|
import { CompositeKey, RunQuery } from '@memberjunction/core';
|
|
13
|
-
import { UserInfoEngine, QueryEngine } from '@memberjunction/core-entities';
|
|
13
|
+
import { UserInfoEngine, QueryEngine, ParseQuerySaveMessage } from '@memberjunction/core-entities';
|
|
14
14
|
import { ValidateStringParam, BoundNameList } from '../shared/agent-tool-validation';
|
|
15
15
|
import { DEFAULT_QUERY_MAX_ROWS, QUERY_MAX_ROWS_HARD_CAP, DEFAULT_QUERY_PAGE_SIZE, NormalizeMaxRows, ComputePaging, BoundResultRows, NormalizeQueryParameters, ResolveTotalRowCount, } from './query-execution-helpers';
|
|
16
16
|
import * as i0 from "@angular/core";
|
|
@@ -25,95 +25,102 @@ const _c0 = ["drawerSqlEditor"];
|
|
|
25
25
|
const _c1 = a0 => ({ node: a0 });
|
|
26
26
|
function QueryBrowserResourceComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
27
27
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
28
|
-
i0.ɵɵelementStart(0, "button",
|
|
28
|
+
i0.ɵɵelementStart(0, "button", 35);
|
|
29
29
|
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenCreateDrawer()); });
|
|
30
|
-
i0.ɵɵelement(1, "i",
|
|
30
|
+
i0.ɵɵelement(1, "i", 36);
|
|
31
31
|
i0.ɵɵelementEnd();
|
|
32
32
|
} }
|
|
33
|
-
function
|
|
33
|
+
function QueryBrowserResourceComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
34
34
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
35
|
-
i0.ɵɵelementStart(0, "button",
|
|
36
|
-
i0.ɵɵlistener("click", function
|
|
37
|
-
i0.ɵɵelement(1, "i",
|
|
35
|
+
i0.ɵɵelementStart(0, "button", 37);
|
|
36
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_17_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenRefreshForAll()); });
|
|
37
|
+
i0.ɵɵelement(1, "i", 38);
|
|
38
38
|
i0.ɵɵelementEnd();
|
|
39
39
|
} }
|
|
40
|
-
function
|
|
40
|
+
function QueryBrowserResourceComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
41
41
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
42
|
-
i0.ɵɵelementStart(0, "button",
|
|
43
|
-
i0.ɵɵlistener("click", function
|
|
44
|
-
i0.ɵɵelement(1, "i",
|
|
42
|
+
i0.ɵɵelementStart(0, "button", 39);
|
|
43
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_22_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
|
|
44
|
+
i0.ɵɵelement(1, "i", 40);
|
|
45
|
+
i0.ɵɵelementEnd();
|
|
46
|
+
} }
|
|
47
|
+
function QueryBrowserResourceComponent_For_25_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
49
|
+
i0.ɵɵelementStart(0, "button", 42);
|
|
50
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_For_25_Conditional_0_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const status_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleStatusFilter(status_r6)); });
|
|
51
|
+
i0.ɵɵelement(1, "i", 43);
|
|
45
52
|
i0.ɵɵelementStart(2, "span");
|
|
46
53
|
i0.ɵɵtext(3);
|
|
47
54
|
i0.ɵɵelementEnd();
|
|
48
|
-
i0.ɵɵelementStart(4, "span",
|
|
55
|
+
i0.ɵɵelementStart(4, "span", 44);
|
|
49
56
|
i0.ɵɵtext(5);
|
|
50
57
|
i0.ɵɵelementEnd()();
|
|
51
58
|
} if (rf & 2) {
|
|
52
|
-
const
|
|
59
|
+
const status_r6 = i0.ɵɵnextContext().$implicit;
|
|
53
60
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
54
|
-
i0.ɵɵstyleProp("--chip-color", ctx_r1.getStatusColor(
|
|
55
|
-
i0.ɵɵclassProp("active", ctx_r1.StatusFilters[
|
|
56
|
-
i0.ɵɵproperty("title", (ctx_r1.StatusFilters[
|
|
61
|
+
i0.ɵɵstyleProp("--chip-color", ctx_r1.getStatusColor(status_r6));
|
|
62
|
+
i0.ɵɵclassProp("active", ctx_r1.StatusFilters[status_r6]);
|
|
63
|
+
i0.ɵɵproperty("title", (ctx_r1.StatusFilters[status_r6] ? "Hide" : "Show") + " " + status_r6 + " queries");
|
|
57
64
|
i0.ɵɵadvance();
|
|
58
|
-
i0.ɵɵclassMap(ctx_r1.getStatusIcon(
|
|
65
|
+
i0.ɵɵclassMap(ctx_r1.getStatusIcon(status_r6));
|
|
59
66
|
i0.ɵɵadvance(2);
|
|
60
|
-
i0.ɵɵtextInterpolate(
|
|
67
|
+
i0.ɵɵtextInterpolate(status_r6);
|
|
61
68
|
i0.ɵɵadvance(2);
|
|
62
|
-
i0.ɵɵtextInterpolate(ctx_r1.getStatusCount(
|
|
69
|
+
i0.ɵɵtextInterpolate(ctx_r1.getStatusCount(status_r6));
|
|
63
70
|
} }
|
|
64
|
-
function
|
|
65
|
-
i0.ɵɵconditionalCreate(0,
|
|
71
|
+
function QueryBrowserResourceComponent_For_25_Template(rf, ctx) { if (rf & 1) {
|
|
72
|
+
i0.ɵɵconditionalCreate(0, QueryBrowserResourceComponent_For_25_Conditional_0_Template, 6, 9, "button", 41);
|
|
66
73
|
} if (rf & 2) {
|
|
67
|
-
const
|
|
74
|
+
const status_r6 = ctx.$implicit;
|
|
68
75
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
69
|
-
i0.ɵɵconditional(ctx_r1.getStatusCount(
|
|
70
|
-
} }
|
|
71
|
-
function QueryBrowserResourceComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
72
|
-
i0.ɵɵelementStart(0, "div", 23);
|
|
73
|
-
i0.ɵɵelement(1, "mj-loading", 41);
|
|
74
|
-
i0.ɵɵelementEnd();
|
|
76
|
+
i0.ɵɵconditional(ctx_r1.getStatusCount(status_r6) > 0 ? 0 : -1);
|
|
75
77
|
} }
|
|
76
78
|
function QueryBrowserResourceComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
77
|
-
i0.ɵɵ
|
|
79
|
+
i0.ɵɵelementStart(0, "div", 24);
|
|
80
|
+
i0.ɵɵelement(1, "mj-loading", 45);
|
|
81
|
+
i0.ɵɵelementEnd();
|
|
78
82
|
} }
|
|
79
83
|
function QueryBrowserResourceComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
80
84
|
i0.ɵɵelement(0, "mj-empty-state", 25);
|
|
85
|
+
} }
|
|
86
|
+
function QueryBrowserResourceComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
+
i0.ɵɵelement(0, "mj-empty-state", 26);
|
|
81
88
|
} if (rf & 2) {
|
|
82
89
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
83
90
|
i0.ɵɵproperty("Message", ctx_r1.NoQueryResultsMessage);
|
|
84
91
|
} }
|
|
85
|
-
function
|
|
92
|
+
function QueryBrowserResourceComponent_Conditional_30_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
86
93
|
i0.ɵɵelementContainer(0);
|
|
87
94
|
} }
|
|
88
|
-
function
|
|
89
|
-
i0.ɵɵtemplate(0,
|
|
95
|
+
function QueryBrowserResourceComponent_Conditional_30_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
96
|
+
i0.ɵɵtemplate(0, QueryBrowserResourceComponent_Conditional_30_For_2_ng_container_0_Template, 1, 0, "ng-container", 46);
|
|
90
97
|
} if (rf & 2) {
|
|
91
|
-
const
|
|
98
|
+
const node_r7 = ctx.$implicit;
|
|
92
99
|
i0.ɵɵnextContext(2);
|
|
93
|
-
const
|
|
94
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
100
|
+
const categoryNode_r8 = i0.ɵɵreference(37);
|
|
101
|
+
i0.ɵɵproperty("ngTemplateOutlet", categoryNode_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, node_r7));
|
|
95
102
|
} }
|
|
96
|
-
function
|
|
97
|
-
i0.ɵɵelementStart(0, "div",
|
|
98
|
-
i0.ɵɵrepeaterCreate(1,
|
|
103
|
+
function QueryBrowserResourceComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelementStart(0, "div", 27);
|
|
105
|
+
i0.ɵɵrepeaterCreate(1, QueryBrowserResourceComponent_Conditional_30_For_2_Template, 1, 4, "ng-container", null, i0.ɵɵcomponentInstance().trackByCategory, true);
|
|
99
106
|
i0.ɵɵelementEnd();
|
|
100
107
|
} if (rf & 2) {
|
|
101
108
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
102
109
|
i0.ɵɵadvance();
|
|
103
110
|
i0.ɵɵrepeater(ctx_r1.categoryTree);
|
|
104
111
|
} }
|
|
105
|
-
function
|
|
106
|
-
const
|
|
107
|
-
i0.ɵɵelementStart(0, "mj-empty-state",
|
|
108
|
-
i0.ɵɵlistener("Action", function
|
|
112
|
+
function QueryBrowserResourceComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
114
|
+
i0.ɵɵelementStart(0, "mj-empty-state", 47);
|
|
115
|
+
i0.ɵɵlistener("Action", function QueryBrowserResourceComponent_Conditional_34_Template_mj_empty_state_Action_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenCreateDrawer()); });
|
|
109
116
|
i0.ɵɵelementEnd();
|
|
110
117
|
} if (rf & 2) {
|
|
111
118
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
112
119
|
i0.ɵɵproperty("ActionText", ctx_r1.CanCreateQuery ? "New Query" : "");
|
|
113
120
|
} }
|
|
114
|
-
function
|
|
115
|
-
i0.ɵɵelementStart(0, "span",
|
|
116
|
-
i0.ɵɵelement(1, "i",
|
|
121
|
+
function QueryBrowserResourceComponent_Conditional_35_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
122
|
+
i0.ɵɵelementStart(0, "span", 55);
|
|
123
|
+
i0.ɵɵelement(1, "i", 43);
|
|
117
124
|
i0.ɵɵtext(2);
|
|
118
125
|
i0.ɵɵelementEnd();
|
|
119
126
|
} if (rf & 2) {
|
|
@@ -124,35 +131,39 @@ function QueryBrowserResourceComponent_Conditional_34_Conditional_6_Template(rf,
|
|
|
124
131
|
i0.ɵɵadvance();
|
|
125
132
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.selectedQuery.Status, " ");
|
|
126
133
|
} }
|
|
127
|
-
function
|
|
128
|
-
i0.ɵɵelementStart(0, "span",
|
|
129
|
-
i0.ɵɵelement(1, "i",
|
|
134
|
+
function QueryBrowserResourceComponent_Conditional_35_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
135
|
+
i0.ɵɵelementStart(0, "span", 56);
|
|
136
|
+
i0.ɵɵelement(1, "i", 57);
|
|
130
137
|
i0.ɵɵtext(2, " Approved ");
|
|
131
138
|
i0.ɵɵelementEnd();
|
|
132
139
|
} if (rf & 2) {
|
|
133
140
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
134
141
|
i0.ɵɵstyleProp("background", ctx_r1.getStatusColor("Approved"));
|
|
135
142
|
} }
|
|
136
|
-
function
|
|
137
|
-
const
|
|
138
|
-
i0.ɵɵelementStart(0, "button",
|
|
139
|
-
i0.ɵɵlistener("click", function
|
|
140
|
-
i0.ɵɵelement(1, "i",
|
|
143
|
+
function QueryBrowserResourceComponent_Conditional_35_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
145
|
+
i0.ɵɵelementStart(0, "button", 58);
|
|
146
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_35_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenRefreshForQuery(ctx_r1.selectedQuery)); });
|
|
147
|
+
i0.ɵɵelement(1, "i", 38);
|
|
148
|
+
i0.ɵɵelementEnd();
|
|
149
|
+
i0.ɵɵelementStart(2, "button", 59);
|
|
150
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_35_Conditional_8_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenEditDrawer(ctx_r1.selectedQuery)); });
|
|
151
|
+
i0.ɵɵelement(3, "i", 60);
|
|
141
152
|
i0.ɵɵelementEnd();
|
|
142
153
|
} }
|
|
143
|
-
function
|
|
144
|
-
const
|
|
145
|
-
i0.ɵɵelementStart(0, "div",
|
|
146
|
-
i0.ɵɵelement(2, "i",
|
|
154
|
+
function QueryBrowserResourceComponent_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
155
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
156
|
+
i0.ɵɵelementStart(0, "div", 48)(1, "div", 49);
|
|
157
|
+
i0.ɵɵelement(2, "i", 50);
|
|
147
158
|
i0.ɵɵelementStart(3, "span");
|
|
148
159
|
i0.ɵɵtext(4);
|
|
149
160
|
i0.ɵɵelementEnd()();
|
|
150
|
-
i0.ɵɵelementStart(5, "div",
|
|
151
|
-
i0.ɵɵconditionalCreate(6,
|
|
152
|
-
i0.ɵɵconditionalCreate(8,
|
|
161
|
+
i0.ɵɵelementStart(5, "div", 51);
|
|
162
|
+
i0.ɵɵconditionalCreate(6, QueryBrowserResourceComponent_Conditional_35_Conditional_6_Template, 3, 5, "span", 52)(7, QueryBrowserResourceComponent_Conditional_35_Conditional_7_Template, 3, 2, "span", 53);
|
|
163
|
+
i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_Conditional_35_Conditional_8_Template, 4, 0);
|
|
153
164
|
i0.ɵɵelementEnd()();
|
|
154
|
-
i0.ɵɵelementStart(9, "mj-query-viewer",
|
|
155
|
-
i0.ɵɵlistener("EntityLinkClick", function
|
|
165
|
+
i0.ɵɵelementStart(9, "mj-query-viewer", 54);
|
|
166
|
+
i0.ɵɵlistener("EntityLinkClick", function QueryBrowserResourceComponent_Conditional_35_Template_mj_query_viewer_EntityLinkClick_9_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onEntityLinkClick($event)); })("RowDoubleClick", function QueryBrowserResourceComponent_Conditional_35_Template_mj_query_viewer_RowDoubleClick_9_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRowDoubleClick($event)); })("OpenQueryRecord", function QueryBrowserResourceComponent_Conditional_35_Template_mj_query_viewer_OpenQueryRecord_9_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenQueryRecord($event)); })("CompositionTokenClick", function QueryBrowserResourceComponent_Conditional_35_Template_mj_query_viewer_CompositionTokenClick_9_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCompositionTokenClick($event)); })("QueryComplete", function QueryBrowserResourceComponent_Conditional_35_Template_mj_query_viewer_QueryComplete_9_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewerQueryComplete($event)); });
|
|
156
167
|
i0.ɵɵelementEnd();
|
|
157
168
|
} if (rf & 2) {
|
|
158
169
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -165,158 +176,172 @@ function QueryBrowserResourceComponent_Conditional_34_Template(rf, ctx) { if (rf
|
|
|
165
176
|
i0.ɵɵadvance();
|
|
166
177
|
i0.ɵɵproperty("QueryId", ctx_r1.selectedQuery.ID)("AutoRun", true)("SelectionMode", "multiple");
|
|
167
178
|
} }
|
|
168
|
-
function
|
|
169
|
-
const
|
|
170
|
-
i0.ɵɵelementStart(0, "button",
|
|
171
|
-
i0.ɵɵlistener("click", function
|
|
172
|
-
i0.ɵɵelement(1, "i",
|
|
179
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
180
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
181
|
+
i0.ɵɵelementStart(0, "button", 71);
|
|
182
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_8_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const node_r13 = i0.ɵɵnextContext(2).node; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenRefreshForCategory(node_r13, $event)); });
|
|
183
|
+
i0.ɵɵelement(1, "i", 38);
|
|
173
184
|
i0.ɵɵelementEnd();
|
|
174
185
|
} if (rf & 2) {
|
|
175
|
-
const
|
|
176
|
-
i0.ɵɵproperty("title",
|
|
186
|
+
const node_r13 = i0.ɵɵnextContext(2).node;
|
|
187
|
+
i0.ɵɵproperty("title", "Refresh the metadata of the queries in " + node_r13.category.Name + " (dry run first)");
|
|
188
|
+
i0.ɵɵattribute("aria-label", "Refresh the metadata of the queries in " + node_r13.category.Name);
|
|
177
189
|
} }
|
|
178
|
-
function
|
|
179
|
-
i0.ɵɵ
|
|
190
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
191
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
192
|
+
i0.ɵɵelementStart(0, "button", 72);
|
|
193
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_9_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r15); const node_r13 = i0.ɵɵnextContext(2).node; const ctx_r1 = i0.ɵɵnextContext(); ctx_r1.OpenCreateDrawer(node_r13.category.ID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
194
|
+
i0.ɵɵelement(1, "i", 36);
|
|
195
|
+
i0.ɵɵelementEnd();
|
|
196
|
+
} if (rf & 2) {
|
|
197
|
+
const node_r13 = i0.ɵɵnextContext(2).node;
|
|
198
|
+
i0.ɵɵproperty("title", i0.ɵɵinterpolate1("New query in ", node_r13.category.Name));
|
|
199
|
+
} }
|
|
200
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
201
|
+
i0.ɵɵelementStart(0, "span", 79);
|
|
180
202
|
i0.ɵɵtext(1);
|
|
181
203
|
i0.ɵɵelementEnd();
|
|
182
204
|
} if (rf & 2) {
|
|
183
|
-
const
|
|
205
|
+
const query_r17 = i0.ɵɵnextContext().$implicit;
|
|
184
206
|
i0.ɵɵadvance();
|
|
185
|
-
i0.ɵɵtextInterpolate(
|
|
207
|
+
i0.ɵɵtextInterpolate(query_r17.Description);
|
|
186
208
|
} }
|
|
187
|
-
function
|
|
188
|
-
i0.ɵɵelement(0, "i",
|
|
209
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
210
|
+
i0.ɵɵelement(0, "i", 80);
|
|
189
211
|
} }
|
|
190
|
-
function
|
|
191
|
-
i0.ɵɵelementStart(0, "span",
|
|
212
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
213
|
+
i0.ɵɵelementStart(0, "span", 83);
|
|
192
214
|
i0.ɵɵtext(1);
|
|
193
215
|
i0.ɵɵelementEnd();
|
|
194
216
|
} if (rf & 2) {
|
|
195
|
-
const
|
|
217
|
+
const query_r17 = i0.ɵɵnextContext().$implicit;
|
|
196
218
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
197
|
-
i0.ɵɵstyleProp("background", ctx_r1.getStatusColor(
|
|
198
|
-
i0.ɵɵproperty("title",
|
|
219
|
+
i0.ɵɵstyleProp("background", ctx_r1.getStatusColor(query_r17.Status));
|
|
220
|
+
i0.ɵɵproperty("title", query_r17.Status);
|
|
199
221
|
i0.ɵɵadvance();
|
|
200
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
222
|
+
i0.ɵɵtextInterpolate1(" ", query_r17.Status, " ");
|
|
201
223
|
} }
|
|
202
|
-
function
|
|
203
|
-
const
|
|
204
|
-
i0.ɵɵelementStart(0, "button",
|
|
205
|
-
i0.ɵɵlistener("click", function
|
|
206
|
-
i0.ɵɵelement(1, "i",
|
|
224
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
225
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
226
|
+
i0.ɵɵelementStart(0, "button", 84);
|
|
227
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_9_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r18); const query_r17 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenEditDrawer(query_r17, $event)); });
|
|
228
|
+
i0.ɵɵelement(1, "i", 60);
|
|
207
229
|
i0.ɵɵelementEnd();
|
|
208
230
|
} }
|
|
209
|
-
function
|
|
210
|
-
const
|
|
211
|
-
i0.ɵɵelementStart(0, "div",
|
|
212
|
-
i0.ɵɵlistener("click", function
|
|
213
|
-
i0.ɵɵelement(1, "span",
|
|
214
|
-
i0.ɵɵelementStart(3, "div",
|
|
231
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
232
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
233
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
234
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Template_div_click_0_listener($event) { const query_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.selectQuery(query_r17, $event)); });
|
|
235
|
+
i0.ɵɵelement(1, "span", 75)(2, "i", 76);
|
|
236
|
+
i0.ɵɵelementStart(3, "div", 77)(4, "span", 78);
|
|
215
237
|
i0.ɵɵtext(5);
|
|
216
238
|
i0.ɵɵelementEnd();
|
|
217
|
-
i0.ɵɵconditionalCreate(6,
|
|
239
|
+
i0.ɵɵconditionalCreate(6, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_6_Template, 2, 1, "span", 79);
|
|
218
240
|
i0.ɵɵelementEnd();
|
|
219
|
-
i0.ɵɵconditionalCreate(7,
|
|
220
|
-
i0.ɵɵconditionalCreate(8,
|
|
221
|
-
i0.ɵɵconditionalCreate(9,
|
|
241
|
+
i0.ɵɵconditionalCreate(7, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_7_Template, 1, 0, "i", 80);
|
|
242
|
+
i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_8_Template, 2, 4, "span", 81);
|
|
243
|
+
i0.ɵɵconditionalCreate(9, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Conditional_9_Template, 2, 0, "button", 82);
|
|
222
244
|
i0.ɵɵelementEnd();
|
|
223
245
|
} if (rf & 2) {
|
|
224
|
-
const
|
|
246
|
+
const query_r17 = ctx.$implicit;
|
|
225
247
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
226
|
-
i0.ɵɵclassProp("selected", ctx_r1.IsQuerySelected(
|
|
248
|
+
i0.ɵɵclassProp("selected", ctx_r1.IsQuerySelected(query_r17))("hidden", !ctx_r1.isQueryVisible(query_r17));
|
|
227
249
|
i0.ɵɵadvance();
|
|
228
|
-
i0.ɵɵstyleProp("background", ctx_r1.getStatusColor(
|
|
229
|
-
i0.ɵɵproperty("title",
|
|
250
|
+
i0.ɵɵstyleProp("background", ctx_r1.getStatusColor(query_r17.Status));
|
|
251
|
+
i0.ɵɵproperty("title", query_r17.Status);
|
|
230
252
|
i0.ɵɵadvance(2);
|
|
231
|
-
i0.ɵɵproperty("title",
|
|
253
|
+
i0.ɵɵproperty("title", query_r17.Description || query_r17.Name);
|
|
232
254
|
i0.ɵɵadvance(2);
|
|
233
|
-
i0.ɵɵtextInterpolate(
|
|
255
|
+
i0.ɵɵtextInterpolate(query_r17.Name);
|
|
234
256
|
i0.ɵɵadvance();
|
|
235
|
-
i0.ɵɵconditional(
|
|
257
|
+
i0.ɵɵconditional(query_r17.Description ? 6 : -1);
|
|
236
258
|
i0.ɵɵadvance();
|
|
237
|
-
i0.ɵɵconditional(
|
|
259
|
+
i0.ɵɵconditional(query_r17.UsesTemplate ? 7 : -1);
|
|
238
260
|
i0.ɵɵadvance();
|
|
239
|
-
i0.ɵɵconditional(
|
|
261
|
+
i0.ɵɵconditional(query_r17.Status !== "Approved" ? 8 : -1);
|
|
240
262
|
i0.ɵɵadvance();
|
|
241
263
|
i0.ɵɵconditional(ctx_r1.CanEditQuery ? 9 : -1);
|
|
242
264
|
} }
|
|
243
|
-
function
|
|
244
|
-
i0.ɵɵelementStart(0, "div",
|
|
245
|
-
i0.ɵɵrepeaterCreate(1,
|
|
265
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
266
|
+
i0.ɵɵelementStart(0, "div", 70);
|
|
267
|
+
i0.ɵɵrepeaterCreate(1, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_For_2_Template, 10, 13, "div", 73, i0.ɵɵcomponentInstance().trackByQuery, true);
|
|
246
268
|
i0.ɵɵelementEnd();
|
|
247
269
|
} if (rf & 2) {
|
|
248
|
-
const
|
|
270
|
+
const node_r13 = i0.ɵɵnextContext(2).node;
|
|
249
271
|
i0.ɵɵadvance();
|
|
250
|
-
i0.ɵɵrepeater(
|
|
272
|
+
i0.ɵɵrepeater(node_r13.queries);
|
|
251
273
|
} }
|
|
252
|
-
function
|
|
274
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_11_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
253
275
|
i0.ɵɵelementContainer(0);
|
|
254
276
|
} }
|
|
255
|
-
function
|
|
256
|
-
i0.ɵɵtemplate(0,
|
|
277
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_11_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
278
|
+
i0.ɵɵtemplate(0, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_11_For_1_ng_container_0_Template, 1, 0, "ng-container", 46);
|
|
257
279
|
} if (rf & 2) {
|
|
258
|
-
const
|
|
280
|
+
const child_r19 = ctx.$implicit;
|
|
259
281
|
i0.ɵɵnextContext(4);
|
|
260
|
-
const
|
|
261
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
282
|
+
const categoryNode_r8 = i0.ɵɵreference(37);
|
|
283
|
+
i0.ɵɵproperty("ngTemplateOutlet", categoryNode_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, child_r19));
|
|
262
284
|
} }
|
|
263
|
-
function
|
|
264
|
-
i0.ɵɵrepeaterCreate(0,
|
|
285
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
286
|
+
i0.ɵɵrepeaterCreate(0, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_11_For_1_Template, 1, 4, "ng-container", null, i0.ɵɵcomponentInstance().trackByCategory, true);
|
|
265
287
|
} if (rf & 2) {
|
|
266
|
-
const
|
|
267
|
-
i0.ɵɵrepeater(
|
|
288
|
+
const node_r13 = i0.ɵɵnextContext(2).node;
|
|
289
|
+
i0.ɵɵrepeater(node_r13.children);
|
|
268
290
|
} }
|
|
269
|
-
function
|
|
270
|
-
const
|
|
271
|
-
i0.ɵɵelementStart(0, "div",
|
|
272
|
-
i0.ɵɵlistener("click", function
|
|
273
|
-
i0.ɵɵelement(2, "i",
|
|
274
|
-
i0.ɵɵelementStart(4, "span",
|
|
291
|
+
function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
292
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
293
|
+
i0.ɵɵelementStart(0, "div", 62)(1, "div", 63);
|
|
294
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_36_Conditional_0_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r12); const node_r13 = i0.ɵɵnextContext().node; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleExpand(node_r13)); });
|
|
295
|
+
i0.ɵɵelement(2, "i", 64)(3, "i", 65);
|
|
296
|
+
i0.ɵɵelementStart(4, "span", 66);
|
|
275
297
|
i0.ɵɵtext(5);
|
|
276
298
|
i0.ɵɵelementEnd();
|
|
277
|
-
i0.ɵɵelementStart(6, "span",
|
|
299
|
+
i0.ɵɵelementStart(6, "span", 67);
|
|
278
300
|
i0.ɵɵtext(7);
|
|
279
301
|
i0.ɵɵelementEnd();
|
|
280
|
-
i0.ɵɵconditionalCreate(8,
|
|
302
|
+
i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_8_Template, 2, 2, "button", 68);
|
|
303
|
+
i0.ɵɵconditionalCreate(9, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_9_Template, 2, 2, "button", 69);
|
|
281
304
|
i0.ɵɵelementEnd();
|
|
282
|
-
i0.ɵɵconditionalCreate(
|
|
283
|
-
i0.ɵɵconditionalCreate(
|
|
305
|
+
i0.ɵɵconditionalCreate(10, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_10_Template, 3, 0, "div", 70);
|
|
306
|
+
i0.ɵɵconditionalCreate(11, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Conditional_11_Template, 2, 0);
|
|
284
307
|
i0.ɵɵelementEnd();
|
|
285
308
|
} if (rf & 2) {
|
|
286
|
-
const
|
|
309
|
+
const node_r13 = i0.ɵɵnextContext().node;
|
|
287
310
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
288
|
-
i0.ɵɵstyleProp("padding-left",
|
|
289
|
-
i0.ɵɵclassProp("expanded",
|
|
311
|
+
i0.ɵɵstyleProp("padding-left", node_r13.level * 16 + 8, "px");
|
|
312
|
+
i0.ɵɵclassProp("expanded", node_r13.expanded);
|
|
290
313
|
i0.ɵɵadvance(2);
|
|
291
|
-
i0.ɵɵclassProp("fa-chevron-down",
|
|
314
|
+
i0.ɵɵclassProp("fa-chevron-down", node_r13.expanded)("fa-chevron-right", !node_r13.expanded);
|
|
292
315
|
i0.ɵɵadvance();
|
|
293
|
-
i0.ɵɵclassProp("fa-folder-open",
|
|
316
|
+
i0.ɵɵclassProp("fa-folder-open", node_r13.expanded);
|
|
294
317
|
i0.ɵɵadvance(2);
|
|
295
|
-
i0.ɵɵtextInterpolate(
|
|
318
|
+
i0.ɵɵtextInterpolate(node_r13.category.Name);
|
|
296
319
|
i0.ɵɵadvance(2);
|
|
297
|
-
i0.ɵɵtextInterpolate1("(", ctx_r1.getNodeQueryCount(
|
|
320
|
+
i0.ɵɵtextInterpolate1("(", ctx_r1.getNodeQueryCount(node_r13), ")");
|
|
321
|
+
i0.ɵɵadvance();
|
|
322
|
+
i0.ɵɵconditional(ctx_r1.CanEditQuery && node_r13.category.ID !== "__uncategorized__" ? 8 : -1);
|
|
298
323
|
i0.ɵɵadvance();
|
|
299
|
-
i0.ɵɵconditional(ctx_r1.CanCreateQuery &&
|
|
324
|
+
i0.ɵɵconditional(ctx_r1.CanCreateQuery && node_r13.category.ID !== "__uncategorized__" ? 9 : -1);
|
|
300
325
|
i0.ɵɵadvance();
|
|
301
|
-
i0.ɵɵconditional(
|
|
326
|
+
i0.ɵɵconditional(node_r13.expanded ? 10 : -1);
|
|
302
327
|
i0.ɵɵadvance();
|
|
303
|
-
i0.ɵɵconditional(
|
|
328
|
+
i0.ɵɵconditional(node_r13.expanded ? 11 : -1);
|
|
304
329
|
} }
|
|
305
|
-
function
|
|
306
|
-
i0.ɵɵconditionalCreate(0,
|
|
330
|
+
function QueryBrowserResourceComponent_ng_template_36_Template(rf, ctx) { if (rf & 1) {
|
|
331
|
+
i0.ɵɵconditionalCreate(0, QueryBrowserResourceComponent_ng_template_36_Conditional_0_Template, 12, 16, "div", 61);
|
|
307
332
|
} if (rf & 2) {
|
|
308
|
-
const
|
|
333
|
+
const node_r13 = ctx.node;
|
|
309
334
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
310
|
-
i0.ɵɵconditional(ctx_r1.hasVisibleContent(
|
|
335
|
+
i0.ɵɵconditional(ctx_r1.hasVisibleContent(node_r13) ? 0 : -1);
|
|
311
336
|
} }
|
|
312
|
-
function
|
|
313
|
-
const
|
|
314
|
-
i0.ɵɵelementStart(0, "div",
|
|
315
|
-
i0.ɵɵlistener("click", function
|
|
337
|
+
function QueryBrowserResourceComponent_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
338
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
339
|
+
i0.ɵɵelementStart(0, "div", 85);
|
|
340
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrawerBackdropClick()); });
|
|
316
341
|
i0.ɵɵelementEnd();
|
|
317
342
|
} }
|
|
318
|
-
function
|
|
319
|
-
i0.ɵɵelementStart(0, "div",
|
|
343
|
+
function QueryBrowserResourceComponent_Conditional_39_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
344
|
+
i0.ɵɵelementStart(0, "div", 89);
|
|
320
345
|
i0.ɵɵtext(1);
|
|
321
346
|
i0.ɵɵelementEnd();
|
|
322
347
|
} if (rf & 2) {
|
|
@@ -324,35 +349,41 @@ function QueryBrowserResourceComponent_Conditional_38_Conditional_7_Template(rf,
|
|
|
324
349
|
i0.ɵɵadvance();
|
|
325
350
|
i0.ɵɵtextInterpolate(ctx_r1.DrawerName);
|
|
326
351
|
} }
|
|
327
|
-
function
|
|
328
|
-
i0.ɵɵelementStart(0, "span",
|
|
352
|
+
function QueryBrowserResourceComponent_Conditional_39_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
353
|
+
i0.ɵɵelementStart(0, "span", 96);
|
|
329
354
|
i0.ɵɵtext(1, "Name is required");
|
|
330
355
|
i0.ɵɵelementEnd();
|
|
331
356
|
} }
|
|
332
|
-
function
|
|
333
|
-
i0.ɵɵelementStart(0, "option",
|
|
357
|
+
function QueryBrowserResourceComponent_Conditional_39_For_28_Template(rf, ctx) { if (rf & 1) {
|
|
358
|
+
i0.ɵɵelementStart(0, "option", 101);
|
|
334
359
|
i0.ɵɵtext(1);
|
|
335
360
|
i0.ɵɵelementEnd();
|
|
336
361
|
} if (rf & 2) {
|
|
337
|
-
const
|
|
338
|
-
i0.ɵɵproperty("value",
|
|
362
|
+
const s_r22 = ctx.$implicit;
|
|
363
|
+
i0.ɵɵproperty("value", s_r22);
|
|
339
364
|
i0.ɵɵadvance();
|
|
340
|
-
i0.ɵɵtextInterpolate(
|
|
365
|
+
i0.ɵɵtextInterpolate(s_r22);
|
|
341
366
|
} }
|
|
342
|
-
function
|
|
343
|
-
const
|
|
344
|
-
i0.ɵɵelementStart(0, "div",
|
|
345
|
-
i0.ɵɵelement(1, "i",
|
|
367
|
+
function QueryBrowserResourceComponent_Conditional_39_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
368
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
369
|
+
i0.ɵɵelementStart(0, "div", 108);
|
|
370
|
+
i0.ɵɵelement(1, "i", 115);
|
|
346
371
|
i0.ɵɵtext(2, " To manage Parameters, Fields, and Permissions \u2014 ");
|
|
347
|
-
i0.ɵɵelementStart(3, "button",
|
|
348
|
-
i0.ɵɵlistener("click", function
|
|
372
|
+
i0.ɵɵelementStart(3, "button", 116);
|
|
373
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_39_Conditional_45_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenFullRecord()); });
|
|
349
374
|
i0.ɵɵtext(4, " Open full record ");
|
|
350
|
-
i0.ɵɵelement(5, "i",
|
|
375
|
+
i0.ɵɵelement(5, "i", 117);
|
|
351
376
|
i0.ɵɵelementEnd()();
|
|
352
377
|
} }
|
|
353
|
-
function
|
|
354
|
-
i0.ɵɵ
|
|
355
|
-
|
|
378
|
+
function QueryBrowserResourceComponent_Conditional_39_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
379
|
+
i0.ɵɵelement(0, "mj-query-diagnostics", 110);
|
|
380
|
+
} if (rf & 2) {
|
|
381
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
382
|
+
i0.ɵɵproperty("Headline", ctx_r1.DrawerSaveError)("Diagnostics", ctx_r1.DrawerSaveDiagnostics);
|
|
383
|
+
} }
|
|
384
|
+
function QueryBrowserResourceComponent_Conditional_39_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
385
|
+
i0.ɵɵelementStart(0, "div", 111);
|
|
386
|
+
i0.ɵɵelement(1, "i", 118);
|
|
356
387
|
i0.ɵɵtext(2);
|
|
357
388
|
i0.ɵɵelementEnd();
|
|
358
389
|
} if (rf & 2) {
|
|
@@ -360,83 +391,83 @@ function QueryBrowserResourceComponent_Conditional_38_Conditional_47_Template(rf
|
|
|
360
391
|
i0.ɵɵadvance(2);
|
|
361
392
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.DrawerSaveError, " ");
|
|
362
393
|
} }
|
|
363
|
-
function
|
|
364
|
-
i0.ɵɵelement(0, "i",
|
|
394
|
+
function QueryBrowserResourceComponent_Conditional_39_Conditional_51_Template(rf, ctx) { if (rf & 1) {
|
|
395
|
+
i0.ɵɵelement(0, "i", 119);
|
|
365
396
|
i0.ɵɵtext(1, " Saving... ");
|
|
366
397
|
} }
|
|
367
|
-
function
|
|
368
|
-
i0.ɵɵelement(0, "i",
|
|
398
|
+
function QueryBrowserResourceComponent_Conditional_39_Conditional_52_Template(rf, ctx) { if (rf & 1) {
|
|
399
|
+
i0.ɵɵelement(0, "i", 120);
|
|
369
400
|
i0.ɵɵtext(1, " Save ");
|
|
370
401
|
} }
|
|
371
|
-
function
|
|
372
|
-
const
|
|
373
|
-
i0.ɵɵelementStart(0, "div",
|
|
374
|
-
i0.ɵɵelement(3, "i",
|
|
375
|
-
i0.ɵɵelementStart(4, "div")(5, "div",
|
|
402
|
+
function QueryBrowserResourceComponent_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
403
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
404
|
+
i0.ɵɵelementStart(0, "div", 33)(1, "div", 86)(2, "div", 87);
|
|
405
|
+
i0.ɵɵelement(3, "i", 43);
|
|
406
|
+
i0.ɵɵelementStart(4, "div")(5, "div", 88);
|
|
376
407
|
i0.ɵɵtext(6);
|
|
377
408
|
i0.ɵɵelementEnd();
|
|
378
|
-
i0.ɵɵconditionalCreate(7,
|
|
409
|
+
i0.ɵɵconditionalCreate(7, QueryBrowserResourceComponent_Conditional_39_Conditional_7_Template, 2, 1, "div", 89);
|
|
379
410
|
i0.ɵɵelementEnd()();
|
|
380
|
-
i0.ɵɵelementStart(8, "button",
|
|
381
|
-
i0.ɵɵlistener("click", function
|
|
382
|
-
i0.ɵɵelement(9, "i",
|
|
411
|
+
i0.ɵɵelementStart(8, "button", 90);
|
|
412
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_39_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseDrawer()); });
|
|
413
|
+
i0.ɵɵelement(9, "i", 40);
|
|
383
414
|
i0.ɵɵelementEnd()();
|
|
384
|
-
i0.ɵɵelementStart(10, "div",
|
|
415
|
+
i0.ɵɵelementStart(10, "div", 91)(11, "div", 92)(12, "label", 93);
|
|
385
416
|
i0.ɵɵtext(13, "Name ");
|
|
386
|
-
i0.ɵɵelementStart(14, "span",
|
|
417
|
+
i0.ɵɵelementStart(14, "span", 94);
|
|
387
418
|
i0.ɵɵtext(15, "*");
|
|
388
419
|
i0.ɵɵelementEnd()();
|
|
389
|
-
i0.ɵɵelementStart(16, "input",
|
|
390
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
391
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
420
|
+
i0.ɵɵelementStart(16, "input", 95);
|
|
421
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_39_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DrawerName, $event) || (ctx_r1.DrawerName = $event); return i0.ɵɵresetView($event); });
|
|
422
|
+
i0.ɵɵlistener("ngModelChange", function QueryBrowserResourceComponent_Conditional_39_Template_input_ngModelChange_16_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.DrawerNameError = false); });
|
|
392
423
|
i0.ɵɵelementEnd();
|
|
393
|
-
i0.ɵɵconditionalCreate(17,
|
|
424
|
+
i0.ɵɵconditionalCreate(17, QueryBrowserResourceComponent_Conditional_39_Conditional_17_Template, 2, 0, "span", 96);
|
|
394
425
|
i0.ɵɵelementEnd();
|
|
395
|
-
i0.ɵɵelementStart(18, "div",
|
|
426
|
+
i0.ɵɵelementStart(18, "div", 97)(19, "div", 98)(20, "label", 93);
|
|
396
427
|
i0.ɵɵtext(21, "Category");
|
|
397
428
|
i0.ɵɵelementEnd();
|
|
398
|
-
i0.ɵɵelementStart(22, "mj-tree-dropdown",
|
|
399
|
-
i0.ɵɵlistener("ValueChange", function
|
|
429
|
+
i0.ɵɵelementStart(22, "mj-tree-dropdown", 99);
|
|
430
|
+
i0.ɵɵlistener("ValueChange", function QueryBrowserResourceComponent_Conditional_39_Template_mj_tree_dropdown_ValueChange_22_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrawerCategoryChange($event)); });
|
|
400
431
|
i0.ɵɵelementEnd()();
|
|
401
|
-
i0.ɵɵelementStart(23, "div",
|
|
432
|
+
i0.ɵɵelementStart(23, "div", 98)(24, "label", 93);
|
|
402
433
|
i0.ɵɵtext(25, "Status");
|
|
403
434
|
i0.ɵɵelementEnd();
|
|
404
|
-
i0.ɵɵelementStart(26, "select",
|
|
405
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
406
|
-
i0.ɵɵrepeaterCreate(27,
|
|
435
|
+
i0.ɵɵelementStart(26, "select", 100);
|
|
436
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_39_Template_select_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DrawerStatus, $event) || (ctx_r1.DrawerStatus = $event); return i0.ɵɵresetView($event); });
|
|
437
|
+
i0.ɵɵrepeaterCreate(27, QueryBrowserResourceComponent_Conditional_39_For_28_Template, 2, 2, "option", 101, i0.ɵɵrepeaterTrackByIdentity);
|
|
407
438
|
i0.ɵɵelementEnd()()();
|
|
408
|
-
i0.ɵɵelementStart(29, "div",
|
|
409
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
439
|
+
i0.ɵɵelementStart(29, "div", 102)(30, "label", 103)(31, "input", 104);
|
|
440
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_39_Template_input_ngModelChange_31_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DrawerReusable, $event) || (ctx_r1.DrawerReusable = $event); return i0.ɵɵresetView($event); });
|
|
410
441
|
i0.ɵɵelementEnd();
|
|
411
442
|
i0.ɵɵelementStart(32, "span");
|
|
412
443
|
i0.ɵɵtext(33, "Reusable");
|
|
413
444
|
i0.ɵɵelementEnd()();
|
|
414
|
-
i0.ɵɵelementStart(34, "span",
|
|
445
|
+
i0.ɵɵelementStart(34, "span", 96);
|
|
415
446
|
i0.ɵɵtext(35, "Allow other queries to reference this query using composition syntax");
|
|
416
447
|
i0.ɵɵelementEnd()();
|
|
417
|
-
i0.ɵɵelementStart(36, "div",
|
|
448
|
+
i0.ɵɵelementStart(36, "div", 92)(37, "label", 93);
|
|
418
449
|
i0.ɵɵtext(38, "Description");
|
|
419
450
|
i0.ɵɵelementEnd();
|
|
420
|
-
i0.ɵɵelementStart(39, "textarea",
|
|
421
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
451
|
+
i0.ɵɵelementStart(39, "textarea", 105);
|
|
452
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_39_Template_textarea_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DrawerDescription, $event) || (ctx_r1.DrawerDescription = $event); return i0.ɵɵresetView($event); });
|
|
422
453
|
i0.ɵɵelementEnd()();
|
|
423
|
-
i0.ɵɵelementStart(40, "div",
|
|
454
|
+
i0.ɵɵelementStart(40, "div", 106)(41, "label", 93);
|
|
424
455
|
i0.ɵɵtext(42, "SQL");
|
|
425
456
|
i0.ɵɵelementEnd();
|
|
426
|
-
i0.ɵɵelementStart(43, "mj-code-editor",
|
|
427
|
-
i0.ɵɵlistener("change", function
|
|
457
|
+
i0.ɵɵelementStart(43, "mj-code-editor", 107, 1);
|
|
458
|
+
i0.ɵɵlistener("change", function QueryBrowserResourceComponent_Conditional_39_Template_mj_code_editor_change_43_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrawerSQLChange($event)); });
|
|
428
459
|
i0.ɵɵelementEnd()();
|
|
429
|
-
i0.ɵɵconditionalCreate(45,
|
|
460
|
+
i0.ɵɵconditionalCreate(45, QueryBrowserResourceComponent_Conditional_39_Conditional_45_Template, 6, 0, "div", 108);
|
|
430
461
|
i0.ɵɵelementEnd();
|
|
431
|
-
i0.ɵɵelementStart(46, "div",
|
|
432
|
-
i0.ɵɵconditionalCreate(47,
|
|
433
|
-
i0.ɵɵelementStart(
|
|
434
|
-
i0.ɵɵlistener("click", function
|
|
435
|
-
i0.ɵɵconditionalCreate(
|
|
462
|
+
i0.ɵɵelementStart(46, "div", 109);
|
|
463
|
+
i0.ɵɵconditionalCreate(47, QueryBrowserResourceComponent_Conditional_39_Conditional_47_Template, 1, 2, "mj-query-diagnostics", 110)(48, QueryBrowserResourceComponent_Conditional_39_Conditional_48_Template, 3, 1, "div", 111);
|
|
464
|
+
i0.ɵɵelementStart(49, "div", 112)(50, "button", 113);
|
|
465
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_39_Template_button_click_50_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveDrawer()); });
|
|
466
|
+
i0.ɵɵconditionalCreate(51, QueryBrowserResourceComponent_Conditional_39_Conditional_51_Template, 2, 0)(52, QueryBrowserResourceComponent_Conditional_39_Conditional_52_Template, 2, 0);
|
|
436
467
|
i0.ɵɵelementEnd();
|
|
437
|
-
i0.ɵɵelementStart(
|
|
438
|
-
i0.ɵɵlistener("click", function
|
|
439
|
-
i0.ɵɵtext(
|
|
468
|
+
i0.ɵɵelementStart(53, "button", 114);
|
|
469
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_39_Template_button_click_53_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseDrawer()); });
|
|
470
|
+
i0.ɵɵtext(54, " Cancel ");
|
|
440
471
|
i0.ɵɵelementEnd()()()();
|
|
441
472
|
} if (rf & 2) {
|
|
442
473
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -471,11 +502,11 @@ function QueryBrowserResourceComponent_Conditional_38_Template(rf, ctx) { if (rf
|
|
|
471
502
|
i0.ɵɵadvance(2);
|
|
472
503
|
i0.ɵɵconditional(ctx_r1.DrawerMode === "edit" && ctx_r1.DrawerQueryId ? 45 : -1);
|
|
473
504
|
i0.ɵɵadvance(2);
|
|
474
|
-
i0.ɵɵconditional(ctx_r1.
|
|
475
|
-
i0.ɵɵadvance(
|
|
505
|
+
i0.ɵɵconditional(ctx_r1.DrawerSaveDiagnostics.length > 0 ? 47 : ctx_r1.DrawerSaveError ? 48 : -1);
|
|
506
|
+
i0.ɵɵadvance(3);
|
|
476
507
|
i0.ɵɵproperty("disabled", ctx_r1.IsSavingDrawer || !ctx_r1.DrawerName.trim());
|
|
477
508
|
i0.ɵɵadvance();
|
|
478
|
-
i0.ɵɵconditional(ctx_r1.IsSavingDrawer ?
|
|
509
|
+
i0.ɵɵconditional(ctx_r1.IsSavingDrawer ? 51 : 52);
|
|
479
510
|
i0.ɵɵadvance(2);
|
|
480
511
|
i0.ɵɵproperty("disabled", ctx_r1.IsSavingDrawer);
|
|
481
512
|
} }
|
|
@@ -617,6 +648,8 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
617
648
|
IsSavingDrawer = false;
|
|
618
649
|
DrawerNameError = false;
|
|
619
650
|
DrawerSaveError = null;
|
|
651
|
+
/** Why the drawer's last save was refused, one finding per rule the SQL broke. */
|
|
652
|
+
DrawerSaveDiagnostics = [];
|
|
620
653
|
/** Ordered status options for the drawer dropdown — all valid Query statuses */
|
|
621
654
|
DrawerStatuses = ['Pending', 'Approved', 'Rejected', 'Expired'];
|
|
622
655
|
initialDrawerSnapshot = '';
|
|
@@ -1560,6 +1593,84 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1560
1593
|
return false;
|
|
1561
1594
|
return entity.GetUserPermisions(this.metadata.CurrentUser).CanCreate;
|
|
1562
1595
|
}
|
|
1596
|
+
// ========================================
|
|
1597
|
+
// Refresh metadata (the selected query, a category, or all)
|
|
1598
|
+
// ========================================
|
|
1599
|
+
ShowRefreshDialog = false;
|
|
1600
|
+
RefreshScope = null;
|
|
1601
|
+
RefreshScopeLabel = '';
|
|
1602
|
+
/** Refreshes the metadata of one query (the selected one). */
|
|
1603
|
+
OpenRefreshForQuery(query) {
|
|
1604
|
+
this.openRefresh({ Kind: 'Queries', QueryIDs: [query.ID] }, `Query “${query.Name}”`);
|
|
1605
|
+
}
|
|
1606
|
+
/** Refreshes the metadata of every query in a category and the categories below it. */
|
|
1607
|
+
OpenRefreshForCategory(node, event) {
|
|
1608
|
+
event?.stopPropagation();
|
|
1609
|
+
const path = this.categoryPathOf(node.category);
|
|
1610
|
+
if (!path)
|
|
1611
|
+
return;
|
|
1612
|
+
this.openRefresh({ Kind: 'Category', CategoryPath: path }, `Category “${path}” and its subcategories`);
|
|
1613
|
+
}
|
|
1614
|
+
/** Refreshes the metadata of every query the user can read. */
|
|
1615
|
+
OpenRefreshForAll() {
|
|
1616
|
+
this.openRefresh({ Kind: 'All' }, 'All queries');
|
|
1617
|
+
}
|
|
1618
|
+
OnRefreshDialogClosed() {
|
|
1619
|
+
this.ShowRefreshDialog = false;
|
|
1620
|
+
this.cdr.markForCheck();
|
|
1621
|
+
}
|
|
1622
|
+
/** A refresh was applied: reload the list, keeping the selected query selected. */
|
|
1623
|
+
async OnRefreshApplied() {
|
|
1624
|
+
const selectedID = this.SelectedQuery?.ID ?? null;
|
|
1625
|
+
await this.loadData(true);
|
|
1626
|
+
if (selectedID) {
|
|
1627
|
+
const refreshed = this.Queries.find(q => UUIDsEqual(q.ID, selectedID));
|
|
1628
|
+
if (refreshed)
|
|
1629
|
+
this.SelectedQuery = refreshed;
|
|
1630
|
+
}
|
|
1631
|
+
this.cdr.markForCheck();
|
|
1632
|
+
}
|
|
1633
|
+
/** A query named in the refresh report: close the dialog and select it. */
|
|
1634
|
+
OnRefreshOpenQuery(queryID) {
|
|
1635
|
+
const query = this.Queries.find(q => UUIDsEqual(q.ID, queryID));
|
|
1636
|
+
this.ShowRefreshDialog = false;
|
|
1637
|
+
if (query) {
|
|
1638
|
+
this.expandCategoryForQuery(query);
|
|
1639
|
+
this.SelectQuery(query);
|
|
1640
|
+
}
|
|
1641
|
+
this.cdr.markForCheck();
|
|
1642
|
+
}
|
|
1643
|
+
openRefresh(scope, label) {
|
|
1644
|
+
this.RefreshScope = scope;
|
|
1645
|
+
this.RefreshScopeLabel = label;
|
|
1646
|
+
this.ShowRefreshDialog = true;
|
|
1647
|
+
this.cdr.markForCheck();
|
|
1648
|
+
}
|
|
1649
|
+
/** A category's full path (`Parent/Child`), as the refresh operation selects categories. */
|
|
1650
|
+
categoryPathOf(category) {
|
|
1651
|
+
const byID = IndexByUUID(this.Categories);
|
|
1652
|
+
const segments = [];
|
|
1653
|
+
const seen = new UUIDSet();
|
|
1654
|
+
let current = category;
|
|
1655
|
+
while (current && !seen.Has(current.ID)) {
|
|
1656
|
+
seen.Add(current.ID);
|
|
1657
|
+
segments.unshift(current.Name);
|
|
1658
|
+
current = current.ParentID ? byID.Get(current.ParentID) : undefined;
|
|
1659
|
+
}
|
|
1660
|
+
return segments.join('/');
|
|
1661
|
+
}
|
|
1662
|
+
/**
|
|
1663
|
+
* Shows why a drawer save failed: the server's findings (rule code, line, column, fix) when the
|
|
1664
|
+
* query's rules refused it, otherwise the server's message.
|
|
1665
|
+
*/
|
|
1666
|
+
showDrawerSaveFailure(message) {
|
|
1667
|
+
const parsed = ParseQuerySaveMessage(message);
|
|
1668
|
+
const isRuleRefusal = parsed.Diagnostics.some(d => d.Code !== null);
|
|
1669
|
+
this.DrawerSaveDiagnostics = isRuleRefusal ? [...parsed.Diagnostics] : [];
|
|
1670
|
+
this.DrawerSaveError = isRuleRefusal
|
|
1671
|
+
? (parsed.Headline ?? 'The query was not saved:')
|
|
1672
|
+
: (message?.trim() || 'Save failed. Please check your inputs and try again.');
|
|
1673
|
+
}
|
|
1563
1674
|
/** True when the current user has permission to edit queries. */
|
|
1564
1675
|
get CanEditQuery() {
|
|
1565
1676
|
const entity = this.metadata.EntityByName('MJ: Queries');
|
|
@@ -1589,6 +1700,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1589
1700
|
this.DrawerReusable = false;
|
|
1590
1701
|
this.DrawerNameError = false;
|
|
1591
1702
|
this.DrawerSaveError = null;
|
|
1703
|
+
this.DrawerSaveDiagnostics = [];
|
|
1592
1704
|
this.captureDrawerSnapshot();
|
|
1593
1705
|
this.ShowQueryDrawer = true;
|
|
1594
1706
|
this.cdr.markForCheck();
|
|
@@ -1611,6 +1723,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1611
1723
|
this.DrawerReusable = query.Reusable ?? false;
|
|
1612
1724
|
this.DrawerNameError = false;
|
|
1613
1725
|
this.DrawerSaveError = null;
|
|
1726
|
+
this.DrawerSaveDiagnostics = [];
|
|
1614
1727
|
this.captureDrawerSnapshot();
|
|
1615
1728
|
this.ShowQueryDrawer = true;
|
|
1616
1729
|
this.cdr.markForCheck();
|
|
@@ -1670,6 +1783,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1670
1783
|
async SaveDrawer() {
|
|
1671
1784
|
this.DrawerNameError = !this.DrawerName.trim();
|
|
1672
1785
|
this.DrawerSaveError = null;
|
|
1786
|
+
this.DrawerSaveDiagnostics = [];
|
|
1673
1787
|
if (this.DrawerNameError) {
|
|
1674
1788
|
this.cdr.markForCheck();
|
|
1675
1789
|
return;
|
|
@@ -1704,7 +1818,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1704
1818
|
}
|
|
1705
1819
|
}
|
|
1706
1820
|
else {
|
|
1707
|
-
this.
|
|
1821
|
+
this.showDrawerSaveFailure(entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage);
|
|
1708
1822
|
}
|
|
1709
1823
|
}
|
|
1710
1824
|
catch (e) {
|
|
@@ -1935,7 +2049,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1935
2049
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.drawerSqlEditor = _t.first);
|
|
1936
2050
|
} }, hostBindings: function QueryBrowserResourceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1937
2051
|
i0.ɵɵlistener("keydown.escape", function QueryBrowserResourceComponent_keydown_escape_HostBindingHandler() { return ctx.OnEscapeKey(); }, i0.ɵɵresolveDocument);
|
|
1938
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
2052
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 41, vars: 30, consts: [["categoryNode", ""], ["drawerSqlEditor", ""], [1, "query-browser-container"], [1, "query-tree-panel", 3, "id"], [1, "tree-header"], [1, "header-title"], [1, "fa-solid", "fa-database"], [1, "query-count"], [1, "header-actions"], ["title", "New Query", 1, "icon-btn"], ["title", "Expand all", 1, "icon-btn", 3, "click"], [1, "fa-solid", "fa-folder-open"], ["title", "Collapse all", 1, "icon-btn", 3, "click"], [1, "fa-solid", "fa-folder"], ["title", "Refresh", 1, "icon-btn", 3, "click"], [1, "fa-solid", "fa-refresh"], ["title", "Refresh the metadata of all queries (dry run first)", "aria-label", "Refresh the metadata of all queries", 1, "icon-btn"], [1, "tree-search"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search queries...", 1, "search-input", 3, "input", "value"], [1, "clear-btn"], [1, "status-filter-bar"], [1, "tree-content"], [1, "loading-state"], ["Size", "compact", "Icon", "fa-solid fa-database", "Title", "No queries available"], ["Size", "compact", "Variant", "no-results", "Title", "No queries found", 3, "Message"], [1, "category-tree"], ["role", "separator", "aria-orientation", "vertical", "aria-label", "Resize query list panel", "tabindex", "0", 1, "resize-handle", 3, "mousedown", "keydown"], [1, "resize-handle-grip"], [1, "query-viewer-panel"], ["Icon", "fa-solid fa-hand-pointer", "Title", "Select a query from the list", "Message", "Click on a query to view and run it", "ActionIcon", "fa-solid fa-plus", 1, "no-selection", 3, "ActionText"], [1, "query-drawer-backdrop"], [1, "query-drawer"], [3, "Closed", "Applied", "OpenQuery", "Visible", "Scope", "ScopeLabel", "AllowOpenQuery", "AllowSkipDryRun", "Provider"], ["title", "New Query", 1, "icon-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["title", "Refresh the metadata of all queries (dry run first)", "aria-label", "Refresh the metadata of all queries", 1, "icon-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "clear-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "status-filter-chip", 3, "active", "--chip-color", "title"], [1, "status-filter-chip", 3, "click", "title"], [1, "fa-solid"], [1, "chip-count"], ["text", "Loading queries..."], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], ["Icon", "fa-solid fa-hand-pointer", "Title", "Select a query from the list", "Message", "Click on a query to view and run it", "ActionIcon", "fa-solid fa-plus", 1, "no-selection", 3, "Action", "ActionText"], [1, "query-viewer-header"], [1, "query-viewer-title"], [1, "fa-solid", "fa-file-code"], [1, "query-viewer-header-actions"], [1, "query-viewer-status-pill", 3, "background"], [1, "query-viewer-status-pill", "approved", 3, "background"], [3, "EntityLinkClick", "RowDoubleClick", "OpenQueryRecord", "CompositionTokenClick", "QueryComplete", "QueryId", "AutoRun", "SelectionMode"], [1, "query-viewer-status-pill"], [1, "query-viewer-status-pill", "approved"], [1, "fa-solid", "fa-check-circle"], ["title", "Refresh this query's metadata (dry run first)", "aria-label", "Refresh this query's metadata", 1, "icon-btn", 3, "click"], ["title", "Edit Query", 1, "icon-btn", 3, "click"], [1, "fa-solid", "fa-pen-to-square"], [1, "category-item", 3, "expanded", "padding-left"], [1, "category-item"], [1, "category-header", 3, "click"], [1, "fa-solid", "expand-icon"], [1, "fa-solid", "fa-folder", "category-icon"], [1, "category-name"], [1, "category-count"], [1, "category-add-btn", "category-refresh-btn", 3, "title"], [1, "category-add-btn", 3, "title"], [1, "category-queries"], [1, "category-add-btn", "category-refresh-btn", 3, "click", "title"], [1, "category-add-btn", 3, "click", "title"], [1, "query-item", 3, "selected", "hidden"], [1, "query-item", 3, "click"], [1, "status-dot", 3, "title"], [1, "fa-solid", "fa-file-code", "query-icon"], [1, "query-info", 3, "title"], [1, "query-name"], [1, "query-description"], ["title", "Has parameters", 1, "fa-solid", "fa-sliders", "param-icon"], [1, "query-status-badge", 3, "background", "title"], ["title", "Edit query", 1, "query-details-btn"], [1, "query-status-badge", 3, "title"], ["title", "Edit query", 1, "query-details-btn", 3, "click"], [1, "query-drawer-backdrop", 3, "click"], [1, "query-drawer-header"], [1, "query-drawer-title"], [1, "query-drawer-title-main"], [1, "query-drawer-title-sub"], ["title", "Close", "aria-label", "Close", 1, "query-drawer-close", 3, "click"], [1, "query-drawer-body"], [1, "drawer-field"], [1, "drawer-label"], [1, "drawer-required"], ["type", "text", "placeholder", "Enter query name", 1, "drawer-input", 3, "ngModelChange", "ngModel", "disabled"], [1, "drawer-field-hint"], [1, "drawer-row"], [1, "drawer-field", "drawer-field-flex"], [3, "ValueChange", "BranchConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch", "Clearable", "Disabled"], [1, "drawer-select", 3, "ngModelChange", "ngModel", "disabled"], [3, "value"], [1, "drawer-field", "drawer-field-inline"], [1, "mj-checkbox", "drawer-reusable-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel", "disabled"], ["rows", "3", "placeholder", "Optional description", 1, "drawer-textarea", 3, "ngModelChange", "ngModel", "disabled"], [1, "drawer-field", "drawer-field-sql"], [1, "drawer-sql-editor", 3, "change", "language", "indentWithTab", "readonly"], [1, "drawer-full-record"], [1, "query-drawer-footer"], ["Severity", "error", 1, "drawer-diagnostics", 3, "Headline", "Diagnostics"], [1, "drawer-error"], [1, "drawer-footer-actions"], [1, "drawer-btn", "drawer-btn-primary", 3, "click", "disabled"], [1, "drawer-btn", "drawer-btn-secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-circle-info"], [1, "drawer-link-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-floppy-disk"]], template: function QueryBrowserResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1939
2053
|
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4)(3, "div", 5);
|
|
1940
2054
|
i0.ɵɵelement(4, "i", 6);
|
|
1941
2055
|
i0.ɵɵelementStart(5, "span");
|
|
@@ -1957,34 +2071,39 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1957
2071
|
i0.ɵɵelementStart(15, "button", 14);
|
|
1958
2072
|
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Template_button_click_15_listener() { return ctx.refresh(); });
|
|
1959
2073
|
i0.ɵɵelement(16, "i", 15);
|
|
1960
|
-
i0.ɵɵelementEnd()()();
|
|
1961
|
-
i0.ɵɵelementStart(17, "div", 16)(18, "div", 17);
|
|
1962
|
-
i0.ɵɵelement(19, "i", 18);
|
|
1963
|
-
i0.ɵɵelementStart(20, "input", 19);
|
|
1964
|
-
i0.ɵɵlistener("input", function QueryBrowserResourceComponent_Template_input_input_20_listener($event) { return ctx.onSearchChange($event.target.value); });
|
|
1965
2074
|
i0.ɵɵelementEnd();
|
|
1966
|
-
i0.ɵɵconditionalCreate(
|
|
2075
|
+
i0.ɵɵconditionalCreate(17, QueryBrowserResourceComponent_Conditional_17_Template, 2, 0, "button", 16);
|
|
2076
|
+
i0.ɵɵelementEnd()();
|
|
2077
|
+
i0.ɵɵelementStart(18, "div", 17)(19, "div", 18);
|
|
2078
|
+
i0.ɵɵelement(20, "i", 19);
|
|
2079
|
+
i0.ɵɵelementStart(21, "input", 20);
|
|
2080
|
+
i0.ɵɵlistener("input", function QueryBrowserResourceComponent_Template_input_input_21_listener($event) { return ctx.onSearchChange($event.target.value); });
|
|
2081
|
+
i0.ɵɵelementEnd();
|
|
2082
|
+
i0.ɵɵconditionalCreate(22, QueryBrowserResourceComponent_Conditional_22_Template, 2, 0, "button", 21);
|
|
1967
2083
|
i0.ɵɵelementEnd()();
|
|
1968
|
-
i0.ɵɵelementStart(
|
|
1969
|
-
i0.ɵɵrepeaterCreate(
|
|
2084
|
+
i0.ɵɵelementStart(23, "div", 22);
|
|
2085
|
+
i0.ɵɵrepeaterCreate(24, QueryBrowserResourceComponent_For_25_Template, 1, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
|
|
1970
2086
|
i0.ɵɵelementEnd();
|
|
1971
|
-
i0.ɵɵelementStart(
|
|
1972
|
-
i0.ɵɵconditionalCreate(
|
|
1973
|
-
i0.ɵɵconditionalCreate(
|
|
1974
|
-
i0.ɵɵconditionalCreate(
|
|
1975
|
-
i0.ɵɵconditionalCreate(
|
|
2087
|
+
i0.ɵɵelementStart(26, "div", 23);
|
|
2088
|
+
i0.ɵɵconditionalCreate(27, QueryBrowserResourceComponent_Conditional_27_Template, 2, 0, "div", 24);
|
|
2089
|
+
i0.ɵɵconditionalCreate(28, QueryBrowserResourceComponent_Conditional_28_Template, 1, 0, "mj-empty-state", 25);
|
|
2090
|
+
i0.ɵɵconditionalCreate(29, QueryBrowserResourceComponent_Conditional_29_Template, 1, 1, "mj-empty-state", 26);
|
|
2091
|
+
i0.ɵɵconditionalCreate(30, QueryBrowserResourceComponent_Conditional_30_Template, 3, 0, "div", 27);
|
|
1976
2092
|
i0.ɵɵelementEnd()();
|
|
1977
|
-
i0.ɵɵelementStart(
|
|
1978
|
-
i0.ɵɵlistener("mousedown", function
|
|
1979
|
-
i0.ɵɵelement(
|
|
2093
|
+
i0.ɵɵelementStart(31, "div", 28);
|
|
2094
|
+
i0.ɵɵlistener("mousedown", function QueryBrowserResourceComponent_Template_div_mousedown_31_listener($event) { return ctx.OnResizeStart($event); })("keydown", function QueryBrowserResourceComponent_Template_div_keydown_31_listener($event) { return ctx.OnResizeKeydown($event); });
|
|
2095
|
+
i0.ɵɵelement(32, "div", 29);
|
|
1980
2096
|
i0.ɵɵelementEnd();
|
|
1981
|
-
i0.ɵɵelementStart(
|
|
1982
|
-
i0.ɵɵconditionalCreate(
|
|
1983
|
-
i0.ɵɵconditionalCreate(
|
|
2097
|
+
i0.ɵɵelementStart(33, "div", 30);
|
|
2098
|
+
i0.ɵɵconditionalCreate(34, QueryBrowserResourceComponent_Conditional_34_Template, 1, 1, "mj-empty-state", 31);
|
|
2099
|
+
i0.ɵɵconditionalCreate(35, QueryBrowserResourceComponent_Conditional_35_Template, 10, 6);
|
|
1984
2100
|
i0.ɵɵelementEnd()();
|
|
1985
|
-
i0.ɵɵtemplate(
|
|
1986
|
-
i0.ɵɵconditionalCreate(
|
|
1987
|
-
i0.ɵɵconditionalCreate(
|
|
2101
|
+
i0.ɵɵtemplate(36, QueryBrowserResourceComponent_ng_template_36_Template, 1, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
2102
|
+
i0.ɵɵconditionalCreate(38, QueryBrowserResourceComponent_Conditional_38_Template, 1, 0, "div", 32);
|
|
2103
|
+
i0.ɵɵconditionalCreate(39, QueryBrowserResourceComponent_Conditional_39_Template, 55, 33, "div", 33);
|
|
2104
|
+
i0.ɵɵelementStart(40, "mj-query-refresh-dialog", 34);
|
|
2105
|
+
i0.ɵɵlistener("Closed", function QueryBrowserResourceComponent_Template_mj_query_refresh_dialog_Closed_40_listener() { return ctx.OnRefreshDialogClosed(); })("Applied", function QueryBrowserResourceComponent_Template_mj_query_refresh_dialog_Applied_40_listener() { return ctx.OnRefreshApplied(); })("OpenQuery", function QueryBrowserResourceComponent_Template_mj_query_refresh_dialog_OpenQuery_40_listener($event) { return ctx.OnRefreshOpenQuery($event); });
|
|
2106
|
+
i0.ɵɵelementEnd();
|
|
1988
2107
|
} if (rf & 2) {
|
|
1989
2108
|
i0.ɵɵclassProp("resizing", ctx.IsResizing);
|
|
1990
2109
|
i0.ɵɵadvance();
|
|
@@ -1994,32 +2113,36 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1994
2113
|
i0.ɵɵtextInterpolate1("(", ctx.getTotalQueryCount(), ")");
|
|
1995
2114
|
i0.ɵɵadvance(2);
|
|
1996
2115
|
i0.ɵɵconditional(ctx.CanCreateQuery ? 10 : -1);
|
|
1997
|
-
i0.ɵɵadvance(
|
|
2116
|
+
i0.ɵɵadvance(7);
|
|
2117
|
+
i0.ɵɵconditional(ctx.CanEditQuery ? 17 : -1);
|
|
2118
|
+
i0.ɵɵadvance(4);
|
|
1998
2119
|
i0.ɵɵproperty("value", ctx.searchText);
|
|
1999
2120
|
i0.ɵɵadvance();
|
|
2000
|
-
i0.ɵɵconditional(ctx.searchText ?
|
|
2121
|
+
i0.ɵɵconditional(ctx.searchText ? 22 : -1);
|
|
2001
2122
|
i0.ɵɵadvance(2);
|
|
2002
2123
|
i0.ɵɵrepeater(ctx.AllStatuses);
|
|
2003
2124
|
i0.ɵɵadvance(3);
|
|
2004
|
-
i0.ɵɵconditional(ctx.isLoading ?
|
|
2125
|
+
i0.ɵɵconditional(ctx.isLoading ? 27 : -1);
|
|
2005
2126
|
i0.ɵɵadvance();
|
|
2006
|
-
i0.ɵɵconditional(!ctx.isLoading && ctx.queries.length === 0 ?
|
|
2127
|
+
i0.ɵɵconditional(!ctx.isLoading && ctx.queries.length === 0 ? 28 : -1);
|
|
2007
2128
|
i0.ɵɵadvance();
|
|
2008
|
-
i0.ɵɵconditional(!ctx.isLoading && ctx.searchText && ctx.filteredQueries.length === 0 ?
|
|
2129
|
+
i0.ɵɵconditional(!ctx.isLoading && ctx.searchText && ctx.filteredQueries.length === 0 ? 29 : -1);
|
|
2009
2130
|
i0.ɵɵadvance();
|
|
2010
|
-
i0.ɵɵconditional(!ctx.isLoading && ctx.queries.length > 0 ?
|
|
2131
|
+
i0.ɵɵconditional(!ctx.isLoading && ctx.queries.length > 0 ? 30 : -1);
|
|
2011
2132
|
i0.ɵɵadvance();
|
|
2012
2133
|
i0.ɵɵclassProp("active", ctx.IsResizing);
|
|
2013
2134
|
i0.ɵɵattribute("aria-controls", ctx.TreePanelId)("aria-valuenow", ctx.PanelWidth)("aria-valuemin", ctx.MinPanelWidth)("aria-valuemax", ctx.MaxPanelWidth);
|
|
2014
2135
|
i0.ɵɵadvance(3);
|
|
2015
|
-
i0.ɵɵconditional(!ctx.selectedQuery ?
|
|
2136
|
+
i0.ɵɵconditional(!ctx.selectedQuery ? 34 : -1);
|
|
2016
2137
|
i0.ɵɵadvance();
|
|
2017
|
-
i0.ɵɵconditional(ctx.selectedQuery ?
|
|
2138
|
+
i0.ɵɵconditional(ctx.selectedQuery ? 35 : -1);
|
|
2018
2139
|
i0.ɵɵadvance(3);
|
|
2019
|
-
i0.ɵɵconditional(ctx.ShowQueryDrawer ? 37 : -1);
|
|
2020
|
-
i0.ɵɵadvance();
|
|
2021
2140
|
i0.ɵɵconditional(ctx.ShowQueryDrawer ? 38 : -1);
|
|
2022
|
-
} }, dependencies: [i2.NgTemplateOutlet, i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.CheckboxControlValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i1.MJEmptyStateComponent, i4.LoadingComponent, i5.CodeEditorComponent, i6.QueryViewerComponent, i7.TreeDropdownComponent], styles: ["\n\n[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.query-browser-container[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n background: var(--mj-bg-surface-card);\n}\n\n\n.query-tree-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n \n}\n\n\n.tree-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.query-count[_ngcontent-%COMP%] {\n font-weight: 400;\n opacity: 0.8;\n font-size: 13px;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.icon-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: color-mix(in srgb, var(--mj-text-inverse) 15%, transparent);\n color: var(--mj-text-inverse);\n border-radius: 4px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.icon-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-inverse) 25%, transparent);\n}\n\n\n.tree-search[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding-left: 10px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.search-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n padding: 8px 0;\n font-size: 14px;\n background: transparent;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.clear-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n margin-right: 4px;\n border-radius: 4px;\n}\n\n.clear-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n\n.status-filter-bar[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.status-filter-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-disabled);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s ease;\n line-height: 1.2;\n}\n\n.status-filter-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--chip-color, var(--mj-text-disabled));\n color: var(--chip-color, var(--mj-text-disabled));\n}\n\n.status-filter-chip.active[_ngcontent-%COMP%] {\n background: var(--chip-color, var(--mj-text-disabled));\n border-color: var(--chip-color, var(--mj-text-disabled));\n color: var(--mj-text-inverse);\n}\n\n.status-filter-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.chip-count[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 10px;\n opacity: 0.85;\n}\n\n\n.status-dot[_ngcontent-%COMP%] {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n}\n\n\n.query-status-badge[_ngcontent-%COMP%] {\n font-size: 9px;\n color: var(--mj-text-inverse);\n padding: 1px 6px;\n border-radius: 8px;\n flex-shrink: 0;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-top: 2px;\n}\n\n\n.tree-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n\n.category-tree[_ngcontent-%COMP%] {\n padding: 0 4px;\n}\n\n.category-item[_ngcontent-%COMP%] {\n margin-bottom: 2px;\n}\n\n.category-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n width: 12px;\n text-align: center;\n}\n\n.category-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 14px;\n}\n\n.category-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.category-count[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.category-add-btn[_ngcontent-%COMP%] {\n display: none;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n flex-shrink: 0;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover .category-add-btn[_ngcontent-%COMP%] {\n display: flex;\n}\n\n.category-add-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n\n.category-queries[_ngcontent-%COMP%] {\n margin-left: 28px;\n}\n\n.query-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n margin: 2px 0;\n}\n\n.query-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.query-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-info);\n margin-left: -3px;\n}\n\n.query-item.hidden[_ngcontent-%COMP%] {\n display: none;\n}\n\n.query-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n margin-top: 2px;\n}\n\n.query-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.query-name[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 12px;\n margin-top: 2px;\n}\n\n.query-details-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n opacity: 0;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.query-item[_ngcontent-%COMP%]:hover .query-details-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.query-details-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n color: var(--mj-brand-primary);\n}\n\n\n.resize-handle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 6px;\n cursor: col-resize;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n position: relative;\n z-index: 10;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle[_ngcontent-%COMP%]:focus-visible, \n.resize-handle.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.resize-handle[_ngcontent-%COMP%]:focus-visible {\n outline: var(--mj-ring-width) solid var(--mj-focus-ring-color);\n outline-offset: -1px;\n}\n\n.resize-handle-grip[_ngcontent-%COMP%] {\n width: 2px;\n height: 32px;\n border-radius: 1px;\n background: var(--mj-border-strong);\n transition: background 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-handle-grip[_ngcontent-%COMP%], \n.resize-handle[_ngcontent-%COMP%]:focus-visible .resize-handle-grip[_ngcontent-%COMP%], \n.resize-handle.active[_ngcontent-%COMP%] .resize-handle-grip[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n\n.query-browser-container.resizing[_ngcontent-%COMP%] {\n cursor: col-resize;\n user-select: none;\n}\n\n.query-browser-container.resizing[_ngcontent-%COMP%] *[_ngcontent-%COMP%] {\n pointer-events: none;\n}\n\n.query-browser-container.resizing[_ngcontent-%COMP%] .resize-handle[_ngcontent-%COMP%] {\n pointer-events: auto;\n}\n\n\n.query-viewer-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n\n.no-selection[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n.query-viewer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.query-viewer-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 0;\n overflow: hidden;\n}\n\n.query-viewer-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.query-viewer-title[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-viewer-status-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 14px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n flex-shrink: 0;\n}\n\n.query-viewer-status-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.query-viewer-status-pill.approved[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.query-viewer-header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n\nmj-query-viewer[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n\n@media (max-width: 768px) {\n .query-browser-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .query-tree-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n height: 40%;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .query-viewer-panel[_ngcontent-%COMP%] {\n height: 60%;\n }\n}\n\n\n.query-viewer-header[_ngcontent-%COMP%] .icon-btn[_ngcontent-%COMP%] {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.query-viewer-header[_ngcontent-%COMP%] .icon-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n\n.query-drawer-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1100;\n animation: _ngcontent-%COMP%_backdropFadeIn 0.22s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_backdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n.query-drawer[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 480px;\n max-width: 96vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.18);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_drawerSlideIn 0.22s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_drawerSlideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n\n.query-drawer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: linear-gradient(135deg, var(--mj-brand-primary) 0%, var(--mj-brand-primary-hover) 100%);\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n}\n\n.query-drawer-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.query-drawer-title[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 18px;\n opacity: 0.9;\n flex-shrink: 0;\n}\n\n.query-drawer-title-main[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n line-height: 1.2;\n}\n\n.query-drawer-title-sub[_ngcontent-%COMP%] {\n font-size: 12px;\n opacity: 0.75;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 360px;\n margin-top: 2px;\n}\n\n.query-drawer-close[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: var(--mj-text-inverse);\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n flex-shrink: 0;\n transition: background 0.15s ease;\n}\n\n.query-drawer-close[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.28);\n}\n\n\n.query-drawer-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.query-drawer-body[_ngcontent-%COMP%]::-webkit-scrollbar { width: 6px; }\n.query-drawer-body[_ngcontent-%COMP%]::-webkit-scrollbar-track { background: var(--mj-bg-surface-sunken); }\n.query-drawer-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb { background: var(--mj-border-strong); border-radius: 3px; }\n.query-drawer-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover { background: var(--mj-text-disabled); }\n\n\n.drawer-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.drawer-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n}\n\n.drawer-field-flex[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.drawer-field-sql[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.drawer-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.drawer-required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n margin-left: 2px;\n}\n\n.drawer-input[_ngcontent-%COMP%], \n.drawer-select[_ngcontent-%COMP%], \n.drawer-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n box-sizing: border-box;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n outline: none;\n font-family: inherit;\n}\n\n.drawer-input[_ngcontent-%COMP%]:focus, \n.drawer-select[_ngcontent-%COMP%]:focus, \n.drawer-textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.drawer-input[_ngcontent-%COMP%]:disabled, \n.drawer-select[_ngcontent-%COMP%]:disabled, \n.drawer-textarea[_ngcontent-%COMP%]:disabled {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n\n.drawer-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 70px;\n}\n\n.drawer-sql-editor[_ngcontent-%COMP%] {\n display: block;\n min-height: 220px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.drawer-field-error[_ngcontent-%COMP%] .drawer-input[_ngcontent-%COMP%], \n.drawer-field-error[_ngcontent-%COMP%] .drawer-select[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.drawer-field-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.drawer-field-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.drawer-field-inline[_ngcontent-%COMP%] .drawer-field-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.drawer-reusable-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n cursor: pointer;\n white-space: nowrap;\n}\n\n\n.drawer-full-record[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary-hover);\n flex-wrap: wrap;\n}\n\n.drawer-full-record[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n color: var(--mj-brand-primary);\n}\n\n.drawer-link-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary-hover);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n padding: 0;\n text-decoration: underline;\n text-underline-offset: 2px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.drawer-link-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-active);\n}\n\n\n.query-drawer-footer[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.drawer-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-status-error-text);\n}\n\n.drawer-footer-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n\n.drawer-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.drawer-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.drawer-btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.drawer-btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.drawer-btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.drawer-btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n\n@media (max-width: 600px) {\n .query-drawer[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n\n .drawer-row[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n}"], changeDetection: 0 });
|
|
2141
|
+
i0.ɵɵadvance();
|
|
2142
|
+
i0.ɵɵconditional(ctx.ShowQueryDrawer ? 39 : -1);
|
|
2143
|
+
i0.ɵɵadvance();
|
|
2144
|
+
i0.ɵɵproperty("Visible", ctx.ShowRefreshDialog)("Scope", ctx.RefreshScope)("ScopeLabel", ctx.RefreshScopeLabel)("AllowOpenQuery", true)("AllowSkipDryRun", (ctx.RefreshScope == null ? null : ctx.RefreshScope.Kind) === "Queries")("Provider", ctx.ProviderToUse);
|
|
2145
|
+
} }, dependencies: [i2.NgTemplateOutlet, i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.CheckboxControlValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i1.MJEmptyStateComponent, i4.LoadingComponent, i5.CodeEditorComponent, i6.QueryViewerComponent, i6.QueryDiagnosticsComponent, i6.QueryRefreshDialogComponent, i7.TreeDropdownComponent], styles: ["\n\n[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.query-browser-container[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n background: var(--mj-bg-surface-card);\n}\n\n\n.query-tree-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n \n}\n\n\n.tree-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.query-count[_ngcontent-%COMP%] {\n font-weight: 400;\n opacity: 0.8;\n font-size: 13px;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.icon-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: color-mix(in srgb, var(--mj-text-inverse) 15%, transparent);\n color: var(--mj-text-inverse);\n border-radius: 4px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.icon-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-inverse) 25%, transparent);\n}\n\n\n.tree-search[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding-left: 10px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%]:focus-within {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.search-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n padding: 8px 0;\n font-size: 14px;\n background: transparent;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.clear-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n margin-right: 4px;\n border-radius: 4px;\n}\n\n.clear-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n\n.status-filter-bar[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.status-filter-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-disabled);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s ease;\n line-height: 1.2;\n}\n\n.status-filter-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--chip-color, var(--mj-text-disabled));\n color: var(--chip-color, var(--mj-text-disabled));\n}\n\n.status-filter-chip.active[_ngcontent-%COMP%] {\n background: var(--chip-color, var(--mj-text-disabled));\n border-color: var(--chip-color, var(--mj-text-disabled));\n color: var(--mj-text-inverse);\n}\n\n.status-filter-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.chip-count[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 10px;\n opacity: 0.85;\n}\n\n\n.status-dot[_ngcontent-%COMP%] {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n}\n\n\n.query-status-badge[_ngcontent-%COMP%] {\n font-size: 9px;\n color: var(--mj-text-inverse);\n padding: 1px 6px;\n border-radius: 8px;\n flex-shrink: 0;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-top: 2px;\n}\n\n\n.tree-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n\n.category-tree[_ngcontent-%COMP%] {\n padding: 0 4px;\n}\n\n.category-item[_ngcontent-%COMP%] {\n margin-bottom: 2px;\n}\n\n.category-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n width: 12px;\n text-align: center;\n}\n\n.category-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 14px;\n}\n\n.category-name[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.category-count[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.category-add-btn[_ngcontent-%COMP%] {\n display: none;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n flex-shrink: 0;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover .category-add-btn[_ngcontent-%COMP%] {\n display: flex;\n}\n\n.category-add-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n\n.category-queries[_ngcontent-%COMP%] {\n margin-left: 28px;\n}\n\n.query-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n margin: 2px 0;\n}\n\n.query-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.query-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-info);\n margin-left: -3px;\n}\n\n.query-item.hidden[_ngcontent-%COMP%] {\n display: none;\n}\n\n.query-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n margin-top: 2px;\n}\n\n.query-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.query-name[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 12px;\n margin-top: 2px;\n}\n\n.query-details-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n opacity: 0;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.query-item[_ngcontent-%COMP%]:hover .query-details-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.query-details-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n color: var(--mj-brand-primary);\n}\n\n\n.resize-handle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 6px;\n cursor: col-resize;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n position: relative;\n z-index: 10;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle[_ngcontent-%COMP%]:focus-visible, \n.resize-handle.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.resize-handle[_ngcontent-%COMP%]:focus-visible {\n outline: var(--mj-ring-width) solid var(--mj-focus-ring-color);\n outline-offset: -1px;\n}\n\n.resize-handle-grip[_ngcontent-%COMP%] {\n width: 2px;\n height: 32px;\n border-radius: 1px;\n background: var(--mj-border-strong);\n transition: background 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-handle-grip[_ngcontent-%COMP%], \n.resize-handle[_ngcontent-%COMP%]:focus-visible .resize-handle-grip[_ngcontent-%COMP%], \n.resize-handle.active[_ngcontent-%COMP%] .resize-handle-grip[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n\n.query-browser-container.resizing[_ngcontent-%COMP%] {\n cursor: col-resize;\n user-select: none;\n}\n\n.query-browser-container.resizing[_ngcontent-%COMP%] *[_ngcontent-%COMP%] {\n pointer-events: none;\n}\n\n.query-browser-container.resizing[_ngcontent-%COMP%] .resize-handle[_ngcontent-%COMP%] {\n pointer-events: auto;\n}\n\n\n.query-viewer-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n\n.no-selection[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n.query-viewer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.query-viewer-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 0;\n overflow: hidden;\n}\n\n.query-viewer-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.query-viewer-title[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-viewer-status-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 14px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n flex-shrink: 0;\n}\n\n.query-viewer-status-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.query-viewer-status-pill.approved[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.query-viewer-header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n\nmj-query-viewer[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.tree-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n\n@media (max-width: 768px) {\n .query-browser-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .query-tree-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n height: 40%;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .query-viewer-panel[_ngcontent-%COMP%] {\n height: 60%;\n }\n}\n\n\n.query-viewer-header[_ngcontent-%COMP%] .icon-btn[_ngcontent-%COMP%] {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.query-viewer-header[_ngcontent-%COMP%] .icon-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n\n.query-drawer-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1100;\n animation: _ngcontent-%COMP%_backdropFadeIn 0.22s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_backdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n.query-drawer[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 480px;\n max-width: 96vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.18);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_drawerSlideIn 0.22s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_drawerSlideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n\n.query-drawer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: linear-gradient(135deg, var(--mj-brand-primary) 0%, var(--mj-brand-primary-hover) 100%);\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n}\n\n.query-drawer-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.query-drawer-title[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 18px;\n opacity: 0.9;\n flex-shrink: 0;\n}\n\n.query-drawer-title-main[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n line-height: 1.2;\n}\n\n.query-drawer-title-sub[_ngcontent-%COMP%] {\n font-size: 12px;\n opacity: 0.75;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 360px;\n margin-top: 2px;\n}\n\n.query-drawer-close[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: var(--mj-text-inverse);\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n flex-shrink: 0;\n transition: background 0.15s ease;\n}\n\n.query-drawer-close[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.28);\n}\n\n\n.query-drawer-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.query-drawer-body[_ngcontent-%COMP%]::-webkit-scrollbar { width: 6px; }\n.query-drawer-body[_ngcontent-%COMP%]::-webkit-scrollbar-track { background: var(--mj-bg-surface-sunken); }\n.query-drawer-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb { background: var(--mj-border-strong); border-radius: 3px; }\n.query-drawer-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover { background: var(--mj-text-disabled); }\n\n\n.drawer-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.drawer-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n}\n\n.drawer-field-flex[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.drawer-field-sql[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.drawer-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.drawer-required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n margin-left: 2px;\n}\n\n.drawer-input[_ngcontent-%COMP%], \n.drawer-select[_ngcontent-%COMP%], \n.drawer-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n box-sizing: border-box;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n outline: none;\n font-family: inherit;\n}\n\n.drawer-input[_ngcontent-%COMP%]:focus, \n.drawer-select[_ngcontent-%COMP%]:focus, \n.drawer-textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.drawer-input[_ngcontent-%COMP%]:disabled, \n.drawer-select[_ngcontent-%COMP%]:disabled, \n.drawer-textarea[_ngcontent-%COMP%]:disabled {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n\n.drawer-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 70px;\n}\n\n.drawer-sql-editor[_ngcontent-%COMP%] {\n display: block;\n min-height: 220px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.drawer-field-error[_ngcontent-%COMP%] .drawer-input[_ngcontent-%COMP%], \n.drawer-field-error[_ngcontent-%COMP%] .drawer-select[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.drawer-field-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.drawer-field-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.drawer-field-inline[_ngcontent-%COMP%] .drawer-field-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.drawer-reusable-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n cursor: pointer;\n white-space: nowrap;\n}\n\n\n.drawer-full-record[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary-hover);\n flex-wrap: wrap;\n}\n\n.drawer-full-record[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n color: var(--mj-brand-primary);\n}\n\n.drawer-link-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary-hover);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n padding: 0;\n text-decoration: underline;\n text-underline-offset: 2px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.drawer-link-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-active);\n}\n\n\n.query-drawer-footer[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.drawer-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-status-error-text);\n}\n\n.drawer-footer-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n\n.drawer-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.drawer-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.drawer-btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.drawer-btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.drawer-btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.drawer-btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n\n@media (max-width: 600px) {\n .query-drawer[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n\n .drawer-row[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n}\n\n.drawer-diagnostics[_ngcontent-%COMP%] {\n margin-bottom: var(--mj-space-3);\n max-height: 40vh;\n overflow: auto;\n}"], changeDetection: 0 });
|
|
2023
2146
|
};
|
|
2024
2147
|
QueryBrowserResourceComponent = QueryBrowserResourceComponent_1 = __decorate([
|
|
2025
2148
|
RegisterClass(BaseResourceComponent, 'QueryBrowserResource')
|
|
@@ -2027,7 +2150,7 @@ QueryBrowserResourceComponent = QueryBrowserResourceComponent_1 = __decorate([
|
|
|
2027
2150
|
export { QueryBrowserResourceComponent };
|
|
2028
2151
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryBrowserResourceComponent, [{
|
|
2029
2152
|
type: Component,
|
|
2030
|
-
args: [{ standalone: false, selector: 'mj-query-browser-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Query Browser Resource -->\n<div class=\"query-browser-container\" [class.resizing]=\"IsResizing\">\n <!-- Left Panel: Query Tree -->\n <div class=\"query-tree-panel\" [id]=\"TreePanelId\" [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. A separator without tabindex is a static (decorative) separator per\n ARIA, so tabindex, the keydown handler and aria-value* are what make it a widget. -->\n <div class=\"resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize query list panel\"\n [attr.aria-controls]=\"TreePanelId\"\n tabindex=\"0\"\n [attr.aria-valuenow]=\"PanelWidth\"\n [attr.aria-valuemin]=\"MinPanelWidth\"\n [attr.aria-valuemax]=\"MaxPanelWidth\"\n [class.active]=\"IsResizing\"\n (mousedown)=\"OnResizeStart($event)\"\n (keydown)=\"OnResizeKeydown($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 \u2014\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", styles: ["/* Query Browser Resource Styles */\n\n:host {\n display: block;\n height: 100%;\n}\n\n.query-browser-container {\n display: flex;\n height: 100%;\n background: var(--mj-bg-surface-card);\n}\n\n/* Left Panel: Query Tree */\n.query-tree-panel {\n flex-shrink: 0;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n /* Width controlled by [style.width.px] binding */\n}\n\n/* Tree Header */\n.tree-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.header-title i {\n font-size: 16px;\n}\n\n.query-count {\n font-weight: 400;\n opacity: 0.8;\n font-size: 13px;\n}\n\n.header-actions {\n display: flex;\n gap: 4px;\n}\n\n.icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: color-mix(in srgb, var(--mj-text-inverse) 15%, transparent);\n color: var(--mj-text-inverse);\n border-radius: 4px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.icon-btn:hover {\n background: color-mix(in srgb, var(--mj-text-inverse) 25%, transparent);\n}\n\n/* Tree Search */\n.tree-search {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding-left: 10px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n\n.search-input-wrapper:focus-within {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.search-icon {\n color: var(--mj-text-disabled);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.search-input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n padding: 8px 0;\n font-size: 14px;\n background: transparent;\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.clear-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n margin-right: 4px;\n border-radius: 4px;\n}\n\n.clear-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n/* Status Filter Bar */\n.status-filter-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.status-filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-disabled);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s ease;\n line-height: 1.2;\n}\n\n.status-filter-chip:hover {\n border-color: var(--chip-color, var(--mj-text-disabled));\n color: var(--chip-color, var(--mj-text-disabled));\n}\n\n.status-filter-chip.active {\n background: var(--chip-color, var(--mj-text-disabled));\n border-color: var(--chip-color, var(--mj-text-disabled));\n color: var(--mj-text-inverse);\n}\n\n.status-filter-chip i {\n font-size: 10px;\n}\n\n.chip-count {\n font-weight: 600;\n font-size: 10px;\n opacity: 0.85;\n}\n\n/* Status Dot on Query Items */\n.status-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n}\n\n/* Status Badge on Non-Approved Queries */\n.query-status-badge {\n font-size: 9px;\n color: var(--mj-text-inverse);\n padding: 1px 6px;\n border-radius: 8px;\n flex-shrink: 0;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-top: 2px;\n}\n\n/* Tree Content */\n.tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n/* Loading State */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n/* Category Tree */\n.category-tree {\n padding: 0 4px;\n}\n\n.category-item {\n margin-bottom: 2px;\n}\n\n.category-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.category-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-icon {\n font-size: 10px;\n color: var(--mj-text-disabled);\n width: 12px;\n text-align: center;\n}\n\n.category-icon {\n color: var(--mj-status-warning);\n font-size: 14px;\n}\n\n.category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.category-count {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.category-add-btn {\n display: none;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n flex-shrink: 0;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.category-header:hover .category-add-btn {\n display: flex;\n}\n\n.category-add-btn:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n/* Query Items */\n.category-queries {\n margin-left: 28px;\n}\n\n.query-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n margin: 2px 0;\n}\n\n.query-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.query-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-info);\n margin-left: -3px;\n}\n\n.query-item.hidden {\n display: none;\n}\n\n.query-icon {\n color: var(--mj-brand-primary);\n font-size: 14px;\n margin-top: 2px;\n}\n\n.query-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.query-name {\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-description {\n font-size: 11px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-icon {\n color: var(--mj-status-warning);\n font-size: 12px;\n margin-top: 2px;\n}\n\n.query-details-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n opacity: 0;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.query-item:hover .query-details-btn {\n opacity: 1;\n}\n\n.query-details-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n color: var(--mj-brand-primary);\n}\n\n/* Resize Handle */\n.resize-handle {\n flex-shrink: 0;\n width: 6px;\n cursor: col-resize;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n position: relative;\n z-index: 10;\n}\n\n.resize-handle:hover,\n.resize-handle:focus-visible,\n.resize-handle.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* The handle is a keyboard-operable widget (arrows/Home/End), so it needs a visible\n focus ring \u2014 the 6px hover tint alone is too subtle to serve as one. */\n.resize-handle:focus-visible {\n outline: var(--mj-ring-width) solid var(--mj-focus-ring-color);\n outline-offset: -1px;\n}\n\n.resize-handle-grip {\n width: 2px;\n height: 32px;\n border-radius: 1px;\n background: var(--mj-border-strong);\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover .resize-handle-grip,\n.resize-handle:focus-visible .resize-handle-grip,\n.resize-handle.active .resize-handle-grip {\n background: var(--mj-brand-primary);\n}\n\n/* Prevent text selection and set cursor during resize */\n.query-browser-container.resizing {\n cursor: col-resize;\n user-select: none;\n}\n\n.query-browser-container.resizing * {\n pointer-events: none;\n}\n\n.query-browser-container.resizing .resize-handle {\n pointer-events: auto;\n}\n\n/* Right Panel: Query Viewer */\n.query-viewer-panel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* No Selection State \u2014 fills the viewer panel (host centers its own content) */\n.no-selection {\n flex: 1;\n}\n\n/* Query Viewer Header */\n.query-viewer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.query-viewer-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 0;\n overflow: hidden;\n}\n\n.query-viewer-title i {\n color: var(--mj-brand-primary);\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.query-viewer-title span {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-viewer-status-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 14px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n flex-shrink: 0;\n}\n\n.query-viewer-status-pill i {\n font-size: 12px;\n}\n\n.query-viewer-status-pill.approved {\n opacity: 0.7;\n}\n\n.query-viewer-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n/* Query Viewer fills remaining space */\nmj-query-viewer {\n flex: 1;\n min-height: 0;\n}\n\n/* Scrollbar styling */\n.tree-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.tree-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n}\n\n.tree-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.tree-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .query-browser-container {\n flex-direction: column;\n }\n\n .query-tree-panel {\n width: 100% !important;\n height: 40%;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .resize-handle {\n display: none;\n }\n\n .query-viewer-panel {\n height: 60%;\n }\n}\n\n/* \u2500\u2500\u2500 Right-panel icon button override (white background context) \u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-viewer-header .icon-btn {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.query-viewer-header .icon-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n/* \u2500\u2500\u2500 Drawer Backdrop \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer-backdrop {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1100;\n animation: backdropFadeIn 0.22s ease-out;\n}\n\n@keyframes backdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* \u2500\u2500\u2500 Drawer Panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 480px;\n max-width: 96vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.18);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n animation: drawerSlideIn 0.22s ease-out;\n}\n\n@keyframes drawerSlideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n/* \u2500\u2500\u2500 Drawer Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: linear-gradient(135deg, var(--mj-brand-primary) 0%, var(--mj-brand-primary-hover) 100%);\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n}\n\n.query-drawer-title {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.query-drawer-title > i {\n font-size: 18px;\n opacity: 0.9;\n flex-shrink: 0;\n}\n\n.query-drawer-title-main {\n font-size: 16px;\n font-weight: 600;\n line-height: 1.2;\n}\n\n.query-drawer-title-sub {\n font-size: 12px;\n opacity: 0.75;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 360px;\n margin-top: 2px;\n}\n\n.query-drawer-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: var(--mj-text-inverse);\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n flex-shrink: 0;\n transition: background 0.15s ease;\n}\n\n.query-drawer-close:hover {\n background: rgba(255, 255, 255, 0.28);\n}\n\n/* \u2500\u2500\u2500 Drawer Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.query-drawer-body::-webkit-scrollbar { width: 6px; }\n.query-drawer-body::-webkit-scrollbar-track { background: var(--mj-bg-surface-sunken); }\n.query-drawer-body::-webkit-scrollbar-thumb { background: var(--mj-border-strong); border-radius: 3px; }\n.query-drawer-body::-webkit-scrollbar-thumb:hover { background: var(--mj-text-disabled); }\n\n/* \u2500\u2500\u2500 Drawer Form Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.drawer-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.drawer-row {\n display: flex;\n gap: 12px;\n}\n\n.drawer-field-flex {\n flex: 1;\n min-width: 0;\n}\n\n.drawer-field-sql {\n flex: 1;\n}\n\n.drawer-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.drawer-required {\n color: var(--mj-status-error);\n margin-left: 2px;\n}\n\n.drawer-input,\n.drawer-select,\n.drawer-textarea {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n box-sizing: border-box;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n outline: none;\n font-family: inherit;\n}\n\n.drawer-input:focus,\n.drawer-select:focus,\n.drawer-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.drawer-input:disabled,\n.drawer-select:disabled,\n.drawer-textarea:disabled {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n\n.drawer-textarea {\n resize: vertical;\n min-height: 70px;\n}\n\n.drawer-sql-editor {\n display: block;\n min-height: 220px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.drawer-field-error .drawer-input,\n.drawer-field-error .drawer-select {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.drawer-field-hint {\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.drawer-field-inline {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.drawer-field-inline .drawer-field-hint {\n color: var(--mj-text-muted);\n}\n\n.drawer-reusable-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n cursor: pointer;\n white-space: nowrap;\n}\n\n/* \u2500\u2500\u2500 Open Full Record link \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.drawer-full-record {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary-hover);\n flex-wrap: wrap;\n}\n\n.drawer-full-record > i {\n flex-shrink: 0;\n color: var(--mj-brand-primary);\n}\n\n.drawer-link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary-hover);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n padding: 0;\n text-decoration: underline;\n text-underline-offset: 2px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.drawer-link-btn:hover {\n color: var(--mj-brand-primary-active);\n}\n\n/* \u2500\u2500\u2500 Drawer Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer-footer {\n flex-shrink: 0;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.drawer-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-status-error-text);\n}\n\n.drawer-footer-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n/* \u2500\u2500\u2500 Drawer Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.drawer-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.drawer-btn:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.drawer-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.drawer-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.drawer-btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.drawer-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n/* \u2500\u2500\u2500 Responsive drawer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 600px) {\n .query-drawer {\n width: 100vw;\n max-width: 100vw;\n }\n\n .drawer-row {\n flex-direction: column;\n }\n}\n"] }]
|
|
2153
|
+
args: [{ standalone: false, selector: 'mj-query-browser-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Query Browser Resource -->\n<div class=\"query-browser-container\" [class.resizing]=\"IsResizing\">\n <!-- Left Panel: Query Tree -->\n <div class=\"query-tree-panel\" [id]=\"TreePanelId\" [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 @if (CanEditQuery) {\n <button class=\"icon-btn\" (click)=\"OpenRefreshForAll()\" title=\"Refresh the metadata of all queries (dry run first)\"\n aria-label=\"Refresh the metadata of all queries\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </button>\n }\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. A separator without tabindex is a static (decorative) separator per\n ARIA, so tabindex, the keydown handler and aria-value* are what make it a widget. -->\n <div class=\"resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize query list panel\"\n [attr.aria-controls]=\"TreePanelId\"\n tabindex=\"0\"\n [attr.aria-valuenow]=\"PanelWidth\"\n [attr.aria-valuemin]=\"MinPanelWidth\"\n [attr.aria-valuemax]=\"MaxPanelWidth\"\n [class.active]=\"IsResizing\"\n (mousedown)=\"OnResizeStart($event)\"\n (keydown)=\"OnResizeKeydown($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)=\"OpenRefreshForQuery(selectedQuery)\" title=\"Refresh this query's metadata (dry run first)\"\n aria-label=\"Refresh this query's metadata\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </button>\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 (CanEditQuery && node.category.ID !== '__uncategorized__') {\n <button class=\"category-add-btn category-refresh-btn\"\n (click)=\"OpenRefreshForCategory(node, $event)\"\n [title]=\"'Refresh the metadata of the queries in ' + node.category.Name + ' (dry run first)'\"\n [attr.aria-label]=\"'Refresh the metadata of the queries in ' + node.category.Name\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </button>\n }\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 \u2014\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 (DrawerSaveDiagnostics.length > 0) {\n <mj-query-diagnostics class=\"drawer-diagnostics\" [Headline]=\"DrawerSaveError\" [Diagnostics]=\"DrawerSaveDiagnostics\" Severity=\"error\" />\n } @else 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\n<!-- Refresh metadata: dry run first, then apply; live progress per query -->\n<mj-query-refresh-dialog\n [Visible]=\"ShowRefreshDialog\"\n [Scope]=\"RefreshScope\"\n [ScopeLabel]=\"RefreshScopeLabel\"\n [AllowOpenQuery]=\"true\"\n [AllowSkipDryRun]=\"RefreshScope?.Kind === 'Queries'\"\n [Provider]=\"ProviderToUse\"\n (Closed)=\"OnRefreshDialogClosed()\"\n (Applied)=\"OnRefreshApplied()\"\n (OpenQuery)=\"OnRefreshOpenQuery($event)\" />\n", styles: ["/* Query Browser Resource Styles */\n\n:host {\n display: block;\n height: 100%;\n}\n\n.query-browser-container {\n display: flex;\n height: 100%;\n background: var(--mj-bg-surface-card);\n}\n\n/* Left Panel: Query Tree */\n.query-tree-panel {\n flex-shrink: 0;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n /* Width controlled by [style.width.px] binding */\n}\n\n/* Tree Header */\n.tree-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.header-title i {\n font-size: 16px;\n}\n\n.query-count {\n font-weight: 400;\n opacity: 0.8;\n font-size: 13px;\n}\n\n.header-actions {\n display: flex;\n gap: 4px;\n}\n\n.icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: color-mix(in srgb, var(--mj-text-inverse) 15%, transparent);\n color: var(--mj-text-inverse);\n border-radius: 4px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.icon-btn:hover {\n background: color-mix(in srgb, var(--mj-text-inverse) 25%, transparent);\n}\n\n/* Tree Search */\n.tree-search {\n padding: 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-input-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding-left: 10px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n\n.search-input-wrapper:focus-within {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.search-icon {\n color: var(--mj-text-disabled);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.search-input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n padding: 8px 0;\n font-size: 14px;\n background: transparent;\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.clear-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n margin-right: 4px;\n border-radius: 4px;\n}\n\n.clear-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n/* Status Filter Bar */\n.status-filter-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.status-filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-disabled);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s ease;\n line-height: 1.2;\n}\n\n.status-filter-chip:hover {\n border-color: var(--chip-color, var(--mj-text-disabled));\n color: var(--chip-color, var(--mj-text-disabled));\n}\n\n.status-filter-chip.active {\n background: var(--chip-color, var(--mj-text-disabled));\n border-color: var(--chip-color, var(--mj-text-disabled));\n color: var(--mj-text-inverse);\n}\n\n.status-filter-chip i {\n font-size: 10px;\n}\n\n.chip-count {\n font-weight: 600;\n font-size: 10px;\n opacity: 0.85;\n}\n\n/* Status Dot on Query Items */\n.status-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n}\n\n/* Status Badge on Non-Approved Queries */\n.query-status-badge {\n font-size: 9px;\n color: var(--mj-text-inverse);\n padding: 1px 6px;\n border-radius: 8px;\n flex-shrink: 0;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-top: 2px;\n}\n\n/* Tree Content */\n.tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n/* Loading State */\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n/* Category Tree */\n.category-tree {\n padding: 0 4px;\n}\n\n.category-item {\n margin-bottom: 2px;\n}\n\n.category-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.category-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-icon {\n font-size: 10px;\n color: var(--mj-text-disabled);\n width: 12px;\n text-align: center;\n}\n\n.category-icon {\n color: var(--mj-status-warning);\n font-size: 14px;\n}\n\n.category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.category-count {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.category-add-btn {\n display: none;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n flex-shrink: 0;\n transition: background 0.15s ease, color 0.15s ease;\n}\n\n.category-header:hover .category-add-btn {\n display: flex;\n}\n\n.category-add-btn:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n/* Query Items */\n.category-queries {\n margin-left: 28px;\n}\n\n.query-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n margin: 2px 0;\n}\n\n.query-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.query-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-info);\n margin-left: -3px;\n}\n\n.query-item.hidden {\n display: none;\n}\n\n.query-icon {\n color: var(--mj-brand-primary);\n font-size: 14px;\n margin-top: 2px;\n}\n\n.query-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.query-name {\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-description {\n font-size: 11px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-icon {\n color: var(--mj-status-warning);\n font-size: 12px;\n margin-top: 2px;\n}\n\n.query-details-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n opacity: 0;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.query-item:hover .query-details-btn {\n opacity: 1;\n}\n\n.query-details-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n color: var(--mj-brand-primary);\n}\n\n/* Resize Handle */\n.resize-handle {\n flex-shrink: 0;\n width: 6px;\n cursor: col-resize;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n position: relative;\n z-index: 10;\n}\n\n.resize-handle:hover,\n.resize-handle:focus-visible,\n.resize-handle.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* The handle is a keyboard-operable widget (arrows/Home/End), so it needs a visible\n focus ring \u2014 the 6px hover tint alone is too subtle to serve as one. */\n.resize-handle:focus-visible {\n outline: var(--mj-ring-width) solid var(--mj-focus-ring-color);\n outline-offset: -1px;\n}\n\n.resize-handle-grip {\n width: 2px;\n height: 32px;\n border-radius: 1px;\n background: var(--mj-border-strong);\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover .resize-handle-grip,\n.resize-handle:focus-visible .resize-handle-grip,\n.resize-handle.active .resize-handle-grip {\n background: var(--mj-brand-primary);\n}\n\n/* Prevent text selection and set cursor during resize */\n.query-browser-container.resizing {\n cursor: col-resize;\n user-select: none;\n}\n\n.query-browser-container.resizing * {\n pointer-events: none;\n}\n\n.query-browser-container.resizing .resize-handle {\n pointer-events: auto;\n}\n\n/* Right Panel: Query Viewer */\n.query-viewer-panel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* No Selection State \u2014 fills the viewer panel (host centers its own content) */\n.no-selection {\n flex: 1;\n}\n\n/* Query Viewer Header */\n.query-viewer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.query-viewer-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 0;\n overflow: hidden;\n}\n\n.query-viewer-title i {\n color: var(--mj-brand-primary);\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.query-viewer-title span {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-viewer-status-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: 14px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n flex-shrink: 0;\n}\n\n.query-viewer-status-pill i {\n font-size: 12px;\n}\n\n.query-viewer-status-pill.approved {\n opacity: 0.7;\n}\n\n.query-viewer-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n\n/* Query Viewer fills remaining space */\nmj-query-viewer {\n flex: 1;\n min-height: 0;\n}\n\n/* Scrollbar styling */\n.tree-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.tree-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n}\n\n.tree-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.tree-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .query-browser-container {\n flex-direction: column;\n }\n\n .query-tree-panel {\n width: 100% !important;\n height: 40%;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .resize-handle {\n display: none;\n }\n\n .query-viewer-panel {\n height: 60%;\n }\n}\n\n/* \u2500\u2500\u2500 Right-panel icon button override (white background context) \u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-viewer-header .icon-btn {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.query-viewer-header .icon-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n/* \u2500\u2500\u2500 Drawer Backdrop \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer-backdrop {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1100;\n animation: backdropFadeIn 0.22s ease-out;\n}\n\n@keyframes backdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* \u2500\u2500\u2500 Drawer Panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 480px;\n max-width: 96vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.18);\n z-index: 1101;\n display: flex;\n flex-direction: column;\n animation: drawerSlideIn 0.22s ease-out;\n}\n\n@keyframes drawerSlideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n/* \u2500\u2500\u2500 Drawer Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: linear-gradient(135deg, var(--mj-brand-primary) 0%, var(--mj-brand-primary-hover) 100%);\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n}\n\n.query-drawer-title {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n\n.query-drawer-title > i {\n font-size: 18px;\n opacity: 0.9;\n flex-shrink: 0;\n}\n\n.query-drawer-title-main {\n font-size: 16px;\n font-weight: 600;\n line-height: 1.2;\n}\n\n.query-drawer-title-sub {\n font-size: 12px;\n opacity: 0.75;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 360px;\n margin-top: 2px;\n}\n\n.query-drawer-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: var(--mj-text-inverse);\n border-radius: 6px;\n cursor: pointer;\n font-size: 16px;\n flex-shrink: 0;\n transition: background 0.15s ease;\n}\n\n.query-drawer-close:hover {\n background: rgba(255, 255, 255, 0.28);\n}\n\n/* \u2500\u2500\u2500 Drawer Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.query-drawer-body::-webkit-scrollbar { width: 6px; }\n.query-drawer-body::-webkit-scrollbar-track { background: var(--mj-bg-surface-sunken); }\n.query-drawer-body::-webkit-scrollbar-thumb { background: var(--mj-border-strong); border-radius: 3px; }\n.query-drawer-body::-webkit-scrollbar-thumb:hover { background: var(--mj-text-disabled); }\n\n/* \u2500\u2500\u2500 Drawer Form Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.drawer-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.drawer-row {\n display: flex;\n gap: 12px;\n}\n\n.drawer-field-flex {\n flex: 1;\n min-width: 0;\n}\n\n.drawer-field-sql {\n flex: 1;\n}\n\n.drawer-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.drawer-required {\n color: var(--mj-status-error);\n margin-left: 2px;\n}\n\n.drawer-input,\n.drawer-select,\n.drawer-textarea {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n box-sizing: border-box;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n outline: none;\n font-family: inherit;\n}\n\n.drawer-input:focus,\n.drawer-select:focus,\n.drawer-textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.drawer-input:disabled,\n.drawer-select:disabled,\n.drawer-textarea:disabled {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-disabled);\n cursor: not-allowed;\n}\n\n.drawer-textarea {\n resize: vertical;\n min-height: 70px;\n}\n\n.drawer-sql-editor {\n display: block;\n min-height: 220px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.drawer-field-error .drawer-input,\n.drawer-field-error .drawer-select {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.drawer-field-hint {\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.drawer-field-inline {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.drawer-field-inline .drawer-field-hint {\n color: var(--mj-text-muted);\n}\n\n.drawer-reusable-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n cursor: pointer;\n white-space: nowrap;\n}\n\n/* \u2500\u2500\u2500 Open Full Record link \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.drawer-full-record {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-brand-primary-hover);\n flex-wrap: wrap;\n}\n\n.drawer-full-record > i {\n flex-shrink: 0;\n color: var(--mj-brand-primary);\n}\n\n.drawer-link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-primary-hover);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n padding: 0;\n text-decoration: underline;\n text-underline-offset: 2px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.drawer-link-btn:hover {\n color: var(--mj-brand-primary-active);\n}\n\n/* \u2500\u2500\u2500 Drawer Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.query-drawer-footer {\n flex-shrink: 0;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.drawer-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-status-error-text);\n}\n\n.drawer-footer-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n/* \u2500\u2500\u2500 Drawer Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.drawer-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 18px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.drawer-btn:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.drawer-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.drawer-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.drawer-btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n\n.drawer-btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n/* \u2500\u2500\u2500 Responsive drawer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 600px) {\n .query-drawer {\n width: 100vw;\n max-width: 100vw;\n }\n\n .drawer-row {\n flex-direction: column;\n }\n}\n\n.drawer-diagnostics {\n margin-bottom: var(--mj-space-3);\n max-height: 40vh;\n overflow: auto;\n}\n"] }]
|
|
2031
2154
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i1.MJConfirmService }], { drawerSqlEditor: [{
|
|
2032
2155
|
type: ViewChild,
|
|
2033
2156
|
args: ['drawerSqlEditor']
|
|
@@ -2035,5 +2158,5 @@ export { QueryBrowserResourceComponent };
|
|
|
2035
2158
|
type: HostListener,
|
|
2036
2159
|
args: ['document:keydown.escape']
|
|
2037
2160
|
}] }); })();
|
|
2038
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryBrowserResourceComponent, { className: "QueryBrowserResourceComponent", filePath: "src/QueryBrowser/query-browser-resource.component.ts", lineNumber:
|
|
2161
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryBrowserResourceComponent, { className: "QueryBrowserResourceComponent", filePath: "src/QueryBrowser/query-browser-resource.component.ts", lineNumber: 94 }); })();
|
|
2039
2162
|
//# sourceMappingURL=query-browser-resource.component.js.map
|