@memberjunction/ng-dashboards 2.94.0 → 2.96.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +14 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +570 -299
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +60 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +602 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -0
- package/dist/module.d.ts +20 -18
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +9 -2
- package/dist/module.js.map +1 -1
- package/package.json +10 -10
|
@@ -9,9 +9,12 @@ import { BaseDashboard } from '../generic/base-dashboard';
|
|
|
9
9
|
import { RegisterClass } from '@memberjunction/global';
|
|
10
10
|
import { RunView, CompositeKey, Metadata } from '@memberjunction/core';
|
|
11
11
|
import { Subject } from 'rxjs';
|
|
12
|
+
import { MJReactComponent } from '@memberjunction/ng-react';
|
|
12
13
|
import { SharedService } from '@memberjunction/ng-shared';
|
|
13
14
|
import { ParseJSONRecursive } from '@memberjunction/global';
|
|
14
15
|
import { TextImportDialogComponent } from './components/text-import-dialog.component';
|
|
16
|
+
import { ArtifactSelectionDialogComponent } from './components/artifact-selection-dialog.component';
|
|
17
|
+
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
15
18
|
import * as i0 from "@angular/core";
|
|
16
19
|
import * as i1 from "@progress/kendo-angular-dialog";
|
|
17
20
|
import * as i2 from "@angular/common";
|
|
@@ -26,11 +29,11 @@ const _forTrack0 = ($index, $item) => $item.name;
|
|
|
26
29
|
function _forTrack1($index, $item) { return this.getComponentId($item); }
|
|
27
30
|
const _forTrack2 = ($index, $item) => $item.title;
|
|
28
31
|
function ComponentStudioDashboardComponent_Conditional_10_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
29
|
-
i0.ɵɵelement(0, "span",
|
|
32
|
+
i0.ɵɵelement(0, "span", 36);
|
|
30
33
|
i0.ɵɵtext(1, " Show Details ");
|
|
31
34
|
} }
|
|
32
35
|
function ComponentStudioDashboardComponent_Conditional_10_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
-
i0.ɵɵelement(0, "span",
|
|
36
|
+
i0.ɵɵelement(0, "span", 37);
|
|
34
37
|
i0.ɵɵtext(1, " Hide Details ");
|
|
35
38
|
} }
|
|
36
39
|
function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -47,80 +50,116 @@ function ComponentStudioDashboardComponent_Conditional_10_Template(rf, ctx) { if
|
|
|
47
50
|
} }
|
|
48
51
|
function ComponentStudioDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
49
52
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
50
|
-
i0.ɵɵelementStart(0, "div", 12)(1, "button",
|
|
53
|
+
i0.ɵɵelementStart(0, "div", 12)(1, "button", 38);
|
|
51
54
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_16_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.importFromFile()); });
|
|
52
|
-
i0.ɵɵelement(2, "i",
|
|
55
|
+
i0.ɵɵelement(2, "i", 39);
|
|
53
56
|
i0.ɵɵtext(3, " Import from File ");
|
|
54
57
|
i0.ɵɵelementEnd();
|
|
55
|
-
i0.ɵɵelementStart(4, "button",
|
|
58
|
+
i0.ɵɵelementStart(4, "button", 38);
|
|
56
59
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_16_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.importFromText()); });
|
|
57
|
-
i0.ɵɵelement(5, "i",
|
|
60
|
+
i0.ɵɵelement(5, "i", 40);
|
|
58
61
|
i0.ɵɵtext(6, " Import from Text ");
|
|
59
62
|
i0.ɵɵelementEnd()();
|
|
60
63
|
} }
|
|
61
|
-
function
|
|
62
|
-
i0.ɵɵ
|
|
63
|
-
i0.ɵɵ
|
|
64
|
+
function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
66
|
+
i0.ɵɵelementStart(0, "div", 12)(1, "button", 38);
|
|
67
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToArtifact()); });
|
|
68
|
+
i0.ɵɵelement(2, "i", 43);
|
|
69
|
+
i0.ɵɵtext(3, " Export to Artifact ");
|
|
70
|
+
i0.ɵɵelementEnd();
|
|
71
|
+
i0.ɵɵelementStart(4, "button", 38);
|
|
72
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToFile()); });
|
|
73
|
+
i0.ɵɵelement(5, "i", 39);
|
|
74
|
+
i0.ɵɵtext(6, " Export to File ");
|
|
75
|
+
i0.ɵɵelementEnd();
|
|
76
|
+
i0.ɵɵelementStart(7, "button", 38);
|
|
77
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.exportToClipboard()); });
|
|
78
|
+
i0.ɵɵelement(8, "i", 44);
|
|
79
|
+
i0.ɵɵtext(9, " Export to Clipboard ");
|
|
80
|
+
i0.ɵɵelementEnd()();
|
|
81
|
+
} }
|
|
82
|
+
function ComponentStudioDashboardComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
84
|
+
i0.ɵɵelementStart(0, "div", 41)(1, "button", 9);
|
|
85
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_17_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleExportDropdown()); });
|
|
86
|
+
i0.ɵɵelement(2, "span", 42);
|
|
87
|
+
i0.ɵɵtext(3, " Export ");
|
|
88
|
+
i0.ɵɵelement(4, "span", 11);
|
|
89
|
+
i0.ɵɵelementEnd();
|
|
90
|
+
i0.ɵɵtemplate(5, ComponentStudioDashboardComponent_Conditional_17_Conditional_5_Template, 10, 0, "div", 12);
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
} if (rf & 2) {
|
|
93
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
94
|
+
i0.ɵɵclassProp("open", ctx_r2.exportDropdownOpen);
|
|
95
|
+
i0.ɵɵadvance();
|
|
96
|
+
i0.ɵɵproperty("themeColor", "primary");
|
|
97
|
+
i0.ɵɵadvance(4);
|
|
98
|
+
i0.ɵɵconditional(ctx_r2.exportDropdownOpen ? 5 : -1);
|
|
64
99
|
} }
|
|
65
100
|
function ComponentStudioDashboardComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
-
i0.ɵɵelement(0, "i",
|
|
101
|
+
i0.ɵɵelement(0, "i", 45);
|
|
102
|
+
i0.ɵɵtext(1, " Favorites ");
|
|
103
|
+
} }
|
|
104
|
+
function ComponentStudioDashboardComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
105
|
+
i0.ɵɵelement(0, "i", 46);
|
|
67
106
|
i0.ɵɵtext(1, " All ");
|
|
68
107
|
} }
|
|
69
|
-
function
|
|
70
|
-
const
|
|
71
|
-
i0.ɵɵelementStart(0, "button",
|
|
72
|
-
i0.ɵɵlistener("click", function
|
|
73
|
-
i0.ɵɵelementStart(1, "span",
|
|
108
|
+
function ComponentStudioDashboardComponent_Conditional_37_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
109
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
110
|
+
i0.ɵɵelementStart(0, "button", 50);
|
|
111
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_For_2_Template_button_click_0_listener() { const category_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleCategory(category_r8.name)); });
|
|
112
|
+
i0.ɵɵelementStart(1, "span", 51);
|
|
74
113
|
i0.ɵɵtext(2);
|
|
75
114
|
i0.ɵɵelementEnd();
|
|
76
|
-
i0.ɵɵelementStart(3, "span",
|
|
115
|
+
i0.ɵɵelementStart(3, "span", 52);
|
|
77
116
|
i0.ɵɵtext(4);
|
|
78
117
|
i0.ɵɵelementEnd()();
|
|
79
118
|
} if (rf & 2) {
|
|
80
|
-
const
|
|
119
|
+
const category_r8 = ctx.$implicit;
|
|
81
120
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
82
|
-
i0.ɵɵstyleProp("--pill-color",
|
|
83
|
-
i0.ɵɵclassProp("active", ctx_r2.isCategorySelected(
|
|
121
|
+
i0.ɵɵstyleProp("--pill-color", category_r8.color);
|
|
122
|
+
i0.ɵɵclassProp("active", ctx_r2.isCategorySelected(category_r8.name));
|
|
84
123
|
i0.ɵɵadvance(2);
|
|
85
|
-
i0.ɵɵtextInterpolate(
|
|
124
|
+
i0.ɵɵtextInterpolate(category_r8.name);
|
|
86
125
|
i0.ɵɵadvance(2);
|
|
87
|
-
i0.ɵɵtextInterpolate(
|
|
126
|
+
i0.ɵɵtextInterpolate(category_r8.count);
|
|
88
127
|
} }
|
|
89
|
-
function
|
|
90
|
-
i0.ɵɵelement(0, "i",
|
|
128
|
+
function ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
129
|
+
i0.ɵɵelement(0, "i", 54);
|
|
91
130
|
i0.ɵɵtext(1, " Less ");
|
|
92
131
|
} }
|
|
93
|
-
function
|
|
94
|
-
i0.ɵɵelement(0, "i",
|
|
132
|
+
function ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
+
i0.ɵɵelement(0, "i", 55);
|
|
95
134
|
i0.ɵɵtext(1);
|
|
96
135
|
} if (rf & 2) {
|
|
97
136
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
98
137
|
i0.ɵɵadvance();
|
|
99
138
|
i0.ɵɵtextInterpolate1(" +", ctx_r2.availableCategories.length - 5, " more ");
|
|
100
139
|
} }
|
|
101
|
-
function
|
|
102
|
-
const
|
|
103
|
-
i0.ɵɵelementStart(0, "button",
|
|
104
|
-
i0.ɵɵlistener("click", function
|
|
105
|
-
i0.ɵɵtemplate(1,
|
|
140
|
+
function ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
142
|
+
i0.ɵɵelementStart(0, "button", 53);
|
|
143
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleShowAllCategories()); });
|
|
144
|
+
i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Conditional_2_Template, 2, 1);
|
|
106
145
|
i0.ɵɵelementEnd();
|
|
107
146
|
} if (rf & 2) {
|
|
108
147
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
109
148
|
i0.ɵɵadvance();
|
|
110
149
|
i0.ɵɵconditional(ctx_r2.showAllCategories ? 1 : 2);
|
|
111
150
|
} }
|
|
112
|
-
function
|
|
113
|
-
const
|
|
114
|
-
i0.ɵɵelementStart(0, "button",
|
|
115
|
-
i0.ɵɵlistener("click", function
|
|
116
|
-
i0.ɵɵelement(1, "i",
|
|
151
|
+
function ComponentStudioDashboardComponent_Conditional_37_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
152
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
153
|
+
i0.ɵɵelementStart(0, "button", 56);
|
|
154
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_37_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.clearCategoryFilters()); });
|
|
155
|
+
i0.ɵɵelement(1, "i", 57);
|
|
117
156
|
i0.ɵɵtext(2, " Clear ");
|
|
118
157
|
i0.ɵɵelementEnd();
|
|
119
158
|
} }
|
|
120
|
-
function
|
|
121
|
-
i0.ɵɵelementStart(0, "div",
|
|
122
|
-
i0.ɵɵrepeaterCreate(1,
|
|
123
|
-
i0.ɵɵtemplate(3,
|
|
159
|
+
function ComponentStudioDashboardComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
160
|
+
i0.ɵɵelementStart(0, "div", 26);
|
|
161
|
+
i0.ɵɵrepeaterCreate(1, ComponentStudioDashboardComponent_Conditional_37_For_2_Template, 5, 6, "button", 47, _forTrack0);
|
|
162
|
+
i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_37_Conditional_3_Template, 3, 1, "button", 48)(4, ComponentStudioDashboardComponent_Conditional_37_Conditional_4_Template, 3, 0, "button", 49);
|
|
124
163
|
i0.ɵɵelementEnd();
|
|
125
164
|
} if (rf & 2) {
|
|
126
165
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -131,284 +170,284 @@ function ComponentStudioDashboardComponent_Conditional_36_Template(rf, ctx) { if
|
|
|
131
170
|
i0.ɵɵadvance();
|
|
132
171
|
i0.ɵɵconditional(ctx_r2.selectedCategories.size > 0 ? 4 : -1);
|
|
133
172
|
} }
|
|
134
|
-
function
|
|
135
|
-
i0.ɵɵelement(0, "i",
|
|
173
|
+
function ComponentStudioDashboardComponent_ng_template_40_Template(rf, ctx) { if (rf & 1) {
|
|
174
|
+
i0.ɵɵelement(0, "i", 58);
|
|
136
175
|
} }
|
|
137
|
-
function
|
|
138
|
-
i0.ɵɵelementStart(0, "div",
|
|
139
|
-
i0.ɵɵelement(1, "i",
|
|
176
|
+
function ComponentStudioDashboardComponent_Conditional_42_Template(rf, ctx) { if (rf & 1) {
|
|
177
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
178
|
+
i0.ɵɵelement(1, "i", 59);
|
|
140
179
|
i0.ɵɵtext(2, " Loading components... ");
|
|
141
180
|
i0.ɵɵelementEnd();
|
|
142
181
|
} }
|
|
143
|
-
function
|
|
144
|
-
i0.ɵɵelementStart(0, "div",
|
|
145
|
-
i0.ɵɵelement(1, "i",
|
|
182
|
+
function ComponentStudioDashboardComponent_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
183
|
+
i0.ɵɵelementStart(0, "div", 32);
|
|
184
|
+
i0.ɵɵelement(1, "i", 60);
|
|
146
185
|
i0.ɵɵtext(2, " No components found without required custom properties. ");
|
|
147
186
|
i0.ɵɵelement(3, "br");
|
|
148
187
|
i0.ɵɵelementStart(4, "small");
|
|
149
188
|
i0.ɵɵtext(5, "Components with optional custom props can be tested, but not those with required props.");
|
|
150
189
|
i0.ɵɵelementEnd()();
|
|
151
190
|
} }
|
|
152
|
-
function
|
|
153
|
-
i0.ɵɵelement(0, "i",
|
|
191
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
192
|
+
i0.ɵɵelement(0, "i", 45);
|
|
154
193
|
} }
|
|
155
|
-
function
|
|
156
|
-
i0.ɵɵelement(0, "i",
|
|
194
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
195
|
+
i0.ɵɵelement(0, "i", 46);
|
|
157
196
|
} }
|
|
158
|
-
function
|
|
159
|
-
const
|
|
160
|
-
i0.ɵɵelementStart(0, "button",
|
|
161
|
-
i0.ɵɵlistener("click", function
|
|
162
|
-
i0.ɵɵtemplate(1,
|
|
197
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
198
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
199
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
200
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const component_r12 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleFavorite(component_r12, $event)); });
|
|
201
|
+
i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_1_Template, 1, 0, "i", 45)(2, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Conditional_2_Template, 1, 0, "i", 46);
|
|
163
202
|
i0.ɵɵelementEnd();
|
|
164
203
|
} if (rf & 2) {
|
|
165
|
-
const
|
|
204
|
+
const component_r12 = i0.ɵɵnextContext().$implicit;
|
|
166
205
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
167
|
-
i0.ɵɵclassProp("is-favorite", ctx_r2.isFavorite(
|
|
168
|
-
i0.ɵɵproperty("title", ctx_r2.isFavorite(
|
|
206
|
+
i0.ɵɵclassProp("is-favorite", ctx_r2.isFavorite(component_r12));
|
|
207
|
+
i0.ɵɵproperty("title", ctx_r2.isFavorite(component_r12) ? "Remove from favorites" : "Add to favorites");
|
|
169
208
|
i0.ɵɵadvance();
|
|
170
|
-
i0.ɵɵconditional(ctx_r2.isFavorite(
|
|
209
|
+
i0.ɵɵconditional(ctx_r2.isFavorite(component_r12) ? 1 : 2);
|
|
171
210
|
} }
|
|
172
|
-
function
|
|
173
|
-
i0.ɵɵelement(0, "i",
|
|
211
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
212
|
+
i0.ɵɵelement(0, "i", 40);
|
|
174
213
|
i0.ɵɵtext(1, " Text Import ");
|
|
175
214
|
} }
|
|
176
|
-
function
|
|
177
|
-
i0.ɵɵelement(0, "i",
|
|
215
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
216
|
+
i0.ɵɵelement(0, "i", 39);
|
|
178
217
|
i0.ɵɵtext(1);
|
|
179
218
|
} if (rf & 2) {
|
|
180
|
-
const
|
|
219
|
+
const component_r12 = i0.ɵɵnextContext(2).$implicit;
|
|
181
220
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
182
221
|
i0.ɵɵadvance();
|
|
183
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(
|
|
222
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentFilename(component_r12), " ");
|
|
184
223
|
} }
|
|
185
|
-
function
|
|
186
|
-
i0.ɵɵelementStart(0, "span",
|
|
187
|
-
i0.ɵɵtemplate(1,
|
|
224
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
225
|
+
i0.ɵɵelementStart(0, "span", 69);
|
|
226
|
+
i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Conditional_1_Template, 2, 0)(2, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Conditional_2_Template, 2, 1);
|
|
188
227
|
i0.ɵɵelementEnd();
|
|
189
228
|
} if (rf & 2) {
|
|
190
|
-
const
|
|
229
|
+
const component_r12 = i0.ɵɵnextContext().$implicit;
|
|
191
230
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
192
|
-
i0.ɵɵproperty("title", ctx_r2.getComponentStatus(
|
|
231
|
+
i0.ɵɵproperty("title", ctx_r2.getComponentStatus(component_r12) === "Text" ? "Imported from text input" : "Loaded from " + ctx_r2.getComponentFilename(component_r12));
|
|
193
232
|
i0.ɵɵadvance();
|
|
194
|
-
i0.ɵɵconditional(ctx_r2.getComponentStatus(
|
|
233
|
+
i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r12) === "Text" ? 1 : 2);
|
|
195
234
|
} }
|
|
196
|
-
function
|
|
197
|
-
i0.ɵɵelementStart(0, "span",
|
|
235
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
236
|
+
i0.ɵɵelementStart(0, "span", 81);
|
|
198
237
|
i0.ɵɵtext(1, "Text");
|
|
199
238
|
i0.ɵɵelementEnd();
|
|
200
239
|
} }
|
|
201
|
-
function
|
|
202
|
-
i0.ɵɵelementStart(0, "span",
|
|
240
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
241
|
+
i0.ɵɵelementStart(0, "span", 82);
|
|
203
242
|
i0.ɵɵtext(1, "File");
|
|
204
243
|
i0.ɵɵelementEnd();
|
|
205
244
|
} }
|
|
206
|
-
function
|
|
207
|
-
i0.ɵɵtemplate(0,
|
|
245
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
246
|
+
i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Conditional_0_Template, 2, 0, "span", 81)(1, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Conditional_1_Template, 2, 0, "span", 82);
|
|
208
247
|
} if (rf & 2) {
|
|
209
|
-
const
|
|
248
|
+
const component_r12 = i0.ɵɵnextContext().$implicit;
|
|
210
249
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
211
|
-
i0.ɵɵconditional(ctx_r2.getComponentStatus(
|
|
250
|
+
i0.ɵɵconditional(ctx_r2.getComponentStatus(component_r12) === "Text" ? 0 : 1);
|
|
212
251
|
} }
|
|
213
|
-
function
|
|
214
|
-
i0.ɵɵelementStart(0, "span",
|
|
252
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
253
|
+
i0.ɵɵelementStart(0, "span", 73);
|
|
215
254
|
i0.ɵɵtext(1, "Published");
|
|
216
255
|
i0.ɵɵelementEnd();
|
|
217
256
|
} }
|
|
218
|
-
function
|
|
219
|
-
i0.ɵɵelementStart(0, "span",
|
|
257
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
258
|
+
i0.ɵɵelementStart(0, "span", 74);
|
|
220
259
|
i0.ɵɵtext(1, "Draft");
|
|
221
260
|
i0.ɵɵelementEnd();
|
|
222
261
|
} }
|
|
223
|
-
function
|
|
224
|
-
i0.ɵɵelement(0, "i",
|
|
262
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
+
i0.ɵɵelement(0, "i", 54);
|
|
225
264
|
} }
|
|
226
|
-
function
|
|
227
|
-
i0.ɵɵelement(0, "i",
|
|
265
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
266
|
+
i0.ɵɵelement(0, "i", 55);
|
|
228
267
|
} }
|
|
229
|
-
function
|
|
230
|
-
i0.ɵɵelementStart(0, "div",
|
|
268
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
+
i0.ɵɵelementStart(0, "div", 83)(1, "label");
|
|
231
270
|
i0.ɵɵtext(2, "Description");
|
|
232
271
|
i0.ɵɵelementEnd();
|
|
233
272
|
i0.ɵɵelementStart(3, "p");
|
|
234
273
|
i0.ɵɵtext(4);
|
|
235
274
|
i0.ɵɵelementEnd()();
|
|
236
275
|
} if (rf & 2) {
|
|
237
|
-
const
|
|
276
|
+
const component_r12 = i0.ɵɵnextContext(2).$implicit;
|
|
238
277
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
239
278
|
i0.ɵɵadvance(4);
|
|
240
|
-
i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(
|
|
279
|
+
i0.ɵɵtextInterpolate(ctx_r2.getComponentDescription(component_r12));
|
|
241
280
|
} }
|
|
242
|
-
function
|
|
243
|
-
i0.ɵɵelementStart(0, "div",
|
|
281
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
282
|
+
i0.ɵɵelementStart(0, "div", 85)(1, "span", 86);
|
|
244
283
|
i0.ɵɵtext(2, "Loaded:");
|
|
245
284
|
i0.ɵɵelementEnd();
|
|
246
|
-
i0.ɵɵelementStart(3, "span",
|
|
285
|
+
i0.ɵɵelementStart(3, "span", 87);
|
|
247
286
|
i0.ɵɵtext(4);
|
|
248
287
|
i0.ɵɵpipe(5, "date");
|
|
249
288
|
i0.ɵɵelementEnd()();
|
|
250
289
|
} if (rf & 2) {
|
|
251
|
-
const
|
|
290
|
+
const component_r12 = i0.ɵɵnextContext(2).$implicit;
|
|
252
291
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
253
292
|
i0.ɵɵadvance(4);
|
|
254
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(
|
|
293
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentLoadedAt(component_r12), "short"));
|
|
255
294
|
} }
|
|
256
|
-
function
|
|
257
|
-
i0.ɵɵelementStart(0, "div",
|
|
295
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
296
|
+
i0.ɵɵelementStart(0, "div", 85)(1, "span", 86);
|
|
258
297
|
i0.ɵɵtext(2, "Updated:");
|
|
259
298
|
i0.ɵɵelementEnd();
|
|
260
|
-
i0.ɵɵelementStart(3, "span",
|
|
299
|
+
i0.ɵɵelementStart(3, "span", 87);
|
|
261
300
|
i0.ɵɵtext(4);
|
|
262
301
|
i0.ɵɵpipe(5, "date");
|
|
263
302
|
i0.ɵɵelementEnd()();
|
|
264
303
|
} if (rf & 2) {
|
|
265
|
-
const
|
|
304
|
+
const component_r12 = i0.ɵɵnextContext(2).$implicit;
|
|
266
305
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
267
306
|
i0.ɵɵadvance(4);
|
|
268
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(
|
|
307
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, ctx_r2.getComponentUpdatedAt(component_r12), "short"));
|
|
269
308
|
} }
|
|
270
|
-
function
|
|
271
|
-
const
|
|
309
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
310
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
272
311
|
i0.ɵɵelementStart(0, "button", 9);
|
|
273
|
-
i0.ɵɵlistener("click", function
|
|
274
|
-
i0.ɵɵelement(1, "span",
|
|
312
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_24_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.stopComponent(); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
313
|
+
i0.ɵɵelement(1, "span", 90);
|
|
275
314
|
i0.ɵɵtext(2, " Stop Component ");
|
|
276
315
|
i0.ɵɵelementEnd();
|
|
277
316
|
} if (rf & 2) {
|
|
278
317
|
i0.ɵɵproperty("themeColor", "error");
|
|
279
318
|
} }
|
|
280
|
-
function
|
|
281
|
-
const
|
|
282
|
-
i0.ɵɵelementStart(0, "button",
|
|
283
|
-
i0.ɵɵlistener("click", function
|
|
284
|
-
i0.ɵɵelement(1, "span",
|
|
319
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
320
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
321
|
+
i0.ɵɵelementStart(0, "button", 91);
|
|
322
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_25_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r15); const component_r12 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r12); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
323
|
+
i0.ɵɵelement(1, "span", 92);
|
|
285
324
|
i0.ɵɵtext(2, " Switch to This Component ");
|
|
286
325
|
i0.ɵɵelementEnd();
|
|
287
326
|
} if (rf & 2) {
|
|
288
327
|
i0.ɵɵproperty("themeColor", "base");
|
|
289
328
|
} }
|
|
290
|
-
function
|
|
291
|
-
const
|
|
329
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
330
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
292
331
|
i0.ɵɵelementStart(0, "button", 9);
|
|
293
|
-
i0.ɵɵlistener("click", function
|
|
294
|
-
i0.ɵɵelement(1, "span",
|
|
332
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_26_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r16); const component_r12 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r12); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
333
|
+
i0.ɵɵelement(1, "span", 92);
|
|
295
334
|
i0.ɵɵtext(2, " Run Component ");
|
|
296
335
|
i0.ɵɵelementEnd();
|
|
297
336
|
} if (rf & 2) {
|
|
298
337
|
i0.ɵɵproperty("themeColor", "primary");
|
|
299
338
|
} }
|
|
300
|
-
function
|
|
301
|
-
i0.ɵɵelementStart(0, "div",
|
|
302
|
-
i0.ɵɵtemplate(1,
|
|
303
|
-
i0.ɵɵelementStart(2, "div",
|
|
339
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
340
|
+
i0.ɵɵelementStart(0, "div", 79);
|
|
341
|
+
i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_1_Template, 5, 1, "div", 83);
|
|
342
|
+
i0.ɵɵelementStart(2, "div", 83)(3, "label");
|
|
304
343
|
i0.ɵɵtext(4, "Component Info");
|
|
305
344
|
i0.ɵɵelementEnd();
|
|
306
|
-
i0.ɵɵelementStart(5, "div",
|
|
345
|
+
i0.ɵɵelementStart(5, "div", 84)(6, "div", 85)(7, "span", 86);
|
|
307
346
|
i0.ɵɵtext(8, "Type:");
|
|
308
347
|
i0.ɵɵelementEnd();
|
|
309
|
-
i0.ɵɵelementStart(9, "span",
|
|
348
|
+
i0.ɵɵelementStart(9, "span", 87);
|
|
310
349
|
i0.ɵɵtext(10);
|
|
311
350
|
i0.ɵɵelementEnd()();
|
|
312
|
-
i0.ɵɵelementStart(11, "div",
|
|
351
|
+
i0.ɵɵelementStart(11, "div", 85)(12, "span", 86);
|
|
313
352
|
i0.ɵɵtext(13, "Version:");
|
|
314
353
|
i0.ɵɵelementEnd();
|
|
315
|
-
i0.ɵɵelementStart(14, "span",
|
|
354
|
+
i0.ɵɵelementStart(14, "span", 87);
|
|
316
355
|
i0.ɵɵtext(15);
|
|
317
356
|
i0.ɵɵelementEnd()();
|
|
318
|
-
i0.ɵɵelementStart(16, "div",
|
|
357
|
+
i0.ɵɵelementStart(16, "div", 85)(17, "span", 86);
|
|
319
358
|
i0.ɵɵtext(18, "Status:");
|
|
320
359
|
i0.ɵɵelementEnd();
|
|
321
|
-
i0.ɵɵelementStart(19, "span",
|
|
360
|
+
i0.ɵɵelementStart(19, "span", 87);
|
|
322
361
|
i0.ɵɵtext(20);
|
|
323
362
|
i0.ɵɵelementEnd()();
|
|
324
|
-
i0.ɵɵtemplate(21,
|
|
363
|
+
i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_21_Template, 6, 4, "div", 85)(22, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_22_Template, 6, 4, "div", 85);
|
|
325
364
|
i0.ɵɵelementEnd()();
|
|
326
|
-
i0.ɵɵelementStart(23, "div",
|
|
327
|
-
i0.ɵɵtemplate(24,
|
|
365
|
+
i0.ɵɵelementStart(23, "div", 88);
|
|
366
|
+
i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_24_Template, 3, 1, "button", 7)(25, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_25_Template, 3, 1, "button", 89)(26, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Conditional_26_Template, 3, 1, "button", 7);
|
|
328
367
|
i0.ɵɵelementEnd()();
|
|
329
368
|
} if (rf & 2) {
|
|
330
|
-
const
|
|
369
|
+
const component_r12 = i0.ɵɵnextContext().$implicit;
|
|
331
370
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
332
371
|
i0.ɵɵadvance();
|
|
333
|
-
i0.ɵɵconditional(ctx_r2.getComponentDescription(
|
|
372
|
+
i0.ɵɵconditional(ctx_r2.getComponentDescription(component_r12) ? 1 : -1);
|
|
334
373
|
i0.ɵɵadvance(9);
|
|
335
|
-
i0.ɵɵtextInterpolate(ctx_r2.getComponentType(
|
|
374
|
+
i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r12) || "Unknown");
|
|
336
375
|
i0.ɵɵadvance(5);
|
|
337
|
-
i0.ɵɵtextInterpolate(ctx_r2.getComponentVersion(
|
|
376
|
+
i0.ɵɵtextInterpolate(ctx_r2.getComponentVersion(component_r12));
|
|
338
377
|
i0.ɵɵadvance(5);
|
|
339
|
-
i0.ɵɵtextInterpolate(ctx_r2.getComponentStatus(
|
|
378
|
+
i0.ɵɵtextInterpolate(ctx_r2.getComponentStatus(component_r12) || "Draft");
|
|
340
379
|
i0.ɵɵadvance();
|
|
341
|
-
i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(
|
|
380
|
+
i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 21 : !ctx_r2.isFileLoadedComponent(component_r12) && ctx_r2.getComponentUpdatedAt(component_r12) ? 22 : -1);
|
|
342
381
|
i0.ɵɵadvance(3);
|
|
343
|
-
i0.ɵɵconditional(ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(
|
|
382
|
+
i0.ɵɵconditional(ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r12) && ctx_r2.isRunning ? 24 : ctx_r2.isRunning && ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) !== ctx_r2.getComponentId(component_r12) ? 25 : 26);
|
|
344
383
|
} }
|
|
345
|
-
function
|
|
346
|
-
const
|
|
347
|
-
i0.ɵɵelementStart(0, "div",
|
|
348
|
-
i0.ɵɵlistener("click", function
|
|
349
|
-
i0.ɵɵelementStart(2, "div",
|
|
350
|
-
i0.ɵɵelement(3, "i",
|
|
384
|
+
function ComponentStudioDashboardComponent_Conditional_44_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
385
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
386
|
+
i0.ɵɵelementStart(0, "div", 62)(1, "div", 63);
|
|
387
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_44_For_1_Template_div_click_1_listener() { const component_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleComponentExpansion(component_r12)); });
|
|
388
|
+
i0.ɵɵelementStart(2, "div", 64);
|
|
389
|
+
i0.ɵɵelement(3, "i", 65);
|
|
351
390
|
i0.ɵɵelementEnd();
|
|
352
|
-
i0.ɵɵtemplate(4,
|
|
353
|
-
i0.ɵɵelementStart(5, "div",
|
|
391
|
+
i0.ɵɵtemplate(4, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_4_Template, 3, 4, "button", 66);
|
|
392
|
+
i0.ɵɵelementStart(5, "div", 67)(6, "div", 68);
|
|
354
393
|
i0.ɵɵtext(7);
|
|
355
|
-
i0.ɵɵtemplate(8,
|
|
394
|
+
i0.ɵɵtemplate(8, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_8_Template, 3, 2, "span", 69);
|
|
356
395
|
i0.ɵɵelementEnd();
|
|
357
|
-
i0.ɵɵelementStart(9, "div",
|
|
396
|
+
i0.ɵɵelementStart(9, "div", 70)(10, "span", 71);
|
|
358
397
|
i0.ɵɵtext(11);
|
|
359
398
|
i0.ɵɵelementEnd();
|
|
360
|
-
i0.ɵɵelementStart(12, "span",
|
|
399
|
+
i0.ɵɵelementStart(12, "span", 72);
|
|
361
400
|
i0.ɵɵtext(13);
|
|
362
401
|
i0.ɵɵelementEnd();
|
|
363
|
-
i0.ɵɵtemplate(14,
|
|
402
|
+
i0.ɵɵtemplate(14, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_14_Template, 2, 1)(15, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_15_Template, 2, 0, "span", 73)(16, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_16_Template, 2, 0, "span", 74);
|
|
364
403
|
i0.ɵɵelementEnd();
|
|
365
|
-
i0.ɵɵelementStart(17, "div",
|
|
366
|
-
i0.ɵɵelement(19, "i",
|
|
404
|
+
i0.ɵɵelementStart(17, "div", 75)(18, "span", 76);
|
|
405
|
+
i0.ɵɵelement(19, "i", 77);
|
|
367
406
|
i0.ɵɵtext(20);
|
|
368
407
|
i0.ɵɵelementEnd()()();
|
|
369
|
-
i0.ɵɵelementStart(21, "div",
|
|
370
|
-
i0.ɵɵtemplate(22,
|
|
408
|
+
i0.ɵɵelementStart(21, "div", 78);
|
|
409
|
+
i0.ɵɵtemplate(22, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_22_Template, 1, 0, "i", 54)(23, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_23_Template, 1, 0, "i", 55);
|
|
371
410
|
i0.ɵɵelementEnd()();
|
|
372
|
-
i0.ɵɵtemplate(24,
|
|
411
|
+
i0.ɵɵtemplate(24, ComponentStudioDashboardComponent_Conditional_44_For_1_Conditional_24_Template, 27, 6, "div", 79);
|
|
373
412
|
i0.ɵɵelementEnd();
|
|
374
413
|
} if (rf & 2) {
|
|
375
|
-
const
|
|
414
|
+
const component_r12 = ctx.$implicit;
|
|
376
415
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
377
|
-
i0.ɵɵclassProp("expanded", ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(
|
|
416
|
+
i0.ɵɵclassProp("expanded", ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12))("running", ctx_r2.selectedComponent && ctx_r2.getComponentId(ctx_r2.selectedComponent) === ctx_r2.getComponentId(component_r12) && ctx_r2.isRunning)("file-loaded", ctx_r2.isFileLoadedComponent(component_r12));
|
|
378
417
|
i0.ɵɵadvance(2);
|
|
379
|
-
i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(ctx_r2.getComponentType(
|
|
418
|
+
i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(ctx_r2.getComponentType(component_r12)));
|
|
380
419
|
i0.ɵɵadvance();
|
|
381
|
-
i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(ctx_r2.getComponentType(
|
|
420
|
+
i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(ctx_r2.getComponentType(component_r12)));
|
|
382
421
|
i0.ɵɵadvance();
|
|
383
|
-
i0.ɵɵconditional(!ctx_r2.isFileLoadedComponent(
|
|
422
|
+
i0.ɵɵconditional(!ctx_r2.isFileLoadedComponent(component_r12) ? 4 : -1);
|
|
384
423
|
i0.ɵɵadvance(3);
|
|
385
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentName(
|
|
424
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.getComponentName(component_r12), " ");
|
|
386
425
|
i0.ɵɵadvance();
|
|
387
|
-
i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(
|
|
426
|
+
i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 8 : -1);
|
|
388
427
|
i0.ɵɵadvance(3);
|
|
389
|
-
i0.ɵɵtextInterpolate(ctx_r2.getComponentType(
|
|
428
|
+
i0.ɵɵtextInterpolate(ctx_r2.getComponentType(component_r12) || "Component");
|
|
390
429
|
i0.ɵɵadvance(2);
|
|
391
|
-
i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(
|
|
430
|
+
i0.ɵɵtextInterpolate1("v", ctx_r2.getComponentVersion(component_r12), "");
|
|
392
431
|
i0.ɵɵadvance();
|
|
393
|
-
i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(
|
|
432
|
+
i0.ɵɵconditional(ctx_r2.isFileLoadedComponent(component_r12) ? 14 : ctx_r2.getComponentStatus(component_r12) === "Published" ? 15 : 16);
|
|
394
433
|
i0.ɵɵadvance(4);
|
|
395
|
-
i0.ɵɵstyleProp("background-color", ctx_r2.getNamespaceColor(ctx_r2.getComponentNamespace(
|
|
396
|
-
i0.ɵɵproperty("title", ctx_r2.getComponentNamespace(
|
|
434
|
+
i0.ɵɵstyleProp("background-color", ctx_r2.getNamespaceColor(ctx_r2.getComponentNamespace(component_r12)));
|
|
435
|
+
i0.ɵɵproperty("title", ctx_r2.getComponentNamespace(component_r12) || "Uncategorized");
|
|
397
436
|
i0.ɵɵadvance(2);
|
|
398
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r2.formatNamespace(ctx_r2.getComponentNamespace(
|
|
437
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.formatNamespace(ctx_r2.getComponentNamespace(component_r12)), " ");
|
|
399
438
|
i0.ɵɵadvance(2);
|
|
400
|
-
i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(
|
|
439
|
+
i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ? 22 : 23);
|
|
401
440
|
i0.ɵɵadvance(2);
|
|
402
|
-
i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(
|
|
441
|
+
i0.ɵɵconditional(ctx_r2.expandedComponent && ctx_r2.getComponentId(ctx_r2.expandedComponent) === ctx_r2.getComponentId(component_r12) ? 24 : -1);
|
|
403
442
|
} }
|
|
404
|
-
function
|
|
405
|
-
i0.ɵɵrepeaterCreate(0,
|
|
443
|
+
function ComponentStudioDashboardComponent_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
444
|
+
i0.ɵɵrepeaterCreate(0, ComponentStudioDashboardComponent_Conditional_44_For_1_Template, 25, 21, "div", 61, _forTrack1, true);
|
|
406
445
|
} if (rf & 2) {
|
|
407
446
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
408
447
|
i0.ɵɵrepeater(ctx_r2.filteredComponents);
|
|
409
448
|
} }
|
|
410
|
-
function
|
|
411
|
-
i0.ɵɵelementStart(0, "details",
|
|
449
|
+
function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
450
|
+
i0.ɵɵelementStart(0, "details", 108)(1, "summary");
|
|
412
451
|
i0.ɵɵtext(2, "Technical Details (click to expand)");
|
|
413
452
|
i0.ɵɵelementEnd();
|
|
414
453
|
i0.ɵɵelementStart(3, "pre");
|
|
@@ -419,21 +458,21 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditio
|
|
|
419
458
|
i0.ɵɵadvance(4);
|
|
420
459
|
i0.ɵɵtextInterpolate(ctx_r2.formatTechnicalDetails(ctx_r2.currentError.technicalDetails));
|
|
421
460
|
} }
|
|
422
|
-
function
|
|
423
|
-
const
|
|
424
|
-
i0.ɵɵelementStart(0, "div",
|
|
425
|
-
i0.ɵɵelement(3, "i",
|
|
461
|
+
function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
462
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
463
|
+
i0.ɵɵelementStart(0, "div", 99)(1, "div", 101)(2, "div", 102);
|
|
464
|
+
i0.ɵɵelement(3, "i", 103);
|
|
426
465
|
i0.ɵɵelementStart(4, "h3");
|
|
427
466
|
i0.ɵɵtext(5, "Component Error");
|
|
428
467
|
i0.ɵɵelementEnd();
|
|
429
|
-
i0.ɵɵelementStart(6, "button",
|
|
430
|
-
i0.ɵɵlistener("click", function
|
|
431
|
-
i0.ɵɵelement(7, "i",
|
|
468
|
+
i0.ɵɵelementStart(6, "button", 104);
|
|
469
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.copyErrorToClipboard()); });
|
|
470
|
+
i0.ɵɵelement(7, "i", 105);
|
|
432
471
|
i0.ɵɵelementEnd()();
|
|
433
|
-
i0.ɵɵelementStart(8, "p",
|
|
472
|
+
i0.ɵɵelementStart(8, "p", 106);
|
|
434
473
|
i0.ɵɵtext(9, " The component could not be rendered due to the following error: ");
|
|
435
474
|
i0.ɵɵelementEnd();
|
|
436
|
-
i0.ɵɵelementStart(10, "div",
|
|
475
|
+
i0.ɵɵelementStart(10, "div", 107)(11, "strong");
|
|
437
476
|
i0.ɵɵtext(12, "Error Type:");
|
|
438
477
|
i0.ɵɵelementEnd();
|
|
439
478
|
i0.ɵɵtext(13);
|
|
@@ -442,9 +481,9 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditio
|
|
|
442
481
|
i0.ɵɵtext(16, "Message:");
|
|
443
482
|
i0.ɵɵelementEnd();
|
|
444
483
|
i0.ɵɵtext(17);
|
|
445
|
-
i0.ɵɵtemplate(18,
|
|
484
|
+
i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Conditional_18_Template, 5, 1, "details", 108);
|
|
446
485
|
i0.ɵɵelementEnd();
|
|
447
|
-
i0.ɵɵelementStart(19, "div",
|
|
486
|
+
i0.ɵɵelementStart(19, "div", 109)(20, "strong");
|
|
448
487
|
i0.ɵɵtext(21, "What to do:");
|
|
449
488
|
i0.ɵɵelementEnd();
|
|
450
489
|
i0.ɵɵelementStart(22, "ol")(23, "li");
|
|
@@ -459,14 +498,14 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditio
|
|
|
459
498
|
i0.ɵɵelementStart(29, "li");
|
|
460
499
|
i0.ɵɵtext(30, "Contact your system administrator if the issue persists");
|
|
461
500
|
i0.ɵɵelementEnd()()();
|
|
462
|
-
i0.ɵɵelementStart(31, "div",
|
|
463
|
-
i0.ɵɵlistener("click", function
|
|
464
|
-
i0.ɵɵelement(33, "span",
|
|
501
|
+
i0.ɵɵelementStart(31, "div", 110)(32, "button", 111);
|
|
502
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.retryComponent()); });
|
|
503
|
+
i0.ɵɵelement(33, "span", 112);
|
|
465
504
|
i0.ɵɵtext(34, " Retry ");
|
|
466
505
|
i0.ɵɵelementEnd();
|
|
467
506
|
i0.ɵɵelementStart(35, "button", 9);
|
|
468
|
-
i0.ɵɵlistener("click", function
|
|
469
|
-
i0.ɵɵelement(36, "span",
|
|
507
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.stopComponent()); });
|
|
508
|
+
i0.ɵɵelement(36, "span", 90);
|
|
470
509
|
i0.ɵɵtext(37, " Stop ");
|
|
471
510
|
i0.ɵɵelementEnd()()()();
|
|
472
511
|
} if (rf & 2) {
|
|
@@ -480,34 +519,34 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_3_Conditio
|
|
|
480
519
|
i0.ɵɵadvance(17);
|
|
481
520
|
i0.ɵɵproperty("themeColor", "error");
|
|
482
521
|
} }
|
|
483
|
-
function
|
|
484
|
-
const
|
|
485
|
-
i0.ɵɵelementStart(0, "mj-react-component",
|
|
486
|
-
i0.ɵɵlistener("componentEvent", function
|
|
522
|
+
function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
523
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
524
|
+
i0.ɵɵelementStart(0, "mj-react-component", 113);
|
|
525
|
+
i0.ɵɵlistener("componentEvent", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_1_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onComponentEvent($event)); })("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_1_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onOpenEntityRecord($event)); });
|
|
487
526
|
i0.ɵɵelementEnd();
|
|
488
527
|
} if (rf & 2) {
|
|
489
528
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
490
529
|
i0.ɵɵproperty("component", ctx_r2.componentSpec);
|
|
491
530
|
} }
|
|
492
|
-
function
|
|
493
|
-
i0.ɵɵtemplate(0,
|
|
531
|
+
function ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
532
|
+
i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_0_Template, 38, 4, "div", 99)(1, ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Conditional_1_Template, 1, 1, "mj-react-component", 100);
|
|
494
533
|
} if (rf & 2) {
|
|
495
534
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
496
535
|
i0.ɵɵconditional(ctx_r2.currentError ? 0 : 1);
|
|
497
536
|
} }
|
|
498
|
-
function
|
|
499
|
-
const
|
|
500
|
-
i0.ɵɵelementStart(0, "div",
|
|
501
|
-
i0.ɵɵelement(1, "i",
|
|
537
|
+
function ComponentStudioDashboardComponent_Conditional_47_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
538
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
539
|
+
i0.ɵɵelementStart(0, "div", 95);
|
|
540
|
+
i0.ɵɵelement(1, "i", 114);
|
|
502
541
|
i0.ɵɵelementStart(2, "h3");
|
|
503
542
|
i0.ɵɵtext(3);
|
|
504
543
|
i0.ɵɵelementEnd();
|
|
505
544
|
i0.ɵɵelementStart(4, "p");
|
|
506
545
|
i0.ɵɵtext(5);
|
|
507
546
|
i0.ɵɵelementEnd();
|
|
508
|
-
i0.ɵɵelementStart(6, "button",
|
|
509
|
-
i0.ɵɵlistener("click", function
|
|
510
|
-
i0.ɵɵelement(7, "span",
|
|
547
|
+
i0.ɵɵelementStart(6, "button", 115);
|
|
548
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_Conditional_4_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.runComponent(ctx_r2.selectedComponent)); });
|
|
549
|
+
i0.ɵɵelement(7, "span", 92);
|
|
511
550
|
i0.ɵɵtext(8, " Run Component ");
|
|
512
551
|
i0.ɵɵelementEnd()();
|
|
513
552
|
} if (rf & 2) {
|
|
@@ -519,43 +558,43 @@ function ComponentStudioDashboardComponent_Conditional_46_Conditional_4_Template
|
|
|
519
558
|
i0.ɵɵadvance();
|
|
520
559
|
i0.ɵɵproperty("themeColor", "primary")("size", "large");
|
|
521
560
|
} }
|
|
522
|
-
function
|
|
523
|
-
const
|
|
561
|
+
function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
562
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
524
563
|
i0.ɵɵelementStart(0, "button", 9);
|
|
525
|
-
i0.ɵɵlistener("click", function
|
|
526
|
-
i0.ɵɵelement(1, "span",
|
|
564
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applySpecChanges()); });
|
|
565
|
+
i0.ɵɵelement(1, "span", 122);
|
|
527
566
|
i0.ɵɵtext(2, " Apply Changes ");
|
|
528
567
|
i0.ɵɵelementEnd();
|
|
529
|
-
i0.ɵɵelementStart(3, "button",
|
|
530
|
-
i0.ɵɵlistener("click", function
|
|
531
|
-
i0.ɵɵelement(4, "span",
|
|
568
|
+
i0.ɵɵelementStart(3, "button", 111);
|
|
569
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
|
|
570
|
+
i0.ɵɵelement(4, "span", 57);
|
|
532
571
|
i0.ɵɵtext(5, " Cancel ");
|
|
533
572
|
i0.ɵɵelementEnd();
|
|
534
573
|
} if (rf & 2) {
|
|
535
574
|
i0.ɵɵproperty("themeColor", "primary");
|
|
536
575
|
} }
|
|
537
|
-
function
|
|
538
|
-
const
|
|
576
|
+
function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
577
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
539
578
|
i0.ɵɵelementStart(0, "button", 9);
|
|
540
|
-
i0.ɵɵlistener("click", function
|
|
541
|
-
i0.ɵɵelement(1, "span",
|
|
579
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
|
|
580
|
+
i0.ɵɵelement(1, "span", 15);
|
|
542
581
|
i0.ɵɵtext(2, " Refresh Component ");
|
|
543
582
|
i0.ɵɵelementEnd();
|
|
544
583
|
} if (rf & 2) {
|
|
545
584
|
i0.ɵɵproperty("themeColor", "info");
|
|
546
585
|
} }
|
|
547
|
-
function
|
|
548
|
-
const
|
|
549
|
-
i0.ɵɵelementStart(0, "div",
|
|
550
|
-
i0.ɵɵelement(3, "i",
|
|
586
|
+
function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template(rf, ctx) { if (rf & 1) {
|
|
587
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
588
|
+
i0.ɵɵelementStart(0, "div", 116)(1, "div", 117)(2, "h4");
|
|
589
|
+
i0.ɵɵelement(3, "i", 118);
|
|
551
590
|
i0.ɵɵtext(4, " Component Specification (JSON)");
|
|
552
591
|
i0.ɵɵelementEnd();
|
|
553
|
-
i0.ɵɵelementStart(5, "div",
|
|
554
|
-
i0.ɵɵtemplate(6,
|
|
592
|
+
i0.ɵɵelementStart(5, "div", 119);
|
|
593
|
+
i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Conditional_7_Template, 3, 1, "button", 7);
|
|
555
594
|
i0.ɵɵelementEnd()();
|
|
556
|
-
i0.ɵɵelementStart(8, "div",
|
|
557
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
558
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
595
|
+
i0.ɵɵelementStart(8, "div", 120)(9, "mj-code-editor", 121);
|
|
596
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.editableSpec, $event) || (ctx_r2.editableSpec = $event); return i0.ɵɵresetView($event); });
|
|
597
|
+
i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template_mj_code_editor_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onSpecChange($event)); });
|
|
559
598
|
i0.ɵɵelementEnd()()();
|
|
560
599
|
} if (rf & 2) {
|
|
561
600
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -567,58 +606,58 @@ function ComponentStudioDashboardComponent_Conditional_46_ng_template_9_Template
|
|
|
567
606
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.editableSpec);
|
|
568
607
|
i0.ɵɵproperty("language", "json")("readonly", false);
|
|
569
608
|
} }
|
|
570
|
-
function
|
|
571
|
-
const
|
|
609
|
+
function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
610
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
572
611
|
i0.ɵɵelementStart(0, "button", 9);
|
|
573
|
-
i0.ɵɵlistener("click", function
|
|
574
|
-
i0.ɵɵelement(1, "span",
|
|
612
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.applyCodeChanges()); });
|
|
613
|
+
i0.ɵɵelement(1, "span", 122);
|
|
575
614
|
i0.ɵɵtext(2, " Apply Changes ");
|
|
576
615
|
i0.ɵɵelementEnd();
|
|
577
|
-
i0.ɵɵelementStart(3, "button",
|
|
578
|
-
i0.ɵɵlistener("click", function
|
|
579
|
-
i0.ɵɵelement(4, "span",
|
|
616
|
+
i0.ɵɵelementStart(3, "button", 111);
|
|
617
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.initializeEditors()); });
|
|
618
|
+
i0.ɵɵelement(4, "span", 57);
|
|
580
619
|
i0.ɵɵtext(5, " Cancel ");
|
|
581
620
|
i0.ɵɵelementEnd();
|
|
582
621
|
} if (rf & 2) {
|
|
583
622
|
i0.ɵɵproperty("themeColor", "primary");
|
|
584
623
|
} }
|
|
585
|
-
function
|
|
586
|
-
const
|
|
624
|
+
function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
625
|
+
const _r25 = i0.ɵɵgetCurrentView();
|
|
587
626
|
i0.ɵɵelementStart(0, "button", 9);
|
|
588
|
-
i0.ɵɵlistener("click", function
|
|
589
|
-
i0.ɵɵelement(1, "span",
|
|
627
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.refreshComponent()); });
|
|
628
|
+
i0.ɵɵelement(1, "span", 15);
|
|
590
629
|
i0.ɵɵtext(2, " Refresh Component ");
|
|
591
630
|
i0.ɵɵelementEnd();
|
|
592
631
|
} if (rf & 2) {
|
|
593
632
|
i0.ɵɵproperty("themeColor", "info");
|
|
594
633
|
} }
|
|
595
|
-
function
|
|
596
|
-
const
|
|
597
|
-
i0.ɵɵelementStart(0, "mj-code-editor",
|
|
598
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
634
|
+
function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
635
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
636
|
+
i0.ɵɵelementStart(0, "mj-code-editor", 128);
|
|
637
|
+
i0.ɵɵlistener("ngModelChange", function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_ng_template_1_Template_mj_code_editor_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r26); const ɵ$index_511_r27 = i0.ɵɵnextContext().$index; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onCodeSectionChange($event, ɵ$index_511_r27)); });
|
|
599
638
|
i0.ɵɵelementEnd();
|
|
600
639
|
} if (rf & 2) {
|
|
601
|
-
const
|
|
602
|
-
i0.ɵɵproperty("ngModel",
|
|
640
|
+
const section_r28 = i0.ɵɵnextContext().$implicit;
|
|
641
|
+
i0.ɵɵproperty("ngModel", section_r28.code)("language", "javascript")("readonly", false);
|
|
603
642
|
} }
|
|
604
|
-
function
|
|
605
|
-
i0.ɵɵelementStart(0, "kendo-panelbar-item",
|
|
606
|
-
i0.ɵɵtemplate(1,
|
|
643
|
+
function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
644
|
+
i0.ɵɵelementStart(0, "kendo-panelbar-item", 126);
|
|
645
|
+
i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_ng_template_1_Template, 1, 3, "ng-template", 127);
|
|
607
646
|
i0.ɵɵelementEnd();
|
|
608
647
|
} if (rf & 2) {
|
|
609
|
-
const
|
|
610
|
-
i0.ɵɵproperty("title",
|
|
648
|
+
const section_r28 = ctx.$implicit;
|
|
649
|
+
i0.ɵɵproperty("title", section_r28.title)("expanded", section_r28.expanded);
|
|
611
650
|
} }
|
|
612
|
-
function
|
|
613
|
-
i0.ɵɵelementStart(0, "div",
|
|
614
|
-
i0.ɵɵelement(3, "i",
|
|
651
|
+
function ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Template(rf, ctx) { if (rf & 1) {
|
|
652
|
+
i0.ɵɵelementStart(0, "div", 123)(1, "div", 117)(2, "h4");
|
|
653
|
+
i0.ɵɵelement(3, "i", 124);
|
|
615
654
|
i0.ɵɵtext(4, " Component Code (JavaScript/React)");
|
|
616
655
|
i0.ɵɵelementEnd();
|
|
617
|
-
i0.ɵɵelementStart(5, "div",
|
|
618
|
-
i0.ɵɵtemplate(6,
|
|
656
|
+
i0.ɵɵelementStart(5, "div", 119);
|
|
657
|
+
i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_6_Template, 6, 1)(7, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Conditional_7_Template, 3, 1, "button", 7);
|
|
619
658
|
i0.ɵɵelementEnd()();
|
|
620
|
-
i0.ɵɵelementStart(8, "div",
|
|
621
|
-
i0.ɵɵrepeaterCreate(10,
|
|
659
|
+
i0.ɵɵelementStart(8, "div", 120)(9, "kendo-panelbar", 125);
|
|
660
|
+
i0.ɵɵrepeaterCreate(10, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_For_11_Template, 2, 2, "kendo-panelbar-item", 126, _forTrack2);
|
|
622
661
|
i0.ɵɵelementEnd()()();
|
|
623
662
|
} if (rf & 2) {
|
|
624
663
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -629,21 +668,21 @@ function ComponentStudioDashboardComponent_Conditional_46_ng_template_11_Templat
|
|
|
629
668
|
i0.ɵɵadvance(3);
|
|
630
669
|
i0.ɵɵrepeater(ctx_r2.getComponentCodeSections());
|
|
631
670
|
} }
|
|
632
|
-
function
|
|
633
|
-
function
|
|
634
|
-
const
|
|
635
|
-
i0.ɵɵelementStart(0, "kendo-splitter",
|
|
636
|
-
i0.ɵɵtemplate(3,
|
|
671
|
+
function ComponentStudioDashboardComponent_Conditional_47_Conditional_12_Template(rf, ctx) { }
|
|
672
|
+
function ComponentStudioDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
673
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
674
|
+
i0.ɵɵelementStart(0, "kendo-splitter", 17)(1, "kendo-splitter-pane", 93)(2, "div", 94);
|
|
675
|
+
i0.ɵɵtemplate(3, ComponentStudioDashboardComponent_Conditional_47_Conditional_3_Template, 2, 1)(4, ComponentStudioDashboardComponent_Conditional_47_Conditional_4_Template, 9, 4, "div", 95);
|
|
637
676
|
i0.ɵɵelementEnd()();
|
|
638
|
-
i0.ɵɵelementStart(5, "kendo-splitter-pane",
|
|
639
|
-
i0.ɵɵlistener("tabSelect", function
|
|
640
|
-
i0.ɵɵelementStart(8, "kendo-tabstrip-tab",
|
|
641
|
-
i0.ɵɵtemplate(9,
|
|
677
|
+
i0.ɵɵelementStart(5, "kendo-splitter-pane", 93)(6, "div")(7, "kendo-tabstrip", 96);
|
|
678
|
+
i0.ɵɵlistener("tabSelect", function ComponentStudioDashboardComponent_Conditional_47_Template_kendo_tabstrip_tabSelect_7_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTabSelect($event)); });
|
|
679
|
+
i0.ɵɵelementStart(8, "kendo-tabstrip-tab", 97);
|
|
680
|
+
i0.ɵɵtemplate(9, ComponentStudioDashboardComponent_Conditional_47_ng_template_9_Template, 10, 5, "ng-template", 98);
|
|
642
681
|
i0.ɵɵelementEnd();
|
|
643
|
-
i0.ɵɵelementStart(10, "kendo-tabstrip-tab",
|
|
644
|
-
i0.ɵɵtemplate(11,
|
|
682
|
+
i0.ɵɵelementStart(10, "kendo-tabstrip-tab", 97);
|
|
683
|
+
i0.ɵɵtemplate(11, ComponentStudioDashboardComponent_Conditional_47_ng_template_11_Template, 12, 2, "ng-template", 98);
|
|
645
684
|
i0.ɵɵelementEnd()()()()();
|
|
646
|
-
i0.ɵɵtemplate(12,
|
|
685
|
+
i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_47_Conditional_12_Template, 0, 0);
|
|
647
686
|
} if (rf & 2) {
|
|
648
687
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
649
688
|
i0.ɵɵadvance();
|
|
@@ -659,9 +698,9 @@ function ComponentStudioDashboardComponent_Conditional_46_Template(rf, ctx) { if
|
|
|
659
698
|
i0.ɵɵadvance(2);
|
|
660
699
|
i0.ɵɵconditional(!ctx_r2.isDetailsPaneCollapsed ? 12 : -1);
|
|
661
700
|
} }
|
|
662
|
-
function
|
|
663
|
-
i0.ɵɵelementStart(0, "div",
|
|
664
|
-
i0.ɵɵelement(1, "i",
|
|
701
|
+
function ComponentStudioDashboardComponent_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
702
|
+
i0.ɵɵelementStart(0, "div", 35);
|
|
703
|
+
i0.ɵɵelement(1, "i", 129);
|
|
665
704
|
i0.ɵɵelementStart(2, "h2");
|
|
666
705
|
i0.ɵɵtext(3, "Ready to Test Components");
|
|
667
706
|
i0.ɵɵelementEnd();
|
|
@@ -707,8 +746,9 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
|
|
|
707
746
|
lastEditSource = null;
|
|
708
747
|
// File input element reference
|
|
709
748
|
fileInput;
|
|
710
|
-
//
|
|
749
|
+
// Dropdown states
|
|
711
750
|
importDropdownOpen = false;
|
|
751
|
+
exportDropdownOpen = false;
|
|
712
752
|
// Text import dialog reference
|
|
713
753
|
textImportDialog;
|
|
714
754
|
destroy$ = new Subject();
|
|
@@ -1059,13 +1099,18 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
|
|
|
1059
1099
|
}
|
|
1060
1100
|
}
|
|
1061
1101
|
startComponent(component) {
|
|
1102
|
+
// Clear registries BEFORE starting new component for fresh load
|
|
1103
|
+
if (!this.isRunning) {
|
|
1104
|
+
// Only clear if not already running (switching components handles this in stopComponent)
|
|
1105
|
+
MJReactComponent.forceClearRegistries();
|
|
1106
|
+
}
|
|
1062
1107
|
this.selectedComponent = component;
|
|
1063
1108
|
this.componentSpec = this.getComponentSpec(component);
|
|
1064
1109
|
this.isRunning = true;
|
|
1065
1110
|
this.currentError = null; // Clear any previous errors
|
|
1066
1111
|
this.isDetailsPaneCollapsed = true; // Start with details collapsed
|
|
1067
1112
|
this.initializeEditors(); // Initialize spec and code editors
|
|
1068
|
-
console.log('Running component:', this.getComponentName(component));
|
|
1113
|
+
console.log('Running component (fresh):', this.getComponentName(component));
|
|
1069
1114
|
try {
|
|
1070
1115
|
this.cdr.detectChanges();
|
|
1071
1116
|
}
|
|
@@ -1078,6 +1123,9 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
|
|
|
1078
1123
|
this.selectedComponent = null;
|
|
1079
1124
|
this.componentSpec = null;
|
|
1080
1125
|
this.currentError = null;
|
|
1126
|
+
// CLEAR ALL REGISTRIES for fresh component loads
|
|
1127
|
+
MJReactComponent.forceClearRegistries();
|
|
1128
|
+
console.log('Component Studio: Cleared all registries for fresh component testing');
|
|
1081
1129
|
try {
|
|
1082
1130
|
this.cdr.detectChanges();
|
|
1083
1131
|
}
|
|
@@ -1156,17 +1204,34 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1156
1204
|
// Import handling methods
|
|
1157
1205
|
toggleImportDropdown() {
|
|
1158
1206
|
this.importDropdownOpen = !this.importDropdownOpen;
|
|
1207
|
+
// Close export dropdown if open
|
|
1208
|
+
if (this.importDropdownOpen) {
|
|
1209
|
+
this.exportDropdownOpen = false;
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
toggleExportDropdown() {
|
|
1213
|
+
this.exportDropdownOpen = !this.exportDropdownOpen;
|
|
1214
|
+
// Close import dropdown if open
|
|
1215
|
+
if (this.exportDropdownOpen) {
|
|
1216
|
+
this.importDropdownOpen = false;
|
|
1217
|
+
}
|
|
1159
1218
|
}
|
|
1160
1219
|
closeImportDropdown() {
|
|
1161
1220
|
this.importDropdownOpen = false;
|
|
1162
1221
|
}
|
|
1163
1222
|
onDocumentClick(event) {
|
|
1164
|
-
// Close
|
|
1223
|
+
// Close dropdowns if clicking outside
|
|
1165
1224
|
const target = event.target;
|
|
1166
|
-
|
|
1167
|
-
|
|
1225
|
+
// Check import dropdown
|
|
1226
|
+
const importDropdown = target.closest('.import-dropdown');
|
|
1227
|
+
if (!importDropdown && this.importDropdownOpen) {
|
|
1168
1228
|
this.importDropdownOpen = false;
|
|
1169
1229
|
}
|
|
1230
|
+
// Check export dropdown
|
|
1231
|
+
const exportDropdown = target.closest('.export-dropdown');
|
|
1232
|
+
if (!exportDropdown && this.exportDropdownOpen) {
|
|
1233
|
+
this.exportDropdownOpen = false;
|
|
1234
|
+
}
|
|
1170
1235
|
}
|
|
1171
1236
|
importFromFile() {
|
|
1172
1237
|
this.closeImportDropdown();
|
|
@@ -1380,6 +1445,9 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1380
1445
|
this.editableCode = parsed.code || '// No code available';
|
|
1381
1446
|
// Rebuild code sections from updated spec
|
|
1382
1447
|
this.buildCodeSections();
|
|
1448
|
+
// Clear registries to ensure fresh component load
|
|
1449
|
+
MJReactComponent.forceClearRegistries();
|
|
1450
|
+
console.log('Cleared registries after applying spec changes');
|
|
1383
1451
|
// If component is running, update it without full refresh
|
|
1384
1452
|
if (this.isRunning) {
|
|
1385
1453
|
this.updateRunningComponent();
|
|
@@ -1432,6 +1500,9 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1432
1500
|
}
|
|
1433
1501
|
// Update the runtime spec
|
|
1434
1502
|
this.componentSpec = spec;
|
|
1503
|
+
// Clear registries to ensure fresh component load
|
|
1504
|
+
MJReactComponent.forceClearRegistries();
|
|
1505
|
+
console.log('Cleared registries after applying code changes');
|
|
1435
1506
|
// If component is running, update it without full refresh
|
|
1436
1507
|
if (this.isRunning) {
|
|
1437
1508
|
this.updateRunningComponent();
|
|
@@ -1537,6 +1608,203 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1537
1608
|
// Both tabs now need initialization since there's no separate Run tab
|
|
1538
1609
|
this.initializeEditors();
|
|
1539
1610
|
}
|
|
1611
|
+
/**
|
|
1612
|
+
* Export the current component to an artifact
|
|
1613
|
+
*/
|
|
1614
|
+
async exportToArtifact() {
|
|
1615
|
+
console.log('exportToArtifact called');
|
|
1616
|
+
if (!this.selectedComponent || !this.componentSpec) {
|
|
1617
|
+
console.error('No component selected or spec available');
|
|
1618
|
+
return;
|
|
1619
|
+
}
|
|
1620
|
+
console.log('Component and spec available, proceeding...');
|
|
1621
|
+
// Close the dropdown
|
|
1622
|
+
this.exportDropdownOpen = false;
|
|
1623
|
+
// Small delay to ensure dropdown is closed before opening dialog
|
|
1624
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
1625
|
+
// Get the current spec - use edited version if available
|
|
1626
|
+
let currentSpec;
|
|
1627
|
+
// Check if user has made edits
|
|
1628
|
+
if (this.isEditingSpec || this.isEditingCode) {
|
|
1629
|
+
// Parse the edited spec to get the latest version
|
|
1630
|
+
try {
|
|
1631
|
+
currentSpec = JSON.parse(this.editableSpec);
|
|
1632
|
+
}
|
|
1633
|
+
catch (parseError) {
|
|
1634
|
+
console.error('Invalid JSON in spec editor, using original spec');
|
|
1635
|
+
currentSpec = this.componentSpec;
|
|
1636
|
+
}
|
|
1637
|
+
}
|
|
1638
|
+
else {
|
|
1639
|
+
currentSpec = this.componentSpec;
|
|
1640
|
+
}
|
|
1641
|
+
// Open the artifact selection dialog
|
|
1642
|
+
console.log('Opening artifact selection dialog...');
|
|
1643
|
+
let result;
|
|
1644
|
+
try {
|
|
1645
|
+
const dialogRef = this.dialogService.open({
|
|
1646
|
+
content: ArtifactSelectionDialogComponent,
|
|
1647
|
+
width: 1200, // Increased from 1000px by 200px
|
|
1648
|
+
height: 900, // Keep same height
|
|
1649
|
+
appendTo: this.viewContainerRef
|
|
1650
|
+
});
|
|
1651
|
+
console.log('Dialog opened, waiting for result...');
|
|
1652
|
+
result = await dialogRef.result.toPromise();
|
|
1653
|
+
console.log('Dialog result:', result);
|
|
1654
|
+
}
|
|
1655
|
+
catch (error) {
|
|
1656
|
+
console.error('Error opening dialog:', error);
|
|
1657
|
+
return;
|
|
1658
|
+
}
|
|
1659
|
+
if (!result || !result.action) {
|
|
1660
|
+
console.log('User cancelled dialog');
|
|
1661
|
+
// User cancelled
|
|
1662
|
+
return;
|
|
1663
|
+
}
|
|
1664
|
+
try {
|
|
1665
|
+
const artifact = result.artifact;
|
|
1666
|
+
let version;
|
|
1667
|
+
let lastVersion;
|
|
1668
|
+
if (result.action === 'update-version' && result.versionToUpdate) {
|
|
1669
|
+
// Load and update existing version
|
|
1670
|
+
lastVersion = result.versionToUpdate; // set to the same version as we'll grab its Configuration to parse lower down in the code
|
|
1671
|
+
version = result.versionToUpdate;
|
|
1672
|
+
}
|
|
1673
|
+
else {
|
|
1674
|
+
// Create new version
|
|
1675
|
+
version = await this.metadata.GetEntityObject('MJ: Conversation Artifact Versions');
|
|
1676
|
+
version.ConversationArtifactID = artifact.ID;
|
|
1677
|
+
// Get next version number
|
|
1678
|
+
const rv = new RunView();
|
|
1679
|
+
const versionsResult = await rv.RunView({
|
|
1680
|
+
EntityName: 'MJ: Conversation Artifact Versions',
|
|
1681
|
+
ExtraFilter: `ConversationArtifactID = '${artifact.ID}'`,
|
|
1682
|
+
OrderBy: 'Version DESC',
|
|
1683
|
+
MaxRows: 1,
|
|
1684
|
+
ResultType: 'entity_object'
|
|
1685
|
+
});
|
|
1686
|
+
if (versionsResult.Success && versionsResult.Results && versionsResult.Results.length > 0) {
|
|
1687
|
+
lastVersion = versionsResult.Results[0];
|
|
1688
|
+
version.Version = versionsResult.Results[0].Version + 1;
|
|
1689
|
+
}
|
|
1690
|
+
else {
|
|
1691
|
+
throw new Error('No previous version found');
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1694
|
+
// Store the complete spec in Configuration field
|
|
1695
|
+
const fullResponse = JSON.parse(lastVersion.Configuration);
|
|
1696
|
+
fullResponse.componentOptions = [
|
|
1697
|
+
{
|
|
1698
|
+
AIRank: 1,
|
|
1699
|
+
AIRankExplanation: "",
|
|
1700
|
+
UserRankExplanation: "",
|
|
1701
|
+
name: currentSpec.name,
|
|
1702
|
+
option: currentSpec,
|
|
1703
|
+
UserRank: 1
|
|
1704
|
+
}
|
|
1705
|
+
];
|
|
1706
|
+
version.Configuration = JSON.stringify(fullResponse, null, 2);
|
|
1707
|
+
// Add version comments
|
|
1708
|
+
const timestamp = new Date().toISOString();
|
|
1709
|
+
const actionText = result.action === 'update-version' ? 'Updated' : 'Created';
|
|
1710
|
+
version.Comments = `${actionText} from Component Studio at ${timestamp}`;
|
|
1711
|
+
const versionSaveResult = await version.Save();
|
|
1712
|
+
if (versionSaveResult) {
|
|
1713
|
+
const componentName = this.getComponentName(this.selectedComponent);
|
|
1714
|
+
console.log(`✅ Saved ${componentName} as artifact version ${version.Version}`);
|
|
1715
|
+
MJNotificationService.Instance.CreateSimpleNotification(`${componentName} has been saved as artifact version ${version.Version}.`, 'success', 3500);
|
|
1716
|
+
}
|
|
1717
|
+
else {
|
|
1718
|
+
console.error('Failed to save artifact version:', version.LatestResult?.Message);
|
|
1719
|
+
MJNotificationService.Instance.CreateSimpleNotification('Failed to save artifact version. Check console for details.', 'error', 5000);
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
catch (error) {
|
|
1723
|
+
console.error('Error saving to artifact:', error);
|
|
1724
|
+
MJNotificationService.Instance.CreateSimpleNotification('Error saving component to artifact. Check console for details.', 'error', 5000);
|
|
1725
|
+
}
|
|
1726
|
+
}
|
|
1727
|
+
/**
|
|
1728
|
+
* Export the current component to a file
|
|
1729
|
+
*/
|
|
1730
|
+
exportToFile() {
|
|
1731
|
+
if (!this.selectedComponent || !this.componentSpec) {
|
|
1732
|
+
console.error('No component selected or spec available');
|
|
1733
|
+
return;
|
|
1734
|
+
}
|
|
1735
|
+
// Close the dropdown
|
|
1736
|
+
this.exportDropdownOpen = false;
|
|
1737
|
+
// Get the current spec - use edited version if available
|
|
1738
|
+
let currentSpec;
|
|
1739
|
+
if (this.isEditingSpec || this.isEditingCode) {
|
|
1740
|
+
try {
|
|
1741
|
+
currentSpec = JSON.parse(this.editableSpec);
|
|
1742
|
+
}
|
|
1743
|
+
catch (parseError) {
|
|
1744
|
+
console.error('Invalid JSON in spec editor, using original spec');
|
|
1745
|
+
currentSpec = this.componentSpec;
|
|
1746
|
+
}
|
|
1747
|
+
}
|
|
1748
|
+
else {
|
|
1749
|
+
currentSpec = this.componentSpec;
|
|
1750
|
+
}
|
|
1751
|
+
// Create filename from component name - replace spaces and special chars with dashes
|
|
1752
|
+
const componentName = this.getComponentName(this.selectedComponent);
|
|
1753
|
+
const filename = componentName.replace(/\s+/g, '-').replace(/[^a-z0-9\-]/gi, '-').toLowerCase() + '.json';
|
|
1754
|
+
// Create a blob with the JSON content
|
|
1755
|
+
const jsonContent = JSON.stringify(currentSpec, null, 2);
|
|
1756
|
+
const blob = new Blob([jsonContent], { type: 'application/json' });
|
|
1757
|
+
// Create download link
|
|
1758
|
+
const url = URL.createObjectURL(blob);
|
|
1759
|
+
const link = document.createElement('a');
|
|
1760
|
+
link.href = url;
|
|
1761
|
+
link.download = filename;
|
|
1762
|
+
// Trigger download
|
|
1763
|
+
document.body.appendChild(link);
|
|
1764
|
+
link.click();
|
|
1765
|
+
// Cleanup
|
|
1766
|
+
document.body.removeChild(link);
|
|
1767
|
+
URL.revokeObjectURL(url);
|
|
1768
|
+
console.log(`✅ Exported ${componentName} to ${filename}`);
|
|
1769
|
+
}
|
|
1770
|
+
/**
|
|
1771
|
+
* Export the current component to clipboard
|
|
1772
|
+
*/
|
|
1773
|
+
async exportToClipboard() {
|
|
1774
|
+
if (!this.selectedComponent || !this.componentSpec) {
|
|
1775
|
+
console.error('No component selected or spec available');
|
|
1776
|
+
return;
|
|
1777
|
+
}
|
|
1778
|
+
// Close the dropdown
|
|
1779
|
+
this.exportDropdownOpen = false;
|
|
1780
|
+
// Get the current spec - use edited version if available
|
|
1781
|
+
let currentSpec;
|
|
1782
|
+
if (this.isEditingSpec || this.isEditingCode) {
|
|
1783
|
+
try {
|
|
1784
|
+
currentSpec = JSON.parse(this.editableSpec);
|
|
1785
|
+
}
|
|
1786
|
+
catch (parseError) {
|
|
1787
|
+
console.error('Invalid JSON in spec editor, using original spec');
|
|
1788
|
+
currentSpec = this.componentSpec;
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
else {
|
|
1792
|
+
currentSpec = this.componentSpec;
|
|
1793
|
+
}
|
|
1794
|
+
// Copy to clipboard
|
|
1795
|
+
const jsonContent = JSON.stringify(currentSpec, null, 2);
|
|
1796
|
+
try {
|
|
1797
|
+
await navigator.clipboard.writeText(jsonContent);
|
|
1798
|
+
const componentName = this.getComponentName(this.selectedComponent);
|
|
1799
|
+
console.log(`✅ Copied ${componentName} spec to clipboard`);
|
|
1800
|
+
// Show success message (you could add a toast/notification here)
|
|
1801
|
+
alert('Component specification copied to clipboard!');
|
|
1802
|
+
}
|
|
1803
|
+
catch (error) {
|
|
1804
|
+
console.error('Failed to copy to clipboard:', error);
|
|
1805
|
+
alert('Failed to copy to clipboard. Please try again.');
|
|
1806
|
+
}
|
|
1807
|
+
}
|
|
1540
1808
|
static ɵfac = function ComponentStudioDashboardComponent_Factory(t) { return new (t || ComponentStudioDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); };
|
|
1541
1809
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentStudioDashboardComponent, selectors: [["mj-component-studio-dashboard"]], viewQuery: function ComponentStudioDashboardComponent_Query(rf, ctx) { if (rf & 1) {
|
|
1542
1810
|
i0.ɵɵviewQuery(_c0, 5);
|
|
@@ -1545,7 +1813,7 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1545
1813
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fileInput = _t.first);
|
|
1546
1814
|
} }, hostBindings: function ComponentStudioDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1547
1815
|
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, false, i0.ɵɵresolveDocument);
|
|
1548
|
-
} }, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
1816
|
+
} }, features: [i0.ɵɵInheritDefinitionFeature], decls: 49, vars: 21, consts: [["fileInput", ""], [1, "component-studio"], [1, "dashboard-header"], [1, "header-content"], [1, "fa-solid", "fa-puzzle-piece"], [1, "header-subtitle"], [1, "header-buttons"], ["kendoButton", "", 3, "themeColor"], [1, "import-dropdown"], ["kendoButton", "", 3, "click", "themeColor"], [1, "fa-solid", "fa-file-import"], [1, "fa-solid", "fa-chevron-down", 2, "margin-left", "5px", "font-size", "10px"], [1, "dropdown-menu"], [1, "export-dropdown", 3, "open"], ["kendoButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-sync"], ["type", "file", "accept", ".json", 2, "display", "none", 3, "change"], ["orientation", "horizontal"], [3, "min", "max", "size"], [1, "components-panel"], [1, "panel-header"], [1, "panel-header-top"], [1, "header-actions"], ["title", "Show only favorites", 1, "favorites-toggle", 3, "click"], [1, "component-count"], [1, "category-filters"], [1, "filter-pills"], [1, "search-box"], ["placeholder", "Search components...", 3, "valueChange", "value", "clearButton"], ["kendoTextBoxPrefixTemplate", ""], [1, "components-list"], [1, "loading-message"], [1, "empty-message"], [3, "min"], [1, "component-display"], [1, "empty-state"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-eye-slash"], [1, "dropdown-item", 3, "click"], [1, "fa-solid", "fa-file"], [1, "fa-solid", "fa-keyboard"], [1, "export-dropdown"], [1, "fa-solid", "fa-file-export"], [1, "fa-solid", "fa-save"], [1, "fa-solid", "fa-clipboard"], [1, "fa-solid", "fa-star"], [1, "fa-regular", "fa-star"], [1, "category-pill", 3, "active", "--pill-color"], [1, "more-button"], [1, "clear-filters-button"], [1, "category-pill", 3, "click"], [1, "pill-name"], [1, "pill-count"], [1, "more-button", 3, "click"], [1, "fa-solid", "fa-chevron-up"], [1, "fa-solid", "fa-chevron-down"], [1, "clear-filters-button", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-search"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-info-circle"], [1, "component-card", 3, "expanded", "running", "file-loaded"], [1, "component-card"], [1, "card-header", 3, "click"], [1, "card-icon"], [1, "fa-solid", 3, "ngClass"], [1, "favorite-btn", 3, "is-favorite", "title"], [1, "card-info"], [1, "card-name"], [1, "file-badge", 3, "title"], [1, "card-meta"], [1, "card-type"], [1, "card-version"], [1, "status-badge", "published"], [1, "status-badge", "draft"], [1, "card-namespace"], [1, "namespace-chip", 3, "title"], [1, "fa-solid", "fa-folder-tree"], [1, "card-chevron"], [1, "card-details"], [1, "favorite-btn", 3, "click", "title"], [1, "status-badge", "text"], [1, "status-badge", "file"], [1, "detail-section"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], [1, "card-actions"], ["kendoButton", "", "title", "Stop current component and run this one", 3, "themeColor"], [1, "fa-solid", "fa-stop"], ["kendoButton", "", "title", "Stop current component and run this one", 3, "click", "themeColor"], [1, "fa-solid", "fa-play"], [3, "size"], [1, "component-runtime"], [1, "run-empty-state"], [1, "editor-tabs", 3, "tabSelect"], [3, "title", "selected"], ["kendoTabContent", ""], [1, "error-display"], [3, "component"], [1, "error-container"], [1, "error-header"], [1, "fa-solid", "fa-exclamation-triangle"], ["title", "Copy error details", 1, "copy-button", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "error-intro"], [1, "error-details"], [1, "technical-details"], [1, "error-help"], [1, "error-actions"], ["kendoButton", "", 3, "click"], [1, "fa-solid", "fa-rotate"], [3, "componentEvent", "openEntityRecord", "component"], [1, "fa-solid", "fa-play-circle", "fa-3x"], ["kendoButton", "", 3, "click", "themeColor", "size"], [1, "tab-content", "spec-tab"], [1, "editor-header"], [1, "fa-solid", "fa-code"], [1, "editor-actions"], [1, "editor-wrapper"], [2, "height", "100%", "width", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"], [1, "fa-solid", "fa-check"], [1, "tab-content", "code-tab"], [1, "fa-solid", "fa-file-code"], [1, "code-sections"], [3, "title", "expanded"], ["kendoPanelBarContent", ""], [2, "height", "400px", "width", "100%", 3, "ngModelChange", "ngModel", "language", "readonly"], [1, "fa-solid", "fa-rocket", "fa-3x"]], template: function ComponentStudioDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1549
1817
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
1550
1818
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "div")(4, "h1");
|
|
1551
1819
|
i0.ɵɵelement(5, "i", 4);
|
|
@@ -1564,36 +1832,37 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1564
1832
|
i0.ɵɵelementEnd();
|
|
1565
1833
|
i0.ɵɵtemplate(16, ComponentStudioDashboardComponent_Conditional_16_Template, 7, 0, "div", 12);
|
|
1566
1834
|
i0.ɵɵelementEnd();
|
|
1567
|
-
i0.ɵɵ
|
|
1568
|
-
i0.ɵɵ
|
|
1569
|
-
i0.ɵɵ
|
|
1570
|
-
i0.ɵɵ
|
|
1835
|
+
i0.ɵɵtemplate(17, ComponentStudioDashboardComponent_Conditional_17_Template, 6, 4, "div", 13);
|
|
1836
|
+
i0.ɵɵelementStart(18, "button", 14);
|
|
1837
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.refreshData()); });
|
|
1838
|
+
i0.ɵɵelement(19, "span", 15);
|
|
1839
|
+
i0.ɵɵtext(20, " Refresh ");
|
|
1571
1840
|
i0.ɵɵelementEnd()();
|
|
1572
|
-
i0.ɵɵelementStart(
|
|
1573
|
-
i0.ɵɵlistener("change", function
|
|
1841
|
+
i0.ɵɵelementStart(21, "input", 16, 0);
|
|
1842
|
+
i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Template_input_change_21_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleFileSelect($event)); });
|
|
1574
1843
|
i0.ɵɵelementEnd()()();
|
|
1575
|
-
i0.ɵɵelementStart(
|
|
1576
|
-
i0.ɵɵtext(
|
|
1844
|
+
i0.ɵɵelementStart(23, "kendo-splitter", 17)(24, "kendo-splitter-pane", 18)(25, "div", 19)(26, "div", 20)(27, "div", 21)(28, "h3");
|
|
1845
|
+
i0.ɵɵtext(29, "Components");
|
|
1577
1846
|
i0.ɵɵelementEnd();
|
|
1578
|
-
i0.ɵɵelementStart(
|
|
1579
|
-
i0.ɵɵlistener("click", function
|
|
1580
|
-
i0.ɵɵtemplate(
|
|
1847
|
+
i0.ɵɵelementStart(30, "div", 22)(31, "button", 23);
|
|
1848
|
+
i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_31_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowOnlyFavorites()); });
|
|
1849
|
+
i0.ɵɵtemplate(32, ComponentStudioDashboardComponent_Conditional_32_Template, 2, 0)(33, ComponentStudioDashboardComponent_Conditional_33_Template, 2, 0);
|
|
1581
1850
|
i0.ɵɵelementEnd();
|
|
1582
|
-
i0.ɵɵelementStart(
|
|
1583
|
-
i0.ɵɵtext(
|
|
1851
|
+
i0.ɵɵelementStart(34, "span", 24);
|
|
1852
|
+
i0.ɵɵtext(35);
|
|
1584
1853
|
i0.ɵɵelementEnd()()();
|
|
1585
|
-
i0.ɵɵelementStart(
|
|
1586
|
-
i0.ɵɵtemplate(
|
|
1854
|
+
i0.ɵɵelementStart(36, "div", 25);
|
|
1855
|
+
i0.ɵɵtemplate(37, ComponentStudioDashboardComponent_Conditional_37_Template, 5, 2, "div", 26);
|
|
1587
1856
|
i0.ɵɵelementEnd();
|
|
1588
|
-
i0.ɵɵelementStart(
|
|
1589
|
-
i0.ɵɵlistener("valueChange", function
|
|
1590
|
-
i0.ɵɵtemplate(
|
|
1857
|
+
i0.ɵɵelementStart(38, "div", 27)(39, "kendo-textbox", 28);
|
|
1858
|
+
i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Template_kendo_textbox_valueChange_39_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
|
|
1859
|
+
i0.ɵɵtemplate(40, ComponentStudioDashboardComponent_ng_template_40_Template, 1, 0, "ng-template", 29);
|
|
1591
1860
|
i0.ɵɵelementEnd()()();
|
|
1592
|
-
i0.ɵɵelementStart(
|
|
1593
|
-
i0.ɵɵtemplate(
|
|
1861
|
+
i0.ɵɵelementStart(41, "div", 30);
|
|
1862
|
+
i0.ɵɵtemplate(42, ComponentStudioDashboardComponent_Conditional_42_Template, 3, 0, "div", 31)(43, ComponentStudioDashboardComponent_Conditional_43_Template, 6, 0, "div", 32)(44, ComponentStudioDashboardComponent_Conditional_44_Template, 2, 0);
|
|
1594
1863
|
i0.ɵɵelementEnd()()();
|
|
1595
|
-
i0.ɵɵelementStart(
|
|
1596
|
-
i0.ɵɵtemplate(
|
|
1864
|
+
i0.ɵɵelementStart(45, "kendo-splitter-pane", 33)(46, "div", 34);
|
|
1865
|
+
i0.ɵɵtemplate(47, ComponentStudioDashboardComponent_Conditional_47_Template, 13, 8)(48, ComponentStudioDashboardComponent_Conditional_48_Template, 6, 0, "div", 35);
|
|
1597
1866
|
i0.ɵɵelementEnd()()()();
|
|
1598
1867
|
} if (rf & 2) {
|
|
1599
1868
|
i0.ɵɵadvance(10);
|
|
@@ -1605,26 +1874,28 @@ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify
|
|
|
1605
1874
|
i0.ɵɵadvance(4);
|
|
1606
1875
|
i0.ɵɵconditional(ctx.importDropdownOpen ? 16 : -1);
|
|
1607
1876
|
i0.ɵɵadvance();
|
|
1877
|
+
i0.ɵɵconditional(ctx.selectedComponent && ctx.isRunning ? 17 : -1);
|
|
1878
|
+
i0.ɵɵadvance();
|
|
1608
1879
|
i0.ɵɵproperty("disabled", ctx.isLoading);
|
|
1609
1880
|
i0.ɵɵadvance(6);
|
|
1610
1881
|
i0.ɵɵproperty("min", "350px")("max", "650px")("size", "400px");
|
|
1611
1882
|
i0.ɵɵadvance(7);
|
|
1612
1883
|
i0.ɵɵclassProp("active", ctx.showOnlyFavorites);
|
|
1613
1884
|
i0.ɵɵadvance();
|
|
1614
|
-
i0.ɵɵconditional(ctx.showOnlyFavorites ?
|
|
1885
|
+
i0.ɵɵconditional(ctx.showOnlyFavorites ? 32 : 33);
|
|
1615
1886
|
i0.ɵɵadvance(3);
|
|
1616
1887
|
i0.ɵɵtextInterpolate2("", ctx.filteredComponents.length, " of ", ctx.allComponents.length, "");
|
|
1617
1888
|
i0.ɵɵadvance(2);
|
|
1618
|
-
i0.ɵɵconditional(ctx.availableCategories.length > 0 ?
|
|
1889
|
+
i0.ɵɵconditional(ctx.availableCategories.length > 0 ? 37 : -1);
|
|
1619
1890
|
i0.ɵɵadvance(2);
|
|
1620
1891
|
i0.ɵɵproperty("value", ctx.searchQuery)("clearButton", true);
|
|
1621
1892
|
i0.ɵɵadvance(3);
|
|
1622
|
-
i0.ɵɵconditional(ctx.isLoading ?
|
|
1893
|
+
i0.ɵɵconditional(ctx.isLoading ? 42 : ctx.filteredComponents.length === 0 ? 43 : 44);
|
|
1623
1894
|
i0.ɵɵadvance(3);
|
|
1624
1895
|
i0.ɵɵproperty("min", "400px");
|
|
1625
1896
|
i0.ɵɵadvance(2);
|
|
1626
|
-
i0.ɵɵconditional(ctx.selectedComponent ?
|
|
1627
|
-
} }, dependencies: [i2.NgClass, i3.NgControlStatus, i3.NgModel, i4.TextBoxComponent, i4.TextBoxPrefixTemplateDirective, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.SplitterComponent, i5.SplitterPaneComponent, i5.TabStripComponent, i5.TabStripTabComponent, i5.TabContentDirective, i6.CodeEditorComponent, i7.ButtonComponent, i8.MJReactComponent, i2.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n \n .import-dropdown {\n position: relative;\n \n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 180px;\n \n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #212529;\n transition: background-color 0.2s;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:not(:last-child) {\n border-bottom: 1px solid #e9ecef;\n }\n \n i {\n width: 16px;\n text-align: center;\n color: #6366f1;\n }\n }\n }\n }\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n .panel-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n \n h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n \n .favorites-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n &.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n \n i {\n color: #ffc107;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .component-count {\n font-size: 13px;\n color: #6c757d;\n background: #f8f9fa;\n padding: 4px 10px;\n border-radius: 12px;\n font-weight: 500;\n }\n }\n }\n \n .category-filters {\n margin-bottom: 16px;\n \n .filter-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n \n .category-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &.active {\n border-color: var(--pill-color);\n background: var(--pill-color);\n color: white;\n \n .pill-count {\n background: rgba(255, 255, 255, 0.3);\n color: white;\n }\n }\n \n .pill-name {\n font-weight: 500;\n }\n \n .pill-count {\n background: #f1f3f5;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n }\n \n .more-button,\n .clear-filters-button {\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n i {\n font-size: 11px;\n margin-right: 4px;\n }\n }\n \n .clear-filters-button {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n \n &:hover {\n background: #fca5a5;\n color: white;\n }\n }\n }\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .favorite-btn {\n position: absolute;\n top: 12px;\n right: 48px; // Leave room for chevron\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n transform: scale(1.1);\n }\n \n &.is-favorite {\n color: #ffc107;\n border-color: #ffc107;\n background: #fff3cd;\n \n &:hover {\n background: #ffe69c;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n \n &.text {\n background: #f3e8ff;\n color: #6b21a8;\n }\n }\n }\n \n .card-namespace {\n margin-top: 8px;\n \n .namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: white;\n \n i {\n font-size: 11px;\n opacity: 0.9;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n//[_ngcontent-%COMP%] Removed[_ngcontent-%COMP%] tree[_ngcontent-%COMP%] view[_ngcontent-%COMP%] styles[_ngcontent-%COMP%] -[_ngcontent-%COMP%] using[_ngcontent-%COMP%] modern[_ngcontent-%COMP%] category[_ngcontent-%COMP%] filters[_ngcontent-%COMP%] instead\n\n@keyframes[_ngcontent-%COMP%] slideDown[_ngcontent-%COMP%] {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] });
|
|
1897
|
+
i0.ɵɵconditional(ctx.selectedComponent ? 47 : 48);
|
|
1898
|
+
} }, dependencies: [i2.NgClass, i3.NgControlStatus, i3.NgModel, i4.TextBoxComponent, i4.TextBoxPrefixTemplateDirective, i5.PanelBarComponent, i5.PanelBarItemComponent, i5.PanelBarContentDirective, i5.SplitterComponent, i5.SplitterPaneComponent, i5.TabStripComponent, i5.TabStripTabComponent, i5.TabContentDirective, i6.CodeEditorComponent, i7.ButtonComponent, i8.MJReactComponent, i2.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n \n .import-dropdown, .export-dropdown {\n position: relative;\n \n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 180px;\n \n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #212529;\n transition: background-color 0.2s;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:not(:last-child) {\n border-bottom: 1px solid #e9ecef;\n }\n \n i {\n width: 16px;\n text-align: center;\n color: #6366f1;\n }\n }\n }\n }\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n .panel-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n \n h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n \n .favorites-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n &.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n \n i {\n color: #ffc107;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .component-count {\n font-size: 13px;\n color: #6c757d;\n background: #f8f9fa;\n padding: 4px 10px;\n border-radius: 12px;\n font-weight: 500;\n }\n }\n }\n \n .category-filters {\n margin-bottom: 16px;\n \n .filter-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n \n .category-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &.active {\n border-color: var(--pill-color);\n background: var(--pill-color);\n color: white;\n \n .pill-count {\n background: rgba(255, 255, 255, 0.3);\n color: white;\n }\n }\n \n .pill-name {\n font-weight: 500;\n }\n \n .pill-count {\n background: #f1f3f5;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n }\n \n .more-button,\n .clear-filters-button {\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n i {\n font-size: 11px;\n margin-right: 4px;\n }\n }\n \n .clear-filters-button {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n \n &:hover {\n background: #fca5a5;\n color: white;\n }\n }\n }\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .favorite-btn {\n position: absolute;\n top: 12px;\n right: 48px; // Leave room for chevron\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n transform: scale(1.1);\n }\n \n &.is-favorite {\n color: #ffc107;\n border-color: #ffc107;\n background: #fff3cd;\n \n &:hover {\n background: #ffe69c;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n \n &.text {\n background: #f3e8ff;\n color: #6b21a8;\n }\n }\n }\n \n .card-namespace {\n margin-top: 8px;\n \n .namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: white;\n \n i {\n font-size: 11px;\n opacity: 0.9;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n//[_ngcontent-%COMP%] Removed[_ngcontent-%COMP%] tree[_ngcontent-%COMP%] view[_ngcontent-%COMP%] styles[_ngcontent-%COMP%] -[_ngcontent-%COMP%] using[_ngcontent-%COMP%] modern[_ngcontent-%COMP%] category[_ngcontent-%COMP%] filters[_ngcontent-%COMP%] instead\n\n@keyframes[_ngcontent-%COMP%] slideDown[_ngcontent-%COMP%] {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] });
|
|
1628
1899
|
};
|
|
1629
1900
|
ComponentStudioDashboardComponent = __decorate([
|
|
1630
1901
|
RegisterClass(BaseDashboard, 'ComponentStudioDashboard')
|
|
@@ -1632,7 +1903,7 @@ ComponentStudioDashboardComponent = __decorate([
|
|
|
1632
1903
|
export { ComponentStudioDashboardComponent };
|
|
1633
1904
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentStudioDashboardComponent, [{
|
|
1634
1905
|
type: Component,
|
|
1635
|
-
args: [{ selector: 'mj-component-studio-dashboard', template: "<div class=\"component-studio\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-content\">\n <div>\n <h1><i class=\"fa-solid fa-puzzle-piece\"></i> Component Studio</h1>\n <p class=\"header-subtitle\">Testing components without required custom properties</p>\n </div>\n <div class=\"header-buttons\">\n @if (selectedComponent && isRunning) {\n <button kendoButton (click)=\"toggleDetailsPane()\" [themeColor]=\"'base'\">\n @if (isDetailsPaneCollapsed) {\n <span class=\"fa-solid fa-eye\"></span> Show Details\n } @else {\n <span class=\"fa-solid fa-eye-slash\"></span> Hide Details\n }\n </button>\n }\n <div class=\"import-dropdown\" [class.open]=\"importDropdownOpen\">\n <button kendoButton (click)=\"toggleImportDropdown()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-file-import\"></span> Import\n <span class=\"fa-solid fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px;\"></span>\n </button>\n @if (importDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"importFromFile()\">\n <i class=\"fa-solid fa-file\"></i> Import from File\n </button>\n <button class=\"dropdown-item\" (click)=\"importFromText()\">\n <i class=\"fa-solid fa-keyboard\"></i> Import from Text\n </button>\n </div>\n }\n </div>\n <button kendoButton (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <span class=\"fa-solid fa-sync\"></span> Refresh\n </button>\n </div>\n <!-- Hidden file input -->\n <input #fileInput type=\"file\" accept=\".json\" (change)=\"handleFileSelect($event)\" style=\"display: none;\" />\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <kendo-splitter orientation=\"horizontal\">\n <!-- Left Panel - Component List -->\n <kendo-splitter-pane [min]=\"'350px'\" [max]=\"'650px'\" [size]=\"'400px'\">\n <div class=\"components-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header-top\">\n <h3>Components</h3>\n <div class=\"header-actions\">\n <button \n class=\"favorites-toggle\"\n [class.active]=\"showOnlyFavorites\"\n (click)=\"toggleShowOnlyFavorites()\"\n title=\"Show only favorites\">\n @if (showOnlyFavorites) {\n <i class=\"fa-solid fa-star\"></i> Favorites\n } @else {\n <i class=\"fa-regular fa-star\"></i> All\n }\n </button>\n <span class=\"component-count\">{{ filteredComponents.length }} of {{ allComponents.length }}</span>\n </div>\n </div>\n \n <!-- Modern Category Filter Pills -->\n <div class=\"category-filters\">\n @if (availableCategories.length > 0) {\n <div class=\"filter-pills\">\n @for (category of getVisibleCategories(); track category.name) {\n <button \n class=\"category-pill\"\n [class.active]=\"isCategorySelected(category.name)\"\n [style.--pill-color]=\"category.color\"\n (click)=\"toggleCategory(category.name)\">\n <span class=\"pill-name\">{{ category.name }}</span>\n <span class=\"pill-count\">{{ category.count }}</span>\n </button>\n }\n @if (availableCategories.length > 5) {\n <button \n class=\"more-button\"\n (click)=\"toggleShowAllCategories()\">\n @if (showAllCategories) {\n <i class=\"fa-solid fa-chevron-up\"></i> Less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> +{{ availableCategories.length - 5 }} more\n }\n </button>\n }\n @if (selectedCategories.size > 0) {\n <button \n class=\"clear-filters-button\"\n (click)=\"clearCategoryFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear\n </button>\n }\n </div>\n }\n </div>\n \n <div class=\"search-box\">\n <kendo-textbox \n [value]=\"searchQuery\"\n (valueChange)=\"onSearchChange($event)\"\n placeholder=\"Search components...\"\n [clearButton]=\"true\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n </div>\n \n <div class=\"components-list\">\n @if (isLoading) {\n <div class=\"loading-message\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading components...\n </div>\n } @else if (filteredComponents.length === 0) {\n <div class=\"empty-message\">\n <i class=\"fa-solid fa-info-circle\"></i> No components found without required custom properties.\n <br>\n <small>Components with optional custom props can be tested, but not those with required props.</small>\n </div>\n } @else {\n <!-- Component Cards -->\n @for (component of filteredComponents; track getComponentId(component)) {\n <div class=\"component-card\" \n [class.expanded]=\"expandedComponent && getComponentId(expandedComponent) === getComponentId(component)\"\n [class.running]=\"selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning\"\n [class.file-loaded]=\"isFileLoadedComponent(component)\">\n \n <!-- Card Header - Always visible -->\n <div class=\"card-header\" (click)=\"toggleComponentExpansion(component)\">\n <div class=\"card-icon\" [style.color]=\"getComponentTypeColor(getComponentType(component))\">\n <i class=\"fa-solid\" [ngClass]=\"getComponentTypeIcon(getComponentType(component))\"></i>\n </div>\n @if (!isFileLoadedComponent(component)) {\n <button \n class=\"favorite-btn\"\n [class.is-favorite]=\"isFavorite(component)\"\n (click)=\"toggleFavorite(component, $event)\"\n [title]=\"isFavorite(component) ? 'Remove from favorites' : 'Add to favorites'\">\n @if (isFavorite(component)) {\n <i class=\"fa-solid fa-star\"></i>\n } @else {\n <i class=\"fa-regular fa-star\"></i>\n }\n </button>\n }\n <div class=\"card-info\">\n <div class=\"card-name\">\n {{ getComponentName(component) }}\n @if (isFileLoadedComponent(component)) {\n <span class=\"file-badge\" [title]=\"getComponentStatus(component) === 'Text' ? 'Imported from text input' : 'Loaded from ' + getComponentFilename(component)\">\n @if (getComponentStatus(component) === 'Text') {\n <i class=\"fa-solid fa-keyboard\"></i> Text Import\n } @else {\n <i class=\"fa-solid fa-file\"></i> {{ getComponentFilename(component) }}\n }\n </span>\n }\n </div>\n <div class=\"card-meta\">\n <span class=\"card-type\">{{ getComponentType(component) || 'Component' }}</span>\n <span class=\"card-version\">v{{ getComponentVersion(component) }}</span>\n @if (isFileLoadedComponent(component)) {\n @if (getComponentStatus(component) === 'Text') {\n <span class=\"status-badge text\">Text</span>\n } @else {\n <span class=\"status-badge file\">File</span>\n }\n } @else if (getComponentStatus(component) === 'Published') {\n <span class=\"status-badge published\">Published</span>\n } @else {\n <span class=\"status-badge draft\">Draft</span>\n }\n </div>\n <!-- Namespace chip with color coding -->\n <div class=\"card-namespace\">\n <span class=\"namespace-chip\" \n [style.background-color]=\"getNamespaceColor(getComponentNamespace(component))\"\n [title]=\"getComponentNamespace(component) || 'Uncategorized'\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{ formatNamespace(getComponentNamespace(component)) }}\n </span>\n </div>\n </div>\n <div class=\"card-chevron\">\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(component)) {\n <i class=\"fa-solid fa-chevron-up\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n \n <!-- Card Details - Only visible when expanded -->\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(component)) {\n <div class=\"card-details\">\n @if (getComponentDescription(component)) {\n <div class=\"detail-section\">\n <label>Description</label>\n <p>{{ getComponentDescription(component) }}</p>\n </div>\n }\n \n <div class=\"detail-section\">\n <label>Component Info</label>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Type:</span>\n <span class=\"info-value\">{{ getComponentType(component) || 'Unknown' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Version:</span>\n <span class=\"info-value\">{{ getComponentVersion(component) }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Status:</span>\n <span class=\"info-value\">{{ getComponentStatus(component) || 'Draft' }}</span>\n </div>\n @if (isFileLoadedComponent(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Loaded:</span>\n <span class=\"info-value\">{{ getComponentLoadedAt(component) | date:'short' }}</span>\n </div>\n } @else if (!isFileLoadedComponent(component) && getComponentUpdatedAt(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Updated:</span>\n <span class=\"info-value\">{{ getComponentUpdatedAt(component) | date:'short' }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"card-actions\">\n @if (selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning) {\n <button kendoButton \n [themeColor]=\"'error'\"\n (click)=\"stopComponent(); $event.stopPropagation()\">\n <span class=\"fa-solid fa-stop\"></span> Stop Component\n </button>\n } @else if (isRunning && selectedComponent && getComponentId(selectedComponent) !== getComponentId(component)) {\n <button kendoButton \n [themeColor]=\"'base'\"\n title=\"Stop current component and run this one\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Switch to This Component\n </button>\n } @else {\n <button kendoButton \n [themeColor]=\"'primary'\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Right Panel - Component Display with Editor Splitter -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <div class=\"component-display\">\n @if (selectedComponent) {\n <kendo-splitter orientation=\"horizontal\">\n <kendo-splitter-pane [size]=\"isDetailsPaneCollapsed ? '100%' : '50%'\">\n <div class=\"component-runtime\">\n @if (isRunning && componentSpec) {\n @if (currentError) {\n <!-- Error Display -->\n <div class=\"error-display\">\n <div class=\"error-container\">\n <div class=\"error-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <h3>Component Error</h3>\n <button class=\"copy-button\" (click)=\"copyErrorToClipboard()\" title=\"Copy error details\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n \n <p class=\"error-intro\">\n The component could not be rendered due to the following error:\n </p>\n \n <div class=\"error-details\">\n <strong>Error Type:</strong> {{ currentError.type }}<br>\n <strong>Message:</strong> {{ currentError.message }}\n @if (currentError.technicalDetails) {\n <details class=\"technical-details\">\n <summary>Technical Details (click to expand)</summary>\n <pre>{{ formatTechnicalDetails(currentError.technicalDetails) }}</pre>\n </details>\n }\n </div>\n \n <div class=\"error-help\">\n <strong>What to do:</strong>\n <ol>\n <li>Check that the component code is valid JavaScript/React</li>\n <li>Ensure all required dependencies are available</li>\n <li>Review the technical details for specific error information</li>\n <li>Contact your system administrator if the issue persists</li>\n </ol>\n </div>\n \n <div class=\"error-actions\">\n <button kendoButton (click)=\"retryComponent()\">\n <span class=\"fa-solid fa-rotate\"></span> Retry\n </button>\n <button kendoButton (click)=\"stopComponent()\" [themeColor]=\"'error'\">\n <span class=\"fa-solid fa-stop\"></span> Stop\n </button>\n </div>\n </div>\n </div>\n } @else {\n <!-- React Component -->\n <mj-react-component \n [component]=\"componentSpec\"\n (componentEvent)=\"onComponentEvent($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-react-component>\n }\n } @else {\n <!-- Component Not Running State -->\n <div class=\"run-empty-state\">\n <i class=\"fa-solid fa-play-circle fa-3x\"></i>\n <h3>Component: {{ getComponentName(selectedComponent) }}</h3>\n <p>{{ getComponentDescription(selectedComponent) || 'No description available' }}</p>\n <button kendoButton [themeColor]=\"'primary'\" [size]=\"'large'\" (click)=\"runComponent(selectedComponent)\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n </div>\n }\n </div>\n\n </kendo-splitter-pane>\n <kendo-splitter-pane [size]=\"isDetailsPaneCollapsed ? '0px' : '50%'\">\n <div>\n <kendo-tabstrip (tabSelect)=\"onTabSelect($event)\" class=\"editor-tabs\">\n <!-- Spec Tab -->\n <kendo-tabstrip-tab [title]=\"'Spec'\" [selected]=\"activeTab === 0\">\n <ng-template kendoTabContent>\n <div class=\"tab-content spec-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-code\"></i> Component Specification (JSON)</h4>\n <div class=\"editor-actions\">\n @if (isEditingSpec) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applySpecChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n <div class=\"editor-wrapper\">\n <mj-code-editor\n [(ngModel)]=\"editableSpec\"\n (ngModelChange)=\"onSpecChange($event)\"\n [language]=\"'json'\"\n [readonly]=\"false\"\n style=\"height: 100%; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n \n <!-- Code Tab -->\n <kendo-tabstrip-tab [title]=\"'Code'\" [selected]=\"activeTab === 1\">\n <ng-template kendoTabContent>\n <div class=\"tab-content code-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-file-code\"></i> Component Code (JavaScript/React)</h4>\n <div class=\"editor-actions\">\n @if (isEditingCode) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applyCodeChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n \n <!-- Always use panel bar for consistency and to show all components -->\n <div class=\"editor-wrapper\">\n <kendo-panelbar class=\"code-sections\">\n @for (section of getComponentCodeSections(); track section.title; let i = $index) {\n <kendo-panelbar-item [title]=\"section.title\" [expanded]=\"section.expanded\">\n <ng-template kendoPanelBarContent>\n <mj-code-editor\n [ngModel]=\"section.code\"\n (ngModelChange)=\"onCodeSectionChange($event, i)\"\n [language]=\"'javascript'\"\n [readonly]=\"false\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </ng-template>\n </kendo-panelbar-item>\n }\n </kendo-panelbar>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n </kendo-tabstrip>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n\n @if (!isDetailsPaneCollapsed) {\n \n }\n } @else {\n <!-- Empty State when no component selected -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-rocket fa-3x\"></i>\n <h2>Ready to Test Components</h2>\n <p>Select a component from the list to view its details and run it</p>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n</div>", styles: [":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n \n .import-dropdown {\n position: relative;\n \n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 180px;\n \n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #212529;\n transition: background-color 0.2s;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:not(:last-child) {\n border-bottom: 1px solid #e9ecef;\n }\n \n i {\n width: 16px;\n text-align: center;\n color: #6366f1;\n }\n }\n }\n }\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n .panel-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n \n h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n \n .favorites-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n &.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n \n i {\n color: #ffc107;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .component-count {\n font-size: 13px;\n color: #6c757d;\n background: #f8f9fa;\n padding: 4px 10px;\n border-radius: 12px;\n font-weight: 500;\n }\n }\n }\n \n .category-filters {\n margin-bottom: 16px;\n \n .filter-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n \n .category-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &.active {\n border-color: var(--pill-color);\n background: var(--pill-color);\n color: white;\n \n .pill-count {\n background: rgba(255, 255, 255, 0.3);\n color: white;\n }\n }\n \n .pill-name {\n font-weight: 500;\n }\n \n .pill-count {\n background: #f1f3f5;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n }\n \n .more-button,\n .clear-filters-button {\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n i {\n font-size: 11px;\n margin-right: 4px;\n }\n }\n \n .clear-filters-button {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n \n &:hover {\n background: #fca5a5;\n color: white;\n }\n }\n }\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .favorite-btn {\n position: absolute;\n top: 12px;\n right: 48px; // Leave room for chevron\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n transform: scale(1.1);\n }\n \n &.is-favorite {\n color: #ffc107;\n border-color: #ffc107;\n background: #fff3cd;\n \n &:hover {\n background: #ffe69c;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n \n &.text {\n background: #f3e8ff;\n color: #6b21a8;\n }\n }\n }\n \n .card-namespace {\n margin-top: 8px;\n \n .namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: white;\n \n i {\n font-size: 11px;\n opacity: 0.9;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n// Removed tree view styles - using modern category filters instead\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] }]
|
|
1906
|
+
args: [{ selector: 'mj-component-studio-dashboard', template: "<div class=\"component-studio\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-content\">\n <div>\n <h1><i class=\"fa-solid fa-puzzle-piece\"></i> Component Studio</h1>\n <p class=\"header-subtitle\">Testing components without required custom properties</p>\n </div>\n <div class=\"header-buttons\">\n @if (selectedComponent && isRunning) {\n <button kendoButton (click)=\"toggleDetailsPane()\" [themeColor]=\"'base'\">\n @if (isDetailsPaneCollapsed) {\n <span class=\"fa-solid fa-eye\"></span> Show Details\n } @else {\n <span class=\"fa-solid fa-eye-slash\"></span> Hide Details\n }\n </button>\n }\n <div class=\"import-dropdown\" [class.open]=\"importDropdownOpen\">\n <button kendoButton (click)=\"toggleImportDropdown()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-file-import\"></span> Import\n <span class=\"fa-solid fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px;\"></span>\n </button>\n @if (importDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"importFromFile()\">\n <i class=\"fa-solid fa-file\"></i> Import from File\n </button>\n <button class=\"dropdown-item\" (click)=\"importFromText()\">\n <i class=\"fa-solid fa-keyboard\"></i> Import from Text\n </button>\n </div>\n }\n </div>\n @if (selectedComponent && isRunning) {\n <div class=\"export-dropdown\" [class.open]=\"exportDropdownOpen\">\n <button kendoButton (click)=\"toggleExportDropdown()\" [themeColor]=\"'primary'\">\n <span class=\"fa-solid fa-file-export\"></span> Export\n <span class=\"fa-solid fa-chevron-down\" style=\"margin-left: 5px; font-size: 10px;\"></span>\n </button>\n @if (exportDropdownOpen) {\n <div class=\"dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"exportToArtifact()\">\n <i class=\"fa-solid fa-save\"></i> Export to Artifact\n </button>\n <button class=\"dropdown-item\" (click)=\"exportToFile()\">\n <i class=\"fa-solid fa-file\"></i> Export to File\n </button>\n <button class=\"dropdown-item\" (click)=\"exportToClipboard()\">\n <i class=\"fa-solid fa-clipboard\"></i> Export to Clipboard\n </button>\n </div>\n }\n </div>\n }\n <button kendoButton (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <span class=\"fa-solid fa-sync\"></span> Refresh\n </button>\n </div>\n <!-- Hidden file input -->\n <input #fileInput type=\"file\" accept=\".json\" (change)=\"handleFileSelect($event)\" style=\"display: none;\" />\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <kendo-splitter orientation=\"horizontal\">\n <!-- Left Panel - Component List -->\n <kendo-splitter-pane [min]=\"'350px'\" [max]=\"'650px'\" [size]=\"'400px'\">\n <div class=\"components-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header-top\">\n <h3>Components</h3>\n <div class=\"header-actions\">\n <button \n class=\"favorites-toggle\"\n [class.active]=\"showOnlyFavorites\"\n (click)=\"toggleShowOnlyFavorites()\"\n title=\"Show only favorites\">\n @if (showOnlyFavorites) {\n <i class=\"fa-solid fa-star\"></i> Favorites\n } @else {\n <i class=\"fa-regular fa-star\"></i> All\n }\n </button>\n <span class=\"component-count\">{{ filteredComponents.length }} of {{ allComponents.length }}</span>\n </div>\n </div>\n \n <!-- Modern Category Filter Pills -->\n <div class=\"category-filters\">\n @if (availableCategories.length > 0) {\n <div class=\"filter-pills\">\n @for (category of getVisibleCategories(); track category.name) {\n <button \n class=\"category-pill\"\n [class.active]=\"isCategorySelected(category.name)\"\n [style.--pill-color]=\"category.color\"\n (click)=\"toggleCategory(category.name)\">\n <span class=\"pill-name\">{{ category.name }}</span>\n <span class=\"pill-count\">{{ category.count }}</span>\n </button>\n }\n @if (availableCategories.length > 5) {\n <button \n class=\"more-button\"\n (click)=\"toggleShowAllCategories()\">\n @if (showAllCategories) {\n <i class=\"fa-solid fa-chevron-up\"></i> Less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> +{{ availableCategories.length - 5 }} more\n }\n </button>\n }\n @if (selectedCategories.size > 0) {\n <button \n class=\"clear-filters-button\"\n (click)=\"clearCategoryFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear\n </button>\n }\n </div>\n }\n </div>\n \n <div class=\"search-box\">\n <kendo-textbox \n [value]=\"searchQuery\"\n (valueChange)=\"onSearchChange($event)\"\n placeholder=\"Search components...\"\n [clearButton]=\"true\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n </div>\n \n <div class=\"components-list\">\n @if (isLoading) {\n <div class=\"loading-message\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading components...\n </div>\n } @else if (filteredComponents.length === 0) {\n <div class=\"empty-message\">\n <i class=\"fa-solid fa-info-circle\"></i> No components found without required custom properties.\n <br>\n <small>Components with optional custom props can be tested, but not those with required props.</small>\n </div>\n } @else {\n <!-- Component Cards -->\n @for (component of filteredComponents; track getComponentId(component)) {\n <div class=\"component-card\" \n [class.expanded]=\"expandedComponent && getComponentId(expandedComponent) === getComponentId(component)\"\n [class.running]=\"selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning\"\n [class.file-loaded]=\"isFileLoadedComponent(component)\">\n \n <!-- Card Header - Always visible -->\n <div class=\"card-header\" (click)=\"toggleComponentExpansion(component)\">\n <div class=\"card-icon\" [style.color]=\"getComponentTypeColor(getComponentType(component))\">\n <i class=\"fa-solid\" [ngClass]=\"getComponentTypeIcon(getComponentType(component))\"></i>\n </div>\n @if (!isFileLoadedComponent(component)) {\n <button \n class=\"favorite-btn\"\n [class.is-favorite]=\"isFavorite(component)\"\n (click)=\"toggleFavorite(component, $event)\"\n [title]=\"isFavorite(component) ? 'Remove from favorites' : 'Add to favorites'\">\n @if (isFavorite(component)) {\n <i class=\"fa-solid fa-star\"></i>\n } @else {\n <i class=\"fa-regular fa-star\"></i>\n }\n </button>\n }\n <div class=\"card-info\">\n <div class=\"card-name\">\n {{ getComponentName(component) }}\n @if (isFileLoadedComponent(component)) {\n <span class=\"file-badge\" [title]=\"getComponentStatus(component) === 'Text' ? 'Imported from text input' : 'Loaded from ' + getComponentFilename(component)\">\n @if (getComponentStatus(component) === 'Text') {\n <i class=\"fa-solid fa-keyboard\"></i> Text Import\n } @else {\n <i class=\"fa-solid fa-file\"></i> {{ getComponentFilename(component) }}\n }\n </span>\n }\n </div>\n <div class=\"card-meta\">\n <span class=\"card-type\">{{ getComponentType(component) || 'Component' }}</span>\n <span class=\"card-version\">v{{ getComponentVersion(component) }}</span>\n @if (isFileLoadedComponent(component)) {\n @if (getComponentStatus(component) === 'Text') {\n <span class=\"status-badge text\">Text</span>\n } @else {\n <span class=\"status-badge file\">File</span>\n }\n } @else if (getComponentStatus(component) === 'Published') {\n <span class=\"status-badge published\">Published</span>\n } @else {\n <span class=\"status-badge draft\">Draft</span>\n }\n </div>\n <!-- Namespace chip with color coding -->\n <div class=\"card-namespace\">\n <span class=\"namespace-chip\" \n [style.background-color]=\"getNamespaceColor(getComponentNamespace(component))\"\n [title]=\"getComponentNamespace(component) || 'Uncategorized'\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{ formatNamespace(getComponentNamespace(component)) }}\n </span>\n </div>\n </div>\n <div class=\"card-chevron\">\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(component)) {\n <i class=\"fa-solid fa-chevron-up\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </div>\n </div>\n \n <!-- Card Details - Only visible when expanded -->\n @if (expandedComponent && getComponentId(expandedComponent) === getComponentId(component)) {\n <div class=\"card-details\">\n @if (getComponentDescription(component)) {\n <div class=\"detail-section\">\n <label>Description</label>\n <p>{{ getComponentDescription(component) }}</p>\n </div>\n }\n \n <div class=\"detail-section\">\n <label>Component Info</label>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Type:</span>\n <span class=\"info-value\">{{ getComponentType(component) || 'Unknown' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Version:</span>\n <span class=\"info-value\">{{ getComponentVersion(component) }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Status:</span>\n <span class=\"info-value\">{{ getComponentStatus(component) || 'Draft' }}</span>\n </div>\n @if (isFileLoadedComponent(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Loaded:</span>\n <span class=\"info-value\">{{ getComponentLoadedAt(component) | date:'short' }}</span>\n </div>\n } @else if (!isFileLoadedComponent(component) && getComponentUpdatedAt(component)) {\n <div class=\"info-item\">\n <span class=\"info-label\">Updated:</span>\n <span class=\"info-value\">{{ getComponentUpdatedAt(component) | date:'short' }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"card-actions\">\n @if (selectedComponent && getComponentId(selectedComponent) === getComponentId(component) && isRunning) {\n <button kendoButton \n [themeColor]=\"'error'\"\n (click)=\"stopComponent(); $event.stopPropagation()\">\n <span class=\"fa-solid fa-stop\"></span> Stop Component\n </button>\n } @else if (isRunning && selectedComponent && getComponentId(selectedComponent) !== getComponentId(component)) {\n <button kendoButton \n [themeColor]=\"'base'\"\n title=\"Stop current component and run this one\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Switch to This Component\n </button>\n } @else {\n <button kendoButton \n [themeColor]=\"'primary'\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Right Panel - Component Display with Editor Splitter -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <div class=\"component-display\">\n @if (selectedComponent) {\n <kendo-splitter orientation=\"horizontal\">\n <kendo-splitter-pane [size]=\"isDetailsPaneCollapsed ? '100%' : '50%'\">\n <div class=\"component-runtime\">\n @if (isRunning && componentSpec) {\n @if (currentError) {\n <!-- Error Display -->\n <div class=\"error-display\">\n <div class=\"error-container\">\n <div class=\"error-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <h3>Component Error</h3>\n <button class=\"copy-button\" (click)=\"copyErrorToClipboard()\" title=\"Copy error details\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n \n <p class=\"error-intro\">\n The component could not be rendered due to the following error:\n </p>\n \n <div class=\"error-details\">\n <strong>Error Type:</strong> {{ currentError.type }}<br>\n <strong>Message:</strong> {{ currentError.message }}\n @if (currentError.technicalDetails) {\n <details class=\"technical-details\">\n <summary>Technical Details (click to expand)</summary>\n <pre>{{ formatTechnicalDetails(currentError.technicalDetails) }}</pre>\n </details>\n }\n </div>\n \n <div class=\"error-help\">\n <strong>What to do:</strong>\n <ol>\n <li>Check that the component code is valid JavaScript/React</li>\n <li>Ensure all required dependencies are available</li>\n <li>Review the technical details for specific error information</li>\n <li>Contact your system administrator if the issue persists</li>\n </ol>\n </div>\n \n <div class=\"error-actions\">\n <button kendoButton (click)=\"retryComponent()\">\n <span class=\"fa-solid fa-rotate\"></span> Retry\n </button>\n <button kendoButton (click)=\"stopComponent()\" [themeColor]=\"'error'\">\n <span class=\"fa-solid fa-stop\"></span> Stop\n </button>\n </div>\n </div>\n </div>\n } @else {\n <!-- React Component -->\n <mj-react-component \n [component]=\"componentSpec\"\n (componentEvent)=\"onComponentEvent($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-react-component>\n }\n } @else {\n <!-- Component Not Running State -->\n <div class=\"run-empty-state\">\n <i class=\"fa-solid fa-play-circle fa-3x\"></i>\n <h3>Component: {{ getComponentName(selectedComponent) }}</h3>\n <p>{{ getComponentDescription(selectedComponent) || 'No description available' }}</p>\n <button kendoButton [themeColor]=\"'primary'\" [size]=\"'large'\" (click)=\"runComponent(selectedComponent)\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n </div>\n }\n </div>\n\n </kendo-splitter-pane>\n <kendo-splitter-pane [size]=\"isDetailsPaneCollapsed ? '0px' : '50%'\">\n <div>\n <kendo-tabstrip (tabSelect)=\"onTabSelect($event)\" class=\"editor-tabs\">\n <!-- Spec Tab -->\n <kendo-tabstrip-tab [title]=\"'Spec'\" [selected]=\"activeTab === 0\">\n <ng-template kendoTabContent>\n <div class=\"tab-content spec-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-code\"></i> Component Specification (JSON)</h4>\n <div class=\"editor-actions\">\n @if (isEditingSpec) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applySpecChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n <div class=\"editor-wrapper\">\n <mj-code-editor\n [(ngModel)]=\"editableSpec\"\n (ngModelChange)=\"onSpecChange($event)\"\n [language]=\"'json'\"\n [readonly]=\"false\"\n style=\"height: 100%; width: 100%;\">\n </mj-code-editor>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n \n <!-- Code Tab -->\n <kendo-tabstrip-tab [title]=\"'Code'\" [selected]=\"activeTab === 1\">\n <ng-template kendoTabContent>\n <div class=\"tab-content code-tab\">\n <div class=\"editor-header\">\n <h4><i class=\"fa-solid fa-file-code\"></i> Component Code (JavaScript/React)</h4>\n <div class=\"editor-actions\">\n @if (isEditingCode) {\n <button kendoButton [themeColor]=\"'primary'\" (click)=\"applyCodeChanges()\">\n <span class=\"fa-solid fa-check\"></span> Apply Changes\n </button>\n <button kendoButton (click)=\"initializeEditors()\">\n <span class=\"fa-solid fa-times\"></span> Cancel\n </button>\n }\n @if (isRunning) {\n <button kendoButton (click)=\"refreshComponent()\" [themeColor]=\"'info'\">\n <span class=\"fa-solid fa-sync\"></span> Refresh Component\n </button>\n }\n </div>\n </div>\n \n <!-- Always use panel bar for consistency and to show all components -->\n <div class=\"editor-wrapper\">\n <kendo-panelbar class=\"code-sections\">\n @for (section of getComponentCodeSections(); track section.title; let i = $index) {\n <kendo-panelbar-item [title]=\"section.title\" [expanded]=\"section.expanded\">\n <ng-template kendoPanelBarContent>\n <mj-code-editor\n [ngModel]=\"section.code\"\n (ngModelChange)=\"onCodeSectionChange($event, i)\"\n [language]=\"'javascript'\"\n [readonly]=\"false\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n </ng-template>\n </kendo-panelbar-item>\n }\n </kendo-panelbar>\n </div>\n </div>\n </ng-template>\n </kendo-tabstrip-tab>\n </kendo-tabstrip>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n\n @if (!isDetailsPaneCollapsed) {\n \n }\n } @else {\n <!-- Empty State when no component selected -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-rocket fa-3x\"></i>\n <h2>Ready to Test Components</h2>\n <p>Select a component from the list to view its details and run it</p>\n </div>\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n</div>", styles: [":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.component-studio {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #f8f9fa;\n overflow: hidden;\n position: relative;\n\n .dashboard-header {\n background: white;\n border-bottom: 1px solid #dee2e6;\n padding: 16px 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n \n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-buttons {\n display: flex;\n gap: 8px;\n \n .import-dropdown, .export-dropdown {\n position: relative;\n \n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 180px;\n \n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n border: none;\n background: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #212529;\n transition: background-color 0.2s;\n \n &:hover {\n background-color: #f8f9fa;\n }\n \n &:not(:last-child) {\n border-bottom: 1px solid #e9ecef;\n }\n \n i {\n width: 16px;\n text-align: center;\n color: #6366f1;\n }\n }\n }\n }\n }\n \n h1 {\n margin: 0;\n font-size: 24px;\n font-weight: 600;\n color: #212529;\n display: flex;\n align-items: center;\n gap: 12px;\n \n i {\n color: #6366f1;\n }\n }\n \n .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n \n ::ng-deep .k-pane {\n overflow: hidden;\n height: 100%;\n }\n }\n\n .components-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #f8f9fa;\n \n .panel-header {\n padding: 20px;\n background: white;\n border-bottom: 1px solid #dee2e6;\n \n .panel-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n \n h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\n }\n \n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n \n .favorites-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #6c757d;\n cursor: pointer;\n transition: all 0.2s ease;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n &.active {\n background: #fff3cd;\n border-color: #ffc107;\n color: #856404;\n \n i {\n color: #ffc107;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .component-count {\n font-size: 13px;\n color: #6c757d;\n background: #f8f9fa;\n padding: 4px 10px;\n border-radius: 12px;\n font-weight: 500;\n }\n }\n }\n \n .category-filters {\n margin-bottom: 16px;\n \n .filter-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n \n .category-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 2px solid #e9ecef;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n \n &:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n \n &.active {\n border-color: var(--pill-color);\n background: var(--pill-color);\n color: white;\n \n .pill-count {\n background: rgba(255, 255, 255, 0.3);\n color: white;\n }\n }\n \n .pill-name {\n font-weight: 500;\n }\n \n .pill-count {\n background: #f1f3f5;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n }\n \n .more-button,\n .clear-filters-button {\n padding: 6px 12px;\n border: 1px solid #dee2e6;\n background: white;\n border-radius: 20px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n border-color: #adb5bd;\n }\n \n i {\n font-size: 11px;\n margin-right: 4px;\n }\n }\n \n .clear-filters-button {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n \n &:hover {\n background: #fca5a5;\n color: white;\n }\n }\n }\n }\n \n .search-box {\n kendo-textbox {\n width: 100%;\n }\n }\n }\n \n .components-list {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 16px;\n \n .loading-message,\n .empty-message {\n padding: 48px 24px;\n text-align: center;\n color: #6c757d;\n font-size: 14px;\n \n i {\n margin-right: 8px;\n }\n }\n \n .component-card {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 8px;\n margin-bottom: 12px;\n transition: all 0.2s ease;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n &.expanded {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n border-color: #6366f1;\n }\n \n &.running {\n border-color: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1);\n background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n &.file-loaded {\n background: linear-gradient(135deg, #f0f8ff 0%, white 100%);\n border-style: dashed;\n border-color: #3b82f6;\n \n &:hover {\n box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15);\n }\n \n &.expanded {\n border-style: solid;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .favorite-btn {\n position: absolute;\n top: 12px;\n right: 48px; // Leave room for chevron\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 50%;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #6c757d;\n \n &:hover {\n background: #f8f9fa;\n transform: scale(1.1);\n }\n \n &.is-favorite {\n color: #ffc107;\n border-color: #ffc107;\n background: #fff3cd;\n \n &:hover {\n background: #ffe69c;\n }\n }\n \n i {\n font-size: 14px;\n }\n }\n \n .card-info {\n flex: 1;\n min-width: 0;\n \n .card-name {\n font-size: 15px;\n font-weight: 600;\n color: #212529;\n margin-bottom: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n gap: 8px;\n \n .file-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n background: #e0f2fe;\n color: #0369a1;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n flex-shrink: 0;\n \n i {\n font-size: 10px;\n }\n }\n }\n \n .card-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #6c757d;\n \n .card-type {\n font-weight: 500;\n }\n \n .card-version {\n color: #868e96;\n }\n \n .status-badge {\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n \n &.published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.file {\n background: #e0f2fe;\n color: #0369a1;\n }\n \n &.text {\n background: #f3e8ff;\n color: #6b21a8;\n }\n }\n }\n \n .card-namespace {\n margin-top: 8px;\n \n .namespace-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: white;\n \n i {\n font-size: 11px;\n opacity: 0.9;\n }\n }\n }\n }\n \n .card-chevron {\n color: #6c757d;\n font-size: 12px;\n margin-left: 12px;\n transition: transform 0.2s ease;\n }\n }\n \n .card-details {\n padding: 0 16px 16px 16px;\n border-top: 1px solid #e9ecef;\n animation: slideDown 0.2s ease;\n \n .detail-section {\n margin-top: 16px;\n \n label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: #6c757d;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n \n p {\n margin: 0;\n font-size: 13px;\n color: #495057;\n line-height: 1.5;\n }\n \n .info-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n \n .info-item {\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 13px;\n \n .info-label {\n font-weight: 500;\n color: #6c757d;\n min-width: 50px;\n }\n \n .info-value {\n color: #212529;\n }\n }\n }\n }\n \n .card-actions {\n margin-top: 16px;\n display: flex;\n gap: 8px;\n \n button {\n flex: 1;\n }\n }\n }\n }\n }\n }\n\n .component-display {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow: hidden;\n \n .empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: #868e96;\n padding: 48px;\n text-align: center;\n \n i {\n color: #dee2e6;\n margin-bottom: 24px;\n }\n \n h2 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 600;\n color: #495057;\n }\n \n p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n }\n }\n \n .error-display {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: #f8f9fa;\n \n .error-container {\n width: 100%;\n max-width: 600px;\n background: white;\n border: 2px solid #dc3545;\n border-radius: 8px;\n padding: 24px;\n box-shadow: 0 4px 12px rgba(220, 53, 69, 0.15);\n \n .error-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n color: #dc3545;\n position: relative;\n \n i {\n font-size: 24px;\n }\n \n h3 {\n margin: 0;\n font-size: 20px;\n flex: 1;\n }\n \n .copy-button {\n background: white;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 6px 10px;\n cursor: pointer;\n color: #6c757d;\n transition: all 0.2s;\n \n &:hover {\n background: #e9ecef;\n color: #495057;\n }\n \n i {\n font-size: 14px;\n }\n }\n }\n \n .error-intro {\n color: #495057;\n margin-bottom: 20px;\n font-size: 14px;\n }\n \n .error-details {\n background: #f8f9fa;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-family: 'SF Mono', Monaco, 'Courier New', monospace;\n font-size: 13px;\n \n .technical-details {\n margin-top: 12px;\n \n summary {\n cursor: pointer;\n color: #0066cc;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n \n &:hover {\n text-decoration: underline;\n }\n }\n \n pre {\n margin-top: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 11px;\n color: #495057;\n max-height: 200px;\n overflow-y: auto;\n }\n }\n }\n \n .error-help {\n background: #e7f3ff;\n border: 1px solid #b3d9ff;\n border-radius: 4px;\n padding: 16px;\n margin-bottom: 20px;\n font-size: 13px;\n \n strong {\n display: block;\n margin-bottom: 8px;\n font-size: 14px;\n color: #0066cc;\n }\n \n ol {\n margin: 0;\n padding-left: 20px;\n \n li {\n margin-bottom: 4px;\n color: #495057;\n }\n }\n }\n \n .error-actions {\n display: flex;\n gap: 12px;\n \n button {\n min-width: 100px;\n }\n }\n }\n }\n \n mj-react-component {\n flex: 1;\n width: 100%;\n height: 100%;\n display: block;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n // Component and editor splitter\n .component-editor-splitter {\n height: 100%;\n overflow: hidden;\n \n ::ng-deep .k-splitter-bar {\n background: #6366f1; // Same blue as Import button\n width: 6px; // Make it slightly wider for visibility\n \n &:hover {\n background: #4f52d9; // Darker blue on hover\n }\n \n .k-resize-handle {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n \n ::ng-deep .k-pane {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n }\n \n // Component runtime area\n .component-runtime {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: white;\n position: relative;\n overflow-y: auto;\n overflow-x: hidden;\n \n .run-empty-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n \n i {\n color: #10b981;\n margin-bottom: 24px;\n }\n \n h3 {\n margin: 0 0 12px 0;\n font-size: 20px;\n font-weight: 600;\n color: #212529;\n }\n \n p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: #6c757d;\n max-width: 400px;\n }\n }\n }\n \n // Editor tabs on the right\n .editor-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n ::ng-deep .k-tabstrip-items-wrapper {\n background: #f8f9fa;\n border-bottom: 2px solid #dee2e6;\n flex-shrink: 0;\n }\n \n ::ng-deep .k-tabstrip-content {\n flex: 1;\n padding: 0;\n overflow: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n }\n \n ::ng-deep .k-item.k-tabstrip-item {\n font-weight: 500;\n \n &.k-active {\n background: white;\n border-bottom-color: white;\n }\n }\n }\n \n .tab-content {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n &.spec-tab, &.code-tab {\n height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n \n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n flex-shrink: 0;\n min-width: 0; // Fix width issue\n \n h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #495057;\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 1; // Allow title to shrink\n min-width: 0; // Prevent overflow\n \n i {\n color: #6366f1;\n flex-shrink: 0; // Keep icon from shrinking\n }\n }\n \n .editor-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0; // Prevent buttons from shrinking\n \n button {\n min-width: auto;\n padding: 4px 12px;\n font-size: 13px;\n white-space: nowrap; // Prevent button text wrapping\n }\n }\n }\n \n .editor-wrapper {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n }\n \n ::ng-deep .monaco-editor {\n border: 1px solid #dee2e6;\n }\n }\n \n .code-sections {\n height: 100%;\n \n ::ng-deep .k-panelbar-item-header {\n background: #f8f9fa;\n font-weight: 500;\n font-size: 14px;\n }\n \n ::ng-deep .k-panelbar-content {\n padding: 0;\n }\n }\n }\n }\n}\n\n// Removed tree view styles - using modern category filters instead\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] }]
|
|
1636
1907
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.DialogService }, { type: i0.ViewContainerRef }], { fileInput: [{
|
|
1637
1908
|
type: ViewChild,
|
|
1638
1909
|
args: ['fileInput', { static: false }]
|
|
@@ -1640,7 +1911,7 @@ export { ComponentStudioDashboardComponent };
|
|
|
1640
1911
|
type: HostListener,
|
|
1641
1912
|
args: ['document:click', ['$event']]
|
|
1642
1913
|
}] }); })();
|
|
1643
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber:
|
|
1914
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 52 }); })();
|
|
1644
1915
|
/**
|
|
1645
1916
|
* Function to prevent tree shaking of the ComponentStudioDashboardComponent.
|
|
1646
1917
|
*/
|