@memberjunction/ng-dashboards 2.86.0 → 2.88.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 +41 -54
  2. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  3. package/dist/ComponentStudio/component-studio-dashboard.component.js +415 -595
  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,315 @@ 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_20_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelement(0, "i", 20);
22
+ } }
23
+ function ComponentStudioDashboardComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
24
+ i0.ɵɵelementStart(0, "div", 15);
25
+ i0.ɵɵelement(1, "i", 21);
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_23_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "div", 16);
31
+ i0.ɵɵelement(1, "i", 22);
32
+ i0.ɵɵtext(2, " No components found without custom properties. ");
33
+ i0.ɵɵelement(3, "br");
34
+ i0.ɵɵelementStart(4, "small");
35
+ i0.ɵɵtext(5, "Only components that don't require custom props can be tested here.");
36
+ i0.ɵɵelementEnd()();
34
37
  } }
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)); });
38
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
39
+ i0.ɵɵelementStart(0, "span", 33);
40
+ i0.ɵɵtext(1, "Published");
39
41
  i0.ɵɵelementEnd();
40
- i0.ɵɵelement(2, "span", 39);
41
- i0.ɵɵtext(3);
42
+ } }
43
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
44
+ i0.ɵɵelementStart(0, "span", 34);
45
+ i0.ɵɵtext(1, "Draft");
42
46
  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
47
  } }
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)); });
48
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
49
+ i0.ɵɵelement(0, "i", 36);
50
+ } }
51
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵelement(0, "i", 37);
53
+ } }
54
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_1_Template(rf, ctx) { if (rf & 1) {
55
+ i0.ɵɵelementStart(0, "div", 39)(1, "label");
56
+ i0.ɵɵtext(2, "Description");
57
57
  i0.ɵɵelementEnd();
58
- i0.ɵɵelementStart(2, "span", 40);
59
- i0.ɵɵtext(3);
58
+ i0.ɵɵelementStart(3, "p");
59
+ i0.ɵɵtext(4);
60
60
  i0.ɵɵelementEnd()();
61
61
  } 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);
62
+ const component_r2 = i0.ɵɵnextContext(2).$implicit;
63
+ i0.ɵɵadvance(4);
64
+ i0.ɵɵtextInterpolate(component_r2.Description);
70
65
  } }
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");
66
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_21_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelementStart(0, "div", 41)(1, "span", 42);
68
+ i0.ɵɵtext(2, "Updated:");
75
69
  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 ");
70
+ i0.ɵɵelementStart(3, "span", 43);
71
+ i0.ɵɵtext(4);
72
+ i0.ɵɵpipe(5, "date");
79
73
  i0.ɵɵelementEnd()();
80
- i0.ɵɵelementStart(6, "div", 29)(7, "label", 30);
81
- i0.ɵɵtext(8, "Search");
74
+ } if (rf & 2) {
75
+ const component_r2 = i0.ɵɵnextContext(2).$implicit;
76
+ i0.ɵɵadvance(4);
77
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(5, 1, component_r2.__mj_UpdatedAt, "short"));
78
+ } }
79
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_23_Template(rf, ctx) { if (rf & 1) {
80
+ const _r4 = i0.ɵɵgetCurrentView();
81
+ i0.ɵɵelementStart(0, "button", 47);
82
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_24_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()); });
83
+ i0.ɵɵelement(1, "span", 48);
84
+ i0.ɵɵtext(2, " Stop Component ");
82
85
  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");
86
+ } if (rf & 2) {
87
+ i0.ɵɵproperty("themeColor", "error");
88
+ } }
89
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_24_Template(rf, ctx) { if (rf & 1) {
90
+ const _r5 = i0.ɵɵgetCurrentView();
91
+ i0.ɵɵelementStart(0, "button", 49);
92
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_24_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()); });
93
+ i0.ɵɵelement(1, "span", 50);
94
+ i0.ɵɵtext(2, " Switch to This Component ");
89
95
  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");
96
+ } if (rf & 2) {
97
+ i0.ɵɵproperty("themeColor", "base");
98
+ } }
99
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_25_Template(rf, ctx) { if (rf & 1) {
100
+ const _r6 = i0.ɵɵgetCurrentView();
101
+ i0.ɵɵelementStart(0, "button", 47);
102
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_25_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r6); const component_r2 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.runComponent(component_r2); return i0.ɵɵresetView($event.stopPropagation()); });
103
+ i0.ɵɵelement(1, "span", 50);
104
+ i0.ɵɵtext(2, " Run Component ");
95
105
  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);
98
- i0.ɵɵelementEnd()();
99
- i0.ɵɵelementStart(23, "div", 29)(24, "label", 30);
100
- i0.ɵɵtext(25, "Source");
106
+ } if (rf & 2) {
107
+ i0.ɵɵproperty("themeColor", "primary");
108
+ } }
109
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
110
+ i0.ɵɵelementStart(0, "div", 38);
111
+ i0.ɵɵtemplate(1, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_1_Template, 5, 1, "div", 39);
112
+ i0.ɵɵelementStart(2, "div", 39)(3, "label");
113
+ i0.ɵɵtext(4, "Component Info");
101
114
  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)); });
115
+ i0.ɵɵelementStart(5, "div", 40)(6, "div", 41)(7, "span", 42);
116
+ i0.ɵɵtext(8, "Type:");
104
117
  i0.ɵɵelementEnd();
105
- i0.ɵɵelement(29, "i", 36);
106
- i0.ɵɵtext(30, " Local ");
118
+ i0.ɵɵelementStart(9, "span", 43);
119
+ i0.ɵɵtext(10);
120
+ i0.ɵɵelementEnd()();
121
+ i0.ɵɵelementStart(11, "div", 41)(12, "span", 42);
122
+ i0.ɵɵtext(13, "Version:");
107
123
  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)); });
124
+ i0.ɵɵelementStart(14, "span", 43);
125
+ i0.ɵɵtext(15);
126
+ i0.ɵɵelementEnd()();
127
+ i0.ɵɵelementStart(16, "div", 41)(17, "span", 42);
128
+ i0.ɵɵtext(18, "Status:");
110
129
  i0.ɵɵelementEnd();
111
- i0.ɵɵelement(33, "i", 37);
112
- i0.ɵɵtext(34, " Registry ");
113
- i0.ɵɵelementEnd()()()();
130
+ i0.ɵɵelementStart(19, "span", 43);
131
+ i0.ɵɵtext(20);
132
+ i0.ɵɵelementEnd()();
133
+ i0.ɵɵtemplate(21, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_21_Template, 6, 4, "div", 41);
134
+ i0.ɵɵelementEnd()();
135
+ i0.ɵɵelementStart(22, "div", 44);
136
+ i0.ɵɵtemplate(23, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_23_Template, 3, 1, "button", 45)(24, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_24_Template, 3, 1, "button", 46)(25, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Conditional_25_Template, 3, 1, "button", 45);
137
+ i0.ɵɵelementEnd()();
114
138
  } if (rf & 2) {
115
- const ctx_r1 = i0.ɵɵnextContext(2);
116
- i0.ɵɵadvance(4);
117
- i0.ɵɵproperty("fillMode", "flat")("size", "small");
139
+ const component_r2 = i0.ɵɵnextContext().$implicit;
140
+ const ctx_r2 = i0.ɵɵnextContext(2);
141
+ i0.ɵɵadvance();
142
+ i0.ɵɵconditional(component_r2.Description ? 1 : -1);
143
+ i0.ɵɵadvance(9);
144
+ i0.ɵɵtextInterpolate(component_r2.Type || "Unknown");
118
145
  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"));
128
- } }
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);
131
- } }
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);
146
+ i0.ɵɵtextInterpolate(component_r2.Version || "1.0.0");
147
+ i0.ɵɵadvance(5);
148
+ i0.ɵɵtextInterpolate(component_r2.Status || "Draft");
149
+ i0.ɵɵadvance();
150
+ i0.ɵɵconditional(component_r2.__mj_UpdatedAt ? 21 : -1);
151
+ i0.ɵɵadvance(2);
152
+ i0.ɵɵconditional((ctx_r2.selectedComponent == null ? null : ctx_r2.selectedComponent.ID) === component_r2.ID && ctx_r2.isRunning ? 23 : ctx_r2.isRunning && (ctx_r2.selectedComponent == null ? null : ctx_r2.selectedComponent.ID) !== component_r2.ID ? 24 : 25);
134
153
  } }
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);
154
+ function ComponentStudioDashboardComponent_Conditional_24_For_1_Template(rf, ctx) { if (rf & 1) {
155
+ const _r1 = i0.ɵɵgetCurrentView();
156
+ i0.ɵɵelementStart(0, "div", 24)(1, "div", 25);
157
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_24_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)); });
158
+ i0.ɵɵelementStart(2, "div", 26);
159
+ i0.ɵɵelement(3, "i", 27);
141
160
  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);
161
+ i0.ɵɵelementStart(4, "div", 28)(5, "div", 29);
162
+ i0.ɵɵtext(6);
147
163
  i0.ɵɵelementEnd();
148
- i0.ɵɵelementStart(9, "div", 52);
149
- i0.ɵɵtext(10);
164
+ i0.ɵɵelementStart(7, "div", 30)(8, "span", 31);
165
+ i0.ɵɵtext(9);
150
166
  i0.ɵɵelementEnd();
151
- i0.ɵɵelementStart(11, "p", 53);
152
- i0.ɵɵtext(12);
167
+ i0.ɵɵelementStart(10, "span", 32);
168
+ i0.ɵɵtext(11);
153
169
  i0.ɵɵelementEnd();
154
- i0.ɵɵelementStart(13, "div", 54);
155
- i0.ɵɵelement(14, "i", 55);
156
- i0.ɵɵtext(15);
170
+ i0.ɵɵtemplate(12, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_12_Template, 2, 0, "span", 33)(13, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_13_Template, 2, 0, "span", 34);
171
+ i0.ɵɵelementEnd()();
172
+ i0.ɵɵelementStart(14, "div", 35);
173
+ i0.ɵɵtemplate(15, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_15_Template, 1, 0, "i", 36)(16, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_16_Template, 1, 0, "i", 37);
157
174
  i0.ɵɵelementEnd()();
158
- i0.ɵɵelementStart(16, "div", 56)(17, "div", 57);
159
- i0.ɵɵelement(18, "i", 58);
160
- i0.ɵɵtext(19);
175
+ i0.ɵɵtemplate(17, ComponentStudioDashboardComponent_Conditional_24_For_1_Conditional_17_Template, 26, 6, "div", 38);
161
176
  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()()();
165
177
  } 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);
178
+ const component_r2 = ctx.$implicit;
179
+ const ctx_r2 = i0.ɵɵnextContext(2);
180
+ 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);
169
181
  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", " ");
173
- i0.ɵɵadvance();
174
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusBadgeClass(component_r9.Status || "Draft"));
182
+ i0.ɵɵstyleProp("color", ctx_r2.getComponentTypeColor(component_r2.Type));
175
183
  i0.ɵɵadvance();
176
- i0.ɵɵtextInterpolate1(" ", component_r9.Status, " ");
184
+ i0.ɵɵproperty("ngClass", ctx_r2.getComponentTypeIcon(component_r2.Type));
177
185
  i0.ɵɵadvance(3);
178
- i0.ɵɵtextInterpolate(component_r9.Name);
179
- i0.ɵɵadvance(2);
180
- i0.ɵɵtextInterpolate1("v", component_r9.Version, "");
186
+ i0.ɵɵtextInterpolate(component_r2.Name);
187
+ i0.ɵɵadvance(3);
188
+ i0.ɵɵtextInterpolate(component_r2.Type || "Component");
181
189
  i0.ɵɵadvance(2);
182
- i0.ɵɵtextInterpolate(component_r9.Description || "No description available");
190
+ i0.ɵɵtextInterpolate1("v", component_r2.Version || "1.0.0", "");
191
+ i0.ɵɵadvance();
192
+ i0.ɵɵconditional(component_r2.Status === "Published" ? 12 : 13);
183
193
  i0.ɵɵadvance(3);
184
- i0.ɵɵtextInterpolate1(" ", component_r9.Namespace || "root", " ");
185
- i0.ɵɵadvance(4);
186
- i0.ɵɵtextInterpolate1(" ", component_r9.DeveloperOrganization || component_r9.DeveloperName || "Unknown", " ");
194
+ i0.ɵɵconditional((ctx_r2.expandedComponent == null ? null : ctx_r2.expandedComponent.ID) === component_r2.ID ? 15 : 16);
187
195
  i0.ɵɵadvance(2);
188
- i0.ɵɵconditional(!component_r9.SourceRegistryID ? 21 : 22);
196
+ i0.ɵɵconditional((ctx_r2.expandedComponent == null ? null : ctx_r2.expandedComponent.ID) === component_r2.ID ? 17 : -1);
189
197
  } }
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();
198
+ function ComponentStudioDashboardComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
199
+ i0.ɵɵrepeaterCreate(0, ComponentStudioDashboardComponent_Conditional_24_For_1_Template, 18, 13, "div", 23, _forTrack0);
194
200
  } if (rf & 2) {
195
- const ctx_r1 = i0.ɵɵnextContext(3);
196
- i0.ɵɵadvance();
197
- i0.ɵɵrepeater(ctx_r1.filteredComponents$.value);
201
+ const ctx_r2 = i0.ɵɵnextContext();
202
+ i0.ɵɵrepeater(ctx_r2.filteredComponents);
198
203
  } }
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);
204
+ function ComponentStudioDashboardComponent_Conditional_27_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
205
+ i0.ɵɵelementStart(0, "details", 60)(1, "summary");
206
+ i0.ɵɵtext(2, "Technical Details (click to expand)");
203
207
  i0.ɵɵelementEnd();
208
+ i0.ɵɵelementStart(3, "pre");
209
+ i0.ɵɵtext(4);
210
+ i0.ɵɵelementEnd()();
204
211
  } 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, " ");
212
+ const ctx_r2 = i0.ɵɵnextContext(3);
213
+ i0.ɵɵadvance(4);
214
+ i0.ɵɵtextInterpolate(ctx_r2.formatTechnicalDetails(ctx_r2.currentError.technicalDetails));
211
215
  } }
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);
216
+ function ComponentStudioDashboardComponent_Conditional_27_Conditional_0_Template(rf, ctx) { if (rf & 1) {
217
+ const _r7 = i0.ɵɵgetCurrentView();
218
+ i0.ɵɵelementStart(0, "div", 51)(1, "div", 53)(2, "div", 54);
219
+ i0.ɵɵelement(3, "i", 55);
220
+ i0.ɵɵelementStart(4, "h3");
221
+ i0.ɵɵtext(5, "Component Error");
222
+ i0.ɵɵelementEnd();
223
+ i0.ɵɵelementStart(6, "button", 56);
224
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_27_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.copyErrorToClipboard()); });
225
+ i0.ɵɵelement(7, "i", 57);
226
+ i0.ɵɵelementEnd()();
227
+ i0.ɵɵelementStart(8, "p", 58);
228
+ i0.ɵɵtext(9, " The component could not be rendered due to the following error: ");
215
229
  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);
230
+ i0.ɵɵelementStart(10, "div", 59)(11, "strong");
231
+ i0.ɵɵtext(12, "Error Type:");
229
232
  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);
233
+ i0.ɵɵtext(13);
234
+ i0.ɵɵelement(14, "br");
235
+ i0.ɵɵelementStart(15, "strong");
236
+ i0.ɵɵtext(16, "Message:");
233
237
  i0.ɵɵelementEnd();
234
- i0.ɵɵelement(7, "kendo-grid-column", 68)(8, "kendo-grid-column", 69)(9, "kendo-grid-column", 70);
238
+ i0.ɵɵtext(17);
239
+ i0.ɵɵtemplate(18, ComponentStudioDashboardComponent_Conditional_27_Conditional_0_Conditional_18_Template, 5, 1, "details", 60);
235
240
  i0.ɵɵelementEnd();
236
- } 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);
241
- i0.ɵɵadvance(2);
242
- i0.ɵɵproperty("width", 80);
243
- i0.ɵɵadvance();
244
- i0.ɵɵproperty("width", 100);
245
- i0.ɵɵadvance();
246
- i0.ɵɵproperty("width", 100);
247
- i0.ɵɵadvance(2);
248
- i0.ɵɵproperty("width", 200);
249
- 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);
241
+ i0.ɵɵelementStart(19, "div", 61)(20, "strong");
242
+ i0.ɵɵtext(21, "What to do:");
257
243
  i0.ɵɵelementEnd();
258
- } if (rf & 2) {
259
- const ctx_r1 = i0.ɵɵnextContext(2);
260
- 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);
264
- } }
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)); });
244
+ i0.ɵɵelementStart(22, "ol")(23, "li");
245
+ i0.ɵɵtext(24, "Check that the component code is valid JavaScript/React");
269
246
  i0.ɵɵelementEnd();
270
- } if (rf & 2) {
271
- const ctx_r1 = i0.ɵɵnextContext(3);
272
- i0.ɵɵproperty("component", ctx_r1.selectedComponent)("componentSpec", ctx_r1.componentSpec);
273
- } }
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");
247
+ i0.ɵɵelementStart(25, "li");
248
+ i0.ɵɵtext(26, "Ensure all required dependencies are available");
279
249
  i0.ɵɵelementEnd();
280
- i0.ɵɵelementStart(4, "p");
281
- i0.ɵɵtext(5, "Select a component from the Browse tab to preview it");
282
- 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);
250
+ i0.ɵɵelementStart(27, "li");
251
+ i0.ɵɵtext(28, "Review the technical details for specific error information");
287
252
  i0.ɵɵelementEnd();
253
+ i0.ɵɵelementStart(29, "li");
254
+ i0.ɵɵtext(30, "Contact your system administrator if the issue persists");
255
+ i0.ɵɵelementEnd()()();
256
+ i0.ɵɵelementStart(31, "div", 62)(32, "button", 63);
257
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_27_Conditional_0_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.retryComponent()); });
258
+ i0.ɵɵelement(33, "span", 64);
259
+ i0.ɵɵtext(34, " Retry ");
260
+ i0.ɵɵelementEnd();
261
+ i0.ɵɵelementStart(35, "button", 47);
262
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Conditional_27_Conditional_0_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.stopComponent()); });
263
+ i0.ɵɵelement(36, "span", 48);
264
+ i0.ɵɵtext(37, " Stop ");
265
+ i0.ɵɵelementEnd()()()();
288
266
  } if (rf & 2) {
289
- const ctx_r1 = i0.ɵɵnextContext(2);
267
+ const ctx_r2 = i0.ɵɵnextContext(2);
268
+ i0.ɵɵadvance(13);
269
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.currentError.type, "");
270
+ i0.ɵɵadvance(4);
271
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.currentError.message, " ");
290
272
  i0.ɵɵadvance();
291
- i0.ɵɵconditional(ctx_r1.selectedComponent ? 1 : 2);
292
- } }
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)); });
297
- i0.ɵɵelementEnd();
298
- } if (rf & 2) {
299
- const ctx_r1 = i0.ɵɵnextContext(3);
300
- i0.ɵɵproperty("component", ctx_r1.selectedComponent);
273
+ i0.ɵɵconditional(ctx_r2.currentError.technicalDetails ? 18 : -1);
274
+ i0.ɵɵadvance(17);
275
+ i0.ɵɵproperty("themeColor", "error");
301
276
  } }
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");
307
- 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);
277
+ function ComponentStudioDashboardComponent_Conditional_27_Conditional_1_Template(rf, ctx) { if (rf & 1) {
278
+ const _r8 = i0.ɵɵgetCurrentView();
279
+ i0.ɵɵelementStart(0, "mj-react-component", 65);
280
+ i0.ɵɵlistener("componentEvent", function ComponentStudioDashboardComponent_Conditional_27_Conditional_1_Template_mj_react_component_componentEvent_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onComponentEvent($event)); })("openEntityRecord", function ComponentStudioDashboardComponent_Conditional_27_Conditional_1_Template_mj_react_component_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onOpenEntityRecord($event)); });
315
281
  i0.ɵɵelementEnd();
316
282
  } if (rf & 2) {
317
- const ctx_r1 = i0.ɵɵnextContext(2);
318
- i0.ɵɵadvance();
319
- i0.ɵɵconditional(ctx_r1.selectedComponent ? 1 : 2);
320
- } }
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()();
283
+ const ctx_r2 = i0.ɵɵnextContext(2);
284
+ i0.ɵɵproperty("component", ctx_r2.componentSpec);
326
285
  } }
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()();
286
+ function ComponentStudioDashboardComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
287
+ i0.ɵɵtemplate(0, ComponentStudioDashboardComponent_Conditional_27_Conditional_0_Template, 38, 4, "div", 51)(1, ComponentStudioDashboardComponent_Conditional_27_Conditional_1_Template, 1, 1, "mj-react-component", 52);
335
288
  } 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);
289
+ const ctx_r2 = i0.ɵɵnextContext();
290
+ i0.ɵɵconditional(ctx_r2.currentError ? 0 : 1);
342
291
  } }
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()); });
292
+ function ComponentStudioDashboardComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
293
+ i0.ɵɵelementStart(0, "div", 19);
294
+ i0.ɵɵelement(1, "i", 66);
295
+ i0.ɵɵelementStart(2, "h2");
296
+ i0.ɵɵtext(3, "Ready to Test Components");
354
297
  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);
298
+ i0.ɵɵelementStart(4, "p");
299
+ i0.ɵɵtext(5, "Select a component from the list and click \"Run Component\" to see it in action");
368
300
  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
301
  } }
390
302
  let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent extends BaseDashboard {
391
303
  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
304
+ // Component data
305
+ components = [];
306
+ filteredComponents = [];
414
307
  selectedComponent = null;
308
+ expandedComponent = null; // Track which card is expanded
415
309
  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
- ];
310
+ isLoading = false;
311
+ searchQuery = '';
312
+ isRunning = false; // Track if component is currently running
313
+ // Error handling
314
+ currentError = null;
425
315
  destroy$ = new Subject();
426
- stateChangeSubject = new Subject();
427
316
  constructor(cdr) {
428
317
  super();
429
318
  this.cdr = cdr;
@@ -431,305 +320,238 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
431
320
  ngAfterViewInit() {
432
321
  this.initDashboard();
433
322
  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
323
  }
444
324
  ngOnDestroy() {
445
325
  this.destroy$.next();
446
326
  this.destroy$.complete();
447
- this.stateChangeSubject.complete();
327
+ }
328
+ initDashboard() {
329
+ // Initialize dashboard
448
330
  }
449
331
  async loadData() {
450
332
  this.isLoading = true;
451
- this.cdr.markForCheck();
452
333
  try {
453
334
  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);
335
+ const result = await rv.RunView({
336
+ EntityName: 'MJ: Components',
337
+ ExtraFilter: 'HasCustomProps = 0', // Only load components without custom props
338
+ OrderBy: 'Name',
339
+ MaxRows: 1000,
340
+ ResultType: 'entity_object'
341
+ });
342
+ if (result.Success) {
343
+ this.components = result.Results || [];
344
+ this.filterComponents();
487
345
  }
488
- if (librariesResult.Success) {
489
- this.libraries$.next(librariesResult.Results);
346
+ else {
347
+ console.error('Failed to load components:', result.ErrorMessage);
490
348
  }
491
349
  }
492
350
  catch (error) {
493
- console.error('Failed to load component data:', error);
351
+ console.error('Error loading components:', error);
494
352
  }
495
353
  finally {
496
354
  this.isLoading = false;
497
- this.cdr.markForCheck();
498
355
  }
499
356
  }
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);
357
+ onSearchChange(query) {
358
+ this.searchQuery = query;
359
+ this.filterComponents();
523
360
  }
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));
534
- }
535
- // Type filter
536
- if (types.size > 0) {
537
- filtered = filtered.filter(c => c.Type && types.has(c.Type));
361
+ filterComponents() {
362
+ // Note: this.components already filtered to HasCustomProps = 0 in loadData
363
+ if (!this.searchQuery) {
364
+ this.filteredComponents = [...this.components];
538
365
  }
539
- // Status filter
540
- if (statuses.size > 0) {
541
- filtered = filtered.filter(c => c.Status && statuses.has(c.Status));
366
+ else {
367
+ const query = this.searchQuery.toLowerCase();
368
+ this.filteredComponents = this.components.filter(c => c.Name?.toLowerCase().includes(query) ||
369
+ c.Description?.toLowerCase().includes(query) ||
370
+ c.Type?.toLowerCase().includes(query));
542
371
  }
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
- });
372
+ }
373
+ toggleComponentExpansion(component) {
374
+ // Toggle expansion - if clicking the same component, collapse it
375
+ if (this.expandedComponent?.ID === component.ID) {
376
+ this.expandedComponent = null;
549
377
  }
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
- });
378
+ else {
379
+ this.expandedComponent = component;
558
380
  }
559
- this.filteredComponents$.next(filtered);
560
- this.cdr.markForCheck();
561
- }
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();
381
+ this.cdr.detectChanges();
571
382
  }
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();
578
- setTimeout(() => {
579
- SharedService.Instance.InvokeManualResize();
580
- }, 100);
581
- this.cdr.markForCheck();
383
+ runComponent(component) {
384
+ // If another component is running, stop it first then start the new one
385
+ if (this.isRunning && this.selectedComponent?.ID !== component.ID) {
386
+ this.stopComponent();
387
+ this.startComponent(component);
582
388
  }
583
- }
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)
600
- 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);
389
+ else {
390
+ this.startComponent(component);
606
391
  }
607
- this.emitStateChange();
608
- this.cdr.markForCheck();
609
392
  }
610
- async loadComponentDetails(component) {
393
+ startComponent(component) {
394
+ this.selectedComponent = component;
395
+ this.componentSpec = JSON.parse(component.Specification);
396
+ this.isRunning = true;
397
+ this.currentError = null; // Clear any previous errors
398
+ console.log('Running component:', component.Name);
611
399
  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;
400
+ this.cdr.detectChanges();
616
401
  }
617
402
  catch (error) {
618
- this.previewError = 'Failed to load component details';
619
- console.error('Error loading component details:', error);
403
+ console.error('Error with cdr.detectChanges():', error);
620
404
  }
621
405
  }
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);
406
+ stopComponent() {
407
+ this.isRunning = false;
408
+ this.selectedComponent = null;
409
+ this.componentSpec = null;
410
+ this.currentError = null;
411
+ try {
412
+ this.cdr.detectChanges();
629
413
  }
630
- else {
631
- types.delete(type);
414
+ catch (error) {
415
+ console.error('Error with cdr.detectChanges():', error);
632
416
  }
633
- this.selectedTypes$.next(types);
634
417
  }
635
- onStatusFilterChange(status, checked) {
636
- const statuses = new Set(this.selectedStatuses$.value);
637
- if (checked) {
638
- statuses.add(status);
418
+ /**
419
+ * Handle component events from React components
420
+ */
421
+ onComponentEvent(event) {
422
+ if (event.type === 'error') {
423
+ this.currentError = {
424
+ type: event.payload?.source || 'Component Error',
425
+ message: event.payload?.error || 'An error occurred while rendering the component',
426
+ technicalDetails: event.payload?.errorInfo || event.payload
427
+ };
428
+ this.cdr.detectChanges();
639
429
  }
640
- else {
641
- statuses.delete(status);
430
+ }
431
+ /**
432
+ * Handle open entity record event from React components
433
+ */
434
+ onOpenEntityRecord(event) {
435
+ // Use SharedService to open the entity record in a new window/tab
436
+ SharedService.Instance.OpenEntityRecord(event.entityName, event.key);
437
+ }
438
+ /**
439
+ * Retry running the current component
440
+ */
441
+ retryComponent() {
442
+ if (this.selectedComponent) {
443
+ this.currentError = null;
444
+ this.isRunning = false;
445
+ this.cdr.detectChanges();
446
+ // Small delay to reset the component
447
+ setTimeout(() => {
448
+ this.runComponent(this.selectedComponent);
449
+ }, 100);
642
450
  }
643
- this.selectedStatuses$.next(statuses);
644
451
  }
645
- onSourceFilterChange(source, checked) {
646
- const sources = new Set(this.selectedSources$.value);
647
- if (checked) {
648
- sources.add(source);
452
+ /**
453
+ * Copy error details to clipboard
454
+ */
455
+ async copyErrorToClipboard() {
456
+ if (!this.currentError)
457
+ return;
458
+ const errorText = `
459
+ Component Error Report
460
+ ${'='.repeat(50)}
461
+ Component: ${this.selectedComponent?.Name}
462
+ Error Type: ${this.currentError.type}
463
+ Message: ${this.currentError.message}
464
+ ${this.currentError.technicalDetails ? '\nTechnical Details:\n' + JSON.stringify(this.currentError.technicalDetails, null, 2) : ''}
465
+ `;
466
+ try {
467
+ await navigator.clipboard.writeText(errorText);
468
+ console.log('Error details copied to clipboard');
649
469
  }
650
- else {
651
- sources.delete(source);
470
+ catch (err) {
471
+ console.error('Failed to copy to clipboard:', err);
652
472
  }
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
473
  }
662
- onOpenEntityRecord(event) {
663
- this.OpenEntityRecord.emit({
664
- EntityName: event.entityName,
665
- RecordPKey: event.key
666
- });
474
+ /**
475
+ * Format technical details for display
476
+ */
477
+ formatTechnicalDetails(details) {
478
+ if (typeof details === 'string') {
479
+ return details;
480
+ }
481
+ return JSON.stringify(details, null, 2);
667
482
  }
668
483
  async refreshData() {
669
484
  await this.loadData();
670
485
  }
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
- }
486
+ getComponentTypeIcon(type) {
487
+ const icons = {
488
+ 'Report': 'fa-file-alt',
489
+ 'Dashboard': 'fa-tachometer-alt',
490
+ 'Form': 'fa-edit',
491
+ 'Chart': 'fa-chart-bar',
492
+ 'Table': 'fa-table',
493
+ 'Widget': 'fa-cube',
494
+ 'Navigation': 'fa-compass',
495
+ 'Search': 'fa-search',
496
+ 'Utility': 'fa-cog'
694
497
  };
695
- this.stateChangeSubject.next(state);
498
+ return icons[type || ''] || 'fa-puzzle-piece';
696
499
  }
697
- // Helper methods for template
698
500
  getComponentTypeColor(type) {
699
501
  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
502
+ 'Report': '#3B82F6',
503
+ 'Dashboard': '#8B5CF6',
504
+ 'Form': '#10B981',
505
+ 'Chart': '#F97316',
506
+ 'Table': '#06B6D4',
507
+ 'Widget': '#EC4899',
508
+ 'Navigation': '#6366F1',
509
+ 'Search': '#14B8A6',
510
+ 'Utility': '#64748B'
710
511
  };
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';
512
+ return colors[type || ''] || '#9CA3AF';
720
513
  }
721
514
  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);
515
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ComponentStudioDashboardComponent, selectors: [["mj-component-studio-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 29, vars: 9, consts: [[1, "component-studio"], [1, "dashboard-header"], [1, "header-content"], [1, "fa-solid", "fa-puzzle-piece"], [1, "header-subtitle"], ["kendoButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-sync"], ["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, "fa-solid", "fa-info-circle"], [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, "themeColor"], ["kendoButton", "", "title", "Stop current component and run this one", 3, "themeColor"], ["kendoButton", "", 3, "click", "themeColor"], [1, "fa-solid", "fa-stop"], ["kendoButton", "", "title", "Stop current component and run this one", 3, "click", "themeColor"], [1, "fa-solid", "fa-play"], [1, "error-display"], [3, "component"], [1, "error-container"], [1, "error-header"], [1, "fa-solid", "fa-exclamation-triangle"], ["title", "Copy error details", 1, "copy-button", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "error-intro"], [1, "error-details"], [1, "technical-details"], [1, "error-help"], [1, "error-actions"], ["kendoButton", "", 3, "click"], [1, "fa-solid", "fa-rotate"], [3, "componentEvent", "openEntityRecord", "component"], [1, "fa-solid", "fa-rocket", "fa-3x"]], template: function ComponentStudioDashboardComponent_Template(rf, ctx) { if (rf & 1) {
516
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div")(4, "h1");
517
+ i0.ɵɵelement(5, "i", 3);
518
+ i0.ɵɵtext(6, " Component Studio");
519
+ i0.ɵɵelementEnd();
520
+ i0.ɵɵelementStart(7, "p", 4);
521
+ i0.ɵɵtext(8, "Testing components without custom properties");
522
+ i0.ɵɵelementEnd()();
523
+ i0.ɵɵelementStart(9, "button", 5);
524
+ i0.ɵɵlistener("click", function ComponentStudioDashboardComponent_Template_button_click_9_listener() { return ctx.refreshData(); });
525
+ i0.ɵɵelement(10, "span", 6);
526
+ i0.ɵɵtext(11, " Refresh ");
527
+ i0.ɵɵelementEnd()()();
528
+ i0.ɵɵelementStart(12, "kendo-splitter", 7)(13, "kendo-splitter-pane", 8)(14, "div", 9)(15, "div", 10)(16, "h3");
529
+ i0.ɵɵtext(17, "Components");
726
530
  i0.ɵɵelementEnd();
531
+ i0.ɵɵelementStart(18, "div", 11)(19, "kendo-textbox", 12);
532
+ i0.ɵɵlistener("valueChange", function ComponentStudioDashboardComponent_Template_kendo_textbox_valueChange_19_listener($event) { return ctx.onSearchChange($event); });
533
+ i0.ɵɵtemplate(20, ComponentStudioDashboardComponent_ng_template_20_Template, 1, 0, "ng-template", 13);
534
+ i0.ɵɵelementEnd()()();
535
+ i0.ɵɵelementStart(21, "div", 14);
536
+ i0.ɵɵtemplate(22, ComponentStudioDashboardComponent_Conditional_22_Template, 3, 0, "div", 15)(23, ComponentStudioDashboardComponent_Conditional_23_Template, 6, 0, "div", 16)(24, ComponentStudioDashboardComponent_Conditional_24_Template, 2, 0);
537
+ i0.ɵɵelementEnd()()();
538
+ i0.ɵɵelementStart(25, "kendo-splitter-pane", 17)(26, "div", 18);
539
+ i0.ɵɵtemplate(27, ComponentStudioDashboardComponent_Conditional_27_Template, 2, 1)(28, ComponentStudioDashboardComponent_Conditional_28_Template, 6, 0, "div", 19);
540
+ i0.ɵɵelementEnd()()()();
727
541
  } if (rf & 2) {
542
+ i0.ɵɵadvance(9);
543
+ i0.ɵɵproperty("disabled", ctx.isLoading);
544
+ i0.ɵɵadvance(4);
545
+ i0.ɵɵproperty("min", "350px")("max", "600px")("size", "400px");
546
+ i0.ɵɵadvance(6);
547
+ i0.ɵɵproperty("value", ctx.searchQuery)("clearButton", true);
548
+ i0.ɵɵadvance(3);
549
+ i0.ɵɵconditional(ctx.isLoading ? 22 : ctx.filteredComponents.length === 0 ? 23 : 24);
550
+ i0.ɵɵadvance(3);
551
+ i0.ɵɵproperty("min", "400px");
728
552
  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 });
553
+ i0.ɵɵconditional(ctx.isRunning && ctx.selectedComponent && ctx.componentSpec ? 27 : 28);
554
+ } }, 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 .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n }\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 background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .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
555
  };
734
556
  ComponentStudioDashboardComponent = __decorate([
735
557
  RegisterClass(BaseDashboard, 'ComponentStudioDashboard')
@@ -737,15 +559,13 @@ ComponentStudioDashboardComponent = __decorate([
737
559
  export { ComponentStudioDashboardComponent };
738
560
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ComponentStudioDashboardComponent, [{
739
561
  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}"] }]
562
+ args: [{ selector: 'mj-component-studio-dashboard', template: "<div class=\"component-studio\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-content\">\n <div>\n <h1><i class=\"fa-solid fa-puzzle-piece\"></i> Component Studio</h1>\n <p class=\"header-subtitle\">Testing components without custom properties</p>\n </div>\n <button kendoButton (click)=\"refreshData()\" [disabled]=\"isLoading\">\n <span class=\"fa-solid fa-sync\"></span> 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 <i class=\"fa-solid fa-info-circle\"></i> No components found without custom properties.\n <br>\n <small>Only components that don't require custom props can be tested here.</small>\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 [themeColor]=\"'error'\"\n (click)=\"stopComponent(); $event.stopPropagation()\">\n <span class=\"fa-solid fa-stop\"></span> Stop Component\n </button>\n } @else if (isRunning && selectedComponent?.ID !== component.ID) {\n <button kendoButton \n [themeColor]=\"'base'\"\n title=\"Stop current component and run this one\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Switch to This Component\n </button>\n } @else {\n <button kendoButton \n [themeColor]=\"'primary'\"\n (click)=\"runComponent(component); $event.stopPropagation()\">\n <span class=\"fa-solid fa-play\"></span> Run Component\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n </div>\n </kendo-splitter-pane>\n\n <!-- Right Panel - Component Display -->\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()\">\n <span class=\"fa-solid fa-rotate\"></span> Retry\n </button>\n <button kendoButton (click)=\"stopComponent()\" [themeColor]=\"'error'\">\n <span class=\"fa-solid fa-stop\"></span> Stop\n </button>\n </div>\n </div>\n </div>\n } @else {\n <!-- React Component -->\n <mj-react-component \n [component]=\"componentSpec\"\n (componentEvent)=\"onComponentEvent($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-react-component>\n }\n } @else {\n <!-- 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 .header-subtitle {\n margin: 4px 0 0 0;\n font-size: 13px;\n color: #6c757d;\n font-weight: normal;\n }\n }\n }\n\n kendo-splitter {\n flex: 1;\n background: white;\n display: flex;\n height: 100%;\n min-height: 0;\n }\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 background: linear-gradient(to right, rgba(16, 185, 129, 0.03) 0%, white 100%);\n \n .card-header {\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: #10b981;\n }\n }\n }\n \n .card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n cursor: pointer;\n user-select: none;\n position: relative;\n \n &:hover {\n background: #f8f9fa;\n }\n \n .card-icon {\n font-size: 24px;\n margin-right: 16px;\n width: 32px;\n text-align: center;\n flex-shrink: 0;\n }\n \n .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
563
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
742
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 53 }); })();
564
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ComponentStudioDashboardComponent, { className: "ComponentStudioDashboardComponent", filePath: "src/ComponentStudio/component-studio-dashboard.component.ts", lineNumber: 18 }); })();
743
565
  /**
744
566
  * 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
567
  */
747
568
  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
569
+ // This function doesn't need to do anything
750
570
  }
751
571
  //# sourceMappingURL=component-studio-dashboard.component.js.map