@memberjunction/ng-dashboards 2.47.0 → 2.49.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/README.md +105 -2
- package/dist/AI/ai-dashboard.component.d.ts +2 -0
- package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
- package/dist/AI/ai-dashboard.component.js +66 -43
- package/dist/AI/ai-dashboard.component.js.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +45 -58
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +6 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +368 -366
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +83 -85
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +66 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.js +428 -0
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts +66 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -0
- package/dist/AI/components/charts/time-series-chart.component.js +547 -0
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts +157 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2032 -20
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +211 -237
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +208 -226
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +97 -99
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +381 -424
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +173 -191
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +85 -87
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +86 -99
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.d.ts +25 -0
- package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -0
- package/dist/AI/components/widgets/kpi-card.component.js +163 -0
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -0
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts +25 -0
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -0
- package/dist/AI/components/widgets/live-execution-widget.component.js +298 -0
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -0
- package/dist/AI/index.d.ts +7 -0
- package/dist/AI/index.d.ts.map +1 -0
- package/dist/AI/index.js +9 -0
- package/dist/AI/index.js.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts +109 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.js +490 -0
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -0
- package/dist/Actions/actions-management-dashboard.component.js +40 -41
- package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +117 -134
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +274 -296
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +12 -14
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.js +12 -14
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +12 -14
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +238 -256
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +12 -14
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +12 -14
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +12 -14
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/EntityAdmin/components/entity-details.component.js +105 -107
- package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
- package/dist/EntityAdmin/components/entity-filter-panel.component.js +100 -102
- package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -1
- package/dist/EntityAdmin/components/erd-composite.component.js +84 -100
- package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -1
- package/dist/EntityAdmin/components/erd-diagram.component.js +50 -50
- package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +45 -49
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/generic/base-dashboard.js +28 -40
- package/dist/generic/base-dashboard.js.map +1 -1
- package/dist/module.d.ts +16 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +36 -15
- package/dist/module.js.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -191,7 +191,46 @@ interface DashboardConfig {
|
|
|
191
191
|
|
|
192
192
|
### State Management
|
|
193
193
|
|
|
194
|
-
Each dashboard maintains its own state structure that can be persisted:
|
|
194
|
+
Each dashboard maintains its own state structure that can be persisted and restored. The state management pattern follows these principles:
|
|
195
|
+
|
|
196
|
+
1. **State Initialization**: When a dashboard loads, the `loadData()` method checks for user state in the `Config` property and applies it
|
|
197
|
+
2. **State Changes**: Components emit state changes via `UserStateChanged` events with debouncing to prevent excessive updates
|
|
198
|
+
3. **State Persistence**: Parent components should listen to `UserStateChanged` events and persist the state as needed
|
|
199
|
+
4. **State Restoration**: Pass previously saved state through the `Config.userState` property when initializing the dashboard
|
|
200
|
+
|
|
201
|
+
#### How State Loading Works
|
|
202
|
+
|
|
203
|
+
When a dashboard component initializes:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
// In the dashboard's loadData() method
|
|
207
|
+
loadData(): void {
|
|
208
|
+
// Check if we have user state in the Config and apply it
|
|
209
|
+
if (this.Config?.userState) {
|
|
210
|
+
this.loadUserState(this.Config.userState);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Continue with other initialization...
|
|
214
|
+
this.LoadingComplete.emit();
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
The `loadUserState()` method then applies the saved state to the component and its sub-components:
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
// Example from AIDashboardComponent
|
|
222
|
+
public loadUserState(state: Partial<AIDashboardState>): void {
|
|
223
|
+
if (state.activeTab) {
|
|
224
|
+
this.activeTab = state.activeTab;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Store sub-component states for when they're rendered
|
|
228
|
+
if (state.executionMonitoringState) {
|
|
229
|
+
this.executionMonitoringState = state.executionMonitoringState;
|
|
230
|
+
}
|
|
231
|
+
// ... other state properties
|
|
232
|
+
}
|
|
233
|
+
```
|
|
195
234
|
|
|
196
235
|
#### AI Dashboard State
|
|
197
236
|
```typescript
|
|
@@ -200,9 +239,29 @@ interface AIDashboardState {
|
|
|
200
239
|
modelManagementState: any;
|
|
201
240
|
promptManagementState: any;
|
|
202
241
|
agentConfigurationState: any;
|
|
203
|
-
executionMonitoringState:
|
|
242
|
+
executionMonitoringState: ExecutionMonitoringState;
|
|
204
243
|
systemConfigurationState: any;
|
|
205
244
|
}
|
|
245
|
+
|
|
246
|
+
// ExecutionMonitoringState includes detailed UI state
|
|
247
|
+
interface ExecutionMonitoringState {
|
|
248
|
+
selectedTimeRange: string;
|
|
249
|
+
refreshInterval: number;
|
|
250
|
+
panelStates: {
|
|
251
|
+
cost: boolean;
|
|
252
|
+
efficiency: boolean;
|
|
253
|
+
executions: boolean;
|
|
254
|
+
};
|
|
255
|
+
drillDownTabs: Array<{
|
|
256
|
+
id: string;
|
|
257
|
+
title: string;
|
|
258
|
+
type: string;
|
|
259
|
+
timestamp?: string;
|
|
260
|
+
metric?: string;
|
|
261
|
+
}>;
|
|
262
|
+
activeTabId: string;
|
|
263
|
+
splitterSizes?: number[];
|
|
264
|
+
}
|
|
206
265
|
```
|
|
207
266
|
|
|
208
267
|
#### Entity Admin Dashboard State
|
|
@@ -219,6 +278,50 @@ interface DashboardState {
|
|
|
219
278
|
}
|
|
220
279
|
```
|
|
221
280
|
|
|
281
|
+
#### Example: Complete State Management Implementation
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
// Parent component that uses the AI Dashboard
|
|
285
|
+
@Component({
|
|
286
|
+
template: `
|
|
287
|
+
<mj-ai-dashboard
|
|
288
|
+
[Config]="dashboardConfig"
|
|
289
|
+
(UserStateChanged)="onStateChanged($event)">
|
|
290
|
+
</mj-ai-dashboard>
|
|
291
|
+
`
|
|
292
|
+
})
|
|
293
|
+
export class AIManagementComponent implements OnInit {
|
|
294
|
+
dashboardConfig: DashboardConfig;
|
|
295
|
+
|
|
296
|
+
ngOnInit() {
|
|
297
|
+
// Load saved state from your persistence layer
|
|
298
|
+
const savedState = this.loadSavedState();
|
|
299
|
+
|
|
300
|
+
// Configure dashboard with saved state
|
|
301
|
+
this.dashboardConfig = {
|
|
302
|
+
dashboard: this.dashboardEntity,
|
|
303
|
+
userState: savedState // This will be applied in loadData()
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
onStateChanged(state: AIDashboardState) {
|
|
308
|
+
// Save state changes with debouncing handled by the dashboard
|
|
309
|
+
this.saveState(state);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
private loadSavedState(): AIDashboardState | null {
|
|
313
|
+
// Load from localStorage, database, or other persistence
|
|
314
|
+
const saved = localStorage.getItem('ai-dashboard-state');
|
|
315
|
+
return saved ? JSON.parse(saved) : null;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
private saveState(state: AIDashboardState): void {
|
|
319
|
+
// Save to your persistence layer
|
|
320
|
+
localStorage.setItem('ai-dashboard-state', JSON.stringify(state));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
222
325
|
## Integration with MemberJunction
|
|
223
326
|
|
|
224
327
|
The dashboards are designed to work seamlessly with other MemberJunction packages:
|
|
@@ -16,6 +16,7 @@ export declare class AIDashboardComponent extends BaseDashboard implements After
|
|
|
16
16
|
promptManagementState: any;
|
|
17
17
|
agentConfigurationState: any;
|
|
18
18
|
systemConfigurationState: any;
|
|
19
|
+
executionMonitoringState: any;
|
|
19
20
|
navigationItems: string[];
|
|
20
21
|
get navigationConfig(): {
|
|
21
22
|
text: string;
|
|
@@ -38,6 +39,7 @@ export declare class AIDashboardComponent extends BaseDashboard implements After
|
|
|
38
39
|
onPromptManagementStateChange(state: any): void;
|
|
39
40
|
onAgentConfigurationStateChange(state: any): void;
|
|
40
41
|
onSystemConfigurationStateChange(state: any): void;
|
|
42
|
+
onExecutionMonitoringStateChange(state: any): void;
|
|
41
43
|
loadUserState(state: Partial<AIDashboardState>): void;
|
|
42
44
|
onOpenEntityRecord(data: {
|
|
43
45
|
entityName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/AI/ai-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,aAAa,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"ai-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/AI/ai-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,aAAa,EAAE,SAAS,EAAa,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;AAM1D,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,GAAG,CAAC;IAC1B,qBAAqB,EAAE,GAAG,CAAC;IAC3B,uBAAuB,EAAE,GAAG,CAAC;IAC7B,wBAAwB,EAAE,GAAG,CAAC;IAC9B,wBAAwB,EAAE,GAAG,CAAC;CAC/B;AAED,qBAMa,oBAAqB,SAAQ,aAAc,YAAW,aAAa,EAAE,SAAS;IAElF,SAAS,UAAS;IAClB,SAAS,SAAgB;IACzB,aAAa,SAAK;IAGlB,qBAAqB,EAAE,GAAG,CAAQ;IAClC,uBAAuB,EAAE,GAAG,CAAQ;IACpC,wBAAwB,EAAE,GAAG,CAAQ;IACrC,wBAAwB,EAAE,GAAG,CAAQ;IAGrC,eAAe,EAAE,MAAM,EAAE,CAA2D;IAE3F,IAAW,gBAAgB;;;;QAQ1B;IAED,IAAW,wBAAwB;;;;QAQlC;IAED,OAAO,CAAC,kBAAkB,CAAmC;;IAO7D,eAAe,IAAI,IAAI;IAKvB,WAAW,IAAI,IAAI;IAIZ,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMhC,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAU3C,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe;IAahB,6BAA6B,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAK/C,+BAA+B,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAKjD,gCAAgC,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAKlD,gCAAgC,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAKlD,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAsBrD,kBAAkB,CAAC,IAAI,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,KAAK,GAAG,IAAI;IAarF,aAAa,IAAI,IAAI;IAYrB,QAAQ,IAAI,IAAI;IAWT,kBAAkB,IAAI,MAAM;yCAvKxB,oBAAoB;2CAApB,oBAAoB;CA4KhC;AAED,wBAAgB,eAAe,SAE9B"}
|
|
@@ -27,37 +27,40 @@ function AIDashboardComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
|
27
27
|
} }
|
|
28
28
|
function AIDashboardComponent_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
29
29
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
30
|
-
i0.ɵɵelementStart(0, "app-model-management",
|
|
30
|
+
i0.ɵɵelementStart(0, "app-model-management", 12);
|
|
31
31
|
i0.ɵɵlistener("openEntityRecord", function AIDashboardComponent_Conditional_2_Conditional_2_Template_app_model_management_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); });
|
|
32
32
|
i0.ɵɵelementEnd();
|
|
33
33
|
} }
|
|
34
34
|
function AIDashboardComponent_Conditional_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
35
35
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
36
|
-
i0.ɵɵelementStart(0, "app-prompt-management",
|
|
36
|
+
i0.ɵɵelementStart(0, "app-prompt-management", 13);
|
|
37
37
|
i0.ɵɵlistener("openEntityRecord", function AIDashboardComponent_Conditional_2_Conditional_3_Template_app_prompt_management_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("stateChange", function AIDashboardComponent_Conditional_2_Conditional_3_Template_app_prompt_management_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPromptManagementStateChange($event)); });
|
|
38
38
|
i0.ɵɵelementEnd();
|
|
39
39
|
} }
|
|
40
40
|
function AIDashboardComponent_Conditional_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
41
41
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
42
|
-
i0.ɵɵelementStart(0, "app-agent-configuration",
|
|
42
|
+
i0.ɵɵelementStart(0, "app-agent-configuration", 13);
|
|
43
43
|
i0.ɵɵlistener("openEntityRecord", function AIDashboardComponent_Conditional_2_Conditional_4_Template_app_agent_configuration_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("stateChange", function AIDashboardComponent_Conditional_2_Conditional_4_Template_app_agent_configuration_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onAgentConfigurationStateChange($event)); });
|
|
44
44
|
i0.ɵɵelementEnd();
|
|
45
45
|
} }
|
|
46
46
|
function AIDashboardComponent_Conditional_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
47
47
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
48
|
-
i0.ɵɵelementStart(0, "app-execution-monitoring",
|
|
49
|
-
i0.ɵɵlistener("openEntityRecord", function AIDashboardComponent_Conditional_2_Conditional_5_Template_app_execution_monitoring_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); });
|
|
48
|
+
i0.ɵɵelementStart(0, "app-execution-monitoring", 14);
|
|
49
|
+
i0.ɵɵlistener("openEntityRecord", function AIDashboardComponent_Conditional_2_Conditional_5_Template_app_execution_monitoring_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("stateChange", function AIDashboardComponent_Conditional_2_Conditional_5_Template_app_execution_monitoring_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onExecutionMonitoringStateChange($event)); });
|
|
50
50
|
i0.ɵɵelementEnd();
|
|
51
|
+
} if (rf & 2) {
|
|
52
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
53
|
+
i0.ɵɵproperty("initialState", ctx_r1.executionMonitoringState);
|
|
51
54
|
} }
|
|
52
55
|
function AIDashboardComponent_Conditional_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
53
56
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
54
|
-
i0.ɵɵelementStart(0, "app-system-configuration",
|
|
57
|
+
i0.ɵɵelementStart(0, "app-system-configuration", 13);
|
|
55
58
|
i0.ɵɵlistener("openEntityRecord", function AIDashboardComponent_Conditional_2_Conditional_6_Template_app_system_configuration_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("stateChange", function AIDashboardComponent_Conditional_2_Conditional_6_Template_app_system_configuration_stateChange_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSystemConfigurationStateChange($event)); });
|
|
56
59
|
i0.ɵɵelementEnd();
|
|
57
60
|
} }
|
|
58
61
|
function AIDashboardComponent_Conditional_2_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
59
62
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
60
|
-
i0.ɵɵelementStart(0, "div",
|
|
63
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
61
64
|
i0.ɵɵlistener("click", function AIDashboardComponent_Conditional_2_For_9_Template_div_click_0_listener() { const $index_r8 = i0.ɵɵrestoreView(_r7).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTabChange(ctx_r1.navigationItems[$index_r8])); });
|
|
62
65
|
i0.ɵɵelement(1, "i");
|
|
63
66
|
i0.ɵɵelementStart(2, "span");
|
|
@@ -73,10 +76,10 @@ function AIDashboardComponent_Conditional_2_For_9_Template(rf, ctx) { if (rf & 1
|
|
|
73
76
|
} }
|
|
74
77
|
function AIDashboardComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
75
78
|
i0.ɵɵelementStart(0, "div", 2)(1, "div", 7);
|
|
76
|
-
i0.ɵɵtemplate(2, AIDashboardComponent_Conditional_2_Conditional_2_Template, 1, 0, "app-model-management", 8)(3, AIDashboardComponent_Conditional_2_Conditional_3_Template, 1, 0, "app-prompt-management", 8)(4, AIDashboardComponent_Conditional_2_Conditional_4_Template, 1, 0, "app-agent-configuration", 8)(5, AIDashboardComponent_Conditional_2_Conditional_5_Template, 1,
|
|
79
|
+
i0.ɵɵtemplate(2, AIDashboardComponent_Conditional_2_Conditional_2_Template, 1, 0, "app-model-management", 8)(3, AIDashboardComponent_Conditional_2_Conditional_3_Template, 1, 0, "app-prompt-management", 8)(4, AIDashboardComponent_Conditional_2_Conditional_4_Template, 1, 0, "app-agent-configuration", 8)(5, AIDashboardComponent_Conditional_2_Conditional_5_Template, 1, 1, "app-execution-monitoring", 9)(6, AIDashboardComponent_Conditional_2_Conditional_6_Template, 1, 0, "app-system-configuration", 8);
|
|
77
80
|
i0.ɵɵelementEnd();
|
|
78
|
-
i0.ɵɵelementStart(7, "div",
|
|
79
|
-
i0.ɵɵrepeaterCreate(8, AIDashboardComponent_Conditional_2_For_9_Template, 4, 5, "div",
|
|
81
|
+
i0.ɵɵelementStart(7, "div", 10);
|
|
82
|
+
i0.ɵɵrepeaterCreate(8, AIDashboardComponent_Conditional_2_For_9_Template, 4, 5, "div", 11, i0.ɵɵrepeaterTrackByIndex);
|
|
80
83
|
i0.ɵɵelementEnd()();
|
|
81
84
|
} if (rf & 2) {
|
|
82
85
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -94,36 +97,37 @@ function AIDashboardComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
|
94
97
|
i0.ɵɵrepeater(ctx_r1.navigationConfig);
|
|
95
98
|
} }
|
|
96
99
|
let AIDashboardComponent = class AIDashboardComponent extends BaseDashboard {
|
|
100
|
+
isLoading = false;
|
|
101
|
+
activeTab = 'monitoring'; // Default tab changed to monitoring
|
|
102
|
+
selectedIndex = 0; // Track selected navigation index
|
|
103
|
+
// Component states
|
|
104
|
+
promptManagementState = null;
|
|
105
|
+
agentConfigurationState = null;
|
|
106
|
+
systemConfigurationState = null;
|
|
107
|
+
executionMonitoringState = null;
|
|
108
|
+
// Navigation items for bottom navigation - reordered with monitoring first
|
|
109
|
+
navigationItems = ['monitoring', 'prompts', 'agents', 'models', 'config'];
|
|
97
110
|
get navigationConfig() {
|
|
98
111
|
return [
|
|
99
|
-
{ text: '
|
|
112
|
+
{ text: 'Monitor', icon: 'fa-solid fa-chart-line', selected: this.activeTab === 'monitoring' },
|
|
100
113
|
{ text: 'Prompts', icon: 'fa-solid fa-comment-dots', selected: this.activeTab === 'prompts' },
|
|
101
114
|
{ text: 'Agents', icon: 'fa-solid fa-robot', selected: this.activeTab === 'agents' },
|
|
102
|
-
{ text: '
|
|
115
|
+
{ text: 'Models', icon: 'fa-solid fa-microchip', selected: this.activeTab === 'models' },
|
|
103
116
|
{ text: 'Config', icon: 'fa-solid fa-cogs', selected: this.activeTab === 'config' }
|
|
104
117
|
];
|
|
105
118
|
}
|
|
106
119
|
get navigationConfigForKendo() {
|
|
107
120
|
return [
|
|
108
|
-
{ text: '
|
|
121
|
+
{ text: 'Monitor', icon: 'chart-line', selected: this.activeTab === 'monitoring' },
|
|
109
122
|
{ text: 'Prompts', icon: 'comment', selected: this.activeTab === 'prompts' },
|
|
110
123
|
{ text: 'Agents', icon: 'user', selected: this.activeTab === 'agents' },
|
|
111
|
-
{ text: '
|
|
124
|
+
{ text: 'Models', icon: 'gear', selected: this.activeTab === 'models' },
|
|
112
125
|
{ text: 'Config', icon: 'cog', selected: this.activeTab === 'config' }
|
|
113
126
|
];
|
|
114
127
|
}
|
|
128
|
+
stateChangeSubject = new Subject();
|
|
115
129
|
constructor() {
|
|
116
130
|
super();
|
|
117
|
-
this.isLoading = false;
|
|
118
|
-
this.activeTab = 'models'; // Default tab
|
|
119
|
-
this.selectedIndex = 0; // Track selected navigation index
|
|
120
|
-
// Component states
|
|
121
|
-
this.promptManagementState = null;
|
|
122
|
-
this.agentConfigurationState = null;
|
|
123
|
-
this.systemConfigurationState = null;
|
|
124
|
-
// Navigation items for bottom navigation
|
|
125
|
-
this.navigationItems = ['models', 'prompts', 'agents', 'monitoring', 'config'];
|
|
126
|
-
this.stateChangeSubject = new Subject();
|
|
127
131
|
this.setupStateManagement();
|
|
128
132
|
}
|
|
129
133
|
ngAfterViewInit() {
|
|
@@ -134,7 +138,6 @@ let AIDashboardComponent = class AIDashboardComponent extends BaseDashboard {
|
|
|
134
138
|
this.stateChangeSubject.complete();
|
|
135
139
|
}
|
|
136
140
|
onTabChange(tabId) {
|
|
137
|
-
console.log('AI Dashboard: Tab changed to:', tabId);
|
|
138
141
|
this.activeTab = tabId;
|
|
139
142
|
this.selectedIndex = this.navigationItems.indexOf(tabId);
|
|
140
143
|
this.emitStateChange();
|
|
@@ -146,7 +149,6 @@ let AIDashboardComponent = class AIDashboardComponent extends BaseDashboard {
|
|
|
146
149
|
this.selectedIndex = index;
|
|
147
150
|
this.activeTab = this.navigationItems[index];
|
|
148
151
|
this.emitStateChange();
|
|
149
|
-
console.log('AI Dashboard: Switched to tab:', this.activeTab, 'index:', index);
|
|
150
152
|
}
|
|
151
153
|
}
|
|
152
154
|
setupStateManagement() {
|
|
@@ -161,7 +163,7 @@ let AIDashboardComponent = class AIDashboardComponent extends BaseDashboard {
|
|
|
161
163
|
modelManagementState: {},
|
|
162
164
|
promptManagementState: this.promptManagementState || {},
|
|
163
165
|
agentConfigurationState: this.agentConfigurationState || {},
|
|
164
|
-
executionMonitoringState: {},
|
|
166
|
+
executionMonitoringState: this.executionMonitoringState || {},
|
|
165
167
|
systemConfigurationState: this.systemConfigurationState || {}
|
|
166
168
|
};
|
|
167
169
|
this.stateChangeSubject.next(state);
|
|
@@ -178,12 +180,28 @@ let AIDashboardComponent = class AIDashboardComponent extends BaseDashboard {
|
|
|
178
180
|
this.systemConfigurationState = state;
|
|
179
181
|
this.emitStateChange();
|
|
180
182
|
}
|
|
183
|
+
onExecutionMonitoringStateChange(state) {
|
|
184
|
+
this.executionMonitoringState = state;
|
|
185
|
+
this.emitStateChange();
|
|
186
|
+
}
|
|
181
187
|
loadUserState(state) {
|
|
182
188
|
if (state.activeTab) {
|
|
183
189
|
this.activeTab = state.activeTab;
|
|
184
190
|
this.selectedIndex = this.navigationItems.indexOf(state.activeTab);
|
|
185
191
|
}
|
|
186
|
-
//
|
|
192
|
+
// Store component states for when they're rendered
|
|
193
|
+
if (state.executionMonitoringState) {
|
|
194
|
+
this.executionMonitoringState = state.executionMonitoringState;
|
|
195
|
+
}
|
|
196
|
+
if (state.promptManagementState) {
|
|
197
|
+
this.promptManagementState = state.promptManagementState;
|
|
198
|
+
}
|
|
199
|
+
if (state.agentConfigurationState) {
|
|
200
|
+
this.agentConfigurationState = state.agentConfigurationState;
|
|
201
|
+
}
|
|
202
|
+
if (state.systemConfigurationState) {
|
|
203
|
+
this.systemConfigurationState = state.systemConfigurationState;
|
|
204
|
+
}
|
|
187
205
|
}
|
|
188
206
|
// Handle entity record opening from sub-components
|
|
189
207
|
onOpenEntityRecord(data) {
|
|
@@ -213,33 +231,38 @@ let AIDashboardComponent = class AIDashboardComponent extends BaseDashboard {
|
|
|
213
231
|
}
|
|
214
232
|
loadData() {
|
|
215
233
|
// Load any initial data needed for the AI dashboard
|
|
216
|
-
//
|
|
234
|
+
// Check if we have user state in the Config and apply it
|
|
235
|
+
if (this.Config?.userState) {
|
|
236
|
+
this.loadUserState(this.Config.userState);
|
|
237
|
+
}
|
|
238
|
+
// Emit loading complete event
|
|
239
|
+
this.LoadingComplete.emit();
|
|
217
240
|
}
|
|
218
241
|
getCurrentTabLabel() {
|
|
219
242
|
const tabIndex = this.navigationItems.indexOf(this.activeTab);
|
|
220
|
-
const labels = ['
|
|
243
|
+
const labels = ['Monitor', 'Prompts', 'Agents', 'Models', 'Config'];
|
|
221
244
|
return tabIndex >= 0 ? labels[tabIndex] : 'AI Administration';
|
|
222
245
|
}
|
|
246
|
+
static ɵfac = function AIDashboardComponent_Factory(t) { return new (t || AIDashboardComponent)(); };
|
|
247
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIDashboardComponent, selectors: [["mj-ai-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 4, consts: [["mjFillContainer", "", 1, "ai-dashboard-container", 3, "rightMargin", "bottomMargin"], [1, "loading-container"], [1, "dashboard-content-wrapper"], [1, "loading-content"], [1, "loading-spinner"], [1, "spinner-ring"], [1, "loading-text"], [1, "dashboard-content"], ["mjFillContainer", ""], ["mjFillContainer", "", 3, "initialState"], [1, "ai-dashboard-nav"], [1, "nav-item", 3, "active"], ["mjFillContainer", "", 3, "openEntityRecord"], ["mjFillContainer", "", 3, "openEntityRecord", "stateChange"], ["mjFillContainer", "", 3, "openEntityRecord", "stateChange", "initialState"], [1, "nav-item", 3, "click"]], template: function AIDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
248
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
249
|
+
i0.ɵɵtemplate(1, AIDashboardComponent_Conditional_1_Template, 8, 0, "div", 1)(2, AIDashboardComponent_Conditional_2_Template, 10, 5, "div", 2);
|
|
250
|
+
i0.ɵɵelementEnd();
|
|
251
|
+
} if (rf & 2) {
|
|
252
|
+
i0.ɵɵproperty("rightMargin", 8)("bottomMargin", 8);
|
|
253
|
+
i0.ɵɵadvance();
|
|
254
|
+
i0.ɵɵconditional(ctx.isLoading ? 1 : -1);
|
|
255
|
+
i0.ɵɵadvance();
|
|
256
|
+
i0.ɵɵconditional(!ctx.isLoading ? 2 : -1);
|
|
257
|
+
} }, dependencies: [i1.FillContainer, i2.ModelManagementComponent, i3.PromptManagementComponent, i4.AgentConfigurationComponent, i5.ExecutionMonitoringComponent, i6.SystemConfigurationComponent], styles: [".ai-dashboard-container[_ngcontent-%COMP%] {\n overflow: hidden;\n padding: 4px;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dashboard-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-info {\n flex: 1;\n display: flex;\n align-items: center;\n }\n \n .current-tab-info {\n font-size: 12px;\n color: #2196f3;\n font-weight: 600;\n background: rgba(33, 150, 243, 0.1);\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid rgba(33, 150, 243, 0.2);\n }\n \n .header-controls {\n display: flex;\n gap: 8px;\n \n .control-btn {\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n \n &:hover {\n background-color: #f0f0f0;\n border-color: #2196f3;\n }\n \n &.active {\n background-color: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n \n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n \n &:hover {\n background-color: white;\n border-color: #ccc;\n }\n }\n \n .fa-solid {\n font-size: 14px;\n }\n }\n }\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n flex: 1;\n \n p {\n color: #666;\n font-size: 14px;\n }\n}\n\n.dashboard-content-wrapper[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n}\n\n.dashboard-content[_ngcontent-%COMP%] {\n overflow: hidden;\n flex: 1;\n}\n\n.ai-dashboard-nav[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: flex;\n background: white;\n border-top: 1px solid #e0e0e0;\n padding: 0;\n \n .nav-item {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 12px 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #666;\n font-size: 12px;\n border-right: 1px solid #e0e0e0;\n \n &:last-child {\n border-right: none;\n }\n \n &:hover {\n background-color: #f5f5f5;\n color: #2196f3;\n }\n \n &.active {\n background-color: #e3f2fd;\n color: #2196f3;\n font-weight: 600;\n \n i {\n color: #2196f3;\n }\n }\n \n i {\n font-size: 18px;\n margin-bottom: 4px;\n color: inherit;\n }\n \n span {\n font-size: 11px;\n text-align: center;\n line-height: 1.2;\n }\n }\n}\n\n.loading-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s linear infinite;\n \n &:nth-child(1) {\n border-top-color: #2196f3;\n animation-delay: 0s;\n }\n \n &:nth-child(2) {\n border-top-color: #9c27b0;\n animation-delay: 0.3s;\n transform: scale(0.8);\n }\n \n &:nth-child(3) {\n border-top-color: #ff6b35;\n animation-delay: 0.6s;\n transform: scale(0.6);\n }\n}\n\n.loading-text[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n text-align: center;\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}"] });
|
|
223
258
|
};
|
|
224
|
-
AIDashboardComponent.ɵfac = function AIDashboardComponent_Factory(t) { return new (t || AIDashboardComponent)(); };
|
|
225
|
-
AIDashboardComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AIDashboardComponent, selectors: [["mj-ai-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 4, consts: [["mjFillContainer", "", 1, "ai-dashboard-container", 3, "rightMargin", "bottomMargin"], [1, "loading-container"], [1, "dashboard-content-wrapper"], [1, "loading-content"], [1, "loading-spinner"], [1, "spinner-ring"], [1, "loading-text"], [1, "dashboard-content"], ["mjFillContainer", ""], [1, "ai-dashboard-nav"], [1, "nav-item", 3, "active"], ["mjFillContainer", "", 3, "openEntityRecord"], ["mjFillContainer", "", 3, "openEntityRecord", "stateChange"], [1, "nav-item", 3, "click"]], template: function AIDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
226
|
-
i0.ɵɵelementStart(0, "div", 0);
|
|
227
|
-
i0.ɵɵtemplate(1, AIDashboardComponent_Conditional_1_Template, 8, 0, "div", 1)(2, AIDashboardComponent_Conditional_2_Template, 10, 5, "div", 2);
|
|
228
|
-
i0.ɵɵelementEnd();
|
|
229
|
-
} if (rf & 2) {
|
|
230
|
-
i0.ɵɵproperty("rightMargin", 8)("bottomMargin", 8);
|
|
231
|
-
i0.ɵɵadvance();
|
|
232
|
-
i0.ɵɵconditional(ctx.isLoading ? 1 : -1);
|
|
233
|
-
i0.ɵɵadvance();
|
|
234
|
-
i0.ɵɵconditional(!ctx.isLoading ? 2 : -1);
|
|
235
|
-
} }, dependencies: [i1.FillContainer, i2.ModelManagementComponent, i3.PromptManagementComponent, i4.AgentConfigurationComponent, i5.ExecutionMonitoringComponent, i6.SystemConfigurationComponent], styles: [".ai-dashboard-container[_ngcontent-%COMP%] {\n overflow: hidden;\n padding: 4px;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dashboard-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-info {\n flex: 1;\n display: flex;\n align-items: center;\n }\n \n .current-tab-info {\n font-size: 12px;\n color: #2196f3;\n font-weight: 600;\n background: rgba(33, 150, 243, 0.1);\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid rgba(33, 150, 243, 0.2);\n }\n \n .header-controls {\n display: flex;\n gap: 8px;\n \n .control-btn {\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n \n &:hover {\n background-color: #f0f0f0;\n border-color: #2196f3;\n }\n \n &.active {\n background-color: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n \n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n \n &:hover {\n background-color: white;\n border-color: #ccc;\n }\n }\n \n .fa-solid {\n font-size: 14px;\n }\n }\n }\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n flex: 1;\n \n p {\n color: #666;\n font-size: 14px;\n }\n}\n\n.dashboard-content-wrapper[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n}\n\n.dashboard-content[_ngcontent-%COMP%] {\n overflow: hidden;\n flex: 1;\n}\n\n.ai-dashboard-nav[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: flex;\n background: white;\n border-top: 1px solid #e0e0e0;\n padding: 0;\n \n .nav-item {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 12px 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #666;\n font-size: 12px;\n border-right: 1px solid #e0e0e0;\n \n &:last-child {\n border-right: none;\n }\n \n &:hover {\n background-color: #f5f5f5;\n color: #2196f3;\n }\n \n &.active {\n background-color: #e3f2fd;\n color: #2196f3;\n font-weight: 600;\n \n i {\n color: #2196f3;\n }\n }\n \n i {\n font-size: 18px;\n margin-bottom: 4px;\n color: inherit;\n }\n \n span {\n font-size: 11px;\n text-align: center;\n line-height: 1.2;\n }\n }\n}\n\n.loading-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s linear infinite;\n \n &:nth-child(1) {\n border-top-color: #2196f3;\n animation-delay: 0s;\n }\n \n &:nth-child(2) {\n border-top-color: #9c27b0;\n animation-delay: 0.3s;\n transform: scale(0.8);\n }\n \n &:nth-child(3) {\n border-top-color: #ff6b35;\n animation-delay: 0.6s;\n transform: scale(0.6);\n }\n}\n\n.loading-text[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n text-align: center;\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}"] });
|
|
236
259
|
AIDashboardComponent = __decorate([
|
|
237
260
|
RegisterClass(BaseDashboard, 'AIDashboard')
|
|
238
261
|
], AIDashboardComponent);
|
|
239
262
|
export { AIDashboardComponent };
|
|
240
263
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AIDashboardComponent, [{
|
|
241
264
|
type: Component,
|
|
242
|
-
args: [{ selector: 'mj-ai-dashboard', template: "<div class=\"ai-dashboard-container\" mjFillContainer [rightMargin]=\"8\" [bottomMargin]=\"8\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">Loading AI Dashboard...</div>\n </div>\n </div>\n }\n \n @if (!isLoading) {\n <div class=\"dashboard-content-wrapper\">\n <div class=\"dashboard-content\">\n @if (activeTab === 'models') {\n <app-model-management\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n mjFillContainer>\n </app-model-management>\n }\n \n @if (activeTab === 'prompts') {\n <app-prompt-management\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (stateChange)=\"onPromptManagementStateChange($event)\"\n mjFillContainer>\n </app-prompt-management>\n }\n \n @if (activeTab === 'agents') {\n <app-agent-configuration\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (stateChange)=\"onAgentConfigurationStateChange($event)\"\n mjFillContainer>\n </app-agent-configuration>\n }\n \n @if (activeTab === 'monitoring') {\n <app-execution-monitoring\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n mjFillContainer>\n </app-execution-monitoring>\n }\n \n @if (activeTab === 'config') {\n <app-system-configuration\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (stateChange)=\"onSystemConfigurationStateChange($event)\"\n mjFillContainer>\n </app-system-configuration>\n }\n </div>\n \n <div class=\"ai-dashboard-nav\">\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: [".ai-dashboard-container {\n overflow: hidden;\n padding: 4px;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dashboard-header {\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-info {\n flex: 1;\n display: flex;\n align-items: center;\n }\n \n .current-tab-info {\n font-size: 12px;\n color: #2196f3;\n font-weight: 600;\n background: rgba(33, 150, 243, 0.1);\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid rgba(33, 150, 243, 0.2);\n }\n \n .header-controls {\n display: flex;\n gap: 8px;\n \n .control-btn {\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n \n &:hover {\n background-color: #f0f0f0;\n border-color: #2196f3;\n }\n \n &.active {\n background-color: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n \n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n \n &:hover {\n background-color: white;\n border-color: #ccc;\n }\n }\n \n .fa-solid {\n font-size: 14px;\n }\n }\n }\n}\n\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n flex: 1;\n \n p {\n color: #666;\n font-size: 14px;\n }\n}\n\n.dashboard-content-wrapper {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n}\n\n.dashboard-content {\n overflow: hidden;\n flex: 1;\n}\n\n.ai-dashboard-nav {\n flex-shrink: 0;\n display: flex;\n background: white;\n border-top: 1px solid #e0e0e0;\n padding: 0;\n \n .nav-item {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 12px 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #666;\n font-size: 12px;\n border-right: 1px solid #e0e0e0;\n \n &:last-child {\n border-right: none;\n }\n \n &:hover {\n background-color: #f5f5f5;\n color: #2196f3;\n }\n \n &.active {\n background-color: #e3f2fd;\n color: #2196f3;\n font-weight: 600;\n \n i {\n color: #2196f3;\n }\n }\n \n i {\n font-size: 18px;\n margin-bottom: 4px;\n color: inherit;\n }\n \n span {\n font-size: 11px;\n text-align: center;\n line-height: 1.2;\n }\n }\n}\n\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: spin 1.5s linear infinite;\n \n &:nth-child(1) {\n border-top-color: #2196f3;\n animation-delay: 0s;\n }\n \n &:nth-child(2) {\n border-top-color: #9c27b0;\n animation-delay: 0.3s;\n transform: scale(0.8);\n }\n \n &:nth-child(3) {\n border-top-color: #ff6b35;\n animation-delay: 0.6s;\n transform: scale(0.6);\n }\n}\n\n.loading-text {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n text-align: center;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}"] }]
|
|
265
|
+
args: [{ selector: 'mj-ai-dashboard', template: "<div class=\"ai-dashboard-container\" mjFillContainer [rightMargin]=\"8\" [bottomMargin]=\"8\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">Loading AI Dashboard...</div>\n </div>\n </div>\n }\n \n @if (!isLoading) {\n <div class=\"dashboard-content-wrapper\">\n <div class=\"dashboard-content\">\n @if (activeTab === 'models') {\n <app-model-management\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n mjFillContainer>\n </app-model-management>\n }\n \n @if (activeTab === 'prompts') {\n <app-prompt-management\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (stateChange)=\"onPromptManagementStateChange($event)\"\n mjFillContainer>\n </app-prompt-management>\n }\n \n @if (activeTab === 'agents') {\n <app-agent-configuration\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (stateChange)=\"onAgentConfigurationStateChange($event)\"\n mjFillContainer>\n </app-agent-configuration>\n }\n \n @if (activeTab === 'monitoring') {\n <app-execution-monitoring\n [initialState]=\"executionMonitoringState\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (stateChange)=\"onExecutionMonitoringStateChange($event)\"\n mjFillContainer>\n </app-execution-monitoring>\n }\n \n @if (activeTab === 'config') {\n <app-system-configuration\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (stateChange)=\"onSystemConfigurationStateChange($event)\"\n mjFillContainer>\n </app-system-configuration>\n }\n </div>\n \n <div class=\"ai-dashboard-nav\">\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: [".ai-dashboard-container {\n overflow: hidden;\n padding: 4px;\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.dashboard-header {\n margin-bottom: 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n \n .header-info {\n flex: 1;\n display: flex;\n align-items: center;\n }\n \n .current-tab-info {\n font-size: 12px;\n color: #2196f3;\n font-weight: 600;\n background: rgba(33, 150, 243, 0.1);\n padding: 4px 8px;\n border-radius: 4px;\n border: 1px solid rgba(33, 150, 243, 0.2);\n }\n \n .header-controls {\n display: flex;\n gap: 8px;\n \n .control-btn {\n padding: 8px 12px;\n border: 1px solid #ccc;\n border-radius: 4px;\n background: white;\n cursor: pointer;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n \n &:hover {\n background-color: #f0f0f0;\n border-color: #2196f3;\n }\n \n &.active {\n background-color: #2196f3;\n border-color: #2196f3;\n color: white;\n }\n \n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n \n &:hover {\n background-color: white;\n border-color: #ccc;\n }\n }\n \n .fa-solid {\n font-size: 14px;\n }\n }\n }\n}\n\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n flex: 1;\n \n p {\n color: #666;\n font-size: 14px;\n }\n}\n\n.dashboard-content-wrapper {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n}\n\n.dashboard-content {\n overflow: hidden;\n flex: 1;\n}\n\n.ai-dashboard-nav {\n flex-shrink: 0;\n display: flex;\n background: white;\n border-top: 1px solid #e0e0e0;\n padding: 0;\n \n .nav-item {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 12px 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #666;\n font-size: 12px;\n border-right: 1px solid #e0e0e0;\n \n &:last-child {\n border-right: none;\n }\n \n &:hover {\n background-color: #f5f5f5;\n color: #2196f3;\n }\n \n &.active {\n background-color: #e3f2fd;\n color: #2196f3;\n font-weight: 600;\n \n i {\n color: #2196f3;\n }\n }\n \n i {\n font-size: 18px;\n margin-bottom: 4px;\n color: inherit;\n }\n \n span {\n font-size: 11px;\n text-align: center;\n line-height: 1.2;\n }\n }\n}\n\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: spin 1.5s linear infinite;\n \n &:nth-child(1) {\n border-top-color: #2196f3;\n animation-delay: 0s;\n }\n \n &:nth-child(2) {\n border-top-color: #9c27b0;\n animation-delay: 0.3s;\n transform: scale(0.8);\n }\n \n &:nth-child(3) {\n border-top-color: #ff6b35;\n animation-delay: 0.6s;\n transform: scale(0.6);\n }\n}\n\n.loading-text {\n font-size: 14px;\n color: #666;\n font-weight: 500;\n text-align: center;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}"] }]
|
|
243
266
|
}], () => [], null); })();
|
|
244
267
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AIDashboardComponent, { className: "AIDashboardComponent", filePath: "src/AI/ai-dashboard.component.ts", lineNumber: 23 }); })();
|
|
245
268
|
export function LoadAIDashboard() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-dashboard.component.js","sourceRoot":"","sources":["../../src/AI/ai-dashboard.component.ts","../../src/AI/ai-dashboard.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"ai-dashboard.component.js","sourceRoot":"","sources":["../../src/AI/ai-dashboard.component.ts","../../src/AI/ai-dashboard.component.html"],"names":[],"mappings":"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"}
|