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