@memberjunction/ng-dashboards 5.11.0 → 5.12.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/AI/components/agents/agent-configuration.component.d.ts +34 -2
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +586 -223
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +23 -8
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2 -2
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
- package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
- package/dist/AI/components/system/system-configuration.component.js +2 -2
- package/dist/AI/components/widgets/kpi-card.component.js +7 -7
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +2 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +3 -3
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +3 -3
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +1 -1
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +2 -2
- package/dist/APIKeys/api-usage-panel.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/execution-monitoring.component.js +2 -2
- package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
- package/dist/Actions/components/explorer/action-card.component.js +2 -2
- package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
- package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
- package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
- package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +2 -2
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +3 -3
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +5 -5
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +2 -2
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js +4 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +5 -5
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +31 -2
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +753 -412
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts +0 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +3 -6
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +97 -5
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
- package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +5 -1
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +2 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +7 -3
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +27 -2
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +107 -4
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -2
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -2
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -2
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-filter-panel.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js +7 -7
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/index.d.ts +0 -1
- package/dist/Scheduling/components/index.d.ts.map +1 -1
- package/dist/Scheduling/components/index.js +0 -1
- package/dist/Scheduling/components/index.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +2 -2
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +2 -2
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +5 -5
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +2 -2
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
- package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +2 -2
- package/dist/VersionHistory/components/diff-resource.component.js +2 -2
- package/dist/VersionHistory/components/graph-resource.component.js +2 -2
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +3 -3
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/__tests__/integration-data-service.test.js +1 -0
- package/dist/__tests__/integration-data-service.test.js.map +1 -1
- package/dist/module.d.ts +52 -49
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +25 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +42 -40
- package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
- package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
- package/dist/Scheduling/components/job-slideout.component.js +0 -459
- package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
|
@@ -2,9 +2,10 @@ import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
|
2
2
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "@angular/forms";
|
|
5
|
+
import * as i2 from "@memberjunction/ng-trees";
|
|
5
6
|
const _forTrack0 = ($index, $item) => $item.value;
|
|
6
|
-
function
|
|
7
|
-
i0.ɵɵelementStart(0, "option",
|
|
7
|
+
function AgentFilterPanelComponent_For_28_Template(rf, ctx) { if (rf & 1) {
|
|
8
|
+
i0.ɵɵelementStart(0, "option", 16);
|
|
8
9
|
i0.ɵɵtext(1);
|
|
9
10
|
i0.ɵɵelementEnd();
|
|
10
11
|
} if (rf & 2) {
|
|
@@ -13,8 +14,8 @@ function AgentFilterPanelComponent_For_23_Template(rf, ctx) { if (rf & 1) {
|
|
|
13
14
|
i0.ɵɵadvance();
|
|
14
15
|
i0.ɵɵtextInterpolate(option_r1.text);
|
|
15
16
|
} }
|
|
16
|
-
function
|
|
17
|
-
i0.ɵɵelementStart(0, "option",
|
|
17
|
+
function AgentFilterPanelComponent_For_35_Template(rf, ctx) { if (rf & 1) {
|
|
18
|
+
i0.ɵɵelementStart(0, "option", 16);
|
|
18
19
|
i0.ɵɵtext(1);
|
|
19
20
|
i0.ɵɵelementEnd();
|
|
20
21
|
} if (rf & 2) {
|
|
@@ -23,8 +24,8 @@ function AgentFilterPanelComponent_For_30_Template(rf, ctx) { if (rf & 1) {
|
|
|
23
24
|
i0.ɵɵadvance();
|
|
24
25
|
i0.ɵɵtextInterpolate(option_r2.text);
|
|
25
26
|
} }
|
|
26
|
-
function
|
|
27
|
-
i0.ɵɵelementStart(0, "option",
|
|
27
|
+
function AgentFilterPanelComponent_For_42_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
i0.ɵɵelementStart(0, "option", 16);
|
|
28
29
|
i0.ɵɵtext(1);
|
|
29
30
|
i0.ɵɵelementEnd();
|
|
30
31
|
} if (rf & 2) {
|
|
@@ -33,8 +34,8 @@ function AgentFilterPanelComponent_For_37_Template(rf, ctx) { if (rf & 1) {
|
|
|
33
34
|
i0.ɵɵadvance();
|
|
34
35
|
i0.ɵɵtextInterpolate(option_r3.text);
|
|
35
36
|
} }
|
|
36
|
-
function
|
|
37
|
-
i0.ɵɵelementStart(0, "option",
|
|
37
|
+
function AgentFilterPanelComponent_For_49_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
+
i0.ɵɵelementStart(0, "option", 16);
|
|
38
39
|
i0.ɵɵtext(1);
|
|
39
40
|
i0.ɵɵelementEnd();
|
|
40
41
|
} if (rf & 2) {
|
|
@@ -43,8 +44,8 @@ function AgentFilterPanelComponent_For_44_Template(rf, ctx) { if (rf & 1) {
|
|
|
43
44
|
i0.ɵɵadvance();
|
|
44
45
|
i0.ɵɵtextInterpolate(option_r4.text);
|
|
45
46
|
} }
|
|
46
|
-
function
|
|
47
|
-
i0.ɵɵelementStart(0, "option",
|
|
47
|
+
function AgentFilterPanelComponent_For_56_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
i0.ɵɵelementStart(0, "option", 16);
|
|
48
49
|
i0.ɵɵtext(1);
|
|
49
50
|
i0.ɵɵelementEnd();
|
|
50
51
|
} if (rf & 2) {
|
|
@@ -62,7 +63,8 @@ export class AgentFilterPanelComponent {
|
|
|
62
63
|
parentAgent: 'all',
|
|
63
64
|
status: 'all',
|
|
64
65
|
executionMode: 'all',
|
|
65
|
-
exposeAsAction: 'all'
|
|
66
|
+
exposeAsAction: 'all',
|
|
67
|
+
categoryId: 'all'
|
|
66
68
|
};
|
|
67
69
|
filtersChange = new EventEmitter();
|
|
68
70
|
filterChange = new EventEmitter();
|
|
@@ -90,6 +92,17 @@ export class AgentFilterPanelComponent {
|
|
|
90
92
|
{ text: 'Exposed as Action', value: 'true' },
|
|
91
93
|
{ text: 'Not Exposed', value: 'false' }
|
|
92
94
|
];
|
|
95
|
+
/** TreeDropdown configuration for agent categories */
|
|
96
|
+
CategoryBranchConfig = {
|
|
97
|
+
EntityName: 'MJ: AI Agent Categories',
|
|
98
|
+
DisplayField: 'Name',
|
|
99
|
+
ParentIDField: 'ParentID',
|
|
100
|
+
DefaultIcon: 'fa-solid fa-folder',
|
|
101
|
+
OrderBy: 'Name ASC',
|
|
102
|
+
DescriptionField: 'Description'
|
|
103
|
+
};
|
|
104
|
+
/** Current category selection for the tree dropdown */
|
|
105
|
+
SelectedCategoryKey = null;
|
|
93
106
|
async ngOnInit() {
|
|
94
107
|
// Load agent types from AIEngineBase
|
|
95
108
|
try {
|
|
@@ -122,6 +135,17 @@ export class AgentFilterPanelComponent {
|
|
|
122
135
|
this.filtersChange.emit(this.filters);
|
|
123
136
|
this.filterChange.emit();
|
|
124
137
|
}
|
|
138
|
+
onCategoryChange(value) {
|
|
139
|
+
if (value && !Array.isArray(value)) {
|
|
140
|
+
const idValue = value.KeyValuePairs?.find(kv => kv.FieldName === 'ID')?.Value;
|
|
141
|
+
this.filters.categoryId = idValue ?? 'all';
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.filters.categoryId = 'all';
|
|
145
|
+
}
|
|
146
|
+
this.SelectedCategoryKey = Array.isArray(value) ? null : value;
|
|
147
|
+
this.onFilterChange();
|
|
148
|
+
}
|
|
125
149
|
resetAllFilters() {
|
|
126
150
|
this.resetFilters.emit();
|
|
127
151
|
}
|
|
@@ -129,7 +153,7 @@ export class AgentFilterPanelComponent {
|
|
|
129
153
|
this.closePanel.emit();
|
|
130
154
|
}
|
|
131
155
|
static ɵfac = function AgentFilterPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AgentFilterPanelComponent)(); };
|
|
132
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AgentFilterPanelComponent, selectors: [["mj-agent-filter-panel"]], inputs: { agents: "agents", filteredAgents: "filteredAgents", filters: "filters" }, outputs: { filtersChange: "filtersChange", filterChange: "filterChange", resetFilters: "resetFilters", closePanel: "closePanel" }, standalone: false, decls:
|
|
156
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AgentFilterPanelComponent, selectors: [["mj-agent-filter-panel"]], inputs: { agents: "agents", filteredAgents: "filteredAgents", filters: "filters" }, outputs: { filtersChange: "filtersChange", filterChange: "filterChange", resetFilters: "resetFilters", closePanel: "closePanel" }, standalone: false, decls: 61, vars: 12, consts: [[1, "filter-panel"], [1, "filter-panel-header"], [1, "filter-summary-inline"], [1, "summary-value"], [1, "summary-label"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "filter-content"], [1, "filter-group"], [1, "filter-label"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search agents...", 1, "filter-input", 3, "ngModelChange", "input", "ngModel"], [1, "fa-solid", "fa-folder-tree"], ["SelectionMode", "single", "SelectableTypes", "branch", "Placeholder", "All Categories", 3, "ValueChange", "BranchConfig", "Value", "Clearable", "EnableSearch"], [1, "fa-solid", "fa-robot"], [1, "filter-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "fa-solid", "fa-sitemap"], [1, "fa-solid", "fa-toggle-on"], [1, "fa-solid", "fa-list-ol"], [1, "fa-solid", "fa-share"], [1, "filter-actions"], ["title", "Reset all filters", 1, "reset-btn", 3, "click"], [1, "fa-solid", "fa-undo"]], template: function AgentFilterPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
133
157
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h3");
|
|
134
158
|
i0.ɵɵtext(3, "Agent Filters");
|
|
135
159
|
i0.ɵɵelementEnd();
|
|
@@ -153,53 +177,60 @@ export class AgentFilterPanelComponent {
|
|
|
153
177
|
i0.ɵɵelementEnd()();
|
|
154
178
|
i0.ɵɵelementStart(17, "div", 8)(18, "label", 9);
|
|
155
179
|
i0.ɵɵelement(19, "span", 12);
|
|
156
|
-
i0.ɵɵtext(20, "
|
|
180
|
+
i0.ɵɵtext(20, " Category ");
|
|
157
181
|
i0.ɵɵelementEnd();
|
|
158
|
-
i0.ɵɵelementStart(21, "
|
|
159
|
-
i0.ɵɵ
|
|
160
|
-
i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_21_listener() { return ctx.onFilterChange(); });
|
|
161
|
-
i0.ɵɵrepeaterCreate(22, AgentFilterPanelComponent_For_23_Template, 2, 2, "option", 14, _forTrack0);
|
|
182
|
+
i0.ɵɵelementStart(21, "mj-tree-dropdown", 13);
|
|
183
|
+
i0.ɵɵlistener("ValueChange", function AgentFilterPanelComponent_Template_mj_tree_dropdown_ValueChange_21_listener($event) { return ctx.onCategoryChange($event); });
|
|
162
184
|
i0.ɵɵelementEnd()();
|
|
163
|
-
i0.ɵɵelementStart(
|
|
164
|
-
i0.ɵɵelement(
|
|
165
|
-
i0.ɵɵtext(
|
|
185
|
+
i0.ɵɵelementStart(22, "div", 8)(23, "label", 9);
|
|
186
|
+
i0.ɵɵelement(24, "span", 14);
|
|
187
|
+
i0.ɵɵtext(25, " Type ");
|
|
166
188
|
i0.ɵɵelementEnd();
|
|
167
|
-
i0.ɵɵelementStart(
|
|
168
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
169
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
170
|
-
i0.ɵɵrepeaterCreate(
|
|
189
|
+
i0.ɵɵelementStart(26, "select", 15);
|
|
190
|
+
i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_26_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.agentType, $event) || (ctx.filters.agentType = $event); return $event; });
|
|
191
|
+
i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_26_listener() { return ctx.onFilterChange(); });
|
|
192
|
+
i0.ɵɵrepeaterCreate(27, AgentFilterPanelComponent_For_28_Template, 2, 2, "option", 16, _forTrack0);
|
|
171
193
|
i0.ɵɵelementEnd()();
|
|
172
|
-
i0.ɵɵelementStart(
|
|
173
|
-
i0.ɵɵelement(
|
|
174
|
-
i0.ɵɵtext(
|
|
194
|
+
i0.ɵɵelementStart(29, "div", 8)(30, "label", 9);
|
|
195
|
+
i0.ɵɵelement(31, "span", 17);
|
|
196
|
+
i0.ɵɵtext(32, " Parent ");
|
|
175
197
|
i0.ɵɵelementEnd();
|
|
176
|
-
i0.ɵɵelementStart(
|
|
177
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
178
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
179
|
-
i0.ɵɵrepeaterCreate(
|
|
198
|
+
i0.ɵɵelementStart(33, "select", 15);
|
|
199
|
+
i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_33_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.parentAgent, $event) || (ctx.filters.parentAgent = $event); return $event; });
|
|
200
|
+
i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_33_listener() { return ctx.onFilterChange(); });
|
|
201
|
+
i0.ɵɵrepeaterCreate(34, AgentFilterPanelComponent_For_35_Template, 2, 2, "option", 16, _forTrack0);
|
|
180
202
|
i0.ɵɵelementEnd()();
|
|
181
|
-
i0.ɵɵelementStart(
|
|
182
|
-
i0.ɵɵelement(
|
|
183
|
-
i0.ɵɵtext(
|
|
203
|
+
i0.ɵɵelementStart(36, "div", 8)(37, "label", 9);
|
|
204
|
+
i0.ɵɵelement(38, "span", 18);
|
|
205
|
+
i0.ɵɵtext(39, " Status ");
|
|
184
206
|
i0.ɵɵelementEnd();
|
|
185
|
-
i0.ɵɵelementStart(
|
|
186
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
187
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
188
|
-
i0.ɵɵrepeaterCreate(
|
|
207
|
+
i0.ɵɵelementStart(40, "select", 15);
|
|
208
|
+
i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_40_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.status, $event) || (ctx.filters.status = $event); return $event; });
|
|
209
|
+
i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_40_listener() { return ctx.onFilterChange(); });
|
|
210
|
+
i0.ɵɵrepeaterCreate(41, AgentFilterPanelComponent_For_42_Template, 2, 2, "option", 16, _forTrack0);
|
|
189
211
|
i0.ɵɵelementEnd()();
|
|
190
|
-
i0.ɵɵelementStart(
|
|
191
|
-
i0.ɵɵelement(
|
|
192
|
-
i0.ɵɵtext(
|
|
212
|
+
i0.ɵɵelementStart(43, "div", 8)(44, "label", 9);
|
|
213
|
+
i0.ɵɵelement(45, "span", 19);
|
|
214
|
+
i0.ɵɵtext(46, " Execution Mode ");
|
|
193
215
|
i0.ɵɵelementEnd();
|
|
194
|
-
i0.ɵɵelementStart(
|
|
195
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
196
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
197
|
-
i0.ɵɵrepeaterCreate(
|
|
216
|
+
i0.ɵɵelementStart(47, "select", 15);
|
|
217
|
+
i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_47_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.executionMode, $event) || (ctx.filters.executionMode = $event); return $event; });
|
|
218
|
+
i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_47_listener() { return ctx.onFilterChange(); });
|
|
219
|
+
i0.ɵɵrepeaterCreate(48, AgentFilterPanelComponent_For_49_Template, 2, 2, "option", 16, _forTrack0);
|
|
198
220
|
i0.ɵɵelementEnd()();
|
|
199
|
-
i0.ɵɵelementStart(
|
|
200
|
-
i0.ɵɵ
|
|
201
|
-
i0.ɵɵ
|
|
202
|
-
i0.ɵɵ
|
|
221
|
+
i0.ɵɵelementStart(50, "div", 8)(51, "label", 9);
|
|
222
|
+
i0.ɵɵelement(52, "span", 20);
|
|
223
|
+
i0.ɵɵtext(53, " Action Exposure ");
|
|
224
|
+
i0.ɵɵelementEnd();
|
|
225
|
+
i0.ɵɵelementStart(54, "select", 15);
|
|
226
|
+
i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_54_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.exposeAsAction, $event) || (ctx.filters.exposeAsAction = $event); return $event; });
|
|
227
|
+
i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_54_listener() { return ctx.onFilterChange(); });
|
|
228
|
+
i0.ɵɵrepeaterCreate(55, AgentFilterPanelComponent_For_56_Template, 2, 2, "option", 16, _forTrack0);
|
|
229
|
+
i0.ɵɵelementEnd()();
|
|
230
|
+
i0.ɵɵelementStart(57, "div", 21)(58, "button", 22);
|
|
231
|
+
i0.ɵɵlistener("click", function AgentFilterPanelComponent_Template_button_click_58_listener() { return ctx.resetAllFilters(); });
|
|
232
|
+
i0.ɵɵelement(59, "span", 23);
|
|
233
|
+
i0.ɵɵtext(60, " Reset Filters ");
|
|
203
234
|
i0.ɵɵelementEnd()()()();
|
|
204
235
|
} if (rf & 2) {
|
|
205
236
|
i0.ɵɵadvance(6);
|
|
@@ -209,6 +240,8 @@ export class AgentFilterPanelComponent {
|
|
|
209
240
|
i0.ɵɵadvance(8);
|
|
210
241
|
i0.ɵɵtwoWayProperty("ngModel", ctx.filters.searchTerm);
|
|
211
242
|
i0.ɵɵadvance(5);
|
|
243
|
+
i0.ɵɵproperty("BranchConfig", ctx.CategoryBranchConfig)("Value", ctx.SelectedCategoryKey)("Clearable", true)("EnableSearch", true);
|
|
244
|
+
i0.ɵɵadvance(5);
|
|
212
245
|
i0.ɵɵtwoWayProperty("ngModel", ctx.filters.agentType);
|
|
213
246
|
i0.ɵɵadvance();
|
|
214
247
|
i0.ɵɵrepeater(ctx.agentTypeOptions);
|
|
@@ -228,11 +261,11 @@ export class AgentFilterPanelComponent {
|
|
|
228
261
|
i0.ɵɵtwoWayProperty("ngModel", ctx.filters.exposeAsAction);
|
|
229
262
|
i0.ɵɵadvance();
|
|
230
263
|
i0.ɵɵrepeater(ctx.exposeAsActionOptions);
|
|
231
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["\n\n\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background:
|
|
264
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.TreeDropdownComponent], styles: ["\n\n\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary-hover);\n font-weight: 500;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--mj-text-disabled);\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-brand-primary);\n width: 16px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%], \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]:focus, \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}"] });
|
|
232
265
|
}
|
|
233
266
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AgentFilterPanelComponent, [{
|
|
234
267
|
type: Component,
|
|
235
|
-
args: [{ standalone: false, selector: 'mj-agent-filter-panel', template: "<div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Agent Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredAgents.length }}</span>\n <span class=\"summary-label\">of {{ agents.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n [(ngModel)]=\"filters.searchTerm\"\n (ngModelChange)=\"onFilterChange()\"\n (input)=\"onFilterChange()\"\n placeholder=\"Search agents...\">\n </div>\n \n <!-- Agent Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-robot\"></span>\n Type\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.agentType\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of agentTypeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Parent Agent Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sitemap\"></span>\n Parent\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.parentAgent\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of parentAgentOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.status\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of statusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Execution Mode Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-list-ol\"></span>\n Execution Mode\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.executionMode\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of executionModeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Expose As Action Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-share\"></span>\n Action Exposure\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.exposeAsAction\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of exposeAsActionOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"resetAllFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n</div>", styles: ["/* Agent Filter Panel - World-Class Design */\n\n.filter-panel {\n height: 100%;\n background:
|
|
268
|
+
args: [{ standalone: false, selector: 'mj-agent-filter-panel', template: "<div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Agent Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredAgents.length }}</span>\n <span class=\"summary-label\">of {{ agents.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n [(ngModel)]=\"filters.searchTerm\"\n (ngModelChange)=\"onFilterChange()\"\n (input)=\"onFilterChange()\"\n placeholder=\"Search agents...\">\n </div>\n \n <!-- Category Filter (TreeDropdown) -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-folder-tree\"></span>\n Category\n </label>\n <mj-tree-dropdown\n [BranchConfig]=\"CategoryBranchConfig\"\n [Value]=\"SelectedCategoryKey\"\n SelectionMode=\"single\"\n SelectableTypes=\"branch\"\n Placeholder=\"All Categories\"\n [Clearable]=\"true\"\n [EnableSearch]=\"true\"\n (ValueChange)=\"onCategoryChange($event)\">\n </mj-tree-dropdown>\n </div>\n\n <!-- Agent Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-robot\"></span>\n Type\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.agentType\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of agentTypeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Parent Agent Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sitemap\"></span>\n Parent\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.parentAgent\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of parentAgentOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.status\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of statusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Execution Mode Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-list-ol\"></span>\n Execution Mode\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.executionMode\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of executionModeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Expose As Action Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-share\"></span>\n Action Exposure\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.exposeAsAction\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of exposeAsActionOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"resetAllFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n</div>", styles: ["/* Agent Filter Panel - World-Class Design */\n\n.filter-panel {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* Header */\n.filter-panel-header {\n padding: 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.filter-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n}\n\n.filter-panel-header .filter-summary-inline .summary-value {\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.filter-panel-header .filter-summary-inline .summary-label {\n color: var(--mj-brand-primary-hover);\n font-weight: 500;\n}\n\n.filter-panel-header .close-btn {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--mj-text-disabled);\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header .close-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.filter-panel-header .close-btn .fa-solid {\n font-size: 14px;\n}\n\n/* Content Area */\n.filter-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n/* Filter Groups */\n.filter-group {\n margin-bottom: 24px;\n}\n\n.filter-group .filter-label {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group .filter-label .fa-solid {\n font-size: 13px;\n color: var(--mj-brand-primary);\n width: 16px;\n}\n\n.filter-group .filter-input,\n.filter-group .filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-group .filter-input:focus,\n.filter-group .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-group .filter-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-group .filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Filter Actions */\n.filter-actions {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.filter-actions .reset-btn {\n width: 100%;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions .reset-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions .reset-btn .fa-solid {\n font-size: 13px;\n}\n\n/* Scrollbar Styling */\n.filter-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n"] }]
|
|
236
269
|
}], null, { agents: [{
|
|
237
270
|
type: Input
|
|
238
271
|
}], filteredAgents: [{
|
|
@@ -248,5 +281,5 @@ export class AgentFilterPanelComponent {
|
|
|
248
281
|
}], closePanel: [{
|
|
249
282
|
type: Output
|
|
250
283
|
}] }); })();
|
|
251
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AgentFilterPanelComponent, { className: "AgentFilterPanelComponent", filePath: "src/AI/components/agents/agent-filter-panel.component.ts", lineNumber:
|
|
284
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AgentFilterPanelComponent, { className: "AgentFilterPanelComponent", filePath: "src/AI/components/agents/agent-filter-panel.component.ts", lineNumber: 24 }); })();
|
|
252
285
|
//# sourceMappingURL=agent-filter-panel.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-filter-panel.component.js","sourceRoot":"","sources":["../../../../src/AI/components/agents/agent-filter-panel.component.ts","../../../../src/AI/components/agents/agent-filter-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { MJAIAgentTypeEntity } from '@memberjunction/core-entities';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\n\ninterface AgentFilter {\n searchTerm: string;\n agentType: string;\n parentAgent: string;\n status: string;\n executionMode: string;\n exposeAsAction: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-agent-filter-panel',\n templateUrl: './agent-filter-panel.component.html',\n styleUrls: ['./agent-filter-panel.component.css']\n})\nexport class AgentFilterPanelComponent implements OnInit {\n @Input() agents: MJAIAgentEntityExtended[] = [];\n @Input() filteredAgents: MJAIAgentEntityExtended[] = [];\n @Input() filters: AgentFilter = {\n searchTerm: '',\n agentType: 'all',\n parentAgent: 'all',\n status: 'all',\n executionMode: 'all',\n exposeAsAction: 'all'\n };\n\n @Output() filtersChange = new EventEmitter<AgentFilter>();\n @Output() filterChange = new EventEmitter<void>();\n @Output() resetFilters = new EventEmitter<void>();\n @Output() closePanel = new EventEmitter<void>();\n\n public agentTypeOptions: { text: string; value: string }[] = [\n { text: 'All Types', value: 'all' }\n ];\n\n public parentAgentOptions: { text: string; value: string }[] = [\n { text: 'All Agents', value: 'all' },\n { text: 'No Parent', value: 'none' }\n ];\n\n public statusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'active' },\n { text: 'Inactive', value: 'inactive' }\n ];\n\n public executionModeOptions = [\n { text: 'All Execution Modes', value: 'all' },\n { text: 'Sequential', value: 'Sequential' },\n { text: 'Parallel', value: 'Parallel' }\n ];\n\n public exposeAsActionOptions = [\n { text: 'All Agents', value: 'all' },\n { text: 'Exposed as Action', value: 'true' },\n { text: 'Not Exposed', value: 'false' }\n ];\n\n async ngOnInit(): Promise<void> {\n // Load agent types from AIEngineBase\n try {\n const aiEngine = AIEngineBase.Instance;\n if (!aiEngine.Loaded) {\n await aiEngine.Config();\n }\n \n // Add agent types to options\n const agentTypes = aiEngine.AgentTypes;\n agentTypes.forEach((type: MJAIAgentTypeEntity) => {\n this.agentTypeOptions.push({\n text: type.Name,\n value: type.ID\n });\n });\n\n // Add parent agents to options (only those without parents themselves)\n const parentAgents = this.agents.filter(agent => !agent.ParentID);\n parentAgents.forEach(agent => {\n this.parentAgentOptions.push({\n text: agent.Name || 'Unnamed Agent',\n value: agent.ID\n });\n });\n } catch (error) {\n console.error('Error loading agent metadata:', error);\n }\n }\n\n public onFilterChange(): void {\n this.filtersChange.emit(this.filters);\n this.filterChange.emit();\n }\n\n public resetAllFilters(): void {\n this.resetFilters.emit();\n }\n\n public toggleFilterPanel(): void {\n this.closePanel.emit();\n }\n}","<div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Agent Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredAgents.length }}</span>\n <span class=\"summary-label\">of {{ agents.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n [(ngModel)]=\"filters.searchTerm\"\n (ngModelChange)=\"onFilterChange()\"\n (input)=\"onFilterChange()\"\n placeholder=\"Search agents...\">\n </div>\n \n <!-- Agent Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-robot\"></span>\n Type\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.agentType\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of agentTypeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Parent Agent Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sitemap\"></span>\n Parent\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.parentAgent\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of parentAgentOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.status\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of statusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Execution Mode Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-list-ol\"></span>\n Execution Mode\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.executionMode\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of executionModeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Expose As Action Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-share\"></span>\n Action Exposure\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.exposeAsAction\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of exposeAsActionOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"resetAllFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n</div>"]}
|
|
1
|
+
{"version":3,"file":"agent-filter-panel.component.js","sourceRoot":"","sources":["../../../../src/AI/components/agents/agent-filter-panel.component.ts","../../../../src/AI/components/agents/agent-filter-panel.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAU,MAAM,eAAe,CAAC;AAG/E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;;;;;;ICsDpD,kCAA+B;IAAA,YAAiB;IAAA,iBAAS;;;IAAjD,uCAAsB;IAAC,cAAiB;IAAjB,oCAAiB;;;IAgBhD,kCAA+B;IAAA,YAAiB;IAAA,iBAAS;;;IAAjD,uCAAsB;IAAC,cAAiB;IAAjB,oCAAiB;;;IAgBhD,kCAA+B;IAAA,YAAiB;IAAA,iBAAS;;;IAAjD,uCAAsB;IAAC,cAAiB;IAAjB,oCAAiB;;;IAgBhD,kCAA+B;IAAA,YAAiB;IAAA,iBAAS;;;IAAjD,uCAAsB;IAAC,cAAiB;IAAjB,oCAAiB;;;IAgBhD,kCAA+B;IAAA,YAAiB;IAAA,iBAAS;;;IAAjD,uCAAsB;IAAC,cAAiB;IAAjB,oCAAiB;;ADlG1D,MAAM,OAAO,yBAAyB;IAC3B,MAAM,GAA8B,EAAE,CAAC;IACvC,cAAc,GAA8B,EAAE,CAAC;IAC/C,OAAO,GAAgB;QAC9B,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,KAAK;QACb,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,KAAK;QACrB,UAAU,EAAE,KAAK;KAClB,CAAC;IAEQ,aAAa,GAAG,IAAI,YAAY,EAAe,CAAC;IAChD,YAAY,GAAG,IAAI,YAAY,EAAQ,CAAC;IACxC,YAAY,GAAG,IAAI,YAAY,EAAQ,CAAC;IACxC,UAAU,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEzC,gBAAgB,GAAsC;QAC3D,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE;KACpC,CAAC;IAEK,kBAAkB,GAAsC;QAC7D,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE;QACpC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;KACrC,CAAC;IAEK,aAAa,GAAG;QACrB,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;QACtC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QACnC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;KACxC,CAAC;IAEK,oBAAoB,GAAG;QAC5B,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE;QAC7C,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;QAC3C,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;KACxC,CAAC;IAEK,qBAAqB,GAAG;QAC7B,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE;QACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE;QAC5C,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE;KACxC,CAAC;IAEF,sDAAsD;IAC/C,oBAAoB,GAAqB;QAC9C,UAAU,EAAE,yBAAyB;QACrC,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,UAAU;QACzB,WAAW,EAAE,oBAAoB;QACjC,OAAO,EAAE,UAAU;QACnB,gBAAgB,EAAE,aAAa;KAChC,CAAC;IAEF,uDAAuD;IAChD,mBAAmB,GAAwB,IAAI,CAAC;IAEvD,KAAK,CAAC,QAAQ;QACZ,qCAAqC;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACrB,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1B,CAAC;YAED,6BAA6B;YAC7B,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;YACvC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAyB,EAAE,EAAE;gBAC/C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI,CAAC,EAAE;iBACf,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,uEAAuE;YACvE,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAC3B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;oBAC3B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,eAAe;oBACnC,KAAK,EAAE,KAAK,CAAC,EAAE;iBAChB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAEM,cAAc;QACnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEM,gBAAgB,CAAC,KAA2C;QACjE,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC;YAC9E,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,OAAO,IAAI,KAAK,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEM,iBAAiB;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;mHA9GU,yBAAyB;6DAAzB,yBAAyB;YCrBlC,AADF,AADF,8BAA0B,aACS,SAC3B;YAAA,6BAAa;YAAA,iBAAK;YAEpB,AADF,8BAAmC,cACL;YAAA,YAA2B;YAAA,iBAAO;YAC9D,+BAA4B;YAAA,YAAsB;YACpD,AADoD,iBAAO,EACrD;YACN,iCAAwD;YAA9B,sGAAS,uBAAmB,IAAC;YACrD,2BAAuC;YAE3C,AADE,iBAAS,EACL;YAKF,AADF,AAFF,+BAA4B,cAEA,gBACI;YAC1B,4BAAwC;YACxC,uBACF;YAAA,iBAAQ;YACR,kCAMiC;YAH/B,wOAAgC;YAEhC,AADA,sHAAiB,oBAAgB,IAAC,yFACzB,oBAAgB,IAAC;YAE9B,AAPE,iBAMiC,EAC7B;YAIJ,AADF,+BAA0B,gBACI;YAC1B,4BAA6C;YAC7C,2BACF;YAAA,iBAAQ;YACR,6CAQ2C;YAAzC,mIAAe,4BAAwB,IAAC;YAE5C,AADE,iBAAmB,EACf;YAIJ,AADF,+BAA0B,gBACI;YAC1B,4BAAuC;YACvC,uBACF;YAAA,iBAAQ;YACR,mCAGqC;YADnC,uOAA+B;YAC/B,uHAAiB,oBAAgB,IAAC;YAClC,kGAEC;YAEL,AADE,iBAAS,EACL;YAIJ,AADF,+BAA0B,gBACI;YAC1B,4BAAyC;YACzC,yBACF;YAAA,iBAAQ;YACR,mCAGqC;YADnC,2OAAiC;YACjC,uHAAiB,oBAAgB,IAAC;YAClC,kGAEC;YAEL,AADE,iBAAS,EACL;YAIJ,AADF,+BAA0B,gBACI;YAC1B,4BAA2C;YAC3C,yBACF;YAAA,iBAAQ;YACR,mCAGqC;YADnC,iOAA4B;YAC5B,uHAAiB,oBAAgB,IAAC;YAClC,kGAEC;YAEL,AADE,iBAAS,EACL;YAIJ,AADF,+BAA0B,gBACI;YAC1B,4BAAyC;YACzC,iCACF;YAAA,iBAAQ;YACR,mCAGqC;YADnC,+OAAmC;YACnC,uHAAiB,oBAAgB,IAAC;YAClC,kGAEC;YAEL,AADE,iBAAS,EACL;YAIJ,AADF,+BAA0B,gBACI;YAC1B,4BAAuC;YACvC,kCACF;YAAA,iBAAQ;YACR,mCAGqC;YADnC,iPAAoC;YACpC,uHAAiB,oBAAgB,IAAC;YAClC,kGAEC;YAEL,AADE,iBAAS,EACL;YAIJ,AADF,gCAA4B,kBACsD;YAAtD,uGAAS,qBAAiB,IAAC;YACnD,4BAAsC;YACtC,gCACF;YAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;YAlI4B,eAA2B;YAA3B,+CAA2B;YAC3B,eAAsB;YAAtB,+CAAsB;YAiBhD,eAAgC;YAAhC,sDAAgC;YAahC,eAAqC;YAMrC,AADA,AAJA,AADA,uDAAqC,kCACR,mBAIX,sBACG;YAarB,eAA+B;YAA/B,qDAA+B;YAE/B,cAEC;YAFD,mCAEC;YAYD,eAAiC;YAAjC,uDAAiC;YAEjC,cAEC;YAFD,qCAEC;YAYD,eAA4B;YAA5B,kDAA4B;YAE5B,cAEC;YAFD,gCAEC;YAYD,eAAmC;YAAnC,yDAAmC;YAEnC,cAEC;YAFD,uCAEC;YAYD,eAAoC;YAApC,0DAAoC;YAEpC,cAEC;YAFD,wCAEC;;;iFDnGI,yBAAyB;cANrC,SAAS;6BACI,KAAK,YACP,uBAAuB;;kBAKhC,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAUL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFAhBI,yBAAyB","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CompositeKey } from '@memberjunction/core';\nimport { MJAIAgentTypeEntity } from '@memberjunction/core-entities';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { TreeBranchConfig } from '@memberjunction/ng-trees';\n\ninterface AgentFilter {\n searchTerm: string;\n agentType: string;\n parentAgent: string;\n status: string;\n executionMode: string;\n exposeAsAction: string;\n categoryId: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-agent-filter-panel',\n templateUrl: './agent-filter-panel.component.html',\n styleUrls: ['./agent-filter-panel.component.css']\n})\nexport class AgentFilterPanelComponent implements OnInit {\n @Input() agents: MJAIAgentEntityExtended[] = [];\n @Input() filteredAgents: MJAIAgentEntityExtended[] = [];\n @Input() filters: AgentFilter = {\n searchTerm: '',\n agentType: 'all',\n parentAgent: 'all',\n status: 'all',\n executionMode: 'all',\n exposeAsAction: 'all',\n categoryId: 'all'\n };\n\n @Output() filtersChange = new EventEmitter<AgentFilter>();\n @Output() filterChange = new EventEmitter<void>();\n @Output() resetFilters = new EventEmitter<void>();\n @Output() closePanel = new EventEmitter<void>();\n\n public agentTypeOptions: { text: string; value: string }[] = [\n { text: 'All Types', value: 'all' }\n ];\n\n public parentAgentOptions: { text: string; value: string }[] = [\n { text: 'All Agents', value: 'all' },\n { text: 'No Parent', value: 'none' }\n ];\n\n public statusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'active' },\n { text: 'Inactive', value: 'inactive' }\n ];\n\n public executionModeOptions = [\n { text: 'All Execution Modes', value: 'all' },\n { text: 'Sequential', value: 'Sequential' },\n { text: 'Parallel', value: 'Parallel' }\n ];\n\n public exposeAsActionOptions = [\n { text: 'All Agents', value: 'all' },\n { text: 'Exposed as Action', value: 'true' },\n { text: 'Not Exposed', value: 'false' }\n ];\n\n /** TreeDropdown configuration for agent categories */\n public CategoryBranchConfig: TreeBranchConfig = {\n EntityName: 'MJ: AI Agent Categories',\n DisplayField: 'Name',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n OrderBy: 'Name ASC',\n DescriptionField: 'Description'\n };\n\n /** Current category selection for the tree dropdown */\n public SelectedCategoryKey: CompositeKey | null = null;\n\n async ngOnInit(): Promise<void> {\n // Load agent types from AIEngineBase\n try {\n const aiEngine = AIEngineBase.Instance;\n if (!aiEngine.Loaded) {\n await aiEngine.Config();\n }\n \n // Add agent types to options\n const agentTypes = aiEngine.AgentTypes;\n agentTypes.forEach((type: MJAIAgentTypeEntity) => {\n this.agentTypeOptions.push({\n text: type.Name,\n value: type.ID\n });\n });\n\n // Add parent agents to options (only those without parents themselves)\n const parentAgents = this.agents.filter(agent => !agent.ParentID);\n parentAgents.forEach(agent => {\n this.parentAgentOptions.push({\n text: agent.Name || 'Unnamed Agent',\n value: agent.ID\n });\n });\n } catch (error) {\n console.error('Error loading agent metadata:', error);\n }\n }\n\n public onFilterChange(): void {\n this.filtersChange.emit(this.filters);\n this.filterChange.emit();\n }\n\n public onCategoryChange(value: CompositeKey | CompositeKey[] | null): void {\n if (value && !Array.isArray(value)) {\n const idValue = value.KeyValuePairs?.find(kv => kv.FieldName === 'ID')?.Value;\n this.filters.categoryId = idValue ?? 'all';\n } else {\n this.filters.categoryId = 'all';\n }\n this.SelectedCategoryKey = Array.isArray(value) ? null : value;\n this.onFilterChange();\n }\n\n public resetAllFilters(): void {\n this.resetFilters.emit();\n }\n\n public toggleFilterPanel(): void {\n this.closePanel.emit();\n }\n}","<div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Agent Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredAgents.length }}</span>\n <span class=\"summary-label\">of {{ agents.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n [(ngModel)]=\"filters.searchTerm\"\n (ngModelChange)=\"onFilterChange()\"\n (input)=\"onFilterChange()\"\n placeholder=\"Search agents...\">\n </div>\n \n <!-- Category Filter (TreeDropdown) -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-folder-tree\"></span>\n Category\n </label>\n <mj-tree-dropdown\n [BranchConfig]=\"CategoryBranchConfig\"\n [Value]=\"SelectedCategoryKey\"\n SelectionMode=\"single\"\n SelectableTypes=\"branch\"\n Placeholder=\"All Categories\"\n [Clearable]=\"true\"\n [EnableSearch]=\"true\"\n (ValueChange)=\"onCategoryChange($event)\">\n </mj-tree-dropdown>\n </div>\n\n <!-- Agent Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-robot\"></span>\n Type\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.agentType\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of agentTypeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Parent Agent Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sitemap\"></span>\n Parent\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.parentAgent\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of parentAgentOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.status\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of statusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Execution Mode Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-list-ol\"></span>\n Execution Mode\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.executionMode\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of executionModeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Expose As Action Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-share\"></span>\n Action Exposure\n </label>\n <select \n class=\"filter-select\"\n [(ngModel)]=\"filters.exposeAsAction\"\n (ngModelChange)=\"onFilterChange()\">\n @for (option of exposeAsActionOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n \n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"resetAllFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n</div>"]}
|
|
@@ -32,6 +32,7 @@ export declare class PerformanceHeatmapComponent implements OnInit, AfterViewIni
|
|
|
32
32
|
private height;
|
|
33
33
|
private margin;
|
|
34
34
|
private defaultColorScheme;
|
|
35
|
+
private getColorScheme;
|
|
35
36
|
selectedMetric: string;
|
|
36
37
|
processedData: HeatmapData[];
|
|
37
38
|
uniqueAgents: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance-heatmap.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/charts/performance-heatmap.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,aAAa,EAAa,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;AAGpI,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBA8Ma,2BAA4B,YAAW,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS;IACpF,IAAI,EAAE,WAAW,EAAE,CAAM;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAM;IAEK,QAAQ,EAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC9B,cAAc,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE3F,OAAO,CAAC,GAAG,CAAsD;IACjE,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAgD;IAG9D,OAAO,CAAC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"performance-heatmap.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/charts/performance-heatmap.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,aAAa,EAAa,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;AAGpI,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBA8Ma,2BAA4B,YAAW,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS;IACpF,IAAI,EAAE,WAAW,EAAE,CAAM;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAM;IAEK,QAAQ,EAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC9B,cAAc,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE3F,OAAO,CAAC,GAAG,CAAsD;IACjE,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAgD;IAG9D,OAAO,CAAC,kBAAkB,CAAgB;IAE1C,OAAO,CAAC,cAAc;IAqBtB,cAAc,SAAiB;IAC/B,aAAa,EAAE,WAAW,EAAE,CAAM;IAClC,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5B,QAAQ,SAAK;IACb,QAAQ,SAAK;IAEb,QAAQ;IAIR,eAAe;IAMf,WAAW,CAAC,OAAO,EAAE,aAAa;IAWlC,WAAW;IAIX,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,gBAAgB;IAyBxB,WAAW;IAYX,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,SAAS;IA8DjB,OAAO,CAAC,QAAQ;IAkChB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,YAAY;IAqBpB,cAAc,IAAI,MAAM;IAYxB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;yCAzX7B,2BAA2B;2CAA3B,2BAA2B;CAoYvC"}
|
|
@@ -17,7 +17,26 @@ export class PerformanceHeatmapComponent {
|
|
|
17
17
|
height = 0;
|
|
18
18
|
margin = { top: 40, right: 20, bottom: 60, left: 80 };
|
|
19
19
|
// Chart configuration
|
|
20
|
-
defaultColorScheme = [
|
|
20
|
+
defaultColorScheme = [];
|
|
21
|
+
getColorScheme() {
|
|
22
|
+
const style = getComputedStyle(document.documentElement);
|
|
23
|
+
const surface = style.getPropertyValue('--mj-bg-surface').trim() || '#ffffff';
|
|
24
|
+
const brandPrimary = style.getPropertyValue('--mj-brand-primary').trim() || '#0076b6';
|
|
25
|
+
// Build a 9-stop scale from surface white through brand primary to dark brand
|
|
26
|
+
const toSurface = d3.interpolateRgb(surface, brandPrimary);
|
|
27
|
+
const toDark = d3.interpolateRgb(brandPrimary, d3.rgb(brandPrimary).darker(2).formatHex());
|
|
28
|
+
return [
|
|
29
|
+
surface,
|
|
30
|
+
toSurface(0.15),
|
|
31
|
+
toSurface(0.3),
|
|
32
|
+
toSurface(0.5),
|
|
33
|
+
toSurface(0.7),
|
|
34
|
+
toSurface(0.85),
|
|
35
|
+
brandPrimary,
|
|
36
|
+
toDark(0.5),
|
|
37
|
+
toDark(1),
|
|
38
|
+
];
|
|
39
|
+
}
|
|
21
40
|
// Data processing
|
|
22
41
|
selectedMetric = 'performance';
|
|
23
42
|
processedData = [];
|
|
@@ -221,7 +240,10 @@ export class PerformanceHeatmapComponent {
|
|
|
221
240
|
// Convert color to RGB and calculate luminance
|
|
222
241
|
const rgb = d3.rgb(backgroundColor);
|
|
223
242
|
const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
|
|
224
|
-
|
|
243
|
+
const style = getComputedStyle(document.documentElement);
|
|
244
|
+
const darkText = style.getPropertyValue('--mj-text-primary').trim() || '#1e293b';
|
|
245
|
+
const lightText = style.getPropertyValue('--mj-text-inverse').trim() || '#ffffff';
|
|
246
|
+
return luminance > 0.5 ? darkText : lightText;
|
|
225
247
|
}
|
|
226
248
|
formatCellValue(value) {
|
|
227
249
|
switch (this.selectedMetric) {
|
|
@@ -264,7 +286,7 @@ export class PerformanceHeatmapComponent {
|
|
|
264
286
|
.attr('x1', '0%')
|
|
265
287
|
.attr('x2', '100%');
|
|
266
288
|
// Add color stops
|
|
267
|
-
const colorScheme = this.config.colorScheme || this.
|
|
289
|
+
const colorScheme = this.config.colorScheme || this.getColorScheme();
|
|
268
290
|
colorScheme.forEach((color, i) => {
|
|
269
291
|
gradient.append('stop')
|
|
270
292
|
.attr('offset', `${(i / (colorScheme.length - 1)) * 100}%`)
|
|
@@ -371,7 +393,7 @@ export class PerformanceHeatmapComponent {
|
|
|
371
393
|
i0.ɵɵtextInterpolate(ctx.formatLegendValue(ctx.minValue));
|
|
372
394
|
i0.ɵɵadvance(2);
|
|
373
395
|
i0.ɵɵtextInterpolate(ctx.formatLegendValue(ctx.maxValue));
|
|
374
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel], styles: [".performance-heatmap[_ngcontent-%COMP%] {\n background:
|
|
396
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel], styles: [".performance-heatmap[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .chart-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .chart-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .chart-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n align-items: center;\n }\n\n .metric-selector[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n }\n\n .metric-selector[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .metric-selector[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 11px;\n background: var(--mj-bg-surface);\n }\n\n .chart-container[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n overflow: hidden;\n min-height: 200px;\n }\n\n .chart-tooltip[_ngcontent-%COMP%] {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: var(--mj-text-inverse);\n padding: 10px 12px;\n border-radius: 4px;\n font-size: 12px;\n pointer-events: none;\n z-index: 1000;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n max-width: 250px;\n }\n\n .chart-legend[_ngcontent-%COMP%] {\n margin-top: 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 11px;\n }\n\n .legend-title[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-weight: 500;\n white-space: nowrap;\n }\n\n .legend-gradient[_ngcontent-%COMP%] {\n flex: 1;\n height: 16px;\n border-radius: 8px;\n position: relative;\n }\n\n .legend-labels[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n min-width: 80px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n \n\n [_nghost-%COMP%] .heatmap-cell {\n stroke: var(--mj-bg-surface);\n stroke-width: 1;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n [_nghost-%COMP%] .heatmap-cell:hover {\n stroke: var(--mj-text-primary);\n stroke-width: 2;\n }\n\n [_nghost-%COMP%] .axis {\n font-size: 10px;\n color: var(--mj-text-muted);\n }\n\n [_nghost-%COMP%] .axis path {\n stroke: var(--mj-border-default);\n }\n\n [_nghost-%COMP%] .axis .tick line {\n stroke: var(--mj-border-default);\n }\n\n [_nghost-%COMP%] .axis .tick text {\n fill: var(--mj-text-muted);\n }\n\n [_nghost-%COMP%] .axis-label {\n font-size: 11px;\n font-weight: 500;\n fill: var(--mj-text-primary);\n }\n\n .no-data[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n gap: 12px;\n }\n\n .no-data[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-border-default);\n }\n\n @media (max-width: 768px) {\n .chart-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .chart-legend[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .legend-gradient[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 200px;\n }\n }"] });
|
|
375
397
|
}
|
|
376
398
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PerformanceHeatmapComponent, [{
|
|
377
399
|
type: Component,
|
|
@@ -405,7 +427,7 @@ export class PerformanceHeatmapComponent {
|
|
|
405
427
|
</div>
|
|
406
428
|
</div>
|
|
407
429
|
</div>
|
|
408
|
-
`, styles: ["\n .performance-heatmap {\n background:
|
|
430
|
+
`, styles: ["\n .performance-heatmap {\n background: var(--mj-bg-surface);\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .chart-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .chart-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .chart-controls {\n display: flex;\n gap: 16px;\n align-items: center;\n }\n\n .metric-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n }\n\n .metric-selector label {\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .metric-selector select {\n padding: 4px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 11px;\n background: var(--mj-bg-surface);\n }\n\n .chart-container {\n flex: 1;\n position: relative;\n overflow: hidden;\n min-height: 200px;\n }\n\n .chart-tooltip {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: var(--mj-text-inverse);\n padding: 10px 12px;\n border-radius: 4px;\n font-size: 12px;\n pointer-events: none;\n z-index: 1000;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n max-width: 250px;\n }\n\n .chart-legend {\n margin-top: 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 11px;\n }\n\n .legend-title {\n color: var(--mj-text-muted);\n font-weight: 500;\n white-space: nowrap;\n }\n\n .legend-gradient {\n flex: 1;\n height: 16px;\n border-radius: 8px;\n position: relative;\n }\n\n .legend-labels {\n display: flex;\n justify-content: space-between;\n min-width: 80px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n /* Chart styles */\n :host ::ng-deep .heatmap-cell {\n stroke: var(--mj-bg-surface);\n stroke-width: 1;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n :host ::ng-deep .heatmap-cell:hover {\n stroke: var(--mj-text-primary);\n stroke-width: 2;\n }\n\n :host ::ng-deep .axis {\n font-size: 10px;\n color: var(--mj-text-muted);\n }\n\n :host ::ng-deep .axis path {\n stroke: var(--mj-border-default);\n }\n\n :host ::ng-deep .axis .tick line {\n stroke: var(--mj-border-default);\n }\n\n :host ::ng-deep .axis .tick text {\n fill: var(--mj-text-muted);\n }\n\n :host ::ng-deep .axis-label {\n font-size: 11px;\n font-weight: 500;\n fill: var(--mj-text-primary);\n }\n\n .no-data {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n gap: 12px;\n }\n\n .no-data i {\n font-size: 32px;\n color: var(--mj-border-default);\n }\n\n @media (max-width: 768px) {\n .chart-header {\n flex-direction: column;\n align-items: flex-start;\n }\n \n .chart-legend {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n \n .legend-gradient {\n width: 100%;\n max-width: 200px;\n }\n }\n "] }]
|
|
409
431
|
}], null, { data: [{
|
|
410
432
|
type: Input
|
|
411
433
|
}], title: [{
|