@memberjunction/ng-dashboards 5.28.0 → 5.29.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 (47) hide show
  1. package/dist/Archiving/components/archive-config-resource.component.d.ts +20 -0
  2. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -0
  3. package/dist/Archiving/components/archive-config-resource.component.js +46 -0
  4. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -0
  5. package/dist/Archiving/components/archive-runs-resource.component.d.ts +20 -0
  6. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -0
  7. package/dist/Archiving/components/archive-runs-resource.component.js +46 -0
  8. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -0
  9. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  10. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  11. package/dist/MCP/mcp-dashboard.component.d.ts +170 -0
  12. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  13. package/dist/MCP/mcp-dashboard.component.js +2471 -679
  14. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  15. package/dist/MCP/mcp-filter-panel.component.d.ts +16 -1
  16. package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -1
  17. package/dist/MCP/mcp-filter-panel.component.js +187 -60
  18. package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
  19. package/dist/MCP/mcp-resource.component.d.ts +0 -9
  20. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  21. package/dist/MCP/mcp-resource.component.js +1 -10
  22. package/dist/MCP/mcp-resource.component.js.map +1 -1
  23. package/dist/MCP/mcp.module.d.ts +7 -6
  24. package/dist/MCP/mcp.module.d.ts.map +1 -1
  25. package/dist/MCP/mcp.module.js +4 -8
  26. package/dist/MCP/mcp.module.js.map +1 -1
  27. package/dist/QueryBrowser/query-browser-resource.component.d.ts +13 -3
  28. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  29. package/dist/QueryBrowser/query-browser-resource.component.js +186 -139
  30. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  31. package/dist/archiving-dashboards.module.d.ts +19 -0
  32. package/dist/archiving-dashboards.module.d.ts.map +1 -0
  33. package/dist/archiving-dashboards.module.js +52 -0
  34. package/dist/archiving-dashboards.module.js.map +1 -0
  35. package/dist/core-dashboards.module.d.ts +3 -2
  36. package/dist/core-dashboards.module.d.ts.map +1 -1
  37. package/dist/core-dashboards.module.js +4 -0
  38. package/dist/core-dashboards.module.js.map +1 -1
  39. package/dist/module.d.ts +13 -12
  40. package/dist/module.d.ts.map +1 -1
  41. package/dist/module.js +7 -0
  42. package/dist/module.js.map +1 -1
  43. package/dist/public-api.d.ts +3 -0
  44. package/dist/public-api.d.ts.map +1 -1
  45. package/dist/public-api.js +4 -0
  46. package/dist/public-api.js.map +1 -1
  47. package/package.json +51 -48
@@ -14,6 +14,16 @@ export declare class MCPFilterPanelComponent {
14
14
  activeTab: MCPDashboardTab;
15
15
  totalCount: number;
16
16
  filteredCount: number;
17
+ /** Part 3.3 — available servers for the Tools tab server-filter dropdown */
18
+ availableServers: Array<{
19
+ ID: string;
20
+ Name: string;
21
+ }>;
22
+ /** Part 3.3 — available categories (derived from snake_case tool-name prefix) with counts */
23
+ availableCategories: Array<{
24
+ category: string;
25
+ count: number;
26
+ }>;
17
27
  filtersChange: EventEmitter<MCPDashboardFilters>;
18
28
  closePanel: EventEmitter<void>;
19
29
  serverStatusOptions: {
@@ -38,7 +48,12 @@ export declare class MCPFilterPanelComponent {
38
48
  onConnectionStatusChange(value: string): void;
39
49
  onToolStatusChange(value: string): void;
40
50
  onLogStatusChange(value: string): void;
51
+ onToolsServerChange(value: string): void;
52
+ onToolsCategoryChange(value: string): void;
53
+ onFavoritesOnlyChange(checked: boolean): void;
41
54
  resetAllFilters(): void;
55
+ /** Part 3.3 — count of non-default filter dimensions, used for "Filters (N)" badge */
56
+ get activeFilterCount(): number;
42
57
  toggleFilterPanel(): void;
43
58
  get hasActiveFilters(): boolean;
44
59
  get currentStatusOptions(): {
@@ -49,6 +64,6 @@ export declare class MCPFilterPanelComponent {
49
64
  onCurrentStatusChange(value: string): void;
50
65
  getTabLabel(): string;
51
66
  static ɵfac: i0.ɵɵFactoryDeclaration<MCPFilterPanelComponent, never>;
52
- static ɵcmp: i0.ɵɵComponentDeclaration<MCPFilterPanelComponent, "mj-mcp-filter-panel", never, { "filters": { "alias": "filters"; "required": false; }; "activeTab": { "alias": "activeTab"; "required": false; }; "totalCount": { "alias": "totalCount"; "required": false; }; "filteredCount": { "alias": "filteredCount"; "required": false; }; }, { "filtersChange": "filtersChange"; "closePanel": "closePanel"; }, never, never, false, never>;
67
+ static ɵcmp: i0.ɵɵComponentDeclaration<MCPFilterPanelComponent, "mj-mcp-filter-panel", never, { "filters": { "alias": "filters"; "required": false; }; "activeTab": { "alias": "activeTab"; "required": false; }; "totalCount": { "alias": "totalCount"; "required": false; }; "filteredCount": { "alias": "filteredCount"; "required": false; }; "availableServers": { "alias": "availableServers"; "required": false; }; "availableCategories": { "alias": "availableCategories"; "required": false; }; }, { "filtersChange": "filtersChange"; "closePanel": "closePanel"; }, never, never, false, never>;
53
68
  }
54
69
  //# sourceMappingURL=mcp-filter-panel.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-filter-panel.component.d.ts","sourceRoot":"","sources":["../../src/MCP/mcp-filter-panel.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;;AAEjF,qBAMa,uBAAuB;IACzB,OAAO,EAAE,mBAAmB,CAMnC;IAEO,SAAS,EAAE,eAAe,CAAa;IACvC,UAAU,SAAK;IACf,aAAa,SAAK;IAEjB,aAAa,oCAA2C;IACxD,UAAU,qBAA4B;IAEzC,mBAAmB;;;QAIxB;IAEK,uBAAuB;;;QAK5B;IAEK,iBAAiB;;;QAItB;IAEK,gBAAgB;;;QAKrB;IAEK,cAAc,IAAI,IAAI;IAItB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKnC,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7C,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,eAAe,IAAI,IAAI;IAWvB,iBAAiB,IAAI,IAAI;IAIhC,IAAW,gBAAgB,IAAI,OAAO,CAMrC;IAED,IAAW,oBAAoB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAanE;IAED,IAAW,kBAAkB,IAAI,MAAM,CAatC;IAEM,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAiB1C,WAAW,IAAI,MAAM;yCA7IjB,uBAAuB;2CAAvB,uBAAuB;CA2JnC"}
1
+ {"version":3,"file":"mcp-filter-panel.component.d.ts","sourceRoot":"","sources":["../../src/MCP/mcp-filter-panel.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;;AAEjF,qBAMa,uBAAuB;IACzB,OAAO,EAAE,mBAAmB,CASnC;IAEO,SAAS,EAAE,eAAe,CAAa;IACvC,UAAU,SAAK;IACf,aAAa,SAAK;IAE3B,4EAA4E;IACnE,gBAAgB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IACpE,6FAA6F;IACpF,mBAAmB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IAEpE,aAAa,oCAA2C;IACxD,UAAU,qBAA4B;IAEzC,mBAAmB;;;QAIxB;IAEK,uBAAuB;;;QAK5B;IAEK,iBAAiB;;;QAItB;IAEK,gBAAgB;;;QAKrB;IAEK,cAAc,IAAI,IAAI;IAItB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKnC,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7C,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKxC,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1C,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK7C,eAAe,IAAI,IAAI;IAc9B,sFAAsF;IACtF,IAAW,iBAAiB,IAAI,MAAM,CAWrC;IAEM,iBAAiB,IAAI,IAAI;IAIhC,IAAW,gBAAgB,IAAI,OAAO,CAMrC;IAED,IAAW,oBAAoB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAanE;IAED,IAAW,kBAAkB,IAAI,MAAM,CAatC;IAEM,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAiB1C,WAAW,IAAI,MAAM;yCArLjB,uBAAuB;2CAAvB,uBAAuB;CAmMnC"}
@@ -10,18 +10,29 @@ import { Component, Input, Output, EventEmitter } from '@angular/core';
10
10
  import * as i0 from "@angular/core";
11
11
  import * as i1 from "@angular/forms";
12
12
  const _forTrack0 = ($index, $item) => $item.value;
13
- function MCPFilterPanelComponent_For_23_Template(rf, ctx) { if (rf & 1) {
14
- i0.ɵɵelementStart(0, "option", 14);
13
+ const _forTrack1 = ($index, $item) => $item.ID;
14
+ const _forTrack2 = ($index, $item) => $item.category;
15
+ function MCPFilterPanelComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelementStart(0, "span", 2);
15
17
  i0.ɵɵtext(1);
16
18
  i0.ɵɵelementEnd();
17
19
  } if (rf & 2) {
18
- const option_r1 = ctx.$implicit;
19
- i0.ɵɵproperty("value", option_r1.value);
20
+ const ctx_r0 = i0.ɵɵnextContext();
20
21
  i0.ɵɵadvance();
21
- i0.ɵɵtextInterpolate(option_r1.text);
22
+ i0.ɵɵtextInterpolate(ctx_r0.activeFilterCount);
22
23
  } }
23
- function MCPFilterPanelComponent_Conditional_24_For_6_Template(rf, ctx) { if (rf & 1) {
24
- i0.ɵɵelementStart(0, "option", 14);
24
+ function MCPFilterPanelComponent_For_24_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "option", 15);
26
+ i0.ɵɵtext(1);
27
+ i0.ɵɵelementEnd();
28
+ } if (rf & 2) {
29
+ const option_r2 = ctx.$implicit;
30
+ i0.ɵɵproperty("value", option_r2.value);
31
+ i0.ɵɵadvance();
32
+ i0.ɵɵtextInterpolate(option_r2.text);
33
+ } }
34
+ function MCPFilterPanelComponent_Conditional_25_For_6_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelementStart(0, "option", 15);
25
36
  i0.ɵɵtext(1);
26
37
  i0.ɵɵelementEnd();
27
38
  } if (rf & 2) {
@@ -30,25 +41,25 @@ function MCPFilterPanelComponent_Conditional_24_For_6_Template(rf, ctx) { if (rf
30
41
  i0.ɵɵadvance();
31
42
  i0.ɵɵtextInterpolate(option_r4.text);
32
43
  } }
33
- function MCPFilterPanelComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
34
- const _r2 = i0.ɵɵgetCurrentView();
35
- i0.ɵɵelementStart(0, "div", 8)(1, "label", 9);
36
- i0.ɵɵelement(2, "span", 18);
44
+ function MCPFilterPanelComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
45
+ const _r3 = i0.ɵɵgetCurrentView();
46
+ i0.ɵɵelementStart(0, "div", 9)(1, "label", 10);
47
+ i0.ɵɵelement(2, "span", 19);
37
48
  i0.ɵɵtext(3, " Server Status ");
38
49
  i0.ɵɵelementEnd();
39
- i0.ɵɵelementStart(4, "select", 13);
40
- i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Conditional_24_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onServerStatusChange($event)); });
41
- i0.ɵɵrepeaterCreate(5, MCPFilterPanelComponent_Conditional_24_For_6_Template, 2, 2, "option", 14, _forTrack0);
50
+ i0.ɵɵelementStart(4, "select", 14);
51
+ i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Conditional_25_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onServerStatusChange($event)); });
52
+ i0.ɵɵrepeaterCreate(5, MCPFilterPanelComponent_Conditional_25_For_6_Template, 2, 2, "option", 15, _forTrack0);
42
53
  i0.ɵɵelementEnd()();
43
54
  } if (rf & 2) {
44
- const ctx_r2 = i0.ɵɵnextContext();
55
+ const ctx_r0 = i0.ɵɵnextContext();
45
56
  i0.ɵɵadvance(4);
46
- i0.ɵɵproperty("ngModel", ctx_r2.filters.serverStatus);
57
+ i0.ɵɵproperty("ngModel", ctx_r0.filters.serverStatus);
47
58
  i0.ɵɵadvance();
48
- i0.ɵɵrepeater(ctx_r2.serverStatusOptions);
59
+ i0.ɵɵrepeater(ctx_r0.serverStatusOptions);
49
60
  } }
50
- function MCPFilterPanelComponent_Conditional_25_For_6_Template(rf, ctx) { if (rf & 1) {
51
- i0.ɵɵelementStart(0, "option", 14);
61
+ function MCPFilterPanelComponent_Conditional_26_For_6_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵelementStart(0, "option", 15);
52
63
  i0.ɵɵtext(1);
53
64
  i0.ɵɵelementEnd();
54
65
  } if (rf & 2) {
@@ -57,22 +68,85 @@ function MCPFilterPanelComponent_Conditional_25_For_6_Template(rf, ctx) { if (rf
57
68
  i0.ɵɵadvance();
58
69
  i0.ɵɵtextInterpolate(option_r6.text);
59
70
  } }
60
- function MCPFilterPanelComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
71
+ function MCPFilterPanelComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
61
72
  const _r5 = i0.ɵɵgetCurrentView();
62
- i0.ɵɵelementStart(0, "div", 8)(1, "label", 9);
63
- i0.ɵɵelement(2, "span", 19);
73
+ i0.ɵɵelementStart(0, "div", 9)(1, "label", 10);
74
+ i0.ɵɵelement(2, "span", 20);
64
75
  i0.ɵɵtext(3, " Connection Status ");
65
76
  i0.ɵɵelementEnd();
66
- i0.ɵɵelementStart(4, "select", 13);
67
- i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Conditional_25_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onConnectionStatusChange($event)); });
68
- i0.ɵɵrepeaterCreate(5, MCPFilterPanelComponent_Conditional_25_For_6_Template, 2, 2, "option", 14, _forTrack0);
77
+ i0.ɵɵelementStart(4, "select", 14);
78
+ i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Conditional_26_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onConnectionStatusChange($event)); });
79
+ i0.ɵɵrepeaterCreate(5, MCPFilterPanelComponent_Conditional_26_For_6_Template, 2, 2, "option", 15, _forTrack0);
69
80
  i0.ɵɵelementEnd()();
70
81
  } if (rf & 2) {
71
- const ctx_r2 = i0.ɵɵnextContext();
82
+ const ctx_r0 = i0.ɵɵnextContext();
72
83
  i0.ɵɵadvance(4);
73
- i0.ɵɵproperty("ngModel", ctx_r2.filters.connectionStatus);
84
+ i0.ɵɵproperty("ngModel", ctx_r0.filters.connectionStatus);
74
85
  i0.ɵɵadvance();
75
- i0.ɵɵrepeater(ctx_r2.connectionStatusOptions);
86
+ i0.ɵɵrepeater(ctx_r0.connectionStatusOptions);
87
+ } }
88
+ function MCPFilterPanelComponent_Conditional_27_For_8_Template(rf, ctx) { if (rf & 1) {
89
+ i0.ɵɵelementStart(0, "option", 15);
90
+ i0.ɵɵtext(1);
91
+ i0.ɵɵelementEnd();
92
+ } if (rf & 2) {
93
+ const s_r8 = ctx.$implicit;
94
+ i0.ɵɵproperty("value", s_r8.ID);
95
+ i0.ɵɵadvance();
96
+ i0.ɵɵtextInterpolate(s_r8.Name);
97
+ } }
98
+ function MCPFilterPanelComponent_Conditional_27_For_17_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵelementStart(0, "option", 15);
100
+ i0.ɵɵtext(1);
101
+ i0.ɵɵelementEnd();
102
+ } if (rf & 2) {
103
+ const c_r9 = ctx.$implicit;
104
+ i0.ɵɵproperty("value", c_r9.category);
105
+ i0.ɵɵadvance();
106
+ i0.ɵɵtextInterpolate2("", c_r9.category, " (", c_r9.count, ")");
107
+ } }
108
+ function MCPFilterPanelComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
109
+ const _r7 = i0.ɵɵgetCurrentView();
110
+ i0.ɵɵelementStart(0, "div", 9)(1, "label", 10);
111
+ i0.ɵɵelement(2, "span", 19);
112
+ i0.ɵɵtext(3, " Server");
113
+ i0.ɵɵelementEnd();
114
+ i0.ɵɵelementStart(4, "select", 14);
115
+ i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Conditional_27_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onToolsServerChange($event)); });
116
+ i0.ɵɵelementStart(5, "option", 21);
117
+ i0.ɵɵtext(6, "All Servers");
118
+ i0.ɵɵelementEnd();
119
+ i0.ɵɵrepeaterCreate(7, MCPFilterPanelComponent_Conditional_27_For_8_Template, 2, 2, "option", 15, _forTrack1);
120
+ i0.ɵɵelementEnd()();
121
+ i0.ɵɵelementStart(9, "div", 9)(10, "label", 10);
122
+ i0.ɵɵelement(11, "span", 22);
123
+ i0.ɵɵtext(12, " Category");
124
+ i0.ɵɵelementEnd();
125
+ i0.ɵɵelementStart(13, "select", 14);
126
+ i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Conditional_27_Template_select_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onToolsCategoryChange($event)); });
127
+ i0.ɵɵelementStart(14, "option", 21);
128
+ i0.ɵɵtext(15, "All Categories");
129
+ i0.ɵɵelementEnd();
130
+ i0.ɵɵrepeaterCreate(16, MCPFilterPanelComponent_Conditional_27_For_17_Template, 2, 3, "option", 15, _forTrack2);
131
+ i0.ɵɵelementEnd()();
132
+ i0.ɵɵelementStart(18, "div", 9)(19, "label", 23)(20, "input", 24);
133
+ i0.ɵɵlistener("change", function MCPFilterPanelComponent_Conditional_27_Template_input_change_20_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onFavoritesOnlyChange($event.target.checked)); });
134
+ i0.ɵɵelementEnd();
135
+ i0.ɵɵelement(21, "span", 25);
136
+ i0.ɵɵtext(22, " Favorites only ");
137
+ i0.ɵɵelementEnd()();
138
+ } if (rf & 2) {
139
+ const ctx_r0 = i0.ɵɵnextContext();
140
+ i0.ɵɵadvance(4);
141
+ i0.ɵɵproperty("ngModel", ctx_r0.filters.toolsServer ?? "all");
142
+ i0.ɵɵadvance(3);
143
+ i0.ɵɵrepeater(ctx_r0.availableServers);
144
+ i0.ɵɵadvance(6);
145
+ i0.ɵɵproperty("ngModel", ctx_r0.filters.toolsCategory ?? "all");
146
+ i0.ɵɵadvance(3);
147
+ i0.ɵɵrepeater(ctx_r0.availableCategories);
148
+ i0.ɵɵadvance(4);
149
+ i0.ɵɵproperty("checked", ctx_r0.filters.favoritesOnly === true);
76
150
  } }
77
151
  export class MCPFilterPanelComponent {
78
152
  filters = {
@@ -80,11 +154,18 @@ export class MCPFilterPanelComponent {
80
154
  serverStatus: 'all',
81
155
  connectionStatus: 'all',
82
156
  toolStatus: 'all',
83
- logStatus: 'all'
157
+ logStatus: 'all',
158
+ toolsServer: 'all',
159
+ toolsCategory: 'all',
160
+ favoritesOnly: false
84
161
  };
85
162
  activeTab = 'servers';
86
163
  totalCount = 0;
87
164
  filteredCount = 0;
165
+ /** Part 3.3 — available servers for the Tools tab server-filter dropdown */
166
+ availableServers = [];
167
+ /** Part 3.3 — available categories (derived from snake_case tool-name prefix) with counts */
168
+ availableCategories = [];
88
169
  filtersChange = new EventEmitter();
89
170
  closePanel = new EventEmitter();
90
171
  serverStatusOptions = [
@@ -132,16 +213,52 @@ export class MCPFilterPanelComponent {
132
213
  this.filters = { ...this.filters, logStatus: value };
133
214
  this.onFilterChange();
134
215
  }
216
+ onToolsServerChange(value) {
217
+ this.filters = { ...this.filters, toolsServer: value };
218
+ this.onFilterChange();
219
+ }
220
+ onToolsCategoryChange(value) {
221
+ this.filters = { ...this.filters, toolsCategory: value };
222
+ this.onFilterChange();
223
+ }
224
+ onFavoritesOnlyChange(checked) {
225
+ this.filters = { ...this.filters, favoritesOnly: checked };
226
+ this.onFilterChange();
227
+ }
135
228
  resetAllFilters() {
136
229
  this.filters = {
137
230
  searchTerm: '',
138
231
  serverStatus: 'all',
139
232
  connectionStatus: 'all',
140
233
  toolStatus: 'all',
141
- logStatus: 'all'
234
+ logStatus: 'all',
235
+ toolsServer: 'all',
236
+ toolsCategory: 'all',
237
+ favoritesOnly: false
142
238
  };
143
239
  this.onFilterChange();
144
240
  }
241
+ /** Part 3.3 — count of non-default filter dimensions, used for "Filters (N)" badge */
242
+ get activeFilterCount() {
243
+ let n = 0;
244
+ if (this.filters.searchTerm)
245
+ n++;
246
+ if (this.filters.serverStatus && this.filters.serverStatus !== 'all')
247
+ n++;
248
+ if (this.filters.connectionStatus && this.filters.connectionStatus !== 'all')
249
+ n++;
250
+ if (this.filters.toolStatus && this.filters.toolStatus !== 'all')
251
+ n++;
252
+ if (this.filters.logStatus && this.filters.logStatus !== 'all')
253
+ n++;
254
+ if (this.filters.toolsServer && this.filters.toolsServer !== 'all')
255
+ n++;
256
+ if (this.filters.toolsCategory && this.filters.toolsCategory !== 'all')
257
+ n++;
258
+ if (this.filters.favoritesOnly)
259
+ n++;
260
+ return n;
261
+ }
145
262
  toggleFilterPanel() {
146
263
  this.closePanel.emit();
147
264
  }
@@ -211,44 +328,48 @@ export class MCPFilterPanelComponent {
211
328
  }
212
329
  }
213
330
  static ɵfac = function MCPFilterPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPFilterPanelComponent)(); };
214
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPFilterPanelComponent, selectors: [["mj-mcp-filter-panel"]], inputs: { filters: "filters", activeTab: "activeTab", totalCount: "totalCount", filteredCount: "filteredCount" }, outputs: { filtersChange: "filtersChange", closePanel: "closePanel" }, standalone: false, decls: 30, vars: 11, 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", 1, "filter-input", 3, "ngModelChange", "ngModel", "placeholder"], [1, "fa-solid", "fa-toggle-on"], [1, "filter-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "filter-actions"], ["title", "Reset all filters", 1, "reset-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-server"], [1, "fa-solid", "fa-link"]], template: function MCPFilterPanelComponent_Template(rf, ctx) { if (rf & 1) {
331
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPFilterPanelComponent, selectors: [["mj-mcp-filter-panel"]], inputs: { filters: "filters", activeTab: "activeTab", totalCount: "totalCount", filteredCount: "filteredCount", availableServers: "availableServers", availableCategories: "availableCategories" }, outputs: { filtersChange: "filtersChange", closePanel: "closePanel" }, standalone: false, decls: 32, vars: 13, consts: [[1, "filter-panel"], [1, "filter-panel-header"], [2, "margin-left", "6px", "padding", "2px 8px", "background", "var(--mj-brand-primary,#264FAF)", "color", "#fff", "border-radius", "10px", "font-size", "0.7rem", "font-weight", "600"], [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", 1, "filter-input", 3, "ngModelChange", "ngModel", "placeholder"], [1, "fa-solid", "fa-toggle-on"], [1, "filter-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "filter-actions"], ["title", "Reset all filters", 1, "reset-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-server"], [1, "fa-solid", "fa-link"], ["value", "all"], [1, "fa-solid", "fa-tags"], [1, "filter-label", 2, "display", "flex", "align-items", "center", "gap", "6px", "cursor", "pointer"], ["type", "checkbox", 3, "change", "checked"], [1, "fa-solid", "fa-star"]], template: function MCPFilterPanelComponent_Template(rf, ctx) { if (rf & 1) {
215
332
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h3");
216
- i0.ɵɵtext(3, "MCP Filters");
333
+ i0.ɵɵtext(3, "MCP Filters ");
334
+ i0.ɵɵconditionalCreate(4, MCPFilterPanelComponent_Conditional_4_Template, 2, 1, "span", 2);
217
335
  i0.ɵɵelementEnd();
218
- i0.ɵɵelementStart(4, "div", 2)(5, "span", 3);
219
- i0.ɵɵtext(6);
336
+ i0.ɵɵelementStart(5, "div", 3)(6, "span", 4);
337
+ i0.ɵɵtext(7);
220
338
  i0.ɵɵelementEnd();
221
- i0.ɵɵelementStart(7, "span", 4);
222
- i0.ɵɵtext(8);
339
+ i0.ɵɵelementStart(8, "span", 5);
340
+ i0.ɵɵtext(9);
223
341
  i0.ɵɵelementEnd()();
224
- i0.ɵɵelementStart(9, "button", 5);
225
- i0.ɵɵlistener("click", function MCPFilterPanelComponent_Template_button_click_9_listener() { return ctx.toggleFilterPanel(); });
226
- i0.ɵɵelement(10, "span", 6);
342
+ i0.ɵɵelementStart(10, "button", 6);
343
+ i0.ɵɵlistener("click", function MCPFilterPanelComponent_Template_button_click_10_listener() { return ctx.toggleFilterPanel(); });
344
+ i0.ɵɵelement(11, "span", 7);
227
345
  i0.ɵɵelementEnd()();
228
- i0.ɵɵelementStart(11, "div", 7)(12, "div", 8)(13, "label", 9);
229
- i0.ɵɵelement(14, "span", 10);
230
- i0.ɵɵtext(15, " Search ");
346
+ i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "label", 10);
347
+ i0.ɵɵelement(15, "span", 11);
348
+ i0.ɵɵtext(16, " Search ");
231
349
  i0.ɵɵelementEnd();
232
- i0.ɵɵelementStart(16, "input", 11);
233
- i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Template_input_ngModelChange_16_listener($event) { return ctx.onSearchChange($event); });
350
+ i0.ɵɵelementStart(17, "input", 12);
351
+ i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Template_input_ngModelChange_17_listener($event) { return ctx.onSearchChange($event); });
234
352
  i0.ɵɵelementEnd()();
235
- i0.ɵɵelementStart(17, "div", 8)(18, "label", 9);
236
- i0.ɵɵelement(19, "span", 12);
237
- i0.ɵɵtext(20);
353
+ i0.ɵɵelementStart(18, "div", 9)(19, "label", 10);
354
+ i0.ɵɵelement(20, "span", 13);
355
+ i0.ɵɵtext(21);
238
356
  i0.ɵɵelementEnd();
239
- i0.ɵɵelementStart(21, "select", 13);
240
- i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Template_select_ngModelChange_21_listener($event) { return ctx.onCurrentStatusChange($event); });
241
- i0.ɵɵrepeaterCreate(22, MCPFilterPanelComponent_For_23_Template, 2, 2, "option", 14, _forTrack0);
357
+ i0.ɵɵelementStart(22, "select", 14);
358
+ i0.ɵɵlistener("ngModelChange", function MCPFilterPanelComponent_Template_select_ngModelChange_22_listener($event) { return ctx.onCurrentStatusChange($event); });
359
+ i0.ɵɵrepeaterCreate(23, MCPFilterPanelComponent_For_24_Template, 2, 2, "option", 15, _forTrack0);
242
360
  i0.ɵɵelementEnd()();
243
- i0.ɵɵconditionalCreate(24, MCPFilterPanelComponent_Conditional_24_Template, 7, 1, "div", 8);
244
- i0.ɵɵconditionalCreate(25, MCPFilterPanelComponent_Conditional_25_Template, 7, 1, "div", 8);
245
- i0.ɵɵelementStart(26, "div", 15)(27, "button", 16);
246
- i0.ɵɵlistener("click", function MCPFilterPanelComponent_Template_button_click_27_listener() { return ctx.resetAllFilters(); });
247
- i0.ɵɵelement(28, "span", 17);
248
- i0.ɵɵtext(29, " Reset Filters ");
361
+ i0.ɵɵconditionalCreate(25, MCPFilterPanelComponent_Conditional_25_Template, 7, 1, "div", 9);
362
+ i0.ɵɵconditionalCreate(26, MCPFilterPanelComponent_Conditional_26_Template, 7, 1, "div", 9);
363
+ i0.ɵɵconditionalCreate(27, MCPFilterPanelComponent_Conditional_27_Template, 23, 3);
364
+ i0.ɵɵelementStart(28, "div", 16)(29, "button", 17);
365
+ i0.ɵɵlistener("click", function MCPFilterPanelComponent_Template_button_click_29_listener() { return ctx.resetAllFilters(); });
366
+ i0.ɵɵelement(30, "span", 18);
367
+ i0.ɵɵtext(31, " Reset Filters ");
249
368
  i0.ɵɵelementEnd()()()();
250
369
  } if (rf & 2) {
251
- i0.ɵɵadvance(6);
370
+ i0.ɵɵadvance(4);
371
+ i0.ɵɵconditional(ctx.activeFilterCount > 0 ? 4 : -1);
372
+ i0.ɵɵadvance(3);
252
373
  i0.ɵɵtextInterpolate(ctx.filteredCount);
253
374
  i0.ɵɵadvance(2);
254
375
  i0.ɵɵtextInterpolate1("of ", ctx.totalCount);
@@ -261,16 +382,18 @@ export class MCPFilterPanelComponent {
261
382
  i0.ɵɵadvance();
262
383
  i0.ɵɵrepeater(ctx.currentStatusOptions);
263
384
  i0.ɵɵadvance(2);
264
- i0.ɵɵconditional(ctx.activeTab === "connections" || ctx.activeTab === "tools" || ctx.activeTab === "logs" ? 24 : -1);
385
+ i0.ɵɵconditional(ctx.activeTab === "connections" || ctx.activeTab === "tools" || ctx.activeTab === "logs" ? 25 : -1);
386
+ i0.ɵɵadvance();
387
+ i0.ɵɵconditional(ctx.activeTab === "logs" ? 26 : -1);
265
388
  i0.ɵɵadvance();
266
- i0.ɵɵconditional(ctx.activeTab === "logs" ? 25 : -1);
389
+ i0.ɵɵconditional(ctx.activeTab === "tools" ? 27 : -1);
267
390
  i0.ɵɵadvance(2);
268
391
  i0.ɵɵclassProp("has-filters", ctx.hasActiveFilters);
269
392
  } }, 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: 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) 15%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\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);\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.has-filters[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn.has-filters[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n color: var(--mj-brand-primary);\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}"] });
270
393
  }
271
394
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MCPFilterPanelComponent, [{
272
395
  type: Component,
273
- args: [{ standalone: false, selector: 'mj-mcp-filter-panel', template: "<div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>MCP Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredCount }}</span>\n <span class=\"summary-label\">of {{ totalCount }}</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 Search\n </label>\n <input\n type=\"text\"\n class=\"filter-input\"\n [ngModel]=\"filters.searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search {{ getTabLabel().toLowerCase() }}s...\">\n </div>\n\n <!-- Status Filter (context-aware based on active tab) -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n {{ getTabLabel() }} Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"currentStatusValue\"\n (ngModelChange)=\"onCurrentStatusChange($event)\">\n @for (option of currentStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n\n <!-- Additional filters visible based on context -->\n @if (activeTab === 'connections' || activeTab === 'tools' || activeTab === 'logs') {\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-server\"></span>\n Server Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"filters.serverStatus\"\n (ngModelChange)=\"onServerStatusChange($event)\">\n @for (option of serverStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n }\n\n @if (activeTab === 'logs') {\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-link\"></span>\n Connection Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"filters.connectionStatus\"\n (ngModelChange)=\"onConnectionStatusChange($event)\">\n @for (option of connectionStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button\n class=\"reset-btn\"\n (click)=\"resetAllFilters()\"\n title=\"Reset all filters\"\n [class.has-filters]=\"hasActiveFilters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n</div>\n", styles: ["/* MCP Filter Panel - Matching Agent Filter Panel 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) 15%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\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);\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.has-filters {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.filter-actions .reset-btn.has-filters:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n color: var(--mj-brand-primary);\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"] }]
396
+ args: [{ standalone: false, selector: 'mj-mcp-filter-panel', template: "<div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>MCP Filters\n @if (activeFilterCount > 0) {\n <span style=\"margin-left:6px;padding:2px 8px;background:var(--mj-brand-primary,#264FAF);color:#fff;border-radius:10px;font-size:0.7rem;font-weight:600\">{{ activeFilterCount }}</span>\n }\n </h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredCount }}</span>\n <span class=\"summary-label\">of {{ totalCount }}</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 Search\n </label>\n <input\n type=\"text\"\n class=\"filter-input\"\n [ngModel]=\"filters.searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search {{ getTabLabel().toLowerCase() }}s...\">\n </div>\n\n <!-- Status Filter (context-aware based on active tab) -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n {{ getTabLabel() }} Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"currentStatusValue\"\n (ngModelChange)=\"onCurrentStatusChange($event)\">\n @for (option of currentStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n\n <!-- Additional filters visible based on context -->\n @if (activeTab === 'connections' || activeTab === 'tools' || activeTab === 'logs') {\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-server\"></span>\n Server Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"filters.serverStatus\"\n (ngModelChange)=\"onServerStatusChange($event)\">\n @for (option of serverStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n }\n\n @if (activeTab === 'logs') {\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-link\"></span>\n Connection Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"filters.connectionStatus\"\n (ngModelChange)=\"onConnectionStatusChange($event)\">\n @for (option of connectionStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Part 3.3 \u2014 Tools tab: Server + Category filters + Favorites-only toggle -->\n @if (activeTab === 'tools') {\n <div class=\"filter-group\">\n <label class=\"filter-label\"><span class=\"fa-solid fa-server\"></span> Server</label>\n <select class=\"filter-select\" [ngModel]=\"filters.toolsServer ?? 'all'\" (ngModelChange)=\"onToolsServerChange($event)\">\n <option value=\"all\">All Servers</option>\n @for (s of availableServers; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div class=\"filter-group\">\n <label class=\"filter-label\"><span class=\"fa-solid fa-tags\"></span> Category</label>\n <select class=\"filter-select\" [ngModel]=\"filters.toolsCategory ?? 'all'\" (ngModelChange)=\"onToolsCategoryChange($event)\">\n <option value=\"all\">All Categories</option>\n @for (c of availableCategories; track c.category) {\n <option [value]=\"c.category\">{{ c.category }} ({{ c.count }})</option>\n }\n </select>\n </div>\n <div class=\"filter-group\">\n <label class=\"filter-label\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer\">\n <input type=\"checkbox\" [checked]=\"filters.favoritesOnly === true\" (change)=\"onFavoritesOnlyChange($any($event.target).checked)\" />\n <span class=\"fa-solid fa-star\"></span>\n Favorites only\n </label>\n </div>\n }\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button\n class=\"reset-btn\"\n (click)=\"resetAllFilters()\"\n title=\"Reset all filters\"\n [class.has-filters]=\"hasActiveFilters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n</div>\n", styles: ["/* MCP Filter Panel - Matching Agent Filter Panel 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) 15%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\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);\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.has-filters {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.filter-actions .reset-btn.has-filters:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n color: var(--mj-brand-primary);\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"] }]
274
397
  }], null, { filters: [{
275
398
  type: Input
276
399
  }], activeTab: [{
@@ -279,6 +402,10 @@ export class MCPFilterPanelComponent {
279
402
  type: Input
280
403
  }], filteredCount: [{
281
404
  type: Input
405
+ }], availableServers: [{
406
+ type: Input
407
+ }], availableCategories: [{
408
+ type: Input
282
409
  }], filtersChange: [{
283
410
  type: Output
284
411
  }], closePanel: [{
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-filter-panel.component.js","sourceRoot":"","sources":["../../src/MCP/mcp-filter-panel.component.ts","../../src/MCP/mcp-filter-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview MCP Filter Panel Component\n *\n * Provides filtering controls for the MCP Dashboard.\n * Matches the pattern used by agent-filter-panel component.\n *\n * @module MCP Filter Panel\n */\n\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { MCPDashboardFilters, MCPDashboardTab } from './mcp-dashboard.component';\n\n@Component({\n standalone: false,\n selector: 'mj-mcp-filter-panel',\n templateUrl: './mcp-filter-panel.component.html',\n styleUrls: ['./mcp-filter-panel.component.css']\n})\nexport class MCPFilterPanelComponent {\n @Input() filters: MCPDashboardFilters = {\n searchTerm: '',\n serverStatus: 'all',\n connectionStatus: 'all',\n toolStatus: 'all',\n logStatus: 'all'\n };\n\n @Input() activeTab: MCPDashboardTab = 'servers';\n @Input() totalCount = 0;\n @Input() filteredCount = 0;\n\n @Output() filtersChange = new EventEmitter<MCPDashboardFilters>();\n @Output() closePanel = new EventEmitter<void>();\n\n public serverStatusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Inactive', value: 'Inactive' }\n ];\n\n public connectionStatusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Inactive', value: 'Inactive' },\n { text: 'Error', value: 'Error' }\n ];\n\n public toolStatusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Deprecated', value: 'Deprecated' }\n ];\n\n public logStatusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Success', value: 'Success' },\n { text: 'Error', value: 'Error' },\n { text: 'Running', value: 'Running' }\n ];\n\n public onFilterChange(): void {\n this.filtersChange.emit(this.filters);\n }\n\n public onSearchChange(value: string): void {\n this.filters = { ...this.filters, searchTerm: value };\n this.onFilterChange();\n }\n\n public onServerStatusChange(value: string): void {\n this.filters = { ...this.filters, serverStatus: value };\n this.onFilterChange();\n }\n\n public onConnectionStatusChange(value: string): void {\n this.filters = { ...this.filters, connectionStatus: value };\n this.onFilterChange();\n }\n\n public onToolStatusChange(value: string): void {\n this.filters = { ...this.filters, toolStatus: value };\n this.onFilterChange();\n }\n\n public onLogStatusChange(value: string): void {\n this.filters = { ...this.filters, logStatus: value };\n this.onFilterChange();\n }\n\n public resetAllFilters(): void {\n this.filters = {\n searchTerm: '',\n serverStatus: 'all',\n connectionStatus: 'all',\n toolStatus: 'all',\n logStatus: 'all'\n };\n this.onFilterChange();\n }\n\n public toggleFilterPanel(): void {\n this.closePanel.emit();\n }\n\n public get hasActiveFilters(): boolean {\n return this.filters.searchTerm !== '' ||\n this.filters.serverStatus !== 'all' ||\n this.filters.connectionStatus !== 'all' ||\n this.filters.toolStatus !== 'all' ||\n this.filters.logStatus !== 'all';\n }\n\n public get currentStatusOptions(): { text: string; value: string }[] {\n switch (this.activeTab) {\n case 'servers':\n return this.serverStatusOptions;\n case 'connections':\n return this.connectionStatusOptions;\n case 'tools':\n return this.toolStatusOptions;\n case 'logs':\n return this.logStatusOptions;\n default:\n return this.serverStatusOptions;\n }\n }\n\n public get currentStatusValue(): string {\n switch (this.activeTab) {\n case 'servers':\n return this.filters.serverStatus;\n case 'connections':\n return this.filters.connectionStatus;\n case 'tools':\n return this.filters.toolStatus;\n case 'logs':\n return this.filters.logStatus;\n default:\n return 'all';\n }\n }\n\n public onCurrentStatusChange(value: string): void {\n switch (this.activeTab) {\n case 'servers':\n this.onServerStatusChange(value);\n break;\n case 'connections':\n this.onConnectionStatusChange(value);\n break;\n case 'tools':\n this.onToolStatusChange(value);\n break;\n case 'logs':\n this.onLogStatusChange(value);\n break;\n }\n }\n\n public getTabLabel(): string {\n switch (this.activeTab) {\n case 'servers':\n return 'Server';\n case 'connections':\n return 'Connection';\n case 'tools':\n return 'Tool';\n case 'logs':\n return 'Log';\n default:\n return 'Item';\n }\n }\n}\n","<div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>MCP Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredCount }}</span>\n <span class=\"summary-label\">of {{ totalCount }}</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 Search\n </label>\n <input\n type=\"text\"\n class=\"filter-input\"\n [ngModel]=\"filters.searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search {{ getTabLabel().toLowerCase() }}s...\">\n </div>\n\n <!-- Status Filter (context-aware based on active tab) -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n {{ getTabLabel() }} Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"currentStatusValue\"\n (ngModelChange)=\"onCurrentStatusChange($event)\">\n @for (option of currentStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n\n <!-- Additional filters visible based on context -->\n @if (activeTab === 'connections' || activeTab === 'tools' || activeTab === 'logs') {\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-server\"></span>\n Server Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"filters.serverStatus\"\n (ngModelChange)=\"onServerStatusChange($event)\">\n @for (option of serverStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n }\n\n @if (activeTab === 'logs') {\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-link\"></span>\n Connection Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"filters.connectionStatus\"\n (ngModelChange)=\"onConnectionStatusChange($event)\">\n @for (option of connectionStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button\n class=\"reset-btn\"\n (click)=\"resetAllFilters()\"\n title=\"Reset all filters\"\n [class.has-filters]=\"hasActiveFilters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"mcp-filter-panel.component.js","sourceRoot":"","sources":["../../src/MCP/mcp-filter-panel.component.ts","../../src/MCP/mcp-filter-panel.component.html"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;;;;;;;ICL/D,+BAAwJ;IAAA,YAAuB;IAAA,iBAAO;;;IAA9B,cAAuB;IAAvB,8CAAuB;;;IAsC7K,kCAA+B;IAAA,YAAiB;IAAA,iBAAS;;;IAAjD,uCAAsB;IAAC,cAAiB;IAAjB,oCAAiB;;;IAiB9C,kCAA+B;IAAA,YAAiB;IAAA,iBAAS;;;IAAjD,uCAAsB;IAAC,cAAiB;IAAjB,oCAAiB;;;;IATpD,AADF,8BAA0B,gBACI;IAC1B,2BAAwC;IACxC,+BACF;IAAA,iBAAQ;IACR,kCAGiD;IAA/C,kNAAiB,mCAA4B,KAAC;IAC9C,6GAEC;IAEL,AADE,iBAAS,EACL;;;IANF,eAAgC;IAAhC,qDAAgC;IAEhC,cAEC;IAFD,yCAEC;;;IAgBC,kCAA+B;IAAA,YAAiB;IAAA,iBAAS;;;IAAjD,uCAAsB;IAAC,cAAiB;IAAjB,oCAAiB;;;;IATpD,AADF,8BAA0B,gBACI;IAC1B,2BAAsC;IACtC,mCACF;IAAA,iBAAQ;IACR,kCAGqD;IAAnD,kNAAiB,uCAAgC,KAAC;IAClD,6GAEC;IAEL,AADE,iBAAS,EACL;;;IANF,eAAoC;IAApC,yDAAoC;IAEpC,cAEC;IAFD,6CAEC;;;IAYC,kCAAuB;IAAA,YAAY;IAAA,iBAAS;;;IAApC,+BAAc;IAAC,cAAY;IAAZ,+BAAY;;;IASnC,kCAA6B;IAAA,YAAgC;IAAA,iBAAS;;;IAA9D,qCAAoB;IAAC,cAAgC;IAAhC,+DAAgC;;;;IAbjE,AADF,8BAA0B,gBACI;IAAA,2BAAwC;IAAC,uBAAM;IAAA,iBAAQ;IACnF,kCAAqH;IAA9C,kNAAiB,kCAA2B,KAAC;IAClH,kCAAoB;IAAA,2BAAW;IAAA,iBAAS;IACxC,6GAEC;IAEL,AADE,iBAAS,EACL;IAEJ,AADF,8BAA0B,iBACI;IAAA,4BAAsC;IAAC,0BAAQ;IAAA,iBAAQ;IACnF,mCAAyH;IAAhD,mNAAiB,oCAA6B,KAAC;IACtH,mCAAoB;IAAA,+BAAc;IAAA,iBAAS;IAC3C,+GAEC;IAEL,AADE,iBAAS,EACL;IAGF,AADF,AADF,+BAA0B,iBACmE,iBACyC;IAAhE,oMAAU,mDAAkD,KAAC;IAA/H,iBAAkI;IAClI,4BAAsC;IACtC,iCACF;IACF,AADE,iBAAQ,EACJ;;;IAtB0B,eAAwC;IAAxC,6DAAwC;IAEpE,eAEC;IAFD,sCAEC;IAK2B,eAA0C;IAA1C,+DAA0C;IAEtE,eAEC;IAFD,yCAEC;IAKsB,eAA0C;IAA1C,+DAA0C;;ADtF3E,MAAM,OAAO,uBAAuB;IACzB,OAAO,GAAwB;QACtC,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,KAAK;QACnB,gBAAgB,EAAE,KAAK;QACvB,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,KAAK;QACpB,aAAa,EAAE,KAAK;KACrB,CAAC;IAEO,SAAS,GAAoB,SAAS,CAAC;IACvC,UAAU,GAAG,CAAC,CAAC;IACf,aAAa,GAAG,CAAC,CAAC;IAE3B,4EAA4E;IACnE,gBAAgB,GAAwC,EAAE,CAAC;IACpE,6FAA6F;IACpF,mBAAmB,GAA+C,EAAE,CAAC;IAEpE,aAAa,GAAG,IAAI,YAAY,EAAuB,CAAC;IACxD,UAAU,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEzC,mBAAmB,GAAG;QAC3B,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;QACtC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QACnC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;KACxC,CAAC;IAEK,uBAAuB,GAAG;QAC/B,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;QACtC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QACnC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;QACvC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;KAClC,CAAC;IAEK,iBAAiB,GAAG;QACzB,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;QACtC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QACnC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;KAC5C,CAAC;IAEK,gBAAgB,GAAG;QACxB,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;QACtC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;QACrC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;QACjC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;KACtC,CAAC;IAEK,cAAc;QACnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAEM,cAAc,CAAC,KAAa;QACjC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACtD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,oBAAoB,CAAC,KAAa;QACvC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QACxD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,wBAAwB,CAAC,KAAa;QAC3C,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QAC5D,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,kBAAkB,CAAC,KAAa;QACrC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACtD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,iBAAiB,CAAC,KAAa;QACpC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACrD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,mBAAmB,CAAC,KAAa;QACtC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACvD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,qBAAqB,CAAC,KAAa;QACxC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QACzD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,qBAAqB,CAAC,OAAgB;QAC3C,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;QAC3D,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,OAAO,GAAG;YACb,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,KAAK;YACvB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,KAAK;YAClB,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,KAAK;SACrB,CAAC;QACF,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,sFAAsF;IACtF,IAAW,iBAAiB;QAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,CAAC,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,KAAK;YAAE,CAAC,EAAE,CAAC;QAC1E,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,KAAK;YAAE,CAAC,EAAE,CAAC;QAClF,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK;YAAE,CAAC,EAAE,CAAC;QACtE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK;YAAE,CAAC,EAAE,CAAC;QACpE,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK;YAAE,CAAC,EAAE,CAAC;QACxE,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK;YAAE,CAAC,EAAE,CAAC;QAC5E,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa;YAAE,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,CAAC;IACX,CAAC;IAEM,iBAAiB;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,KAAK;YACnC,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,KAAK;YACvC,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK;YACjC,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;IAC1C,CAAC;IAED,IAAW,oBAAoB;QAC7B,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAClC,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,uBAAuB,CAAC;YACtC,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,iBAAiB,CAAC;YAChC,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC/B;gBACE,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAW,kBAAkB;QAC3B,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YACnC,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACvC,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACjC,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAChC;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAEM,qBAAqB,CAAC,KAAa;QACxC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,KAAK,SAAS;gBACZ,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,aAAa;gBAChB,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC9B,MAAM;QACV,CAAC;IACH,CAAC;IAEM,WAAW;QAChB,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,KAAK,SAAS;gBACZ,OAAO,QAAQ,CAAC;YAClB,KAAK,aAAa;gBAChB,OAAO,YAAY,CAAC;YACtB,KAAK,OAAO;gBACV,OAAO,MAAM,CAAC;YAChB,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC;YACf;gBACE,OAAO,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;iHAlMU,uBAAuB;6DAAvB,uBAAuB;YChBhC,AADF,AADF,8BAA0B,aACS,SAC3B;YAAA,4BACF;YAAA,0FAA6B;YAG/B,iBAAK;YAEH,AADF,8BAAmC,cACL;YAAA,YAAmB;YAAA,iBAAO;YACtD,+BAA4B;YAAA,YAAmB;YACjD,AADiD,iBAAO,EAClD;YACN,kCAAwD;YAA9B,qGAAS,uBAAmB,IAAC;YACrD,2BAAuC;YAE3C,AADE,iBAAS,EACL;YAKF,AADF,AAFF,+BAA4B,cAEA,iBACI;YAC1B,4BAAwC;YACxC,yBACF;YAAA,iBAAQ;YACR,kCAK6D;YAD3D,0HAAiB,0BAAsB,IAAC;YAE5C,AANE,iBAK6D,EACzD;YAIJ,AADF,+BAA0B,iBACI;YAC1B,4BAA2C;YAC3C,aACF;YAAA,iBAAQ;YACR,mCAGkD;YAAhD,2HAAiB,iCAA6B,IAAC;YAC/C,gGAEC;YAEL,AADE,iBAAS,EACL;YAGN,2FAAoF;YAiBpF,2FAA4B;YAkB5B,kFAA6B;YA8B3B,AADF,gCAA4B,kBAKe;YAFvC,qGAAS,qBAAiB,IAAC;YAG3B,4BAAsC;YACtC,gCACF;YAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;YAxHA,eAEC;YAFD,oDAEC;YAG2B,eAAmB;YAAnB,uCAAmB;YACnB,eAAmB;YAAnB,4CAAmB;YAmB7C,eAA0D;YAA1D,6BAAA,qEAA0D,CAAA,mCAF5B;YAS9B,eACF;YADE,yDACF;YAGE,cAA8B;YAA9B,gDAA8B;YAE9B,cAEC;YAFD,uCAEC;YAKL,eAeC;YAfD,oHAeC;YAED,cAeC;YAfD,oDAeC;YAGD,cA0BC;YA1BD,qDA0BC;YAQG,eAAsC;YAAtC,mDAAsC;;;iFDnGjC,uBAAuB;cANnC,SAAS;6BACI,KAAK,YACP,qBAAqB;;kBAK9B,KAAK;;kBAWL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAGL,KAAK;;kBAEL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kFAtBI,uBAAuB","sourcesContent":["/**\n * @fileoverview MCP Filter Panel Component\n *\n * Provides filtering controls for the MCP Dashboard.\n * Matches the pattern used by agent-filter-panel component.\n *\n * @module MCP Filter Panel\n */\n\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { MCPDashboardFilters, MCPDashboardTab } from './mcp-dashboard.component';\n\n@Component({\n standalone: false,\n selector: 'mj-mcp-filter-panel',\n templateUrl: './mcp-filter-panel.component.html',\n styleUrls: ['./mcp-filter-panel.component.css']\n})\nexport class MCPFilterPanelComponent {\n @Input() filters: MCPDashboardFilters = {\n searchTerm: '',\n serverStatus: 'all',\n connectionStatus: 'all',\n toolStatus: 'all',\n logStatus: 'all',\n toolsServer: 'all',\n toolsCategory: 'all',\n favoritesOnly: false\n };\n\n @Input() activeTab: MCPDashboardTab = 'servers';\n @Input() totalCount = 0;\n @Input() filteredCount = 0;\n\n /** Part 3.3 — available servers for the Tools tab server-filter dropdown */\n @Input() availableServers: Array<{ ID: string; Name: string }> = [];\n /** Part 3.3 — available categories (derived from snake_case tool-name prefix) with counts */\n @Input() availableCategories: Array<{ category: string; count: number }> = [];\n\n @Output() filtersChange = new EventEmitter<MCPDashboardFilters>();\n @Output() closePanel = new EventEmitter<void>();\n\n public serverStatusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Inactive', value: 'Inactive' }\n ];\n\n public connectionStatusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Inactive', value: 'Inactive' },\n { text: 'Error', value: 'Error' }\n ];\n\n public toolStatusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Deprecated', value: 'Deprecated' }\n ];\n\n public logStatusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Success', value: 'Success' },\n { text: 'Error', value: 'Error' },\n { text: 'Running', value: 'Running' }\n ];\n\n public onFilterChange(): void {\n this.filtersChange.emit(this.filters);\n }\n\n public onSearchChange(value: string): void {\n this.filters = { ...this.filters, searchTerm: value };\n this.onFilterChange();\n }\n\n public onServerStatusChange(value: string): void {\n this.filters = { ...this.filters, serverStatus: value };\n this.onFilterChange();\n }\n\n public onConnectionStatusChange(value: string): void {\n this.filters = { ...this.filters, connectionStatus: value };\n this.onFilterChange();\n }\n\n public onToolStatusChange(value: string): void {\n this.filters = { ...this.filters, toolStatus: value };\n this.onFilterChange();\n }\n\n public onLogStatusChange(value: string): void {\n this.filters = { ...this.filters, logStatus: value };\n this.onFilterChange();\n }\n\n public onToolsServerChange(value: string): void {\n this.filters = { ...this.filters, toolsServer: value };\n this.onFilterChange();\n }\n\n public onToolsCategoryChange(value: string): void {\n this.filters = { ...this.filters, toolsCategory: value };\n this.onFilterChange();\n }\n\n public onFavoritesOnlyChange(checked: boolean): void {\n this.filters = { ...this.filters, favoritesOnly: checked };\n this.onFilterChange();\n }\n\n public resetAllFilters(): void {\n this.filters = {\n searchTerm: '',\n serverStatus: 'all',\n connectionStatus: 'all',\n toolStatus: 'all',\n logStatus: 'all',\n toolsServer: 'all',\n toolsCategory: 'all',\n favoritesOnly: false\n };\n this.onFilterChange();\n }\n\n /** Part 3.3 — count of non-default filter dimensions, used for \"Filters (N)\" badge */\n public get activeFilterCount(): number {\n let n = 0;\n if (this.filters.searchTerm) n++;\n if (this.filters.serverStatus && this.filters.serverStatus !== 'all') n++;\n if (this.filters.connectionStatus && this.filters.connectionStatus !== 'all') n++;\n if (this.filters.toolStatus && this.filters.toolStatus !== 'all') n++;\n if (this.filters.logStatus && this.filters.logStatus !== 'all') n++;\n if (this.filters.toolsServer && this.filters.toolsServer !== 'all') n++;\n if (this.filters.toolsCategory && this.filters.toolsCategory !== 'all') n++;\n if (this.filters.favoritesOnly) n++;\n return n;\n }\n\n public toggleFilterPanel(): void {\n this.closePanel.emit();\n }\n\n public get hasActiveFilters(): boolean {\n return this.filters.searchTerm !== '' ||\n this.filters.serverStatus !== 'all' ||\n this.filters.connectionStatus !== 'all' ||\n this.filters.toolStatus !== 'all' ||\n this.filters.logStatus !== 'all';\n }\n\n public get currentStatusOptions(): { text: string; value: string }[] {\n switch (this.activeTab) {\n case 'servers':\n return this.serverStatusOptions;\n case 'connections':\n return this.connectionStatusOptions;\n case 'tools':\n return this.toolStatusOptions;\n case 'logs':\n return this.logStatusOptions;\n default:\n return this.serverStatusOptions;\n }\n }\n\n public get currentStatusValue(): string {\n switch (this.activeTab) {\n case 'servers':\n return this.filters.serverStatus;\n case 'connections':\n return this.filters.connectionStatus;\n case 'tools':\n return this.filters.toolStatus;\n case 'logs':\n return this.filters.logStatus;\n default:\n return 'all';\n }\n }\n\n public onCurrentStatusChange(value: string): void {\n switch (this.activeTab) {\n case 'servers':\n this.onServerStatusChange(value);\n break;\n case 'connections':\n this.onConnectionStatusChange(value);\n break;\n case 'tools':\n this.onToolStatusChange(value);\n break;\n case 'logs':\n this.onLogStatusChange(value);\n break;\n }\n }\n\n public getTabLabel(): string {\n switch (this.activeTab) {\n case 'servers':\n return 'Server';\n case 'connections':\n return 'Connection';\n case 'tools':\n return 'Tool';\n case 'logs':\n return 'Log';\n default:\n return 'Item';\n }\n }\n}\n","<div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>MCP Filters\n @if (activeFilterCount > 0) {\n <span style=\"margin-left:6px;padding:2px 8px;background:var(--mj-brand-primary,#264FAF);color:#fff;border-radius:10px;font-size:0.7rem;font-weight:600\">{{ activeFilterCount }}</span>\n }\n </h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredCount }}</span>\n <span class=\"summary-label\">of {{ totalCount }}</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 Search\n </label>\n <input\n type=\"text\"\n class=\"filter-input\"\n [ngModel]=\"filters.searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\"\n placeholder=\"Search {{ getTabLabel().toLowerCase() }}s...\">\n </div>\n\n <!-- Status Filter (context-aware based on active tab) -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n {{ getTabLabel() }} Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"currentStatusValue\"\n (ngModelChange)=\"onCurrentStatusChange($event)\">\n @for (option of currentStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n\n <!-- Additional filters visible based on context -->\n @if (activeTab === 'connections' || activeTab === 'tools' || activeTab === 'logs') {\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-server\"></span>\n Server Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"filters.serverStatus\"\n (ngModelChange)=\"onServerStatusChange($event)\">\n @for (option of serverStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n }\n\n @if (activeTab === 'logs') {\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-link\"></span>\n Connection Status\n </label>\n <select\n class=\"filter-select\"\n [ngModel]=\"filters.connectionStatus\"\n (ngModelChange)=\"onConnectionStatusChange($event)\">\n @for (option of connectionStatusOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Part 3.3 — Tools tab: Server + Category filters + Favorites-only toggle -->\n @if (activeTab === 'tools') {\n <div class=\"filter-group\">\n <label class=\"filter-label\"><span class=\"fa-solid fa-server\"></span> Server</label>\n <select class=\"filter-select\" [ngModel]=\"filters.toolsServer ?? 'all'\" (ngModelChange)=\"onToolsServerChange($event)\">\n <option value=\"all\">All Servers</option>\n @for (s of availableServers; track s.ID) {\n <option [value]=\"s.ID\">{{ s.Name }}</option>\n }\n </select>\n </div>\n <div class=\"filter-group\">\n <label class=\"filter-label\"><span class=\"fa-solid fa-tags\"></span> Category</label>\n <select class=\"filter-select\" [ngModel]=\"filters.toolsCategory ?? 'all'\" (ngModelChange)=\"onToolsCategoryChange($event)\">\n <option value=\"all\">All Categories</option>\n @for (c of availableCategories; track c.category) {\n <option [value]=\"c.category\">{{ c.category }} ({{ c.count }})</option>\n }\n </select>\n </div>\n <div class=\"filter-group\">\n <label class=\"filter-label\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer\">\n <input type=\"checkbox\" [checked]=\"filters.favoritesOnly === true\" (change)=\"onFavoritesOnlyChange($any($event.target).checked)\" />\n <span class=\"fa-solid fa-star\"></span>\n Favorites only\n </label>\n </div>\n }\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button\n class=\"reset-btn\"\n (click)=\"resetAllFilters()\"\n title=\"Reset all filters\"\n [class.has-filters]=\"hasActiveFilters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n</div>\n"]}
@@ -8,15 +8,6 @@ import { OnInit } from '@angular/core';
8
8
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
9
9
  import { ResourceData } from '@memberjunction/core-entities';
10
10
  import * as i0 from "@angular/core";
11
- /**
12
- * MCP Resource Component — wrapper that hosts the MCP Dashboard.
13
- * Registered as 'MCPResource' for use with ResourceType: "Custom" nav items.
14
- *
15
- * The wrapper pattern is required because the resource container creates components
16
- * via createComponent() without the MCPModule's injector context. The wrapper's
17
- * template reference to <mj-mcp-dashboard> resolves through MCPModule's declarations,
18
- * ensuring all child standalone imports (mj-dialog, mjButton, etc.) are available.
19
- */
20
11
  export declare class MCPResourceComponent extends BaseResourceComponent implements OnInit {
21
12
  ngOnInit(): void;
22
13
  GetResourceDisplayName(data: ResourceData): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-resource.component.d.ts","sourceRoot":"","sources":["../../src/MCP/mcp-resource.component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAG7D;;;;;;;;GAQG;AACH,qBAca,oBAAqB,SAAQ,qBAAsB,YAAW,MAAM;IAE7E,QAAQ,IAAI,IAAI;IAKV,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAXtD,oBAAoB;2CAApB,oBAAoB;CAchC"}
1
+ {"version":3,"file":"mcp-resource.component.d.ts","sourceRoot":"","sources":["../../src/MCP/mcp-resource.component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAG7D,qBAca,oBAAqB,SAAQ,qBAAsB,YAAW,MAAM;IAE7E,QAAQ,IAAI,IAAI;IAKV,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAXtD,oBAAoB;2CAApB,oBAAoB;CAchC"}
@@ -15,15 +15,6 @@ import { BaseResourceComponent } from '@memberjunction/ng-shared';
15
15
  import { RegisterClass } from '@memberjunction/global';
16
16
  import * as i0 from "@angular/core";
17
17
  import * as i1 from "./mcp-dashboard.component";
18
- /**
19
- * MCP Resource Component — wrapper that hosts the MCP Dashboard.
20
- * Registered as 'MCPResource' for use with ResourceType: "Custom" nav items.
21
- *
22
- * The wrapper pattern is required because the resource container creates components
23
- * via createComponent() without the MCPModule's injector context. The wrapper's
24
- * template reference to <mj-mcp-dashboard> resolves through MCPModule's declarations,
25
- * ensuring all child standalone imports (mj-dialog, mjButton, etc.) are available.
26
- */
27
18
  let MCPResourceComponent = class MCPResourceComponent extends BaseResourceComponent {
28
19
  ngOnInit() {
29
20
  super.ngOnInit();
@@ -50,5 +41,5 @@ export { MCPResourceComponent };
50
41
  <mj-mcp-dashboard></mj-mcp-dashboard>
51
42
  `, styles: ["\n :host {\n display: block;\n height: 100%;\n }\n "] }]
52
43
  }], null, null); })();
53
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPResourceComponent, { className: "MCPResourceComponent", filePath: "src/MCP/mcp-resource.component.ts", lineNumber: 36 }); })();
44
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPResourceComponent, { className: "MCPResourceComponent", filePath: "src/MCP/mcp-resource.component.ts", lineNumber: 27 }); })();
54
45
  //# sourceMappingURL=mcp-resource.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-resource.component.js","sourceRoot":"","sources":["../../src/MCP/mcp-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAU,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;AAEvD;;;;;;;;GAQG;AAeI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,qBAAqB;IAE3D,QAAQ;QACJ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACzC,OAAO,8BAA8B,CAAC;IAC1C,CAAC;6PAbQ,oBAAoB,yBAApB,oBAAoB;6DAApB,oBAAoB;YATzB,mCAAqC;;;AAShC,oBAAoB;IAdhC,aAAa,CAAC,qBAAqB,EAAE,aAAa,CAAC;GAcvC,oBAAoB,CAchC;;iFAdY,oBAAoB;cAbhC,SAAS;6BACI,KAAK,YACL,iBAAiB,YACjB;;KAET;;kFAQQ,oBAAoB","sourcesContent":["/**\n * @fileoverview MCP Resource Component\n *\n * Resource wrapper for the MCP Dashboard that allows it to be used\n * as a nav item in applications (like the AI Application).\n */\n\nimport { Component, OnInit } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\n\n/**\n * MCP Resource Component — wrapper that hosts the MCP Dashboard.\n * Registered as 'MCPResource' for use with ResourceType: \"Custom\" nav items.\n *\n * The wrapper pattern is required because the resource container creates components\n * via createComponent() without the MCPModule's injector context. The wrapper's\n * template reference to <mj-mcp-dashboard> resolves through MCPModule's declarations,\n * ensuring all child standalone imports (mj-dialog, mjButton, etc.) are available.\n */\n@RegisterClass(BaseResourceComponent, 'MCPResource')\n@Component({\n standalone: false,\n selector: 'mj-mcp-resource',\n template: `\n <mj-mcp-dashboard></mj-mcp-dashboard>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n `]\n})\nexport class MCPResourceComponent extends BaseResourceComponent implements OnInit {\n\n ngOnInit(): void {\n super.ngOnInit();\n this.NotifyLoadComplete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'MCP';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-plug-circle-bolt';\n }\n}\n"]}
1
+ {"version":3,"file":"mcp-resource.component.js","sourceRoot":"","sources":["../../src/MCP/mcp-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAU,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;AAgBhD,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,qBAAqB;IAE3D,QAAQ;QACJ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACzC,OAAO,8BAA8B,CAAC;IAC1C,CAAC;6PAbQ,oBAAoB,yBAApB,oBAAoB;6DAApB,oBAAoB;YATzB,mCAAqC;;;AAShC,oBAAoB;IAdhC,aAAa,CAAC,qBAAqB,EAAE,aAAa,CAAC;GAcvC,oBAAoB,CAchC;;iFAdY,oBAAoB;cAbhC,SAAS;6BACM,KAAK,YACP,iBAAiB,YACjB;;KAET;;kFAQQ,oBAAoB","sourcesContent":["/**\n * @fileoverview MCP Resource Component\n *\n * Resource wrapper for the MCP Dashboard that allows it to be used\n * as a nav item in applications (like the AI Application).\n */\n\nimport { Component, OnInit } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\n\n@RegisterClass(BaseResourceComponent, 'MCPResource')\n@Component({\n standalone: false,\n selector: 'mj-mcp-resource',\n template: `\n <mj-mcp-dashboard></mj-mcp-dashboard>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n }\n `]\n})\nexport class MCPResourceComponent extends BaseResourceComponent implements OnInit {\n\n ngOnInit(): void {\n super.ngOnInit();\n this.NotifyLoadComplete();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'MCP';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-plug-circle-bolt';\n }\n}\n"]}