@memberjunction/ng-data-context 6.1.4 → 6.2.0-edge.1

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.
@@ -5,16 +5,44 @@ import * as i0 from "@angular/core";
5
5
  * Enhanced dialog wrapper component for the data context viewer
6
6
  */
7
7
  export declare class DataContextDialogComponent {
8
+ DialogClosed: EventEmitter<any>;
9
+ /**
10
+ * @deprecated Use {@link DialogClosed}.
11
+ *
12
+ * The same emitter under the old binding name, so a template still binding
13
+ * (dialogClosed) keeps working. Must stay AFTER DialogClosed: class fields
14
+ * initialise in order, and the other way round this captures undefined.
15
+ */
8
16
  dialogClosed: EventEmitter<any>;
9
- dataContextId: string;
10
- dataContextName?: string;
17
+ DataContextId: string;
18
+ /** @deprecated Use {@link DataContextId}. */
19
+ set dataContextId(value: string);
20
+ /** @deprecated Use {@link DataContextId}. */
21
+ get dataContextId(): string;
22
+ DataContextName?: string;
23
+ /** @deprecated Use {@link DataContextName}. */
24
+ set dataContextName(value: string | undefined);
25
+ /** @deprecated Use {@link DataContextName}. */
26
+ get dataContextName(): string | undefined;
11
27
  Provider: IMetadataProvider | null;
12
- isMaximized: boolean;
28
+ IsMaximized: boolean;
29
+ /** @deprecated Use {@link IsMaximized}. */
30
+ get isMaximized(): boolean;
31
+ /** @deprecated Use {@link IsMaximized}. */
32
+ set isMaximized(value: boolean);
33
+ get DialogWidth(): number;
34
+ /** @deprecated Use {@link DialogWidth}. */
13
35
  get dialogWidth(): number;
36
+ get DialogHeight(): number;
37
+ /** @deprecated Use {@link DialogHeight}. */
14
38
  get dialogHeight(): number;
39
+ CloseDialog(): void;
40
+ /** @deprecated Use {@link CloseDialog}. */
15
41
  closeDialog(): void;
42
+ ToggleMaximize(): void;
43
+ /** @deprecated Use {@link ToggleMaximize}. */
16
44
  toggleMaximize(): void;
17
45
  static ɵfac: i0.ɵɵFactoryDeclaration<DataContextDialogComponent, never>;
18
- static ɵcmp: i0.ɵɵComponentDeclaration<DataContextDialogComponent, "mj-data-context-dialog", never, { "dataContextId": { "alias": "dataContextId"; "required": false; }; "dataContextName": { "alias": "dataContextName"; "required": false; }; "Provider": { "alias": "Provider"; "required": false; }; }, { "dialogClosed": "dialogClosed"; }, never, never, false, never>;
46
+ static ɵcmp: i0.ɵɵComponentDeclaration<DataContextDialogComponent, "mj-data-context-dialog", never, { "DataContextId": { "alias": "DataContextId"; "required": false; }; "dataContextId": { "alias": "dataContextId"; "required": false; }; "DataContextName": { "alias": "DataContextName"; "required": false; }; "dataContextName": { "alias": "dataContextName"; "required": false; }; "Provider": { "alias": "Provider"; "required": false; }; }, { "DialogClosed": "DialogClosed"; "dialogClosed": "dialogClosed"; }, never, never, false, never>;
19
47
  }
20
48
  //# sourceMappingURL=ng-data-context-dialog.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-data-context-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAEzD;;GAEG;AACH,qBAMa,0BAA0B;IAC3B,YAAY,oBAAsB;IACnC,aAAa,EAAG,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAE5C,WAAW,EAAE,OAAO,CAAS;IAEpC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,WAAW,IAAI,IAAI;IAInB,cAAc,IAAI,IAAI;yCApBX,0BAA0B;2CAA1B,0BAA0B;CAuBtC"}
1
+ {"version":3,"file":"ng-data-context-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAEzD;;GAEG;AACH,qBAMa,0BAA0B;IAC3B,YAAY,oBAAsB;IAE5C;;;;;;OAMG;IACO,YAAY,oBAAqB;IAClC,aAAa,EAAG,MAAM,CAAC;IAEhC,6CAA6C;IAC7C,IAAa,aAAa,CAAC,KAAK,EAAE,MAAM,EAEvC;IACD,6CAA6C;IAC7C,IAAI,aAAa,IAAI,MAAM,CAE1B;IACQ,eAAe,CAAC,EAAE,MAAM,CAAC;IAElC,+CAA+C;IAC/C,IAAa,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAErD;IACD,+CAA+C;IAC/C,IAAI,eAAe,IAAI,MAAM,GAAG,SAAS,CAExC;IACQ,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAE5C,WAAW,EAAE,OAAO,CAAS;IAEpC,2CAA2C;IAC3C,IAAW,WAAW,IAAI,OAAO,CAEhC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,EAAE,OAAO,EAEpC;IAED,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,2CAA2C;IAC3C,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,4CAA4C;IAC5C,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,WAAW,IAAI,IAAI;IAInB,2CAA2C;IAC3C,WAAW,IAAI,IAAI;IAInB,cAAc,IAAI,IAAI;IAItB,8CAA8C;IAC9C,cAAc,IAAI,IAAI;yCA5EX,0BAA0B;2CAA1B,0BAA0B;CA+EtC"}
@@ -6,25 +6,73 @@ import * as i2 from "./ng-data-context.component";
6
6
  * Enhanced dialog wrapper component for the data context viewer
7
7
  */
8
8
  export class DataContextDialogComponent {
9
- dialogClosed = new EventEmitter();
10
- dataContextId;
11
- dataContextName;
9
+ DialogClosed = new EventEmitter();
10
+ /**
11
+ * @deprecated Use {@link DialogClosed}.
12
+ *
13
+ * The same emitter under the old binding name, so a template still binding
14
+ * (dialogClosed) keeps working. Must stay AFTER DialogClosed: class fields
15
+ * initialise in order, and the other way round this captures undefined.
16
+ */
17
+ dialogClosed = this.DialogClosed;
18
+ DataContextId;
19
+ /** @deprecated Use {@link DataContextId}. */
20
+ set dataContextId(value) {
21
+ this.DataContextId = value;
22
+ }
23
+ /** @deprecated Use {@link DataContextId}. */
24
+ get dataContextId() {
25
+ return this.DataContextId;
26
+ }
27
+ DataContextName;
28
+ /** @deprecated Use {@link DataContextName}. */
29
+ set dataContextName(value) {
30
+ this.DataContextName = value;
31
+ }
32
+ /** @deprecated Use {@link DataContextName}. */
33
+ get dataContextName() {
34
+ return this.DataContextName;
35
+ }
12
36
  Provider = null;
13
- isMaximized = false;
37
+ IsMaximized = false;
38
+ /** @deprecated Use {@link IsMaximized}. */
39
+ get isMaximized() {
40
+ return this.IsMaximized;
41
+ }
42
+ /** @deprecated Use {@link IsMaximized}. */
43
+ set isMaximized(value) {
44
+ this.IsMaximized = value;
45
+ }
46
+ get DialogWidth() {
47
+ return this.IsMaximized ? window.innerWidth * 0.95 : 900;
48
+ }
49
+ /** @deprecated Use {@link DialogWidth}. */
14
50
  get dialogWidth() {
15
- return this.isMaximized ? window.innerWidth * 0.95 : 900;
51
+ return this.DialogWidth;
16
52
  }
53
+ get DialogHeight() {
54
+ return this.IsMaximized ? window.innerHeight * 0.95 : 700;
55
+ }
56
+ /** @deprecated Use {@link DialogHeight}. */
17
57
  get dialogHeight() {
18
- return this.isMaximized ? window.innerHeight * 0.95 : 700;
58
+ return this.DialogHeight;
59
+ }
60
+ CloseDialog() {
61
+ this.DialogClosed.emit();
19
62
  }
63
+ /** @deprecated Use {@link CloseDialog}. */
20
64
  closeDialog() {
21
- this.dialogClosed.emit();
65
+ return this.CloseDialog();
66
+ }
67
+ ToggleMaximize() {
68
+ this.IsMaximized = !this.IsMaximized;
22
69
  }
70
+ /** @deprecated Use {@link ToggleMaximize}. */
23
71
  toggleMaximize() {
24
- this.isMaximized = !this.isMaximized;
72
+ return this.ToggleMaximize();
25
73
  }
26
74
  static ɵfac = function DataContextDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DataContextDialogComponent)(); };
27
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataContextDialogComponent, selectors: [["mj-data-context-dialog"]], inputs: { dataContextId: "dataContextId", dataContextName: "dataContextName", Provider: "Provider" }, outputs: { dialogClosed: "dialogClosed" }, standalone: false, decls: 15, vars: 18, consts: [[1, "data-context-dialog-wrapper"], [1, "k-overlay"], [1, "data-context-window", 3, "Close", "Visible", "Width", "Height", "MinHeight", "MinWidth", "Resizable", "Draggable"], [1, "window-title"], [1, "fa-solid", "fa-layer-group", "title-icon"], [1, "window-actions"], [1, "window-action-btn", 3, "click", "title"], [1, "fa-solid"], ["title", "Close", 1, "window-action-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "dialog-content"], [3, "dataContextId", "Provider"]], template: function DataContextDialogComponent_Template(rf, ctx) { if (rf & 1) {
75
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataContextDialogComponent, selectors: [["mj-data-context-dialog"]], inputs: { DataContextId: "DataContextId", dataContextId: "dataContextId", DataContextName: "DataContextName", dataContextName: "dataContextName", Provider: "Provider" }, outputs: { DialogClosed: "DialogClosed", dialogClosed: "dialogClosed" }, standalone: false, decls: 15, vars: 18, consts: [[1, "data-context-dialog-wrapper"], [1, "k-overlay"], [1, "data-context-window", 3, "Close", "Visible", "Width", "Height", "MinHeight", "MinWidth", "Resizable", "Draggable"], [1, "window-title"], [1, "fa-solid", "fa-layer-group", "title-icon"], [1, "window-actions"], [1, "window-action-btn", 3, "click", "title"], [1, "fa-solid"], ["title", "Close", 1, "window-action-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "dialog-content"], [3, "dataContextId", "Provider"]], template: function DataContextDialogComponent_Template(rf, ctx) { if (rf & 1) {
28
76
  i0.ɵɵelementStart(0, "div", 0);
29
77
  i0.ɵɵelement(1, "div", 1);
30
78
  i0.ɵɵelementStart(2, "mj-window", 2);
@@ -62,10 +110,16 @@ export class DataContextDialogComponent {
62
110
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataContextDialogComponent, [{
63
111
  type: Component,
64
112
  args: [{ standalone: false, selector: 'mj-data-context-dialog', template: "<div class=\"data-context-dialog-wrapper\">\n <div class=\"k-overlay\"></div>\n <mj-window\n class=\"data-context-window\"\n [class.maximized]=\"isMaximized\"\n [Visible]=\"true\"\n [Width]=\"dialogWidth\"\n [Height]=\"dialogHeight\"\n [MinHeight]=\"400\"\n [MinWidth]=\"600\"\n [Resizable]=\"!isMaximized\"\n [Draggable]=\"!isMaximized\"\n (Close)=\"closeDialog()\">\n\n <mj-window-titlebar>\n <div class=\"window-title\">\n <i class=\"fa-solid fa-layer-group title-icon\"></i>\n <span>Data Context{{ dataContextName ? ': ' + dataContextName : '' }}</span>\n </div>\n <div class=\"window-actions\">\n <button\n (click)=\"toggleMaximize()\"\n title=\"{{ isMaximized ? 'Restore' : 'Maximize' }}\"\n class=\"window-action-btn\">\n <i class=\"fa-solid\" [class.fa-maximize]=\"!isMaximized\" [class.fa-compress]=\"isMaximized\"></i>\n </button>\n <button\n (click)=\"closeDialog()\"\n title=\"Close\"\n class=\"window-action-btn\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </mj-window-titlebar>\n\n <div class=\"dialog-content\">\n <mj-data-context\n [dataContextId]=\"dataContextId\"\n [Provider]=\"Provider\">\n </mj-data-context>\n </div>\n </mj-window>\n</div>", styles: [".data-context-dialog-wrapper {\n position: relative;\n}\n\n.data-context-window {\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n box-shadow: var(--mj-shadow-lg);\n}\n\n/* Position the window properly */\n:host ::ng-deep .k-window {\n margin: 0 auto;\n top: 10% !important;\n position: fixed !important;\n}\n\n\n.data-context-window.maximized {\n position: fixed !important;\n top: 2.5% !important;\n left: 2.5% !important;\n}\n\n/* Custom Title Bar */\n.window-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: var(--mj-text-base);\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.title-icon {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-lg);\n}\n\n.window-actions {\n display: flex;\n gap: 4px;\n margin-left: auto;\n}\n\n.window-action-btn {\n background: none;\n border: none;\n padding: 8px 10px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-sm);\n}\n\n.window-action-btn:hover {\n background-color: var(--mj-brand-primary-subtle);\n color: var(--mj-brand-primary);\n}\n\n.window-action-btn:last-child:hover {\n background-color: var(--mj-status-error-subtle);\n color: var(--mj-status-error);\n}\n\n/* Dialog Content */\n.dialog-content {\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n/* Override Kendo Window Styles */\n:host ::ng-deep .k-window-titlebar {\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n:host ::ng-deep .k-window-title {\n display: contents;\n}\n\n:host ::ng-deep .k-window-actions {\n display: none; /* Hide default Kendo window actions since we have custom ones */\n}\n\n:host ::ng-deep .k-window-content {\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n:host ::ng-deep .k-window {\n border: none;\n}\n\n/* Animations */\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.data-context-window {\n animation: fadeIn 0.2s ease-out;\n}\n"] }]
65
- }], null, { dialogClosed: [{
113
+ }], null, { DialogClosed: [{
66
114
  type: Output
115
+ }], dialogClosed: [{
116
+ type: Output
117
+ }], DataContextId: [{
118
+ type: Input
67
119
  }], dataContextId: [{
68
120
  type: Input
121
+ }], DataContextName: [{
122
+ type: Input
69
123
  }], dataContextName: [{
70
124
  type: Input
71
125
  }], Provider: [{
@@ -1 +1 @@
1
- {"version":3,"file":"ng-data-context-dialog.component.js","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts","../../src/lib/ng-data-context-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;AAGvE;;GAEG;AAOH,MAAM,OAAO,0BAA0B;IAC3B,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACnC,aAAa,CAAU;IACvB,eAAe,CAAU;IACzB,QAAQ,GAA6B,IAAI,CAAC;IAE5C,WAAW,GAAY,KAAK,CAAC;IAEpC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,CAAC;IAED,WAAW;QACT,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACvC,CAAC;oHAtBU,0BAA0B;6DAA1B,0BAA0B;YCZvC,8BAAyC;YACrC,yBAA6B;YAC7B,oCAU4B;YAAxB,0GAAS,iBAAa,IAAC;YAGnB,AADJ,0CAAoB,aACU;YACtB,uBAAkD;YAClD,4BAAM;YAAA,YAA+D;YACzE,AADyE,iBAAO,EAC1E;YAEF,AADJ,8BAA4B,gBAIM;YAF1B,uGAAS,oBAAgB,IAAC;YAG1B,wBAA6F;YACjG,iBAAS;YACT,kCAG8B;YAF1B,wGAAS,iBAAa,IAAC;YAGvB,wBAAiC;YAG7C,AADI,AADI,iBAAS,EACP,EACW;YAErB,gCAA4B;YACxB,uCAGkB;YAG9B,AADI,AADI,iBAAM,EACE,EACV;;YAtCE,eAA+B;YAA/B,4CAA+B;YAO/B,AADA,AADA,AADA,AADA,AADA,AADA,8BAAgB,0BACK,4BACE,kBACN,iBACD,+BACU,+BACA;YAMZ,eAA+D;YAA/D,4FAA+D;YAKjE,eAAkD;YAAlD,uBAAA,0DAAkD,CAAA;YAE9B,cAAkC;YAAC,AAAnC,+CAAkC,gCAAkC;YAa5F,eAA+B;YAC/B,AADA,iDAA+B,0BACV;;;iFD1BxB,0BAA0B;cANtC,SAAS;6BACI,KAAK,YACP,wBAAwB;;kBAKjC,MAAM;;kBACN,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kFAJK,0BAA0B","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { IMetadataProvider } from '@memberjunction/core';\n\n/**\n * Enhanced dialog wrapper component for the data context viewer\n */\n@Component({\n standalone: false,\n selector: 'mj-data-context-dialog',\n templateUrl: './ng-data-context-dialog.component.html',\n styleUrls: ['./ng-data-context-dialog.component.css']\n})\nexport class DataContextDialogComponent {\n @Output() dialogClosed = new EventEmitter();\n @Input() dataContextId!: string;\n @Input() dataContextName?: string;\n @Input() Provider: IMetadataProvider | null = null;\n \n public isMaximized: boolean = false;\n\n public get dialogWidth(): number {\n return this.isMaximized ? window.innerWidth * 0.95 : 900;\n }\n\n public get dialogHeight(): number {\n return this.isMaximized ? window.innerHeight * 0.95 : 700;\n }\n\n closeDialog(): void {\n this.dialogClosed.emit();\n }\n\n toggleMaximize(): void {\n this.isMaximized = !this.isMaximized;\n }\n}","<div class=\"data-context-dialog-wrapper\">\n <div class=\"k-overlay\"></div>\n <mj-window\n class=\"data-context-window\"\n [class.maximized]=\"isMaximized\"\n [Visible]=\"true\"\n [Width]=\"dialogWidth\"\n [Height]=\"dialogHeight\"\n [MinHeight]=\"400\"\n [MinWidth]=\"600\"\n [Resizable]=\"!isMaximized\"\n [Draggable]=\"!isMaximized\"\n (Close)=\"closeDialog()\">\n\n <mj-window-titlebar>\n <div class=\"window-title\">\n <i class=\"fa-solid fa-layer-group title-icon\"></i>\n <span>Data Context{{ dataContextName ? ': ' + dataContextName : '' }}</span>\n </div>\n <div class=\"window-actions\">\n <button\n (click)=\"toggleMaximize()\"\n title=\"{{ isMaximized ? 'Restore' : 'Maximize' }}\"\n class=\"window-action-btn\">\n <i class=\"fa-solid\" [class.fa-maximize]=\"!isMaximized\" [class.fa-compress]=\"isMaximized\"></i>\n </button>\n <button\n (click)=\"closeDialog()\"\n title=\"Close\"\n class=\"window-action-btn\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </mj-window-titlebar>\n\n <div class=\"dialog-content\">\n <mj-data-context\n [dataContextId]=\"dataContextId\"\n [Provider]=\"Provider\">\n </mj-data-context>\n </div>\n </mj-window>\n</div>"]}
1
+ {"version":3,"file":"ng-data-context-dialog.component.js","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts","../../src/lib/ng-data-context-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { IMetadataProvider } from '@memberjunction/core';\n\n/**\n * Enhanced dialog wrapper component for the data context viewer\n */\n@Component({\n standalone: false,\n selector: 'mj-data-context-dialog',\n templateUrl: './ng-data-context-dialog.component.html',\n styleUrls: ['./ng-data-context-dialog.component.css']\n})\nexport class DataContextDialogComponent {\n @Output() DialogClosed = new EventEmitter();\n\n /**\n * @deprecated Use {@link DialogClosed}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (dialogClosed) keeps working. Must stay AFTER DialogClosed: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() dialogClosed = this.DialogClosed;\n @Input() DataContextId!: string;\n\n /** @deprecated Use {@link DataContextId}. */\n @Input() set dataContextId(value: string) {\n this.DataContextId = value;\n }\n /** @deprecated Use {@link DataContextId}. */\n get dataContextId(): string {\n return this.DataContextId;\n }\n @Input() DataContextName?: string;\n\n /** @deprecated Use {@link DataContextName}. */\n @Input() set dataContextName(value: string | undefined) {\n this.DataContextName = value;\n }\n /** @deprecated Use {@link DataContextName}. */\n get dataContextName(): string | undefined {\n return this.DataContextName;\n }\n @Input() Provider: IMetadataProvider | null = null;\n \n public IsMaximized: boolean = false;\n\n /** @deprecated Use {@link IsMaximized}. */\n public get isMaximized(): boolean {\n return this.IsMaximized;\n }\n /** @deprecated Use {@link IsMaximized}. */\n public set isMaximized(value: boolean) {\n this.IsMaximized = value;\n }\n\n public get DialogWidth(): number {\n return this.IsMaximized ? window.innerWidth * 0.95 : 900;\n }\n\n /** @deprecated Use {@link DialogWidth}. */\n public get dialogWidth(): number {\n return this.DialogWidth;\n }\n\n public get DialogHeight(): number {\n return this.IsMaximized ? window.innerHeight * 0.95 : 700;\n }\n\n /** @deprecated Use {@link DialogHeight}. */\n public get dialogHeight(): number {\n return this.DialogHeight;\n }\n\n CloseDialog(): void {\n this.DialogClosed.emit();\n }\n\n /** @deprecated Use {@link CloseDialog}. */\n closeDialog(): void {\n return this.CloseDialog();\n }\n\n ToggleMaximize(): void {\n this.IsMaximized = !this.IsMaximized;\n }\n\n /** @deprecated Use {@link ToggleMaximize}. */\n toggleMaximize(): void {\n return this.ToggleMaximize();\n }\n}","<div class=\"data-context-dialog-wrapper\">\n <div class=\"k-overlay\"></div>\n <mj-window\n class=\"data-context-window\"\n [class.maximized]=\"isMaximized\"\n [Visible]=\"true\"\n [Width]=\"dialogWidth\"\n [Height]=\"dialogHeight\"\n [MinHeight]=\"400\"\n [MinWidth]=\"600\"\n [Resizable]=\"!isMaximized\"\n [Draggable]=\"!isMaximized\"\n (Close)=\"closeDialog()\">\n\n <mj-window-titlebar>\n <div class=\"window-title\">\n <i class=\"fa-solid fa-layer-group title-icon\"></i>\n <span>Data Context{{ dataContextName ? ': ' + dataContextName : '' }}</span>\n </div>\n <div class=\"window-actions\">\n <button\n (click)=\"toggleMaximize()\"\n title=\"{{ isMaximized ? 'Restore' : 'Maximize' }}\"\n class=\"window-action-btn\">\n <i class=\"fa-solid\" [class.fa-maximize]=\"!isMaximized\" [class.fa-compress]=\"isMaximized\"></i>\n </button>\n <button\n (click)=\"closeDialog()\"\n title=\"Close\"\n class=\"window-action-btn\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </mj-window-titlebar>\n\n <div class=\"dialog-content\">\n <mj-data-context\n [dataContextId]=\"dataContextId\"\n [Provider]=\"Provider\">\n </mj-data-context>\n </div>\n </mj-window>\n</div>"]}
@@ -3,40 +3,108 @@ import { IMetadataProvider } from '@memberjunction/core';
3
3
  import { MJDataContextEntity, MJDataContextItemEntity } from '@memberjunction/core-entities';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class DataContextComponent implements OnInit {
6
- dataContextId: string;
6
+ DataContextId: string;
7
+ /** @deprecated Use {@link DataContextId}. */
8
+ set dataContextId(value: string);
9
+ /** @deprecated Use {@link DataContextId}. */
10
+ get dataContextId(): string;
7
11
  Provider: IMetadataProvider | null;
8
12
  dataContextRecord?: MJDataContextEntity;
9
- dataContextItems: MJDataContextItemEntity[];
10
- showLoader: boolean;
13
+ DataContextItems: MJDataContextItemEntity[];
14
+ /** @deprecated Use {@link DataContextItems}. */
15
+ get dataContextItems(): MJDataContextItemEntity[];
16
+ /** @deprecated Use {@link DataContextItems}. */
17
+ set dataContextItems(value: MJDataContextItemEntity[]);
18
+ ShowLoader: boolean;
19
+ /** @deprecated Use {@link ShowLoader}. */
20
+ get showLoader(): boolean;
21
+ /** @deprecated Use {@link ShowLoader}. */
22
+ set showLoader(value: boolean);
11
23
  errorMessage: string;
12
- searchTerm: string;
13
- showSQLPreview: boolean;
14
- previewSQL: string;
15
- copiedField: string;
16
- expandedItems: {
24
+ SearchTerm: string;
25
+ /** @deprecated Use {@link SearchTerm}. */
26
+ get searchTerm(): string;
27
+ /** @deprecated Use {@link SearchTerm}. */
28
+ set searchTerm(value: string);
29
+ ShowSQLPreview: boolean;
30
+ /** @deprecated Use {@link ShowSQLPreview}. */
31
+ get showSQLPreview(): boolean;
32
+ /** @deprecated Use {@link ShowSQLPreview}. */
33
+ set showSQLPreview(value: boolean);
34
+ PreviewSQL: string;
35
+ /** @deprecated Use {@link PreviewSQL}. */
36
+ get previewSQL(): string;
37
+ /** @deprecated Use {@link PreviewSQL}. */
38
+ set previewSQL(value: string);
39
+ CopiedField: string;
40
+ /** @deprecated Use {@link CopiedField}. */
41
+ get copiedField(): string;
42
+ /** @deprecated Use {@link CopiedField}. */
43
+ set copiedField(value: string);
44
+ ExpandedItems: {
17
45
  [key: string]: boolean;
18
46
  };
47
+ /** @deprecated Use {@link ExpandedItems}. */
48
+ get expandedItems(): {
49
+ [key: string]: boolean;
50
+ };
51
+ /** @deprecated Use {@link ExpandedItems}. */
52
+ set expandedItems(value: {
53
+ [key: string]: boolean;
54
+ });
19
55
  get ProviderToUse(): IMetadataProvider;
56
+ get FilteredItems(): MJDataContextItemEntity[];
57
+ /** @deprecated Use {@link FilteredItems}. */
20
58
  get filteredItems(): MJDataContextItemEntity[];
59
+ get ItemCount(): number;
60
+ /** @deprecated Use {@link ItemCount}. */
21
61
  get itemCount(): number;
22
62
  ngOnInit(): void;
23
63
  LoadDataContext(dataContextId: string): Promise<void>;
64
+ GetTypeIcon(type: string): string;
65
+ /** @deprecated Use {@link GetTypeIcon}. */
24
66
  getTypeIcon(type: string): string;
67
+ GetTypeColor(type: string): string;
68
+ /** @deprecated Use {@link GetTypeColor}. */
25
69
  getTypeColor(type: string): string;
26
70
  getEntityName(entityId: string | null): string | undefined;
71
+ GetViewName(viewId: string): Promise<string | undefined>;
72
+ /** @deprecated Use {@link GetViewName}. */
27
73
  getViewName(viewId: string): Promise<string | undefined>;
74
+ GetQueryName(queryId: string): Promise<string | undefined>;
75
+ /** @deprecated Use {@link GetQueryName}. */
28
76
  getQueryName(queryId: string): Promise<string | undefined>;
77
+ OnSearchChange(): void;
78
+ /** @deprecated Use {@link OnSearchChange}. */
29
79
  onSearchChange(): void;
80
+ ToggleItemExpansion(itemId: string): void;
81
+ /** @deprecated Use {@link ToggleItemExpansion}. */
30
82
  toggleItemExpansion(itemId: string): void;
83
+ CopyToClipboard(text: string, fieldName: string): Promise<void>;
84
+ /** @deprecated Use {@link CopyToClipboard}. */
31
85
  copyToClipboard(text: string, fieldName: string): Promise<void>;
86
+ PreviewSQLCode(sql: string): void;
87
+ /** @deprecated Use {@link PreviewSQLCode}. */
32
88
  previewSQLCode(sql: string): void;
89
+ CloseSQLPreview(): void;
90
+ /** @deprecated Use {@link CloseSQLPreview}. */
33
91
  closeSQLPreview(): void;
92
+ NavigateToEntity(entityId: string): void;
93
+ /** @deprecated Use {@link NavigateToEntity}. */
34
94
  navigateToEntity(entityId: string): void;
95
+ NavigateToView(viewId: string): void;
96
+ /** @deprecated Use {@link NavigateToView}. */
35
97
  navigateToView(viewId: string): void;
98
+ NavigateToQuery(queryId: string): void;
99
+ /** @deprecated Use {@link NavigateToQuery}. */
36
100
  navigateToQuery(queryId: string): void;
101
+ Refresh(): Promise<void>;
102
+ /** @deprecated Use {@link Refresh}. */
37
103
  refresh(): Promise<void>;
104
+ ExportToCSV(): void;
105
+ /** @deprecated Use {@link ExportToCSV}. */
38
106
  exportToCSV(): void;
39
107
  static ɵfac: i0.ɵɵFactoryDeclaration<DataContextComponent, never>;
40
- static ɵcmp: i0.ɵɵComponentDeclaration<DataContextComponent, "mj-data-context", never, { "dataContextId": { "alias": "dataContextId"; "required": false; }; "Provider": { "alias": "Provider"; "required": false; }; }, {}, never, never, false, never>;
108
+ static ɵcmp: i0.ɵɵComponentDeclaration<DataContextComponent, "mj-data-context", never, { "DataContextId": { "alias": "DataContextId"; "required": false; }; "dataContextId": { "alias": "dataContextId"; "required": false; }; "Provider": { "alias": "Provider"; "required": false; }; }, {}, never, never, false, never>;
41
109
  }
42
110
  //# sourceMappingURL=ng-data-context.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-data-context.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-data-context.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAA+B,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;;AAE7F,qBAMa,oBAAqB,YAAW,MAAM;IACxC,aAAa,EAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAE5C,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;IACxC,gBAAgB,EAAE,uBAAuB,EAAE,CAAM;IACjD,UAAU,EAAE,OAAO,CAAS;IAC5B,YAAY,EAAE,MAAM,CAAM;IAC1B,UAAU,EAAE,MAAM,CAAM;IAGxB,cAAc,EAAE,OAAO,CAAS;IAChC,UAAU,EAAE,MAAM,CAAM;IACxB,WAAW,EAAE,MAAM,CAAM;IACzB,aAAa,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAM;IAEtD,IAAW,aAAa,IAAI,iBAAiB,CAE5C;IAED,IAAW,aAAa,IAAI,uBAAuB,EAAE,CAYpD;IAED,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,QAAQ,IAAI,IAAI;IAOV,eAAe,CAAC,aAAa,EAAE,MAAM;IAgCpC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYlC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS;IAMpD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAWxD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAWhE,cAAc,IAAI,IAAI;IAKtB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAInC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjC,eAAe,IAAI,IAAI;IAKvB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKpC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,WAAW,IAAI,IAAI;yCApLf,oBAAoB;2CAApB,oBAAoB;CA0MhC"}
1
+ {"version":3,"file":"ng-data-context.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-data-context.component.ts"],"names":[],"mappings":"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"}
@@ -314,38 +314,110 @@ function DataContextComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
314
314
  i0.ɵɵtextInterpolate1(" ", ctx_r1.copiedField === "preview-sql" ? "Copied!" : "Copy SQL", " ");
315
315
  } }
316
316
  export class DataContextComponent {
317
- dataContextId;
317
+ DataContextId;
318
+ /** @deprecated Use {@link DataContextId}. */
319
+ set dataContextId(value) {
320
+ this.DataContextId = value;
321
+ }
322
+ /** @deprecated Use {@link DataContextId}. */
323
+ get dataContextId() {
324
+ return this.DataContextId;
325
+ }
318
326
  Provider = null;
319
- dataContextRecord;
320
- dataContextItems = [];
321
- showLoader = false;
327
+ dataContextRecord; // case-violation-ok-legacy-back-compat: an accessor cannot be optional, so a stub would turn this into a required member
328
+ DataContextItems = [];
329
+ /** @deprecated Use {@link DataContextItems}. */
330
+ get dataContextItems() {
331
+ return this.DataContextItems;
332
+ }
333
+ /** @deprecated Use {@link DataContextItems}. */
334
+ set dataContextItems(value) {
335
+ this.DataContextItems = value;
336
+ }
337
+ ShowLoader = false;
338
+ /** @deprecated Use {@link ShowLoader}. */
339
+ get showLoader() {
340
+ return this.ShowLoader;
341
+ }
342
+ /** @deprecated Use {@link ShowLoader}. */
343
+ set showLoader(value) {
344
+ this.ShowLoader = value;
345
+ }
322
346
  errorMessage = '';
323
- searchTerm = '';
347
+ SearchTerm = '';
348
+ /** @deprecated Use {@link SearchTerm}. */
349
+ get searchTerm() {
350
+ return this.SearchTerm;
351
+ }
352
+ /** @deprecated Use {@link SearchTerm}. */
353
+ set searchTerm(value) {
354
+ this.SearchTerm = value;
355
+ }
324
356
  // UI state
325
- showSQLPreview = false;
326
- previewSQL = '';
327
- copiedField = '';
328
- expandedItems = {};
357
+ ShowSQLPreview = false;
358
+ /** @deprecated Use {@link ShowSQLPreview}. */
359
+ get showSQLPreview() {
360
+ return this.ShowSQLPreview;
361
+ }
362
+ /** @deprecated Use {@link ShowSQLPreview}. */
363
+ set showSQLPreview(value) {
364
+ this.ShowSQLPreview = value;
365
+ }
366
+ PreviewSQL = '';
367
+ /** @deprecated Use {@link PreviewSQL}. */
368
+ get previewSQL() {
369
+ return this.PreviewSQL;
370
+ }
371
+ /** @deprecated Use {@link PreviewSQL}. */
372
+ set previewSQL(value) {
373
+ this.PreviewSQL = value;
374
+ }
375
+ CopiedField = '';
376
+ /** @deprecated Use {@link CopiedField}. */
377
+ get copiedField() {
378
+ return this.CopiedField;
379
+ }
380
+ /** @deprecated Use {@link CopiedField}. */
381
+ set copiedField(value) {
382
+ this.CopiedField = value;
383
+ }
384
+ ExpandedItems = {};
385
+ /** @deprecated Use {@link ExpandedItems}. */
386
+ get expandedItems() {
387
+ return this.ExpandedItems;
388
+ }
389
+ /** @deprecated Use {@link ExpandedItems}. */
390
+ set expandedItems(value) {
391
+ this.ExpandedItems = value;
392
+ }
329
393
  get ProviderToUse() {
330
394
  return this.Provider ?? Metadata.Provider;
331
395
  }
332
- get filteredItems() {
333
- if (!this.searchTerm) {
334
- return this.dataContextItems;
396
+ get FilteredItems() {
397
+ if (!this.SearchTerm) {
398
+ return this.DataContextItems;
335
399
  }
336
- const term = this.searchTerm.toLowerCase();
337
- return this.dataContextItems.filter(item => item.Type?.toLowerCase().includes(term) ||
400
+ const term = this.SearchTerm.toLowerCase();
401
+ return this.DataContextItems.filter(item => item.Type?.toLowerCase().includes(term) ||
338
402
  item.SQL?.toLowerCase().includes(term) ||
339
403
  (item.EntityID ? this.getEntityName(item.EntityID)?.toLowerCase().includes(term) : false) ||
340
404
  item.Description?.toLowerCase().includes(term));
341
405
  }
406
+ /** @deprecated Use {@link FilteredItems}. */
407
+ get filteredItems() {
408
+ return this.FilteredItems;
409
+ }
410
+ get ItemCount() {
411
+ return this.FilteredItems.length;
412
+ }
413
+ /** @deprecated Use {@link ItemCount}. */
342
414
  get itemCount() {
343
- return this.filteredItems.length;
415
+ return this.ItemCount;
344
416
  }
345
417
  ngOnInit() {
346
- if (this.dataContextId) {
347
- this.showLoader = true;
348
- this.LoadDataContext(this.dataContextId);
418
+ if (this.DataContextId) {
419
+ this.ShowLoader = true;
420
+ this.LoadDataContext(this.DataContextId);
349
421
  }
350
422
  }
351
423
  async LoadDataContext(dataContextId) {
@@ -362,23 +434,23 @@ export class DataContextComponent {
362
434
  ResultType: 'entity_object'
363
435
  });
364
436
  if (response.Success) {
365
- this.dataContextItems = response.Results;
366
- this.showLoader = false;
437
+ this.DataContextItems = response.Results;
438
+ this.ShowLoader = false;
367
439
  }
368
440
  else {
369
441
  this.errorMessage = response.ErrorMessage || 'Failed to load data context items';
370
442
  LogError(response.ErrorMessage);
371
- this.showLoader = false;
443
+ this.ShowLoader = false;
372
444
  }
373
445
  }
374
446
  }
375
447
  catch (error) {
376
448
  this.errorMessage = 'An error occurred while loading the data context';
377
449
  LogError(error);
378
- this.showLoader = false;
450
+ this.ShowLoader = false;
379
451
  }
380
452
  }
381
- getTypeIcon(type) {
453
+ GetTypeIcon(type) {
382
454
  const typeIcons = {
383
455
  'sql': 'fa-solid fa-database',
384
456
  'view': 'fa-solid fa-table',
@@ -388,7 +460,11 @@ export class DataContextComponent {
388
460
  };
389
461
  return typeIcons[type?.toLowerCase()] || 'fa-solid fa-question';
390
462
  }
391
- getTypeColor(type) {
463
+ /** @deprecated Use {@link GetTypeIcon}. */
464
+ getTypeIcon(type) {
465
+ return this.GetTypeIcon(type);
466
+ }
467
+ GetTypeColor(type) {
392
468
  const typeColors = {
393
469
  'sql': '#2196f3',
394
470
  'view': '#4caf50',
@@ -398,13 +474,17 @@ export class DataContextComponent {
398
474
  };
399
475
  return typeColors[type?.toLowerCase()] || '#757575';
400
476
  }
477
+ /** @deprecated Use {@link GetTypeColor}. */
478
+ getTypeColor(type) {
479
+ return this.GetTypeColor(type);
480
+ }
401
481
  getEntityName(entityId) {
402
482
  if (!entityId)
403
483
  return undefined;
404
484
  const md = this.ProviderToUse;
405
485
  return md.Entities.find(e => UUIDsEqual(e.ID, entityId))?.Name;
406
486
  }
407
- async getViewName(viewId) {
487
+ async GetViewName(viewId) {
408
488
  try {
409
489
  const p = this.ProviderToUse;
410
490
  const view = await p.GetEntityObject("Views", p.CurrentUser);
@@ -415,7 +495,11 @@ export class DataContextComponent {
415
495
  return undefined;
416
496
  }
417
497
  }
418
- async getQueryName(queryId) {
498
+ /** @deprecated Use {@link GetViewName}. */
499
+ async getViewName(viewId) {
500
+ return this.GetViewName(viewId);
501
+ }
502
+ async GetQueryName(queryId) {
419
503
  try {
420
504
  const p = this.ProviderToUse;
421
505
  const query = await p.GetEntityObject("MJ: Queries", p.CurrentUser);
@@ -426,53 +510,93 @@ export class DataContextComponent {
426
510
  return undefined;
427
511
  }
428
512
  }
429
- onSearchChange() {
513
+ /** @deprecated Use {@link GetQueryName}. */
514
+ async getQueryName(queryId) {
515
+ return this.GetQueryName(queryId);
516
+ }
517
+ OnSearchChange() {
430
518
  // Reset expanded items when searching
431
- this.expandedItems = {};
519
+ this.ExpandedItems = {};
520
+ }
521
+ /** @deprecated Use {@link OnSearchChange}. */
522
+ onSearchChange() {
523
+ return this.OnSearchChange();
432
524
  }
525
+ ToggleItemExpansion(itemId) {
526
+ this.ExpandedItems[itemId] = !this.ExpandedItems[itemId];
527
+ }
528
+ /** @deprecated Use {@link ToggleItemExpansion}. */
433
529
  toggleItemExpansion(itemId) {
434
- this.expandedItems[itemId] = !this.expandedItems[itemId];
530
+ return this.ToggleItemExpansion(itemId);
435
531
  }
436
- async copyToClipboard(text, fieldName) {
532
+ async CopyToClipboard(text, fieldName) {
437
533
  try {
438
534
  await navigator.clipboard.writeText(text);
439
- this.copiedField = fieldName;
535
+ this.CopiedField = fieldName;
440
536
  setTimeout(() => {
441
- this.copiedField = '';
537
+ this.CopiedField = '';
442
538
  }, 2000);
443
539
  }
444
540
  catch (err) {
445
541
  LogError(`Failed to copy to clipboard: ${err}`);
446
542
  }
447
543
  }
544
+ /** @deprecated Use {@link CopyToClipboard}. */
545
+ async copyToClipboard(text, fieldName) {
546
+ return this.CopyToClipboard(text, fieldName);
547
+ }
548
+ PreviewSQLCode(sql) {
549
+ this.PreviewSQL = sql;
550
+ this.ShowSQLPreview = true;
551
+ }
552
+ /** @deprecated Use {@link PreviewSQLCode}. */
448
553
  previewSQLCode(sql) {
449
- this.previewSQL = sql;
450
- this.showSQLPreview = true;
554
+ return this.PreviewSQLCode(sql);
555
+ }
556
+ CloseSQLPreview() {
557
+ this.ShowSQLPreview = false;
558
+ this.PreviewSQL = '';
451
559
  }
560
+ /** @deprecated Use {@link CloseSQLPreview}. */
452
561
  closeSQLPreview() {
453
- this.showSQLPreview = false;
454
- this.previewSQL = '';
562
+ return this.CloseSQLPreview();
455
563
  }
456
- navigateToEntity(entityId) {
564
+ NavigateToEntity(entityId) {
457
565
  // This would be implemented based on your navigation system
458
566
  console.log('Navigate to entity:', entityId);
459
567
  }
460
- navigateToView(viewId) {
568
+ /** @deprecated Use {@link NavigateToEntity}. */
569
+ navigateToEntity(entityId) {
570
+ return this.NavigateToEntity(entityId);
571
+ }
572
+ NavigateToView(viewId) {
461
573
  // This would be implemented based on your navigation system
462
574
  console.log('Navigate to view:', viewId);
463
575
  }
464
- navigateToQuery(queryId) {
576
+ /** @deprecated Use {@link NavigateToView}. */
577
+ navigateToView(viewId) {
578
+ return this.NavigateToView(viewId);
579
+ }
580
+ NavigateToQuery(queryId) {
465
581
  // This would be implemented based on your navigation system
466
582
  console.log('Navigate to query:', queryId);
467
583
  }
584
+ /** @deprecated Use {@link NavigateToQuery}. */
585
+ navigateToQuery(queryId) {
586
+ return this.NavigateToQuery(queryId);
587
+ }
588
+ async Refresh() {
589
+ this.ShowLoader = true;
590
+ await this.LoadDataContext(this.DataContextId);
591
+ }
592
+ /** @deprecated Use {@link Refresh}. */
468
593
  async refresh() {
469
- this.showLoader = true;
470
- await this.LoadDataContext(this.dataContextId);
594
+ return this.Refresh();
471
595
  }
472
- exportToCSV() {
596
+ ExportToCSV() {
473
597
  // Implement CSV export functionality
474
598
  const headers = ['Type', 'SQL', 'View', 'Query', 'Entity', 'Record ID', 'Description'];
475
- const rows = this.filteredItems.map(item => [
599
+ const rows = this.FilteredItems.map(item => [
476
600
  item.Type,
477
601
  item.SQL,
478
602
  item.ViewID,
@@ -486,12 +610,16 @@ export class DataContextComponent {
486
610
  const url = window.URL.createObjectURL(blob);
487
611
  const a = document.createElement('a');
488
612
  a.href = url;
489
- a.download = `data-context-${this.dataContextRecord?.Name || this.dataContextId}.csv`;
613
+ a.download = `data-context-${this.dataContextRecord?.Name || this.DataContextId}.csv`;
490
614
  a.click();
491
615
  window.URL.revokeObjectURL(url);
492
616
  }
617
+ /** @deprecated Use {@link ExportToCSV}. */
618
+ exportToCSV() {
619
+ return this.ExportToCSV();
620
+ }
493
621
  static ɵfac = function DataContextComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DataContextComponent)(); };
494
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataContextComponent, selectors: [["mj-data-context"]], inputs: { dataContextId: "dataContextId", Provider: "Provider" }, standalone: false, decls: 4, vars: 2, consts: [[1, "data-context-viewer"], [1, "loading-container"], [1, "sql-preview-overlay"], ["text", "Loading data context...", "size", "large"], [1, "data-context-header"], [1, "header-info"], [1, "header-title"], [1, "fa-solid", "fa-layer-group", "header-icon"], [1, "header-description"], [1, "header-meta"], [1, "meta-item"], [1, "fa-solid", "fa-fingerprint"], ["title", "Copy ID", 1, "copy-btn", 3, "click"], [1, "fa-solid"], [1, "fa-solid", "fa-list-ol"], [1, "header-actions"], ["mjButton", "", "variant", "flat", "title", "Refresh", 3, "click"], [1, "fa-solid", "fa-rotate"], ["mjButton", "", "variant", "flat", "title", "Export to CSV", 3, "click"], [1, "fa-solid", "fa-download"], [1, "error-message"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-magnifying-glass", "search-icon"], ["placeholder", "Search items by type, SQL, entity name, or description...", 1, "mj-input", "search-input", 3, "ngModelChange", "ngModel"], [1, "items-container"], [1, "data-context-card", 3, "expanded"], [3, "Variant", "Icon", "Title", "Message"], [1, "fa-solid", "fa-circle-exclamation"], [1, "data-context-card"], [1, "card-header", 3, "click"], [1, "card-header-left"], [1, "type-badge"], [1, "card-description"], [1, "expand-btn"], [1, "card-content"], [1, "sql-section"], [1, "metadata-section"], [1, "metadata-grid"], [1, "metadata-item"], [1, "card-footer"], [1, "timestamp"], [1, "fa-solid", "fa-clock"], [1, "section-header"], [1, "fa-solid", "fa-code"], [1, "sql-actions"], ["title", "Copy SQL", 1, "action-btn", 3, "click"], ["title", "Expand", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-expand"], [1, "sql-code"], [1, "metadata-label"], [1, "metadata-value"], ["title", "View entity", 1, "link-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [3, "title"], ["title", "View details", 1, "link-btn", 3, "click"], ["title", "View query", 1, "link-btn", 3, "click"], ["title", "Copy", 1, "link-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "sql-preview-overlay", 3, "click"], [1, "sql-preview-dialog", 3, "click"], [1, "sql-preview-header"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "sql-preview-content"], [1, "sql-preview-actions"], ["mjButton", "", 3, "click"]], template: function DataContextComponent_Template(rf, ctx) { if (rf & 1) {
622
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataContextComponent, selectors: [["mj-data-context"]], inputs: { DataContextId: "DataContextId", dataContextId: "dataContextId", Provider: "Provider" }, standalone: false, decls: 4, vars: 2, consts: [[1, "data-context-viewer"], [1, "loading-container"], [1, "sql-preview-overlay"], ["text", "Loading data context...", "size", "large"], [1, "data-context-header"], [1, "header-info"], [1, "header-title"], [1, "fa-solid", "fa-layer-group", "header-icon"], [1, "header-description"], [1, "header-meta"], [1, "meta-item"], [1, "fa-solid", "fa-fingerprint"], ["title", "Copy ID", 1, "copy-btn", 3, "click"], [1, "fa-solid"], [1, "fa-solid", "fa-list-ol"], [1, "header-actions"], ["mjButton", "", "variant", "flat", "title", "Refresh", 3, "click"], [1, "fa-solid", "fa-rotate"], ["mjButton", "", "variant", "flat", "title", "Export to CSV", 3, "click"], [1, "fa-solid", "fa-download"], [1, "error-message"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-magnifying-glass", "search-icon"], ["placeholder", "Search items by type, SQL, entity name, or description...", 1, "mj-input", "search-input", 3, "ngModelChange", "ngModel"], [1, "items-container"], [1, "data-context-card", 3, "expanded"], [3, "Variant", "Icon", "Title", "Message"], [1, "fa-solid", "fa-circle-exclamation"], [1, "data-context-card"], [1, "card-header", 3, "click"], [1, "card-header-left"], [1, "type-badge"], [1, "card-description"], [1, "expand-btn"], [1, "card-content"], [1, "sql-section"], [1, "metadata-section"], [1, "metadata-grid"], [1, "metadata-item"], [1, "card-footer"], [1, "timestamp"], [1, "fa-solid", "fa-clock"], [1, "section-header"], [1, "fa-solid", "fa-code"], [1, "sql-actions"], ["title", "Copy SQL", 1, "action-btn", 3, "click"], ["title", "Expand", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-expand"], [1, "sql-code"], [1, "metadata-label"], [1, "metadata-value"], ["title", "View entity", 1, "link-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [3, "title"], ["title", "View details", 1, "link-btn", 3, "click"], ["title", "View query", 1, "link-btn", 3, "click"], ["title", "Copy", 1, "link-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "sql-preview-overlay", 3, "click"], [1, "sql-preview-dialog", 3, "click"], [1, "sql-preview-header"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "sql-preview-content"], [1, "sql-preview-actions"], ["mjButton", "", 3, "click"]], template: function DataContextComponent_Template(rf, ctx) { if (rf & 1) {
495
623
  i0.ɵɵelementStart(0, "div", 0);
496
624
  i0.ɵɵconditionalCreate(1, DataContextComponent_Conditional_1_Template, 2, 0, "div", 1)(2, DataContextComponent_Conditional_2_Template, 32, 12);
497
625
  i0.ɵɵconditionalCreate(3, DataContextComponent_Conditional_3_Template, 15, 6, "div", 2);
@@ -506,7 +634,9 @@ export class DataContextComponent {
506
634
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataContextComponent, [{
507
635
  type: Component,
508
636
  args: [{ standalone: false, selector: 'mj-data-context', template: "<div class=\"data-context-viewer\">\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading data context...\" size=\"large\"></mj-loading>\n </div>\n } @else {\n <!-- Header Section -->\n <div class=\"data-context-header\">\n <div class=\"header-info\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-layer-group header-icon\"></i>\n <h2>{{ dataContextRecord?.Name || 'Data Context' }}</h2>\n </div>\n @if (dataContextRecord && dataContextRecord.Description) {\n <p class=\"header-description\">{{ dataContextRecord.Description }}</p>\n }\n <div class=\"header-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n ID: {{ dataContextRecord?.ID }}\n <button class=\"copy-btn\" (click)=\"copyToClipboard(dataContextRecord?.ID || '', 'context-id')\" title=\"Copy ID\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'context-id'\" [class.fa-check]=\"copiedField === 'context-id'\"></i>\n </button>\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ itemCount }} {{ itemCount === 1 ? 'item' : 'items' }}\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n <button mjButton variant=\"flat\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Refresh\n </button>\n <button mjButton variant=\"flat\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i>\n Export\n </button>\n </div>\n </div>\n\n @if (errorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ errorMessage }}\n </div>\n }\n\n <!-- Search Bar -->\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search items by type, SQL, entity name, or description...\"\n />\n </div>\n </div>\n\n <!-- Data Context Items as Cards -->\n <div class=\"items-container\">\n @for (item of filteredItems; track item.ID; let i = $index) {\n <div class=\"data-context-card\" [class.expanded]=\"expandedItems[item.ID]\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleItemExpansion(item.ID)\">\n <div class=\"card-header-left\">\n <div class=\"type-badge\" [style.background-color]=\"getTypeColor(item.Type) + '20'\" [style.color]=\"getTypeColor(item.Type)\">\n <i [class]=\"getTypeIcon(item.Type)\"></i>\n <span>{{ item.Type }}</span>\n </div>\n @if (item.Description) {\n <span class=\"card-description\">{{ item.Description }}</span>\n }\n </div>\n <button class=\"expand-btn\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!expandedItems[item.ID]\" [class.fa-chevron-up]=\"expandedItems[item.ID]\"></i>\n </button>\n </div>\n\n <!-- Card Content -->\n <div class=\"card-content\">\n <!-- SQL Section -->\n @if (item.SQL) {\n <div class=\"sql-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-code\"></i> SQL Query</h4>\n <div class=\"sql-actions\">\n <button class=\"action-btn\" (click)=\"copyToClipboard(item.SQL, 'sql-' + item.ID)\" title=\"Copy SQL\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'sql-' + item.ID\" [class.fa-check]=\"copiedField === 'sql-' + item.ID\"></i>\n {{ copiedField === 'sql-' + item.ID ? 'Copied!' : 'Copy' }}\n </button>\n <button class=\"action-btn\" (click)=\"previewSQLCode(item.SQL)\" title=\"Expand\">\n <i class=\"fa-solid fa-expand\"></i>\n Expand\n </button>\n </div>\n </div>\n <pre class=\"sql-code\"><code>{{ item.SQL }}</code></pre>\n </div>\n }\n\n <!-- Metadata Section -->\n <div class=\"metadata-section\">\n <div class=\"metadata-grid\">\n @if (item.EntityID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Entity</span>\n <div class=\"metadata-value\">\n <span>{{ getEntityName(item.EntityID) || 'Unknown' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToEntity(item.EntityID)\" title=\"View entity\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.ViewID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">View</span>\n <div class=\"metadata-value\">\n <span title=\"{{ item.ViewID }}\">{{ item.ViewID | slice:0:20 }}{{ item.ViewID.length > 20 ? '...' : '' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToView(item.ViewID)\" title=\"View details\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.QueryID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Query</span>\n <div class=\"metadata-value\">\n <span title=\"{{ item.QueryID }}\">{{ item.QueryID | slice:0:20 }}{{ item.QueryID.length > 20 ? '...' : '' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToQuery(item.QueryID)\" title=\"View query\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.RecordID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Record ID</span>\n <div class=\"metadata-value\">\n <code>{{ item.RecordID }}</code>\n <button class=\"link-btn\" (click)=\"copyToClipboard(item.RecordID, 'record-' + item.ID)\" title=\"Copy\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'record-' + item.ID\" [class.fa-check]=\"copiedField === 'record-' + item.ID\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"card-footer\">\n <span class=\"timestamp\">\n <i class=\"fa-solid fa-clock\"></i>\n Created {{ item.__mj_CreatedAt | date:'short' }}\n </span>\n @if (item.__mj_UpdatedAt && item.__mj_UpdatedAt !== item.__mj_CreatedAt) {\n <span class=\"timestamp\">\n <i class=\"fa-solid fa-pen\"></i>\n Updated {{ item.__mj_UpdatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n @if (filteredItems.length === 0) {\n <mj-empty-state\n [Variant]=\"searchTerm ? 'no-results' : 'empty'\"\n [Icon]=\"searchTerm ? 'fa-solid fa-magnifying-glass' : 'fa-solid fa-inbox'\"\n [Title]=\"searchTerm ? 'No matching items' : 'No items found'\"\n [Message]=\"searchTerm ? 'Try a different search term.' : ''\" />\n }\n </div>\n }\n\n <!-- SQL Preview Dialog -->\n @if (showSQLPreview) {\n <div class=\"sql-preview-overlay\" (click)=\"closeSQLPreview()\">\n <div class=\"sql-preview-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"sql-preview-header\">\n <h3>SQL Preview</h3>\n <button class=\"close-btn\" (click)=\"closeSQLPreview()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sql-preview-content\">\n <pre><code>{{ previewSQL }}</code></pre>\n </div>\n <div class=\"sql-preview-actions\">\n <button mjButton (click)=\"copyToClipboard(previewSQL, 'preview-sql')\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'preview-sql'\" [class.fa-check]=\"copiedField === 'preview-sql'\"></i>\n {{ copiedField === 'preview-sql' ? 'Copied!' : 'Copy SQL' }}\n </button>\n </div>\n </div>\n </div>\n }\n</div>", styles: [".data-context-viewer {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n min-height: 0;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 400px;\n}\n\n.loading-text {\n margin-top: 16px;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n}\n\n/* Header Section */\n.data-context-header {\n background-color: var(--mj-bg-surface);\n padding: 24px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 24px;\n flex-shrink: 0;\n}\n\n.header-info {\n flex: 1;\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.header-icon {\n font-size: var(--mj-text-2xl);\n color: var(--mj-brand-primary);\n}\n\n.header-title h2 {\n margin: 0;\n font-size: var(--mj-text-2xl);\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.header-description {\n margin: 8px 0 16px 0;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n line-height: 1.5;\n}\n\n.header-meta {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.meta-item {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.meta-item i {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n}\n\n.copy-btn {\n background: none;\n border: none;\n padding: 4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n margin-left: 4px;\n}\n\n.copy-btn:hover {\n color: var(--mj-brand-primary);\n}\n\n.copy-btn .fa-check {\n color: var(--mj-status-success);\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n/* Error Message */\n.error-message {\n background-color: var(--mj-status-error-subtle);\n color: var(--mj-status-error);\n padding: 12px 16px;\n margin: 16px 24px;\n border-radius: var(--mj-radius-sm);\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: var(--mj-text-sm);\n}\n\n.error-message i {\n font-size: var(--mj-text-base);\n}\n\n/* Search Container */\n.search-container {\n padding: 16px 24px;\n background-color: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.search-input {\n width: 100%;\n}\n\n.search-icon {\n color: var(--mj-text-disabled);\n margin-right: 8px;\n}\n\n/* Items Container */\n.items-container {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n}\n\n/* Data Context Card */\n.data-context-card {\n background-color: var(--mj-bg-surface);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n margin-bottom: 16px;\n transition: all 0.3s ease;\n overflow: hidden;\n}\n\n.data-context-card:hover {\n box-shadow: var(--mj-shadow-md);\n}\n\n.data-context-card.expanded {\n box-shadow: var(--mj-shadow-lg);\n}\n\n/* Card Header */\n.card-header {\n padding: 20px 24px;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n transition: background-color 0.2s;\n gap: 16px;\n}\n\n.card-header:hover {\n background-color: var(--mj-bg-surface-card);\n}\n\n.card-header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n}\n\n.type-badge {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-radius: 20px;\n font-size: var(--mj-text-sm);\n font-weight: 500;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.type-badge i {\n font-size: var(--mj-text-sm);\n}\n\n.card-description {\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n flex: 1;\n line-height: 1.4;\n word-wrap: break-word;\n overflow-wrap: break-word;\n}\n\n.expand-btn {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n font-size: var(--mj-text-base);\n flex-shrink: 0;\n margin-top: -4px; /* Align with top of content */\n}\n\n.expand-btn:hover {\n color: var(--mj-brand-primary);\n}\n\n/* Card Content */\n.card-content {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease;\n}\n\n.data-context-card.expanded .card-content {\n max-height: 2000px;\n}\n\n/* SQL Section */\n.sql-section {\n padding: 0 24px 20px;\n}\n\n.section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.section-header h4 {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: 500;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.section-header h4 i {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.sql-actions {\n display: flex;\n gap: 8px;\n}\n\n.action-btn {\n background-color: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 6px 12px;\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.action-btn:hover {\n background-color: var(--mj-brand-primary-subtle);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.action-btn .fa-check {\n color: var(--mj-status-success);\n}\n\n.sql-code {\n background-color: var(--mj-bg-surface-card);\n padding: 16px;\n border-radius: var(--mj-radius-md);\n margin: 0;\n overflow-x: auto;\n border: 1px solid var(--mj-border-default);\n}\n\n.sql-code code {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: var(--mj-text-sm);\n line-height: 1.6;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n/* Metadata Section */\n.metadata-section {\n padding: 0 24px 20px;\n}\n\n.metadata-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.metadata-item {\n background-color: var(--mj-bg-surface-card);\n padding: 12px;\n border-radius: var(--mj-radius-md);\n border: 1px solid var(--mj-border-default);\n}\n\n.metadata-label {\n display: block;\n font-size: var(--mj-text-xs);\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n margin-bottom: 6px;\n}\n\n.metadata-value {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n}\n\n.metadata-value code {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: var(--mj-text-sm);\n background-color: var(--mj-bg-surface);\n padding: 2px 6px;\n border-radius: var(--mj-radius-sm);\n border: 1px solid var(--mj-border-default);\n}\n\n.link-btn {\n background: none;\n border: none;\n padding: 4px 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.2s;\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-sm);\n}\n\n.link-btn:hover {\n color: var(--mj-brand-primary);\n background-color: var(--mj-brand-primary-subtle);\n}\n\n.link-btn .fa-check {\n color: var(--mj-status-success);\n}\n\n/* Card Footer */\n.card-footer {\n padding: 16px 24px;\n background-color: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 20px;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n}\n\n.timestamp {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.timestamp i {\n font-size: 11px;\n}\n\n/* SQL Preview Modal */\n.sql-preview-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.sql-preview-dialog {\n background-color: var(--mj-bg-surface);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n width: 90%;\n max-width: 1000px;\n max-height: 80vh;\n display: flex;\n flex-direction: column;\n}\n\n.sql-preview-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.sql-preview-header h3 {\n margin: 0;\n font-size: var(--mj-text-lg);\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.close-btn {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: color 0.2s;\n font-size: var(--mj-text-lg);\n}\n\n.close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.sql-preview-content {\n flex: 1;\n overflow: auto;\n padding: 24px;\n background-color: var(--mj-bg-surface-card);\n}\n\n.sql-preview-content pre {\n margin: 0;\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n.sql-preview-content code {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n font-size: var(--mj-text-base);\n color: var(--mj-text-primary);\n line-height: 1.6;\n}\n\n.sql-preview-actions {\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: flex-end;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .data-context-header {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-actions {\n width: 100%;\n justify-content: flex-start;\n }\n\n .items-container {\n padding: 16px;\n }\n\n .card-header {\n padding: 16px;\n }\n\n .sql-section,\n .metadata-section {\n padding: 0 16px 16px;\n }\n\n .metadata-grid {\n grid-template-columns: 1fr;\n }\n\n .sql-preview-dialog {\n width: 95%;\n margin: 16px;\n }\n}\n"] }]
509
- }], null, { dataContextId: [{
637
+ }], null, { DataContextId: [{
638
+ type: Input
639
+ }], dataContextId: [{
510
640
  type: Input
511
641
  }], Provider: [{
512
642
  type: Input
@@ -1 +1 @@
1
- {"version":3,"file":"ng-data-context.component.js","sourceRoot":"","sources":["../../src/lib/ng-data-context.component.ts","../../src/lib/ng-data-context.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\nimport { IMetadataProvider, LogError, Metadata, RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJDataContextEntity, MJDataContextItemEntity } from '@memberjunction/core-entities';\n\n@Component({\n standalone: false,\n selector: 'mj-data-context',\n templateUrl: './ng-data-context.component.html',\n styleUrls: ['./ng-data-context.component.css']\n})\nexport class DataContextComponent implements OnInit {\n @Input() dataContextId!: string;\n @Input() Provider: IMetadataProvider | null = null;\n \n public dataContextRecord?: MJDataContextEntity;\n public dataContextItems: MJDataContextItemEntity[] = [];\n public showLoader: boolean = false;\n public errorMessage: string = '';\n public searchTerm: string = '';\n \n // UI state\n public showSQLPreview: boolean = false;\n public previewSQL: string = '';\n public copiedField: string = '';\n public expandedItems: { [key: string]: boolean } = {};\n\n public get ProviderToUse(): IMetadataProvider {\n return this.Provider ?? Metadata.Provider;\n }\n\n public get filteredItems(): MJDataContextItemEntity[] {\n if (!this.searchTerm) {\n return this.dataContextItems;\n }\n \n const term = this.searchTerm.toLowerCase();\n return this.dataContextItems.filter(item => \n item.Type?.toLowerCase().includes(term) ||\n item.SQL?.toLowerCase().includes(term) ||\n (item.EntityID ? this.getEntityName(item.EntityID)?.toLowerCase().includes(term) : false) ||\n item.Description?.toLowerCase().includes(term)\n );\n }\n\n public get itemCount(): number {\n return this.filteredItems.length;\n }\n\n ngOnInit(): void {\n if(this.dataContextId){\n this.showLoader = true;\n this.LoadDataContext(this.dataContextId);\n }\n }\n\n async LoadDataContext(dataContextId: string) {\n try {\n if (dataContextId) {\n const p = this.ProviderToUse;\n this.dataContextRecord = await p.GetEntityObject<MJDataContextEntity>(\"MJ: Data Contexts\", p.CurrentUser);\n await this.dataContextRecord.Load(dataContextId);\n\n const rv = RunView.FromMetadataProvider(p);\n const response = await rv.RunView<MJDataContextItemEntity>(\n { \n EntityName: \"MJ: Data Context Items\", \n ExtraFilter: `DataContextID='${dataContextId}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n });\n \n if(response.Success){\n this.dataContextItems = response.Results;\n this.showLoader = false;\n } else {\n this.errorMessage = response.ErrorMessage || 'Failed to load data context items';\n LogError(response.ErrorMessage);\n this.showLoader = false;\n }\n }\n } catch (error) {\n this.errorMessage = 'An error occurred while loading the data context';\n LogError(error);\n this.showLoader = false;\n }\n }\n\n public getTypeIcon(type: string): string {\n const typeIcons: Record<string, string> = {\n 'sql': 'fa-solid fa-database',\n 'view': 'fa-solid fa-table',\n 'query': 'fa-solid fa-magnifying-glass',\n 'entity': 'fa-solid fa-cube',\n 'record': 'fa-solid fa-file'\n };\n \n return typeIcons[type?.toLowerCase()] || 'fa-solid fa-question';\n }\n\n public getTypeColor(type: string): string {\n const typeColors: Record<string, string> = {\n 'sql': '#2196f3',\n 'view': '#4caf50',\n 'query': '#ff9800',\n 'entity': '#9c27b0',\n 'record': '#f44336'\n };\n \n return typeColors[type?.toLowerCase()] || '#757575';\n }\n\n public getEntityName(entityId: string | null): string | undefined {\n if (!entityId) return undefined;\n const md = this.ProviderToUse;\n return md.Entities.find(e => UUIDsEqual(e.ID, entityId))?.Name;\n }\n\n public async getViewName(viewId: string): Promise<string | undefined> {\n try {\n const p = this.ProviderToUse;\n const view = await p.GetEntityObject(\"Views\", p.CurrentUser);\n await (view as any).Load(viewId);\n return (view as any).Get('Name');\n } catch {\n return undefined;\n }\n }\n\n public async getQueryName(queryId: string): Promise<string | undefined> {\n try {\n const p = this.ProviderToUse;\n const query = await p.GetEntityObject(\"MJ: Queries\", p.CurrentUser);\n await (query as any).Load(queryId);\n return (query as any).Get('Name');\n } catch {\n return undefined;\n }\n }\n\n public onSearchChange(): void {\n // Reset expanded items when searching\n this.expandedItems = {};\n }\n\n public toggleItemExpansion(itemId: string): void {\n this.expandedItems[itemId] = !this.expandedItems[itemId];\n }\n\n public async copyToClipboard(text: string, fieldName: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.copiedField = fieldName;\n setTimeout(() => {\n this.copiedField = '';\n }, 2000);\n } catch (err) {\n LogError(`Failed to copy to clipboard: ${err}`);\n }\n }\n\n public previewSQLCode(sql: string): void {\n this.previewSQL = sql;\n this.showSQLPreview = true;\n }\n\n public closeSQLPreview(): void {\n this.showSQLPreview = false;\n this.previewSQL = '';\n }\n\n public navigateToEntity(entityId: string): void {\n // This would be implemented based on your navigation system\n console.log('Navigate to entity:', entityId);\n }\n\n public navigateToView(viewId: string): void {\n // This would be implemented based on your navigation system\n console.log('Navigate to view:', viewId);\n }\n\n public navigateToQuery(queryId: string): void {\n // This would be implemented based on your navigation system\n console.log('Navigate to query:', queryId);\n }\n\n public async refresh(): Promise<void> {\n this.showLoader = true;\n await this.LoadDataContext(this.dataContextId);\n }\n\n public exportToCSV(): void {\n // Implement CSV export functionality\n const headers = ['Type', 'SQL', 'View', 'Query', 'Entity', 'Record ID', 'Description'];\n const rows = this.filteredItems.map(item => [\n item.Type,\n item.SQL,\n item.ViewID,\n item.QueryID,\n this.getEntityName(item.EntityID) || item.EntityID,\n item.RecordID,\n item.Description || ''\n ]);\n \n const csv = [headers, ...rows].map(row => row.map(cell => `\"${cell}\"`).join(',')).join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `data-context-${this.dataContextRecord?.Name || this.dataContextId}.csv`;\n a.click();\n window.URL.revokeObjectURL(url);\n }\n}","<div class=\"data-context-viewer\">\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading data context...\" size=\"large\"></mj-loading>\n </div>\n } @else {\n <!-- Header Section -->\n <div class=\"data-context-header\">\n <div class=\"header-info\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-layer-group header-icon\"></i>\n <h2>{{ dataContextRecord?.Name || 'Data Context' }}</h2>\n </div>\n @if (dataContextRecord && dataContextRecord.Description) {\n <p class=\"header-description\">{{ dataContextRecord.Description }}</p>\n }\n <div class=\"header-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n ID: {{ dataContextRecord?.ID }}\n <button class=\"copy-btn\" (click)=\"copyToClipboard(dataContextRecord?.ID || '', 'context-id')\" title=\"Copy ID\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'context-id'\" [class.fa-check]=\"copiedField === 'context-id'\"></i>\n </button>\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ itemCount }} {{ itemCount === 1 ? 'item' : 'items' }}\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n <button mjButton variant=\"flat\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Refresh\n </button>\n <button mjButton variant=\"flat\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i>\n Export\n </button>\n </div>\n </div>\n\n @if (errorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ errorMessage }}\n </div>\n }\n\n <!-- Search Bar -->\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search items by type, SQL, entity name, or description...\"\n />\n </div>\n </div>\n\n <!-- Data Context Items as Cards -->\n <div class=\"items-container\">\n @for (item of filteredItems; track item.ID; let i = $index) {\n <div class=\"data-context-card\" [class.expanded]=\"expandedItems[item.ID]\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleItemExpansion(item.ID)\">\n <div class=\"card-header-left\">\n <div class=\"type-badge\" [style.background-color]=\"getTypeColor(item.Type) + '20'\" [style.color]=\"getTypeColor(item.Type)\">\n <i [class]=\"getTypeIcon(item.Type)\"></i>\n <span>{{ item.Type }}</span>\n </div>\n @if (item.Description) {\n <span class=\"card-description\">{{ item.Description }}</span>\n }\n </div>\n <button class=\"expand-btn\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!expandedItems[item.ID]\" [class.fa-chevron-up]=\"expandedItems[item.ID]\"></i>\n </button>\n </div>\n\n <!-- Card Content -->\n <div class=\"card-content\">\n <!-- SQL Section -->\n @if (item.SQL) {\n <div class=\"sql-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-code\"></i> SQL Query</h4>\n <div class=\"sql-actions\">\n <button class=\"action-btn\" (click)=\"copyToClipboard(item.SQL, 'sql-' + item.ID)\" title=\"Copy SQL\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'sql-' + item.ID\" [class.fa-check]=\"copiedField === 'sql-' + item.ID\"></i>\n {{ copiedField === 'sql-' + item.ID ? 'Copied!' : 'Copy' }}\n </button>\n <button class=\"action-btn\" (click)=\"previewSQLCode(item.SQL)\" title=\"Expand\">\n <i class=\"fa-solid fa-expand\"></i>\n Expand\n </button>\n </div>\n </div>\n <pre class=\"sql-code\"><code>{{ item.SQL }}</code></pre>\n </div>\n }\n\n <!-- Metadata Section -->\n <div class=\"metadata-section\">\n <div class=\"metadata-grid\">\n @if (item.EntityID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Entity</span>\n <div class=\"metadata-value\">\n <span>{{ getEntityName(item.EntityID) || 'Unknown' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToEntity(item.EntityID)\" title=\"View entity\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.ViewID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">View</span>\n <div class=\"metadata-value\">\n <span title=\"{{ item.ViewID }}\">{{ item.ViewID | slice:0:20 }}{{ item.ViewID.length > 20 ? '...' : '' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToView(item.ViewID)\" title=\"View details\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.QueryID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Query</span>\n <div class=\"metadata-value\">\n <span title=\"{{ item.QueryID }}\">{{ item.QueryID | slice:0:20 }}{{ item.QueryID.length > 20 ? '...' : '' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToQuery(item.QueryID)\" title=\"View query\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.RecordID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Record ID</span>\n <div class=\"metadata-value\">\n <code>{{ item.RecordID }}</code>\n <button class=\"link-btn\" (click)=\"copyToClipboard(item.RecordID, 'record-' + item.ID)\" title=\"Copy\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'record-' + item.ID\" [class.fa-check]=\"copiedField === 'record-' + item.ID\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"card-footer\">\n <span class=\"timestamp\">\n <i class=\"fa-solid fa-clock\"></i>\n Created {{ item.__mj_CreatedAt | date:'short' }}\n </span>\n @if (item.__mj_UpdatedAt && item.__mj_UpdatedAt !== item.__mj_CreatedAt) {\n <span class=\"timestamp\">\n <i class=\"fa-solid fa-pen\"></i>\n Updated {{ item.__mj_UpdatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n @if (filteredItems.length === 0) {\n <mj-empty-state\n [Variant]=\"searchTerm ? 'no-results' : 'empty'\"\n [Icon]=\"searchTerm ? 'fa-solid fa-magnifying-glass' : 'fa-solid fa-inbox'\"\n [Title]=\"searchTerm ? 'No matching items' : 'No items found'\"\n [Message]=\"searchTerm ? 'Try a different search term.' : ''\" />\n }\n </div>\n }\n\n <!-- SQL Preview Dialog -->\n @if (showSQLPreview) {\n <div class=\"sql-preview-overlay\" (click)=\"closeSQLPreview()\">\n <div class=\"sql-preview-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"sql-preview-header\">\n <h3>SQL Preview</h3>\n <button class=\"close-btn\" (click)=\"closeSQLPreview()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sql-preview-content\">\n <pre><code>{{ previewSQL }}</code></pre>\n </div>\n <div class=\"sql-preview-actions\">\n <button mjButton (click)=\"copyToClipboard(previewSQL, 'preview-sql')\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'preview-sql'\" [class.fa-check]=\"copiedField === 'preview-sql'\"></i>\n {{ copiedField === 'preview-sql' ? 'Copied!' : 'Copy SQL' }}\n </button>\n </div>\n </div>\n </div>\n }\n</div>"]}
1
+ {"version":3,"file":"ng-data-context.component.js","sourceRoot":"","sources":["../../src/lib/ng-data-context.component.ts","../../src/lib/ng-data-context.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\nimport { IMetadataProvider, LogError, Metadata, RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJDataContextEntity, MJDataContextItemEntity } from '@memberjunction/core-entities';\n\n@Component({\n standalone: false,\n selector: 'mj-data-context',\n templateUrl: './ng-data-context.component.html',\n styleUrls: ['./ng-data-context.component.css']\n})\nexport class DataContextComponent implements OnInit {\n @Input() DataContextId!: string;\n\n /** @deprecated Use {@link DataContextId}. */\n @Input() set dataContextId(value: string) {\n this.DataContextId = value;\n }\n /** @deprecated Use {@link DataContextId}. */\n get dataContextId(): string {\n return this.DataContextId;\n }\n @Input() Provider: IMetadataProvider | null = null;\n \n public dataContextRecord?: MJDataContextEntity; // case-violation-ok-legacy-back-compat: an accessor cannot be optional, so a stub would turn this into a required member\n public DataContextItems: MJDataContextItemEntity[] = [];\n\n /** @deprecated Use {@link DataContextItems}. */\n public get dataContextItems(): MJDataContextItemEntity[] {\n return this.DataContextItems;\n }\n /** @deprecated Use {@link DataContextItems}. */\n public set dataContextItems(value: MJDataContextItemEntity[]) {\n this.DataContextItems = value;\n }\n public ShowLoader: boolean = false;\n\n /** @deprecated Use {@link ShowLoader}. */\n public get showLoader(): boolean {\n return this.ShowLoader;\n }\n /** @deprecated Use {@link ShowLoader}. */\n public set showLoader(value: boolean) {\n this.ShowLoader = value;\n }\n public errorMessage: string = '';\n public SearchTerm: string = '';\n\n /** @deprecated Use {@link SearchTerm}. */\n public get searchTerm(): string {\n return this.SearchTerm;\n }\n /** @deprecated Use {@link SearchTerm}. */\n public set searchTerm(value: string) {\n this.SearchTerm = value;\n }\n \n // UI state\n public ShowSQLPreview: boolean = false;\n\n /** @deprecated Use {@link ShowSQLPreview}. */\n public get showSQLPreview(): boolean {\n return this.ShowSQLPreview;\n }\n /** @deprecated Use {@link ShowSQLPreview}. */\n public set showSQLPreview(value: boolean) {\n this.ShowSQLPreview = value;\n }\n public PreviewSQL: string = '';\n\n /** @deprecated Use {@link PreviewSQL}. */\n public get previewSQL(): string {\n return this.PreviewSQL;\n }\n /** @deprecated Use {@link PreviewSQL}. */\n public set previewSQL(value: string) {\n this.PreviewSQL = value;\n }\n public CopiedField: string = '';\n\n /** @deprecated Use {@link CopiedField}. */\n public get copiedField(): string {\n return this.CopiedField;\n }\n /** @deprecated Use {@link CopiedField}. */\n public set copiedField(value: string) {\n this.CopiedField = value;\n }\n public ExpandedItems: { [key: string]: boolean } = {};\n\n /** @deprecated Use {@link ExpandedItems}. */\n public get expandedItems(): { [key: string]: boolean } {\n return this.ExpandedItems;\n }\n /** @deprecated Use {@link ExpandedItems}. */\n public set expandedItems(value: { [key: string]: boolean }) {\n this.ExpandedItems = value;\n }\n\n public get ProviderToUse(): IMetadataProvider {\n return this.Provider ?? Metadata.Provider;\n }\n\n public get FilteredItems(): MJDataContextItemEntity[] {\n if (!this.SearchTerm) {\n return this.DataContextItems;\n }\n \n const term = this.SearchTerm.toLowerCase();\n return this.DataContextItems.filter(item => \n item.Type?.toLowerCase().includes(term) ||\n item.SQL?.toLowerCase().includes(term) ||\n (item.EntityID ? this.getEntityName(item.EntityID)?.toLowerCase().includes(term) : false) ||\n item.Description?.toLowerCase().includes(term)\n );\n }\n\n /** @deprecated Use {@link FilteredItems}. */\n public get filteredItems(): MJDataContextItemEntity[] {\n return this.FilteredItems;\n }\n\n public get ItemCount(): number {\n return this.FilteredItems.length;\n }\n\n /** @deprecated Use {@link ItemCount}. */\n public get itemCount(): number {\n return this.ItemCount;\n }\n\n ngOnInit(): void {\n if(this.DataContextId){\n this.ShowLoader = true;\n this.LoadDataContext(this.DataContextId);\n }\n }\n\n async LoadDataContext(dataContextId: string) {\n try {\n if (dataContextId) {\n const p = this.ProviderToUse;\n this.dataContextRecord = await p.GetEntityObject<MJDataContextEntity>(\"MJ: Data Contexts\", p.CurrentUser);\n await this.dataContextRecord.Load(dataContextId);\n\n const rv = RunView.FromMetadataProvider(p);\n const response = await rv.RunView<MJDataContextItemEntity>(\n { \n EntityName: \"MJ: Data Context Items\", \n ExtraFilter: `DataContextID='${dataContextId}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n });\n \n if(response.Success){\n this.DataContextItems = response.Results;\n this.ShowLoader = false;\n } else {\n this.errorMessage = response.ErrorMessage || 'Failed to load data context items';\n LogError(response.ErrorMessage);\n this.ShowLoader = false;\n }\n }\n } catch (error) {\n this.errorMessage = 'An error occurred while loading the data context';\n LogError(error);\n this.ShowLoader = false;\n }\n }\n\n public GetTypeIcon(type: string): string {\n const typeIcons: Record<string, string> = {\n 'sql': 'fa-solid fa-database',\n 'view': 'fa-solid fa-table',\n 'query': 'fa-solid fa-magnifying-glass',\n 'entity': 'fa-solid fa-cube',\n 'record': 'fa-solid fa-file'\n };\n \n return typeIcons[type?.toLowerCase()] || 'fa-solid fa-question';\n }\n\n /** @deprecated Use {@link GetTypeIcon}. */\n public getTypeIcon(type: string): string {\n return this.GetTypeIcon(type);\n }\n\n public GetTypeColor(type: string): string {\n const typeColors: Record<string, string> = {\n 'sql': '#2196f3',\n 'view': '#4caf50',\n 'query': '#ff9800',\n 'entity': '#9c27b0',\n 'record': '#f44336'\n };\n \n return typeColors[type?.toLowerCase()] || '#757575';\n }\n\n /** @deprecated Use {@link GetTypeColor}. */\n public getTypeColor(type: string): string {\n return this.GetTypeColor(type);\n }\n\n public getEntityName(entityId: string | null): string | undefined {\n if (!entityId) return undefined;\n const md = this.ProviderToUse;\n return md.Entities.find(e => UUIDsEqual(e.ID, entityId))?.Name;\n }\n\n public async GetViewName(viewId: string): Promise<string | undefined> {\n try {\n const p = this.ProviderToUse;\n const view = await p.GetEntityObject(\"Views\", p.CurrentUser);\n await (view as any).Load(viewId);\n return (view as any).Get('Name');\n } catch {\n return undefined;\n }\n }\n\n /** @deprecated Use {@link GetViewName}. */\n public async getViewName(viewId: string): Promise<string | undefined> {\n return this.GetViewName(viewId);\n }\n\n public async GetQueryName(queryId: string): Promise<string | undefined> {\n try {\n const p = this.ProviderToUse;\n const query = await p.GetEntityObject(\"MJ: Queries\", p.CurrentUser);\n await (query as any).Load(queryId);\n return (query as any).Get('Name');\n } catch {\n return undefined;\n }\n }\n\n /** @deprecated Use {@link GetQueryName}. */\n public async getQueryName(queryId: string): Promise<string | undefined> {\n return this.GetQueryName(queryId);\n }\n\n public OnSearchChange(): void {\n // Reset expanded items when searching\n this.ExpandedItems = {};\n }\n\n /** @deprecated Use {@link OnSearchChange}. */\n public onSearchChange(): void {\n return this.OnSearchChange();\n }\n\n public ToggleItemExpansion(itemId: string): void {\n this.ExpandedItems[itemId] = !this.ExpandedItems[itemId];\n }\n\n /** @deprecated Use {@link ToggleItemExpansion}. */\n public toggleItemExpansion(itemId: string): void {\n return this.ToggleItemExpansion(itemId);\n }\n\n public async CopyToClipboard(text: string, fieldName: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.CopiedField = fieldName;\n setTimeout(() => {\n this.CopiedField = '';\n }, 2000);\n } catch (err) {\n LogError(`Failed to copy to clipboard: ${err}`);\n }\n }\n\n /** @deprecated Use {@link CopyToClipboard}. */\n public async copyToClipboard(text: string, fieldName: string): Promise<void> {\n return this.CopyToClipboard(text, fieldName);\n }\n\n public PreviewSQLCode(sql: string): void {\n this.PreviewSQL = sql;\n this.ShowSQLPreview = true;\n }\n\n /** @deprecated Use {@link PreviewSQLCode}. */\n public previewSQLCode(sql: string): void {\n return this.PreviewSQLCode(sql);\n }\n\n public CloseSQLPreview(): void {\n this.ShowSQLPreview = false;\n this.PreviewSQL = '';\n }\n\n /** @deprecated Use {@link CloseSQLPreview}. */\n public closeSQLPreview(): void {\n return this.CloseSQLPreview();\n }\n\n public NavigateToEntity(entityId: string): void {\n // This would be implemented based on your navigation system\n console.log('Navigate to entity:', entityId);\n }\n\n /** @deprecated Use {@link NavigateToEntity}. */\n public navigateToEntity(entityId: string): void {\n return this.NavigateToEntity(entityId);\n }\n\n public NavigateToView(viewId: string): void {\n // This would be implemented based on your navigation system\n console.log('Navigate to view:', viewId);\n }\n\n /** @deprecated Use {@link NavigateToView}. */\n public navigateToView(viewId: string): void {\n return this.NavigateToView(viewId);\n }\n\n public NavigateToQuery(queryId: string): void {\n // This would be implemented based on your navigation system\n console.log('Navigate to query:', queryId);\n }\n\n /** @deprecated Use {@link NavigateToQuery}. */\n public navigateToQuery(queryId: string): void {\n return this.NavigateToQuery(queryId);\n }\n\n public async Refresh(): Promise<void> {\n this.ShowLoader = true;\n await this.LoadDataContext(this.DataContextId);\n }\n\n /** @deprecated Use {@link Refresh}. */\n public async refresh(): Promise<void> {\n return this.Refresh();\n }\n\n public ExportToCSV(): void {\n // Implement CSV export functionality\n const headers = ['Type', 'SQL', 'View', 'Query', 'Entity', 'Record ID', 'Description'];\n const rows = this.FilteredItems.map(item => [\n item.Type,\n item.SQL,\n item.ViewID,\n item.QueryID,\n this.getEntityName(item.EntityID) || item.EntityID,\n item.RecordID,\n item.Description || ''\n ]);\n \n const csv = [headers, ...rows].map(row => row.map(cell => `\"${cell}\"`).join(',')).join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `data-context-${this.dataContextRecord?.Name || this.DataContextId}.csv`;\n a.click();\n window.URL.revokeObjectURL(url);\n }\n\n /** @deprecated Use {@link ExportToCSV}. */\n public exportToCSV(): void {\n return this.ExportToCSV();\n }\n}","<div class=\"data-context-viewer\">\n @if (showLoader) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading data context...\" size=\"large\"></mj-loading>\n </div>\n } @else {\n <!-- Header Section -->\n <div class=\"data-context-header\">\n <div class=\"header-info\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-layer-group header-icon\"></i>\n <h2>{{ dataContextRecord?.Name || 'Data Context' }}</h2>\n </div>\n @if (dataContextRecord && dataContextRecord.Description) {\n <p class=\"header-description\">{{ dataContextRecord.Description }}</p>\n }\n <div class=\"header-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n ID: {{ dataContextRecord?.ID }}\n <button class=\"copy-btn\" (click)=\"copyToClipboard(dataContextRecord?.ID || '', 'context-id')\" title=\"Copy ID\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'context-id'\" [class.fa-check]=\"copiedField === 'context-id'\"></i>\n </button>\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-list-ol\"></i>\n {{ itemCount }} {{ itemCount === 1 ? 'item' : 'items' }}\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n <button mjButton variant=\"flat\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Refresh\n </button>\n <button mjButton variant=\"flat\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i>\n Export\n </button>\n </div>\n </div>\n\n @if (errorMessage) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ errorMessage }}\n </div>\n }\n\n <!-- Search Bar -->\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n <input\n class=\"mj-input search-input\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search items by type, SQL, entity name, or description...\"\n />\n </div>\n </div>\n\n <!-- Data Context Items as Cards -->\n <div class=\"items-container\">\n @for (item of filteredItems; track item.ID; let i = $index) {\n <div class=\"data-context-card\" [class.expanded]=\"expandedItems[item.ID]\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleItemExpansion(item.ID)\">\n <div class=\"card-header-left\">\n <div class=\"type-badge\" [style.background-color]=\"getTypeColor(item.Type) + '20'\" [style.color]=\"getTypeColor(item.Type)\">\n <i [class]=\"getTypeIcon(item.Type)\"></i>\n <span>{{ item.Type }}</span>\n </div>\n @if (item.Description) {\n <span class=\"card-description\">{{ item.Description }}</span>\n }\n </div>\n <button class=\"expand-btn\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!expandedItems[item.ID]\" [class.fa-chevron-up]=\"expandedItems[item.ID]\"></i>\n </button>\n </div>\n\n <!-- Card Content -->\n <div class=\"card-content\">\n <!-- SQL Section -->\n @if (item.SQL) {\n <div class=\"sql-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-code\"></i> SQL Query</h4>\n <div class=\"sql-actions\">\n <button class=\"action-btn\" (click)=\"copyToClipboard(item.SQL, 'sql-' + item.ID)\" title=\"Copy SQL\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'sql-' + item.ID\" [class.fa-check]=\"copiedField === 'sql-' + item.ID\"></i>\n {{ copiedField === 'sql-' + item.ID ? 'Copied!' : 'Copy' }}\n </button>\n <button class=\"action-btn\" (click)=\"previewSQLCode(item.SQL)\" title=\"Expand\">\n <i class=\"fa-solid fa-expand\"></i>\n Expand\n </button>\n </div>\n </div>\n <pre class=\"sql-code\"><code>{{ item.SQL }}</code></pre>\n </div>\n }\n\n <!-- Metadata Section -->\n <div class=\"metadata-section\">\n <div class=\"metadata-grid\">\n @if (item.EntityID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Entity</span>\n <div class=\"metadata-value\">\n <span>{{ getEntityName(item.EntityID) || 'Unknown' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToEntity(item.EntityID)\" title=\"View entity\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.ViewID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">View</span>\n <div class=\"metadata-value\">\n <span title=\"{{ item.ViewID }}\">{{ item.ViewID | slice:0:20 }}{{ item.ViewID.length > 20 ? '...' : '' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToView(item.ViewID)\" title=\"View details\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.QueryID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Query</span>\n <div class=\"metadata-value\">\n <span title=\"{{ item.QueryID }}\">{{ item.QueryID | slice:0:20 }}{{ item.QueryID.length > 20 ? '...' : '' }}</span>\n <button class=\"link-btn\" (click)=\"navigateToQuery(item.QueryID)\" title=\"View query\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n </div>\n }\n @if (item.RecordID) {\n <div class=\"metadata-item\">\n <span class=\"metadata-label\">Record ID</span>\n <div class=\"metadata-value\">\n <code>{{ item.RecordID }}</code>\n <button class=\"link-btn\" (click)=\"copyToClipboard(item.RecordID, 'record-' + item.ID)\" title=\"Copy\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'record-' + item.ID\" [class.fa-check]=\"copiedField === 'record-' + item.ID\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"card-footer\">\n <span class=\"timestamp\">\n <i class=\"fa-solid fa-clock\"></i>\n Created {{ item.__mj_CreatedAt | date:'short' }}\n </span>\n @if (item.__mj_UpdatedAt && item.__mj_UpdatedAt !== item.__mj_CreatedAt) {\n <span class=\"timestamp\">\n <i class=\"fa-solid fa-pen\"></i>\n Updated {{ item.__mj_UpdatedAt | date:'short' }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n\n @if (filteredItems.length === 0) {\n <mj-empty-state\n [Variant]=\"searchTerm ? 'no-results' : 'empty'\"\n [Icon]=\"searchTerm ? 'fa-solid fa-magnifying-glass' : 'fa-solid fa-inbox'\"\n [Title]=\"searchTerm ? 'No matching items' : 'No items found'\"\n [Message]=\"searchTerm ? 'Try a different search term.' : ''\" />\n }\n </div>\n }\n\n <!-- SQL Preview Dialog -->\n @if (showSQLPreview) {\n <div class=\"sql-preview-overlay\" (click)=\"closeSQLPreview()\">\n <div class=\"sql-preview-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"sql-preview-header\">\n <h3>SQL Preview</h3>\n <button class=\"close-btn\" (click)=\"closeSQLPreview()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sql-preview-content\">\n <pre><code>{{ previewSQL }}</code></pre>\n </div>\n <div class=\"sql-preview-actions\">\n <button mjButton (click)=\"copyToClipboard(previewSQL, 'preview-sql')\">\n <i class=\"fa-solid\" [class.fa-copy]=\"copiedField !== 'preview-sql'\" [class.fa-check]=\"copiedField === 'preview-sql'\"></i>\n {{ copiedField === 'preview-sql' ? 'Copied!' : 'Copy SQL' }}\n </button>\n </div>\n </div>\n </div>\n }\n</div>"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-data-context",
3
- "version": "6.1.4",
3
+ "version": "6.2.0-edge.1",
4
4
  "description": "MemberJunction: Angular component and pop-up window to display and edit the contents of a data context.",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -13,7 +13,7 @@
13
13
  "devDependencies": {
14
14
  "@angular/compiler": "21.2.22",
15
15
  "@angular/compiler-cli": "21.2.22",
16
- "@memberjunction/ng-test-utils": "6.1.4",
16
+ "@memberjunction/ng-test-utils": "6.2.0-edge.1",
17
17
  "vitest": "^4.0.18"
18
18
  },
19
19
  "peerDependencies": {
@@ -22,13 +22,13 @@
22
22
  "@angular/forms": "^21.2.22"
23
23
  },
24
24
  "dependencies": {
25
- "@memberjunction/core": "6.1.4",
26
- "@memberjunction/ng-base-types": "6.1.4",
27
- "@memberjunction/core-entities": "6.1.4",
28
- "@memberjunction/global": "6.1.4",
29
- "@memberjunction/ng-container-directives": "6.1.4",
30
- "@memberjunction/ng-shared-generic": "6.1.4",
31
- "@memberjunction/ng-ui-components": "6.1.4",
25
+ "@memberjunction/core": "6.2.0-edge.1",
26
+ "@memberjunction/ng-base-types": "6.2.0-edge.1",
27
+ "@memberjunction/core-entities": "6.2.0-edge.1",
28
+ "@memberjunction/global": "6.2.0-edge.1",
29
+ "@memberjunction/ng-container-directives": "6.2.0-edge.1",
30
+ "@memberjunction/ng-shared-generic": "6.2.0-edge.1",
31
+ "@memberjunction/ng-ui-components": "6.2.0-edge.1",
32
32
  "tslib": "^2.8.1"
33
33
  },
34
34
  "sideEffects": false,