@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.
Files changed (227) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +586 -223
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  8. package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
  9. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  10. package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
  11. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
  12. package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
  13. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  14. package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
  15. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  16. package/dist/AI/components/charts/time-series-chart.component.js +23 -8
  17. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  18. package/dist/AI/components/execution-monitoring.component.js +2 -2
  19. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  20. package/dist/AI/components/models/model-management.component.js +2 -2
  21. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  22. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  23. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  24. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
  26. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
  27. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
  28. package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
  29. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
  30. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  31. package/dist/AI/components/system/system-configuration.component.js +2 -2
  32. package/dist/AI/components/widgets/kpi-card.component.js +7 -7
  33. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  34. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
  35. package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
  36. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  37. package/dist/AI/index.d.ts +1 -0
  38. package/dist/AI/index.d.ts.map +1 -1
  39. package/dist/AI/index.js +2 -0
  40. package/dist/AI/index.js.map +1 -1
  41. package/dist/APIKeys/api-applications-panel.component.js +3 -3
  42. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  43. package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
  44. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  45. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  46. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  47. package/dist/APIKeys/api-key-list.component.js +3 -3
  48. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  49. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  50. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  51. package/dist/APIKeys/api-scopes-panel.component.js +2 -2
  52. package/dist/APIKeys/api-usage-panel.component.js +2 -2
  53. package/dist/Actions/components/actions-overview.component.js +2 -2
  54. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  55. package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
  56. package/dist/Actions/components/explorer/action-card.component.js +2 -2
  57. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  58. package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
  59. package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
  61. package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
  62. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  63. package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
  64. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  65. package/dist/Communication/communication-dashboard.component.js +2 -2
  66. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  67. package/dist/Communication/communication-logs-resource.component.js +3 -3
  68. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  69. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  70. package/dist/Communication/communication-monitor-resource.component.js +5 -5
  71. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  72. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  73. package/dist/Communication/communication-providers-resource.component.js +3 -3
  74. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  75. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  76. package/dist/Communication/communication-runs-resource.component.js +3 -3
  77. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  78. package/dist/Communication/communication-templates-resource.component.js +2 -2
  79. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  80. package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
  81. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
  82. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
  83. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
  84. package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
  86. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
  88. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
  90. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
  92. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  96. package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  98. package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
  99. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
  100. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
  102. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
  107. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
  109. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
  111. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  112. package/dist/Credentials/credentials-dashboard.component.js +2 -2
  113. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
  114. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
  115. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  116. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
  117. package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
  118. package/dist/DataExplorer/data-explorer-dashboard.component.js +4 -4
  119. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  120. package/dist/Home/home-dashboard.component.js +2 -2
  121. package/dist/Integration/components/activity/activity.component.d.ts +1 -1
  122. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  123. package/dist/Integration/components/activity/activity.component.js +5 -5
  124. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  125. package/dist/Integration/components/connections/connections.component.d.ts +31 -2
  126. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  127. package/dist/Integration/components/connections/connections.component.js +753 -412
  128. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  129. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
  130. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  131. package/dist/Integration/components/overview/overview.component.d.ts +0 -1
  132. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  133. package/dist/Integration/components/overview/overview.component.js +3 -6
  134. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  135. package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
  136. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  137. package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
  138. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  139. package/dist/Integration/components/schedules/schedules.component.js +97 -5
  140. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  141. package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
  142. package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
  143. package/dist/Integration/components/widgets/integration-card.component.js +5 -1
  144. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  145. package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
  146. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  147. package/dist/Integration/integration.module.d.ts +2 -1
  148. package/dist/Integration/integration.module.d.ts.map +1 -1
  149. package/dist/Integration/integration.module.js +7 -3
  150. package/dist/Integration/integration.module.js.map +1 -1
  151. package/dist/Integration/services/integration-data.service.d.ts +27 -2
  152. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  153. package/dist/Integration/services/integration-data.service.js +107 -4
  154. package/dist/Integration/services/integration-data.service.js.map +1 -1
  155. package/dist/Lists/components/lists-browse-resource.component.js +2 -2
  156. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  157. package/dist/Lists/components/lists-categories-resource.component.js +2 -2
  158. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  159. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
  160. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  161. package/dist/Lists/components/lists-operations-resource.component.js +2 -2
  162. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  163. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
  164. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  165. package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
  166. package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
  167. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  168. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  169. package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
  170. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  171. package/dist/MCP/mcp-dashboard.component.js +2 -2
  172. package/dist/MCP/mcp-filter-panel.component.js +2 -2
  173. package/dist/QueryBrowser/query-browser-resource.component.js +7 -7
  174. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  175. package/dist/Scheduling/components/index.d.ts +0 -1
  176. package/dist/Scheduling/components/index.d.ts.map +1 -1
  177. package/dist/Scheduling/components/index.js +0 -1
  178. package/dist/Scheduling/components/index.js.map +1 -1
  179. package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
  180. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
  181. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  182. package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
  183. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  184. package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
  185. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  186. package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
  187. package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
  188. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  189. package/dist/Testing/components/testing-analytics.component.js +2 -2
  190. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  191. package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
  192. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  193. package/dist/Testing/components/testing-explorer.component.js +2 -2
  194. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  195. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  196. package/dist/Testing/components/testing-review.component.js +5 -5
  197. package/dist/Testing/components/testing-review.component.js.map +1 -1
  198. package/dist/Testing/components/testing-runs.component.js +2 -2
  199. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  200. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
  201. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  202. package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
  203. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  204. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
  205. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  206. package/dist/Testing/testing-dashboard.component.js +2 -2
  207. package/dist/VersionHistory/components/diff-resource.component.js +2 -2
  208. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  209. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  210. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  211. package/dist/VersionHistory/components/restore-resource.component.js +3 -3
  212. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  213. package/dist/__tests__/integration-data-service.test.js +1 -0
  214. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  215. package/dist/module.d.ts +52 -49
  216. package/dist/module.d.ts.map +1 -1
  217. package/dist/module.js +25 -6
  218. package/dist/module.js.map +1 -1
  219. package/dist/public-api.d.ts +1 -1
  220. package/dist/public-api.d.ts.map +1 -1
  221. package/dist/public-api.js +1 -1
  222. package/dist/public-api.js.map +1 -1
  223. package/package.json +42 -40
  224. package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
  225. package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
  226. package/dist/Scheduling/components/job-slideout.component.js +0 -459
  227. 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 AgentFilterPanelComponent_For_23_Template(rf, ctx) { if (rf & 1) {
7
- i0.ɵɵelementStart(0, "option", 14);
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 AgentFilterPanelComponent_For_30_Template(rf, ctx) { if (rf & 1) {
17
- i0.ɵɵelementStart(0, "option", 14);
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 AgentFilterPanelComponent_For_37_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelementStart(0, "option", 14);
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 AgentFilterPanelComponent_For_44_Template(rf, ctx) { if (rf & 1) {
37
- i0.ɵɵelementStart(0, "option", 14);
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 AgentFilterPanelComponent_For_51_Template(rf, ctx) { if (rf & 1) {
47
- i0.ɵɵelementStart(0, "option", 14);
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: 56, vars: 8, 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-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) {
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, " Type ");
180
+ i0.ɵɵtext(20, " Category ");
157
181
  i0.ɵɵelementEnd();
158
- i0.ɵɵelementStart(21, "select", 13);
159
- i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_21_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.agentType, $event) || (ctx.filters.agentType = $event); return $event; });
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(24, "div", 8)(25, "label", 9);
164
- i0.ɵɵelement(26, "span", 15);
165
- i0.ɵɵtext(27, " Parent ");
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(28, "select", 13);
168
- i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_28_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.parentAgent, $event) || (ctx.filters.parentAgent = $event); return $event; });
169
- i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_28_listener() { return ctx.onFilterChange(); });
170
- i0.ɵɵrepeaterCreate(29, AgentFilterPanelComponent_For_30_Template, 2, 2, "option", 14, _forTrack0);
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(31, "div", 8)(32, "label", 9);
173
- i0.ɵɵelement(33, "span", 16);
174
- i0.ɵɵtext(34, " Status ");
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(35, "select", 13);
177
- i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_35_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.status, $event) || (ctx.filters.status = $event); return $event; });
178
- i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_35_listener() { return ctx.onFilterChange(); });
179
- i0.ɵɵrepeaterCreate(36, AgentFilterPanelComponent_For_37_Template, 2, 2, "option", 14, _forTrack0);
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(38, "div", 8)(39, "label", 9);
182
- i0.ɵɵelement(40, "span", 17);
183
- i0.ɵɵtext(41, " Execution Mode ");
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(42, "select", 13);
186
- i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_42_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.executionMode, $event) || (ctx.filters.executionMode = $event); return $event; });
187
- i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_42_listener() { return ctx.onFilterChange(); });
188
- i0.ɵɵrepeaterCreate(43, AgentFilterPanelComponent_For_44_Template, 2, 2, "option", 14, _forTrack0);
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(45, "div", 8)(46, "label", 9);
191
- i0.ɵɵelement(47, "span", 18);
192
- i0.ɵɵtext(48, " Action Exposure ");
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(49, "select", 13);
195
- i0.ɵɵtwoWayListener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_49_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.filters.exposeAsAction, $event) || (ctx.filters.exposeAsAction = $event); return $event; });
196
- i0.ɵɵlistener("ngModelChange", function AgentFilterPanelComponent_Template_select_ngModelChange_49_listener() { return ctx.onFilterChange(); });
197
- i0.ɵɵrepeaterCreate(50, AgentFilterPanelComponent_For_51_Template, 2, 2, "option", 14, _forTrack0);
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(52, "div", 19)(53, "button", 20);
200
- i0.ɵɵlistener("click", function AgentFilterPanelComponent_Template_button_click_53_listener() { return ctx.resetAllFilters(); });
201
- i0.ɵɵelement(54, "span", 21);
202
- i0.ɵɵtext(55, " Reset Filters ");
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: white;\n border-right: 1px solid #e5e7eb;\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 #f1f5f9;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: #1e293b;\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: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%);\n border-radius: 20px;\n border: 1px solid #c4b5fd;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: #6366f1;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-label[_ngcontent-%COMP%] {\n color: #7c3aed;\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: #94a3b8;\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: #f1f5f9;\n color: #475569;\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: #64748b;\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: #6366f1;\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 #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\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: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]::placeholder {\n color: #94a3b8;\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 #f1f5f9;\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n color: #64748b;\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: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);\n border-color: #cbd5e1;\n color: #475569;\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: #f8fafc;\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}"] });
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: white;\n border-right: 1px solid #e5e7eb;\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 #f1f5f9;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: linear-gradient(135deg, #fafbfc 0%, #f8fafc 100%);\n}\n\n.filter-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: #1e293b;\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: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%);\n border-radius: 20px;\n border: 1px solid #c4b5fd;\n}\n\n.filter-panel-header .filter-summary-inline .summary-value {\n font-weight: 700;\n color: #6366f1;\n}\n\n.filter-panel-header .filter-summary-inline .summary-label {\n color: #7c3aed;\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: #94a3b8;\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: #f1f5f9;\n color: #475569;\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: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group .filter-label .fa-solid {\n font-size: 13px;\n color: #6366f1;\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 #e2e8f0;\n border-radius: 10px;\n font-size: 14px;\n background: white;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: #334155;\n}\n\n.filter-group .filter-input:focus,\n.filter-group .filter-select:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);\n}\n\n.filter-group .filter-input::placeholder {\n color: #94a3b8;\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 #f1f5f9;\n}\n\n.filter-actions .reset-btn {\n width: 100%;\n padding: 12px 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n color: #64748b;\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: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);\n border-color: #cbd5e1;\n color: #475569;\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: #f8fafc;\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n"] }]
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: 21 }); })();
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":"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","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,CAAuG;IAGjI,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;IAOpB,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;yCAlW7B,2BAA2B;2CAA3B,2BAA2B;CA6WvC"}
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 = ['#f7fbff', '#deebf7', '#c6dbef', '#9ecae1', '#6baed6', '#4292c6', '#2171b5', '#08519c', '#08306b'];
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
- return luminance > 0.5 ? '#333' : '#fff';
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.defaultColorScheme;
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: white;\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: #333;\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: #666;\n font-weight: 500;\n }\n\n .metric-selector[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n padding: 4px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 11px;\n background: white;\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: white;\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: #666;\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: #666;\n font-weight: 500;\n }\n\n \n\n [_nghost-%COMP%] .heatmap-cell {\n stroke: white;\n stroke-width: 1;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n [_nghost-%COMP%] .heatmap-cell:hover {\n stroke: #333;\n stroke-width: 2;\n }\n\n [_nghost-%COMP%] .axis {\n font-size: 10px;\n color: #666;\n }\n\n [_nghost-%COMP%] .axis path {\n stroke: #ddd;\n }\n\n [_nghost-%COMP%] .axis .tick line {\n stroke: #ddd;\n }\n\n [_nghost-%COMP%] .axis .tick text {\n fill: #666;\n }\n\n [_nghost-%COMP%] .axis-label {\n font-size: 11px;\n font-weight: 500;\n fill: #333;\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: #999;\n gap: 12px;\n }\n\n .no-data[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: #ddd;\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 }"] });
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: white;\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: #333;\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: #666;\n font-weight: 500;\n }\n\n .metric-selector select {\n padding: 4px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 11px;\n background: white;\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: white;\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: #666;\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: #666;\n font-weight: 500;\n }\n\n /* Chart styles */\n :host ::ng-deep .heatmap-cell {\n stroke: white;\n stroke-width: 1;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n :host ::ng-deep .heatmap-cell:hover {\n stroke: #333;\n stroke-width: 2;\n }\n\n :host ::ng-deep .axis {\n font-size: 10px;\n color: #666;\n }\n\n :host ::ng-deep .axis path {\n stroke: #ddd;\n }\n\n :host ::ng-deep .axis .tick line {\n stroke: #ddd;\n }\n\n :host ::ng-deep .axis .tick text {\n fill: #666;\n }\n\n :host ::ng-deep .axis-label {\n font-size: 11px;\n font-weight: 500;\n fill: #333;\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: #999;\n gap: 12px;\n }\n\n .no-data i {\n font-size: 32px;\n color: #ddd;\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 "] }]
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: [{