@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
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.component.d.ts","sourceRoot":"","sources":["../../../../src/Integration/components/schedules/schedules.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schedules.component.d.ts","sourceRoot":"","sources":["../../../../src/Integration/components/schedules/schedules.component.ts"],"names":[],"mappings":"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"}
@@ -446,12 +446,15 @@ let SchedulesComponent = class SchedulesComponent extends BaseResourceComponent
446
446
  // Lifecycle
447
447
  // ---------------------------------------------------------------------------
448
448
  async ngOnInit() {
449
+ super.ngOnInit();
449
450
  this.buildTimelineHours();
450
451
  await this.LoadData();
452
+ this.NotifyLoadComplete();
451
453
  // Refresh relative times every 60 seconds
452
454
  this.refreshTimer = setInterval(() => this.cdr.detectChanges(), 60_000);
453
455
  }
454
456
  ngOnDestroy() {
457
+ super.ngOnDestroy();
455
458
  if (this.refreshTimer) {
456
459
  clearInterval(this.refreshTimer);
457
460
  this.refreshTimer = null;
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/schedules/schedules.component.ts","../../../../src/Integration/components/schedules/schedules.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnInit, OnDestroy, inject } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJCompanyIntegrationEntity, MJScheduledJobEntity } from '@memberjunction/core-entities';\nimport { IntegrationDataService, ResolveIntegrationIcon } from '../../services/integration-data.service';\n\n// ---------------------------------------------------------------------------\n// Data interfaces\n// ---------------------------------------------------------------------------\n\ninterface ScheduleRow {\n ID: string;\n Name: string;\n Integration: string;\n Company: string;\n IsActive: boolean | null;\n ScheduleEnabled: boolean;\n ScheduleType: 'Manual' | 'Interval' | 'Cron';\n ScheduleIntervalMinutes: number | null;\n CronExpression: string | null;\n NextScheduledRunAt: string | null;\n LastScheduledRunAt: string | null;\n IsLocked: boolean;\n LockedAt: string | null;\n ScheduledJobID: string | null;\n}\n\ninterface TimelineMarker {\n Hour: number;\n Minute: number;\n IsNext: boolean;\n}\n\ninterface TimelineRow {\n IntegrationID: string;\n IntegrationName: string;\n Markers: TimelineMarker[];\n IsLocked: boolean;\n}\n\ninterface IntervalPreset {\n Label: string;\n Minutes: number;\n}\n\ninterface CronPreset {\n Label: string;\n Expression: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@RegisterClass(BaseResourceComponent, 'IntegrationSchedules')\n@Component({\n standalone: false,\n selector: 'app-integration-schedules',\n templateUrl: './schedules.component.html',\n styleUrls: ['./schedules.component.css']\n})\nexport class SchedulesComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n // ---------------------------------------------------------------------------\n // Public state\n // ---------------------------------------------------------------------------\n\n Schedules: ScheduleRow[] = [];\n IsLoading = true;\n SavingID: string | null = null;\n RunningID: string | null = null;\n\n /** Track pending edits per integration ID */\n PendingChanges = new Map<string, Partial<ScheduleRow>>();\n\n /** Timeline data built from schedules */\n TimelineMarkers: TimelineRow[] = [];\n TimelineHours: number[] = [];\n\n /** Preset interval choices */\n IntervalPresets: IntervalPreset[] = [\n { Label: '5m', Minutes: 5 },\n { Label: '15m', Minutes: 15 },\n { Label: '30m', Minutes: 30 },\n { Label: '1h', Minutes: 60 },\n { Label: '6h', Minutes: 360 },\n { Label: '12h', Minutes: 720 },\n { Label: '24h', Minutes: 1440 }\n ];\n\n /** Preset cron expressions */\n CronPresets: CronPreset[] = [\n { Label: 'Every hour', Expression: '0 * * * *' },\n { Label: 'Every 6 hours', Expression: '0 */6 * * *' },\n { Label: 'Daily midnight', Expression: '0 0 * * *' },\n { Label: 'Weekdays 9am', Expression: '0 9 * * 1-5' }\n ];\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private dataService = inject(IntegrationDataService);\n private cdr = inject(ChangeDetectorRef);\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n /** JobTypeID for \"Integration Sync\" scheduled job type (from MJ metadata) */\n private readonly INTEGRATION_SYNC_JOB_TYPE_ID = '4CD34733-4751-4572-B946-17DF6CB3EC90';\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async ngOnInit(): Promise<void> {\n this.buildTimelineHours();\n await this.LoadData();\n // Refresh relative times every 60 seconds\n this.refreshTimer = setInterval(() => this.cdr.detectChanges(), 60_000);\n }\n\n ngOnDestroy(): void {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Resource overrides\n // ---------------------------------------------------------------------------\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Schedules';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-calendar-check';\n }\n\n // ---------------------------------------------------------------------------\n // Data loading\n // ---------------------------------------------------------------------------\n\n async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n try {\n const provider = this.RunViewToUse;\n const rv = new RunView(provider ?? null);\n const result = await rv.RunView<ScheduleRow>({\n EntityName: 'MJ: Company Integrations',\n ExtraFilter: '',\n OrderBy: 'Name',\n Fields: [\n 'ID', 'Name', 'Integration', 'Company', 'IsActive',\n 'ScheduleEnabled', 'ScheduleType', 'ScheduleIntervalMinutes',\n 'CronExpression', 'NextScheduledRunAt', 'LastScheduledRunAt',\n 'IsLocked', 'LockedAt', 'ScheduledJobID'\n ],\n ResultType: 'simple'\n });\n this.Schedules = result.Results;\n this.BuildTimeline();\n } catch (err) {\n console.error('[SchedulesComponent] Failed to load data:', err);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Timeline\n // ---------------------------------------------------------------------------\n\n BuildTimeline(): void {\n const now = new Date();\n const rows: TimelineRow[] = [];\n\n for (const schedule of this.Schedules) {\n if (!schedule.ScheduleEnabled) continue;\n\n const markers = this.computeMarkersForSchedule(schedule, now);\n if (markers.length > 0 || schedule.IsLocked) {\n rows.push({\n IntegrationID: schedule.ID,\n IntegrationName: schedule.Integration ?? schedule.Name,\n Markers: markers,\n IsLocked: schedule.IsLocked\n });\n }\n }\n this.TimelineMarkers = rows;\n }\n\n // ---------------------------------------------------------------------------\n // Schedule editing\n // ---------------------------------------------------------------------------\n\n ToggleScheduleEnabled(integrationID: string): void {\n const schedule = this.findSchedule(integrationID);\n if (!schedule) return;\n\n const current = this.getEffectiveValue(integrationID, 'ScheduleEnabled', schedule.ScheduleEnabled);\n this.setPendingChange(integrationID, 'ScheduleEnabled', !current);\n }\n\n SetScheduleType(integrationID: string, type: 'Manual' | 'Interval' | 'Cron'): void {\n this.setPendingChange(integrationID, 'ScheduleType', type);\n }\n\n SetInterval(integrationID: string, minutes: number): void {\n this.setPendingChange(integrationID, 'ScheduleIntervalMinutes', minutes);\n this.setPendingChange(integrationID, 'ScheduleType', 'Interval');\n }\n\n SetCronExpression(integrationID: string, expression: string): void {\n this.setPendingChange(integrationID, 'CronExpression', expression);\n }\n\n OnCronInputChange(integrationID: string, event: Event): void {\n const input = event.target as HTMLInputElement;\n this.SetCronExpression(integrationID, input.value);\n }\n\n SetCustomInterval(integrationID: string, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = parseInt(input.value, 10);\n if (!isNaN(value) && value > 0) {\n this.SetInterval(integrationID, value);\n }\n }\n\n HasChanges(integrationID: string): boolean {\n return this.PendingChanges.has(integrationID);\n }\n\n // ---------------------------------------------------------------------------\n // Save & Run\n // ---------------------------------------------------------------------------\n\n async SaveSchedule(integrationID: string): Promise<void> {\n const changes = this.PendingChanges.get(integrationID);\n if (!changes) return;\n\n this.SavingID = integrationID;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJCompanyIntegrationEntity>('MJ: Company Integrations');\n await entity.Load(integrationID);\n\n // Resolve effective values (pending change wins over stored value)\n const scheduleEnabled = changes.ScheduleEnabled ?? (entity.Get('ScheduleEnabled') as boolean);\n const scheduleType = (changes.ScheduleType ?? entity.Get('ScheduleType') as string) as 'Manual' | 'Interval' | 'Cron';\n const cronExpression = changes.CronExpression ?? (entity.Get('CronExpression') as string | null);\n const intervalMinutes = changes.ScheduleIntervalMinutes ?? (entity.Get('ScheduleIntervalMinutes') as number | null);\n\n // Apply schedule fields to the entity\n if (changes.ScheduleEnabled !== undefined) entity.Set('ScheduleEnabled', changes.ScheduleEnabled);\n if (changes.ScheduleType !== undefined) entity.Set('ScheduleType', changes.ScheduleType);\n if (changes.ScheduleIntervalMinutes !== undefined) entity.Set('ScheduleIntervalMinutes', changes.ScheduleIntervalMinutes);\n if (changes.CronExpression !== undefined) entity.Set('CronExpression', changes.CronExpression);\n\n // Create/update/disable the linked ScheduledJob so the scheduler actually fires\n await this.SyncScheduledJob(entity, scheduleEnabled, scheduleType, cronExpression, intervalMinutes, integrationID);\n\n const saved = await entity.Save();\n if (saved) {\n this.PendingChanges.delete(integrationID);\n await this.LoadData();\n } else {\n console.error('[SchedulesComponent] Failed to save schedule:', entity.LatestResult?.CompleteMessage);\n }\n } catch (err) {\n console.error('[SchedulesComponent] Error saving schedule:', err);\n } finally {\n this.SavingID = null;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Scheduled job sync helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Creates, updates, or disables the ScheduledJob record linked to this integration.\n * When enabled with a real schedule type, ensures an Active ScheduledJob exists.\n * When disabled or set to Manual, marks the ScheduledJob as Disabled (if one exists).\n */\n private async SyncScheduledJob(\n entity: MJCompanyIntegrationEntity,\n enabled: boolean,\n scheduleType: 'Manual' | 'Interval' | 'Cron',\n cronExpression: string | null,\n intervalMinutes: number | null,\n integrationID: string\n ): Promise<void> {\n const effectiveCron = this.ResolveCronExpression(scheduleType, cronExpression, intervalMinutes);\n const existingJobID = entity.Get('ScheduledJobID') as string | null;\n const shouldBeActive = enabled && scheduleType !== 'Manual' && !!effectiveCron;\n\n if (shouldBeActive) {\n const jobID = await this.UpsertScheduledJob(existingJobID, entity, effectiveCron!, integrationID);\n if (jobID !== existingJobID) {\n entity.Set('ScheduledJobID', jobID);\n }\n } else if (existingJobID) {\n await this.DisableScheduledJob(existingJobID);\n }\n }\n\n /** Converts schedule type + config into a cron expression. */\n private ResolveCronExpression(\n scheduleType: 'Manual' | 'Interval' | 'Cron',\n cronExpression: string | null,\n intervalMinutes: number | null\n ): string | null {\n if (scheduleType === 'Cron') return cronExpression;\n if (scheduleType === 'Interval' && intervalMinutes) return this.IntervalToCron(intervalMinutes);\n return null;\n }\n\n /** Converts an interval in minutes to an equivalent cron expression. */\n private IntervalToCron(minutes: number): string {\n if (minutes < 60) return `*/${minutes} * * * *`;\n const hours = minutes / 60;\n if (Number.isInteger(hours)) return hours === 1 ? '0 * * * *' : `0 */${hours} * * *`;\n return `*/${minutes} * * * *`;\n }\n\n /**\n * Creates a new ScheduledJob or updates the existing one.\n * Returns the ID of the job (new or existing).\n */\n private async UpsertScheduledJob(\n existingJobID: string | null,\n entity: MJCompanyIntegrationEntity,\n cronExpression: string,\n integrationID: string\n ): Promise<string> {\n const md = new Metadata();\n\n if (existingJobID) {\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n const loaded = await job.Load(existingJobID);\n if (loaded) {\n job.Set('CronExpression', cronExpression);\n job.Set('Status', 'Active');\n // Reset NextRunAt so the scheduler picks up the new cron immediately\n job.Set('NextRunAt', new Date());\n await job.Save();\n return existingJobID;\n }\n }\n\n // No existing job (or failed to load) — create a new one\n const integrationName = (entity.Get('Name') as string) ?? (entity.Get('Integration') as string) ?? 'Integration';\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n job.NewRecord();\n job.Set('Name', `${integrationName} Sync`);\n job.Set('JobTypeID', this.INTEGRATION_SYNC_JOB_TYPE_ID);\n job.Set('CronExpression', cronExpression);\n job.Set('Timezone', 'UTC');\n job.Set('Status', 'Active');\n job.Set('ConcurrencyMode', 'Skip');\n job.Set('Configuration', JSON.stringify({ CompanyIntegrationID: integrationID }));\n // Set NextRunAt to now so the scheduler fires it on next poll without needing a restart\n job.Set('NextRunAt', new Date());\n await job.Save();\n return job.Get('ID') as string;\n }\n\n /** Sets an existing ScheduledJob to Disabled so it stops firing. */\n private async DisableScheduledJob(jobID: string): Promise<void> {\n const md = new Metadata();\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n const loaded = await job.Load(jobID);\n if (loaded) {\n job.Set('Status', 'Disabled');\n await job.Save();\n }\n }\n\n async RunNow(integrationID: string): Promise<void> {\n if (this.RunningID) return;\n this.RunningID = integrationID;\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.RunSync(integrationID);\n if (!result.Success) {\n console.error('[SchedulesComponent] RunSync failed:', result.Message);\n }\n await this.LoadData();\n } catch (err) {\n console.error('[SchedulesComponent] RunNow error:', err);\n } finally {\n this.RunningID = null;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n GetEffectiveScheduleEnabled(schedule: ScheduleRow): boolean {\n return this.getEffectiveValue(schedule.ID, 'ScheduleEnabled', schedule.ScheduleEnabled) as boolean;\n }\n\n GetEffectiveScheduleType(schedule: ScheduleRow): 'Manual' | 'Interval' | 'Cron' {\n return this.getEffectiveValue(schedule.ID, 'ScheduleType', schedule.ScheduleType) as 'Manual' | 'Interval' | 'Cron';\n }\n\n GetEffectiveInterval(schedule: ScheduleRow): number | null {\n return this.getEffectiveValue(schedule.ID, 'ScheduleIntervalMinutes', schedule.ScheduleIntervalMinutes) as number | null;\n }\n\n GetEffectiveCron(schedule: ScheduleRow): string | null {\n return this.getEffectiveValue(schedule.ID, 'CronExpression', schedule.CronExpression) as string | null;\n }\n\n IsIntervalSelected(schedule: ScheduleRow, minutes: number): boolean {\n return this.GetEffectiveInterval(schedule) === minutes;\n }\n\n GetNextRunRelative(schedule: ScheduleRow): string {\n if (!schedule.NextScheduledRunAt) return 'Not scheduled';\n const next = new Date(schedule.NextScheduledRunAt);\n const diffMs = next.getTime() - Date.now();\n if (diffMs < 0) return 'Overdue';\n return 'in ' + this.formatDurationMs(diffMs);\n }\n\n GetLastRunRelative(schedule: ScheduleRow): string {\n if (!schedule.LastScheduledRunAt) return 'Never';\n return this.dataService.ComputeRelativeTime(schedule.LastScheduledRunAt);\n }\n\n GetCronDescription(expression: string | null): string {\n if (!expression) return '';\n const parts = expression.split(' ');\n if (parts.length !== 5) return expression;\n const [min, hour, , , dow] = parts;\n if (min === '0' && hour === '*') return 'Every hour';\n if (min === '0' && hour.startsWith('*/')) return `Every ${hour.slice(2)} hours`;\n if (min === '0' && hour !== '*' && dow === '*') return `Daily at ${hour}:00`;\n if (min === '0' && hour !== '*' && dow === '1-5') return `Weekdays at ${hour}:00`;\n if (dow === '1-5') return `Weekdays at ${hour}:${min.padStart(2, '0')}`;\n return expression;\n }\n\n GetIntegrationIcon(name: string): string {\n return ResolveIntegrationIcon(name);\n }\n\n ComputeTimelinePosition(hour: number, minute: number): number {\n return ((hour * 60 + minute) / (24 * 60)) * 100;\n }\n\n IsSaving(integrationID: string): boolean {\n return UUIDsEqual(this.SavingID, integrationID);\n }\n\n IsRunning(integrationID: string): boolean {\n return UUIDsEqual(this.RunningID, integrationID);\n }\n\n get ScheduledCount(): number {\n return this.Schedules.filter(s => s.ScheduleEnabled).length;\n }\n\n get LockedCount(): number {\n return this.Schedules.filter(s => s.IsLocked).length;\n }\n\n TrackByID(_index: number, item: ScheduleRow): string {\n return item.ID;\n }\n\n TrackTimelineByID(_index: number, item: TimelineRow): string {\n return item.IntegrationID;\n }\n\n TrackPresetByMinutes(_index: number, item: IntervalPreset): number {\n return item.Minutes;\n }\n\n TrackCronPresetByExpr(_index: number, item: CronPreset): string {\n return item.Expression;\n }\n\n TrackHour(_index: number, hour: number): number {\n return hour;\n }\n\n TrackMarker(index: number, _item: TimelineMarker): number {\n return index;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private findSchedule(integrationID: string): ScheduleRow | undefined {\n return this.Schedules.find(s => UUIDsEqual(s.ID, integrationID));\n }\n\n private getEffectiveValue<K extends keyof ScheduleRow>(\n integrationID: string,\n field: K,\n originalValue: ScheduleRow[K]\n ): ScheduleRow[K] {\n const changes = this.PendingChanges.get(integrationID);\n if (changes && field in changes) {\n return changes[field] as ScheduleRow[K];\n }\n return originalValue;\n }\n\n private setPendingChange<K extends keyof ScheduleRow>(\n integrationID: string,\n field: K,\n value: ScheduleRow[K]\n ): void {\n const existing = this.PendingChanges.get(integrationID) ?? {};\n existing[field] = value;\n this.PendingChanges.set(integrationID, existing);\n this.cdr.detectChanges();\n }\n\n private buildTimelineHours(): void {\n this.TimelineHours = Array.from({ length: 24 }, (_, i) => i);\n }\n\n private computeMarkersForSchedule(schedule: ScheduleRow, now: Date): TimelineMarker[] {\n const markers: TimelineMarker[] = [];\n const type = schedule.ScheduleType;\n\n if (type === 'Interval' && schedule.ScheduleIntervalMinutes && schedule.ScheduleIntervalMinutes > 0) {\n this.computeIntervalMarkers(schedule, now, markers);\n } else if (type === 'Cron' && schedule.CronExpression) {\n this.computeCronMarkers(schedule, now, markers);\n } else if (schedule.NextScheduledRunAt) {\n this.addNextRunMarker(schedule, now, markers);\n }\n\n return markers;\n }\n\n private computeIntervalMarkers(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n const intervalMs = schedule.ScheduleIntervalMinutes! * 60_000;\n const endTime = now.getTime() + 24 * 60 * 60_000;\n\n // Start from the next scheduled run or from now\n let cursor = schedule.NextScheduledRunAt\n ? new Date(schedule.NextScheduledRunAt).getTime()\n : now.getTime();\n\n // If cursor is in the past, advance to the next future occurrence\n while (cursor < now.getTime()) {\n cursor += intervalMs;\n }\n\n const nextRun = cursor;\n\n while (cursor < endTime) {\n const d = new Date(cursor);\n markers.push({\n Hour: d.getHours(),\n Minute: d.getMinutes(),\n IsNext: cursor === nextRun\n });\n cursor += intervalMs;\n }\n }\n\n private computeCronMarkers(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n // Simple cron approximation for timeline display\n const times = this.approximateCronTimes(schedule.CronExpression!);\n const nextRunTime = schedule.NextScheduledRunAt ? new Date(schedule.NextScheduledRunAt) : null;\n\n for (const time of times) {\n const isNext = nextRunTime != null\n && time.Hour === nextRunTime.getHours()\n && time.Minute === nextRunTime.getMinutes();\n markers.push({ Hour: time.Hour, Minute: time.Minute, IsNext: isNext });\n }\n }\n\n private addNextRunMarker(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n const next = new Date(schedule.NextScheduledRunAt!);\n const diffMs = next.getTime() - now.getTime();\n if (diffMs >= 0 && diffMs <= 24 * 60 * 60_000) {\n markers.push({ Hour: next.getHours(), Minute: next.getMinutes(), IsNext: true });\n }\n }\n\n /**\n * Approximate cron schedule times within a 24-hour window.\n * Handles common patterns only -- not a full cron parser.\n */\n private approximateCronTimes(expression: string): Array<{ Hour: number; Minute: number }> {\n const parts = expression.split(' ');\n if (parts.length !== 5) return [];\n const [minPart, hourPart] = parts;\n const minute = minPart === '*' ? 0 : parseInt(minPart, 10);\n const times: Array<{ Hour: number; Minute: number }> = [];\n\n if (hourPart === '*') {\n // Every hour\n for (let h = 0; h < 24; h++) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n } else if (hourPart.startsWith('*/')) {\n const step = parseInt(hourPart.slice(2), 10);\n if (!isNaN(step) && step > 0) {\n for (let h = 0; h < 24; h += step) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n }\n } else {\n // Specific hour(s) — comma-separated\n const hours = hourPart.split(',').map(h => parseInt(h.trim(), 10)).filter(h => !isNaN(h));\n for (const h of hours) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n }\n\n return times;\n }\n\n private formatDurationMs(ms: number): string {\n const totalMinutes = Math.floor(ms / 60_000);\n if (totalMinutes < 1) return 'less than a minute';\n if (totalMinutes < 60) return `${totalMinutes} minute${totalMinutes === 1 ? '' : 's'}`;\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (minutes === 0) return `${hours} hour${hours === 1 ? '' : 's'}`;\n return `${hours}h ${minutes}m`;\n }\n}\n\nexport function LoadSchedulesComponent(): void {\n // Tree-shaking prevention: importing this module causes\n // @RegisterClass decorators to fire, registering components.\n}\n","<!-- Loading state -->\n@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading schedules...\"></mj-loading>\n </div>\n} @else {\n <div class=\"schedules-root\">\n\n <!-- ================================================================= -->\n <!-- HEADER -->\n <!-- ================================================================= -->\n <div class=\"section-header\">\n <div class=\"header-left\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n Sync Schedules\n </h2>\n <span class=\"header-meta\">{{ Schedules.length }} integration{{ Schedules.length === 1 ? '' : 's' }}</span>\n <span class=\"header-meta\">{{ ScheduledCount }} scheduled</span>\n @if (LockedCount > 0) {\n <span class=\"header-meta running-badge\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ LockedCount }} running\n </span>\n }\n </div>\n <button class=\"btn btn-outline\" (click)=\"LoadData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n\n <!-- ================================================================= -->\n <!-- TIMELINE (24-hour visual) -->\n <!-- ================================================================= -->\n @if (TimelineMarkers.length > 0) {\n <div class=\"timeline-section\">\n <div class=\"timeline-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Next 24 Hours\n </div>\n <div class=\"timeline-container\">\n <!-- Hour grid labels -->\n <div class=\"timeline-grid-labels\">\n <div class=\"timeline-label-spacer\"></div>\n <div class=\"timeline-grid-track\">\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <span class=\"timeline-hour-label\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n {{ hour }}:00\n </span>\n }\n }\n </div>\n </div>\n\n <!-- Integration rows -->\n @for (row of TimelineMarkers; track TrackTimelineByID($index, row)) {\n <div class=\"timeline-row\">\n <div class=\"timeline-row-label\" [title]=\"row.IntegrationName\">\n {{ row.IntegrationName }}\n </div>\n <div class=\"timeline-track-container\">\n <!-- Hour grid lines -->\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <div class=\"timeline-grid-line\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n </div>\n }\n }\n\n <!-- Track bar -->\n <div class=\"timeline-track\"></div>\n\n <!-- Markers -->\n @for (marker of row.Markers; track TrackMarker($index, marker)) {\n <div class=\"timeline-marker\"\n [class.timeline-marker-next]=\"marker.IsNext\"\n [style.left.%]=\"ComputeTimelinePosition(marker.Hour, marker.Minute)\"\n [title]=\"marker.Hour + ':' + ('' + marker.Minute).padStart(2, '0')\">\n </div>\n }\n\n <!-- Locked indicator -->\n @if (row.IsLocked) {\n <div class=\"timeline-locked-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n\n <!-- Current time line -->\n <div class=\"timeline-now-line\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ================================================================= -->\n <!-- SCHEDULE CARDS -->\n <!-- ================================================================= -->\n <div class=\"cards-section\">\n @for (schedule of Schedules; track TrackByID($index, schedule)) {\n <div class=\"schedule-card\" [class.schedule-card-disabled]=\"!schedule.IsActive\">\n\n <!-- LEFT: Icon + Info -->\n <div class=\"card-info\">\n <div class=\"card-icon\">\n <i [class]=\"GetIntegrationIcon(schedule.Integration || schedule.Name)\"></i>\n </div>\n <div class=\"card-details\">\n <div class=\"card-name\">{{ schedule.Integration || schedule.Name }}</div>\n <div class=\"card-company\">{{ schedule.Company }}</div>\n <div class=\"card-badges\">\n @if (schedule.IsActive) {\n <span class=\"badge badge-success\">Active</span>\n } @else {\n <span class=\"badge badge-gray\">Inactive</span>\n }\n @if (schedule.IsLocked) {\n <span class=\"badge badge-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- CENTER: Schedule Configuration -->\n <div class=\"card-config\">\n <!-- Schedule toggle -->\n <div class=\"config-row\">\n <label class=\"toggle-label\">\n Auto-sync\n <button class=\"toggle-switch\"\n [class.toggle-on]=\"GetEffectiveScheduleEnabled(schedule)\"\n (click)=\"ToggleScheduleEnabled(schedule.ID)\"\n [attr.aria-checked]=\"GetEffectiveScheduleEnabled(schedule)\"\n role=\"switch\">\n <span class=\"toggle-knob\"></span>\n </button>\n </label>\n </div>\n\n @if (GetEffectiveScheduleEnabled(schedule)) {\n <!-- Schedule type pills -->\n <div class=\"config-row\">\n <div class=\"type-pills\">\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Manual'\"\n (click)=\"SetScheduleType(schedule.ID, 'Manual')\">\n Manual\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Interval'\"\n (click)=\"SetScheduleType(schedule.ID, 'Interval')\">\n Interval\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Cron'\"\n (click)=\"SetScheduleType(schedule.ID, 'Cron')\">\n Cron\n </button>\n </div>\n </div>\n\n <!-- Interval config -->\n @if (GetEffectiveScheduleType(schedule) === 'Interval') {\n <div class=\"config-row\">\n <div class=\"interval-presets\">\n @for (preset of IntervalPresets; track TrackPresetByMinutes($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"IsIntervalSelected(schedule, preset.Minutes)\"\n (click)=\"SetInterval(schedule.ID, preset.Minutes)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"custom-interval\">\n <input type=\"number\"\n class=\"interval-input\"\n placeholder=\"Custom min\"\n min=\"1\"\n [value]=\"GetEffectiveInterval(schedule)\"\n (change)=\"SetCustomInterval(schedule.ID, $event)\" />\n <span class=\"interval-unit\">min</span>\n </div>\n </div>\n }\n\n <!-- Cron config -->\n @if (GetEffectiveScheduleType(schedule) === 'Cron') {\n <div class=\"config-row\">\n <div class=\"cron-presets\">\n @for (preset of CronPresets; track TrackCronPresetByExpr($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"GetEffectiveCron(schedule) === preset.Expression\"\n (click)=\"SetCronExpression(schedule.ID, preset.Expression)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"cron-input-row\">\n <input type=\"text\"\n class=\"cron-input\"\n placeholder=\"* * * * *\"\n [value]=\"GetEffectiveCron(schedule) ?? ''\"\n (change)=\"OnCronInputChange(schedule.ID, $event)\" />\n @if (GetEffectiveCron(schedule)) {\n <span class=\"cron-description\">\n {{ GetCronDescription(GetEffectiveCron(schedule)) }}\n </span>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- RIGHT: Status + Actions -->\n <div class=\"card-status\">\n <div class=\"status-items\">\n <div class=\"status-item\">\n <span class=\"status-label\">Next run</span>\n <span class=\"status-value\">{{ GetNextRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Last run</span>\n <span class=\"status-value\">{{ GetLastRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Status</span>\n @if (schedule.IsLocked) {\n <span class=\"status-value status-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n } @else {\n <span class=\"status-value status-idle\">Idle</span>\n }\n </div>\n </div>\n\n <div class=\"card-actions\">\n @if (HasChanges(schedule.ID)) {\n <button class=\"btn btn-primary btn-save\"\n [disabled]=\"IsSaving(schedule.ID)\"\n (click)=\"SaveSchedule(schedule.ID)\">\n @if (IsSaving(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Save\n }\n </button>\n }\n <button class=\"btn btn-outline btn-run\"\n [disabled]=\"IsRunning(schedule.ID) || schedule.IsLocked\"\n (click)=\"RunNow(schedule.ID)\">\n @if (IsRunning(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run Now\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n @if (Schedules.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <p>No integrations found</p>\n </div>\n }\n </div>\n </div>\n}\n"]}
1
+ {"version":3,"file":"schedules.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/schedules/schedules.component.ts","../../../../src/Integration/components/schedules/schedules.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnInit, OnDestroy, inject } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJCompanyIntegrationEntity, MJScheduledJobEntity } from '@memberjunction/core-entities';\nimport { IntegrationDataService, ResolveIntegrationIcon } from '../../services/integration-data.service';\n\n// ---------------------------------------------------------------------------\n// Data interfaces\n// ---------------------------------------------------------------------------\n\ninterface ScheduleRow {\n ID: string;\n Name: string;\n Integration: string;\n Company: string;\n IsActive: boolean | null;\n ScheduleEnabled: boolean;\n ScheduleType: 'Manual' | 'Interval' | 'Cron';\n ScheduleIntervalMinutes: number | null;\n CronExpression: string | null;\n NextScheduledRunAt: string | null;\n LastScheduledRunAt: string | null;\n IsLocked: boolean;\n LockedAt: string | null;\n ScheduledJobID: string | null;\n}\n\ninterface TimelineMarker {\n Hour: number;\n Minute: number;\n IsNext: boolean;\n}\n\ninterface TimelineRow {\n IntegrationID: string;\n IntegrationName: string;\n Markers: TimelineMarker[];\n IsLocked: boolean;\n}\n\ninterface IntervalPreset {\n Label: string;\n Minutes: number;\n}\n\ninterface CronPreset {\n Label: string;\n Expression: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@RegisterClass(BaseResourceComponent, 'IntegrationSchedules')\n@Component({\n standalone: false,\n selector: 'app-integration-schedules',\n templateUrl: './schedules.component.html',\n styleUrls: ['./schedules.component.css']\n})\nexport class SchedulesComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n // ---------------------------------------------------------------------------\n // Public state\n // ---------------------------------------------------------------------------\n\n Schedules: ScheduleRow[] = [];\n IsLoading = true;\n SavingID: string | null = null;\n RunningID: string | null = null;\n\n /** Track pending edits per integration ID */\n PendingChanges = new Map<string, Partial<ScheduleRow>>();\n\n /** Timeline data built from schedules */\n TimelineMarkers: TimelineRow[] = [];\n TimelineHours: number[] = [];\n\n /** Preset interval choices */\n IntervalPresets: IntervalPreset[] = [\n { Label: '5m', Minutes: 5 },\n { Label: '15m', Minutes: 15 },\n { Label: '30m', Minutes: 30 },\n { Label: '1h', Minutes: 60 },\n { Label: '6h', Minutes: 360 },\n { Label: '12h', Minutes: 720 },\n { Label: '24h', Minutes: 1440 }\n ];\n\n /** Preset cron expressions */\n CronPresets: CronPreset[] = [\n { Label: 'Every hour', Expression: '0 * * * *' },\n { Label: 'Every 6 hours', Expression: '0 */6 * * *' },\n { Label: 'Daily midnight', Expression: '0 0 * * *' },\n { Label: 'Weekdays 9am', Expression: '0 9 * * 1-5' }\n ];\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private dataService = inject(IntegrationDataService);\n private cdr = inject(ChangeDetectorRef);\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n /** JobTypeID for \"Integration Sync\" scheduled job type (from MJ metadata) */\n private readonly INTEGRATION_SYNC_JOB_TYPE_ID = '4CD34733-4751-4572-B946-17DF6CB3EC90';\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n this.buildTimelineHours();\n await this.LoadData();\n this.NotifyLoadComplete();\n // Refresh relative times every 60 seconds\n this.refreshTimer = setInterval(() => this.cdr.detectChanges(), 60_000);\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Resource overrides\n // ---------------------------------------------------------------------------\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Schedules';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-calendar-check';\n }\n\n // ---------------------------------------------------------------------------\n // Data loading\n // ---------------------------------------------------------------------------\n\n async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n try {\n const provider = this.RunViewToUse;\n const rv = new RunView(provider ?? null);\n const result = await rv.RunView<ScheduleRow>({\n EntityName: 'MJ: Company Integrations',\n ExtraFilter: '',\n OrderBy: 'Name',\n Fields: [\n 'ID', 'Name', 'Integration', 'Company', 'IsActive',\n 'ScheduleEnabled', 'ScheduleType', 'ScheduleIntervalMinutes',\n 'CronExpression', 'NextScheduledRunAt', 'LastScheduledRunAt',\n 'IsLocked', 'LockedAt', 'ScheduledJobID'\n ],\n ResultType: 'simple'\n });\n this.Schedules = result.Results;\n this.BuildTimeline();\n } catch (err) {\n console.error('[SchedulesComponent] Failed to load data:', err);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Timeline\n // ---------------------------------------------------------------------------\n\n BuildTimeline(): void {\n const now = new Date();\n const rows: TimelineRow[] = [];\n\n for (const schedule of this.Schedules) {\n if (!schedule.ScheduleEnabled) continue;\n\n const markers = this.computeMarkersForSchedule(schedule, now);\n if (markers.length > 0 || schedule.IsLocked) {\n rows.push({\n IntegrationID: schedule.ID,\n IntegrationName: schedule.Integration ?? schedule.Name,\n Markers: markers,\n IsLocked: schedule.IsLocked\n });\n }\n }\n this.TimelineMarkers = rows;\n }\n\n // ---------------------------------------------------------------------------\n // Schedule editing\n // ---------------------------------------------------------------------------\n\n ToggleScheduleEnabled(integrationID: string): void {\n const schedule = this.findSchedule(integrationID);\n if (!schedule) return;\n\n const current = this.getEffectiveValue(integrationID, 'ScheduleEnabled', schedule.ScheduleEnabled);\n this.setPendingChange(integrationID, 'ScheduleEnabled', !current);\n }\n\n SetScheduleType(integrationID: string, type: 'Manual' | 'Interval' | 'Cron'): void {\n this.setPendingChange(integrationID, 'ScheduleType', type);\n }\n\n SetInterval(integrationID: string, minutes: number): void {\n this.setPendingChange(integrationID, 'ScheduleIntervalMinutes', minutes);\n this.setPendingChange(integrationID, 'ScheduleType', 'Interval');\n }\n\n SetCronExpression(integrationID: string, expression: string): void {\n this.setPendingChange(integrationID, 'CronExpression', expression);\n }\n\n OnCronInputChange(integrationID: string, event: Event): void {\n const input = event.target as HTMLInputElement;\n this.SetCronExpression(integrationID, input.value);\n }\n\n SetCustomInterval(integrationID: string, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = parseInt(input.value, 10);\n if (!isNaN(value) && value > 0) {\n this.SetInterval(integrationID, value);\n }\n }\n\n HasChanges(integrationID: string): boolean {\n return this.PendingChanges.has(integrationID);\n }\n\n // ---------------------------------------------------------------------------\n // Save & Run\n // ---------------------------------------------------------------------------\n\n async SaveSchedule(integrationID: string): Promise<void> {\n const changes = this.PendingChanges.get(integrationID);\n if (!changes) return;\n\n this.SavingID = integrationID;\n this.cdr.detectChanges();\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJCompanyIntegrationEntity>('MJ: Company Integrations');\n await entity.Load(integrationID);\n\n // Resolve effective values (pending change wins over stored value)\n const scheduleEnabled = changes.ScheduleEnabled ?? (entity.Get('ScheduleEnabled') as boolean);\n const scheduleType = (changes.ScheduleType ?? entity.Get('ScheduleType') as string) as 'Manual' | 'Interval' | 'Cron';\n const cronExpression = changes.CronExpression ?? (entity.Get('CronExpression') as string | null);\n const intervalMinutes = changes.ScheduleIntervalMinutes ?? (entity.Get('ScheduleIntervalMinutes') as number | null);\n\n // Apply schedule fields to the entity\n if (changes.ScheduleEnabled !== undefined) entity.Set('ScheduleEnabled', changes.ScheduleEnabled);\n if (changes.ScheduleType !== undefined) entity.Set('ScheduleType', changes.ScheduleType);\n if (changes.ScheduleIntervalMinutes !== undefined) entity.Set('ScheduleIntervalMinutes', changes.ScheduleIntervalMinutes);\n if (changes.CronExpression !== undefined) entity.Set('CronExpression', changes.CronExpression);\n\n // Create/update/disable the linked ScheduledJob so the scheduler actually fires\n await this.SyncScheduledJob(entity, scheduleEnabled, scheduleType, cronExpression, intervalMinutes, integrationID);\n\n const saved = await entity.Save();\n if (saved) {\n this.PendingChanges.delete(integrationID);\n await this.LoadData();\n } else {\n console.error('[SchedulesComponent] Failed to save schedule:', entity.LatestResult?.CompleteMessage);\n }\n } catch (err) {\n console.error('[SchedulesComponent] Error saving schedule:', err);\n } finally {\n this.SavingID = null;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Scheduled job sync helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Creates, updates, or disables the ScheduledJob record linked to this integration.\n * When enabled with a real schedule type, ensures an Active ScheduledJob exists.\n * When disabled or set to Manual, marks the ScheduledJob as Disabled (if one exists).\n */\n private async SyncScheduledJob(\n entity: MJCompanyIntegrationEntity,\n enabled: boolean,\n scheduleType: 'Manual' | 'Interval' | 'Cron',\n cronExpression: string | null,\n intervalMinutes: number | null,\n integrationID: string\n ): Promise<void> {\n const effectiveCron = this.ResolveCronExpression(scheduleType, cronExpression, intervalMinutes);\n const existingJobID = entity.Get('ScheduledJobID') as string | null;\n const shouldBeActive = enabled && scheduleType !== 'Manual' && !!effectiveCron;\n\n if (shouldBeActive) {\n const jobID = await this.UpsertScheduledJob(existingJobID, entity, effectiveCron!, integrationID);\n if (jobID !== existingJobID) {\n entity.Set('ScheduledJobID', jobID);\n }\n } else if (existingJobID) {\n await this.DisableScheduledJob(existingJobID);\n }\n }\n\n /** Converts schedule type + config into a cron expression. */\n private ResolveCronExpression(\n scheduleType: 'Manual' | 'Interval' | 'Cron',\n cronExpression: string | null,\n intervalMinutes: number | null\n ): string | null {\n if (scheduleType === 'Cron') return cronExpression;\n if (scheduleType === 'Interval' && intervalMinutes) return this.IntervalToCron(intervalMinutes);\n return null;\n }\n\n /** Converts an interval in minutes to an equivalent cron expression. */\n private IntervalToCron(minutes: number): string {\n if (minutes < 60) return `*/${minutes} * * * *`;\n const hours = minutes / 60;\n if (Number.isInteger(hours)) return hours === 1 ? '0 * * * *' : `0 */${hours} * * *`;\n return `*/${minutes} * * * *`;\n }\n\n /**\n * Creates a new ScheduledJob or updates the existing one.\n * Returns the ID of the job (new or existing).\n */\n private async UpsertScheduledJob(\n existingJobID: string | null,\n entity: MJCompanyIntegrationEntity,\n cronExpression: string,\n integrationID: string\n ): Promise<string> {\n const md = new Metadata();\n\n if (existingJobID) {\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n const loaded = await job.Load(existingJobID);\n if (loaded) {\n job.Set('CronExpression', cronExpression);\n job.Set('Status', 'Active');\n // Reset NextRunAt so the scheduler picks up the new cron immediately\n job.Set('NextRunAt', new Date());\n await job.Save();\n return existingJobID;\n }\n }\n\n // No existing job (or failed to load) — create a new one\n const integrationName = (entity.Get('Name') as string) ?? (entity.Get('Integration') as string) ?? 'Integration';\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n job.NewRecord();\n job.Set('Name', `${integrationName} Sync`);\n job.Set('JobTypeID', this.INTEGRATION_SYNC_JOB_TYPE_ID);\n job.Set('CronExpression', cronExpression);\n job.Set('Timezone', 'UTC');\n job.Set('Status', 'Active');\n job.Set('ConcurrencyMode', 'Skip');\n job.Set('Configuration', JSON.stringify({ CompanyIntegrationID: integrationID }));\n // Set NextRunAt to now so the scheduler fires it on next poll without needing a restart\n job.Set('NextRunAt', new Date());\n await job.Save();\n return job.Get('ID') as string;\n }\n\n /** Sets an existing ScheduledJob to Disabled so it stops firing. */\n private async DisableScheduledJob(jobID: string): Promise<void> {\n const md = new Metadata();\n const job = await md.GetEntityObject<MJScheduledJobEntity>('MJ: Scheduled Jobs');\n const loaded = await job.Load(jobID);\n if (loaded) {\n job.Set('Status', 'Disabled');\n await job.Save();\n }\n }\n\n async RunNow(integrationID: string): Promise<void> {\n if (this.RunningID) return;\n this.RunningID = integrationID;\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.RunSync(integrationID);\n if (!result.Success) {\n console.error('[SchedulesComponent] RunSync failed:', result.Message);\n }\n await this.LoadData();\n } catch (err) {\n console.error('[SchedulesComponent] RunNow error:', err);\n } finally {\n this.RunningID = null;\n this.cdr.detectChanges();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Template helpers\n // ---------------------------------------------------------------------------\n\n GetEffectiveScheduleEnabled(schedule: ScheduleRow): boolean {\n return this.getEffectiveValue(schedule.ID, 'ScheduleEnabled', schedule.ScheduleEnabled) as boolean;\n }\n\n GetEffectiveScheduleType(schedule: ScheduleRow): 'Manual' | 'Interval' | 'Cron' {\n return this.getEffectiveValue(schedule.ID, 'ScheduleType', schedule.ScheduleType) as 'Manual' | 'Interval' | 'Cron';\n }\n\n GetEffectiveInterval(schedule: ScheduleRow): number | null {\n return this.getEffectiveValue(schedule.ID, 'ScheduleIntervalMinutes', schedule.ScheduleIntervalMinutes) as number | null;\n }\n\n GetEffectiveCron(schedule: ScheduleRow): string | null {\n return this.getEffectiveValue(schedule.ID, 'CronExpression', schedule.CronExpression) as string | null;\n }\n\n IsIntervalSelected(schedule: ScheduleRow, minutes: number): boolean {\n return this.GetEffectiveInterval(schedule) === minutes;\n }\n\n GetNextRunRelative(schedule: ScheduleRow): string {\n if (!schedule.NextScheduledRunAt) return 'Not scheduled';\n const next = new Date(schedule.NextScheduledRunAt);\n const diffMs = next.getTime() - Date.now();\n if (diffMs < 0) return 'Overdue';\n return 'in ' + this.formatDurationMs(diffMs);\n }\n\n GetLastRunRelative(schedule: ScheduleRow): string {\n if (!schedule.LastScheduledRunAt) return 'Never';\n return this.dataService.ComputeRelativeTime(schedule.LastScheduledRunAt);\n }\n\n GetCronDescription(expression: string | null): string {\n if (!expression) return '';\n const parts = expression.split(' ');\n if (parts.length !== 5) return expression;\n const [min, hour, , , dow] = parts;\n if (min === '0' && hour === '*') return 'Every hour';\n if (min === '0' && hour.startsWith('*/')) return `Every ${hour.slice(2)} hours`;\n if (min === '0' && hour !== '*' && dow === '*') return `Daily at ${hour}:00`;\n if (min === '0' && hour !== '*' && dow === '1-5') return `Weekdays at ${hour}:00`;\n if (dow === '1-5') return `Weekdays at ${hour}:${min.padStart(2, '0')}`;\n return expression;\n }\n\n GetIntegrationIcon(name: string): string {\n return ResolveIntegrationIcon(name);\n }\n\n ComputeTimelinePosition(hour: number, minute: number): number {\n return ((hour * 60 + minute) / (24 * 60)) * 100;\n }\n\n IsSaving(integrationID: string): boolean {\n return UUIDsEqual(this.SavingID, integrationID);\n }\n\n IsRunning(integrationID: string): boolean {\n return UUIDsEqual(this.RunningID, integrationID);\n }\n\n get ScheduledCount(): number {\n return this.Schedules.filter(s => s.ScheduleEnabled).length;\n }\n\n get LockedCount(): number {\n return this.Schedules.filter(s => s.IsLocked).length;\n }\n\n TrackByID(_index: number, item: ScheduleRow): string {\n return item.ID;\n }\n\n TrackTimelineByID(_index: number, item: TimelineRow): string {\n return item.IntegrationID;\n }\n\n TrackPresetByMinutes(_index: number, item: IntervalPreset): number {\n return item.Minutes;\n }\n\n TrackCronPresetByExpr(_index: number, item: CronPreset): string {\n return item.Expression;\n }\n\n TrackHour(_index: number, hour: number): number {\n return hour;\n }\n\n TrackMarker(index: number, _item: TimelineMarker): number {\n return index;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private findSchedule(integrationID: string): ScheduleRow | undefined {\n return this.Schedules.find(s => UUIDsEqual(s.ID, integrationID));\n }\n\n private getEffectiveValue<K extends keyof ScheduleRow>(\n integrationID: string,\n field: K,\n originalValue: ScheduleRow[K]\n ): ScheduleRow[K] {\n const changes = this.PendingChanges.get(integrationID);\n if (changes && field in changes) {\n return changes[field] as ScheduleRow[K];\n }\n return originalValue;\n }\n\n private setPendingChange<K extends keyof ScheduleRow>(\n integrationID: string,\n field: K,\n value: ScheduleRow[K]\n ): void {\n const existing = this.PendingChanges.get(integrationID) ?? {};\n existing[field] = value;\n this.PendingChanges.set(integrationID, existing);\n this.cdr.detectChanges();\n }\n\n private buildTimelineHours(): void {\n this.TimelineHours = Array.from({ length: 24 }, (_, i) => i);\n }\n\n private computeMarkersForSchedule(schedule: ScheduleRow, now: Date): TimelineMarker[] {\n const markers: TimelineMarker[] = [];\n const type = schedule.ScheduleType;\n\n if (type === 'Interval' && schedule.ScheduleIntervalMinutes && schedule.ScheduleIntervalMinutes > 0) {\n this.computeIntervalMarkers(schedule, now, markers);\n } else if (type === 'Cron' && schedule.CronExpression) {\n this.computeCronMarkers(schedule, now, markers);\n } else if (schedule.NextScheduledRunAt) {\n this.addNextRunMarker(schedule, now, markers);\n }\n\n return markers;\n }\n\n private computeIntervalMarkers(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n const intervalMs = schedule.ScheduleIntervalMinutes! * 60_000;\n const endTime = now.getTime() + 24 * 60 * 60_000;\n\n // Start from the next scheduled run or from now\n let cursor = schedule.NextScheduledRunAt\n ? new Date(schedule.NextScheduledRunAt).getTime()\n : now.getTime();\n\n // If cursor is in the past, advance to the next future occurrence\n while (cursor < now.getTime()) {\n cursor += intervalMs;\n }\n\n const nextRun = cursor;\n\n while (cursor < endTime) {\n const d = new Date(cursor);\n markers.push({\n Hour: d.getHours(),\n Minute: d.getMinutes(),\n IsNext: cursor === nextRun\n });\n cursor += intervalMs;\n }\n }\n\n private computeCronMarkers(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n // Simple cron approximation for timeline display\n const times = this.approximateCronTimes(schedule.CronExpression!);\n const nextRunTime = schedule.NextScheduledRunAt ? new Date(schedule.NextScheduledRunAt) : null;\n\n for (const time of times) {\n const isNext = nextRunTime != null\n && time.Hour === nextRunTime.getHours()\n && time.Minute === nextRunTime.getMinutes();\n markers.push({ Hour: time.Hour, Minute: time.Minute, IsNext: isNext });\n }\n }\n\n private addNextRunMarker(schedule: ScheduleRow, now: Date, markers: TimelineMarker[]): void {\n const next = new Date(schedule.NextScheduledRunAt!);\n const diffMs = next.getTime() - now.getTime();\n if (diffMs >= 0 && diffMs <= 24 * 60 * 60_000) {\n markers.push({ Hour: next.getHours(), Minute: next.getMinutes(), IsNext: true });\n }\n }\n\n /**\n * Approximate cron schedule times within a 24-hour window.\n * Handles common patterns only -- not a full cron parser.\n */\n private approximateCronTimes(expression: string): Array<{ Hour: number; Minute: number }> {\n const parts = expression.split(' ');\n if (parts.length !== 5) return [];\n const [minPart, hourPart] = parts;\n const minute = minPart === '*' ? 0 : parseInt(minPart, 10);\n const times: Array<{ Hour: number; Minute: number }> = [];\n\n if (hourPart === '*') {\n // Every hour\n for (let h = 0; h < 24; h++) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n } else if (hourPart.startsWith('*/')) {\n const step = parseInt(hourPart.slice(2), 10);\n if (!isNaN(step) && step > 0) {\n for (let h = 0; h < 24; h += step) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n }\n } else {\n // Specific hour(s) — comma-separated\n const hours = hourPart.split(',').map(h => parseInt(h.trim(), 10)).filter(h => !isNaN(h));\n for (const h of hours) {\n times.push({ Hour: h, Minute: isNaN(minute) ? 0 : minute });\n }\n }\n\n return times;\n }\n\n private formatDurationMs(ms: number): string {\n const totalMinutes = Math.floor(ms / 60_000);\n if (totalMinutes < 1) return 'less than a minute';\n if (totalMinutes < 60) return `${totalMinutes} minute${totalMinutes === 1 ? '' : 's'}`;\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n if (minutes === 0) return `${hours} hour${hours === 1 ? '' : 's'}`;\n return `${hours}h ${minutes}m`;\n }\n}\n\nexport function LoadSchedulesComponent(): void {\n // Tree-shaking prevention: importing this module causes\n // @RegisterClass decorators to fire, registering components.\n}\n","<!-- Loading state -->\n@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading schedules...\"></mj-loading>\n </div>\n} @else {\n <div class=\"schedules-root\">\n\n <!-- ================================================================= -->\n <!-- HEADER -->\n <!-- ================================================================= -->\n <div class=\"section-header\">\n <div class=\"header-left\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n Sync Schedules\n </h2>\n <span class=\"header-meta\">{{ Schedules.length }} integration{{ Schedules.length === 1 ? '' : 's' }}</span>\n <span class=\"header-meta\">{{ ScheduledCount }} scheduled</span>\n @if (LockedCount > 0) {\n <span class=\"header-meta running-badge\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ LockedCount }} running\n </span>\n }\n </div>\n <button class=\"btn btn-outline\" (click)=\"LoadData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n\n <!-- ================================================================= -->\n <!-- TIMELINE (24-hour visual) -->\n <!-- ================================================================= -->\n @if (TimelineMarkers.length > 0) {\n <div class=\"timeline-section\">\n <div class=\"timeline-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Next 24 Hours\n </div>\n <div class=\"timeline-container\">\n <!-- Hour grid labels -->\n <div class=\"timeline-grid-labels\">\n <div class=\"timeline-label-spacer\"></div>\n <div class=\"timeline-grid-track\">\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <span class=\"timeline-hour-label\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n {{ hour }}:00\n </span>\n }\n }\n </div>\n </div>\n\n <!-- Integration rows -->\n @for (row of TimelineMarkers; track TrackTimelineByID($index, row)) {\n <div class=\"timeline-row\">\n <div class=\"timeline-row-label\" [title]=\"row.IntegrationName\">\n {{ row.IntegrationName }}\n </div>\n <div class=\"timeline-track-container\">\n <!-- Hour grid lines -->\n @for (hour of TimelineHours; track TrackHour($index, hour)) {\n @if (hour % 4 === 0) {\n <div class=\"timeline-grid-line\"\n [style.left.%]=\"ComputeTimelinePosition(hour, 0)\">\n </div>\n }\n }\n\n <!-- Track bar -->\n <div class=\"timeline-track\"></div>\n\n <!-- Markers -->\n @for (marker of row.Markers; track TrackMarker($index, marker)) {\n <div class=\"timeline-marker\"\n [class.timeline-marker-next]=\"marker.IsNext\"\n [style.left.%]=\"ComputeTimelinePosition(marker.Hour, marker.Minute)\"\n [title]=\"marker.Hour + ':' + ('' + marker.Minute).padStart(2, '0')\">\n </div>\n }\n\n <!-- Locked indicator -->\n @if (row.IsLocked) {\n <div class=\"timeline-locked-indicator\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n\n <!-- Current time line -->\n <div class=\"timeline-now-line\"></div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- ================================================================= -->\n <!-- SCHEDULE CARDS -->\n <!-- ================================================================= -->\n <div class=\"cards-section\">\n @for (schedule of Schedules; track TrackByID($index, schedule)) {\n <div class=\"schedule-card\" [class.schedule-card-disabled]=\"!schedule.IsActive\">\n\n <!-- LEFT: Icon + Info -->\n <div class=\"card-info\">\n <div class=\"card-icon\">\n <i [class]=\"GetIntegrationIcon(schedule.Integration || schedule.Name)\"></i>\n </div>\n <div class=\"card-details\">\n <div class=\"card-name\">{{ schedule.Integration || schedule.Name }}</div>\n <div class=\"card-company\">{{ schedule.Company }}</div>\n <div class=\"card-badges\">\n @if (schedule.IsActive) {\n <span class=\"badge badge-success\">Active</span>\n } @else {\n <span class=\"badge badge-gray\">Inactive</span>\n }\n @if (schedule.IsLocked) {\n <span class=\"badge badge-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- CENTER: Schedule Configuration -->\n <div class=\"card-config\">\n <!-- Schedule toggle -->\n <div class=\"config-row\">\n <label class=\"toggle-label\">\n Auto-sync\n <button class=\"toggle-switch\"\n [class.toggle-on]=\"GetEffectiveScheduleEnabled(schedule)\"\n (click)=\"ToggleScheduleEnabled(schedule.ID)\"\n [attr.aria-checked]=\"GetEffectiveScheduleEnabled(schedule)\"\n role=\"switch\">\n <span class=\"toggle-knob\"></span>\n </button>\n </label>\n </div>\n\n @if (GetEffectiveScheduleEnabled(schedule)) {\n <!-- Schedule type pills -->\n <div class=\"config-row\">\n <div class=\"type-pills\">\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Manual'\"\n (click)=\"SetScheduleType(schedule.ID, 'Manual')\">\n Manual\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Interval'\"\n (click)=\"SetScheduleType(schedule.ID, 'Interval')\">\n Interval\n </button>\n <button class=\"type-pill\"\n [class.type-pill-active]=\"GetEffectiveScheduleType(schedule) === 'Cron'\"\n (click)=\"SetScheduleType(schedule.ID, 'Cron')\">\n Cron\n </button>\n </div>\n </div>\n\n <!-- Interval config -->\n @if (GetEffectiveScheduleType(schedule) === 'Interval') {\n <div class=\"config-row\">\n <div class=\"interval-presets\">\n @for (preset of IntervalPresets; track TrackPresetByMinutes($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"IsIntervalSelected(schedule, preset.Minutes)\"\n (click)=\"SetInterval(schedule.ID, preset.Minutes)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"custom-interval\">\n <input type=\"number\"\n class=\"interval-input\"\n placeholder=\"Custom min\"\n min=\"1\"\n [value]=\"GetEffectiveInterval(schedule)\"\n (change)=\"SetCustomInterval(schedule.ID, $event)\" />\n <span class=\"interval-unit\">min</span>\n </div>\n </div>\n }\n\n <!-- Cron config -->\n @if (GetEffectiveScheduleType(schedule) === 'Cron') {\n <div class=\"config-row\">\n <div class=\"cron-presets\">\n @for (preset of CronPresets; track TrackCronPresetByExpr($index, preset)) {\n <button class=\"preset-btn\"\n [class.preset-btn-active]=\"GetEffectiveCron(schedule) === preset.Expression\"\n (click)=\"SetCronExpression(schedule.ID, preset.Expression)\">\n {{ preset.Label }}\n </button>\n }\n </div>\n <div class=\"cron-input-row\">\n <input type=\"text\"\n class=\"cron-input\"\n placeholder=\"* * * * *\"\n [value]=\"GetEffectiveCron(schedule) ?? ''\"\n (change)=\"OnCronInputChange(schedule.ID, $event)\" />\n @if (GetEffectiveCron(schedule)) {\n <span class=\"cron-description\">\n {{ GetCronDescription(GetEffectiveCron(schedule)) }}\n </span>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- RIGHT: Status + Actions -->\n <div class=\"card-status\">\n <div class=\"status-items\">\n <div class=\"status-item\">\n <span class=\"status-label\">Next run</span>\n <span class=\"status-value\">{{ GetNextRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Last run</span>\n <span class=\"status-value\">{{ GetLastRunRelative(schedule) }}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"status-label\">Status</span>\n @if (schedule.IsLocked) {\n <span class=\"status-value status-running\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running\n </span>\n } @else {\n <span class=\"status-value status-idle\">Idle</span>\n }\n </div>\n </div>\n\n <div class=\"card-actions\">\n @if (HasChanges(schedule.ID)) {\n <button class=\"btn btn-primary btn-save\"\n [disabled]=\"IsSaving(schedule.ID)\"\n (click)=\"SaveSchedule(schedule.ID)\">\n @if (IsSaving(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n Save\n }\n </button>\n }\n <button class=\"btn btn-outline btn-run\"\n [disabled]=\"IsRunning(schedule.ID) || schedule.IsLocked\"\n (click)=\"RunNow(schedule.ID)\">\n @if (IsRunning(schedule.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run Now\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n @if (Schedules.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-calendar-xmark\"></i>\n <p>No integrations found</p>\n </div>\n }\n </div>\n </div>\n}\n"]}