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