@memberjunction/ng-query-viewer 5.24.0 → 5.25.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/lib/query-parameter-form/query-parameter-form.component.d.ts +5 -0
- package/dist/lib/query-parameter-form/query-parameter-form.component.d.ts.map +1 -1
- package/dist/lib/query-parameter-form/query-parameter-form.component.js +30 -5
- package/dist/lib/query-parameter-form/query-parameter-form.component.js.map +1 -1
- package/dist/lib/query-viewer/query-viewer.component.d.ts +7 -0
- package/dist/lib/query-viewer/query-viewer.component.d.ts.map +1 -1
- package/dist/lib/query-viewer/query-viewer.component.js +43 -4
- package/dist/lib/query-viewer/query-viewer.component.js.map +1 -1
- package/package.json +11 -11
|
@@ -94,6 +94,11 @@ export declare class QueryParameterFormComponent implements OnInit, OnChanges, O
|
|
|
94
94
|
OnNumberInputChange(field: ParameterField, event: Event): void;
|
|
95
95
|
OnDateInputChange(field: ParameterField, event: Event): void;
|
|
96
96
|
OnArrayInputChange(field: ParameterField, event: Event): void;
|
|
97
|
+
/**
|
|
98
|
+
* Parses array parameter input, supporting both JSON array syntax
|
|
99
|
+
* (`["A","B","C"]`) and plain comma-separated values (`A, B, C`).
|
|
100
|
+
*/
|
|
101
|
+
private parseArrayInput;
|
|
97
102
|
static ɵfac: i0.ɵɵFactoryDeclaration<QueryParameterFormComponent, never>;
|
|
98
103
|
static ɵcmp: i0.ɵɵComponentDeclaration<QueryParameterFormComponent, "mj-query-parameter-form", never, { "QueryInfo": { "alias": "QueryInfo"; "required": false; }; "InitialValues": { "alias": "InitialValues"; "required": false; }; "IsOpen": { "alias": "IsOpen"; "required": false; }; "PanelWidth": { "alias": "PanelWidth"; "required": false; }; "ShowOverlay": { "alias": "ShowOverlay"; "required": false; }; }, { "ParametersSubmit": "ParametersSubmit"; "Close": "Close"; }, never, never, false, never>;
|
|
99
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-parameter-form.component.d.ts","sourceRoot":"","sources":["../../../src/lib/query-parameter-form/query-parameter-form.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,YAAY,EACZ,MAAM,EACN,SAAS,EACT,SAAS,EACT,aAAa,EACb,iBAAiB,EAEpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;;AAElF;;GAEG;AACH,UAAU,cAAc;IACpB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBA2Ba,2BAA4B,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS;IAoDhE,OAAO,CAAC,GAAG;IA/CvB;;OAEG;IACM,SAAS,EAAE,SAAS,GAAG,IAAI,CAAQ;IAE5C;;OAEG;IACM,aAAa,EAAE,oBAAoB,CAAM;IAElD;;OAEG;IACM,MAAM,EAAE,OAAO,CAAS;IAEjC;;OAEG;IACM,UAAU,EAAE,MAAM,CAAO;IAElC;;OAEG;IACM,WAAW,EAAE,OAAO,CAAQ;IAMrC;;OAEG;IACO,gBAAgB,qCAA4C;IAEtE;;OAEG;IACO,KAAK,qBAA4B;IAMpC,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,iBAAiB,EAAE,OAAO,CAAS;IACnC,iBAAiB,EAAE,OAAO,CAAS;gBAEtB,GAAG,EAAE,iBAAiB;IAE1C,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC,WAAW,IAAI,IAAI;IAMnB,OAAO,CAAC,SAAS;IAyBjB,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,iBAAiB;IA0BlB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAQ1D,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;IAQ7D,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAalE,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,uBAAuB;IAW/B,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,IAAW,SAAS,IAAI,OAAO,CAE9B;IAMM,MAAM,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"query-parameter-form.component.d.ts","sourceRoot":"","sources":["../../../src/lib/query-parameter-form/query-parameter-form.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -464,11 +464,19 @@ export class QueryParameterFormComponent {
|
|
|
464
464
|
this.cdr.markForCheck();
|
|
465
465
|
return;
|
|
466
466
|
}
|
|
467
|
-
// Build parameter values object
|
|
467
|
+
// Build parameter values object, normalizing array fields through
|
|
468
|
+
// the same parse logic used by OnArrayInputChange so that saved
|
|
469
|
+
// state from before the JSON-array fix is cleaned up on re-submit.
|
|
468
470
|
const values = {};
|
|
469
471
|
for (const field of this.Fields) {
|
|
470
472
|
if (field.value !== null && field.value !== undefined) {
|
|
471
|
-
|
|
473
|
+
if (field.info.Type === 'array') {
|
|
474
|
+
const display = this.GetArrayDisplayValue(field.value);
|
|
475
|
+
values[field.info.Name] = display ? this.parseArrayInput(display) : [];
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
values[field.info.Name] = field.value;
|
|
479
|
+
}
|
|
472
480
|
}
|
|
473
481
|
}
|
|
474
482
|
this.ParametersSubmit.emit(values);
|
|
@@ -569,11 +577,28 @@ export class QueryParameterFormComponent {
|
|
|
569
577
|
}
|
|
570
578
|
OnArrayInputChange(field, event) {
|
|
571
579
|
const input = event.target;
|
|
572
|
-
const
|
|
573
|
-
|
|
574
|
-
: [];
|
|
580
|
+
const raw = input.value?.trim();
|
|
581
|
+
const value = raw ? this.parseArrayInput(raw) : [];
|
|
575
582
|
this.OnValueChange(field, value);
|
|
576
583
|
}
|
|
584
|
+
/**
|
|
585
|
+
* Parses array parameter input, supporting both JSON array syntax
|
|
586
|
+
* (`["A","B","C"]`) and plain comma-separated values (`A, B, C`).
|
|
587
|
+
*/
|
|
588
|
+
parseArrayInput(raw) {
|
|
589
|
+
if (raw.startsWith('[')) {
|
|
590
|
+
try {
|
|
591
|
+
const parsed = JSON.parse(raw);
|
|
592
|
+
if (Array.isArray(parsed)) {
|
|
593
|
+
return parsed.map(v => String(v).trim()).filter(s => s);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
catch {
|
|
597
|
+
// Not valid JSON — fall through to comma-split
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
return raw.split(',').map(s => s.trim()).filter(s => s);
|
|
601
|
+
}
|
|
577
602
|
static ɵfac = function QueryParameterFormComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QueryParameterFormComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
578
603
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryParameterFormComponent, selectors: [["mj-query-parameter-form"]], inputs: { QueryInfo: "QueryInfo", InitialValues: "InitialValues", IsOpen: "IsOpen", PanelWidth: "PanelWidth", ShowOverlay: "ShowOverlay" }, outputs: { ParametersSubmit: "ParametersSubmit", Close: "Close" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 2, consts: [[1, "param-form-overlay"], [1, "param-form-panel", 3, "width"], [1, "param-form-overlay", 3, "click"], [1, "param-form-panel"], [1, "panel-header"], [1, "header-content"], [1, "fa-solid", "fa-sliders", "header-icon"], [1, "header-text"], [1, "header-title"], [1, "header-subtitle"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "panel-content"], [1, "no-params"], [1, "param-fields"], [1, "panel-footer"], [1, "fa-solid", "fa-check-circle", "no-params-icon"], [1, "btn", "btn-primary", 3, "click"], [1, "param-field", 3, "has-error", "required"], [1, "param-field"], [1, "field-label", 3, "for"], [1, "required-indicator"], [1, "field-type"], [1, "field-description"], ["type", "text", 1, "form-input", 3, "id", "value", "placeholder"], ["type", "number", 1, "form-input", 3, "id", "value", "placeholder"], ["type", "date", 1, "form-input", 3, "id", "value"], [1, "checkbox-wrapper"], [1, "field-error"], [1, "field-sample"], ["type", "text", 1, "form-input", 3, "input", "id", "value", "placeholder"], ["type", "number", 1, "form-input", 3, "input", "id", "value", "placeholder"], ["type", "date", 1, "form-input", 3, "input", "id", "value"], ["type", "checkbox", 3, "change", "id", "checked"], [1, "checkbox-label", 3, "for"], [1, "field-hint"], [1, "fa-solid", "fa-exclamation-circle"], ["title", "Reset to defaults", 1, "btn", "btn-secondary", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "footer-right"], [1, "btn", "btn-secondary", 3, "click"], [1, "btn", "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-play"]], template: function QueryParameterFormComponent_Template(rf, ctx) { if (rf & 1) {
|
|
579
604
|
i0.ɵɵconditionalCreate(0, QueryParameterFormComponent_Conditional_0_Template, 1, 1, "div", 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-parameter-form.component.js","sourceRoot":"","sources":["../../../src/lib/query-parameter-form/query-parameter-form.component.ts","../../../src/lib/query-parameter-form/query-parameter-form.component.html"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EAMZ,uBAAuB,EAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;;;;ICVxE,8BAEqB;IAAnB,4LAAS,eAAQ,KAAC;IACpB,iBAAM;;IAFJ,mCAAO;;;IAgBC,+BAA8B;IAAA,YAAoB;IAAA,iBAAO;;;IAA3B,cAAoB;IAApB,2CAAoB;;;;IAYtD,+BAAuB;IACrB,wBAAuD;IACvD,yBAAG;IAAA,4CAA4B;IAAA,iBAAI;IACnC,kCAAmD;IAAnB,+MAAS,eAAQ,KAAC;IAChD,2BACF;IACF,AADE,iBAAS,EACL;;;IAaI,gCAAiC;IAAA,iBAAC;IAAA,iBAAO;;;IAM3C,6BAA6B;IAC3B,YACF;IAAA,iBAAI;;;IADF,cACF;IADE,0DACF;;;;IAIA,iCAKyC;IAAvC,uRAAS,sCAA4B,KAAC;IALxC,iBAKyC;;;;IADvC,AADA,AADA,kDAAiC,gDACI,qDACK;;;;IAK5C,iCAK+C;IAA7C,uRAAS,4CAAkC,KAAC;IAL9C,iBAK+C;;;;IAD7C,AADA,AADA,kDAAiC,gDACI,qDACK;;;;IAK5C,iCAI6C;IAA3C,uRAAS,0CAAgC,KAAC;IAJ5C,iBAI6C;;;;IAD3C,AADA,kDAAiC,8CACE;;;;IAMnC,AADF,+BAA8B,gBAIiB;IAA3C,0RAAU,yCAA+B,KAAC;IAH5C,iBAG6C;IAC7C,iCAAiE;IAC/D,YACF;IACF,AADE,iBAAQ,EACJ;;;;IANF,cAAiC;IACjC,AADA,kDAAiC,mDACO;IAEnC,cAAkC;IAAlC,mDAAkC;IACvC,cACF;IADE,sFACF;;;;IAKF,iCAK8C;IAA5C,yRAAS,2CAAiC,KAAC;IAL7C,iBAK8C;IAC9C,gCAAyB;IAAA,yDAAyC;IAAA,iBAAO;;;;IAFvE,AADA,AADA,kDAAiC,sDACU,2FACqC;;;IAMlF,gCAA0B;IACxB,wBAA8C;IAC9C,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,+CACF;;;IAIA,gCAA2B;IACzB,YACF;IAAA,iBAAO;;;IADL,cACF;IADE,mEACF;;;IAxEF,AAJF,+BAE2C,gBAEqB;IAC5D,YACA;IAAA,kIAA6B;IAG7B,gCAAyB;IAAA,YAAuB;IAClD,AADkD,iBAAO,EACjD;IAER,+HAA8B;IAM9B,mIAAoC;IASpC,mIAAoC;IASpC,mIAAkC;IAQlC,mIAAqC;IAYrC,wHAAmC;IAUnC,oIAAoC;IAOpC,oIAA8C;IAKhD,iBAAM;;;IA5EJ,AADA,+DAAgD,sCACR;IAEb,cAAkC;IAAlC,mDAAkC;IAC3D,cACA;IADA,mDACA;IAAA,cAEC;IAFD,mDAEC;IACwB,eAAuB;IAAvB,mDAAuB;IAGlD,cAIC;IAJD,oDAIC;IAED,cAOC;IAPD,0DAOC;IAED,cAOC;IAPD,0DAOC;IAED,cAMC;IAND,wDAMC;IAED,cAUC;IAVD,4DAUC;IAED,cAQC;IARD,0DAQC;IAED,cAKC;IALD,8DAKC;IAED,cAIC;IAJD,wEAIC;;;IA/EP,+BAA0B;IACxB,+JAgFC;IACH,iBAAM;;;IAjFJ,cAgFC;IAhFD,4BAgFC;;;;IAOH,AADF,+BAA0B,iBACsD;IAA5C,gNAAS,cAAO,KAAC;IACjD,wBAAgC;IAChC,uBACF;IAAA,iBAAS;IAEP,AADF,+BAA0B,iBAC6B;IAAnB,gNAAS,eAAQ,KAAC;IAClD,wBACF;IAAA,iBAAS;IACT,kCAEqB;IAAnB,gNAAS,eAAQ,KAAC;IAClB,wBAAgC;IAChC,2BACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;;;IANA,eAAuB;IAAvB,4CAAuB;;;;IA5H7B,AADF,AAJF,8BAEgC,aAEJ,aACI;IAC1B,uBAA+C;IAE7C,AADF,8BAAyB,YACE;IAAA,gCAAgB;IAAA,iBAAK;IAC9C,4GAAiB;IAIrB,AADE,iBAAM,EACF;IACN,kCAA2D;IAAjC,+LAAS,eAAQ,KAAC;IAC1C,wBAAiC;IAErC,AADE,iBAAS,EACL;IAEN,gCAA2B;IAEzB,8GAA2B;IAU3B,8GAAyB;IAqF3B,iBAAM;IAEN,+GAAyB;IAmB3B,iBAAM;;;IAvIJ,gDAA6B;IAD7B,oCAAQ;IAQF,eAEC;IAFD,2CAEC;IAUL,eAQC;IARD,sDAQC;IAED,cAoFC;IApFD,oDAoFC;IAGH,cAkBC;IAlBD,oDAkBC;;ADvHL;;;;;;;;;;;;;;;;;;;GAmBG;AA4BH,MAAM,OAAO,2BAA2B;IAoDhB;IAnDpB,2CAA2C;IAC3C,SAAS;IACT,2CAA2C;IAE3C;;OAEG;IACM,SAAS,GAAqB,IAAI,CAAC;IAE5C;;OAEG;IACM,aAAa,GAAyB,EAAE,CAAC;IAElD;;OAEG;IACM,MAAM,GAAY,KAAK,CAAC;IAEjC;;OAEG;IACM,UAAU,GAAW,GAAG,CAAC;IAElC;;OAEG;IACM,WAAW,GAAY,IAAI,CAAC;IAErC,2CAA2C;IAC3C,UAAU;IACV,2CAA2C;IAE3C;;OAEG;IACO,gBAAgB,GAAG,IAAI,YAAY,EAAwB,CAAC;IAEtE;;OAEG;IACO,KAAK,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE3C,2CAA2C;IAC3C,iBAAiB;IACjB,2CAA2C;IAEpC,MAAM,GAAqB,EAAE,CAAC;IAC9B,iBAAiB,GAAY,KAAK,CAAC;IACnC,iBAAiB,GAAY,KAAK,CAAC;IAE1C,YAAoB,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAE9C,QAAQ;QACJ,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,OAAsB;QAC9B,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC;IACL,CAAC;IAED,WAAW,KAAU,CAAC;IAEtB,2CAA2C;IAC3C,gBAAgB;IAChB,2CAA2C;IAEnC,SAAS;QACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,OAAO;QACX,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;QAEnD,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACjC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEjD,OAAO;gBACH,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,KAAK;aACjB,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEO,eAAe,CAAC,KAAyB;QAC7C,6BAA6B;QAC7B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,6BAA6B;QAC7B,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAClE,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,yBAAyB;QACzB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,SAAS;gBACV,OAAO,KAAK,CAAC;YACjB,KAAK,OAAO;gBACR,OAAO,EAAE,CAAC;YACd;gBACI,OAAO,IAAI,CAAC;QACpB,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,KAAyB;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAErE,IAAI,CAAC;YACD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,QAAQ;oBACT,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC;gBAChC,KAAK,SAAS;oBACV,OAAO,YAAY,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,YAAY,KAAK,GAAG,CAAC;gBACzE,KAAK,MAAM;oBACP,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;gBAClC,KAAK,OAAO;oBACR,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACpC;oBACI,OAAO,YAAY,CAAC;YAC5B,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,YAAY,CAAC;QACxB,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,iBAAiB;IACjB,2CAA2C;IAEpC,aAAa,CAAC,KAAqB,EAAE,KAAc;QACtD,KAAK,CAAC,KAAK,GAAG,KAAgC,CAAC;QAC/C,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,YAAY,CAAC,KAAqB,EAAE,KAAkB;QACzD,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,gBAAgB,CAAC,KAAqB,EAAE,KAAY;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;QAC5B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,2CAA2C;IAC3C,aAAa;IACb,2CAA2C;IAEnC,aAAa,CAAC,KAAqB;QACvC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QAEnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;QAEzB,iBAAiB;QACjB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxD,KAAK,CAAC,KAAK,GAAG,wBAAwB,CAAC;gBACvC,OAAO;YACX,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvE,KAAK,CAAC,KAAK,GAAG,gCAAgC,CAAC;gBAC/C,OAAO;YACX,CAAC;QACL,CAAC;QAED,kBAAkB;QAClB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,QAAQ;oBACT,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBACvB,KAAK,CAAC,KAAK,GAAG,wBAAwB,CAAC;oBAC3C,CAAC;oBACD,MAAM;gBACV,KAAK,MAAM;oBACP,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;wBAClD,KAAK,CAAC,KAAK,GAAG,sBAAsB,CAAC;oBACzC,CAAC;oBACD,MAAM;YACd,CAAC;QACL,CAAC;IACL,CAAC;IAEO,iBAAiB;QACrB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAEO,uBAAuB;QAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;aAC9B,KAAK,CAAC,CAAC,CAAC,EAAE;YACP,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACtB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;gBAAE,OAAO,KAAK,CAAC;YACxE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxF,OAAO,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC;QAC5B,CAAC,CAAC,CAAC;IACX,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC;IACrD,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;IAClB,2CAA2C;IAEpC,MAAM;QACT,6BAA6B;QAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACX,CAAC;QAED,gCAAgC;QAChC,MAAM,MAAM,GAAyB,EAAE,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACpD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1C,CAAC;QACL,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAEM,MAAM;QACT,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC;IAED,2CAA2C;IAC3C,aAAa;IACb,2CAA2C;IAEpC,YAAY,CAAC,KAAyB;QACzC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACT,OAAO,QAAQ,CAAC;YACpB,KAAK,SAAS;gBACV,OAAO,UAAU,CAAC;YACtB,KAAK,MAAM;gBACP,OAAO,MAAM,CAAC;YAClB;gBACI,OAAO,MAAM,CAAC;QACtB,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,KAAyB;QAC3C,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,SAAS,KAAK,CAAC,WAAW,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;IACnC,CAAC;IAEM,YAAY,CAAC,KAAa,EAAE,KAAqB;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAC3C,uCAAuC;IACvC,2CAA2C;IAEpC,cAAc,CAAC,KAA8B;QAChD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAEM,cAAc,CAAC,KAA8B;QAChD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,CAAC;IAEM,YAAY,CAAC,KAA8B;QAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACrD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YACxB,2CAA2C;YAC3C,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,0BAA0B;YAC1B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAEM,eAAe,CAAC,KAA8B;QACjD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACxD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAEM,oBAAoB,CAAC,KAA8B;QACtD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,2CAA2C;IAC3C,uBAAuB;IACvB,2CAA2C;IAEpC,aAAa,CAAC,KAAqB,EAAE,KAAY;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,mBAAmB,CAAC,KAAqB,EAAE,KAAY;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAEM,iBAAiB,CAAC,KAAqB,EAAE,KAAY;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAEM,kBAAkB,CAAC,KAAqB,EAAE,KAAY;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;YACrB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC,EAAE,CAAC;QACT,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;qHAjXQ,2BAA2B;6DAA3B,2BAA2B;YCxExC,6FAA6B;YAO7B,8FAAc;;YAPd,wDAKC;YAED,cA2IC;YA3ID,qCA2IC;29OD/Fe;gBACR,OAAO,CAAC,SAAS,EAAE;oBACf,UAAU,CAAC,QAAQ,EAAE;wBACjB,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;wBACpD,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;qBAC/E,CAAC;oBACF,UAAU,CAAC,QAAQ,EAAE;wBACjB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;qBACjF,CAAC;iBACL,CAAC;gBACF,OAAO,CAAC,QAAQ,EAAE;oBACd,UAAU,CAAC,QAAQ,EAAE;wBACjB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;wBACrB,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;qBACnD,CAAC;oBACF,UAAU,CAAC,QAAQ,EAAE;wBACjB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;qBAClD,CAAC;iBACL,CAAC;aACL;;iFAEQ,2BAA2B;cA3BvC,SAAS;6BACI,KAAK,YACL,yBAAyB,mBAGlB,uBAAuB,CAAC,MAAM,cACnC;oBACR,OAAO,CAAC,SAAS,EAAE;wBACf,UAAU,CAAC,QAAQ,EAAE;4BACjB,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;4BACpD,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;yBAC/E,CAAC;wBACF,UAAU,CAAC,QAAQ,EAAE;4BACjB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;yBACjF,CAAC;qBACL,CAAC;oBACF,OAAO,CAAC,QAAQ,EAAE;wBACd,UAAU,CAAC,QAAQ,EAAE;4BACjB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;4BACrB,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;yBACnD,CAAC;wBACF,UAAU,CAAC,QAAQ,EAAE;4BACjB,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;yBAClD,CAAC;qBACL,CAAC;iBACL;;kBAUA,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBASL,MAAM;;kBAKN,MAAM;;kFA1CE,2BAA2B","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { QueryInfo, QueryParameterInfo } from '@memberjunction/core';\nimport { QueryParameterValues } from '../query-data-grid/models/query-grid-types';\n\n/**\n * A single parameter field in the form\n */\ninterface ParameterField {\n info: QueryParameterInfo;\n value: string | number | boolean | Date | string[] | null;\n error: string | null;\n touched: boolean;\n}\n\n/**\n * A slide-in form for entering query parameters before execution.\n * Features:\n * - Dynamic form generation from QueryParameterInfo metadata\n * - Type-appropriate input controls (text, number, date, checkbox, multi-select)\n * - Validation with helpful error messages\n * - Sample values as placeholders\n * - Description tooltips\n *\n * @example\n * ```html\n * <mj-query-parameter-form\n * [QueryInfo]=\"query\"\n * [InitialValues]=\"savedParams\"\n * [IsOpen]=\"showParams\"\n * (ParametersSubmit)=\"onRunQuery($event)\"\n * (Close)=\"showParams = false\">\n * </mj-query-parameter-form>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-query-parameter-form',\n templateUrl: './query-parameter-form.component.html',\n styleUrls: ['./query-parameter-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('slideIn', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate('250ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\n ])\n ]),\n trigger('fadeIn', [\n transition(':enter', [\n style({ opacity: 0 }),\n animate('150ms ease-out', style({ opacity: 1 }))\n ]),\n transition(':leave', [\n animate('100ms ease-in', style({ opacity: 0 }))\n ])\n ])\n ]\n})\nexport class QueryParameterFormComponent implements OnInit, OnChanges, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n /**\n * The query metadata containing parameter definitions\n */\n @Input() QueryInfo: QueryInfo | null = null;\n\n /**\n * Initial values to populate the form (e.g., from saved state)\n */\n @Input() InitialValues: QueryParameterValues = {};\n\n /**\n * Whether the panel is open/visible\n */\n @Input() IsOpen: boolean = false;\n\n /**\n * Panel width in pixels\n */\n @Input() PanelWidth: number = 400;\n\n /**\n * Whether to show the overlay backdrop\n */\n @Input() ShowOverlay: boolean = true;\n\n // ========================================\n // Outputs\n // ========================================\n\n /**\n * Fired when user submits the form with valid parameters\n */\n @Output() ParametersSubmit = new EventEmitter<QueryParameterValues>();\n\n /**\n * Fired when panel is closed\n */\n @Output() Close = new EventEmitter<void>();\n\n // ========================================\n // Internal State\n // ========================================\n\n public Fields: ParameterField[] = [];\n public HasRequiredParams: boolean = false;\n public AllRequiredFilled: boolean = false;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.buildForm();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['QueryInfo'] || changes['InitialValues']) {\n this.buildForm();\n }\n }\n\n ngOnDestroy(): void {}\n\n // ========================================\n // Form Building\n // ========================================\n\n private buildForm(): void {\n if (!this.QueryInfo) {\n this.Fields = [];\n this.HasRequiredParams = false;\n return;\n }\n\n const parameters = this.QueryInfo.Parameters || [];\n\n this.Fields = parameters.map(param => {\n const initialValue = this.getInitialValue(param);\n\n return {\n info: param,\n value: initialValue,\n error: null,\n touched: false\n };\n });\n\n this.HasRequiredParams = this.Fields.some(f => f.info.IsRequired);\n this.validateAllFields();\n this.cdr.markForCheck();\n }\n\n private getInitialValue(param: QueryParameterInfo): string | number | boolean | Date | string[] | null {\n // Check initial values first\n if (this.InitialValues && this.InitialValues[param.Name] !== undefined) {\n return this.InitialValues[param.Name];\n }\n\n // Fall back to default value\n if (param.DefaultValue !== null && param.DefaultValue !== undefined) {\n return this.parseDefaultValue(param);\n }\n\n // Type-specific defaults\n switch (param.Type) {\n case 'boolean':\n return false;\n case 'array':\n return [];\n default:\n return null;\n }\n }\n\n private parseDefaultValue(param: QueryParameterInfo): string | number | boolean | Date | string[] | null {\n const defaultValue = param.DefaultValue;\n if (defaultValue === null || defaultValue === undefined) return null;\n\n try {\n switch (param.Type) {\n case 'number':\n return Number(defaultValue);\n case 'boolean':\n return defaultValue.toLowerCase() === 'true' || defaultValue === '1';\n case 'date':\n return new Date(defaultValue);\n case 'array':\n return JSON.parse(defaultValue);\n default:\n return defaultValue;\n }\n } catch {\n return defaultValue;\n }\n }\n\n // ========================================\n // Value Handling\n // ========================================\n\n public OnValueChange(field: ParameterField, value: unknown): void {\n field.value = value as ParameterField['value'];\n field.touched = true;\n this.validateField(field);\n this.updateAllRequiredFilled();\n this.cdr.markForCheck();\n }\n\n public OnDateChange(field: ParameterField, value: Date | null): void {\n field.value = value;\n field.touched = true;\n this.validateField(field);\n this.updateAllRequiredFilled();\n this.cdr.markForCheck();\n }\n\n public OnCheckboxChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n field.value = input.checked;\n field.touched = true;\n this.validateField(field);\n this.updateAllRequiredFilled();\n this.cdr.markForCheck();\n }\n\n // ========================================\n // Validation\n // ========================================\n\n private validateField(field: ParameterField): void {\n field.error = null;\n\n const value = field.value;\n const param = field.info;\n\n // Required check\n if (param.IsRequired) {\n if (value === null || value === undefined || value === '') {\n field.error = 'This field is required';\n return;\n }\n if (param.Type === 'array' && Array.isArray(value) && value.length === 0) {\n field.error = 'At least one value is required';\n return;\n }\n }\n\n // Type validation\n if (value !== null && value !== undefined && value !== '') {\n switch (param.Type) {\n case 'number':\n if (isNaN(Number(value))) {\n field.error = 'Must be a valid number';\n }\n break;\n case 'date':\n if (value instanceof Date && isNaN(value.getTime())) {\n field.error = 'Must be a valid date';\n }\n break;\n }\n }\n }\n\n private validateAllFields(): void {\n for (const field of this.Fields) {\n this.validateField(field);\n }\n this.updateAllRequiredFilled();\n }\n\n private updateAllRequiredFilled(): void {\n this.AllRequiredFilled = this.Fields\n .filter(f => f.info.IsRequired)\n .every(f => {\n const value = f.value;\n if (value === null || value === undefined || value === '') return false;\n if (f.info.Type === 'array' && Array.isArray(value) && value.length === 0) return false;\n return f.error === null;\n });\n }\n\n public get HasErrors(): boolean {\n return this.Fields.some(f => f.error !== null);\n }\n\n public get CanSubmit(): boolean {\n return !this.HasErrors && this.AllRequiredFilled;\n }\n\n // ========================================\n // Form Submission\n // ========================================\n\n public Submit(): void {\n // Mark all fields as touched\n for (const field of this.Fields) {\n field.touched = true;\n }\n this.validateAllFields();\n\n if (!this.CanSubmit) {\n this.cdr.markForCheck();\n return;\n }\n\n // Build parameter values object\n const values: QueryParameterValues = {};\n for (const field of this.Fields) {\n if (field.value !== null && field.value !== undefined) {\n values[field.info.Name] = field.value;\n }\n }\n\n this.ParametersSubmit.emit(values);\n }\n\n public Cancel(): void {\n this.Close.emit();\n }\n\n public Reset(): void {\n this.buildForm();\n }\n\n // ========================================\n // UI Helpers\n // ========================================\n\n public GetInputType(param: QueryParameterInfo): string {\n switch (param.Type) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'checkbox';\n case 'date':\n return 'date';\n default:\n return 'text';\n }\n }\n\n public GetPlaceholder(param: QueryParameterInfo): string {\n if (param.SampleValue) {\n return `e.g., ${param.SampleValue}`;\n }\n return param.Description || '';\n }\n\n public TrackByField(index: number, field: ParameterField): string {\n return field.info.Name;\n }\n\n // ========================================\n // Type-Safe Value Getters for Template\n // ========================================\n\n public GetStringValue(value: ParameterField['value']): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n return String(value);\n }\n\n public GetNumberValue(value: ParameterField['value']): number | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'number') return value;\n const num = Number(value);\n return isNaN(num) ? null : num;\n }\n\n public GetDateValue(value: ParameterField['value']): string {\n if (value === null || value === undefined) return '';\n if (value instanceof Date) {\n // Format as YYYY-MM-DD for HTML date input\n return value.toISOString().split('T')[0];\n }\n if (typeof value === 'string') {\n // Try to parse and format\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date.toISOString().split('T')[0];\n }\n }\n return '';\n }\n\n public GetBooleanValue(value: ParameterField['value']): boolean {\n if (value === null || value === undefined) return false;\n return Boolean(value);\n }\n\n public GetArrayDisplayValue(value: ParameterField['value']): string {\n if (value === null || value === undefined) return '';\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n return String(value);\n }\n\n // ========================================\n // Input Event Handlers\n // ========================================\n\n public OnInputChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n this.OnValueChange(field, input.value);\n }\n\n public OnNumberInputChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value === '' ? null : Number(input.value);\n this.OnValueChange(field, value);\n }\n\n public OnDateInputChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value ? new Date(input.value) : null;\n this.OnDateChange(field, value);\n }\n\n public OnArrayInputChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value\n ? input.value.split(',').map(s => s.trim()).filter(s => s)\n : [];\n this.OnValueChange(field, value);\n }\n}\n","<!-- Query Parameter Form - Slide-in Panel -->\n@if (IsOpen && ShowOverlay) {\n <div class=\"param-form-overlay\"\n @fadeIn\n (click)=\"Cancel()\">\n </div>\n}\n\n@if (IsOpen) {\n <div class=\"param-form-panel\"\n @slideIn\n [style.width.px]=\"PanelWidth\">\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-content\">\n <i class=\"fa-solid fa-sliders header-icon\"></i>\n <div class=\"header-text\">\n <h3 class=\"header-title\">Query Parameters</h3>\n @if (QueryInfo) {\n <span class=\"header-subtitle\">{{ QueryInfo.Name }}</span>\n }\n </div>\n </div>\n <button class=\"close-btn\" (click)=\"Cancel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Form Content -->\n <div class=\"panel-content\">\n <!-- No parameters message -->\n @if (Fields.length === 0) {\n <div class=\"no-params\">\n <i class=\"fa-solid fa-check-circle no-params-icon\"></i>\n <p>This query has no parameters</p>\n <button class=\"btn btn-primary\" (click)=\"Submit()\">\n Run Query\n </button>\n </div>\n }\n <!-- Parameter fields -->\n @if (Fields.length > 0) {\n <div class=\"param-fields\">\n @for (field of Fields; track TrackByField($index, field)) {\n <div class=\"param-field\"\n [class.has-error]=\"field.error && field.touched\"\n [class.required]=\"field.info.IsRequired\">\n <!-- Label -->\n <label class=\"field-label\" [for]=\"'param-' + field.info.Name\">\n {{ field.info.Name }}\n @if (field.info.IsRequired) {\n <span class=\"required-indicator\">*</span>\n }\n <span class=\"field-type\">({{ field.info.Type }})</span>\n </label>\n <!-- Description -->\n @if (field.info.Description) {\n <p class=\"field-description\">\n {{ field.info.Description }}\n </p>\n }\n <!-- String input -->\n @if (field.info.Type === 'string') {\n <input type=\"text\"\n class=\"form-input\"\n [id]=\"'param-' + field.info.Name\"\n [value]=\"GetStringValue(field.value)\"\n [placeholder]=\"GetPlaceholder(field.info)\"\n (input)=\"OnInputChange(field, $event)\">\n }\n <!-- Number input -->\n @if (field.info.Type === 'number') {\n <input type=\"number\"\n class=\"form-input\"\n [id]=\"'param-' + field.info.Name\"\n [value]=\"GetNumberValue(field.value)\"\n [placeholder]=\"GetPlaceholder(field.info)\"\n (input)=\"OnNumberInputChange(field, $event)\">\n }\n <!-- Date input -->\n @if (field.info.Type === 'date') {\n <input type=\"date\"\n class=\"form-input\"\n [id]=\"'param-' + field.info.Name\"\n [value]=\"GetDateValue(field.value)\"\n (input)=\"OnDateInputChange(field, $event)\">\n }\n <!-- Boolean input -->\n @if (field.info.Type === 'boolean') {\n <div class=\"checkbox-wrapper\">\n <input type=\"checkbox\"\n [id]=\"'param-' + field.info.Name\"\n [checked]=\"GetBooleanValue(field.value)\"\n (change)=\"OnCheckboxChange(field, $event)\">\n <label [for]=\"'param-' + field.info.Name\" class=\"checkbox-label\">\n {{ GetBooleanValue(field.value) ? 'Yes' : 'No' }}\n </label>\n </div>\n }\n <!-- Array input (comma-separated) -->\n @if (field.info.Type === 'array') {\n <input type=\"text\"\n class=\"form-input\"\n [id]=\"'param-' + field.info.Name\"\n [value]=\"GetArrayDisplayValue(field.value)\"\n [placeholder]=\"GetPlaceholder(field.info) || 'Enter values separated by commas'\"\n (input)=\"OnArrayInputChange(field, $event)\">\n <span class=\"field-hint\">Enter multiple values separated by commas</span>\n }\n <!-- Error message -->\n @if (field.error && field.touched) {\n <span class=\"field-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n {{ field.error }}\n </span>\n }\n <!-- Sample value hint -->\n @if (field.info.SampleValue && !field.error) {\n <span class=\"field-sample\">\n Example: {{ field.info.SampleValue }}\n </span>\n }\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n @if (Fields.length > 0) {\n <div class=\"panel-footer\">\n <button class=\"btn btn-secondary\" (click)=\"Reset()\" title=\"Reset to defaults\">\n <i class=\"fa-solid fa-undo\"></i>\n Reset\n </button>\n <div class=\"footer-right\">\n <button class=\"btn btn-secondary\" (click)=\"Cancel()\">\n Cancel\n </button>\n <button class=\"btn btn-primary\"\n [disabled]=\"!CanSubmit\"\n (click)=\"Submit()\">\n <i class=\"fa-solid fa-play\"></i>\n Run Query\n </button>\n </div>\n </div>\n }\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"query-parameter-form.component.js","sourceRoot":"","sources":["../../../src/lib/query-parameter-form/query-parameter-form.component.ts","../../../src/lib/query-parameter-form/query-parameter-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { QueryInfo, QueryParameterInfo } from '@memberjunction/core';\nimport { QueryParameterValues } from '../query-data-grid/models/query-grid-types';\n\n/**\n * A single parameter field in the form\n */\ninterface ParameterField {\n info: QueryParameterInfo;\n value: string | number | boolean | Date | string[] | null;\n error: string | null;\n touched: boolean;\n}\n\n/**\n * A slide-in form for entering query parameters before execution.\n * Features:\n * - Dynamic form generation from QueryParameterInfo metadata\n * - Type-appropriate input controls (text, number, date, checkbox, multi-select)\n * - Validation with helpful error messages\n * - Sample values as placeholders\n * - Description tooltips\n *\n * @example\n * ```html\n * <mj-query-parameter-form\n * [QueryInfo]=\"query\"\n * [InitialValues]=\"savedParams\"\n * [IsOpen]=\"showParams\"\n * (ParametersSubmit)=\"onRunQuery($event)\"\n * (Close)=\"showParams = false\">\n * </mj-query-parameter-form>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-query-parameter-form',\n templateUrl: './query-parameter-form.component.html',\n styleUrls: ['./query-parameter-form.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('slideIn', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate('250ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\n ])\n ]),\n trigger('fadeIn', [\n transition(':enter', [\n style({ opacity: 0 }),\n animate('150ms ease-out', style({ opacity: 1 }))\n ]),\n transition(':leave', [\n animate('100ms ease-in', style({ opacity: 0 }))\n ])\n ])\n ]\n})\nexport class QueryParameterFormComponent implements OnInit, OnChanges, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n /**\n * The query metadata containing parameter definitions\n */\n @Input() QueryInfo: QueryInfo | null = null;\n\n /**\n * Initial values to populate the form (e.g., from saved state)\n */\n @Input() InitialValues: QueryParameterValues = {};\n\n /**\n * Whether the panel is open/visible\n */\n @Input() IsOpen: boolean = false;\n\n /**\n * Panel width in pixels\n */\n @Input() PanelWidth: number = 400;\n\n /**\n * Whether to show the overlay backdrop\n */\n @Input() ShowOverlay: boolean = true;\n\n // ========================================\n // Outputs\n // ========================================\n\n /**\n * Fired when user submits the form with valid parameters\n */\n @Output() ParametersSubmit = new EventEmitter<QueryParameterValues>();\n\n /**\n * Fired when panel is closed\n */\n @Output() Close = new EventEmitter<void>();\n\n // ========================================\n // Internal State\n // ========================================\n\n public Fields: ParameterField[] = [];\n public HasRequiredParams: boolean = false;\n public AllRequiredFilled: boolean = false;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.buildForm();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['QueryInfo'] || changes['InitialValues']) {\n this.buildForm();\n }\n }\n\n ngOnDestroy(): void {}\n\n // ========================================\n // Form Building\n // ========================================\n\n private buildForm(): void {\n if (!this.QueryInfo) {\n this.Fields = [];\n this.HasRequiredParams = false;\n return;\n }\n\n const parameters = this.QueryInfo.Parameters || [];\n\n this.Fields = parameters.map(param => {\n const initialValue = this.getInitialValue(param);\n\n return {\n info: param,\n value: initialValue,\n error: null,\n touched: false\n };\n });\n\n this.HasRequiredParams = this.Fields.some(f => f.info.IsRequired);\n this.validateAllFields();\n this.cdr.markForCheck();\n }\n\n private getInitialValue(param: QueryParameterInfo): string | number | boolean | Date | string[] | null {\n // Check initial values first\n if (this.InitialValues && this.InitialValues[param.Name] !== undefined) {\n return this.InitialValues[param.Name];\n }\n\n // Fall back to default value\n if (param.DefaultValue !== null && param.DefaultValue !== undefined) {\n return this.parseDefaultValue(param);\n }\n\n // Type-specific defaults\n switch (param.Type) {\n case 'boolean':\n return false;\n case 'array':\n return [];\n default:\n return null;\n }\n }\n\n private parseDefaultValue(param: QueryParameterInfo): string | number | boolean | Date | string[] | null {\n const defaultValue = param.DefaultValue;\n if (defaultValue === null || defaultValue === undefined) return null;\n\n try {\n switch (param.Type) {\n case 'number':\n return Number(defaultValue);\n case 'boolean':\n return defaultValue.toLowerCase() === 'true' || defaultValue === '1';\n case 'date':\n return new Date(defaultValue);\n case 'array':\n return JSON.parse(defaultValue);\n default:\n return defaultValue;\n }\n } catch {\n return defaultValue;\n }\n }\n\n // ========================================\n // Value Handling\n // ========================================\n\n public OnValueChange(field: ParameterField, value: unknown): void {\n field.value = value as ParameterField['value'];\n field.touched = true;\n this.validateField(field);\n this.updateAllRequiredFilled();\n this.cdr.markForCheck();\n }\n\n public OnDateChange(field: ParameterField, value: Date | null): void {\n field.value = value;\n field.touched = true;\n this.validateField(field);\n this.updateAllRequiredFilled();\n this.cdr.markForCheck();\n }\n\n public OnCheckboxChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n field.value = input.checked;\n field.touched = true;\n this.validateField(field);\n this.updateAllRequiredFilled();\n this.cdr.markForCheck();\n }\n\n // ========================================\n // Validation\n // ========================================\n\n private validateField(field: ParameterField): void {\n field.error = null;\n\n const value = field.value;\n const param = field.info;\n\n // Required check\n if (param.IsRequired) {\n if (value === null || value === undefined || value === '') {\n field.error = 'This field is required';\n return;\n }\n if (param.Type === 'array' && Array.isArray(value) && value.length === 0) {\n field.error = 'At least one value is required';\n return;\n }\n }\n\n // Type validation\n if (value !== null && value !== undefined && value !== '') {\n switch (param.Type) {\n case 'number':\n if (isNaN(Number(value))) {\n field.error = 'Must be a valid number';\n }\n break;\n case 'date':\n if (value instanceof Date && isNaN(value.getTime())) {\n field.error = 'Must be a valid date';\n }\n break;\n }\n }\n }\n\n private validateAllFields(): void {\n for (const field of this.Fields) {\n this.validateField(field);\n }\n this.updateAllRequiredFilled();\n }\n\n private updateAllRequiredFilled(): void {\n this.AllRequiredFilled = this.Fields\n .filter(f => f.info.IsRequired)\n .every(f => {\n const value = f.value;\n if (value === null || value === undefined || value === '') return false;\n if (f.info.Type === 'array' && Array.isArray(value) && value.length === 0) return false;\n return f.error === null;\n });\n }\n\n public get HasErrors(): boolean {\n return this.Fields.some(f => f.error !== null);\n }\n\n public get CanSubmit(): boolean {\n return !this.HasErrors && this.AllRequiredFilled;\n }\n\n // ========================================\n // Form Submission\n // ========================================\n\n public Submit(): void {\n // Mark all fields as touched\n for (const field of this.Fields) {\n field.touched = true;\n }\n this.validateAllFields();\n\n if (!this.CanSubmit) {\n this.cdr.markForCheck();\n return;\n }\n\n // Build parameter values object, normalizing array fields through\n // the same parse logic used by OnArrayInputChange so that saved\n // state from before the JSON-array fix is cleaned up on re-submit.\n const values: QueryParameterValues = {};\n for (const field of this.Fields) {\n if (field.value !== null && field.value !== undefined) {\n if (field.info.Type === 'array') {\n const display = this.GetArrayDisplayValue(field.value);\n values[field.info.Name] = display ? this.parseArrayInput(display) : [];\n } else {\n values[field.info.Name] = field.value;\n }\n }\n }\n\n this.ParametersSubmit.emit(values);\n }\n\n public Cancel(): void {\n this.Close.emit();\n }\n\n public Reset(): void {\n this.buildForm();\n }\n\n // ========================================\n // UI Helpers\n // ========================================\n\n public GetInputType(param: QueryParameterInfo): string {\n switch (param.Type) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'checkbox';\n case 'date':\n return 'date';\n default:\n return 'text';\n }\n }\n\n public GetPlaceholder(param: QueryParameterInfo): string {\n if (param.SampleValue) {\n return `e.g., ${param.SampleValue}`;\n }\n return param.Description || '';\n }\n\n public TrackByField(index: number, field: ParameterField): string {\n return field.info.Name;\n }\n\n // ========================================\n // Type-Safe Value Getters for Template\n // ========================================\n\n public GetStringValue(value: ParameterField['value']): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n return String(value);\n }\n\n public GetNumberValue(value: ParameterField['value']): number | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'number') return value;\n const num = Number(value);\n return isNaN(num) ? null : num;\n }\n\n public GetDateValue(value: ParameterField['value']): string {\n if (value === null || value === undefined) return '';\n if (value instanceof Date) {\n // Format as YYYY-MM-DD for HTML date input\n return value.toISOString().split('T')[0];\n }\n if (typeof value === 'string') {\n // Try to parse and format\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date.toISOString().split('T')[0];\n }\n }\n return '';\n }\n\n public GetBooleanValue(value: ParameterField['value']): boolean {\n if (value === null || value === undefined) return false;\n return Boolean(value);\n }\n\n public GetArrayDisplayValue(value: ParameterField['value']): string {\n if (value === null || value === undefined) return '';\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n return String(value);\n }\n\n // ========================================\n // Input Event Handlers\n // ========================================\n\n public OnInputChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n this.OnValueChange(field, input.value);\n }\n\n public OnNumberInputChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value === '' ? null : Number(input.value);\n this.OnValueChange(field, value);\n }\n\n public OnDateInputChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = input.value ? new Date(input.value) : null;\n this.OnDateChange(field, value);\n }\n\n public OnArrayInputChange(field: ParameterField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const raw = input.value?.trim();\n const value = raw ? this.parseArrayInput(raw) : [];\n this.OnValueChange(field, value);\n }\n\n /**\n * Parses array parameter input, supporting both JSON array syntax\n * (`[\"A\",\"B\",\"C\"]`) and plain comma-separated values (`A, B, C`).\n */\n private parseArrayInput(raw: string): string[] {\n if (raw.startsWith('[')) {\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) {\n return parsed.map(v => String(v).trim()).filter(s => s);\n }\n } catch {\n // Not valid JSON — fall through to comma-split\n }\n }\n return raw.split(',').map(s => s.trim()).filter(s => s);\n }\n}\n","<!-- Query Parameter Form - Slide-in Panel -->\n@if (IsOpen && ShowOverlay) {\n <div class=\"param-form-overlay\"\n @fadeIn\n (click)=\"Cancel()\">\n </div>\n}\n\n@if (IsOpen) {\n <div class=\"param-form-panel\"\n @slideIn\n [style.width.px]=\"PanelWidth\">\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-content\">\n <i class=\"fa-solid fa-sliders header-icon\"></i>\n <div class=\"header-text\">\n <h3 class=\"header-title\">Query Parameters</h3>\n @if (QueryInfo) {\n <span class=\"header-subtitle\">{{ QueryInfo.Name }}</span>\n }\n </div>\n </div>\n <button class=\"close-btn\" (click)=\"Cancel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Form Content -->\n <div class=\"panel-content\">\n <!-- No parameters message -->\n @if (Fields.length === 0) {\n <div class=\"no-params\">\n <i class=\"fa-solid fa-check-circle no-params-icon\"></i>\n <p>This query has no parameters</p>\n <button class=\"btn btn-primary\" (click)=\"Submit()\">\n Run Query\n </button>\n </div>\n }\n <!-- Parameter fields -->\n @if (Fields.length > 0) {\n <div class=\"param-fields\">\n @for (field of Fields; track TrackByField($index, field)) {\n <div class=\"param-field\"\n [class.has-error]=\"field.error && field.touched\"\n [class.required]=\"field.info.IsRequired\">\n <!-- Label -->\n <label class=\"field-label\" [for]=\"'param-' + field.info.Name\">\n {{ field.info.Name }}\n @if (field.info.IsRequired) {\n <span class=\"required-indicator\">*</span>\n }\n <span class=\"field-type\">({{ field.info.Type }})</span>\n </label>\n <!-- Description -->\n @if (field.info.Description) {\n <p class=\"field-description\">\n {{ field.info.Description }}\n </p>\n }\n <!-- String input -->\n @if (field.info.Type === 'string') {\n <input type=\"text\"\n class=\"form-input\"\n [id]=\"'param-' + field.info.Name\"\n [value]=\"GetStringValue(field.value)\"\n [placeholder]=\"GetPlaceholder(field.info)\"\n (input)=\"OnInputChange(field, $event)\">\n }\n <!-- Number input -->\n @if (field.info.Type === 'number') {\n <input type=\"number\"\n class=\"form-input\"\n [id]=\"'param-' + field.info.Name\"\n [value]=\"GetNumberValue(field.value)\"\n [placeholder]=\"GetPlaceholder(field.info)\"\n (input)=\"OnNumberInputChange(field, $event)\">\n }\n <!-- Date input -->\n @if (field.info.Type === 'date') {\n <input type=\"date\"\n class=\"form-input\"\n [id]=\"'param-' + field.info.Name\"\n [value]=\"GetDateValue(field.value)\"\n (input)=\"OnDateInputChange(field, $event)\">\n }\n <!-- Boolean input -->\n @if (field.info.Type === 'boolean') {\n <div class=\"checkbox-wrapper\">\n <input type=\"checkbox\"\n [id]=\"'param-' + field.info.Name\"\n [checked]=\"GetBooleanValue(field.value)\"\n (change)=\"OnCheckboxChange(field, $event)\">\n <label [for]=\"'param-' + field.info.Name\" class=\"checkbox-label\">\n {{ GetBooleanValue(field.value) ? 'Yes' : 'No' }}\n </label>\n </div>\n }\n <!-- Array input (comma-separated) -->\n @if (field.info.Type === 'array') {\n <input type=\"text\"\n class=\"form-input\"\n [id]=\"'param-' + field.info.Name\"\n [value]=\"GetArrayDisplayValue(field.value)\"\n [placeholder]=\"GetPlaceholder(field.info) || 'Enter values separated by commas'\"\n (input)=\"OnArrayInputChange(field, $event)\">\n <span class=\"field-hint\">Enter multiple values separated by commas</span>\n }\n <!-- Error message -->\n @if (field.error && field.touched) {\n <span class=\"field-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n {{ field.error }}\n </span>\n }\n <!-- Sample value hint -->\n @if (field.info.SampleValue && !field.error) {\n <span class=\"field-sample\">\n Example: {{ field.info.SampleValue }}\n </span>\n }\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n @if (Fields.length > 0) {\n <div class=\"panel-footer\">\n <button class=\"btn btn-secondary\" (click)=\"Reset()\" title=\"Reset to defaults\">\n <i class=\"fa-solid fa-undo\"></i>\n Reset\n </button>\n <div class=\"footer-right\">\n <button class=\"btn btn-secondary\" (click)=\"Cancel()\">\n Cancel\n </button>\n <button class=\"btn btn-primary\"\n [disabled]=\"!CanSubmit\"\n (click)=\"Submit()\">\n <i class=\"fa-solid fa-play\"></i>\n Run Query\n </button>\n </div>\n </div>\n }\n </div>\n}\n"]}
|
|
@@ -141,6 +141,13 @@ export declare class QueryViewerComponent implements OnInit, OnDestroy {
|
|
|
141
141
|
OnCompositionTokenClick(event: CompositionTokenClickEvent): void;
|
|
142
142
|
Refresh(): void;
|
|
143
143
|
get HasParameters(): boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Normalizes array-typed parameters. Handles the case where saved state
|
|
146
|
+
* contains JSON fragment arrays (e.g. `['["A"', '"B"]']`) from the old
|
|
147
|
+
* comma-split bug. Joins the fragments back into a string, detects JSON
|
|
148
|
+
* array syntax, and parses cleanly.
|
|
149
|
+
*/
|
|
150
|
+
private normalizeArrayParams;
|
|
144
151
|
static ɵfac: i0.ɵɵFactoryDeclaration<QueryViewerComponent, never>;
|
|
145
152
|
static ɵcmp: i0.ɵɵComponentDeclaration<QueryViewerComponent, "mj-query-viewer", never, { "QueryId": { "alias": "QueryId"; "required": false; }; "AutoRun": { "alias": "AutoRun"; "required": false; }; "SelectionMode": { "alias": "SelectionMode"; "required": false; }; "ShowToolbar": { "alias": "ShowToolbar"; "required": false; }; "VisualConfig": { "alias": "VisualConfig"; "required": false; }; "PersistState": { "alias": "PersistState"; "required": false; }; "PersistParameters": { "alias": "PersistParameters"; "required": false; }; "PageSize": { "alias": "PageSize"; "required": false; }; }, { "EntityLinkClick": "EntityLinkClick"; "RowDoubleClick": "RowDoubleClick"; "SelectionChange": "SelectionChange"; "QueryStart": "QueryStart"; "QueryComplete": "QueryComplete"; "QueryError": "QueryError"; "OpenQueryRecord": "OpenQueryRecord"; "CompositionTokenClick": "CompositionTokenClick"; }, never, never, false, never>;
|
|
146
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/query-viewer/query-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,YAAY,EACZ,MAAM,EACN,SAAS,EACT,iBAAiB,EAGpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAA4B,cAAc,EAAY,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAErG,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,EACH,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,kBAAkB,EAGrB,MAAM,4CAA4C,CAAC;;AAEpD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAOa,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAmI9C,OAAO,CAAC,GAAG;IA9HvB,OAAO,CAAC,QAAQ,CAAuB;IACvC;;OAEG;IACH,IACI,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAM/B;IACD,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED;;OAEG;IACM,OAAO,EAAE,OAAO,CAAQ;IAEjC;;OAEG;IACM,aAAa,EAAE,sBAAsB,CAAY;IAE1D;;OAEG;IACM,WAAW,EAAE,OAAO,CAAQ;IAErC;;OAEG;IACM,YAAY,EAAE,qBAAqB,CAAM;IAElD;;OAEG;IACM,YAAY,EAAE,OAAO,CAAQ;IAEtC;;OAEG;IACM,iBAAiB,EAAE,OAAO,CAAQ;IAE3C;;;OAGG;IACM,QAAQ,EAAE,MAAM,CAAO;IAMhC;;OAEG;IACO,eAAe,0CAAiD;IAE1E;;OAEG;IACO,cAAc,mCAA0C;IAElE;;OAEG;IACO,eAAe,2CAAkD;IAE3E;;OAEG;IACO,UAAU,qBAA4B;IAEhD;;OAEG;IACO,aAAa,+BAAsC;IAE7D;;OAEG;IACO,UAAU,sBAA6B;IAEjD;;OAEG;IACO,eAAe;iBAA+B,MAAM;mBAAa,MAAM;OAAM;IAEvF;;OAEG;IACO,qBAAqB,2CAAkD;IAM9C,QAAQ,EAAG,sBAAsB,CAAC;IAM9D,SAAS,EAAE,SAAS,GAAG,IAAI,CAAQ;IACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAM;IAC1C,SAAS,EAAE,OAAO,CAAS;IAC3B,eAAe,EAAE,OAAO,CAAS;IACjC,aAAa,EAAE,OAAO,CAAS;IAC/B,MAAM,EAAE,OAAO,CAAS;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEtC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAQ;IAC7C,WAAW,EAAE,oBAAoB,CAAM;IAE9C,mBAAmB;IACZ,kBAAkB,EAAE,MAAM,CAAK;IAC/B,iBAAiB,EAAE,MAAM,CAAK;IAErC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,cAAc,CAA2B;gBAE7B,GAAG,EAAE,iBAAiB;IAE1C,QAAQ,IAAI,IAAI;IAEhB,WAAW,IAAI,IAAI;YASL,gBAAgB;IAqD9B,OAAO,CAAC,yBAAyB;YAsBnB,cAAc;YA0Bd,aAAa;YAWb,cAAc;YAWd,cAAc;YAId,cAAc;IAQf,QAAQ,CAAC,MAAM,EAAE,oBAAoB,EAAE,UAAU,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"query-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/query-viewer/query-viewer.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -380,19 +380,23 @@ export class QueryViewerComponent {
|
|
|
380
380
|
async RunQuery(params, pageNumber = 1) {
|
|
381
381
|
if (!this.QueryInfo || !this._queryId)
|
|
382
382
|
return;
|
|
383
|
+
// Normalize array parameters: saved state or callers may pass arrays
|
|
384
|
+
// with JSON fragment strings (e.g. ['["A"', '"B"]']) from the old
|
|
385
|
+
// comma-split bug. Re-join and re-parse to clean them up.
|
|
386
|
+
const normalizedParams = this.normalizeArrayParams(params);
|
|
383
387
|
this.IsLoading = true;
|
|
384
388
|
this.LastError = null;
|
|
385
389
|
this.QueryStart.emit();
|
|
386
390
|
this.cdr.markForCheck();
|
|
387
|
-
// Save parameters for next time
|
|
388
|
-
this.SavedParams =
|
|
389
|
-
await this.saveParameters(
|
|
391
|
+
// Save normalized parameters for next time
|
|
392
|
+
this.SavedParams = normalizedParams;
|
|
393
|
+
await this.saveParameters(normalizedParams);
|
|
390
394
|
const startTime = performance.now();
|
|
391
395
|
try {
|
|
392
396
|
const runQuery = new RunQuery();
|
|
393
397
|
const runParams = {
|
|
394
398
|
QueryID: this._queryId,
|
|
395
|
-
Parameters:
|
|
399
|
+
Parameters: normalizedParams
|
|
396
400
|
};
|
|
397
401
|
// Add server-side paging when PageSize > 0
|
|
398
402
|
if (this.PageSize > 0) {
|
|
@@ -492,6 +496,41 @@ export class QueryViewerComponent {
|
|
|
492
496
|
get HasParameters() {
|
|
493
497
|
return (this.QueryInfo?.Parameters?.length || 0) > 0;
|
|
494
498
|
}
|
|
499
|
+
/**
|
|
500
|
+
* Normalizes array-typed parameters. Handles the case where saved state
|
|
501
|
+
* contains JSON fragment arrays (e.g. `['["A"', '"B"]']`) from the old
|
|
502
|
+
* comma-split bug. Joins the fragments back into a string, detects JSON
|
|
503
|
+
* array syntax, and parses cleanly.
|
|
504
|
+
*/
|
|
505
|
+
normalizeArrayParams(params) {
|
|
506
|
+
if (!this.QueryInfo?.Parameters?.length)
|
|
507
|
+
return params;
|
|
508
|
+
const result = { ...params };
|
|
509
|
+
for (const paramDef of this.QueryInfo.Parameters) {
|
|
510
|
+
if (paramDef.Type !== 'array' || !(paramDef.Name in result))
|
|
511
|
+
continue;
|
|
512
|
+
const value = result[paramDef.Name];
|
|
513
|
+
if (!Array.isArray(value) || value.length === 0)
|
|
514
|
+
continue;
|
|
515
|
+
// Check if the array looks like it was produced by naive comma-splitting
|
|
516
|
+
// of a JSON array string (fragments contain brackets or quotes)
|
|
517
|
+
const joined = value.join(', ');
|
|
518
|
+
const trimmed = joined.trim();
|
|
519
|
+
if (trimmed.startsWith('[')) {
|
|
520
|
+
try {
|
|
521
|
+
const parsed = JSON.parse(trimmed);
|
|
522
|
+
if (Array.isArray(parsed)) {
|
|
523
|
+
result[paramDef.Name] = parsed.map((v) => String(v).trim()).filter((s) => s);
|
|
524
|
+
continue;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
// Not valid JSON after joining — leave as-is
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return result;
|
|
533
|
+
}
|
|
495
534
|
static ɵfac = function QueryViewerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QueryViewerComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
496
535
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryViewerComponent, selectors: [["mj-query-viewer"]], viewQuery: function QueryViewerComponent_Query(rf, ctx) { if (rf & 1) {
|
|
497
536
|
i0.ɵɵviewQuery(QueryDataGridComponent, 5);
|
|
@@ -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":"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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"]}
|
|
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 // Normalize array parameters: saved state or callers may pass arrays\n // with JSON fragment strings (e.g. ['[\"A\"', '\"B\"]']) from the old\n // comma-split bug. Re-join and re-parse to clean them up.\n const normalizedParams = this.normalizeArrayParams(params);\n\n this.IsLoading = true;\n this.LastError = null;\n this.QueryStart.emit();\n this.cdr.markForCheck();\n\n // Save normalized parameters for next time\n this.SavedParams = normalizedParams;\n await this.saveParameters(normalizedParams);\n\n const startTime = performance.now();\n\n try {\n const runQuery = new RunQuery();\n const runParams: RunQueryParams = {\n QueryID: this._queryId,\n Parameters: normalizedParams 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 /**\n * Normalizes array-typed parameters. Handles the case where saved state\n * contains JSON fragment arrays (e.g. `['[\"A\"', '\"B\"]']`) from the old\n * comma-split bug. Joins the fragments back into a string, detects JSON\n * array syntax, and parses cleanly.\n */\n private normalizeArrayParams(params: QueryParameterValues): QueryParameterValues {\n if (!this.QueryInfo?.Parameters?.length) return params;\n\n const result = { ...params };\n for (const paramDef of this.QueryInfo.Parameters) {\n if (paramDef.Type !== 'array' || !(paramDef.Name in result)) continue;\n\n const value = result[paramDef.Name];\n if (!Array.isArray(value) || value.length === 0) continue;\n\n // Check if the array looks like it was produced by naive comma-splitting\n // of a JSON array string (fragments contain brackets or quotes)\n const joined = value.join(', ');\n const trimmed = joined.trim();\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n result[paramDef.Name] = parsed.map((v: unknown) => String(v).trim()).filter((s: string) => s);\n continue;\n }\n } catch {\n // Not valid JSON after joining — leave as-is\n }\n }\n }\n return result;\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-query-viewer",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.25.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,16 +37,16 @@
|
|
|
37
37
|
"ag-grid-community": "^35.0.1"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@memberjunction/core-entities": "5.
|
|
41
|
-
"@memberjunction/export-engine": "5.
|
|
42
|
-
"@memberjunction/global": "5.
|
|
43
|
-
"@memberjunction/core": "5.
|
|
44
|
-
"@memberjunction/ng-pagination": "5.
|
|
45
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
46
|
-
"@memberjunction/ng-export-service": "5.
|
|
47
|
-
"@memberjunction/ng-markdown": "5.
|
|
48
|
-
"@memberjunction/ng-code-editor": "5.
|
|
49
|
-
"@memberjunction/ng-notifications": "5.
|
|
40
|
+
"@memberjunction/core-entities": "5.25.0",
|
|
41
|
+
"@memberjunction/export-engine": "5.25.0",
|
|
42
|
+
"@memberjunction/global": "5.25.0",
|
|
43
|
+
"@memberjunction/core": "5.25.0",
|
|
44
|
+
"@memberjunction/ng-pagination": "5.25.0",
|
|
45
|
+
"@memberjunction/ng-shared-generic": "5.25.0",
|
|
46
|
+
"@memberjunction/ng-export-service": "5.25.0",
|
|
47
|
+
"@memberjunction/ng-markdown": "5.25.0",
|
|
48
|
+
"@memberjunction/ng-code-editor": "5.25.0",
|
|
49
|
+
"@memberjunction/ng-notifications": "5.25.0",
|
|
50
50
|
"rxjs": "^7.8.2",
|
|
51
51
|
"tslib": "^2.8.1"
|
|
52
52
|
},
|