@memberjunction/ng-dashboards 2.86.0 → 2.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +40 -54
  2. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  3. package/dist/ComponentStudio/component-studio-dashboard.component.js +380 -601
  4. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  5. package/dist/ComponentStudio/index.d.ts +0 -3
  6. package/dist/ComponentStudio/index.d.ts.map +1 -1
  7. package/dist/ComponentStudio/index.js +0 -3
  8. package/dist/ComponentStudio/index.js.map +1 -1
  9. package/dist/module.d.ts +18 -21
  10. package/dist/module.d.ts.map +1 -1
  11. package/dist/module.js +9 -14
  12. package/dist/module.js.map +1 -1
  13. package/package.json +10 -10
  14. package/dist/ComponentStudio/components/component-dependencies.component.d.ts +0 -19
  15. package/dist/ComponentStudio/components/component-dependencies.component.d.ts.map +0 -1
  16. package/dist/ComponentStudio/components/component-dependencies.component.js +0 -138
  17. package/dist/ComponentStudio/components/component-dependencies.component.js.map +0 -1
  18. package/dist/ComponentStudio/components/component-preview.component.d.ts +0 -18
  19. package/dist/ComponentStudio/components/component-preview.component.d.ts.map +0 -1
  20. package/dist/ComponentStudio/components/component-preview.component.js +0 -86
  21. package/dist/ComponentStudio/components/component-preview.component.js.map +0 -1
  22. package/dist/ComponentStudio/components/component-studio-settings.component.d.ts +0 -29
  23. package/dist/ComponentStudio/components/component-studio-settings.component.d.ts.map +0 -1
  24. package/dist/ComponentStudio/components/component-studio-settings.component.js +0 -212
  25. package/dist/ComponentStudio/components/component-studio-settings.component.js.map +0 -1
@@ -4,426 +4,299 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { Component, ChangeDetectionStrategy } from '@angular/core';
7
+ import { Component } from '@angular/core';
8
8
  import { BaseDashboard } from '../generic/base-dashboard';
9
9
  import { RegisterClass } from '@memberjunction/global';
10
10
  import { RunView } from '@memberjunction/core';
11
- import { Subject, BehaviorSubject, combineLatest } from 'rxjs';
12
- import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';
11
+ import { Subject } from 'rxjs';
13
12
  import { SharedService } from '@memberjunction/ng-shared';
14
13
  import * as i0 from "@angular/core";
15
14
  import * as i1 from "@angular/common";
16
15
  import * as i2 from "@progress/kendo-angular-inputs";
17
- import * as i3 from "@progress/kendo-angular-dialog";
16
+ import * as i3 from "@progress/kendo-angular-layout";
18
17
  import * as i4 from "@progress/kendo-angular-buttons";
19
- import * as i5 from "@progress/kendo-angular-grid";
20
- import * as i6 from "./components/component-preview.component";
21
- import * as i7 from "./components/component-dependencies.component";
22
- import * as i8 from "./components/component-studio-settings.component";
18
+ import * as i5 from "@memberjunction/ng-react";
23
19
  const _forTrack0 = ($index, $item) => $item.ID;
24
- function ComponentStudioDashboardComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
25
- i0.ɵɵelementStart(0, "div", 2)(1, "div", 4)(2, "div", 5);
26
- i0.ɵɵelement(3, "i", 6);
20
+ function ComponentStudioDashboardComponent_ng_template_16_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelement(0, "i", 18);
22
+ } }
23
+ function ComponentStudioDashboardComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
24
+ i0.ɵɵelementStart(0, "div", 13);
25
+ i0.ɵɵelement(1, "i", 19);
26
+ i0.ɵɵtext(2, " Loading components... ");
27
27
  i0.ɵɵelementEnd();
28
- i0.ɵɵelementStart(4, "div", 7);
29
- i0.ɵɵtext(5, "Loading Component Studio...");
30
- i0.ɵɵelementEnd()()();
31
28
  } }
32
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_ng_template_10_Template(rf, ctx) { if (rf & 1) {
33
- i0.ɵɵelement(0, "i", 38);
29
+ function ComponentStudioDashboardComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "div", 14);
31
+ i0.ɵɵtext(1, " No components found ");
32
+ i0.ɵɵelementEnd();
34
33
  } }
35
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_For_16_Template(rf, ctx) { if (rf & 1) {
36
- const _r4 = i0.ɵɵgetCurrentView();
37
- i0.ɵɵelementStart(0, "label", 34)(1, "input", 35);
38
- i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_For_16_Template_input_change_1_listener($event) { const type_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onTypeFilterChange(type_r5, $event.target.checked)); });
34
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelementStart(0, "span", 30);
36
+ i0.ɵɵtext(1, "Published");
39
37
  i0.ɵɵelementEnd();
40
- i0.ɵɵelement(2, "span", 39);
41
- i0.ɵɵtext(3);
38
+ } }
39
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
40
+ i0.ɵɵelementStart(0, "span", 31);
41
+ i0.ɵɵtext(1, "Draft");
42
42
  i0.ɵɵelementEnd();
43
- } if (rf & 2) {
44
- const type_r5 = ctx.$implicit;
45
- const ctx_r1 = i0.ɵɵnextContext(3);
46
- i0.ɵɵadvance();
47
- i0.ɵɵproperty("checked", ctx_r1.selectedTypes$.value.has(type_r5));
48
- i0.ɵɵadvance();
49
- i0.ɵɵstyleProp("background-color", ctx_r1.getComponentTypeColor(type_r5));
50
- i0.ɵɵadvance();
51
- i0.ɵɵtextInterpolate1(" ", type_r5, " ");
52
43
  } }
53
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_For_22_Template(rf, ctx) { if (rf & 1) {
54
- const _r6 = i0.ɵɵgetCurrentView();
55
- i0.ɵɵelementStart(0, "label", 34)(1, "input", 35);
56
- i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_For_22_Template_input_change_1_listener($event) { const status_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onStatusFilterChange(status_r7, $event.target.checked)); });
44
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelement(0, "i", 33);
46
+ } }
47
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
48
+ i0.ɵɵelement(0, "i", 34);
49
+ } }
50
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_1_Template(rf, ctx) { if (rf & 1) {
51
+ i0.ɵɵelementStart(0, "div", 36)(1, "label");
52
+ i0.ɵɵtext(2, "Description");
57
53
  i0.ɵɵelementEnd();
58
- i0.ɵɵelementStart(2, "span", 40);
59
- i0.ɵɵtext(3);
54
+ i0.ɵɵelementStart(3, "p");
55
+ i0.ɵɵtext(4);
60
56
  i0.ɵɵelementEnd()();
61
57
  } if (rf & 2) {
62
- const status_r7 = ctx.$implicit;
63
- const ctx_r1 = i0.ɵɵnextContext(3);
64
- i0.ɵɵadvance();
65
- i0.ɵɵproperty("checked", ctx_r1.selectedStatuses$.value.has(status_r7));
66
- i0.ɵɵadvance();
67
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusBadgeClass(status_r7));
68
- i0.ɵɵadvance();
69
- i0.ɵɵtextInterpolate(status_r7);
58
+ const component_r2 = i0.ɵɵnextContext(2).$implicit;
59
+ i0.ɵɵadvance(4);
60
+ i0.ɵɵtextInterpolate(component_r2.Description);
70
61
  } }
71
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_Template(rf, ctx) { if (rf & 1) {
72
- const _r3 = i0.ɵɵgetCurrentView();
73
- i0.ɵɵelementStart(0, "div", 19)(1, "div", 27)(2, "h3");
74
- i0.ɵɵtext(3, "Filters");
75
- i0.ɵɵelementEnd();
76
- i0.ɵɵelementStart(4, "button", 28);
77
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clearFilters()); });
78
- i0.ɵɵtext(5, " Clear All ");
79
- i0.ɵɵelementEnd()();
80
- i0.ɵɵelementStart(6, "div", 29)(7, "label", 30);
81
- i0.ɵɵtext(8, "Search");
82
- i0.ɵɵelementEnd();
83
- i0.ɵɵelementStart(9, "kendo-textbox", 31);
84
- i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_Template_kendo_textbox_valueChange_9_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSearchChange($event)); });
85
- i0.ɵɵtemplate(10, ComponentStudioDashboardComponent_Conditional_3_Conditional_14_ng_template_10_Template, 1, 0, "ng-template", 32);
86
- i0.ɵɵelementEnd()();
87
- i0.ɵɵelementStart(11, "div", 29)(12, "label", 30);
88
- i0.ɵɵtext(13, "Component Type");
89
- i0.ɵɵelementEnd();
90
- i0.ɵɵelementStart(14, "div", 33);
91
- i0.ɵɵrepeaterCreate(15, ComponentStudioDashboardComponent_Conditional_3_Conditional_14_For_16_Template, 4, 4, "label", 34, i0.ɵɵrepeaterTrackByIdentity);
92
- i0.ɵɵelementEnd()();
93
- i0.ɵɵelementStart(17, "div", 29)(18, "label", 30);
94
- i0.ɵɵtext(19, "Status");
62
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_21_Template(rf, ctx) { if (rf & 1) {
63
+ i0.ɵɵelementStart(0, "div", 38)(1, "span", 39);
64
+ i0.ɵɵtext(2, "Updated:");
95
65
  i0.ɵɵelementEnd();
96
- i0.ɵɵelementStart(20, "div", 33);
97
- i0.ɵɵrepeaterCreate(21, ComponentStudioDashboardComponent_Conditional_3_Conditional_14_For_22_Template, 4, 3, "label", 34, i0.ɵɵrepeaterTrackByIdentity);
66
+ i0.ɵɵelementStart(3, "span", 40);
67
+ i0.ɵɵtext(4);
68
+ i0.ɵɵpipe(5, "date");
98
69
  i0.ɵɵelementEnd()();
99
- i0.ɵɵelementStart(23, "div", 29)(24, "label", 30);
100
- i0.ɵɵtext(25, "Source");
101
- i0.ɵɵelementEnd();
102
- i0.ɵɵelementStart(26, "div", 33)(27, "label", 34)(28, "input", 35);
103
- i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_Template_input_change_28_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSourceFilterChange("Local", $event.target.checked)); });
104
- i0.ɵɵelementEnd();
105
- i0.ɵɵelement(29, "i", 36);
106
- i0.ɵɵtext(30, " Local ");
107
- i0.ɵɵelementEnd();
108
- i0.ɵɵelementStart(31, "label", 34)(32, "input", 35);
109
- i0.ɵɵlistener("change", function ComponentStudioDashboardComponent_Conditional_3_Conditional_14_Template_input_change_32_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSourceFilterChange("Registry", $event.target.checked)); });
110
- i0.ɵɵelementEnd();
111
- i0.ɵɵelement(33, "i", 37);
112
- i0.ɵɵtext(34, " Registry ");
113
- i0.ɵɵelementEnd()()()();
114
70
  } if (rf & 2) {
115
- const ctx_r1 = i0.ɵɵnextContext(2);
71
+ const component_r2 = i0.ɵɵnextContext(2).$implicit;
116
72
  i0.ɵɵadvance(4);
117
- i0.ɵɵproperty("fillMode", "flat")("size", "small");
118
- i0.ɵɵadvance(5);
119
- i0.ɵɵproperty("value", ctx_r1.searchQuery$.value)("clearButton", true);
120
- i0.ɵɵadvance(6);
121
- i0.ɵɵrepeater(ctx_r1.componentTypes);
122
- i0.ɵɵadvance(6);
123
- i0.ɵɵrepeater(ctx_r1.componentStatuses);
124
- i0.ɵɵadvance(7);
125
- i0.ɵɵproperty("checked", ctx_r1.selectedSources$.value.has("Local"));
126
- i0.ɵɵadvance(4);
127
- i0.ɵɵproperty("checked", ctx_r1.selectedSources$.value.has("Registry"));
73
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, component_r2.__mj_UpdatedAt, "short"));
128
74
  } }
129
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
130
- i0.ɵɵelement(0, "i", 60);
75
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_23_Template(rf, ctx) { if (rf & 1) {
76
+ const _r4 = i0.ɵɵgetCurrentView();
77
+ i0.ɵɵelementStart(0, "button", 43);
78
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_23_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(4); ctx_r2.stopComponent(); return i0.ɵɵresetView($event.stopPropagation()); });
79
+ i0.ɵɵtext(1, " Stop Component ");
80
+ i0.ɵɵelementEnd();
81
+ } if (rf & 2) {
82
+ i0.ɵɵproperty("icon", "fa-solid fa-stop")("themeColor", "error");
131
83
  } }
132
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_For_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
133
- i0.ɵɵelement(0, "i", 61);
84
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_24_Template(rf, ctx) { if (rf & 1) {
85
+ const _r5 = i0.ɵɵgetCurrentView();
86
+ i0.ɵɵelementStart(0, "button", 43);
87
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_24_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const component_r2 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r2); return i0.ɵɵresetView($event.stopPropagation()); });
88
+ i0.ɵɵtext(1, " Run Component ");
89
+ i0.ɵɵelementEnd();
90
+ } if (rf & 2) {
91
+ i0.ɵɵproperty("icon", "fa-solid fa-play")("themeColor", "primary");
134
92
  } }
135
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
136
- const _r8 = i0.ɵɵgetCurrentView();
137
- i0.ɵɵelementStart(0, "div", 46);
138
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_For_2_Template_div_click_0_listener() { const component_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.selectComponent(component_r9)); });
139
- i0.ɵɵelementStart(1, "div", 47)(2, "div", 48);
140
- i0.ɵɵtext(3);
93
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelementStart(0, "div", 35);
95
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_1_Template, 5, 1, "div", 36);
96
+ i0.ɵɵelementStart(2, "div", 36)(3, "label");
97
+ i0.ɵɵtext(4, "Component Info");
141
98
  i0.ɵɵelementEnd();
142
- i0.ɵɵelementStart(4, "div", 49);
143
- i0.ɵɵtext(5);
144
- i0.ɵɵelementEnd()();
145
- i0.ɵɵelementStart(6, "div", 50)(7, "h4", 51);
146
- i0.ɵɵtext(8);
99
+ i0.ɵɵelementStart(5, "div", 37)(6, "div", 38)(7, "span", 39);
100
+ i0.ɵɵtext(8, "Type:");
147
101
  i0.ɵɵelementEnd();
148
- i0.ɵɵelementStart(9, "div", 52);
102
+ i0.ɵɵelementStart(9, "span", 40);
149
103
  i0.ɵɵtext(10);
104
+ i0.ɵɵelementEnd()();
105
+ i0.ɵɵelementStart(11, "div", 38)(12, "span", 39);
106
+ i0.ɵɵtext(13, "Version:");
150
107
  i0.ɵɵelementEnd();
151
- i0.ɵɵelementStart(11, "p", 53);
152
- i0.ɵɵtext(12);
153
- i0.ɵɵelementEnd();
154
- i0.ɵɵelementStart(13, "div", 54);
155
- i0.ɵɵelement(14, "i", 55);
108
+ i0.ɵɵelementStart(14, "span", 40);
156
109
  i0.ɵɵtext(15);
157
110
  i0.ɵɵelementEnd()();
158
- i0.ɵɵelementStart(16, "div", 56)(17, "div", 57);
159
- i0.ɵɵelement(18, "i", 58);
160
- i0.ɵɵtext(19);
111
+ i0.ɵɵelementStart(16, "div", 38)(17, "span", 39);
112
+ i0.ɵɵtext(18, "Status:");
161
113
  i0.ɵɵelementEnd();
162
- i0.ɵɵelementStart(20, "div", 59);
163
- i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_For_2_Conditional_21_Template, 1, 0, "i", 60)(22, ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_For_2_Conditional_22_Template, 1, 0, "i", 61);
164
- i0.ɵɵelementEnd()()();
114
+ i0.ɵɵelementStart(19, "span", 40);
115
+ i0.ɵɵtext(20);
116
+ i0.ɵɵelementEnd()();
117
+ i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_21_Template, 6, 4, "div", 38);
118
+ i0.ɵɵelementEnd()();
119
+ i0.ɵɵelementStart(22, "div", 41);
120
+ i0.ɵɵtemplate(23, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_23_Template, 2, 2, "button", 42)(24, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Conditional_24_Template, 2, 2, "button", 42);
121
+ i0.ɵɵelementEnd()();
165
122
  } if (rf & 2) {
166
- const component_r9 = ctx.$implicit;
167
- const ctx_r1 = i0.ɵɵnextContext(4);
168
- i0.ɵɵclassProp("selected", ctx_r1.selectedComponentId === component_r9.ID);
169
- i0.ɵɵadvance(2);
170
- i0.ɵɵstyleProp("background-color", ctx_r1.getComponentTypeColor(component_r9.Type || "Other"));
171
- i0.ɵɵadvance();
172
- i0.ɵɵtextInterpolate1(" ", component_r9.Type || "Other", " ");
123
+ const component_r2 = i0.ɵɵnextContext().$implicit;
124
+ const ctx_r2 = i0.ɵɵnextContext(2);
173
125
  i0.ɵɵadvance();
174
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusBadgeClass(component_r9.Status || "Draft"));
126
+ i0.ɵɵconditional(component_r2.Description ? 1 : -1);
127
+ i0.ɵɵadvance(9);
128
+ i0.ɵɵtextInterpolate(component_r2.Type || "Unknown");
129
+ i0.ɵɵadvance(5);
130
+ i0.ɵɵtextInterpolate(component_r2.Version || "1.0.0");
131
+ i0.ɵɵadvance(5);
132
+ i0.ɵɵtextInterpolate(component_r2.Status || "Draft");
175
133
  i0.ɵɵadvance();
176
- i0.ɵɵtextInterpolate1(" ", component_r9.Status, " ");
177
- i0.ɵɵadvance(3);
178
- i0.ɵɵtextInterpolate(component_r9.Name);
134
+ i0.ɵɵconditional(component_r2.__mj_UpdatedAt ? 21 : -1);
179
135
  i0.ɵɵadvance(2);
180
- i0.ɵɵtextInterpolate1("v", component_r9.Version, "");
181
- i0.ɵɵadvance(2);
182
- i0.ɵɵtextInterpolate(component_r9.Description || "No description available");
183
- i0.ɵɵadvance(3);
184
- i0.ɵɵtextInterpolate1(" ", component_r9.Namespace || "root", " ");
185
- i0.ɵɵadvance(4);
186
- i0.ɵɵtextInterpolate1(" ", component_r9.DeveloperOrganization || component_r9.DeveloperName || "Unknown", " ");
187
- i0.ɵɵadvance(2);
188
- i0.ɵɵconditional(!component_r9.SourceRegistryID ? 21 : 22);
189
- } }
190
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_Template(rf, ctx) { if (rf & 1) {
191
- i0.ɵɵelementStart(0, "div", 43);
192
- i0.ɵɵrepeaterCreate(1, ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_For_2_Template, 23, 13, "div", 45, _forTrack0);
193
- i0.ɵɵelementEnd();
194
- } if (rf & 2) {
195
- const ctx_r1 = i0.ɵɵnextContext(3);
196
- i0.ɵɵadvance();
197
- i0.ɵɵrepeater(ctx_r1.filteredComponents$.value);
136
+ i0.ɵɵconditional((ctx_r2.selectedComponent == null ? null : ctx_r2.selectedComponent.ID) === component_r2.ID && ctx_r2.isRunning ? 23 : 24);
198
137
  } }
199
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_5_ng_template_2_Template(rf, ctx) { if (rf & 1) {
200
- i0.ɵɵelementStart(0, "div", 71);
201
- i0.ɵɵelement(1, "span", 72);
202
- i0.ɵɵtext(2);
138
+ function ComponentStudioDashboardComponent_Conditional_20_For_1_Template(rf, ctx) { if (rf & 1) {
139
+ const _r1 = i0.ɵɵgetCurrentView();
140
+ i0.ɵɵelementStart(0, "div", 21)(1, "div", 22);
141
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_20_For_1_Template_div_click_1_listener() { const component_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleComponentExpansion(component_r2)); });
142
+ i0.ɵɵelementStart(2, "div", 23);
143
+ i0.ɵɵelement(3, "i", 24);
203
144
  i0.ɵɵelementEnd();
204
- } if (rf & 2) {
205
- const dataItem_r11 = ctx.$implicit;
206
- const ctx_r1 = i0.ɵɵnextContext(4);
207
- i0.ɵɵadvance();
208
- i0.ɵɵstyleProp("background-color", ctx_r1.getComponentTypeColor(dataItem_r11.Type || "Other"));
209
- i0.ɵɵadvance();
210
- i0.ɵɵtextInterpolate1(" ", dataItem_r11.Name, " ");
211
- } }
212
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_5_ng_template_6_Template(rf, ctx) { if (rf & 1) {
213
- i0.ɵɵelementStart(0, "span", 40);
214
- i0.ɵɵtext(1);
145
+ i0.ɵɵelementStart(4, "div", 25)(5, "div", 26);
146
+ i0.ɵɵtext(6);
215
147
  i0.ɵɵelementEnd();
216
- } if (rf & 2) {
217
- const dataItem_r12 = ctx.$implicit;
218
- const ctx_r1 = i0.ɵɵnextContext(4);
219
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusBadgeClass(dataItem_r12.Status || "Draft"));
220
- i0.ɵɵadvance();
221
- i0.ɵɵtextInterpolate1(" ", dataItem_r12.Status, " ");
222
- } }
223
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_5_Template(rf, ctx) { if (rf & 1) {
224
- const _r10 = i0.ɵɵgetCurrentView();
225
- i0.ɵɵelementStart(0, "kendo-grid", 62);
226
- i0.ɵɵlistener("selectionChange", function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_5_Template_kendo_grid_selectionChange_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectComponent($event.selectedRows && $event.selectedRows[0] ? $event.selectedRows[0].dataItem : null)); });
227
- i0.ɵɵelementStart(1, "kendo-grid-column", 63);
228
- i0.ɵɵtemplate(2, ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_5_ng_template_2_Template, 3, 3, "ng-template", 64);
148
+ i0.ɵɵelementStart(7, "div", 27)(8, "span", 28);
149
+ i0.ɵɵtext(9);
229
150
  i0.ɵɵelementEnd();
230
- i0.ɵɵelement(3, "kendo-grid-column", 65)(4, "kendo-grid-column", 66);
231
- i0.ɵɵelementStart(5, "kendo-grid-column", 67);
232
- i0.ɵɵtemplate(6, ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_5_ng_template_6_Template, 2, 2, "ng-template", 64);
151
+ i0.ɵɵelementStart(10, "span", 29);
152
+ i0.ɵɵtext(11);
233
153
  i0.ɵɵelementEnd();
234
- i0.ɵɵelement(7, "kendo-grid-column", 68)(8, "kendo-grid-column", 69)(9, "kendo-grid-column", 70);
154
+ i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_12_Template, 2, 0, "span", 30)(13, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_13_Template, 2, 0, "span", 31);
155
+ i0.ɵɵelementEnd()();
156
+ i0.ɵɵelementStart(14, "div", 32);
157
+ i0.ɵɵtemplate(15, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_15_Template, 1, 0, "i", 33)(16, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_16_Template, 1, 0, "i", 34);
158
+ i0.ɵɵelementEnd()();
159
+ i0.ɵɵtemplate(17, ComponentStudioDashboardComponent_Conditional_20_For_1_Conditional_17_Template, 25, 6, "div", 35);
235
160
  i0.ɵɵelementEnd();
236
161
  } if (rf & 2) {
237
- const ctx_r1 = i0.ɵɵnextContext(3);
238
- i0.ɵɵproperty("data", ctx_r1.filteredComponents$.value)("pageSize", 20)("pageable", true)("sortable", true)("filterable", false)("resizable", true)("selectable", true);
239
- i0.ɵɵadvance();
240
- i0.ɵɵproperty("width", 250);
162
+ const component_r2 = ctx.$implicit;
163
+ const ctx_r2 = i0.ɵɵnextContext(2);
164
+ i0.ɵɵclassProp("expanded", (ctx_r2.expandedComponent == null ? null : ctx_r2.expandedComponent.ID) === component_r2.ID)("running", (ctx_r2.selectedComponent == null ? null : ctx_r2.selectedComponent.ID) === component_r2.ID && ctx_r2.isRunning);
241
165
  i0.ɵɵadvance(2);
242
- i0.ɵɵproperty("width", 80);
166
+ i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(component_r2.Type));
243
167
  i0.ɵɵadvance();
244
- i0.ɵɵproperty("width", 100);
245
- i0.ɵɵadvance();
246
- i0.ɵɵproperty("width", 100);
168
+ i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(component_r2.Type));
169
+ i0.ɵɵadvance(3);
170
+ i0.ɵɵtextInterpolate(component_r2.Name);
171
+ i0.ɵɵadvance(3);
172
+ i0.ɵɵtextInterpolate(component_r2.Type || "Component");
247
173
  i0.ɵɵadvance(2);
248
- i0.ɵɵproperty("width", 200);
174
+ i0.ɵɵtextInterpolate1("v", component_r2.Version || "1.0.0", "");
249
175
  i0.ɵɵadvance();
250
- i0.ɵɵproperty("width", 150);
251
- } }
252
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Template(rf, ctx) { if (rf & 1) {
253
- i0.ɵɵelementStart(0, "div", 21)(1, "div", 41)(2, "span", 42);
254
- i0.ɵɵtext(3);
255
- i0.ɵɵelementEnd()();
256
- i0.ɵɵtemplate(4, ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_4_Template, 3, 0, "div", 43)(5, ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Conditional_5_Template, 10, 13, "kendo-grid", 44);
257
- i0.ɵɵelementEnd();
258
- } if (rf & 2) {
259
- const ctx_r1 = i0.ɵɵnextContext(2);
176
+ i0.ɵɵconditional(component_r2.Status === "Published" ? 12 : 13);
260
177
  i0.ɵɵadvance(3);
261
- i0.ɵɵtextInterpolate1(" ", ctx_r1.filteredComponents$.value.length, " components found ");
262
- i0.ɵɵadvance();
263
- i0.ɵɵconditional(ctx_r1.viewMode === "grid" ? 4 : 5);
178
+ i0.ɵɵconditional((ctx_r2.expandedComponent == null ? null : ctx_r2.expandedComponent.ID) === component_r2.ID ? 15 : 16);
179
+ i0.ɵɵadvance(2);
180
+ i0.ɵɵconditional((ctx_r2.expandedComponent == null ? null : ctx_r2.expandedComponent.ID) === component_r2.ID ? 17 : -1);
264
181
  } }
265
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_17_Conditional_1_Template(rf, ctx) { if (rf & 1) {
266
- const _r13 = i0.ɵɵgetCurrentView();
267
- i0.ɵɵelementStart(0, "mj-component-preview", 75);
268
- i0.ɵɵlistener("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_3_Conditional_17_Conditional_1_Template_mj_component_preview_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); });
269
- i0.ɵɵelementEnd();
182
+ function ComponentStudioDashboardComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
183
+ i0.ɵɵrepeaterCreate(0, ComponentStudioDashboardComponent_Conditional_20_For_1_Template, 18, 13, "div", 20, _forTrack0);
270
184
  } if (rf & 2) {
271
- const ctx_r1 = i0.ɵɵnextContext(3);
272
- i0.ɵɵproperty("component", ctx_r1.selectedComponent)("componentSpec", ctx_r1.componentSpec);
185
+ const ctx_r2 = i0.ɵɵnextContext();
186
+ i0.ɵɵrepeater(ctx_r2.filteredComponents);
273
187
  } }
274
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_17_Conditional_2_Template(rf, ctx) { if (rf & 1) {
275
- i0.ɵɵelementStart(0, "div", 74);
276
- i0.ɵɵelement(1, "i", 76);
277
- i0.ɵɵelementStart(2, "h3");
278
- i0.ɵɵtext(3, "No Component Selected");
188
+ function ComponentStudioDashboardComponent_Conditional_23_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
189
+ i0.ɵɵelementStart(0, "details", 53)(1, "summary");
190
+ i0.ɵɵtext(2, "Technical Details (click to expand)");
279
191
  i0.ɵɵelementEnd();
280
- i0.ɵɵelementStart(4, "p");
281
- i0.ɵɵtext(5, "Select a component from the Browse tab to preview it");
192
+ i0.ɵɵelementStart(3, "pre");
193
+ i0.ɵɵtext(4);
282
194
  i0.ɵɵelementEnd()();
283
- } }
284
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_17_Template(rf, ctx) { if (rf & 1) {
285
- i0.ɵɵelementStart(0, "div", 22);
286
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_3_Conditional_17_Conditional_1_Template, 1, 2, "mj-component-preview", 73)(2, ComponentStudioDashboardComponent_Conditional_3_Conditional_17_Conditional_2_Template, 6, 0, "div", 74);
287
- i0.ɵɵelementEnd();
288
195
  } if (rf & 2) {
289
- const ctx_r1 = i0.ɵɵnextContext(2);
290
- i0.ɵɵadvance();
291
- i0.ɵɵconditional(ctx_r1.selectedComponent ? 1 : 2);
196
+ const ctx_r2 = i0.ɵɵnextContext(3);
197
+ i0.ɵɵadvance(4);
198
+ i0.ɵɵtextInterpolate(ctx_r2.formatTechnicalDetails(ctx_r2.currentError.technicalDetails));
292
199
  } }
293
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
294
- const _r14 = i0.ɵɵgetCurrentView();
295
- i0.ɵɵelementStart(0, "mj-component-dependencies", 78);
296
- i0.ɵɵlistener("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_3_Conditional_18_Conditional_1_Template_mj_component_dependencies_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); });
200
+ function ComponentStudioDashboardComponent_Conditional_23_Conditional_0_Template(rf, ctx) { if (rf & 1) {
201
+ const _r6 = i0.ɵɵgetCurrentView();
202
+ i0.ɵɵelementStart(0, "div", 44)(1, "div", 46)(2, "div", 47);
203
+ i0.ɵɵelement(3, "i", 48);
204
+ i0.ɵɵelementStart(4, "h3");
205
+ i0.ɵɵtext(5, "Component Error");
206
+ i0.ɵɵelementEnd();
207
+ i0.ɵɵelementStart(6, "button", 49);
208
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_23_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.copyErrorToClipboard()); });
209
+ i0.ɵɵelement(7, "i", 50);
210
+ i0.ɵɵelementEnd()();
211
+ i0.ɵɵelementStart(8, "p", 51);
212
+ i0.ɵɵtext(9, " The component could not be rendered due to the following error: ");
297
213
  i0.ɵɵelementEnd();
298
- } if (rf & 2) {
299
- const ctx_r1 = i0.ɵɵnextContext(3);
300
- i0.ɵɵproperty("component", ctx_r1.selectedComponent);
301
- } }
302
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
303
- i0.ɵɵelementStart(0, "div", 74);
304
- i0.ɵɵelement(1, "i", 79);
305
- i0.ɵɵelementStart(2, "h3");
306
- i0.ɵɵtext(3, "No Component Selected");
214
+ i0.ɵɵelementStart(10, "div", 52)(11, "strong");
215
+ i0.ɵɵtext(12, "Error Type:");
307
216
  i0.ɵɵelementEnd();
308
- i0.ɵɵelementStart(4, "p");
309
- i0.ɵɵtext(5, "Select a component to view its dependencies");
310
- i0.ɵɵelementEnd()();
311
- } }
312
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_18_Template(rf, ctx) { if (rf & 1) {
313
- i0.ɵɵelementStart(0, "div", 23);
314
- i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_3_Conditional_18_Conditional_1_Template, 1, 1, "mj-component-dependencies", 77)(2, ComponentStudioDashboardComponent_Conditional_3_Conditional_18_Conditional_2_Template, 6, 0, "div", 74);
217
+ i0.ɵɵtext(13);
218
+ i0.ɵɵelement(14, "br");
219
+ i0.ɵɵelementStart(15, "strong");
220
+ i0.ɵɵtext(16, "Message:");
221
+ i0.ɵɵelementEnd();
222
+ i0.ɵɵtext(17);
223
+ i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_23_Conditional_0_Conditional_18_Template, 5, 1, "details", 53);
224
+ i0.ɵɵelementEnd();
225
+ i0.ɵɵelementStart(19, "div", 54)(20, "strong");
226
+ i0.ɵɵtext(21, "What to do:");
227
+ i0.ɵɵelementEnd();
228
+ i0.ɵɵelementStart(22, "ol")(23, "li");
229
+ i0.ɵɵtext(24, "Check that the component code is valid JavaScript/React");
230
+ i0.ɵɵelementEnd();
231
+ i0.ɵɵelementStart(25, "li");
232
+ i0.ɵɵtext(26, "Ensure all required dependencies are available");
233
+ i0.ɵɵelementEnd();
234
+ i0.ɵɵelementStart(27, "li");
235
+ i0.ɵɵtext(28, "Review the technical details for specific error information");
315
236
  i0.ɵɵelementEnd();
237
+ i0.ɵɵelementStart(29, "li");
238
+ i0.ɵɵtext(30, "Contact your system administrator if the issue persists");
239
+ i0.ɵɵelementEnd()()();
240
+ i0.ɵɵelementStart(31, "div", 55)(32, "button", 56);
241
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_23_Conditional_0_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.retryComponent()); });
242
+ i0.ɵɵtext(33, " Retry ");
243
+ i0.ɵɵelementEnd();
244
+ i0.ɵɵelementStart(34, "button", 43);
245
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_23_Conditional_0_Template_button_click_34_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.stopComponent()); });
246
+ i0.ɵɵtext(35, " Stop ");
247
+ i0.ɵɵelementEnd()()()();
316
248
  } if (rf & 2) {
317
- const ctx_r1 = i0.ɵɵnextContext(2);
249
+ const ctx_r2 = i0.ɵɵnextContext(2);
250
+ i0.ɵɵadvance(13);
251
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.currentError.type, "");
252
+ i0.ɵɵadvance(4);
253
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.currentError.message, " ");
318
254
  i0.ɵɵadvance();
319
- i0.ɵɵconditional(ctx_r1.selectedComponent ? 1 : 2);
255
+ i0.ɵɵconditional(ctx_r2.currentError.technicalDetails ? 18 : -1);
256
+ i0.ɵɵadvance(14);
257
+ i0.ɵɵproperty("icon", "fa-solid fa-rotate");
258
+ i0.ɵɵadvance(2);
259
+ i0.ɵɵproperty("icon", "fa-solid fa-stop")("themeColor", "error");
320
260
  } }
321
- function ComponentStudioDashboardComponent_Conditional_3_Conditional_19_Template(rf, ctx) { if (rf & 1) {
322
- const _r15 = i0.ɵɵgetCurrentView();
323
- i0.ɵɵelementStart(0, "div", 24)(1, "mj-component-studio-settings", 80);
324
- i0.ɵɵlistener("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_3_Conditional_19_Template_mj_component_studio_settings_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); });
325
- i0.ɵɵelementEnd()();
261
+ function ComponentStudioDashboardComponent_Conditional_23_Conditional_1_Template(rf, ctx) { if (rf & 1) {
262
+ const _r7 = i0.ɵɵgetCurrentView();
263
+ i0.ɵɵelementStart(0, "mj-react-component", 57);
264
+ i0.ɵɵlistener("componentEvent", function ComponentStudioDashboardComponent_Conditional_23_Conditional_1_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onComponentEvent($event)); })("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_23_Conditional_1_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onOpenEntityRecord($event)); });
265
+ i0.ɵɵelementEnd();
266
+ } if (rf & 2) {
267
+ const ctx_r2 = i0.ɵɵnextContext(2);
268
+ i0.ɵɵproperty("component", ctx_r2.componentSpec);
326
269
  } }
327
- function ComponentStudioDashboardComponent_Conditional_3_For_22_Template(rf, ctx) { if (rf & 1) {
328
- const _r16 = i0.ɵɵgetCurrentView();
329
- i0.ɵɵelementStart(0, "div", 81);
330
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_3_For_22_Template_div_click_0_listener() { const $index_r17 = i0.ɵɵrestoreView(_r16).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTabChange(ctx_r1.navigationItems[$index_r17])); });
331
- i0.ɵɵelement(1, "i");
332
- i0.ɵɵelementStart(2, "span");
333
- i0.ɵɵtext(3);
334
- i0.ɵɵelementEnd()();
270
+ function ComponentStudioDashboardComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
271
+ i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_23_Conditional_0_Template, 36, 6, "div", 44)(1, ComponentStudioDashboardComponent_Conditional_23_Conditional_1_Template, 1, 1, "mj-react-component", 45);
335
272
  } if (rf & 2) {
336
- const navItem_r18 = ctx.$implicit;
337
- i0.ɵɵclassProp("active", navItem_r18.selected);
338
- i0.ɵɵadvance();
339
- i0.ɵɵclassMap(navItem_r18.icon);
340
- i0.ɵɵadvance(2);
341
- i0.ɵɵtextInterpolate(navItem_r18.text);
273
+ const ctx_r2 = i0.ɵɵnextContext();
274
+ i0.ɵɵconditional(ctx_r2.currentError ? 0 : 1);
342
275
  } }
343
- function ComponentStudioDashboardComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
344
- const _r1 = i0.ɵɵgetCurrentView();
345
- i0.ɵɵelementStart(0, "div", 3)(1, "div", 8)(2, "div", 9)(3, "h1", 10);
346
- i0.ɵɵelement(4, "i", 11);
347
- i0.ɵɵtext(5, " Component Studio ");
348
- i0.ɵɵelementEnd();
349
- i0.ɵɵelementStart(6, "div", 12);
350
- i0.ɵɵtext(7, " Discover, preview, and test reusable components ");
351
- i0.ɵɵelementEnd()();
352
- i0.ɵɵelementStart(8, "div", 13)(9, "div", 14)(10, "button", 15);
353
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_3_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleViewMode()); });
276
+ function ComponentStudioDashboardComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
277
+ i0.ɵɵelementStart(0, "div", 17);
278
+ i0.ɵɵelement(1, "i", 58);
279
+ i0.ɵɵelementStart(2, "h2");
280
+ i0.ɵɵtext(3, "Ready to Test Components");
354
281
  i0.ɵɵelementEnd();
355
- i0.ɵɵelementStart(11, "button", 16);
356
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_3_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleFilterPanel()); });
357
- i0.ɵɵelementEnd();
358
- i0.ɵɵelementStart(12, "button", 17);
359
- i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_3_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.refreshData()); });
360
- i0.ɵɵelementEnd()()()();
361
- i0.ɵɵelementStart(13, "div", 18);
362
- i0.ɵɵtemplate(14, ComponentStudioDashboardComponent_Conditional_3_Conditional_14_Template, 35, 6, "div", 19);
363
- i0.ɵɵelementStart(15, "div", 20);
364
- i0.ɵɵtemplate(16, ComponentStudioDashboardComponent_Conditional_3_Conditional_16_Template, 6, 2, "div", 21)(17, ComponentStudioDashboardComponent_Conditional_3_Conditional_17_Template, 3, 1, "div", 22)(18, ComponentStudioDashboardComponent_Conditional_3_Conditional_18_Template, 3, 1, "div", 23)(19, ComponentStudioDashboardComponent_Conditional_3_Conditional_19_Template, 2, 0, "div", 24);
365
- i0.ɵɵelementEnd()();
366
- i0.ɵɵelementStart(20, "div", 25);
367
- i0.ɵɵrepeaterCreate(21, ComponentStudioDashboardComponent_Conditional_3_For_22_Template, 4, 5, "div", 26, i0.ɵɵrepeaterTrackByIndex);
282
+ i0.ɵɵelementStart(4, "p");
283
+ i0.ɵɵtext(5, "Select a component from the list and click \"Run Component\" to see it in action");
368
284
  i0.ɵɵelementEnd()();
369
- } if (rf & 2) {
370
- const ctx_r1 = i0.ɵɵnextContext();
371
- i0.ɵɵadvance(10);
372
- i0.ɵɵproperty("icon", ctx_r1.viewMode === "grid" ? "fa-solid fa-list" : "fa-solid fa-th")("fillMode", "flat");
373
- i0.ɵɵadvance();
374
- i0.ɵɵproperty("icon", ctx_r1.showFilterPanel ? "fa-solid fa-filter-circle-xmark" : "fa-solid fa-filter")("fillMode", "flat");
375
- i0.ɵɵadvance();
376
- i0.ɵɵproperty("icon", "fa-solid fa-sync")("fillMode", "flat");
377
- i0.ɵɵadvance(2);
378
- i0.ɵɵconditional(ctx_r1.showFilterPanel && ctx_r1.activeTab === "browse" ? 14 : -1);
379
- i0.ɵɵadvance(2);
380
- i0.ɵɵconditional(ctx_r1.activeTab === "browse" ? 16 : -1);
381
- i0.ɵɵadvance();
382
- i0.ɵɵconditional(ctx_r1.activeTab === "preview" ? 17 : -1);
383
- i0.ɵɵadvance();
384
- i0.ɵɵconditional(ctx_r1.activeTab === "dependencies" ? 18 : -1);
385
- i0.ɵɵadvance();
386
- i0.ɵɵconditional(ctx_r1.activeTab === "settings" ? 19 : -1);
387
- i0.ɵɵadvance(2);
388
- i0.ɵɵrepeater(ctx_r1.navigationConfig);
389
285
  } }
390
286
  let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent extends BaseDashboard {
391
287
  cdr;
392
- // State management
393
- isLoading = false;
394
- activeTab = 'browse'; // Default tab
395
- viewMode = 'grid';
396
- selectedComponentId = null;
397
- showFilterPanel = true;
398
- showPreviewPanel = false;
399
- // Data
400
- components$ = new BehaviorSubject([]);
401
- filteredComponents$ = new BehaviorSubject([]);
402
- registries$ = new BehaviorSubject([]);
403
- libraries$ = new BehaviorSubject([]);
404
- // Filters
405
- searchQuery$ = new BehaviorSubject('');
406
- selectedTypes$ = new BehaviorSubject(new Set());
407
- selectedStatuses$ = new BehaviorSubject(new Set(['Published'])); // Default to published
408
- selectedSources$ = new BehaviorSubject(new Set());
409
- selectedNamespaces$ = new BehaviorSubject(new Set());
410
- // Component types for filtering
411
- componentTypes = ['Report', 'Dashboard', 'Form', 'Table', 'Chart', 'Navigation', 'Search', 'Widget', 'Utility', 'Other'];
412
- componentStatuses = ['Draft', 'Published', 'Deprecated'];
413
- // Preview
288
+ // Component data
289
+ components = [];
290
+ filteredComponents = [];
414
291
  selectedComponent = null;
292
+ expandedComponent = null; // Track which card is expanded
415
293
  componentSpec = null;
416
- previewError = null;
417
- // Navigation items for bottom navigation
418
- navigationItems = ['browse', 'preview', 'dependencies', 'settings'];
419
- navigationConfig = [
420
- { text: 'Browse', icon: 'fa-solid fa-th', selected: true },
421
- { text: 'Preview', icon: 'fa-solid fa-eye', selected: false },
422
- { text: 'Dependencies', icon: 'fa-solid fa-sitemap', selected: false },
423
- { text: 'Settings', icon: 'fa-solid fa-cog', selected: false }
424
- ];
294
+ isLoading = false;
295
+ searchQuery = '';
296
+ isRunning = false; // Track if component is currently running
297
+ // Error handling
298
+ currentError = null;
425
299
  destroy$ = new Subject();
426
- stateChangeSubject = new Subject();
427
300
  constructor(cdr) {
428
301
  super();
429
302
  this.cdr = cdr;
@@ -431,305 +304,213 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
431
304
  ngAfterViewInit() {
432
305
  this.initDashboard();
433
306
  this.loadData();
434
- this.emitStateChange();
435
- this.updateNavigationSelection();
436
- // Force change detection
437
- this.cdr.detectChanges();
438
- }
439
- initDashboard() {
440
- // Initialize dashboard - called once when dashboard is created
441
- this.setupStateManagement();
442
- this.setupFilterSubscriptions();
443
307
  }
444
308
  ngOnDestroy() {
445
309
  this.destroy$.next();
446
310
  this.destroy$.complete();
447
- this.stateChangeSubject.complete();
311
+ }
312
+ initDashboard() {
313
+ // Initialize dashboard
448
314
  }
449
315
  async loadData() {
450
316
  this.isLoading = true;
451
- this.cdr.markForCheck();
452
317
  try {
453
318
  const rv = new RunView();
454
- // Load all data in parallel using RunViews
455
- const [componentsResult, registriesResult, librariesResult] = await rv.RunViews([
456
- {
457
- EntityName: 'Components',
458
- ExtraFilter: '',
459
- OrderBy: 'Name',
460
- MaxRows: 1000,
461
- ResultType: 'entity_object'
462
- },
463
- {
464
- EntityName: 'Component Registries',
465
- ExtraFilter: '',
466
- OrderBy: 'Name',
467
- MaxRows: 100,
468
- ResultType: 'entity_object'
469
- },
470
- {
471
- EntityName: 'Component Libraries',
472
- ExtraFilter: '',
473
- OrderBy: 'Name',
474
- MaxRows: 500,
475
- ResultType: 'entity_object'
476
- }
477
- ]);
478
- if (componentsResult.Success) {
479
- const components = componentsResult.Results;
480
- // Load dependencies for each component if needed
481
- // For now, just set the basic data
482
- this.components$.next(components);
483
- this.applyFilters();
484
- }
485
- if (registriesResult.Success) {
486
- this.registries$.next(registriesResult.Results);
319
+ const result = await rv.RunView({
320
+ EntityName: 'MJ: Components',
321
+ ExtraFilter: '',
322
+ OrderBy: 'Name',
323
+ MaxRows: 1000,
324
+ ResultType: 'entity_object'
325
+ });
326
+ if (result.Success) {
327
+ this.components = result.Results || [];
328
+ this.filterComponents();
487
329
  }
488
- if (librariesResult.Success) {
489
- this.libraries$.next(librariesResult.Results);
330
+ else {
331
+ console.error('Failed to load components:', result.ErrorMessage);
490
332
  }
491
333
  }
492
334
  catch (error) {
493
- console.error('Failed to load component data:', error);
335
+ console.error('Error loading components:', error);
494
336
  }
495
337
  finally {
496
338
  this.isLoading = false;
497
- this.cdr.markForCheck();
498
339
  }
499
340
  }
500
- setupFilterSubscriptions() {
501
- // Combine all filter observables and apply filters when any change
502
- combineLatest([
503
- this.searchQuery$.pipe(debounceTime(300), distinctUntilChanged()),
504
- this.selectedTypes$,
505
- this.selectedStatuses$,
506
- this.selectedSources$,
507
- this.selectedNamespaces$,
508
- this.components$
509
- ])
510
- .pipe(takeUntil(this.destroy$))
511
- .subscribe(([search, types, statuses, sources, namespaces, components]) => {
512
- this.applyFiltersWithCriteria(search, types, statuses, sources, namespaces, components);
513
- });
514
- }
515
- applyFilters() {
516
- const search = this.searchQuery$.value;
517
- const types = this.selectedTypes$.value;
518
- const statuses = this.selectedStatuses$.value;
519
- const sources = this.selectedSources$.value;
520
- const namespaces = this.selectedNamespaces$.value;
521
- const components = this.components$.value;
522
- this.applyFiltersWithCriteria(search, types, statuses, sources, namespaces, components);
341
+ onSearchChange(query) {
342
+ this.searchQuery = query;
343
+ this.filterComponents();
523
344
  }
524
- applyFiltersWithCriteria(search, types, statuses, sources, namespaces, components) {
525
- let filtered = [...components];
526
- // Search filter
527
- if (search) {
528
- const query = search.toLowerCase();
529
- filtered = filtered.filter(c => c.Name?.toLowerCase().includes(query) ||
530
- c.Description?.toLowerCase().includes(query) ||
531
- c.Namespace?.toLowerCase().includes(query) ||
532
- c.DeveloperName?.toLowerCase().includes(query) ||
533
- c.DeveloperOrganization?.toLowerCase().includes(query));
345
+ filterComponents() {
346
+ if (!this.searchQuery) {
347
+ this.filteredComponents = [...this.components];
534
348
  }
535
- // Type filter
536
- if (types.size > 0) {
537
- filtered = filtered.filter(c => c.Type && types.has(c.Type));
349
+ else {
350
+ const query = this.searchQuery.toLowerCase();
351
+ this.filteredComponents = this.components.filter(c => c.Name?.toLowerCase().includes(query) ||
352
+ c.Description?.toLowerCase().includes(query) ||
353
+ c.Type?.toLowerCase().includes(query));
538
354
  }
539
- // Status filter
540
- if (statuses.size > 0) {
541
- filtered = filtered.filter(c => c.Status && statuses.has(c.Status));
355
+ }
356
+ toggleComponentExpansion(component) {
357
+ // Toggle expansion - if clicking the same component, collapse it
358
+ if (this.expandedComponent?.ID === component.ID) {
359
+ this.expandedComponent = null;
542
360
  }
543
- // Source filter (Local vs Registry)
544
- if (sources.size > 0) {
545
- filtered = filtered.filter(c => {
546
- const isLocal = !c.SourceRegistryID;
547
- return (sources.has('Local') && isLocal) || (sources.has('Registry') && !isLocal);
548
- });
361
+ else {
362
+ this.expandedComponent = component;
549
363
  }
550
- // Namespace filter
551
- if (namespaces.size > 0) {
552
- filtered = filtered.filter(c => {
553
- if (!c.Namespace)
554
- return false;
555
- // Check if namespace starts with any selected namespace
556
- return Array.from(namespaces).some(ns => c.Namespace?.startsWith(ns));
557
- });
364
+ this.cdr.detectChanges();
365
+ }
366
+ runComponent(component) {
367
+ this.selectedComponent = component;
368
+ this.componentSpec = JSON.parse(component.Specification);
369
+ this.isRunning = true;
370
+ this.currentError = null; // Clear any previous errors
371
+ console.log('Running component:', component.Name);
372
+ this.cdr.detectChanges();
373
+ }
374
+ stopComponent() {
375
+ this.isRunning = false;
376
+ this.selectedComponent = null;
377
+ this.componentSpec = null;
378
+ this.currentError = null;
379
+ this.cdr.detectChanges();
380
+ }
381
+ /**
382
+ * Handle component events from React components
383
+ */
384
+ onComponentEvent(event) {
385
+ if (event.type === 'error') {
386
+ this.currentError = {
387
+ type: event.payload?.source || 'Component Error',
388
+ message: event.payload?.error || 'An error occurred while rendering the component',
389
+ technicalDetails: event.payload?.errorInfo || event.payload
390
+ };
391
+ this.cdr.detectChanges();
558
392
  }
559
- this.filteredComponents$.next(filtered);
560
- this.cdr.markForCheck();
561
393
  }
562
- onTabChange(tabId) {
563
- this.activeTab = tabId;
564
- this.updateNavigationSelection();
565
- // Trigger resize for rendering issues
566
- setTimeout(() => {
567
- SharedService.Instance.InvokeManualResize();
568
- }, 100);
569
- this.emitStateChange();
570
- this.cdr.markForCheck();
394
+ /**
395
+ * Handle open entity record event from React components
396
+ */
397
+ onOpenEntityRecord(event) {
398
+ // Use SharedService to open the entity record in a new window/tab
399
+ SharedService.Instance.OpenEntityRecord(event.entityName, event.key);
571
400
  }
572
- onNavigationChange(event) {
573
- const index = event.index;
574
- if (index >= 0 && index < this.navigationItems.length) {
575
- this.activeTab = this.navigationItems[index];
576
- this.updateNavigationSelection();
577
- this.emitStateChange();
401
+ /**
402
+ * Retry running the current component
403
+ */
404
+ retryComponent() {
405
+ if (this.selectedComponent) {
406
+ this.currentError = null;
407
+ this.isRunning = false;
408
+ this.cdr.detectChanges();
409
+ // Small delay to reset the component
578
410
  setTimeout(() => {
579
- SharedService.Instance.InvokeManualResize();
411
+ this.runComponent(this.selectedComponent);
580
412
  }, 100);
581
- this.cdr.markForCheck();
582
413
  }
583
414
  }
584
- updateNavigationSelection() {
585
- this.navigationConfig.forEach((item, index) => {
586
- item.selected = this.navigationItems[index] === this.activeTab;
587
- });
588
- }
589
- toggleViewMode() {
590
- this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';
591
- this.emitStateChange();
592
- this.cdr.markForCheck();
593
- }
594
- toggleFilterPanel() {
595
- this.showFilterPanel = !this.showFilterPanel;
596
- this.cdr.markForCheck();
597
- }
598
- async selectComponent(component) {
599
- if (!component)
415
+ /**
416
+ * Copy error details to clipboard
417
+ */
418
+ async copyErrorToClipboard() {
419
+ if (!this.currentError)
600
420
  return;
601
- this.selectedComponent = component;
602
- this.selectedComponentId = component.ID;
603
- // Load component details if in preview mode
604
- if (this.activeTab === 'preview') {
605
- await this.loadComponentDetails(component);
606
- }
607
- this.emitStateChange();
608
- this.cdr.markForCheck();
609
- }
610
- async loadComponentDetails(component) {
421
+ const errorText = `
422
+ Component Error Report
423
+ ${'='.repeat(50)}
424
+ Component: ${this.selectedComponent?.Name}
425
+ Error Type: ${this.currentError.type}
426
+ Message: ${this.currentError.message}
427
+ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify(this.currentError.technicalDetails, null, 2) : ''}
428
+ `;
611
429
  try {
612
- // TODO: Load component spec from storage
613
- // For now, we'll need to implement storage of ComponentSpec
614
- this.componentSpec = null;
615
- this.previewError = null;
430
+ await navigator.clipboard.writeText(errorText);
431
+ console.log('Error details copied to clipboard');
616
432
  }
617
- catch (error) {
618
- this.previewError = 'Failed to load component details';
619
- console.error('Error loading component details:', error);
433
+ catch (err) {
434
+ console.error('Failed to copy to clipboard:', err);
620
435
  }
621
436
  }
622
- onSearchChange(query) {
623
- this.searchQuery$.next(query);
624
- }
625
- onTypeFilterChange(type, checked) {
626
- const types = new Set(this.selectedTypes$.value);
627
- if (checked) {
628
- types.add(type);
437
+ /**
438
+ * Format technical details for display
439
+ */
440
+ formatTechnicalDetails(details) {
441
+ if (typeof details === 'string') {
442
+ return details;
629
443
  }
630
- else {
631
- types.delete(type);
632
- }
633
- this.selectedTypes$.next(types);
634
- }
635
- onStatusFilterChange(status, checked) {
636
- const statuses = new Set(this.selectedStatuses$.value);
637
- if (checked) {
638
- statuses.add(status);
639
- }
640
- else {
641
- statuses.delete(status);
642
- }
643
- this.selectedStatuses$.next(statuses);
644
- }
645
- onSourceFilterChange(source, checked) {
646
- const sources = new Set(this.selectedSources$.value);
647
- if (checked) {
648
- sources.add(source);
649
- }
650
- else {
651
- sources.delete(source);
652
- }
653
- this.selectedSources$.next(sources);
654
- }
655
- clearFilters() {
656
- this.searchQuery$.next('');
657
- this.selectedTypes$.next(new Set());
658
- this.selectedStatuses$.next(new Set(['Published']));
659
- this.selectedSources$.next(new Set());
660
- this.selectedNamespaces$.next(new Set());
661
- }
662
- onOpenEntityRecord(event) {
663
- this.OpenEntityRecord.emit({
664
- EntityName: event.entityName,
665
- RecordPKey: event.key
666
- });
444
+ return JSON.stringify(details, null, 2);
667
445
  }
668
446
  async refreshData() {
669
447
  await this.loadData();
670
448
  }
671
- setupStateManagement() {
672
- this.stateChangeSubject.pipe(debounceTime(50), takeUntil(this.destroy$)).subscribe(state => {
673
- this.UserStateChanged.emit(state);
674
- });
675
- }
676
- emitStateChange() {
677
- const state = {
678
- activeTab: this.activeTab,
679
- selectedComponentId: this.selectedComponentId,
680
- filterState: {
681
- types: Array.from(this.selectedTypes$.value),
682
- statuses: Array.from(this.selectedStatuses$.value),
683
- sources: Array.from(this.selectedSources$.value),
684
- namespaces: Array.from(this.selectedNamespaces$.value)
685
- },
686
- searchQuery: this.searchQuery$.value,
687
- viewMode: this.viewMode,
688
- previewState: {
689
- componentId: this.selectedComponentId,
690
- isLoading: false,
691
- error: this.previewError,
692
- testData: null
693
- }
449
+ getComponentTypeIcon(type) {
450
+ const icons = {
451
+ 'Report': 'fa-file-alt',
452
+ 'Dashboard': 'fa-tachometer-alt',
453
+ 'Form': 'fa-edit',
454
+ 'Chart': 'fa-chart-bar',
455
+ 'Table': 'fa-table',
456
+ 'Widget': 'fa-cube',
457
+ 'Navigation': 'fa-compass',
458
+ 'Search': 'fa-search',
459
+ 'Utility': 'fa-cog'
694
460
  };
695
- this.stateChangeSubject.next(state);
461
+ return icons[type || ''] || 'fa-puzzle-piece';
696
462
  }
697
- // Helper methods for template
698
463
  getComponentTypeColor(type) {
699
464
  const colors = {
700
- 'Report': '#3B82F6', // Blue
701
- 'Dashboard': '#8B5CF6', // Purple
702
- 'Form': '#10B981', // Green
703
- 'Chart': '#F97316', // Orange
704
- 'Table': '#06B6D4', // Cyan
705
- 'Widget': '#EC4899', // Pink
706
- 'Navigation': '#6366F1', // Indigo
707
- 'Search': '#14B8A6', // Teal
708
- 'Utility': '#64748B', // Slate
709
- 'Other': '#9CA3AF' // Gray
465
+ 'Report': '#3B82F6',
466
+ 'Dashboard': '#8B5CF6',
467
+ 'Form': '#10B981',
468
+ 'Chart': '#F97316',
469
+ 'Table': '#06B6D4',
470
+ 'Widget': '#EC4899',
471
+ 'Navigation': '#6366F1',
472
+ 'Search': '#14B8A6',
473
+ 'Utility': '#64748B'
710
474
  };
711
- return colors[type] || colors['Other'];
712
- }
713
- getStatusBadgeClass(status) {
714
- const classes = {
715
- 'Draft': 'badge-draft',
716
- 'Published': 'badge-published',
717
- 'Deprecated': 'badge-deprecated'
718
- };
719
- return classes[status] || 'badge-default';
475
+ return colors[type || ''] || '#9CA3AF';
720
476
  }
721
477
  static ɵfac = function ComponentStudioDashboardComponent_Factory(t) { return new (t || ComponentStudioDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
722
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentStudioDashboardComponent, selectors: [["mj-component-studio-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 2, consts: [[1, "component-studio-dashboard"], ["kendoDialogContainer", ""], [1, "loading-container"], [1, "dashboard-wrapper"], [1, "loading-content"], [1, "loading-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-3x"], [1, "loading-text"], [1, "dashboard-header"], [1, "header-left"], [1, "dashboard-title"], [1, "fa-solid", "fa-puzzle-piece"], [1, "dashboard-subtitle"], [1, "header-right"], [1, "header-actions"], ["kendoButton", "", "title", "Toggle view mode", 3, "click", "icon", "fillMode"], ["kendoButton", "", "title", "Toggle filters", 3, "click", "icon", "fillMode"], ["kendoButton", "", "title", "Refresh", 3, "click", "icon", "fillMode"], [1, "dashboard-content"], [1, "filter-panel"], [1, "content-area"], [1, "browse-content"], [1, "preview-content"], [1, "dependencies-content"], [1, "settings-content"], [1, "dashboard-navigation"], [1, "nav-item", 3, "active"], [1, "filter-header"], ["kendoButton", "", 3, "click", "fillMode", "size"], [1, "filter-section"], [1, "filter-label"], ["placeholder", "Search components...", 3, "valueChange", "value", "clearButton"], ["kendoTextBoxPrefixTemplate", ""], [1, "filter-options"], [1, "checkbox-label"], ["type", "checkbox", 3, "change", "checked"], [1, "fa-solid", "fa-house"], [1, "fa-solid", "fa-cloud"], [1, "fa-solid", "fa-search"], [1, "type-indicator"], [1, "status-badge", 3, "ngClass"], [1, "results-summary"], [1, "result-count"], [1, "component-grid"], [3, "data", "pageSize", "pageable", "sortable", "filterable", "resizable", "selectable"], [1, "component-card", 3, "selected"], [1, "component-card", 3, "click"], [1, "card-header"], [1, "card-type"], [1, "card-status", 3, "ngClass"], [1, "card-body"], [1, "card-title"], [1, "card-version"], [1, "card-description"], [1, "card-namespace"], [1, "fa-solid", "fa-folder-tree"], [1, "card-footer"], [1, "card-developer"], [1, "fa-solid", "fa-user"], [1, "card-source"], ["title", "Local", 1, "fa-solid", "fa-house"], ["title", "Registry", 1, "fa-solid", "fa-cloud"], [3, "selectionChange", "data", "pageSize", "pageable", "sortable", "filterable", "resizable", "selectable"], ["field", "Name", "title", "Component", 3, "width"], ["kendoGridCellTemplate", ""], ["field", "Version", "title", "Version", 3, "width"], ["field", "Type", "title", "Type", 3, "width"], ["field", "Status", "title", "Status", 3, "width"], ["field", "Namespace", "title", "Namespace", 3, "width"], ["field", "DeveloperOrganization", "title", "Developer", 3, "width"], ["field", "Description", "title", "Description"], [1, "component-name"], [1, "type-dot"], [3, "component", "componentSpec"], [1, "empty-state"], [3, "openEntityRecord", "component", "componentSpec"], [1, "fa-solid", "fa-eye", "fa-4x"], [3, "component"], [3, "openEntityRecord", "component"], [1, "fa-solid", "fa-sitemap", "fa-4x"], [3, "openEntityRecord"], [1, "nav-item", 3, "click"]], template: function ComponentStudioDashboardComponent_Template(rf, ctx) { if (rf & 1) {
723
- i0.ɵɵelementStart(0, "div", 0);
724
- i0.ɵɵelement(1, "div", 1);
725
- i0.ɵɵtemplate(2, ComponentStudioDashboardComponent_Conditional_2_Template, 6, 0, "div", 2)(3, ComponentStudioDashboardComponent_Conditional_3_Template, 23, 11, "div", 3);
478
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentStudioDashboardComponent, selectors: [["mj-component-studio-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 25, vars: 10, consts: [[1, "component-studio"], [1, "dashboard-header"], [1, "header-content"], [1, "fa-solid", "fa-puzzle-piece"], ["kendoButton", "", 3, "click", "icon", "disabled"], ["orientation", "horizontal", 2, "flex", "1", "height", "auto"], [3, "min", "max", "size"], [1, "components-panel"], [1, "panel-header"], [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-search"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "component-card", 3, "expanded", "running"], [1, "component-card"], [1, "card-header", 3, "click"], [1, "card-icon"], [1, "fa-solid", 3, "ngClass"], [1, "card-info"], [1, "card-name"], [1, "card-meta"], [1, "card-type"], [1, "card-version"], [1, "status-badge", "published"], [1, "status-badge", "draft"], [1, "card-chevron"], [1, "fa-solid", "fa-chevron-up"], [1, "fa-solid", "fa-chevron-down"], [1, "card-details"], [1, "detail-section"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], [1, "card-actions"], ["kendoButton", "", 3, "icon", "themeColor"], ["kendoButton", "", 3, "click", "icon", "themeColor"], [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", "icon"], [3, "componentEvent", "openEntityRecord", "component"], [1, "fa-solid", "fa-rocket", "fa-3x"]], template: function ComponentStudioDashboardComponent_Template(rf, ctx) { if (rf & 1) {
479
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h1");
480
+ i0.ɵɵelement(4, "i", 3);
481
+ i0.ɵɵtext(5, " Component Studio");
482
+ i0.ɵɵelementEnd();
483
+ i0.ɵɵelementStart(6, "button", 4);
484
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_6_listener() { return ctx.refreshData(); });
485
+ i0.ɵɵtext(7, " Refresh ");
486
+ i0.ɵɵelementEnd()()();
487
+ i0.ɵɵelementStart(8, "kendo-splitter", 5)(9, "kendo-splitter-pane", 6)(10, "div", 7)(11, "div", 8)(12, "h3");
488
+ i0.ɵɵtext(13, "Components");
726
489
  i0.ɵɵelementEnd();
490
+ i0.ɵɵelementStart(14, "div", 9)(15, "kendo-textbox", 10);
491
+ i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Template_kendo_textbox_valueChange_15_listener($event) { return ctx.onSearchChange($event); });
492
+ i0.ɵɵtemplate(16, ComponentStudioDashboardComponent_ng_template_16_Template, 1, 0, "ng-template", 11);
493
+ i0.ɵɵelementEnd()()();
494
+ i0.ɵɵelementStart(17, "div", 12);
495
+ i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_18_Template, 3, 0, "div", 13)(19, ComponentStudioDashboardComponent_Conditional_19_Template, 2, 0, "div", 14)(20, ComponentStudioDashboardComponent_Conditional_20_Template, 2, 0);
496
+ i0.ɵɵelementEnd()()();
497
+ i0.ɵɵelementStart(21, "kendo-splitter-pane", 15)(22, "div", 16);
498
+ i0.ɵɵtemplate(23, ComponentStudioDashboardComponent_Conditional_23_Template, 2, 1)(24, ComponentStudioDashboardComponent_Conditional_24_Template, 6, 0, "div", 17);
499
+ i0.ɵɵelementEnd()()()();
727
500
  } if (rf & 2) {
501
+ i0.ɵɵadvance(6);
502
+ i0.ɵɵproperty("icon", "fa-solid fa-sync")("disabled", ctx.isLoading);
503
+ i0.ɵɵadvance(3);
504
+ i0.ɵɵproperty("min", "350px")("max", "600px")("size", "400px");
505
+ i0.ɵɵadvance(6);
506
+ i0.ɵɵproperty("value", ctx.searchQuery)("clearButton", true);
507
+ i0.ɵɵadvance(3);
508
+ i0.ɵɵconditional(ctx.isLoading ? 18 : ctx.filteredComponents.length === 0 ? 19 : 20);
509
+ i0.ɵɵadvance(3);
510
+ i0.ɵɵproperty("min", "400px");
728
511
  i0.ɵɵadvance(2);
729
- i0.ɵɵconditional(ctx.isLoading ? 2 : -1);
730
- i0.ɵɵadvance();
731
- i0.ɵɵconditional(!ctx.isLoading ? 3 : -1);
732
- } }, dependencies: [i1.NgClass, i2.TextBoxComponent, i2.TextBoxPrefixTemplateDirective, i3.DialogContainerDirective, i4.ButtonComponent, i5.GridComponent, i5.ColumnComponent, i5.CellTemplateDirective, i6.ComponentPreviewComponent, i7.ComponentDependenciesComponent, i8.ComponentStudioSettingsComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n}\n\n.component-studio-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n position: relative;\n overflow: hidden;\n\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.03);\n backdrop-filter: blur(10px);\n z-index: 0;\n }\n\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n position: relative;\n z-index: 1;\n \n .loading-content {\n text-align: center;\n color: white;\n \n .loading-spinner {\n margin-bottom: 20px;\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n \n .loading-text {\n font-size: 18px;\n font-weight: 500;\n opacity: 0.9;\n }\n }\n }\n\n .dashboard-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n z-index: 1;\n }\n\n // Header\n .dashboard-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 30px;\n background: rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(20px);\n border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n position: relative;\n z-index: 2;\n \n .header-left {\n .dashboard-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 28px;\n font-weight: 700;\n color: white;\n margin: 0;\n \n i {\n font-size: 32px;\n }\n }\n \n .dashboard-subtitle {\n color: rgba(255, 255, 255, 0.8);\n font-size: 14px;\n margin-top: 4px;\n margin-left: 44px;\n }\n }\n \n .header-right {\n .header-actions {\n display: flex;\n gap: 8px;\n \n button {\n background: rgba(255, 255, 255, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.3);\n color: white;\n \n &:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n }\n }\n }\n }\n\n // Main Content\n .dashboard-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n background: rgba(255, 255, 255, 0.95);\n margin: 20px;\n border-radius: 12px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n position: relative;\n z-index: 1;\n }\n\n // Filter Panel\n .filter-panel {\n width: 280px;\n background: white;\n border-right: 1px solid #e5e7eb;\n padding: 20px;\n overflow-y: auto;\n \n .filter-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n \n h3 {\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n margin: 0;\n }\n \n button {\n padding: 4px 8px;\n font-size: 12px;\n }\n }\n \n .filter-section {\n margin-bottom: 24px;\n \n .filter-label {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 8px;\n }\n \n kendo-textbox {\n width: 100%;\n }\n \n .filter-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n \n .checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: #374151;\n \n &:hover {\n color: #111827;\n }\n \n input[type=\"checkbox\"] {\n cursor: pointer;\n }\n \n .type-indicator {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n \n .status-badge {\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n \n &.badge-draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.badge-published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.badge-deprecated {\n background: #fee2e2;\n color: #991b1b;\n }\n }\n }\n }\n }\n }\n\n // Content Area\n .content-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n .browse-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 20px;\n \n .results-summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n \n .result-count {\n font-size: 14px;\n color: #6b7280;\n }\n }\n \n // Component Grid\n .component-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 20px;\n overflow-y: auto;\n padding: 4px;\n \n .component-card {\n background: white;\n border: 2px solid #e5e7eb;\n border-radius: 12px;\n padding: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n height: fit-content;\n \n &:hover {\n border-color: #9ca3af;\n transform: translateY(-2px);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n \n &.selected {\n border-color: #6366f1;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.05) 0%, rgba(139, 92, 246, 0.05) 100%);\n }\n \n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n \n .card-type {\n padding: 4px 10px;\n border-radius: 6px;\n color: white;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n \n .card-status {\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n \n &.badge-draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.badge-published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.badge-deprecated {\n background: #fee2e2;\n color: #991b1b;\n }\n }\n }\n \n .card-body {\n margin-bottom: 12px;\n \n .card-title {\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n margin: 0 0 4px 0;\n }\n \n .card-version {\n font-size: 12px;\n color: #6b7280;\n margin-bottom: 8px;\n }\n \n .card-description {\n font-size: 13px;\n color: #6b7280;\n line-height: 1.5;\n margin: 8px 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n \n .card-namespace {\n font-size: 12px;\n color: #9ca3af;\n display: flex;\n align-items: center;\n gap: 6px;\n \n i {\n font-size: 11px;\n }\n }\n }\n \n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 12px;\n border-top: 1px solid #f3f4f6;\n \n .card-developer {\n font-size: 12px;\n color: #6b7280;\n display: flex;\n align-items: center;\n gap: 6px;\n \n i {\n font-size: 11px;\n }\n }\n \n .card-source {\n font-size: 14px;\n color: #9ca3af;\n }\n }\n }\n }\n \n // List View (Kendo Grid styling)\n kendo-grid {\n height: 100%;\n \n .component-name {\n display: flex;\n align-items: center;\n gap: 8px;\n \n .type-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n }\n \n .status-badge {\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n display: inline-block;\n \n &.badge-draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.badge-published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.badge-deprecated {\n background: #fee2e2;\n color: #991b1b;\n }\n }\n }\n }\n \n .preview-content,\n .dependencies-content,\n .settings-content {\n height: 100%;\n padding: 20px;\n overflow-y: auto;\n }\n \n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9ca3af;\n \n i {\n margin-bottom: 20px;\n opacity: 0.5;\n }\n \n h3 {\n font-size: 20px;\n font-weight: 600;\n color: #6b7280;\n margin: 0 0 8px 0;\n }\n \n p {\n font-size: 14px;\n color: #9ca3af;\n margin: 0;\n }\n }\n }\n\n // Bottom Navigation\n .dashboard-navigation {\n display: flex;\n justify-content: center;\n gap: 4px;\n padding: 12px 20px;\n background: rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(20px);\n border-top: 1px solid rgba(255, 255, 255, 0.2);\n position: relative;\n z-index: 2;\n \n .nav-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 8px 24px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: rgba(255, 255, 255, 0.7);\n \n i {\n font-size: 20px;\n }\n \n span {\n font-size: 12px;\n font-weight: 500;\n }\n \n &:hover {\n background: rgba(255, 255, 255, 0.15);\n color: white;\n }\n \n &.active {\n background: rgba(255, 255, 255, 0.25);\n color: white;\n }\n }\n }\n}\n\n//[_ngcontent-%COMP%] Animations\n@keyframes[_ngcontent-%COMP%] pulse[_ngcontent-%COMP%] {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"], changeDetection: 0 });
512
+ i0.ɵɵconditional(ctx.isRunning && ctx.selectedComponent && ctx.componentSpec ? 23 : 24);
513
+ } }, dependencies: [i1.NgClass, i2.TextBoxComponent, i2.TextBoxPrefixTemplateDirective, i3.SplitterComponent, i3.SplitterPaneComponent, i4.ButtonComponent, i5.MJReactComponent, i1.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: 100%;\n background: #f8f9fa;\n overflow: hidden;\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 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 }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\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 h3 {\n margin: 0 0 16px 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\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 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 }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\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 .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 }\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 }\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: _ngcontent-%COMP%_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 \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 }\n }\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}"] });
733
514
  };
734
515
  ComponentStudioDashboardComponent = __decorate([
735
516
  RegisterClass(BaseDashboard, 'ComponentStudioDashboard')
@@ -737,15 +518,13 @@ ComponentStudioDashboardComponent = __decorate([
737
518
  export { ComponentStudioDashboardComponent };
738
519
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentStudioDashboardComponent, [{
739
520
  type: Component,
740
- args: [{ selector: 'mj-component-studio-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"component-studio-dashboard\">\n <!-- Dialog container for Kendo dialogs -->\n <div kendoDialogContainer></div>\n \n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-3x\"></i>\n </div>\n <div class=\"loading-text\">Loading Component Studio...</div>\n </div>\n </div>\n }\n \n @if (!isLoading) {\n <div class=\"dashboard-wrapper\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-left\">\n <h1 class=\"dashboard-title\">\n <i class=\"fa-solid fa-puzzle-piece\"></i>\n Component Studio\n </h1>\n <div class=\"dashboard-subtitle\">\n Discover, preview, and test reusable components\n </div>\n </div>\n <div class=\"header-right\">\n <div class=\"header-actions\">\n <button kendoButton \n [icon]=\"viewMode === 'grid' ? 'fa-solid fa-list' : 'fa-solid fa-th'\"\n [fillMode]=\"'flat'\"\n (click)=\"toggleViewMode()\"\n title=\"Toggle view mode\">\n </button>\n <button kendoButton \n [icon]=\"showFilterPanel ? 'fa-solid fa-filter-circle-xmark' : 'fa-solid fa-filter'\"\n [fillMode]=\"'flat'\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle filters\">\n </button>\n <button kendoButton \n [icon]=\"'fa-solid fa-sync'\"\n [fillMode]=\"'flat'\"\n (click)=\"refreshData()\"\n title=\"Refresh\">\n </button>\n </div>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"dashboard-content\">\n <!-- Left Filter Panel -->\n @if (showFilterPanel && activeTab === 'browse') {\n <div class=\"filter-panel\">\n <div class=\"filter-header\">\n <h3>Filters</h3>\n <button kendoButton \n [fillMode]=\"'flat'\"\n [size]=\"'small'\"\n (click)=\"clearFilters()\">\n Clear All\n </button>\n </div>\n \n <!-- Search -->\n <div class=\"filter-section\">\n <label class=\"filter-label\">Search</label>\n <kendo-textbox \n [value]=\"searchQuery$.value\"\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\n <!-- Type Filter -->\n <div class=\"filter-section\">\n <label class=\"filter-label\">Component Type</label>\n <div class=\"filter-options\">\n @for (type of componentTypes; track type) {\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedTypes$.value.has(type)\"\n (change)=\"onTypeFilterChange(type, $any($event.target).checked)\">\n <span class=\"type-indicator\" [style.background-color]=\"getComponentTypeColor(type)\"></span>\n {{ type }}\n </label>\n }\n </div>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-section\">\n <label class=\"filter-label\">Status</label>\n <div class=\"filter-options\">\n @for (status of componentStatuses; track status) {\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedStatuses$.value.has(status)\"\n (change)=\"onStatusFilterChange(status, $any($event.target).checked)\">\n <span class=\"status-badge\" [ngClass]=\"getStatusBadgeClass(status)\">{{ status }}</span>\n </label>\n }\n </div>\n </div>\n\n <!-- Source Filter -->\n <div class=\"filter-section\">\n <label class=\"filter-label\">Source</label>\n <div class=\"filter-options\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedSources$.value.has('Local')\"\n (change)=\"onSourceFilterChange('Local', $any($event.target).checked)\">\n <i class=\"fa-solid fa-house\"></i> Local\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedSources$.value.has('Registry')\"\n (change)=\"onSourceFilterChange('Registry', $any($event.target).checked)\">\n <i class=\"fa-solid fa-cloud\"></i> Registry\n </label>\n </div>\n </div>\n </div>\n }\n\n <!-- Center Content Area -->\n <div class=\"content-area\">\n <!-- Tab Content -->\n @if (activeTab === 'browse') {\n <div class=\"browse-content\">\n <!-- Results Summary -->\n <div class=\"results-summary\">\n <span class=\"result-count\">\n {{ filteredComponents$.value.length }} components found\n </span>\n </div>\n\n <!-- Component Grid/List -->\n @if (viewMode === 'grid') {\n <div class=\"component-grid\">\n @for (component of filteredComponents$.value; track component.ID) {\n <div class=\"component-card\" \n [class.selected]=\"selectedComponentId === component.ID\"\n (click)=\"selectComponent(component)\">\n <div class=\"card-header\">\n <div class=\"card-type\" [style.background-color]=\"getComponentTypeColor(component.Type || 'Other')\">\n {{ component.Type || 'Other' }}\n </div>\n <div class=\"card-status\" [ngClass]=\"getStatusBadgeClass(component.Status || 'Draft')\">\n {{ component.Status }}\n </div>\n </div>\n <div class=\"card-body\">\n <h4 class=\"card-title\">{{ component.Name }}</h4>\n <div class=\"card-version\">v{{ component.Version }}</div>\n <p class=\"card-description\">{{ component.Description || 'No description available' }}</p>\n <div class=\"card-namespace\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{ component.Namespace || 'root' }}\n </div>\n </div>\n <div class=\"card-footer\">\n <div class=\"card-developer\">\n <i class=\"fa-solid fa-user\"></i>\n {{ component.DeveloperOrganization || component.DeveloperName || 'Unknown' }}\n </div>\n <div class=\"card-source\">\n @if (!component.SourceRegistryID) {\n <i class=\"fa-solid fa-house\" title=\"Local\"></i>\n } @else {\n <i class=\"fa-solid fa-cloud\" title=\"Registry\"></i>\n }\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <kendo-grid \n [data]=\"filteredComponents$.value\"\n [pageSize]=\"20\"\n [pageable]=\"true\"\n [sortable]=\"true\"\n [filterable]=\"false\"\n [resizable]=\"true\"\n [selectable]=\"true\"\n (selectionChange)=\"selectComponent($event.selectedRows && $event.selectedRows[0] ? $event.selectedRows[0].dataItem : null)\">\n <kendo-grid-column field=\"Name\" title=\"Component\" [width]=\"250\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"component-name\">\n <span class=\"type-dot\" [style.background-color]=\"getComponentTypeColor(dataItem.Type || 'Other')\"></span>\n {{ dataItem.Name }}\n </div>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"Version\" title=\"Version\" [width]=\"80\"></kendo-grid-column>\n <kendo-grid-column field=\"Type\" title=\"Type\" [width]=\"100\"></kendo-grid-column>\n <kendo-grid-column field=\"Status\" title=\"Status\" [width]=\"100\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <span class=\"status-badge\" [ngClass]=\"getStatusBadgeClass(dataItem.Status || 'Draft')\">\n {{ dataItem.Status }}\n </span>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"Namespace\" title=\"Namespace\" [width]=\"200\"></kendo-grid-column>\n <kendo-grid-column field=\"DeveloperOrganization\" title=\"Developer\" [width]=\"150\"></kendo-grid-column>\n <kendo-grid-column field=\"Description\" title=\"Description\"></kendo-grid-column>\n </kendo-grid>\n }\n </div>\n }\n\n @if (activeTab === 'preview') {\n <div class=\"preview-content\">\n @if (selectedComponent) {\n <mj-component-preview \n [component]=\"selectedComponent\"\n [componentSpec]=\"componentSpec\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-component-preview>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-eye fa-4x\"></i>\n <h3>No Component Selected</h3>\n <p>Select a component from the Browse tab to preview it</p>\n </div>\n }\n </div>\n }\n\n @if (activeTab === 'dependencies') {\n <div class=\"dependencies-content\">\n @if (selectedComponent) {\n <mj-component-dependencies\n [component]=\"selectedComponent\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-component-dependencies>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-sitemap fa-4x\"></i>\n <h3>No Component Selected</h3>\n <p>Select a component to view its dependencies</p>\n </div>\n }\n </div>\n }\n\n @if (activeTab === 'settings') {\n <div class=\"settings-content\">\n <mj-component-studio-settings\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-component-studio-settings>\n </div>\n }\n </div>\n </div>\n\n <!-- Bottom Navigation -->\n <div class=\"dashboard-navigation\">\n @for (navItem of navigationConfig; track $index) {\n <div \n class=\"nav-item\"\n [class.active]=\"navItem.selected\"\n (click)=\"onTabChange(navigationItems[$index])\">\n <i [class]=\"navItem.icon\"></i>\n <span>{{ navItem.text }}</span>\n </div>\n }\n </div>\n </div>\n }\n</div>", styles: [":host {\n display: block;\n width: 100%;\n height: 100%;\n position: relative;\n}\n\n.component-studio-dashboard {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n position: relative;\n overflow: hidden;\n\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.03);\n backdrop-filter: blur(10px);\n z-index: 0;\n }\n\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n position: relative;\n z-index: 1;\n \n .loading-content {\n text-align: center;\n color: white;\n \n .loading-spinner {\n margin-bottom: 20px;\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n \n .loading-text {\n font-size: 18px;\n font-weight: 500;\n opacity: 0.9;\n }\n }\n }\n\n .dashboard-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n z-index: 1;\n }\n\n // Header\n .dashboard-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 30px;\n background: rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(20px);\n border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n position: relative;\n z-index: 2;\n \n .header-left {\n .dashboard-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 28px;\n font-weight: 700;\n color: white;\n margin: 0;\n \n i {\n font-size: 32px;\n }\n }\n \n .dashboard-subtitle {\n color: rgba(255, 255, 255, 0.8);\n font-size: 14px;\n margin-top: 4px;\n margin-left: 44px;\n }\n }\n \n .header-right {\n .header-actions {\n display: flex;\n gap: 8px;\n \n button {\n background: rgba(255, 255, 255, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.3);\n color: white;\n \n &:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n }\n }\n }\n }\n\n // Main Content\n .dashboard-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n background: rgba(255, 255, 255, 0.95);\n margin: 20px;\n border-radius: 12px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n position: relative;\n z-index: 1;\n }\n\n // Filter Panel\n .filter-panel {\n width: 280px;\n background: white;\n border-right: 1px solid #e5e7eb;\n padding: 20px;\n overflow-y: auto;\n \n .filter-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n \n h3 {\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n margin: 0;\n }\n \n button {\n padding: 4px 8px;\n font-size: 12px;\n }\n }\n \n .filter-section {\n margin-bottom: 24px;\n \n .filter-label {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 8px;\n }\n \n kendo-textbox {\n width: 100%;\n }\n \n .filter-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n \n .checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n color: #374151;\n \n &:hover {\n color: #111827;\n }\n \n input[type=\"checkbox\"] {\n cursor: pointer;\n }\n \n .type-indicator {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n flex-shrink: 0;\n }\n \n .status-badge {\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n \n &.badge-draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.badge-published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.badge-deprecated {\n background: #fee2e2;\n color: #991b1b;\n }\n }\n }\n }\n }\n }\n\n // Content Area\n .content-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n \n .browse-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 20px;\n \n .results-summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n \n .result-count {\n font-size: 14px;\n color: #6b7280;\n }\n }\n \n // Component Grid\n .component-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 20px;\n overflow-y: auto;\n padding: 4px;\n \n .component-card {\n background: white;\n border: 2px solid #e5e7eb;\n border-radius: 12px;\n padding: 16px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n overflow: hidden;\n height: fit-content;\n \n &:hover {\n border-color: #9ca3af;\n transform: translateY(-2px);\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n }\n \n &.selected {\n border-color: #6366f1;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.05) 0%, rgba(139, 92, 246, 0.05) 100%);\n }\n \n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n \n .card-type {\n padding: 4px 10px;\n border-radius: 6px;\n color: white;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n \n .card-status {\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n \n &.badge-draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.badge-published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.badge-deprecated {\n background: #fee2e2;\n color: #991b1b;\n }\n }\n }\n \n .card-body {\n margin-bottom: 12px;\n \n .card-title {\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n margin: 0 0 4px 0;\n }\n \n .card-version {\n font-size: 12px;\n color: #6b7280;\n margin-bottom: 8px;\n }\n \n .card-description {\n font-size: 13px;\n color: #6b7280;\n line-height: 1.5;\n margin: 8px 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n \n .card-namespace {\n font-size: 12px;\n color: #9ca3af;\n display: flex;\n align-items: center;\n gap: 6px;\n \n i {\n font-size: 11px;\n }\n }\n }\n \n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 12px;\n border-top: 1px solid #f3f4f6;\n \n .card-developer {\n font-size: 12px;\n color: #6b7280;\n display: flex;\n align-items: center;\n gap: 6px;\n \n i {\n font-size: 11px;\n }\n }\n \n .card-source {\n font-size: 14px;\n color: #9ca3af;\n }\n }\n }\n }\n \n // List View (Kendo Grid styling)\n kendo-grid {\n height: 100%;\n \n .component-name {\n display: flex;\n align-items: center;\n gap: 8px;\n \n .type-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n }\n \n .status-badge {\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n display: inline-block;\n \n &.badge-draft {\n background: #fef3c7;\n color: #92400e;\n }\n \n &.badge-published {\n background: #d1fae5;\n color: #065f46;\n }\n \n &.badge-deprecated {\n background: #fee2e2;\n color: #991b1b;\n }\n }\n }\n }\n \n .preview-content,\n .dependencies-content,\n .settings-content {\n height: 100%;\n padding: 20px;\n overflow-y: auto;\n }\n \n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: #9ca3af;\n \n i {\n margin-bottom: 20px;\n opacity: 0.5;\n }\n \n h3 {\n font-size: 20px;\n font-weight: 600;\n color: #6b7280;\n margin: 0 0 8px 0;\n }\n \n p {\n font-size: 14px;\n color: #9ca3af;\n margin: 0;\n }\n }\n }\n\n // Bottom Navigation\n .dashboard-navigation {\n display: flex;\n justify-content: center;\n gap: 4px;\n padding: 12px 20px;\n background: rgba(255, 255, 255, 0.1);\n backdrop-filter: blur(20px);\n border-top: 1px solid rgba(255, 255, 255, 0.2);\n position: relative;\n z-index: 2;\n \n .nav-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 8px 24px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: rgba(255, 255, 255, 0.7);\n \n i {\n font-size: 20px;\n }\n \n span {\n font-size: 12px;\n font-weight: 500;\n }\n \n &:hover {\n background: rgba(255, 255, 255, 0.15);\n color: white;\n }\n \n &.active {\n background: rgba(255, 255, 255, 0.25);\n color: white;\n }\n }\n }\n}\n\n// Animations\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}"] }]
521
+ args: [{ selector: 'mj-component-studio-dashboard', template: "<div class=\"component-studio\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-content\">\n <h1><i class=\"fa-solid fa-puzzle-piece\"></i> Component Studio</h1>\n <button kendoButton [icon]=\"'fa-solid fa-sync'\" (click)=\"refreshData()\" [disabled]=\"isLoading\">\n Refresh\n </button>\n </div>\n </div>\n\n <!-- Main Content with Splitter -->\n <kendo-splitter orientation=\"horizontal\" style=\"flex: 1; height: auto;\">\n <!-- Left Panel - Component List -->\n <kendo-splitter-pane [min]=\"'350px'\" [max]=\"'600px'\" [size]=\"'400px'\">\n <div class=\"components-panel\">\n <div class=\"panel-header\">\n <h3>Components</h3>\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 No components found\n </div>\n } @else {\n @for (component of filteredComponents; track component.ID) {\n <div class=\"component-card\" \n [class.expanded]=\"expandedComponent?.ID === component.ID\"\n [class.running]=\"selectedComponent?.ID === component.ID && isRunning\">\n \n <!-- Card Header - Always visible -->\n <div class=\"card-header\" (click)=\"toggleComponentExpansion(component)\">\n <div class=\"card-icon\" [style.color]=\"getComponentTypeColor(component.Type)\">\n <i class=\"fa-solid\" [ngClass]=\"getComponentTypeIcon(component.Type)\"></i>\n </div>\n <div class=\"card-info\">\n <div class=\"card-name\">{{ component.Name }}</div>\n <div class=\"card-meta\">\n <span class=\"card-type\">{{ component.Type || 'Component' }}</span>\n <span class=\"card-version\">v{{ component.Version || '1.0.0' }}</span>\n @if (component.Status === 'Published') {\n <span class=\"status-badge published\">Published</span>\n } @else {\n <span class=\"status-badge draft\">Draft</span>\n }\n </div>\n </div>\n <div class=\"card-chevron\">\n @if (expandedComponent?.ID === component.ID) {\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?.ID === component.ID) {\n <div class=\"card-details\">\n @if (component.Description) {\n <div class=\"detail-section\">\n <label>Description</label>\n <p>{{ component.Description }}</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\">{{ component.Type || 'Unknown' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Version:</span>\n <span class=\"info-value\">{{ component.Version || '1.0.0' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Status:</span>\n <span class=\"info-value\">{{ component.Status || 'Draft' }}</span>\n </div>\n @if (component.__mj_UpdatedAt) {\n <div class=\"info-item\">\n <span class=\"info-label\">Updated:</span>\n <span class=\"info-value\">{{ component.__mj_UpdatedAt | date:'short' }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"card-actions\">\n @if (selectedComponent?.ID === component.ID && isRunning) {\n <button kendoButton \n [icon]=\"'fa-solid fa-stop'\" \n [themeColor]=\"'error'\"\n (click)=\"stopComponent(); $event.stopPropagation()\">\n Stop Component\n </button>\n } @else {\n <button kendoButton \n [icon]=\"'fa-solid fa-play'\" \n [themeColor]=\"'primary'\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n 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 -->\n <kendo-splitter-pane [min]=\"'400px'\">\n <div class=\"component-display\">\n @if (isRunning && selectedComponent && 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()\" [icon]=\"'fa-solid fa-rotate'\">\n Retry\n </button>\n <button kendoButton (click)=\"stopComponent()\" [icon]=\"'fa-solid fa-stop'\" [themeColor]=\"'error'\">\n 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 <!-- Empty State -->\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 and click \"Run Component\" to see it in action</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: 100%;\n background: #f8f9fa;\n overflow: hidden;\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 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 }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\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 h3 {\n margin: 0 0 16px 0;\n font-size: 18px;\n font-weight: 600;\n color: #212529;\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 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 }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\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 .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 }\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 }\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 \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 }\n }\n}\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}"] }]
741
522
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
742
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 53 }); })();
523
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 18 }); })();
743
524
  /**
744
525
  * Function to prevent tree shaking of the ComponentStudioDashboardComponent.
745
- * This is called in public-api.ts to ensure the component is included in the build.
746
526
  */
747
527
  export function LoadComponentStudioDashboard() {
748
- // This function doesn't need to do anything, it just needs to exist
749
- // to create a reference to the component that prevents tree shaking
528
+ // This function doesn't need to do anything
750
529
  }
751
530
  //# sourceMappingURL=component-studio-dashboard.component.js.map