@memberjunction/ng-dashboards 6.2.0-edge.6 → 6.2.0-edge.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.md +23 -16
  2. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +2 -2
  3. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  4. package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/realtime/realtime-management.component.js +3 -1
  6. package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -1
  7. package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +1 -1
  8. package/dist/AI/components/analytics/realtime/realtime-overview.component.js +3 -3
  9. package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -1
  10. package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +6 -4
  11. package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/realtime/realtime-session-data.js +8 -2
  13. package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -1
  14. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +6 -6
  15. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  16. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +1 -1
  17. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
  18. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -1
  19. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +1 -0
  20. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -1
  21. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
  22. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1 -0
  23. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
  24. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  25. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1 -0
  26. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  27. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
  29. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  30. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  31. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  32. package/dist/AI/components/tags/tags-resource.component.js +3 -2
  33. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  34. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  35. package/dist/AI/components/vectors/vector-management-resource.component.js +12 -6
  36. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  37. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  38. package/dist/AI/services/ai-instrumentation.service.js +4 -2
  39. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  40. package/dist/Actions/action-result-code.d.ts +80 -0
  41. package/dist/Actions/action-result-code.d.ts.map +1 -0
  42. package/dist/Actions/action-result-code.js +163 -0
  43. package/dist/Actions/action-result-code.js.map +1 -0
  44. package/dist/Actions/components/actions-overview.component.d.ts +8 -0
  45. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  46. package/dist/Actions/components/actions-overview.component.js +12 -9
  47. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  48. package/dist/Actions/components/execution-monitoring.component.d.ts +29 -9
  49. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  50. package/dist/Actions/components/execution-monitoring.component.js +65 -42
  51. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  52. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
  53. package/dist/Actions/components/explorer/action-card.component.js +5 -4
  54. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  55. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +92 -130
  56. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -1
  57. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +189 -274
  58. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -1
  59. package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts +29 -0
  60. package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts.map +1 -0
  61. package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js +666 -0
  62. package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js.map +1 -0
  63. package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts +56 -0
  64. package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts.map +1 -0
  65. package/dist/ChiefOfStaff/chief-of-staff-governance.component.js +515 -0
  66. package/dist/ChiefOfStaff/chief-of-staff-governance.component.js.map +1 -0
  67. package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts +14 -0
  68. package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts.map +1 -0
  69. package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js +39 -0
  70. package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js.map +1 -0
  71. package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts +17 -0
  72. package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts.map +1 -0
  73. package/dist/ChiefOfStaff/chief-of-staff-overview.component.js +485 -0
  74. package/dist/ChiefOfStaff/chief-of-staff-overview.component.js.map +1 -0
  75. package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts +139 -0
  76. package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts.map +1 -0
  77. package/dist/ChiefOfStaff/chief-of-staff-page-base.js +602 -0
  78. package/dist/ChiefOfStaff/chief-of-staff-page-base.js.map +1 -0
  79. package/dist/ChiefOfStaff/index.d.ts +4 -1
  80. package/dist/ChiefOfStaff/index.d.ts.map +1 -1
  81. package/dist/ChiefOfStaff/index.js +4 -1
  82. package/dist/ChiefOfStaff/index.js.map +1 -1
  83. package/dist/Communication/communication-monitor-resource.component.js +3 -3
  84. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  85. package/dist/Communication/communication-runs-resource.component.js +3 -3
  86. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  87. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  88. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
  89. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  90. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  91. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -1
  92. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  93. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
  94. package/dist/ComponentStudio/services/component-version.service.js +3 -0
  95. package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
  96. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +21 -2
  97. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  98. package/dist/DataExplorer/data-explorer-dashboard.component.js +32 -5
  99. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  100. package/dist/DevTools/graphql-console.component.js +2 -2
  101. package/dist/DevTools/lazy-module-status.component.js +2 -2
  102. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
  103. package/dist/FormBuilder/form-builder-resource.component.js +5 -0
  104. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
  105. package/dist/Integration/components/connections/connections.component.js +2 -2
  106. package/dist/Integration/services/integration-data.service.d.ts +1 -1
  107. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  108. package/dist/Integration/services/integration-data.service.js +4 -3
  109. package/dist/Integration/services/integration-data.service.js.map +1 -1
  110. package/dist/Lists/components/lists-browse-resource.component.js +1 -1
  111. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  112. package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
  113. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  114. package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
  115. package/dist/LoginStudio/login-studio-resource.component.js +1 -0
  116. package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
  117. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
  118. package/dist/PredictiveStudio/components/ps-experiments.component.js +1 -0
  119. package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
  120. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +2 -2
  121. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
  122. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +3 -0
  123. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
  124. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
  125. package/dist/PredictiveStudio/engine/predictive-studio.engine.js +1 -0
  126. package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
  127. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
  128. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +1 -0
  129. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
  130. package/dist/QueryBrowser/query-browser-resource.component.d.ts +26 -0
  131. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  132. package/dist/QueryBrowser/query-browser-resource.component.js +375 -252
  133. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  134. package/dist/UserRoutines/user-routines-resource.component.d.ts +8 -1
  135. package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -1
  136. package/dist/UserRoutines/user-routines-resource.component.js +22 -4
  137. package/dist/UserRoutines/user-routines-resource.component.js.map +1 -1
  138. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  139. package/dist/VersionHistory/components/diff-resource.component.js +1 -0
  140. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  141. package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts +162 -0
  142. package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts.map +1 -0
  143. package/dist/VideoStudio/components/vs-archetype-editor.component.js +1105 -0
  144. package/dist/VideoStudio/components/vs-archetype-editor.component.js.map +1 -0
  145. package/dist/VideoStudio/components/vs-audio-options.component.d.ts +27 -0
  146. package/dist/VideoStudio/components/vs-audio-options.component.d.ts.map +1 -0
  147. package/dist/VideoStudio/components/vs-audio-options.component.js +119 -0
  148. package/dist/VideoStudio/components/vs-audio-options.component.js.map +1 -0
  149. package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts +105 -0
  150. package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts.map +1 -0
  151. package/dist/VideoStudio/components/vs-copilot-panel.component.js +560 -0
  152. package/dist/VideoStudio/components/vs-copilot-panel.component.js.map +1 -0
  153. package/dist/VideoStudio/components/vs-production-brief.component.d.ts +163 -0
  154. package/dist/VideoStudio/components/vs-production-brief.component.d.ts.map +1 -0
  155. package/dist/VideoStudio/components/vs-production-brief.component.js +1054 -0
  156. package/dist/VideoStudio/components/vs-production-brief.component.js.map +1 -0
  157. package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts +43 -0
  158. package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts.map +1 -0
  159. package/dist/VideoStudio/components/vs-setup-health-card.component.js +412 -0
  160. package/dist/VideoStudio/components/vs-setup-health-card.component.js.map +1 -0
  161. package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts +73 -0
  162. package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts.map +1 -0
  163. package/dist/VideoStudio/components/vs-studio-slide-in.component.js +271 -0
  164. package/dist/VideoStudio/components/vs-studio-slide-in.component.js.map +1 -0
  165. package/dist/VideoStudio/index.d.ts +12 -0
  166. package/dist/VideoStudio/index.d.ts.map +1 -0
  167. package/dist/VideoStudio/index.js +12 -0
  168. package/dist/VideoStudio/index.js.map +1 -0
  169. package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts +118 -0
  170. package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts.map +1 -0
  171. package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js +964 -0
  172. package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js.map +1 -0
  173. package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts +70 -0
  174. package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts.map +1 -0
  175. package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js +600 -0
  176. package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js.map +1 -0
  177. package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts +182 -0
  178. package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts.map +1 -0
  179. package/dist/VideoStudio/resources/video-studio-productions-resource.component.js +1481 -0
  180. package/dist/VideoStudio/resources/video-studio-productions-resource.component.js.map +1 -0
  181. package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts +102 -0
  182. package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts.map +1 -0
  183. package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js +240 -0
  184. package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js.map +1 -0
  185. package/dist/VideoStudio/video-studio-agent-context.d.ts +495 -0
  186. package/dist/VideoStudio/video-studio-agent-context.d.ts.map +1 -0
  187. package/dist/VideoStudio/video-studio-agent-context.js +992 -0
  188. package/dist/VideoStudio/video-studio-agent-context.js.map +1 -0
  189. package/dist/ai-dashboards.module.d.ts +25 -22
  190. package/dist/ai-dashboards.module.d.ts.map +1 -1
  191. package/dist/ai-dashboards.module.js +23 -7
  192. package/dist/ai-dashboards.module.js.map +1 -1
  193. package/dist/module.d.ts +13 -12
  194. package/dist/module.d.ts.map +1 -1
  195. package/dist/module.js +7 -0
  196. package/dist/module.js.map +1 -1
  197. package/dist/public-api.d.ts +7 -1
  198. package/dist/public-api.d.ts.map +1 -1
  199. package/dist/public-api.js +9 -2
  200. package/dist/public-api.js.map +1 -1
  201. package/dist/shared/action-scheduled-job.d.ts.map +1 -1
  202. package/dist/shared/action-scheduled-job.js +2 -0
  203. package/dist/shared/action-scheduled-job.js.map +1 -1
  204. package/dist/video-studio-dashboards.module.d.ts +40 -0
  205. package/dist/video-studio-dashboards.module.d.ts.map +1 -0
  206. package/dist/video-studio-dashboards.module.js +159 -0
  207. package/dist/video-studio-dashboards.module.js.map +1 -0
  208. package/package.json +77 -71
  209. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +0 -195
  210. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +0 -1
  211. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +0 -2910
  212. 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", 33);
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", 34);
30
+ i0.ɵɵelement(1, "i", 36);
31
31
  i0.ɵɵelementEnd();
32
32
  } }
33
- function QueryBrowserResourceComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
33
+ function QueryBrowserResourceComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
34
34
  const _r3 = i0.ɵɵgetCurrentView();
35
- i0.ɵɵelementStart(0, "button", 35);
36
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
37
- i0.ɵɵelement(1, "i", 36);
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 QueryBrowserResourceComponent_For_24_Conditional_0_Template(rf, ctx) { if (rf & 1) {
40
+ function QueryBrowserResourceComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
41
41
  const _r4 = i0.ɵɵgetCurrentView();
42
- i0.ɵɵelementStart(0, "button", 38);
43
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_For_24_Conditional_0_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const status_r5 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleStatusFilter(status_r5)); });
44
- i0.ɵɵelement(1, "i", 39);
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", 40);
55
+ i0.ɵɵelementStart(4, "span", 44);
49
56
  i0.ɵɵtext(5);
50
57
  i0.ɵɵelementEnd()();
51
58
  } if (rf & 2) {
52
- const status_r5 = i0.ɵɵnextContext().$implicit;
59
+ const status_r6 = i0.ɵɵnextContext().$implicit;
53
60
  const ctx_r1 = i0.ɵɵnextContext();
54
- i0.ɵɵstyleProp("--chip-color", ctx_r1.getStatusColor(status_r5));
55
- i0.ɵɵclassProp("active", ctx_r1.StatusFilters[status_r5]);
56
- i0.ɵɵproperty("title", (ctx_r1.StatusFilters[status_r5] ? "Hide" : "Show") + " " + status_r5 + " queries");
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(status_r5));
65
+ i0.ɵɵclassMap(ctx_r1.getStatusIcon(status_r6));
59
66
  i0.ɵɵadvance(2);
60
- i0.ɵɵtextInterpolate(status_r5);
67
+ i0.ɵɵtextInterpolate(status_r6);
61
68
  i0.ɵɵadvance(2);
62
- i0.ɵɵtextInterpolate(ctx_r1.getStatusCount(status_r5));
69
+ i0.ɵɵtextInterpolate(ctx_r1.getStatusCount(status_r6));
63
70
  } }
64
- function QueryBrowserResourceComponent_For_24_Template(rf, ctx) { if (rf & 1) {
65
- i0.ɵɵconditionalCreate(0, QueryBrowserResourceComponent_For_24_Conditional_0_Template, 6, 9, "button", 37);
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 status_r5 = ctx.$implicit;
74
+ const status_r6 = ctx.$implicit;
68
75
  const ctx_r1 = i0.ɵɵnextContext();
69
- i0.ɵɵconditional(ctx_r1.getStatusCount(status_r5) > 0 ? 0 : -1);
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.ɵɵelement(0, "mj-empty-state", 24);
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 QueryBrowserResourceComponent_Conditional_29_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
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 QueryBrowserResourceComponent_Conditional_29_For_2_Template(rf, ctx) { if (rf & 1) {
89
- i0.ɵɵtemplate(0, QueryBrowserResourceComponent_Conditional_29_For_2_ng_container_0_Template, 1, 0, "ng-container", 42);
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 node_r6 = ctx.$implicit;
98
+ const node_r7 = ctx.$implicit;
92
99
  i0.ɵɵnextContext(2);
93
- const categoryNode_r7 = i0.ɵɵreference(36);
94
- i0.ɵɵproperty("ngTemplateOutlet", categoryNode_r7)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, node_r6));
100
+ const categoryNode_r8 = i0.ɵɵreference(37);
101
+ i0.ɵɵproperty("ngTemplateOutlet", categoryNode_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, node_r7));
95
102
  } }
96
- function QueryBrowserResourceComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
97
- i0.ɵɵelementStart(0, "div", 26);
98
- i0.ɵɵrepeaterCreate(1, QueryBrowserResourceComponent_Conditional_29_For_2_Template, 1, 4, "ng-container", null, i0.ɵɵcomponentInstance().trackByCategory, true);
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 QueryBrowserResourceComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
106
- const _r8 = i0.ɵɵgetCurrentView();
107
- i0.ɵɵelementStart(0, "mj-empty-state", 43);
108
- i0.ɵɵlistener("Action", function QueryBrowserResourceComponent_Conditional_33_Template_mj_empty_state_Action_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenCreateDrawer()); });
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 QueryBrowserResourceComponent_Conditional_34_Conditional_6_Template(rf, ctx) { if (rf & 1) {
115
- i0.ɵɵelementStart(0, "span", 52);
116
- i0.ɵɵelement(1, "i", 39);
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 QueryBrowserResourceComponent_Conditional_34_Conditional_7_Template(rf, ctx) { if (rf & 1) {
128
- i0.ɵɵelementStart(0, "span", 53);
129
- i0.ɵɵelement(1, "i", 54);
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 QueryBrowserResourceComponent_Conditional_34_Conditional_8_Template(rf, ctx) { if (rf & 1) {
137
- const _r10 = i0.ɵɵgetCurrentView();
138
- i0.ɵɵelementStart(0, "button", 55);
139
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_34_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenEditDrawer(ctx_r1.selectedQuery)); });
140
- i0.ɵɵelement(1, "i", 56);
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 QueryBrowserResourceComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
144
- const _r9 = i0.ɵɵgetCurrentView();
145
- i0.ɵɵelementStart(0, "div", 44)(1, "div", 45);
146
- i0.ɵɵelement(2, "i", 46);
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", 47);
151
- i0.ɵɵconditionalCreate(6, QueryBrowserResourceComponent_Conditional_34_Conditional_6_Template, 3, 5, "span", 48)(7, QueryBrowserResourceComponent_Conditional_34_Conditional_7_Template, 3, 2, "span", 49);
152
- i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_Conditional_34_Conditional_8_Template, 2, 0, "button", 50);
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", 51);
155
- i0.ɵɵlistener("EntityLinkClick", function QueryBrowserResourceComponent_Conditional_34_Template_mj_query_viewer_EntityLinkClick_9_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onEntityLinkClick($event)); })("RowDoubleClick", function QueryBrowserResourceComponent_Conditional_34_Template_mj_query_viewer_RowDoubleClick_9_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRowDoubleClick($event)); })("OpenQueryRecord", function QueryBrowserResourceComponent_Conditional_34_Template_mj_query_viewer_OpenQueryRecord_9_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenQueryRecord($event)); })("CompositionTokenClick", function QueryBrowserResourceComponent_Conditional_34_Template_mj_query_viewer_CompositionTokenClick_9_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCompositionTokenClick($event)); })("QueryComplete", function QueryBrowserResourceComponent_Conditional_34_Template_mj_query_viewer_QueryComplete_9_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewerQueryComplete($event)); });
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 QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_8_Template(rf, ctx) { if (rf & 1) {
169
- const _r13 = i0.ɵɵgetCurrentView();
170
- i0.ɵɵelementStart(0, "button", 66);
171
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_8_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const node_r12 = i0.ɵɵnextContext(2).node; const ctx_r1 = i0.ɵɵnextContext(); ctx_r1.OpenCreateDrawer(node_r12.category.ID); return i0.ɵɵresetView($event.stopPropagation()); });
172
- i0.ɵɵelement(1, "i", 34);
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 node_r12 = i0.ɵɵnextContext(2).node;
176
- i0.ɵɵproperty("title", i0.ɵɵinterpolate1("New query in ", node_r12.category.Name));
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 QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
179
- i0.ɵɵelementStart(0, "span", 73);
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 query_r15 = i0.ɵɵnextContext().$implicit;
205
+ const query_r17 = i0.ɵɵnextContext().$implicit;
184
206
  i0.ɵɵadvance();
185
- i0.ɵɵtextInterpolate(query_r15.Description);
207
+ i0.ɵɵtextInterpolate(query_r17.Description);
186
208
  } }
187
- function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
188
- i0.ɵɵelement(0, "i", 74);
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 QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
191
- i0.ɵɵelementStart(0, "span", 77);
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 query_r15 = i0.ɵɵnextContext().$implicit;
217
+ const query_r17 = i0.ɵɵnextContext().$implicit;
196
218
  const ctx_r1 = i0.ɵɵnextContext(4);
197
- i0.ɵɵstyleProp("background", ctx_r1.getStatusColor(query_r15.Status));
198
- i0.ɵɵproperty("title", query_r15.Status);
219
+ i0.ɵɵstyleProp("background", ctx_r1.getStatusColor(query_r17.Status));
220
+ i0.ɵɵproperty("title", query_r17.Status);
199
221
  i0.ɵɵadvance();
200
- i0.ɵɵtextInterpolate1(" ", query_r15.Status, " ");
222
+ i0.ɵɵtextInterpolate1(" ", query_r17.Status, " ");
201
223
  } }
202
- function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
203
- const _r16 = i0.ɵɵgetCurrentView();
204
- i0.ɵɵelementStart(0, "button", 78);
205
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_9_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r16); const query_r15 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenEditDrawer(query_r15, $event)); });
206
- i0.ɵɵelement(1, "i", 56);
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 QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
210
- const _r14 = i0.ɵɵgetCurrentView();
211
- i0.ɵɵelementStart(0, "div", 68);
212
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Template_div_click_0_listener($event) { const query_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.selectQuery(query_r15, $event)); });
213
- i0.ɵɵelement(1, "span", 69)(2, "i", 70);
214
- i0.ɵɵelementStart(3, "div", 71)(4, "span", 72);
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, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_6_Template, 2, 1, "span", 73);
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, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_7_Template, 1, 0, "i", 74);
220
- i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_8_Template, 2, 4, "span", 75);
221
- i0.ɵɵconditionalCreate(9, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_9_Template, 2, 0, "button", 76);
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 query_r15 = ctx.$implicit;
246
+ const query_r17 = ctx.$implicit;
225
247
  const ctx_r1 = i0.ɵɵnextContext(4);
226
- i0.ɵɵclassProp("selected", ctx_r1.IsQuerySelected(query_r15))("hidden", !ctx_r1.isQueryVisible(query_r15));
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(query_r15.Status));
229
- i0.ɵɵproperty("title", query_r15.Status);
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", query_r15.Description || query_r15.Name);
253
+ i0.ɵɵproperty("title", query_r17.Description || query_r17.Name);
232
254
  i0.ɵɵadvance(2);
233
- i0.ɵɵtextInterpolate(query_r15.Name);
255
+ i0.ɵɵtextInterpolate(query_r17.Name);
234
256
  i0.ɵɵadvance();
235
- i0.ɵɵconditional(query_r15.Description ? 6 : -1);
257
+ i0.ɵɵconditional(query_r17.Description ? 6 : -1);
236
258
  i0.ɵɵadvance();
237
- i0.ɵɵconditional(query_r15.UsesTemplate ? 7 : -1);
259
+ i0.ɵɵconditional(query_r17.UsesTemplate ? 7 : -1);
238
260
  i0.ɵɵadvance();
239
- i0.ɵɵconditional(query_r15.Status !== "Approved" ? 8 : -1);
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 QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
244
- i0.ɵɵelementStart(0, "div", 65);
245
- i0.ɵɵrepeaterCreate(1, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Template, 10, 13, "div", 67, i0.ɵɵcomponentInstance().trackByQuery, true);
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 node_r12 = i0.ɵɵnextContext(2).node;
270
+ const node_r13 = i0.ɵɵnextContext(2).node;
249
271
  i0.ɵɵadvance();
250
- i0.ɵɵrepeater(node_r12.queries);
272
+ i0.ɵɵrepeater(node_r13.queries);
251
273
  } }
252
- function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
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 QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_For_1_Template(rf, ctx) { if (rf & 1) {
256
- i0.ɵɵtemplate(0, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_For_1_ng_container_0_Template, 1, 0, "ng-container", 42);
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 child_r17 = ctx.$implicit;
280
+ const child_r19 = ctx.$implicit;
259
281
  i0.ɵɵnextContext(4);
260
- const categoryNode_r7 = i0.ɵɵreference(36);
261
- i0.ɵɵproperty("ngTemplateOutlet", categoryNode_r7)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, child_r17));
282
+ const categoryNode_r8 = i0.ɵɵreference(37);
283
+ i0.ɵɵproperty("ngTemplateOutlet", categoryNode_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, child_r19));
262
284
  } }
263
- function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
264
- i0.ɵɵrepeaterCreate(0, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_For_1_Template, 1, 4, "ng-container", null, i0.ɵɵcomponentInstance().trackByCategory, true);
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 node_r12 = i0.ɵɵnextContext(2).node;
267
- i0.ɵɵrepeater(node_r12.children);
288
+ const node_r13 = i0.ɵɵnextContext(2).node;
289
+ i0.ɵɵrepeater(node_r13.children);
268
290
  } }
269
- function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Template(rf, ctx) { if (rf & 1) {
270
- const _r11 = i0.ɵɵgetCurrentView();
271
- i0.ɵɵelementStart(0, "div", 58)(1, "div", 59);
272
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r11); const node_r12 = i0.ɵɵnextContext().node; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleExpand(node_r12)); });
273
- i0.ɵɵelement(2, "i", 60)(3, "i", 61);
274
- i0.ɵɵelementStart(4, "span", 62);
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", 63);
299
+ i0.ɵɵelementStart(6, "span", 67);
278
300
  i0.ɵɵtext(7);
279
301
  i0.ɵɵelementEnd();
280
- i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_8_Template, 2, 2, "button", 64);
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(9, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_Template, 3, 0, "div", 65);
283
- i0.ɵɵconditionalCreate(10, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_Template, 2, 0);
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 node_r12 = i0.ɵɵnextContext().node;
309
+ const node_r13 = i0.ɵɵnextContext().node;
287
310
  const ctx_r1 = i0.ɵɵnextContext();
288
- i0.ɵɵstyleProp("padding-left", node_r12.level * 16 + 8, "px");
289
- i0.ɵɵclassProp("expanded", node_r12.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", node_r12.expanded)("fa-chevron-right", !node_r12.expanded);
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", node_r12.expanded);
316
+ i0.ɵɵclassProp("fa-folder-open", node_r13.expanded);
294
317
  i0.ɵɵadvance(2);
295
- i0.ɵɵtextInterpolate(node_r12.category.Name);
318
+ i0.ɵɵtextInterpolate(node_r13.category.Name);
296
319
  i0.ɵɵadvance(2);
297
- i0.ɵɵtextInterpolate1("(", ctx_r1.getNodeQueryCount(node_r12), ")");
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 && node_r12.category.ID !== "__uncategorized__" ? 8 : -1);
324
+ i0.ɵɵconditional(ctx_r1.CanCreateQuery && node_r13.category.ID !== "__uncategorized__" ? 9 : -1);
300
325
  i0.ɵɵadvance();
301
- i0.ɵɵconditional(node_r12.expanded ? 9 : -1);
326
+ i0.ɵɵconditional(node_r13.expanded ? 10 : -1);
302
327
  i0.ɵɵadvance();
303
- i0.ɵɵconditional(node_r12.expanded ? 10 : -1);
328
+ i0.ɵɵconditional(node_r13.expanded ? 11 : -1);
304
329
  } }
305
- function QueryBrowserResourceComponent_ng_template_35_Template(rf, ctx) { if (rf & 1) {
306
- i0.ɵɵconditionalCreate(0, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Template, 11, 15, "div", 57);
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 node_r12 = ctx.node;
333
+ const node_r13 = ctx.node;
309
334
  const ctx_r1 = i0.ɵɵnextContext();
310
- i0.ɵɵconditional(ctx_r1.hasVisibleContent(node_r12) ? 0 : -1);
335
+ i0.ɵɵconditional(ctx_r1.hasVisibleContent(node_r13) ? 0 : -1);
311
336
  } }
312
- function QueryBrowserResourceComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
313
- const _r18 = i0.ɵɵgetCurrentView();
314
- i0.ɵɵelementStart(0, "div", 79);
315
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_37_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrawerBackdropClick()); });
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 QueryBrowserResourceComponent_Conditional_38_Conditional_7_Template(rf, ctx) { if (rf & 1) {
319
- i0.ɵɵelementStart(0, "div", 83);
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 QueryBrowserResourceComponent_Conditional_38_Conditional_17_Template(rf, ctx) { if (rf & 1) {
328
- i0.ɵɵelementStart(0, "span", 90);
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 QueryBrowserResourceComponent_Conditional_38_For_28_Template(rf, ctx) { if (rf & 1) {
333
- i0.ɵɵelementStart(0, "option", 95);
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 s_r20 = ctx.$implicit;
338
- i0.ɵɵproperty("value", s_r20);
362
+ const s_r22 = ctx.$implicit;
363
+ i0.ɵɵproperty("value", s_r22);
339
364
  i0.ɵɵadvance();
340
- i0.ɵɵtextInterpolate(s_r20);
365
+ i0.ɵɵtextInterpolate(s_r22);
341
366
  } }
342
- function QueryBrowserResourceComponent_Conditional_38_Conditional_45_Template(rf, ctx) { if (rf & 1) {
343
- const _r21 = i0.ɵɵgetCurrentView();
344
- i0.ɵɵelementStart(0, "div", 102);
345
- i0.ɵɵelement(1, "i", 108);
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", 109);
348
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Conditional_45_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenFullRecord()); });
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", 110);
375
+ i0.ɵɵelement(5, "i", 117);
351
376
  i0.ɵɵelementEnd()();
352
377
  } }
353
- function QueryBrowserResourceComponent_Conditional_38_Conditional_47_Template(rf, ctx) { if (rf & 1) {
354
- i0.ɵɵelementStart(0, "div", 104);
355
- i0.ɵɵelement(1, "i", 111);
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 QueryBrowserResourceComponent_Conditional_38_Conditional_50_Template(rf, ctx) { if (rf & 1) {
364
- i0.ɵɵelement(0, "i", 112);
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 QueryBrowserResourceComponent_Conditional_38_Conditional_51_Template(rf, ctx) { if (rf & 1) {
368
- i0.ɵɵelement(0, "i", 113);
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 QueryBrowserResourceComponent_Conditional_38_Template(rf, ctx) { if (rf & 1) {
372
- const _r19 = i0.ɵɵgetCurrentView();
373
- i0.ɵɵelementStart(0, "div", 32)(1, "div", 80)(2, "div", 81);
374
- i0.ɵɵelement(3, "i", 39);
375
- i0.ɵɵelementStart(4, "div")(5, "div", 82);
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, QueryBrowserResourceComponent_Conditional_38_Conditional_7_Template, 2, 1, "div", 83);
409
+ i0.ɵɵconditionalCreate(7, QueryBrowserResourceComponent_Conditional_39_Conditional_7_Template, 2, 1, "div", 89);
379
410
  i0.ɵɵelementEnd()();
380
- i0.ɵɵelementStart(8, "button", 84);
381
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseDrawer()); });
382
- i0.ɵɵelement(9, "i", 36);
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", 85)(11, "div", 86)(12, "label", 87);
415
+ i0.ɵɵelementStart(10, "div", 91)(11, "div", 92)(12, "label", 93);
385
416
  i0.ɵɵtext(13, "Name ");
386
- i0.ɵɵelementStart(14, "span", 88);
417
+ i0.ɵɵelementStart(14, "span", 94);
387
418
  i0.ɵɵtext(15, "*");
388
419
  i0.ɵɵelementEnd()();
389
- i0.ɵɵelementStart(16, "input", 89);
390
- i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DrawerName, $event) || (ctx_r1.DrawerName = $event); return i0.ɵɵresetView($event); });
391
- i0.ɵɵlistener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_input_ngModelChange_16_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.DrawerNameError = false); });
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, QueryBrowserResourceComponent_Conditional_38_Conditional_17_Template, 2, 0, "span", 90);
424
+ i0.ɵɵconditionalCreate(17, QueryBrowserResourceComponent_Conditional_39_Conditional_17_Template, 2, 0, "span", 96);
394
425
  i0.ɵɵelementEnd();
395
- i0.ɵɵelementStart(18, "div", 91)(19, "div", 92)(20, "label", 87);
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", 93);
399
- i0.ɵɵlistener("ValueChange", function QueryBrowserResourceComponent_Conditional_38_Template_mj_tree_dropdown_ValueChange_22_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrawerCategoryChange($event)); });
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", 92)(24, "label", 87);
432
+ i0.ɵɵelementStart(23, "div", 98)(24, "label", 93);
402
433
  i0.ɵɵtext(25, "Status");
403
434
  i0.ɵɵelementEnd();
404
- i0.ɵɵelementStart(26, "select", 94);
405
- i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_select_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DrawerStatus, $event) || (ctx_r1.DrawerStatus = $event); return i0.ɵɵresetView($event); });
406
- i0.ɵɵrepeaterCreate(27, QueryBrowserResourceComponent_Conditional_38_For_28_Template, 2, 2, "option", 95, i0.ɵɵrepeaterTrackByIdentity);
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", 96)(30, "label", 97)(31, "input", 98);
409
- i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_input_ngModelChange_31_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DrawerReusable, $event) || (ctx_r1.DrawerReusable = $event); return i0.ɵɵresetView($event); });
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", 90);
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", 86)(37, "label", 87);
448
+ i0.ɵɵelementStart(36, "div", 92)(37, "label", 93);
418
449
  i0.ɵɵtext(38, "Description");
419
450
  i0.ɵɵelementEnd();
420
- i0.ɵɵelementStart(39, "textarea", 99);
421
- i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_textarea_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DrawerDescription, $event) || (ctx_r1.DrawerDescription = $event); return i0.ɵɵresetView($event); });
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", 100)(41, "label", 87);
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", 101, 1);
427
- i0.ɵɵlistener("change", function QueryBrowserResourceComponent_Conditional_38_Template_mj_code_editor_change_43_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDrawerSQLChange($event)); });
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, QueryBrowserResourceComponent_Conditional_38_Conditional_45_Template, 6, 0, "div", 102);
460
+ i0.ɵɵconditionalCreate(45, QueryBrowserResourceComponent_Conditional_39_Conditional_45_Template, 6, 0, "div", 108);
430
461
  i0.ɵɵelementEnd();
431
- i0.ɵɵelementStart(46, "div", 103);
432
- i0.ɵɵconditionalCreate(47, QueryBrowserResourceComponent_Conditional_38_Conditional_47_Template, 3, 1, "div", 104);
433
- i0.ɵɵelementStart(48, "div", 105)(49, "button", 106);
434
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Template_button_click_49_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SaveDrawer()); });
435
- i0.ɵɵconditionalCreate(50, QueryBrowserResourceComponent_Conditional_38_Conditional_50_Template, 2, 0)(51, QueryBrowserResourceComponent_Conditional_38_Conditional_51_Template, 2, 0);
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(52, "button", 107);
438
- i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Template_button_click_52_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseDrawer()); });
439
- i0.ɵɵtext(53, " Cancel ");
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.DrawerSaveError ? 47 : -1);
475
- i0.ɵɵadvance(2);
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 ? 50 : 51);
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.DrawerSaveError = 'Save failed. Please check your inputs and try again.';
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: 39, vars: 23, 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"], [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"], ["title", "New Query", 1, "icon-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [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"], ["title", "Edit Query", 1, "icon-btn"], [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", "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", 3, "title"], [1, "category-queries"], [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"], [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) {
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(21, QueryBrowserResourceComponent_Conditional_21_Template, 2, 0, "button", 20);
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(22, "div", 21);
1969
- i0.ɵɵrepeaterCreate(23, QueryBrowserResourceComponent_For_24_Template, 1, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
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(25, "div", 22);
1972
- i0.ɵɵconditionalCreate(26, QueryBrowserResourceComponent_Conditional_26_Template, 2, 0, "div", 23);
1973
- i0.ɵɵconditionalCreate(27, QueryBrowserResourceComponent_Conditional_27_Template, 1, 0, "mj-empty-state", 24);
1974
- i0.ɵɵconditionalCreate(28, QueryBrowserResourceComponent_Conditional_28_Template, 1, 1, "mj-empty-state", 25);
1975
- i0.ɵɵconditionalCreate(29, QueryBrowserResourceComponent_Conditional_29_Template, 3, 0, "div", 26);
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(30, "div", 27);
1978
- i0.ɵɵlistener("mousedown", function QueryBrowserResourceComponent_Template_div_mousedown_30_listener($event) { return ctx.OnResizeStart($event); })("keydown", function QueryBrowserResourceComponent_Template_div_keydown_30_listener($event) { return ctx.OnResizeKeydown($event); });
1979
- i0.ɵɵelement(31, "div", 28);
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(32, "div", 29);
1982
- i0.ɵɵconditionalCreate(33, QueryBrowserResourceComponent_Conditional_33_Template, 1, 1, "mj-empty-state", 30);
1983
- i0.ɵɵconditionalCreate(34, QueryBrowserResourceComponent_Conditional_34_Template, 10, 6);
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(35, QueryBrowserResourceComponent_ng_template_35_Template, 1, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
1986
- i0.ɵɵconditionalCreate(37, QueryBrowserResourceComponent_Conditional_37_Template, 1, 0, "div", 31);
1987
- i0.ɵɵconditionalCreate(38, QueryBrowserResourceComponent_Conditional_38_Template, 54, 33, "div", 32);
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(10);
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 ? 21 : -1);
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 ? 26 : -1);
2125
+ i0.ɵɵconditional(ctx.isLoading ? 27 : -1);
2005
2126
  i0.ɵɵadvance();
2006
- i0.ɵɵconditional(!ctx.isLoading && ctx.queries.length === 0 ? 27 : -1);
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 ? 28 : -1);
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 ? 29 : -1);
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 ? 33 : -1);
2136
+ i0.ɵɵconditional(!ctx.selectedQuery ? 34 : -1);
2016
2137
  i0.ɵɵadvance();
2017
- i0.ɵɵconditional(ctx.selectedQuery ? 34 : -1);
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: 92 }); })();
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