@memberjunction/ng-data-context 5.21.0 → 5.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,16 +3,12 @@ import * as i1 from "./ng-data-context.component";
3
3
  import * as i2 from "./ng-data-context-dialog.component";
4
4
  import * as i3 from "@angular/common";
5
5
  import * as i4 from "@angular/forms";
6
- import * as i5 from "@progress/kendo-angular-grid";
7
- import * as i6 from "@progress/kendo-angular-dialog";
8
- import * as i7 from "@progress/kendo-angular-buttons";
9
- import * as i8 from "@progress/kendo-angular-indicators";
10
- import * as i9 from "@progress/kendo-angular-inputs";
11
- import * as i10 from "@memberjunction/ng-container-directives";
12
- import * as i11 from "@memberjunction/ng-shared-generic";
6
+ import * as i5 from "@memberjunction/ng-ui-components";
7
+ import * as i6 from "@memberjunction/ng-container-directives";
8
+ import * as i7 from "@memberjunction/ng-shared-generic";
13
9
  export declare class DataContextModule {
14
10
  static ɵfac: i0.ɵɵFactoryDeclaration<DataContextModule, never>;
15
- static ɵmod: i0.ɵɵNgModuleDeclaration<DataContextModule, [typeof i1.DataContextComponent, typeof i2.DataContextDialogComponent], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i5.GridModule, typeof i6.DialogsModule, typeof i7.ButtonsModule, typeof i8.IndicatorsModule, typeof i9.InputsModule, typeof i10.ContainerDirectivesModule, typeof i11.SharedGenericModule], [typeof i1.DataContextComponent, typeof i2.DataContextDialogComponent]>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<DataContextModule, [typeof i1.DataContextComponent, typeof i2.DataContextDialogComponent], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i5.MJButtonDirective, typeof i5.MJWindowComponent, typeof i5.MJWindowTitlebarComponent, typeof i6.ContainerDirectivesModule, typeof i7.SharedGenericModule], [typeof i1.DataContextComponent, typeof i2.DataContextDialogComponent]>;
16
12
  static ɵinj: i0.ɵɵInjectorDeclaration<DataContextModule>;
17
13
  }
18
14
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":";;;;;;;;;;;;AAgBA,qBAqBa,iBAAiB;yCAAjB,iBAAiB;0CAAjB,iBAAiB;0CAAjB,iBAAiB;CAAI"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":";;;;;;;;AAYA,qBAmBa,iBAAiB;yCAAjB,iBAAiB;0CAAjB,iBAAiB;0CAAjB,iBAAiB;CAAI"}
@@ -1,12 +1,8 @@
1
1
  import { NgModule } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule } from '@angular/forms';
4
- // Kendo UI Angular imports
5
- import { GridModule } from '@progress/kendo-angular-grid';
6
- import { DialogsModule } from "@progress/kendo-angular-dialog";
7
- import { ButtonsModule } from '@progress/kendo-angular-buttons';
8
- import { IndicatorsModule } from '@progress/kendo-angular-indicators';
9
- import { InputsModule } from '@progress/kendo-angular-inputs';
4
+ // MJ UI Components
5
+ import { MJButtonDirective, MJWindowComponent, MJWindowTitlebarComponent } from '@memberjunction/ng-ui-components';
10
6
  import { DataContextComponent } from './ng-data-context.component';
11
7
  import { DataContextDialogComponent } from './ng-data-context-dialog.component';
12
8
  import { ContainerDirectivesModule } from '@memberjunction/ng-container-directives';
@@ -17,11 +13,8 @@ export class DataContextModule {
17
13
  static ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: DataContextModule });
18
14
  static ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [CommonModule,
19
15
  FormsModule,
20
- GridModule,
21
- DialogsModule,
22
- ButtonsModule,
23
- IndicatorsModule,
24
- InputsModule,
16
+ MJWindowComponent,
17
+ MJWindowTitlebarComponent,
25
18
  ContainerDirectivesModule,
26
19
  SharedGenericModule] });
27
20
  }
@@ -35,11 +28,9 @@ export class DataContextModule {
35
28
  imports: [
36
29
  CommonModule,
37
30
  FormsModule,
38
- GridModule,
39
- DialogsModule,
40
- ButtonsModule,
41
- IndicatorsModule,
42
- InputsModule,
31
+ MJButtonDirective,
32
+ MJWindowComponent,
33
+ MJWindowTitlebarComponent,
43
34
  ContainerDirectivesModule,
44
35
  SharedGenericModule
45
36
  ],
@@ -52,11 +43,9 @@ export class DataContextModule {
52
43
  (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(DataContextModule, { declarations: [DataContextComponent,
53
44
  DataContextDialogComponent], imports: [CommonModule,
54
45
  FormsModule,
55
- GridModule,
56
- DialogsModule,
57
- ButtonsModule,
58
- IndicatorsModule,
59
- InputsModule,
46
+ MJButtonDirective,
47
+ MJWindowComponent,
48
+ MJWindowTitlebarComponent,
60
49
  ContainerDirectivesModule,
61
50
  SharedGenericModule], exports: [DataContextComponent,
62
51
  DataContextDialogComponent] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,2BAA2B;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;;AAuBxE,MAAM,OAAO,iBAAiB;2GAAjB,iBAAiB;4DAAjB,iBAAiB;gEAf1B,YAAY;YACZ,WAAW;YACX,UAAU;YACV,aAAa;YACb,aAAa;YACb,gBAAgB;YAChB,YAAY;YACZ,yBAAyB;YACzB,mBAAmB;;iFAOV,iBAAiB;cArB7B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,oBAAoB;oBACpB,0BAA0B;iBAC3B;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,UAAU;oBACV,aAAa;oBACb,aAAa;oBACb,gBAAgB;oBAChB,YAAY;oBACZ,yBAAyB;oBACzB,mBAAmB;iBACpB;gBACD,OAAO,EAAE;oBACP,oBAAoB;oBACpB,0BAA0B;iBAC3B;aACF;;wFACY,iBAAiB,mBAnB1B,oBAAoB;QACpB,0BAA0B,aAG1B,YAAY;QACZ,WAAW;QACX,UAAU;QACV,aAAa;QACb,aAAa;QACb,gBAAgB;QAChB,YAAY;QACZ,yBAAyB;QACzB,mBAAmB,aAGnB,oBAAoB;QACpB,0BAA0B","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n// Kendo UI Angular imports\nimport { GridModule } from '@progress/kendo-angular-grid';\nimport { DialogsModule } from \"@progress/kendo-angular-dialog\";\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\nimport { IndicatorsModule } from '@progress/kendo-angular-indicators';\nimport { InputsModule } from '@progress/kendo-angular-inputs';\n\nimport { DataContextComponent } from './ng-data-context.component';\nimport { DataContextDialogComponent } from './ng-data-context-dialog.component';\nimport { ContainerDirectivesModule } from '@memberjunction/ng-container-directives';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\n\n@NgModule({\n declarations: [\n DataContextComponent,\n DataContextDialogComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n GridModule,\n DialogsModule,\n ButtonsModule,\n IndicatorsModule,\n InputsModule,\n ContainerDirectivesModule,\n SharedGenericModule\n ],\n exports: [\n DataContextComponent,\n DataContextDialogComponent\n ]\n})\nexport class DataContextModule { }"]}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,mBAAmB;AACnB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAEnH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;;AAqBxE,MAAM,OAAO,iBAAiB;2GAAjB,iBAAiB;4DAAjB,iBAAiB;gEAb1B,YAAY;YACZ,WAAW;YAEX,iBAAiB;YACjB,yBAAyB;YACzB,yBAAyB;YACzB,mBAAmB;;iFAOV,iBAAiB;cAnB7B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,oBAAoB;oBACpB,0BAA0B;iBAC3B;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,iBAAiB;oBACjB,iBAAiB;oBACjB,yBAAyB;oBACzB,yBAAyB;oBACzB,mBAAmB;iBACpB;gBACD,OAAO,EAAE;oBACP,oBAAoB;oBACpB,0BAA0B;iBAC3B;aACF;;wFACY,iBAAiB,mBAjB1B,oBAAoB;QACpB,0BAA0B,aAG1B,YAAY;QACZ,WAAW;QACX,iBAAiB;QACjB,iBAAiB;QACjB,yBAAyB;QACzB,yBAAyB;QACzB,mBAAmB,aAGnB,oBAAoB;QACpB,0BAA0B","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n// MJ UI Components\nimport { MJButtonDirective, MJWindowComponent, MJWindowTitlebarComponent } from '@memberjunction/ng-ui-components';\n\nimport { DataContextComponent } from './ng-data-context.component';\nimport { DataContextDialogComponent } from './ng-data-context-dialog.component';\nimport { ContainerDirectivesModule } from '@memberjunction/ng-container-directives';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\n\n@NgModule({\n declarations: [\n DataContextComponent,\n DataContextDialogComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n MJButtonDirective,\n MJWindowComponent,\n MJWindowTitlebarComponent,\n ContainerDirectivesModule,\n SharedGenericModule\n ],\n exports: [\n DataContextComponent,\n DataContextDialogComponent\n ]\n})\nexport class DataContextModule { }"]}
@@ -1,6 +1,6 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- import * as i1 from "@progress/kendo-angular-dialog";
3
+ import * as i1 from "@memberjunction/ng-ui-components";
4
4
  import * as i2 from "./ng-data-context.component";
5
5
  /**
6
6
  * Enhanced dialog wrapper component for the data context viewer
@@ -24,12 +24,12 @@ export class DataContextDialogComponent {
24
24
  this.isMaximized = !this.isMaximized;
25
25
  }
26
26
  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: 17, consts: [[1, "data-context-dialog-wrapper"], [1, "k-overlay"], [1, "data-context-window", 3, "close", "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) {
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) {
28
28
  i0.ɵɵelementStart(0, "div", 0);
29
29
  i0.ɵɵelement(1, "div", 1);
30
- i0.ɵɵelementStart(2, "kendo-window", 2);
31
- i0.ɵɵlistener("close", function DataContextDialogComponent_Template_kendo_window_close_2_listener() { return ctx.closeDialog(); });
32
- i0.ɵɵelementStart(3, "kendo-window-titlebar")(4, "div", 3);
30
+ i0.ɵɵelementStart(2, "mj-window", 2);
31
+ i0.ɵɵlistener("Close", function DataContextDialogComponent_Template_mj_window_Close_2_listener() { return ctx.closeDialog(); });
32
+ i0.ɵɵelementStart(3, "mj-window-titlebar")(4, "div", 3);
33
33
  i0.ɵɵelement(5, "i", 4);
34
34
  i0.ɵɵelementStart(6, "span");
35
35
  i0.ɵɵtext(7);
@@ -48,7 +48,7 @@ export class DataContextDialogComponent {
48
48
  } if (rf & 2) {
49
49
  i0.ɵɵadvance(2);
50
50
  i0.ɵɵclassProp("maximized", ctx.isMaximized);
51
- i0.ɵɵproperty("width", ctx.dialogWidth)("height", ctx.dialogHeight)("minHeight", 400)("minWidth", 600)("resizable", !ctx.isMaximized)("draggable", !ctx.isMaximized);
51
+ i0.ɵɵproperty("Visible", true)("Width", ctx.dialogWidth)("Height", ctx.dialogHeight)("MinHeight", 400)("MinWidth", 600)("Resizable", !ctx.isMaximized)("Draggable", !ctx.isMaximized);
52
52
  i0.ɵɵadvance(5);
53
53
  i0.ɵɵtextInterpolate1("Data Context", ctx.dataContextName ? ": " + ctx.dataContextName : "");
54
54
  i0.ɵɵadvance(2);
@@ -57,11 +57,11 @@ export class DataContextDialogComponent {
57
57
  i0.ɵɵclassProp("fa-maximize", !ctx.isMaximized)("fa-compress", ctx.isMaximized);
58
58
  i0.ɵɵadvance(4);
59
59
  i0.ɵɵproperty("dataContextId", ctx.dataContextId)("Provider", ctx.Provider);
60
- } }, dependencies: [i1.WindowComponent, i1.WindowTitleBarComponent, i2.DataContextComponent], styles: [".data-context-dialog-wrapper[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.data-context-window[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n box-shadow: var(--mj-shadow-lg);\n}\n\n\n\n[_nghost-%COMP%] .k-window {\n margin: 0 auto;\n top: 10% !important;\n position: fixed !important;\n}\n\n\n.data-context-window.maximized[_ngcontent-%COMP%] {\n position: fixed !important;\n top: 2.5% !important;\n left: 2.5% !important;\n}\n\n\n\n.window-title[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-lg);\n}\n\n.window-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: auto;\n}\n\n.window-action-btn[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-brand-primary-subtle);\n color: var(--mj-brand-primary);\n}\n\n.window-action-btn[_ngcontent-%COMP%]:last-child:hover {\n background-color: var(--mj-status-error-subtle);\n color: var(--mj-status-error);\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n\n\n[_nghost-%COMP%] .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[_nghost-%COMP%] .k-window-title {\n display: contents;\n}\n\n[_nghost-%COMP%] .k-window-actions {\n display: none; \n\n}\n\n[_nghost-%COMP%] .k-window-content {\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n[_nghost-%COMP%] .k-window {\n border: none;\n}\n\n\n\n@keyframes _ngcontent-%COMP%_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[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}"] });
60
+ } }, dependencies: [i1.MJWindowComponent, i1.MJWindowTitlebarComponent, i2.DataContextComponent], styles: [".data-context-dialog-wrapper[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.data-context-window[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n box-shadow: var(--mj-shadow-lg);\n}\n\n\n\n[_nghost-%COMP%] .k-window {\n margin: 0 auto;\n top: 10% !important;\n position: fixed !important;\n}\n\n\n.data-context-window.maximized[_ngcontent-%COMP%] {\n position: fixed !important;\n top: 2.5% !important;\n left: 2.5% !important;\n}\n\n\n\n.window-title[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-lg);\n}\n\n.window-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: auto;\n}\n\n.window-action-btn[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-brand-primary-subtle);\n color: var(--mj-brand-primary);\n}\n\n.window-action-btn[_ngcontent-%COMP%]:last-child:hover {\n background-color: var(--mj-status-error-subtle);\n color: var(--mj-status-error);\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n\n\n[_nghost-%COMP%] .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[_nghost-%COMP%] .k-window-title {\n display: contents;\n}\n\n[_nghost-%COMP%] .k-window-actions {\n display: none; \n\n}\n\n[_nghost-%COMP%] .k-window-content {\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n[_nghost-%COMP%] .k-window {\n border: none;\n}\n\n\n\n@keyframes _ngcontent-%COMP%_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[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}"] });
61
61
  }
62
62
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataContextDialogComponent, [{
63
63
  type: Component,
64
- args: [{ standalone: false, selector: 'mj-data-context-dialog', template: "<div class=\"data-context-dialog-wrapper\">\n <div class=\"k-overlay\"></div>\n <kendo-window \n class=\"data-context-window\"\n [class.maximized]=\"isMaximized\"\n [width]=\"dialogWidth\"\n [height]=\"dialogHeight\"\n [minHeight]=\"400\"\n [minWidth]=\"600\"\n [resizable]=\"!isMaximized\"\n [draggable]=\"!isMaximized\"\n (close)=\"closeDialog()\">\n \n <kendo-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 </kendo-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 </kendo-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"] }]
64
+ 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
65
  }], null, { dialogClosed: [{
66
66
  type: Output
67
67
  }], dataContextId: [{
@@ -1 +1 @@
1
- {"version":3,"file":"ng-data-context-dialog.component.js","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts","../../src/lib/ng-data-context-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;AAGvE;;GAEG;AAOH,MAAM,OAAO,0BAA0B;IAC3B,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACnC,aAAa,CAAU;IACvB,eAAe,CAAU;IACzB,QAAQ,GAA6B,IAAI,CAAC;IAE5C,WAAW,GAAY,KAAK,CAAC;IAEpC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,CAAC;IAED,WAAW;QACT,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACvC,CAAC;oHAtBU,0BAA0B;6DAA1B,0BAA0B;YCZvC,8BAAyC;YACrC,yBAA6B;YAC7B,uCAS4B;YAAxB,6GAAS,iBAAa,IAAC;YAGnB,AADJ,6CAAuB,aACO;YACtB,uBAAkD;YAClD,4BAAM;YAAA,YAA+D;YACzE,AADyE,iBAAO,EAC1E;YAEF,AADJ,8BAA4B,gBAIM;YAF1B,uGAAS,oBAAgB,IAAC;YAG1B,wBAA6F;YACjG,iBAAS;YACT,kCAG8B;YAF1B,wGAAS,iBAAa,IAAC;YAGvB,wBAAiC;YAG7C,AADI,AADI,iBAAS,EACP,EACc;YAExB,gCAA4B;YACxB,uCAGkB;YAG9B,AADI,AADI,iBAAM,EACK,EACb;;YArCE,eAA+B;YAA/B,4CAA+B;YAM/B,AADA,AADA,AADA,AADA,AADA,uCAAqB,4BACE,kBACN,iBACD,+BACU,+BACA;YAMZ,eAA+D;YAA/D,4FAA+D;YAKjE,eAAkD;YAAlD,uBAAA,0DAAkD,CAAA;YAE9B,cAAkC;YAAC,AAAnC,+CAAkC,gCAAkC;YAa5F,eAA+B;YAC/B,AADA,iDAA+B,0BACV;;;iFDzBxB,0BAA0B;cANtC,SAAS;6BACI,KAAK,YACP,wBAAwB;;kBAKjC,MAAM;;kBACN,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kFAJK,0BAA0B","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { IMetadataProvider } from '@memberjunction/core';\n\n/**\n * Enhanced dialog wrapper component for the data context viewer\n */\n@Component({\n standalone: false,\n selector: 'mj-data-context-dialog',\n templateUrl: './ng-data-context-dialog.component.html',\n styleUrls: ['./ng-data-context-dialog.component.css']\n})\nexport class DataContextDialogComponent {\n @Output() dialogClosed = new EventEmitter();\n @Input() dataContextId!: string;\n @Input() dataContextName?: string;\n @Input() Provider: IMetadataProvider | null = null;\n \n public isMaximized: boolean = false;\n\n public get dialogWidth(): number {\n return this.isMaximized ? window.innerWidth * 0.95 : 900;\n }\n\n public get dialogHeight(): number {\n return this.isMaximized ? window.innerHeight * 0.95 : 700;\n }\n\n closeDialog(): void {\n this.dialogClosed.emit();\n }\n\n toggleMaximize(): void {\n this.isMaximized = !this.isMaximized;\n }\n}","<div class=\"data-context-dialog-wrapper\">\n <div class=\"k-overlay\"></div>\n <kendo-window \n class=\"data-context-window\"\n [class.maximized]=\"isMaximized\"\n [width]=\"dialogWidth\"\n [height]=\"dialogHeight\"\n [minHeight]=\"400\"\n [minWidth]=\"600\"\n [resizable]=\"!isMaximized\"\n [draggable]=\"!isMaximized\"\n (close)=\"closeDialog()\">\n \n <kendo-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 </kendo-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 </kendo-window>\n</div>"]}
1
+ {"version":3,"file":"ng-data-context-dialog.component.js","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts","../../src/lib/ng-data-context-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;AAGvE;;GAEG;AAOH,MAAM,OAAO,0BAA0B;IAC3B,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACnC,aAAa,CAAU;IACvB,eAAe,CAAU;IACzB,QAAQ,GAA6B,IAAI,CAAC;IAE5C,WAAW,GAAY,KAAK,CAAC;IAEpC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,CAAC;IAED,WAAW;QACT,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACvC,CAAC;oHAtBU,0BAA0B;6DAA1B,0BAA0B;YCZvC,8BAAyC;YACrC,yBAA6B;YAC7B,oCAU4B;YAAxB,0GAAS,iBAAa,IAAC;YAGnB,AADJ,0CAAoB,aACU;YACtB,uBAAkD;YAClD,4BAAM;YAAA,YAA+D;YACzE,AADyE,iBAAO,EAC1E;YAEF,AADJ,8BAA4B,gBAIM;YAF1B,uGAAS,oBAAgB,IAAC;YAG1B,wBAA6F;YACjG,iBAAS;YACT,kCAG8B;YAF1B,wGAAS,iBAAa,IAAC;YAGvB,wBAAiC;YAG7C,AADI,AADI,iBAAS,EACP,EACW;YAErB,gCAA4B;YACxB,uCAGkB;YAG9B,AADI,AADI,iBAAM,EACE,EACV;;YAtCE,eAA+B;YAA/B,4CAA+B;YAO/B,AADA,AADA,AADA,AADA,AADA,AADA,8BAAgB,0BACK,4BACE,kBACN,iBACD,+BACU,+BACA;YAMZ,eAA+D;YAA/D,4FAA+D;YAKjE,eAAkD;YAAlD,uBAAA,0DAAkD,CAAA;YAE9B,cAAkC;YAAC,AAAnC,+CAAkC,gCAAkC;YAa5F,eAA+B;YAC/B,AADA,iDAA+B,0BACV;;;iFD1BxB,0BAA0B;cANtC,SAAS;6BACI,KAAK,YACP,wBAAwB;;kBAKjC,MAAM;;kBACN,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kFAJK,0BAA0B","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { IMetadataProvider } from '@memberjunction/core';\n\n/**\n * Enhanced dialog wrapper component for the data context viewer\n */\n@Component({\n standalone: false,\n selector: 'mj-data-context-dialog',\n templateUrl: './ng-data-context-dialog.component.html',\n styleUrls: ['./ng-data-context-dialog.component.css']\n})\nexport class DataContextDialogComponent {\n @Output() dialogClosed = new EventEmitter();\n @Input() dataContextId!: string;\n @Input() dataContextName?: string;\n @Input() Provider: IMetadataProvider | null = null;\n \n public isMaximized: boolean = false;\n\n public get dialogWidth(): number {\n return this.isMaximized ? window.innerWidth * 0.95 : 900;\n }\n\n public get dialogHeight(): number {\n return this.isMaximized ? window.innerHeight * 0.95 : 700;\n }\n\n closeDialog(): void {\n this.dialogClosed.emit();\n }\n\n toggleMaximize(): void {\n this.isMaximized = !this.isMaximized;\n }\n}","<div class=\"data-context-dialog-wrapper\">\n <div class=\"k-overlay\"></div>\n <mj-window\n class=\"data-context-window\"\n [class.maximized]=\"isMaximized\"\n [Visible]=\"true\"\n [Width]=\"dialogWidth\"\n [Height]=\"dialogHeight\"\n [MinHeight]=\"400\"\n [MinWidth]=\"600\"\n [Resizable]=\"!isMaximized\"\n [Draggable]=\"!isMaximized\"\n (Close)=\"closeDialog()\">\n\n <mj-window-titlebar>\n <div class=\"window-title\">\n <i class=\"fa-solid fa-layer-group title-icon\"></i>\n <span>Data Context{{ dataContextName ? ': ' + dataContextName : '' }}</span>\n </div>\n <div class=\"window-actions\">\n <button\n (click)=\"toggleMaximize()\"\n title=\"{{ isMaximized ? 'Restore' : 'Maximize' }}\"\n class=\"window-action-btn\">\n <i class=\"fa-solid\" [class.fa-maximize]=\"!isMaximized\" [class.fa-compress]=\"isMaximized\"></i>\n </button>\n <button\n (click)=\"closeDialog()\"\n title=\"Close\"\n class=\"window-action-btn\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </mj-window-titlebar>\n\n <div class=\"dialog-content\">\n <mj-data-context\n [dataContextId]=\"dataContextId\"\n [Provider]=\"Provider\">\n </mj-data-context>\n </div>\n </mj-window>\n</div>"]}
@@ -3,10 +3,9 @@ import { LogError, Metadata, RunView } from '@memberjunction/core';
3
3
  import { UUIDsEqual } from '@memberjunction/global';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/forms";
6
- import * as i2 from "@progress/kendo-angular-buttons";
7
- import * as i3 from "@progress/kendo-angular-inputs";
8
- import * as i4 from "@memberjunction/ng-shared-generic";
9
- import * as i5 from "@angular/common";
6
+ import * as i2 from "@memberjunction/ng-ui-components";
7
+ import * as i3 from "@memberjunction/ng-shared-generic";
8
+ import * as i4 from "@angular/common";
10
9
  const _forTrack0 = ($index, $item) => $item.ID;
11
10
  function DataContextComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
12
11
  i0.ɵɵelementStart(0, "div", 1);
@@ -24,7 +23,7 @@ function DataContextComponent_Conditional_2_Conditional_6_Template(rf, ctx) { if
24
23
  } }
25
24
  function DataContextComponent_Conditional_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
26
25
  i0.ɵɵelementStart(0, "div", 20);
27
- i0.ɵɵelement(1, "i", 27);
26
+ i0.ɵɵelement(1, "i", 28);
28
27
  i0.ɵɵtext(2);
29
28
  i0.ɵɵelementEnd();
30
29
  } if (rf & 2) {
@@ -32,10 +31,7 @@ function DataContextComponent_Conditional_2_Conditional_23_Template(rf, ctx) { i
32
31
  i0.ɵɵadvance(2);
33
32
  i0.ɵɵtextInterpolate1(" ", ctx_r1.errorMessage, " ");
34
33
  } }
35
- function DataContextComponent_Conditional_2_ng_template_26_Template(rf, ctx) { if (rf & 1) {
36
- i0.ɵɵelement(0, "i", 28);
37
- } }
38
- function DataContextComponent_Conditional_2_For_29_Conditional_7_Template(rf, ctx) { if (rf & 1) {
34
+ function DataContextComponent_Conditional_2_For_30_Conditional_7_Template(rf, ctx) { if (rf & 1) {
39
35
  i0.ɵɵelementStart(0, "span", 33);
40
36
  i0.ɵɵtext(1);
41
37
  i0.ɵɵelementEnd();
@@ -44,19 +40,19 @@ function DataContextComponent_Conditional_2_For_29_Conditional_7_Template(rf, ct
44
40
  i0.ɵɵadvance();
45
41
  i0.ɵɵtextInterpolate(item_r4.Description);
46
42
  } }
47
- function DataContextComponent_Conditional_2_For_29_Conditional_11_Template(rf, ctx) { if (rf & 1) {
43
+ function DataContextComponent_Conditional_2_For_30_Conditional_11_Template(rf, ctx) { if (rf & 1) {
48
44
  const _r5 = i0.ɵɵgetCurrentView();
49
45
  i0.ɵɵelementStart(0, "div", 36)(1, "div", 43)(2, "h4");
50
46
  i0.ɵɵelement(3, "i", 44);
51
47
  i0.ɵɵtext(4, " SQL Query");
52
48
  i0.ɵɵelementEnd();
53
49
  i0.ɵɵelementStart(5, "div", 45)(6, "button", 46);
54
- i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_29_Conditional_11_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r5); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.copyToClipboard(item_r4.SQL, "sql-" + item_r4.ID)); });
50
+ i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_30_Conditional_11_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r5); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.copyToClipboard(item_r4.SQL, "sql-" + item_r4.ID)); });
55
51
  i0.ɵɵelement(7, "i", 13);
56
52
  i0.ɵɵtext(8);
57
53
  i0.ɵɵelementEnd();
58
54
  i0.ɵɵelementStart(9, "button", 47);
59
- i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_29_Conditional_11_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r5); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.previewSQLCode(item_r4.SQL)); });
55
+ i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_30_Conditional_11_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r5); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.previewSQLCode(item_r4.SQL)); });
60
56
  i0.ɵɵelement(10, "i", 48);
61
57
  i0.ɵɵtext(11, " Expand ");
62
58
  i0.ɵɵelementEnd()()();
@@ -73,7 +69,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_11_Template(rf, c
73
69
  i0.ɵɵadvance(6);
74
70
  i0.ɵɵtextInterpolate(item_r4.SQL);
75
71
  } }
76
- function DataContextComponent_Conditional_2_For_29_Conditional_14_Template(rf, ctx) { if (rf & 1) {
72
+ function DataContextComponent_Conditional_2_For_30_Conditional_14_Template(rf, ctx) { if (rf & 1) {
77
73
  const _r6 = i0.ɵɵgetCurrentView();
78
74
  i0.ɵɵelementStart(0, "div", 39)(1, "span", 50);
79
75
  i0.ɵɵtext(2, "Entity");
@@ -82,7 +78,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_14_Template(rf, c
82
78
  i0.ɵɵtext(5);
83
79
  i0.ɵɵelementEnd();
84
80
  i0.ɵɵelementStart(6, "button", 52);
85
- i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_29_Conditional_14_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r6); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity(item_r4.EntityID)); });
81
+ i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_30_Conditional_14_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r6); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToEntity(item_r4.EntityID)); });
86
82
  i0.ɵɵelement(7, "i", 53);
87
83
  i0.ɵɵelementEnd()()();
88
84
  } if (rf & 2) {
@@ -91,7 +87,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_14_Template(rf, c
91
87
  i0.ɵɵadvance(5);
92
88
  i0.ɵɵtextInterpolate(ctx_r1.getEntityName(item_r4.EntityID) || "Unknown");
93
89
  } }
94
- function DataContextComponent_Conditional_2_For_29_Conditional_15_Template(rf, ctx) { if (rf & 1) {
90
+ function DataContextComponent_Conditional_2_For_30_Conditional_15_Template(rf, ctx) { if (rf & 1) {
95
91
  const _r7 = i0.ɵɵgetCurrentView();
96
92
  i0.ɵɵelementStart(0, "div", 39)(1, "span", 50);
97
93
  i0.ɵɵtext(2, "View");
@@ -101,7 +97,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_15_Template(rf, c
101
97
  i0.ɵɵpipe(6, "slice");
102
98
  i0.ɵɵelementEnd();
103
99
  i0.ɵɵelementStart(7, "button", 55);
104
- i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_29_Conditional_15_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r7); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToView(item_r4.ViewID)); });
100
+ i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_30_Conditional_15_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r7); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToView(item_r4.ViewID)); });
105
101
  i0.ɵɵelement(8, "i", 53);
106
102
  i0.ɵɵelementEnd()()();
107
103
  } if (rf & 2) {
@@ -111,7 +107,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_15_Template(rf, c
111
107
  i0.ɵɵadvance();
112
108
  i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind3(6, 4, item_r4.ViewID, 0, 20), "", item_r4.ViewID.length > 20 ? "..." : "");
113
109
  } }
114
- function DataContextComponent_Conditional_2_For_29_Conditional_16_Template(rf, ctx) { if (rf & 1) {
110
+ function DataContextComponent_Conditional_2_For_30_Conditional_16_Template(rf, ctx) { if (rf & 1) {
115
111
  const _r8 = i0.ɵɵgetCurrentView();
116
112
  i0.ɵɵelementStart(0, "div", 39)(1, "span", 50);
117
113
  i0.ɵɵtext(2, "Query");
@@ -121,7 +117,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_16_Template(rf, c
121
117
  i0.ɵɵpipe(6, "slice");
122
118
  i0.ɵɵelementEnd();
123
119
  i0.ɵɵelementStart(7, "button", 56);
124
- i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_29_Conditional_16_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r8); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToQuery(item_r4.QueryID)); });
120
+ i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_30_Conditional_16_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r8); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.navigateToQuery(item_r4.QueryID)); });
125
121
  i0.ɵɵelement(8, "i", 53);
126
122
  i0.ɵɵelementEnd()()();
127
123
  } if (rf & 2) {
@@ -131,7 +127,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_16_Template(rf, c
131
127
  i0.ɵɵadvance();
132
128
  i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind3(6, 4, item_r4.QueryID, 0, 20), "", item_r4.QueryID.length > 20 ? "..." : "");
133
129
  } }
134
- function DataContextComponent_Conditional_2_For_29_Conditional_17_Template(rf, ctx) { if (rf & 1) {
130
+ function DataContextComponent_Conditional_2_For_30_Conditional_17_Template(rf, ctx) { if (rf & 1) {
135
131
  const _r9 = i0.ɵɵgetCurrentView();
136
132
  i0.ɵɵelementStart(0, "div", 39)(1, "span", 50);
137
133
  i0.ɵɵtext(2, "Record ID");
@@ -140,7 +136,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_17_Template(rf, c
140
136
  i0.ɵɵtext(5);
141
137
  i0.ɵɵelementEnd();
142
138
  i0.ɵɵelementStart(6, "button", 57);
143
- i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_29_Conditional_17_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r9); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.copyToClipboard(item_r4.RecordID, "record-" + item_r4.ID)); });
139
+ i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_30_Conditional_17_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r9); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.copyToClipboard(item_r4.RecordID, "record-" + item_r4.ID)); });
144
140
  i0.ɵɵelement(7, "i", 13);
145
141
  i0.ɵɵelementEnd()()();
146
142
  } if (rf & 2) {
@@ -151,7 +147,7 @@ function DataContextComponent_Conditional_2_For_29_Conditional_17_Template(rf, c
151
147
  i0.ɵɵadvance(2);
152
148
  i0.ɵɵclassProp("fa-copy", ctx_r1.copiedField !== "record-" + item_r4.ID)("fa-check", ctx_r1.copiedField === "record-" + item_r4.ID);
153
149
  } }
154
- function DataContextComponent_Conditional_2_For_29_Conditional_23_Template(rf, ctx) { if (rf & 1) {
150
+ function DataContextComponent_Conditional_2_For_30_Conditional_23_Template(rf, ctx) { if (rf & 1) {
155
151
  i0.ɵɵelementStart(0, "span", 41);
156
152
  i0.ɵɵelement(1, "i", 58);
157
153
  i0.ɵɵtext(2);
@@ -162,34 +158,34 @@ function DataContextComponent_Conditional_2_For_29_Conditional_23_Template(rf, c
162
158
  i0.ɵɵadvance(2);
163
159
  i0.ɵɵtextInterpolate1(" Updated ", i0.ɵɵpipeBind2(3, 1, item_r4.__mj_UpdatedAt, "short"), " ");
164
160
  } }
165
- function DataContextComponent_Conditional_2_For_29_Template(rf, ctx) { if (rf & 1) {
161
+ function DataContextComponent_Conditional_2_For_30_Template(rf, ctx) { if (rf & 1) {
166
162
  const _r3 = i0.ɵɵgetCurrentView();
167
163
  i0.ɵɵelementStart(0, "div", 29)(1, "div", 30);
168
- i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_29_Template_div_click_1_listener() { const item_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleItemExpansion(item_r4.ID)); });
164
+ i0.ɵɵlistener("click", function DataContextComponent_Conditional_2_For_30_Template_div_click_1_listener() { const item_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleItemExpansion(item_r4.ID)); });
169
165
  i0.ɵɵelementStart(2, "div", 31)(3, "div", 32);
170
166
  i0.ɵɵelement(4, "i");
171
167
  i0.ɵɵelementStart(5, "span");
172
168
  i0.ɵɵtext(6);
173
169
  i0.ɵɵelementEnd()();
174
- i0.ɵɵconditionalCreate(7, DataContextComponent_Conditional_2_For_29_Conditional_7_Template, 2, 1, "span", 33);
170
+ i0.ɵɵconditionalCreate(7, DataContextComponent_Conditional_2_For_30_Conditional_7_Template, 2, 1, "span", 33);
175
171
  i0.ɵɵelementEnd();
176
172
  i0.ɵɵelementStart(8, "button", 34);
177
173
  i0.ɵɵelement(9, "i", 13);
178
174
  i0.ɵɵelementEnd()();
179
175
  i0.ɵɵelementStart(10, "div", 35);
180
- i0.ɵɵconditionalCreate(11, DataContextComponent_Conditional_2_For_29_Conditional_11_Template, 15, 6, "div", 36);
176
+ i0.ɵɵconditionalCreate(11, DataContextComponent_Conditional_2_For_30_Conditional_11_Template, 15, 6, "div", 36);
181
177
  i0.ɵɵelementStart(12, "div", 37)(13, "div", 38);
182
- i0.ɵɵconditionalCreate(14, DataContextComponent_Conditional_2_For_29_Conditional_14_Template, 8, 1, "div", 39);
183
- i0.ɵɵconditionalCreate(15, DataContextComponent_Conditional_2_For_29_Conditional_15_Template, 9, 8, "div", 39);
184
- i0.ɵɵconditionalCreate(16, DataContextComponent_Conditional_2_For_29_Conditional_16_Template, 9, 8, "div", 39);
185
- i0.ɵɵconditionalCreate(17, DataContextComponent_Conditional_2_For_29_Conditional_17_Template, 8, 5, "div", 39);
178
+ i0.ɵɵconditionalCreate(14, DataContextComponent_Conditional_2_For_30_Conditional_14_Template, 8, 1, "div", 39);
179
+ i0.ɵɵconditionalCreate(15, DataContextComponent_Conditional_2_For_30_Conditional_15_Template, 9, 8, "div", 39);
180
+ i0.ɵɵconditionalCreate(16, DataContextComponent_Conditional_2_For_30_Conditional_16_Template, 9, 8, "div", 39);
181
+ i0.ɵɵconditionalCreate(17, DataContextComponent_Conditional_2_For_30_Conditional_17_Template, 8, 5, "div", 39);
186
182
  i0.ɵɵelementEnd()();
187
183
  i0.ɵɵelementStart(18, "div", 40)(19, "span", 41);
188
184
  i0.ɵɵelement(20, "i", 42);
189
185
  i0.ɵɵtext(21);
190
186
  i0.ɵɵpipe(22, "date");
191
187
  i0.ɵɵelementEnd();
192
- i0.ɵɵconditionalCreate(23, DataContextComponent_Conditional_2_For_29_Conditional_23_Template, 4, 4, "span", 41);
188
+ i0.ɵɵconditionalCreate(23, DataContextComponent_Conditional_2_For_30_Conditional_23_Template, 4, 4, "span", 41);
193
189
  i0.ɵɵelementEnd()()();
194
190
  } if (rf & 2) {
195
191
  const item_r4 = ctx.$implicit;
@@ -220,8 +216,8 @@ function DataContextComponent_Conditional_2_For_29_Template(rf, ctx) { if (rf &
220
216
  i0.ɵɵadvance(2);
221
217
  i0.ɵɵconditional(item_r4.__mj_UpdatedAt && item_r4.__mj_UpdatedAt !== item_r4.__mj_CreatedAt ? 23 : -1);
222
218
  } }
223
- function DataContextComponent_Conditional_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
224
- i0.ɵɵelementStart(0, "div", 26);
219
+ function DataContextComponent_Conditional_2_Conditional_31_Template(rf, ctx) { if (rf & 1) {
220
+ i0.ɵɵelementStart(0, "div", 27);
225
221
  i0.ɵɵelement(1, "i", 59);
226
222
  i0.ɵɵelementStart(2, "p");
227
223
  i0.ɵɵtext(3, "No items found");
@@ -257,14 +253,15 @@ function DataContextComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
257
253
  i0.ɵɵtext(22, " Export ");
258
254
  i0.ɵɵelementEnd()()();
259
255
  i0.ɵɵconditionalCreate(23, DataContextComponent_Conditional_2_Conditional_23_Template, 3, 1, "div", 20);
260
- i0.ɵɵelementStart(24, "div", 21)(25, "kendo-textbox", 22);
261
- i0.ɵɵtwoWayListener("ngModelChange", function DataContextComponent_Conditional_2_Template_kendo_textbox_ngModelChange_25_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.searchTerm, $event) || (ctx_r1.searchTerm = $event); return i0.ɵɵresetView($event); });
262
- i0.ɵɵlistener("ngModelChange", function DataContextComponent_Conditional_2_Template_kendo_textbox_ngModelChange_25_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSearchChange()); });
263
- i0.ɵɵtemplate(26, DataContextComponent_Conditional_2_ng_template_26_Template, 1, 0, "ng-template", 23);
264
- i0.ɵɵelementEnd()();
265
- i0.ɵɵelementStart(27, "div", 24);
266
- i0.ɵɵrepeaterCreate(28, DataContextComponent_Conditional_2_For_29_Template, 24, 24, "div", 25, _forTrack0);
267
- i0.ɵɵconditionalCreate(30, DataContextComponent_Conditional_2_Conditional_30_Template, 4, 0, "div", 26);
256
+ i0.ɵɵelementStart(24, "div", 21)(25, "div", 22);
257
+ i0.ɵɵelement(26, "i", 23);
258
+ i0.ɵɵelementStart(27, "input", 24);
259
+ i0.ɵɵtwoWayListener("ngModelChange", function DataContextComponent_Conditional_2_Template_input_ngModelChange_27_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.searchTerm, $event) || (ctx_r1.searchTerm = $event); return i0.ɵɵresetView($event); });
260
+ i0.ɵɵlistener("ngModelChange", function DataContextComponent_Conditional_2_Template_input_ngModelChange_27_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSearchChange()); });
261
+ i0.ɵɵelementEnd()()();
262
+ i0.ɵɵelementStart(28, "div", 25);
263
+ i0.ɵɵrepeaterCreate(29, DataContextComponent_Conditional_2_For_30_Template, 24, 24, "div", 26, _forTrack0);
264
+ i0.ɵɵconditionalCreate(31, DataContextComponent_Conditional_2_Conditional_31_Template, 4, 0, "div", 27);
268
265
  i0.ɵɵelementEnd();
269
266
  } if (rf & 2) {
270
267
  const ctx_r1 = i0.ɵɵnextContext();
@@ -280,13 +277,12 @@ function DataContextComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
280
277
  i0.ɵɵtextInterpolate2(" ", ctx_r1.itemCount, " ", ctx_r1.itemCount === 1 ? "item" : "items", " ");
281
278
  i0.ɵɵadvance(8);
282
279
  i0.ɵɵconditional(ctx_r1.errorMessage ? 23 : -1);
283
- i0.ɵɵadvance(2);
280
+ i0.ɵɵadvance(4);
284
281
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.searchTerm);
285
- i0.ɵɵproperty("clearButton", true);
286
- i0.ɵɵadvance(3);
282
+ i0.ɵɵadvance(2);
287
283
  i0.ɵɵrepeater(ctx_r1.filteredItems);
288
284
  i0.ɵɵadvance(2);
289
- i0.ɵɵconditional(ctx_r1.filteredItems.length === 0 ? 30 : -1);
285
+ i0.ɵɵconditional(ctx_r1.filteredItems.length === 0 ? 31 : -1);
290
286
  } }
291
287
  function DataContextComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
292
288
  const _r10 = i0.ɵɵgetCurrentView();
@@ -496,9 +492,9 @@ export class DataContextComponent {
496
492
  window.URL.revokeObjectURL(url);
497
493
  }
498
494
  static ɵfac = function DataContextComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DataContextComponent)(); };
499
- 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"], ["kendoButton", "", "look", "flat", "title", "Refresh", 3, "click"], [1, "fa-solid", "fa-rotate"], ["kendoButton", "", "look", "flat", "title", "Export to CSV", 3, "click"], [1, "fa-solid", "fa-download"], [1, "error-message"], [1, "search-container"], ["placeholder", "Search items by type, SQL, entity name, or description...", 1, "search-input", 3, "ngModelChange", "ngModel", "clearButton"], ["kendoTextBoxPrefixTemplate", ""], [1, "items-container"], [1, "data-context-card", 3, "expanded"], [1, "no-items"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-magnifying-glass", "search-icon"], [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, "fa-solid", "fa-inbox"], [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"], ["kendoButton", "", 3, "click"]], template: function DataContextComponent_Template(rf, ctx) { if (rf & 1) {
495
+ 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"], [1, "no-items"], [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, "fa-solid", "fa-inbox"], [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) {
500
496
  i0.ɵɵelementStart(0, "div", 0);
501
- i0.ɵɵconditionalCreate(1, DataContextComponent_Conditional_1_Template, 2, 0, "div", 1)(2, DataContextComponent_Conditional_2_Template, 31, 13);
497
+ i0.ɵɵconditionalCreate(1, DataContextComponent_Conditional_1_Template, 2, 0, "div", 1)(2, DataContextComponent_Conditional_2_Template, 32, 12);
502
498
  i0.ɵɵconditionalCreate(3, DataContextComponent_Conditional_3_Template, 15, 6, "div", 2);
503
499
  i0.ɵɵelementEnd();
504
500
  } if (rf & 2) {
@@ -506,11 +502,11 @@ export class DataContextComponent {
506
502
  i0.ɵɵconditional(ctx.showLoader ? 1 : 2);
507
503
  i0.ɵɵadvance(2);
508
504
  i0.ɵɵconditional(ctx.showSQLPreview ? 3 : -1);
509
- } }, dependencies: [i1.NgControlStatus, i1.NgModel, i2.ButtonComponent, i3.TextBoxComponent, i3.TextBoxPrefixTemplateDirective, i4.LoadingComponent, i5.SlicePipe, i5.DatePipe], styles: [".data-context-viewer[_ngcontent-%COMP%] {\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\n\n.loading-container[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n margin-top: 16px;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n}\n\n\n\n.data-context-header[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.header-icon[_ngcontent-%COMP%] {\n font-size: var(--mj-text-2xl);\n color: var(--mj-brand-primary);\n}\n\n.header-title[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.meta-item[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n}\n\n.copy-btn[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.copy-btn[_ngcontent-%COMP%] .fa-check[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n margin-right: 8px;\n}\n\n\n\n.items-container[_ngcontent-%COMP%] {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n}\n\n\n\n.data-context-card[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n box-shadow: var(--mj-shadow-md);\n}\n\n.data-context-card.expanded[_ngcontent-%COMP%] {\n box-shadow: var(--mj-shadow-lg);\n}\n\n\n\n.card-header[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-card);\n}\n\n.card-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n}\n\n.type-badge[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n.card-description[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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; \n\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n\n\n.card-content[_ngcontent-%COMP%] {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease;\n}\n\n.data-context-card.expanded[_ngcontent-%COMP%] .card-content[_ngcontent-%COMP%] {\n max-height: 2000px;\n}\n\n\n\n.sql-section[_ngcontent-%COMP%] {\n padding: 0 24px 20px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.sql-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.action-btn[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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[_ngcontent-%COMP%] .fa-check[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.sql-code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\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\n\n.metadata-section[_ngcontent-%COMP%] {\n padding: 0 24px 20px;\n}\n\n.metadata-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.metadata-item[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n background-color: var(--mj-brand-primary-subtle);\n}\n\n.link-btn[_ngcontent-%COMP%] .fa-check[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n.card-footer[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.timestamp[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n.no-items[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 20px;\n color: var(--mj-text-disabled);\n}\n\n.no-items[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n}\n\n.no-items[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n margin: 0;\n}\n\n\n\n.sql-preview-overlay[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.sql-preview-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 24px;\n background-color: var(--mj-bg-surface-card);\n}\n\n.sql-preview-content[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] {\n margin: 0;\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n.sql-preview-content[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n@media (max-width: 768px) {\n .data-context-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-start;\n }\n\n .items-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .card-header[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .sql-section[_ngcontent-%COMP%], \n .metadata-section[_ngcontent-%COMP%] {\n padding: 0 16px 16px;\n }\n\n .metadata-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .sql-preview-dialog[_ngcontent-%COMP%] {\n width: 95%;\n margin: 16px;\n }\n}"] });
505
+ } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i3.LoadingComponent, i4.SlicePipe, i4.DatePipe], styles: [".data-context-viewer[_ngcontent-%COMP%] {\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\n\n.loading-container[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n margin-top: 16px;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n}\n\n\n\n.data-context-header[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.header-icon[_ngcontent-%COMP%] {\n font-size: var(--mj-text-2xl);\n color: var(--mj-brand-primary);\n}\n\n.header-title[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n}\n\n.meta-item[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n}\n\n.copy-btn[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.copy-btn[_ngcontent-%COMP%] .fa-check[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n margin-right: 8px;\n}\n\n\n\n.items-container[_ngcontent-%COMP%] {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n}\n\n\n\n.data-context-card[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n box-shadow: var(--mj-shadow-md);\n}\n\n.data-context-card.expanded[_ngcontent-%COMP%] {\n box-shadow: var(--mj-shadow-lg);\n}\n\n\n\n.card-header[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-card);\n}\n\n.card-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n}\n\n.type-badge[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n.card-description[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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; \n\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n\n\n.card-content[_ngcontent-%COMP%] {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease;\n}\n\n.data-context-card.expanded[_ngcontent-%COMP%] .card-content[_ngcontent-%COMP%] {\n max-height: 2000px;\n}\n\n\n\n.sql-section[_ngcontent-%COMP%] {\n padding: 0 24px 20px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-muted);\n}\n\n.sql-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.action-btn[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]: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[_ngcontent-%COMP%] .fa-check[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.sql-code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\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\n\n.metadata-section[_ngcontent-%COMP%] {\n padding: 0 24px 20px;\n}\n\n.metadata-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n.metadata-item[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n background-color: var(--mj-brand-primary-subtle);\n}\n\n.link-btn[_ngcontent-%COMP%] .fa-check[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n\n\n.card-footer[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.timestamp[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n.no-items[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 20px;\n color: var(--mj-text-disabled);\n}\n\n.no-items[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n}\n\n.no-items[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n margin: 0;\n}\n\n\n\n.sql-preview-overlay[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.sql-preview-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 24px;\n background-color: var(--mj-bg-surface-card);\n}\n\n.sql-preview-content[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] {\n margin: 0;\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n.sql-preview-content[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: flex-end;\n}\n\n\n\n@media (max-width: 768px) {\n .data-context-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-start;\n }\n\n .items-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .card-header[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .sql-section[_ngcontent-%COMP%], \n .metadata-section[_ngcontent-%COMP%] {\n padding: 0 16px 16px;\n }\n\n .metadata-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .sql-preview-dialog[_ngcontent-%COMP%] {\n width: 95%;\n margin: 16px;\n }\n}"] });
510
506
  }
511
507
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataContextComponent, [{
512
508
  type: Component,
513
- 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 kendoButton look=\"flat\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Refresh\n </button>\n <button kendoButton look=\"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 <kendo-textbox \n [(ngModel)]=\"searchTerm\" \n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search items by type, SQL, entity name, or description...\"\n [clearButton]=\"true\"\n class=\"search-input\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n </ng-template>\n </kendo-textbox>\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 <div class=\"no-items\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No items found</p>\n </div>\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 kendoButton (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/* No Items */\n.no-items {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 20px;\n color: var(--mj-text-disabled);\n}\n\n.no-items i {\n font-size: 48px;\n margin-bottom: 16px;\n}\n\n.no-items p {\n font-size: var(--mj-text-base);\n margin: 0;\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
+ 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 <div class=\"no-items\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No items found</p>\n </div>\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/* No Items */\n.no-items {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 20px;\n color: var(--mj-text-disabled);\n}\n\n.no-items i {\n font-size: 48px;\n margin-bottom: 16px;\n}\n\n.no-items p {\n font-size: var(--mj-text-base);\n margin: 0;\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"] }]
514
510
  }], null, { dataContextId: [{
515
511
  type: Input
516
512
  }], Provider: [{
@@ -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, IRunViewProvider, 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 = new RunView(<IRunViewProvider><any>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 = new Metadata();\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 kendoButton look=\"flat\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n Refresh\n </button>\n <button kendoButton look=\"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 <kendo-textbox \n [(ngModel)]=\"searchTerm\" \n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search items by type, SQL, entity name, or description...\"\n [clearButton]=\"true\"\n class=\"search-input\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n </ng-template>\n </kendo-textbox>\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 <div class=\"no-items\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No items found</p>\n </div>\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 kendoButton (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, IRunViewProvider, 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 = new RunView(<IRunViewProvider><any>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 = new Metadata();\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 <div class=\"no-items\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No items found</p>\n </div>\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": "5.21.0",
3
+ "version": "5.23.0",
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",
@@ -22,20 +22,16 @@
22
22
  },
23
23
  "peerDependencies": {
24
24
  "@angular/common": "21.1.3",
25
- "@angular/core": "21.1.3",
26
- "@progress/kendo-angular-grid": "22.0.1",
27
- "@progress/kendo-angular-indicators": "22.0.1"
25
+ "@angular/core": "21.1.3"
28
26
  },
29
27
  "dependencies": {
30
28
  "@angular/forms": "21.1.3",
31
- "@memberjunction/core": "5.21.0",
32
- "@memberjunction/core-entities": "5.21.0",
33
- "@memberjunction/global": "5.21.0",
34
- "@memberjunction/ng-container-directives": "5.21.0",
35
- "@memberjunction/ng-shared-generic": "5.21.0",
36
- "@progress/kendo-angular-buttons": "22.0.1",
37
- "@progress/kendo-angular-dialog": "22.0.1",
38
- "@progress/kendo-angular-inputs": "22.0.1",
29
+ "@memberjunction/core": "5.23.0",
30
+ "@memberjunction/core-entities": "5.23.0",
31
+ "@memberjunction/global": "5.23.0",
32
+ "@memberjunction/ng-container-directives": "5.23.0",
33
+ "@memberjunction/ng-shared-generic": "5.23.0",
34
+ "@memberjunction/ng-ui-components": "5.23.0",
39
35
  "tslib": "^2.8.1"
40
36
  },
41
37
  "sideEffects": false,