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