@memberjunction/ng-dashboards 5.28.0 → 5.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +11 -9
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +21 -19
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +154 -154
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +8 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +15 -2
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +17 -5
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts +20 -0
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -0
- package/dist/Archiving/components/archive-config-resource.component.js +46 -0
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -0
- package/dist/Archiving/components/archive-runs-resource.component.d.ts +20 -0
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -0
- package/dist/Archiving/components/archive-runs-resource.component.js +46 -0
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +56 -71
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -8
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -74
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +25 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.js +99 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +21 -104
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +48 -530
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +5 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +18 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +251 -199
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +7 -2
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +10 -2
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +144 -144
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +12 -14
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +170 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2521 -758
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-filter-panel.component.d.ts +16 -1
- package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -1
- package/dist/MCP/mcp-filter-panel.component.js +187 -60
- package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts +0 -9
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -10
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +7 -6
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +4 -8
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.d.ts +38 -0
- package/dist/Permissions/audit-log-resource.component.d.ts.map +1 -0
- package/dist/Permissions/audit-log-resource.component.js +380 -0
- package/dist/Permissions/audit-log-resource.component.js.map +1 -0
- package/dist/Permissions/permissions-shared.d.ts +51 -0
- package/dist/Permissions/permissions-shared.d.ts.map +1 -0
- package/dist/Permissions/permissions-shared.js +91 -0
- package/dist/Permissions/permissions-shared.js.map +1 -0
- package/dist/Permissions/resource-access-resource.component.d.ts +45 -0
- package/dist/Permissions/resource-access-resource.component.d.ts.map +1 -0
- package/dist/Permissions/resource-access-resource.component.js +342 -0
- package/dist/Permissions/resource-access-resource.component.js.map +1 -0
- package/dist/Permissions/user-access-resource.component.d.ts +39 -0
- package/dist/Permissions/user-access-resource.component.d.ts.map +1 -0
- package/dist/Permissions/user-access-resource.component.js +346 -0
- package/dist/Permissions/user-access-resource.component.js.map +1 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +13 -3
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +186 -139
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +19 -0
- package/dist/archiving-dashboards.module.d.ts.map +1 -0
- package/dist/archiving-dashboards.module.js +52 -0
- package/dist/archiving-dashboards.module.js.map +1 -0
- package/dist/component-studio-dashboards.module.d.ts +1 -0
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +7 -0
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +24 -19
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +30 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +7 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +8 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.d.ts +1 -1
- package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.js +14 -4
- package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
- package/package.json +52 -48
|
@@ -17,9 +17,9 @@ import * as i2 from "@angular/forms";
|
|
|
17
17
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
18
18
|
import * as i4 from "@memberjunction/ng-code-editor";
|
|
19
19
|
import * as i5 from "@memberjunction/ng-query-viewer";
|
|
20
|
+
import * as i6 from "@memberjunction/ng-trees";
|
|
20
21
|
const _c0 = ["drawerSqlEditor"];
|
|
21
22
|
const _c1 = a0 => ({ node: a0 });
|
|
22
|
-
const _forTrack0 = ($index, $item) => $item.ID;
|
|
23
23
|
function QueryBrowserResourceComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
24
24
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
25
25
|
i0.ɵɵelementStart(0, "button", 32);
|
|
@@ -186,93 +186,103 @@ function QueryBrowserResourceComponent_Conditional_34_Template(rf, ctx) { if (rf
|
|
|
186
186
|
i0.ɵɵadvance();
|
|
187
187
|
i0.ɵɵproperty("QueryId", ctx_r2.selectedQuery.ID)("AutoRun", true)("SelectionMode", "multiple");
|
|
188
188
|
} }
|
|
189
|
-
function
|
|
190
|
-
i0.ɵɵ
|
|
189
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
190
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
191
|
+
i0.ɵɵelementStart(0, "button", 71);
|
|
192
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_8_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const node_r13 = i0.ɵɵnextContext(2).node; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.OpenCreateDrawer(node_r13.category.ID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
193
|
+
i0.ɵɵelement(1, "i", 33);
|
|
194
|
+
i0.ɵɵelementEnd();
|
|
195
|
+
} if (rf & 2) {
|
|
196
|
+
const node_r13 = i0.ɵɵnextContext(2).node;
|
|
197
|
+
i0.ɵɵproperty("title", i0.ɵɵinterpolate1("New query in ", node_r13.category.Name));
|
|
198
|
+
} }
|
|
199
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
200
|
+
i0.ɵɵelementStart(0, "span", 78);
|
|
191
201
|
i0.ɵɵtext(1);
|
|
192
202
|
i0.ɵɵelementEnd();
|
|
193
203
|
} if (rf & 2) {
|
|
194
|
-
const
|
|
204
|
+
const query_r16 = i0.ɵɵnextContext().$implicit;
|
|
195
205
|
i0.ɵɵadvance();
|
|
196
|
-
i0.ɵɵtextInterpolate(
|
|
206
|
+
i0.ɵɵtextInterpolate(query_r16.Description);
|
|
197
207
|
} }
|
|
198
|
-
function
|
|
199
|
-
i0.ɵɵelement(0, "i",
|
|
208
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
209
|
+
i0.ɵɵelement(0, "i", 79);
|
|
200
210
|
} }
|
|
201
|
-
function
|
|
202
|
-
i0.ɵɵelementStart(0, "span",
|
|
211
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
212
|
+
i0.ɵɵelementStart(0, "span", 82);
|
|
203
213
|
i0.ɵɵtext(1);
|
|
204
214
|
i0.ɵɵelementEnd();
|
|
205
215
|
} if (rf & 2) {
|
|
206
|
-
const
|
|
216
|
+
const query_r16 = i0.ɵɵnextContext().$implicit;
|
|
207
217
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
208
|
-
i0.ɵɵstyleProp("background", ctx_r2.getStatusColor(
|
|
209
|
-
i0.ɵɵproperty("title",
|
|
218
|
+
i0.ɵɵstyleProp("background", ctx_r2.getStatusColor(query_r16.Status));
|
|
219
|
+
i0.ɵɵproperty("title", query_r16.Status);
|
|
210
220
|
i0.ɵɵadvance();
|
|
211
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
221
|
+
i0.ɵɵtextInterpolate1(" ", query_r16.Status, " ");
|
|
212
222
|
} }
|
|
213
|
-
function
|
|
214
|
-
const
|
|
215
|
-
i0.ɵɵelementStart(0, "button",
|
|
216
|
-
i0.ɵɵlistener("click", function
|
|
223
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
224
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
225
|
+
i0.ɵɵelementStart(0, "button", 83);
|
|
226
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_9_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r17); const query_r16 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OpenEditDrawer(query_r16, $event)); });
|
|
217
227
|
i0.ɵɵelement(1, "i", 61);
|
|
218
228
|
i0.ɵɵelementEnd();
|
|
219
229
|
} }
|
|
220
|
-
function
|
|
221
|
-
const
|
|
222
|
-
i0.ɵɵelementStart(0, "div",
|
|
223
|
-
i0.ɵɵlistener("click", function
|
|
224
|
-
i0.ɵɵelement(1, "span",
|
|
225
|
-
i0.ɵɵelementStart(3, "div",
|
|
230
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
231
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
232
|
+
i0.ɵɵelementStart(0, "div", 73);
|
|
233
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Template_div_click_0_listener($event) { const query_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.selectQuery(query_r16, $event)); });
|
|
234
|
+
i0.ɵɵelement(1, "span", 74)(2, "i", 75);
|
|
235
|
+
i0.ɵɵelementStart(3, "div", 76)(4, "span", 77);
|
|
226
236
|
i0.ɵɵtext(5);
|
|
227
237
|
i0.ɵɵelementEnd();
|
|
228
|
-
i0.ɵɵconditionalCreate(6,
|
|
238
|
+
i0.ɵɵconditionalCreate(6, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_6_Template, 2, 1, "span", 78);
|
|
229
239
|
i0.ɵɵelementEnd();
|
|
230
|
-
i0.ɵɵconditionalCreate(7,
|
|
231
|
-
i0.ɵɵconditionalCreate(8,
|
|
232
|
-
i0.ɵɵconditionalCreate(9,
|
|
240
|
+
i0.ɵɵconditionalCreate(7, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_7_Template, 1, 0, "i", 79);
|
|
241
|
+
i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_8_Template, 2, 4, "span", 80);
|
|
242
|
+
i0.ɵɵconditionalCreate(9, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Conditional_9_Template, 2, 0, "button", 81);
|
|
233
243
|
i0.ɵɵelementEnd();
|
|
234
244
|
} if (rf & 2) {
|
|
235
|
-
const
|
|
245
|
+
const query_r16 = ctx.$implicit;
|
|
236
246
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
237
|
-
i0.ɵɵclassProp("selected", ctx_r2.IsQuerySelected(
|
|
247
|
+
i0.ɵɵclassProp("selected", ctx_r2.IsQuerySelected(query_r16))("hidden", !ctx_r2.isQueryVisible(query_r16));
|
|
238
248
|
i0.ɵɵadvance();
|
|
239
|
-
i0.ɵɵstyleProp("background", ctx_r2.getStatusColor(
|
|
240
|
-
i0.ɵɵproperty("title",
|
|
249
|
+
i0.ɵɵstyleProp("background", ctx_r2.getStatusColor(query_r16.Status));
|
|
250
|
+
i0.ɵɵproperty("title", query_r16.Status);
|
|
241
251
|
i0.ɵɵadvance(2);
|
|
242
|
-
i0.ɵɵproperty("title",
|
|
252
|
+
i0.ɵɵproperty("title", query_r16.Description || query_r16.Name);
|
|
243
253
|
i0.ɵɵadvance(2);
|
|
244
|
-
i0.ɵɵtextInterpolate(
|
|
254
|
+
i0.ɵɵtextInterpolate(query_r16.Name);
|
|
245
255
|
i0.ɵɵadvance();
|
|
246
|
-
i0.ɵɵconditional(
|
|
256
|
+
i0.ɵɵconditional(query_r16.Description ? 6 : -1);
|
|
247
257
|
i0.ɵɵadvance();
|
|
248
|
-
i0.ɵɵconditional(
|
|
258
|
+
i0.ɵɵconditional(query_r16.UsesTemplate ? 7 : -1);
|
|
249
259
|
i0.ɵɵadvance();
|
|
250
|
-
i0.ɵɵconditional(
|
|
260
|
+
i0.ɵɵconditional(query_r16.Status !== "Approved" ? 8 : -1);
|
|
251
261
|
i0.ɵɵadvance();
|
|
252
262
|
i0.ɵɵconditional(ctx_r2.CanEditQuery ? 9 : -1);
|
|
253
263
|
} }
|
|
254
|
-
function
|
|
255
|
-
i0.ɵɵelementStart(0, "div",
|
|
256
|
-
i0.ɵɵrepeaterCreate(1,
|
|
264
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
265
|
+
i0.ɵɵelementStart(0, "div", 70);
|
|
266
|
+
i0.ɵɵrepeaterCreate(1, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_For_2_Template, 10, 13, "div", 72, i0.ɵɵcomponentInstance().trackByQuery, true);
|
|
257
267
|
i0.ɵɵelementEnd();
|
|
258
268
|
} if (rf & 2) {
|
|
259
269
|
const node_r13 = i0.ɵɵnextContext(2).node;
|
|
260
270
|
i0.ɵɵadvance();
|
|
261
271
|
i0.ɵɵrepeater(node_r13.queries);
|
|
262
272
|
} }
|
|
263
|
-
function
|
|
273
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
264
274
|
i0.ɵɵelementContainer(0);
|
|
265
275
|
} }
|
|
266
|
-
function
|
|
267
|
-
i0.ɵɵtemplate(0,
|
|
276
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
277
|
+
i0.ɵɵtemplate(0, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_For_1_ng_container_0_Template, 1, 0, "ng-container", 43);
|
|
268
278
|
} if (rf & 2) {
|
|
269
|
-
const
|
|
279
|
+
const child_r18 = ctx.$implicit;
|
|
270
280
|
i0.ɵɵnextContext(4);
|
|
271
281
|
const categoryNode_r8 = i0.ɵɵreference(36);
|
|
272
|
-
i0.ɵɵproperty("ngTemplateOutlet", categoryNode_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1,
|
|
282
|
+
i0.ɵɵproperty("ngTemplateOutlet", categoryNode_r8)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c1, child_r18));
|
|
273
283
|
} }
|
|
274
|
-
function
|
|
275
|
-
i0.ɵɵrepeaterCreate(0,
|
|
284
|
+
function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
285
|
+
i0.ɵɵrepeaterCreate(0, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_For_1_Template, 1, 4, "ng-container", null, i0.ɵɵcomponentInstance().trackByCategory, true);
|
|
276
286
|
} if (rf & 2) {
|
|
277
287
|
const node_r13 = i0.ɵɵnextContext(2).node;
|
|
278
288
|
i0.ɵɵrepeater(node_r13.children);
|
|
@@ -287,9 +297,11 @@ function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Template(rf,
|
|
|
287
297
|
i0.ɵɵelementEnd();
|
|
288
298
|
i0.ɵɵelementStart(6, "span", 68);
|
|
289
299
|
i0.ɵɵtext(7);
|
|
290
|
-
i0.ɵɵelementEnd()
|
|
291
|
-
i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_8_Template,
|
|
292
|
-
i0.ɵɵ
|
|
300
|
+
i0.ɵɵelementEnd();
|
|
301
|
+
i0.ɵɵconditionalCreate(8, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_8_Template, 2, 2, "button", 69);
|
|
302
|
+
i0.ɵɵelementEnd();
|
|
303
|
+
i0.ɵɵconditionalCreate(9, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_9_Template, 3, 0, "div", 70);
|
|
304
|
+
i0.ɵɵconditionalCreate(10, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Conditional_10_Template, 2, 0);
|
|
293
305
|
i0.ɵɵelementEnd();
|
|
294
306
|
} if (rf & 2) {
|
|
295
307
|
const node_r13 = i0.ɵɵnextContext().node;
|
|
@@ -305,25 +317,27 @@ function QueryBrowserResourceComponent_ng_template_35_Conditional_0_Template(rf,
|
|
|
305
317
|
i0.ɵɵadvance(2);
|
|
306
318
|
i0.ɵɵtextInterpolate1("(", ctx_r2.getNodeQueryCount(node_r13), ")");
|
|
307
319
|
i0.ɵɵadvance();
|
|
308
|
-
i0.ɵɵconditional(node_r13.
|
|
320
|
+
i0.ɵɵconditional(ctx_r2.CanCreateQuery && node_r13.category.ID !== "__uncategorized__" ? 8 : -1);
|
|
309
321
|
i0.ɵɵadvance();
|
|
310
322
|
i0.ɵɵconditional(node_r13.expanded ? 9 : -1);
|
|
323
|
+
i0.ɵɵadvance();
|
|
324
|
+
i0.ɵɵconditional(node_r13.expanded ? 10 : -1);
|
|
311
325
|
} }
|
|
312
326
|
function QueryBrowserResourceComponent_ng_template_35_Template(rf, ctx) { if (rf & 1) {
|
|
313
|
-
i0.ɵɵconditionalCreate(0, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Template,
|
|
327
|
+
i0.ɵɵconditionalCreate(0, QueryBrowserResourceComponent_ng_template_35_Conditional_0_Template, 11, 15, "div", 62);
|
|
314
328
|
} if (rf & 2) {
|
|
315
329
|
const node_r13 = ctx.node;
|
|
316
330
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
317
331
|
i0.ɵɵconditional(ctx_r2.hasVisibleContent(node_r13) ? 0 : -1);
|
|
318
332
|
} }
|
|
319
333
|
function QueryBrowserResourceComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
320
|
-
const
|
|
321
|
-
i0.ɵɵelementStart(0, "div",
|
|
322
|
-
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_37_Template_div_click_0_listener() { i0.ɵɵrestoreView(
|
|
334
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
335
|
+
i0.ɵɵelementStart(0, "div", 84);
|
|
336
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_37_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnDrawerBackdropClick()); });
|
|
323
337
|
i0.ɵɵelementEnd();
|
|
324
338
|
} }
|
|
325
339
|
function QueryBrowserResourceComponent_Conditional_38_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
326
|
-
i0.ɵɵelementStart(0, "div",
|
|
340
|
+
i0.ɵɵelementStart(0, "div", 88);
|
|
327
341
|
i0.ɵɵtext(1);
|
|
328
342
|
i0.ɵɵelementEnd();
|
|
329
343
|
} if (rf & 2) {
|
|
@@ -332,22 +346,12 @@ function QueryBrowserResourceComponent_Conditional_38_Conditional_7_Template(rf,
|
|
|
332
346
|
i0.ɵɵtextInterpolate(ctx_r2.DrawerName);
|
|
333
347
|
} }
|
|
334
348
|
function QueryBrowserResourceComponent_Conditional_38_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
335
|
-
i0.ɵɵelementStart(0, "span",
|
|
349
|
+
i0.ɵɵelementStart(0, "span", 95);
|
|
336
350
|
i0.ɵɵtext(1, "Name is required");
|
|
337
351
|
i0.ɵɵelementEnd();
|
|
338
352
|
} }
|
|
339
|
-
function
|
|
340
|
-
i0.ɵɵelementStart(0, "option",
|
|
341
|
-
i0.ɵɵtext(1);
|
|
342
|
-
i0.ɵɵelementEnd();
|
|
343
|
-
} if (rf & 2) {
|
|
344
|
-
const cat_r20 = ctx.$implicit;
|
|
345
|
-
i0.ɵɵproperty("value", cat_r20.ID);
|
|
346
|
-
i0.ɵɵadvance();
|
|
347
|
-
i0.ɵɵtextInterpolate(cat_r20.Name);
|
|
348
|
-
} }
|
|
349
|
-
function QueryBrowserResourceComponent_Conditional_38_For_32_Template(rf, ctx) { if (rf & 1) {
|
|
350
|
-
i0.ɵɵelementStart(0, "option", 98);
|
|
353
|
+
function QueryBrowserResourceComponent_Conditional_38_For_28_Template(rf, ctx) { if (rf & 1) {
|
|
354
|
+
i0.ɵɵelementStart(0, "option", 100);
|
|
351
355
|
i0.ɵɵtext(1);
|
|
352
356
|
i0.ɵɵelementEnd();
|
|
353
357
|
} if (rf & 2) {
|
|
@@ -356,20 +360,20 @@ function QueryBrowserResourceComponent_Conditional_38_For_32_Template(rf, ctx) {
|
|
|
356
360
|
i0.ɵɵadvance();
|
|
357
361
|
i0.ɵɵtextInterpolate(s_r21);
|
|
358
362
|
} }
|
|
359
|
-
function
|
|
363
|
+
function QueryBrowserResourceComponent_Conditional_38_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
360
364
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
361
|
-
i0.ɵɵelementStart(0, "div",
|
|
362
|
-
i0.ɵɵelement(1, "i",
|
|
365
|
+
i0.ɵɵelementStart(0, "div", 107);
|
|
366
|
+
i0.ɵɵelement(1, "i", 113);
|
|
363
367
|
i0.ɵɵtext(2, " To manage Parameters, Fields, and Permissions \u2014 ");
|
|
364
|
-
i0.ɵɵelementStart(3, "button",
|
|
365
|
-
i0.ɵɵlistener("click", function
|
|
368
|
+
i0.ɵɵelementStart(3, "button", 114);
|
|
369
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Conditional_45_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OpenFullRecord()); });
|
|
366
370
|
i0.ɵɵtext(4, " Open full record ");
|
|
367
|
-
i0.ɵɵelement(5, "i",
|
|
371
|
+
i0.ɵɵelement(5, "i", 115);
|
|
368
372
|
i0.ɵɵelementEnd()();
|
|
369
373
|
} }
|
|
370
|
-
function
|
|
371
|
-
i0.ɵɵelementStart(0, "div",
|
|
372
|
-
i0.ɵɵelement(1, "i",
|
|
374
|
+
function QueryBrowserResourceComponent_Conditional_38_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
375
|
+
i0.ɵɵelementStart(0, "div", 109);
|
|
376
|
+
i0.ɵɵelement(1, "i", 116);
|
|
373
377
|
i0.ɵɵtext(2);
|
|
374
378
|
i0.ɵɵelementEnd();
|
|
375
379
|
} if (rf & 2) {
|
|
@@ -377,78 +381,83 @@ function QueryBrowserResourceComponent_Conditional_38_Conditional_44_Template(rf
|
|
|
377
381
|
i0.ɵɵadvance(2);
|
|
378
382
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.DrawerSaveError, " ");
|
|
379
383
|
} }
|
|
380
|
-
function
|
|
381
|
-
i0.ɵɵelement(0, "i",
|
|
384
|
+
function QueryBrowserResourceComponent_Conditional_38_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
385
|
+
i0.ɵɵelement(0, "i", 117);
|
|
382
386
|
i0.ɵɵtext(1, " Saving... ");
|
|
383
387
|
} }
|
|
384
|
-
function
|
|
385
|
-
i0.ɵɵelement(0, "i",
|
|
388
|
+
function QueryBrowserResourceComponent_Conditional_38_Conditional_51_Template(rf, ctx) { if (rf & 1) {
|
|
389
|
+
i0.ɵɵelement(0, "i", 118);
|
|
386
390
|
i0.ɵɵtext(1, " Save ");
|
|
387
391
|
} }
|
|
388
392
|
function QueryBrowserResourceComponent_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
389
|
-
const
|
|
390
|
-
i0.ɵɵelementStart(0, "div", 31)(1, "div",
|
|
393
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
394
|
+
i0.ɵɵelementStart(0, "div", 31)(1, "div", 85)(2, "div", 86);
|
|
391
395
|
i0.ɵɵelement(3, "i", 38);
|
|
392
|
-
i0.ɵɵelementStart(4, "div")(5, "div",
|
|
396
|
+
i0.ɵɵelementStart(4, "div")(5, "div", 87);
|
|
393
397
|
i0.ɵɵtext(6);
|
|
394
398
|
i0.ɵɵelementEnd();
|
|
395
|
-
i0.ɵɵconditionalCreate(7, QueryBrowserResourceComponent_Conditional_38_Conditional_7_Template, 2, 1, "div",
|
|
399
|
+
i0.ɵɵconditionalCreate(7, QueryBrowserResourceComponent_Conditional_38_Conditional_7_Template, 2, 1, "div", 88);
|
|
396
400
|
i0.ɵɵelementEnd()();
|
|
397
|
-
i0.ɵɵelementStart(8, "button",
|
|
398
|
-
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Template_button_click_8_listener() { i0.ɵɵrestoreView(
|
|
401
|
+
i0.ɵɵelementStart(8, "button", 89);
|
|
402
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseDrawer()); });
|
|
399
403
|
i0.ɵɵelement(9, "i", 35);
|
|
400
404
|
i0.ɵɵelementEnd()();
|
|
401
|
-
i0.ɵɵelementStart(10, "div",
|
|
405
|
+
i0.ɵɵelementStart(10, "div", 90)(11, "div", 91)(12, "label", 92);
|
|
402
406
|
i0.ɵɵtext(13, "Name ");
|
|
403
|
-
i0.ɵɵelementStart(14, "span",
|
|
407
|
+
i0.ɵɵelementStart(14, "span", 93);
|
|
404
408
|
i0.ɵɵtext(15, "*");
|
|
405
409
|
i0.ɵɵelementEnd()();
|
|
406
|
-
i0.ɵɵelementStart(16, "input",
|
|
407
|
-
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(
|
|
408
|
-
i0.ɵɵlistener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_input_ngModelChange_16_listener() { i0.ɵɵrestoreView(
|
|
410
|
+
i0.ɵɵelementStart(16, "input", 94);
|
|
411
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.DrawerName, $event) || (ctx_r2.DrawerName = $event); return i0.ɵɵresetView($event); });
|
|
412
|
+
i0.ɵɵlistener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_input_ngModelChange_16_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.DrawerNameError = false); });
|
|
409
413
|
i0.ɵɵelementEnd();
|
|
410
|
-
i0.ɵɵconditionalCreate(17, QueryBrowserResourceComponent_Conditional_38_Conditional_17_Template, 2, 0, "span",
|
|
414
|
+
i0.ɵɵconditionalCreate(17, QueryBrowserResourceComponent_Conditional_38_Conditional_17_Template, 2, 0, "span", 95);
|
|
411
415
|
i0.ɵɵelementEnd();
|
|
412
|
-
i0.ɵɵelementStart(18, "div",
|
|
416
|
+
i0.ɵɵelementStart(18, "div", 96)(19, "div", 97)(20, "label", 92);
|
|
413
417
|
i0.ɵɵtext(21, "Category");
|
|
414
418
|
i0.ɵɵelementEnd();
|
|
415
|
-
i0.ɵɵelementStart(22, "
|
|
416
|
-
i0.ɵɵ
|
|
417
|
-
i0.ɵɵelementStart(23, "option", 97);
|
|
418
|
-
i0.ɵɵtext(24, "(none)");
|
|
419
|
-
i0.ɵɵelementEnd();
|
|
420
|
-
i0.ɵɵrepeaterCreate(25, QueryBrowserResourceComponent_Conditional_38_For_26_Template, 2, 2, "option", 98, _forTrack0);
|
|
419
|
+
i0.ɵɵelementStart(22, "mj-tree-dropdown", 98);
|
|
420
|
+
i0.ɵɵlistener("ValueChange", function QueryBrowserResourceComponent_Conditional_38_Template_mj_tree_dropdown_ValueChange_22_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnDrawerCategoryChange($event)); });
|
|
421
421
|
i0.ɵɵelementEnd()();
|
|
422
|
-
i0.ɵɵelementStart(
|
|
423
|
-
i0.ɵɵtext(
|
|
422
|
+
i0.ɵɵelementStart(23, "div", 97)(24, "label", 92);
|
|
423
|
+
i0.ɵɵtext(25, "Status");
|
|
424
424
|
i0.ɵɵelementEnd();
|
|
425
|
-
i0.ɵɵelementStart(
|
|
426
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
427
|
-
i0.ɵɵrepeaterCreate(
|
|
425
|
+
i0.ɵɵelementStart(26, "select", 99);
|
|
426
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_select_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.DrawerStatus, $event) || (ctx_r2.DrawerStatus = $event); return i0.ɵɵresetView($event); });
|
|
427
|
+
i0.ɵɵrepeaterCreate(27, QueryBrowserResourceComponent_Conditional_38_For_28_Template, 2, 2, "option", 100, i0.ɵɵrepeaterTrackByIdentity);
|
|
428
428
|
i0.ɵɵelementEnd()()();
|
|
429
|
-
i0.ɵɵelementStart(
|
|
430
|
-
i0.ɵɵ
|
|
429
|
+
i0.ɵɵelementStart(29, "div", 101)(30, "label", 102)(31, "input", 103);
|
|
430
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_input_ngModelChange_31_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.DrawerReusable, $event) || (ctx_r2.DrawerReusable = $event); return i0.ɵɵresetView($event); });
|
|
431
|
+
i0.ɵɵelementEnd();
|
|
432
|
+
i0.ɵɵelementStart(32, "span");
|
|
433
|
+
i0.ɵɵtext(33, "Reusable");
|
|
434
|
+
i0.ɵɵelementEnd()();
|
|
435
|
+
i0.ɵɵelementStart(34, "span", 95);
|
|
436
|
+
i0.ɵɵtext(35, "Allow other queries to reference this query using composition syntax");
|
|
437
|
+
i0.ɵɵelementEnd()();
|
|
438
|
+
i0.ɵɵelementStart(36, "div", 91)(37, "label", 92);
|
|
439
|
+
i0.ɵɵtext(38, "Description");
|
|
431
440
|
i0.ɵɵelementEnd();
|
|
432
|
-
i0.ɵɵelementStart(
|
|
433
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
441
|
+
i0.ɵɵelementStart(39, "textarea", 104);
|
|
442
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QueryBrowserResourceComponent_Conditional_38_Template_textarea_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.DrawerDescription, $event) || (ctx_r2.DrawerDescription = $event); return i0.ɵɵresetView($event); });
|
|
434
443
|
i0.ɵɵelementEnd()();
|
|
435
|
-
i0.ɵɵelementStart(
|
|
436
|
-
i0.ɵɵtext(
|
|
444
|
+
i0.ɵɵelementStart(40, "div", 105)(41, "label", 92);
|
|
445
|
+
i0.ɵɵtext(42, "SQL");
|
|
437
446
|
i0.ɵɵelementEnd();
|
|
438
|
-
i0.ɵɵelementStart(
|
|
439
|
-
i0.ɵɵlistener("change", function
|
|
447
|
+
i0.ɵɵelementStart(43, "mj-code-editor", 106, 1);
|
|
448
|
+
i0.ɵɵlistener("change", function QueryBrowserResourceComponent_Conditional_38_Template_mj_code_editor_change_43_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnDrawerSQLChange($event)); });
|
|
440
449
|
i0.ɵɵelementEnd()();
|
|
441
|
-
i0.ɵɵconditionalCreate(
|
|
450
|
+
i0.ɵɵconditionalCreate(45, QueryBrowserResourceComponent_Conditional_38_Conditional_45_Template, 6, 0, "div", 107);
|
|
442
451
|
i0.ɵɵelementEnd();
|
|
443
|
-
i0.ɵɵelementStart(
|
|
444
|
-
i0.ɵɵconditionalCreate(
|
|
445
|
-
i0.ɵɵelementStart(
|
|
446
|
-
i0.ɵɵlistener("click", function
|
|
447
|
-
i0.ɵɵconditionalCreate(
|
|
452
|
+
i0.ɵɵelementStart(46, "div", 108);
|
|
453
|
+
i0.ɵɵconditionalCreate(47, QueryBrowserResourceComponent_Conditional_38_Conditional_47_Template, 3, 1, "div", 109);
|
|
454
|
+
i0.ɵɵelementStart(48, "div", 110)(49, "button", 111);
|
|
455
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Template_button_click_49_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SaveDrawer()); });
|
|
456
|
+
i0.ɵɵconditionalCreate(50, QueryBrowserResourceComponent_Conditional_38_Conditional_50_Template, 2, 0)(51, QueryBrowserResourceComponent_Conditional_38_Conditional_51_Template, 2, 0);
|
|
448
457
|
i0.ɵɵelementEnd();
|
|
449
|
-
i0.ɵɵelementStart(
|
|
450
|
-
i0.ɵɵlistener("click", function
|
|
451
|
-
i0.ɵɵtext(
|
|
458
|
+
i0.ɵɵelementStart(52, "button", 112);
|
|
459
|
+
i0.ɵɵlistener("click", function QueryBrowserResourceComponent_Conditional_38_Template_button_click_52_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.CloseDrawer()); });
|
|
460
|
+
i0.ɵɵtext(53, " Cancel ");
|
|
452
461
|
i0.ɵɵelementEnd()()()();
|
|
453
462
|
} if (rf & 2) {
|
|
454
463
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -466,28 +475,28 @@ function QueryBrowserResourceComponent_Conditional_38_Template(rf, ctx) { if (rf
|
|
|
466
475
|
i0.ɵɵadvance();
|
|
467
476
|
i0.ɵɵconditional(ctx_r2.DrawerNameError ? 17 : -1);
|
|
468
477
|
i0.ɵɵadvance(5);
|
|
469
|
-
i0.ɵɵ
|
|
470
|
-
i0.ɵɵ
|
|
471
|
-
i0.ɵɵadvance(3);
|
|
472
|
-
i0.ɵɵrepeater(ctx_r2.categories);
|
|
473
|
-
i0.ɵɵadvance(5);
|
|
478
|
+
i0.ɵɵproperty("BranchConfig", ctx_r2.CategoryBranchConfig)("Value", ctx_r2.DrawerCategoryIDAsKey)("SelectableTypes", "branch")("SelectionMode", "single")("Placeholder", "Select category...")("EnableSearch", true)("Clearable", true)("Disabled", ctx_r2.IsSavingDrawer);
|
|
479
|
+
i0.ɵɵadvance(4);
|
|
474
480
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.DrawerStatus);
|
|
475
481
|
i0.ɵɵproperty("disabled", ctx_r2.IsSavingDrawer);
|
|
476
482
|
i0.ɵɵadvance();
|
|
477
483
|
i0.ɵɵrepeater(ctx_r2.DrawerStatuses);
|
|
478
|
-
i0.ɵɵadvance(
|
|
484
|
+
i0.ɵɵadvance(4);
|
|
485
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.DrawerReusable);
|
|
486
|
+
i0.ɵɵproperty("disabled", ctx_r2.IsSavingDrawer);
|
|
487
|
+
i0.ɵɵadvance(8);
|
|
479
488
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.DrawerDescription);
|
|
480
489
|
i0.ɵɵproperty("disabled", ctx_r2.IsSavingDrawer);
|
|
481
490
|
i0.ɵɵadvance(4);
|
|
482
491
|
i0.ɵɵproperty("language", "sql")("indentWithTab", true)("readonly", ctx_r2.IsSavingDrawer);
|
|
483
492
|
i0.ɵɵadvance(2);
|
|
484
|
-
i0.ɵɵconditional(ctx_r2.DrawerMode === "edit" && ctx_r2.DrawerQueryId ?
|
|
493
|
+
i0.ɵɵconditional(ctx_r2.DrawerMode === "edit" && ctx_r2.DrawerQueryId ? 45 : -1);
|
|
485
494
|
i0.ɵɵadvance(2);
|
|
486
|
-
i0.ɵɵconditional(ctx_r2.DrawerSaveError ?
|
|
495
|
+
i0.ɵɵconditional(ctx_r2.DrawerSaveError ? 47 : -1);
|
|
487
496
|
i0.ɵɵadvance(2);
|
|
488
497
|
i0.ɵɵproperty("disabled", ctx_r2.IsSavingDrawer || !ctx_r2.DrawerName.trim());
|
|
489
498
|
i0.ɵɵadvance();
|
|
490
|
-
i0.ɵɵconditional(ctx_r2.IsSavingDrawer ?
|
|
499
|
+
i0.ɵɵconditional(ctx_r2.IsSavingDrawer ? 50 : 51);
|
|
491
500
|
i0.ɵɵadvance(2);
|
|
492
501
|
i0.ɵɵproperty("disabled", ctx_r2.IsSavingDrawer);
|
|
493
502
|
} }
|
|
@@ -550,12 +559,29 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
550
559
|
DrawerDescription = '';
|
|
551
560
|
DrawerCategoryID = '';
|
|
552
561
|
DrawerStatus = 'Pending';
|
|
562
|
+
DrawerReusable = false;
|
|
553
563
|
IsSavingDrawer = false;
|
|
554
564
|
DrawerNameError = false;
|
|
555
565
|
DrawerSaveError = null;
|
|
556
566
|
/** Ordered status options for the drawer dropdown — all valid Query statuses */
|
|
557
567
|
DrawerStatuses = ['Pending', 'Approved', 'Rejected', 'Expired'];
|
|
558
568
|
initialDrawerSnapshot = '';
|
|
569
|
+
/** The category ID of the most recently interacted-with folder in the tree */
|
|
570
|
+
activeCategoryID = null;
|
|
571
|
+
/** Tree dropdown config for Query Categories (branches only, no leaves) */
|
|
572
|
+
CategoryBranchConfig = {
|
|
573
|
+
EntityName: 'MJ: Query Categories',
|
|
574
|
+
DisplayField: 'Name',
|
|
575
|
+
IDField: 'ID',
|
|
576
|
+
ParentIDField: 'ParentID',
|
|
577
|
+
DefaultIcon: 'fa-solid fa-folder',
|
|
578
|
+
DescriptionField: 'Description',
|
|
579
|
+
OrderBy: 'Name ASC'
|
|
580
|
+
};
|
|
581
|
+
/** The DrawerCategoryID as a CompositeKey for the tree dropdown binding */
|
|
582
|
+
get DrawerCategoryIDAsKey() {
|
|
583
|
+
return this.DrawerCategoryID ? CompositeKey.FromID(this.DrawerCategoryID) : null;
|
|
584
|
+
}
|
|
559
585
|
constructor(cdr, elementRef, zone) {
|
|
560
586
|
super();
|
|
561
587
|
this.cdr = cdr;
|
|
@@ -802,6 +828,10 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
802
828
|
}
|
|
803
829
|
node.expanded = !node.expanded;
|
|
804
830
|
this.expandedState.set(node.category.ID, node.expanded);
|
|
831
|
+
// Track the most recently expanded folder as the active category context
|
|
832
|
+
if (node.expanded && node.category.ID !== '__uncategorized__') {
|
|
833
|
+
this.activeCategoryID = node.category.ID;
|
|
834
|
+
}
|
|
805
835
|
this.saveExpandedState();
|
|
806
836
|
this.cdr.markForCheck();
|
|
807
837
|
}
|
|
@@ -834,6 +864,9 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
834
864
|
event.stopPropagation();
|
|
835
865
|
}
|
|
836
866
|
this.selectedQuery = query;
|
|
867
|
+
if (query.CategoryID) {
|
|
868
|
+
this.activeCategoryID = query.CategoryID;
|
|
869
|
+
}
|
|
837
870
|
this.UpdateQueryParams({ queryId: query.ID });
|
|
838
871
|
this.NotifyDisplayNameChanged(query.Name || 'Query');
|
|
839
872
|
this.cdr.markForCheck();
|
|
@@ -954,15 +987,17 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
954
987
|
this.CloseDrawer();
|
|
955
988
|
}
|
|
956
989
|
}
|
|
957
|
-
/** Open the drawer in create mode. */
|
|
958
|
-
OpenCreateDrawer() {
|
|
990
|
+
/** Open the drawer in create mode, optionally pre-selecting a category. */
|
|
991
|
+
OpenCreateDrawer(categoryID) {
|
|
959
992
|
this.DrawerMode = 'create';
|
|
960
993
|
this.DrawerQueryId = null;
|
|
961
994
|
this.DrawerName = '';
|
|
962
995
|
this.DrawerSQL = '';
|
|
963
996
|
this.DrawerDescription = '';
|
|
964
|
-
|
|
997
|
+
// Default to the explicit category, or the most recently active category
|
|
998
|
+
this.DrawerCategoryID = categoryID ?? this.activeCategoryID ?? '';
|
|
965
999
|
this.DrawerStatus = 'Pending';
|
|
1000
|
+
this.DrawerReusable = false;
|
|
966
1001
|
this.DrawerNameError = false;
|
|
967
1002
|
this.DrawerSaveError = null;
|
|
968
1003
|
this.captureDrawerSnapshot();
|
|
@@ -984,6 +1019,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
984
1019
|
this.DrawerDescription = query.Description ?? '';
|
|
985
1020
|
this.DrawerCategoryID = query.CategoryID ?? '';
|
|
986
1021
|
this.DrawerStatus = query.Status ?? 'Pending';
|
|
1022
|
+
this.DrawerReusable = query.Reusable ?? false;
|
|
987
1023
|
this.DrawerNameError = false;
|
|
988
1024
|
this.DrawerSaveError = null;
|
|
989
1025
|
this.captureDrawerSnapshot();
|
|
@@ -1013,6 +1049,15 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1013
1049
|
OnDrawerSQLChange(value) {
|
|
1014
1050
|
this.DrawerSQL = value;
|
|
1015
1051
|
}
|
|
1052
|
+
/** Update DrawerCategoryID when the tree dropdown selection changes. */
|
|
1053
|
+
OnDrawerCategoryChange(value) {
|
|
1054
|
+
if (value instanceof CompositeKey && value.HasValue) {
|
|
1055
|
+
this.DrawerCategoryID = value.KeyValuePairs[0]?.Value ?? '';
|
|
1056
|
+
}
|
|
1057
|
+
else {
|
|
1058
|
+
this.DrawerCategoryID = '';
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1016
1061
|
get currentDrawerSnapshot() {
|
|
1017
1062
|
return JSON.stringify({
|
|
1018
1063
|
name: this.DrawerName,
|
|
@@ -1020,6 +1065,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1020
1065
|
description: this.DrawerDescription,
|
|
1021
1066
|
categoryID: this.DrawerCategoryID,
|
|
1022
1067
|
status: this.DrawerStatus,
|
|
1068
|
+
reusable: this.DrawerReusable,
|
|
1023
1069
|
});
|
|
1024
1070
|
}
|
|
1025
1071
|
captureDrawerSnapshot() {
|
|
@@ -1055,6 +1101,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1055
1101
|
entity.Description = this.DrawerDescription;
|
|
1056
1102
|
entity.CategoryID = this.DrawerCategoryID || null;
|
|
1057
1103
|
entity.Status = this.DrawerStatus;
|
|
1104
|
+
entity.Reusable = this.DrawerReusable;
|
|
1058
1105
|
const saved = await entity.Save();
|
|
1059
1106
|
if (saved) {
|
|
1060
1107
|
const savedId = entity.ID;
|
|
@@ -1239,7 +1286,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1239
1286
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.drawerSqlEditor = _t.first);
|
|
1240
1287
|
} }, hostBindings: function QueryBrowserResourceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1241
1288
|
i0.ɵɵlistener("keydown.escape", function QueryBrowserResourceComponent_keydown_escape_HostBindingHandler() { return ctx.OnEscapeKey(); }, i0.ɵɵresolveDocument);
|
|
1242
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 39, vars: 18, consts: [["categoryNode", ""], ["drawerSqlEditor", ""], [1, "query-browser-container"], [1, "query-tree-panel"], [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"], [1, "empty-state"], [1, "category-tree"], [1, "resize-handle", 3, "mousedown"], [1, "resize-handle-grip"], [1, "query-viewer-panel"], [1, "no-selection"], [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..."], [1, "fa-solid", "fa-database", "empty-icon"], [1, "fa-solid", "fa-search", "empty-icon"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "fa-solid", "fa-hand-pointer", "no-selection-icon"], [1, "no-selection-message"], [1, "no-selection-hint"], [1, "no-selection-create-btn"], [1, "no-selection-create-btn", 3, "click"], [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", "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-queries"], [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", 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"], [1, "drawer-select", 3, "ngModelChange", "ngModel", "disabled"], ["value", ""], [3, "
|
|
1289
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 39, vars: 18, consts: [["categoryNode", ""], ["drawerSqlEditor", ""], [1, "query-browser-container"], [1, "query-tree-panel"], [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"], [1, "empty-state"], [1, "category-tree"], [1, "resize-handle", 3, "mousedown"], [1, "resize-handle-grip"], [1, "query-viewer-panel"], [1, "no-selection"], [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..."], [1, "fa-solid", "fa-database", "empty-icon"], [1, "fa-solid", "fa-search", "empty-icon"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "fa-solid", "fa-hand-pointer", "no-selection-icon"], [1, "no-selection-message"], [1, "no-selection-hint"], [1, "no-selection-create-btn"], [1, "no-selection-create-btn", 3, "click"], [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", "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", 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) {
|
|
1243
1290
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
1244
1291
|
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4)(3, "div", 5);
|
|
1245
1292
|
i0.ɵɵelement(4, "i", 6);
|
|
@@ -1289,7 +1336,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1289
1336
|
i0.ɵɵelementEnd()();
|
|
1290
1337
|
i0.ɵɵtemplate(35, QueryBrowserResourceComponent_ng_template_35_Template, 1, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
1291
1338
|
i0.ɵɵconditionalCreate(37, QueryBrowserResourceComponent_Conditional_37_Template, 1, 0, "div", 30);
|
|
1292
|
-
i0.ɵɵconditionalCreate(38, QueryBrowserResourceComponent_Conditional_38_Template,
|
|
1339
|
+
i0.ɵɵconditionalCreate(38, QueryBrowserResourceComponent_Conditional_38_Template, 54, 33, "div", 31);
|
|
1293
1340
|
} if (rf & 2) {
|
|
1294
1341
|
i0.ɵɵclassProp("resizing", ctx.IsResizing);
|
|
1295
1342
|
i0.ɵɵadvance();
|
|
@@ -1322,7 +1369,7 @@ let QueryBrowserResourceComponent = class QueryBrowserResourceComponent extends
|
|
|
1322
1369
|
i0.ɵɵconditional(ctx.ShowQueryDrawer ? 37 : -1);
|
|
1323
1370
|
i0.ɵɵadvance();
|
|
1324
1371
|
i0.ɵɵconditional(ctx.ShowQueryDrawer ? 38 : -1);
|
|
1325
|
-
} }, dependencies: [i1.NgTemplateOutlet, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.LoadingComponent, i4.CodeEditorComponent, i5.QueryViewerComponent], styles: ["\n\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\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\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\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 width: 100%;\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 margin-left: 10px;\n font-size: 14px;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n padding: 8px 10px;\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\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\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\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\n.tree-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%], \n.empty-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.empty-icon[_ngcontent-%COMP%] {\n font-size: 36px;\n color: var(--mj-border-strong);\n margin-bottom: 12px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n}\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\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\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.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\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.active[_ngcontent-%COMP%] .resize-handle-grip[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\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\n.query-viewer-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.no-selection[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 40px;\n}\n\n.no-selection-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: var(--mj-border-strong);\n margin-bottom: 20px;\n}\n\n.no-selection-message[_ngcontent-%COMP%] {\n font-size: 18px;\n color: var(--mj-text-secondary);\n margin: 0 0 8px 0;\n}\n\n.no-selection-hint[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\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\n\nmj-query-viewer[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\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\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\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\n.no-selection-create-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-top: 16px;\n padding: 8px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.no-selection-create-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\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\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\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\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\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\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\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\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\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 });
|
|
1372
|
+
} }, dependencies: [i1.NgTemplateOutlet, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.LoadingComponent, i4.CodeEditorComponent, i5.QueryViewerComponent, i6.TreeDropdownComponent], styles: ["\n\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\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\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\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 width: 100%;\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 margin-left: 10px;\n font-size: 14px;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n padding: 8px 10px;\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\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\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\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\n.tree-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%], \n.empty-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.empty-icon[_ngcontent-%COMP%] {\n font-size: 36px;\n color: var(--mj-border-strong);\n margin-bottom: 12px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\n}\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\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\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.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\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.active[_ngcontent-%COMP%] .resize-handle-grip[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\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\n.query-viewer-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.no-selection[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 40px;\n}\n\n.no-selection-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: var(--mj-border-strong);\n margin-bottom: 20px;\n}\n\n.no-selection-message[_ngcontent-%COMP%] {\n font-size: 18px;\n color: var(--mj-text-secondary);\n margin: 0 0 8px 0;\n}\n\n.no-selection-hint[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\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\n\nmj-query-viewer[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\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\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\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\n.no-selection-create-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-top: 16px;\n padding: 8px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.no-selection-create-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\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\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\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\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\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\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\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\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\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 });
|
|
1326
1373
|
};
|
|
1327
1374
|
QueryBrowserResourceComponent = QueryBrowserResourceComponent_1 = __decorate([
|
|
1328
1375
|
RegisterClass(BaseResourceComponent, 'QueryBrowserResource')
|
|
@@ -1330,7 +1377,7 @@ QueryBrowserResourceComponent = QueryBrowserResourceComponent_1 = __decorate([
|
|
|
1330
1377
|
export { QueryBrowserResourceComponent };
|
|
1331
1378
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryBrowserResourceComponent, [{
|
|
1332
1379
|
type: Component,
|
|
1333
|
-
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\" [style.width.px]=\"PanelWidth\">\n <!-- Header -->\n <div class=\"tree-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-database\"></i>\n <span>Queries</span>\n <span class=\"query-count\">({{ getTotalQueryCount() }})</span>\n </div>\n <div class=\"header-actions\">\n @if (CanCreateQuery) {\n <button class=\"icon-btn\" (click)=\"OpenCreateDrawer()\" title=\"New Query\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n <button class=\"icon-btn\" (click)=\"expandAll()\" title=\"Expand all\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"collapseAll()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-folder\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"tree-search\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n [value]=\"searchText\"\n placeholder=\"Search queries...\"\n (input)=\"onSearchChange($any($event.target).value)\">\n @if (searchText) {\n <button class=\"clear-btn\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Status Filters -->\n <div class=\"status-filter-bar\">\n @for (status of AllStatuses; track status) {\n @if (getStatusCount(status) > 0) {\n <button class=\"status-filter-chip\"\n [class.active]=\"StatusFilters[status]\"\n [style.--chip-color]=\"getStatusColor(status)\"\n (click)=\"toggleStatusFilter(status)\"\n [title]=\"(StatusFilters[status] ? 'Hide' : 'Show') + ' ' + status + ' queries'\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(status)\"></i>\n <span>{{ status }}</span>\n <span class=\"chip-count\">{{ getStatusCount(status) }}</span>\n </button>\n }\n }\n </div>\n\n <!-- Tree Content -->\n <div class=\"tree-content\">\n <!-- Loading -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading queries...\"></mj-loading>\n </div>\n }\n\n <!-- Empty -->\n @if (!isLoading && queries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database empty-icon\"></i>\n <p>No queries available</p>\n </div>\n }\n\n <!-- No results -->\n @if (!isLoading && searchText && filteredQueries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>No queries match \"{{ searchText }}\"</p>\n </div>\n }\n\n <!-- Category Tree -->\n @if (!isLoading && queries.length > 0) {\n <div class=\"category-tree\">\n @for (node of categoryTree; track trackByCategory($index, node)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: node }\"></ng-container>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Resize Handle -->\n <div class=\"resize-handle\"\n [class.active]=\"IsResizing\"\n (mousedown)=\"onResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- Right Panel: Query Viewer -->\n <div class=\"query-viewer-panel\">\n <!-- No query selected -->\n @if (!selectedQuery) {\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-hand-pointer no-selection-icon\"></i>\n <p class=\"no-selection-message\">Select a query from the list</p>\n <p class=\"no-selection-hint\">Click on a query to view and run it</p>\n @if (CanCreateQuery) {\n <button class=\"no-selection-create-btn\" (click)=\"OpenCreateDrawer()\">\n <i class=\"fa-solid fa-plus\"></i> New Query\n </button>\n }\n </div>\n }\n\n <!-- Query Viewer -->\n @if (selectedQuery) {\n <!-- Query Header with Status -->\n <div class=\"query-viewer-header\">\n <div class=\"query-viewer-title\">\n <i class=\"fa-solid fa-file-code\"></i>\n <span>{{ selectedQuery.Name }}</span>\n </div>\n <div class=\"query-viewer-header-actions\">\n @if (selectedQuery.Status !== 'Approved') {\n <span class=\"query-viewer-status-pill\"\n [style.background]=\"getStatusColor(selectedQuery.Status)\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(selectedQuery.Status)\"></i>\n {{ selectedQuery.Status }}\n </span>\n } @else {\n <span class=\"query-viewer-status-pill approved\"\n [style.background]=\"getStatusColor('Approved')\">\n <i class=\"fa-solid fa-check-circle\"></i>\n Approved\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"icon-btn\" (click)=\"OpenEditDrawer(selectedQuery)\" title=\"Edit Query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n </div>\n <mj-query-viewer\n [QueryId]=\"selectedQuery.ID\"\n [AutoRun]=\"true\"\n [SelectionMode]=\"'multiple'\"\n (EntityLinkClick)=\"onEntityLinkClick($event)\"\n (RowDoubleClick)=\"onRowDoubleClick($event)\"\n (OpenQueryRecord)=\"onOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"onCompositionTokenClick($event)\">\n </mj-query-viewer>\n }\n </div>\n</div>\n\n<!-- Category Node Template -->\n<ng-template #categoryNode let-node=\"node\">\n @if (hasVisibleContent(node)) {\n <div class=\"category-item\"\n [class.expanded]=\"node.expanded\"\n [style.padding-left.px]=\"node.level * 16 + 8\">\n <div class=\"category-header\" (click)=\"toggleExpand(node)\">\n <i class=\"fa-solid expand-icon\"\n [class.fa-chevron-down]=\"node.expanded\"\n [class.fa-chevron-right]=\"!node.expanded\"></i>\n <i class=\"fa-solid fa-folder category-icon\"\n [class.fa-folder-open]=\"node.expanded\"></i>\n <span class=\"category-name\">{{ node.category.Name }}</span>\n <span class=\"category-count\">({{ getNodeQueryCount(node) }})</span>\n </div>\n <!-- Queries in this category -->\n @if (node.expanded) {\n <div class=\"category-queries\">\n @for (query of node.queries; track trackByQuery($index, query)) {\n <div class=\"query-item\"\n [class.selected]=\"IsQuerySelected(query)\"\n [class.hidden]=\"!isQueryVisible(query)\"\n (click)=\"selectQuery(query, $event)\">\n <span class=\"status-dot\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\"></span>\n <i class=\"fa-solid fa-file-code query-icon\"></i>\n <div class=\"query-info\" [title]=\"query.Description || query.Name\">\n <span class=\"query-name\">{{ query.Name }}</span>\n @if (query.Description) {\n <span class=\"query-description\">{{ query.Description }}</span>\n }\n </div>\n @if (query.UsesTemplate) {\n <i class=\"fa-solid fa-sliders param-icon\" title=\"Has parameters\"></i>\n }\n @if (query.Status !== 'Approved') {\n <span class=\"query-status-badge\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\">\n {{ query.Status }}\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"query-details-btn\" (click)=\"OpenEditDrawer(query, $event)\" title=\"Edit query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n <!-- Child categories -->\n @if (node.expanded) {\n @for (child of node.children; track trackByCategory($index, child)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n\n<!-- Query Drawer Backdrop -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer-backdrop\" (click)=\"OnDrawerBackdropClick()\"></div>\n}\n\n<!-- Query Drawer Panel -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer\">\n\n <!-- Drawer Header -->\n <div class=\"query-drawer-header\">\n <div class=\"query-drawer-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"DrawerMode === 'create'\" [class.fa-pen-to-square]=\"DrawerMode === 'edit'\"></i>\n <div>\n <div class=\"query-drawer-title-main\">{{ DrawerMode === 'create' ? 'New Query' : 'Edit Query' }}</div>\n @if (DrawerMode === 'edit' && DrawerName) {\n <div class=\"query-drawer-title-sub\">{{ DrawerName }}</div>\n }\n </div>\n </div>\n <button class=\"query-drawer-close\" (click)=\"CloseDrawer()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Drawer Body -->\n <div class=\"query-drawer-body\">\n\n <!-- Name -->\n <div class=\"drawer-field\" [class.drawer-field-error]=\"DrawerNameError\">\n <label class=\"drawer-label\">Name <span class=\"drawer-required\">*</span></label>\n <input class=\"drawer-input\"\n type=\"text\"\n [(ngModel)]=\"DrawerName\"\n (ngModelChange)=\"DrawerNameError = false\"\n placeholder=\"Enter query name\"\n [disabled]=\"IsSavingDrawer\">\n @if (DrawerNameError) {\n <span class=\"drawer-field-hint\">Name is required</span>\n }\n </div>\n\n <!-- Category + Status (side by side) -->\n <div class=\"drawer-row\">\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Category</label>\n <select class=\"drawer-select\"\n [(ngModel)]=\"DrawerCategoryID\"\n [disabled]=\"IsSavingDrawer\">\n <option value=\"\">(none)</option>\n @for (cat of categories; track cat.ID) {\n <option [value]=\"cat.ID\">{{ cat.Name }}</option>\n }\n </select>\n </div>\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Status</label>\n <select class=\"drawer-select\"\n [(ngModel)]=\"DrawerStatus\"\n [disabled]=\"IsSavingDrawer\">\n @for (s of DrawerStatuses; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"drawer-field\">\n <label class=\"drawer-label\">Description</label>\n <textarea class=\"drawer-textarea\"\n rows=\"3\"\n [(ngModel)]=\"DrawerDescription\"\n placeholder=\"Optional description\"\n [disabled]=\"IsSavingDrawer\"></textarea>\n </div>\n\n <!-- SQL -->\n <div class=\"drawer-field drawer-field-sql\">\n <label class=\"drawer-label\">SQL</label>\n <mj-code-editor #drawerSqlEditor\n [language]=\"'sql'\"\n [indentWithTab]=\"true\"\n [readonly]=\"IsSavingDrawer\"\n (change)=\"OnDrawerSQLChange($event)\"\n class=\"drawer-sql-editor\">\n </mj-code-editor>\n </div>\n\n <!-- Open Full Record link (edit mode only) -->\n @if (DrawerMode === 'edit' && DrawerQueryId) {\n <div class=\"drawer-full-record\">\n <i class=\"fa-solid fa-circle-info\"></i>\n To manage Parameters, Fields, and Permissions \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 width: 100%;\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 margin-left: 10px;\n font-size: 14px;\n}\n\n.search-input {\n flex: 1;\n border: none;\n outline: none;\n padding: 8px 10px;\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 & Empty States */\n.loading-state,\n.empty-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.empty-icon {\n font-size: 36px;\n color: var(--mj-border-strong);\n margin-bottom: 12px;\n}\n\n.empty-state p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\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/* 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.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\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.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 */\n.no-selection {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 40px;\n}\n\n.no-selection-icon {\n font-size: 64px;\n color: var(--mj-border-strong);\n margin-bottom: 20px;\n}\n\n.no-selection-message {\n font-size: 18px;\n color: var(--mj-text-secondary);\n margin: 0 0 8px 0;\n}\n\n.no-selection-hint {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\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 No-selection create button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.no-selection-create-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-top: 16px;\n padding: 8px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.no-selection-create-btn:hover {\n background: var(--mj-brand-primary-hover);\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/* \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"] }]
|
|
1380
|
+
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\" [style.width.px]=\"PanelWidth\">\n <!-- Header -->\n <div class=\"tree-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-database\"></i>\n <span>Queries</span>\n <span class=\"query-count\">({{ getTotalQueryCount() }})</span>\n </div>\n <div class=\"header-actions\">\n @if (CanCreateQuery) {\n <button class=\"icon-btn\" (click)=\"OpenCreateDrawer()\" title=\"New Query\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n <button class=\"icon-btn\" (click)=\"expandAll()\" title=\"Expand all\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"collapseAll()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-folder\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"tree-search\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n [value]=\"searchText\"\n placeholder=\"Search queries...\"\n (input)=\"onSearchChange($any($event.target).value)\">\n @if (searchText) {\n <button class=\"clear-btn\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Status Filters -->\n <div class=\"status-filter-bar\">\n @for (status of AllStatuses; track status) {\n @if (getStatusCount(status) > 0) {\n <button class=\"status-filter-chip\"\n [class.active]=\"StatusFilters[status]\"\n [style.--chip-color]=\"getStatusColor(status)\"\n (click)=\"toggleStatusFilter(status)\"\n [title]=\"(StatusFilters[status] ? 'Hide' : 'Show') + ' ' + status + ' queries'\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(status)\"></i>\n <span>{{ status }}</span>\n <span class=\"chip-count\">{{ getStatusCount(status) }}</span>\n </button>\n }\n }\n </div>\n\n <!-- Tree Content -->\n <div class=\"tree-content\">\n <!-- Loading -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading queries...\"></mj-loading>\n </div>\n }\n\n <!-- Empty -->\n @if (!isLoading && queries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database empty-icon\"></i>\n <p>No queries available</p>\n </div>\n }\n\n <!-- No results -->\n @if (!isLoading && searchText && filteredQueries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>No queries match \"{{ searchText }}\"</p>\n </div>\n }\n\n <!-- Category Tree -->\n @if (!isLoading && queries.length > 0) {\n <div class=\"category-tree\">\n @for (node of categoryTree; track trackByCategory($index, node)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: node }\"></ng-container>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Resize Handle -->\n <div class=\"resize-handle\"\n [class.active]=\"IsResizing\"\n (mousedown)=\"onResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- Right Panel: Query Viewer -->\n <div class=\"query-viewer-panel\">\n <!-- No query selected -->\n @if (!selectedQuery) {\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-hand-pointer no-selection-icon\"></i>\n <p class=\"no-selection-message\">Select a query from the list</p>\n <p class=\"no-selection-hint\">Click on a query to view and run it</p>\n @if (CanCreateQuery) {\n <button class=\"no-selection-create-btn\" (click)=\"OpenCreateDrawer()\">\n <i class=\"fa-solid fa-plus\"></i> New Query\n </button>\n }\n </div>\n }\n\n <!-- Query Viewer -->\n @if (selectedQuery) {\n <!-- Query Header with Status -->\n <div class=\"query-viewer-header\">\n <div class=\"query-viewer-title\">\n <i class=\"fa-solid fa-file-code\"></i>\n <span>{{ selectedQuery.Name }}</span>\n </div>\n <div class=\"query-viewer-header-actions\">\n @if (selectedQuery.Status !== 'Approved') {\n <span class=\"query-viewer-status-pill\"\n [style.background]=\"getStatusColor(selectedQuery.Status)\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(selectedQuery.Status)\"></i>\n {{ selectedQuery.Status }}\n </span>\n } @else {\n <span class=\"query-viewer-status-pill approved\"\n [style.background]=\"getStatusColor('Approved')\">\n <i class=\"fa-solid fa-check-circle\"></i>\n Approved\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"icon-btn\" (click)=\"OpenEditDrawer(selectedQuery)\" title=\"Edit Query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n </div>\n <mj-query-viewer\n [QueryId]=\"selectedQuery.ID\"\n [AutoRun]=\"true\"\n [SelectionMode]=\"'multiple'\"\n (EntityLinkClick)=\"onEntityLinkClick($event)\"\n (RowDoubleClick)=\"onRowDoubleClick($event)\"\n (OpenQueryRecord)=\"onOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"onCompositionTokenClick($event)\">\n </mj-query-viewer>\n }\n </div>\n</div>\n\n<!-- Category Node Template -->\n<ng-template #categoryNode let-node=\"node\">\n @if (hasVisibleContent(node)) {\n <div class=\"category-item\"\n [class.expanded]=\"node.expanded\"\n [style.padding-left.px]=\"node.level * 16 + 8\">\n <div class=\"category-header\" (click)=\"toggleExpand(node)\">\n <i class=\"fa-solid expand-icon\"\n [class.fa-chevron-down]=\"node.expanded\"\n [class.fa-chevron-right]=\"!node.expanded\"></i>\n <i class=\"fa-solid fa-folder category-icon\"\n [class.fa-folder-open]=\"node.expanded\"></i>\n <span class=\"category-name\">{{ node.category.Name }}</span>\n <span class=\"category-count\">({{ getNodeQueryCount(node) }})</span>\n @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\">\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 width: 100%;\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 margin-left: 10px;\n font-size: 14px;\n}\n\n.search-input {\n flex: 1;\n border: none;\n outline: none;\n padding: 8px 10px;\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 & Empty States */\n.loading-state,\n.empty-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.empty-icon {\n font-size: 36px;\n color: var(--mj-border-strong);\n margin-bottom: 12px;\n}\n\n.empty-state p {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 14px;\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.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\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.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 */\n.no-selection {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 40px;\n}\n\n.no-selection-icon {\n font-size: 64px;\n color: var(--mj-border-strong);\n margin-bottom: 20px;\n}\n\n.no-selection-message {\n font-size: 18px;\n color: var(--mj-text-secondary);\n margin: 0 0 8px 0;\n}\n\n.no-selection-hint {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\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 No-selection create button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\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.no-selection-create-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-top: 16px;\n padding: 8px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.no-selection-create-btn:hover {\n background: var(--mj-brand-primary-hover);\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"] }]
|
|
1334
1381
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], { drawerSqlEditor: [{
|
|
1335
1382
|
type: ViewChild,
|
|
1336
1383
|
args: ['drawerSqlEditor']
|
|
@@ -1338,5 +1385,5 @@ export { QueryBrowserResourceComponent };
|
|
|
1338
1385
|
type: HostListener,
|
|
1339
1386
|
args: ['document:keydown.escape']
|
|
1340
1387
|
}] }); })();
|
|
1341
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryBrowserResourceComponent, { className: "QueryBrowserResourceComponent", filePath: "src/QueryBrowser/query-browser-resource.component.ts", lineNumber:
|
|
1388
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryBrowserResourceComponent, { className: "QueryBrowserResourceComponent", filePath: "src/QueryBrowser/query-browser-resource.component.ts", lineNumber: 41 }); })();
|
|
1342
1389
|
//# sourceMappingURL=query-browser-resource.component.js.map
|