@memberjunction/ng-dashboards 5.24.0 → 5.26.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 (284) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +233 -493
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
  6. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  7. package/dist/AI/components/agents/agent-editor.component.js +7 -7
  8. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +43 -6
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1135 -864
  12. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +4 -3
  14. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  15. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
  16. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  17. package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
  18. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  19. package/dist/AI/components/execution-monitoring.component.js +14 -15
  20. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  21. package/dist/AI/components/models/model-management.component.d.ts +4 -4
  22. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  23. package/dist/AI/components/models/model-management.component.js +5 -5
  24. package/dist/AI/components/models/model-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
  26. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  27. package/dist/AI/components/prompts/prompt-management.component.js +5 -5
  28. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  29. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
  30. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  31. package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
  32. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  33. package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
  34. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  35. package/dist/AI/components/system/system-configuration.component.js +9 -11
  36. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  37. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +44 -8
  38. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  39. package/dist/AI/components/vectors/vector-management-resource.component.js +648 -384
  40. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  41. package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
  42. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  43. package/dist/APIKeys/api-keys-resource.component.js +2 -0
  44. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  45. package/dist/Actions/components/actions-overview.component.d.ts +4 -5
  46. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  47. package/dist/Actions/components/actions-overview.component.js +11 -12
  48. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  49. package/dist/Actions/components/code-management.component.d.ts +2 -3
  50. package/dist/Actions/components/code-management.component.d.ts.map +1 -1
  51. package/dist/Actions/components/code-management.component.js +4 -6
  52. package/dist/Actions/components/code-management.component.js.map +1 -1
  53. package/dist/Actions/components/entity-integration.component.d.ts +2 -3
  54. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
  55. package/dist/Actions/components/entity-integration.component.js +4 -6
  56. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  57. package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
  58. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  59. package/dist/Actions/components/execution-monitoring.component.js +10 -11
  60. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  61. package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
  62. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  63. package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
  64. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  65. package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
  66. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
  67. package/dist/Actions/components/scheduled-actions.component.js +4 -6
  68. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  69. package/dist/Actions/components/security-permissions.component.d.ts +2 -3
  70. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
  71. package/dist/Actions/components/security-permissions.component.js +4 -6
  72. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  73. package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
  74. package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
  75. package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
  76. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
  77. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  78. package/dist/Communication/communication-dashboard.component.js +1 -0
  79. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  80. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  81. package/dist/Communication/communication-logs-resource.component.js +4 -1
  82. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  83. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  84. package/dist/Communication/communication-monitor-resource.component.js +4 -1
  85. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  86. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  87. package/dist/Communication/communication-providers-resource.component.js +4 -1
  88. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  89. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  90. package/dist/Communication/communication-runs-resource.component.js +4 -1
  91. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  92. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  93. package/dist/Communication/communication-templates-resource.component.js +4 -1
  94. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  95. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
  96. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  97. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
  98. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  100. package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
  101. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  102. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
  107. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
  109. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
  111. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  112. package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
  113. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  114. package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
  115. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  116. package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
  117. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  118. package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
  119. package/dist/Credentials/credentials-dashboard.component.js +1 -0
  120. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  121. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
  122. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  123. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
  124. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  126. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
  127. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  128. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
  129. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  130. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
  131. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  132. package/dist/DataExplorer/data-explorer-dashboard.component.js +453 -420
  133. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  134. package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
  135. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  136. package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
  137. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  138. package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
  139. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  140. package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
  141. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  142. package/dist/Home/home-dashboard.component.d.ts +4 -4
  143. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  144. package/dist/Home/home-dashboard.component.js +4 -5
  145. package/dist/Home/home-dashboard.component.js.map +1 -1
  146. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.js +1 -0
  148. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  149. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  150. package/dist/Integration/components/connections/connections.component.js +2 -0
  151. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  152. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -0
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  156. package/dist/Integration/components/overview/overview.component.js +2 -0
  157. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +2 -0
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  162. package/dist/Integration/components/schedules/schedules.component.js +2 -0
  163. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  164. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +4 -3
  165. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  166. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1 -0
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  168. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +4 -3
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +1 -0
  171. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -3
  173. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  174. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +220 -138
  175. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +4 -3
  177. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  178. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +1 -0
  179. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  180. package/dist/KnowledgeHub/index.d.ts +0 -1
  181. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  182. package/dist/KnowledgeHub/index.js +0 -1
  183. package/dist/KnowledgeHub/index.js.map +1 -1
  184. package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
  185. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  186. package/dist/Lists/components/lists-browse-resource.component.js +2 -0
  187. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  188. package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
  189. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  190. package/dist/Lists/components/lists-categories-resource.component.js +2 -0
  191. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  192. package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
  193. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  194. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
  195. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  196. package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
  197. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  198. package/dist/Lists/components/lists-operations-resource.component.js +2 -0
  199. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  200. package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
  201. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  202. package/dist/MCP/mcp-dashboard.component.js +25 -107
  203. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  204. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  205. package/dist/MCP/mcp-resource.component.js +1 -0
  206. package/dist/MCP/mcp-resource.component.js.map +1 -1
  207. package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
  208. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  209. package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
  210. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  211. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
  213. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  217. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  218. package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
  219. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  220. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  221. package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
  222. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  223. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
  224. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  225. package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
  226. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  227. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  228. package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
  229. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  230. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  231. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  232. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
  233. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  234. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  235. package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
  236. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  237. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  238. package/dist/Testing/components/testing-review-resource.component.js +2 -0
  239. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  240. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  241. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  242. package/dist/Testing/components/testing-runs-resource.component.js +2 -0
  243. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  244. package/dist/Testing/testing-dashboard.component.d.ts +2 -1
  245. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  246. package/dist/Testing/testing-dashboard.component.js +1 -0
  247. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  248. package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
  249. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  250. package/dist/VersionHistory/components/diff-resource.component.js +9 -10
  251. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  252. package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
  253. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
  254. package/dist/VersionHistory/components/graph-resource.component.js +2 -0
  255. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  256. package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
  257. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  258. package/dist/VersionHistory/components/labels-resource.component.js +10 -11
  259. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  260. package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
  261. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  262. package/dist/VersionHistory/components/restore-resource.component.js +2 -0
  263. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  264. package/dist/ai-dashboards.module.d.ts +19 -19
  265. package/dist/ai-dashboards.module.d.ts.map +1 -1
  266. package/dist/ai-dashboards.module.js +4 -5
  267. package/dist/ai-dashboards.module.js.map +1 -1
  268. package/dist/core-dashboards.module.d.ts +19 -18
  269. package/dist/core-dashboards.module.d.ts.map +1 -1
  270. package/dist/core-dashboards.module.js +8 -0
  271. package/dist/core-dashboards.module.js.map +1 -1
  272. package/dist/data-explorer-dashboards.module.d.ts +2 -1
  273. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  274. package/dist/data-explorer-dashboards.module.js +7 -3
  275. package/dist/data-explorer-dashboards.module.js.map +1 -1
  276. package/dist/public-api.d.ts +1 -1
  277. package/dist/public-api.d.ts.map +1 -1
  278. package/dist/public-api.js +2 -1
  279. package/dist/public-api.js.map +1 -1
  280. package/package.json +49 -48
  281. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -166
  282. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
  283. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -991
  284. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
@@ -12,7 +12,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
12
12
  * an entity sync table, and sidebar panels for DB health, embedding model info,
13
13
  * and storage usage.
14
14
  */
15
- import { Component, ChangeDetectorRef, Input, inject } from '@angular/core';
15
+ import { Component, ChangeDetectorRef, Input, ViewChild, inject } from '@angular/core';
16
16
  import { Subject } from 'rxjs';
17
17
  import { takeUntil } from 'rxjs/operators';
18
18
  import { Metadata, RunView } from '@memberjunction/core';
@@ -29,26 +29,27 @@ import * as i2 from "@memberjunction/ng-code-editor";
29
29
  import * as i3 from "@memberjunction/ng-shared-generic";
30
30
  import * as i4 from "../widgets/kpi-card.component";
31
31
  import * as i5 from "@angular/common";
32
+ const _c0 = ["entitySearchInput"];
32
33
  const _forTrack0 = ($index, $item) => $item.title;
33
34
  const _forTrack1 = ($index, $item) => $item.EntityDocumentID;
34
35
  const _forTrack2 = ($index, $item) => $item.ID;
35
36
  const _forTrack3 = ($index, $item) => $item.SchemaName;
36
37
  const _forTrack4 = ($index, $item) => $item.name;
37
38
  function VectorManagementResourceComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelementStart(0, "div", 0);
39
- i0.ɵɵelement(1, "mj-loading", 1);
39
+ i0.ɵɵelementStart(0, "div", 1);
40
+ i0.ɵɵelement(1, "mj-loading", 2);
40
41
  i0.ɵɵelementEnd();
41
42
  } }
42
43
  function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
43
44
  const _r2 = i0.ɵɵgetCurrentView();
44
- i0.ɵɵelementStart(0, "div", 3)(1, "button", 39);
45
+ i0.ɵɵelementStart(0, "div", 4)(1, "button", 40);
45
46
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ViewMode = "index"); });
46
- i0.ɵɵelement(2, "i", 40);
47
+ i0.ɵɵelement(2, "i", 41);
47
48
  i0.ɵɵtext(3, " Index View ");
48
49
  i0.ɵɵelementEnd();
49
- i0.ɵɵelementStart(4, "button", 39);
50
+ i0.ɵɵelementStart(4, "button", 40);
50
51
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.ViewMode = "operations"); });
51
- i0.ɵɵelement(5, "i", 41);
52
+ i0.ɵɵelement(5, "i", 42);
52
53
  i0.ɵɵtext(6, " Operations ");
53
54
  i0.ɵɵelementEnd()();
54
55
  } if (rf & 2) {
@@ -59,14 +60,14 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_1_Template(
59
60
  i0.ɵɵclassProp("view-mode-btn-active", ctx_r2.ViewMode === "operations");
60
61
  } }
61
62
  function VectorManagementResourceComponent_Conditional_1_For_4_Template(rf, ctx) { if (rf & 1) {
62
- i0.ɵɵelement(0, "app-kpi-card", 5);
63
+ i0.ɵɵelement(0, "app-kpi-card", 6);
63
64
  } if (rf & 2) {
64
65
  const card_r4 = ctx.$implicit;
65
66
  i0.ɵɵproperty("data", card_r4);
66
67
  } }
67
68
  function VectorManagementResourceComponent_Conditional_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
68
- i0.ɵɵelementStart(0, "div", 17);
69
- i0.ɵɵelement(1, "i", 42);
69
+ i0.ɵɵelementStart(0, "div", 18);
70
+ i0.ɵɵelement(1, "i", 43);
70
71
  i0.ɵɵelementStart(2, "p");
71
72
  i0.ɵɵtext(3, "No entity documents configured for vectorization.");
72
73
  i0.ɵɵelementEnd()();
@@ -84,7 +85,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
84
85
  i0.ɵɵtextInterpolate1(" ", row_r6.Status, " ");
85
86
  } }
86
87
  function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template(rf, ctx) { if (rf & 1) {
87
- i0.ɵɵelement(0, "i", 57);
88
+ i0.ɵɵelement(0, "i", 58);
88
89
  i0.ɵɵtext(1);
89
90
  } if (rf & 2) {
90
91
  const row_r6 = i0.ɵɵnextContext().$implicit;
@@ -92,39 +93,39 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
92
93
  i0.ɵɵtextInterpolate1(" ", row_r6.PercentComplete > 0 ? row_r6.PercentComplete + "%" : "Sync", " ");
93
94
  } }
94
95
  function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
95
- i0.ɵɵelement(0, "i", 58);
96
+ i0.ɵɵelement(0, "i", 59);
96
97
  i0.ɵɵtext(1, " Sync ");
97
98
  } }
98
99
  function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template(rf, ctx) { if (rf & 1) {
99
100
  const _r5 = i0.ɵɵgetCurrentView();
100
- i0.ɵɵelementStart(0, "tr")(1, "td", 46);
101
+ i0.ɵɵelementStart(0, "tr")(1, "td", 47);
101
102
  i0.ɵɵtext(2);
102
103
  i0.ɵɵelementEnd();
103
- i0.ɵɵelementStart(3, "td", 47);
104
+ i0.ɵɵelementStart(3, "td", 48);
104
105
  i0.ɵɵtext(4);
105
106
  i0.ɵɵelementEnd();
106
- i0.ɵɵelementStart(5, "td", 48);
107
+ i0.ɵɵelementStart(5, "td", 49);
107
108
  i0.ɵɵtext(6);
108
109
  i0.ɵɵpipe(7, "number");
109
110
  i0.ɵɵelementEnd();
110
- i0.ɵɵelementStart(8, "td", 49);
111
+ i0.ɵɵelementStart(8, "td", 50);
111
112
  i0.ɵɵtext(9);
112
113
  i0.ɵɵelementEnd();
113
- i0.ɵɵelementStart(10, "td")(11, "span", 50);
114
+ i0.ɵɵelementStart(10, "td")(11, "span", 51);
114
115
  i0.ɵɵelement(12, "i");
115
116
  i0.ɵɵconditionalCreate(13, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_13_Template, 1, 1)(14, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_14_Template, 1, 1);
116
117
  i0.ɵɵelementEnd()();
117
- i0.ɵɵelementStart(15, "td", 51)(16, "button", 52);
118
+ i0.ɵɵelementStart(15, "td", 52)(16, "button", 53);
118
119
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_16_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SyncEntity(row_r6.EntityDocumentID)); });
119
120
  i0.ɵɵconditionalCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template, 2, 1)(18, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template, 2, 0);
120
121
  i0.ɵɵelementEnd();
121
- i0.ɵɵelementStart(19, "button", 53);
122
+ i0.ɵɵelementStart(19, "button", 54);
122
123
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_19_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenScheduleSyncDialog(row_r6.EntityDocumentID)); });
123
- i0.ɵɵelement(20, "i", 54);
124
+ i0.ɵɵelement(20, "i", 55);
124
125
  i0.ɵɵelementEnd();
125
- i0.ɵɵelementStart(21, "button", 55);
126
+ i0.ɵɵelementStart(21, "button", 56);
126
127
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_21_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenEditPanel(row_r6.EntityDocumentID)); });
127
- i0.ɵɵelement(22, "i", 56);
128
+ i0.ɵɵelement(22, "i", 57);
128
129
  i0.ɵɵelementEnd()()();
129
130
  } if (rf & 2) {
130
131
  const row_r6 = ctx.$implicit;
@@ -149,13 +150,13 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_T
149
150
  i0.ɵɵconditional(ctx_r2.SyncingIds.has(row_r6.EntityDocumentID) ? 17 : 18);
150
151
  } }
151
152
  function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template(rf, ctx) { if (rf & 1) {
152
- i0.ɵɵelementStart(0, "div", 18)(1, "table", 43)(2, "thead")(3, "tr")(4, "th");
153
+ i0.ɵɵelementStart(0, "div", 19)(1, "table", 44)(2, "thead")(3, "tr")(4, "th");
153
154
  i0.ɵɵtext(5, "Entity");
154
155
  i0.ɵɵelementEnd();
155
156
  i0.ɵɵelementStart(6, "th");
156
157
  i0.ɵɵtext(7, "Document");
157
158
  i0.ɵɵelementEnd();
158
- i0.ɵɵelementStart(8, "th", 44);
159
+ i0.ɵɵelementStart(8, "th", 45);
159
160
  i0.ɵɵtext(9, "Vectors");
160
161
  i0.ɵɵelementEnd();
161
162
  i0.ɵɵelementStart(10, "th");
@@ -164,7 +165,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
164
165
  i0.ɵɵelementStart(12, "th");
165
166
  i0.ɵɵtext(13, "Status");
166
167
  i0.ɵɵelementEnd();
167
- i0.ɵɵelementStart(14, "th", 45);
168
+ i0.ɵɵelementStart(14, "th", 46);
168
169
  i0.ɵɵtext(15, "Actions");
169
170
  i0.ɵɵelementEnd()()();
170
171
  i0.ɵɵelementStart(16, "tbody");
@@ -176,10 +177,10 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
176
177
  i0.ɵɵrepeater(ctx_r2.SyncRows);
177
178
  } }
178
179
  function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template(rf, ctx) { if (rf & 1) {
179
- i0.ɵɵelementStart(0, "div", 29)(1, "span", 30);
180
+ i0.ɵɵelementStart(0, "div", 30)(1, "span", 31);
180
181
  i0.ɵɵtext(2, "Dimensions");
181
182
  i0.ɵɵelementEnd();
182
- i0.ɵɵelementStart(3, "span", 31);
183
+ i0.ɵɵelementStart(3, "span", 32);
183
184
  i0.ɵɵtext(4);
184
185
  i0.ɵɵpipe(5, "number");
185
186
  i0.ɵɵelementEnd()();
@@ -188,44 +189,73 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template
188
189
  i0.ɵɵadvance(4);
189
190
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 1, ctx_r2.EmbeddingModel.Dimensions));
190
191
  } }
191
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template(rf, ctx) { if (rf & 1) {
192
- i0.ɵɵelementStart(0, "option", 72);
192
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_20_Template(rf, ctx) { if (rf & 1) {
193
+ i0.ɵɵelement(0, "i", 58);
194
+ i0.ɵɵtext(1, " Regenerating... ");
195
+ } }
196
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_21_Template(rf, ctx) { if (rf & 1) {
197
+ i0.ɵɵelement(0, "i", 14);
198
+ i0.ɵɵtext(1, " Regenerate with AI ");
199
+ } }
200
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_For_5_Template(rf, ctx) { if (rf & 1) {
201
+ i0.ɵɵelementStart(0, "span", 85);
202
+ i0.ɵɵtext(1);
203
+ i0.ɵɵelementEnd();
204
+ } if (rf & 2) {
205
+ const field_r8 = ctx.$implicit;
206
+ i0.ɵɵadvance();
207
+ i0.ɵɵtextInterpolate(field_r8);
208
+ } }
209
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_Template(rf, ctx) { if (rf & 1) {
210
+ i0.ɵɵelementStart(0, "div", 68)(1, "label", 69);
211
+ i0.ɵɵtext(2, "Selected Fields");
212
+ i0.ɵɵelementEnd();
213
+ i0.ɵɵelementStart(3, "div", 84);
214
+ i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_For_5_Template, 2, 1, "span", 85, i0.ɵɵrepeaterTrackByIdentity);
215
+ i0.ɵɵelementEnd()();
216
+ } if (rf & 2) {
217
+ const ctx_r2 = i0.ɵɵnextContext(3);
218
+ i0.ɵɵadvance(4);
219
+ i0.ɵɵrepeater(ctx_r2.EditDocSelectedFields);
220
+ } }
221
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_34_Template(rf, ctx) { if (rf & 1) {
222
+ i0.ɵɵelementStart(0, "option", 77);
193
223
  i0.ɵɵtext(1);
194
224
  i0.ɵɵelementEnd();
195
225
  } if (rf & 2) {
196
- const model_r8 = ctx.$implicit;
197
- i0.ɵɵproperty("value", model_r8.ID);
226
+ const model_r9 = ctx.$implicit;
227
+ i0.ɵɵproperty("value", model_r9.ID);
198
228
  i0.ɵɵadvance();
199
- i0.ɵɵtextInterpolate(model_r8.Name);
229
+ i0.ɵɵtextInterpolate(model_r9.Name);
200
230
  } }
201
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template(rf, ctx) { if (rf & 1) {
202
- i0.ɵɵelementStart(0, "option", 72);
231
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_40_Template(rf, ctx) { if (rf & 1) {
232
+ i0.ɵɵelementStart(0, "option", 77);
203
233
  i0.ɵɵtext(1);
204
234
  i0.ɵɵelementEnd();
205
235
  } if (rf & 2) {
206
- const db_r9 = ctx.$implicit;
207
- i0.ɵɵproperty("value", db_r9.ID);
236
+ const db_r10 = ctx.$implicit;
237
+ i0.ɵɵproperty("value", db_r10.ID);
208
238
  i0.ɵɵadvance();
209
- i0.ɵɵtextInterpolate(db_r9.Name);
239
+ i0.ɵɵtextInterpolate(db_r10.Name);
210
240
  } }
211
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template(rf, ctx) { if (rf & 1) {
212
- i0.ɵɵelementStart(0, "option", 72);
241
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_For_4_Template(rf, ctx) { if (rf & 1) {
242
+ i0.ɵɵelementStart(0, "option", 77);
213
243
  i0.ɵɵtext(1);
214
244
  i0.ɵɵelementEnd();
215
245
  } if (rf & 2) {
216
- const idx_r11 = ctx.$implicit;
217
- i0.ɵɵproperty("value", idx_r11.ID);
246
+ const idx_r12 = ctx.$implicit;
247
+ i0.ɵɵproperty("value", idx_r12.ID);
218
248
  i0.ɵɵadvance();
219
- i0.ɵɵtextInterpolate(idx_r11.Name);
249
+ i0.ɵɵtextInterpolate(idx_r12.Name);
220
250
  } }
221
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template(rf, ctx) { if (rf & 1) {
222
- const _r10 = i0.ɵɵgetCurrentView();
223
- i0.ɵɵelementStart(0, "select", 71);
224
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorIndexID, $event) || (ctx_r2.EditDocVectorIndexID = $event); return i0.ɵɵresetView($event); });
225
- i0.ɵɵelementStart(1, "option", 79);
251
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template(rf, ctx) { if (rf & 1) {
252
+ const _r11 = i0.ɵɵgetCurrentView();
253
+ i0.ɵɵelementStart(0, "select", 76);
254
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorIndexID, $event) || (ctx_r2.EditDocVectorIndexID = $event); return i0.ɵɵresetView($event); });
255
+ i0.ɵɵelementStart(1, "option", 86);
226
256
  i0.ɵɵtext(2, "Auto (create/find matching index)");
227
257
  i0.ɵɵelementEnd();
228
- i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template, 2, 2, "option", 72, _forTrack2);
258
+ i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_For_4_Template, 2, 2, "option", 77, _forTrack2);
229
259
  i0.ɵɵelementEnd();
230
260
  } if (rf & 2) {
231
261
  const ctx_r2 = i0.ɵɵnextContext(3);
@@ -233,94 +263,113 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditio
233
263
  i0.ɵɵadvance(3);
234
264
  i0.ɵɵrepeater(ctx_r2.EditFilteredIndexes);
235
265
  } }
236
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_35_Template(rf, ctx) { if (rf & 1) {
237
- i0.ɵɵelementStart(0, "span", 74);
266
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template(rf, ctx) { if (rf & 1) {
267
+ i0.ɵɵelementStart(0, "span", 79);
238
268
  i0.ɵɵtext(1, " No indexes for this database \u2014 one will be created automatically on sync ");
239
269
  i0.ɵɵelementEnd();
240
270
  } }
241
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template(rf, ctx) { if (rf & 1) {
242
- i0.ɵɵelement(0, "mj-loading", 78);
271
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_55_Template(rf, ctx) { if (rf & 1) {
272
+ i0.ɵɵelement(0, "mj-loading", 83);
243
273
  } }
244
- function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template(rf, ctx) { if (rf & 1) {
245
- const _r12 = i0.ɵɵgetCurrentView();
246
- i0.ɵɵelementStart(0, "button", 80);
247
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveEditedDocument()); });
248
- i0.ɵɵelement(1, "i", 81);
274
+ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template(rf, ctx) { if (rf & 1) {
275
+ const _r13 = i0.ɵɵgetCurrentView();
276
+ i0.ɵɵelementStart(0, "button", 87);
277
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveEditedDocument()); });
278
+ i0.ɵɵelement(1, "i", 88);
249
279
  i0.ɵɵtext(2, " Save Changes ");
250
280
  i0.ɵɵelementEnd();
251
- i0.ɵɵelementStart(3, "button", 82);
252
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.DeleteEntityDocument()); });
253
- i0.ɵɵelement(4, "i", 83);
281
+ i0.ɵɵelementStart(3, "button", 89);
282
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.DeleteEntityDocument()); });
283
+ i0.ɵɵelement(4, "i", 90);
254
284
  i0.ɵɵtext(5, " Delete ");
255
285
  i0.ɵɵelementEnd();
256
- i0.ɵɵelementStart(6, "button", 84);
257
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
286
+ i0.ɵɵelementStart(6, "button", 91);
287
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
258
288
  i0.ɵɵtext(7, " Cancel ");
259
289
  i0.ɵɵelementEnd();
260
290
  } }
261
291
  function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template(rf, ctx) { if (rf & 1) {
262
292
  const _r7 = i0.ɵɵgetCurrentView();
263
- i0.ɵɵelementStart(0, "div", 59);
293
+ i0.ɵɵelementStart(0, "div", 60);
264
294
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
265
- i0.ɵɵelementStart(1, "div", 60);
295
+ i0.ɵɵelementStart(1, "div", 61);
266
296
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r7); return i0.ɵɵresetView($event.stopPropagation()); });
267
- i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
268
- i0.ɵɵelement(4, "i", 56);
297
+ i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
298
+ i0.ɵɵelement(4, "i", 57);
269
299
  i0.ɵɵtext(5, " Edit Entity Document ");
270
300
  i0.ɵɵelementEnd();
271
- i0.ɵɵelementStart(6, "button", 63);
301
+ i0.ɵɵelementStart(6, "button", 64);
272
302
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
273
- i0.ɵɵelement(7, "i", 64);
303
+ i0.ɵɵelement(7, "i", 65);
274
304
  i0.ɵɵelementEnd()();
275
- i0.ɵɵelementStart(8, "div", 65)(9, "div", 66)(10, "div", 67)(11, "label", 68);
305
+ i0.ɵɵelementStart(8, "div", 66)(9, "div", 67)(10, "div", 68)(11, "label", 69);
276
306
  i0.ɵɵtext(12, "Entity");
277
307
  i0.ɵɵelementEnd();
278
- i0.ɵɵelementStart(13, "span", 69);
308
+ i0.ɵɵelementStart(13, "span", 70);
279
309
  i0.ɵɵtext(14);
280
310
  i0.ɵɵelementEnd()();
281
- i0.ɵɵelementStart(15, "div", 67)(16, "label", 68);
282
- i0.ɵɵtext(17, "Document Name");
311
+ i0.ɵɵelementStart(15, "div", 68)(16, "div", 71)(17, "label", 69);
312
+ i0.ɵɵtext(18, "Template");
313
+ i0.ɵɵelementEnd();
314
+ i0.ɵɵelementStart(19, "button", 72);
315
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.RegenerateTemplate()); });
316
+ i0.ɵɵconditionalCreate(20, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_20_Template, 2, 0)(21, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_21_Template, 2, 0);
317
+ i0.ɵɵelementEnd()();
318
+ i0.ɵɵelementStart(22, "div", 73)(23, "mj-code-editor", 74);
319
+ i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_mj_code_editor_change_23_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnEditTemplateChange($event)); });
320
+ i0.ɵɵelementEnd()()();
321
+ i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_24_Template, 6, 0, "div", 68);
322
+ i0.ɵɵelementStart(25, "div", 68)(26, "label", 69);
323
+ i0.ɵɵtext(27, "Document Name");
283
324
  i0.ɵɵelementEnd();
284
- i0.ɵɵelementStart(18, "input", 70);
285
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocName, $event) || (ctx_r2.EditDocName = $event); return i0.ɵɵresetView($event); });
325
+ i0.ɵɵelementStart(28, "input", 75);
326
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_input_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocName, $event) || (ctx_r2.EditDocName = $event); return i0.ɵɵresetView($event); });
286
327
  i0.ɵɵelementEnd()();
287
- i0.ɵɵelementStart(19, "div", 67)(20, "label", 68);
288
- i0.ɵɵtext(21, "Embedding Model");
328
+ i0.ɵɵelementStart(29, "div", 68)(30, "label", 69);
329
+ i0.ɵɵtext(31, "Embedding Model");
289
330
  i0.ɵɵelementEnd();
290
- i0.ɵɵelementStart(22, "select", 71);
291
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocAIModelID, $event) || (ctx_r2.EditDocAIModelID = $event); return i0.ɵɵresetView($event); });
292
- i0.ɵɵrepeaterCreate(23, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template, 2, 2, "option", 72, _forTrack2);
331
+ i0.ɵɵelementStart(32, "select", 76);
332
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_32_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocAIModelID, $event) || (ctx_r2.EditDocAIModelID = $event); return i0.ɵɵresetView($event); });
333
+ i0.ɵɵrepeaterCreate(33, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_34_Template, 2, 2, "option", 77, _forTrack2);
293
334
  i0.ɵɵelementEnd()();
294
- i0.ɵɵelementStart(25, "div", 67)(26, "label", 68);
295
- i0.ɵɵtext(27, "Vector Database");
335
+ i0.ɵɵelementStart(35, "div", 68)(36, "label", 69);
336
+ i0.ɵɵtext(37, "Vector Database");
296
337
  i0.ɵɵelementEnd();
297
- i0.ɵɵelementStart(28, "select", 71);
298
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorDBID, $event) || (ctx_r2.EditDocVectorDBID = $event); return i0.ɵɵresetView($event); });
299
- i0.ɵɵrepeaterCreate(29, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template, 2, 2, "option", 72, _forTrack2);
338
+ i0.ɵɵelementStart(38, "select", 76);
339
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_38_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorDBID, $event) || (ctx_r2.EditDocVectorDBID = $event); return i0.ɵɵresetView($event); });
340
+ i0.ɵɵrepeaterCreate(39, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_40_Template, 2, 2, "option", 77, _forTrack2);
300
341
  i0.ɵɵelementEnd()();
301
- i0.ɵɵelementStart(31, "div", 67)(32, "label", 68);
302
- i0.ɵɵtext(33, "Vector Index");
342
+ i0.ɵɵelementStart(41, "div", 68)(42, "label", 69);
343
+ i0.ɵɵtext(43, "Vector Index");
303
344
  i0.ɵɵelementEnd();
304
- i0.ɵɵconditionalCreate(34, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template, 5, 1, "select", 73)(35, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_35_Template, 2, 0, "span", 74);
345
+ i0.ɵɵconditionalCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_44_Template, 5, 1, "select", 78)(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 2, 0, "span", 79);
305
346
  i0.ɵɵelementEnd();
306
- i0.ɵɵelementStart(36, "div", 67)(37, "label", 68);
307
- i0.ɵɵtext(38, "Status");
347
+ i0.ɵɵelementStart(46, "div", 68)(47, "label", 69);
348
+ i0.ɵɵtext(48, "Status");
308
349
  i0.ɵɵelementEnd();
309
- i0.ɵɵelementStart(39, "select", 71);
310
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocStatus, $event) || (ctx_r2.EditDocStatus = $event); return i0.ɵɵresetView($event); });
311
- i0.ɵɵelementStart(40, "option", 75);
312
- i0.ɵɵtext(41, "Active");
350
+ i0.ɵɵelementStart(49, "select", 76);
351
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_49_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocStatus, $event) || (ctx_r2.EditDocStatus = $event); return i0.ɵɵresetView($event); });
352
+ i0.ɵɵelementStart(50, "option", 80);
353
+ i0.ɵɵtext(51, "Active");
313
354
  i0.ɵɵelementEnd();
314
- i0.ɵɵelementStart(42, "option", 76);
315
- i0.ɵɵtext(43, "Inactive");
355
+ i0.ɵɵelementStart(52, "option", 81);
356
+ i0.ɵɵtext(53, "Inactive");
316
357
  i0.ɵɵelementEnd()()();
317
- i0.ɵɵelementStart(44, "div", 77);
318
- i0.ɵɵconditionalCreate(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 1, 0, "mj-loading", 78)(46, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template, 8, 0);
358
+ i0.ɵɵelementStart(54, "div", 82);
359
+ i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_55_Template, 1, 0, "mj-loading", 83)(56, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_56_Template, 8, 0);
319
360
  i0.ɵɵelementEnd()()()()();
320
361
  } if (rf & 2) {
321
362
  const ctx_r2 = i0.ɵɵnextContext(2);
322
363
  i0.ɵɵadvance(14);
323
364
  i0.ɵɵtextInterpolate(ctx_r2.EditDocEntityName);
365
+ i0.ɵɵadvance(5);
366
+ i0.ɵɵproperty("disabled", ctx_r2.IsEditRegenerating);
367
+ i0.ɵɵadvance();
368
+ i0.ɵɵconditional(ctx_r2.IsEditRegenerating ? 20 : 21);
369
+ i0.ɵɵadvance(3);
370
+ i0.ɵɵproperty("value", ctx_r2.EditDocTemplate)("readonly", false)("lineWrapping", true);
371
+ i0.ɵɵadvance();
372
+ i0.ɵɵconditional(ctx_r2.EditDocSelectedFields.length > 0 ? 24 : -1);
324
373
  i0.ɵɵadvance(4);
325
374
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EditDocName);
326
375
  i0.ɵɵadvance(4);
@@ -332,71 +381,71 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template
332
381
  i0.ɵɵadvance();
333
382
  i0.ɵɵrepeater(ctx_r2.vectorDatabases);
334
383
  i0.ɵɵadvance(5);
335
- i0.ɵɵconditional(ctx_r2.EditFilteredIndexes.length > 0 ? 34 : 35);
384
+ i0.ɵɵconditional(ctx_r2.EditFilteredIndexes.length > 0 ? 44 : 45);
336
385
  i0.ɵɵadvance(5);
337
386
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EditDocStatus);
338
387
  i0.ɵɵadvance(6);
339
- i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ? 45 : 46);
388
+ i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ? 55 : 56);
340
389
  } }
341
390
  function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template(rf, ctx) { if (rf & 1) {
342
- i0.ɵɵelement(0, "mj-loading", 78);
391
+ i0.ɵɵelement(0, "mj-loading", 83);
343
392
  } }
344
393
  function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template(rf, ctx) { if (rf & 1) {
345
- const _r14 = i0.ɵɵgetCurrentView();
346
- i0.ɵɵelementStart(0, "button", 80);
347
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveScheduleSync()); });
348
- i0.ɵɵelement(1, "i", 91);
394
+ const _r15 = i0.ɵɵgetCurrentView();
395
+ i0.ɵɵelementStart(0, "button", 87);
396
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveScheduleSync()); });
397
+ i0.ɵɵelement(1, "i", 98);
349
398
  i0.ɵɵtext(2, " Create Schedule ");
350
399
  i0.ɵɵelementEnd();
351
- i0.ɵɵelementStart(3, "button", 84);
352
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
400
+ i0.ɵɵelementStart(3, "button", 91);
401
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
353
402
  i0.ɵɵtext(4, " Cancel ");
354
403
  i0.ɵɵelementEnd();
355
404
  } }
356
405
  function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
357
- const _r13 = i0.ɵɵgetCurrentView();
358
- i0.ɵɵelementStart(0, "div", 59);
359
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
360
- i0.ɵɵelementStart(1, "div", 85);
361
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
362
- i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
363
- i0.ɵɵelement(4, "i", 54);
406
+ const _r14 = i0.ɵɵgetCurrentView();
407
+ i0.ɵɵelementStart(0, "div", 60);
408
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
409
+ i0.ɵɵelementStart(1, "div", 92);
410
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r14); return i0.ɵɵresetView($event.stopPropagation()); });
411
+ i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
412
+ i0.ɵɵelement(4, "i", 55);
364
413
  i0.ɵɵtext(5, " Schedule Vector Sync ");
365
414
  i0.ɵɵelementEnd();
366
- i0.ɵɵelementStart(6, "button", 63);
367
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
368
- i0.ɵɵelement(7, "i", 64);
415
+ i0.ɵɵelementStart(6, "button", 64);
416
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
417
+ i0.ɵɵelement(7, "i", 65);
369
418
  i0.ɵɵelementEnd()();
370
- i0.ɵɵelementStart(8, "div", 65)(9, "div", 66)(10, "div", 67)(11, "label", 68);
419
+ i0.ɵɵelementStart(8, "div", 66)(9, "div", 67)(10, "div", 68)(11, "label", 69);
371
420
  i0.ɵɵtext(12, "Entity Document");
372
421
  i0.ɵɵelementEnd();
373
- i0.ɵɵelementStart(13, "span", 69);
422
+ i0.ɵɵelementStart(13, "span", 70);
374
423
  i0.ɵɵtext(14);
375
424
  i0.ɵɵelementEnd()();
376
- i0.ɵɵelementStart(15, "div", 67)(16, "label", 68);
425
+ i0.ɵɵelementStart(15, "div", 68)(16, "label", 69);
377
426
  i0.ɵɵtext(17, "Action");
378
427
  i0.ɵɵelementEnd();
379
- i0.ɵɵelementStart(18, "span", 69);
428
+ i0.ɵɵelementStart(18, "span", 70);
380
429
  i0.ɵɵtext(19, "__VectorizeEntity");
381
430
  i0.ɵɵelementEnd()();
382
- i0.ɵɵelementStart(20, "div", 67)(21, "label", 68);
431
+ i0.ɵɵelementStart(20, "div", 68)(21, "label", 69);
383
432
  i0.ɵɵtext(22, "Cron Expression");
384
433
  i0.ɵɵelementEnd();
385
- i0.ɵɵelementStart(23, "input", 86);
386
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncCron, $event) || (ctx_r2.ScheduleSyncCron = $event); return i0.ɵɵresetView($event); });
434
+ i0.ɵɵelementStart(23, "input", 93);
435
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncCron, $event) || (ctx_r2.ScheduleSyncCron = $event); return i0.ɵɵresetView($event); });
387
436
  i0.ɵɵelementEnd();
388
- i0.ɵɵelementStart(24, "div", 87);
389
- i0.ɵɵelement(25, "i", 88);
437
+ i0.ɵɵelementStart(24, "div", 94);
438
+ i0.ɵɵelement(25, "i", 95);
390
439
  i0.ɵɵtext(26);
391
440
  i0.ɵɵelementEnd()();
392
- i0.ɵɵelementStart(27, "div", 89)(28, "label", 68);
441
+ i0.ɵɵelementStart(27, "div", 96)(28, "label", 69);
393
442
  i0.ɵɵtext(29, "Enabled");
394
443
  i0.ɵɵelementEnd();
395
- i0.ɵɵelementStart(30, "input", 90);
396
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncEnabled, $event) || (ctx_r2.ScheduleSyncEnabled = $event); return i0.ɵɵresetView($event); });
444
+ i0.ɵɵelementStart(30, "input", 97);
445
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncEnabled, $event) || (ctx_r2.ScheduleSyncEnabled = $event); return i0.ɵɵresetView($event); });
397
446
  i0.ɵɵelementEnd()();
398
- i0.ɵɵelementStart(31, "div", 77);
399
- i0.ɵɵconditionalCreate(32, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template, 1, 0, "mj-loading", 78)(33, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template, 5, 0);
447
+ i0.ɵɵelementStart(31, "div", 82);
448
+ i0.ɵɵconditionalCreate(32, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template, 1, 0, "mj-loading", 83)(33, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template, 5, 0);
400
449
  i0.ɵɵelementEnd()()()()();
401
450
  } if (rf & 2) {
402
451
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -411,9 +460,34 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template
411
460
  i0.ɵɵadvance(2);
412
461
  i0.ɵɵconditional(ctx_r2.ScheduleSyncSaving ? 32 : 33);
413
462
  } }
414
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
415
- i0.ɵɵelement(0, "i", 105);
416
- i0.ɵɵelementStart(1, "span", 106);
463
+ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
464
+ const _r16 = i0.ɵɵgetCurrentView();
465
+ i0.ɵɵelementStart(0, "div", 60);
466
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseNoIndexWarning()); });
467
+ i0.ɵɵelementStart(1, "div", 99);
468
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r16); return i0.ɵɵresetView($event.stopPropagation()); });
469
+ i0.ɵɵelementStart(2, "div", 100);
470
+ i0.ɵɵelement(3, "i", 101);
471
+ i0.ɵɵelementEnd();
472
+ i0.ɵɵelementStart(4, "h3", 102);
473
+ i0.ɵɵtext(5, "Vector Index Required");
474
+ i0.ɵɵelementEnd();
475
+ i0.ɵɵelementStart(6, "p", 103);
476
+ i0.ɵɵtext(7, " You need to create at least one vector database and index before creating entity documents. Go to the Configuration section to set up a vector database and create an index. ");
477
+ i0.ɵɵelementEnd();
478
+ i0.ɵɵelementStart(8, "div", 104)(9, "button", 87);
479
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToConfiguration()); });
480
+ i0.ɵɵelement(10, "i", 105);
481
+ i0.ɵɵtext(11, " Go to Configuration ");
482
+ i0.ɵɵelementEnd();
483
+ i0.ɵɵelementStart(12, "button", 91);
484
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseNoIndexWarning()); });
485
+ i0.ɵɵtext(13, " Close ");
486
+ i0.ɵɵelementEnd()()()();
487
+ } }
488
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
489
+ i0.ɵɵelement(0, "i", 119);
490
+ i0.ɵɵelementStart(1, "span", 120);
417
491
  i0.ɵɵtext(2);
418
492
  i0.ɵɵelementEnd();
419
493
  } if (rf & 2) {
@@ -421,42 +495,42 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
421
495
  i0.ɵɵadvance(2);
422
496
  i0.ɵɵtextInterpolate(ctx_r2.SuggestEntityName);
423
497
  } }
424
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
425
- i0.ɵɵelement(0, "i", 107);
426
- i0.ɵɵelementStart(1, "span", 108);
498
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
499
+ i0.ɵɵelement(0, "i", 121);
500
+ i0.ɵɵelementStart(1, "span", 122);
427
501
  i0.ɵɵtext(2, "Search and select an entity...");
428
502
  i0.ɵɵelementEnd();
429
503
  } }
430
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template(rf, ctx) { if (rf & 1) {
431
- const _r18 = i0.ɵɵgetCurrentView();
432
- i0.ɵɵelementStart(0, "button", 117);
433
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template_button_click_0_listener() { const entity_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.SelectEntity(entity_r19.Name)); });
434
- i0.ɵɵelement(1, "i", 105);
504
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template(rf, ctx) { if (rf & 1) {
505
+ const _r20 = i0.ɵɵgetCurrentView();
506
+ i0.ɵɵelementStart(0, "button", 132);
507
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template_button_click_0_listener() { const entity_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.SelectEntity(entity_r21.Name)); });
508
+ i0.ɵɵelement(1, "i", 119);
435
509
  i0.ɵɵtext(2);
436
510
  i0.ɵɵelementEnd();
437
511
  } if (rf & 2) {
438
- const entity_r19 = ctx.$implicit;
512
+ const entity_r21 = ctx.$implicit;
439
513
  const ctx_r2 = i0.ɵɵnextContext(6);
440
- i0.ɵɵclassProp("entity-picker-item-selected", entity_r19.Name === ctx_r2.SuggestEntityName);
514
+ i0.ɵɵclassProp("entity-picker-item-selected", entity_r21.Name === ctx_r2.SuggestEntityName)("entity-picker-item-focused", (ctx_r2.FlatFilteredEntities[ctx_r2.SelectedEntityIndex] == null ? null : ctx_r2.FlatFilteredEntities[ctx_r2.SelectedEntityIndex].ID) === entity_r21.ID);
441
515
  i0.ɵɵadvance(2);
442
- i0.ɵɵtextInterpolate1(" ", entity_r19.Name, " ");
516
+ i0.ɵɵtextInterpolate1(" ", entity_r21.Name, " ");
443
517
  } }
444
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_Template(rf, ctx) { if (rf & 1) {
445
- i0.ɵɵelementStart(0, "div", 112)(1, "div", 114);
446
- i0.ɵɵelement(2, "i", 115);
518
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_Template(rf, ctx) { if (rf & 1) {
519
+ i0.ɵɵelementStart(0, "div", 127)(1, "div", 129);
520
+ i0.ɵɵelement(2, "i", 130);
447
521
  i0.ɵɵtext(3);
448
522
  i0.ɵɵelementEnd();
449
- i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template, 3, 3, "button", 116, _forTrack2);
523
+ i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_For_5_Template, 3, 5, "button", 131, _forTrack2);
450
524
  i0.ɵɵelementEnd();
451
525
  } if (rf & 2) {
452
- const group_r20 = ctx.$implicit;
526
+ const group_r22 = ctx.$implicit;
453
527
  i0.ɵɵadvance(3);
454
- i0.ɵɵtextInterpolate1(" ", group_r20.SchemaName, " ");
528
+ i0.ɵɵtextInterpolate1(" ", group_r22.SchemaName, " ");
455
529
  i0.ɵɵadvance();
456
- i0.ɵɵrepeater(group_r20.Entities);
530
+ i0.ɵɵrepeater(group_r22.Entities);
457
531
  } }
458
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
459
- i0.ɵɵelementStart(0, "div", 113);
532
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Conditional_8_Template(rf, ctx) { if (rf & 1) {
533
+ i0.ɵɵelementStart(0, "div", 128);
460
534
  i0.ɵɵtext(1);
461
535
  i0.ɵɵelementEnd();
462
536
  } if (rf & 2) {
@@ -464,38 +538,40 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
464
538
  i0.ɵɵadvance();
465
539
  i0.ɵɵtextInterpolate1(" No entities matching \"", ctx_r2.EntitySearchText, "\" ");
466
540
  } }
467
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
468
- const _r17 = i0.ɵɵgetCurrentView();
469
- i0.ɵɵelementStart(0, "div", 97)(1, "div", 109);
470
- i0.ɵɵelement(2, "i", 107);
471
- i0.ɵɵelementStart(3, "input", 110);
472
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.EntitySearchText, $event) || (ctx_r2.EntitySearchText = $event); return i0.ɵɵresetView($event); });
473
- i0.ɵɵlistener("input", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.FilterEntities()); });
541
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
542
+ const _r19 = i0.ɵɵgetCurrentView();
543
+ i0.ɵɵelementStart(0, "div", 123);
544
+ i0.ɵɵlistener("mousedown", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r19); return i0.ɵɵresetView($event.stopPropagation()); });
545
+ i0.ɵɵelementStart(1, "div", 124);
546
+ i0.ɵɵelement(2, "i", 121);
547
+ i0.ɵɵelementStart(3, "input", 125, 0);
548
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.EntitySearchText, $event) || (ctx_r2.EntitySearchText = $event); return i0.ɵɵresetView($event); });
549
+ i0.ɵɵlistener("input", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.FilterEntities()); })("keydown", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template_input_keydown_3_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.OnEntityPickerKeyDown($event)); });
474
550
  i0.ɵɵelementEnd()();
475
- i0.ɵɵelementStart(4, "div", 111);
476
- i0.ɵɵrepeaterCreate(5, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_Template, 6, 1, "div", 112, _forTrack3);
477
- i0.ɵɵconditionalCreate(7, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Conditional_7_Template, 2, 1, "div", 113);
551
+ i0.ɵɵelementStart(5, "div", 126);
552
+ i0.ɵɵrepeaterCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_For_7_Template, 6, 1, "div", 127, _forTrack3);
553
+ i0.ɵɵconditionalCreate(8, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Conditional_8_Template, 2, 1, "div", 128);
478
554
  i0.ɵɵelementEnd()();
479
555
  } if (rf & 2) {
480
556
  const ctx_r2 = i0.ɵɵnextContext(4);
481
557
  i0.ɵɵadvance(3);
482
558
  i0.ɵɵtwoWayProperty("ngModel", ctx_r2.EntitySearchText);
483
- i0.ɵɵadvance(2);
559
+ i0.ɵɵadvance(3);
484
560
  i0.ɵɵrepeater(ctx_r2.FilteredEntityGroups);
485
561
  i0.ɵɵadvance(2);
486
- i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ? 7 : -1);
562
+ i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ? 8 : -1);
487
563
  } }
488
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_24_Template(rf, ctx) { if (rf & 1) {
489
- i0.ɵɵelement(0, "i", 57);
564
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_24_Template(rf, ctx) { if (rf & 1) {
565
+ i0.ɵɵelement(0, "i", 58);
490
566
  i0.ɵɵtext(1, " Generating with AI... ");
491
567
  } }
492
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_25_Template(rf, ctx) { if (rf & 1) {
493
- i0.ɵɵelement(0, "i", 13);
568
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_25_Template(rf, ctx) { if (rf & 1) {
569
+ i0.ɵɵelement(0, "i", 14);
494
570
  i0.ɵɵtext(1, " Generate Template ");
495
571
  } }
496
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_26_Template(rf, ctx) { if (rf & 1) {
497
- i0.ɵɵelementStart(0, "div", 104);
498
- i0.ɵɵelement(1, "i", 118);
572
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_26_Template(rf, ctx) { if (rf & 1) {
573
+ i0.ɵɵelementStart(0, "div", 118);
574
+ i0.ɵɵelement(1, "i", 133);
499
575
  i0.ɵɵtext(2);
500
576
  i0.ɵɵelementEnd();
501
577
  } if (rf & 2) {
@@ -503,41 +579,41 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
503
579
  i0.ɵɵadvance(2);
504
580
  i0.ɵɵtextInterpolate1(" ", ctx_r2.SuggestionError, " ");
505
581
  } }
506
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template(rf, ctx) { if (rf & 1) {
507
- const _r16 = i0.ɵɵgetCurrentView();
508
- i0.ɵɵelementStart(0, "div", 66)(1, "div", 67)(2, "label", 68);
582
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template(rf, ctx) { if (rf & 1) {
583
+ const _r18 = i0.ɵɵgetCurrentView();
584
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 68)(2, "label", 69);
509
585
  i0.ɵɵtext(3, "Entity");
510
586
  i0.ɵɵelementEnd();
511
- i0.ɵɵelementStart(4, "div", 94)(5, "button", 95);
512
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ToggleEntityPicker()); });
513
- i0.ɵɵconditionalCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_6_Template, 3, 1)(7, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_7_Template, 3, 0);
514
- i0.ɵɵelement(8, "i", 96);
587
+ i0.ɵɵelementStart(4, "div", 108)(5, "button", 109);
588
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ToggleEntityPicker()); });
589
+ i0.ɵɵconditionalCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_6_Template, 3, 1)(7, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_7_Template, 3, 0);
590
+ i0.ɵɵelement(8, "i", 110);
515
591
  i0.ɵɵelementEnd();
516
- i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template, 8, 2, "div", 97);
592
+ i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_9_Template, 9, 2, "div", 111);
517
593
  i0.ɵɵelementEnd()();
518
- i0.ɵɵelementStart(10, "div", 67)(11, "label", 68);
594
+ i0.ɵɵelementStart(10, "div", 68)(11, "label", 69);
519
595
  i0.ɵɵtext(12, "Use Case");
520
596
  i0.ɵɵelementEnd();
521
- i0.ɵɵelementStart(13, "div", 98)(14, "button", 99);
522
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "duplicate detection"); });
523
- i0.ɵɵelement(15, "i", 100);
597
+ i0.ɵɵelementStart(13, "div", 112)(14, "button", 113);
598
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "duplicate detection"); });
599
+ i0.ɵɵelement(15, "i", 114);
524
600
  i0.ɵɵtext(16, " Duplicate Detection ");
525
601
  i0.ɵɵelementEnd();
526
- i0.ɵɵelementStart(17, "button", 99);
527
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "search"); });
528
- i0.ɵɵelement(18, "i", 101);
602
+ i0.ɵɵelementStart(17, "button", 113);
603
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "search"); });
604
+ i0.ɵɵelement(18, "i", 115);
529
605
  i0.ɵɵtext(19, " Search ");
530
606
  i0.ɵɵelementEnd();
531
- i0.ɵɵelementStart(20, "button", 99);
532
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "classification"); });
533
- i0.ɵɵelement(21, "i", 102);
607
+ i0.ɵɵelementStart(20, "button", 113);
608
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "classification"); });
609
+ i0.ɵɵelement(21, "i", 116);
534
610
  i0.ɵɵtext(22, " Classification ");
535
611
  i0.ɵɵelementEnd()()();
536
- i0.ɵɵelementStart(23, "button", 103);
537
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.RunSuggestion()); });
538
- i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_24_Template, 2, 0)(25, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_25_Template, 2, 0);
612
+ i0.ɵɵelementStart(23, "button", 117);
613
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.RunSuggestion()); });
614
+ i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_24_Template, 2, 0)(25, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_25_Template, 2, 0);
539
615
  i0.ɵɵelementEnd();
540
- i0.ɵɵconditionalCreate(26, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_26_Template, 3, 1, "div", 104);
616
+ i0.ɵɵconditionalCreate(26, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Conditional_26_Template, 3, 1, "div", 118);
541
617
  i0.ɵɵelementEnd();
542
618
  } if (rf & 2) {
543
619
  const ctx_r2 = i0.ɵɵnextContext(3);
@@ -558,78 +634,78 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
558
634
  i0.ɵɵadvance(2);
559
635
  i0.ɵɵconditional(ctx_r2.SuggestionError ? 26 : -1);
560
636
  } }
561
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_11_Template(rf, ctx) { if (rf & 1) {
562
- i0.ɵɵelementStart(0, "span", 124);
637
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_11_Template(rf, ctx) { if (rf & 1) {
638
+ i0.ɵɵelementStart(0, "span", 85);
563
639
  i0.ɵɵtext(1);
564
640
  i0.ɵɵelementEnd();
565
641
  } if (rf & 2) {
566
- const field_r22 = ctx.$implicit;
642
+ const field_r24 = ctx.$implicit;
567
643
  i0.ɵɵadvance();
568
- i0.ɵɵtextInterpolate(field_r22);
644
+ i0.ɵɵtextInterpolate(field_r24);
569
645
  } }
570
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_For_4_Template(rf, ctx) { if (rf & 1) {
571
- i0.ɵɵelementStart(0, "div", 133)(1, "span", 134);
646
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_For_4_Template(rf, ctx) { if (rf & 1) {
647
+ i0.ɵɵelementStart(0, "div", 144)(1, "span", 145);
572
648
  i0.ɵɵtext(2);
573
649
  i0.ɵɵelementEnd();
574
- i0.ɵɵelementStart(3, "span", 135);
650
+ i0.ɵɵelementStart(3, "span", 146);
575
651
  i0.ɵɵtext(4);
576
652
  i0.ɵɵelementEnd()();
577
653
  } if (rf & 2) {
578
- const rel_r23 = ctx.$implicit;
654
+ const rel_r25 = ctx.$implicit;
579
655
  i0.ɵɵadvance(2);
580
- i0.ɵɵtextInterpolate(rel_r23.name);
656
+ i0.ɵɵtextInterpolate(rel_r25.name);
581
657
  i0.ɵɵadvance(2);
582
- i0.ɵɵtextInterpolate(rel_r23.fields.join(", "));
658
+ i0.ɵɵtextInterpolate(rel_r25.fields.join(", "));
583
659
  } }
584
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_Template(rf, ctx) { if (rf & 1) {
585
- i0.ɵɵelementStart(0, "div", 119)(1, "h4", 120);
660
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_Template(rf, ctx) { if (rf & 1) {
661
+ i0.ɵɵelementStart(0, "div", 134)(1, "h4", 135);
586
662
  i0.ɵɵtext(2, "Related Entities");
587
663
  i0.ɵɵelementEnd();
588
- i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_For_4_Template, 5, 2, "div", 133, _forTrack4);
664
+ i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_For_4_Template, 5, 2, "div", 144, _forTrack4);
589
665
  i0.ɵɵelementEnd();
590
666
  } if (rf & 2) {
591
667
  const ctx_r2 = i0.ɵɵnextContext(4);
592
668
  i0.ɵɵadvance(3);
593
669
  i0.ɵɵrepeater(ctx_r2.SuggestionResult.selectedRelationships);
594
670
  } }
595
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_39_Template(rf, ctx) { if (rf & 1) {
596
- i0.ɵɵelementStart(0, "option", 72);
671
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_39_Template(rf, ctx) { if (rf & 1) {
672
+ i0.ɵɵelementStart(0, "option", 77);
597
673
  i0.ɵɵtext(1);
598
674
  i0.ɵɵelementEnd();
599
675
  } if (rf & 2) {
600
- const model_r24 = ctx.$implicit;
601
- i0.ɵɵproperty("value", model_r24.ID);
676
+ const model_r26 = ctx.$implicit;
677
+ i0.ɵɵproperty("value", model_r26.ID);
602
678
  i0.ɵɵadvance();
603
- i0.ɵɵtextInterpolate(model_r24.Name);
679
+ i0.ɵɵtextInterpolate(model_r26.Name);
604
680
  } }
605
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_45_Template(rf, ctx) { if (rf & 1) {
606
- i0.ɵɵelementStart(0, "option", 72);
681
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_45_Template(rf, ctx) { if (rf & 1) {
682
+ i0.ɵɵelementStart(0, "option", 77);
607
683
  i0.ɵɵtext(1);
608
684
  i0.ɵɵelementEnd();
609
685
  } if (rf & 2) {
610
- const db_r25 = ctx.$implicit;
611
- i0.ɵɵproperty("value", db_r25.ID);
686
+ const db_r27 = ctx.$implicit;
687
+ i0.ɵɵproperty("value", db_r27.ID);
612
688
  i0.ɵɵadvance();
613
- i0.ɵɵtextInterpolate(db_r25.Name);
689
+ i0.ɵɵtextInterpolate(db_r27.Name);
614
690
  } }
615
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_For_4_Template(rf, ctx) { if (rf & 1) {
616
- i0.ɵɵelementStart(0, "option", 72);
691
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_For_4_Template(rf, ctx) { if (rf & 1) {
692
+ i0.ɵɵelementStart(0, "option", 77);
617
693
  i0.ɵɵtext(1);
618
694
  i0.ɵɵelementEnd();
619
695
  } if (rf & 2) {
620
- const idx_r27 = ctx.$implicit;
621
- i0.ɵɵproperty("value", idx_r27.ID);
696
+ const idx_r29 = ctx.$implicit;
697
+ i0.ɵɵproperty("value", idx_r29.ID);
622
698
  i0.ɵɵadvance();
623
- i0.ɵɵtextInterpolate(idx_r27.Name);
699
+ i0.ɵɵtextInterpolate(idx_r29.Name);
624
700
  } }
625
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template(rf, ctx) { if (rf & 1) {
626
- const _r26 = i0.ɵɵgetCurrentView();
627
- i0.ɵɵelementStart(0, "select", 71);
628
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorIndexID, $event) || (ctx_r2.SelectedVectorIndexID = $event); return i0.ɵɵresetView($event); });
629
- i0.ɵɵelementStart(1, "option", 79);
701
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template(rf, ctx) { if (rf & 1) {
702
+ const _r28 = i0.ɵɵgetCurrentView();
703
+ i0.ɵɵelementStart(0, "select", 76);
704
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorIndexID, $event) || (ctx_r2.SelectedVectorIndexID = $event); return i0.ɵɵresetView($event); });
705
+ i0.ɵɵelementStart(1, "option", 86);
630
706
  i0.ɵɵtext(2, "Auto (create/find matching index)");
631
707
  i0.ɵɵelementEnd();
632
- i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_For_4_Template, 2, 2, "option", 72, _forTrack2);
708
+ i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_For_4_Template, 2, 2, "option", 77, _forTrack2);
633
709
  i0.ɵɵelementEnd();
634
710
  } if (rf & 2) {
635
711
  const ctx_r2 = i0.ɵɵnextContext(4);
@@ -637,93 +713,93 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
637
713
  i0.ɵɵadvance(3);
638
714
  i0.ɵɵrepeater(ctx_r2.FilteredIndexesForSelectedDB);
639
715
  } }
640
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_50_Template(rf, ctx) { if (rf & 1) {
641
- i0.ɵɵelementStart(0, "span", 74);
716
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_50_Template(rf, ctx) { if (rf & 1) {
717
+ i0.ɵɵelementStart(0, "span", 79);
642
718
  i0.ɵɵtext(1, " No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync ");
643
719
  i0.ɵɵelementEnd();
644
720
  } }
645
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_52_Template(rf, ctx) { if (rf & 1) {
646
- i0.ɵɵelementStart(0, "div", 132);
647
- i0.ɵɵelement(1, "mj-loading", 78);
721
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_52_Template(rf, ctx) { if (rf & 1) {
722
+ i0.ɵɵelementStart(0, "div", 143);
723
+ i0.ɵɵelement(1, "mj-loading", 83);
648
724
  i0.ɵɵelementEnd();
649
725
  } }
650
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template(rf, ctx) { if (rf & 1) {
651
- const _r28 = i0.ɵɵgetCurrentView();
652
- i0.ɵɵelementStart(0, "button", 80);
653
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SaveAsEntityDocument()); });
654
- i0.ɵɵelement(1, "i", 136);
726
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template(rf, ctx) { if (rf & 1) {
727
+ const _r30 = i0.ɵɵgetCurrentView();
728
+ i0.ɵɵelementStart(0, "button", 87);
729
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SaveAsEntityDocument()); });
730
+ i0.ɵɵelement(1, "i", 147);
655
731
  i0.ɵɵtext(2, " Save as Entity Document ");
656
732
  i0.ɵɵelementEnd();
657
- i0.ɵɵelementStart(3, "button", 137);
658
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ClearSuggestion()); });
659
- i0.ɵɵelement(4, "i", 138);
733
+ i0.ɵɵelementStart(3, "button", 148);
734
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ClearSuggestion()); });
735
+ i0.ɵɵelement(4, "i", 149);
660
736
  i0.ɵɵtext(5, " Try Again ");
661
737
  i0.ɵɵelementEnd();
662
- i0.ɵɵelementStart(6, "button", 84);
663
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
738
+ i0.ɵɵelementStart(6, "button", 91);
739
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
664
740
  i0.ɵɵtext(7, " Close ");
665
741
  i0.ɵɵelementEnd();
666
742
  } }
667
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template(rf, ctx) { if (rf & 1) {
668
- const _r21 = i0.ɵɵgetCurrentView();
669
- i0.ɵɵelementStart(0, "div", 93)(1, "div", 119)(2, "h4", 120);
743
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template(rf, ctx) { if (rf & 1) {
744
+ const _r23 = i0.ɵɵgetCurrentView();
745
+ i0.ɵɵelementStart(0, "div", 107)(1, "div", 134)(2, "h4", 135);
670
746
  i0.ɵɵtext(3, "Suggested Template");
671
747
  i0.ɵɵelementEnd();
672
- i0.ɵɵelementStart(4, "div", 121)(5, "mj-code-editor", 122);
673
- i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_mj_code_editor_change_5_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnTemplateChange($event)); });
748
+ i0.ɵɵelementStart(4, "div", 73)(5, "mj-code-editor", 74);
749
+ i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_mj_code_editor_change_5_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnTemplateChange($event)); });
674
750
  i0.ɵɵelementEnd()()();
675
- i0.ɵɵelementStart(6, "div", 119)(7, "h4", 120);
751
+ i0.ɵɵelementStart(6, "div", 134)(7, "h4", 135);
676
752
  i0.ɵɵtext(8, "Selected Fields");
677
753
  i0.ɵɵelementEnd();
678
- i0.ɵɵelementStart(9, "div", 123);
679
- i0.ɵɵrepeaterCreate(10, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_11_Template, 2, 1, "span", 124, i0.ɵɵrepeaterTrackByIdentity);
754
+ i0.ɵɵelementStart(9, "div", 84);
755
+ i0.ɵɵrepeaterCreate(10, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_11_Template, 2, 1, "span", 85, i0.ɵɵrepeaterTrackByIdentity);
680
756
  i0.ɵɵelementEnd()();
681
- i0.ɵɵconditionalCreate(12, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_Template, 5, 0, "div", 119);
682
- i0.ɵɵelementStart(13, "div", 125)(14, "div", 126)(15, "span", 127);
757
+ i0.ɵɵconditionalCreate(12, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_12_Template, 5, 0, "div", 134);
758
+ i0.ɵɵelementStart(13, "div", 136)(14, "div", 137)(15, "span", 138);
683
759
  i0.ɵɵtext(16, "Potential Match");
684
760
  i0.ɵɵelementEnd();
685
- i0.ɵɵelementStart(17, "span", 128);
761
+ i0.ɵɵelementStart(17, "span", 139);
686
762
  i0.ɵɵtext(18);
687
763
  i0.ɵɵelementEnd()();
688
- i0.ɵɵelementStart(19, "div", 126)(20, "span", 127);
764
+ i0.ɵɵelementStart(19, "div", 137)(20, "span", 138);
689
765
  i0.ɵɵtext(21, "Absolute Match");
690
766
  i0.ɵɵelementEnd();
691
- i0.ɵɵelementStart(22, "span", 128);
767
+ i0.ɵɵelementStart(22, "span", 139);
692
768
  i0.ɵɵtext(23);
693
769
  i0.ɵɵelementEnd()()();
694
- i0.ɵɵelementStart(24, "div", 119)(25, "h4", 120);
770
+ i0.ɵɵelementStart(24, "div", 134)(25, "h4", 135);
695
771
  i0.ɵɵtext(26, "Reasoning");
696
772
  i0.ɵɵelementEnd();
697
- i0.ɵɵelementStart(27, "p", 129);
773
+ i0.ɵɵelementStart(27, "p", 140);
698
774
  i0.ɵɵtext(28);
699
775
  i0.ɵɵelementEnd()();
700
- i0.ɵɵelementStart(29, "div", 119)(30, "div", 67)(31, "label", 68);
776
+ i0.ɵɵelementStart(29, "div", 134)(30, "div", 68)(31, "label", 69);
701
777
  i0.ɵɵtext(32, "Document Name");
702
778
  i0.ɵɵelementEnd();
703
- i0.ɵɵelementStart(33, "input", 70);
704
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SaveDocumentName, $event) || (ctx_r2.SaveDocumentName = $event); return i0.ɵɵresetView($event); });
779
+ i0.ɵɵelementStart(33, "input", 75);
780
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SaveDocumentName, $event) || (ctx_r2.SaveDocumentName = $event); return i0.ɵɵresetView($event); });
705
781
  i0.ɵɵelementEnd()();
706
- i0.ɵɵelementStart(34, "div", 130)(35, "label", 68);
782
+ i0.ɵɵelementStart(34, "div", 141)(35, "label", 69);
707
783
  i0.ɵɵtext(36, "Embedding Model");
708
784
  i0.ɵɵelementEnd();
709
- i0.ɵɵelementStart(37, "select", 71);
710
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_select_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedEmbeddingModelID, $event) || (ctx_r2.SelectedEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
711
- i0.ɵɵrepeaterCreate(38, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_39_Template, 2, 2, "option", 72, _forTrack2);
785
+ i0.ɵɵelementStart(37, "select", 76);
786
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_select_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedEmbeddingModelID, $event) || (ctx_r2.SelectedEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
787
+ i0.ɵɵrepeaterCreate(38, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_39_Template, 2, 2, "option", 77, _forTrack2);
712
788
  i0.ɵɵelementEnd()();
713
- i0.ɵɵelementStart(40, "div", 130)(41, "label", 68);
789
+ i0.ɵɵelementStart(40, "div", 141)(41, "label", 69);
714
790
  i0.ɵɵtext(42, "Vector Database");
715
791
  i0.ɵɵelementEnd();
716
- i0.ɵɵelementStart(43, "select", 71);
717
- i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_select_ngModelChange_43_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorDBID, $event) || (ctx_r2.SelectedVectorDBID = $event); return i0.ɵɵresetView($event); });
718
- i0.ɵɵrepeaterCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_45_Template, 2, 2, "option", 72, _forTrack2);
792
+ i0.ɵɵelementStart(43, "select", 76);
793
+ i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template_select_ngModelChange_43_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorDBID, $event) || (ctx_r2.SelectedVectorDBID = $event); return i0.ɵɵresetView($event); });
794
+ i0.ɵɵrepeaterCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_For_45_Template, 2, 2, "option", 77, _forTrack2);
719
795
  i0.ɵɵelementEnd()();
720
- i0.ɵɵelementStart(46, "div", 130)(47, "label", 68);
796
+ i0.ɵɵelementStart(46, "div", 141)(47, "label", 69);
721
797
  i0.ɵɵtext(48, "Vector Index");
722
798
  i0.ɵɵelementEnd();
723
- i0.ɵɵconditionalCreate(49, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template, 5, 1, "select", 73)(50, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_50_Template, 2, 0, "span", 74);
799
+ i0.ɵɵconditionalCreate(49, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_49_Template, 5, 1, "select", 78)(50, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_50_Template, 2, 0, "span", 79);
724
800
  i0.ɵɵelementEnd()();
725
- i0.ɵɵelementStart(51, "div", 131);
726
- i0.ɵɵconditionalCreate(52, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_52_Template, 2, 0, "div", 132)(53, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template, 8, 0);
801
+ i0.ɵɵelementStart(51, "div", 142);
802
+ i0.ɵɵconditionalCreate(52, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_52_Template, 2, 0, "div", 143)(53, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Conditional_53_Template, 8, 0);
727
803
  i0.ɵɵelementEnd()();
728
804
  } if (rf & 2) {
729
805
  const ctx_r2 = i0.ɵɵnextContext(3);
@@ -754,22 +830,22 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditio
754
830
  i0.ɵɵadvance(3);
755
831
  i0.ɵɵconditional(ctx_r2.IsSavingDocument ? 52 : 53);
756
832
  } }
757
- function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
758
- const _r15 = i0.ɵɵgetCurrentView();
759
- i0.ɵɵelementStart(0, "div", 59);
760
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
761
- i0.ɵɵelementStart(1, "div", 92);
762
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r15); return i0.ɵɵresetView($event.stopPropagation()); });
763
- i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
764
- i0.ɵɵelement(4, "i", 13);
833
+ function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template(rf, ctx) { if (rf & 1) {
834
+ const _r17 = i0.ɵɵgetCurrentView();
835
+ i0.ɵɵelementStart(0, "div", 60);
836
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
837
+ i0.ɵɵelementStart(1, "div", 106);
838
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r17); return i0.ɵɵresetView($event.stopPropagation()); });
839
+ i0.ɵɵelementStart(2, "div", 62)(3, "h3", 63);
840
+ i0.ɵɵelement(4, "i", 14);
765
841
  i0.ɵɵtext(5, " AI Document Suggestion ");
766
842
  i0.ɵɵelementEnd();
767
- i0.ɵɵelementStart(6, "button", 63);
768
- i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
769
- i0.ɵɵelement(7, "i", 64);
843
+ i0.ɵɵelementStart(6, "button", 64);
844
+ i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_58_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
845
+ i0.ɵɵelement(7, "i", 65);
770
846
  i0.ɵɵelementEnd()();
771
- i0.ɵɵelementStart(8, "div", 65);
772
- i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template, 27, 11, "div", 66)(10, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template, 54, 12, "div", 93);
847
+ i0.ɵɵelementStart(8, "div", 66);
848
+ i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_9_Template, 27, 11, "div", 67)(10, VectorManagementResourceComponent_Conditional_1_Conditional_58_Conditional_10_Template, 54, 12, "div", 107);
773
849
  i0.ɵɵelementEnd()()();
774
850
  } if (rf & 2) {
775
851
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -780,69 +856,70 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template
780
856
  } }
781
857
  function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
782
858
  const _r1 = i0.ɵɵgetCurrentView();
783
- i0.ɵɵelementStart(0, "div", 2);
784
- i0.ɵɵconditionalCreate(1, VectorManagementResourceComponent_Conditional_1_Conditional_1_Template, 7, 4, "div", 3);
785
- i0.ɵɵelementStart(2, "div", 4);
786
- i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_For_4_Template, 1, 1, "app-kpi-card", 5, _forTrack0);
859
+ i0.ɵɵelementStart(0, "div", 3);
860
+ i0.ɵɵconditionalCreate(1, VectorManagementResourceComponent_Conditional_1_Conditional_1_Template, 7, 4, "div", 4);
861
+ i0.ɵɵelementStart(2, "div", 5);
862
+ i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_For_4_Template, 1, 1, "app-kpi-card", 6, _forTrack0);
787
863
  i0.ɵɵelementEnd();
788
- i0.ɵɵelementStart(5, "div", 6)(6, "div", 7)(7, "div", 8)(8, "h3", 9);
789
- i0.ɵɵelement(9, "i", 10);
864
+ i0.ɵɵelementStart(5, "div", 7)(6, "div", 8)(7, "div", 9)(8, "h3", 10);
865
+ i0.ɵɵelement(9, "i", 11);
790
866
  i0.ɵɵtext(10, " Entity Sync Status ");
791
867
  i0.ɵɵelementEnd();
792
- i0.ɵɵelementStart(11, "div", 11)(12, "button", 12);
868
+ i0.ɵɵelementStart(11, "div", 12)(12, "button", 13);
793
869
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OpenSuggestDialog()); });
794
- i0.ɵɵelement(13, "i", 13);
795
- i0.ɵɵelementStart(14, "span", 14);
870
+ i0.ɵɵelement(13, "i", 14);
871
+ i0.ɵɵelementStart(14, "span", 15);
796
872
  i0.ɵɵtext(15, "Suggest Document");
797
873
  i0.ɵɵelementEnd()();
798
- i0.ɵɵelementStart(16, "button", 15);
874
+ i0.ɵɵelementStart(16, "button", 16);
799
875
  i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.LoadData()); });
800
- i0.ɵɵelement(17, "i", 16);
876
+ i0.ɵɵelement(17, "i", 17);
801
877
  i0.ɵɵtext(18, " Refresh ");
802
878
  i0.ɵɵelementEnd()()();
803
- i0.ɵɵconditionalCreate(19, VectorManagementResourceComponent_Conditional_1_Conditional_19_Template, 4, 0, "div", 17)(20, VectorManagementResourceComponent_Conditional_1_Conditional_20_Template, 19, 0, "div", 18);
879
+ i0.ɵɵconditionalCreate(19, VectorManagementResourceComponent_Conditional_1_Conditional_19_Template, 4, 0, "div", 18)(20, VectorManagementResourceComponent_Conditional_1_Conditional_20_Template, 19, 0, "div", 19);
804
880
  i0.ɵɵelementEnd();
805
- i0.ɵɵelementStart(21, "div", 19)(22, "div", 20)(23, "h4", 21);
806
- i0.ɵɵelement(24, "i", 22);
881
+ i0.ɵɵelementStart(21, "div", 20)(22, "div", 21)(23, "h4", 22);
882
+ i0.ɵɵelement(24, "i", 23);
807
883
  i0.ɵɵtext(25, " Vector DB Health ");
808
884
  i0.ɵɵelementEnd();
809
- i0.ɵɵelementStart(26, "div", 23);
810
- i0.ɵɵelement(27, "span", 24);
811
- i0.ɵɵelementStart(28, "span", 25);
885
+ i0.ɵɵelementStart(26, "div", 24);
886
+ i0.ɵɵelement(27, "span", 25);
887
+ i0.ɵɵelementStart(28, "span", 26);
812
888
  i0.ɵɵtext(29);
813
889
  i0.ɵɵelementEnd()();
814
- i0.ɵɵelementStart(30, "div", 26);
890
+ i0.ɵɵelementStart(30, "div", 27);
815
891
  i0.ɵɵtext(31);
816
892
  i0.ɵɵelementEnd()();
817
- i0.ɵɵelementStart(32, "div", 20)(33, "h4", 21);
818
- i0.ɵɵelement(34, "i", 27);
893
+ i0.ɵɵelementStart(32, "div", 21)(33, "h4", 22);
894
+ i0.ɵɵelement(34, "i", 28);
819
895
  i0.ɵɵtext(35, " Embedding Model ");
820
896
  i0.ɵɵelementEnd();
821
- i0.ɵɵelementStart(36, "div", 28)(37, "div", 29)(38, "span", 30);
897
+ i0.ɵɵelementStart(36, "div", 29)(37, "div", 30)(38, "span", 31);
822
898
  i0.ɵɵtext(39, "Model");
823
899
  i0.ɵɵelementEnd();
824
- i0.ɵɵelementStart(40, "span", 31);
900
+ i0.ɵɵelementStart(40, "span", 32);
825
901
  i0.ɵɵtext(41);
826
902
  i0.ɵɵelementEnd()();
827
- i0.ɵɵconditionalCreate(42, VectorManagementResourceComponent_Conditional_1_Conditional_42_Template, 6, 3, "div", 29);
903
+ i0.ɵɵconditionalCreate(42, VectorManagementResourceComponent_Conditional_1_Conditional_42_Template, 6, 3, "div", 30);
828
904
  i0.ɵɵelementEnd()();
829
- i0.ɵɵelementStart(43, "div", 20)(44, "h4", 21);
830
- i0.ɵɵelement(45, "i", 32);
905
+ i0.ɵɵelementStart(43, "div", 21)(44, "h4", 22);
906
+ i0.ɵɵelement(45, "i", 33);
831
907
  i0.ɵɵtext(46, " Vectorization Coverage ");
832
908
  i0.ɵɵelementEnd();
833
- i0.ɵɵelementStart(47, "div", 33)(48, "div", 34);
834
- i0.ɵɵelement(49, "div", 35);
909
+ i0.ɵɵelementStart(47, "div", 34)(48, "div", 35);
910
+ i0.ɵɵelement(49, "div", 36);
835
911
  i0.ɵɵelementEnd();
836
- i0.ɵɵelementStart(50, "div", 36);
912
+ i0.ɵɵelementStart(50, "div", 37);
837
913
  i0.ɵɵtext(51);
838
914
  i0.ɵɵelementEnd()();
839
- i0.ɵɵelementStart(52, "div", 37);
915
+ i0.ɵɵelementStart(52, "div", 38);
840
916
  i0.ɵɵtext(53);
841
917
  i0.ɵɵpipe(54, "number");
842
918
  i0.ɵɵelementEnd()()()()();
843
- i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template, 47, 7, "div", 38);
844
- i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template, 34, 5, "div", 38);
845
- i0.ɵɵconditionalCreate(57, VectorManagementResourceComponent_Conditional_1_Conditional_57_Template, 11, 3, "div", 38);
919
+ i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template, 57, 13, "div", 39);
920
+ i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template, 34, 5, "div", 39);
921
+ i0.ɵɵconditionalCreate(57, VectorManagementResourceComponent_Conditional_1_Conditional_57_Template, 14, 0, "div", 39);
922
+ i0.ɵɵconditionalCreate(58, VectorManagementResourceComponent_Conditional_1_Conditional_58_Template, 11, 3, "div", 39);
846
923
  } if (rf & 2) {
847
924
  const ctx_r2 = i0.ɵɵnextContext();
848
925
  i0.ɵɵadvance();
@@ -866,13 +943,15 @@ function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if
866
943
  i0.ɵɵadvance(2);
867
944
  i0.ɵɵtextInterpolate1("", ctx_r2.StorageLabel, " of records vectorized");
868
945
  i0.ɵɵadvance(2);
869
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 15, ctx_r2.TotalVectors), " vectors stored ");
946
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 16, ctx_r2.TotalVectors), " vectors stored ");
870
947
  i0.ɵɵadvance(2);
871
948
  i0.ɵɵconditional(ctx_r2.ShowEditPanel ? 55 : -1);
872
949
  i0.ɵɵadvance();
873
950
  i0.ɵɵconditional(ctx_r2.ShowScheduleSyncDialog ? 56 : -1);
874
951
  i0.ɵɵadvance();
875
- i0.ɵɵconditional(ctx_r2.ShowSuggestDialog ? 57 : -1);
952
+ i0.ɵɵconditional(ctx_r2.ShowNoIndexWarning ? 57 : -1);
953
+ i0.ɵɵadvance();
954
+ i0.ɵɵconditional(ctx_r2.ShowSuggestDialog ? 58 : -1);
876
955
  } }
877
956
  let VectorManagementResourceComponent = class VectorManagementResourceComponent extends BaseResourceComponent {
878
957
  cdr = inject(ChangeDetectorRef);
@@ -912,8 +991,21 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
912
991
  EditDocAIModelID = '';
913
992
  EditDocVectorIndexID = '';
914
993
  EditDocStatus = '';
994
+ EditDocTemplate = '';
995
+ IsEditRegenerating = false;
996
+ /** Parse {{ FieldName }} patterns from the edit panel's template */
997
+ get EditDocSelectedFields() {
998
+ if (!this.EditDocTemplate)
999
+ return [];
1000
+ const matches = this.EditDocTemplate.match(/\{\{\s*(\w+(?:\.\w+)*)\s*\}\}/g);
1001
+ if (!matches)
1002
+ return [];
1003
+ return [...new Set(matches.map(m => m.replace(/\{\{\s*/, '').replace(/\s*\}\}/, '')))];
1004
+ }
1005
+ // --- Zero Vector Indexes Warning ---
1006
+ ShowNoIndexWarning = false;
915
1007
  /** Open the edit panel for an entity document */
916
- OpenEditPanel(entityDocumentId) {
1008
+ async OpenEditPanel(entityDocumentId) {
917
1009
  const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));
918
1010
  if (!doc)
919
1011
  return;
@@ -924,8 +1016,35 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
924
1016
  this.EditDocAIModelID = doc.AIModelID;
925
1017
  this.EditDocVectorIndexID = doc.VectorIndexID || '';
926
1018
  this.EditDocStatus = doc.Status;
1019
+ this.EditDocTemplate = '';
1020
+ this.IsEditRegenerating = false;
927
1021
  this.ShowEditPanel = true;
928
1022
  this.cdr.detectChanges();
1023
+ // Load the template text from Template Contents
1024
+ await this.loadEditDocTemplate(doc.TemplateID);
1025
+ }
1026
+ /** Load the template text for the edit panel from the associated Template Contents record */
1027
+ async loadEditDocTemplate(templateId) {
1028
+ if (!templateId)
1029
+ return;
1030
+ try {
1031
+ const rv = new RunView();
1032
+ const result = await rv.RunView({
1033
+ EntityName: 'MJ: Template Contents',
1034
+ ExtraFilter: `TemplateID='${templateId}'`,
1035
+ Fields: ['TemplateText'],
1036
+ ResultType: 'simple',
1037
+ OrderBy: 'Priority ASC',
1038
+ MaxRows: 1,
1039
+ });
1040
+ if (result.Success && result.Results.length > 0 && result.Results[0].TemplateText) {
1041
+ this.EditDocTemplate = result.Results[0].TemplateText;
1042
+ this.cdr.detectChanges();
1043
+ }
1044
+ }
1045
+ catch (error) {
1046
+ console.warn('[VectorManagement] Could not load template text:', error);
1047
+ }
929
1048
  }
930
1049
  CloseEditPanel() {
931
1050
  this.ShowEditPanel = false;
@@ -947,6 +1066,8 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
947
1066
  doc.Status = this.EditDocStatus;
948
1067
  const saved = await doc.Save();
949
1068
  if (saved) {
1069
+ // Also save updated template text if changed
1070
+ await this.saveEditDocTemplate(doc.TemplateID);
950
1071
  MJNotificationService.Instance.CreateSimpleNotification('Entity document updated', 'success', 2500);
951
1072
  this.ShowEditPanel = false;
952
1073
  await this.LoadData();
@@ -965,6 +1086,55 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
965
1086
  this.cdr.detectChanges();
966
1087
  }
967
1088
  }
1089
+ /** Save the edited template text back to the Template Contents record */
1090
+ async saveEditDocTemplate(templateId) {
1091
+ if (!templateId || !this.EditDocTemplate)
1092
+ return;
1093
+ try {
1094
+ const rv = new RunView();
1095
+ const result = await rv.RunView({
1096
+ EntityName: 'MJ: Template Contents',
1097
+ ExtraFilter: `TemplateID='${templateId}'`,
1098
+ ResultType: 'entity_object',
1099
+ OrderBy: 'Priority ASC',
1100
+ MaxRows: 1,
1101
+ });
1102
+ if (result.Success && result.Results.length > 0) {
1103
+ const content = result.Results[0];
1104
+ content.TemplateText = this.EditDocTemplate;
1105
+ await content.Save();
1106
+ }
1107
+ }
1108
+ catch (error) {
1109
+ console.warn('[VectorManagement] Could not save template text:', error);
1110
+ }
1111
+ }
1112
+ /** Regenerate the template using AI for the current edit panel entity */
1113
+ async RegenerateTemplate() {
1114
+ if (!this.EditDocEntityName || this.IsEditRegenerating)
1115
+ return;
1116
+ this.IsEditRegenerating = true;
1117
+ this.cdr.detectChanges();
1118
+ try {
1119
+ const result = await this.callSuggestionPrompt(this.EditDocEntityName, 'duplicate detection');
1120
+ if (result) {
1121
+ this.EditDocTemplate = result.template;
1122
+ MJNotificationService.Instance.CreateSimpleNotification('Template regenerated with AI. Review and save to apply.', 'info', 3000);
1123
+ }
1124
+ }
1125
+ catch (error) {
1126
+ const msg = error instanceof Error ? error.message : String(error);
1127
+ MJNotificationService.Instance.CreateSimpleNotification(`Regeneration failed: ${msg}`, 'error', 5000);
1128
+ }
1129
+ finally {
1130
+ this.IsEditRegenerating = false;
1131
+ this.cdr.detectChanges();
1132
+ }
1133
+ }
1134
+ /** Handle template edits from the edit panel's code editor */
1135
+ OnEditTemplateChange(newValue) {
1136
+ this.EditDocTemplate = newValue;
1137
+ }
968
1138
  async DeleteEntityDocument() {
969
1139
  this.IsEditDeleting = true;
970
1140
  this.cdr.detectChanges();
@@ -1153,12 +1323,16 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1153
1323
  EntitySearchText = '';
1154
1324
  /** Whether the entity picker dropdown is open */
1155
1325
  ShowEntityPicker = false;
1326
+ SelectedEntityIndex = -1;
1327
+ /** Reference to the entity search input for programmatic focus */
1328
+ entitySearchInput;
1156
1329
  // --- Raw entity data (private) ---
1157
1330
  entityDocuments = [];
1158
1331
  vectorDatabases = [];
1159
1332
  vectorIndexes = [];
1160
- recordDocuments = [];
1161
1333
  aiModels = [];
1334
+ /** Lightweight aggregate stats per EntityDocumentID — avoids loading all record documents */
1335
+ erdStats = new Map();
1162
1336
  // ================================================================
1163
1337
  // Lifecycle
1164
1338
  // ================================================================
@@ -1171,6 +1345,7 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1171
1345
  this.NotifyLoadComplete();
1172
1346
  }
1173
1347
  ngOnDestroy() {
1348
+ super.ngOnDestroy();
1174
1349
  this.destroy$.next();
1175
1350
  this.destroy$.complete();
1176
1351
  }
@@ -1349,8 +1524,13 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1349
1524
  this.SyncingIds = next;
1350
1525
  }
1351
1526
  }
1352
- /** Opens the AI suggestion dialog */
1527
+ /** Opens the AI suggestion dialog, or shows a warning if no vector indexes exist */
1353
1528
  OpenSuggestDialog() {
1529
+ if (this.vectorIndexes.length === 0 && this.vectorDatabases.length === 0) {
1530
+ this.ShowNoIndexWarning = true;
1531
+ this.cdr.detectChanges();
1532
+ return;
1533
+ }
1354
1534
  this.SuggestionResult = null;
1355
1535
  this.SuggestEntityName = '';
1356
1536
  this.SuggestUseCase = 'duplicate detection';
@@ -1362,6 +1542,18 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1362
1542
  this.ShowSuggestDialog = true;
1363
1543
  this.cdr.detectChanges();
1364
1544
  }
1545
+ /** Close the no-index warning dialog */
1546
+ CloseNoIndexWarning() {
1547
+ this.ShowNoIndexWarning = false;
1548
+ this.cdr.detectChanges();
1549
+ }
1550
+ /** Navigate to the Configuration section from the no-index warning */
1551
+ async GoToConfiguration() {
1552
+ this.ShowNoIndexWarning = false;
1553
+ this.cdr.detectChanges();
1554
+ // Attempt to open the Config nav item in the current app
1555
+ await this.navigationService.OpenNavItemByName('Config');
1556
+ }
1365
1557
  /** Select an entity from the grouped picker */
1366
1558
  SelectEntity(entityName) {
1367
1559
  this.SuggestEntityName = entityName;
@@ -1382,16 +1574,77 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1382
1574
  }))
1383
1575
  .filter(group => group.Entities.length > 0);
1384
1576
  }
1577
+ // Reset selection to first item when filter changes
1578
+ this.SelectedEntityIndex = this.FlatFilteredEntities.length > 0 ? 0 : -1;
1385
1579
  this.cdr.detectChanges();
1386
1580
  }
1581
+ /**
1582
+ * Get a flat list of all entities across groups (for keyboard navigation indexing)
1583
+ */
1584
+ get FlatFilteredEntities() {
1585
+ return this.FilteredEntityGroups.flatMap(g => g.Entities);
1586
+ }
1587
+ /**
1588
+ * Handle keyboard events in the entity picker search input
1589
+ */
1590
+ OnEntityPickerKeyDown(event) {
1591
+ const entities = this.FlatFilteredEntities;
1592
+ if (entities.length === 0)
1593
+ return;
1594
+ switch (event.key) {
1595
+ case 'ArrowDown':
1596
+ event.preventDefault();
1597
+ this.SelectedEntityIndex = Math.min(this.SelectedEntityIndex + 1, entities.length - 1);
1598
+ this.scrollSelectedEntityIntoView();
1599
+ this.cdr.detectChanges();
1600
+ break;
1601
+ case 'ArrowUp':
1602
+ event.preventDefault();
1603
+ this.SelectedEntityIndex = Math.max(this.SelectedEntityIndex - 1, 0);
1604
+ this.scrollSelectedEntityIntoView();
1605
+ this.cdr.detectChanges();
1606
+ break;
1607
+ case 'Enter':
1608
+ event.preventDefault();
1609
+ if (this.SelectedEntityIndex >= 0 && this.SelectedEntityIndex < entities.length) {
1610
+ this.SelectEntity(entities[this.SelectedEntityIndex].Name);
1611
+ }
1612
+ break;
1613
+ case 'Escape':
1614
+ event.preventDefault();
1615
+ this.ShowEntityPicker = false;
1616
+ this.cdr.detectChanges();
1617
+ break;
1618
+ }
1619
+ }
1620
+ /**
1621
+ * Scroll the currently selected entity picker item into view
1622
+ */
1623
+ scrollSelectedEntityIntoView() {
1624
+ setTimeout(() => {
1625
+ const selected = document.querySelector('.entity-picker-item-focused');
1626
+ if (selected) {
1627
+ selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
1628
+ }
1629
+ }, 0);
1630
+ }
1387
1631
  /** Toggle entity picker visibility */
1388
1632
  ToggleEntityPicker() {
1389
1633
  this.ShowEntityPicker = !this.ShowEntityPicker;
1390
1634
  if (this.ShowEntityPicker) {
1391
1635
  this.FilteredEntityGroups = this.EntityGroups;
1392
1636
  this.EntitySearchText = '';
1637
+ this.cdr.detectChanges();
1638
+ // Focus search input after the @if block renders — deferred past the click event
1639
+ setTimeout(() => {
1640
+ if (this.entitySearchInput?.nativeElement) {
1641
+ this.entitySearchInput.nativeElement.focus();
1642
+ }
1643
+ }, 0);
1644
+ }
1645
+ else {
1646
+ this.cdr.detectChanges();
1393
1647
  }
1394
- this.cdr.detectChanges();
1395
1648
  }
1396
1649
  /** Handle template edits from code editor */
1397
1650
  OnTemplateChange(newValue) {
@@ -1542,36 +1795,48 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1542
1795
  this.entityDocuments = engine.EntityDocuments;
1543
1796
  this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;
1544
1797
  this.vectorIndexes = engine.VectorIndexes;
1545
- // Entity Record Documents and AI Models are not cached in the engine —
1546
- // record documents are high-volume instance data, and AI models are loaded
1547
- // from a different domain. Fetch them via RunView.
1798
+ // Build per-EntityDocument aggregate stats (vector count + last synced).
1799
+ // Each query fetches only the most recent row (MaxRows: 1) and uses
1800
+ // TotalRowCount for the actual vector count avoids loading all rows.
1801
+ // AI Models come from a different domain — fetched in the same batch.
1548
1802
  const rv = new RunView();
1549
- const [erdResult, modelsResult] = await rv.RunViews([
1550
- {
1551
- EntityName: 'MJ: Entity Record Documents',
1552
- ExtraFilter: '',
1553
- Fields: ['ID', 'EntityDocumentID', 'VectorID', 'EntityDocument', 'Entity', '__mj_UpdatedAt'],
1554
- ResultType: 'simple'
1555
- },
1556
- {
1557
- EntityName: 'MJ: AI Models',
1558
- ExtraFilter: '',
1559
- ResultType: 'entity_object'
1803
+ const erdQueries = this.entityDocuments.map(doc => ({
1804
+ EntityName: 'MJ: Entity Record Documents',
1805
+ ExtraFilter: `EntityDocumentID='${doc.ID}' AND VectorID IS NOT NULL`,
1806
+ ResultType: 'simple',
1807
+ Fields: ['__mj_UpdatedAt'],
1808
+ OrderBy: '__mj_UpdatedAt DESC',
1809
+ MaxRows: 1,
1810
+ }));
1811
+ const allQueries = [
1812
+ ...erdQueries,
1813
+ { EntityName: 'MJ: AI Models', ExtraFilter: '', ResultType: 'entity_object' }
1814
+ ];
1815
+ const allResults = await rv.RunViews(allQueries);
1816
+ // Map results back to erdStats
1817
+ this.erdStats.clear();
1818
+ for (let i = 0; i < this.entityDocuments.length; i++) {
1819
+ const result = allResults[i];
1820
+ if (result.Success) {
1821
+ const rows = result.Results;
1822
+ const lastDate = rows.length > 0 ? new Date(rows[0].__mj_UpdatedAt) : null;
1823
+ this.erdStats.set(this.entityDocuments[i].ID, {
1824
+ vectorCount: result.TotalRowCount,
1825
+ lastSynced: lastDate,
1826
+ });
1560
1827
  }
1561
- ]);
1562
- if (erdResult.Success) {
1563
- this.recordDocuments = erdResult.Results;
1564
1828
  }
1829
+ const modelsResult = allResults[allResults.length - 1];
1565
1830
  if (modelsResult.Success) {
1566
1831
  this.aiModels = modelsResult.Results;
1567
1832
  }
1568
1833
  }
1569
1834
  buildSyncRows() {
1570
1835
  this.SyncRows = this.entityDocuments.map(doc => {
1571
- const docsForEntity = this.recordDocuments.filter(rd => UUIDsEqual(rd.EntityDocumentID, doc.ID));
1572
- const vectorCount = docsForEntity.filter(rd => rd.VectorID != null).length;
1573
- const lastSynced = this.computeLastSynced(docsForEntity);
1574
- const status = this.computeSyncStatus(doc, vectorCount, docsForEntity.length);
1836
+ const stats = this.erdStats.get(doc.ID);
1837
+ const vectorCount = stats?.vectorCount ?? 0;
1838
+ const lastSynced = stats?.lastSynced ?? null;
1839
+ const status = this.computeSyncStatus(doc, vectorCount);
1575
1840
  // Preserve progress info from any active sync
1576
1841
  const existingRow = this.SyncRows.find(r => UUIDsEqual(r.EntityDocumentID, doc.ID));
1577
1842
  return {
@@ -1586,44 +1851,32 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1586
1851
  };
1587
1852
  });
1588
1853
  }
1589
- computeLastSynced(records) {
1590
- if (records.length === 0)
1591
- return null;
1592
- const dates = records
1593
- .map(r => new Date(r.__mj_UpdatedAt))
1594
- .filter(d => !isNaN(d.getTime()));
1595
- if (dates.length === 0)
1596
- return null;
1597
- return new Date(Math.max(...dates.map(d => d.getTime())));
1598
- }
1599
- computeSyncStatus(doc, vectorCount, totalRecords) {
1854
+ computeSyncStatus(doc, vectorCount) {
1600
1855
  if (this.SyncingIds.has(doc.ID)) {
1601
1856
  return 'Syncing';
1602
1857
  }
1603
1858
  if (doc.Status === 'Inactive') {
1604
1859
  return 'Pending';
1605
1860
  }
1606
- if (totalRecords === 0) {
1607
- return 'Pending';
1608
- }
1609
- // If there are any vectors, consider it synced — partial syncs
1610
- // still represent a successful state since the pipeline ran
1611
1861
  if (vectorCount > 0) {
1612
1862
  return 'Synced';
1613
1863
  }
1614
- return 'Synced';
1864
+ return 'Pending';
1615
1865
  }
1616
1866
  buildKPICards() {
1617
- this.TotalVectors = this.recordDocuments.filter(rd => rd.VectorID != null).length;
1867
+ let totalVectors = 0;
1868
+ let latestSync = null;
1869
+ for (const stats of this.erdStats.values()) {
1870
+ totalVectors += stats.vectorCount;
1871
+ if (stats.lastSynced && (!latestSync || stats.lastSynced > latestSync)) {
1872
+ latestSync = stats.lastSynced;
1873
+ }
1874
+ }
1875
+ this.TotalVectors = totalVectors;
1618
1876
  const entitiesSynced = new Set(this.entityDocuments
1619
1877
  .filter(d => d.Status === 'Active')
1620
1878
  .map(d => d.EntityID)).size;
1621
- const allDates = this.recordDocuments
1622
- .map(r => new Date(r.__mj_UpdatedAt))
1623
- .filter(d => !isNaN(d.getTime()));
1624
- const lastSyncDate = allDates.length > 0
1625
- ? new Date(Math.max(...allDates.map(d => d.getTime())))
1626
- : null;
1879
+ const lastSyncDate = latestSync;
1627
1880
  this.KPICards = [
1628
1881
  {
1629
1882
  title: 'Total Vectors',
@@ -1668,7 +1921,7 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1668
1921
  const db = this.vectorDatabases[0];
1669
1922
  this.VectorDBName = db.Name;
1670
1923
  // Determine health based on whether we have records with vectors
1671
- const hasVectors = this.recordDocuments.some(rd => rd.VectorID != null);
1924
+ const hasVectors = this.TotalVectors > 0;
1672
1925
  this.VectorDBStatus = hasVectors ? 'Healthy' : 'Degraded';
1673
1926
  }
1674
1927
  else {
@@ -1690,10 +1943,9 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1690
1943
  }
1691
1944
  }
1692
1945
  buildStorageUsage() {
1693
- // Estimate storage as a ratio of vectorized records vs total record documents
1694
- const total = this.recordDocuments.length;
1695
- const vectorized = this.recordDocuments.filter(rd => rd.VectorID != null).length;
1696
- this.StorageUsagePercent = total > 0 ? Math.round((vectorized / total) * 100) : 0;
1946
+ // All records in erdStats already have vectors (query filters VectorID IS NOT NULL),
1947
+ // so coverage is 100% if any exist.
1948
+ this.StorageUsagePercent = this.TotalVectors > 0 ? 100 : 0;
1697
1949
  }
1698
1950
  /** Check if vector DB and embedding model are configured, populate selection lists */
1699
1951
  checkPrerequisites() {
@@ -1858,15 +2110,19 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1858
2110
  const rv = new RunView();
1859
2111
  const result = await rv.RunView({
1860
2112
  EntityName: 'MJ: Entity Record Documents',
1861
- ExtraFilter: `EntityDocumentID='${entityDocumentId}'`,
1862
- ResultType: 'entity_object'
2113
+ ExtraFilter: `EntityDocumentID='${entityDocumentId}' AND VectorID IS NOT NULL`,
2114
+ Fields: ['__mj_UpdatedAt'],
2115
+ OrderBy: '__mj_UpdatedAt DESC',
2116
+ ResultType: 'simple',
2117
+ MaxRows: 1
1863
2118
  });
1864
2119
  if (result.Success) {
1865
- const docs = result.Results;
1866
- row.VectorCount = docs.filter(d => d.VectorID != null).length;
1867
- row.LastSynced = this.computeLastSynced(docs);
2120
+ row.VectorCount = result.TotalRowCount;
2121
+ row.LastSynced = result.Results.length > 0 ? new Date(result.Results[0].__mj_UpdatedAt) : null;
1868
2122
  row.Status = row.VectorCount > 0 ? 'Synced' : 'Pending';
1869
2123
  row.PercentComplete = 100;
2124
+ this.erdStats.set(entityDocumentId, { vectorCount: row.VectorCount, lastSynced: row.LastSynced });
2125
+ this.buildKPICards();
1870
2126
  this.cdr.detectChanges();
1871
2127
  }
1872
2128
  }
@@ -1946,11 +2202,16 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
1946
2202
  };
1947
2203
  }
1948
2204
  static ɵfac = /*@__PURE__*/ (() => { let ɵVectorManagementResourceComponent_BaseFactory; return function VectorManagementResourceComponent_Factory(__ngFactoryType__) { return (ɵVectorManagementResourceComponent_BaseFactory || (ɵVectorManagementResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(VectorManagementResourceComponent)))(__ngFactoryType__ || VectorManagementResourceComponent); }; })();
1949
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "vector-loading"], ["text", "Loading vector management data..."], [1, "vector-dashboard"], [1, "view-mode-toggle"], [1, "kpi-row"], [3, "data"], [1, "content-area"], [1, "sync-table-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-table-list"], [1, "panel-actions"], ["title", "Use AI to suggest an Entity Document template", 1, "suggest-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "suggest-btn-text"], ["title", "Refresh data", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "empty-state"], [1, "table-wrapper"], [1, "sidebar"], [1, "sidebar-card"], [1, "sidebar-title"], [1, "fa-solid", "fa-heart-pulse"], [1, "health-row"], [1, "health-dot"], [1, "health-label"], [1, "health-status"], [1, "fa-solid", "fa-microchip"], [1, "model-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "fa-solid", "fa-hard-drive"], [1, "gauge-container"], [1, "gauge-bar"], [1, "gauge-fill"], [1, "gauge-label"], [1, "storage-detail"], [1, "slide-panel-overlay"], [1, "view-mode-btn", 3, "click"], [1, "fa-solid", "fa-cubes"], [1, "fa-solid", "fa-gauge-high"], [1, "fa-solid", "fa-folder-open"], [1, "sync-table"], [1, "text-right"], [1, "text-center"], [1, "entity-name"], [1, "document-name"], [1, "text-right", "vector-count"], [1, "last-synced"], [1, "status-badge"], [1, "text-center", "actions-cell"], ["title", "Sync now", 1, "sync-btn", 3, "click", "disabled"], ["title", "Schedule recurring sync", 1, "schedule-btn", 3, "click"], [1, "fa-regular", "fa-clock"], ["title", "Edit entity document", 1, "edit-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "slide-panel-overlay", 3, "click"], [1, "slide-panel", "open", 3, "click"], [1, "suggest-dialog-header"], [1, "suggest-dialog-title"], [1, "suggest-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "suggest-dialog-body"], [1, "suggest-form"], [1, "suggest-field"], [1, "suggest-label"], [1, "edit-readonly-value"], ["type", "text", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "suggest-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "suggest-select", 3, "ngModel"], [1, "edit-readonly-value", 2, "font-size", "13px", "color", "var(--mj-text-muted)"], ["value", "Active"], ["value", "Inactive"], [1, "result-actions", 2, "margin-top", "1rem"], ["text", "Saving...", "size", "small"], ["value", ""], [1, "suggest-submit-btn", 3, "click"], [1, "fa-solid", "fa-save"], [1, "edit-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "suggest-close-action", 3, "click"], [1, "schedule-dialog", 3, "click"], ["type", "text", "placeholder", "0 2 * * *", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "schedule-cron-preview"], [1, "fa-solid", "fa-info-circle"], [1, "suggest-field", "schedule-toggle-row"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-check"], [1, "slide-panel", 3, "click"], [1, "suggest-result"], [1, "entity-picker"], [1, "entity-picker-trigger", 3, "click"], [1, "fa-solid", "fa-chevron-down", "entity-picker-arrow"], [1, "entity-picker-dropdown"], [1, "use-case-options"], [1, "use-case-btn", 3, "click"], [1, "fa-solid", "fa-clone"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-tags"], [1, "suggest-submit-btn", 3, "click", "disabled"], [1, "suggestion-error"], [1, "fa-solid", "fa-table"], [1, "entity-picker-value"], [1, "fa-solid", "fa-search"], [1, "entity-picker-placeholder"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", "autofocus", "", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "ngModel"], [1, "entity-picker-list"], [1, "entity-picker-group"], [1, "entity-picker-empty"], [1, "entity-picker-group-header"], [1, "fa-solid", "fa-database"], [1, "entity-picker-item", 3, "entity-picker-item-selected"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], [1, "result-tags"], [1, "result-tag"], [1, "result-section", "result-thresholds"], [1, "threshold-item"], [1, "threshold-label"], [1, "threshold-value"], [1, "result-reasoning"], [1, "suggest-field", 2, "margin-top", "0.75rem"], [1, "result-actions"], [1, "save-spinner"], [1, "result-relationship"], [1, "rel-name"], [1, "rel-fields"], [1, "fa-solid", "fa-floppy-disk"], [1, "suggest-submit-btn", "suggest-try-again-btn", 3, "click"], [1, "fa-solid", "fa-rotate"]], template: function VectorManagementResourceComponent_Template(rf, ctx) { if (rf & 1) {
1950
- i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 0)(1, VectorManagementResourceComponent_Conditional_1_Template, 58, 17);
2205
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], viewQuery: function VectorManagementResourceComponent_Query(rf, ctx) { if (rf & 1) {
2206
+ i0.ɵɵviewQuery(_c0, 5);
2207
+ } if (rf & 2) {
2208
+ let _t;
2209
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entitySearchInput = _t.first);
2210
+ } }, inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [["entitySearchInput", ""], [1, "vector-loading"], ["text", "Loading vector management data..."], [1, "vector-dashboard"], [1, "view-mode-toggle"], [1, "kpi-row"], [3, "data"], [1, "content-area"], [1, "sync-table-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-table-list"], [1, "panel-actions"], ["title", "Use AI to suggest an Entity Document template", 1, "suggest-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "suggest-btn-text"], ["title", "Refresh data", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "empty-state"], [1, "table-wrapper"], [1, "sidebar"], [1, "sidebar-card"], [1, "sidebar-title"], [1, "fa-solid", "fa-heart-pulse"], [1, "health-row"], [1, "health-dot"], [1, "health-label"], [1, "health-status"], [1, "fa-solid", "fa-microchip"], [1, "model-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "fa-solid", "fa-hard-drive"], [1, "gauge-container"], [1, "gauge-bar"], [1, "gauge-fill"], [1, "gauge-label"], [1, "storage-detail"], [1, "slide-panel-overlay"], [1, "view-mode-btn", 3, "click"], [1, "fa-solid", "fa-cubes"], [1, "fa-solid", "fa-gauge-high"], [1, "fa-solid", "fa-folder-open"], [1, "sync-table"], [1, "text-right"], [1, "text-center"], [1, "entity-name"], [1, "document-name"], [1, "text-right", "vector-count"], [1, "last-synced"], [1, "status-badge"], [1, "text-center", "actions-cell"], ["title", "Sync now", 1, "sync-btn", 3, "click", "disabled"], ["title", "Schedule recurring sync", 1, "schedule-btn", 3, "click"], [1, "fa-regular", "fa-clock"], ["title", "Edit entity document", 1, "edit-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "slide-panel-overlay", 3, "click"], [1, "slide-panel", "open", 3, "click"], [1, "suggest-dialog-header"], [1, "suggest-dialog-title"], [1, "suggest-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "suggest-dialog-body"], [1, "suggest-form"], [1, "suggest-field"], [1, "suggest-label"], [1, "edit-readonly-value"], [1, "edit-template-header"], ["title", "Regenerate template using AI", 1, "edit-regenerate-btn", 3, "click", "disabled"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], ["type", "text", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "suggest-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "suggest-select", 3, "ngModel"], [1, "edit-readonly-value", 2, "font-size", "13px", "color", "var(--mj-text-muted)"], ["value", "Active"], ["value", "Inactive"], [1, "result-actions", 2, "margin-top", "1rem"], ["text", "Saving...", "size", "small"], [1, "result-tags"], [1, "result-tag"], ["value", ""], [1, "suggest-submit-btn", 3, "click"], [1, "fa-solid", "fa-save"], [1, "edit-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "suggest-close-action", 3, "click"], [1, "schedule-dialog", 3, "click"], ["type", "text", "placeholder", "0 2 * * *", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "schedule-cron-preview"], [1, "fa-solid", "fa-info-circle"], [1, "suggest-field", "schedule-toggle-row"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-check"], [1, "no-index-warning-dialog", 3, "click"], [1, "no-index-warning-icon"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "no-index-warning-title"], [1, "no-index-warning-message"], [1, "no-index-warning-actions"], [1, "fa-solid", "fa-gear"], [1, "slide-panel", 3, "click"], [1, "suggest-result"], [1, "entity-picker"], [1, "entity-picker-trigger", 3, "click"], [1, "fa-solid", "fa-chevron-down", "entity-picker-arrow"], [1, "entity-picker-dropdown"], [1, "use-case-options"], [1, "use-case-btn", 3, "click"], [1, "fa-solid", "fa-clone"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-tags"], [1, "suggest-submit-btn", 3, "click", "disabled"], [1, "suggestion-error"], [1, "fa-solid", "fa-table"], [1, "entity-picker-value"], [1, "fa-solid", "fa-search"], [1, "entity-picker-placeholder"], [1, "entity-picker-dropdown", 3, "mousedown"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "keydown", "ngModel"], [1, "entity-picker-list"], [1, "entity-picker-group"], [1, "entity-picker-empty"], [1, "entity-picker-group-header"], [1, "fa-solid", "fa-database"], [1, "entity-picker-item", 3, "entity-picker-item-selected", "entity-picker-item-focused"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [1, "result-section", "result-thresholds"], [1, "threshold-item"], [1, "threshold-label"], [1, "threshold-value"], [1, "result-reasoning"], [1, "suggest-field", 2, "margin-top", "0.75rem"], [1, "result-actions"], [1, "save-spinner"], [1, "result-relationship"], [1, "rel-name"], [1, "rel-fields"], [1, "fa-solid", "fa-floppy-disk"], [1, "suggest-submit-btn", "suggest-try-again-btn", 3, "click"], [1, "fa-solid", "fa-rotate"]], template: function VectorManagementResourceComponent_Template(rf, ctx) { if (rf & 1) {
2211
+ i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 1)(1, VectorManagementResourceComponent_Conditional_1_Template, 59, 18);
1951
2212
  } if (rf & 2) {
1952
2213
  i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
1953
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.schedule-dialog[_ngcontent-%COMP%] {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\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: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
2214
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.schedule-dialog[_ngcontent-%COMP%] {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 100000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\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: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-item-focused[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -2px;\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n.edit-template-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.edit-regenerate-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.no-index-warning-dialog[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n padding: 32px;\n text-align: center;\n}\n\n.no-index-warning-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n margin: 0 auto 16px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n}\n\n.no-index-warning-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-warning);\n}\n\n.no-index-warning-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.no-index-warning-message[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n}\n\n.no-index-warning-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
1954
2215
  };
1955
2216
  VectorManagementResourceComponent = __decorate([
1956
2217
  RegisterClass(BaseResourceComponent, 'VectorManagementResource')
@@ -1958,11 +2219,14 @@ VectorManagementResourceComponent = __decorate([
1958
2219
  export { VectorManagementResourceComponent };
1959
2220
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VectorManagementResourceComponent, [{
1960
2221
  type: Component,
1961
- args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"schedule-btn\"\n (click)=\"OpenScheduleSyncDialog(row.EntityDocumentID)\"\n title=\"Schedule recurring sync\">\n <i class=\"fa-regular fa-clock\"></i>\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Schedule Sync Dialog -->\n @if (ShowScheduleSyncDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseScheduleSyncDialog()\">\n <div class=\"schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Schedule Vector Sync\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseScheduleSyncDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity Document</label>\n <span class=\"edit-readonly-value\">{{ ScheduleSyncDocName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Action</label>\n <span class=\"edit-readonly-value\">__VectorizeEntity</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Cron Expression</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"ScheduleSyncCron\" placeholder=\"0 2 * * *\" />\n <div class=\"schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetScheduleCronPreview(ScheduleSyncCron) }}\n </div>\n </div>\n <div class=\"suggest-field schedule-toggle-row\">\n <label class=\"suggest-label\">Enabled</label>\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"ScheduleSyncEnabled\" />\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (ScheduleSyncSaving) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveScheduleSync()\">\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseScheduleSyncDialog()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n autofocus />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Schedule Dialog --- */\n.schedule-dialog {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\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: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
2222
+ args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"schedule-btn\"\n (click)=\"OpenScheduleSyncDialog(row.EntityDocumentID)\"\n title=\"Schedule recurring sync\">\n <i class=\"fa-regular fa-clock\"></i>\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n\n <!-- Template Section -->\n <div class=\"suggest-field\">\n <div class=\"edit-template-header\">\n <label class=\"suggest-label\">Template</label>\n <button class=\"edit-regenerate-btn\"\n [disabled]=\"IsEditRegenerating\"\n (click)=\"RegenerateTemplate()\"\n title=\"Regenerate template using AI\">\n @if (IsEditRegenerating) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Regenerating...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Regenerate with AI\n }\n </button>\n </div>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditDocTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnEditTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n\n <!-- Selected Fields (parsed from template) -->\n @if (EditDocSelectedFields.length > 0) {\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Selected Fields</label>\n <div class=\"result-tags\">\n @for (field of EditDocSelectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n }\n\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Schedule Sync Dialog -->\n @if (ShowScheduleSyncDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseScheduleSyncDialog()\">\n <div class=\"schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Schedule Vector Sync\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseScheduleSyncDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity Document</label>\n <span class=\"edit-readonly-value\">{{ ScheduleSyncDocName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Action</label>\n <span class=\"edit-readonly-value\">__VectorizeEntity</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Cron Expression</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"ScheduleSyncCron\" placeholder=\"0 2 * * *\" />\n <div class=\"schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetScheduleCronPreview(ScheduleSyncCron) }}\n </div>\n </div>\n <div class=\"suggest-field schedule-toggle-row\">\n <label class=\"suggest-label\">Enabled</label>\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"ScheduleSyncEnabled\" />\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (ScheduleSyncSaving) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveScheduleSync()\">\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseScheduleSyncDialog()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- No Vector Index Warning Dialog -->\n @if (ShowNoIndexWarning) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseNoIndexWarning()\">\n <div class=\"no-index-warning-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"no-index-warning-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <h3 class=\"no-index-warning-title\">Vector Index Required</h3>\n <p class=\"no-index-warning-message\">\n You need to create at least one vector database and index before creating entity documents.\n Go to the Configuration section to set up a vector database and create an index.\n </p>\n <div class=\"no-index-warning-actions\">\n <button class=\"suggest-submit-btn\" (click)=\"GoToConfiguration()\">\n <i class=\"fa-solid fa-gear\"></i> Go to Configuration\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseNoIndexWarning()\">\n Close\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\" (mousedown)=\"$event.stopPropagation()\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input #entitySearchInput\n type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n (keydown)=\"OnEntityPickerKeyDown($event)\" />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n [class.entity-picker-item-focused]=\"FlatFilteredEntities[SelectedEntityIndex]?.ID === entity.ID\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Schedule Dialog --- */\n.schedule-dialog {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 100000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\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: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-item-focused {\n background: var(--mj-bg-surface-hover);\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: -2px;\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* --- Edit Panel Template Header --- */\n.edit-template-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.edit-regenerate-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.edit-regenerate-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.edit-regenerate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- No Vector Index Warning Dialog --- */\n.no-index-warning-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n padding: 32px;\n text-align: center;\n}\n\n.no-index-warning-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n margin: 0 auto 16px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n}\n\n.no-index-warning-icon i {\n font-size: 24px;\n color: var(--mj-status-warning);\n}\n\n.no-index-warning-title {\n margin: 0 0 8px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.no-index-warning-message {\n margin: 0 0 24px 0;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n}\n\n.no-index-warning-actions {\n display: flex;\n gap: 8px;\n justify-content: center;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
1962
2223
  }], null, { EmbeddedMode: [{
1963
2224
  type: Input
2225
+ }], entitySearchInput: [{
2226
+ type: ViewChild,
2227
+ args: ['entitySearchInput']
1964
2228
  }] }); })();
1965
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber: 72 }); })();
2229
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber: 71 }); })();
1966
2230
  export function LoadVectorManagementResource() {
1967
2231
  // Prevents tree-shaking
1968
2232
  }