@memberjunction/ng-skip-chat 2.69.1 → 2.71.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.
@@ -1,21 +1,23 @@
1
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';
2
+ import { CompositeKey, LogError, Metadata } from '@memberjunction/core';
3
+ import { BuildComponentCompleteCode } from '@memberjunction/interactive-component-types';
5
4
  import { DrillDownInfo } from '../drill-down-info';
6
5
  import { marked } from 'marked';
6
+ import { MJReactComponent } from '@memberjunction/ng-react';
7
+ import { createRuntimeUtilities, SetupStyles } from '@memberjunction/react-runtime';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/platform-browser";
9
10
  import * as i2 from "@angular/common";
10
11
  import * as i3 from "@progress/kendo-angular-layout";
11
12
  import * as i4 from "@progress/kendo-angular-buttons";
12
13
  import * as i5 from "@memberjunction/ng-code-editor";
13
- const _c0 = ["htmlContainer"];
14
+ import * as i6 from "@memberjunction/ng-react";
15
+ const _c0 = () => ({});
14
16
  function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
15
- i0.ɵɵelement(0, "i", 7);
17
+ i0.ɵɵelement(0, "i", 6);
16
18
  } }
17
19
  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);
20
+ i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_1_Conditional_0_Template, 1, 0, "i", 6);
19
21
  i0.ɵɵtext(1);
20
22
  } if (rf & 2) {
21
23
  const ɵ$index_4_r3 = i0.ɵɵnextContext().$index;
@@ -49,7 +51,7 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_butto
49
51
  i0.ɵɵelementEnd()();
50
52
  } }
51
53
  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);
54
+ i0.ɵɵelement(0, "i", 10);
53
55
  i0.ɵɵtext(1, " Functional Requirements ");
54
56
  } }
55
57
  function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_ng_template_2_Template(rf, ctx) { if (rf & 1) {
@@ -63,14 +65,14 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
63
65
  i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedFunctionalRequirements(option_r6), i0.ɵɵsanitizeHtml);
64
66
  } }
65
67
  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.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
69
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_ng_template_1_Template, 2, 0, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_ng_template_2_Template, 2, 1, "ng-template", 5);
68
70
  i0.ɵɵelementEnd();
69
71
  } if (rf & 2) {
70
72
  i0.ɵɵproperty("selected", true);
71
73
  } }
72
74
  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);
75
+ i0.ɵɵelement(0, "i", 12);
74
76
  i0.ɵɵtext(1, " Data Requirements ");
75
77
  } }
76
78
  function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_ng_template_2_Template(rf, ctx) { if (rf & 1) {
@@ -84,15 +86,15 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
84
86
  i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedDataRequirements(option_r6), i0.ɵɵsanitizeHtml);
85
87
  } }
86
88
  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.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
90
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_ng_template_1_Template, 2, 0, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_ng_template_2_Template, 2, 1, "ng-template", 5);
89
91
  i0.ɵɵelementEnd();
90
92
  } if (rf & 2) {
91
93
  const ctx_r1 = i0.ɵɵnextContext(5);
92
94
  i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements);
93
95
  } }
94
96
  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);
97
+ i0.ɵɵelement(0, "i", 14);
96
98
  i0.ɵɵtext(1, " Technical Design ");
97
99
  } }
98
100
  function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_ng_template_2_Template(rf, ctx) { if (rf & 1) {
@@ -106,15 +108,15 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
106
108
  i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedTechnicalDesign(option_r6), i0.ɵɵsanitizeHtml);
107
109
  } }
108
110
  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.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
112
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_ng_template_1_Template, 2, 0, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_ng_template_2_Template, 2, 1, "ng-template", 5);
111
113
  i0.ɵɵelementEnd();
112
114
  } if (rf & 2) {
113
115
  const ctx_r1 = i0.ɵɵnextContext(5);
114
116
  i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements && !ctx_r1.showDataRequirements);
115
117
  } }
116
118
  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);
119
+ i0.ɵɵelement(0, "i", 16);
118
120
  i0.ɵɵtext(1, " Code ");
119
121
  } }
120
122
  function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_ng_template_2_Template(rf, ctx) { if (rf & 1) {
@@ -128,8 +130,8 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
128
130
  i0.ɵɵproperty("value", ctx_r1.getComponentCode(option_r6))("language", "javascript")("autoFocus", false)("indentWithTab", true)("readonly", true);
129
131
  } }
130
132
  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, 5, "ng-template", 6);
133
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
134
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_ng_template_1_Template, 2, 0, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_ng_template_2_Template, 2, 5, "ng-template", 5);
133
135
  i0.ɵɵelementEnd();
134
136
  } if (rf & 2) {
135
137
  const ctx_r1 = i0.ɵɵnextContext(5);
@@ -138,7 +140,7 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
138
140
  function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
139
141
  const _r8 = i0.ɵɵgetCurrentView();
140
142
  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);
143
+ i0.ɵɵtemplate(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_2_Template, 3, 1, "kendo-tabstrip-tab", 3)(3, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_3_Template, 3, 1, "kendo-tabstrip-tab", 3)(4, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_4_Template, 3, 1, "kendo-tabstrip-tab", 3)(5, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_23_Conditional_5_Template, 3, 1, "kendo-tabstrip-tab", 3);
142
144
  i0.ɵɵelementEnd()();
143
145
  i0.ɵɵelementStart(6, "div", 30);
144
146
  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)); });
@@ -156,11 +158,21 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
156
158
  i0.ɵɵadvance();
157
159
  i0.ɵɵconditional(ctx_r1.showCode ? 5 : -1);
158
160
  } }
161
+ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_mj_react_component_25_Template(rf, ctx) { if (rf & 1) {
162
+ const _r9 = i0.ɵɵgetCurrentView();
163
+ i0.ɵɵelementStart(0, "mj-react-component", 36);
164
+ i0.ɵɵlistener("stateChange", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_mj_react_component_25_Template_mj_react_component_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r9); const ɵ$index_4_r3 = i0.ɵɵnextContext(2).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onStateChange(ɵ$index_4_r3, $event)); })("componentEvent", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_mj_react_component_25_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r9); const ɵ$index_4_r3 = i0.ɵɵnextContext(2).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onComponentEvent(ɵ$index_4_r3, $event)); })("refreshData", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_mj_react_component_25_Template_mj_react_component_refreshData_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.handleRefreshData()); })("openEntityRecord", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_mj_react_component_25_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); });
165
+ i0.ɵɵelementEnd();
166
+ } if (rf & 2) {
167
+ const ɵ$index_4_r3 = i0.ɵɵnextContext(2).$index;
168
+ const ctx_r1 = i0.ɵɵnextContext(2);
169
+ i0.ɵɵproperty("component", ctx_r1.componentSpecs.get(ɵ$index_4_r3))("data", ctx_r1.getFlattenedDataContext())("state", ctx_r1.userStates.get(ɵ$index_4_r3) || i0.ɵɵpureFunction0(5, _c0))("utilities", ctx_r1.utilities)("styles", ctx_r1.componentStyles || undefined);
170
+ } }
159
171
  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);
172
+ i0.ɵɵelementStart(0, "details", 45)(1, "summary", 51);
161
173
  i0.ɵɵtext(2, "Technical Details (click to expand)");
162
174
  i0.ɵɵelementEnd();
163
- i0.ɵɵelementStart(3, "pre", 51);
175
+ i0.ɵɵelementStart(3, "pre", 52);
164
176
  i0.ɵɵtext(4);
165
177
  i0.ɵɵelementEnd()();
166
178
  } if (rf & 2) {
@@ -169,20 +181,20 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
169
181
  i0.ɵɵtextInterpolate(ctx_r1.currentError.technicalDetails);
170
182
  } }
171
183
  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);
184
+ const _r10 = i0.ɵɵgetCurrentView();
185
+ i0.ɵɵelementStart(0, "div", 23)(1, "div", 37)(2, "div", 38)(3, "button", 39);
186
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.copyErrorToClipboard()); });
187
+ i0.ɵɵelement(4, "span", 40);
176
188
  i0.ɵɵtext(5, " Copy Error Details ");
177
189
  i0.ɵɵelementEnd();
178
- i0.ɵɵelementStart(6, "h3", 40);
179
- i0.ɵɵelement(7, "span", 41);
190
+ i0.ɵɵelementStart(6, "h3", 41);
191
+ i0.ɵɵelement(7, "span", 42);
180
192
  i0.ɵɵtext(8, " Component Rendering Error ");
181
193
  i0.ɵɵelementEnd()();
182
- i0.ɵɵelementStart(9, "p", 42);
194
+ i0.ɵɵelementStart(9, "p", 43);
183
195
  i0.ɵɵtext(10, " The selected component option could not be rendered due to the following error: ");
184
196
  i0.ɵɵelementEnd();
185
- i0.ɵɵelementStart(11, "div", 43)(12, "strong");
197
+ i0.ɵɵelementStart(11, "div", 44)(12, "strong");
186
198
  i0.ɵɵtext(13, "Error Type:");
187
199
  i0.ɵɵelementEnd();
188
200
  i0.ɵɵtext(14);
@@ -191,12 +203,12 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
191
203
  i0.ɵɵtext(17, "Details:");
192
204
  i0.ɵɵelementEnd();
193
205
  i0.ɵɵtext(18);
194
- i0.ɵɵtemplate(19, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Conditional_19_Template, 5, 1, "details", 44);
206
+ i0.ɵɵtemplate(19, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Conditional_19_Template, 5, 1, "details", 45);
195
207
  i0.ɵɵelementEnd();
196
- i0.ɵɵelementStart(20, "div", 45)(21, "strong", 46);
208
+ i0.ɵɵelementStart(20, "div", 46)(21, "strong", 47);
197
209
  i0.ɵɵtext(22, "What to do:");
198
210
  i0.ɵɵelementEnd();
199
- i0.ɵɵelementStart(23, "ol", 47)(24, "li");
211
+ i0.ɵɵelementStart(23, "ol", 48)(24, "li");
200
212
  i0.ɵɵtext(25, "Try selecting a different report option from the tabs above");
201
213
  i0.ɵɵelementEnd();
202
214
  i0.ɵɵelementStart(26, "li");
@@ -205,9 +217,9 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
205
217
  i0.ɵɵelementStart(28, "li");
206
218
  i0.ɵɵtext(29, "Contact your IT department if the issue persists");
207
219
  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);
220
+ i0.ɵɵelementStart(30, "button", 49);
221
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Template_button_click_30_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.retryCurrentOption()); });
222
+ i0.ɵɵelement(31, "span", 50);
211
223
  i0.ɵɵtext(32, " Retry ");
212
224
  i0.ɵɵelementEnd()()();
213
225
  } if (rf & 2) {
@@ -221,37 +233,37 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Condi
221
233
  } }
222
234
  function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Template(rf, ctx) { if (rf & 1) {
223
235
  const _r4 = i0.ɵɵgetCurrentView();
224
- i0.ɵɵelementStart(0, "div", 2)(1, "div", 8)(2, "div", 9)(3, "button", 10);
236
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 7)(2, "div", 8)(3, "button", 9);
225
237
  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);
238
+ i0.ɵɵelement(4, "i", 10);
227
239
  i0.ɵɵelementStart(5, "span");
228
240
  i0.ɵɵtext(6, "Functional");
229
241
  i0.ɵɵelementEnd()();
230
- i0.ɵɵelementStart(7, "button", 12);
242
+ i0.ɵɵelementStart(7, "button", 11);
231
243
  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);
244
+ i0.ɵɵelement(8, "i", 12);
233
245
  i0.ɵɵelementStart(9, "span");
234
246
  i0.ɵɵtext(10, "Data");
235
247
  i0.ɵɵelementEnd()();
236
- i0.ɵɵelementStart(11, "button", 14);
248
+ i0.ɵɵelementStart(11, "button", 13);
237
249
  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);
250
+ i0.ɵɵelement(12, "i", 14);
239
251
  i0.ɵɵelementStart(13, "span");
240
252
  i0.ɵɵtext(14, "Technical");
241
253
  i0.ɵɵelementEnd()();
242
- i0.ɵɵelementStart(15, "button", 16);
254
+ i0.ɵɵelementStart(15, "button", 15);
243
255
  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);
256
+ i0.ɵɵelement(16, "i", 16);
245
257
  i0.ɵɵelementStart(17, "span");
246
258
  i0.ɵɵtext(18, "Code");
247
259
  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);
260
+ i0.ɵɵelementStart(19, "div", 17);
261
+ i0.ɵɵtemplate(20, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_button_20_Template, 4, 2, "button", 18)(21, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_button_21_Template, 4, 0, "button", 19);
250
262
  i0.ɵɵelementEnd()();
251
- i0.ɵɵelementStart(22, "div", 21);
263
+ i0.ɵɵelementStart(22, "div", 20);
252
264
  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);
265
+ i0.ɵɵelementStart(24, "div", 21);
266
+ i0.ɵɵtemplate(25, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_mj_react_component_25_Template, 1, 6, "mj-react-component", 22)(26, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Conditional_26_Template, 33, 3, "div", 23);
255
267
  i0.ɵɵelementEnd()()();
256
268
  } if (rf & 2) {
257
269
  const ɵ$index_4_r3 = i0.ɵɵnextContext().$index;
@@ -272,12 +284,14 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Templ
272
284
  i0.ɵɵconditional(ctx_r1.showFunctionalRequirements || ctx_r1.showDataRequirements || ctx_r1.showTechnicalDesign || ctx_r1.showCode ? 23 : -1);
273
285
  i0.ɵɵadvance();
274
286
  i0.ɵɵattribute("data-tab-index", ɵ$index_4_r3);
275
- i0.ɵɵadvance(2);
287
+ i0.ɵɵadvance();
288
+ i0.ɵɵproperty("ngIf", !ctx_r1.currentError && ctx_r1.componentSpecs.has(ɵ$index_4_r3));
289
+ i0.ɵɵadvance();
276
290
  i0.ɵɵconditional(ctx_r1.currentError && ctx_r1.selectedReportOptionIndex === ɵ$index_4_r3 ? 26 : -1);
277
291
  } }
278
292
  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);
293
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
294
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_1_Template, 2, 2, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_0_For_2_ng_template_2_Template, 27, 14, "ng-template", 5);
281
295
  i0.ɵɵelementEnd();
282
296
  } if (rf & 2) {
283
297
  const ɵ$index_4_r3 = ctx.$index;
@@ -286,9 +300,9 @@ function SkipDynamicUIComponentComponent_Conditional_0_For_2_Template(rf, ctx) {
286
300
  } }
287
301
  function SkipDynamicUIComponentComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
288
302
  const _r1 = i0.ɵɵgetCurrentView();
289
- i0.ɵɵelementStart(0, "kendo-tabstrip", 3);
303
+ i0.ɵɵelementStart(0, "kendo-tabstrip", 2);
290
304
  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);
305
+ i0.ɵɵrepeaterCreate(1, SkipDynamicUIComponentComponent_Conditional_0_For_2_Template, 3, 1, "kendo-tabstrip-tab", 3, i0.ɵɵrepeaterTrackByIdentity);
292
306
  i0.ɵɵelementEnd();
293
307
  } if (rf & 2) {
294
308
  const ctx_r1 = i0.ɵɵnextContext();
@@ -297,9 +311,9 @@ function SkipDynamicUIComponentComponent_Conditional_0_Template(rf, ctx) { if (r
297
311
  i0.ɵɵrepeater(ctx_r1.reportOptions);
298
312
  } }
299
313
  function SkipDynamicUIComponentComponent_Conditional_1_button_20_Template(rf, ctx) { if (rf & 1) {
300
- const _r11 = i0.ɵɵgetCurrentView();
314
+ const _r12 = i0.ɵɵgetCurrentView();
301
315
  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)); });
316
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_button_20_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.createReportForOption(0)); });
303
317
  i0.ɵɵelement(1, "i", 25);
304
318
  i0.ɵɵelementStart(2, "span");
305
319
  i0.ɵɵtext(3);
@@ -308,19 +322,19 @@ function SkipDynamicUIComponentComponent_Conditional_1_button_20_Template(rf, ct
308
322
  const ctx_r1 = i0.ɵɵnextContext(2);
309
323
  i0.ɵɵproperty("disabled", ctx_r1.isCreatingReport);
310
324
  i0.ɵɵadvance(3);
311
- i0.ɵɵtextInterpolate1("Create ", ctx_r1.reportOptions[0] ? ctx_r1.getComponentTypeName(ctx_r1.reportOptions[0]) : "Component", "");
325
+ i0.ɵɵtextInterpolate1("Create ", ctx_r1.firstOptionComponentTypeName, "");
312
326
  } }
313
327
  function SkipDynamicUIComponentComponent_Conditional_1_button_21_Template(rf, ctx) { if (rf & 1) {
314
- const _r12 = i0.ɵɵgetCurrentView();
328
+ const _r13 = i0.ɵɵgetCurrentView();
315
329
  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()); });
330
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_button_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.PrintReport()); });
317
331
  i0.ɵɵelement(1, "i", 27);
318
332
  i0.ɵɵelementStart(2, "span");
319
333
  i0.ɵɵtext(3, "Print Report");
320
334
  i0.ɵɵelementEnd()();
321
335
  } }
322
336
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_ng_template_1_Template(rf, ctx) { if (rf & 1) {
323
- i0.ɵɵelement(0, "i", 11);
337
+ i0.ɵɵelement(0, "i", 10);
324
338
  i0.ɵɵtext(1, " Functional Requirements ");
325
339
  } }
326
340
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_ng_template_2_Template(rf, ctx) { if (rf & 1) {
@@ -333,14 +347,14 @@ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditiona
333
347
  i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedFunctionalRequirements(ctx_r1.reportOptions[0]), i0.ɵɵsanitizeHtml);
334
348
  } }
335
349
  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);
350
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
351
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_ng_template_1_Template, 2, 0, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_ng_template_2_Template, 2, 1, "ng-template", 5);
338
352
  i0.ɵɵelementEnd();
339
353
  } if (rf & 2) {
340
354
  i0.ɵɵproperty("selected", true);
341
355
  } }
342
356
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_ng_template_1_Template(rf, ctx) { if (rf & 1) {
343
- i0.ɵɵelement(0, "i", 13);
357
+ i0.ɵɵelement(0, "i", 12);
344
358
  i0.ɵɵtext(1, " Data Requirements ");
345
359
  } }
346
360
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_ng_template_2_Template(rf, ctx) { if (rf & 1) {
@@ -353,15 +367,15 @@ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditiona
353
367
  i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedDataRequirements(ctx_r1.reportOptions[0]), i0.ɵɵsanitizeHtml);
354
368
  } }
355
369
  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);
370
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
371
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_ng_template_1_Template, 2, 0, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_ng_template_2_Template, 2, 1, "ng-template", 5);
358
372
  i0.ɵɵelementEnd();
359
373
  } if (rf & 2) {
360
374
  const ctx_r1 = i0.ɵɵnextContext(3);
361
375
  i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements);
362
376
  } }
363
377
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_ng_template_1_Template(rf, ctx) { if (rf & 1) {
364
- i0.ɵɵelement(0, "i", 15);
378
+ i0.ɵɵelement(0, "i", 14);
365
379
  i0.ɵɵtext(1, " Technical Design ");
366
380
  } }
367
381
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_ng_template_2_Template(rf, ctx) { if (rf & 1) {
@@ -374,20 +388,20 @@ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditiona
374
388
  i0.ɵɵproperty("innerHTML", ctx_r1.getFormattedTechnicalDesign(ctx_r1.reportOptions[0]), i0.ɵɵsanitizeHtml);
375
389
  } }
376
390
  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);
391
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
392
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_ng_template_1_Template, 2, 0, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_ng_template_2_Template, 2, 1, "ng-template", 5);
379
393
  i0.ɵɵelementEnd();
380
394
  } if (rf & 2) {
381
395
  const ctx_r1 = i0.ɵɵnextContext(3);
382
396
  i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements && !ctx_r1.showDataRequirements);
383
397
  } }
384
398
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_ng_template_1_Template(rf, ctx) { if (rf & 1) {
385
- i0.ɵɵelement(0, "i", 17);
399
+ i0.ɵɵelement(0, "i", 16);
386
400
  i0.ɵɵtext(1, " Code ");
387
401
  } }
388
402
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_ng_template_2_Template(rf, ctx) { if (rf & 1) {
389
403
  i0.ɵɵelementStart(0, "div", 34);
390
- i0.ɵɵelement(1, "mj-code-editor", 53);
404
+ i0.ɵɵelement(1, "mj-code-editor", 54);
391
405
  i0.ɵɵelementEnd();
392
406
  } if (rf & 2) {
393
407
  const ctx_r1 = i0.ɵɵnextContext(4);
@@ -395,20 +409,20 @@ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditiona
395
409
  i0.ɵɵproperty("language", "javascript")("value", ctx_r1.getComponentCode(ctx_r1.reportOptions[0]))("autoFocus", false)("indentWithTab", true)("readonly", true);
396
410
  } }
397
411
  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, 5, "ng-template", 6);
412
+ i0.ɵɵelementStart(0, "kendo-tabstrip-tab", 3);
413
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_ng_template_1_Template, 2, 0, "ng-template", 4)(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_ng_template_2_Template, 2, 5, "ng-template", 5);
400
414
  i0.ɵɵelementEnd();
401
415
  } if (rf & 2) {
402
416
  const ctx_r1 = i0.ɵɵnextContext(3);
403
417
  i0.ɵɵproperty("selected", !ctx_r1.showFunctionalRequirements && !ctx_r1.showDataRequirements && !ctx_r1.showTechnicalDesign);
404
418
  } }
405
419
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
406
- const _r13 = i0.ɵɵgetCurrentView();
420
+ const _r14 = i0.ɵɵgetCurrentView();
407
421
  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);
422
+ i0.ɵɵtemplate(2, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_2_Template, 3, 1, "kendo-tabstrip-tab", 3)(3, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_3_Template, 3, 1, "kendo-tabstrip-tab", 3)(4, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_4_Template, 3, 1, "kendo-tabstrip-tab", 3)(5, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Conditional_5_Template, 3, 1, "kendo-tabstrip-tab", 3);
409
423
  i0.ɵɵelementEnd()();
410
424
  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)); });
425
+ i0.ɵɵlistener("mousedown", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template_div_mousedown_6_listener($event) { i0.ɵɵrestoreView(_r14); 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(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.startResize($event)); });
412
426
  i0.ɵɵelement(7, "div", 31);
413
427
  i0.ɵɵelementEnd();
414
428
  } if (rf & 2) {
@@ -424,10 +438,10 @@ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template(r
424
438
  i0.ɵɵconditional(ctx_r1.showCode && ctx_r1.reportOptions[0] ? 5 : -1);
425
439
  } }
426
440
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Conditional_19_Template(rf, ctx) { if (rf & 1) {
427
- i0.ɵɵelementStart(0, "details", 44)(1, "summary", 50);
441
+ i0.ɵɵelementStart(0, "details", 45)(1, "summary", 51);
428
442
  i0.ɵɵtext(2, "Technical Details (click to expand)");
429
443
  i0.ɵɵelementEnd();
430
- i0.ɵɵelementStart(3, "pre", 51);
444
+ i0.ɵɵelementStart(3, "pre", 52);
431
445
  i0.ɵɵtext(4);
432
446
  i0.ɵɵelementEnd()();
433
447
  } if (rf & 2) {
@@ -436,20 +450,20 @@ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Conditiona
436
450
  i0.ɵɵtextInterpolate(ctx_r1.currentError.technicalDetails);
437
451
  } }
438
452
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Template(rf, ctx) { if (rf & 1) {
439
- const _r14 = i0.ɵɵgetCurrentView();
440
- i0.ɵɵelementStart(0, "div", 52)(1, "div", 54)(2, "div", 37)(3, "button", 38);
441
- i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_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);
453
+ const _r15 = i0.ɵɵgetCurrentView();
454
+ i0.ɵɵelementStart(0, "div", 53)(1, "div", 55)(2, "div", 38)(3, "button", 39);
455
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.copyErrorToClipboard()); });
456
+ i0.ɵɵelement(4, "span", 40);
443
457
  i0.ɵɵtext(5, " Copy Error Details ");
444
458
  i0.ɵɵelementEnd();
445
- i0.ɵɵelementStart(6, "h3", 40);
446
- i0.ɵɵelement(7, "span", 41);
459
+ i0.ɵɵelementStart(6, "h3", 41);
460
+ i0.ɵɵelement(7, "span", 42);
447
461
  i0.ɵɵtext(8, " Component Rendering Error ");
448
462
  i0.ɵɵelementEnd()();
449
- i0.ɵɵelementStart(9, "p", 42);
463
+ i0.ɵɵelementStart(9, "p", 43);
450
464
  i0.ɵɵtext(10, " The selected component option could not be rendered due to the following error: ");
451
465
  i0.ɵɵelementEnd();
452
- i0.ɵɵelementStart(11, "div", 43)(12, "strong");
466
+ i0.ɵɵelementStart(11, "div", 44)(12, "strong");
453
467
  i0.ɵɵtext(13, "Error Type:");
454
468
  i0.ɵɵelementEnd();
455
469
  i0.ɵɵtext(14);
@@ -458,20 +472,20 @@ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Template(r
458
472
  i0.ɵɵtext(17, "Details:");
459
473
  i0.ɵɵelementEnd();
460
474
  i0.ɵɵtext(18);
461
- i0.ɵɵtemplate(19, SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Conditional_19_Template, 5, 1, "details", 44);
475
+ i0.ɵɵtemplate(19, SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Conditional_19_Template, 5, 1, "details", 45);
462
476
  i0.ɵɵelementEnd();
463
- i0.ɵɵelementStart(20, "div", 45)(21, "strong", 46);
477
+ i0.ɵɵelementStart(20, "div", 46)(21, "strong", 47);
464
478
  i0.ɵɵtext(22, "What to do:");
465
479
  i0.ɵɵelementEnd();
466
- i0.ɵɵelementStart(23, "ol", 47)(24, "li");
480
+ i0.ɵɵelementStart(23, "ol", 48)(24, "li");
467
481
  i0.ɵɵtext(25, "Copy the error details and send them back to Skip in the chat to get a corrected version");
468
482
  i0.ɵɵelementEnd();
469
483
  i0.ɵɵelementStart(26, "li");
470
484
  i0.ɵɵtext(27, "Contact your IT department if the issue persists");
471
485
  i0.ɵɵelementEnd()()();
472
- i0.ɵɵelementStart(28, "button", 48);
473
- i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_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);
486
+ i0.ɵɵelementStart(28, "button", 49);
487
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.retryCurrentOption()); });
488
+ i0.ɵɵelement(29, "span", 50);
475
489
  i0.ɵɵtext(30, " Retry ");
476
490
  i0.ɵɵelementEnd()()();
477
491
  } if (rf & 2) {
@@ -483,40 +497,55 @@ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Template(r
483
497
  i0.ɵɵadvance();
484
498
  i0.ɵɵconditional(ctx_r1.currentError.technicalDetails ? 19 : -1);
485
499
  } }
500
+ function SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_mj_react_component_1_Template(rf, ctx) { if (rf & 1) {
501
+ const _r16 = i0.ɵɵgetCurrentView();
502
+ i0.ɵɵelementStart(0, "mj-react-component", 36);
503
+ i0.ɵɵlistener("stateChange", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_mj_react_component_1_Template_mj_react_component_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onStateChange(0, $event)); })("componentEvent", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_mj_react_component_1_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onComponentEvent(0, $event)); })("refreshData", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_mj_react_component_1_Template_mj_react_component_refreshData_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.handleRefreshData()); })("openEntityRecord", function SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_mj_react_component_1_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); });
504
+ i0.ɵɵelementEnd();
505
+ } if (rf & 2) {
506
+ const ctx_r1 = i0.ɵɵnextContext(3);
507
+ i0.ɵɵproperty("component", ctx_r1.componentSpecs.get(0))("data", ctx_r1.getFlattenedDataContext())("state", ctx_r1.userStates.get(0) || i0.ɵɵpureFunction0(5, _c0))("utilities", ctx_r1.utilities)("styles", ctx_r1.componentStyles || undefined);
508
+ } }
486
509
  function SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_Template(rf, ctx) { if (rf & 1) {
487
- i0.ɵɵelement(0, "div", 22, 0);
510
+ i0.ɵɵelementStart(0, "div", 21);
511
+ i0.ɵɵtemplate(1, SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_mj_react_component_1_Template, 1, 6, "mj-react-component", 22);
512
+ i0.ɵɵelementEnd();
513
+ } if (rf & 2) {
514
+ const ctx_r1 = i0.ɵɵnextContext(2);
515
+ i0.ɵɵadvance();
516
+ i0.ɵɵproperty("ngIf", ctx_r1.componentSpecs.has(0));
488
517
  } }
489
518
  function SkipDynamicUIComponentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
490
- const _r10 = i0.ɵɵgetCurrentView();
491
- i0.ɵɵelementStart(0, "div", 2)(1, "div", 8)(2, "div", 9)(3, "button", 10);
492
- 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()); });
493
- i0.ɵɵelement(4, "i", 11);
519
+ const _r11 = i0.ɵɵgetCurrentView();
520
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 7)(2, "div", 8)(3, "button", 9);
521
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleShowFunctionalRequirements()); });
522
+ i0.ɵɵelement(4, "i", 10);
494
523
  i0.ɵɵelementStart(5, "span");
495
524
  i0.ɵɵtext(6, "Functional");
496
525
  i0.ɵɵelementEnd()();
497
- i0.ɵɵelementStart(7, "button", 12);
498
- 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()); });
499
- i0.ɵɵelement(8, "i", 13);
526
+ i0.ɵɵelementStart(7, "button", 11);
527
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleShowDataRequirements()); });
528
+ i0.ɵɵelement(8, "i", 12);
500
529
  i0.ɵɵelementStart(9, "span");
501
530
  i0.ɵɵtext(10, "Data");
502
531
  i0.ɵɵelementEnd()();
503
- i0.ɵɵelementStart(11, "button", 14);
504
- 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()); });
505
- i0.ɵɵelement(12, "i", 15);
532
+ i0.ɵɵelementStart(11, "button", 13);
533
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleShowTechnicalDesign()); });
534
+ i0.ɵɵelement(12, "i", 14);
506
535
  i0.ɵɵelementStart(13, "span");
507
536
  i0.ɵɵtext(14, "Technical");
508
537
  i0.ɵɵelementEnd()();
509
- i0.ɵɵelementStart(15, "button", 16);
510
- 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()); });
511
- i0.ɵɵelement(16, "i", 17);
538
+ i0.ɵɵelementStart(15, "button", 15);
539
+ i0.ɵɵlistener("click", function SkipDynamicUIComponentComponent_Conditional_1_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleShowCode()); });
540
+ i0.ɵɵelement(16, "i", 16);
512
541
  i0.ɵɵelementStart(17, "span");
513
542
  i0.ɵɵtext(18, "Code");
514
543
  i0.ɵɵelementEnd()()();
515
- i0.ɵɵelementStart(19, "div", 18);
516
- i0.ɵɵtemplate(20, SkipDynamicUIComponentComponent_Conditional_1_button_20_Template, 4, 2, "button", 19)(21, SkipDynamicUIComponentComponent_Conditional_1_button_21_Template, 4, 0, "button", 20);
544
+ i0.ɵɵelementStart(19, "div", 17);
545
+ i0.ɵɵtemplate(20, SkipDynamicUIComponentComponent_Conditional_1_button_20_Template, 4, 2, "button", 18)(21, SkipDynamicUIComponentComponent_Conditional_1_button_21_Template, 4, 0, "button", 19);
517
546
  i0.ɵɵelementEnd()();
518
- i0.ɵɵelementStart(22, "div", 21);
519
- i0.ɵɵtemplate(23, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template, 8, 6)(24, SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Template, 31, 3, "div", 52)(25, SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_Template, 2, 0, "div", 22);
547
+ i0.ɵɵelementStart(22, "div", 20);
548
+ i0.ɵɵtemplate(23, SkipDynamicUIComponentComponent_Conditional_1_Conditional_23_Template, 8, 6)(24, SkipDynamicUIComponentComponent_Conditional_1_Conditional_24_Template, 31, 3, "div", 53)(25, SkipDynamicUIComponentComponent_Conditional_1_Conditional_25_Template, 2, 1, "div", 21);
520
549
  i0.ɵɵelementEnd()();
521
550
  } if (rf & 2) {
522
551
  const ctx_r1 = i0.ɵɵnextContext();
@@ -549,11 +578,13 @@ export class SkipDynamicUIComponentComponent {
549
578
  matchingReportID = null;
550
579
  DrillDownEvent = new EventEmitter();
551
580
  CreateReportRequested = new EventEmitter();
552
- htmlContainers;
581
+ reactComponents;
553
582
  // Properties for handling multiple report options
554
583
  reportOptions = [];
555
584
  selectedReportOptionIndex = 0;
556
585
  currentError = null;
586
+ // Cached component type name to avoid expression change errors
587
+ _cachedComponentTypeName = 'Component';
557
588
  isCreatingReport = false;
558
589
  // Toggle states for showing/hiding component details
559
590
  showFunctionalRequirements = false;
@@ -565,15 +596,12 @@ export class SkipDynamicUIComponentComponent {
565
596
  isResizing = false;
566
597
  startY = 0;
567
598
  startHeight = 0;
568
- // Cache for React component hosts - lazy loaded per option
569
- reactHostCache = new Map();
570
- currentHostIndex = null;
571
- callbacks = {
572
- RefreshData: () => this.handleRefreshData(),
573
- OpenEntityRecord: (entityName, key) => this.handleOpenEntityRecord(entityName, key),
574
- UpdateUserState: (userState) => this.handleUpdateUserState(userState),
575
- NotifyEvent: (eventName, eventData) => this.handleNotifyEvent(eventName, eventData)
576
- };
599
+ // Cache for component specs and user states
600
+ componentSpecs = new Map();
601
+ userStates = new Map();
602
+ utilities = null;
603
+ componentStyles = null;
604
+ // Event handlers from React components
577
605
  constructor(sanitizer, cdr, ngZone) {
578
606
  this.sanitizer = sanitizer;
579
607
  this.cdr = cdr;
@@ -631,15 +659,14 @@ export class SkipDynamicUIComponentComponent {
631
659
  this.currentError = null;
632
660
  try {
633
661
  // Update the component info - this can fail if placeholders are missing
634
- this.UIComponentCode = BuildSkipComponentCompleteCode(selectedOption.option);
662
+ this.UIComponentCode = BuildComponentCompleteCode(selectedOption.option);
635
663
  this.ComponentObjectName = selectedOption.option.componentName;
636
- // Simply create or reuse the React host for this option
637
- // The tab component handles visibility automatically
638
- if (!this.reactHostCache.has(this.selectedReportOptionIndex)) {
639
- // Create a new host for this option
640
- this.createReactHostForOption(this.selectedReportOptionIndex);
664
+ // Create or update the component spec for this option
665
+ if (!this.componentSpecs.has(this.selectedReportOptionIndex)) {
666
+ this.createComponentSpecForOption(this.selectedReportOptionIndex);
667
+ // Trigger change detection after modifying componentSpecs
668
+ this.cdr.detectChanges();
641
669
  }
642
- this.currentHostIndex = this.selectedReportOptionIndex;
643
670
  }
644
671
  catch (error) {
645
672
  console.error('Failed to build component code:', error);
@@ -654,21 +681,22 @@ export class SkipDynamicUIComponentComponent {
654
681
  }
655
682
  }
656
683
  async PrintReport() {
657
- const currentHost = this.getCurrentReactHost();
658
- if (currentHost) {
659
- currentHost.print();
684
+ const currentComponent = this.getCurrentReactComponent();
685
+ if (currentComponent) {
686
+ // React component handles printing internally
687
+ window.print();
660
688
  }
661
689
  else {
662
690
  window.print();
663
691
  }
664
692
  }
665
693
  /**
666
- * Copy error details to clipboard for user to send back to Skip
694
+ * Copy error details to clipboard for user to send back to
667
695
  */
668
696
  copyErrorToClipboard() {
669
697
  if (!this.currentError)
670
698
  return;
671
- const errorText = `Skip Component Error:
699
+ const errorText = `Component Error:
672
700
  Type: ${this.currentError.type}
673
701
  Message: ${this.currentError.message}
674
702
  ${this.currentError.technicalDetails ? `\nTechnical Details:\n${this.currentError.technicalDetails}` : ''}
@@ -676,26 +704,25 @@ ${this.currentError.technicalDetails ? `\nTechnical Details:\n${this.currentErro
676
704
  Component Option: ${this.selectedReportOptionIndex + 1}
677
705
  Component Name: ${this.ComponentObjectName || 'Unknown'}`;
678
706
  navigator.clipboard.writeText(errorText).then(() => {
679
- alert('Error details copied to clipboard. You can paste this in the Skip chat to get help.');
707
+ alert('Error details copied to clipboard. You can paste this in the chat to get help.');
680
708
  }).catch(err => {
681
709
  console.error('Failed to copy to clipboard:', err);
682
710
  });
683
711
  }
684
712
  /**
685
- * Get the container element for a specific option index
713
+ * Get the React component for a specific option index
686
714
  */
687
- getContainerForOption(optionIndex) {
688
- if (!this.htmlContainers || this.htmlContainers.length === 0) {
715
+ getReactComponentForOption(optionIndex) {
716
+ if (!this.reactComponents || this.reactComponents.length === 0) {
689
717
  return null;
690
718
  }
691
719
  if (this.reportOptions.length === 1) {
692
- // Single option - use the only container
693
- return this.htmlContainers.first?.nativeElement || null;
720
+ // Single option - use the only component
721
+ return this.reactComponents.first || null;
694
722
  }
695
723
  else {
696
- // Multiple options - find container by data-tab-index
697
- const container = this.htmlContainers.find(ref => ref.nativeElement.getAttribute('data-tab-index') === optionIndex.toString());
698
- return container?.nativeElement || null;
724
+ // Multiple options - find by index
725
+ return this.reactComponents.toArray()[optionIndex] || null;
699
726
  }
700
727
  }
701
728
  /**
@@ -704,16 +731,10 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
704
731
  retryCurrentOption() {
705
732
  // Clear the error
706
733
  this.currentError = null;
707
- // Remove the cached host for this option to force recreation
708
- if (this.reactHostCache.has(this.selectedReportOptionIndex)) {
709
- const host = this.reactHostCache.get(this.selectedReportOptionIndex);
710
- if (host) {
711
- host.destroy();
712
- }
713
- this.reactHostCache.delete(this.selectedReportOptionIndex);
714
- }
715
- // Try creating it again
716
- this.createReactHostForOption(this.selectedReportOptionIndex);
734
+ // Re-create the component spec
735
+ this.createComponentSpecForOption(this.selectedReportOptionIndex);
736
+ // Trigger change detection
737
+ this.cdr.detectChanges();
717
738
  }
718
739
  /**
719
740
  * Handle create report request for a specific option
@@ -730,6 +751,12 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
730
751
  const type = option.option.componentType || 'report';
731
752
  return type.charAt(0).toUpperCase() + type.slice(1);
732
753
  }
754
+ /**
755
+ * Get the cached component type name for the first option to avoid change detection errors
756
+ */
757
+ get firstOptionComponentTypeName() {
758
+ return this._cachedComponentTypeName;
759
+ }
733
760
  /**
734
761
  * Toggle methods for showing/hiding component details
735
762
  */
@@ -820,7 +847,7 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
820
847
  */
821
848
  getComponentCode(option) {
822
849
  try {
823
- return BuildSkipComponentCompleteCode(option.option);
850
+ return BuildComponentCompleteCode(option.option);
824
851
  }
825
852
  catch (e) {
826
853
  return `// Error building complete component code:\n// ${e}`;
@@ -879,51 +906,40 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
879
906
  if (this.SkipData) {
880
907
  this.setupReportOptions(this.SkipData);
881
908
  }
882
- // Wait for ViewChildren to be available
883
- setTimeout(() => {
884
- if (this.UIComponentCode && this.ComponentObjectName && this.SkipData) {
885
- // Create the initial React host for the first option
886
- this.createReactHostForOption(this.selectedReportOptionIndex);
887
- }
888
- });
909
+ // Initialize utilities and styles once using React runtime
910
+ const runtimeUtils = createRuntimeUtilities();
911
+ this.utilities = runtimeUtils.buildUtilities();
912
+ this.componentStyles = SetupStyles();
913
+ // Create component specs for all options
914
+ // Use Promise.resolve to avoid ExpressionChangedAfterItHasBeenCheckedError
915
+ if (this.reportOptions.length > 0) {
916
+ Promise.resolve().then(() => {
917
+ this.reportOptions.forEach((_, index) => {
918
+ this.createComponentSpecForOption(index);
919
+ });
920
+ this.cdr.detectChanges();
921
+ });
922
+ }
889
923
  }
890
924
  ngOnDestroy() {
891
- // Clean up all cached React hosts
892
- this.reactHostCache.forEach(host => {
893
- try {
894
- host.destroy();
895
- }
896
- catch (e) {
897
- console.error('Error destroying React host:', e);
898
- }
899
- });
900
- this.reactHostCache.clear();
901
- // Clean up registered components from the GlobalComponentRegistry
902
- // Note: We don't remove them as they might be used by other instances
903
- // The registry is designed to be a singleton that persists across component instances
925
+ // Clean up component specs and states
926
+ this.componentSpecs.clear();
927
+ this.userStates.clear();
928
+ // The MJReactComponent handles its own cleanup
904
929
  }
905
930
  ngOnChanges(changes) {
906
- if (changes['SkipData'] && !changes['SkipData'].firstChange) {
907
- // Update all cached React components with new data
908
- const newData = this.getFlattenedDataContext();
909
- this.reactHostCache.forEach(host => {
910
- try {
911
- host.updateState('data', newData);
912
- }
913
- catch (e) {
914
- console.error('Error updating React host data:', e);
915
- }
916
- });
931
+ if (changes['SkipData']) {
932
+ const skipData = changes['SkipData'].currentValue;
933
+ if (skipData) {
934
+ this.setupReportOptions(skipData);
935
+ }
917
936
  }
918
937
  }
919
938
  /**
920
- * Get the currently active React host
939
+ * Get the currently active React component
921
940
  */
922
- getCurrentReactHost() {
923
- if (this.currentHostIndex !== null && this.reactHostCache.has(this.currentHostIndex)) {
924
- return this.reactHostCache.get(this.currentHostIndex) || null;
925
- }
926
- return null;
941
+ getCurrentReactComponent() {
942
+ return this.getReactComponentForOption(this.selectedReportOptionIndex);
927
943
  }
928
944
  _skipData;
929
945
  get SkipData() {
@@ -937,7 +953,7 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
937
953
  if (d.componentOptions && d.componentOptions.length > 0) {
938
954
  // Use the first component option (or the highest ranked one)
939
955
  const component = d.componentOptions[0];
940
- this.UIComponentCode = BuildSkipComponentCompleteCode(component.option);
956
+ this.UIComponentCode = BuildComponentCompleteCode(component.option);
941
957
  this.ComponentObjectName = component.option.componentName;
942
958
  }
943
959
  else {
@@ -967,67 +983,37 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
967
983
  // Select the best option (first in sorted array)
968
984
  this.selectedReportOptionIndex = 0;
969
985
  const bestOption = this.reportOptions[0];
970
- this.UIComponentCode = BuildSkipComponentCompleteCode(bestOption.option);
986
+ this.UIComponentCode = BuildComponentCompleteCode(bestOption.option);
971
987
  this.ComponentObjectName = bestOption.option.componentName;
988
+ // Update cached component type name after current change detection cycle
989
+ Promise.resolve().then(() => {
990
+ this._cachedComponentTypeName = this.getComponentTypeName(bestOption);
991
+ this.cdr.detectChanges();
992
+ });
972
993
  }
973
994
  }
974
995
  /**
975
- * Create a React host for a specific option index
996
+ * Create a component spec for a specific option index
976
997
  */
977
- async createReactHostForOption(optionIndex) {
998
+ createComponentSpecForOption(optionIndex) {
978
999
  const option = this.reportOptions[optionIndex];
979
1000
  if (!option)
980
1001
  return;
981
- const container = this.getContainerForOption(optionIndex);
982
- if (!container)
983
- return;
984
1002
  try {
985
1003
  const component = option.option;
986
- const md = new Metadata();
987
- const data = this.getFlattenedDataContext();
988
- // Create the React component host directly in the tab container
989
- // The host will handle registration automatically
990
- const reactHost = new SkipReactComponentHost({
991
- component,
992
- container: container,
993
- callbacks: this.callbacks,
994
- data: data,
995
- utilities: this.SetupUtilities(md),
996
- styles: this.SetupStyles()
997
- // metadata will be auto-populated from component.childComponents
998
- });
999
- // Initialize and render the React component
1000
- await reactHost.initialize();
1001
- // Cache the host
1002
- this.reactHostCache.set(optionIndex, reactHost);
1003
- // Update current index if this is the selected option
1004
- if (optionIndex === this.selectedReportOptionIndex) {
1005
- this.currentHostIndex = optionIndex;
1004
+ // Store the component spec
1005
+ this.componentSpecs.set(optionIndex, component);
1006
+ // Initialize user state if not exists
1007
+ if (!this.userStates.has(optionIndex)) {
1008
+ this.userStates.set(optionIndex, {});
1006
1009
  }
1007
1010
  }
1008
1011
  catch (e) {
1009
- console.error('Error creating React host:', e);
1012
+ console.error('Error creating component spec:', e);
1010
1013
  // Determine the type of error and create a user-friendly message
1011
- let errorType = 'Component Initialization Error';
1012
- let errorMessage = 'Failed to initialize the React component.';
1014
+ let errorType = 'Component Specification Error';
1015
+ let errorMessage = 'Failed to create component specification.';
1013
1016
  let technicalDetails = e.toString();
1014
- if (e.message?.includes('JSX transpilation failed')) {
1015
- errorType = 'Code Compilation Error';
1016
- errorMessage = 'The component code could not be compiled. This usually indicates a syntax error in the generated code.';
1017
- technicalDetails = e.message;
1018
- }
1019
- else if (e.message?.includes('is not defined')) {
1020
- errorType = 'Missing Dependency';
1021
- errorMessage = 'The component is trying to use a feature or library that is not available.';
1022
- }
1023
- else if (e.message?.includes('Missing required child components')) {
1024
- errorType = 'Incomplete Component Specification';
1025
- errorMessage = e.message;
1026
- }
1027
- else if (e.message?.includes('Cannot read properties')) {
1028
- errorType = 'Property Access Error';
1029
- errorMessage = 'The component is trying to access data that doesn\'t exist. This often happens when property names don\'t match the data structure.';
1030
- }
1031
1017
  this.currentError = {
1032
1018
  type: errorType,
1033
1019
  message: errorMessage,
@@ -1036,6 +1022,40 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1036
1022
  LogError(e);
1037
1023
  }
1038
1024
  }
1025
+ /**
1026
+ * Handle state change events from React components
1027
+ */
1028
+ onStateChange(optionIndex, event) {
1029
+ const currentState = this.userStates.get(optionIndex) || {};
1030
+ this.userStates.set(optionIndex, {
1031
+ ...currentState,
1032
+ [event.path]: event.value
1033
+ });
1034
+ // Handle any additional state change logic
1035
+ this.handleUpdateUserState({ [event.path]: event.value });
1036
+ }
1037
+ /**
1038
+ * Handle component events from React components
1039
+ */
1040
+ onComponentEvent(optionIndex, event) {
1041
+ if (event.type === 'error') {
1042
+ this.currentError = {
1043
+ type: event.payload.source || 'React Component Error',
1044
+ message: event.payload.error || 'An unknown error occurred',
1045
+ technicalDetails: event.payload.errorInfo || ''
1046
+ };
1047
+ }
1048
+ else {
1049
+ this.handleNotifyEvent(event.type, event.payload);
1050
+ }
1051
+ }
1052
+ /**
1053
+ * Handle open entity record events
1054
+ */
1055
+ onOpenEntityRecord(event) {
1056
+ const key = new CompositeKey([{ FieldName: 'ID', Value: event.recordId }]);
1057
+ this.handleOpenEntityRecord(event.entityName, key);
1058
+ }
1039
1059
  getFlattenedDataContext() {
1040
1060
  const flattenedDataContext = {};
1041
1061
  if (this.SkipData?.dataContext) {
@@ -1086,162 +1106,11 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1086
1106
  }
1087
1107
  // TODO: Handle other custom events as needed
1088
1108
  }
1089
- SetupUtilities(md) {
1090
- const rv = new RunView();
1091
- const rq = new RunQuery();
1092
- const u = {
1093
- md: this.CreateSimpleMetadata(md),
1094
- rv: this.CreateSimpleRunView(rv),
1095
- rq: this.CreateSimpleRunQuery(rq)
1096
- };
1097
- return u;
1098
- }
1099
- CreateSimpleMetadata(md) {
1100
- return {
1101
- entities: md.Entities.map(e => MapEntityInfoToSkipEntityInfo(e))
1102
- };
1103
- }
1104
- SetupStyles() {
1105
- // Return modern, contemporary styles for generated components
1106
- return {
1107
- colors: {
1108
- // Primary colors - modern purple/blue gradient feel
1109
- primary: '#5B4FE9',
1110
- primaryHover: '#4940D4',
1111
- primaryLight: '#E8E6FF',
1112
- // Secondary colors - sophisticated gray
1113
- secondary: '#64748B',
1114
- secondaryHover: '#475569',
1115
- // Status colors
1116
- success: '#10B981',
1117
- successLight: '#D1FAE5',
1118
- warning: '#F59E0B',
1119
- warningLight: '#FEF3C7',
1120
- error: '#EF4444',
1121
- errorLight: '#FEE2E2',
1122
- info: '#3B82F6',
1123
- infoLight: '#DBEAFE',
1124
- // Base colors
1125
- background: '#FFFFFF',
1126
- surface: '#F8FAFC',
1127
- surfaceHover: '#F1F5F9',
1128
- // Text colors with better contrast
1129
- text: '#1E293B',
1130
- textSecondary: '#64748B',
1131
- textTertiary: '#94A3B8',
1132
- textInverse: '#FFFFFF',
1133
- // Border colors
1134
- border: '#E2E8F0',
1135
- borderLight: '#F1F5F9',
1136
- borderFocus: '#5B4FE9',
1137
- // Shadows (as color strings for easy use)
1138
- shadow: 'rgba(0, 0, 0, 0.05)',
1139
- shadowMedium: 'rgba(0, 0, 0, 0.1)',
1140
- shadowLarge: 'rgba(0, 0, 0, 0.15)',
1141
- },
1142
- spacing: {
1143
- xs: '4px',
1144
- sm: '8px',
1145
- md: '16px',
1146
- lg: '24px',
1147
- xl: '32px',
1148
- xxl: '48px',
1149
- xxxl: '64px',
1150
- },
1151
- typography: {
1152
- fontFamily: '-apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, sans-serif',
1153
- fontSize: {
1154
- xs: '11px',
1155
- sm: '12px',
1156
- md: '14px',
1157
- lg: '16px',
1158
- xl: '20px',
1159
- xxl: '24px',
1160
- xxxl: '32px',
1161
- },
1162
- fontWeight: {
1163
- light: '300',
1164
- regular: '400',
1165
- medium: '500',
1166
- semibold: '600',
1167
- bold: '700',
1168
- },
1169
- lineHeight: {
1170
- tight: '1.25',
1171
- normal: '1.5',
1172
- relaxed: '1.75',
1173
- },
1174
- },
1175
- borders: {
1176
- radius: {
1177
- sm: '6px',
1178
- md: '8px',
1179
- lg: '12px',
1180
- xl: '16px',
1181
- full: '9999px',
1182
- },
1183
- width: {
1184
- thin: '1px',
1185
- medium: '2px',
1186
- thick: '3px',
1187
- },
1188
- },
1189
- shadows: {
1190
- sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
1191
- md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
1192
- lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
1193
- xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
1194
- inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',
1195
- },
1196
- transitions: {
1197
- fast: '150ms ease-in-out',
1198
- normal: '250ms ease-in-out',
1199
- slow: '350ms ease-in-out',
1200
- },
1201
- overflow: 'auto' // Default overflow style
1202
- };
1203
- }
1204
- CreateSimpleRunQuery(rq) {
1205
- return {
1206
- runQuery: async (params) => {
1207
- // Run a single query and return the results
1208
- try {
1209
- const result = await rq.RunQuery(params);
1210
- return result;
1211
- }
1212
- catch (error) {
1213
- LogError(error);
1214
- throw error; // Re-throw to handle it in the caller
1215
- }
1216
- }
1217
- };
1218
- }
1219
- CreateSimpleRunView(rv) {
1220
- return {
1221
- runView: async (params) => {
1222
- // Run a single view and return the results
1223
- try {
1224
- const result = await rv.RunView(params);
1225
- return result;
1226
- }
1227
- catch (error) {
1228
- LogError(error);
1229
- throw error; // Re-throw to handle it in the caller
1230
- }
1231
- },
1232
- runViews: async (params) => {
1233
- // Runs multiple views and returns the results
1234
- try {
1235
- const results = await rv.RunViews(params);
1236
- return results;
1237
- }
1238
- catch (error) {
1239
- LogError(error);
1240
- throw error; // Re-throw to handle it in the caller
1241
- }
1242
- }
1243
- };
1244
- }
1109
+ // SetupUtilities method removed - now using React runtime's RuntimeUtilities
1110
+ // CreateSimpleMetadata method removed - now using React runtime's RuntimeUtilities
1111
+ // SetupStyles method removed - now using React runtime's SetupStyles function
1112
+ // CreateSimpleRunQuery method removed - now using React runtime's RuntimeUtilities
1113
+ // CreateSimpleRunView method removed - now using React runtime's RuntimeUtilities
1245
1114
  SetupCallbacks() {
1246
1115
  const cb = {
1247
1116
  RefreshData: () => {
@@ -1282,28 +1151,24 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1282
1151
  return cb;
1283
1152
  }
1284
1153
  async refreshReport(data) {
1285
- const currentHost = this.getCurrentReactHost();
1286
- if (currentHost) {
1287
- currentHost.refresh(data);
1288
- }
1289
- else {
1290
- // If no React host is available, create one for the current option
1291
- this.createReactHostForOption(this.selectedReportOptionIndex);
1154
+ const currentComponent = this.getCurrentReactComponent();
1155
+ if (currentComponent) {
1156
+ currentComponent.refresh(data);
1292
1157
  }
1293
1158
  }
1294
1159
  static ɵfac = function SkipDynamicUIComponentComponent_Factory(t) { return new (t || SkipDynamicUIComponentComponent)(i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); };
1295
1160
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipDynamicUIComponentComponent, selectors: [["skip-dynamic-ui-component"]], viewQuery: function SkipDynamicUIComponentComponent_Query(rf, ctx) { if (rf & 1) {
1296
- i0.ɵɵviewQuery(_c0, 5);
1161
+ i0.ɵɵviewQuery(MJReactComponent, 5);
1297
1162
  } if (rf & 2) {
1298
1163
  let _t;
1299
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.htmlContainers = _t);
1164
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.reactComponents = _t);
1300
1165
  } }, hostBindings: function SkipDynamicUIComponentComponent_HostBindings(rf, ctx) { if (rf & 1) {
1301
1166
  i0.ɵɵlistener("resize", function SkipDynamicUIComponentComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
1302
- } }, 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", "language", "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, "flex", "1", "display", "flex", "align-items", "center", "justify-content", "center", "min-height", "400px", "padding", "20px", "background", "rgba(255, 255, 255, 0.95)"], [2, "height", "100%", 3, "language", "value", "autoFocus", "indentWithTab", "readonly"], [2, "width", "90%", "max-width", "600px", "max-height", "80vh", "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)"]], template: function SkipDynamicUIComponentComponent_Template(rf, ctx) { if (rf & 1) {
1303
- i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_Template, 3, 1, "kendo-tabstrip", 1)(1, SkipDynamicUIComponentComponent_Conditional_1_Template, 26, 12, "div", 2);
1167
+ } }, 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: [[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"], ["style", "width: 100%; height: 100%;", 3, "component", "data", "state", "utilities", "styles", "stateChange", "componentEvent", "refreshData", "openEntityRecord", 4, "ngIf"], [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", "language", "autoFocus", "indentWithTab", "readonly"], [2, "width", "100%", "height", "100%", 3, "stateChange", "componentEvent", "refreshData", "openEntityRecord", "component", "data", "state", "utilities", "styles"], [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, "flex", "1", "display", "flex", "align-items", "center", "justify-content", "center", "min-height", "400px", "padding", "20px", "background", "rgba(255, 255, 255, 0.95)"], [2, "height", "100%", 3, "language", "value", "autoFocus", "indentWithTab", "readonly"], [2, "width", "90%", "max-width", "600px", "max-height", "80vh", "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)"]], template: function SkipDynamicUIComponentComponent_Template(rf, ctx) { if (rf & 1) {
1168
+ i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_Template, 3, 1, "kendo-tabstrip", 0)(1, SkipDynamicUIComponentComponent_Conditional_1_Template, 26, 12, "div", 1);
1304
1169
  } if (rf & 2) {
1305
1170
  i0.ɵɵconditional(ctx.reportOptions.length > 1 ? 0 : 1);
1306
- } }, 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 }"] });
1171
+ } }, dependencies: [i2.NgIf, i3.TabStripComponent, i3.TabStripTabComponent, i3.TabContentDirective, i3.TabTitleDirective, i4.ButtonComponent, i5.CodeEditorComponent, i6.MJReactComponent], 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 }"] });
1307
1172
  }
1308
1173
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkipDynamicUIComponentComponent, [{
1309
1174
  type: Component,
@@ -1447,9 +1312,21 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1447
1312
  }
1448
1313
 
1449
1314
  <!-- React component container -->
1450
- <div #htmlContainer [attr.data-tab-index]="i"
1315
+ <div [attr.data-tab-index]="i"
1451
1316
  style="flex: 1; position: relative; min-height: 0; overflow: auto;">
1452
- <!-- Content will be rendered here by React host -->
1317
+ <mj-react-component
1318
+ *ngIf="!currentError && componentSpecs.has(i)"
1319
+ [component]="componentSpecs.get(i)!"
1320
+ [data]="getFlattenedDataContext()"
1321
+ [state]="userStates.get(i) || {}"
1322
+ [utilities]="utilities"
1323
+ [styles]="componentStyles || undefined"
1324
+ (stateChange)="onStateChange(i, $event)"
1325
+ (componentEvent)="onComponentEvent(i, $event)"
1326
+ (refreshData)="handleRefreshData()"
1327
+ (openEntityRecord)="onOpenEntityRecord($event)"
1328
+ style="width: 100%; height: 100%;">
1329
+ </mj-react-component>
1453
1330
 
1454
1331
  <!-- Error overlay for this tab (shown on top of content when needed) -->
1455
1332
  @if (currentError && selectedReportOptionIndex === i) {
@@ -1563,7 +1440,7 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1563
1440
  (click)="createReportForOption(0)"
1564
1441
  [disabled]="isCreatingReport">
1565
1442
  <i class="fa-solid fa-plus"></i>
1566
- <span>Create {{ reportOptions[0] ? getComponentTypeName(reportOptions[0]) : 'Component' }}</span>
1443
+ <span>Create {{ firstOptionComponentTypeName }}</span>
1567
1444
  </button>
1568
1445
  <button class="tab-action-button print-button"
1569
1446
  *ngIf="ShowPrintReport"
@@ -1702,8 +1579,20 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1702
1579
  </div>
1703
1580
  } @else {
1704
1581
  <!-- React component container (only shown when no error) -->
1705
- <div #htmlContainer style="flex: 1; position: relative; min-height: 0; overflow: auto;">
1706
- <!-- Content will be rendered here by React host -->
1582
+ <div style="flex: 1; position: relative; min-height: 0; overflow: auto;">
1583
+ <mj-react-component
1584
+ *ngIf="componentSpecs.has(0)"
1585
+ [component]="componentSpecs.get(0)!"
1586
+ [data]="getFlattenedDataContext()"
1587
+ [state]="userStates.get(0) || {}"
1588
+ [utilities]="utilities"
1589
+ [styles]="componentStyles || undefined"
1590
+ (stateChange)="onStateChange(0, $event)"
1591
+ (componentEvent)="onComponentEvent(0, $event)"
1592
+ (refreshData)="handleRefreshData()"
1593
+ (openEntityRecord)="onOpenEntityRecord($event)"
1594
+ style="width: 100%; height: 100%;">
1595
+ </mj-react-component>
1707
1596
  </div>
1708
1597
  }
1709
1598
  </div>
@@ -1727,14 +1616,14 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
1727
1616
  type: Output
1728
1617
  }], CreateReportRequested: [{
1729
1618
  type: Output
1730
- }], htmlContainers: [{
1619
+ }], reactComponents: [{
1731
1620
  type: ViewChildren,
1732
- args: ['htmlContainer']
1621
+ args: [MJReactComponent]
1733
1622
  }], onWindowResize: [{
1734
1623
  type: HostListener,
1735
1624
  args: ['window:resize']
1736
1625
  }], SkipData: [{
1737
1626
  type: Input
1738
1627
  }] }); })();
1739
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SkipDynamicUIComponentComponent, { className: "SkipDynamicUIComponentComponent", filePath: "src/lib/dynamic-report/dynamic-ui-component.ts", lineNumber: 694 }); })();
1628
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SkipDynamicUIComponentComponent, { className: "SkipDynamicUIComponentComponent", filePath: "src/lib/dynamic-report/dynamic-ui-component.ts", lineNumber: 720 }); })();
1740
1629
  //# sourceMappingURL=dynamic-ui-component.js.map