@memberjunction/ng-dashboards 5.35.0 → 5.36.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 (159) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +3 -3
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  11. package/dist/AI/components/models/model-management.component.js +4 -4
  12. package/dist/AI/components/models/model-management.component.js.map +1 -1
  13. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  14. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  15. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  16. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  17. package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
  18. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  19. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  20. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  22. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +137 -142
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/execution-monitoring.component.js +111 -116
  26. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  27. package/dist/Admin/admin-data-schema.component.js +13 -65
  28. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  29. package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
  30. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  31. package/dist/Admin/admin-identity-access.component.js +13 -65
  32. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  33. package/dist/Admin/admin-monitoring.component.js +13 -65
  34. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  35. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  36. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  37. package/dist/Admin/base-admin-container.component.js +26 -17
  38. package/dist/Admin/base-admin-container.component.js.map +1 -1
  39. package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
  40. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  41. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  42. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  43. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  44. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  45. package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
  46. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  47. package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
  48. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  49. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
  50. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  51. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  52. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  53. package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
  54. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  55. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  56. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  57. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
  58. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  59. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  60. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  61. package/dist/DevTools/app-state-inspector.component.js +46 -72
  62. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  63. package/dist/DevTools/class-registry.component.js +88 -100
  64. package/dist/DevTools/class-registry.component.js.map +1 -1
  65. package/dist/DevTools/event-monitor.component.js +158 -168
  66. package/dist/DevTools/event-monitor.component.js.map +1 -1
  67. package/dist/DevTools/graphql-console.component.js +257 -264
  68. package/dist/DevTools/graphql-console.component.js.map +1 -1
  69. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  70. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  71. package/dist/DevTools/layout-inspector.component.js +46 -64
  72. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  73. package/dist/DevTools/lazy-module-status.component.js +75 -84
  74. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  75. package/dist/DevTools/settings-explorer.component.js +76 -85
  76. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  78. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  79. package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
  80. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  81. package/dist/Integration/components/activity/activity.component.js +97 -99
  82. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  83. package/dist/Integration/components/connections/connections.component.js +842 -855
  84. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  85. package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
  86. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  87. package/dist/Integration/components/schedules/schedules.component.js +78 -89
  88. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  89. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  90. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  91. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
  92. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  93. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  94. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  95. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
  96. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  97. package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
  98. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  99. package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
  100. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  101. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  102. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  103. package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
  104. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  105. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  106. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  107. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  108. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  109. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  110. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  111. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  112. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  113. package/dist/Lists/index.d.ts +1 -0
  114. package/dist/Lists/index.d.ts.map +1 -1
  115. package/dist/Lists/index.js +1 -0
  116. package/dist/Lists/index.js.map +1 -1
  117. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  118. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  119. package/dist/Lists/services/list-set-operations.service.js +236 -10
  120. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  121. package/dist/MCP/mcp-dashboard.component.js +19 -19
  122. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  123. package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
  124. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  125. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  126. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  127. package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
  128. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  129. package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
  130. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  131. package/dist/Testing/components/testing-explorer.component.js +543 -629
  132. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  133. package/dist/Testing/testing-dashboard.component.js +50 -49
  134. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  135. package/dist/ai-dashboards.module.d.ts +1 -1
  136. package/dist/ai-dashboards.module.d.ts.map +1 -1
  137. package/dist/ai-dashboards.module.js +16 -1
  138. package/dist/ai-dashboards.module.js.map +1 -1
  139. package/dist/communication-dashboards.module.d.ts +9 -7
  140. package/dist/communication-dashboards.module.d.ts.map +1 -1
  141. package/dist/communication-dashboards.module.js +13 -4
  142. package/dist/communication-dashboards.module.js.map +1 -1
  143. package/dist/core-dashboards.module.d.ts +1 -1
  144. package/dist/core-dashboards.module.d.ts.map +1 -1
  145. package/dist/core-dashboards.module.js +16 -1
  146. package/dist/core-dashboards.module.js.map +1 -1
  147. package/dist/lists-dashboards.module.d.ts +10 -9
  148. package/dist/lists-dashboards.module.d.ts.map +1 -1
  149. package/dist/lists-dashboards.module.js +13 -2
  150. package/dist/lists-dashboards.module.js.map +1 -1
  151. package/dist/public-api.d.ts +1 -0
  152. package/dist/public-api.d.ts.map +1 -1
  153. package/dist/public-api.js +1 -0
  154. package/dist/public-api.js.map +1 -1
  155. package/dist/testing-dashboards.module.d.ts +1 -1
  156. package/dist/testing-dashboards.module.d.ts.map +1 -1
  157. package/dist/testing-dashboards.module.js +13 -1
  158. package/dist/testing-dashboards.module.js.map +1 -1
  159. package/package.json +53 -52
@@ -11,15 +11,16 @@ import { UserInfoEngine, InstanceConfigEngine } from '@memberjunction/core-entit
11
11
  import { DevToolsPrefs } from './dev-tools-prefs';
12
12
  import * as i0 from "@angular/core";
13
13
  import * as i1 from "@angular/forms";
14
- function SettingsExplorerComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
14
+ import * as i2 from "@memberjunction/ng-ui-components";
15
+ function SettingsExplorerComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
15
16
  const _r1 = i0.ɵɵgetCurrentView();
16
- i0.ɵɵelementStart(0, "button", 26);
17
- i0.ɵɵlistener("click", function SettingsExplorerComponent_Conditional_29_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SearchQuery = ""); });
18
- i0.ɵɵelement(1, "i", 27);
17
+ i0.ɵɵelementStart(0, "button", 20);
18
+ i0.ɵɵlistener("click", function SettingsExplorerComponent_Conditional_19_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SearchQuery = ""); });
19
+ i0.ɵɵelement(1, "i", 21);
19
20
  i0.ɵɵelementEnd();
20
21
  } }
21
- function SettingsExplorerComponent_Conditional_32_Conditional_1_Template(rf, ctx) { if (rf & 1) {
22
- i0.ɵɵelement(0, "i", 28);
22
+ function SettingsExplorerComponent_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
23
+ i0.ɵɵelement(0, "i", 22);
23
24
  i0.ɵɵelementStart(1, "span");
24
25
  i0.ɵɵtext(2);
25
26
  i0.ɵɵelementEnd();
@@ -28,8 +29,8 @@ function SettingsExplorerComponent_Conditional_32_Conditional_1_Template(rf, ctx
28
29
  i0.ɵɵadvance(2);
29
30
  i0.ɵɵtextInterpolate1("No matches for \"", ctx_r1.SearchQuery, "\"");
30
31
  } }
31
- function SettingsExplorerComponent_Conditional_32_Conditional_2_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelement(0, "i", 29);
32
+ function SettingsExplorerComponent_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelement(0, "i", 23);
33
34
  i0.ɵɵelementStart(1, "span");
34
35
  i0.ɵɵtext(2);
35
36
  i0.ɵɵelementEnd();
@@ -38,17 +39,17 @@ function SettingsExplorerComponent_Conditional_32_Conditional_2_Template(rf, ctx
38
39
  i0.ɵɵadvance(2);
39
40
  i0.ɵɵtextInterpolate1("No ", ctx_r1.Scope === "user" ? "user settings" : "instance configurations", " are defined.");
40
41
  } }
41
- function SettingsExplorerComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
42
- i0.ɵɵelementStart(0, "div", 22);
43
- i0.ɵɵconditionalCreate(1, SettingsExplorerComponent_Conditional_32_Conditional_1_Template, 3, 1)(2, SettingsExplorerComponent_Conditional_32_Conditional_2_Template, 3, 1);
42
+ function SettingsExplorerComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
43
+ i0.ɵɵelementStart(0, "div", 16);
44
+ i0.ɵɵconditionalCreate(1, SettingsExplorerComponent_Conditional_22_Conditional_1_Template, 3, 1)(2, SettingsExplorerComponent_Conditional_22_Conditional_2_Template, 3, 1);
44
45
  i0.ɵɵelementEnd();
45
46
  } if (rf & 2) {
46
47
  const ctx_r1 = i0.ɵɵnextContext();
47
48
  i0.ɵɵadvance();
48
49
  i0.ɵɵconditional(ctx_r1.SearchQuery ? 1 : 2);
49
50
  } }
50
- function SettingsExplorerComponent_Conditional_33_For_11_Conditional_4_Template(rf, ctx) { if (rf & 1) {
51
- i0.ɵɵelementStart(0, "div", 36);
51
+ function SettingsExplorerComponent_Conditional_23_For_11_Conditional_4_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵelementStart(0, "div", 30);
52
53
  i0.ɵɵtext(1);
53
54
  i0.ɵɵelementEnd();
54
55
  } if (rf & 2) {
@@ -56,19 +57,19 @@ function SettingsExplorerComponent_Conditional_33_For_11_Conditional_4_Template(
56
57
  i0.ɵɵadvance();
57
58
  i0.ɵɵtextInterpolate(row_r4.meta);
58
59
  } }
59
- function SettingsExplorerComponent_Conditional_33_For_11_Template(rf, ctx) { if (rf & 1) {
60
+ function SettingsExplorerComponent_Conditional_23_For_11_Template(rf, ctx) { if (rf & 1) {
60
61
  const _r3 = i0.ɵɵgetCurrentView();
61
- i0.ɵɵelementStart(0, "tr", 34);
62
- i0.ɵɵlistener("click", function SettingsExplorerComponent_Conditional_33_For_11_Template_tr_click_0_listener() { const row_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRowClick(row_r4)); });
63
- i0.ɵɵelementStart(1, "td", 35)(2, "code");
62
+ i0.ɵɵelementStart(0, "tr", 28);
63
+ i0.ɵɵlistener("click", function SettingsExplorerComponent_Conditional_23_For_11_Template_tr_click_0_listener() { const row_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRowClick(row_r4)); });
64
+ i0.ɵɵelementStart(1, "td", 29)(2, "code");
64
65
  i0.ɵɵtext(3);
65
66
  i0.ɵɵelementEnd();
66
- i0.ɵɵconditionalCreate(4, SettingsExplorerComponent_Conditional_33_For_11_Conditional_4_Template, 2, 1, "div", 36);
67
+ i0.ɵɵconditionalCreate(4, SettingsExplorerComponent_Conditional_23_For_11_Conditional_4_Template, 2, 1, "div", 30);
67
68
  i0.ɵɵelementEnd();
68
- i0.ɵɵelementStart(5, "td", 37)(6, "span", 38);
69
+ i0.ɵɵelementStart(5, "td", 31)(6, "span", 32);
69
70
  i0.ɵɵtext(7);
70
71
  i0.ɵɵelementEnd()();
71
- i0.ɵɵelementStart(8, "td", 39);
72
+ i0.ɵɵelementStart(8, "td", 33);
72
73
  i0.ɵɵtext(9);
73
74
  i0.ɵɵelementEnd()();
74
75
  } if (rf & 2) {
@@ -86,26 +87,26 @@ function SettingsExplorerComponent_Conditional_33_For_11_Template(rf, ctx) { if
86
87
  i0.ɵɵadvance(2);
87
88
  i0.ɵɵtextInterpolate(row_r4.preview);
88
89
  } }
89
- function SettingsExplorerComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
90
- i0.ɵɵelementStart(0, "table", 23)(1, "thead")(2, "tr")(3, "th", 30);
90
+ function SettingsExplorerComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
91
+ i0.ɵɵelementStart(0, "table", 17)(1, "thead")(2, "tr")(3, "th", 24);
91
92
  i0.ɵɵtext(4, "Key");
92
93
  i0.ɵɵelementEnd();
93
- i0.ɵɵelementStart(5, "th", 31);
94
+ i0.ɵɵelementStart(5, "th", 25);
94
95
  i0.ɵɵtext(6, "Type");
95
96
  i0.ɵɵelementEnd();
96
- i0.ɵɵelementStart(7, "th", 32);
97
+ i0.ɵɵelementStart(7, "th", 26);
97
98
  i0.ɵɵtext(8, "Value");
98
99
  i0.ɵɵelementEnd()()();
99
100
  i0.ɵɵelementStart(9, "tbody");
100
- i0.ɵɵrepeaterCreate(10, SettingsExplorerComponent_Conditional_33_For_11_Template, 10, 8, "tr", 33, i0.ɵɵcomponentInstance().TrackByKey, true);
101
+ i0.ɵɵrepeaterCreate(10, SettingsExplorerComponent_Conditional_23_For_11_Template, 10, 8, "tr", 27, i0.ɵɵcomponentInstance().TrackByKey, true);
101
102
  i0.ɵɵelementEnd()();
102
103
  } if (rf & 2) {
103
104
  const ctx_r1 = i0.ɵɵnextContext();
104
105
  i0.ɵɵadvance(10);
105
106
  i0.ɵɵrepeater(ctx_r1.FilteredRows);
106
107
  } }
107
- function SettingsExplorerComponent_Conditional_34_Conditional_5_Template(rf, ctx) { if (rf & 1) {
108
- i0.ɵɵelementStart(0, "div", 42);
108
+ function SettingsExplorerComponent_Conditional_24_Conditional_5_Template(rf, ctx) { if (rf & 1) {
109
+ i0.ɵɵelementStart(0, "div", 36);
109
110
  i0.ɵɵtext(1);
110
111
  i0.ɵɵelementEnd();
111
112
  } if (rf & 2) {
@@ -113,8 +114,8 @@ function SettingsExplorerComponent_Conditional_34_Conditional_5_Template(rf, ctx
113
114
  i0.ɵɵadvance();
114
115
  i0.ɵɵtextInterpolate(ctx_r1.Selected.meta);
115
116
  } }
116
- function SettingsExplorerComponent_Conditional_34_Conditional_16_Template(rf, ctx) { if (rf & 1) {
117
- i0.ɵɵelementStart(0, "span", 49);
117
+ function SettingsExplorerComponent_Conditional_24_Conditional_16_Template(rf, ctx) { if (rf & 1) {
118
+ i0.ɵɵelementStart(0, "span", 44);
118
119
  i0.ɵɵtext(1);
119
120
  i0.ɵɵelementEnd();
120
121
  } if (rf & 2) {
@@ -122,28 +123,28 @@ function SettingsExplorerComponent_Conditional_34_Conditional_16_Template(rf, ct
122
123
  i0.ɵɵadvance();
123
124
  i0.ɵɵtextInterpolate1("Updated ", ctx_r1.Selected.updated.toLocaleString());
124
125
  } }
125
- function SettingsExplorerComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
126
+ function SettingsExplorerComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
126
127
  const _r5 = i0.ɵɵgetCurrentView();
127
- i0.ɵɵelementStart(0, "aside", 24)(1, "div", 40)(2, "div")(3, "div", 41);
128
+ i0.ɵɵelementStart(0, "aside", 18)(1, "div", 34)(2, "div")(3, "div", 35);
128
129
  i0.ɵɵtext(4);
129
130
  i0.ɵɵelementEnd();
130
- i0.ɵɵconditionalCreate(5, SettingsExplorerComponent_Conditional_34_Conditional_5_Template, 2, 1, "div", 42);
131
+ i0.ɵɵconditionalCreate(5, SettingsExplorerComponent_Conditional_24_Conditional_5_Template, 2, 1, "div", 36);
131
132
  i0.ɵɵelementEnd();
132
- i0.ɵɵelementStart(6, "div", 43)(7, "button", 44);
133
- i0.ɵɵlistener("click", function SettingsExplorerComponent_Conditional_34_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCopySelected()); });
134
- i0.ɵɵelement(8, "i", 45);
133
+ i0.ɵɵelementStart(6, "div", 37)(7, "button", 38);
134
+ i0.ɵɵlistener("click", function SettingsExplorerComponent_Conditional_24_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCopySelected()); });
135
+ i0.ɵɵelement(8, "i", 39);
135
136
  i0.ɵɵtext(9, " Copy ");
136
137
  i0.ɵɵelementEnd();
137
- i0.ɵɵelementStart(10, "button", 46);
138
- i0.ɵɵlistener("click", function SettingsExplorerComponent_Conditional_34_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Selected = null); });
139
- i0.ɵɵelement(11, "i", 27);
138
+ i0.ɵɵelementStart(10, "button", 40);
139
+ i0.ɵɵlistener("click", function SettingsExplorerComponent_Conditional_24_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Selected = null); });
140
+ i0.ɵɵelement(11, "i", 41);
140
141
  i0.ɵɵelementEnd()()();
141
- i0.ɵɵelementStart(12, "div", 47)(13, "div", 48)(14, "span", 38);
142
+ i0.ɵɵelementStart(12, "div", 42)(13, "div", 43)(14, "span", 32);
142
143
  i0.ɵɵtext(15);
143
144
  i0.ɵɵelementEnd();
144
- i0.ɵɵconditionalCreate(16, SettingsExplorerComponent_Conditional_34_Conditional_16_Template, 2, 1, "span", 49);
145
+ i0.ɵɵconditionalCreate(16, SettingsExplorerComponent_Conditional_24_Conditional_16_Template, 2, 1, "span", 44);
145
146
  i0.ɵɵelementEnd();
146
- i0.ɵɵelementStart(17, "pre", 50)(18, "code");
147
+ i0.ɵɵelementStart(17, "pre", 45)(18, "code");
147
148
  i0.ɵɵtext(19);
148
149
  i0.ɵɵelementEnd()()()();
149
150
  } if (rf & 2) {
@@ -315,54 +316,44 @@ let SettingsExplorerComponent = class SettingsExplorerComponent extends BaseReso
315
316
  return String(value);
316
317
  }
317
318
  static ɵfac = function SettingsExplorerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SettingsExplorerComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
318
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SettingsExplorerComponent, selectors: [["mj-settings-explorer"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 37, vars: 11, consts: [[1, "mj-inspector", "mj-inspector--solo"], [1, "mj-inspector__header"], [1, "mj-inspector__header-icon"], [1, "fa-solid", "fa-sliders"], [1, "mj-inspector__header-title"], [1, "mj-inspector__header-sub"], [1, "mj-inspector__header-spacer"], [1, "mj-inspector__header-actions"], ["type", "button", "title", "Refresh", 1, "mj-inspector__btn", 3, "click"], [1, "fa-solid", "fa-rotate"], [1, "se-toolbar"], [1, "se-tabs"], ["type", "button", 1, "se-tab", 3, "click"], [1, "fa-solid", "fa-user"], [1, "se-count"], [1, "fa-solid", "fa-server"], [1, "se-search-wrap"], [1, "fa-solid", "fa-search", "se-search-icon"], ["type", "search", "placeholder", "Search keys or values\u2026", 1, "se-search", 3, "ngModelChange", "ngModel"], ["title", "Clear", 1, "se-search-clear"], [1, "se-body"], [1, "se-list"], [1, "se-empty"], [1, "se-table"], [1, "se-detail"], [1, "mj-inspector__footer-meta"], ["title", "Clear", 1, "se-search-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-regular", "fa-folder-open"], [1, "se-th-key"], [1, "se-th-type"], [1, "se-th-value"], [3, "se-row--selected"], [3, "click"], [1, "se-td-key"], [1, "se-td-meta"], [1, "se-td-type"], [1, "se-type-pill"], [1, "se-td-value"], [1, "se-detail-head"], [1, "se-detail-key"], [1, "se-detail-meta"], [1, "se-detail-actions"], ["title", "Copy value", 1, "mj-inspector__btn", 3, "click"], [1, "fa-solid", "fa-clipboard"], ["title", "Close", 1, "mj-inspector__btn", "mj-inspector__btn--ghost", 3, "click"], [1, "se-detail-body"], [1, "se-detail-meta-row"], [1, "se-detail-updated"], [1, "se-detail-value"]], template: function SettingsExplorerComponent_Template(rf, ctx) { if (rf & 1) {
319
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
320
- i0.ɵɵelement(3, "i", 3);
321
- i0.ɵɵelementEnd();
322
- i0.ɵɵelementStart(4, "div")(5, "h3", 4);
323
- i0.ɵɵtext(6, "Settings Explorer");
324
- i0.ɵɵelementEnd();
325
- i0.ɵɵelementStart(7, "div", 5);
326
- i0.ɵɵtext(8, "User settings and instance-level configuration");
327
- i0.ɵɵelementEnd()();
328
- i0.ɵɵelement(9, "span", 6);
329
- i0.ɵɵelementStart(10, "div", 7)(11, "button", 8);
330
- i0.ɵɵlistener("click", function SettingsExplorerComponent_Template_button_click_11_listener() { return ctx.refresh(); });
331
- i0.ɵɵelement(12, "i", 9);
332
- i0.ɵɵtext(13, " Refresh ");
319
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SettingsExplorerComponent, selectors: [["mj-settings-explorer"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 27, vars: 12, consts: [[1, "mj-inspector", "mj-inspector--solo"], ["Role", "region", "AriaLabel", "Settings explorer", "Title", "Settings Explorer", "Subtitle", "User settings and instance-level configuration"], ["actions", ""], [3, "Clicked", "Loading"], [1, "se-toolbar"], [1, "se-tabs"], ["type", "button", 1, "se-tab", 3, "click"], [1, "fa-solid", "fa-user"], [1, "se-count"], [1, "fa-solid", "fa-server"], [1, "se-search-wrap"], [1, "fa-solid", "fa-search", "se-search-icon"], ["type", "search", "placeholder", "Search keys or values\u2026", 1, "se-search", 3, "ngModelChange", "ngModel"], ["title", "Clear", 1, "se-search-clear"], [1, "se-body"], [1, "se-list"], [1, "se-empty"], [1, "se-table"], [1, "se-detail"], [1, "mj-inspector__footer-meta"], ["title", "Clear", 1, "se-search-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-regular", "fa-folder-open"], [1, "se-th-key"], [1, "se-th-type"], [1, "se-th-value"], [3, "se-row--selected"], [3, "click"], [1, "se-td-key"], [1, "se-td-meta"], [1, "se-td-type"], [1, "se-type-pill"], [1, "se-td-value"], [1, "se-detail-head"], [1, "se-detail-key"], [1, "se-detail-meta"], [1, "se-detail-actions"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Copy value", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-clipboard"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Close", "aria-label", "Close detail", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], [1, "se-detail-body"], [1, "se-detail-meta-row"], [1, "se-detail-updated"], [1, "se-detail-value"]], template: function SettingsExplorerComponent_Template(rf, ctx) { if (rf & 1) {
320
+ i0.ɵɵelementStart(0, "div", 0)(1, "mj-page-header-interior", 1)(2, "div", 2)(3, "mj-refresh-button", 3);
321
+ i0.ɵɵlistener("Clicked", function SettingsExplorerComponent_Template_mj_refresh_button_Clicked_3_listener() { return ctx.refresh(); });
333
322
  i0.ɵɵelementEnd()()();
334
- i0.ɵɵelementStart(14, "div", 10)(15, "div", 11)(16, "button", 12);
335
- i0.ɵɵlistener("click", function SettingsExplorerComponent_Template_button_click_16_listener() { return ctx.OnScopeChange("user"); });
336
- i0.ɵɵelement(17, "i", 13);
337
- i0.ɵɵtext(18, " User Settings ");
338
- i0.ɵɵelementStart(19, "span", 14);
339
- i0.ɵɵtext(20);
323
+ i0.ɵɵelementStart(4, "div", 4)(5, "div", 5)(6, "button", 6);
324
+ i0.ɵɵlistener("click", function SettingsExplorerComponent_Template_button_click_6_listener() { return ctx.OnScopeChange("user"); });
325
+ i0.ɵɵelement(7, "i", 7);
326
+ i0.ɵɵtext(8, " User Settings ");
327
+ i0.ɵɵelementStart(9, "span", 8);
328
+ i0.ɵɵtext(10);
340
329
  i0.ɵɵelementEnd()();
341
- i0.ɵɵelementStart(21, "button", 12);
342
- i0.ɵɵlistener("click", function SettingsExplorerComponent_Template_button_click_21_listener() { return ctx.OnScopeChange("instance"); });
343
- i0.ɵɵelement(22, "i", 15);
344
- i0.ɵɵtext(23, " Instance Configurations ");
345
- i0.ɵɵelementStart(24, "span", 14);
346
- i0.ɵɵtext(25);
330
+ i0.ɵɵelementStart(11, "button", 6);
331
+ i0.ɵɵlistener("click", function SettingsExplorerComponent_Template_button_click_11_listener() { return ctx.OnScopeChange("instance"); });
332
+ i0.ɵɵelement(12, "i", 9);
333
+ i0.ɵɵtext(13, " Instance Configurations ");
334
+ i0.ɵɵelementStart(14, "span", 8);
335
+ i0.ɵɵtext(15);
347
336
  i0.ɵɵelementEnd()()();
348
- i0.ɵɵelementStart(26, "div", 16);
349
- i0.ɵɵelement(27, "i", 17);
350
- i0.ɵɵelementStart(28, "input", 18);
351
- i0.ɵɵtwoWayListener("ngModelChange", function SettingsExplorerComponent_Template_input_ngModelChange_28_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SearchQuery, $event) || (ctx.SearchQuery = $event); return $event; });
352
- i0.ɵɵlistener("ngModelChange", function SettingsExplorerComponent_Template_input_ngModelChange_28_listener() { return ctx.PersistPrefs(); });
337
+ i0.ɵɵelementStart(16, "div", 10);
338
+ i0.ɵɵelement(17, "i", 11);
339
+ i0.ɵɵelementStart(18, "input", 12);
340
+ i0.ɵɵtwoWayListener("ngModelChange", function SettingsExplorerComponent_Template_input_ngModelChange_18_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SearchQuery, $event) || (ctx.SearchQuery = $event); return $event; });
341
+ i0.ɵɵlistener("ngModelChange", function SettingsExplorerComponent_Template_input_ngModelChange_18_listener() { return ctx.PersistPrefs(); });
353
342
  i0.ɵɵelementEnd();
354
- i0.ɵɵconditionalCreate(29, SettingsExplorerComponent_Conditional_29_Template, 2, 0, "button", 19);
343
+ i0.ɵɵconditionalCreate(19, SettingsExplorerComponent_Conditional_19_Template, 2, 0, "button", 13);
355
344
  i0.ɵɵelementEnd()();
356
- i0.ɵɵelementStart(30, "div", 20)(31, "div", 21);
357
- i0.ɵɵconditionalCreate(32, SettingsExplorerComponent_Conditional_32_Template, 3, 1, "div", 22)(33, SettingsExplorerComponent_Conditional_33_Template, 12, 0, "table", 23);
345
+ i0.ɵɵelementStart(20, "div", 14)(21, "div", 15);
346
+ i0.ɵɵconditionalCreate(22, SettingsExplorerComponent_Conditional_22_Template, 3, 1, "div", 16)(23, SettingsExplorerComponent_Conditional_23_Template, 12, 0, "table", 17);
358
347
  i0.ɵɵelementEnd();
359
- i0.ɵɵconditionalCreate(34, SettingsExplorerComponent_Conditional_34_Template, 20, 7, "aside", 24);
348
+ i0.ɵɵconditionalCreate(24, SettingsExplorerComponent_Conditional_24_Template, 20, 7, "aside", 18);
360
349
  i0.ɵɵelementEnd();
361
- i0.ɵɵelementStart(35, "div", 25);
362
- i0.ɵɵtext(36);
350
+ i0.ɵɵelementStart(25, "div", 19);
351
+ i0.ɵɵtext(26);
363
352
  i0.ɵɵelementEnd()();
364
353
  } if (rf & 2) {
365
- i0.ɵɵadvance(16);
354
+ i0.ɵɵadvance(3);
355
+ i0.ɵɵproperty("Loading", false);
356
+ i0.ɵɵadvance(3);
366
357
  i0.ɵɵclassProp("se-tab--active", ctx.Scope === "user");
367
358
  i0.ɵɵadvance(4);
368
359
  i0.ɵɵtextInterpolate(ctx.Counts.user);
@@ -373,14 +364,14 @@ let SettingsExplorerComponent = class SettingsExplorerComponent extends BaseReso
373
364
  i0.ɵɵadvance(3);
374
365
  i0.ɵɵtwoWayProperty("ngModel", ctx.SearchQuery);
375
366
  i0.ɵɵadvance();
376
- i0.ɵɵconditional(ctx.SearchQuery ? 29 : -1);
367
+ i0.ɵɵconditional(ctx.SearchQuery ? 19 : -1);
377
368
  i0.ɵɵadvance(3);
378
- i0.ɵɵconditional(ctx.FilteredRows.length === 0 ? 32 : 33);
369
+ i0.ɵɵconditional(ctx.FilteredRows.length === 0 ? 22 : 23);
379
370
  i0.ɵɵadvance(2);
380
- i0.ɵɵconditional(ctx.Selected ? 34 : -1);
371
+ i0.ɵɵconditional(ctx.Selected ? 24 : -1);
381
372
  i0.ɵɵadvance(2);
382
373
  i0.ɵɵtextInterpolate1("Refreshed ", ctx.LastRefreshedLabel);
383
- } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n.mj-inspector[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n\n\n.mj-inspector__header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.mj-inspector__header-icon[_ngcontent-%COMP%] {\n width: 36px; height: 36px;\n border-radius: 9px;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: white;\n display: flex; align-items: center; justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n}\n.mj-inspector__header-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-inspector__header-sub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-inspector__header-spacer[_ngcontent-%COMP%] { flex: 1; }\n.mj-inspector__header-actions[_ngcontent-%COMP%] {\n display: flex; gap: 6px;\n}\n.mj-inspector__btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.mj-inspector__btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__btn--success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-border-default));\n}\n\n\n\n.mj-inspector__body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.mj-inspector__sidebar[_ngcontent-%COMP%] {\n width: 220px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n flex-shrink: 0;\n padding: 8px;\n}\n.mj-inspector__nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n margin-bottom: 2px;\n font-family: inherit;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n text-align: left;\n width: 100%;\n}\n.mj-inspector__nav-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.mj-inspector__nav-icon[_ngcontent-%COMP%] {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n}\n.mj-inspector__nav-text[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n.mj-inspector__nav-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.mj-inspector__nav-desc[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%] .mj-inspector__nav-desc[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n\n\n.mj-inspector__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n\n\n.mj-inspector__empty[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n@media (max-width: 700px) {\n .mj-inspector__body[_ngcontent-%COMP%] { flex-direction: column; }\n .mj-inspector__sidebar[_ngcontent-%COMP%] {\n width: 100%;\n height: auto;\n max-height: 200px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n .mj-inspector__nav-item[_ngcontent-%COMP%] { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .mj-inspector__nav-desc[_ngcontent-%COMP%] { display: none; }\n .mj-inspector__header[_ngcontent-%COMP%] { padding: 12px 14px; gap: 10px; }\n}", ".mj-inspector--solo[_ngcontent-%COMP%] { background: var(--mj-bg-page); }\n\n\n\n.se-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n.se-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 2px;\n background: var(--mj-bg-surface-sunken);\n padding: 3px;\n border-radius: 8px;\n}\n.se-tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-radius: 6px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 12.5px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.se-tab[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); }\n.se-tab--active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n}\n.se-count[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 10.5px;\n padding: 1px 7px;\n border-radius: 100px;\n font-weight: 600;\n}\n.se-tab--active[_ngcontent-%COMP%] .se-count[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.se-search-wrap[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n max-width: 360px;\n margin-left: auto;\n}\n.se-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.se-search[_ngcontent-%COMP%] {\n width: 100%;\n padding: 7px 32px 7px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12.5px;\n font-family: inherit;\n}\n.se-search[_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.se-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.se-search-clear[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n\n\n.se-body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.se-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n background: var(--mj-bg-page);\n}\n\n.se-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n}\n.se-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n background: var(--mj-bg-surface);\n box-shadow: 0 1px 0 var(--mj-border-subtle);\n}\n.se-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 10px 18px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.se-th-type[_ngcontent-%COMP%] { width: 100px; }\n.se-th-value[_ngcontent-%COMP%] { }\n.se-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 8px 18px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: top;\n cursor: pointer;\n}\n.se-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.se-row--selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent) !important;\n}\n.se-row--selected[_ngcontent-%COMP%] td[_ngcontent-%COMP%]:first-child {\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n}\n\n.se-td-key[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.se-td-meta[_ngcontent-%COMP%] {\n margin-top: 3px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.se-td-value[_ngcontent-%COMP%] {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 0;\n}\n\n.se-type-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10px;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 100px;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n}\n.se-type-pill--string[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); color: var(--mj-brand-primary); }\n.se-type-pill--number[_ngcontent-%COMP%] { background: color-mix(in srgb, #7c3aed 14%, transparent); color: #5b21b6; }\n.se-type-pill--boolean[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 14%, transparent); color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary)); }\n.se-type-pill--json[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary)); }\n.se-type-pill--empty[_ngcontent-%COMP%] { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n\n\n.se-detail[_ngcontent-%COMP%] {\n width: 420px;\n flex-shrink: 0;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n.se-detail-head[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.se-detail-key[_ngcontent-%COMP%] {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-all;\n}\n.se-detail-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n.se-detail-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n.mj-inspector__btn--ghost[_ngcontent-%COMP%] {\n background: transparent !important;\n border: 1px solid transparent !important;\n}\n.mj-inspector__btn--ghost[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover) !important;\n border-color: var(--mj-border-default) !important;\n}\n\n.se-detail-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 14px 16px;\n}\n.se-detail-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n}\n.se-detail-updated[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.se-detail-value[_ngcontent-%COMP%] {\n margin: 0;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 12px 14px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 100%;\n overflow: auto;\n}\n\n.se-empty[_ngcontent-%COMP%] {\n padding: 60px 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n.se-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 28px; opacity: 0.7; }\n\n@media (max-width: 900px) {\n .se-body[_ngcontent-%COMP%] { flex-direction: column; }\n .se-detail[_ngcontent-%COMP%] { width: 100%; max-height: 50%; border-left: none; border-top: 1px solid var(--mj-border-default); }\n .se-toolbar[_ngcontent-%COMP%] { flex-direction: column; align-items: stretch; gap: 10px; }\n .se-search-wrap[_ngcontent-%COMP%] { max-width: 100%; }\n}"] });
374
+ } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i2.MJPageHeaderInteriorComponent, i2.MJRefreshButtonComponent], styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.mj-inspector[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n\n\n.mj-inspector__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n\n\n.mj-inspector__empty[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}", ".mj-inspector--solo[_ngcontent-%COMP%] { background: var(--mj-bg-page); }\n\n\n\n.se-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n.se-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 2px;\n background: var(--mj-bg-surface-sunken);\n padding: 3px;\n border-radius: 8px;\n}\n.se-tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-radius: 6px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 12.5px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.se-tab[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); }\n.se-tab--active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n}\n.se-count[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 10.5px;\n padding: 1px 7px;\n border-radius: 100px;\n font-weight: 600;\n}\n.se-tab--active[_ngcontent-%COMP%] .se-count[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.se-search-wrap[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n max-width: 360px;\n margin-left: auto;\n}\n.se-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.se-search[_ngcontent-%COMP%] {\n width: 100%;\n padding: 7px 32px 7px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12.5px;\n font-family: inherit;\n}\n.se-search[_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.se-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.se-search-clear[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n\n\n.se-body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.se-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n background: var(--mj-bg-page);\n}\n\n.se-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n}\n.se-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n background: var(--mj-bg-surface);\n box-shadow: 0 1px 0 var(--mj-border-subtle);\n}\n.se-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 10px 18px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.se-th-type[_ngcontent-%COMP%] { width: 100px; }\n.se-th-value[_ngcontent-%COMP%] { }\n.se-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 8px 18px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: top;\n cursor: pointer;\n}\n.se-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.se-row--selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent) !important;\n}\n.se-row--selected[_ngcontent-%COMP%] td[_ngcontent-%COMP%]:first-child {\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n}\n\n.se-td-key[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.se-td-meta[_ngcontent-%COMP%] {\n margin-top: 3px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.se-td-value[_ngcontent-%COMP%] {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 0;\n}\n\n.se-type-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10px;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 100px;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n}\n.se-type-pill--string[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); color: var(--mj-brand-primary); }\n.se-type-pill--number[_ngcontent-%COMP%] { background: color-mix(in srgb, #7c3aed 14%, transparent); color: #5b21b6; }\n.se-type-pill--boolean[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 14%, transparent); color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary)); }\n.se-type-pill--json[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary)); }\n.se-type-pill--empty[_ngcontent-%COMP%] { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n\n\n.se-detail[_ngcontent-%COMP%] {\n width: 420px;\n flex-shrink: 0;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n.se-detail-head[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.se-detail-key[_ngcontent-%COMP%] {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-all;\n}\n.se-detail-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n.se-detail-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.se-detail-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 14px 16px;\n}\n.se-detail-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n}\n.se-detail-updated[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.se-detail-value[_ngcontent-%COMP%] {\n margin: 0;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 12px 14px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 100%;\n overflow: auto;\n}\n\n.se-empty[_ngcontent-%COMP%] {\n padding: 60px 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n.se-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 28px; opacity: 0.7; }\n\n@media (max-width: 900px) {\n .se-body[_ngcontent-%COMP%] { flex-direction: column; }\n .se-detail[_ngcontent-%COMP%] { width: 100%; max-height: 50%; border-left: none; border-top: 1px solid var(--mj-border-default); }\n .se-toolbar[_ngcontent-%COMP%] { flex-direction: column; align-items: stretch; gap: 10px; }\n .se-search-wrap[_ngcontent-%COMP%] { max-width: 100%; }\n}"] });
384
375
  };
385
376
  SettingsExplorerComponent = __decorate([
386
377
  RegisterClass(BaseResourceComponent, 'SettingsExplorerInspector')
@@ -388,7 +379,7 @@ SettingsExplorerComponent = __decorate([
388
379
  export { SettingsExplorerComponent };
389
380
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SettingsExplorerComponent, [{
390
381
  type: Component,
391
- args: [{ standalone: false, selector: 'mj-settings-explorer', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-sliders\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">Settings Explorer</h3>\n <div class=\"mj-inspector__header-sub\">User settings and instance-level configuration</div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n\n <div class=\"se-toolbar\">\n <div class=\"se-tabs\">\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'user'\"\n (click)=\"OnScopeChange('user')\">\n <i class=\"fa-solid fa-user\"></i>\n User Settings\n <span class=\"se-count\">{{ Counts.user }}</span>\n </button>\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'instance'\"\n (click)=\"OnScopeChange('instance')\">\n <i class=\"fa-solid fa-server\"></i>\n Instance Configurations\n <span class=\"se-count\">{{ Counts.instance }}</span>\n </button>\n </div>\n <div class=\"se-search-wrap\">\n <i class=\"fa-solid fa-search se-search-icon\"></i>\n <input type=\"search\"\n class=\"se-search\"\n placeholder=\"Search keys or values\u2026\"\n [(ngModel)]=\"SearchQuery\"\n (ngModelChange)=\"PersistPrefs()\" />\n @if (SearchQuery) {\n <button class=\"se-search-clear\" (click)=\"SearchQuery = ''\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"se-body\">\n <div class=\"se-list\">\n @if (FilteredRows.length === 0) {\n <div class=\"se-empty\">\n @if (SearchQuery) {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches for \"{{ SearchQuery }}\"</span>\n } @else {\n <i class=\"fa-regular fa-folder-open\"></i>\n <span>No {{ Scope === 'user' ? 'user settings' : 'instance configurations' }} are defined.</span>\n }\n </div>\n } @else {\n <table class=\"se-table\">\n <thead>\n <tr>\n <th class=\"se-th-key\">Key</th>\n <th class=\"se-th-type\">Type</th>\n <th class=\"se-th-value\">Value</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredRows; track TrackByKey($index, row)) {\n <tr [class.se-row--selected]=\"Selected?.key === row.key\"\n (click)=\"OnRowClick(row)\">\n <td class=\"se-td-key\">\n <code>{{ row.key }}</code>\n @if (row.meta) {\n <div class=\"se-td-meta\">{{ row.meta }}</div>\n }\n </td>\n <td class=\"se-td-type\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + row.valueType\">\n {{ row.valueType }}\n </span>\n </td>\n <td class=\"se-td-value\">{{ row.preview }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n\n @if (Selected) {\n <aside class=\"se-detail\">\n <div class=\"se-detail-head\">\n <div>\n <div class=\"se-detail-key\">{{ Selected.key }}</div>\n @if (Selected.meta) {\n <div class=\"se-detail-meta\">{{ Selected.meta }}</div>\n }\n </div>\n <div class=\"se-detail-actions\">\n <button class=\"mj-inspector__btn\" (click)=\"OnCopySelected()\" title=\"Copy value\">\n <i class=\"fa-solid fa-clipboard\"></i> Copy\n </button>\n <button class=\"mj-inspector__btn mj-inspector__btn--ghost\" (click)=\"Selected = null\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n <div class=\"se-detail-body\">\n <div class=\"se-detail-meta-row\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + Selected.valueType\">{{ Selected.valueType }}</span>\n @if (Selected.updated) {\n <span class=\"se-detail-updated\">Updated {{ Selected.updated.toLocaleString() }}</span>\n }\n </div>\n <pre class=\"se-detail-value\"><code>{{ FormattedSelected || '(empty)' }}</code></pre>\n </div>\n </aside>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n.mj-inspector {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n/* Header */\n.mj-inspector__header {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.mj-inspector__header-icon {\n width: 36px; height: 36px;\n border-radius: 9px;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: white;\n display: flex; align-items: center; justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n}\n.mj-inspector__header-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-inspector__header-sub {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-inspector__header-spacer { flex: 1; }\n.mj-inspector__header-actions {\n display: flex; gap: 6px;\n}\n.mj-inspector__btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.mj-inspector__btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__btn--success {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-border-default));\n}\n\n/* Layout: sidebar + content */\n.mj-inspector__body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.mj-inspector__sidebar {\n width: 220px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n flex-shrink: 0;\n padding: 8px;\n}\n.mj-inspector__nav-item {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n margin-bottom: 2px;\n font-family: inherit;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n text-align: left;\n width: 100%;\n}\n.mj-inspector__nav-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.mj-inspector__nav-item--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__nav-item--active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.mj-inspector__nav-icon {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n}\n.mj-inspector__nav-text { flex: 1; min-width: 0; }\n.mj-inspector__nav-label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.mj-inspector__nav-desc {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.mj-inspector__nav-item--active .mj-inspector__nav-desc {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n/* Content area */\n.mj-inspector__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor mj-code-editor {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty state */\n.mj-inspector__empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n@media (max-width: 700px) {\n .mj-inspector__body { flex-direction: column; }\n .mj-inspector__sidebar {\n width: 100%;\n height: auto;\n max-height: 200px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n .mj-inspector__nav-item { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .mj-inspector__nav-desc { display: none; }\n .mj-inspector__header { padding: 12px 14px; gap: 10px; }\n}\n", ".mj-inspector--solo { background: var(--mj-bg-page); }\n\n/* Toolbar */\n.se-toolbar {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n.se-tabs {\n display: flex;\n gap: 2px;\n background: var(--mj-bg-surface-sunken);\n padding: 3px;\n border-radius: 8px;\n}\n.se-tab {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-radius: 6px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 12.5px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.se-tab:hover { color: var(--mj-text-primary); }\n.se-tab--active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n}\n.se-count {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 10.5px;\n padding: 1px 7px;\n border-radius: 100px;\n font-weight: 600;\n}\n.se-tab--active .se-count {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.se-search-wrap {\n position: relative;\n flex: 1;\n max-width: 360px;\n margin-left: auto;\n}\n.se-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.se-search {\n width: 100%;\n padding: 7px 32px 7px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12.5px;\n font-family: inherit;\n}\n.se-search: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.se-search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.se-search-clear:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n/* Body */\n.se-body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.se-list {\n flex: 1;\n overflow: auto;\n background: var(--mj-bg-page);\n}\n\n.se-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n}\n.se-table thead {\n position: sticky;\n top: 0;\n z-index: 1;\n background: var(--mj-bg-surface);\n box-shadow: 0 1px 0 var(--mj-border-subtle);\n}\n.se-table th {\n text-align: left;\n padding: 10px 18px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.se-th-type { width: 100px; }\n.se-th-value { }\n.se-table td {\n padding: 8px 18px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: top;\n cursor: pointer;\n}\n.se-table tbody tr:hover { background: var(--mj-bg-surface-hover); }\n.se-row--selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent) !important;\n}\n.se-row--selected td:first-child {\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n}\n\n.se-td-key code {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.se-td-meta {\n margin-top: 3px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.se-td-value {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 0;\n}\n\n.se-type-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10px;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 100px;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n}\n.se-type-pill--string { background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); color: var(--mj-brand-primary); }\n.se-type-pill--number { background: color-mix(in srgb, #7c3aed 14%, transparent); color: #5b21b6; }\n.se-type-pill--boolean { background: color-mix(in srgb, var(--mj-status-success) 14%, transparent); color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary)); }\n.se-type-pill--json { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary)); }\n.se-type-pill--empty { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* Detail panel */\n.se-detail {\n width: 420px;\n flex-shrink: 0;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n.se-detail-head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.se-detail-key {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-all;\n}\n.se-detail-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n.se-detail-actions {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n.mj-inspector__btn--ghost {\n background: transparent !important;\n border: 1px solid transparent !important;\n}\n.mj-inspector__btn--ghost:hover {\n background: var(--mj-bg-surface-hover) !important;\n border-color: var(--mj-border-default) !important;\n}\n\n.se-detail-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 14px 16px;\n}\n.se-detail-meta-row {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n}\n.se-detail-updated {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.se-detail-value {\n margin: 0;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 12px 14px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 100%;\n overflow: auto;\n}\n\n.se-empty {\n padding: 60px 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n.se-empty i { font-size: 28px; opacity: 0.7; }\n\n@media (max-width: 900px) {\n .se-body { flex-direction: column; }\n .se-detail { width: 100%; max-height: 50%; border-left: none; border-top: 1px solid var(--mj-border-default); }\n .se-toolbar { flex-direction: column; align-items: stretch; gap: 10px; }\n .se-search-wrap { max-width: 100%; }\n}\n"] }]
382
+ args: [{ standalone: false, selector: 'mj-settings-explorer', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Settings explorer\"\n Title=\"Settings Explorer\"\n Subtitle=\"User settings and instance-level configuration\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"se-toolbar\">\n <div class=\"se-tabs\">\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'user'\"\n (click)=\"OnScopeChange('user')\">\n <i class=\"fa-solid fa-user\"></i>\n User Settings\n <span class=\"se-count\">{{ Counts.user }}</span>\n </button>\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'instance'\"\n (click)=\"OnScopeChange('instance')\">\n <i class=\"fa-solid fa-server\"></i>\n Instance Configurations\n <span class=\"se-count\">{{ Counts.instance }}</span>\n </button>\n </div>\n <div class=\"se-search-wrap\">\n <i class=\"fa-solid fa-search se-search-icon\"></i>\n <input type=\"search\"\n class=\"se-search\"\n placeholder=\"Search keys or values\u2026\"\n [(ngModel)]=\"SearchQuery\"\n (ngModelChange)=\"PersistPrefs()\" />\n @if (SearchQuery) {\n <button class=\"se-search-clear\" (click)=\"SearchQuery = ''\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"se-body\">\n <div class=\"se-list\">\n @if (FilteredRows.length === 0) {\n <div class=\"se-empty\">\n @if (SearchQuery) {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches for \"{{ SearchQuery }}\"</span>\n } @else {\n <i class=\"fa-regular fa-folder-open\"></i>\n <span>No {{ Scope === 'user' ? 'user settings' : 'instance configurations' }} are defined.</span>\n }\n </div>\n } @else {\n <table class=\"se-table\">\n <thead>\n <tr>\n <th class=\"se-th-key\">Key</th>\n <th class=\"se-th-type\">Type</th>\n <th class=\"se-th-value\">Value</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredRows; track TrackByKey($index, row)) {\n <tr [class.se-row--selected]=\"Selected?.key === row.key\"\n (click)=\"OnRowClick(row)\">\n <td class=\"se-td-key\">\n <code>{{ row.key }}</code>\n @if (row.meta) {\n <div class=\"se-td-meta\">{{ row.meta }}</div>\n }\n </td>\n <td class=\"se-td-type\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + row.valueType\">\n {{ row.valueType }}\n </span>\n </td>\n <td class=\"se-td-value\">{{ row.preview }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n\n @if (Selected) {\n <aside class=\"se-detail\">\n <div class=\"se-detail-head\">\n <div>\n <div class=\"se-detail-key\">{{ Selected.key }}</div>\n @if (Selected.meta) {\n <div class=\"se-detail-meta\">{{ Selected.meta }}</div>\n }\n </div>\n <div class=\"se-detail-actions\">\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnCopySelected()\" title=\"Copy value\">\n <i class=\"fa-solid fa-clipboard\" aria-hidden=\"true\"></i> Copy\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"Selected = null\" title=\"Close\" aria-label=\"Close detail\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"se-detail-body\">\n <div class=\"se-detail-meta-row\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + Selected.valueType\">{{ Selected.valueType }}</span>\n @if (Selected.updated) {\n <span class=\"se-detail-updated\">Updated {{ Selected.updated.toLocaleString() }}</span>\n }\n </div>\n <pre class=\"se-detail-value\"><code>{{ FormattedSelected || '(empty)' }}</code></pre>\n </div>\n </aside>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n/*\n Inspector shell \u2014 each Dev Tools sub-page wraps its body in .mj-inspector. The\n chrome (title icon, title, subtitle, action buttons) was previously rendered\n via .mj-inspector__header*, but that's been replaced by <mj-page-header-interior>\n in every inspector template. Action buttons now use the mjButton directive\n (variant=\"secondary\" / \"success\") so they inherit global button styling. App\n State + Layout inspectors used to carry an inner left rail (.mj-inspector__body\n + __sidebar + __nav-item) for L2 sections; that rail was retired 2026-05-19 in\n favor of <mj-tab-nav> projected into the chrome's [toolbar] slot, matching\n SystemDiagnostics and the API Keys tab strip. All inspectors are now \"solo\"\n mode (no sidebar).\n*/\n.mj-inspector {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n/* Content area */\n.mj-inspector__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor mj-code-editor {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty state */\n.mj-inspector__empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n", ".mj-inspector--solo { background: var(--mj-bg-page); }\n\n/* Toolbar */\n.se-toolbar {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n.se-tabs {\n display: flex;\n gap: 2px;\n background: var(--mj-bg-surface-sunken);\n padding: 3px;\n border-radius: 8px;\n}\n.se-tab {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-radius: 6px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 12.5px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.se-tab:hover { color: var(--mj-text-primary); }\n.se-tab--active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n}\n.se-count {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 10.5px;\n padding: 1px 7px;\n border-radius: 100px;\n font-weight: 600;\n}\n.se-tab--active .se-count {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.se-search-wrap {\n position: relative;\n flex: 1;\n max-width: 360px;\n margin-left: auto;\n}\n.se-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.se-search {\n width: 100%;\n padding: 7px 32px 7px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12.5px;\n font-family: inherit;\n}\n.se-search: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.se-search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.se-search-clear:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n/* Body */\n.se-body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.se-list {\n flex: 1;\n overflow: auto;\n background: var(--mj-bg-page);\n}\n\n.se-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n}\n.se-table thead {\n position: sticky;\n top: 0;\n z-index: 1;\n background: var(--mj-bg-surface);\n box-shadow: 0 1px 0 var(--mj-border-subtle);\n}\n.se-table th {\n text-align: left;\n padding: 10px 18px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n.se-th-type { width: 100px; }\n.se-th-value { }\n.se-table td {\n padding: 8px 18px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: top;\n cursor: pointer;\n}\n.se-table tbody tr:hover { background: var(--mj-bg-surface-hover); }\n.se-row--selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent) !important;\n}\n.se-row--selected td:first-child {\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n}\n\n.se-td-key code {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.se-td-meta {\n margin-top: 3px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.se-td-value {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 0;\n}\n\n.se-type-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10px;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 100px;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n}\n.se-type-pill--string { background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent); color: var(--mj-brand-primary); }\n.se-type-pill--number { background: color-mix(in srgb, #7c3aed 14%, transparent); color: #5b21b6; }\n.se-type-pill--boolean { background: color-mix(in srgb, var(--mj-status-success) 14%, transparent); color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary)); }\n.se-type-pill--json { background: color-mix(in srgb, var(--mj-status-warning) 14%, transparent); color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary)); }\n.se-type-pill--empty { background: var(--mj-bg-surface-sunken); color: var(--mj-text-muted); }\n\n/* Detail panel */\n.se-detail {\n width: 420px;\n flex-shrink: 0;\n border-left: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n.se-detail-head {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 12px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.se-detail-key {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n word-break: break-all;\n}\n.se-detail-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n}\n.se-detail-actions {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.se-detail-body {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 14px 16px;\n}\n.se-detail-meta-row {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n}\n.se-detail-updated {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.se-detail-value {\n margin: 0;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n padding: 12px 14px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 100%;\n overflow: auto;\n}\n\n.se-empty {\n padding: 60px 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n.se-empty i { font-size: 28px; opacity: 0.7; }\n\n@media (max-width: 900px) {\n .se-body { flex-direction: column; }\n .se-detail { width: 100%; max-height: 50%; border-left: none; border-top: 1px solid var(--mj-border-default); }\n .se-toolbar { flex-direction: column; align-items: stretch; gap: 10px; }\n .se-search-wrap { max-width: 100%; }\n}\n"] }]
392
383
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
393
384
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SettingsExplorerComponent, { className: "SettingsExplorerComponent", filePath: "src/DevTools/settings-explorer.component.ts", lineNumber: 39 }); })();
394
385
  //# sourceMappingURL=settings-explorer.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-explorer.component.js","sourceRoot":"","sources":["../../src/DevTools/settings-explorer.component.ts","../../src/DevTools/settings-explorer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport {\n UserInfoEngine,\n InstanceConfigEngine,\n MJUserSettingEntity,\n MJInstanceConfigurationEntity\n} from '@memberjunction/core-entities';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\ninterface SettingRow {\n key: string;\n rawValue: string;\n parsedValue: unknown;\n valueType: 'string' | 'number' | 'boolean' | 'json' | 'empty';\n /** Pretty preview shown in the table cell. */\n preview: string;\n /** Optional secondary metadata shown next to the key. */\n meta?: string;\n updated?: Date | null;\n}\n\ntype SettingsScope = 'user' | 'instance';\n\n/**\n * Settings Explorer — read-only browser for both `MJ: User Settings` (the\n * current user's per-app key/value bag) and `MJ: Instance Configurations`\n * (instance-level feature flags). Auto-detects JSON values, formats them\n * nicely, supports search + copy.\n */\n@RegisterClass(BaseResourceComponent, 'SettingsExplorerInspector')\n@Component({\n standalone: false,\n selector: 'mj-settings-explorer',\n templateUrl: './settings-explorer.component.html',\n styleUrls: ['./inspector-shared.css', './settings-explorer.component.css']\n})\nexport class SettingsExplorerComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Scope: SettingsScope = 'user';\n public UserRows: SettingRow[] = [];\n public InstanceRows: SettingRow[] = [];\n public SearchQuery = '';\n public Selected: SettingRow | null = null;\n public LastRefreshed = new Date();\n\n public Counts = { user: 0, instance: 0 };\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ scope?: SettingsScope; search?: string }>('settingsExplorer');\n if (p?.scope) this.Scope = p.scope;\n if (p?.search) this.SearchQuery = p.search;\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('settingsExplorer', { scope: this.Scope, search: this.SearchQuery });\n super.ngOnDestroy();\n }\n\n public PersistPrefs(): void {\n DevToolsPrefs.Save('settingsExplorer', { scope: this.Scope, search: this.SearchQuery });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Settings Explorer'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-sliders'; }\n\n public refresh(): void {\n const userSettings = UserInfoEngine.Instance.UserSettings ?? [];\n this.UserRows = userSettings.map(s => this.toRow(s.Setting ?? '(no key)', s.Value ?? '', s.User ? `User: ${s.User}` : undefined, s.__mj_UpdatedAt));\n\n const instanceConfigs = InstanceConfigEngine.Instance.InstanceConfigs ?? [];\n this.InstanceRows = instanceConfigs.map(c => this.toRow(\n c.FeatureKey ?? '(no key)',\n c.Value ?? '',\n this.buildInstanceMeta(c),\n c.__mj_UpdatedAt\n ));\n\n this.Counts = { user: this.UserRows.length, instance: this.InstanceRows.length };\n\n // Sort each list by key\n this.UserRows.sort((a, b) => a.key.localeCompare(b.key));\n this.InstanceRows.sort((a, b) => a.key.localeCompare(b.key));\n\n // Re-resolve selection if it still exists\n if (this.Selected) {\n const list = this.Scope === 'user' ? this.UserRows : this.InstanceRows;\n this.Selected = list.find(r => r.key === this.Selected!.key) ?? null;\n }\n\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public OnScopeChange(scope: SettingsScope): void {\n this.Scope = scope;\n this.Selected = null;\n this.PersistPrefs();\n }\n\n public get FilteredRows(): SettingRow[] {\n const list = this.Scope === 'user' ? this.UserRows : this.InstanceRows;\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) return list;\n return list.filter(r => r.key.toLowerCase().includes(q) || r.rawValue.toLowerCase().includes(q));\n }\n\n public OnRowClick(row: SettingRow): void {\n this.Selected = this.Selected?.key === row.key ? null : row;\n }\n\n public async OnCopySelected(): Promise<void> {\n if (!this.Selected) return;\n const text = this.Selected.valueType === 'json'\n ? JSON.stringify(this.Selected.parsedValue, null, 2)\n : this.Selected.rawValue;\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // unavailable\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get FormattedSelected(): string {\n if (!this.Selected) return '';\n if (this.Selected.valueType === 'json') {\n return JSON.stringify(this.Selected.parsedValue, null, 2);\n }\n return this.Selected.rawValue;\n }\n\n public TrackByKey = (_i: number, r: SettingRow) => r.key;\n\n // ---------- private ----------\n\n private buildInstanceMeta(c: MJInstanceConfigurationEntity): string | undefined {\n const parts: string[] = [];\n if (c.Category) parts.push(c.Category);\n if (c.DisplayName && c.DisplayName !== c.FeatureKey) parts.push(c.DisplayName);\n return parts.length ? parts.join(' · ') : undefined;\n }\n\n private toRow(key: string, rawValue: string, meta: string | undefined, updated: Date | string | null | undefined): SettingRow {\n const raw = rawValue ?? '';\n let valueType: SettingRow['valueType'] = 'string';\n let parsedValue: unknown = raw;\n let preview = raw;\n\n if (raw === '') {\n valueType = 'empty';\n preview = '(empty)';\n } else if (raw === 'true' || raw === 'false') {\n valueType = 'boolean';\n parsedValue = raw === 'true';\n } else if (/^-?\\d+(\\.\\d+)?$/.test(raw) && raw.length < 20) {\n valueType = 'number';\n parsedValue = Number(raw);\n } else if ((raw.startsWith('{') && raw.endsWith('}')) || (raw.startsWith('[') && raw.endsWith(']'))) {\n try {\n parsedValue = JSON.parse(raw);\n valueType = 'json';\n preview = this.summarizeJson(parsedValue);\n } catch {\n // not actually JSON — leave as string\n }\n }\n\n if (preview.length > 80) preview = preview.slice(0, 77) + '…';\n\n return {\n key,\n rawValue: raw,\n parsedValue,\n valueType,\n preview,\n meta,\n updated: updated ? (updated instanceof Date ? updated : new Date(updated)) : null\n };\n }\n\n private summarizeJson(value: unknown): string {\n if (Array.isArray(value)) return `[ ${value.length} item${value.length === 1 ? '' : 's'} ]`;\n if (value && typeof value === 'object') {\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.length === 0) return '{ }';\n return `{ ${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', …' : ''} }`;\n }\n return String(value);\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-sliders\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">Settings Explorer</h3>\n <div class=\"mj-inspector__header-sub\">User settings and instance-level configuration</div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n\n <div class=\"se-toolbar\">\n <div class=\"se-tabs\">\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'user'\"\n (click)=\"OnScopeChange('user')\">\n <i class=\"fa-solid fa-user\"></i>\n User Settings\n <span class=\"se-count\">{{ Counts.user }}</span>\n </button>\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'instance'\"\n (click)=\"OnScopeChange('instance')\">\n <i class=\"fa-solid fa-server\"></i>\n Instance Configurations\n <span class=\"se-count\">{{ Counts.instance }}</span>\n </button>\n </div>\n <div class=\"se-search-wrap\">\n <i class=\"fa-solid fa-search se-search-icon\"></i>\n <input type=\"search\"\n class=\"se-search\"\n placeholder=\"Search keys or values…\"\n [(ngModel)]=\"SearchQuery\"\n (ngModelChange)=\"PersistPrefs()\" />\n @if (SearchQuery) {\n <button class=\"se-search-clear\" (click)=\"SearchQuery = ''\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"se-body\">\n <div class=\"se-list\">\n @if (FilteredRows.length === 0) {\n <div class=\"se-empty\">\n @if (SearchQuery) {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches for \"{{ SearchQuery }}\"</span>\n } @else {\n <i class=\"fa-regular fa-folder-open\"></i>\n <span>No {{ Scope === 'user' ? 'user settings' : 'instance configurations' }} are defined.</span>\n }\n </div>\n } @else {\n <table class=\"se-table\">\n <thead>\n <tr>\n <th class=\"se-th-key\">Key</th>\n <th class=\"se-th-type\">Type</th>\n <th class=\"se-th-value\">Value</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredRows; track TrackByKey($index, row)) {\n <tr [class.se-row--selected]=\"Selected?.key === row.key\"\n (click)=\"OnRowClick(row)\">\n <td class=\"se-td-key\">\n <code>{{ row.key }}</code>\n @if (row.meta) {\n <div class=\"se-td-meta\">{{ row.meta }}</div>\n }\n </td>\n <td class=\"se-td-type\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + row.valueType\">\n {{ row.valueType }}\n </span>\n </td>\n <td class=\"se-td-value\">{{ row.preview }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n\n @if (Selected) {\n <aside class=\"se-detail\">\n <div class=\"se-detail-head\">\n <div>\n <div class=\"se-detail-key\">{{ Selected.key }}</div>\n @if (Selected.meta) {\n <div class=\"se-detail-meta\">{{ Selected.meta }}</div>\n }\n </div>\n <div class=\"se-detail-actions\">\n <button class=\"mj-inspector__btn\" (click)=\"OnCopySelected()\" title=\"Copy value\">\n <i class=\"fa-solid fa-clipboard\"></i> Copy\n </button>\n <button class=\"mj-inspector__btn mj-inspector__btn--ghost\" (click)=\"Selected = null\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n <div class=\"se-detail-body\">\n <div class=\"se-detail-meta-row\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + Selected.valueType\">{{ Selected.valueType }}</span>\n @if (Selected.updated) {\n <span class=\"se-detail-updated\">Updated {{ Selected.updated.toLocaleString() }}</span>\n }\n </div>\n <pre class=\"se-detail-value\"><code>{{ FormattedSelected || '(empty)' }}</code></pre>\n </div>\n </aside>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n"]}
1
+ {"version":3,"file":"settings-explorer.component.js","sourceRoot":"","sources":["../../src/DevTools/settings-explorer.component.ts","../../src/DevTools/settings-explorer.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACH,cAAc,EACd,oBAAoB,EAGvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;;;;;;IC6BlC,kCAAyE;IAAzC,mNAAuB,EAAE,KAAC;IACtD,wBAAiC;IACrC,iBAAS;;;IAUD,wBAA4C;IAC5C,4BAAM;IAAA,YAAkC;IAAA,iBAAO;;;IAAzC,eAAkC;IAAlC,oEAAkC;;;IAExC,wBAAyC;IACzC,4BAAM;IAAA,YAAoF;IAAA,iBAAO;;;IAA3F,eAAoF;IAApF,oHAAoF;;;IANlG,+BAAsB;IAIhB,AAHF,gGAAmB,0EAGV;IAIb,iBAAM;;;IAPF,cAMC;IAND,4CAMC;;;IAkBmB,+BAAwB;IAAA,YAAc;IAAA,iBAAM;;;IAApB,cAAc;IAAd,iCAAc;;;;IALlD,8BAC8B;IAA1B,2NAAS,yBAAe,KAAC;IAErB,AADJ,8BAAsB,WACZ;IAAA,YAAa;IAAA,iBAAO;IAC1B,kHAAgB;IAGpB,iBAAK;IAED,AADJ,8BAAuB,eACmD;IAClE,YACJ;IACJ,AADI,iBAAO,EACN;IACL,8BAAwB;IAAA,YAAiB;IAC7C,AAD6C,iBAAK,EAC7C;;;;IAdD,yGAAoD;IAG1C,eAAa;IAAb,gCAAa;IACnB,cAEC;IAFD,sCAEC;IAG0B,eAA0C;IAA1C,kDAA0C;IACjE,cACJ;IADI,iDACJ;IAEoB,eAAiB;IAAjB,oCAAiB;;;IApB7C,AADJ,AADJ,AADJ,iCAAwB,YACb,SACC,aACsB;IAAA,mBAAG;IAAA,iBAAK;IAC9B,8BAAuB;IAAA,oBAAI;IAAA,iBAAK;IAChC,8BAAwB;IAAA,qBAAK;IAErC,AADI,AADiC,iBAAK,EACjC,EACD;IACR,6BAAO;IACH,6IAgBC;IAET,AADI,iBAAQ,EACJ;;;IAlBA,gBAgBC;IAhBD,kCAgBC;;;IAYG,+BAA4B;IAAA,YAAmB;IAAA,iBAAM;;;IAAzB,cAAmB;IAAnB,0CAAmB;;;IAgB/C,gCAAgC;IAAA,YAA+C;IAAA,iBAAO;;;IAAtD,cAA+C;IAA/C,2EAA+C;;;;IAlBnF,AADJ,AADJ,AADJ,iCAAyB,cACO,UACnB,cAC0B;IAAA,YAAkB;IAAA,iBAAM;IACnD,2GAAqB;IAGzB,iBAAM;IAEF,AADJ,+BAA+B,iBACkE;IAA9C,8LAAS,uBAAgB,KAAC;IACrE,wBAAwD;IAAC,sBAC7D;IAAA,iBAAS;IACT,mCAA4G;IAAlE,iNAAoB,IAAI,KAAC;IAC/D,yBAAoD;IAGhE,AADI,AADI,iBAAS,EACP,EACJ;IAGE,AADJ,AADJ,gCAA4B,eACQ,gBAC+C;IAAA,aAAwB;IAAA,iBAAO;IAC1G,8GAAwB;IAG5B,iBAAM;IACuB,AAA7B,gCAA6B,YAAM;IAAA,aAAoC;IAE/E,AADI,AADkF,AAAP,iBAAO,EAAM,EAClF,EACF;;;IAvB+B,eAAkB;IAAlB,yCAAkB;IAC7C,cAEC;IAFD,+CAEC;IAa0B,eAA+C;IAA/C,2DAA+C;IAAC,cAAwB;IAAxB,+CAAwB;IACnG,cAEC;IAFD,mDAEC;IAE8B,eAAoC;IAApC,2DAAoC;;ADzF3F;;;;;GAKG;AAQI,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,qBAAqB;IAW5C;IATb,KAAK,GAAkB,MAAM,CAAC;IAC9B,QAAQ,GAAiB,EAAE,CAAC;IAC5B,YAAY,GAAiB,EAAE,CAAC;IAChC,WAAW,GAAG,EAAE,CAAC;IACjB,QAAQ,GAAsB,IAAI,CAAC;IACnC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;IAE3B,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAEzC,YAAoB,GAAsB;QACtC,KAAK,EAAE,CAAC;QADQ,QAAG,GAAH,GAAG,CAAmB;IAE1C,CAAC;IAEM,QAAQ;QACX,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAA6C,kBAAkB,CAAC,CAAC;QAC5F,IAAI,CAAC,EAAE,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,EAAE,MAAM;YAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAEe,WAAW;QACvB,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACxF,KAAK,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC;IAEM,YAAY;QACf,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5F,CAAC;IAEe,KAAK,CAAC,sBAAsB,KAAsB,OAAO,mBAAmB,CAAC,CAAC,CAAC;IAC/E,KAAK,CAAC,oBAAoB,KAAsB,OAAO,qBAAqB,CAAC,CAAC,CAAC;IAExF,OAAO;QACV,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAEpJ,MAAM,eAAe,GAAG,oBAAoB,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC;QAC5E,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CACnD,CAAC,CAAC,UAAU,IAAI,UAAU,EAC1B,CAAC,CAAC,KAAK,IAAI,EAAE,EACb,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EACzB,CAAC,CAAC,cAAc,CACnB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAEjF,wBAAwB;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7D,0CAA0C;QAC1C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;YACvE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QACzE,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,aAAa,CAAC,KAAoB;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,IAAW,YAAY;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;QACvE,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC;IAEM,UAAU,CAAC,GAAe;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,cAAc;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,MAAM;YAC3C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACL,cAAc;QAClB,CAAC;IACL,CAAC;IAED,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;IACnD,CAAC;IAED,IAAW,iBAAiB;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAClC,CAAC;IAEM,UAAU,GAAG,CAAC,EAAU,EAAE,CAAa,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAEzD,gCAAgC;IAExB,iBAAiB,CAAC,CAAgC;QACtD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC/E,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,GAAW,EAAE,QAAgB,EAAE,IAAwB,EAAE,OAAyC;QAC5G,MAAM,GAAG,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC3B,IAAI,SAAS,GAA4B,QAAQ,CAAC;QAClD,IAAI,WAAW,GAAY,GAAG,CAAC;QAC/B,IAAI,OAAO,GAAG,GAAG,CAAC;QAElB,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACb,SAAS,GAAG,OAAO,CAAC;YACpB,OAAO,GAAG,SAAS,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3C,SAAS,GAAG,SAAS,CAAC;YACtB,WAAW,GAAG,GAAG,KAAK,MAAM,CAAC;QACjC,CAAC;aAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxD,SAAS,GAAG,QAAQ,CAAC;YACrB,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAClG,IAAI,CAAC;gBACD,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,SAAS,GAAG,MAAM,CAAC;gBACnB,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACL,sCAAsC;YAC1C,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;QAE9D,OAAO;YACH,GAAG;YACH,QAAQ,EAAE,GAAG;YACb,WAAW;YACX,SAAS;YACT,OAAO;YACP,IAAI;YACJ,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,YAAY,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;SACpF,CAAC;IACN,CAAC;IAEO,aAAa,CAAC,KAAc;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAC5F,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC;YAC3D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACpC,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAC/E,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;mHAjKQ,yBAAyB;6DAAzB,yBAAyB;YC/B1B,AADJ,AALJ,AADJ,8BAA6C,iCAKqB,aAC7C,2BACkD;YAAtB,qHAAW,aAAS,IAAC;YAElE,AADI,AAD+D,iBAAoB,EAC7E,EACgB;YAIlB,AADJ,AADJ,8BAAwB,aACC,gBAIuB;YAAhC,sGAAS,kBAAc,MAAM,CAAC,IAAC;YACnC,uBAAgC;YAChC,+BACA;YAAA,+BAAuB;YAAA,aAAiB;YAC5C,AAD4C,iBAAO,EAC1C;YACT,kCAG4C;YAApC,uGAAS,kBAAc,UAAU,CAAC,IAAC;YACvC,wBAAkC;YAClC,0CACA;YAAA,gCAAuB;YAAA,aAAqB;YAEpD,AADI,AADgD,iBAAO,EAC9C,EACP;YACN,gCAA4B;YACxB,yBAAiD;YACjD,kCAI0C;YADnC,0NAAyB;YACzB,sHAAiB,kBAAc,IAAC;YAJvC,iBAI0C;YAC1C,iGAAmB;YAM3B,AADI,iBAAM,EACJ;YAGF,AADJ,gCAAqB,eACI;YAWf,AAVF,8FAAiC,2EAUxB;YA8Bb,iBAAM;YAEN,iGAAgB;YA6BpB,iBAAM;YAEN,gCAAuC;YAAA,aAAkC;YAC7E,AAD6E,iBAAM,EAC7E;;YAlHyB,eAAiB;YAAjB,+BAAiB;YAQ5B,eAAyC;YAAzC,sDAAyC;YAItB,eAAiB;YAAjB,qCAAiB;YAIpC,cAA6C;YAA7C,0DAA6C;YAI1B,eAAqB;YAArB,yCAAqB;YAQzC,eAAyB;YAAzB,+CAAyB;YAEhC,cAIC;YAJD,2CAIC;YAMD,eAuCC;YAvCD,yDAuCC;YAGL,eA4BC;YA5BD,wCA4BC;YAGkC,eAAkC;YAAlC,2DAAkC;;;ADlFhE,yBAAyB;IAPrC,aAAa,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;GAOrD,yBAAyB,CAkKrC;;iFAlKY,yBAAyB;cANrC,SAAS;6BACM,KAAK,YACP,sBAAsB;;kFAIvB,yBAAyB","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport {\n UserInfoEngine,\n InstanceConfigEngine,\n MJUserSettingEntity,\n MJInstanceConfigurationEntity\n} from '@memberjunction/core-entities';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\ninterface SettingRow {\n key: string;\n rawValue: string;\n parsedValue: unknown;\n valueType: 'string' | 'number' | 'boolean' | 'json' | 'empty';\n /** Pretty preview shown in the table cell. */\n preview: string;\n /** Optional secondary metadata shown next to the key. */\n meta?: string;\n updated?: Date | null;\n}\n\ntype SettingsScope = 'user' | 'instance';\n\n/**\n * Settings Explorer — read-only browser for both `MJ: User Settings` (the\n * current user's per-app key/value bag) and `MJ: Instance Configurations`\n * (instance-level feature flags). Auto-detects JSON values, formats them\n * nicely, supports search + copy.\n */\n@RegisterClass(BaseResourceComponent, 'SettingsExplorerInspector')\n@Component({\n standalone: false,\n selector: 'mj-settings-explorer',\n templateUrl: './settings-explorer.component.html',\n styleUrls: ['./inspector-shared.css', './settings-explorer.component.css']\n})\nexport class SettingsExplorerComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Scope: SettingsScope = 'user';\n public UserRows: SettingRow[] = [];\n public InstanceRows: SettingRow[] = [];\n public SearchQuery = '';\n public Selected: SettingRow | null = null;\n public LastRefreshed = new Date();\n\n public Counts = { user: 0, instance: 0 };\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ scope?: SettingsScope; search?: string }>('settingsExplorer');\n if (p?.scope) this.Scope = p.scope;\n if (p?.search) this.SearchQuery = p.search;\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('settingsExplorer', { scope: this.Scope, search: this.SearchQuery });\n super.ngOnDestroy();\n }\n\n public PersistPrefs(): void {\n DevToolsPrefs.Save('settingsExplorer', { scope: this.Scope, search: this.SearchQuery });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Settings Explorer'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-sliders'; }\n\n public refresh(): void {\n const userSettings = UserInfoEngine.Instance.UserSettings ?? [];\n this.UserRows = userSettings.map(s => this.toRow(s.Setting ?? '(no key)', s.Value ?? '', s.User ? `User: ${s.User}` : undefined, s.__mj_UpdatedAt));\n\n const instanceConfigs = InstanceConfigEngine.Instance.InstanceConfigs ?? [];\n this.InstanceRows = instanceConfigs.map(c => this.toRow(\n c.FeatureKey ?? '(no key)',\n c.Value ?? '',\n this.buildInstanceMeta(c),\n c.__mj_UpdatedAt\n ));\n\n this.Counts = { user: this.UserRows.length, instance: this.InstanceRows.length };\n\n // Sort each list by key\n this.UserRows.sort((a, b) => a.key.localeCompare(b.key));\n this.InstanceRows.sort((a, b) => a.key.localeCompare(b.key));\n\n // Re-resolve selection if it still exists\n if (this.Selected) {\n const list = this.Scope === 'user' ? this.UserRows : this.InstanceRows;\n this.Selected = list.find(r => r.key === this.Selected!.key) ?? null;\n }\n\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public OnScopeChange(scope: SettingsScope): void {\n this.Scope = scope;\n this.Selected = null;\n this.PersistPrefs();\n }\n\n public get FilteredRows(): SettingRow[] {\n const list = this.Scope === 'user' ? this.UserRows : this.InstanceRows;\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) return list;\n return list.filter(r => r.key.toLowerCase().includes(q) || r.rawValue.toLowerCase().includes(q));\n }\n\n public OnRowClick(row: SettingRow): void {\n this.Selected = this.Selected?.key === row.key ? null : row;\n }\n\n public async OnCopySelected(): Promise<void> {\n if (!this.Selected) return;\n const text = this.Selected.valueType === 'json'\n ? JSON.stringify(this.Selected.parsedValue, null, 2)\n : this.Selected.rawValue;\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // unavailable\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get FormattedSelected(): string {\n if (!this.Selected) return '';\n if (this.Selected.valueType === 'json') {\n return JSON.stringify(this.Selected.parsedValue, null, 2);\n }\n return this.Selected.rawValue;\n }\n\n public TrackByKey = (_i: number, r: SettingRow) => r.key;\n\n // ---------- private ----------\n\n private buildInstanceMeta(c: MJInstanceConfigurationEntity): string | undefined {\n const parts: string[] = [];\n if (c.Category) parts.push(c.Category);\n if (c.DisplayName && c.DisplayName !== c.FeatureKey) parts.push(c.DisplayName);\n return parts.length ? parts.join(' · ') : undefined;\n }\n\n private toRow(key: string, rawValue: string, meta: string | undefined, updated: Date | string | null | undefined): SettingRow {\n const raw = rawValue ?? '';\n let valueType: SettingRow['valueType'] = 'string';\n let parsedValue: unknown = raw;\n let preview = raw;\n\n if (raw === '') {\n valueType = 'empty';\n preview = '(empty)';\n } else if (raw === 'true' || raw === 'false') {\n valueType = 'boolean';\n parsedValue = raw === 'true';\n } else if (/^-?\\d+(\\.\\d+)?$/.test(raw) && raw.length < 20) {\n valueType = 'number';\n parsedValue = Number(raw);\n } else if ((raw.startsWith('{') && raw.endsWith('}')) || (raw.startsWith('[') && raw.endsWith(']'))) {\n try {\n parsedValue = JSON.parse(raw);\n valueType = 'json';\n preview = this.summarizeJson(parsedValue);\n } catch {\n // not actually JSON — leave as string\n }\n }\n\n if (preview.length > 80) preview = preview.slice(0, 77) + '…';\n\n return {\n key,\n rawValue: raw,\n parsedValue,\n valueType,\n preview,\n meta,\n updated: updated ? (updated instanceof Date ? updated : new Date(updated)) : null\n };\n }\n\n private summarizeJson(value: unknown): string {\n if (Array.isArray(value)) return `[ ${value.length} item${value.length === 1 ? '' : 's'} ]`;\n if (value && typeof value === 'object') {\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.length === 0) return '{ }';\n return `{ ${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', …' : ''} }`;\n }\n return String(value);\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Settings explorer\"\n Title=\"Settings Explorer\"\n Subtitle=\"User settings and instance-level configuration\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"se-toolbar\">\n <div class=\"se-tabs\">\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'user'\"\n (click)=\"OnScopeChange('user')\">\n <i class=\"fa-solid fa-user\"></i>\n User Settings\n <span class=\"se-count\">{{ Counts.user }}</span>\n </button>\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'instance'\"\n (click)=\"OnScopeChange('instance')\">\n <i class=\"fa-solid fa-server\"></i>\n Instance Configurations\n <span class=\"se-count\">{{ Counts.instance }}</span>\n </button>\n </div>\n <div class=\"se-search-wrap\">\n <i class=\"fa-solid fa-search se-search-icon\"></i>\n <input type=\"search\"\n class=\"se-search\"\n placeholder=\"Search keys or values…\"\n [(ngModel)]=\"SearchQuery\"\n (ngModelChange)=\"PersistPrefs()\" />\n @if (SearchQuery) {\n <button class=\"se-search-clear\" (click)=\"SearchQuery = ''\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"se-body\">\n <div class=\"se-list\">\n @if (FilteredRows.length === 0) {\n <div class=\"se-empty\">\n @if (SearchQuery) {\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches for \"{{ SearchQuery }}\"</span>\n } @else {\n <i class=\"fa-regular fa-folder-open\"></i>\n <span>No {{ Scope === 'user' ? 'user settings' : 'instance configurations' }} are defined.</span>\n }\n </div>\n } @else {\n <table class=\"se-table\">\n <thead>\n <tr>\n <th class=\"se-th-key\">Key</th>\n <th class=\"se-th-type\">Type</th>\n <th class=\"se-th-value\">Value</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredRows; track TrackByKey($index, row)) {\n <tr [class.se-row--selected]=\"Selected?.key === row.key\"\n (click)=\"OnRowClick(row)\">\n <td class=\"se-td-key\">\n <code>{{ row.key }}</code>\n @if (row.meta) {\n <div class=\"se-td-meta\">{{ row.meta }}</div>\n }\n </td>\n <td class=\"se-td-type\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + row.valueType\">\n {{ row.valueType }}\n </span>\n </td>\n <td class=\"se-td-value\">{{ row.preview }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n\n @if (Selected) {\n <aside class=\"se-detail\">\n <div class=\"se-detail-head\">\n <div>\n <div class=\"se-detail-key\">{{ Selected.key }}</div>\n @if (Selected.meta) {\n <div class=\"se-detail-meta\">{{ Selected.meta }}</div>\n }\n </div>\n <div class=\"se-detail-actions\">\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnCopySelected()\" title=\"Copy value\">\n <i class=\"fa-solid fa-clipboard\" aria-hidden=\"true\"></i> Copy\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"Selected = null\" title=\"Close\" aria-label=\"Close detail\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"se-detail-body\">\n <div class=\"se-detail-meta-row\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + Selected.valueType\">{{ Selected.valueType }}</span>\n @if (Selected.updated) {\n <span class=\"se-detail-updated\">Updated {{ Selected.updated.toLocaleString() }}</span>\n }\n </div>\n <pre class=\"se-detail-value\"><code>{{ FormattedSelected || '(empty)' }}</code></pre>\n </div>\n </aside>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n"]}
@@ -13,6 +13,8 @@ export declare class EntityAdminDashboardComponent extends BaseDashboard impleme
13
13
  filterPanelVisible: boolean;
14
14
  selectedEntity: EntityInfo | null;
15
15
  filteredEntities: EntityInfo[];
16
+ /** Total unfiltered entity count — feeds the chrome's X-of-Y badge. */
17
+ get TotalEntityCount(): number;
16
18
  private userStateChangeSubject;
17
19
  private hasLoadedUserState;
18
20
  private metadata;
@@ -1 +1 @@
1
- {"version":3,"file":"entity-admin-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/EntityAdmin/entity-admin-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAA0B,MAAM,sBAAsB,CAAC;AAI1E,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAuC,MAAM,+BAA+B,CAAC;;AAKlG,qBAOa,6BAA8B,SAAQ,aAAc,YAAW,aAAa,EAAE,SAAS;IACpD,YAAY,EAAG,qBAAqB,CAAC;IAE5E,SAAS,UAAS;IAClB,eAAe,UAAS;IACxB,cAAc,SAAM;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,kBAAkB,UAAQ;IAC1B,cAAc,EAAE,UAAU,GAAG,IAAI,CAAQ;IACzC,gBAAgB,EAAE,UAAU,EAAE,CAAM;IAG3C,OAAO,CAAC,sBAAsB,CAAoC;IAClE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,iBAAiB,CAAoC;IAE7D,eAAe,IAAI,IAAI;IASjB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxD,WAAW,IAAI,IAAI;IAK5B,SAAS,CAAC,aAAa,IAAI,IAAI;IAI/B,SAAS,CAAC,QAAQ,IAAI,IAAI;IAInB,iBAAiB,IAAI,IAAI;IAOzB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAkB7C,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAKjD,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIxC,YAAY,CAAC,KAAK,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAOjE,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAQ3C;;OAEG;YACW,yBAAyB;IA8BvC;;OAEG;YACW,uBAAuB;yCAlI1B,6BAA6B;2CAA7B,6BAA6B;CA4JzC"}
1
+ {"version":3,"file":"entity-admin-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/EntityAdmin/entity-admin-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAA0B,MAAM,sBAAsB,CAAC;AAI1E,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAuC,MAAM,+BAA+B,CAAC;;AAKlG,qBAOa,6BAA8B,SAAQ,aAAc,YAAW,aAAa,EAAE,SAAS;IACpD,YAAY,EAAG,qBAAqB,CAAC;IAE5E,SAAS,UAAS;IAClB,eAAe,UAAS;IACxB,cAAc,SAAM;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,kBAAkB,UAAQ;IAC1B,cAAc,EAAE,UAAU,GAAG,IAAI,CAAQ;IACzC,gBAAgB,EAAE,UAAU,EAAE,CAAM;IAE3C,uEAAuE;IACvE,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAGD,OAAO,CAAC,sBAAsB,CAAoC;IAClE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,iBAAiB,CAAoC;IAE7D,eAAe,IAAI,IAAI;IASjB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxD,WAAW,IAAI,IAAI;IAK5B,SAAS,CAAC,aAAa,IAAI,IAAI;IAI/B,SAAS,CAAC,QAAQ,IAAI,IAAI;IAInB,iBAAiB,IAAI,IAAI;IAOzB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAkB7C,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAKjD,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIxC,YAAY,CAAC,KAAK,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAOjE,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAQ3C;;OAEG;YACW,yBAAyB;IA8BvC;;OAEG;YACW,uBAAuB;yCAvI1B,6BAA6B;2CAA7B,6BAA6B;CAiKzC"}