@memberjunction/ng-data-context 6.2.0-edge.0 → 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.
- package/dist/lib/ng-data-context-dialog.component.d.ts +32 -4
- package/dist/lib/ng-data-context-dialog.component.d.ts.map +1 -1
- package/dist/lib/ng-data-context-dialog.component.js +64 -10
- package/dist/lib/ng-data-context-dialog.component.js.map +1 -1
- package/dist/lib/ng-data-context.component.d.ts +77 -9
- package/dist/lib/ng-data-context.component.d.ts.map +1 -1
- package/dist/lib/ng-data-context.component.js +176 -46
- package/dist/lib/ng-data-context.component.js.map +1 -1
- package/package.json +9 -9
|
@@ -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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
58
|
+
return this.DialogHeight;
|
|
59
|
+
}
|
|
60
|
+
CloseDialog() {
|
|
61
|
+
this.DialogClosed.emit();
|
|
19
62
|
}
|
|
63
|
+
/** @deprecated Use {@link CloseDialog}. */
|
|
20
64
|
closeDialog() {
|
|
21
|
-
this.
|
|
65
|
+
return this.CloseDialog();
|
|
66
|
+
}
|
|
67
|
+
ToggleMaximize() {
|
|
68
|
+
this.IsMaximized = !this.IsMaximized;
|
|
22
69
|
}
|
|
70
|
+
/** @deprecated Use {@link ToggleMaximize}. */
|
|
23
71
|
toggleMaximize() {
|
|
24
|
-
|
|
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, {
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
321
|
-
|
|
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
|
-
|
|
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
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
|
333
|
-
if (!this.
|
|
334
|
-
return this.
|
|
396
|
+
get FilteredItems() {
|
|
397
|
+
if (!this.SearchTerm) {
|
|
398
|
+
return this.DataContextItems;
|
|
335
399
|
}
|
|
336
|
-
const term = this.
|
|
337
|
-
return this.
|
|
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.
|
|
415
|
+
return this.ItemCount;
|
|
344
416
|
}
|
|
345
417
|
ngOnInit() {
|
|
346
|
-
if (this.
|
|
347
|
-
this.
|
|
348
|
-
this.LoadDataContext(this.
|
|
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.
|
|
366
|
-
this.
|
|
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.
|
|
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.
|
|
450
|
+
this.ShowLoader = false;
|
|
379
451
|
}
|
|
380
452
|
}
|
|
381
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
530
|
+
return this.ToggleItemExpansion(itemId);
|
|
435
531
|
}
|
|
436
|
-
async
|
|
532
|
+
async CopyToClipboard(text, fieldName) {
|
|
437
533
|
try {
|
|
438
534
|
await navigator.clipboard.writeText(text);
|
|
439
|
-
this.
|
|
535
|
+
this.CopiedField = fieldName;
|
|
440
536
|
setTimeout(() => {
|
|
441
|
-
this.
|
|
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.
|
|
450
|
-
|
|
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.
|
|
454
|
-
this.previewSQL = '';
|
|
562
|
+
return this.CloseSQLPreview();
|
|
455
563
|
}
|
|
456
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
470
|
-
await this.LoadDataContext(this.dataContextId);
|
|
594
|
+
return this.Refresh();
|
|
471
595
|
}
|
|
472
|
-
|
|
596
|
+
ExportToCSV() {
|
|
473
597
|
// Implement CSV export functionality
|
|
474
598
|
const headers = ['Type', 'SQL', 'View', 'Query', 'Entity', 'Record ID', 'Description'];
|
|
475
|
-
const rows = this.
|
|
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.
|
|
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, {
|
|
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.2.0-edge.
|
|
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.2.0-edge.
|
|
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.2.0-edge.
|
|
26
|
-
"@memberjunction/ng-base-types": "6.2.0-edge.
|
|
27
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
28
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
29
|
-
"@memberjunction/ng-container-directives": "6.2.0-edge.
|
|
30
|
-
"@memberjunction/ng-shared-generic": "6.2.0-edge.
|
|
31
|
-
"@memberjunction/ng-ui-components": "6.2.0-edge.
|
|
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,
|