@memberjunction/ng-skip-chat 2.46.0 → 2.48.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.
@@ -0,0 +1,1771 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Component, EventEmitter, Input, Output, ViewChildren, HostListener } from '@angular/core';
11
+ import { CompositeKey, LogError, Metadata, RunQuery, RunView } from '@memberjunction/core';
12
+ import { SkipReactComponentHost } from './skip-react-component-host';
13
+ import { MapEntityInfoToSkipEntityInfo, BuildSkipComponentCompleteCode } from '@memberjunction/skip-types';
14
+ import { DrillDownInfo } from '../drill-down-info';
15
+ import { marked } from 'marked';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@angular/platform-browser";
18
+ import * as i2 from "@angular/common";
19
+ import * as i3 from "@progress/kendo-angular-layout";
20
+ import * as i4 from "@progress/kendo-angular-buttons";
21
+ import * as i5 from "@memberjunction/ng-code-editor";
22
+ const _c0 = ["htmlContainer"];
23
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
24
+ i0.ɵɵelement(0, "i", 7);
25
+ } }
26
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_1_Template(rf, ctx) { if (rf & 1) {
27
+ i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_1_Conditional_0_Template, 1, 0, "i", 7);
28
+ i0.ɵɵtext(1);
29
+ } if (rf & 2) {
30
+ const ɵ$index_4_r3 = i0.ɵɵnextContext().$index;
31
+ const ctx_r1 = i0.ɵɵnextContext(2);
32
+ i0.ɵɵconditional(ctx_r1.isTopRanked(ɵ$index_4_r3) ? 0 : -1);
33
+ i0.ɵɵadvance();
34
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getTabTitle(ɵ$index_4_r3), " ");
35
+ } }
36
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_button_20_Template(rf, ctx) { if (rf & 1) {
37
+ const _r5 = i0.ɵɵgetCurrentView();
38
+ i0.ɵɵelementStart(0, "button", 24);
39
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_button_20_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ɵ$index_4_r3 = i0.ɵɵnextContext(2).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.createReportForOption(ɵ$index_4_r3)); });
40
+ i0.ɵɵelement(1, "i", 25);
41
+ i0.ɵɵelementStart(2, "span");
42
+ i0.ɵɵtext(3);
43
+ i0.ɵɵelementEnd()();
44
+ } if (rf & 2) {
45
+ const option_r6 = i0.ɵɵnextContext(2).$implicit;
46
+ const ctx_r1 = i0.ɵɵnextContext(2);
47
+ i0.ɵɵproperty("disabled", ctx_r1.isCreatingReport);
48
+ i0.ɵɵadvance(3);
49
+ i0.ɵɵtextInterpolate1("Create ", ctx_r1.getComponentTypeName(option_r6), "");
50
+ } }
51
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_button_21_Template(rf, ctx) { if (rf & 1) {
52
+ const _r7 = i0.ɵɵgetCurrentView();
53
+ i0.ɵɵelementStart(0, "button", 26);
54
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_button_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.PrintReport()); });
55
+ i0.ɵɵelement(1, "i", 27);
56
+ i0.ɵɵelementStart(2, "span");
57
+ i0.ɵɵtext(3, "Print Report");
58
+ i0.ɵɵelementEnd()();
59
+ } }
60
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_ng_template_1_Template(rf, ctx) { if (rf & 1) {
61
+ i0.ɵɵelement(0, "i", 11);
62
+ i0.ɵɵtext(1, " Functional Requirements ");
63
+ } }
64
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_ng_template_2_Template(rf, ctx) { if (rf & 1) {
65
+ i0.ɵɵelementStart(0, "div", 32);
66
+ i0.ɵɵelement(1, "div", 33);
67
+ i0.ɵɵelementEnd();
68
+ } if (rf & 2) {
69
+ const option_r6 = i0.ɵɵnextContext(4).$implicit;
70
+ const ctx_r1 = i0.ɵɵnextContext(2);
71
+ i0.ɵɵadvance();
72
+ i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedFunctionalRequirements(option_r6), i0.ɵɵsanitizeHtml);
73
+ } }
74
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_Template(rf, ctx) { if (rf & 1) {
75
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
76
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_ng_template_1_Template, 2, 0, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_ng_template_2_Template, 2, 1, "ng-template", 6);
77
+ i0.ɵɵelementEnd();
78
+ } if (rf & 2) {
79
+ i0.ɵɵproperty("selected", true);
80
+ } }
81
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_ng_template_1_Template(rf, ctx) { if (rf & 1) {
82
+ i0.ɵɵelement(0, "i", 13);
83
+ i0.ɵɵtext(1, " Data Requirements ");
84
+ } }
85
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_ng_template_2_Template(rf, ctx) { if (rf & 1) {
86
+ i0.ɵɵelementStart(0, "div", 32);
87
+ i0.ɵɵelement(1, "div", 33);
88
+ i0.ɵɵelementEnd();
89
+ } if (rf & 2) {
90
+ const option_r6 = i0.ɵɵnextContext(4).$implicit;
91
+ const ctx_r1 = i0.ɵɵnextContext(2);
92
+ i0.ɵɵadvance();
93
+ i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedDataRequirements(option_r6), i0.ɵɵsanitizeHtml);
94
+ } }
95
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_Template(rf, ctx) { if (rf & 1) {
96
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
97
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_ng_template_1_Template, 2, 0, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_ng_template_2_Template, 2, 1, "ng-template", 6);
98
+ i0.ɵɵelementEnd();
99
+ } if (rf & 2) {
100
+ const ctx_r1 = i0.ɵɵnextContext(5);
101
+ i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements);
102
+ } }
103
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_ng_template_1_Template(rf, ctx) { if (rf & 1) {
104
+ i0.ɵɵelement(0, "i", 15);
105
+ i0.ɵɵtext(1, " Technical Design ");
106
+ } }
107
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_ng_template_2_Template(rf, ctx) { if (rf & 1) {
108
+ i0.ɵɵelementStart(0, "div", 32);
109
+ i0.ɵɵelement(1, "div", 33);
110
+ i0.ɵɵelementEnd();
111
+ } if (rf & 2) {
112
+ const option_r6 = i0.ɵɵnextContext(4).$implicit;
113
+ const ctx_r1 = i0.ɵɵnextContext(2);
114
+ i0.ɵɵadvance();
115
+ i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedTechnicalDesign(option_r6), i0.ɵɵsanitizeHtml);
116
+ } }
117
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_Template(rf, ctx) { if (rf & 1) {
118
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
119
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_ng_template_1_Template, 2, 0, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_ng_template_2_Template, 2, 1, "ng-template", 6);
120
+ i0.ɵɵelementEnd();
121
+ } if (rf & 2) {
122
+ const ctx_r1 = i0.ɵɵnextContext(5);
123
+ i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements && !ctx_r1.showDataRequirements);
124
+ } }
125
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_ng_template_1_Template(rf, ctx) { if (rf & 1) {
126
+ i0.ɵɵelement(0, "i", 17);
127
+ i0.ɵɵtext(1, " Code ");
128
+ } }
129
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_ng_template_2_Template(rf, ctx) { if (rf & 1) {
130
+ i0.ɵɵelementStart(0, "div", 34);
131
+ i0.ɵɵelement(1, "mj-code-editor", 35);
132
+ i0.ɵɵelementEnd();
133
+ } if (rf & 2) {
134
+ const option_r6 = i0.ɵɵnextContext(4).$implicit;
135
+ const ctx_r1 = i0.ɵɵnextContext(2);
136
+ i0.ɵɵadvance();
137
+ i0.ɵɵproperty("value", ctx_r1.getComponentCode(option_r6))("autoFocus", false)("indentWithTab", true)("readonly", true);
138
+ } }
139
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_Template(rf, ctx) { if (rf & 1) {
140
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
141
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_ng_template_1_Template, 2, 0, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_ng_template_2_Template, 2, 4, "ng-template", 6);
142
+ i0.ɵɵelementEnd();
143
+ } if (rf & 2) {
144
+ const ctx_r1 = i0.ɵɵnextContext(5);
145
+ i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements && !ctx_r1.showDataRequirements && !ctx_r1.showTechnicalDesign);
146
+ } }
147
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
148
+ const _r8 = i0.ɵɵgetCurrentView();
149
+ i0.ɵɵelementStart(0, "div", 28)(1, "kendo-tabstrip", 29);
150
+ i0.ɵɵtemplate(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_Template, 3, 1, "kendo-tabstrip-tab", 4)(3, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_Template, 3, 1, "kendo-tabstrip-tab", 4)(4, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_Template, 3, 1, "kendo-tabstrip-tab", 4)(5, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_Template, 3, 1, "kendo-tabstrip-tab", 4);
151
+ i0.ɵɵelementEnd()();
152
+ i0.ɵɵelementStart(6, "div", 30);
153
+ i0.ɵɵlistener("mousedown", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Template_div_mousedown_6_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.startResize($event)); })("touchstart", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Template_div_touchstart_6_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.startResize($event)); });
154
+ i0.ɵɵelement(7, "div", 31);
155
+ i0.ɵɵelementEnd();
156
+ } if (rf & 2) {
157
+ const ctx_r1 = i0.ɵɵnextContext(4);
158
+ i0.ɵɵstyleProp("height", ctx_r1.detailsPanelHeight);
159
+ i0.ɵɵadvance(2);
160
+ i0.ɵɵconditional(ctx_r1.showFunctionalRequirements ? 2 : -1);
161
+ i0.ɵɵadvance();
162
+ i0.ɵɵconditional(ctx_r1.showDataRequirements ? 3 : -1);
163
+ i0.ɵɵadvance();
164
+ i0.ɵɵconditional(ctx_r1.showTechnicalDesign ? 4 : -1);
165
+ i0.ɵɵadvance();
166
+ i0.ɵɵconditional(ctx_r1.showCode ? 5 : -1);
167
+ } }
168
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Conditional_19_Template(rf, ctx) { if (rf & 1) {
169
+ i0.ɵɵelementStart(0, "details", 44)(1, "summary", 50);
170
+ i0.ɵɵtext(2, "Technical Details (click to expand)");
171
+ i0.ɵɵelementEnd();
172
+ i0.ɵɵelementStart(3, "pre", 51);
173
+ i0.ɵɵtext(4);
174
+ i0.ɵɵelementEnd()();
175
+ } if (rf & 2) {
176
+ const ctx_r1 = i0.ɵɵnextContext(5);
177
+ i0.ɵɵadvance(4);
178
+ i0.ɵɵtextInterpolate(ctx_r1.currentError.technicalDetails);
179
+ } }
180
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Template(rf, ctx) { if (rf & 1) {
181
+ const _r9 = i0.ɵɵgetCurrentView();
182
+ i0.ɵɵelementStart(0, "div", 23)(1, "div", 36)(2, "div", 37)(3, "button", 38);
183
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.copyErrorToClipboard()); });
184
+ i0.ɵɵelement(4, "span", 39);
185
+ i0.ɵɵtext(5, " Copy Error Details ");
186
+ i0.ɵɵelementEnd();
187
+ i0.ɵɵelementStart(6, "h3", 40);
188
+ i0.ɵɵelement(7, "span", 41);
189
+ i0.ɵɵtext(8, " Component Rendering Error ");
190
+ i0.ɵɵelementEnd()();
191
+ i0.ɵɵelementStart(9, "p", 42);
192
+ i0.ɵɵtext(10, " The selected component option could not be rendered due to the following error: ");
193
+ i0.ɵɵelementEnd();
194
+ i0.ɵɵelementStart(11, "div", 43)(12, "strong");
195
+ i0.ɵɵtext(13, "Error Type:");
196
+ i0.ɵɵelementEnd();
197
+ i0.ɵɵtext(14);
198
+ i0.ɵɵelement(15, "br");
199
+ i0.ɵɵelementStart(16, "strong");
200
+ i0.ɵɵtext(17, "Details:");
201
+ i0.ɵɵelementEnd();
202
+ i0.ɵɵtext(18);
203
+ i0.ɵɵtemplate(19, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Conditional_19_Template, 5, 1, "details", 44);
204
+ i0.ɵɵelementEnd();
205
+ i0.ɵɵelementStart(20, "div", 45)(21, "strong", 46);
206
+ i0.ɵɵtext(22, "What to do:");
207
+ i0.ɵɵelementEnd();
208
+ i0.ɵɵelementStart(23, "ol", 47)(24, "li");
209
+ i0.ɵɵtext(25, "Try selecting a different report option from the tabs above");
210
+ i0.ɵɵelementEnd();
211
+ i0.ɵɵelementStart(26, "li");
212
+ i0.ɵɵtext(27, "Copy the error details and send them back to Skip in the chat to get a corrected version");
213
+ i0.ɵɵelementEnd();
214
+ i0.ɵɵelementStart(28, "li");
215
+ i0.ɵɵtext(29, "Contact your IT department if the issue persists");
216
+ i0.ɵɵelementEnd()()();
217
+ i0.ɵɵelementStart(30, "button", 48);
218
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Template_button_click_30_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.retryCurrentOption()); });
219
+ i0.ɵɵelement(31, "span", 49);
220
+ i0.ɵɵtext(32, " Retry ");
221
+ i0.ɵɵelementEnd()()();
222
+ } if (rf & 2) {
223
+ const ctx_r1 = i0.ɵɵnextContext(4);
224
+ i0.ɵɵadvance(14);
225
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.currentError.type, "");
226
+ i0.ɵɵadvance(4);
227
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.currentError.message, " ");
228
+ i0.ɵɵadvance();
229
+ i0.ɵɵconditional(ctx_r1.currentError.technicalDetails ? 19 : -1);
230
+ } }
231
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Template(rf, ctx) { if (rf & 1) {
232
+ const _r4 = i0.ɵɵgetCurrentView();
233
+ i0.ɵɵelementStart(0, "div", 2)(1, "div", 8)(2, "div", 9)(3, "button", 10);
234
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleShowFunctionalRequirements()); });
235
+ i0.ɵɵelement(4, "i", 11);
236
+ i0.ɵɵelementStart(5, "span");
237
+ i0.ɵɵtext(6, "Functional");
238
+ i0.ɵɵelementEnd()();
239
+ i0.ɵɵelementStart(7, "button", 12);
240
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleShowDataRequirements()); });
241
+ i0.ɵɵelement(8, "i", 13);
242
+ i0.ɵɵelementStart(9, "span");
243
+ i0.ɵɵtext(10, "Data");
244
+ i0.ɵɵelementEnd()();
245
+ i0.ɵɵelementStart(11, "button", 14);
246
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleShowTechnicalDesign()); });
247
+ i0.ɵɵelement(12, "i", 15);
248
+ i0.ɵɵelementStart(13, "span");
249
+ i0.ɵɵtext(14, "Technical");
250
+ i0.ɵɵelementEnd()();
251
+ i0.ɵɵelementStart(15, "button", 16);
252
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleShowCode()); });
253
+ i0.ɵɵelement(16, "i", 17);
254
+ i0.ɵɵelementStart(17, "span");
255
+ i0.ɵɵtext(18, "Code");
256
+ i0.ɵɵelementEnd()()();
257
+ i0.ɵɵelementStart(19, "div", 18);
258
+ i0.ɵɵtemplate(20, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_button_20_Template, 4, 2, "button", 19)(21, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_button_21_Template, 4, 0, "button", 20);
259
+ i0.ɵɵelementEnd()();
260
+ i0.ɵɵelementStart(22, "div", 21);
261
+ i0.ɵɵtemplate(23, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Template, 8, 6);
262
+ i0.ɵɵelementStart(24, "div", 22, 0);
263
+ i0.ɵɵtemplate(26, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Template, 33, 3, "div", 23);
264
+ i0.ɵɵelementEnd()()();
265
+ } if (rf & 2) {
266
+ const ɵ$index_4_r3 = i0.ɵɵnextContext().$index;
267
+ const ctx_r1 = i0.ɵɵnextContext(2);
268
+ i0.ɵɵadvance(3);
269
+ i0.ɵɵclassProp("active", ctx_r1.showFunctionalRequirements);
270
+ i0.ɵɵadvance(4);
271
+ i0.ɵɵclassProp("active", ctx_r1.showDataRequirements);
272
+ i0.ɵɵadvance(4);
273
+ i0.ɵɵclassProp("active", ctx_r1.showTechnicalDesign);
274
+ i0.ɵɵadvance(4);
275
+ i0.ɵɵclassProp("active", ctx_r1.showCode);
276
+ i0.ɵɵadvance(5);
277
+ i0.ɵɵproperty("ngIf", ctx_r1.ShowCreateReportButton && !ctx_r1.matchingReportID);
278
+ i0.ɵɵadvance();
279
+ i0.ɵɵproperty("ngIf", ctx_r1.ShowPrintReport);
280
+ i0.ɵɵadvance(2);
281
+ i0.ɵɵconditional(ctx_r1.showFunctionalRequirements || ctx_r1.showDataRequirements || ctx_r1.showTechnicalDesign || ctx_r1.showCode ? 23 : -1);
282
+ i0.ɵɵadvance();
283
+ i0.ɵɵattribute("data-tab-index", ɵ$index_4_r3);
284
+ i0.ɵɵadvance(2);
285
+ i0.ɵɵconditional(ctx_r1.currentError && ctx_r1.selectedReportOptionIndex === ɵ$index_4_r3 ? 26 : -1);
286
+ } }
287
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
288
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
289
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_1_Template, 2, 2, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Template, 27, 13, "ng-template", 6);
290
+ i0.ɵɵelementEnd();
291
+ } if (rf & 2) {
292
+ const ɵ$index_4_r3 = ctx.$index;
293
+ const ctx_r1 = i0.ɵɵnextContext(2);
294
+ i0.ɵɵproperty("selected", ɵ$index_4_r3 === ctx_r1.selectedReportOptionIndex);
295
+ } }
296
+ function SkipDynamicUIComponentComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
297
+ const _r1 = i0.ɵɵgetCurrentView();
298
+ i0.ɵɵelementStart(0, "kendo-tabstrip", 3);
299
+ i0.ɵɵlistener("tabSelect", function SkipDynamicUIComponentComponent_Conditional_0_Template_kendo_tabstrip_tabSelect_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTabSelect($event)); });
300
+ i0.ɵɵrepeaterCreate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_Template, 3, 1, "kendo-tabstrip-tab", 4, i0.ɵɵrepeaterTrackByIdentity);
301
+ i0.ɵɵelementEnd();
302
+ } if (rf & 2) {
303
+ const ctx_r1 = i0.ɵɵnextContext();
304
+ i0.ɵɵproperty("keepTabContent", true);
305
+ i0.ɵɵadvance();
306
+ i0.ɵɵrepeater(ctx_r1.reportOptions);
307
+ } }
308
+ function SkipDynamicUIComponentComponent_Conditional_1_button_20_Template(rf, ctx) { if (rf & 1) {
309
+ const _r11 = i0.ɵɵgetCurrentView();
310
+ i0.ɵɵelementStart(0, "button", 24);
311
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_button_20_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.createReportForOption(0)); });
312
+ i0.ɵɵelement(1, "i", 25);
313
+ i0.ɵɵelementStart(2, "span");
314
+ i0.ɵɵtext(3);
315
+ i0.ɵɵelementEnd()();
316
+ } if (rf & 2) {
317
+ const ctx_r1 = i0.ɵɵnextContext(2);
318
+ i0.ɵɵproperty("disabled", ctx_r1.isCreatingReport);
319
+ i0.ɵɵadvance(3);
320
+ i0.ɵɵtextInterpolate1("Create ", ctx_r1.reportOptions[0] ? ctx_r1.getComponentTypeName(ctx_r1.reportOptions[0]) : "Component", "");
321
+ } }
322
+ function SkipDynamicUIComponentComponent_Conditional_1_button_21_Template(rf, ctx) { if (rf & 1) {
323
+ const _r12 = i0.ɵɵgetCurrentView();
324
+ i0.ɵɵelementStart(0, "button", 26);
325
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_button_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.PrintReport()); });
326
+ i0.ɵɵelement(1, "i", 27);
327
+ i0.ɵɵelementStart(2, "span");
328
+ i0.ɵɵtext(3, "Print Report");
329
+ i0.ɵɵelementEnd()();
330
+ } }
331
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_ng_template_1_Template(rf, ctx) { if (rf & 1) {
332
+ i0.ɵɵelement(0, "i", 11);
333
+ i0.ɵɵtext(1, " Functional Requirements ");
334
+ } }
335
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_ng_template_2_Template(rf, ctx) { if (rf & 1) {
336
+ i0.ɵɵelementStart(0, "div", 32);
337
+ i0.ɵɵelement(1, "div", 33);
338
+ i0.ɵɵelementEnd();
339
+ } if (rf & 2) {
340
+ const ctx_r1 = i0.ɵɵnextContext(4);
341
+ i0.ɵɵadvance();
342
+ i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedFunctionalRequirements(ctx_r1.reportOptions[0]), i0.ɵɵsanitizeHtml);
343
+ } }
344
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_Template(rf, ctx) { if (rf & 1) {
345
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
346
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_ng_template_1_Template, 2, 0, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_ng_template_2_Template, 2, 1, "ng-template", 6);
347
+ i0.ɵɵelementEnd();
348
+ } if (rf & 2) {
349
+ i0.ɵɵproperty("selected", true);
350
+ } }
351
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_ng_template_1_Template(rf, ctx) { if (rf & 1) {
352
+ i0.ɵɵelement(0, "i", 13);
353
+ i0.ɵɵtext(1, " Data Requirements ");
354
+ } }
355
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_ng_template_2_Template(rf, ctx) { if (rf & 1) {
356
+ i0.ɵɵelementStart(0, "div", 32);
357
+ i0.ɵɵelement(1, "div", 33);
358
+ i0.ɵɵelementEnd();
359
+ } if (rf & 2) {
360
+ const ctx_r1 = i0.ɵɵnextContext(4);
361
+ i0.ɵɵadvance();
362
+ i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedDataRequirements(ctx_r1.reportOptions[0]), i0.ɵɵsanitizeHtml);
363
+ } }
364
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_Template(rf, ctx) { if (rf & 1) {
365
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
366
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_ng_template_1_Template, 2, 0, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_ng_template_2_Template, 2, 1, "ng-template", 6);
367
+ i0.ɵɵelementEnd();
368
+ } if (rf & 2) {
369
+ const ctx_r1 = i0.ɵɵnextContext(3);
370
+ i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements);
371
+ } }
372
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_ng_template_1_Template(rf, ctx) { if (rf & 1) {
373
+ i0.ɵɵelement(0, "i", 15);
374
+ i0.ɵɵtext(1, " Technical Design ");
375
+ } }
376
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_ng_template_2_Template(rf, ctx) { if (rf & 1) {
377
+ i0.ɵɵelementStart(0, "div", 32);
378
+ i0.ɵɵelement(1, "div", 33);
379
+ i0.ɵɵelementEnd();
380
+ } if (rf & 2) {
381
+ const ctx_r1 = i0.ɵɵnextContext(4);
382
+ i0.ɵɵadvance();
383
+ i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedTechnicalDesign(ctx_r1.reportOptions[0]), i0.ɵɵsanitizeHtml);
384
+ } }
385
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_Template(rf, ctx) { if (rf & 1) {
386
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
387
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_ng_template_1_Template, 2, 0, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_ng_template_2_Template, 2, 1, "ng-template", 6);
388
+ i0.ɵɵelementEnd();
389
+ } if (rf & 2) {
390
+ const ctx_r1 = i0.ɵɵnextContext(3);
391
+ i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements && !ctx_r1.showDataRequirements);
392
+ } }
393
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_ng_template_1_Template(rf, ctx) { if (rf & 1) {
394
+ i0.ɵɵelement(0, "i", 17);
395
+ i0.ɵɵtext(1, " Code ");
396
+ } }
397
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_ng_template_2_Template(rf, ctx) { if (rf & 1) {
398
+ i0.ɵɵelementStart(0, "div", 34);
399
+ i0.ɵɵelement(1, "mj-code-editor", 35);
400
+ i0.ɵɵelementEnd();
401
+ } if (rf & 2) {
402
+ const ctx_r1 = i0.ɵɵnextContext(4);
403
+ i0.ɵɵadvance();
404
+ i0.ɵɵproperty("value", ctx_r1.getComponentCode(ctx_r1.reportOptions[0]))("autoFocus", false)("indentWithTab", true)("readonly", true);
405
+ } }
406
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_Template(rf, ctx) { if (rf & 1) {
407
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 4);
408
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_ng_template_1_Template, 2, 0, "ng-template", 5)(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_ng_template_2_Template, 2, 4, "ng-template", 6);
409
+ i0.ɵɵelementEnd();
410
+ } if (rf & 2) {
411
+ const ctx_r1 = i0.ɵɵnextContext(3);
412
+ i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements && !ctx_r1.showDataRequirements && !ctx_r1.showTechnicalDesign);
413
+ } }
414
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
415
+ const _r13 = i0.ɵɵgetCurrentView();
416
+ i0.ɵɵelementStart(0, "div", 28)(1, "kendo-tabstrip", 29);
417
+ i0.ɵɵtemplate(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_Template, 3, 1, "kendo-tabstrip-tab", 4)(3, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_Template, 3, 1, "kendo-tabstrip-tab", 4)(4, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_Template, 3, 1, "kendo-tabstrip-tab", 4)(5, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_Template, 3, 1, "kendo-tabstrip-tab", 4);
418
+ i0.ɵɵelementEnd()();
419
+ i0.ɵɵelementStart(6, "div", 30);
420
+ i0.ɵɵlistener("mousedown", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template_div_mousedown_6_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.startResize($event)); })("touchstart", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template_div_touchstart_6_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.startResize($event)); });
421
+ i0.ɵɵelement(7, "div", 31);
422
+ i0.ɵɵelementEnd();
423
+ } if (rf & 2) {
424
+ const ctx_r1 = i0.ɵɵnextContext(2);
425
+ i0.ɵɵstyleProp("height", ctx_r1.detailsPanelHeight);
426
+ i0.ɵɵadvance(2);
427
+ i0.ɵɵconditional(ctx_r1.showFunctionalRequirements && ctx_r1.reportOptions[0] ? 2 : -1);
428
+ i0.ɵɵadvance();
429
+ i0.ɵɵconditional(ctx_r1.showDataRequirements && ctx_r1.reportOptions[0] ? 3 : -1);
430
+ i0.ɵɵadvance();
431
+ i0.ɵɵconditional(ctx_r1.showTechnicalDesign && ctx_r1.reportOptions[0] ? 4 : -1);
432
+ i0.ɵɵadvance();
433
+ i0.ɵɵconditional(ctx_r1.showCode && ctx_r1.reportOptions[0] ? 5 : -1);
434
+ } }
435
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_26_Conditional_19_Template(rf, ctx) { if (rf & 1) {
436
+ i0.ɵɵelementStart(0, "details", 44)(1, "summary", 50);
437
+ i0.ɵɵtext(2, "Technical Details (click to expand)");
438
+ i0.ɵɵelementEnd();
439
+ i0.ɵɵelementStart(3, "pre", 51);
440
+ i0.ɵɵtext(4);
441
+ i0.ɵɵelementEnd()();
442
+ } if (rf & 2) {
443
+ const ctx_r1 = i0.ɵɵnextContext(3);
444
+ i0.ɵɵadvance(4);
445
+ i0.ɵɵtextInterpolate(ctx_r1.currentError.technicalDetails);
446
+ } }
447
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_26_Template(rf, ctx) { if (rf & 1) {
448
+ const _r14 = i0.ɵɵgetCurrentView();
449
+ i0.ɵɵelementStart(0, "div", 52)(1, "div", 36)(2, "div", 37)(3, "button", 38);
450
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_26_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.copyErrorToClipboard()); });
451
+ i0.ɵɵelement(4, "span", 39);
452
+ i0.ɵɵtext(5, " Copy Error Details ");
453
+ i0.ɵɵelementEnd();
454
+ i0.ɵɵelementStart(6, "h3", 40);
455
+ i0.ɵɵelement(7, "span", 41);
456
+ i0.ɵɵtext(8, " Component Rendering Error ");
457
+ i0.ɵɵelementEnd()();
458
+ i0.ɵɵelementStart(9, "p", 42);
459
+ i0.ɵɵtext(10, " The selected component option could not be rendered due to the following error: ");
460
+ i0.ɵɵelementEnd();
461
+ i0.ɵɵelementStart(11, "div", 43)(12, "strong");
462
+ i0.ɵɵtext(13, "Error Type:");
463
+ i0.ɵɵelementEnd();
464
+ i0.ɵɵtext(14);
465
+ i0.ɵɵelement(15, "br");
466
+ i0.ɵɵelementStart(16, "strong");
467
+ i0.ɵɵtext(17, "Details:");
468
+ i0.ɵɵelementEnd();
469
+ i0.ɵɵtext(18);
470
+ i0.ɵɵtemplate(19, SkipDynamicUIComponentComponent_Conditional_1_Conditional_26_Conditional_19_Template, 5, 1, "details", 44);
471
+ i0.ɵɵelementEnd();
472
+ i0.ɵɵelementStart(20, "div", 45)(21, "strong", 46);
473
+ i0.ɵɵtext(22, "What to do:");
474
+ i0.ɵɵelementEnd();
475
+ i0.ɵɵelementStart(23, "ol", 47)(24, "li");
476
+ i0.ɵɵtext(25, "Copy the error details and send them back to Skip in the chat to get a corrected version");
477
+ i0.ɵɵelementEnd();
478
+ i0.ɵɵelementStart(26, "li");
479
+ i0.ɵɵtext(27, "Contact your IT department if the issue persists");
480
+ i0.ɵɵelementEnd()()();
481
+ i0.ɵɵelementStart(28, "button", 48);
482
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_26_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.retryCurrentOption()); });
483
+ i0.ɵɵelement(29, "span", 49);
484
+ i0.ɵɵtext(30, " Retry ");
485
+ i0.ɵɵelementEnd()()();
486
+ } if (rf & 2) {
487
+ const ctx_r1 = i0.ɵɵnextContext(2);
488
+ i0.ɵɵadvance(14);
489
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.currentError.type, "");
490
+ i0.ɵɵadvance(4);
491
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.currentError.message, " ");
492
+ i0.ɵɵadvance();
493
+ i0.ɵɵconditional(ctx_r1.currentError.technicalDetails ? 19 : -1);
494
+ } }
495
+ function SkipDynamicUIComponentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
496
+ const _r10 = i0.ɵɵgetCurrentView();
497
+ i0.ɵɵelementStart(0, "div", 2)(1, "div", 8)(2, "div", 9)(3, "button", 10);
498
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleShowFunctionalRequirements()); });
499
+ i0.ɵɵelement(4, "i", 11);
500
+ i0.ɵɵelementStart(5, "span");
501
+ i0.ɵɵtext(6, "Functional");
502
+ i0.ɵɵelementEnd()();
503
+ i0.ɵɵelementStart(7, "button", 12);
504
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleShowDataRequirements()); });
505
+ i0.ɵɵelement(8, "i", 13);
506
+ i0.ɵɵelementStart(9, "span");
507
+ i0.ɵɵtext(10, "Data");
508
+ i0.ɵɵelementEnd()();
509
+ i0.ɵɵelementStart(11, "button", 14);
510
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleShowTechnicalDesign()); });
511
+ i0.ɵɵelement(12, "i", 15);
512
+ i0.ɵɵelementStart(13, "span");
513
+ i0.ɵɵtext(14, "Technical");
514
+ i0.ɵɵelementEnd()();
515
+ i0.ɵɵelementStart(15, "button", 16);
516
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleShowCode()); });
517
+ i0.ɵɵelement(16, "i", 17);
518
+ i0.ɵɵelementStart(17, "span");
519
+ i0.ɵɵtext(18, "Code");
520
+ i0.ɵɵelementEnd()()();
521
+ i0.ɵɵelementStart(19, "div", 18);
522
+ i0.ɵɵtemplate(20, SkipDynamicUIComponentComponent_Conditional_1_button_20_Template, 4, 2, "button", 19)(21, SkipDynamicUIComponentComponent_Conditional_1_button_21_Template, 4, 0, "button", 20);
523
+ i0.ɵɵelementEnd()();
524
+ i0.ɵɵelementStart(22, "div", 21);
525
+ i0.ɵɵtemplate(23, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template, 8, 6);
526
+ i0.ɵɵelementStart(24, "div", 22, 0);
527
+ i0.ɵɵtemplate(26, SkipDynamicUIComponentComponent_Conditional_1_Conditional_26_Template, 31, 3, "div", 52);
528
+ i0.ɵɵelementEnd()()();
529
+ } if (rf & 2) {
530
+ const ctx_r1 = i0.ɵɵnextContext();
531
+ i0.ɵɵadvance(3);
532
+ i0.ɵɵclassProp("active", ctx_r1.showFunctionalRequirements);
533
+ i0.ɵɵadvance(4);
534
+ i0.ɵɵclassProp("active", ctx_r1.showDataRequirements);
535
+ i0.ɵɵadvance(4);
536
+ i0.ɵɵclassProp("active", ctx_r1.showTechnicalDesign);
537
+ i0.ɵɵadvance(4);
538
+ i0.ɵɵclassProp("active", ctx_r1.showCode);
539
+ i0.ɵɵadvance(5);
540
+ i0.ɵɵproperty("ngIf", ctx_r1.ShowCreateReportButton && !ctx_r1.matchingReportID);
541
+ i0.ɵɵadvance();
542
+ i0.ɵɵproperty("ngIf", ctx_r1.ShowPrintReport);
543
+ i0.ɵɵadvance(2);
544
+ i0.ɵɵconditional(ctx_r1.showFunctionalRequirements || ctx_r1.showDataRequirements || ctx_r1.showTechnicalDesign || ctx_r1.showCode ? 23 : -1);
545
+ i0.ɵɵadvance(3);
546
+ i0.ɵɵconditional(ctx_r1.currentError ? 26 : -1);
547
+ } }
548
+ export class SkipDynamicUIComponentComponent {
549
+ constructor(sanitizer, cdr, ngZone) {
550
+ this.sanitizer = sanitizer;
551
+ this.cdr = cdr;
552
+ this.ngZone = ngZone;
553
+ this.UIComponentCode = null;
554
+ this.ComponentObjectName = null;
555
+ this.ShowPrintReport = true;
556
+ this.ShowReportOptionsToggle = true;
557
+ this.ShowCreateReportButton = false;
558
+ this.matchingReportID = null;
559
+ this.DrillDownEvent = new EventEmitter();
560
+ this.CreateReportRequested = new EventEmitter();
561
+ // Properties for handling multiple report options
562
+ this.reportOptions = [];
563
+ this.selectedReportOptionIndex = 0;
564
+ this.currentError = null;
565
+ this.isCreatingReport = false;
566
+ // Toggle states for showing/hiding component details
567
+ this.showFunctionalRequirements = false;
568
+ this.showDataRequirements = false;
569
+ this.showTechnicalDesign = false;
570
+ this.showCode = false;
571
+ // Details panel height for resizing
572
+ this.detailsPanelHeight = '300px';
573
+ this.isResizing = false;
574
+ this.startY = 0;
575
+ this.startHeight = 0;
576
+ // Cache for React component hosts - lazy loaded per option
577
+ this.reactHostCache = new Map();
578
+ this.currentHostIndex = null;
579
+ this.callbacks = {
580
+ RefreshData: () => this.handleRefreshData(),
581
+ OpenEntityRecord: (entityName, key) => this.handleOpenEntityRecord(entityName, key),
582
+ UpdateUserState: (userState) => this.handleUpdateUserState(userState),
583
+ NotifyEvent: (eventName, eventData) => this.handleNotifyEvent(eventName, eventData)
584
+ };
585
+ /**
586
+ * Handle resize movement
587
+ */
588
+ this.onResize = (event) => {
589
+ if (!this.isResizing)
590
+ return;
591
+ const currentY = event instanceof MouseEvent ? event.clientY : event.touches[0].clientY;
592
+ const deltaY = currentY - this.startY;
593
+ const newHeight = Math.max(100, Math.min(600, this.startHeight + deltaY));
594
+ // Run inside Angular to update the binding
595
+ this.ngZone.run(() => {
596
+ this.detailsPanelHeight = `${newHeight}px`;
597
+ this.cdr.detectChanges();
598
+ });
599
+ };
600
+ /**
601
+ * Stop resizing
602
+ */
603
+ this.stopResize = () => {
604
+ this.isResizing = false;
605
+ document.removeEventListener('mousemove', this.onResize);
606
+ document.removeEventListener('mouseup', this.stopResize);
607
+ document.removeEventListener('touchmove', this.onResize);
608
+ document.removeEventListener('touchend', this.stopResize);
609
+ };
610
+ }
611
+ /**
612
+ * Gets the currently selected report option
613
+ */
614
+ get selectedReportOption() {
615
+ return this.reportOptions.length > this.selectedReportOptionIndex
616
+ ? this.reportOptions[this.selectedReportOptionIndex]
617
+ : null;
618
+ }
619
+ /**
620
+ * Get tab title for a specific option index
621
+ */
622
+ getTabTitle(index) {
623
+ const option = this.reportOptions[index];
624
+ if (!option)
625
+ return `report ${index + 1}`;
626
+ const componentType = option.option.componentType || 'report';
627
+ return `${componentType} ${index + 1}`;
628
+ }
629
+ /**
630
+ * Check if this option is the AI's top recommendation
631
+ */
632
+ isTopRanked(index) {
633
+ const option = this.reportOptions[index];
634
+ return (option === null || option === void 0 ? void 0 : option.AIRank) === 1;
635
+ }
636
+ /**
637
+ * Handles when the user selects a tab
638
+ */
639
+ onTabSelect(event) {
640
+ const selectedIndex = event.index;
641
+ this.onReportOptionChange(selectedIndex);
642
+ }
643
+ /**
644
+ * Handles when the user changes the selected report option
645
+ */
646
+ onReportOptionChange(selectedIndex) {
647
+ if (selectedIndex >= 0 && selectedIndex < this.reportOptions.length) {
648
+ this.selectedReportOptionIndex = selectedIndex;
649
+ this.updateCurrentReport();
650
+ }
651
+ }
652
+ /**
653
+ * Updates the current report display based on the selected option
654
+ */
655
+ updateCurrentReport() {
656
+ const selectedOption = this.selectedReportOption;
657
+ if (!selectedOption)
658
+ return;
659
+ // Clear any previous error
660
+ this.currentError = null;
661
+ try {
662
+ // Update the component info - this can fail if placeholders are missing
663
+ this.UIComponentCode = BuildSkipComponentCompleteCode(selectedOption.option);
664
+ this.ComponentObjectName = selectedOption.option.componentName;
665
+ // Simply create or reuse the React host for this option
666
+ // The tab component handles visibility automatically
667
+ if (!this.reactHostCache.has(this.selectedReportOptionIndex)) {
668
+ // Create a new host for this option
669
+ this.createReactHostForOption(this.selectedReportOptionIndex);
670
+ }
671
+ this.currentHostIndex = this.selectedReportOptionIndex;
672
+ }
673
+ catch (error) {
674
+ console.error('Failed to build component code:', error);
675
+ this.currentError = {
676
+ type: 'Component Assembly Error',
677
+ message: 'Failed to assemble the component code. This usually happens when sub-components are missing or placeholders cannot be resolved.',
678
+ technicalDetails: (error === null || error === void 0 ? void 0 : error.toString()) || 'Unknown error during component assembly'
679
+ };
680
+ // Clear the UI component code to prevent partial rendering
681
+ this.UIComponentCode = null;
682
+ this.ComponentObjectName = null;
683
+ }
684
+ }
685
+ PrintReport() {
686
+ return __awaiter(this, void 0, void 0, function* () {
687
+ const currentHost = this.getCurrentReactHost();
688
+ if (currentHost) {
689
+ currentHost.print();
690
+ }
691
+ else {
692
+ window.print();
693
+ }
694
+ });
695
+ }
696
+ /**
697
+ * Copy error details to clipboard for user to send back to Skip
698
+ */
699
+ copyErrorToClipboard() {
700
+ if (!this.currentError)
701
+ return;
702
+ const errorText = `Skip Component Error:
703
+ Type: ${this.currentError.type}
704
+ Message: ${this.currentError.message}
705
+ ${this.currentError.technicalDetails ? `\nTechnical Details:\n${this.currentError.technicalDetails}` : ''}
706
+
707
+ Component Option: ${this.selectedReportOptionIndex + 1}
708
+ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
709
+ navigator.clipboard.writeText(errorText).then(() => {
710
+ alert('Error details copied to clipboard. You can paste this in the Skip chat to get help.');
711
+ }).catch(err => {
712
+ console.error('Failed to copy to clipboard:', err);
713
+ });
714
+ }
715
+ /**
716
+ * Get the container element for a specific option index
717
+ */
718
+ getContainerForOption(optionIndex) {
719
+ var _a;
720
+ if (!this.htmlContainers || this.htmlContainers.length === 0) {
721
+ return null;
722
+ }
723
+ if (this.reportOptions.length === 1) {
724
+ // Single option - use the only container
725
+ return ((_a = this.htmlContainers.first) === null || _a === void 0 ? void 0 : _a.nativeElement) || null;
726
+ }
727
+ else {
728
+ // Multiple options - find container by data-tab-index
729
+ const container = this.htmlContainers.find(ref => ref.nativeElement.getAttribute('data-tab-index') === optionIndex.toString());
730
+ return (container === null || container === void 0 ? void 0 : container.nativeElement) || null;
731
+ }
732
+ }
733
+ /**
734
+ * Retry loading the current option
735
+ */
736
+ retryCurrentOption() {
737
+ // Clear the error
738
+ this.currentError = null;
739
+ // Remove the cached host for this option to force recreation
740
+ if (this.reactHostCache.has(this.selectedReportOptionIndex)) {
741
+ const host = this.reactHostCache.get(this.selectedReportOptionIndex);
742
+ if (host) {
743
+ host.destroy();
744
+ }
745
+ this.reactHostCache.delete(this.selectedReportOptionIndex);
746
+ }
747
+ // Try creating it again
748
+ this.createReactHostForOption(this.selectedReportOptionIndex);
749
+ }
750
+ /**
751
+ * Handle create report request for a specific option
752
+ */
753
+ createReportForOption(optionIndex) {
754
+ this.isCreatingReport = true;
755
+ // Emit the event with the option index so the parent can handle it
756
+ this.CreateReportRequested.emit(optionIndex);
757
+ }
758
+ /**
759
+ * Get the component type name for display
760
+ */
761
+ getComponentTypeName(option) {
762
+ const type = option.option.componentType || 'report';
763
+ return type.charAt(0).toUpperCase() + type.slice(1);
764
+ }
765
+ /**
766
+ * Toggle methods for showing/hiding component details
767
+ */
768
+ toggleShowFunctionalRequirements() {
769
+ this.showFunctionalRequirements = !this.showFunctionalRequirements;
770
+ this.adjustDetailsPanelHeight();
771
+ }
772
+ toggleShowDataRequirements() {
773
+ this.showDataRequirements = !this.showDataRequirements;
774
+ this.adjustDetailsPanelHeight();
775
+ }
776
+ toggleShowTechnicalDesign() {
777
+ this.showTechnicalDesign = !this.showTechnicalDesign;
778
+ this.adjustDetailsPanelHeight();
779
+ }
780
+ toggleShowCode() {
781
+ this.showCode = !this.showCode;
782
+ this.adjustDetailsPanelHeight();
783
+ }
784
+ /**
785
+ * Adjust the details panel height when toggling views
786
+ */
787
+ adjustDetailsPanelHeight() {
788
+ const anyVisible = this.showFunctionalRequirements || this.showDataRequirements ||
789
+ this.showTechnicalDesign || this.showCode;
790
+ if (anyVisible && this.detailsPanelHeight === '0px') {
791
+ this.detailsPanelHeight = '300px';
792
+ }
793
+ else if (!anyVisible) {
794
+ this.detailsPanelHeight = '0px';
795
+ }
796
+ }
797
+ /**
798
+ * Format functional requirements as HTML
799
+ */
800
+ getFormattedFunctionalRequirements(option) {
801
+ const requirements = option.option.functionalRequirements || 'No functional requirements specified.';
802
+ const html = marked.parse(requirements);
803
+ return this.sanitizer.sanitize(1, html); // 1 = SecurityContext.HTML
804
+ }
805
+ /**
806
+ * Format data requirements as HTML
807
+ */
808
+ getFormattedDataRequirements(option) {
809
+ const dataReq = option.option.dataRequirements;
810
+ if (!dataReq) {
811
+ return this.sanitizer.sanitize(1, '<p>No data requirements specified.</p>');
812
+ }
813
+ let markdown = `## Data Access Mode: ${dataReq.mode}\n\n`;
814
+ if (dataReq.description) {
815
+ markdown += `${dataReq.description}\n\n`;
816
+ }
817
+ if (dataReq.staticData) {
818
+ markdown += `### Static Data\n\n`;
819
+ if (dataReq.staticData.description) {
820
+ markdown += `${dataReq.staticData.description}\n\n`;
821
+ }
822
+ if (dataReq.staticData.dataContext) {
823
+ markdown += `**Data Context:** Present (pre-loaded data available)\n\n`;
824
+ }
825
+ }
826
+ if (dataReq.dynamicData) {
827
+ markdown += `### Dynamic Data\n\n`;
828
+ if (dataReq.dynamicData.description) {
829
+ markdown += `${dataReq.dynamicData.description}\n\n`;
830
+ }
831
+ if (dataReq.dynamicData.requiredEntities && dataReq.dynamicData.requiredEntities.length > 0) {
832
+ markdown += `**Required Entities:**\n`;
833
+ dataReq.dynamicData.requiredEntities.forEach(entity => {
834
+ markdown += `- ${entity}\n`;
835
+ });
836
+ markdown += '\n';
837
+ }
838
+ }
839
+ if (dataReq.hybridStrategy) {
840
+ markdown += `### Hybrid Strategy\n\n${dataReq.hybridStrategy.description}\n\n`;
841
+ if (dataReq.hybridStrategy.performanceNotes) {
842
+ markdown += `**Performance Notes:** ${dataReq.hybridStrategy.performanceNotes}\n\n`;
843
+ }
844
+ }
845
+ if (dataReq.securityNotes) {
846
+ markdown += `### Security Considerations\n\n${dataReq.securityNotes}\n`;
847
+ }
848
+ const html = marked.parse(markdown);
849
+ return this.sanitizer.sanitize(1, html);
850
+ }
851
+ /**
852
+ * Format technical design as HTML
853
+ */
854
+ getFormattedTechnicalDesign(option) {
855
+ const design = option.option.technicalDesign || 'No technical design specified.';
856
+ const html = marked.parse(design);
857
+ return this.sanitizer.sanitize(1, html);
858
+ }
859
+ /**
860
+ * Get the component code
861
+ */
862
+ getComponentCode(option) {
863
+ try {
864
+ return BuildSkipComponentCompleteCode(option.option);
865
+ }
866
+ catch (e) {
867
+ return `// Error building complete component code:\n// ${e}`;
868
+ }
869
+ }
870
+ /**
871
+ * Start resizing the details panel
872
+ */
873
+ startResize(event) {
874
+ event.preventDefault();
875
+ this.isResizing = true;
876
+ this.startY = event instanceof MouseEvent ? event.clientY : event.touches[0].clientY;
877
+ this.startHeight = parseInt(this.detailsPanelHeight, 10);
878
+ // Use NgZone to run outside Angular to prevent change detection during drag
879
+ this.ngZone.runOutsideAngular(() => {
880
+ document.addEventListener('mousemove', this.onResize);
881
+ document.addEventListener('mouseup', this.stopResize);
882
+ document.addEventListener('touchmove', this.onResize);
883
+ document.addEventListener('touchend', this.stopResize);
884
+ });
885
+ }
886
+ onWindowResize() {
887
+ // Ensure the details panel height remains valid on window resize
888
+ const currentHeight = parseInt(this.detailsPanelHeight, 10);
889
+ const maxHeight = window.innerHeight * 0.6;
890
+ if (currentHeight > maxHeight) {
891
+ this.detailsPanelHeight = `${maxHeight}px`;
892
+ }
893
+ }
894
+ ngAfterViewInit() {
895
+ if (this.SkipData) {
896
+ this.setupReportOptions(this.SkipData);
897
+ }
898
+ // Wait for ViewChildren to be available
899
+ setTimeout(() => {
900
+ if (this.UIComponentCode && this.ComponentObjectName && this.SkipData) {
901
+ // Create the initial React host for the first option
902
+ this.createReactHostForOption(this.selectedReportOptionIndex);
903
+ }
904
+ });
905
+ }
906
+ ngOnDestroy() {
907
+ // Clean up all cached React hosts
908
+ this.reactHostCache.forEach(host => {
909
+ try {
910
+ host.destroy();
911
+ }
912
+ catch (e) {
913
+ console.error('Error destroying React host:', e);
914
+ }
915
+ });
916
+ this.reactHostCache.clear();
917
+ }
918
+ ngOnChanges(changes) {
919
+ if (changes['SkipData'] && !changes['SkipData'].firstChange) {
920
+ // Update all cached React components with new data
921
+ const newData = this.getFlattenedDataContext();
922
+ this.reactHostCache.forEach(host => {
923
+ try {
924
+ host.updateState('data', newData);
925
+ }
926
+ catch (e) {
927
+ console.error('Error updating React host data:', e);
928
+ }
929
+ });
930
+ }
931
+ }
932
+ /**
933
+ * Get the currently active React host
934
+ */
935
+ getCurrentReactHost() {
936
+ if (this.currentHostIndex !== null && this.reactHostCache.has(this.currentHostIndex)) {
937
+ return this.reactHostCache.get(this.currentHostIndex) || null;
938
+ }
939
+ return null;
940
+ }
941
+ get SkipData() {
942
+ return this._skipData ? this._skipData : undefined;
943
+ }
944
+ set SkipData(d) {
945
+ const hadData = this._skipData ? true : false;
946
+ this._skipData = d;
947
+ if (d) {
948
+ // For backward compatibility, check if we have component options
949
+ if (d.componentOptions && d.componentOptions.length > 0) {
950
+ // Use the first component option (or the highest ranked one)
951
+ const component = d.componentOptions[0];
952
+ this.UIComponentCode = BuildSkipComponentCompleteCode(component.option);
953
+ this.ComponentObjectName = component.option.componentName;
954
+ }
955
+ else {
956
+ // Fallback for old format
957
+ this.UIComponentCode = d.htmlReport;
958
+ this.ComponentObjectName = d.htmlReportObjectName;
959
+ }
960
+ }
961
+ if (d && hadData) {
962
+ // Update the current display with new data
963
+ this.updateCurrentReport();
964
+ }
965
+ }
966
+ /**
967
+ * Sets up the component options from the SkipData, prioritizing the new componentOptions array
968
+ * but falling back to the deprecated htmlReport/htmlReportObjectName for backward compatibility
969
+ */
970
+ setupReportOptions(data) {
971
+ // Check if we have the new componentOptions array
972
+ if (data.componentOptions && data.componentOptions.length > 0) {
973
+ // Sort by AIRank (lower numbers = better ranking)
974
+ this.reportOptions = [...data.componentOptions].sort((a, b) => {
975
+ var _a, _b;
976
+ const rankA = (_a = a.AIRank) !== null && _a !== void 0 ? _a : Number.MAX_SAFE_INTEGER;
977
+ const rankB = (_b = b.AIRank) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER;
978
+ return rankA - rankB;
979
+ });
980
+ // Select the best option (first in sorted array)
981
+ this.selectedReportOptionIndex = 0;
982
+ const bestOption = this.reportOptions[0];
983
+ this.UIComponentCode = BuildSkipComponentCompleteCode(bestOption.option);
984
+ this.ComponentObjectName = bestOption.option.componentName;
985
+ }
986
+ }
987
+ /**
988
+ * Create a React host for a specific option index
989
+ */
990
+ createReactHostForOption(optionIndex) {
991
+ return __awaiter(this, void 0, void 0, function* () {
992
+ var _a, _b, _c;
993
+ const option = this.reportOptions[optionIndex];
994
+ if (!option)
995
+ return;
996
+ const container = this.getContainerForOption(optionIndex);
997
+ if (!container)
998
+ return;
999
+ try {
1000
+ const componentCode = BuildSkipComponentCompleteCode(option.option);
1001
+ // Check for unresolved placeholders in the code
1002
+ if (componentCode.includes('<<') && componentCode.includes('>>')) {
1003
+ const placeholderMatch = componentCode.match(/<<([^>]+)>>/);
1004
+ const placeholderName = placeholderMatch ? placeholderMatch[1] : 'Unknown';
1005
+ this.currentError = {
1006
+ type: 'Incomplete Component',
1007
+ message: `This component option contains unresolved placeholders (${placeholderName}). The component generation was not completed successfully.`,
1008
+ technicalDetails: `The component code contains placeholder tokens that should have been replaced with actual implementations. This typically happens when the AI generation process was interrupted or encountered an error.\n\nPlaceholder found: <<${placeholderName}>>`
1009
+ };
1010
+ return;
1011
+ }
1012
+ const md = new Metadata();
1013
+ const data = this.getFlattenedDataContext();
1014
+ // Create the React component host directly in the tab container
1015
+ const reactHost = new SkipReactComponentHost({
1016
+ componentCode: componentCode,
1017
+ container: container,
1018
+ callbacks: this.callbacks,
1019
+ data: data,
1020
+ utilities: this.SetupUtilities(md),
1021
+ styles: this.SetupStyles()
1022
+ });
1023
+ // Initialize and render the React component
1024
+ yield reactHost.initialize();
1025
+ // Cache the host
1026
+ this.reactHostCache.set(optionIndex, reactHost);
1027
+ // Update current index if this is the selected option
1028
+ if (optionIndex === this.selectedReportOptionIndex) {
1029
+ this.currentHostIndex = optionIndex;
1030
+ }
1031
+ }
1032
+ catch (e) {
1033
+ console.error('Error creating React host:', e);
1034
+ // Determine the type of error and create a user-friendly message
1035
+ let errorType = 'Component Initialization Error';
1036
+ let errorMessage = 'Failed to initialize the React component.';
1037
+ let technicalDetails = e.toString();
1038
+ if ((_a = e.message) === null || _a === void 0 ? void 0 : _a.includes('JSX transpilation failed')) {
1039
+ errorType = 'Code Compilation Error';
1040
+ errorMessage = 'The component code could not be compiled. This usually indicates a syntax error in the generated code.';
1041
+ technicalDetails = e.message;
1042
+ }
1043
+ else if ((_b = e.message) === null || _b === void 0 ? void 0 : _b.includes('is not defined')) {
1044
+ errorType = 'Missing Dependency';
1045
+ errorMessage = 'The component is trying to use a feature or library that is not available.';
1046
+ }
1047
+ else if ((_c = e.message) === null || _c === void 0 ? void 0 : _c.includes('Cannot read properties')) {
1048
+ errorType = 'Property Access Error';
1049
+ errorMessage = 'The component is trying to access data that doesn\'t exist. This often happens when property names don\'t match the data structure.';
1050
+ }
1051
+ this.currentError = {
1052
+ type: errorType,
1053
+ message: errorMessage,
1054
+ technicalDetails: technicalDetails + '\n\nComponent Option: ' + (optionIndex + 1) + '\nComponent Name: ' + option.option.componentName
1055
+ };
1056
+ LogError(e);
1057
+ }
1058
+ });
1059
+ }
1060
+ getFlattenedDataContext() {
1061
+ var _a;
1062
+ const flattenedDataContext = {};
1063
+ if ((_a = this.SkipData) === null || _a === void 0 ? void 0 : _a.dataContext) {
1064
+ const loadedItems = this.SkipData.dataContext.Items.filter((i) => { var _a; return i.DataLoaded && ((_a = i._Data) === null || _a === void 0 ? void 0 : _a.length) > 0; });
1065
+ for (let i = 0; i < loadedItems.length; i++) {
1066
+ flattenedDataContext["data_item_" + i] = loadedItems[i]._Data;
1067
+ }
1068
+ }
1069
+ return flattenedDataContext;
1070
+ }
1071
+ // Event handler implementations
1072
+ handleRefreshData() {
1073
+ console.log('Component requested data refresh');
1074
+ // Emit an event or call parent component method to refresh data
1075
+ }
1076
+ handleOpenEntityRecord(entityName, key) {
1077
+ if (entityName) {
1078
+ // bubble this up to our parent component as we don't directly open records in this component
1079
+ const md = new Metadata();
1080
+ const entityMatch = md.EntityByName(entityName);
1081
+ if (!entityMatch) {
1082
+ // couldn't find it, but sometimes the AI uses a table name or a view name, let's check for that
1083
+ const altMatch = md.Entities.filter(e => e.BaseTable.toLowerCase() === entityName.toLowerCase() ||
1084
+ e.BaseView.toLowerCase() === entityName.toLowerCase() ||
1085
+ e.SchemaName.toLowerCase() + '.' + e.BaseTable.toLowerCase() === entityName.toLowerCase() ||
1086
+ e.SchemaName.toLowerCase() + '.' + e.BaseView.toLowerCase() === entityName.toLowerCase());
1087
+ if (altMatch && altMatch.length === 1) {
1088
+ entityName = altMatch[0].Name;
1089
+ }
1090
+ }
1091
+ const cKey = new CompositeKey(key);
1092
+ this.DrillDownEvent.emit(new DrillDownInfo(entityName, cKey.ToWhereClause()));
1093
+ }
1094
+ }
1095
+ handleUpdateUserState(userState) {
1096
+ console.log('Component updated user state:', userState);
1097
+ // TODO: Implement user state persistence if needed
1098
+ }
1099
+ handleNotifyEvent(eventName, eventData) {
1100
+ var _a;
1101
+ console.log(`Component raised event: ${eventName} notified with data:`, eventData);
1102
+ // Handle component errors from React host
1103
+ if (eventName === 'componentError') {
1104
+ this.currentError = {
1105
+ type: eventData.source || 'React Component Error',
1106
+ message: eventData.error || 'An unknown error occurred in the React component',
1107
+ technicalDetails: eventData.stackTrace || ((_a = eventData.errorInfo) === null || _a === void 0 ? void 0 : _a.componentStack) || ''
1108
+ };
1109
+ }
1110
+ // TODO: Handle other custom events as needed
1111
+ }
1112
+ SetupUtilities(md) {
1113
+ const rv = new RunView();
1114
+ const rq = new RunQuery();
1115
+ const u = {
1116
+ md: this.CreateSimpleMetadata(md),
1117
+ rv: this.CreateSimpleRunView(rv),
1118
+ rq: this.CreateSimpleRunQuery(rq)
1119
+ };
1120
+ return u;
1121
+ }
1122
+ CreateSimpleMetadata(md) {
1123
+ return {
1124
+ entities: md.Entities.map(e => MapEntityInfoToSkipEntityInfo(e))
1125
+ };
1126
+ }
1127
+ SetupStyles() {
1128
+ // Return modern, contemporary styles for generated components
1129
+ return {
1130
+ colors: {
1131
+ // Primary colors - modern purple/blue gradient feel
1132
+ primary: '#5B4FE9',
1133
+ primaryHover: '#4940D4',
1134
+ primaryLight: '#E8E6FF',
1135
+ // Secondary colors - sophisticated gray
1136
+ secondary: '#64748B',
1137
+ secondaryHover: '#475569',
1138
+ // Status colors
1139
+ success: '#10B981',
1140
+ successLight: '#D1FAE5',
1141
+ warning: '#F59E0B',
1142
+ warningLight: '#FEF3C7',
1143
+ error: '#EF4444',
1144
+ errorLight: '#FEE2E2',
1145
+ info: '#3B82F6',
1146
+ infoLight: '#DBEAFE',
1147
+ // Base colors
1148
+ background: '#FFFFFF',
1149
+ surface: '#F8FAFC',
1150
+ surfaceHover: '#F1F5F9',
1151
+ // Text colors with better contrast
1152
+ text: '#1E293B',
1153
+ textSecondary: '#64748B',
1154
+ textTertiary: '#94A3B8',
1155
+ textInverse: '#FFFFFF',
1156
+ // Border colors
1157
+ border: '#E2E8F0',
1158
+ borderLight: '#F1F5F9',
1159
+ borderFocus: '#5B4FE9',
1160
+ // Shadows (as color strings for easy use)
1161
+ shadow: 'rgba(0, 0, 0, 0.05)',
1162
+ shadowMedium: 'rgba(0, 0, 0, 0.1)',
1163
+ shadowLarge: 'rgba(0, 0, 0, 0.15)',
1164
+ },
1165
+ spacing: {
1166
+ xs: '4px',
1167
+ sm: '8px',
1168
+ md: '16px',
1169
+ lg: '24px',
1170
+ xl: '32px',
1171
+ xxl: '48px',
1172
+ xxxl: '64px',
1173
+ },
1174
+ typography: {
1175
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, sans-serif',
1176
+ fontSize: {
1177
+ xs: '11px',
1178
+ sm: '12px',
1179
+ md: '14px',
1180
+ lg: '16px',
1181
+ xl: '20px',
1182
+ xxl: '24px',
1183
+ xxxl: '32px',
1184
+ },
1185
+ fontWeight: {
1186
+ light: '300',
1187
+ regular: '400',
1188
+ medium: '500',
1189
+ semibold: '600',
1190
+ bold: '700',
1191
+ },
1192
+ lineHeight: {
1193
+ tight: '1.25',
1194
+ normal: '1.5',
1195
+ relaxed: '1.75',
1196
+ },
1197
+ },
1198
+ borders: {
1199
+ radius: {
1200
+ sm: '6px',
1201
+ md: '8px',
1202
+ lg: '12px',
1203
+ xl: '16px',
1204
+ full: '9999px',
1205
+ },
1206
+ width: {
1207
+ thin: '1px',
1208
+ medium: '2px',
1209
+ thick: '3px',
1210
+ },
1211
+ },
1212
+ shadows: {
1213
+ sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
1214
+ md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
1215
+ lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
1216
+ xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
1217
+ inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',
1218
+ },
1219
+ transitions: {
1220
+ fast: '150ms ease-in-out',
1221
+ normal: '250ms ease-in-out',
1222
+ slow: '350ms ease-in-out',
1223
+ },
1224
+ overflow: 'auto' // Default overflow style
1225
+ };
1226
+ }
1227
+ CreateSimpleRunQuery(rq) {
1228
+ return {
1229
+ runQuery: (params) => __awaiter(this, void 0, void 0, function* () {
1230
+ // Run a single query and return the results
1231
+ try {
1232
+ const result = yield rq.RunQuery(params);
1233
+ return result;
1234
+ }
1235
+ catch (error) {
1236
+ LogError(error);
1237
+ throw error; // Re-throw to handle it in the caller
1238
+ }
1239
+ })
1240
+ };
1241
+ }
1242
+ CreateSimpleRunView(rv) {
1243
+ return {
1244
+ runView: (params) => __awaiter(this, void 0, void 0, function* () {
1245
+ // Run a single view and return the results
1246
+ try {
1247
+ const result = yield rv.RunView(params);
1248
+ return result;
1249
+ }
1250
+ catch (error) {
1251
+ LogError(error);
1252
+ throw error; // Re-throw to handle it in the caller
1253
+ }
1254
+ }),
1255
+ runViews: (params) => __awaiter(this, void 0, void 0, function* () {
1256
+ // Runs multiple views and returns the results
1257
+ try {
1258
+ const results = yield rv.RunViews(params);
1259
+ return results;
1260
+ }
1261
+ catch (error) {
1262
+ LogError(error);
1263
+ throw error; // Re-throw to handle it in the caller
1264
+ }
1265
+ })
1266
+ };
1267
+ }
1268
+ SetupCallbacks() {
1269
+ const cb = {
1270
+ RefreshData: () => {
1271
+ // this is a callback function that can be called from the component to refresh data
1272
+ console.log('Component requested data refresh');
1273
+ // need to implement this
1274
+ },
1275
+ OpenEntityRecord: (entityName, key) => {
1276
+ // this is a callback function that can be called from the component to open an entity record
1277
+ if (entityName) {
1278
+ // bubble this up to our parent component as we don't directly open records in this component
1279
+ const md = new Metadata();
1280
+ const entityMatch = md.EntityByName(entityName);
1281
+ if (!entityMatch) {
1282
+ // couldn't find it, but sometimes the AI uses a table name or a view name, let's check for that
1283
+ const altMatch = md.Entities.filter(e => e.BaseTable.toLowerCase() === entityName.toLowerCase() ||
1284
+ e.BaseView.toLowerCase() === entityName.toLowerCase() ||
1285
+ e.SchemaName.toLowerCase() + '.' + e.BaseTable.toLowerCase() === entityName.toLowerCase() ||
1286
+ e.SchemaName.toLowerCase() + '.' + e.BaseView.toLowerCase() === entityName.toLowerCase());
1287
+ if (altMatch && altMatch.length === 1) {
1288
+ entityName = altMatch[0].Name;
1289
+ }
1290
+ }
1291
+ const cKey = new CompositeKey(key);
1292
+ this.DrillDownEvent.emit(new DrillDownInfo(entityName, cKey.ToWhereClause()));
1293
+ }
1294
+ },
1295
+ UpdateUserState: (userState) => {
1296
+ // this is a callback function that can be called from the component to update user state
1297
+ console.log('Component updated user state:', userState);
1298
+ // need to implement this
1299
+ },
1300
+ NotifyEvent: (eventName, eventData) => {
1301
+ // this is a callback function that can be called from the component to notify an event
1302
+ console.log(`Component raised event: ${eventName} notified with data:`, eventData);
1303
+ }
1304
+ };
1305
+ return cb;
1306
+ }
1307
+ refreshReport(data) {
1308
+ return __awaiter(this, void 0, void 0, function* () {
1309
+ const currentHost = this.getCurrentReactHost();
1310
+ if (currentHost) {
1311
+ currentHost.refresh(data);
1312
+ }
1313
+ else {
1314
+ // If no React host is available, create one for the current option
1315
+ this.createReactHostForOption(this.selectedReportOptionIndex);
1316
+ }
1317
+ });
1318
+ }
1319
+ }
1320
+ SkipDynamicUIComponentComponent.ɵfac = function SkipDynamicUIComponentComponent_Factory(t) { return new (t || SkipDynamicUIComponentComponent)(i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); };
1321
+ SkipDynamicUIComponentComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipDynamicUIComponentComponent, selectors: [["skip-dynamic-ui-component"]], viewQuery: function SkipDynamicUIComponentComponent_Query(rf, ctx) { if (rf & 1) {
1322
+ i0.ɵɵviewQuery(_c0, 5);
1323
+ } if (rf & 2) {
1324
+ let _t;
1325
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.htmlContainers = _t);
1326
+ } }, hostBindings: function SkipDynamicUIComponentComponent_HostBindings(rf, ctx) { if (rf & 1) {
1327
+ i0.ɵɵlistener("resize", function SkipDynamicUIComponentComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
1328
+ } }, inputs: { UIComponentCode: "UIComponentCode", ComponentObjectName: "ComponentObjectName", ShowPrintReport: "ShowPrintReport", ShowReportOptionsToggle: "ShowReportOptionsToggle", ShowCreateReportButton: "ShowCreateReportButton", matchingReportID: "matchingReportID", SkipData: "SkipData" }, outputs: { DrillDownEvent: "DrillDownEvent", CreateReportRequested: "CreateReportRequested" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 1, consts: [["htmlContainer", ""], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "keepTabContent"], [2, "height", "100%", "display", "flex", "flex-direction", "column"], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "tabSelect", "keepTabContent"], [3, "selected"], ["kendoTabTitle", ""], ["kendoTabContent", ""], [1, "fa-solid", "fa-star", "star-icon"], [1, "tab-action-bar"], [1, "tab-actions-left"], ["title", "Toggle Functional Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-list-check"], ["title", "Toggle Data Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-database"], ["title", "Toggle Technical Design", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-cogs"], ["title", "Toggle Code View", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-code"], [1, "tab-actions-right"], ["class", "tab-action-button create-button", 3, "disabled", "click", 4, "ngIf"], ["class", "tab-action-button print-button", "title", "Print Report", 3, "click", 4, "ngIf"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "min-height", "0", "overflow", "hidden"], [2, "flex", "1", "position", "relative", "min-height", "0", "overflow", "auto"], [2, "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"], [1, "tab-action-button", "create-button", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["title", "Print Report", 1, "tab-action-button", "print-button", 3, "click"], [1, "fa-solid", "fa-print"], [1, "details-panel"], [2, "height", "100%"], [1, "panel-resizer", 3, "mousedown", "touchstart"], [1, "resizer-handle"], [1, "details-content"], [3, "innerHTML"], [1, "details-content", "code-content"], [2, "height", "100%", 3, "value", "autoFocus", "indentWithTab", "readonly"], [2, "width", "90%", "max-width", "600px", "height", "500px", "background-color", "#f8f9fa", "border", "2px solid #dc3545", "border-radius", "8px", "padding", "20px", "overflow-y", "auto", "box-shadow", "0 4px 6px rgba(0, 0, 0, 0.1)"], [2, "position", "relative"], ["kendoButton", "", 2, "position", "absolute", "top", "0", "right", "0", "font-size", "12px", 3, "click"], [1, "fa-solid", "fa-copy"], [2, "color", "#dc3545", "margin-top", "0", "margin-right", "150px", "font-size", "18px"], [1, "fa-solid", "fa-exclamation-triangle"], [2, "margin-bottom", "10px", "font-size", "14px"], [2, "background-color", "#fff", "border", "1px solid #dee2e6", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px", "font-family", "'Courier New', monospace", "font-size", "12px"], [2, "margin-top", "8px"], [2, "background-color", "#e7f3ff", "border", "1px solid #b3d9ff", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px"], [2, "font-size", "14px"], [2, "margin", "8px 0 0 20px", "padding", "0", "font-size", "13px"], ["kendoButton", "", 2, "font-size", "13px", 3, "click"], [1, "fa-solid", "fa-rotate"], [2, "cursor", "pointer", "color", "#0056b3"], [2, "margin-top", "8px", "white-space", "pre-wrap", "word-break", "break-word", "font-size", "11px"], [2, "position", "absolute", "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"]], template: function SkipDynamicUIComponentComponent_Template(rf, ctx) { if (rf & 1) {
1329
+ i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_Template, 3, 1, "kendo-tabstrip", 1)(1, SkipDynamicUIComponentComponent_Conditional_1_Template, 27, 12, "div", 2);
1330
+ } if (rf & 2) {
1331
+ i0.ɵɵconditional(ctx.reportOptions.length > 1 ? 0 : 1);
1332
+ } }, dependencies: [i2.NgIf, i3.TabStripComponent, i3.TabStripTabComponent, i3.TabContentDirective, i3.TabTitleDirective, i4.ButtonComponent, i5.CodeEditorComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n position: relative;\n }\n \n \n\n .tab-action-bar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background-color: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n }\n \n .tab-actions-left[_ngcontent-%COMP%], \n .tab-actions-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n \n\n .tab-action-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n background-color: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n transition: all 0.15s ease;\n white-space: nowrap;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .tab-action-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n \n \n\n .tab-action-button.create-button[_ngcontent-%COMP%], \n .tab-action-button.print-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #333;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.create-button[_ngcontent-%COMP%]:hover:not(:disabled), \n .tab-action-button.print-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n \n\n .tab-action-button.toggle-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #666;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.toggle-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n color: #333;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%] {\n background-color: #5B4FE9;\n color: white;\n border-color: #5B4FE9;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #4940D4;\n border-color: #4940D4;\n }\n \n \n\n .details-panel[_ngcontent-%COMP%] {\n border-bottom: 1px solid #e0e0e0;\n background-color: #fafafa;\n overflow: hidden;\n transition: height 0.3s ease;\n }\n \n .details-content[_ngcontent-%COMP%] {\n padding: 16px;\n overflow-y: auto;\n height: 100%;\n font-size: 14px;\n line-height: 1.6;\n }\n \n .details-content.code-content[_ngcontent-%COMP%] {\n padding: 0;\n }\n \n \n\n .panel-resizer[_ngcontent-%COMP%] {\n height: 4px;\n background-color: #e0e0e0;\n cursor: ns-resize;\n position: relative;\n transition: background-color 0.2s ease;\n }\n \n .panel-resizer[_ngcontent-%COMP%]:hover {\n background-color: #d0d0d0;\n }\n \n .resizer-handle[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 40px;\n height: 2px;\n background-color: #999;\n border-radius: 1px;\n }\n \n \n\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h1) { font-size: 1.5em; margin-top: 0; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h2) { font-size: 1.3em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h3) { font-size: 1.1em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ul), .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ol) { margin-left: 1.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(code) { \n background-color: #f4f4f4; \n padding: 2px 4px; \n border-radius: 3px; \n font-family: 'Courier New', monospace; \n font-size: 0.9em;\n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(pre) { \n background-color: #f4f4f4; \n padding: 12px; \n border-radius: 4px; \n overflow-x: auto; \n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(blockquote) { \n border-left: 4px solid #e0e0e0; \n padding-left: 16px; \n margin-left: 0; \n color: #666; \n }\n \n \n\n .k-tabstrip {\n border: none;\n height: 100%;\n display: flex;\n flex-direction: column;\n margin: 10px 5px 5px 5px;\n }\n \n .k-tabstrip-items {\n background: #f8f9fa;\n border: none;\n border-radius: 8px 8px 0 0;\n flex: 0 0 auto;\n padding: 8px 12px 0 12px;\n gap: 4px;\n display: flex;\n }\n \n .k-tabstrip-items-wrapper {\n height: 100%;\n }\n \n .k-content {\n flex: 1;\n overflow: hidden;\n padding: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-top: none;\n border-radius: 0 0 8px 8px;\n }\n \n .k-tabstrip .k-item {\n margin-right: 2px;\n border: none;\n background: transparent;\n border-radius: 6px 6px 0 0;\n padding: 2px;\n transition: all 0.2s ease;\n }\n \n .k-tabstrip .k-item.k-selected {\n background: white;\n border: 1px solid #e0e0e0;\n border-bottom: 1px solid white;\n margin-bottom: -1px;\n z-index: 1;\n }\n \n .k-tabstrip .k-link {\n padding: 8px 16px;\n font-weight: 500;\n font-size: 13px;\n color: #666;\n transition: all 0.15s ease;\n border-radius: 4px 4px 0 0;\n background: transparent;\n border: none;\n text-transform: lowercase;\n }\n \n .k-tabstrip .k-link:first-letter {\n text-transform: uppercase;\n }\n \n .k-tabstrip .k-item:hover:not(.k-selected) .k-link {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n \n .k-tabstrip .k-item.k-selected .k-link {\n color: #1976d2;\n font-weight: 600;\n background: white;\n }\n \n \n\n .k-tabstrip .k-link .star-icon {\n display: inline-block;\n margin-right: 4px;\n color: #ffd700;\n font-size: 12px;\n vertical-align: middle;\n }\n \n \n\n .k-tabstrip-items::before, \n .k-tabstrip-items::after {\n display: none;\n }\n \n .k-tabstrip .k-item::before, \n .k-tabstrip .k-item::after {\n display: none;\n }\n \n \n\n .k-tabstrip .k-link:focus {\n outline: none;\n box-shadow: none;\n }\n \n \n\n .k-tabstrip .k-content.k-state-active {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n \n\n .react-host-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }"] });
1333
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkipDynamicUIComponentComponent, [{
1334
+ type: Component,
1335
+ args: [{ selector: 'skip-dynamic-ui-component', template: `
1336
+ @if (reportOptions.length > 1) {
1337
+ <!-- Multiple options: show tabs -->
1338
+ <kendo-tabstrip
1339
+ (tabSelect)="onTabSelect($event)"
1340
+ [keepTabContent]="true"
1341
+ style="height: 100%; display: flex; flex-direction: column;">
1342
+ @for (option of reportOptions; track option; let i = $index) {
1343
+ <kendo-tabstrip-tab [selected]="i === selectedReportOptionIndex">
1344
+ <ng-template kendoTabTitle>
1345
+ @if (isTopRanked(i)) {
1346
+ <i class="fa-solid fa-star star-icon"></i>
1347
+ }
1348
+ {{ getTabTitle(i) }}
1349
+ </ng-template>
1350
+ <ng-template kendoTabContent>
1351
+ <div style="height: 100%; display: flex; flex-direction: column;">
1352
+ <!-- Tab Action Bar -->
1353
+ <div class="tab-action-bar">
1354
+ <div class="tab-actions-left">
1355
+ <!-- Toggle buttons for showing/hiding component details -->
1356
+ <button class="tab-action-button toggle-button"
1357
+ (click)="toggleShowFunctionalRequirements()"
1358
+ [class.active]="showFunctionalRequirements"
1359
+ title="Toggle Functional Requirements">
1360
+ <i class="fa-solid fa-list-check"></i>
1361
+ <span>Functional</span>
1362
+ </button>
1363
+ <button class="tab-action-button toggle-button"
1364
+ (click)="toggleShowDataRequirements()"
1365
+ [class.active]="showDataRequirements"
1366
+ title="Toggle Data Requirements">
1367
+ <i class="fa-solid fa-database"></i>
1368
+ <span>Data</span>
1369
+ </button>
1370
+ <button class="tab-action-button toggle-button"
1371
+ (click)="toggleShowTechnicalDesign()"
1372
+ [class.active]="showTechnicalDesign"
1373
+ title="Toggle Technical Design">
1374
+ <i class="fa-solid fa-cogs"></i>
1375
+ <span>Technical</span>
1376
+ </button>
1377
+ <button class="tab-action-button toggle-button"
1378
+ (click)="toggleShowCode()"
1379
+ [class.active]="showCode"
1380
+ title="Toggle Code View">
1381
+ <i class="fa-solid fa-code"></i>
1382
+ <span>Code</span>
1383
+ </button>
1384
+ </div>
1385
+ <div class="tab-actions-right">
1386
+ <button class="tab-action-button create-button"
1387
+ *ngIf="ShowCreateReportButton && !matchingReportID"
1388
+ (click)="createReportForOption(i)"
1389
+ [disabled]="isCreatingReport">
1390
+ <i class="fa-solid fa-plus"></i>
1391
+ <span>Create {{ getComponentTypeName(option) }}</span>
1392
+ </button>
1393
+ <button class="tab-action-button print-button"
1394
+ *ngIf="ShowPrintReport"
1395
+ (click)="PrintReport()"
1396
+ title="Print Report">
1397
+ <i class="fa-solid fa-print"></i>
1398
+ <span>Print Report</span>
1399
+ </button>
1400
+ </div>
1401
+ </div>
1402
+
1403
+ <!-- Main content area with optional details panels -->
1404
+ <div style="flex: 1; display: flex; flex-direction: column; min-height: 0; overflow: hidden;">
1405
+ @if (showFunctionalRequirements || showDataRequirements || showTechnicalDesign || showCode) {
1406
+ <!-- Details panel -->
1407
+ <div class="details-panel" [style.height]="detailsPanelHeight">
1408
+ <kendo-tabstrip style="height: 100%;">
1409
+ @if (showFunctionalRequirements) {
1410
+ <kendo-tabstrip-tab [selected]="true">
1411
+ <ng-template kendoTabTitle>
1412
+ <i class="fa-solid fa-list-check"></i> Functional Requirements
1413
+ </ng-template>
1414
+ <ng-template kendoTabContent>
1415
+ <div class="details-content">
1416
+ <div [innerHTML]="getFormattedFunctionalRequirements(option)"></div>
1417
+ </div>
1418
+ </ng-template>
1419
+ </kendo-tabstrip-tab>
1420
+ }
1421
+ @if (showDataRequirements) {
1422
+ <kendo-tabstrip-tab [selected]="!showFunctionalRequirements">
1423
+ <ng-template kendoTabTitle>
1424
+ <i class="fa-solid fa-database"></i> Data Requirements
1425
+ </ng-template>
1426
+ <ng-template kendoTabContent>
1427
+ <div class="details-content">
1428
+ <div [innerHTML]="getFormattedDataRequirements(option)"></div>
1429
+ </div>
1430
+ </ng-template>
1431
+ </kendo-tabstrip-tab>
1432
+ }
1433
+ @if (showTechnicalDesign) {
1434
+ <kendo-tabstrip-tab [selected]="!showFunctionalRequirements && !showDataRequirements">
1435
+ <ng-template kendoTabTitle>
1436
+ <i class="fa-solid fa-cogs"></i> Technical Design
1437
+ </ng-template>
1438
+ <ng-template kendoTabContent>
1439
+ <div class="details-content">
1440
+ <div [innerHTML]="getFormattedTechnicalDesign(option)"></div>
1441
+ </div>
1442
+ </ng-template>
1443
+ </kendo-tabstrip-tab>
1444
+ }
1445
+ @if (showCode) {
1446
+ <kendo-tabstrip-tab [selected]="!showFunctionalRequirements && !showDataRequirements && !showTechnicalDesign">
1447
+ <ng-template kendoTabTitle>
1448
+ <i class="fa-solid fa-code"></i> Code
1449
+ </ng-template>
1450
+ <ng-template kendoTabContent>
1451
+ <div class="details-content code-content">
1452
+ <mj-code-editor
1453
+ [value]="getComponentCode(option)"
1454
+ [autoFocus]="false"
1455
+ [indentWithTab]="true"
1456
+ [readonly]="true"
1457
+ style="height: 100%;">
1458
+ </mj-code-editor>
1459
+ </div>
1460
+ </ng-template>
1461
+ </kendo-tabstrip-tab>
1462
+ }
1463
+ </kendo-tabstrip>
1464
+ </div>
1465
+ <!-- Resizer -->
1466
+ <div class="panel-resizer"
1467
+ (mousedown)="startResize($event)"
1468
+ (touchstart)="startResize($event)">
1469
+ <div class="resizer-handle"></div>
1470
+ </div>
1471
+ }
1472
+
1473
+ <!-- React component container -->
1474
+ <div #htmlContainer [attr.data-tab-index]="i"
1475
+ style="flex: 1; position: relative; min-height: 0; overflow: auto;">
1476
+ <!-- Content will be rendered here by React host -->
1477
+
1478
+ <!-- Error overlay for this tab (shown on top of content when needed) -->
1479
+ @if (currentError && selectedReportOptionIndex === i) {
1480
+ <div style="top: 0;
1481
+ left: 0;
1482
+ right: 0;
1483
+ bottom: 0;
1484
+ display: flex;
1485
+ align-items: flex-start;
1486
+ justify-content: center;
1487
+ padding-top: 20px;
1488
+ background: rgba(255, 255, 255, 0.95);
1489
+ z-index: 10;">
1490
+ <div style="width: 90%;
1491
+ max-width: 600px;
1492
+ height: 500px;
1493
+ background-color: #f8f9fa;
1494
+ border: 2px solid #dc3545;
1495
+ border-radius: 8px;
1496
+ padding: 20px;
1497
+ overflow-y: auto;
1498
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);">
1499
+ <div style="position: relative;">
1500
+ <button kendoButton (click)="copyErrorToClipboard()"
1501
+ style="position: absolute; top: 0; right: 0; font-size: 12px;">
1502
+ <span class="fa-solid fa-copy"></span>
1503
+ Copy Error Details
1504
+ </button>
1505
+ <h3 style="color: #dc3545; margin-top: 0; margin-right: 150px; font-size: 18px;">
1506
+ <span class="fa-solid fa-exclamation-triangle"></span>
1507
+ Component Rendering Error
1508
+ </h3>
1509
+ </div>
1510
+ <p style="margin-bottom: 10px; font-size: 14px;">
1511
+ The selected component option could not be rendered due to the following error:
1512
+ </p>
1513
+ <div style="background-color: #fff; border: 1px solid #dee2e6;
1514
+ border-radius: 4px; padding: 12px; margin-bottom: 12px;
1515
+ font-family: 'Courier New', monospace; font-size: 12px;">
1516
+ <strong>Error Type:</strong> {{ currentError.type }}<br>
1517
+ <strong>Details:</strong> {{ currentError.message }}
1518
+ @if (currentError.technicalDetails) {
1519
+ <details style="margin-top: 8px;">
1520
+ <summary style="cursor: pointer; color: #0056b3;">Technical Details (click to expand)</summary>
1521
+ <pre style="margin-top: 8px; white-space: pre-wrap; word-break: break-word; font-size: 11px;">{{ currentError.technicalDetails }}</pre>
1522
+ </details>
1523
+ }
1524
+ </div>
1525
+ <div style="background-color: #e7f3ff; border: 1px solid #b3d9ff;
1526
+ border-radius: 4px; padding: 12px; margin-bottom: 12px;">
1527
+ <strong style="font-size: 14px;">What to do:</strong>
1528
+ <ol style="margin: 8px 0 0 20px; padding: 0; font-size: 13px;">
1529
+ <li>Try selecting a different report option from the tabs above</li>
1530
+ <li>Copy the error details and send them back to Skip in the chat to get a corrected version</li>
1531
+ <li>Contact your IT department if the issue persists</li>
1532
+ </ol>
1533
+ </div>
1534
+ <button kendoButton (click)="retryCurrentOption()" style="font-size: 13px;">
1535
+ <span class="fa-solid fa-rotate"></span>
1536
+ Retry
1537
+ </button>
1538
+ </div>
1539
+ </div>
1540
+ }
1541
+ </div>
1542
+ </div>
1543
+ </div>
1544
+ </ng-template>
1545
+ </kendo-tabstrip-tab>
1546
+ }
1547
+ </kendo-tabstrip>
1548
+ } @else {
1549
+ <!-- Single option: no tabs needed -->
1550
+ <div style="height: 100%; display: flex; flex-direction: column;">
1551
+ <!-- Tab Action Bar -->
1552
+ <div class="tab-action-bar">
1553
+ <div class="tab-actions-left">
1554
+ <!-- Toggle buttons for showing/hiding component details -->
1555
+ <button class="tab-action-button toggle-button"
1556
+ (click)="toggleShowFunctionalRequirements()"
1557
+ [class.active]="showFunctionalRequirements"
1558
+ title="Toggle Functional Requirements">
1559
+ <i class="fa-solid fa-list-check"></i>
1560
+ <span>Functional</span>
1561
+ </button>
1562
+ <button class="tab-action-button toggle-button"
1563
+ (click)="toggleShowDataRequirements()"
1564
+ [class.active]="showDataRequirements"
1565
+ title="Toggle Data Requirements">
1566
+ <i class="fa-solid fa-database"></i>
1567
+ <span>Data</span>
1568
+ </button>
1569
+ <button class="tab-action-button toggle-button"
1570
+ (click)="toggleShowTechnicalDesign()"
1571
+ [class.active]="showTechnicalDesign"
1572
+ title="Toggle Technical Design">
1573
+ <i class="fa-solid fa-cogs"></i>
1574
+ <span>Technical</span>
1575
+ </button>
1576
+ <button class="tab-action-button toggle-button"
1577
+ (click)="toggleShowCode()"
1578
+ [class.active]="showCode"
1579
+ title="Toggle Code View">
1580
+ <i class="fa-solid fa-code"></i>
1581
+ <span>Code</span>
1582
+ </button>
1583
+ </div>
1584
+ <div class="tab-actions-right">
1585
+ <button class="tab-action-button create-button"
1586
+ *ngIf="ShowCreateReportButton && !matchingReportID"
1587
+ (click)="createReportForOption(0)"
1588
+ [disabled]="isCreatingReport">
1589
+ <i class="fa-solid fa-plus"></i>
1590
+ <span>Create {{ reportOptions[0] ? getComponentTypeName(reportOptions[0]) : 'Component' }}</span>
1591
+ </button>
1592
+ <button class="tab-action-button print-button"
1593
+ *ngIf="ShowPrintReport"
1594
+ (click)="PrintReport()"
1595
+ title="Print Report">
1596
+ <i class="fa-solid fa-print"></i>
1597
+ <span>Print Report</span>
1598
+ </button>
1599
+ </div>
1600
+ </div>
1601
+
1602
+ <!-- Main content area with optional details panels -->
1603
+ <div style="flex: 1; display: flex; flex-direction: column; min-height: 0; overflow: hidden;">
1604
+ @if (showFunctionalRequirements || showDataRequirements || showTechnicalDesign || showCode) {
1605
+ <!-- Details panel -->
1606
+ <div class="details-panel" [style.height]="detailsPanelHeight">
1607
+ <kendo-tabstrip style="height: 100%;">
1608
+ @if (showFunctionalRequirements && reportOptions[0]) {
1609
+ <kendo-tabstrip-tab [selected]="true">
1610
+ <ng-template kendoTabTitle>
1611
+ <i class="fa-solid fa-list-check"></i> Functional Requirements
1612
+ </ng-template>
1613
+ <ng-template kendoTabContent>
1614
+ <div class="details-content">
1615
+ <div [innerHTML]="getFormattedFunctionalRequirements(reportOptions[0])"></div>
1616
+ </div>
1617
+ </ng-template>
1618
+ </kendo-tabstrip-tab>
1619
+ }
1620
+ @if (showDataRequirements && reportOptions[0]) {
1621
+ <kendo-tabstrip-tab [selected]="!showFunctionalRequirements">
1622
+ <ng-template kendoTabTitle>
1623
+ <i class="fa-solid fa-database"></i> Data Requirements
1624
+ </ng-template>
1625
+ <ng-template kendoTabContent>
1626
+ <div class="details-content">
1627
+ <div [innerHTML]="getFormattedDataRequirements(reportOptions[0])"></div>
1628
+ </div>
1629
+ </ng-template>
1630
+ </kendo-tabstrip-tab>
1631
+ }
1632
+ @if (showTechnicalDesign && reportOptions[0]) {
1633
+ <kendo-tabstrip-tab [selected]="!showFunctionalRequirements && !showDataRequirements">
1634
+ <ng-template kendoTabTitle>
1635
+ <i class="fa-solid fa-cogs"></i> Technical Design
1636
+ </ng-template>
1637
+ <ng-template kendoTabContent>
1638
+ <div class="details-content">
1639
+ <div [innerHTML]="getFormattedTechnicalDesign(reportOptions[0])"></div>
1640
+ </div>
1641
+ </ng-template>
1642
+ </kendo-tabstrip-tab>
1643
+ }
1644
+ @if (showCode && reportOptions[0]) {
1645
+ <kendo-tabstrip-tab [selected]="!showFunctionalRequirements && !showDataRequirements && !showTechnicalDesign">
1646
+ <ng-template kendoTabTitle>
1647
+ <i class="fa-solid fa-code"></i> Code
1648
+ </ng-template>
1649
+ <ng-template kendoTabContent>
1650
+ <div class="details-content code-content">
1651
+ <mj-code-editor
1652
+ [value]="getComponentCode(reportOptions[0])"
1653
+ [autoFocus]="false"
1654
+ [indentWithTab]="true"
1655
+ [readonly]="true"
1656
+ style="height: 100%;">
1657
+ </mj-code-editor>
1658
+ </div>
1659
+ </ng-template>
1660
+ </kendo-tabstrip-tab>
1661
+ }
1662
+ </kendo-tabstrip>
1663
+ </div>
1664
+ <!-- Resizer -->
1665
+ <div class="panel-resizer"
1666
+ (mousedown)="startResize($event)"
1667
+ (touchstart)="startResize($event)">
1668
+ <div class="resizer-handle"></div>
1669
+ </div>
1670
+ }
1671
+
1672
+ <!-- React component container -->
1673
+ <div #htmlContainer style="flex: 1; position: relative; min-height: 0; overflow: auto;">
1674
+ <!-- Content will be rendered here by React host -->
1675
+
1676
+ <!-- Error overlay (shown on top of content when needed) -->
1677
+ @if (currentError) {
1678
+ <div style="position: absolute;
1679
+ top: 0;
1680
+ left: 0;
1681
+ right: 0;
1682
+ bottom: 0;
1683
+ display: flex;
1684
+ align-items: flex-start;
1685
+ justify-content: center;
1686
+ padding-top: 20px;
1687
+ background: rgba(255, 255, 255, 0.95);
1688
+ z-index: 10;">
1689
+ <div style="width: 90%;
1690
+ max-width: 600px;
1691
+ height: 500px;
1692
+ background-color: #f8f9fa;
1693
+ border: 2px solid #dc3545;
1694
+ border-radius: 8px;
1695
+ padding: 20px;
1696
+ overflow-y: auto;
1697
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);">
1698
+ <div style="position: relative;">
1699
+ <button kendoButton (click)="copyErrorToClipboard()"
1700
+ style="position: absolute; top: 0; right: 0; font-size: 12px;">
1701
+ <span class="fa-solid fa-copy"></span>
1702
+ Copy Error Details
1703
+ </button>
1704
+ <h3 style="color: #dc3545; margin-top: 0; margin-right: 150px; font-size: 18px;">
1705
+ <span class="fa-solid fa-exclamation-triangle"></span>
1706
+ Component Rendering Error
1707
+ </h3>
1708
+ </div>
1709
+ <p style="margin-bottom: 10px; font-size: 14px;">
1710
+ The selected component option could not be rendered due to the following error:
1711
+ </p>
1712
+ <div style="background-color: #fff; border: 1px solid #dee2e6;
1713
+ border-radius: 4px; padding: 12px; margin-bottom: 12px;
1714
+ font-family: 'Courier New', monospace; font-size: 12px;">
1715
+ <strong>Error Type:</strong> {{ currentError.type }}<br>
1716
+ <strong>Details:</strong> {{ currentError.message }}
1717
+ @if (currentError.technicalDetails) {
1718
+ <details style="margin-top: 8px;">
1719
+ <summary style="cursor: pointer; color: #0056b3;">Technical Details (click to expand)</summary>
1720
+ <pre style="margin-top: 8px; white-space: pre-wrap; word-break: break-word; font-size: 11px;">{{ currentError.technicalDetails }}</pre>
1721
+ </details>
1722
+ }
1723
+ </div>
1724
+ <div style="background-color: #e7f3ff; border: 1px solid #b3d9ff;
1725
+ border-radius: 4px; padding: 12px; margin-bottom: 12px;">
1726
+ <strong style="font-size: 14px;">What to do:</strong>
1727
+ <ol style="margin: 8px 0 0 20px; padding: 0; font-size: 13px;">
1728
+ <li>Copy the error details and send them back to Skip in the chat to get a corrected version</li>
1729
+ <li>Contact your IT department if the issue persists</li>
1730
+ </ol>
1731
+ </div>
1732
+ <button kendoButton (click)="retryCurrentOption()" style="font-size: 13px;">
1733
+ <span class="fa-solid fa-rotate"></span>
1734
+ Retry
1735
+ </button>
1736
+ </div>
1737
+ </div>
1738
+ }
1739
+ </div>
1740
+ </div>
1741
+ </div>
1742
+ }
1743
+
1744
+ `, styles: ["\n :host {\n display: block;\n height: 100%;\n position: relative;\n }\n \n /* Tab Action Bar */\n .tab-action-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background-color: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n }\n \n .tab-actions-left,\n .tab-actions-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n /* Tab Action Buttons */\n .tab-action-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n background-color: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n transition: all 0.15s ease;\n white-space: nowrap;\n }\n \n .tab-action-button:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n .tab-action-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .tab-action-button i {\n font-size: 12px;\n }\n \n /* Both buttons use the same white/secondary style */\n .tab-action-button.create-button,\n .tab-action-button.print-button {\n background-color: white;\n color: #333;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.create-button:hover:not(:disabled),\n .tab-action-button.print-button:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n /* Toggle buttons styling */\n .tab-action-button.toggle-button {\n background-color: white;\n color: #666;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.toggle-button:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n color: #333;\n }\n \n .tab-action-button.toggle-button.active {\n background-color: #5B4FE9;\n color: white;\n border-color: #5B4FE9;\n }\n \n .tab-action-button.toggle-button.active:hover:not(:disabled) {\n background-color: #4940D4;\n border-color: #4940D4;\n }\n \n /* Details panel styling */\n .details-panel {\n border-bottom: 1px solid #e0e0e0;\n background-color: #fafafa;\n overflow: hidden;\n transition: height 0.3s ease;\n }\n \n .details-content {\n padding: 16px;\n overflow-y: auto;\n height: 100%;\n font-size: 14px;\n line-height: 1.6;\n }\n \n .details-content.code-content {\n padding: 0;\n }\n \n /* Panel resizer */\n .panel-resizer {\n height: 4px;\n background-color: #e0e0e0;\n cursor: ns-resize;\n position: relative;\n transition: background-color 0.2s ease;\n }\n \n .panel-resizer:hover {\n background-color: #d0d0d0;\n }\n \n .resizer-handle {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 40px;\n height: 2px;\n background-color: #999;\n border-radius: 1px;\n }\n \n /* Markdown content styling */\n .details-content :deep(h1) { font-size: 1.5em; margin-top: 0; margin-bottom: 0.5em; }\n .details-content :deep(h2) { font-size: 1.3em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content :deep(h3) { font-size: 1.1em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content :deep(ul), .details-content :deep(ol) { margin-left: 1.5em; }\n .details-content :deep(code) { \n background-color: #f4f4f4; \n padding: 2px 4px; \n border-radius: 3px; \n font-family: 'Courier New', monospace; \n font-size: 0.9em;\n }\n .details-content :deep(pre) { \n background-color: #f4f4f4; \n padding: 12px; \n border-radius: 4px; \n overflow-x: auto; \n }\n .details-content :deep(blockquote) { \n border-left: 4px solid #e0e0e0; \n padding-left: 16px; \n margin-left: 0; \n color: #666; \n }\n \n /* Tab styling */\n ::ng-deep .k-tabstrip {\n border: none;\n height: 100%;\n display: flex;\n flex-direction: column;\n margin: 10px 5px 5px 5px;\n }\n \n ::ng-deep .k-tabstrip-items {\n background: #f8f9fa;\n border: none;\n border-radius: 8px 8px 0 0;\n flex: 0 0 auto;\n padding: 8px 12px 0 12px;\n gap: 4px;\n display: flex;\n }\n \n ::ng-deep .k-tabstrip-items-wrapper {\n height: 100%;\n }\n \n ::ng-deep .k-content {\n flex: 1;\n overflow: hidden;\n padding: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-top: none;\n border-radius: 0 0 8px 8px;\n }\n \n ::ng-deep .k-tabstrip .k-item {\n margin-right: 2px;\n border: none;\n background: transparent;\n border-radius: 6px 6px 0 0;\n padding: 2px;\n transition: all 0.2s ease;\n }\n \n ::ng-deep .k-tabstrip .k-item.k-selected {\n background: white;\n border: 1px solid #e0e0e0;\n border-bottom: 1px solid white;\n margin-bottom: -1px;\n z-index: 1;\n }\n \n ::ng-deep .k-tabstrip .k-link {\n padding: 8px 16px;\n font-weight: 500;\n font-size: 13px;\n color: #666;\n transition: all 0.15s ease;\n border-radius: 4px 4px 0 0;\n background: transparent;\n border: none;\n text-transform: lowercase;\n }\n \n ::ng-deep .k-tabstrip .k-link:first-letter {\n text-transform: uppercase;\n }\n \n ::ng-deep .k-tabstrip .k-item:hover:not(.k-selected) .k-link {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n \n ::ng-deep .k-tabstrip .k-item.k-selected .k-link {\n color: #1976d2;\n font-weight: 600;\n background: white;\n }\n \n /* Star icon styling */\n ::ng-deep .k-tabstrip .k-link .star-icon {\n display: inline-block;\n margin-right: 4px;\n color: #ffd700;\n font-size: 12px;\n vertical-align: middle;\n }\n \n /* Hide default Kendo tab styling */\n ::ng-deep .k-tabstrip-items::before,\n ::ng-deep .k-tabstrip-items::after {\n display: none;\n }\n \n ::ng-deep .k-tabstrip .k-item::before,\n ::ng-deep .k-tabstrip .k-item::after {\n display: none;\n }\n \n /* Remove focus outline */\n ::ng-deep .k-tabstrip .k-link:focus {\n outline: none;\n box-shadow: none;\n }\n \n /* Make sure tab content fills available space */\n ::ng-deep .k-tabstrip .k-content.k-state-active {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n /* React host container */\n .react-host-container {\n width: 100%;\n height: 100%;\n }\n "] }]
1745
+ }], () => [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }], { UIComponentCode: [{
1746
+ type: Input
1747
+ }], ComponentObjectName: [{
1748
+ type: Input
1749
+ }], ShowPrintReport: [{
1750
+ type: Input
1751
+ }], ShowReportOptionsToggle: [{
1752
+ type: Input
1753
+ }], ShowCreateReportButton: [{
1754
+ type: Input
1755
+ }], matchingReportID: [{
1756
+ type: Input
1757
+ }], DrillDownEvent: [{
1758
+ type: Output
1759
+ }], CreateReportRequested: [{
1760
+ type: Output
1761
+ }], htmlContainers: [{
1762
+ type: ViewChildren,
1763
+ args: ['htmlContainer']
1764
+ }], onWindowResize: [{
1765
+ type: HostListener,
1766
+ args: ['window:resize']
1767
+ }], SkipData: [{
1768
+ type: Input
1769
+ }] }); })();
1770
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SkipDynamicUIComponentComponent, { className: "SkipDynamicUIComponentComponent", filePath: "src/lib/dynamic-report/dynamic-ui-component.ts", lineNumber: 700 }); })();
1771
+ //# sourceMappingURL=dynamic-ui-component.js.map