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