@memberjunction/ng-query-viewer 3.3.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/query-data-grid/query-data-grid.component.d.ts.map +1 -1
- package/dist/lib/query-data-grid/query-data-grid.component.js +48 -45
- package/dist/lib/query-data-grid/query-data-grid.component.js.map +1 -1
- package/dist/lib/query-info-panel/query-info-panel.component.d.ts.map +1 -1
- package/dist/lib/query-info-panel/query-info-panel.component.js +156 -156
- package/dist/lib/query-info-panel/query-info-panel.component.js.map +1 -1
- package/dist/lib/query-parameter-form/query-parameter-form.component.d.ts.map +1 -1
- package/dist/lib/query-parameter-form/query-parameter-form.component.js +91 -97
- package/dist/lib/query-parameter-form/query-parameter-form.component.js.map +1 -1
- package/dist/lib/query-row-detail/query-row-detail.component.d.ts.map +1 -1
- package/dist/lib/query-row-detail/query-row-detail.component.js +126 -119
- package/dist/lib/query-row-detail/query-row-detail.component.js.map +1 -1
- package/dist/lib/query-viewer/query-viewer.component.d.ts.map +1 -1
- package/dist/lib/query-viewer/query-viewer.component.js +59 -55
- package/dist/lib/query-viewer/query-viewer.component.js.map +1 -1
- package/dist/lib/query-viewer.module.d.ts +0 -5
- package/dist/lib/query-viewer.module.d.ts.map +1 -1
- package/dist/lib/query-viewer.module.js +0 -7
- package/dist/lib/query-viewer.module.js.map +1 -1
- package/dist/public-api.js +0 -3
- package/dist/public-api.js.map +1 -1
- package/package.json +18 -18
|
@@ -5,54 +5,53 @@ import { takeUntil, debounceTime } from 'rxjs/operators';
|
|
|
5
5
|
import { Metadata } from '@memberjunction/core';
|
|
6
6
|
import { UserInfoEngine } from '@memberjunction/core-entities';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
|
-
|
|
9
|
-
function QueryRowDetailComponent_div_0_div_8_Template(rf, ctx) { if (rf & 1) {
|
|
8
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
10
9
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
11
|
-
i0.ɵɵelementStart(0, "div",
|
|
12
|
-
i0.ɵɵlistener("click", function
|
|
13
|
-
i0.ɵɵelement(2, "i",
|
|
10
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "button", 18);
|
|
11
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_8_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNavigatePrev()); });
|
|
12
|
+
i0.ɵɵelement(2, "i", 19);
|
|
14
13
|
i0.ɵɵelementEnd();
|
|
15
|
-
i0.ɵɵelementStart(3, "span",
|
|
14
|
+
i0.ɵɵelementStart(3, "span", 20);
|
|
16
15
|
i0.ɵɵtext(4);
|
|
17
16
|
i0.ɵɵelementEnd();
|
|
18
|
-
i0.ɵɵelementStart(5, "button",
|
|
19
|
-
i0.ɵɵlistener("click", function
|
|
20
|
-
i0.ɵɵelement(6, "i",
|
|
17
|
+
i0.ɵɵelementStart(5, "button", 21);
|
|
18
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_8_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNavigateNext()); });
|
|
19
|
+
i0.ɵɵelement(6, "i", 22);
|
|
21
20
|
i0.ɵɵelementEnd()();
|
|
22
21
|
} if (rf & 2) {
|
|
23
22
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
24
23
|
i0.ɵɵadvance();
|
|
25
24
|
i0.ɵɵproperty("disabled", ctx_r1.RowIndex === 0);
|
|
26
25
|
i0.ɵɵadvance(3);
|
|
27
|
-
i0.ɵɵtextInterpolate2("", ctx_r1.RowIndex + 1, " / ", ctx_r1.TotalRows
|
|
26
|
+
i0.ɵɵtextInterpolate2("", ctx_r1.RowIndex + 1, " / ", ctx_r1.TotalRows);
|
|
28
27
|
i0.ɵɵadvance();
|
|
29
28
|
i0.ɵɵproperty("disabled", ctx_r1.RowIndex >= ctx_r1.TotalRows - 1);
|
|
30
29
|
} }
|
|
31
|
-
function
|
|
32
|
-
i0.ɵɵelement(0, "i",
|
|
30
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_16_For_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
31
|
+
i0.ɵɵelement(0, "i", 34);
|
|
33
32
|
} if (rf & 2) {
|
|
34
33
|
const field_r5 = i0.ɵɵnextContext().$implicit;
|
|
35
34
|
i0.ɵɵclassMap(field_r5.targetEntityIcon);
|
|
36
35
|
} }
|
|
37
|
-
function
|
|
38
|
-
i0.ɵɵelement(0, "i",
|
|
36
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_16_For_6_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelement(0, "i", 33);
|
|
39
38
|
} }
|
|
40
|
-
function
|
|
39
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_16_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
41
40
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
42
|
-
i0.ɵɵelementStart(0, "div",
|
|
41
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "div", 27)(2, "span", 28);
|
|
43
42
|
i0.ɵɵtext(3);
|
|
44
43
|
i0.ɵɵelementEnd();
|
|
45
|
-
i0.ɵɵelementStart(4, "button",
|
|
46
|
-
i0.ɵɵlistener("click", function
|
|
44
|
+
i0.ɵɵelementStart(4, "button", 29);
|
|
45
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_16_For_6_Template_button_click_4_listener() { const field_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyValue(field_r5)); });
|
|
47
46
|
i0.ɵɵelement(5, "i", 13);
|
|
48
47
|
i0.ɵɵelementEnd()();
|
|
49
|
-
i0.ɵɵelementStart(6, "div",
|
|
50
|
-
i0.ɵɵlistener("click", function
|
|
51
|
-
i0.ɵɵ
|
|
52
|
-
i0.ɵɵelementStart(8, "span",
|
|
48
|
+
i0.ɵɵelementStart(6, "div", 30);
|
|
49
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_16_For_6_Template_div_click_6_listener() { const field_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(field_r5.targetEntityName && ctx_r1.onEntityLinkClick(field_r5)); });
|
|
50
|
+
i0.ɵɵconditionalCreate(7, QueryRowDetailComponent_Conditional_0_Conditional_16_For_6_Conditional_7_Template, 1, 2, "i", 31);
|
|
51
|
+
i0.ɵɵelementStart(8, "span", 32);
|
|
53
52
|
i0.ɵɵtext(9);
|
|
54
53
|
i0.ɵɵelementEnd();
|
|
55
|
-
i0.ɵɵ
|
|
54
|
+
i0.ɵɵconditionalCreate(10, QueryRowDetailComponent_Conditional_0_Conditional_16_For_6_Conditional_10_Template, 1, 0, "i", 33);
|
|
56
55
|
i0.ɵɵelementEnd()();
|
|
57
56
|
} if (rf & 2) {
|
|
58
57
|
const field_r5 = ctx.$implicit;
|
|
@@ -61,28 +60,28 @@ function QueryRowDetailComponent_div_0_div_16_div_5_Template(rf, ctx) { if (rf &
|
|
|
61
60
|
i0.ɵɵadvance(3);
|
|
62
61
|
i0.ɵɵclassProp("clickable", field_r5.targetEntityName);
|
|
63
62
|
i0.ɵɵadvance();
|
|
64
|
-
i0.ɵɵ
|
|
63
|
+
i0.ɵɵconditional(field_r5.targetEntityIcon ? 7 : -1);
|
|
65
64
|
i0.ɵɵadvance(2);
|
|
66
65
|
i0.ɵɵtextInterpolate(field_r5.formattedValue);
|
|
67
66
|
i0.ɵɵadvance();
|
|
68
|
-
i0.ɵɵ
|
|
67
|
+
i0.ɵɵconditional(field_r5.targetEntityName ? 10 : -1);
|
|
69
68
|
} }
|
|
70
|
-
function
|
|
71
|
-
i0.ɵɵelementStart(0, "div",
|
|
72
|
-
i0.ɵɵelement(2, "i",
|
|
69
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
70
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h4", 23);
|
|
71
|
+
i0.ɵɵelement(2, "i", 24);
|
|
73
72
|
i0.ɵɵtext(3, " Primary Key ");
|
|
74
73
|
i0.ɵɵelementEnd();
|
|
75
|
-
i0.ɵɵelementStart(4, "div",
|
|
76
|
-
i0.ɵɵ
|
|
74
|
+
i0.ɵɵelementStart(4, "div", 25);
|
|
75
|
+
i0.ɵɵrepeaterCreate(5, QueryRowDetailComponent_Conditional_0_Conditional_16_For_6_Template, 11, 6, "div", 26, i0.ɵɵrepeaterTrackByIdentity);
|
|
77
76
|
i0.ɵɵelementEnd()();
|
|
78
77
|
} if (rf & 2) {
|
|
79
78
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
80
79
|
i0.ɵɵadvance(5);
|
|
81
|
-
i0.ɵɵ
|
|
80
|
+
i0.ɵɵrepeater(ctx_r1.getVisibleFields(ctx_r1.PrimaryKeyFields));
|
|
82
81
|
} }
|
|
83
|
-
function
|
|
84
|
-
i0.ɵɵelementStart(0, "span",
|
|
85
|
-
i0.ɵɵelement(1, "i",
|
|
82
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
84
|
+
i0.ɵɵelement(1, "i", 39);
|
|
86
85
|
i0.ɵɵtext(2);
|
|
87
86
|
i0.ɵɵelementEnd();
|
|
88
87
|
} if (rf & 2) {
|
|
@@ -90,72 +89,73 @@ function QueryRowDetailComponent_div_0_div_17_div_5_span_4_Template(rf, ctx) { i
|
|
|
90
89
|
i0.ɵɵadvance(2);
|
|
91
90
|
i0.ɵɵtextInterpolate1(" ", field_r7.targetEntityName, " ");
|
|
92
91
|
} }
|
|
93
|
-
function
|
|
94
|
-
i0.ɵɵelement(0, "i",
|
|
92
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
93
|
+
i0.ɵɵelement(0, "i", 34);
|
|
95
94
|
} if (rf & 2) {
|
|
96
95
|
const field_r7 = i0.ɵɵnextContext(2).$implicit;
|
|
97
96
|
i0.ɵɵclassMap(field_r7.targetEntityIcon);
|
|
98
97
|
} }
|
|
99
|
-
function
|
|
98
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
100
99
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
101
|
-
i0.ɵɵelementStart(0, "div",
|
|
102
|
-
i0.ɵɵlistener("click", function
|
|
103
|
-
i0.ɵɵ
|
|
104
|
-
i0.ɵɵelementStart(2, "span",
|
|
100
|
+
i0.ɵɵelementStart(0, "div", 40);
|
|
101
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_7_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r8); const field_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onEntityLinkClick(field_r7)); });
|
|
102
|
+
i0.ɵɵconditionalCreate(1, QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_7_Conditional_1_Template, 1, 2, "i", 31);
|
|
103
|
+
i0.ɵɵelementStart(2, "span", 32);
|
|
105
104
|
i0.ɵɵtext(3);
|
|
106
105
|
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵelement(4, "i",
|
|
106
|
+
i0.ɵɵelement(4, "i", 33);
|
|
108
107
|
i0.ɵɵelementEnd();
|
|
109
108
|
} if (rf & 2) {
|
|
110
109
|
const field_r7 = i0.ɵɵnextContext().$implicit;
|
|
111
110
|
i0.ɵɵadvance();
|
|
112
|
-
i0.ɵɵ
|
|
111
|
+
i0.ɵɵconditional(field_r7.targetEntityIcon ? 1 : -1);
|
|
113
112
|
i0.ɵɵadvance(2);
|
|
114
113
|
i0.ɵɵtextInterpolate(field_r7.formattedValue);
|
|
115
114
|
} }
|
|
116
|
-
function
|
|
117
|
-
i0.ɵɵelementStart(0, "div",
|
|
115
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
+
i0.ɵɵelementStart(0, "div", 38)(1, "span", 41);
|
|
118
117
|
i0.ɵɵtext(2, "(empty)");
|
|
119
118
|
i0.ɵɵelementEnd()();
|
|
120
119
|
} }
|
|
121
|
-
function
|
|
120
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
122
121
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
123
|
-
i0.ɵɵelementStart(0, "div",
|
|
122
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "div", 27)(2, "span", 28);
|
|
124
123
|
i0.ɵɵtext(3);
|
|
125
124
|
i0.ɵɵelementEnd();
|
|
126
|
-
i0.ɵɵ
|
|
127
|
-
i0.ɵɵelementStart(5, "button",
|
|
128
|
-
i0.ɵɵlistener("click", function
|
|
125
|
+
i0.ɵɵconditionalCreate(4, QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_4_Template, 3, 1, "span", 36);
|
|
126
|
+
i0.ɵɵelementStart(5, "button", 29);
|
|
127
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Template_button_click_5_listener() { const field_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyValue(field_r7)); });
|
|
129
128
|
i0.ɵɵelement(6, "i", 13);
|
|
130
129
|
i0.ɵɵelementEnd()();
|
|
131
|
-
i0.ɵɵ
|
|
130
|
+
i0.ɵɵconditionalCreate(7, QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_7_Template, 5, 2, "div", 37);
|
|
131
|
+
i0.ɵɵconditionalCreate(8, QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Conditional_8_Template, 3, 0, "div", 38);
|
|
132
132
|
i0.ɵɵelementEnd();
|
|
133
133
|
} if (rf & 2) {
|
|
134
134
|
const field_r7 = ctx.$implicit;
|
|
135
135
|
i0.ɵɵadvance(3);
|
|
136
136
|
i0.ɵɵtextInterpolate(field_r7.displayName);
|
|
137
137
|
i0.ɵɵadvance();
|
|
138
|
-
i0.ɵɵ
|
|
138
|
+
i0.ɵɵconditional(field_r7.targetEntityName ? 4 : -1);
|
|
139
139
|
i0.ɵɵadvance(3);
|
|
140
|
-
i0.ɵɵ
|
|
140
|
+
i0.ɵɵconditional(field_r7.value != null ? 7 : -1);
|
|
141
141
|
i0.ɵɵadvance();
|
|
142
|
-
i0.ɵɵ
|
|
142
|
+
i0.ɵɵconditional(field_r7.value == null ? 8 : -1);
|
|
143
143
|
} }
|
|
144
|
-
function
|
|
145
|
-
i0.ɵɵelementStart(0, "div",
|
|
146
|
-
i0.ɵɵelement(2, "i",
|
|
144
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
145
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h4", 23);
|
|
146
|
+
i0.ɵɵelement(2, "i", 35);
|
|
147
147
|
i0.ɵɵtext(3, " Related Records ");
|
|
148
148
|
i0.ɵɵelementEnd();
|
|
149
|
-
i0.ɵɵelementStart(4, "div",
|
|
150
|
-
i0.ɵɵ
|
|
149
|
+
i0.ɵɵelementStart(4, "div", 25);
|
|
150
|
+
i0.ɵɵrepeaterCreate(5, QueryRowDetailComponent_Conditional_0_Conditional_17_For_6_Template, 9, 4, "div", 26, i0.ɵɵrepeaterTrackByIdentity);
|
|
151
151
|
i0.ɵɵelementEnd()();
|
|
152
152
|
} if (rf & 2) {
|
|
153
153
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
154
154
|
i0.ɵɵadvance(5);
|
|
155
|
-
i0.ɵɵ
|
|
155
|
+
i0.ɵɵrepeater(ctx_r1.getVisibleFields(ctx_r1.ForeignKeyFields));
|
|
156
156
|
} }
|
|
157
|
-
function
|
|
158
|
-
i0.ɵɵelementStart(0, "span",
|
|
157
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
158
|
+
i0.ɵɵelementStart(0, "span", 43);
|
|
159
159
|
i0.ɵɵtext(1);
|
|
160
160
|
i0.ɵɵelementEnd();
|
|
161
161
|
} if (rf & 2) {
|
|
@@ -163,13 +163,13 @@ function QueryRowDetailComponent_div_0_div_18_span_4_Template(rf, ctx) { if (rf
|
|
|
163
163
|
i0.ɵɵadvance();
|
|
164
164
|
i0.ɵɵtextInterpolate1(" (", ctx_r1.getEmptyFieldCount(ctx_r1.RegularFields), " empty hidden) ");
|
|
165
165
|
} }
|
|
166
|
-
function
|
|
166
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
167
167
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
168
|
-
i0.ɵɵelementStart(0, "div",
|
|
168
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "pre", 50);
|
|
169
169
|
i0.ɵɵtext(2);
|
|
170
170
|
i0.ɵɵelementEnd();
|
|
171
|
-
i0.ɵɵelementStart(3, "button",
|
|
172
|
-
i0.ɵɵlistener("click", function
|
|
171
|
+
i0.ɵɵelementStart(3, "button", 51);
|
|
172
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_8_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r11); const field_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleFieldExpand(field_r10)); });
|
|
173
173
|
i0.ɵɵtext(4);
|
|
174
174
|
i0.ɵɵelementEnd()();
|
|
175
175
|
} if (rf & 2) {
|
|
@@ -181,13 +181,13 @@ function QueryRowDetailComponent_div_0_div_18_div_6_div_8_Template(rf, ctx) { if
|
|
|
181
181
|
i0.ɵɵadvance(2);
|
|
182
182
|
i0.ɵɵtextInterpolate1(" ", field_r10.isExpanded ? "Collapse" : "Expand", " ");
|
|
183
183
|
} }
|
|
184
|
-
function
|
|
184
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
185
185
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
186
|
-
i0.ɵɵelementStart(0, "div",
|
|
186
|
+
i0.ɵɵelementStart(0, "div", 52)(1, "span", 41);
|
|
187
187
|
i0.ɵɵtext(2);
|
|
188
188
|
i0.ɵɵelementEnd();
|
|
189
|
-
i0.ɵɵelementStart(3, "button",
|
|
190
|
-
i0.ɵɵlistener("click", function
|
|
189
|
+
i0.ɵɵelementStart(3, "button", 51);
|
|
190
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_9_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r12); const field_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleFieldExpand(field_r10)); });
|
|
191
191
|
i0.ɵɵtext(4);
|
|
192
192
|
i0.ɵɵelementEnd()();
|
|
193
193
|
} if (rf & 2) {
|
|
@@ -198,10 +198,10 @@ function QueryRowDetailComponent_div_0_div_18_div_6_div_9_Template(rf, ctx) { if
|
|
|
198
198
|
i0.ɵɵadvance(2);
|
|
199
199
|
i0.ɵɵtextInterpolate1(" ", field_r10.isExpanded ? "Show less" : "Show more", " ");
|
|
200
200
|
} }
|
|
201
|
-
function
|
|
202
|
-
i0.ɵɵelementStart(0, "div",
|
|
201
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
202
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
203
203
|
i0.ɵɵelement(1, "i");
|
|
204
|
-
i0.ɵɵelementStart(2, "span",
|
|
204
|
+
i0.ɵɵelementStart(2, "span", 41);
|
|
205
205
|
i0.ɵɵtext(3);
|
|
206
206
|
i0.ɵɵelementEnd()();
|
|
207
207
|
} if (rf & 2) {
|
|
@@ -211,13 +211,13 @@ function QueryRowDetailComponent_div_0_div_18_div_6_div_10_Template(rf, ctx) { i
|
|
|
211
211
|
i0.ɵɵadvance(2);
|
|
212
212
|
i0.ɵɵtextInterpolate(field_r10.formattedValue);
|
|
213
213
|
} }
|
|
214
|
-
function
|
|
215
|
-
i0.ɵɵelementStart(0, "div",
|
|
214
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
215
|
+
i0.ɵɵelementStart(0, "div", 38)(1, "span", 41);
|
|
216
216
|
i0.ɵɵtext(2, "(empty)");
|
|
217
217
|
i0.ɵɵelementEnd()();
|
|
218
218
|
} }
|
|
219
|
-
function
|
|
220
|
-
i0.ɵɵelementStart(0, "div",
|
|
219
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
220
|
+
i0.ɵɵelementStart(0, "div", 48)(1, "span", 41);
|
|
221
221
|
i0.ɵɵtext(2);
|
|
222
222
|
i0.ɵɵelementEnd()();
|
|
223
223
|
} if (rf & 2) {
|
|
@@ -227,19 +227,23 @@ function QueryRowDetailComponent_div_0_div_18_div_6_div_12_Template(rf, ctx) { i
|
|
|
227
227
|
i0.ɵɵadvance();
|
|
228
228
|
i0.ɵɵtextInterpolate1(" ", field_r10.formattedValue, " ");
|
|
229
229
|
} }
|
|
230
|
-
function
|
|
230
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
231
231
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
232
|
-
i0.ɵɵelementStart(0, "div",
|
|
232
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "div", 27)(2, "span", 28);
|
|
233
233
|
i0.ɵɵtext(3);
|
|
234
234
|
i0.ɵɵelementEnd();
|
|
235
|
-
i0.ɵɵelementStart(4, "span",
|
|
235
|
+
i0.ɵɵelementStart(4, "span", 44);
|
|
236
236
|
i0.ɵɵtext(5);
|
|
237
237
|
i0.ɵɵelementEnd();
|
|
238
|
-
i0.ɵɵelementStart(6, "button",
|
|
239
|
-
i0.ɵɵlistener("click", function
|
|
238
|
+
i0.ɵɵelementStart(6, "button", 29);
|
|
239
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Template_button_click_6_listener() { const field_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.copyValue(field_r10)); });
|
|
240
240
|
i0.ɵɵelement(7, "i", 13);
|
|
241
241
|
i0.ɵɵelementEnd()();
|
|
242
|
-
i0.ɵɵ
|
|
242
|
+
i0.ɵɵconditionalCreate(8, QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_8_Template, 5, 4, "div", 45);
|
|
243
|
+
i0.ɵɵconditionalCreate(9, QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_9_Template, 5, 4, "div", 46);
|
|
244
|
+
i0.ɵɵconditionalCreate(10, QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_10_Template, 4, 3, "div", 47);
|
|
245
|
+
i0.ɵɵconditionalCreate(11, QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_11_Template, 3, 0, "div", 38);
|
|
246
|
+
i0.ɵɵconditionalCreate(12, QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Conditional_12_Template, 3, 3, "div", 48);
|
|
243
247
|
i0.ɵɵelementEnd();
|
|
244
248
|
} if (rf & 2) {
|
|
245
249
|
const field_r10 = ctx.$implicit;
|
|
@@ -249,36 +253,36 @@ function QueryRowDetailComponent_div_0_div_18_div_6_Template(rf, ctx) { if (rf &
|
|
|
249
253
|
i0.ɵɵadvance(2);
|
|
250
254
|
i0.ɵɵtextInterpolate(field_r10.sqlType);
|
|
251
255
|
i0.ɵɵadvance(3);
|
|
252
|
-
i0.ɵɵ
|
|
256
|
+
i0.ɵɵconditional(ctx_r1.isJson(field_r10.formattedValue) ? 8 : -1);
|
|
253
257
|
i0.ɵɵadvance();
|
|
254
|
-
i0.ɵɵ
|
|
258
|
+
i0.ɵɵconditional(!ctx_r1.isJson(field_r10.formattedValue) && field_r10.isLongText ? 9 : -1);
|
|
255
259
|
i0.ɵɵadvance();
|
|
256
|
-
i0.ɵɵ
|
|
260
|
+
i0.ɵɵconditional(field_r10.sqlType.toLowerCase() === "bit" && !ctx_r1.isJson(field_r10.formattedValue) ? 10 : -1);
|
|
257
261
|
i0.ɵɵadvance();
|
|
258
|
-
i0.ɵɵ
|
|
262
|
+
i0.ɵɵconditional(field_r10.value == null && !ctx_r1.isJson(field_r10.formattedValue) ? 11 : -1);
|
|
259
263
|
i0.ɵɵadvance();
|
|
260
|
-
i0.ɵɵ
|
|
264
|
+
i0.ɵɵconditional(field_r10.value != null && !ctx_r1.isJson(field_r10.formattedValue) && !field_r10.isLongText && field_r10.sqlType.toLowerCase() !== "bit" ? 12 : -1);
|
|
261
265
|
} }
|
|
262
|
-
function
|
|
263
|
-
i0.ɵɵelementStart(0, "div",
|
|
264
|
-
i0.ɵɵelement(2, "i",
|
|
266
|
+
function QueryRowDetailComponent_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
267
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "h4", 23);
|
|
268
|
+
i0.ɵɵelement(2, "i", 42);
|
|
265
269
|
i0.ɵɵtext(3, " Fields ");
|
|
266
|
-
i0.ɵɵ
|
|
270
|
+
i0.ɵɵconditionalCreate(4, QueryRowDetailComponent_Conditional_0_Conditional_18_Conditional_4_Template, 2, 1, "span", 43);
|
|
267
271
|
i0.ɵɵelementEnd();
|
|
268
|
-
i0.ɵɵelementStart(5, "div",
|
|
269
|
-
i0.ɵɵ
|
|
272
|
+
i0.ɵɵelementStart(5, "div", 25);
|
|
273
|
+
i0.ɵɵrepeaterCreate(6, QueryRowDetailComponent_Conditional_0_Conditional_18_For_7_Template, 13, 7, "div", 26, i0.ɵɵrepeaterTrackByIdentity);
|
|
270
274
|
i0.ɵɵelementEnd()();
|
|
271
275
|
} if (rf & 2) {
|
|
272
276
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
273
277
|
i0.ɵɵadvance(4);
|
|
274
|
-
i0.ɵɵ
|
|
278
|
+
i0.ɵɵconditional(ctx_r1.HideEmptyFields && ctx_r1.getEmptyFieldCount(ctx_r1.RegularFields) > 0 ? 4 : -1);
|
|
275
279
|
i0.ɵɵadvance(2);
|
|
276
|
-
i0.ɵɵ
|
|
280
|
+
i0.ɵɵrepeater(ctx_r1.getVisibleFields(ctx_r1.RegularFields));
|
|
277
281
|
} }
|
|
278
|
-
function
|
|
282
|
+
function QueryRowDetailComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
279
283
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
280
284
|
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3);
|
|
281
|
-
i0.ɵɵlistener("mousedown", function
|
|
285
|
+
i0.ɵɵlistener("mousedown", function QueryRowDetailComponent_Conditional_0_Template_div_mousedown_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeStart($event)); });
|
|
282
286
|
i0.ɵɵelementEnd();
|
|
283
287
|
i0.ɵɵelementStart(2, "div", 4)(3, "div", 5);
|
|
284
288
|
i0.ɵɵelement(4, "i", 6);
|
|
@@ -286,21 +290,23 @@ function QueryRowDetailComponent_div_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
286
290
|
i0.ɵɵtext(6, "Row Details");
|
|
287
291
|
i0.ɵɵelementEnd()();
|
|
288
292
|
i0.ɵɵelementStart(7, "div", 8);
|
|
289
|
-
i0.ɵɵ
|
|
293
|
+
i0.ɵɵconditionalCreate(8, QueryRowDetailComponent_Conditional_0_Conditional_8_Template, 7, 4, "div", 9);
|
|
290
294
|
i0.ɵɵelementStart(9, "button", 10);
|
|
291
|
-
i0.ɵɵlistener("click", function
|
|
295
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleHideEmptyFields()); });
|
|
292
296
|
i0.ɵɵelement(10, "i", 11);
|
|
293
297
|
i0.ɵɵelementEnd();
|
|
294
298
|
i0.ɵɵelementStart(11, "button", 12);
|
|
295
|
-
i0.ɵɵlistener("click", function
|
|
299
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.copyRowAsJson()); });
|
|
296
300
|
i0.ɵɵelement(12, "i", 13);
|
|
297
301
|
i0.ɵɵelementEnd();
|
|
298
302
|
i0.ɵɵelementStart(13, "button", 14);
|
|
299
|
-
i0.ɵɵlistener("click", function
|
|
303
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_0_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClose()); });
|
|
300
304
|
i0.ɵɵelement(14, "i", 15);
|
|
301
305
|
i0.ɵɵelementEnd()()();
|
|
302
306
|
i0.ɵɵelementStart(15, "div", 16);
|
|
303
|
-
i0.ɵɵ
|
|
307
|
+
i0.ɵɵconditionalCreate(16, QueryRowDetailComponent_Conditional_0_Conditional_16_Template, 7, 0, "div", 17);
|
|
308
|
+
i0.ɵɵconditionalCreate(17, QueryRowDetailComponent_Conditional_0_Conditional_17_Template, 7, 0, "div", 17);
|
|
309
|
+
i0.ɵɵconditionalCreate(18, QueryRowDetailComponent_Conditional_0_Conditional_18_Template, 8, 1, "div", 17);
|
|
304
310
|
i0.ɵɵelementEnd()();
|
|
305
311
|
} if (rf & 2) {
|
|
306
312
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -309,23 +315,23 @@ function QueryRowDetailComponent_div_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
309
315
|
i0.ɵɵadvance();
|
|
310
316
|
i0.ɵɵclassProp("resizing", ctx_r1.IsResizing);
|
|
311
317
|
i0.ɵɵadvance(7);
|
|
312
|
-
i0.ɵɵ
|
|
318
|
+
i0.ɵɵconditional(ctx_r1.TotalRows > 1 ? 8 : -1);
|
|
313
319
|
i0.ɵɵadvance();
|
|
314
320
|
i0.ɵɵclassProp("active", ctx_r1.HideEmptyFields);
|
|
315
321
|
i0.ɵɵproperty("title", ctx_r1.HideEmptyFields ? "Show empty fields" : "Hide empty fields");
|
|
316
322
|
i0.ɵɵadvance();
|
|
317
323
|
i0.ɵɵclassProp("fa-eye", !ctx_r1.HideEmptyFields)("fa-eye-slash", ctx_r1.HideEmptyFields);
|
|
318
324
|
i0.ɵɵadvance(6);
|
|
319
|
-
i0.ɵɵ
|
|
325
|
+
i0.ɵɵconditional(ctx_r1.getVisibleFields(ctx_r1.PrimaryKeyFields).length > 0 ? 16 : -1);
|
|
320
326
|
i0.ɵɵadvance();
|
|
321
|
-
i0.ɵɵ
|
|
327
|
+
i0.ɵɵconditional(ctx_r1.getVisibleFields(ctx_r1.ForeignKeyFields).length > 0 ? 17 : -1);
|
|
322
328
|
i0.ɵɵadvance();
|
|
323
|
-
i0.ɵɵ
|
|
329
|
+
i0.ɵɵconditional(ctx_r1.getVisibleFields(ctx_r1.RegularFields).length > 0 ? 18 : -1);
|
|
324
330
|
} }
|
|
325
|
-
function
|
|
331
|
+
function QueryRowDetailComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
326
332
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
327
|
-
i0.ɵɵelementStart(0, "div",
|
|
328
|
-
i0.ɵɵlistener("click", function
|
|
333
|
+
i0.ɵɵelementStart(0, "div", 53);
|
|
334
|
+
i0.ɵɵlistener("click", function QueryRowDetailComponent_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClose()); });
|
|
329
335
|
i0.ɵɵelementEnd();
|
|
330
336
|
} }
|
|
331
337
|
/**
|
|
@@ -686,14 +692,15 @@ export class QueryRowDetailComponent {
|
|
|
686
692
|
}
|
|
687
693
|
static ɵfac = function QueryRowDetailComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QueryRowDetailComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.ElementRef)); };
|
|
688
694
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryRowDetailComponent, selectors: [["mj-query-row-detail"]], hostBindings: function QueryRowDetailComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
689
|
-
i0.ɵɵlistener("mousemove", function QueryRowDetailComponent_mousemove_HostBindingHandler($event) { return ctx.onMouseMove($event); },
|
|
690
|
-
} }, inputs: { RowData: "RowData", Columns: "Columns", QueryInfo: "QueryInfo", Visible: "Visible", RowIndex: "RowIndex", TotalRows: "TotalRows" }, outputs: { Close: "Close", EntityLinkClick: "EntityLinkClick", NavigateRow: "NavigateRow" }, decls: 2, vars: 2, consts: [[
|
|
691
|
-
i0.ɵɵ
|
|
695
|
+
i0.ɵɵlistener("mousemove", function QueryRowDetailComponent_mousemove_HostBindingHandler($event) { return ctx.onMouseMove($event); }, i0.ɵɵresolveDocument)("mouseup", function QueryRowDetailComponent_mouseup_HostBindingHandler() { return ctx.onMouseUp(); }, i0.ɵɵresolveDocument)("keydown", function QueryRowDetailComponent_keydown_HostBindingHandler($event) { return ctx.onKeyDown($event); }, i0.ɵɵresolveDocument);
|
|
696
|
+
} }, inputs: { RowData: "RowData", Columns: "Columns", QueryInfo: "QueryInfo", Visible: "Visible", RowIndex: "RowIndex", TotalRows: "TotalRows" }, outputs: { Close: "Close", EntityLinkClick: "EntityLinkClick", NavigateRow: "NavigateRow" }, standalone: false, decls: 2, vars: 2, consts: [[1, "row-detail-panel", 3, "width"], [1, "panel-backdrop"], [1, "row-detail-panel"], [1, "resize-handle", 3, "mousedown"], [1, "panel-header"], [1, "header-left"], [1, "fa-solid", "fa-table-cells-large", "header-icon"], [1, "panel-title"], [1, "header-right"], [1, "row-nav"], [1, "action-btn", 3, "click", "title"], [1, "fa-solid"], ["title", "Copy row as JSON", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-copy"], ["title", "Close (Esc)", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "panel-content"], [1, "field-section"], ["title", "Previous row (\u2191 or K)", 1, "nav-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], [1, "row-indicator"], ["title", "Next row (\u2193 or J)", 1, "nav-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"], [1, "section-title"], [1, "fa-solid", "fa-key", "section-icon", "pk-icon"], [1, "field-list"], [1, "field-item"], [1, "field-header"], [1, "field-name"], ["title", "Copy value", 1, "copy-btn", 3, "click"], [1, "field-value", 3, "click"], [1, "entity-icon", 3, "class"], [1, "value-text", "monospace"], [1, "fa-solid", "fa-arrow-up-right-from-square", "link-icon"], [1, "entity-icon"], [1, "fa-solid", "fa-link", "section-icon", "fk-icon"], [1, "target-entity"], [1, "field-value", "clickable"], [1, "field-value", "empty"], [1, "fa-solid", "fa-arrow-right"], [1, "field-value", "clickable", 3, "click"], [1, "value-text"], [1, "fa-solid", "fa-list", "section-icon"], [1, "hidden-count"], [1, "field-type"], [1, "field-value", "json-value", 3, "expanded"], [1, "field-value", "long-text", 3, "expanded"], [1, "field-value", "boolean-value"], [1, "field-value"], [1, "field-value", "json-value"], [1, "json-content"], [1, "expand-btn", 3, "click"], [1, "field-value", "long-text"], [1, "panel-backdrop", 3, "click"]], template: function QueryRowDetailComponent_Template(rf, ctx) { if (rf & 1) {
|
|
697
|
+
i0.ɵɵconditionalCreate(0, QueryRowDetailComponent_Conditional_0_Template, 19, 16, "div", 0);
|
|
698
|
+
i0.ɵɵconditionalCreate(1, QueryRowDetailComponent_Conditional_1_Template, 1, 0, "div", 1);
|
|
692
699
|
} if (rf & 2) {
|
|
693
|
-
i0.ɵɵ
|
|
700
|
+
i0.ɵɵconditional(ctx.Visible ? 0 : -1);
|
|
694
701
|
i0.ɵɵadvance();
|
|
695
|
-
i0.ɵɵ
|
|
696
|
-
} },
|
|
702
|
+
i0.ɵɵconditional(ctx.Visible ? 1 : -1);
|
|
703
|
+
} }, styles: ["\n\n\n[_nghost-%COMP%] {\n display: block;\n}\n\n\n\n\n\n\n.row-detail-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n background: #fff;\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n\n\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n transition: background 0.15s ease;\n z-index: 10;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle.resizing[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.3);\n}\n\n.resize-handle[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 2px;\n top: 50%;\n transform: translateY(-50%);\n width: 2px;\n height: 40px;\n background: #ccc;\n border-radius: 1px;\n transition: background 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover::before, \n.resize-handle.resizing[_ngcontent-%COMP%]::before {\n background: #2196F3;\n}\n\n\n\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: linear-gradient(135deg, #5c6bc0 0%, #3949ab 100%);\n color: #fff;\n flex-shrink: 0;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n opacity: 0.9;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #fff;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n\n\n\n.row-nav[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n background: rgba(255, 255, 255, 0.15);\n border-radius: 4px;\n}\n\n.nav-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n}\n\n.nav-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.nav-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.row-indicator[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #fff;\n padding: 0 4px;\n min-width: 50px;\n text-align: center;\n}\n\n\n\n\n\n\n.action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n.action-btn.active[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.3);\n}\n\n.hidden-count[_ngcontent-%COMP%] {\n font-weight: 400;\n font-size: 11px;\n color: rgba(255, 255, 255, 0.7);\n margin-left: auto;\n}\n\n\n\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n\n\n\n\n\n.field-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.field-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.section-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.pk-icon[_ngcontent-%COMP%] {\n color: #f9a825;\n}\n\n.fk-icon[_ngcontent-%COMP%] {\n color: #2196F3;\n}\n\n\n\n\n\n\n.field-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.field-item[_ngcontent-%COMP%] {\n padding: 10px 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 3px solid #5c6bc0;\n}\n\n.field-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.field-name[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: #333;\n flex-shrink: 0;\n}\n\n.field-type[_ngcontent-%COMP%] {\n font-size: 11px;\n font-family: 'Consolas', 'Monaco', monospace;\n color: #666;\n background: #e8eaf6;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.target-entity[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: #2196F3;\n margin-left: auto;\n}\n\n.target-entity[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 8px;\n}\n\n.copy-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n background: transparent;\n color: #aaa;\n cursor: pointer;\n border-radius: 4px;\n margin-left: auto;\n opacity: 0;\n transition: all 0.15s ease;\n}\n\n.field-item[_ngcontent-%COMP%]:hover .copy-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.copy-btn[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #666;\n}\n\n\n\n\n\n\n.field-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #333;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.field-value.empty[_ngcontent-%COMP%] {\n color: #999;\n font-style: italic;\n}\n\n.field-value.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 8px;\n margin: -2px -4px;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.field-value.clickable[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.entity-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #2196F3;\n flex-shrink: 0;\n}\n\n.link-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #aaa;\n margin-left: auto;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.field-value.clickable[_ngcontent-%COMP%]:hover .link-icon[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.value-text[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.value-text.monospace[_ngcontent-%COMP%] {\n font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 12px;\n}\n\n\n\n\n\n\n.boolean-value[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.bool-true[_ngcontent-%COMP%] {\n color: #4caf50;\n}\n\n.bool-false[_ngcontent-%COMP%] {\n color: #9e9e9e;\n}\n\n\n\n\n\n\n.json-value[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.json-content[_ngcontent-%COMP%] {\n margin: 0;\n padding: 8px;\n background: #f5f5f5;\n border-radius: 4px;\n font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 11px;\n line-height: 1.4;\n overflow: hidden;\n max-height: 100px;\n white-space: pre-wrap;\n word-break: break-all;\n}\n\n.json-value.expanded[_ngcontent-%COMP%] .json-content[_ngcontent-%COMP%] {\n max-height: none;\n}\n\n\n\n\n\n\n.long-text[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.long-text[_ngcontent-%COMP%] .value-text[_ngcontent-%COMP%] {\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.long-text.expanded[_ngcontent-%COMP%] .value-text[_ngcontent-%COMP%] {\n display: block;\n -webkit-line-clamp: unset;\n}\n\n\n\n\n\n\n.expand-btn[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 6px;\n padding: 4px 8px;\n border: none;\n background: transparent;\n color: #2196F3;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n\n\n\n\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 999;\n}\n\n\n\n\n\n\n.panel-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.panel-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.panel-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: #ccc;\n border-radius: 3px;\n}\n\n.panel-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: #aaa;\n}\n\n\n\n\n\n\n@media (max-width: 600px) {\n .row-detail-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n}"], data: { animation: [
|
|
697
704
|
trigger('slideIn', [
|
|
698
705
|
transition(':enter', [
|
|
699
706
|
style({ transform: 'translateX(100%)', opacity: 0 }),
|
|
@@ -707,7 +714,7 @@ export class QueryRowDetailComponent {
|
|
|
707
714
|
}
|
|
708
715
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryRowDetailComponent, [{
|
|
709
716
|
type: Component,
|
|
710
|
-
args: [{ selector: 'mj-query-row-detail', changeDetection: ChangeDetectionStrategy.OnPush, animations: [
|
|
717
|
+
args: [{ standalone: false, selector: 'mj-query-row-detail', changeDetection: ChangeDetectionStrategy.OnPush, animations: [
|
|
711
718
|
trigger('slideIn', [
|
|
712
719
|
transition(':enter', [
|
|
713
720
|
style({ transform: 'translateX(100%)', opacity: 0 }),
|
|
@@ -717,7 +724,7 @@ export class QueryRowDetailComponent {
|
|
|
717
724
|
animate('150ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))
|
|
718
725
|
])
|
|
719
726
|
])
|
|
720
|
-
], template: "<!-- Row Detail Slide-in Panel -->\n<div class=\"row-detail-panel\"\n *ngIf=\"Visible\"\n @slideIn\n [style.width.px]=\"PanelWidth\">\n\n <!-- Resize handle -->\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.resizing]=\"IsResizing\">\n </div>\n\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-table-cells-large header-icon\"></i>\n <h3 class=\"panel-title\">Row Details</h3>\n </div>\n <div class=\"header-right\">\n <!-- Row navigation -->\n <div class=\"row-nav\" *ngIf=\"TotalRows > 1\">\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex === 0\"\n (click)=\"onNavigatePrev()\"\n title=\"Previous row (\u2191 or K)\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <span class=\"row-indicator\">{{ RowIndex + 1 }} / {{ TotalRows }}</span>\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex >= TotalRows - 1\"\n (click)=\"onNavigateNext()\"\n title=\"Next row (\u2193 or J)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n <!-- Toggle empty fields -->\n <button class=\"action-btn\"\n (click)=\"toggleHideEmptyFields()\"\n [class.active]=\"HideEmptyFields\"\n [title]=\"HideEmptyFields ? 'Show empty fields' : 'Hide empty fields'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!HideEmptyFields\" [class.fa-eye-slash]=\"HideEmptyFields\"></i>\n </button>\n <!-- Copy JSON button -->\n <button class=\"action-btn\" (click)=\"copyRowAsJson()\" title=\"Copy row as JSON\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n <!-- Close button -->\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Primary Keys Section -->\n <div class=\"field-section\" *ngIf=\"getVisibleFields(PrimaryKeyFields).length > 0\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-key section-icon pk-icon\"></i>\n Primary Key\n </h4>\n <div class=\"field-list\">\n <div class=\"field-item\" *ngFor=\"let field of getVisibleFields(PrimaryKeyFields)\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <div class=\"field-value\"\n [class.clickable]=\"field.targetEntityName\"\n (click)=\"field.targetEntityName && onEntityLinkClick(field)\">\n <i *ngIf=\"field.targetEntityIcon\"\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n <i *ngIf=\"field.targetEntityName\"\n class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Foreign Keys Section -->\n <div class=\"field-section\" *ngIf=\"getVisibleFields(ForeignKeyFields).length > 0\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-link section-icon fk-icon\"></i>\n Related Records\n </h4>\n <div class=\"field-list\">\n <div class=\"field-item\" *ngFor=\"let field of getVisibleFields(ForeignKeyFields)\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <span class=\"target-entity\" *ngIf=\"field.targetEntityName\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n {{ field.targetEntityName }}\n </span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <div class=\"field-value clickable\"\n *ngIf=\"field.value != null\"\n (click)=\"onEntityLinkClick(field)\">\n <i *ngIf=\"field.targetEntityIcon\"\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n </div>\n <div class=\"field-value empty\" *ngIf=\"field.value == null\">\n <span class=\"value-text\">(empty)</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Regular Fields Section -->\n <div class=\"field-section\" *ngIf=\"getVisibleFields(RegularFields).length > 0\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-list section-icon\"></i>\n Fields\n <span class=\"hidden-count\" *ngIf=\"HideEmptyFields && getEmptyFieldCount(RegularFields) > 0\">\n ({{ getEmptyFieldCount(RegularFields) }} empty hidden)\n </span>\n </h4>\n <div class=\"field-list\">\n <div class=\"field-item\" *ngFor=\"let field of getVisibleFields(RegularFields)\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <span class=\"field-type\">{{ field.sqlType }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n\n <!-- JSON value -->\n <div class=\"field-value json-value\"\n *ngIf=\"isJson(field.formattedValue)\"\n [class.expanded]=\"field.isExpanded\">\n <pre class=\"json-content\">{{ formatJson(field.formattedValue) }}</pre>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Collapse' : 'Expand' }}\n </button>\n </div>\n\n <!-- Long text value -->\n <div class=\"field-value long-text\"\n *ngIf=\"!isJson(field.formattedValue) && field.isLongText\"\n [class.expanded]=\"field.isExpanded\">\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Show less' : 'Show more' }}\n </button>\n </div>\n\n <!-- Boolean value -->\n <div class=\"field-value boolean-value\"\n *ngIf=\"field.sqlType.toLowerCase() === 'bit' && !isJson(field.formattedValue)\">\n <i [class]=\"field.value ? 'fa-solid fa-check-circle bool-true' : 'fa-solid fa-times-circle bool-false'\"></i>\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n </div>\n\n <!-- Empty value -->\n <div class=\"field-value empty\"\n *ngIf=\"field.value == null && !isJson(field.formattedValue)\">\n <span class=\"value-text\">(empty)</span>\n </div>\n\n <!-- Regular value -->\n <div class=\"field-value\"\n *ngIf=\"field.value != null && !isJson(field.formattedValue) && !field.isLongText && field.sqlType.toLowerCase() !== 'bit'\">\n <span class=\"value-text\"\n [class.monospace]=\"field.sqlType.toLowerCase().includes('uniqueidentifier') || field.name.toLowerCase().includes('id')\">\n {{ field.formattedValue }}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop -->\n<div class=\"panel-backdrop\"\n *ngIf=\"Visible\"\n (click)=\"onClose()\">\n</div>\n", styles: ["/* Query Row Detail Panel Styles */\n\n:host {\n display: block;\n}\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.row-detail-panel {\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n background: #fff;\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* ========================================\n Resize Handle\n ======================================== */\n\n.resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n transition: background 0.15s ease;\n z-index: 10;\n}\n\n.resize-handle:hover,\n.resize-handle.resizing {\n background: rgba(33, 150, 243, 0.3);\n}\n\n.resize-handle::before {\n content: '';\n position: absolute;\n left: 2px;\n top: 50%;\n transform: translateY(-50%);\n width: 2px;\n height: 40px;\n background: #ccc;\n border-radius: 1px;\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover::before,\n.resize-handle.resizing::before {\n background: #2196F3;\n}\n\n/* ========================================\n Header\n ======================================== */\n\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: linear-gradient(135deg, #5c6bc0 0%, #3949ab 100%);\n color: #fff;\n flex-shrink: 0;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-icon {\n font-size: 20px;\n opacity: 0.9;\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n.panel-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #fff;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* ========================================\n Row Navigation\n ======================================== */\n\n.row-nav {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n background: rgba(255, 255, 255, 0.15);\n border-radius: 4px;\n}\n\n.nav-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n}\n\n.nav-btn:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.nav-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.row-indicator {\n font-size: 12px;\n font-weight: 500;\n color: #fff;\n padding: 0 4px;\n min-width: 50px;\n text-align: center;\n}\n\n/* ========================================\n Action Buttons\n ======================================== */\n\n.action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.action-btn:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n.action-btn.active {\n background: rgba(255, 255, 255, 0.3);\n}\n\n.hidden-count {\n font-weight: 400;\n font-size: 11px;\n color: rgba(255, 255, 255, 0.7);\n margin-left: auto;\n}\n\n/* ========================================\n Content\n ======================================== */\n\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n/* ========================================\n Field Sections\n ======================================== */\n\n.field-section {\n margin-bottom: 24px;\n}\n\n.field-section:last-child {\n margin-bottom: 0;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.section-icon {\n font-size: 12px;\n}\n\n.pk-icon {\n color: #f9a825;\n}\n\n.fk-icon {\n color: #2196F3;\n}\n\n/* ========================================\n Field Items\n ======================================== */\n\n.field-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.field-item {\n padding: 10px 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 3px solid #5c6bc0;\n}\n\n.field-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.field-name {\n font-size: 12px;\n font-weight: 600;\n color: #333;\n flex-shrink: 0;\n}\n\n.field-type {\n font-size: 11px;\n font-family: 'Consolas', 'Monaco', monospace;\n color: #666;\n background: #e8eaf6;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.target-entity {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: #2196F3;\n margin-left: auto;\n}\n\n.target-entity i {\n font-size: 8px;\n}\n\n.copy-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n background: transparent;\n color: #aaa;\n cursor: pointer;\n border-radius: 4px;\n margin-left: auto;\n opacity: 0;\n transition: all 0.15s ease;\n}\n\n.field-item:hover .copy-btn {\n opacity: 1;\n}\n\n.copy-btn:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #666;\n}\n\n/* ========================================\n Field Values\n ======================================== */\n\n.field-value {\n font-size: 13px;\n color: #333;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.field-value.empty {\n color: #999;\n font-style: italic;\n}\n\n.field-value.clickable {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 8px;\n margin: -2px -4px;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.field-value.clickable:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.entity-icon {\n font-size: 12px;\n color: #2196F3;\n flex-shrink: 0;\n}\n\n.link-icon {\n font-size: 10px;\n color: #aaa;\n margin-left: auto;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.field-value.clickable:hover .link-icon {\n opacity: 1;\n}\n\n.value-text {\n flex: 1;\n}\n\n.value-text.monospace {\n font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 12px;\n}\n\n/* ========================================\n Boolean Values\n ======================================== */\n\n.boolean-value {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.bool-true {\n color: #4caf50;\n}\n\n.bool-false {\n color: #9e9e9e;\n}\n\n/* ========================================\n JSON Values\n ======================================== */\n\n.json-value {\n position: relative;\n}\n\n.json-content {\n margin: 0;\n padding: 8px;\n background: #f5f5f5;\n border-radius: 4px;\n font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 11px;\n line-height: 1.4;\n overflow: hidden;\n max-height: 100px;\n white-space: pre-wrap;\n word-break: break-all;\n}\n\n.json-value.expanded .json-content {\n max-height: none;\n}\n\n/* ========================================\n Long Text Values\n ======================================== */\n\n.long-text {\n position: relative;\n}\n\n.long-text .value-text {\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.long-text.expanded .value-text {\n display: block;\n -webkit-line-clamp: unset;\n}\n\n/* ========================================\n Expand Button\n ======================================== */\n\n.expand-btn {\n display: inline-block;\n margin-top: 6px;\n padding: 4px 8px;\n border: none;\n background: transparent;\n color: #2196F3;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.expand-btn:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n/* ========================================\n Backdrop\n ======================================== */\n\n.panel-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 999;\n}\n\n/* ========================================\n Scrollbar\n ======================================== */\n\n.panel-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.panel-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.panel-content::-webkit-scrollbar-thumb {\n background: #ccc;\n border-radius: 3px;\n}\n\n.panel-content::-webkit-scrollbar-thumb:hover {\n background: #aaa;\n}\n\n/* ========================================\n Responsive\n ======================================== */\n\n@media (max-width: 600px) {\n .row-detail-panel {\n width: 100% !important;\n }\n\n .resize-handle {\n display: none;\n }\n}\n"] }]
|
|
727
|
+
], template: "<!-- Row Detail Slide-in Panel -->\n@if (Visible) {\n <div class=\"row-detail-panel\"\n @slideIn\n [style.width.px]=\"PanelWidth\">\n <!-- Resize handle -->\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.resizing]=\"IsResizing\">\n </div>\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-table-cells-large header-icon\"></i>\n <h3 class=\"panel-title\">Row Details</h3>\n </div>\n <div class=\"header-right\">\n <!-- Row navigation -->\n @if (TotalRows > 1) {\n <div class=\"row-nav\">\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex === 0\"\n (click)=\"onNavigatePrev()\"\n title=\"Previous row (\u2191 or K)\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <span class=\"row-indicator\">{{ RowIndex + 1 }} / {{ TotalRows }}</span>\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex >= TotalRows - 1\"\n (click)=\"onNavigateNext()\"\n title=\"Next row (\u2193 or J)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n }\n <!-- Toggle empty fields -->\n <button class=\"action-btn\"\n (click)=\"toggleHideEmptyFields()\"\n [class.active]=\"HideEmptyFields\"\n [title]=\"HideEmptyFields ? 'Show empty fields' : 'Hide empty fields'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!HideEmptyFields\" [class.fa-eye-slash]=\"HideEmptyFields\"></i>\n </button>\n <!-- Copy JSON button -->\n <button class=\"action-btn\" (click)=\"copyRowAsJson()\" title=\"Copy row as JSON\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n <!-- Close button -->\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Primary Keys Section -->\n @if (getVisibleFields(PrimaryKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-key section-icon pk-icon\"></i>\n Primary Key\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(PrimaryKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <div class=\"field-value\"\n [class.clickable]=\"field.targetEntityName\"\n (click)=\"field.targetEntityName && onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n @if (field.targetEntityName) {\n <i\n class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Foreign Keys Section -->\n @if (getVisibleFields(ForeignKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-link section-icon fk-icon\"></i>\n Related Records\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(ForeignKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n @if (field.targetEntityName) {\n <span class=\"target-entity\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n {{ field.targetEntityName }}\n </span>\n }\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (field.value != null) {\n <div class=\"field-value clickable\"\n (click)=\"onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n </div>\n }\n @if (field.value == null) {\n <div class=\"field-value empty\">\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Regular Fields Section -->\n @if (getVisibleFields(RegularFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-list section-icon\"></i>\n Fields\n @if (HideEmptyFields && getEmptyFieldCount(RegularFields) > 0) {\n <span class=\"hidden-count\">\n ({{ getEmptyFieldCount(RegularFields) }} empty hidden)\n </span>\n }\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(RegularFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <span class=\"field-type\">{{ field.sqlType }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <!-- JSON value -->\n @if (isJson(field.formattedValue)) {\n <div class=\"field-value json-value\"\n [class.expanded]=\"field.isExpanded\">\n <pre class=\"json-content\">{{ formatJson(field.formattedValue) }}</pre>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Collapse' : 'Expand' }}\n </button>\n </div>\n }\n <!-- Long text value -->\n @if (!isJson(field.formattedValue) && field.isLongText) {\n <div class=\"field-value long-text\"\n [class.expanded]=\"field.isExpanded\">\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Show less' : 'Show more' }}\n </button>\n </div>\n }\n <!-- Boolean value -->\n @if (field.sqlType.toLowerCase() === 'bit' && !isJson(field.formattedValue)) {\n <div class=\"field-value boolean-value\"\n >\n <i [class]=\"field.value ? 'fa-solid fa-check-circle bool-true' : 'fa-solid fa-times-circle bool-false'\"></i>\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n </div>\n }\n <!-- Empty value -->\n @if (field.value == null && !isJson(field.formattedValue)) {\n <div class=\"field-value empty\"\n >\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n <!-- Regular value -->\n @if (field.value != null && !isJson(field.formattedValue) && !field.isLongText && field.sqlType.toLowerCase() !== 'bit') {\n <div class=\"field-value\"\n >\n <span class=\"value-text\"\n [class.monospace]=\"field.sqlType.toLowerCase().includes('uniqueidentifier') || field.name.toLowerCase().includes('id')\">\n {{ field.formattedValue }}\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n\n<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\"\n (click)=\"onClose()\">\n </div>\n}\n", styles: ["/* Query Row Detail Panel Styles */\n\n:host {\n display: block;\n}\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.row-detail-panel {\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n background: #fff;\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* ========================================\n Resize Handle\n ======================================== */\n\n.resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n transition: background 0.15s ease;\n z-index: 10;\n}\n\n.resize-handle:hover,\n.resize-handle.resizing {\n background: rgba(33, 150, 243, 0.3);\n}\n\n.resize-handle::before {\n content: '';\n position: absolute;\n left: 2px;\n top: 50%;\n transform: translateY(-50%);\n width: 2px;\n height: 40px;\n background: #ccc;\n border-radius: 1px;\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover::before,\n.resize-handle.resizing::before {\n background: #2196F3;\n}\n\n/* ========================================\n Header\n ======================================== */\n\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n background: linear-gradient(135deg, #5c6bc0 0%, #3949ab 100%);\n color: #fff;\n flex-shrink: 0;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-icon {\n font-size: 20px;\n opacity: 0.9;\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n.panel-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #fff;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* ========================================\n Row Navigation\n ======================================== */\n\n.row-nav {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n background: rgba(255, 255, 255, 0.15);\n border-radius: 4px;\n}\n\n.nav-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s ease;\n}\n\n.nav-btn:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.nav-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.row-indicator {\n font-size: 12px;\n font-weight: 500;\n color: #fff;\n padding: 0 4px;\n min-width: 50px;\n text-align: center;\n}\n\n/* ========================================\n Action Buttons\n ======================================== */\n\n.action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.action-btn:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n.action-btn.active {\n background: rgba(255, 255, 255, 0.3);\n}\n\n.hidden-count {\n font-weight: 400;\n font-size: 11px;\n color: rgba(255, 255, 255, 0.7);\n margin-left: auto;\n}\n\n/* ========================================\n Content\n ======================================== */\n\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n/* ========================================\n Field Sections\n ======================================== */\n\n.field-section {\n margin-bottom: 24px;\n}\n\n.field-section:last-child {\n margin-bottom: 0;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n padding-bottom: 8px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.section-icon {\n font-size: 12px;\n}\n\n.pk-icon {\n color: #f9a825;\n}\n\n.fk-icon {\n color: #2196F3;\n}\n\n/* ========================================\n Field Items\n ======================================== */\n\n.field-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.field-item {\n padding: 10px 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border-left: 3px solid #5c6bc0;\n}\n\n.field-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.field-name {\n font-size: 12px;\n font-weight: 600;\n color: #333;\n flex-shrink: 0;\n}\n\n.field-type {\n font-size: 11px;\n font-family: 'Consolas', 'Monaco', monospace;\n color: #666;\n background: #e8eaf6;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.target-entity {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: #2196F3;\n margin-left: auto;\n}\n\n.target-entity i {\n font-size: 8px;\n}\n\n.copy-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n background: transparent;\n color: #aaa;\n cursor: pointer;\n border-radius: 4px;\n margin-left: auto;\n opacity: 0;\n transition: all 0.15s ease;\n}\n\n.field-item:hover .copy-btn {\n opacity: 1;\n}\n\n.copy-btn:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #666;\n}\n\n/* ========================================\n Field Values\n ======================================== */\n\n.field-value {\n font-size: 13px;\n color: #333;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.field-value.empty {\n color: #999;\n font-style: italic;\n}\n\n.field-value.clickable {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 8px;\n margin: -2px -4px;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.field-value.clickable:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.entity-icon {\n font-size: 12px;\n color: #2196F3;\n flex-shrink: 0;\n}\n\n.link-icon {\n font-size: 10px;\n color: #aaa;\n margin-left: auto;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.field-value.clickable:hover .link-icon {\n opacity: 1;\n}\n\n.value-text {\n flex: 1;\n}\n\n.value-text.monospace {\n font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 12px;\n}\n\n/* ========================================\n Boolean Values\n ======================================== */\n\n.boolean-value {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.bool-true {\n color: #4caf50;\n}\n\n.bool-false {\n color: #9e9e9e;\n}\n\n/* ========================================\n JSON Values\n ======================================== */\n\n.json-value {\n position: relative;\n}\n\n.json-content {\n margin: 0;\n padding: 8px;\n background: #f5f5f5;\n border-radius: 4px;\n font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;\n font-size: 11px;\n line-height: 1.4;\n overflow: hidden;\n max-height: 100px;\n white-space: pre-wrap;\n word-break: break-all;\n}\n\n.json-value.expanded .json-content {\n max-height: none;\n}\n\n/* ========================================\n Long Text Values\n ======================================== */\n\n.long-text {\n position: relative;\n}\n\n.long-text .value-text {\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.long-text.expanded .value-text {\n display: block;\n -webkit-line-clamp: unset;\n}\n\n/* ========================================\n Expand Button\n ======================================== */\n\n.expand-btn {\n display: inline-block;\n margin-top: 6px;\n padding: 4px 8px;\n border: none;\n background: transparent;\n color: #2196F3;\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s ease;\n}\n\n.expand-btn:hover {\n background: rgba(33, 150, 243, 0.1);\n}\n\n/* ========================================\n Backdrop\n ======================================== */\n\n.panel-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 999;\n}\n\n/* ========================================\n Scrollbar\n ======================================== */\n\n.panel-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.panel-content::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.panel-content::-webkit-scrollbar-thumb {\n background: #ccc;\n border-radius: 3px;\n}\n\n.panel-content::-webkit-scrollbar-thumb:hover {\n background: #aaa;\n}\n\n/* ========================================\n Responsive\n ======================================== */\n\n@media (max-width: 600px) {\n .row-detail-panel {\n width: 100% !important;\n }\n\n .resize-handle {\n display: none;\n }\n}\n"] }]
|
|
721
728
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], { RowData: [{
|
|
722
729
|
type: Input
|
|
723
730
|
}], Columns: [{
|
|
@@ -746,5 +753,5 @@ export class QueryRowDetailComponent {
|
|
|
746
753
|
type: HostListener,
|
|
747
754
|
args: ['document:keydown', ['$event']]
|
|
748
755
|
}] }); })();
|
|
749
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryRowDetailComponent, { className: "QueryRowDetailComponent", filePath: "src/lib/query-row-detail/query-row-detail.component.ts", lineNumber:
|
|
756
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryRowDetailComponent, { className: "QueryRowDetailComponent", filePath: "src/lib/query-row-detail/query-row-detail.component.ts", lineNumber: 79 }); })();
|
|
750
757
|
//# sourceMappingURL=query-row-detail.component.js.map
|