@memberjunction/ng-dashboards 5.23.0 → 5.25.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 (296) 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 +717 -8
  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 +7166 -1889
  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 +50 -4
  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 +759 -491
  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 +62 -7
  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 +825 -359
  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 +470 -437
  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 +2 -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 +3 -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 +2 -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 +3 -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 +3 -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 +3 -0
  163. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  164. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +412 -0
  165. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
  166. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4267 -0
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
  168. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +39 -4
  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 +187 -13
  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 -2
  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 +329 -224
  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 +76 -0
  177. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
  178. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +602 -0
  179. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
  180. package/dist/KnowledgeHub/index.d.ts +2 -1
  181. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  182. package/dist/KnowledgeHub/index.js +2 -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/__tests__/analytics-resource.test.d.ts +2 -0
  265. package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
  266. package/dist/__tests__/analytics-resource.test.js +181 -0
  267. package/dist/__tests__/analytics-resource.test.js.map +1 -0
  268. package/dist/__tests__/scheduling.test.d.ts +2 -0
  269. package/dist/__tests__/scheduling.test.d.ts.map +1 -0
  270. package/dist/__tests__/scheduling.test.js +205 -0
  271. package/dist/__tests__/scheduling.test.js.map +1 -0
  272. package/dist/ai-dashboards.module.d.ts +22 -18
  273. package/dist/ai-dashboards.module.d.ts.map +1 -1
  274. package/dist/ai-dashboards.module.js +29 -10
  275. package/dist/ai-dashboards.module.js.map +1 -1
  276. package/dist/core-dashboards.module.d.ts +19 -18
  277. package/dist/core-dashboards.module.d.ts.map +1 -1
  278. package/dist/core-dashboards.module.js +8 -0
  279. package/dist/core-dashboards.module.js.map +1 -1
  280. package/dist/data-explorer-dashboards.module.d.ts +2 -1
  281. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  282. package/dist/data-explorer-dashboards.module.js +7 -3
  283. package/dist/data-explorer-dashboards.module.js.map +1 -1
  284. package/dist/public-api.d.ts +2 -1
  285. package/dist/public-api.d.ts.map +1 -1
  286. package/dist/public-api.js +3 -1
  287. package/dist/public-api.js.map +1 -1
  288. package/dist/shared/entity-field-display.d.ts +44 -0
  289. package/dist/shared/entity-field-display.d.ts.map +1 -0
  290. package/dist/shared/entity-field-display.js +118 -0
  291. package/dist/shared/entity-field-display.js.map +1 -0
  292. package/package.json +47 -46
  293. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -85
  294. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
  295. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -461
  296. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
@@ -0,0 +1,602 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /**
8
+ * @fileoverview Knowledge Hub Scheduled Pipelines Dashboard Tab
9
+ *
10
+ * Full-page resource component for managing scheduled pipelines within the
11
+ * Knowledge Hub application. Displays job cards in a compact grid, recent
12
+ * activity table, and provides create/edit via the reusable
13
+ * ScheduledJobDialogComponent from @memberjunction/ng-scheduling.
14
+ *
15
+ * Registered as BaseResourceComponent for the Knowledge Hub application.
16
+ */
17
+ import { Component, ChangeDetectorRef, inject } from '@angular/core';
18
+ import { Subject } from 'rxjs';
19
+ import { Metadata, RunView } from '@memberjunction/core';
20
+ import { RegisterClass } from '@memberjunction/global';
21
+ import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';
22
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
23
+ import { ScheduledJobService } from '@memberjunction/ng-scheduling';
24
+ import * as i0 from "@angular/core";
25
+ import * as i1 from "@angular/forms";
26
+ import * as i2 from "@memberjunction/ng-shared-generic";
27
+ import * as i3 from "@memberjunction/ng-scheduling";
28
+ const _forTrack0 = ($index, $item) => $item.ID;
29
+ function SchedulingResourceComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "div", 0);
31
+ i0.ɵɵelement(1, "mj-loading", 1);
32
+ i0.ɵɵelementEnd();
33
+ } }
34
+ function SchedulingResourceComponent_Conditional_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelementStart(0, "strong");
36
+ i0.ɵɵtext(1);
37
+ i0.ɵɵelementEnd();
38
+ i0.ɵɵtext(2, " active ");
39
+ } if (rf & 2) {
40
+ const ctx_r1 = i0.ɵɵnextContext(2);
41
+ i0.ɵɵadvance();
42
+ i0.ɵɵtextInterpolate(ctx_r1.ActiveCount);
43
+ } }
44
+ function SchedulingResourceComponent_Conditional_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵtext(0, " \u00B7 ");
46
+ i0.ɵɵelementStart(1, "strong");
47
+ i0.ɵɵtext(2);
48
+ i0.ɵɵelementEnd();
49
+ i0.ɵɵtext(3, " paused ");
50
+ } if (rf & 2) {
51
+ const ctx_r1 = i0.ɵɵnextContext(2);
52
+ i0.ɵɵadvance(2);
53
+ i0.ɵɵtextInterpolate(ctx_r1.PausedCount);
54
+ } }
55
+ function SchedulingResourceComponent_Conditional_1_Conditional_20_For_2_For_11_Template(rf, ctx) { if (rf & 1) {
56
+ i0.ɵɵelement(0, "span", 36);
57
+ } if (rf & 2) {
58
+ const dotClass_r5 = ctx.$implicit;
59
+ i0.ɵɵclassMap(dotClass_r5);
60
+ } }
61
+ function SchedulingResourceComponent_Conditional_1_Conditional_20_For_2_Template(rf, ctx) { if (rf & 1) {
62
+ const _r3 = i0.ɵɵgetCurrentView();
63
+ i0.ɵɵelementStart(0, "div", 22);
64
+ i0.ɵɵlistener("click", function SchedulingResourceComponent_Conditional_1_Conditional_20_For_2_Template_div_click_0_listener() { const job_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnEditJob(job_r4)); });
65
+ i0.ɵɵelementStart(1, "div", 23);
66
+ i0.ɵɵelement(2, "span", 24);
67
+ i0.ɵɵelementStart(3, "div", 25)(4, "div", 26);
68
+ i0.ɵɵtext(5);
69
+ i0.ɵɵelementEnd();
70
+ i0.ɵɵelementStart(6, "div", 27);
71
+ i0.ɵɵelement(7, "i", 28);
72
+ i0.ɵɵtext(8);
73
+ i0.ɵɵelementEnd()()();
74
+ i0.ɵɵelementStart(9, "div", 29);
75
+ i0.ɵɵrepeaterCreate(10, SchedulingResourceComponent_Conditional_1_Conditional_20_For_2_For_11_Template, 1, 2, "span", 30, i0.ɵɵrepeaterTrackByIndex);
76
+ i0.ɵɵelementStart(12, "span", 31);
77
+ i0.ɵɵtext(13, "last 7 runs");
78
+ i0.ɵɵelementEnd()();
79
+ i0.ɵɵelementStart(14, "div", 32)(15, "span", 33);
80
+ i0.ɵɵelement(16, "i", 28);
81
+ i0.ɵɵtext(17, " Last: ");
82
+ i0.ɵɵelementStart(18, "strong");
83
+ i0.ɵɵtext(19);
84
+ i0.ɵɵelementEnd()();
85
+ i0.ɵɵelementStart(20, "span", 33);
86
+ i0.ɵɵelement(21, "i", 34);
87
+ i0.ɵɵelementStart(22, "strong");
88
+ i0.ɵɵtext(23);
89
+ i0.ɵɵelementEnd()();
90
+ i0.ɵɵelementStart(24, "span", 33);
91
+ i0.ɵɵelement(25, "i", 35);
92
+ i0.ɵɵtext(26, " Next: ");
93
+ i0.ɵɵelementStart(27, "strong");
94
+ i0.ɵɵtext(28);
95
+ i0.ɵɵelementEnd()()()();
96
+ } if (rf & 2) {
97
+ const job_r4 = ctx.$implicit;
98
+ const ctx_r1 = i0.ɵɵnextContext(3);
99
+ i0.ɵɵclassProp("paused", job_r4.Status === "Paused")("disabled", job_r4.Status === "Disabled");
100
+ i0.ɵɵadvance(2);
101
+ i0.ɵɵclassProp("dot-active", job_r4.Status === "Active")("dot-paused", job_r4.Status === "Paused")("dot-disabled", job_r4.Status === "Disabled");
102
+ i0.ɵɵadvance(3);
103
+ i0.ɵɵtextInterpolate(job_r4.Name);
104
+ i0.ɵɵadvance(3);
105
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.GetCronDescription(job_r4.CronExpression), " ");
106
+ i0.ɵɵadvance(2);
107
+ i0.ɵɵrepeater(ctx_r1.GetSparkline(job_r4.ID));
108
+ i0.ɵɵadvance(9);
109
+ i0.ɵɵtextInterpolate(ctx_r1.GetTimeAgo(job_r4.LastRunAt));
110
+ i0.ɵɵadvance(4);
111
+ i0.ɵɵtextInterpolate(ctx_r1.GetSuccessRate(job_r4));
112
+ i0.ɵɵadvance(5);
113
+ i0.ɵɵtextInterpolate(ctx_r1.GetTimeUntil(job_r4.NextRunAt));
114
+ } }
115
+ function SchedulingResourceComponent_Conditional_1_Conditional_20_Template(rf, ctx) { if (rf & 1) {
116
+ i0.ɵɵelementStart(0, "div", 14);
117
+ i0.ɵɵrepeaterCreate(1, SchedulingResourceComponent_Conditional_1_Conditional_20_For_2_Template, 29, 15, "div", 21, _forTrack0);
118
+ i0.ɵɵelementEnd();
119
+ } if (rf & 2) {
120
+ const ctx_r1 = i0.ɵɵnextContext(2);
121
+ i0.ɵɵadvance();
122
+ i0.ɵɵrepeater(ctx_r1.FilteredJobs);
123
+ } }
124
+ function SchedulingResourceComponent_Conditional_1_Conditional_21_Template(rf, ctx) { if (rf & 1) {
125
+ i0.ɵɵelementStart(0, "div", 15);
126
+ i0.ɵɵelement(1, "i", 37);
127
+ i0.ɵɵelementStart(2, "p");
128
+ i0.ɵɵtext(3, "No Knowledge Hub schedules found");
129
+ i0.ɵɵelementEnd();
130
+ i0.ɵɵelementStart(4, "span");
131
+ i0.ɵɵtext(5, "Create a new schedule to automate classification and vector sync");
132
+ i0.ɵɵelementEnd()();
133
+ } }
134
+ function SchedulingResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
135
+ const _r1 = i0.ɵɵgetCurrentView();
136
+ i0.ɵɵelementStart(0, "div", 2)(1, "button", 3);
137
+ i0.ɵɵlistener("click", function SchedulingResourceComponent_Conditional_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnNewSchedule()); });
138
+ i0.ɵɵelement(2, "i", 4);
139
+ i0.ɵɵtext(3, " New Schedule ");
140
+ i0.ɵɵelementEnd();
141
+ i0.ɵɵelementStart(4, "select", 5);
142
+ i0.ɵɵtwoWayListener("ngModelChange", function SchedulingResourceComponent_Conditional_1_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.StatusFilter, $event) || (ctx_r1.StatusFilter = $event); return i0.ɵɵresetView($event); });
143
+ i0.ɵɵlistener("ngModelChange", function SchedulingResourceComponent_Conditional_1_Template_select_ngModelChange_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterChanged()); });
144
+ i0.ɵɵelementStart(5, "option", 6);
145
+ i0.ɵɵtext(6, "All Statuses");
146
+ i0.ɵɵelementEnd();
147
+ i0.ɵɵelementStart(7, "option", 7);
148
+ i0.ɵɵtext(8, "Active");
149
+ i0.ɵɵelementEnd();
150
+ i0.ɵɵelementStart(9, "option", 8);
151
+ i0.ɵɵtext(10, "Paused");
152
+ i0.ɵɵelementEnd();
153
+ i0.ɵɵelementStart(11, "option", 9);
154
+ i0.ɵɵtext(12, "Disabled");
155
+ i0.ɵɵelementEnd();
156
+ i0.ɵɵelementStart(13, "option", 10);
157
+ i0.ɵɵtext(14, "Pending");
158
+ i0.ɵɵelementEnd()();
159
+ i0.ɵɵelementStart(15, "input", 11);
160
+ i0.ɵɵtwoWayListener("ngModelChange", function SchedulingResourceComponent_Conditional_1_Template_input_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.SearchQuery, $event) || (ctx_r1.SearchQuery = $event); return i0.ɵɵresetView($event); });
161
+ i0.ɵɵlistener("ngModelChange", function SchedulingResourceComponent_Conditional_1_Template_input_ngModelChange_15_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSearchChanged()); });
162
+ i0.ɵɵelementEnd();
163
+ i0.ɵɵelement(16, "div", 12);
164
+ i0.ɵɵelementStart(17, "span", 13);
165
+ i0.ɵɵconditionalCreate(18, SchedulingResourceComponent_Conditional_1_Conditional_18_Template, 3, 1);
166
+ i0.ɵɵconditionalCreate(19, SchedulingResourceComponent_Conditional_1_Conditional_19_Template, 4, 1);
167
+ i0.ɵɵelementEnd()();
168
+ i0.ɵɵconditionalCreate(20, SchedulingResourceComponent_Conditional_1_Conditional_20_Template, 3, 0, "div", 14)(21, SchedulingResourceComponent_Conditional_1_Conditional_21_Template, 6, 0, "div", 15);
169
+ i0.ɵɵelementStart(22, "div", 16)(23, "button", 17);
170
+ i0.ɵɵlistener("click", function SchedulingResourceComponent_Conditional_1_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.GoToSchedulingApp()); });
171
+ i0.ɵɵelement(24, "i", 18);
172
+ i0.ɵɵtext(25, " Open Scheduling App ");
173
+ i0.ɵɵelementEnd();
174
+ i0.ɵɵelementStart(26, "span", 19);
175
+ i0.ɵɵtext(27, "Manage all scheduled jobs across the system");
176
+ i0.ɵɵelementEnd()();
177
+ i0.ɵɵelementStart(28, "mj-scheduled-job-dialog", 20);
178
+ i0.ɵɵlistener("Close", function SchedulingResourceComponent_Conditional_1_Template_mj_scheduled_job_dialog_Close_28_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDialogClosed($event)); });
179
+ i0.ɵɵelementEnd();
180
+ } if (rf & 2) {
181
+ const ctx_r1 = i0.ɵɵnextContext();
182
+ i0.ɵɵadvance(4);
183
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.StatusFilter);
184
+ i0.ɵɵadvance(11);
185
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SearchQuery);
186
+ i0.ɵɵadvance(3);
187
+ i0.ɵɵconditional(ctx_r1.ActiveCount > 0 ? 18 : -1);
188
+ i0.ɵɵadvance();
189
+ i0.ɵɵconditional(ctx_r1.PausedCount > 0 ? 19 : -1);
190
+ i0.ɵɵadvance();
191
+ i0.ɵɵconditional(ctx_r1.FilteredJobs.length > 0 ? 20 : 21);
192
+ i0.ɵɵadvance(8);
193
+ i0.ɵɵproperty("Visible", ctx_r1.ShowEditDialog)("ScheduledJobID", ctx_r1.EditingJobID);
194
+ } }
195
+ let SchedulingResourceComponent = class SchedulingResourceComponent extends BaseResourceComponent {
196
+ cdr = inject(ChangeDetectorRef);
197
+ navigationService = inject(NavigationService);
198
+ scheduledJobService = inject(ScheduledJobService);
199
+ destroy$ = new Subject();
200
+ // ================================================================
201
+ // Resource overrides
202
+ // ================================================================
203
+ async GetResourceDisplayName(_data) {
204
+ return 'Schedules';
205
+ }
206
+ async GetResourceIconClass(_data) {
207
+ return 'fa-solid fa-clock';
208
+ }
209
+ // ================================================================
210
+ // State
211
+ // ================================================================
212
+ IsLoading = true;
213
+ AllJobs = [];
214
+ FilteredJobs = [];
215
+ RecentRuns = [];
216
+ StatusFilter = '';
217
+ SearchQuery = '';
218
+ /** Map of jobID -> last 7 run statuses for sparkline display */
219
+ sparklineCache = new Map();
220
+ // Edit dialog
221
+ ShowEditDialog = false;
222
+ EditingJobID = null;
223
+ // ================================================================
224
+ // Computed
225
+ // ================================================================
226
+ get ActiveCount() {
227
+ return this.AllJobs.filter(j => j.Status === 'Active').length;
228
+ }
229
+ get PausedCount() {
230
+ return this.AllJobs.filter(j => j.Status === 'Paused').length;
231
+ }
232
+ get DisabledCount() {
233
+ return this.AllJobs.filter(j => j.Status === 'Disabled').length;
234
+ }
235
+ // ================================================================
236
+ // Lifecycle
237
+ // ================================================================
238
+ async ngAfterViewInit() {
239
+ await this.loadData();
240
+ this.NotifyLoadComplete();
241
+ }
242
+ ngOnDestroy() {
243
+ super.ngOnDestroy();
244
+ this.destroy$.next();
245
+ this.destroy$.complete();
246
+ }
247
+ // ================================================================
248
+ // Public Methods — Toolbar
249
+ // ================================================================
250
+ OnNewSchedule() {
251
+ this.EditingJobID = null;
252
+ this.ShowEditDialog = true;
253
+ this.cdr.detectChanges();
254
+ }
255
+ OnFilterChanged() {
256
+ this.applyFilters();
257
+ this.cdr.detectChanges();
258
+ }
259
+ OnSearchChanged() {
260
+ this.applyFilters();
261
+ this.cdr.detectChanges();
262
+ }
263
+ // ================================================================
264
+ // Public Methods — Card Actions
265
+ // ================================================================
266
+ OnEditJob(job) {
267
+ this.EditingJobID = job.ID;
268
+ this.ShowEditDialog = true;
269
+ this.cdr.detectChanges();
270
+ }
271
+ async OnRunNow(job) {
272
+ MJNotificationService.Instance.CreateSimpleNotification(`Triggering "${job.Name}" — this feature requires server-side support.`, 'info', 4000);
273
+ }
274
+ // ================================================================
275
+ // Public Methods — Dialog
276
+ // ================================================================
277
+ async OnDialogClosed(result) {
278
+ this.ShowEditDialog = false;
279
+ this.EditingJobID = null;
280
+ if (result.Saved || result.Deleted) {
281
+ await this.loadData();
282
+ }
283
+ this.cdr.detectChanges();
284
+ }
285
+ /** Navigate to the full Scheduling application */
286
+ GoToSchedulingApp() {
287
+ const md = new Metadata();
288
+ const schedulingApp = md.Applications.find(a => a.Name === 'Scheduling');
289
+ if (schedulingApp) {
290
+ this.navigationService.SwitchToApp(schedulingApp.ID);
291
+ }
292
+ else {
293
+ MJNotificationService.Instance.CreateSimpleNotification('Scheduling app not found. Check application configuration.', 'warning', 3000);
294
+ }
295
+ }
296
+ // ================================================================
297
+ // Public Methods — Card Display Helpers
298
+ // ================================================================
299
+ GetStatusDotClass(job) {
300
+ return (job.Status ?? 'pending').toLowerCase();
301
+ }
302
+ GetCronDescription(cron) {
303
+ if (!cron)
304
+ return 'No schedule';
305
+ const parts = this.parseCron(cron);
306
+ if (!parts)
307
+ return cron;
308
+ return this.cronToHuman(parts);
309
+ }
310
+ GetSparkline(jobID) {
311
+ return this.sparklineCache.get(jobID) ?? [];
312
+ }
313
+ GetTimeAgo(date) {
314
+ if (!date)
315
+ return 'Never';
316
+ const now = new Date();
317
+ const d = new Date(date);
318
+ const diffMs = now.getTime() - d.getTime();
319
+ return this.formatDuration(diffMs);
320
+ }
321
+ GetTimeUntil(date) {
322
+ if (!date)
323
+ return '--';
324
+ const now = new Date();
325
+ const d = new Date(date);
326
+ const diffMs = d.getTime() - now.getTime();
327
+ if (diffMs <= 0)
328
+ return 'Due';
329
+ return this.formatDuration(diffMs);
330
+ }
331
+ GetSuccessRate(job) {
332
+ if (job.RunCount === 0)
333
+ return 'N/A';
334
+ return Math.round((job.SuccessCount / job.RunCount) * 100) + '%';
335
+ }
336
+ GetSuccessRateClass(job) {
337
+ if (job.RunCount === 0)
338
+ return '';
339
+ const rate = job.SuccessCount / job.RunCount;
340
+ if (rate >= 0.95)
341
+ return 'high';
342
+ if (rate >= 0.80)
343
+ return 'mid';
344
+ return '';
345
+ }
346
+ GetDuration(run) {
347
+ if (!run.StartedAt || !run.CompletedAt)
348
+ return '--';
349
+ const start = new Date(run.StartedAt).getTime();
350
+ const end = new Date(run.CompletedAt).getTime();
351
+ const diffMs = end - start;
352
+ return this.formatDurationShort(diffMs);
353
+ }
354
+ GetItemsProcessed(run) {
355
+ if (!run.Details)
356
+ return '--';
357
+ try {
358
+ const details = JSON.parse(run.Details);
359
+ if (details['ItemsProcessed'] != null) {
360
+ const total = details['TotalItems'];
361
+ const processed = details['ItemsProcessed'];
362
+ if (run.Status === 'Failed' && total != null) {
363
+ return `${this.formatNumber(processed)} / ${this.formatNumber(total)}`;
364
+ }
365
+ return this.formatNumber(processed);
366
+ }
367
+ }
368
+ catch {
369
+ // details not parseable
370
+ }
371
+ return '--';
372
+ }
373
+ // ================================================================
374
+ // Private Methods
375
+ // ================================================================
376
+ async loadData() {
377
+ this.IsLoading = true;
378
+ this.cdr.detectChanges();
379
+ try {
380
+ const rv = new RunView();
381
+ const [jobsResult, runsResult] = await rv.RunViews([
382
+ {
383
+ EntityName: 'MJ: Scheduled Jobs',
384
+ ExtraFilter: `Name LIKE '%Autotag%' OR Name LIKE '%Vector%' OR Name LIKE '%Content%' OR Name LIKE '%Knowledge%' OR Name LIKE '%Tag%'`,
385
+ OrderBy: 'Name',
386
+ ResultType: 'entity_object',
387
+ },
388
+ {
389
+ EntityName: 'MJ: Scheduled Job Runs',
390
+ ExtraFilter: '',
391
+ OrderBy: 'StartedAt DESC',
392
+ MaxRows: 100,
393
+ ResultType: 'entity_object',
394
+ },
395
+ ]);
396
+ if (jobsResult.Success) {
397
+ this.AllJobs = jobsResult.Results;
398
+ }
399
+ else {
400
+ this.AllJobs = [];
401
+ }
402
+ const allRuns = runsResult.Success
403
+ ? runsResult.Results
404
+ : [];
405
+ this.RecentRuns = allRuns.slice(0, 10);
406
+ this.buildSparklineCache(allRuns);
407
+ this.applyFilters();
408
+ }
409
+ catch (error) {
410
+ console.error('[SchedulingResource] Error loading data:', error);
411
+ this.AllJobs = [];
412
+ this.FilteredJobs = [];
413
+ this.RecentRuns = [];
414
+ }
415
+ finally {
416
+ this.IsLoading = false;
417
+ this.cdr.detectChanges();
418
+ }
419
+ }
420
+ applyFilters() {
421
+ let jobs = this.AllJobs;
422
+ if (this.StatusFilter) {
423
+ jobs = jobs.filter(j => j.Status === this.StatusFilter);
424
+ }
425
+ if (this.SearchQuery.trim()) {
426
+ const query = this.SearchQuery.trim().toLowerCase();
427
+ jobs = jobs.filter(j => j.Name.toLowerCase().includes(query) ||
428
+ (j.Description ?? '').toLowerCase().includes(query));
429
+ }
430
+ this.FilteredJobs = jobs;
431
+ }
432
+ /**
433
+ * Build sparkline data for each job from the last 7 runs.
434
+ * Each dot is 'ok', 'fail', or 'skip'.
435
+ */
436
+ buildSparklineCache(allRuns) {
437
+ this.sparklineCache.clear();
438
+ // Group runs by job ID
439
+ const runsByJob = new Map();
440
+ for (const run of allRuns) {
441
+ const jobID = run.ScheduledJobID;
442
+ if (!runsByJob.has(jobID)) {
443
+ runsByJob.set(jobID, []);
444
+ }
445
+ runsByJob.get(jobID).push(run);
446
+ }
447
+ // Build sparkline for each job (up to 7 most recent runs)
448
+ for (const job of this.AllJobs) {
449
+ const runs = runsByJob.get(job.ID) ?? [];
450
+ const last7 = runs.slice(0, 7);
451
+ const dots = last7.map(r => this.runStatusToDot(r));
452
+ // Pad to 7 with 'skip' dots if fewer runs
453
+ while (dots.length < 7) {
454
+ dots.push('skip');
455
+ }
456
+ this.sparklineCache.set(job.ID, dots);
457
+ }
458
+ }
459
+ runStatusToDot(run) {
460
+ if (run.Status === 'Completed' && run.Success)
461
+ return 'ok';
462
+ if (run.Status === 'Failed' || (run.Status === 'Completed' && !run.Success))
463
+ return 'fail';
464
+ if (run.Status === 'Running')
465
+ return 'ok'; // treat in-progress as OK
466
+ return 'skip';
467
+ }
468
+ // ================================================================
469
+ // Cron Parsing
470
+ // ================================================================
471
+ parseCron(cron) {
472
+ const parts = cron.trim().split(/\s+/);
473
+ // Support 5-part (no seconds) and 6-part (with seconds) cron
474
+ if (parts.length === 5) {
475
+ return {
476
+ Second: '0',
477
+ Minute: parts[0],
478
+ Hour: parts[1],
479
+ DayOfMonth: parts[2],
480
+ Month: parts[3],
481
+ DayOfWeek: parts[4],
482
+ };
483
+ }
484
+ if (parts.length === 6) {
485
+ return {
486
+ Second: parts[0],
487
+ Minute: parts[1],
488
+ Hour: parts[2],
489
+ DayOfMonth: parts[3],
490
+ Month: parts[4],
491
+ DayOfWeek: parts[5],
492
+ };
493
+ }
494
+ return null;
495
+ }
496
+ cronToHuman(p) {
497
+ // Every N minutes: */N * * * *
498
+ if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {
499
+ const interval = parseInt(p.Minute.slice(2), 10);
500
+ if (interval === 1)
501
+ return 'Every minute';
502
+ return `Every ${interval} minutes`;
503
+ }
504
+ // Every N hours: 0 */N * * *
505
+ if (p.Minute !== '*' && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {
506
+ const interval = parseInt(p.Hour.slice(2), 10);
507
+ if (interval === 1)
508
+ return 'Every hour';
509
+ return `Every ${interval} hours`;
510
+ }
511
+ // Specific hour with specific or wildcard day fields
512
+ if (!p.Minute.includes('*') && !p.Minute.includes('/') &&
513
+ !p.Hour.includes('*') && !p.Hour.includes('/') &&
514
+ p.Month === '*') {
515
+ const hour = parseInt(p.Hour, 10);
516
+ const minute = parseInt(p.Minute, 10);
517
+ const timeStr = this.formatTime(hour, minute);
518
+ // Weekly: specific day of week
519
+ if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {
520
+ const dayName = this.dayOfWeekName(p.DayOfWeek);
521
+ return `Weekly on ${dayName} at ${timeStr}`;
522
+ }
523
+ // Monthly: specific day of month
524
+ if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {
525
+ return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;
526
+ }
527
+ // Daily
528
+ if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {
529
+ return `Daily at ${timeStr}`;
530
+ }
531
+ }
532
+ // Fallback: return the raw cron expression
533
+ return `${p.Minute} ${p.Hour} ${p.DayOfMonth} ${p.Month} ${p.DayOfWeek}`;
534
+ }
535
+ formatTime(hour, minute) {
536
+ const ampm = hour >= 12 ? 'PM' : 'AM';
537
+ const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;
538
+ const m = minute.toString().padStart(2, '0');
539
+ return `${h}:${m} ${ampm}`;
540
+ }
541
+ dayOfWeekName(dow) {
542
+ const names = {
543
+ '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',
544
+ '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',
545
+ '6': 'Saturday', '7': 'Sunday',
546
+ 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',
547
+ 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',
548
+ 'SAT': 'Saturday',
549
+ };
550
+ return names[dow.toUpperCase()] ?? dow;
551
+ }
552
+ // ================================================================
553
+ // Formatting Helpers
554
+ // ================================================================
555
+ formatDuration(ms) {
556
+ const seconds = Math.floor(ms / 1000);
557
+ const minutes = Math.floor(seconds / 60);
558
+ const hours = Math.floor(minutes / 60);
559
+ const days = Math.floor(hours / 24);
560
+ if (days > 0)
561
+ return `${days}d ago`;
562
+ if (hours > 0)
563
+ return `${hours}h ago`;
564
+ if (minutes > 0)
565
+ return `${minutes}m ago`;
566
+ return 'Just now';
567
+ }
568
+ formatDurationShort(ms) {
569
+ const totalSeconds = Math.floor(ms / 1000);
570
+ const minutes = Math.floor(totalSeconds / 60);
571
+ const seconds = totalSeconds % 60;
572
+ if (minutes >= 60) {
573
+ const hours = Math.floor(minutes / 60);
574
+ const remainMinutes = minutes % 60;
575
+ return `${hours}h ${remainMinutes}m`;
576
+ }
577
+ return `${minutes}m ${seconds.toString().padStart(2, '0')}s`;
578
+ }
579
+ formatNumber(n) {
580
+ return n.toLocaleString();
581
+ }
582
+ static ɵfac = /*@__PURE__*/ (() => { let ɵSchedulingResourceComponent_BaseFactory; return function SchedulingResourceComponent_Factory(__ngFactoryType__) { return (ɵSchedulingResourceComponent_BaseFactory || (ɵSchedulingResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(SchedulingResourceComponent)))(__ngFactoryType__ || SchedulingResourceComponent); }; })();
583
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SchedulingResourceComponent, selectors: [["app-scheduling-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "loading-container"], ["text", "Loading scheduled pipelines..."], [1, "toolbar"], [1, "btn-primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "filter-select", 3, "ngModelChange", "ngModel"], ["value", ""], ["value", "Active"], ["value", "Paused"], ["value", "Disabled"], ["value", "Pending"], ["type", "text", "placeholder", "Search pipelines...", 1, "search-input", 3, "ngModelChange", "ngModel"], [1, "toolbar-spacer"], [1, "toolbar-stat"], [1, "cards-grid"], [1, "empty-state"], [1, "scheduling-app-link"], [1, "btn-secondary", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "link-hint"], [3, "Close", "Visible", "ScheduledJobID"], [1, "job-card", 3, "paused", "disabled"], [1, "job-card", 3, "click"], [1, "card-top"], [1, "status-dot"], [1, "card-title-area"], [1, "card-name"], [1, "card-cron"], [1, "fa-regular", "fa-clock"], [1, "sparkline"], [1, "spark-dot", 3, "class"], [1, "sparkline-label"], [1, "card-stats"], [1, "stat"], [1, "fa-solid", "fa-chart-simple"], [1, "fa-regular", "fa-calendar"], [1, "spark-dot"], [1, "fa-regular", "fa-calendar-xmark"]], template: function SchedulingResourceComponent_Template(rf, ctx) { if (rf & 1) {
584
+ i0.ɵɵconditionalCreate(0, SchedulingResourceComponent_Conditional_0_Template, 2, 0, "div", 0)(1, SchedulingResourceComponent_Conditional_1_Template, 29, 7);
585
+ } if (rf & 2) {
586
+ i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
587
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.LoadingComponent, i3.ScheduledJobDialogComponent], styles: ["\n\n[_nghost-%COMP%] {\n display: block;\n padding: 28px 32px 40px;\n max-width: 1200px;\n min-width: 0;\n}\n\n\n\n.page-header[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n.page-header[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n.page-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n.btn-primary[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n white-space: nowrap;\n}\n.btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n.filter-select[_ngcontent-%COMP%] {\n padding: 7px 32px 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%2394a3b8'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n cursor: pointer;\n}\n.search-input[_ngcontent-%COMP%] {\n padding: 7px 12px 7px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n width: 220px;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='%2394a3b8'%3E%3Cpath d='M10 6.5a3.5 3.5 0 11-7 0 3.5 3.5 0 017 0zm-.3 3.9a5.5 5.5 0 111.1-1.1l3.1 3.1a.75.75 0 01-1.1 1.1L9.7 10.4z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 10px center;\n}\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n.toolbar-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n.toolbar-stat[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n.toolbar-stat[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n\n\n.card-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 14px;\n margin-bottom: 32px;\n}\n@media (max-width: 1024px) {\n .card-grid[_ngcontent-%COMP%] { grid-template-columns: repeat(2, 1fr); }\n}\n@media (max-width: 640px) {\n .card-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}\n\n\n\n.job-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n padding: 14px 16px;\n box-shadow: var(--mj-shadow-card, 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04));\n position: relative;\n cursor: pointer;\n transition: box-shadow 0.2s, border-color 0.2s;\n height: 132px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n.job-card[_ngcontent-%COMP%]:hover {\n box-shadow: var(--mj-shadow-card-hover, 0 4px 12px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.04));\n border-color: var(--mj-border-strong);\n}\n.job-card[_ngcontent-%COMP%]:hover .card-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n.job-card.disabled-card[_ngcontent-%COMP%] {\n opacity: 0.65;\n}\n\n.card-top[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.status-dot[_ngcontent-%COMP%] {\n width: 9px;\n height: 9px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n}\n.status-dot.active[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-success) 18%, transparent);\n}\n.status-dot.paused[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 18%, transparent);\n}\n.status-dot.disabled[_ngcontent-%COMP%], \n.status-dot.pending[_ngcontent-%COMP%], \n.status-dot.expired[_ngcontent-%COMP%] {\n background: var(--mj-border-strong);\n}\n\n.card-title-area[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n.card-title[_ngcontent-%COMP%] {\n font-size: 13.5px;\n font-weight: 650;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n.card-cron[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 1px;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.card-cron[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n\n\n.card-stats[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 11.5px;\n color: var(--mj-text-muted);\n}\n.card-stat[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.card-stat[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n.card-stat[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n.success-rate[_ngcontent-%COMP%] {\n font-weight: 700;\n}\n.success-rate.high[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n.success-rate.mid[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.sparkline[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 3px;\n margin-top: 8px;\n}\n.spark-dot[_ngcontent-%COMP%] {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n}\n.spark-dot.ok[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 65%, transparent);\n}\n.spark-dot.fail[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 65%, transparent);\n}\n.spark-dot.skip[_ngcontent-%COMP%] {\n background: var(--mj-border-default);\n}\n.sparkline-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-left: 4px;\n}\n\n\n\n.card-actions[_ngcontent-%COMP%] {\n position: absolute;\n top: 10px;\n right: 10px;\n display: flex;\n gap: 6px;\n opacity: 0;\n transition: opacity 0.15s;\n}\n.card-action-btn[_ngcontent-%COMP%] {\n padding: 4px 10px;\n font-size: 11px;\n font-weight: 600;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.12s;\n box-shadow: 0 1px 2px rgba(0,0,0,0.06);\n}\n.card-action-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.card-action-btn.run-now[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n}\n.card-action-btn.run-now[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n}\n\n\n\n.card-status-label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 11.5px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.card-status-label.paused[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n.card-status-label.disabled[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 14px;\n}\n.section-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n.section-header[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n\n\n.activity-table[_ngcontent-%COMP%] {\n width: 100%;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-card, 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04));\n overflow: hidden;\n}\n.activity-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n.activity-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n padding: 10px 14px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 11.5px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.activity-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 9px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n.activity-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n.activity-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n.activity-table[_ngcontent-%COMP%] .job-name-cell[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.activity-table[_ngcontent-%COMP%] .time-cell[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12.5px;\n}\n.items-cell[_ngcontent-%COMP%] {\n text-align: right;\n font-weight: 600;\n}\n.items-cell.failed[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 11.5px;\n font-weight: 600;\n}\n.status-badge.success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n.status-badge.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n.status-badge.running[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info);\n}\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 9px;\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 60px;\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: 60px 20px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 40px;\n margin-bottom: 12px;\n}\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin-bottom: 4px;\n}\n.empty-state[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.scheduling-app-link[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 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.15s ease;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.link-hint[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}"] });
588
+ };
589
+ SchedulingResourceComponent = __decorate([
590
+ RegisterClass(BaseResourceComponent, 'SchedulingResource')
591
+ ], SchedulingResourceComponent);
592
+ export { SchedulingResourceComponent };
593
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SchedulingResourceComponent, [{
594
+ type: Component,
595
+ args: [{ standalone: false, selector: 'app-scheduling-resource', template: "@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading scheduled pipelines...\"></mj-loading>\n </div>\n} @else {\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <button class=\"btn-primary\" (click)=\"OnNewSchedule()\">\n <i class=\"fa-solid fa-plus\"></i> New Schedule\n </button>\n <select class=\"filter-select\" [(ngModel)]=\"StatusFilter\" (ngModelChange)=\"OnFilterChanged()\">\n <option value=\"\">All Statuses</option>\n <option value=\"Active\">Active</option>\n <option value=\"Paused\">Paused</option>\n <option value=\"Disabled\">Disabled</option>\n <option value=\"Pending\">Pending</option>\n </select>\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Search pipelines...\"\n [(ngModel)]=\"SearchQuery\"\n (ngModelChange)=\"OnSearchChanged()\" />\n <div class=\"toolbar-spacer\"></div>\n <span class=\"toolbar-stat\">\n @if (ActiveCount > 0) { <strong>{{ ActiveCount }}</strong> active }\n @if (PausedCount > 0) { &middot; <strong>{{ PausedCount }}</strong> paused }\n </span>\n </div>\n\n <!-- Job Cards Grid -->\n @if (FilteredJobs.length > 0) {\n <div class=\"cards-grid\">\n @for (job of FilteredJobs; track job.ID) {\n <div class=\"job-card\"\n [class.paused]=\"job.Status === 'Paused'\"\n [class.disabled]=\"job.Status === 'Disabled'\"\n (click)=\"OnEditJob(job)\">\n <div class=\"card-top\">\n <span class=\"status-dot\"\n [class.dot-active]=\"job.Status === 'Active'\"\n [class.dot-paused]=\"job.Status === 'Paused'\"\n [class.dot-disabled]=\"job.Status === 'Disabled'\"></span>\n <div class=\"card-title-area\">\n <div class=\"card-name\">{{ job.Name }}</div>\n <div class=\"card-cron\">\n <i class=\"fa-regular fa-clock\"></i>\n {{ GetCronDescription(job.CronExpression) }}\n </div>\n </div>\n </div>\n <div class=\"sparkline\">\n @for (dotClass of GetSparkline(job.ID); track $index) {\n <span class=\"spark-dot\" [class]=\"dotClass\"></span>\n }\n <span class=\"sparkline-label\">last 7 runs</span>\n </div>\n <div class=\"card-stats\">\n <span class=\"stat\">\n <i class=\"fa-regular fa-clock\"></i>\n Last: <strong>{{ GetTimeAgo(job.LastRunAt) }}</strong>\n </span>\n <span class=\"stat\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n <strong>{{ GetSuccessRate(job) }}</strong>\n </span>\n <span class=\"stat\">\n <i class=\"fa-regular fa-calendar\"></i>\n Next: <strong>{{ GetTimeUntil(job.NextRunAt) }}</strong>\n </span>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-regular fa-calendar-xmark\"></i>\n <p>No Knowledge Hub schedules found</p>\n <span>Create a new schedule to automate classification and vector sync</span>\n </div>\n }\n\n <!-- Link to full Scheduling App -->\n <div class=\"scheduling-app-link\">\n <button class=\"btn-secondary\" (click)=\"GoToSchedulingApp()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open Scheduling App\n </button>\n <span class=\"link-hint\">Manage all scheduled jobs across the system</span>\n </div>\n\n <!-- Edit Dialog -->\n <mj-scheduled-job-dialog\n [Visible]=\"ShowEditDialog\"\n [ScheduledJobID]=\"EditingJobID\"\n (Close)=\"OnDialogClosed($event)\">\n </mj-scheduled-job-dialog>\n}\n", styles: ["/* \u2500\u2500 Host \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n:host {\n display: block;\n padding: 28px 32px 40px;\n max-width: 1200px;\n min-width: 0;\n}\n\n/* \u2500\u2500 Page Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.page-header {\n margin-bottom: 24px;\n}\n.page-header h1 {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n.page-header p {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n/* \u2500\u2500 Toolbar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.toolbar {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n.btn-primary {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s;\n white-space: nowrap;\n}\n.btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n}\n.filter-select {\n padding: 7px 32px 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%2394a3b8'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n cursor: pointer;\n}\n.search-input {\n padding: 7px 12px 7px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm, 6px);\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n width: 220px;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='%2394a3b8'%3E%3Cpath d='M10 6.5a3.5 3.5 0 11-7 0 3.5 3.5 0 017 0zm-.3 3.9a5.5 5.5 0 111.1-1.1l3.1 3.1a.75.75 0 01-1.1 1.1L9.7 10.4z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 10px center;\n}\n.search-input::placeholder {\n color: var(--mj-text-muted);\n}\n.toolbar-spacer {\n flex: 1;\n}\n.toolbar-stat {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n.toolbar-stat strong {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n/* \u2500\u2500 Card Grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.card-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 14px;\n margin-bottom: 32px;\n}\n@media (max-width: 1024px) {\n .card-grid { grid-template-columns: repeat(2, 1fr); }\n}\n@media (max-width: 640px) {\n .card-grid { grid-template-columns: 1fr; }\n}\n\n/* \u2500\u2500 Job Card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.job-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n padding: 14px 16px;\n box-shadow: var(--mj-shadow-card, 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04));\n position: relative;\n cursor: pointer;\n transition: box-shadow 0.2s, border-color 0.2s;\n height: 132px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n.job-card:hover {\n box-shadow: var(--mj-shadow-card-hover, 0 4px 12px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.04));\n border-color: var(--mj-border-strong);\n}\n.job-card:hover .card-actions {\n opacity: 1;\n}\n.job-card.disabled-card {\n opacity: 0.65;\n}\n\n.card-top {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.status-dot {\n width: 9px;\n height: 9px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 4px;\n}\n.status-dot.active {\n background: var(--mj-status-success);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-success) 18%, transparent);\n}\n.status-dot.paused {\n background: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 18%, transparent);\n}\n.status-dot.disabled,\n.status-dot.pending,\n.status-dot.expired {\n background: var(--mj-border-strong);\n}\n\n.card-title-area {\n flex: 1;\n min-width: 0;\n}\n.card-title {\n font-size: 13.5px;\n font-weight: 650;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n.card-cron {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin-top: 1px;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.card-cron i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n/* Stats row */\n.card-stats {\n display: flex;\n align-items: center;\n gap: 16px;\n font-size: 11.5px;\n color: var(--mj-text-muted);\n}\n.card-stat {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.card-stat i {\n font-size: 10px;\n}\n.card-stat .value {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n.success-rate {\n font-weight: 700;\n}\n.success-rate.high {\n color: var(--mj-status-success);\n}\n.success-rate.mid {\n color: var(--mj-status-warning);\n}\n\n/* Sparkline */\n.sparkline {\n display: flex;\n align-items: center;\n gap: 3px;\n margin-top: 8px;\n}\n.spark-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n}\n.spark-dot.ok {\n background: color-mix(in srgb, var(--mj-status-success) 65%, transparent);\n}\n.spark-dot.fail {\n background: color-mix(in srgb, var(--mj-status-error) 65%, transparent);\n}\n.spark-dot.skip {\n background: var(--mj-border-default);\n}\n.sparkline-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-left: 4px;\n}\n\n/* Hover actions */\n.card-actions {\n position: absolute;\n top: 10px;\n right: 10px;\n display: flex;\n gap: 6px;\n opacity: 0;\n transition: opacity 0.15s;\n}\n.card-action-btn {\n padding: 4px 10px;\n font-size: 11px;\n font-weight: 600;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.12s;\n box-shadow: 0 1px 2px rgba(0,0,0,0.06);\n}\n.card-action-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n.card-action-btn.run-now {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n}\n.card-action-btn.run-now:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n}\n\n/* Paused/disabled status on card */\n.card-status-label {\n font-weight: 600;\n font-size: 11.5px;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.card-status-label.paused {\n color: var(--mj-status-warning);\n}\n.card-status-label.disabled {\n color: var(--mj-text-muted);\n}\n\n/* \u2500\u2500 Section Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 14px;\n}\n.section-header h2 {\n font-size: 15px;\n font-weight: 650;\n color: var(--mj-text-primary);\n}\n.section-header .badge {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n/* \u2500\u2500 Activity Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.activity-table {\n width: 100%;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-card, 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04));\n overflow: hidden;\n}\n.activity-table table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n.activity-table thead th {\n background: var(--mj-bg-surface-card);\n padding: 10px 14px;\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 11.5px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.activity-table tbody td {\n padding: 9px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n.activity-table tbody tr:last-child td {\n border-bottom: none;\n}\n.activity-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n.activity-table .job-name-cell {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.activity-table .time-cell {\n color: var(--mj-text-secondary);\n font-size: 12.5px;\n}\n.items-cell {\n text-align: right;\n font-weight: 600;\n}\n.items-cell.failed {\n color: var(--mj-status-error);\n}\n\n/* Status badges */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 11.5px;\n font-weight: 600;\n}\n.status-badge.success {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n.status-badge.failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n.status-badge.running {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info);\n}\n.status-badge i {\n font-size: 9px;\n}\n\n/* \u2500\u2500 Loading \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 60px;\n}\n\n/* \u2500\u2500 Empty state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n.empty-state i {\n font-size: 40px;\n margin-bottom: 12px;\n}\n.empty-state p {\n font-size: 14px;\n margin-bottom: 4px;\n}\n.empty-state span {\n font-size: 12px;\n}\n\n/* Scheduling App Link */\n.scheduling-app-link {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.btn-secondary {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 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.15s ease;\n}\n\n.btn-secondary:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.link-hint {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n"] }]
596
+ }], null, null); })();
597
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SchedulingResourceComponent, { className: "SchedulingResourceComponent", filePath: "src/KnowledgeHub/components/scheduling/scheduling-resource.component.ts", lineNumber: 38 }); })();
598
+ /** Tree-shaking prevention */
599
+ export function LoadSchedulingResource() {
600
+ // Prevents tree-shaking of the component
601
+ }
602
+ //# sourceMappingURL=scheduling-resource.component.js.map