@memberjunction/ng-query-viewer 5.11.0 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -116,11 +116,11 @@ function QueryViewerComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
116
116
  function QueryViewerComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
117
117
  const _r5 = i0.ɵɵgetCurrentView();
118
118
  i0.ɵɵelementStart(0, "mj-query-data-grid", 27);
119
- i0.ɵɵlistener("EntityLinkClick", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_EntityLinkClick_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityLinkClick($event)); })("RowDoubleClick", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_RowDoubleClick_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRowDoubleClick($event)); })("SelectionChange", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_SelectionChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSelectionChange($event)); })("GridStateChange", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_GridStateChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnGridStateChange($event)); })("RefreshRequest", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_RefreshRequest_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRefreshRequest()); });
119
+ i0.ɵɵlistener("PageChange", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_PageChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnPageChange($event)); })("EntityLinkClick", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_EntityLinkClick_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityLinkClick($event)); })("RowDoubleClick", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_RowDoubleClick_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRowDoubleClick($event)); })("SelectionChange", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_SelectionChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSelectionChange($event)); })("GridStateChange", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_GridStateChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnGridStateChange($event)); })("RefreshRequest", function QueryViewerComponent_Conditional_7_Template_mj_query_data_grid_RefreshRequest_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRefreshRequest()); });
120
120
  i0.ɵɵelementEnd();
121
121
  } if (rf & 2) {
122
122
  const ctx_r1 = i0.ɵɵnextContext();
123
- i0.ɵɵproperty("QueryInfo", ctx_r1.QueryInfo)("Data", ctx_r1.QueryData)("SelectionMode", ctx_r1.SelectionMode)("ShowToolbar", ctx_r1.ShowToolbar)("VisualConfig", ctx_r1.VisualConfig)("IsLoading", ctx_r1.IsLoading);
123
+ i0.ɵɵproperty("QueryInfo", ctx_r1.QueryInfo)("Data", ctx_r1.QueryData)("TotalRowCount", ctx_r1.QueryTotalRowCount)("PageNumber", ctx_r1.CurrentPageNumber)("PageSize", ctx_r1.PageSize)("SelectionMode", ctx_r1.SelectionMode)("ShowToolbar", ctx_r1.ShowToolbar)("VisualConfig", ctx_r1.VisualConfig)("IsLoading", ctx_r1.IsLoading);
124
124
  } }
125
125
  /**
126
126
  * A composite component that provides a complete query viewing experience.
@@ -183,6 +183,11 @@ export class QueryViewerComponent {
183
183
  * Whether to persist parameter values
184
184
  */
185
185
  PersistParameters = true;
186
+ /**
187
+ * Number of rows per page for server-side paging.
188
+ * Set to 0 to disable paging and load all rows at once.
189
+ */
190
+ PageSize = 100;
186
191
  // ========================================
187
192
  // Outputs
188
193
  // ========================================
@@ -235,6 +240,9 @@ export class QueryViewerComponent {
235
240
  ExecutionTimeMs = null;
236
241
  SavedGridState = null;
237
242
  SavedParams = {};
243
+ /** Paging state */
244
+ QueryTotalRowCount = 0;
245
+ CurrentPageNumber = 1;
238
246
  metadata = new Metadata();
239
247
  destroy$ = new Subject();
240
248
  userInfoEngine = UserInfoEngine.Instance;
@@ -259,6 +267,8 @@ export class QueryViewerComponent {
259
267
  this.SavedGridState = null;
260
268
  this.SavedParams = {};
261
269
  this.ShowParamsPanel = false;
270
+ this.QueryTotalRowCount = 0;
271
+ this.CurrentPageNumber = 1;
262
272
  this.cdr.markForCheck();
263
273
  if (!this._queryId) {
264
274
  return;
@@ -367,7 +377,7 @@ export class QueryViewerComponent {
367
377
  // ========================================
368
378
  // Query Execution
369
379
  // ========================================
370
- async RunQuery(params) {
380
+ async RunQuery(params, pageNumber = 1) {
371
381
  if (!this.QueryInfo || !this._queryId)
372
382
  return;
373
383
  this.IsLoading = true;
@@ -384,12 +394,20 @@ export class QueryViewerComponent {
384
394
  QueryID: this._queryId,
385
395
  Parameters: params
386
396
  };
397
+ // Add server-side paging when PageSize > 0
398
+ if (this.PageSize > 0) {
399
+ runParams.MaxRows = this.PageSize;
400
+ runParams.StartRow = (pageNumber - 1) * this.PageSize;
401
+ }
387
402
  const result = await runQuery.RunQuery(runParams);
388
403
  this.ExecutionTimeMs = Math.round(performance.now() - startTime);
389
404
  if (result.Success) {
390
405
  this.QueryData = result.Results || [];
391
406
  this.HasRun = true;
392
407
  this.ShowParamsPanel = false;
408
+ // Update paging state from result
409
+ this.QueryTotalRowCount = result.TotalRowCount;
410
+ this.CurrentPageNumber = result.PageNumber ?? pageNumber;
393
411
  this.QueryComplete.emit(result);
394
412
  }
395
413
  else {
@@ -432,9 +450,12 @@ export class QueryViewerComponent {
432
450
  OnSelectionChange(event) {
433
451
  this.SelectionChange.emit(event);
434
452
  }
453
+ OnPageChange(event) {
454
+ this.RunQuery(this.SavedParams, event.PageNumber);
455
+ }
435
456
  OnRefreshRequest() {
436
457
  if (this.HasRun) {
437
- this.RunQuery(this.SavedParams);
458
+ this.RunQuery(this.SavedParams, this.CurrentPageNumber);
438
459
  }
439
460
  else if (this.QueryInfo?.Parameters?.length) {
440
461
  this.ShowParamsPanel = true;
@@ -477,7 +498,7 @@ export class QueryViewerComponent {
477
498
  } if (rf & 2) {
478
499
  let _t;
479
500
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.DataGrid = _t.first);
480
- } }, inputs: { QueryId: "QueryId", AutoRun: "AutoRun", SelectionMode: "SelectionMode", ShowToolbar: "ShowToolbar", VisualConfig: "VisualConfig", PersistState: "PersistState", PersistParameters: "PersistParameters" }, outputs: { EntityLinkClick: "EntityLinkClick", RowDoubleClick: "RowDoubleClick", SelectionChange: "SelectionChange", QueryStart: "QueryStart", QueryComplete: "QueryComplete", QueryError: "QueryError", OpenQueryRecord: "OpenQueryRecord", CompositionTokenClick: "CompositionTokenClick" }, standalone: false, decls: 10, vars: 11, consts: [[1, "query-viewer-container"], [1, "query-header"], [1, "query-content"], [1, "no-query-state"], [1, "error-state"], [1, "query-description"], [1, "execution-error"], [3, "QueryInfo", "Data", "SelectionMode", "ShowToolbar", "VisualConfig", "IsLoading"], [3, "ParametersSubmit", "Close", "QueryInfo", "InitialValues", "IsOpen"], [3, "Close", "OpenRecord", "CompositionTokenClick", "QueryInfo", "Visible"], [1, "query-info"], [1, "query-name"], [1, "query-category"], [1, "query-actions"], ["title", "Query information", 1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-info-circle"], ["title", "Edit parameters", 1, "btn", "btn-secondary", 3, "disabled"], [1, "execution-stats"], [1, "fa-solid", "fa-folder"], ["title", "Edit parameters", 1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-sliders"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-database", "state-icon"], [1, "state-message"], [1, "fa-solid", "fa-exclamation-triangle", "state-icon", "error"], [1, "fa-solid", "fa-exclamation-circle"], [1, "btn", "btn-secondary", 3, "click"], [3, "EntityLinkClick", "RowDoubleClick", "SelectionChange", "GridStateChange", "RefreshRequest", "QueryInfo", "Data", "SelectionMode", "ShowToolbar", "VisualConfig", "IsLoading"]], template: function QueryViewerComponent_Template(rf, ctx) { if (rf & 1) {
501
+ } }, inputs: { QueryId: "QueryId", AutoRun: "AutoRun", SelectionMode: "SelectionMode", ShowToolbar: "ShowToolbar", VisualConfig: "VisualConfig", PersistState: "PersistState", PersistParameters: "PersistParameters", PageSize: "PageSize" }, outputs: { EntityLinkClick: "EntityLinkClick", RowDoubleClick: "RowDoubleClick", SelectionChange: "SelectionChange", QueryStart: "QueryStart", QueryComplete: "QueryComplete", QueryError: "QueryError", OpenQueryRecord: "OpenQueryRecord", CompositionTokenClick: "CompositionTokenClick" }, standalone: false, decls: 10, vars: 11, consts: [[1, "query-viewer-container"], [1, "query-header"], [1, "query-content"], [1, "no-query-state"], [1, "error-state"], [1, "query-description"], [1, "execution-error"], [3, "QueryInfo", "Data", "TotalRowCount", "PageNumber", "PageSize", "SelectionMode", "ShowToolbar", "VisualConfig", "IsLoading"], [3, "ParametersSubmit", "Close", "QueryInfo", "InitialValues", "IsOpen"], [3, "Close", "OpenRecord", "CompositionTokenClick", "QueryInfo", "Visible"], [1, "query-info"], [1, "query-name"], [1, "query-category"], [1, "query-actions"], ["title", "Query information", 1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-info-circle"], ["title", "Edit parameters", 1, "btn", "btn-secondary", 3, "disabled"], [1, "execution-stats"], [1, "fa-solid", "fa-folder"], ["title", "Edit parameters", 1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-sliders"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-database", "state-icon"], [1, "state-message"], [1, "fa-solid", "fa-exclamation-triangle", "state-icon", "error"], [1, "fa-solid", "fa-exclamation-circle"], [1, "btn", "btn-secondary", 3, "click"], [3, "PageChange", "EntityLinkClick", "RowDoubleClick", "SelectionChange", "GridStateChange", "RefreshRequest", "QueryInfo", "Data", "TotalRowCount", "PageNumber", "PageSize", "SelectionMode", "ShowToolbar", "VisualConfig", "IsLoading"]], template: function QueryViewerComponent_Template(rf, ctx) { if (rf & 1) {
481
502
  i0.ɵɵelementStart(0, "div", 0);
482
503
  i0.ɵɵconditionalCreate(1, QueryViewerComponent_Conditional_1_Template, 11, 5, "div", 1);
483
504
  i0.ɵɵelementStart(2, "div", 2);
@@ -485,7 +506,7 @@ export class QueryViewerComponent {
485
506
  i0.ɵɵconditionalCreate(4, QueryViewerComponent_Conditional_4_Template, 4, 1, "div", 4);
486
507
  i0.ɵɵconditionalCreate(5, QueryViewerComponent_Conditional_5_Template, 3, 1, "div", 5);
487
508
  i0.ɵɵconditionalCreate(6, QueryViewerComponent_Conditional_6_Template, 6, 1, "div", 6);
488
- i0.ɵɵconditionalCreate(7, QueryViewerComponent_Conditional_7_Template, 1, 6, "mj-query-data-grid", 7);
509
+ i0.ɵɵconditionalCreate(7, QueryViewerComponent_Conditional_7_Template, 1, 9, "mj-query-data-grid", 7);
489
510
  i0.ɵɵelementEnd();
490
511
  i0.ɵɵelementStart(8, "mj-query-parameter-form", 8);
491
512
  i0.ɵɵlistener("ParametersSubmit", function QueryViewerComponent_Template_mj_query_parameter_form_ParametersSubmit_8_listener($event) { return ctx.OnParametersSubmit($event); })("Close", function QueryViewerComponent_Template_mj_query_parameter_form_Close_8_listener() { return ctx.OnParamsPanelClose(); });
@@ -510,11 +531,11 @@ export class QueryViewerComponent {
510
531
  i0.ɵɵproperty("QueryInfo", ctx.QueryInfo)("InitialValues", ctx.SavedParams)("IsOpen", ctx.ShowParamsPanel);
511
532
  i0.ɵɵadvance();
512
533
  i0.ɵɵproperty("QueryInfo", ctx.QueryInfo)("Visible", ctx.ShowInfoPanel);
513
- } }, dependencies: [i1.QueryDataGridComponent, i2.QueryParameterFormComponent, i3.QueryInfoPanelComponent], styles: ["\n\n\n[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.query-viewer-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #fff;\n position: relative;\n overflow: hidden;\n}\n\n\n\n.query-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.query-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.query-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n.query-category[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.query-category[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #888;\n}\n\n.query-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.query-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n.execution-stats[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #888;\n padding: 4px 8px;\n background: #f0f0f0;\n border-radius: 4px;\n}\n\n.execution-stats[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.query-content[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.no-query-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n}\n\n.state-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: #ccc;\n margin-bottom: 20px;\n}\n\n.state-icon.error[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n.state-message[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #666;\n margin: 0;\n}\n\n\n\n.query-description[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: #e3f2fd;\n border-bottom: 1px solid #bbdefb;\n font-size: 13px;\n color: #1565c0;\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.query-description[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n\n\n.execution-error[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: #ffebee;\n border-bottom: 1px solid #ffcdd2;\n font-size: 13px;\n color: #c62828;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.execution-error[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\nmj-query-data-grid[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n\n.btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 500;\n border: 1px solid transparent;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: #fff;\n color: #333;\n border-color: #ccc;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #f5f5f5;\n border-color: #bbb;\n}\n\n\n\n@media (max-width: 768px) {\n .query-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .query-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-end;\n }\n}"], changeDetection: 0 });
534
+ } }, dependencies: [i1.QueryDataGridComponent, i2.QueryParameterFormComponent, i3.QueryInfoPanelComponent], styles: ["\n\n\n[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.query-viewer-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n position: relative;\n overflow: hidden;\n}\n\n\n\n.query-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.query-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.query-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.query-category[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.query-category[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.query-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.query-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n.execution-stats[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-muted);\n padding: 4px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.execution-stats[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.query-content[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.no-query-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n}\n\n.state-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: var(--mj-border-strong);\n margin-bottom: 20px;\n}\n\n.state-icon.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.state-message[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n\n\n.query-description[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n font-size: 13px;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.query-description[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n\n\n.execution-error[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.execution-error[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\nmj-query-data-grid[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n\n.btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 500;\n border: 1px solid transparent;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n}\n\n\n\n@media (max-width: 768px) {\n .query-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .query-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-end;\n }\n}"], changeDetection: 0 });
514
535
  }
515
536
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryViewerComponent, [{
516
537
  type: Component,
517
- args: [{ standalone: false, selector: 'mj-query-viewer', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Query Viewer Component -->\n<div class=\"query-viewer-container\">\n <!-- Header bar when query is loaded -->\n @if (QueryInfo) {\n <div class=\"query-header\">\n <div class=\"query-info\">\n <h3 class=\"query-name\">{{ QueryInfo.Name }}</h3>\n @if (QueryInfo.Category) {\n <span class=\"query-category\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ QueryInfo.Category }}\n </span>\n }\n </div>\n <div class=\"query-actions\">\n <!-- Info button -->\n <button (click)=\"OpenInfoPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Query information\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Info\n </button>\n <!-- Parameters button -->\n @if (HasParameters) {\n <button\n (click)=\"OpenParametersPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Edit parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </button>\n }\n <!-- Execution stats -->\n @if (ExecutionTimeMs !== null) {\n <span class=\"execution-stats\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ ExecutionTimeMs }}ms\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Main content area -->\n <div class=\"query-content\">\n <!-- No query selected state -->\n @if (!QueryId) {\n <div class=\"no-query-state\">\n <i class=\"fa-solid fa-database state-icon\"></i>\n <p class=\"state-message\">Select a query to view results</p>\n </div>\n }\n\n <!-- Query not found error -->\n @if (QueryId && !QueryInfo && LastError) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle state-icon error\"></i>\n <p class=\"state-message\">{{ LastError }}</p>\n </div>\n }\n\n <!-- Query description -->\n @if (QueryInfo?.Description && !HasRun) {\n <div class=\"query-description\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ QueryInfo?.Description }}\n </div>\n }\n\n <!-- Query execution error -->\n @if (LastError && HasRun) {\n <div class=\"execution-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ LastError }}</span>\n <button class=\"btn btn-secondary\" (click)=\"Refresh()\">Try Again</button>\n </div>\n }\n\n <!-- Grid -->\n @if (QueryInfo) {\n <mj-query-data-grid\n [QueryInfo]=\"QueryInfo\"\n [Data]=\"QueryData\"\n [SelectionMode]=\"SelectionMode\"\n [ShowToolbar]=\"ShowToolbar\"\n [VisualConfig]=\"VisualConfig\"\n [IsLoading]=\"IsLoading\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (RowDoubleClick)=\"OnRowDoubleClick($event)\"\n (SelectionChange)=\"OnSelectionChange($event)\"\n (GridStateChange)=\"OnGridStateChange($event)\"\n (RefreshRequest)=\"OnRefreshRequest()\">\n </mj-query-data-grid>\n }\n </div>\n\n <!-- Parameter form panel -->\n <mj-query-parameter-form\n [QueryInfo]=\"QueryInfo\"\n [InitialValues]=\"SavedParams\"\n [IsOpen]=\"ShowParamsPanel\"\n (ParametersSubmit)=\"OnParametersSubmit($event)\"\n (Close)=\"OnParamsPanelClose()\">\n </mj-query-parameter-form>\n\n <!-- Query info panel -->\n <mj-query-info-panel\n [QueryInfo]=\"QueryInfo\"\n [Visible]=\"ShowInfoPanel\"\n (Close)=\"CloseInfoPanel()\"\n (OpenRecord)=\"OnOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"OnCompositionTokenClick($event)\">\n </mj-query-info-panel>\n</div>\n", styles: ["/* Query Viewer Component Styles */\n\n:host {\n display: block;\n height: 100%;\n}\n\n.query-viewer-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #fff;\n position: relative;\n overflow: hidden;\n}\n\n/* Header */\n.query-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.query-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.query-name {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n.query-category {\n font-size: 12px;\n color: #666;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.query-category i {\n font-size: 10px;\n color: #888;\n}\n\n.query-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.query-actions button i {\n margin-right: 6px;\n}\n\n.execution-stats {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #888;\n padding: 4px 8px;\n background: #f0f0f0;\n border-radius: 4px;\n}\n\n.execution-stats i {\n font-size: 10px;\n}\n\n/* Content area */\n.query-content {\n flex: 1;\n min-height: 0;\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n/* State displays */\n.no-query-state,\n.error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n}\n\n.state-icon {\n font-size: 64px;\n color: #ccc;\n margin-bottom: 20px;\n}\n\n.state-icon.error {\n color: #f44336;\n}\n\n.state-message {\n font-size: 16px;\n color: #666;\n margin: 0;\n}\n\n/* Query description */\n.query-description {\n padding: 12px 16px;\n background: #e3f2fd;\n border-bottom: 1px solid #bbdefb;\n font-size: 13px;\n color: #1565c0;\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.query-description i {\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n/* Execution error */\n.execution-error {\n padding: 12px 16px;\n background: #ffebee;\n border-bottom: 1px solid #ffcdd2;\n font-size: 13px;\n color: #c62828;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-error i {\n flex-shrink: 0;\n}\n\n.execution-error span {\n flex: 1;\n}\n\n/* Grid takes remaining space */\nmj-query-data-grid {\n flex: 1;\n min-height: 0;\n}\n\n/* Buttons */\n.btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 500;\n border: 1px solid transparent;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn i {\n font-size: 11px;\n}\n\n.btn-secondary {\n background: #fff;\n color: #333;\n border-color: #ccc;\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: #f5f5f5;\n border-color: #bbb;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .query-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .query-actions {\n width: 100%;\n justify-content: flex-end;\n }\n}\n"] }]
538
+ args: [{ standalone: false, selector: 'mj-query-viewer', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Query Viewer Component -->\n<div class=\"query-viewer-container\">\n <!-- Header bar when query is loaded -->\n @if (QueryInfo) {\n <div class=\"query-header\">\n <div class=\"query-info\">\n <h3 class=\"query-name\">{{ QueryInfo.Name }}</h3>\n @if (QueryInfo.Category) {\n <span class=\"query-category\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ QueryInfo.Category }}\n </span>\n }\n </div>\n <div class=\"query-actions\">\n <!-- Info button -->\n <button (click)=\"OpenInfoPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Query information\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Info\n </button>\n <!-- Parameters button -->\n @if (HasParameters) {\n <button\n (click)=\"OpenParametersPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Edit parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </button>\n }\n <!-- Execution stats -->\n @if (ExecutionTimeMs !== null) {\n <span class=\"execution-stats\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ ExecutionTimeMs }}ms\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Main content area -->\n <div class=\"query-content\">\n <!-- No query selected state -->\n @if (!QueryId) {\n <div class=\"no-query-state\">\n <i class=\"fa-solid fa-database state-icon\"></i>\n <p class=\"state-message\">Select a query to view results</p>\n </div>\n }\n\n <!-- Query not found error -->\n @if (QueryId && !QueryInfo && LastError) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle state-icon error\"></i>\n <p class=\"state-message\">{{ LastError }}</p>\n </div>\n }\n\n <!-- Query description -->\n @if (QueryInfo?.Description && !HasRun) {\n <div class=\"query-description\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ QueryInfo?.Description }}\n </div>\n }\n\n <!-- Query execution error -->\n @if (LastError && HasRun) {\n <div class=\"execution-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ LastError }}</span>\n <button class=\"btn btn-secondary\" (click)=\"Refresh()\">Try Again</button>\n </div>\n }\n\n <!-- Grid -->\n @if (QueryInfo) {\n <mj-query-data-grid\n [QueryInfo]=\"QueryInfo\"\n [Data]=\"QueryData\"\n [TotalRowCount]=\"QueryTotalRowCount\"\n [PageNumber]=\"CurrentPageNumber\"\n [PageSize]=\"PageSize\"\n [SelectionMode]=\"SelectionMode\"\n [ShowToolbar]=\"ShowToolbar\"\n [VisualConfig]=\"VisualConfig\"\n [IsLoading]=\"IsLoading\"\n (PageChange)=\"OnPageChange($event)\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (RowDoubleClick)=\"OnRowDoubleClick($event)\"\n (SelectionChange)=\"OnSelectionChange($event)\"\n (GridStateChange)=\"OnGridStateChange($event)\"\n (RefreshRequest)=\"OnRefreshRequest()\">\n </mj-query-data-grid>\n }\n </div>\n\n <!-- Parameter form panel -->\n <mj-query-parameter-form\n [QueryInfo]=\"QueryInfo\"\n [InitialValues]=\"SavedParams\"\n [IsOpen]=\"ShowParamsPanel\"\n (ParametersSubmit)=\"OnParametersSubmit($event)\"\n (Close)=\"OnParamsPanelClose()\">\n </mj-query-parameter-form>\n\n <!-- Query info panel -->\n <mj-query-info-panel\n [QueryInfo]=\"QueryInfo\"\n [Visible]=\"ShowInfoPanel\"\n (Close)=\"CloseInfoPanel()\"\n (OpenRecord)=\"OnOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"OnCompositionTokenClick($event)\">\n </mj-query-info-panel>\n</div>\n", styles: ["/* Query Viewer Component Styles */\n\n:host {\n display: block;\n height: 100%;\n}\n\n.query-viewer-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n position: relative;\n overflow: hidden;\n}\n\n/* Header */\n.query-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.query-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.query-name {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.query-category {\n font-size: 12px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.query-category i {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.query-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.query-actions button i {\n margin-right: 6px;\n}\n\n.execution-stats {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-muted);\n padding: 4px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.execution-stats i {\n font-size: 10px;\n}\n\n/* Content area */\n.query-content {\n flex: 1;\n min-height: 0;\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n/* State displays */\n.no-query-state,\n.error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n}\n\n.state-icon {\n font-size: 64px;\n color: var(--mj-border-strong);\n margin-bottom: 20px;\n}\n\n.state-icon.error {\n color: var(--mj-status-error);\n}\n\n.state-message {\n font-size: 16px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n/* Query description */\n.query-description {\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n font-size: 13px;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.query-description i {\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n/* Execution error */\n.execution-error {\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-error i {\n flex-shrink: 0;\n}\n\n.execution-error span {\n flex: 1;\n}\n\n/* Grid takes remaining space */\nmj-query-data-grid {\n flex: 1;\n min-height: 0;\n}\n\n/* Buttons */\n.btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 500;\n border: 1px solid transparent;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn i {\n font-size: 11px;\n}\n\n.btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .query-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .query-actions {\n width: 100%;\n justify-content: flex-end;\n }\n}\n"] }]
518
539
  }], () => [{ type: i0.ChangeDetectorRef }], { QueryId: [{
519
540
  type: Input
520
541
  }], AutoRun: [{
@@ -529,6 +550,8 @@ export class QueryViewerComponent {
529
550
  type: Input
530
551
  }], PersistParameters: [{
531
552
  type: Input
553
+ }], PageSize: [{
554
+ type: Input
532
555
  }], EntityLinkClick: [{
533
556
  type: Output
534
557
  }], RowDoubleClick: [{
@@ -1 +1 @@
1
- {"version":3,"file":"query-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/query-viewer/query-viewer.component.ts","../../../src/lib/query-viewer/query-viewer.component.html"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EAIZ,uBAAuB,EACvB,SAAS,EACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAkB,QAAQ,EAAa,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,EASH,oBAAoB,EACpB,iBAAiB,EACpB,MAAM,4CAA4C,CAAC;;;;;;ICvB1C,gCAA6B;IAC3B,wBAAkC;IAClC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,0DACF;;;;IAcA,kCAI0B;IAHxB,uMAAS,4BAAqB,KAAC;IAI/B,wBAAmC;IACnC,4BACF;IAAA,iBAAS;;;IALP,2CAAsB;;;IASxB,gCAA8B;IAC5B,wBAAiC;IACjC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,yDACF;;;;IAjCF,AADF,AADF,8BAA0B,cACA,aACC;IAAA,YAAoB;IAAA,iBAAK;IAChD,sGAA0B;IAM5B,iBAAM;IAGJ,AAFF,+BAA2B,iBAKG;IAHpB,wLAAS,sBAAe,KAAC;IAI/B,wBAAuC;IACvC,sBACF;IAAA,iBAAS;IAET,wGAAqB;IAWrB,wGAAgC;IAOpC,AADE,iBAAM,EACF;;;IApCqB,eAAoB;IAApB,2CAAoB;IAC3C,cAKC;IALD,oDAKC;IAKC,eAAsB;IAAtB,2CAAsB;IAOxB,eASC;IATD,+CASC;IAED,cAKC;IALD,2DAKC;;;IASH,8BAA4B;IAC1B,wBAA+C;IAC/C,6BAAyB;IAAA,8CAA8B;IACzD,AADyD,iBAAI,EACvD;;;IAKN,8BAAyB;IACvB,wBAAiE;IACjE,6BAAyB;IAAA,YAAe;IAC1C,AAD0C,iBAAI,EACxC;;;IADqB,eAAe;IAAf,sCAAe;;;IAM1C,8BAA+B;IAC7B,wBAAuC;IACvC,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,+FACF;;;;IAKA,8BAA6B;IAC3B,wBAA8C;IAC9C,4BAAM;IAAA,YAAe;IAAA,iBAAO;IAC5B,kCAAsD;IAApB,wLAAS,gBAAS,KAAC;IAAC,yBAAS;IACjE,AADiE,iBAAS,EACpE;;;IAFE,eAAe;IAAf,sCAAe;;;;IAOvB,8CAWwC;IAAtC,AADA,AADA,AADA,AADA,8NAAmB,gCAAyB,KAAC,+MAC3B,+BAAwB,KAAC,iNACxB,gCAAyB,KAAC,iNAC1B,gCAAyB,KAAC,yMAC3B,yBAAkB,KAAC;IACvC,iBAAqB;;;IANnB,AADA,AADA,AADA,AADA,AADA,4CAAuB,0BACL,uCACa,mCACJ,qCACE,+BACN;;ADvD/B;;;;;;;;;;;;;;;;;GAiBG;AAQH,MAAM,OAAO,oBAAoB;IAyHT;IAxHpB,2CAA2C;IAC3C,SAAS;IACT,2CAA2C;IAEnC,QAAQ,GAAkB,IAAI,CAAC;IACvC;;OAEG;IACH,IACI,OAAO,CAAC,KAAoB;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;OAEG;IACM,OAAO,GAAY,IAAI,CAAC;IAEjC;;OAEG;IACM,aAAa,GAA2B,QAAQ,CAAC;IAE1D;;OAEG;IACM,WAAW,GAAY,IAAI,CAAC;IAErC;;OAEG;IACM,YAAY,GAA0B,EAAE,CAAC;IAElD;;OAEG;IACM,YAAY,GAAY,IAAI,CAAC;IAEtC;;OAEG;IACM,iBAAiB,GAAY,IAAI,CAAC;IAE3C,2CAA2C;IAC3C,UAAU;IACV,2CAA2C;IAE3C;;OAEG;IACO,eAAe,GAAG,IAAI,YAAY,EAA6B,CAAC;IAE1E;;OAEG;IACO,cAAc,GAAG,IAAI,YAAY,EAAsB,CAAC;IAElE;;OAEG;IACO,eAAe,GAAG,IAAI,YAAY,EAA8B,CAAC;IAE3E;;OAEG;IACO,UAAU,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEhD;;OAEG;IACO,aAAa,GAAG,IAAI,YAAY,EAAkB,CAAC;IAE7D;;OAEG;IACO,UAAU,GAAG,IAAI,YAAY,EAAS,CAAC;IAEjD;;OAEG;IACO,eAAe,GAAG,IAAI,YAAY,EAA0C,CAAC;IAEvF;;OAEG;IACO,qBAAqB,GAAG,IAAI,YAAY,EAA8B,CAAC;IAEjF,2CAA2C;IAC3C,gBAAgB;IAChB,2CAA2C;IAER,QAAQ,CAA0B;IAErE,2CAA2C;IAC3C,iBAAiB;IACjB,2CAA2C;IAEpC,SAAS,GAAqB,IAAI,CAAC;IACnC,SAAS,GAA8B,EAAE,CAAC;IAC1C,SAAS,GAAY,KAAK,CAAC;IAC3B,eAAe,GAAY,KAAK,CAAC;IACjC,aAAa,GAAY,KAAK,CAAC;IAC/B,MAAM,GAAY,KAAK,CAAC;IACxB,SAAS,GAAkB,IAAI,CAAC;IAChC,eAAe,GAAkB,IAAI,CAAC;IAEtC,cAAc,GAA0B,IAAI,CAAC;IAC7C,WAAW,GAAyB,EAAE,CAAC;IAEtC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC1B,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAC/B,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC;IAEjD,YAAoB,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAE9C,QAAQ,KAAU,CAAC;IAEnB,WAAW;QACP,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,2CAA2C;IAC3C,gBAAgB;IAChB,2CAA2C;IAEnC,KAAK,CAAC,gBAAgB;QAC1B,cAAc;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;QAE1F,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,GAAG,iBAAiB,IAAI,CAAC,QAAQ,YAAY,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACX,CAAC;QAED,sCAAsC;QACtC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,iDAAiD;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACpF,MAAM,iBAAiB,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAEzF,IAAI,SAAS,EAAE,CAAC;YACZ,iDAAiD;YACjD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAEpE,IAAI,UAAU,EAAE,CAAC;gBACb,iCAAiC;gBACjC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACJ,uBAAuB;gBACvB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAChC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,uCAAuC;YACvC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEO,yBAAyB;QAC7B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAElC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAElF,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;gBACvE,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjF,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,2CAA2C;IAC3C,oBAAoB;IACpB,2CAA2C;IAEnC,KAAK,CAAC,cAAc;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE3B,IAAI,CAAC;YACD,kBAAkB;YAClB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;gBACjE,IAAI,gBAAgB,EAAE,CAAC;oBACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAmB,CAAC;gBACzE,CAAC;YACL,CAAC;YAED,wBAAwB;YACxB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC3D,IAAI,aAAa,EAAE,CAAC;oBAChB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAyB,CAAC;gBACzE,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,KAAqB;QAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAEjD,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,MAA4B;QACrD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEtD,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAW;QACpC,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,KAAa;QACnD,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;IAClB,2CAA2C;IAEpC,KAAK,CAAC,QAAQ,CAAC,MAA4B;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,gCAAgC;QAChC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,SAAS,GAAmB;gBAC9B,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,UAAU,EAAE,MAAiC;aAChD,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAElD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAEjE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY,IAAI,wBAAwB,CAAC;gBACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBAChD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,IAAI,CAAC,SAAS,EACd,OAAO,EACP,IAAI,CACP,CAAC;YACN,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YACjE,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC9E,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YAC/E,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,wBAAwB,YAAY,EAAE,EACtC,OAAO,EACP,IAAI,CACP,CAAC;QACN,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,iBAAiB;IACjB,2CAA2C;IAEpC,kBAAkB,CAAC,MAA4B;QAClD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAEM,kBAAkB;QACrB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,iBAAiB,CAAC,KAAiC;QACtD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEM,iBAAiB,CAAC,KAAgC;QACrD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEM,gBAAgB,CAAC,KAAyB;QAC7C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEM,iBAAiB,CAAC,KAAiC;QACtD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEM,gBAAgB;QACnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,aAAa;IACb,2CAA2C;IAEpC,mBAAmB;QACtB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,cAAc;QACjB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,iBAAiB,CAAC,KAA6C;QAClE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEM,uBAAuB,CAAC,KAAiC;QAC5D,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;8GA3YQ,oBAAoB;6DAApB,oBAAoB;2BAmGlB,sBAAsB;;;;;YC5JrC,8BAAoC;YAElC,uFAAiB;YA2CjB,8BAA2B;YAEzB,sFAAgB;YAQhB,sFAA0C;YAQ1C,sFAAyC;YAQzC,sFAA2B;YAS3B,qGAAiB;YAenB,iBAAM;YAGN,kDAKiC;YAA/B,AADA,8IAAoB,8BAA0B,IAAC,qGACtC,wBAAoB,IAAC;YAChC,iBAA0B;YAG1B,8CAK4D;YAA1D,AADA,AADA,8GAAS,oBAAgB,IAAC,iHACZ,6BAAyB,IAAC,uIACf,mCAA+B,IAAC;YAE7D,AADE,iBAAsB,EAClB;;YAhHJ,cAwCC;YAxCD,wCAwCC;YAKC,eAKC;YALD,uCAKC;YAGD,cAKC;YALD,yEAKC;YAGD,cAKC;YALD,oGAKC;YAGD,cAMC;YAND,sDAMC;YAGD,cAcC;YAdD,wCAcC;YAKD,cAAuB;YAEvB,AADA,AADA,yCAAuB,kCACM,+BACH;YAO1B,cAAuB;YACvB,AADA,yCAAuB,8BACE;;;iFDpDhB,oBAAoB;cAPhC,SAAS;6BACI,KAAK,YACL,iBAAiB,mBAGV,uBAAuB,CAAC,MAAM;;kBAW9C,KAAK;;kBAeL,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBASL,MAAM;;kBAKN,MAAM;;kBAKN,MAAM;;kBAKN,MAAM;;kBAKN,MAAM;;kBAKN,MAAM;;kBAKN,MAAM;;kBAKN,MAAM;;kBAMN,SAAS;mBAAC,sBAAsB;;kFAnGxB,oBAAoB","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n ViewChild\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RunQuery, RunQueryParams, Metadata, QueryInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { RunQueryResult } from '@memberjunction/core';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\nimport { QueryDataGridComponent } from '../query-data-grid/query-data-grid.component';\nimport {\n QueryGridSelectionMode,\n QueryGridState,\n QueryGridVisualConfig,\n QueryParameterValues,\n QueryEntityLinkClickEvent,\n QueryGridStateChangedEvent,\n QuerySelectionChangedEvent,\n QueryRowClickEvent,\n getQueryGridStateKey,\n getQueryParamsKey\n} from '../query-data-grid/models/query-grid-types';\n\n/**\n * A composite component that provides a complete query viewing experience.\n * Features:\n * - Automatic parameter form display when query has parameters\n * - Grid state persistence to User Settings\n * - Parameter persistence to User Settings\n * - Entity linking for clickable record IDs\n * - Auto-run capability when all required params have saved values\n *\n * @example\n * ```html\n * <mj-query-viewer\n * [QueryId]=\"selectedQueryId\"\n * [AutoRun]=\"true\"\n * (EntityLinkClick)=\"openRecord($event)\">\n * </mj-query-viewer>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-query-viewer',\n templateUrl: './query-viewer.component.html',\n styleUrls: ['./query-viewer.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryViewerComponent implements OnInit, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _queryId: string | null = null;\n /**\n * The ID of the query to display\n */\n @Input()\n set QueryId(value: string | null) {\n const previous = this._queryId;\n this._queryId = value;\n if (value !== previous) {\n this.onQueryIdChanged();\n }\n }\n get QueryId(): string | null {\n return this._queryId;\n }\n\n /**\n * Whether to auto-run the query when all required params have saved values\n */\n @Input() AutoRun: boolean = true;\n\n /**\n * Selection mode for the grid\n */\n @Input() SelectionMode: QueryGridSelectionMode = 'single';\n\n /**\n * Whether to show the toolbar\n */\n @Input() ShowToolbar: boolean = true;\n\n /**\n * Visual configuration for the grid\n */\n @Input() VisualConfig: QueryGridVisualConfig = {};\n\n /**\n * Whether to persist grid state\n */\n @Input() PersistState: boolean = true;\n\n /**\n * Whether to persist parameter values\n */\n @Input() PersistParameters: boolean = true;\n\n // ========================================\n // Outputs\n // ========================================\n\n /**\n * Fired when an entity link is clicked in the grid\n */\n @Output() EntityLinkClick = new EventEmitter<QueryEntityLinkClickEvent>();\n\n /**\n * Fired when a row is double-clicked\n */\n @Output() RowDoubleClick = new EventEmitter<QueryRowClickEvent>();\n\n /**\n * Fired when selection changes\n */\n @Output() SelectionChange = new EventEmitter<QuerySelectionChangedEvent>();\n\n /**\n * Fired when query execution starts\n */\n @Output() QueryStart = new EventEmitter<void>();\n\n /**\n * Fired when query execution completes\n */\n @Output() QueryComplete = new EventEmitter<RunQueryResult>();\n\n /**\n * Fired when query execution fails\n */\n @Output() QueryError = new EventEmitter<Error>();\n\n /**\n * Fired when user wants to open the full query record\n */\n @Output() OpenQueryRecord = new EventEmitter<{ queryId: string; queryName: string }>();\n\n /**\n * Fired when a composition token ({{query:\"...\"}}) is clicked in the SQL info panel\n */\n @Output() CompositionTokenClick = new EventEmitter<CompositionTokenClickEvent>();\n\n // ========================================\n // View Children\n // ========================================\n\n @ViewChild(QueryDataGridComponent) DataGrid!: QueryDataGridComponent;\n\n // ========================================\n // Internal State\n // ========================================\n\n public QueryInfo: QueryInfo | null = null;\n public QueryData: Record<string, unknown>[] = [];\n public IsLoading: boolean = false;\n public ShowParamsPanel: boolean = false;\n public ShowInfoPanel: boolean = false;\n public HasRun: boolean = false;\n public LastError: string | null = null;\n public ExecutionTimeMs: number | null = null;\n\n public SavedGridState: QueryGridState | null = null;\n public SavedParams: QueryParameterValues = {};\n\n private metadata = new Metadata();\n private destroy$ = new Subject<void>();\n private userInfoEngine = UserInfoEngine.Instance;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Query Loading\n // ========================================\n\n private async onQueryIdChanged(): Promise<void> {\n // Reset state\n this.QueryInfo = null;\n this.QueryData = [];\n this.HasRun = false;\n this.LastError = null;\n this.ExecutionTimeMs = null;\n this.SavedGridState = null;\n this.SavedParams = {};\n this.ShowParamsPanel = false;\n this.cdr.markForCheck();\n\n if (!this._queryId) {\n return;\n }\n\n // Load query info from metadata\n this.QueryInfo = this.metadata.Queries.find(q => UUIDsEqual(q.ID, this._queryId)) || null;\n\n if (!this.QueryInfo) {\n this.LastError = `Query with ID ${this._queryId} not found`;\n this.cdr.markForCheck();\n return;\n }\n\n // Load saved state from User Settings\n await this.loadSavedState();\n\n // Determine if we should show params or auto-run\n const hasParams = this.QueryInfo.Parameters && this.QueryInfo.Parameters.length > 0;\n const hasRequiredParams = hasParams && this.QueryInfo.Parameters.some(p => p.IsRequired);\n\n if (hasParams) {\n // Check if all required params have saved values\n const canAutoRun = this.AutoRun && this.canAutoRunWithSavedParams();\n\n if (canAutoRun) {\n // Auto-run with saved parameters\n await this.RunQuery(this.SavedParams);\n } else {\n // Show parameter panel\n this.ShowParamsPanel = true;\n }\n } else {\n // No parameters - auto-run immediately\n await this.RunQuery({});\n }\n\n this.cdr.markForCheck();\n }\n\n private canAutoRunWithSavedParams(): boolean {\n if (!this.QueryInfo) return false;\n\n const requiredParams = this.QueryInfo.Parameters?.filter(p => p.IsRequired) || [];\n\n for (const param of requiredParams) {\n const savedValue = this.SavedParams[param.Name];\n if (savedValue === null || savedValue === undefined || savedValue === '') {\n return false;\n }\n if (param.Type === 'array' && Array.isArray(savedValue) && savedValue.length === 0) {\n return false;\n }\n }\n\n return true;\n }\n\n // ========================================\n // State Persistence\n // ========================================\n\n private async loadSavedState(): Promise<void> {\n if (!this._queryId) return;\n\n try {\n // Load grid state\n if (this.PersistState) {\n const gridStateKey = getQueryGridStateKey(this._queryId);\n const gridStateSetting = await this.getUserSetting(gridStateKey);\n if (gridStateSetting) {\n this.SavedGridState = JSON.parse(gridStateSetting) as QueryGridState;\n }\n }\n\n // Load saved parameters\n if (this.PersistParameters) {\n const paramsKey = getQueryParamsKey(this._queryId);\n const paramsSetting = await this.getUserSetting(paramsKey);\n if (paramsSetting) {\n this.SavedParams = JSON.parse(paramsSetting) as QueryParameterValues;\n }\n }\n } catch (error) {\n console.warn('Error loading saved query state:', error);\n }\n }\n\n private async saveGridState(state: QueryGridState): Promise<void> {\n if (!this._queryId || !this.PersistState) return;\n\n try {\n const key = getQueryGridStateKey(this._queryId);\n await this.setUserSetting(key, JSON.stringify(state));\n } catch (error) {\n console.warn('Error saving grid state:', error);\n }\n }\n\n private async saveParameters(params: QueryParameterValues): Promise<void> {\n if (!this._queryId || !this.PersistParameters) return;\n\n try {\n const key = getQueryParamsKey(this._queryId);\n await this.setUserSetting(key, JSON.stringify(params));\n } catch (error) {\n console.warn('Error saving parameters:', error);\n }\n }\n\n private async getUserSetting(key: string): Promise<string | undefined> {\n return this.userInfoEngine.GetSetting(key);\n }\n\n private async setUserSetting(key: string, value: string): Promise<void> {\n await this.userInfoEngine.SetSetting(key, value);\n }\n\n // ========================================\n // Query Execution\n // ========================================\n\n public async RunQuery(params: QueryParameterValues): Promise<void> {\n if (!this.QueryInfo || !this._queryId) return;\n\n this.IsLoading = true;\n this.LastError = null;\n this.QueryStart.emit();\n this.cdr.markForCheck();\n\n // Save parameters for next time\n this.SavedParams = params;\n await this.saveParameters(params);\n\n const startTime = performance.now();\n\n try {\n const runQuery = new RunQuery();\n const runParams: RunQueryParams = {\n QueryID: this._queryId,\n Parameters: params as Record<string, unknown>\n };\n\n const result = await runQuery.RunQuery(runParams);\n\n this.ExecutionTimeMs = Math.round(performance.now() - startTime);\n\n if (result.Success) {\n this.QueryData = result.Results || [];\n this.HasRun = true;\n this.ShowParamsPanel = false;\n this.QueryComplete.emit(result);\n } else {\n this.LastError = result.ErrorMessage || 'Query execution failed';\n this.QueryError.emit(new Error(this.LastError));\n MJNotificationService.Instance.CreateSimpleNotification(\n this.LastError,\n 'error',\n 5000\n );\n }\n } catch (error) {\n this.ExecutionTimeMs = Math.round(performance.now() - startTime);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.LastError = errorMessage;\n this.QueryError.emit(error instanceof Error ? error : new Error(errorMessage));\n MJNotificationService.Instance.CreateSimpleNotification(\n `Error running query: ${errorMessage}`,\n 'error',\n 5000\n );\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ========================================\n // Event Handlers\n // ========================================\n\n public OnParametersSubmit(params: QueryParameterValues): void {\n this.RunQuery(params);\n }\n\n public OnParamsPanelClose(): void {\n this.ShowParamsPanel = false;\n this.cdr.markForCheck();\n }\n\n public OnGridStateChange(event: QueryGridStateChangedEvent): void {\n this.saveGridState(event.state);\n }\n\n public OnEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n this.EntityLinkClick.emit(event);\n }\n\n public OnRowDoubleClick(event: QueryRowClickEvent): void {\n this.RowDoubleClick.emit(event);\n }\n\n public OnSelectionChange(event: QuerySelectionChangedEvent): void {\n this.SelectionChange.emit(event);\n }\n\n public OnRefreshRequest(): void {\n if (this.HasRun) {\n this.RunQuery(this.SavedParams);\n } else if (this.QueryInfo?.Parameters?.length) {\n this.ShowParamsPanel = true;\n this.cdr.markForCheck();\n } else {\n this.RunQuery({});\n }\n }\n\n // ========================================\n // Public API\n // ========================================\n\n public OpenParametersPanel(): void {\n this.ShowParamsPanel = true;\n this.cdr.markForCheck();\n }\n\n public OpenInfoPanel(): void {\n this.ShowInfoPanel = true;\n this.cdr.markForCheck();\n }\n\n public CloseInfoPanel(): void {\n this.ShowInfoPanel = false;\n this.cdr.markForCheck();\n }\n\n public OnOpenQueryRecord(event: { queryId: string; queryName: string }): void {\n this.OpenQueryRecord.emit(event);\n }\n\n public OnCompositionTokenClick(event: CompositionTokenClickEvent): void {\n this.CompositionTokenClick.emit(event);\n }\n\n public Refresh(): void {\n this.OnRefreshRequest();\n }\n\n public get HasParameters(): boolean {\n return (this.QueryInfo?.Parameters?.length || 0) > 0;\n }\n}\n","<!-- Query Viewer Component -->\n<div class=\"query-viewer-container\">\n <!-- Header bar when query is loaded -->\n @if (QueryInfo) {\n <div class=\"query-header\">\n <div class=\"query-info\">\n <h3 class=\"query-name\">{{ QueryInfo.Name }}</h3>\n @if (QueryInfo.Category) {\n <span class=\"query-category\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ QueryInfo.Category }}\n </span>\n }\n </div>\n <div class=\"query-actions\">\n <!-- Info button -->\n <button (click)=\"OpenInfoPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Query information\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Info\n </button>\n <!-- Parameters button -->\n @if (HasParameters) {\n <button\n (click)=\"OpenParametersPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Edit parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </button>\n }\n <!-- Execution stats -->\n @if (ExecutionTimeMs !== null) {\n <span class=\"execution-stats\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ ExecutionTimeMs }}ms\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Main content area -->\n <div class=\"query-content\">\n <!-- No query selected state -->\n @if (!QueryId) {\n <div class=\"no-query-state\">\n <i class=\"fa-solid fa-database state-icon\"></i>\n <p class=\"state-message\">Select a query to view results</p>\n </div>\n }\n\n <!-- Query not found error -->\n @if (QueryId && !QueryInfo && LastError) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle state-icon error\"></i>\n <p class=\"state-message\">{{ LastError }}</p>\n </div>\n }\n\n <!-- Query description -->\n @if (QueryInfo?.Description && !HasRun) {\n <div class=\"query-description\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ QueryInfo?.Description }}\n </div>\n }\n\n <!-- Query execution error -->\n @if (LastError && HasRun) {\n <div class=\"execution-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ LastError }}</span>\n <button class=\"btn btn-secondary\" (click)=\"Refresh()\">Try Again</button>\n </div>\n }\n\n <!-- Grid -->\n @if (QueryInfo) {\n <mj-query-data-grid\n [QueryInfo]=\"QueryInfo\"\n [Data]=\"QueryData\"\n [SelectionMode]=\"SelectionMode\"\n [ShowToolbar]=\"ShowToolbar\"\n [VisualConfig]=\"VisualConfig\"\n [IsLoading]=\"IsLoading\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (RowDoubleClick)=\"OnRowDoubleClick($event)\"\n (SelectionChange)=\"OnSelectionChange($event)\"\n (GridStateChange)=\"OnGridStateChange($event)\"\n (RefreshRequest)=\"OnRefreshRequest()\">\n </mj-query-data-grid>\n }\n </div>\n\n <!-- Parameter form panel -->\n <mj-query-parameter-form\n [QueryInfo]=\"QueryInfo\"\n [InitialValues]=\"SavedParams\"\n [IsOpen]=\"ShowParamsPanel\"\n (ParametersSubmit)=\"OnParametersSubmit($event)\"\n (Close)=\"OnParamsPanelClose()\">\n </mj-query-parameter-form>\n\n <!-- Query info panel -->\n <mj-query-info-panel\n [QueryInfo]=\"QueryInfo\"\n [Visible]=\"ShowInfoPanel\"\n (Close)=\"CloseInfoPanel()\"\n (OpenRecord)=\"OnOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"OnCompositionTokenClick($event)\">\n </mj-query-info-panel>\n</div>\n"]}
1
+ {"version":3,"file":"query-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/query-viewer/query-viewer.component.ts","../../../src/lib/query-viewer/query-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n ViewChild\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RunQuery, RunQueryParams, RunQueryResult, Metadata, QueryInfo } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\nimport { QueryDataGridComponent } from '../query-data-grid/query-data-grid.component';\nimport {\n QueryGridSelectionMode,\n QueryGridState,\n QueryGridVisualConfig,\n QueryParameterValues,\n QueryEntityLinkClickEvent,\n QueryGridStateChangedEvent,\n QuerySelectionChangedEvent,\n QueryRowClickEvent,\n getQueryGridStateKey,\n getQueryParamsKey\n} from '../query-data-grid/models/query-grid-types';\n\n/**\n * A composite component that provides a complete query viewing experience.\n * Features:\n * - Automatic parameter form display when query has parameters\n * - Grid state persistence to User Settings\n * - Parameter persistence to User Settings\n * - Entity linking for clickable record IDs\n * - Auto-run capability when all required params have saved values\n *\n * @example\n * ```html\n * <mj-query-viewer\n * [QueryId]=\"selectedQueryId\"\n * [AutoRun]=\"true\"\n * (EntityLinkClick)=\"openRecord($event)\">\n * </mj-query-viewer>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-query-viewer',\n templateUrl: './query-viewer.component.html',\n styleUrls: ['./query-viewer.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryViewerComponent implements OnInit, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _queryId: string | null = null;\n /**\n * The ID of the query to display\n */\n @Input()\n set QueryId(value: string | null) {\n const previous = this._queryId;\n this._queryId = value;\n if (value !== previous) {\n this.onQueryIdChanged();\n }\n }\n get QueryId(): string | null {\n return this._queryId;\n }\n\n /**\n * Whether to auto-run the query when all required params have saved values\n */\n @Input() AutoRun: boolean = true;\n\n /**\n * Selection mode for the grid\n */\n @Input() SelectionMode: QueryGridSelectionMode = 'single';\n\n /**\n * Whether to show the toolbar\n */\n @Input() ShowToolbar: boolean = true;\n\n /**\n * Visual configuration for the grid\n */\n @Input() VisualConfig: QueryGridVisualConfig = {};\n\n /**\n * Whether to persist grid state\n */\n @Input() PersistState: boolean = true;\n\n /**\n * Whether to persist parameter values\n */\n @Input() PersistParameters: boolean = true;\n\n /**\n * Number of rows per page for server-side paging.\n * Set to 0 to disable paging and load all rows at once.\n */\n @Input() PageSize: number = 100;\n\n // ========================================\n // Outputs\n // ========================================\n\n /**\n * Fired when an entity link is clicked in the grid\n */\n @Output() EntityLinkClick = new EventEmitter<QueryEntityLinkClickEvent>();\n\n /**\n * Fired when a row is double-clicked\n */\n @Output() RowDoubleClick = new EventEmitter<QueryRowClickEvent>();\n\n /**\n * Fired when selection changes\n */\n @Output() SelectionChange = new EventEmitter<QuerySelectionChangedEvent>();\n\n /**\n * Fired when query execution starts\n */\n @Output() QueryStart = new EventEmitter<void>();\n\n /**\n * Fired when query execution completes\n */\n @Output() QueryComplete = new EventEmitter<RunQueryResult>();\n\n /**\n * Fired when query execution fails\n */\n @Output() QueryError = new EventEmitter<Error>();\n\n /**\n * Fired when user wants to open the full query record\n */\n @Output() OpenQueryRecord = new EventEmitter<{ queryId: string; queryName: string }>();\n\n /**\n * Fired when a composition token ({{query:\"...\"}}) is clicked in the SQL info panel\n */\n @Output() CompositionTokenClick = new EventEmitter<CompositionTokenClickEvent>();\n\n // ========================================\n // View Children\n // ========================================\n\n @ViewChild(QueryDataGridComponent) DataGrid!: QueryDataGridComponent;\n\n // ========================================\n // Internal State\n // ========================================\n\n public QueryInfo: QueryInfo | null = null;\n public QueryData: Record<string, unknown>[] = [];\n public IsLoading: boolean = false;\n public ShowParamsPanel: boolean = false;\n public ShowInfoPanel: boolean = false;\n public HasRun: boolean = false;\n public LastError: string | null = null;\n public ExecutionTimeMs: number | null = null;\n\n public SavedGridState: QueryGridState | null = null;\n public SavedParams: QueryParameterValues = {};\n\n /** Paging state */\n public QueryTotalRowCount: number = 0;\n public CurrentPageNumber: number = 1;\n\n private metadata = new Metadata();\n private destroy$ = new Subject<void>();\n private userInfoEngine = UserInfoEngine.Instance;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Query Loading\n // ========================================\n\n private async onQueryIdChanged(): Promise<void> {\n // Reset state\n this.QueryInfo = null;\n this.QueryData = [];\n this.HasRun = false;\n this.LastError = null;\n this.ExecutionTimeMs = null;\n this.SavedGridState = null;\n this.SavedParams = {};\n this.ShowParamsPanel = false;\n this.QueryTotalRowCount = 0;\n this.CurrentPageNumber = 1;\n this.cdr.markForCheck();\n\n if (!this._queryId) {\n return;\n }\n\n // Load query info from metadata\n this.QueryInfo = this.metadata.Queries.find(q => UUIDsEqual(q.ID, this._queryId)) || null;\n\n if (!this.QueryInfo) {\n this.LastError = `Query with ID ${this._queryId} not found`;\n this.cdr.markForCheck();\n return;\n }\n\n // Load saved state from User Settings\n await this.loadSavedState();\n\n // Determine if we should show params or auto-run\n const hasParams = this.QueryInfo.Parameters && this.QueryInfo.Parameters.length > 0;\n const hasRequiredParams = hasParams && this.QueryInfo.Parameters.some(p => p.IsRequired);\n\n if (hasParams) {\n // Check if all required params have saved values\n const canAutoRun = this.AutoRun && this.canAutoRunWithSavedParams();\n\n if (canAutoRun) {\n // Auto-run with saved parameters\n await this.RunQuery(this.SavedParams);\n } else {\n // Show parameter panel\n this.ShowParamsPanel = true;\n }\n } else {\n // No parameters - auto-run immediately\n await this.RunQuery({});\n }\n\n this.cdr.markForCheck();\n }\n\n private canAutoRunWithSavedParams(): boolean {\n if (!this.QueryInfo) return false;\n\n const requiredParams = this.QueryInfo.Parameters?.filter(p => p.IsRequired) || [];\n\n for (const param of requiredParams) {\n const savedValue = this.SavedParams[param.Name];\n if (savedValue === null || savedValue === undefined || savedValue === '') {\n return false;\n }\n if (param.Type === 'array' && Array.isArray(savedValue) && savedValue.length === 0) {\n return false;\n }\n }\n\n return true;\n }\n\n // ========================================\n // State Persistence\n // ========================================\n\n private async loadSavedState(): Promise<void> {\n if (!this._queryId) return;\n\n try {\n // Load grid state\n if (this.PersistState) {\n const gridStateKey = getQueryGridStateKey(this._queryId);\n const gridStateSetting = await this.getUserSetting(gridStateKey);\n if (gridStateSetting) {\n this.SavedGridState = JSON.parse(gridStateSetting) as QueryGridState;\n }\n }\n\n // Load saved parameters\n if (this.PersistParameters) {\n const paramsKey = getQueryParamsKey(this._queryId);\n const paramsSetting = await this.getUserSetting(paramsKey);\n if (paramsSetting) {\n this.SavedParams = JSON.parse(paramsSetting) as QueryParameterValues;\n }\n }\n } catch (error) {\n console.warn('Error loading saved query state:', error);\n }\n }\n\n private async saveGridState(state: QueryGridState): Promise<void> {\n if (!this._queryId || !this.PersistState) return;\n\n try {\n const key = getQueryGridStateKey(this._queryId);\n await this.setUserSetting(key, JSON.stringify(state));\n } catch (error) {\n console.warn('Error saving grid state:', error);\n }\n }\n\n private async saveParameters(params: QueryParameterValues): Promise<void> {\n if (!this._queryId || !this.PersistParameters) return;\n\n try {\n const key = getQueryParamsKey(this._queryId);\n await this.setUserSetting(key, JSON.stringify(params));\n } catch (error) {\n console.warn('Error saving parameters:', error);\n }\n }\n\n private async getUserSetting(key: string): Promise<string | undefined> {\n return this.userInfoEngine.GetSetting(key);\n }\n\n private async setUserSetting(key: string, value: string): Promise<void> {\n await this.userInfoEngine.SetSetting(key, value);\n }\n\n // ========================================\n // Query Execution\n // ========================================\n\n public async RunQuery(params: QueryParameterValues, pageNumber: number = 1): Promise<void> {\n if (!this.QueryInfo || !this._queryId) return;\n\n this.IsLoading = true;\n this.LastError = null;\n this.QueryStart.emit();\n this.cdr.markForCheck();\n\n // Save parameters for next time\n this.SavedParams = params;\n await this.saveParameters(params);\n\n const startTime = performance.now();\n\n try {\n const runQuery = new RunQuery();\n const runParams: RunQueryParams = {\n QueryID: this._queryId,\n Parameters: params as Record<string, unknown>\n };\n\n // Add server-side paging when PageSize > 0\n if (this.PageSize > 0) {\n runParams.MaxRows = this.PageSize;\n runParams.StartRow = (pageNumber - 1) * this.PageSize;\n }\n\n const result = await runQuery.RunQuery(runParams);\n\n this.ExecutionTimeMs = Math.round(performance.now() - startTime);\n\n if (result.Success) {\n this.QueryData = result.Results || [];\n this.HasRun = true;\n this.ShowParamsPanel = false;\n\n // Update paging state from result\n this.QueryTotalRowCount = result.TotalRowCount;\n this.CurrentPageNumber = result.PageNumber ?? pageNumber;\n\n this.QueryComplete.emit(result);\n } else {\n this.LastError = result.ErrorMessage || 'Query execution failed';\n this.QueryError.emit(new Error(this.LastError));\n MJNotificationService.Instance.CreateSimpleNotification(\n this.LastError,\n 'error',\n 5000\n );\n }\n } catch (error) {\n this.ExecutionTimeMs = Math.round(performance.now() - startTime);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.LastError = errorMessage;\n this.QueryError.emit(error instanceof Error ? error : new Error(errorMessage));\n MJNotificationService.Instance.CreateSimpleNotification(\n `Error running query: ${errorMessage}`,\n 'error',\n 5000\n );\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ========================================\n // Event Handlers\n // ========================================\n\n public OnParametersSubmit(params: QueryParameterValues): void {\n this.RunQuery(params);\n }\n\n public OnParamsPanelClose(): void {\n this.ShowParamsPanel = false;\n this.cdr.markForCheck();\n }\n\n public OnGridStateChange(event: QueryGridStateChangedEvent): void {\n this.saveGridState(event.state);\n }\n\n public OnEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n this.EntityLinkClick.emit(event);\n }\n\n public OnRowDoubleClick(event: QueryRowClickEvent): void {\n this.RowDoubleClick.emit(event);\n }\n\n public OnSelectionChange(event: QuerySelectionChangedEvent): void {\n this.SelectionChange.emit(event);\n }\n\n public OnPageChange(event: PageChangeEvent): void {\n this.RunQuery(this.SavedParams, event.PageNumber);\n }\n\n public OnRefreshRequest(): void {\n if (this.HasRun) {\n this.RunQuery(this.SavedParams, this.CurrentPageNumber);\n } else if (this.QueryInfo?.Parameters?.length) {\n this.ShowParamsPanel = true;\n this.cdr.markForCheck();\n } else {\n this.RunQuery({});\n }\n }\n\n // ========================================\n // Public API\n // ========================================\n\n public OpenParametersPanel(): void {\n this.ShowParamsPanel = true;\n this.cdr.markForCheck();\n }\n\n public OpenInfoPanel(): void {\n this.ShowInfoPanel = true;\n this.cdr.markForCheck();\n }\n\n public CloseInfoPanel(): void {\n this.ShowInfoPanel = false;\n this.cdr.markForCheck();\n }\n\n public OnOpenQueryRecord(event: { queryId: string; queryName: string }): void {\n this.OpenQueryRecord.emit(event);\n }\n\n public OnCompositionTokenClick(event: CompositionTokenClickEvent): void {\n this.CompositionTokenClick.emit(event);\n }\n\n public Refresh(): void {\n this.OnRefreshRequest();\n }\n\n public get HasParameters(): boolean {\n return (this.QueryInfo?.Parameters?.length || 0) > 0;\n }\n}\n","<!-- Query Viewer Component -->\n<div class=\"query-viewer-container\">\n <!-- Header bar when query is loaded -->\n @if (QueryInfo) {\n <div class=\"query-header\">\n <div class=\"query-info\">\n <h3 class=\"query-name\">{{ QueryInfo.Name }}</h3>\n @if (QueryInfo.Category) {\n <span class=\"query-category\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ QueryInfo.Category }}\n </span>\n }\n </div>\n <div class=\"query-actions\">\n <!-- Info button -->\n <button (click)=\"OpenInfoPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Query information\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Info\n </button>\n <!-- Parameters button -->\n @if (HasParameters) {\n <button\n (click)=\"OpenParametersPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Edit parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </button>\n }\n <!-- Execution stats -->\n @if (ExecutionTimeMs !== null) {\n <span class=\"execution-stats\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ ExecutionTimeMs }}ms\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Main content area -->\n <div class=\"query-content\">\n <!-- No query selected state -->\n @if (!QueryId) {\n <div class=\"no-query-state\">\n <i class=\"fa-solid fa-database state-icon\"></i>\n <p class=\"state-message\">Select a query to view results</p>\n </div>\n }\n\n <!-- Query not found error -->\n @if (QueryId && !QueryInfo && LastError) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle state-icon error\"></i>\n <p class=\"state-message\">{{ LastError }}</p>\n </div>\n }\n\n <!-- Query description -->\n @if (QueryInfo?.Description && !HasRun) {\n <div class=\"query-description\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ QueryInfo?.Description }}\n </div>\n }\n\n <!-- Query execution error -->\n @if (LastError && HasRun) {\n <div class=\"execution-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ LastError }}</span>\n <button class=\"btn btn-secondary\" (click)=\"Refresh()\">Try Again</button>\n </div>\n }\n\n <!-- Grid -->\n @if (QueryInfo) {\n <mj-query-data-grid\n [QueryInfo]=\"QueryInfo\"\n [Data]=\"QueryData\"\n [TotalRowCount]=\"QueryTotalRowCount\"\n [PageNumber]=\"CurrentPageNumber\"\n [PageSize]=\"PageSize\"\n [SelectionMode]=\"SelectionMode\"\n [ShowToolbar]=\"ShowToolbar\"\n [VisualConfig]=\"VisualConfig\"\n [IsLoading]=\"IsLoading\"\n (PageChange)=\"OnPageChange($event)\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (RowDoubleClick)=\"OnRowDoubleClick($event)\"\n (SelectionChange)=\"OnSelectionChange($event)\"\n (GridStateChange)=\"OnGridStateChange($event)\"\n (RefreshRequest)=\"OnRefreshRequest()\">\n </mj-query-data-grid>\n }\n </div>\n\n <!-- Parameter form panel -->\n <mj-query-parameter-form\n [QueryInfo]=\"QueryInfo\"\n [InitialValues]=\"SavedParams\"\n [IsOpen]=\"ShowParamsPanel\"\n (ParametersSubmit)=\"OnParametersSubmit($event)\"\n (Close)=\"OnParamsPanelClose()\">\n </mj-query-parameter-form>\n\n <!-- Query info panel -->\n <mj-query-info-panel\n [QueryInfo]=\"QueryInfo\"\n [Visible]=\"ShowInfoPanel\"\n (Close)=\"CloseInfoPanel()\"\n (OpenRecord)=\"OnOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"OnCompositionTokenClick($event)\">\n </mj-query-info-panel>\n</div>\n"]}
@@ -8,12 +8,13 @@ import * as i6 from "@angular/common";
8
8
  import * as i7 from "@angular/forms";
9
9
  import * as i8 from "ag-grid-angular";
10
10
  import * as i9 from "@memberjunction/ng-shared-generic";
11
- import * as i10 from "@memberjunction/ng-export-service";
12
- import * as i11 from "@memberjunction/ng-markdown";
13
- import * as i12 from "@memberjunction/ng-code-editor";
11
+ import * as i10 from "@memberjunction/ng-pagination";
12
+ import * as i11 from "@memberjunction/ng-export-service";
13
+ import * as i12 from "@memberjunction/ng-markdown";
14
+ import * as i13 from "@memberjunction/ng-code-editor";
14
15
  export declare class QueryViewerModule {
15
16
  static ɵfac: i0.ɵɵFactoryDeclaration<QueryViewerModule, never>;
16
- static ɵmod: i0.ɵɵNgModuleDeclaration<QueryViewerModule, [typeof i1.QueryDataGridComponent, typeof i2.QueryParameterFormComponent, typeof i3.QueryViewerComponent, typeof i4.QueryRowDetailComponent, typeof i5.QueryInfoPanelComponent], [typeof i6.CommonModule, typeof i7.FormsModule, typeof i8.AgGridModule, typeof i9.SharedGenericModule, typeof i10.ExportServiceModule, typeof i11.MarkdownModule, typeof i12.CodeEditorModule], [typeof i1.QueryDataGridComponent, typeof i2.QueryParameterFormComponent, typeof i3.QueryViewerComponent, typeof i4.QueryRowDetailComponent, typeof i5.QueryInfoPanelComponent]>;
17
+ static ɵmod: i0.ɵɵNgModuleDeclaration<QueryViewerModule, [typeof i1.QueryDataGridComponent, typeof i2.QueryParameterFormComponent, typeof i3.QueryViewerComponent, typeof i4.QueryRowDetailComponent, typeof i5.QueryInfoPanelComponent], [typeof i6.CommonModule, typeof i7.FormsModule, typeof i8.AgGridModule, typeof i9.SharedGenericModule, typeof i10.PaginationComponent, typeof i11.ExportServiceModule, typeof i12.MarkdownModule, typeof i13.CodeEditorModule], [typeof i1.QueryDataGridComponent, typeof i2.QueryParameterFormComponent, typeof i3.QueryViewerComponent, typeof i4.QueryRowDetailComponent, typeof i5.QueryInfoPanelComponent]>;
17
18
  static ɵinj: i0.ɵɵInjectorDeclaration<QueryViewerModule>;
18
19
  }
19
20
  //# sourceMappingURL=query-viewer.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-viewer.module.d.ts","sourceRoot":"","sources":["../../src/lib/query-viewer.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAoBA,qBAyBa,iBAAiB;yCAAjB,iBAAiB;0CAAjB,iBAAiB;0CAAjB,iBAAiB;CAAI"}
1
+ {"version":3,"file":"query-viewer.module.d.ts","sourceRoot":"","sources":["../../src/lib/query-viewer.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAqBA,qBA0Ba,iBAAiB;yCAAjB,iBAAiB;0CAAjB,iBAAiB;0CAAjB,iBAAiB;CAAI"}
@@ -5,6 +5,7 @@ import { FormsModule } from '@angular/forms';
5
5
  import { AgGridModule } from 'ag-grid-angular';
6
6
  // MJ Components
7
7
  import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
8
+ import { PaginationComponent } from '@memberjunction/ng-pagination';
8
9
  import { ExportServiceModule } from '@memberjunction/ng-export-service';
9
10
  import { MarkdownModule } from '@memberjunction/ng-markdown';
10
11
  import { CodeEditorModule } from '@memberjunction/ng-code-editor';
@@ -22,6 +23,7 @@ export class QueryViewerModule {
22
23
  FormsModule,
23
24
  AgGridModule,
24
25
  SharedGenericModule,
26
+ PaginationComponent,
25
27
  ExportServiceModule,
26
28
  MarkdownModule,
27
29
  CodeEditorModule] });
@@ -41,6 +43,7 @@ export class QueryViewerModule {
41
43
  FormsModule,
42
44
  AgGridModule,
43
45
  SharedGenericModule,
46
+ PaginationComponent,
44
47
  ExportServiceModule,
45
48
  MarkdownModule,
46
49
  CodeEditorModule
@@ -62,6 +65,7 @@ export class QueryViewerModule {
62
65
  FormsModule,
63
66
  AgGridModule,
64
67
  SharedGenericModule,
68
+ PaginationComponent,
65
69
  ExportServiceModule,
66
70
  MarkdownModule,
67
71
  CodeEditorModule], exports: [QueryDataGridComponent,
@@ -1 +1 @@
1
- {"version":3,"file":"query-viewer.module.js","sourceRoot":"","sources":["../../src/lib/query-viewer.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,gBAAgB;AAChB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,0BAA0B;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,uDAAuD,CAAC;AACpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;;AA2BxF,MAAM,OAAO,iBAAiB;2GAAjB,iBAAiB;4DAAjB,iBAAiB;gEAhBtB,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,mBAAmB;YACnB,mBAAmB;YACnB,cAAc;YACd,gBAAgB;;iFAUX,iBAAiB;cAzB7B,QAAQ;eAAC;gBACN,YAAY,EAAE;oBACV,sBAAsB;oBACtB,2BAA2B;oBAC3B,oBAAoB;oBACpB,uBAAuB;oBACvB,uBAAuB;iBAC1B;gBACD,OAAO,EAAE;oBACL,YAAY;oBACZ,WAAW;oBACX,YAAY;oBACZ,mBAAmB;oBACnB,mBAAmB;oBACnB,cAAc;oBACd,gBAAgB;iBACnB;gBACD,OAAO,EAAE;oBACL,sBAAsB;oBACtB,2BAA2B;oBAC3B,oBAAoB;oBACpB,uBAAuB;oBACvB,uBAAuB;iBAC1B;aACJ;;wFACY,iBAAiB,mBAvBtB,sBAAsB;QACtB,2BAA2B;QAC3B,oBAAoB;QACpB,uBAAuB;QACvB,uBAAuB,aAGvB,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,mBAAmB;QACnB,mBAAmB;QACnB,cAAc;QACd,gBAAgB,aAGhB,sBAAsB;QACtB,2BAA2B;QAC3B,oBAAoB;QACpB,uBAAuB;QACvB,uBAAuB","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n// AG Grid\nimport { AgGridModule } from 'ag-grid-angular';\n\n// MJ Components\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { ExportServiceModule } from '@memberjunction/ng-export-service';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\n\n// Query Viewer Components\nimport { QueryDataGridComponent } from './query-data-grid/query-data-grid.component';\nimport { QueryParameterFormComponent } from './query-parameter-form/query-parameter-form.component';\nimport { QueryViewerComponent } from './query-viewer/query-viewer.component';\nimport { QueryRowDetailComponent } from './query-row-detail/query-row-detail.component';\nimport { QueryInfoPanelComponent } from './query-info-panel/query-info-panel.component';\n\n@NgModule({\n declarations: [\n QueryDataGridComponent,\n QueryParameterFormComponent,\n QueryViewerComponent,\n QueryRowDetailComponent,\n QueryInfoPanelComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n AgGridModule,\n SharedGenericModule,\n ExportServiceModule,\n MarkdownModule,\n CodeEditorModule\n ],\n exports: [\n QueryDataGridComponent,\n QueryParameterFormComponent,\n QueryViewerComponent,\n QueryRowDetailComponent,\n QueryInfoPanelComponent\n ]\n})\nexport class QueryViewerModule { }\n"]}
1
+ {"version":3,"file":"query-viewer.module.js","sourceRoot":"","sources":["../../src/lib/query-viewer.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,gBAAgB;AAChB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,0BAA0B;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,uDAAuD,CAAC;AACpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;;AA4BxF,MAAM,OAAO,iBAAiB;2GAAjB,iBAAiB;4DAAjB,iBAAiB;gEAjBtB,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,mBAAmB;YACnB,mBAAmB;YACnB,mBAAmB;YACnB,cAAc;YACd,gBAAgB;;iFAUX,iBAAiB;cA1B7B,QAAQ;eAAC;gBACN,YAAY,EAAE;oBACV,sBAAsB;oBACtB,2BAA2B;oBAC3B,oBAAoB;oBACpB,uBAAuB;oBACvB,uBAAuB;iBAC1B;gBACD,OAAO,EAAE;oBACL,YAAY;oBACZ,WAAW;oBACX,YAAY;oBACZ,mBAAmB;oBACnB,mBAAmB;oBACnB,mBAAmB;oBACnB,cAAc;oBACd,gBAAgB;iBACnB;gBACD,OAAO,EAAE;oBACL,sBAAsB;oBACtB,2BAA2B;oBAC3B,oBAAoB;oBACpB,uBAAuB;oBACvB,uBAAuB;iBAC1B;aACJ;;wFACY,iBAAiB,mBAxBtB,sBAAsB;QACtB,2BAA2B;QAC3B,oBAAoB;QACpB,uBAAuB;QACvB,uBAAuB,aAGvB,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,mBAAmB;QACnB,mBAAmB;QACnB,mBAAmB;QACnB,cAAc;QACd,gBAAgB,aAGhB,sBAAsB;QACtB,2BAA2B;QAC3B,oBAAoB;QACpB,uBAAuB;QACvB,uBAAuB","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n// AG Grid\nimport { AgGridModule } from 'ag-grid-angular';\n\n// MJ Components\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { PaginationComponent } from '@memberjunction/ng-pagination';\nimport { ExportServiceModule } from '@memberjunction/ng-export-service';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\n\n// Query Viewer Components\nimport { QueryDataGridComponent } from './query-data-grid/query-data-grid.component';\nimport { QueryParameterFormComponent } from './query-parameter-form/query-parameter-form.component';\nimport { QueryViewerComponent } from './query-viewer/query-viewer.component';\nimport { QueryRowDetailComponent } from './query-row-detail/query-row-detail.component';\nimport { QueryInfoPanelComponent } from './query-info-panel/query-info-panel.component';\n\n@NgModule({\n declarations: [\n QueryDataGridComponent,\n QueryParameterFormComponent,\n QueryViewerComponent,\n QueryRowDetailComponent,\n QueryInfoPanelComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n AgGridModule,\n SharedGenericModule,\n PaginationComponent,\n ExportServiceModule,\n MarkdownModule,\n CodeEditorModule\n ],\n exports: [\n QueryDataGridComponent,\n QueryParameterFormComponent,\n QueryViewerComponent,\n QueryRowDetailComponent,\n QueryInfoPanelComponent\n ]\n})\nexport class QueryViewerModule { }\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-query-viewer",
3
- "version": "5.11.0",
3
+ "version": "5.13.0",
4
4
  "description": "MemberJunction: Angular components for viewing and executing stored queries with parameter input, interactive results grid, and entity linking",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -37,15 +37,16 @@
37
37
  "ag-grid-community": "^35.0.1"
38
38
  },
39
39
  "dependencies": {
40
- "@memberjunction/core-entities": "5.11.0",
41
- "@memberjunction/export-engine": "5.11.0",
42
- "@memberjunction/global": "5.11.0",
43
- "@memberjunction/core": "5.11.0",
44
- "@memberjunction/ng-shared-generic": "5.11.0",
45
- "@memberjunction/ng-export-service": "5.11.0",
46
- "@memberjunction/ng-markdown": "5.11.0",
47
- "@memberjunction/ng-code-editor": "5.11.0",
48
- "@memberjunction/ng-notifications": "5.11.0",
40
+ "@memberjunction/core-entities": "5.13.0",
41
+ "@memberjunction/export-engine": "5.13.0",
42
+ "@memberjunction/global": "5.13.0",
43
+ "@memberjunction/core": "5.13.0",
44
+ "@memberjunction/ng-pagination": "5.13.0",
45
+ "@memberjunction/ng-shared-generic": "5.13.0",
46
+ "@memberjunction/ng-export-service": "5.13.0",
47
+ "@memberjunction/ng-markdown": "5.13.0",
48
+ "@memberjunction/ng-code-editor": "5.13.0",
49
+ "@memberjunction/ng-notifications": "5.13.0",
49
50
  "rxjs": "^7.8.2",
50
51
  "tslib": "^2.8.1"
51
52
  },