@memberjunction/ng-dashboards 5.30.1 → 5.32.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 (424) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  2. package/dist/AI/components/agents/agent-configuration.component.js +4 -4
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts +2 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  6. package/dist/AI/components/agents/agent-editor.component.js +8 -6
  7. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +2 -1
  9. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  10. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +6 -5
  11. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  12. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +2 -1
  13. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  14. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +6 -5
  15. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  16. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +2 -1
  17. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  18. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +6 -5
  19. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  20. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +2 -1
  21. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  22. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +7 -4
  23. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  24. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +3 -2
  25. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/model-performance/model-performance.component.js +10 -6
  27. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  28. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +2 -1
  29. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +6 -5
  31. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  32. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +2 -1
  33. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  34. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +6 -5
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  36. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  37. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +55 -52
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  39. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -15
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  41. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  42. package/dist/AI/components/execution-monitoring.component.js +4 -3
  43. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.js +2 -2
  45. package/dist/AI/components/models/model-management.component.js.map +1 -1
  46. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
  47. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  48. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +10 -8
  49. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  51. package/dist/AI/components/prompts/prompt-management.component.js +2 -2
  52. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  53. package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
  54. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  55. package/dist/AI/components/prompts/prompt-version-control.component.js +13 -10
  56. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  57. package/dist/AI/components/requests/agent-requests-resource.component.js +1 -1
  58. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  59. package/dist/AI/components/tags/tags-resource.component.d.ts +1181 -0
  60. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -0
  61. package/dist/AI/components/tags/tags-resource.component.js +7487 -0
  62. package/dist/AI/components/tags/tags-resource.component.js.map +1 -0
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +25 -21
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/AI/index.d.ts +1 -0
  67. package/dist/AI/index.d.ts.map +1 -1
  68. package/dist/AI/index.js +5 -0
  69. package/dist/AI/index.js.map +1 -1
  70. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  71. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  72. package/dist/AI/services/ai-instrumentation.service.js +12 -4
  73. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.d.ts +3 -2
  75. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  76. package/dist/APIKeys/api-applications-panel.component.js +5 -4
  77. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  78. package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -1
  79. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
  80. package/dist/APIKeys/api-key-create-dialog.component.js +5 -5
  81. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  82. package/dist/APIKeys/api-key-edit-panel.component.d.ts +3 -2
  83. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  84. package/dist/APIKeys/api-key-edit-panel.component.js +11 -10
  85. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  86. package/dist/APIKeys/api-key-list.component.d.ts +2 -1
  87. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
  88. package/dist/APIKeys/api-key-list.component.js +6 -5
  89. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  90. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  91. package/dist/APIKeys/api-keys-resource.component.js +4 -4
  92. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  93. package/dist/APIKeys/api-scopes-panel.component.d.ts +3 -2
  94. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  95. package/dist/APIKeys/api-scopes-panel.component.js +8 -6
  96. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  97. package/dist/APIKeys/api-usage-panel.component.d.ts +3 -2
  98. package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
  99. package/dist/APIKeys/api-usage-panel.component.js +10 -8
  100. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  101. package/dist/Actions/components/actions-list-view.component.d.ts +2 -1
  102. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
  103. package/dist/Actions/components/actions-list-view.component.js +6 -5
  104. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  105. package/dist/Actions/components/actions-overview.component.js +2 -2
  106. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  107. package/dist/Actions/components/categories-list-view.component.d.ts +2 -1
  108. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  109. package/dist/Actions/components/categories-list-view.component.js +6 -5
  110. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  111. package/dist/Actions/components/execution-monitoring.component.js +1 -1
  112. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  113. package/dist/Actions/components/explorer/action-card.component.d.ts +2 -1
  114. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
  115. package/dist/Actions/components/explorer/action-card.component.js +6 -4
  116. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  117. package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
  118. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/new-action-panel.component.d.ts +2 -1
  120. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/new-action-panel.component.js +7 -5
  122. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  123. package/dist/Actions/components/explorer/new-category-panel.component.d.ts +2 -1
  124. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
  125. package/dist/Actions/components/explorer/new-category-panel.component.js +7 -5
  126. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  127. package/dist/ApplicationRoles/application-roles-resource.component.js +4 -4
  128. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  129. package/dist/Communication/communication-logs-resource.component.js +1 -1
  130. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  131. package/dist/Communication/communication-monitor-resource.component.js +1 -1
  132. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-providers-resource.component.js +3 -3
  134. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  135. package/dist/Communication/communication-runs-resource.component.js +1 -1
  136. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-templates-resource.component.js +3 -3
  138. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  139. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
  140. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  141. package/dist/ComponentStudio/component-studio-dashboard.component.js +5 -4
  142. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  143. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -1
  144. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  145. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +6 -4
  146. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  147. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +11 -2
  148. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  149. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +61 -27
  150. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  151. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -2
  152. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  153. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +19 -11
  154. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  155. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +4 -2
  156. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
  157. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +11 -3
  158. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  159. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +10 -1
  160. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  161. package/dist/ComponentStudio/components/workspace/component-preview.component.js +18 -9
  162. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  163. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +11 -1
  164. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  165. package/dist/ComponentStudio/services/component-studio-state.service.js +23 -3
  166. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  167. package/dist/ComponentStudio/services/component-version.service.d.ts +6 -1
  168. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
  169. package/dist/ComponentStudio/services/component-version.service.js +16 -6
  170. package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
  171. package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
  172. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  173. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  174. package/dist/Credentials/components/credentials-categories-resource.component.js +3 -3
  175. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  176. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  177. package/dist/Credentials/components/credentials-list-resource.component.js +3 -3
  178. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  179. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  180. package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
  181. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  182. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  183. package/dist/Credentials/components/credentials-types-resource.component.js +3 -3
  184. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  185. package/dist/Credentials/credentials-dashboard.component.js +1 -1
  186. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  187. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +13 -13
  188. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  189. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +4 -0
  190. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -1
  191. package/dist/DashboardBrowser/dashboard-share-adapter.js +5 -2
  192. package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -1
  193. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +3 -1
  194. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  195. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -4
  196. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  197. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +3 -2
  198. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  199. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +7 -6
  200. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  201. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +3 -2
  202. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  203. package/dist/DataExplorer/components/view-selector/view-selector.component.js +6 -5
  204. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  205. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  206. package/dist/DataExplorer/data-explorer-dashboard.component.js +10 -9
  207. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  208. package/dist/DataExplorer/services/explorer-state.service.d.ts +6 -1
  209. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  210. package/dist/DataExplorer/services/explorer-state.service.js +15 -5
  211. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  212. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts +64 -0
  213. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts.map +1 -0
  214. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js +400 -0
  215. package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js.map +1 -0
  216. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts +42 -0
  217. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts.map +1 -0
  218. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js +232 -0
  219. package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js.map +1 -0
  220. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts +14 -0
  221. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts.map +1 -0
  222. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js +38 -0
  223. package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js.map +1 -0
  224. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts +24 -0
  225. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts.map +1 -0
  226. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js +77 -0
  227. package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js.map +1 -0
  228. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts +88 -0
  229. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts.map +1 -0
  230. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js +404 -0
  231. package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js.map +1 -0
  232. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts +12 -0
  233. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts.map +1 -0
  234. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js +116 -0
  235. package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js.map +1 -0
  236. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +55 -0
  237. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -0
  238. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +204 -0
  239. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -0
  240. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +61 -0
  241. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -0
  242. package/dist/DatabaseDesigner/components/entity-list.component.js +485 -0
  243. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -0
  244. package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +52 -0
  245. package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -0
  246. package/dist/DatabaseDesigner/components/modify/database-modify.component.js +320 -0
  247. package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -0
  248. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts +79 -0
  249. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts.map +1 -0
  250. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js +378 -0
  251. package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js.map +1 -0
  252. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts +85 -0
  253. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts.map +1 -0
  254. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js +429 -0
  255. package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js.map +1 -0
  256. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts +58 -0
  257. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts.map +1 -0
  258. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js +333 -0
  259. package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js.map +1 -0
  260. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts +36 -0
  261. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts.map +1 -0
  262. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js +345 -0
  263. package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js.map +1 -0
  264. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts +13 -0
  265. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts.map +1 -0
  266. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js +81 -0
  267. package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js.map +1 -0
  268. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +30 -0
  269. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -0
  270. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +131 -0
  271. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -0
  272. package/dist/DatabaseDesigner/database-designer-erd.d.ts +19 -0
  273. package/dist/DatabaseDesigner/database-designer-erd.d.ts.map +1 -0
  274. package/dist/DatabaseDesigner/database-designer-erd.js +84 -0
  275. package/dist/DatabaseDesigner/database-designer-erd.js.map +1 -0
  276. package/dist/DatabaseDesigner/database-designer.types.d.ts +167 -0
  277. package/dist/DatabaseDesigner/database-designer.types.d.ts.map +1 -0
  278. package/dist/DatabaseDesigner/database-designer.types.js +26 -0
  279. package/dist/DatabaseDesigner/database-designer.types.js.map +1 -0
  280. package/dist/DatabaseDesigner/services/database-designer.engine.d.ts +94 -0
  281. package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -0
  282. package/dist/DatabaseDesigner/services/database-designer.engine.js +392 -0
  283. package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -0
  284. package/dist/DatabaseDesigner/services/database-designer.service.d.ts +78 -0
  285. package/dist/DatabaseDesigner/services/database-designer.service.d.ts.map +1 -0
  286. package/dist/DatabaseDesigner/services/database-designer.service.js +273 -0
  287. package/dist/DatabaseDesigner/services/database-designer.service.js.map +1 -0
  288. package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts +79 -0
  289. package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts.map +1 -0
  290. package/dist/DatabaseDesigner/services/entity-wizard-state.service.js +204 -0
  291. package/dist/DatabaseDesigner/services/entity-wizard-state.service.js.map +1 -0
  292. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  293. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  294. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  295. package/dist/Home/action-pin-config-dialog.component.d.ts +2 -1
  296. package/dist/Home/action-pin-config-dialog.component.d.ts.map +1 -1
  297. package/dist/Home/action-pin-config-dialog.component.js +6 -4
  298. package/dist/Home/action-pin-config-dialog.component.js.map +1 -1
  299. package/dist/Home/action-pin-runner-dialog.component.d.ts +2 -1
  300. package/dist/Home/action-pin-runner-dialog.component.d.ts.map +1 -1
  301. package/dist/Home/action-pin-runner-dialog.component.js +5 -4
  302. package/dist/Home/action-pin-runner-dialog.component.js.map +1 -1
  303. package/dist/Home/home-application.d.ts.map +1 -1
  304. package/dist/Home/home-application.js +10 -12
  305. package/dist/Home/home-application.js.map +1 -1
  306. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  307. package/dist/Home/home-dashboard.component.js +3 -3
  308. package/dist/Home/home-dashboard.component.js.map +1 -1
  309. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  310. package/dist/Integration/components/activity/activity.component.js +1 -0
  311. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  312. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  313. package/dist/Integration/components/connections/connections.component.js +11 -10
  314. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  315. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  316. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -2
  317. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  318. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  319. package/dist/Integration/components/overview/overview.component.js +1 -0
  320. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  321. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  322. package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
  323. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  324. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  325. package/dist/Integration/components/schedules/schedules.component.js +5 -4
  326. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  327. package/dist/Integration/services/integration-data.service.d.ts +5 -1
  328. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  329. package/dist/Integration/services/integration-data.service.js +27 -19
  330. package/dist/Integration/services/integration-data.service.js.map +1 -1
  331. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +6 -6
  332. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  333. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  334. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +8 -6
  335. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  336. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +6 -6
  337. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  338. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +3 -3
  339. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  340. package/dist/Lists/components/lists-browse-resource.component.js +6 -6
  341. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  342. package/dist/Lists/components/lists-categories-resource.component.js +4 -4
  343. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  344. package/dist/Lists/components/lists-my-lists-resource.component.js +6 -6
  345. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  346. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  347. package/dist/Lists/components/lists-operations-resource.component.js +11 -10
  348. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  349. package/dist/Lists/services/list-set-operations.service.d.ts +5 -0
  350. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  351. package/dist/Lists/services/list-set-operations.service.js +11 -3
  352. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  353. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -1
  354. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
  355. package/dist/MCP/components/mcp-connection-dialog.component.js +8 -6
  356. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  357. package/dist/MCP/components/mcp-server-dialog.component.d.ts +2 -1
  358. package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
  359. package/dist/MCP/components/mcp-server-dialog.component.js +7 -5
  360. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  361. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  362. package/dist/MCP/mcp-dashboard.component.js +12 -12
  363. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  364. package/dist/Permissions/permissions-shared.d.ts +3 -3
  365. package/dist/Permissions/permissions-shared.d.ts.map +1 -1
  366. package/dist/Permissions/permissions-shared.js +5 -5
  367. package/dist/Permissions/permissions-shared.js.map +1 -1
  368. package/dist/Permissions/resource-access-resource.component.js +1 -1
  369. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  370. package/dist/Permissions/user-access-resource.component.js +1 -2
  371. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  372. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  373. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  374. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  375. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  376. package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
  377. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  378. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +5 -0
  379. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  380. package/dist/Scheduling/services/scheduling-instrumentation.service.js +21 -13
  381. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  382. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  383. package/dist/SystemDiagnostics/system-diagnostics.component.js +2 -2
  384. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  385. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  386. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  387. package/dist/Testing/components/testing-explorer.component.js +9 -7
  388. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  389. package/dist/Testing/services/testing-instrumentation.service.d.ts +6 -1
  390. package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
  391. package/dist/Testing/services/testing-instrumentation.service.js +21 -11
  392. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
  393. package/dist/Testing/testing-dashboard.component.d.ts +3 -1
  394. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  395. package/dist/Testing/testing-dashboard.component.js +15 -11
  396. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  397. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  398. package/dist/VersionHistory/components/diff-resource.component.js +5 -5
  399. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  400. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
  401. package/dist/VersionHistory/components/graph-resource.component.js +1 -2
  402. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  403. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  404. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  405. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  406. package/dist/VersionHistory/components/restore-resource.component.js +1 -1
  407. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  408. package/dist/ai-dashboards.module.d.ts +35 -34
  409. package/dist/ai-dashboards.module.d.ts.map +1 -1
  410. package/dist/ai-dashboards.module.js +6 -0
  411. package/dist/ai-dashboards.module.js.map +1 -1
  412. package/dist/module.d.ts +13 -12
  413. package/dist/module.d.ts.map +1 -1
  414. package/dist/module.js +7 -0
  415. package/dist/module.js.map +1 -1
  416. package/dist/public-api.d.ts +3 -1
  417. package/dist/public-api.d.ts.map +1 -1
  418. package/dist/public-api.js +3 -1
  419. package/dist/public-api.js.map +1 -1
  420. package/dist/shared/entity-field-display.d.ts +4 -3
  421. package/dist/shared/entity-field-display.d.ts.map +1 -1
  422. package/dist/shared/entity-field-display.js +9 -9
  423. package/dist/shared/entity-field-display.js.map +1 -1
  424. package/package.json +52 -51
@@ -1 +1 @@
1
- {"version":3,"file":"query-browser-resource.component.js","sourceRoot":"","sources":["../../src/QueryBrowser/query-browser-resource.component.ts","../../src/QueryBrowser/query-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ElementRef, NgZone, HostListener, ViewChild } from '@angular/core';\nimport { CodeEditorComponent } from '@memberjunction/ng-code-editor';\nimport { Subject } from 'rxjs';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { Metadata, QueryInfo, QueryCategoryInfo, CompositeKey } from '@memberjunction/core';\nimport { TreeBranchConfig } from '@memberjunction/ng-trees';\nimport { ResourceData, UserInfoEngine, MJQueryEntity } from '@memberjunction/core-entities';\nimport {\n QueryEntityLinkClickEvent,\n QueryRowClickEvent\n} from '@memberjunction/ng-query-viewer';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\n/**\n * Tree node for the query category hierarchy\n */\ninterface CategoryNode {\n category: QueryCategoryInfo;\n children: CategoryNode[];\n queries: QueryInfo[];\n expanded: boolean;\n level: number;\n}\n\n/**\n * A resource component for browsing and executing stored queries.\n * Features:\n * - Hierarchical category navigation\n * - Query search\n * - Query viewer with parameter input\n * - Entity linking for clickable record IDs\n */\n@RegisterClass(BaseResourceComponent, 'QueryBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-query-browser-resource',\n templateUrl: './query-browser-resource.component.html',\n styleUrls: ['./query-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private static readonly SETTINGS_KEY = 'QueryBrowser/panelWidth';\n private static readonly STATUS_FILTERS_KEY = 'QueryBrowser/statusFilters';\n private static readonly EXPANDED_STATE_KEY = 'QueryBrowser/expandedCategories';\n private static readonly DEFAULT_PANEL_WIDTH = 320;\n private static readonly MIN_PANEL_WIDTH = 200;\n private static readonly MAX_PANEL_WIDTH = 600;\n\n public isLoading = true;\n public categories: QueryCategoryInfo[] = [];\n public categoryTree: CategoryNode[] = [];\n /** All queries the user has permission to run */\n public queries: QueryInfo[] = [];\n public filteredQueries: QueryInfo[] = [];\n private filteredQueryIds = new Set<string>();\n public selectedQuery: QueryInfo | null = null;\n public searchText = '';\n public PanelWidth = QueryBrowserResourceComponent.DEFAULT_PANEL_WIDTH;\n public IsResizing = false;\n\n /** Status filter toggles — which statuses to show in the tree */\n public StatusFilters: Record<string, boolean> = {\n 'Approved': true,\n 'Pending': false,\n 'Rejected': false,\n 'Expired': false\n };\n\n /** Ordered list of all possible statuses for the filter bar */\n public readonly AllStatuses: string[] = ['Approved', 'Pending', 'Rejected', 'Expired'];\n\n /** Tracks expanded state by category ID — persisted across sessions */\n private expandedState = new Map<string, boolean>();\n\n private metadata = new Metadata();\n protected override destroy$ = new Subject<void>();\n private dataLoaded = false;\n\n // Bound event handlers for resize (need references for removeEventListener)\n private boundOnResizeMove = this.onResizeMove.bind(this);\n private boundOnResizeEnd = this.onResizeEnd.bind(this);\n\n // ========================================\n // Drawer State (Create / Edit)\n // ========================================\n\n public ShowQueryDrawer = false;\n public DrawerMode: 'create' | 'edit' = 'create';\n public DrawerQueryId: string | null = null;\n public DrawerName = '';\n public DrawerSQL = '';\n @ViewChild('drawerSqlEditor') private drawerSqlEditor: CodeEditorComponent | null = null;\n public DrawerDescription = '';\n public DrawerCategoryID = '';\n public DrawerStatus: 'Pending' | 'Approved' | 'Rejected' | 'Expired' = 'Pending';\n public DrawerReusable = false;\n public IsSavingDrawer = false;\n public DrawerNameError = false;\n public DrawerSaveError: string | null = null;\n\n /** Ordered status options for the drawer dropdown — all valid Query statuses */\n public readonly DrawerStatuses: Array<'Pending' | 'Approved' | 'Rejected' | 'Expired'> =\n ['Pending', 'Approved', 'Rejected', 'Expired'];\n\n private initialDrawerSnapshot = '';\n\n /** The category ID of the most recently interacted-with folder in the tree */\n private activeCategoryID: string | null = null;\n\n /** Tree dropdown config for Query Categories (branches only, no leaves) */\n public CategoryBranchConfig: TreeBranchConfig = {\n EntityName: 'MJ: Query Categories',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n /** The DrawerCategoryID as a CompositeKey for the tree dropdown binding */\n public get DrawerCategoryIDAsKey(): CompositeKey | null {\n return this.DrawerCategoryID ? CompositeKey.FromID(this.DrawerCategoryID) : null;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private zone: NgZone\n ) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadSavedPanelWidth();\n this.loadSavedStatusFilters();\n this.loadSavedExpandedState();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n // Ensure any pending debounced settings are flushed\n UserInfoEngine.Instance.FlushPendingSettings();\n // Remove resize listeners if active\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Queries';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-database';\n }\n\n // ========================================\n // Data Loading\n // ========================================\n\n private async loadData(forceRefresh = false): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n // Force re-fetch from server when explicitly refreshing\n if (forceRefresh) {\n await this.metadata.Refresh();\n }\n\n // Load all queries the user has permission to run (regardless of status)\n this.categories = this.metadata.QueryCategories || [];\n this.queries = (this.metadata.Queries || []).filter(q =>\n q.UserCanRun(this.metadata.CurrentUser)\n );\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Mark data as loaded\n this.dataLoaded = true;\n\n // Apply initial query params for deep linking\n const params = this.GetQueryParams();\n if (params['queryId']) {\n this.selectQueryById(params['queryId']);\n }\n\n } catch (error) {\n console.error('Error loading queries:', error);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private buildCategoryTree(): void {\n const categoryMap = new Map<string, CategoryNode>();\n\n // Use filtered queries (status + search filters applied)\n const visibleQueries = this.filteredQueries;\n\n // Create nodes for all categories, restoring expanded state\n for (const category of this.categories) {\n const queriesInCategory = visibleQueries.filter(q => UUIDsEqual(q.CategoryID, category.ID));\n categoryMap.set(category.ID, {\n category,\n children: [],\n queries: queriesInCategory,\n expanded: this.expandedState.get(category.ID) ?? false,\n level: 0\n });\n }\n\n // Build tree structure\n const roots: CategoryNode[] = [];\n for (const category of this.categories) {\n const node = categoryMap.get(category.ID)!;\n if (category.ParentID) {\n const parent = categoryMap.get(category.ParentID);\n if (parent) {\n node.level = parent.level + 1;\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n // Add uncategorized queries to a virtual root\n const uncategorizedQueries = visibleQueries.filter(q => !q.CategoryID);\n if (uncategorizedQueries.length > 0) {\n const uncategorizedCategory = new QueryCategoryInfo({\n ID: '__uncategorized__',\n Name: 'Uncategorized',\n Description: 'Queries without a category'\n });\n roots.push({\n category: uncategorizedCategory,\n children: [],\n queries: uncategorizedQueries,\n expanded: this.expandedState.get('__uncategorized__') ?? false,\n level: 0\n });\n }\n\n // Sort children recursively\n const sortNodes = (nodes: CategoryNode[]): void => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n for (const node of nodes) {\n node.queries.sort((a, b) => a.Name.localeCompare(b.Name));\n sortNodes(node.children);\n }\n };\n sortNodes(roots);\n\n this.categoryTree = roots;\n }\n\n // ========================================\n // Search\n // ========================================\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n this.buildCategoryTree();\n\n // Expand all categories when searching so results are visible\n if (value) {\n this.expandAll();\n }\n\n this.cdr.markForCheck();\n }\n\n public clearSearch(): void {\n this.searchText = '';\n this.applyFilters();\n this.buildCategoryTree();\n this.cdr.markForCheck();\n }\n\n // ========================================\n // Status Filters\n // ========================================\n\n /** Toggle a status filter on/off and rebuild the tree */\n public toggleStatusFilter(status: string): void {\n this.StatusFilters[status] = !this.StatusFilters[status];\n this.applyFilters();\n this.buildCategoryTree();\n this.saveStatusFilters();\n this.cdr.markForCheck();\n }\n\n /** Get the count of queries with a given status */\n public getStatusCount(status: string): number {\n return this.queries.filter(q => q.Status === status).length;\n }\n\n /** Get the CSS color for a query status */\n public getStatusColor(status: string): string {\n switch (status) {\n case 'Approved': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Rejected': return 'var(--mj-status-error)';\n case 'Expired': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n /** Get the Font Awesome icon for a query status */\n public getStatusIcon(status: string): string {\n switch (status) {\n case 'Approved': return 'fa-check-circle';\n case 'Pending': return 'fa-clock';\n case 'Rejected': return 'fa-times-circle';\n case 'Expired': return 'fa-archive';\n default: return 'fa-question-circle';\n }\n }\n\n /** Apply both status and search filters to produce filteredQueries */\n private applyFilters(): void {\n // First filter by status\n let result = this.queries.filter(q => this.StatusFilters[q.Status] === true);\n\n // Then filter by search text\n if (this.searchText.trim()) {\n const searchLower = this.searchText.toLowerCase();\n result = result.filter(q =>\n q.Name.toLowerCase().includes(searchLower) ||\n q.Description?.toLowerCase().includes(searchLower) ||\n q.Category?.toLowerCase().includes(searchLower)\n );\n }\n\n this.filteredQueries = result;\n this.filteredQueryIds = new Set(result.map(q => q.ID.toLowerCase()));\n }\n\n /** Load saved status filter preferences */\n private loadSavedStatusFilters(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.STATUS_FILTERS_KEY);\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n // Merge saved values onto defaults (preserves any new statuses added later)\n for (const key of Object.keys(this.StatusFilters)) {\n if (typeof parsed[key] === 'boolean') {\n this.StatusFilters[key] = parsed[key];\n }\n }\n } catch {\n // Ignore invalid JSON, keep defaults\n }\n }\n }\n\n /** Save status filter preferences with debouncing */\n private saveStatusFilters(): void {\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.STATUS_FILTERS_KEY,\n JSON.stringify(this.StatusFilters)\n );\n }\n\n /** Load saved expanded/collapsed state for category nodes */\n private loadSavedExpandedState(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.EXPANDED_STATE_KEY);\n if (saved) {\n try {\n const parsed: Record<string, boolean> = JSON.parse(saved);\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'boolean') {\n this.expandedState.set(key, value);\n }\n }\n } catch {\n // Ignore invalid JSON, start fresh\n }\n }\n }\n\n /** Save expanded/collapsed state with debouncing */\n private saveExpandedState(): void {\n const obj: Record<string, boolean> = {};\n for (const [key, value] of this.expandedState.entries()) {\n obj[key] = value;\n }\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.EXPANDED_STATE_KEY,\n JSON.stringify(obj)\n );\n }\n\n // ========================================\n // Tree Navigation\n // ========================================\n\n public toggleExpand(node: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n node.expanded = !node.expanded;\n this.expandedState.set(node.category.ID, node.expanded);\n // Track the most recently expanded folder as the active category context\n if (node.expanded && node.category.ID !== '__uncategorized__') {\n this.activeCategoryID = node.category.ID;\n }\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public expandAll(): void {\n const expand = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n expand(node.children);\n }\n };\n expand(this.categoryTree);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public collapseAll(): void {\n const collapse = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = false;\n this.expandedState.set(node.category.ID, false);\n collapse(node.children);\n }\n };\n collapse(this.categoryTree);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public selectQuery(query: QueryInfo, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n this.selectedQuery = query;\n if (query.CategoryID) {\n this.activeCategoryID = query.CategoryID;\n }\n this.UpdateQueryParams({ queryId: query.ID });\n this.NotifyDisplayNameChanged(query.Name || 'Query');\n this.cdr.markForCheck();\n }\n\n public isQueryVisible(query: QueryInfo): boolean {\n if (!this.searchText) return true;\n return this.filteredQueryIds.has(query.ID.toLowerCase());\n }\n\n public hasVisibleContent(node: CategoryNode): boolean {\n if (!this.searchText) return true;\n\n // Check if any queries in this category match\n if (node.queries.some(q => this.isQueryVisible(q))) {\n return true;\n }\n\n // Check if any child categories have visible content\n return node.children.some(child => this.hasVisibleContent(child));\n }\n\n // ========================================\n // Query Viewer Events\n // ========================================\n\n public onEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n // Look up the entity's actual primary key field name from metadata\n const entity = this.metadata.Entities.find(e => e.Name === event.entityName);\n const pkField = entity?.FirstPrimaryKey;\n const pkFieldName = pkField?.Name || 'ID';\n\n const compositeKey = new CompositeKey([{ FieldName: pkFieldName, Value: event.recordId }]);\n this.navigationService.OpenEntityRecord(event.entityName, compositeKey);\n }\n\n public onRowDoubleClick(event: QueryRowClickEvent): void {\n // Could show record details or other action\n }\n\n public onOpenQueryRecord(event: { queryId: string; queryName: string }): void {\n // Open the Query entity record using navigation service\n const compositeKey = CompositeKey.FromID(event.queryId);\n this.navigationService.OpenEntityRecord('MJ: Queries', compositeKey);\n }\n\n public onCompositionTokenClick(event: CompositionTokenClickEvent): void {\n // Find the referenced query by matching name and category path\n const targetQuery = this.findQueryByCompositionPath(event.FullPath);\n if (targetQuery) {\n this.expandTreeToQuery(targetQuery);\n this.selectQuery(targetQuery);\n } else {\n // Query not in the current list — could be filtered out or in a different status\n console.warn(`Composition target query not found: \"${event.FullPath}\"`);\n }\n }\n\n /**\n * Find a query by its composition path (e.g., \"Demos/Active Users\").\n * Matches the last segment as query name and preceding segments as category hierarchy.\n */\n private findQueryByCompositionPath(fullPath: string): QueryInfo | null {\n const segments = fullPath.split('/').map(s => s.trim()).filter(s => s.length > 0);\n if (segments.length === 0) return null;\n\n const queryName = segments[segments.length - 1];\n const categorySegments = segments.slice(0, -1);\n\n // First try: exact match on Name + CategoryPath\n let result = this.queries.find(q => {\n if (q.Name !== queryName) return false;\n if (categorySegments.length === 0) return true;\n const expectedPath = '/' + categorySegments.join('/') + '/';\n return q.CategoryPath === expectedPath;\n });\n\n // Fallback: match on Name alone if category path didn't match\n if (!result) {\n result = this.queries.find(q => q.Name === queryName);\n }\n\n return result ?? null;\n }\n\n /**\n * Expand category tree nodes to reveal a specific query.\n */\n private expandTreeToQuery(query: QueryInfo): void {\n const expandInNodes = (nodes: CategoryNode[]): boolean => {\n for (const node of nodes) {\n // Check if this node directly contains the query\n if (node.queries.some(q => UUIDsEqual(q.ID, query.ID))) {\n node.expanded = true;\n return true;\n }\n // Check children recursively\n if (expandInNodes(node.children)) {\n node.expanded = true;\n return true;\n }\n }\n return false;\n };\n\n expandInNodes(this.categoryTree);\n this.cdr.markForCheck();\n }\n\n /** True when the current user has permission to create new queries. */\n public get CanCreateQuery(): boolean {\n const entity = this.metadata.EntityByName('MJ: Queries');\n if (!entity || !this.metadata.CurrentUser) return false;\n return entity.GetUserPermisions(this.metadata.CurrentUser).CanCreate;\n }\n\n /** True when the current user has permission to edit queries. */\n public get CanEditQuery(): boolean {\n const entity = this.metadata.EntityByName('MJ: Queries');\n if (!entity || !this.metadata.CurrentUser) return false;\n return entity.GetUserPermisions(this.metadata.CurrentUser).CanUpdate;\n }\n\n // ========================================\n // Drawer — Open / Close\n // ========================================\n\n /** Close the drawer when Escape is pressed (if open). */\n @HostListener('document:keydown.escape')\n public OnEscapeKey(): void {\n if (this.ShowQueryDrawer) {\n this.CloseDrawer();\n }\n }\n\n /** Open the drawer in create mode, optionally pre-selecting a category. */\n public OpenCreateDrawer(categoryID?: string): void {\n this.DrawerMode = 'create';\n this.DrawerQueryId = null;\n this.DrawerName = '';\n this.DrawerSQL = '';\n this.DrawerDescription = '';\n // Default to the explicit category, or the most recently active category\n this.DrawerCategoryID = categoryID ?? this.activeCategoryID ?? '';\n this.DrawerStatus = 'Pending';\n this.DrawerReusable = false;\n this.DrawerNameError = false;\n this.DrawerSaveError = null;\n this.captureDrawerSnapshot();\n this.ShowQueryDrawer = true;\n this.cdr.markForCheck();\n setTimeout(() => this.drawerSqlEditor?.setValue(''), 0);\n }\n\n /**\n * Open the drawer in edit mode, pre-populated from a QueryInfo.\n * Stops event propagation so clicking the edit icon doesn't also select the query.\n */\n public OpenEditDrawer(query: QueryInfo, event?: Event): void {\n if (event) event.stopPropagation();\n this.DrawerMode = 'edit';\n this.DrawerQueryId = query.ID;\n this.DrawerName = query.Name ?? '';\n this.DrawerSQL = query.SQL ?? '';\n this.DrawerDescription = query.Description ?? '';\n this.DrawerCategoryID = query.CategoryID ?? '';\n this.DrawerStatus = query.Status ?? 'Pending';\n this.DrawerReusable = query.Reusable ?? false;\n this.DrawerNameError = false;\n this.DrawerSaveError = null;\n this.captureDrawerSnapshot();\n this.ShowQueryDrawer = true;\n this.cdr.markForCheck();\n setTimeout(() => this.drawerSqlEditor?.setValue(this.DrawerSQL), 0);\n }\n\n /**\n * Close the drawer. If dirty, ask for confirmation unless force=true.\n */\n public CloseDrawer(force = false): void {\n if (!force && this.IsDrawerDirty) {\n if (!confirm('You have unsaved changes. Discard them?')) return;\n }\n this.ShowQueryDrawer = false;\n this.cdr.markForCheck();\n }\n\n /** Close drawer when clicking the backdrop. */\n public OnDrawerBackdropClick(): void {\n this.CloseDrawer();\n }\n\n // ========================================\n // Drawer — Form Helpers\n // ========================================\n\n /** Update DrawerSQL when the code editor emits a change. */\n public OnDrawerSQLChange(value: string): void {\n this.DrawerSQL = value;\n }\n\n /** Update DrawerCategoryID when the tree dropdown selection changes. */\n public OnDrawerCategoryChange(value: CompositeKey | CompositeKey[] | null): void {\n if (value instanceof CompositeKey && value.HasValue) {\n this.DrawerCategoryID = value.KeyValuePairs[0]?.Value ?? '';\n } else {\n this.DrawerCategoryID = '';\n }\n }\n\n private get currentDrawerSnapshot(): string {\n return JSON.stringify({\n name: this.DrawerName,\n sql: this.DrawerSQL,\n description: this.DrawerDescription,\n categoryID: this.DrawerCategoryID,\n status: this.DrawerStatus,\n reusable: this.DrawerReusable,\n });\n }\n\n private captureDrawerSnapshot(): void {\n this.initialDrawerSnapshot = this.currentDrawerSnapshot;\n }\n\n public get IsDrawerDirty(): boolean {\n return this.currentDrawerSnapshot !== this.initialDrawerSnapshot;\n }\n\n // ========================================\n // Drawer — Save\n // ========================================\n\n /** Save the drawer form (create or edit). */\n public async SaveDrawer(): Promise<void> {\n this.DrawerNameError = !this.DrawerName.trim();\n this.DrawerSaveError = null;\n if (this.DrawerNameError) {\n this.cdr.markForCheck();\n return;\n }\n\n this.IsSavingDrawer = true;\n this.cdr.markForCheck();\n\n try {\n const entity = await this.metadata.GetEntityObject<MJQueryEntity>('MJ: Queries');\n\n if (this.DrawerMode === 'edit' && this.DrawerQueryId) {\n const loaded = await entity.Load(this.DrawerQueryId);\n if (!loaded) {\n this.DrawerSaveError = 'Could not load query record. Please refresh and try again.';\n return;\n }\n }\n\n entity.Name = this.DrawerName.trim();\n entity.SQL = this.DrawerSQL;\n entity.Description = this.DrawerDescription;\n entity.CategoryID = this.DrawerCategoryID || null;\n entity.Status = this.DrawerStatus;\n entity.Reusable = this.DrawerReusable;\n\n const saved = await entity.Save();\n if (saved) {\n const savedId = entity.ID;\n this.ShowQueryDrawer = false;\n await this.loadData(true);\n const refreshed = this.queries.find(q => UUIDsEqual(q.ID, savedId));\n if (refreshed) {\n this.selectedQuery = refreshed;\n this.expandCategoryForQuery(refreshed);\n this.UpdateQueryParams({ queryId: refreshed.ID });\n }\n } else {\n this.DrawerSaveError = 'Save failed. Please check your inputs and try again.';\n }\n } catch (e) {\n console.error('Error saving query:', e);\n this.DrawerSaveError = 'An unexpected error occurred while saving.';\n } finally {\n this.IsSavingDrawer = false;\n this.cdr.markForCheck();\n }\n }\n\n // ========================================\n // Drawer — Open Full Record\n // ========================================\n\n /** Open the full entity form in a new tab (for sub-entity management). */\n public OpenFullRecord(): void {\n if (!this.DrawerQueryId) return;\n this.navigationService.OpenEntityRecord(\n 'MJ: Queries',\n CompositeKey.FromID(this.DrawerQueryId)\n );\n this.CloseDrawer(true);\n }\n\n // ========================================\n // Utilities\n // ========================================\n\n public getTotalQueryCount(): number {\n return this.queries.length;\n }\n\n public getNodeQueryCount(node: CategoryNode): number {\n let count = node.queries.length;\n for (const child of node.children) {\n count += this.getNodeQueryCount(child);\n }\n return count;\n }\n\n public refresh(): void {\n this.selectedQuery = null;\n this.UpdateQueryParams({ queryId: null });\n this.NotifyDisplayNameChanged('Queries');\n this.loadData(true);\n }\n\n public trackByCategory(index: number, node: CategoryNode): string {\n return node.category.ID;\n }\n\n public trackByQuery(index: number, query: QueryInfo): string {\n return query.ID;\n }\n\n // ========================================\n // Deep Linking\n // ========================================\n\n /**\n * Select a query by ID, expanding the tree to show it.\n * Clears selection if no matching query is found.\n */\n private selectQueryById(queryId: string): void {\n const query = this.queries.find(q => UUIDsEqual(q.ID, queryId));\n if (query) {\n if (!UUIDsEqual(this.selectedQuery?.ID, query.ID)) {\n this.selectedQuery = query;\n this.expandCategoryForQuery(query);\n this.NotifyDisplayNameChanged(query.Name || 'Query');\n }\n } else {\n this.selectedQuery = null;\n this.NotifyDisplayNameChanged('Queries');\n }\n this.cdr.markForCheck();\n }\n\n /**\n * React to back/forward navigation or deep-link activation.\n * Called by the base class when the URL query params change externally.\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void {\n if (!this.dataLoaded) return;\n if (params['queryId']) {\n this.selectQueryById(params['queryId']);\n } else {\n this.selectedQuery = null;\n this.NotifyDisplayNameChanged('Queries');\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Expands the category tree to show the given query\n */\n private expandCategoryForQuery(query: QueryInfo): void {\n if (!query.CategoryID) return;\n\n const expandToTarget = (nodes: CategoryNode[], targetCategoryId: string): boolean => {\n for (const node of nodes) {\n if (UUIDsEqual(node.category.ID, targetCategoryId)) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n return true;\n }\n if (expandToTarget(node.children, targetCategoryId)) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n return true;\n }\n }\n return false;\n };\n\n if (expandToTarget(this.categoryTree, query.CategoryID)) {\n this.saveExpandedState();\n }\n }\n\n // ========================================\n // Panel Resize\n // ========================================\n\n /**\n * Load saved panel width from user settings\n */\n private loadSavedPanelWidth(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.SETTINGS_KEY);\n if (saved) {\n const width = parseInt(saved, 10);\n if (!isNaN(width) && width >= QueryBrowserResourceComponent.MIN_PANEL_WIDTH && width <= QueryBrowserResourceComponent.MAX_PANEL_WIDTH) {\n this.PanelWidth = width;\n }\n }\n }\n\n /**\n * Start resizing the left panel via drag handle\n */\n public onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n this.cdr.markForCheck();\n\n // Run outside Angular zone for performance during mousemove\n this.zone.runOutsideAngular(() => {\n document.addEventListener('mousemove', this.boundOnResizeMove);\n document.addEventListener('mouseup', this.boundOnResizeEnd);\n });\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n const containerRect = this.elementRef.nativeElement.querySelector('.query-browser-container')?.getBoundingClientRect();\n if (!containerRect) return;\n\n const newWidth = event.clientX - containerRect.left;\n const clamped = Math.max(\n QueryBrowserResourceComponent.MIN_PANEL_WIDTH,\n Math.min(QueryBrowserResourceComponent.MAX_PANEL_WIDTH, newWidth)\n );\n\n this.PanelWidth = clamped;\n this.zone.run(() => this.cdr.markForCheck());\n }\n\n private onResizeEnd(): void {\n if (!this.IsResizing) return;\n this.IsResizing = false;\n\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n\n // Persist width with debouncing\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.SETTINGS_KEY,\n this.PanelWidth.toString()\n );\n\n this.zone.run(() => this.cdr.markForCheck());\n }\n\n /** Case-insensitive UUID check whether a query is the currently selected query. */\n public IsQuerySelected(query: QueryInfo): boolean {\n return UUIDsEqual(this.selectedQuery?.ID, query.ID);\n }\n}\n","<!-- Query Browser Resource -->\n<div class=\"query-browser-container\" [class.resizing]=\"IsResizing\">\n <!-- Left Panel: Query Tree -->\n <div class=\"query-tree-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Header -->\n <div class=\"tree-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-database\"></i>\n <span>Queries</span>\n <span class=\"query-count\">({{ getTotalQueryCount() }})</span>\n </div>\n <div class=\"header-actions\">\n @if (CanCreateQuery) {\n <button class=\"icon-btn\" (click)=\"OpenCreateDrawer()\" title=\"New Query\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n <button class=\"icon-btn\" (click)=\"expandAll()\" title=\"Expand all\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"collapseAll()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-folder\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"tree-search\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n [value]=\"searchText\"\n placeholder=\"Search queries...\"\n (input)=\"onSearchChange($any($event.target).value)\">\n @if (searchText) {\n <button class=\"clear-btn\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Status Filters -->\n <div class=\"status-filter-bar\">\n @for (status of AllStatuses; track status) {\n @if (getStatusCount(status) > 0) {\n <button class=\"status-filter-chip\"\n [class.active]=\"StatusFilters[status]\"\n [style.--chip-color]=\"getStatusColor(status)\"\n (click)=\"toggleStatusFilter(status)\"\n [title]=\"(StatusFilters[status] ? 'Hide' : 'Show') + ' ' + status + ' queries'\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(status)\"></i>\n <span>{{ status }}</span>\n <span class=\"chip-count\">{{ getStatusCount(status) }}</span>\n </button>\n }\n }\n </div>\n\n <!-- Tree Content -->\n <div class=\"tree-content\">\n <!-- Loading -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading queries...\"></mj-loading>\n </div>\n }\n\n <!-- Empty -->\n @if (!isLoading && queries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database empty-icon\"></i>\n <p>No queries available</p>\n </div>\n }\n\n <!-- No results -->\n @if (!isLoading && searchText && filteredQueries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>No queries match \"{{ searchText }}\"</p>\n </div>\n }\n\n <!-- Category Tree -->\n @if (!isLoading && queries.length > 0) {\n <div class=\"category-tree\">\n @for (node of categoryTree; track trackByCategory($index, node)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: node }\"></ng-container>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Resize Handle -->\n <div class=\"resize-handle\"\n [class.active]=\"IsResizing\"\n (mousedown)=\"onResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- Right Panel: Query Viewer -->\n <div class=\"query-viewer-panel\">\n <!-- No query selected -->\n @if (!selectedQuery) {\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-hand-pointer no-selection-icon\"></i>\n <p class=\"no-selection-message\">Select a query from the list</p>\n <p class=\"no-selection-hint\">Click on a query to view and run it</p>\n @if (CanCreateQuery) {\n <button class=\"no-selection-create-btn\" (click)=\"OpenCreateDrawer()\">\n <i class=\"fa-solid fa-plus\"></i> New Query\n </button>\n }\n </div>\n }\n\n <!-- Query Viewer -->\n @if (selectedQuery) {\n <!-- Query Header with Status -->\n <div class=\"query-viewer-header\">\n <div class=\"query-viewer-title\">\n <i class=\"fa-solid fa-file-code\"></i>\n <span>{{ selectedQuery.Name }}</span>\n </div>\n <div class=\"query-viewer-header-actions\">\n @if (selectedQuery.Status !== 'Approved') {\n <span class=\"query-viewer-status-pill\"\n [style.background]=\"getStatusColor(selectedQuery.Status)\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(selectedQuery.Status)\"></i>\n {{ selectedQuery.Status }}\n </span>\n } @else {\n <span class=\"query-viewer-status-pill approved\"\n [style.background]=\"getStatusColor('Approved')\">\n <i class=\"fa-solid fa-check-circle\"></i>\n Approved\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"icon-btn\" (click)=\"OpenEditDrawer(selectedQuery)\" title=\"Edit Query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n </div>\n <mj-query-viewer\n [QueryId]=\"selectedQuery.ID\"\n [AutoRun]=\"true\"\n [SelectionMode]=\"'multiple'\"\n (EntityLinkClick)=\"onEntityLinkClick($event)\"\n (RowDoubleClick)=\"onRowDoubleClick($event)\"\n (OpenQueryRecord)=\"onOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"onCompositionTokenClick($event)\">\n </mj-query-viewer>\n }\n </div>\n</div>\n\n<!-- Category Node Template -->\n<ng-template #categoryNode let-node=\"node\">\n @if (hasVisibleContent(node)) {\n <div class=\"category-item\"\n [class.expanded]=\"node.expanded\"\n [style.padding-left.px]=\"node.level * 16 + 8\">\n <div class=\"category-header\" (click)=\"toggleExpand(node)\">\n <i class=\"fa-solid expand-icon\"\n [class.fa-chevron-down]=\"node.expanded\"\n [class.fa-chevron-right]=\"!node.expanded\"></i>\n <i class=\"fa-solid fa-folder category-icon\"\n [class.fa-folder-open]=\"node.expanded\"></i>\n <span class=\"category-name\">{{ node.category.Name }}</span>\n <span class=\"category-count\">({{ getNodeQueryCount(node) }})</span>\n @if (CanCreateQuery && node.category.ID !== '__uncategorized__') {\n <button class=\"category-add-btn\"\n (click)=\"OpenCreateDrawer(node.category.ID); $event.stopPropagation()\"\n title=\"New query in {{ node.category.Name }}\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n <!-- Queries in this category -->\n @if (node.expanded) {\n <div class=\"category-queries\">\n @for (query of node.queries; track trackByQuery($index, query)) {\n <div class=\"query-item\"\n [class.selected]=\"IsQuerySelected(query)\"\n [class.hidden]=\"!isQueryVisible(query)\"\n (click)=\"selectQuery(query, $event)\">\n <span class=\"status-dot\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\"></span>\n <i class=\"fa-solid fa-file-code query-icon\"></i>\n <div class=\"query-info\" [title]=\"query.Description || query.Name\">\n <span class=\"query-name\">{{ query.Name }}</span>\n @if (query.Description) {\n <span class=\"query-description\">{{ query.Description }}</span>\n }\n </div>\n @if (query.UsesTemplate) {\n <i class=\"fa-solid fa-sliders param-icon\" title=\"Has parameters\"></i>\n }\n @if (query.Status !== 'Approved') {\n <span class=\"query-status-badge\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\">\n {{ query.Status }}\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"query-details-btn\" (click)=\"OpenEditDrawer(query, $event)\" title=\"Edit query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n <!-- Child categories -->\n @if (node.expanded) {\n @for (child of node.children; track trackByCategory($index, child)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n\n<!-- Query Drawer Backdrop -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer-backdrop\" (click)=\"OnDrawerBackdropClick()\"></div>\n}\n\n<!-- Query Drawer Panel -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer\">\n\n <!-- Drawer Header -->\n <div class=\"query-drawer-header\">\n <div class=\"query-drawer-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"DrawerMode === 'create'\" [class.fa-pen-to-square]=\"DrawerMode === 'edit'\"></i>\n <div>\n <div class=\"query-drawer-title-main\">{{ DrawerMode === 'create' ? 'New Query' : 'Edit Query' }}</div>\n @if (DrawerMode === 'edit' && DrawerName) {\n <div class=\"query-drawer-title-sub\">{{ DrawerName }}</div>\n }\n </div>\n </div>\n <button class=\"query-drawer-close\" (click)=\"CloseDrawer()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Drawer Body -->\n <div class=\"query-drawer-body\">\n\n <!-- Name -->\n <div class=\"drawer-field\" [class.drawer-field-error]=\"DrawerNameError\">\n <label class=\"drawer-label\">Name <span class=\"drawer-required\">*</span></label>\n <input class=\"drawer-input\"\n type=\"text\"\n [(ngModel)]=\"DrawerName\"\n (ngModelChange)=\"DrawerNameError = false\"\n placeholder=\"Enter query name\"\n [disabled]=\"IsSavingDrawer\">\n @if (DrawerNameError) {\n <span class=\"drawer-field-hint\">Name is required</span>\n }\n </div>\n\n <!-- Category + Status (side by side) -->\n <div class=\"drawer-row\">\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Category</label>\n <mj-tree-dropdown\n [BranchConfig]=\"CategoryBranchConfig\"\n [Value]=\"DrawerCategoryIDAsKey\"\n [SelectableTypes]=\"'branch'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Select category...'\"\n [EnableSearch]=\"true\"\n [Clearable]=\"true\"\n [Disabled]=\"IsSavingDrawer\"\n (ValueChange)=\"OnDrawerCategoryChange($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Status</label>\n <select class=\"drawer-select\"\n [(ngModel)]=\"DrawerStatus\"\n [disabled]=\"IsSavingDrawer\">\n @for (s of DrawerStatuses; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Reusable -->\n <div class=\"drawer-field drawer-field-inline\">\n <label class=\"mj-checkbox drawer-reusable-label\">\n <input type=\"checkbox\"\n [(ngModel)]=\"DrawerReusable\"\n [disabled]=\"IsSavingDrawer\">\n <span>Reusable</span>\n </label>\n <span class=\"drawer-field-hint\">Allow other queries to reference this query using composition syntax</span>\n </div>\n\n <!-- Description -->\n <div class=\"drawer-field\">\n <label class=\"drawer-label\">Description</label>\n <textarea class=\"drawer-textarea\"\n rows=\"3\"\n [(ngModel)]=\"DrawerDescription\"\n placeholder=\"Optional description\"\n [disabled]=\"IsSavingDrawer\"></textarea>\n </div>\n\n <!-- SQL -->\n <div class=\"drawer-field drawer-field-sql\">\n <label class=\"drawer-label\">SQL</label>\n <mj-code-editor #drawerSqlEditor\n [language]=\"'sql'\"\n [indentWithTab]=\"true\"\n [readonly]=\"IsSavingDrawer\"\n (change)=\"OnDrawerSQLChange($event)\"\n class=\"drawer-sql-editor\">\n </mj-code-editor>\n </div>\n\n <!-- Open Full Record link (edit mode only) -->\n @if (DrawerMode === 'edit' && DrawerQueryId) {\n <div class=\"drawer-full-record\">\n <i class=\"fa-solid fa-circle-info\"></i>\n To manage Parameters, Fields, and Permissions —\n <button class=\"drawer-link-btn\" (click)=\"OpenFullRecord()\">\n Open full record <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n }\n\n </div>\n\n <!-- Drawer Footer -->\n <div class=\"query-drawer-footer\">\n\n <!-- Error message -->\n @if (DrawerSaveError) {\n <div class=\"drawer-error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> {{ DrawerSaveError }}\n </div>\n }\n\n <!-- Action buttons -->\n <div class=\"drawer-footer-actions\">\n <button class=\"drawer-btn drawer-btn-primary\"\n (click)=\"SaveDrawer()\"\n [disabled]=\"IsSavingDrawer || !DrawerName.trim()\">\n @if (IsSavingDrawer) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n <button class=\"drawer-btn drawer-btn-secondary\"\n (click)=\"CloseDrawer()\"\n [disabled]=\"IsSavingDrawer\">\n Cancel\n </button>\n </div>\n\n </div>\n\n </div>\n}\n"]}
1
+ {"version":3,"file":"query-browser-resource.component.js","sourceRoot":"","sources":["../../src/QueryBrowser/query-browser-resource.component.ts","../../src/QueryBrowser/query-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ElementRef, NgZone, HostListener, ViewChild } from '@angular/core';\nimport { CodeEditorComponent } from '@memberjunction/ng-code-editor';\nimport { Subject } from 'rxjs';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { Metadata, QueryInfo, QueryCategoryInfo, CompositeKey } from '@memberjunction/core';\nimport { TreeBranchConfig } from '@memberjunction/ng-trees';\nimport { ResourceData, UserInfoEngine, MJQueryEntity } from '@memberjunction/core-entities';\nimport {\n QueryEntityLinkClickEvent,\n QueryRowClickEvent\n} from '@memberjunction/ng-query-viewer';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\n/**\n * Tree node for the query category hierarchy\n */\ninterface CategoryNode {\n category: QueryCategoryInfo;\n children: CategoryNode[];\n queries: QueryInfo[];\n expanded: boolean;\n level: number;\n}\n\n/**\n * A resource component for browsing and executing stored queries.\n * Features:\n * - Hierarchical category navigation\n * - Query search\n * - Query viewer with parameter input\n * - Entity linking for clickable record IDs\n */\n@RegisterClass(BaseResourceComponent, 'QueryBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-query-browser-resource',\n templateUrl: './query-browser-resource.component.html',\n styleUrls: ['./query-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n private static readonly SETTINGS_KEY = 'QueryBrowser/panelWidth';\n private static readonly STATUS_FILTERS_KEY = 'QueryBrowser/statusFilters';\n private static readonly EXPANDED_STATE_KEY = 'QueryBrowser/expandedCategories';\n private static readonly DEFAULT_PANEL_WIDTH = 320;\n private static readonly MIN_PANEL_WIDTH = 200;\n private static readonly MAX_PANEL_WIDTH = 600;\n\n public isLoading = true;\n public categories: QueryCategoryInfo[] = [];\n public categoryTree: CategoryNode[] = [];\n /** All queries the user has permission to run */\n public queries: QueryInfo[] = [];\n public filteredQueries: QueryInfo[] = [];\n private filteredQueryIds = new Set<string>();\n public selectedQuery: QueryInfo | null = null;\n public searchText = '';\n public PanelWidth = QueryBrowserResourceComponent.DEFAULT_PANEL_WIDTH;\n public IsResizing = false;\n\n /** Status filter toggles — which statuses to show in the tree */\n public StatusFilters: Record<string, boolean> = {\n 'Approved': true,\n 'Pending': false,\n 'Rejected': false,\n 'Expired': false\n };\n\n /** Ordered list of all possible statuses for the filter bar */\n public readonly AllStatuses: string[] = ['Approved', 'Pending', 'Rejected', 'Expired'];\n\n /** Tracks expanded state by category ID — persisted across sessions */\n private expandedState = new Map<string, boolean>();\n\n private metadata = this.ProviderToUse;\n protected override destroy$ = new Subject<void>();\n private dataLoaded = false;\n\n // Bound event handlers for resize (need references for removeEventListener)\n private boundOnResizeMove = this.onResizeMove.bind(this);\n private boundOnResizeEnd = this.onResizeEnd.bind(this);\n\n // ========================================\n // Drawer State (Create / Edit)\n // ========================================\n\n public ShowQueryDrawer = false;\n public DrawerMode: 'create' | 'edit' = 'create';\n public DrawerQueryId: string | null = null;\n public DrawerName = '';\n public DrawerSQL = '';\n @ViewChild('drawerSqlEditor') private drawerSqlEditor: CodeEditorComponent | null = null;\n public DrawerDescription = '';\n public DrawerCategoryID = '';\n public DrawerStatus: 'Pending' | 'Approved' | 'Rejected' | 'Expired' = 'Pending';\n public DrawerReusable = false;\n public IsSavingDrawer = false;\n public DrawerNameError = false;\n public DrawerSaveError: string | null = null;\n\n /** Ordered status options for the drawer dropdown — all valid Query statuses */\n public readonly DrawerStatuses: Array<'Pending' | 'Approved' | 'Rejected' | 'Expired'> =\n ['Pending', 'Approved', 'Rejected', 'Expired'];\n\n private initialDrawerSnapshot = '';\n\n /** The category ID of the most recently interacted-with folder in the tree */\n private activeCategoryID: string | null = null;\n\n /** Tree dropdown config for Query Categories (branches only, no leaves) */\n public CategoryBranchConfig: TreeBranchConfig = {\n EntityName: 'MJ: Query Categories',\n DisplayField: 'Name',\n IDField: 'ID',\n ParentIDField: 'ParentID',\n DefaultIcon: 'fa-solid fa-folder',\n DescriptionField: 'Description',\n OrderBy: 'Name ASC'\n };\n\n /** The DrawerCategoryID as a CompositeKey for the tree dropdown binding */\n public get DrawerCategoryIDAsKey(): CompositeKey | null {\n return this.DrawerCategoryID ? CompositeKey.FromID(this.DrawerCategoryID) : null;\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef,\n private zone: NgZone\n ) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadSavedPanelWidth();\n this.loadSavedStatusFilters();\n this.loadSavedExpandedState();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n // Ensure any pending debounced settings are flushed\n UserInfoEngine.Instance.FlushPendingSettings();\n // Remove resize listeners if active\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Queries';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-database';\n }\n\n // ========================================\n // Data Loading\n // ========================================\n\n private async loadData(forceRefresh = false): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n // Force re-fetch from server when explicitly refreshing\n if (forceRefresh) {\n await this.metadata.Refresh();\n }\n\n // Load all queries the user has permission to run (regardless of status)\n this.categories = this.metadata.QueryCategories || [];\n this.queries = (this.metadata.Queries || []).filter(q =>\n q.UserCanRun(this.metadata.CurrentUser)\n );\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Mark data as loaded\n this.dataLoaded = true;\n\n // Apply initial query params for deep linking\n const params = this.GetQueryParams();\n if (params['queryId']) {\n this.selectQueryById(params['queryId']);\n }\n\n } catch (error) {\n console.error('Error loading queries:', error);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private buildCategoryTree(): void {\n const categoryMap = new Map<string, CategoryNode>();\n\n // Use filtered queries (status + search filters applied)\n const visibleQueries = this.filteredQueries;\n\n // Create nodes for all categories, restoring expanded state\n for (const category of this.categories) {\n const queriesInCategory = visibleQueries.filter(q => UUIDsEqual(q.CategoryID, category.ID));\n categoryMap.set(category.ID, {\n category,\n children: [],\n queries: queriesInCategory,\n expanded: this.expandedState.get(category.ID) ?? false,\n level: 0\n });\n }\n\n // Build tree structure\n const roots: CategoryNode[] = [];\n for (const category of this.categories) {\n const node = categoryMap.get(category.ID)!;\n if (category.ParentID) {\n const parent = categoryMap.get(category.ParentID);\n if (parent) {\n node.level = parent.level + 1;\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n } else {\n roots.push(node);\n }\n }\n\n // Add uncategorized queries to a virtual root\n const uncategorizedQueries = visibleQueries.filter(q => !q.CategoryID);\n if (uncategorizedQueries.length > 0) {\n const uncategorizedCategory = new QueryCategoryInfo({\n ID: '__uncategorized__',\n Name: 'Uncategorized',\n Description: 'Queries without a category'\n });\n roots.push({\n category: uncategorizedCategory,\n children: [],\n queries: uncategorizedQueries,\n expanded: this.expandedState.get('__uncategorized__') ?? false,\n level: 0\n });\n }\n\n // Sort children recursively\n const sortNodes = (nodes: CategoryNode[]): void => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n for (const node of nodes) {\n node.queries.sort((a, b) => a.Name.localeCompare(b.Name));\n sortNodes(node.children);\n }\n };\n sortNodes(roots);\n\n this.categoryTree = roots;\n }\n\n // ========================================\n // Search\n // ========================================\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n this.buildCategoryTree();\n\n // Expand all categories when searching so results are visible\n if (value) {\n this.expandAll();\n }\n\n this.cdr.markForCheck();\n }\n\n public clearSearch(): void {\n this.searchText = '';\n this.applyFilters();\n this.buildCategoryTree();\n this.cdr.markForCheck();\n }\n\n // ========================================\n // Status Filters\n // ========================================\n\n /** Toggle a status filter on/off and rebuild the tree */\n public toggleStatusFilter(status: string): void {\n this.StatusFilters[status] = !this.StatusFilters[status];\n this.applyFilters();\n this.buildCategoryTree();\n this.saveStatusFilters();\n this.cdr.markForCheck();\n }\n\n /** Get the count of queries with a given status */\n public getStatusCount(status: string): number {\n return this.queries.filter(q => q.Status === status).length;\n }\n\n /** Get the CSS color for a query status */\n public getStatusColor(status: string): string {\n switch (status) {\n case 'Approved': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Rejected': return 'var(--mj-status-error)';\n case 'Expired': return 'var(--mj-text-muted)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n /** Get the Font Awesome icon for a query status */\n public getStatusIcon(status: string): string {\n switch (status) {\n case 'Approved': return 'fa-check-circle';\n case 'Pending': return 'fa-clock';\n case 'Rejected': return 'fa-times-circle';\n case 'Expired': return 'fa-archive';\n default: return 'fa-question-circle';\n }\n }\n\n /** Apply both status and search filters to produce filteredQueries */\n private applyFilters(): void {\n // First filter by status\n let result = this.queries.filter(q => this.StatusFilters[q.Status] === true);\n\n // Then filter by search text\n if (this.searchText.trim()) {\n const searchLower = this.searchText.toLowerCase();\n result = result.filter(q =>\n q.Name.toLowerCase().includes(searchLower) ||\n q.Description?.toLowerCase().includes(searchLower) ||\n q.Category?.toLowerCase().includes(searchLower)\n );\n }\n\n this.filteredQueries = result;\n this.filteredQueryIds = new Set(result.map(q => q.ID.toLowerCase()));\n }\n\n /** Load saved status filter preferences */\n private loadSavedStatusFilters(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.STATUS_FILTERS_KEY);\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n // Merge saved values onto defaults (preserves any new statuses added later)\n for (const key of Object.keys(this.StatusFilters)) {\n if (typeof parsed[key] === 'boolean') {\n this.StatusFilters[key] = parsed[key];\n }\n }\n } catch {\n // Ignore invalid JSON, keep defaults\n }\n }\n }\n\n /** Save status filter preferences with debouncing */\n private saveStatusFilters(): void {\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.STATUS_FILTERS_KEY,\n JSON.stringify(this.StatusFilters)\n );\n }\n\n /** Load saved expanded/collapsed state for category nodes */\n private loadSavedExpandedState(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.EXPANDED_STATE_KEY);\n if (saved) {\n try {\n const parsed: Record<string, boolean> = JSON.parse(saved);\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'boolean') {\n this.expandedState.set(key, value);\n }\n }\n } catch {\n // Ignore invalid JSON, start fresh\n }\n }\n }\n\n /** Save expanded/collapsed state with debouncing */\n private saveExpandedState(): void {\n const obj: Record<string, boolean> = {};\n for (const [key, value] of this.expandedState.entries()) {\n obj[key] = value;\n }\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.EXPANDED_STATE_KEY,\n JSON.stringify(obj)\n );\n }\n\n // ========================================\n // Tree Navigation\n // ========================================\n\n public toggleExpand(node: CategoryNode, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n node.expanded = !node.expanded;\n this.expandedState.set(node.category.ID, node.expanded);\n // Track the most recently expanded folder as the active category context\n if (node.expanded && node.category.ID !== '__uncategorized__') {\n this.activeCategoryID = node.category.ID;\n }\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public expandAll(): void {\n const expand = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n expand(node.children);\n }\n };\n expand(this.categoryTree);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public collapseAll(): void {\n const collapse = (nodes: CategoryNode[]): void => {\n for (const node of nodes) {\n node.expanded = false;\n this.expandedState.set(node.category.ID, false);\n collapse(node.children);\n }\n };\n collapse(this.categoryTree);\n this.saveExpandedState();\n this.cdr.markForCheck();\n }\n\n public selectQuery(query: QueryInfo, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n this.selectedQuery = query;\n if (query.CategoryID) {\n this.activeCategoryID = query.CategoryID;\n }\n this.UpdateQueryParams({ queryId: query.ID });\n this.NotifyDisplayNameChanged(query.Name || 'Query');\n this.cdr.markForCheck();\n }\n\n public isQueryVisible(query: QueryInfo): boolean {\n if (!this.searchText) return true;\n return this.filteredQueryIds.has(query.ID.toLowerCase());\n }\n\n public hasVisibleContent(node: CategoryNode): boolean {\n if (!this.searchText) return true;\n\n // Check if any queries in this category match\n if (node.queries.some(q => this.isQueryVisible(q))) {\n return true;\n }\n\n // Check if any child categories have visible content\n return node.children.some(child => this.hasVisibleContent(child));\n }\n\n // ========================================\n // Query Viewer Events\n // ========================================\n\n public onEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n // Look up the entity's actual primary key field name from metadata\n const entity = this.metadata.Entities.find(e => e.Name === event.entityName);\n const pkField = entity?.FirstPrimaryKey;\n const pkFieldName = pkField?.Name || 'ID';\n\n const compositeKey = new CompositeKey([{ FieldName: pkFieldName, Value: event.recordId }]);\n this.navigationService.OpenEntityRecord(event.entityName, compositeKey);\n }\n\n public onRowDoubleClick(event: QueryRowClickEvent): void {\n // Could show record details or other action\n }\n\n public onOpenQueryRecord(event: { queryId: string; queryName: string }): void {\n // Open the Query entity record using navigation service\n const compositeKey = CompositeKey.FromID(event.queryId);\n this.navigationService.OpenEntityRecord('MJ: Queries', compositeKey);\n }\n\n public onCompositionTokenClick(event: CompositionTokenClickEvent): void {\n // Find the referenced query by matching name and category path\n const targetQuery = this.findQueryByCompositionPath(event.FullPath);\n if (targetQuery) {\n this.expandTreeToQuery(targetQuery);\n this.selectQuery(targetQuery);\n } else {\n // Query not in the current list — could be filtered out or in a different status\n console.warn(`Composition target query not found: \"${event.FullPath}\"`);\n }\n }\n\n /**\n * Find a query by its composition path (e.g., \"Demos/Active Users\").\n * Matches the last segment as query name and preceding segments as category hierarchy.\n */\n private findQueryByCompositionPath(fullPath: string): QueryInfo | null {\n const segments = fullPath.split('/').map(s => s.trim()).filter(s => s.length > 0);\n if (segments.length === 0) return null;\n\n const queryName = segments[segments.length - 1];\n const categorySegments = segments.slice(0, -1);\n\n // First try: exact match on Name + CategoryPath\n let result = this.queries.find(q => {\n if (q.Name !== queryName) return false;\n if (categorySegments.length === 0) return true;\n const expectedPath = '/' + categorySegments.join('/') + '/';\n return q.CategoryPath === expectedPath;\n });\n\n // Fallback: match on Name alone if category path didn't match\n if (!result) {\n result = this.queries.find(q => q.Name === queryName);\n }\n\n return result ?? null;\n }\n\n /**\n * Expand category tree nodes to reveal a specific query.\n */\n private expandTreeToQuery(query: QueryInfo): void {\n const expandInNodes = (nodes: CategoryNode[]): boolean => {\n for (const node of nodes) {\n // Check if this node directly contains the query\n if (node.queries.some(q => UUIDsEqual(q.ID, query.ID))) {\n node.expanded = true;\n return true;\n }\n // Check children recursively\n if (expandInNodes(node.children)) {\n node.expanded = true;\n return true;\n }\n }\n return false;\n };\n\n expandInNodes(this.categoryTree);\n this.cdr.markForCheck();\n }\n\n /** True when the current user has permission to create new queries. */\n public get CanCreateQuery(): boolean {\n const entity = this.metadata.EntityByName('MJ: Queries');\n if (!entity || !this.metadata.CurrentUser) return false;\n return entity.GetUserPermisions(this.metadata.CurrentUser).CanCreate;\n }\n\n /** True when the current user has permission to edit queries. */\n public get CanEditQuery(): boolean {\n const entity = this.metadata.EntityByName('MJ: Queries');\n if (!entity || !this.metadata.CurrentUser) return false;\n return entity.GetUserPermisions(this.metadata.CurrentUser).CanUpdate;\n }\n\n // ========================================\n // Drawer — Open / Close\n // ========================================\n\n /** Close the drawer when Escape is pressed (if open). */\n @HostListener('document:keydown.escape')\n public OnEscapeKey(): void {\n if (this.ShowQueryDrawer) {\n this.CloseDrawer();\n }\n }\n\n /** Open the drawer in create mode, optionally pre-selecting a category. */\n public OpenCreateDrawer(categoryID?: string): void {\n this.DrawerMode = 'create';\n this.DrawerQueryId = null;\n this.DrawerName = '';\n this.DrawerSQL = '';\n this.DrawerDescription = '';\n // Default to the explicit category, or the most recently active category\n this.DrawerCategoryID = categoryID ?? this.activeCategoryID ?? '';\n this.DrawerStatus = 'Pending';\n this.DrawerReusable = false;\n this.DrawerNameError = false;\n this.DrawerSaveError = null;\n this.captureDrawerSnapshot();\n this.ShowQueryDrawer = true;\n this.cdr.markForCheck();\n setTimeout(() => this.drawerSqlEditor?.setValue(''), 0);\n }\n\n /**\n * Open the drawer in edit mode, pre-populated from a QueryInfo.\n * Stops event propagation so clicking the edit icon doesn't also select the query.\n */\n public OpenEditDrawer(query: QueryInfo, event?: Event): void {\n if (event) event.stopPropagation();\n this.DrawerMode = 'edit';\n this.DrawerQueryId = query.ID;\n this.DrawerName = query.Name ?? '';\n this.DrawerSQL = query.SQL ?? '';\n this.DrawerDescription = query.Description ?? '';\n this.DrawerCategoryID = query.CategoryID ?? '';\n this.DrawerStatus = query.Status ?? 'Pending';\n this.DrawerReusable = query.Reusable ?? false;\n this.DrawerNameError = false;\n this.DrawerSaveError = null;\n this.captureDrawerSnapshot();\n this.ShowQueryDrawer = true;\n this.cdr.markForCheck();\n setTimeout(() => this.drawerSqlEditor?.setValue(this.DrawerSQL), 0);\n }\n\n /**\n * Close the drawer. If dirty, ask for confirmation unless force=true.\n */\n public CloseDrawer(force = false): void {\n if (!force && this.IsDrawerDirty) {\n if (!confirm('You have unsaved changes. Discard them?')) return;\n }\n this.ShowQueryDrawer = false;\n this.cdr.markForCheck();\n }\n\n /** Close drawer when clicking the backdrop. */\n public OnDrawerBackdropClick(): void {\n this.CloseDrawer();\n }\n\n // ========================================\n // Drawer — Form Helpers\n // ========================================\n\n /** Update DrawerSQL when the code editor emits a change. */\n public OnDrawerSQLChange(value: string): void {\n this.DrawerSQL = value;\n }\n\n /** Update DrawerCategoryID when the tree dropdown selection changes. */\n public OnDrawerCategoryChange(value: CompositeKey | CompositeKey[] | null): void {\n if (value instanceof CompositeKey && value.HasValue) {\n this.DrawerCategoryID = value.KeyValuePairs[0]?.Value ?? '';\n } else {\n this.DrawerCategoryID = '';\n }\n }\n\n private get currentDrawerSnapshot(): string {\n return JSON.stringify({\n name: this.DrawerName,\n sql: this.DrawerSQL,\n description: this.DrawerDescription,\n categoryID: this.DrawerCategoryID,\n status: this.DrawerStatus,\n reusable: this.DrawerReusable,\n });\n }\n\n private captureDrawerSnapshot(): void {\n this.initialDrawerSnapshot = this.currentDrawerSnapshot;\n }\n\n public get IsDrawerDirty(): boolean {\n return this.currentDrawerSnapshot !== this.initialDrawerSnapshot;\n }\n\n // ========================================\n // Drawer — Save\n // ========================================\n\n /** Save the drawer form (create or edit). */\n public async SaveDrawer(): Promise<void> {\n this.DrawerNameError = !this.DrawerName.trim();\n this.DrawerSaveError = null;\n if (this.DrawerNameError) {\n this.cdr.markForCheck();\n return;\n }\n\n this.IsSavingDrawer = true;\n this.cdr.markForCheck();\n\n try {\n const entity = await this.metadata.GetEntityObject<MJQueryEntity>('MJ: Queries');\n\n if (this.DrawerMode === 'edit' && this.DrawerQueryId) {\n const loaded = await entity.Load(this.DrawerQueryId);\n if (!loaded) {\n this.DrawerSaveError = 'Could not load query record. Please refresh and try again.';\n return;\n }\n }\n\n entity.Name = this.DrawerName.trim();\n entity.SQL = this.DrawerSQL;\n entity.Description = this.DrawerDescription;\n entity.CategoryID = this.DrawerCategoryID || null;\n entity.Status = this.DrawerStatus;\n entity.Reusable = this.DrawerReusable;\n\n const saved = await entity.Save();\n if (saved) {\n const savedId = entity.ID;\n this.ShowQueryDrawer = false;\n await this.loadData(true);\n const refreshed = this.queries.find(q => UUIDsEqual(q.ID, savedId));\n if (refreshed) {\n this.selectedQuery = refreshed;\n this.expandCategoryForQuery(refreshed);\n this.UpdateQueryParams({ queryId: refreshed.ID });\n }\n } else {\n this.DrawerSaveError = 'Save failed. Please check your inputs and try again.';\n }\n } catch (e) {\n console.error('Error saving query:', e);\n this.DrawerSaveError = 'An unexpected error occurred while saving.';\n } finally {\n this.IsSavingDrawer = false;\n this.cdr.markForCheck();\n }\n }\n\n // ========================================\n // Drawer — Open Full Record\n // ========================================\n\n /** Open the full entity form in a new tab (for sub-entity management). */\n public OpenFullRecord(): void {\n if (!this.DrawerQueryId) return;\n this.navigationService.OpenEntityRecord(\n 'MJ: Queries',\n CompositeKey.FromID(this.DrawerQueryId)\n );\n this.CloseDrawer(true);\n }\n\n // ========================================\n // Utilities\n // ========================================\n\n public getTotalQueryCount(): number {\n return this.queries.length;\n }\n\n public getNodeQueryCount(node: CategoryNode): number {\n let count = node.queries.length;\n for (const child of node.children) {\n count += this.getNodeQueryCount(child);\n }\n return count;\n }\n\n public refresh(): void {\n this.selectedQuery = null;\n this.UpdateQueryParams({ queryId: null });\n this.NotifyDisplayNameChanged('Queries');\n this.loadData(true);\n }\n\n public trackByCategory(index: number, node: CategoryNode): string {\n return node.category.ID;\n }\n\n public trackByQuery(index: number, query: QueryInfo): string {\n return query.ID;\n }\n\n // ========================================\n // Deep Linking\n // ========================================\n\n /**\n * Select a query by ID, expanding the tree to show it.\n * Clears selection if no matching query is found.\n */\n private selectQueryById(queryId: string): void {\n const query = this.queries.find(q => UUIDsEqual(q.ID, queryId));\n if (query) {\n if (!UUIDsEqual(this.selectedQuery?.ID, query.ID)) {\n this.selectedQuery = query;\n this.expandCategoryForQuery(query);\n this.NotifyDisplayNameChanged(query.Name || 'Query');\n }\n } else {\n this.selectedQuery = null;\n this.NotifyDisplayNameChanged('Queries');\n }\n this.cdr.markForCheck();\n }\n\n /**\n * React to back/forward navigation or deep-link activation.\n * Called by the base class when the URL query params change externally.\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, source: 'popstate' | 'deeplink'): void {\n if (!this.dataLoaded) return;\n if (params['queryId']) {\n this.selectQueryById(params['queryId']);\n } else {\n this.selectedQuery = null;\n this.NotifyDisplayNameChanged('Queries');\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Expands the category tree to show the given query\n */\n private expandCategoryForQuery(query: QueryInfo): void {\n if (!query.CategoryID) return;\n\n const expandToTarget = (nodes: CategoryNode[], targetCategoryId: string): boolean => {\n for (const node of nodes) {\n if (UUIDsEqual(node.category.ID, targetCategoryId)) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n return true;\n }\n if (expandToTarget(node.children, targetCategoryId)) {\n node.expanded = true;\n this.expandedState.set(node.category.ID, true);\n return true;\n }\n }\n return false;\n };\n\n if (expandToTarget(this.categoryTree, query.CategoryID)) {\n this.saveExpandedState();\n }\n }\n\n // ========================================\n // Panel Resize\n // ========================================\n\n /**\n * Load saved panel width from user settings\n */\n private loadSavedPanelWidth(): void {\n const saved = UserInfoEngine.Instance.GetSetting(QueryBrowserResourceComponent.SETTINGS_KEY);\n if (saved) {\n const width = parseInt(saved, 10);\n if (!isNaN(width) && width >= QueryBrowserResourceComponent.MIN_PANEL_WIDTH && width <= QueryBrowserResourceComponent.MAX_PANEL_WIDTH) {\n this.PanelWidth = width;\n }\n }\n }\n\n /**\n * Start resizing the left panel via drag handle\n */\n public onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n this.cdr.markForCheck();\n\n // Run outside Angular zone for performance during mousemove\n this.zone.runOutsideAngular(() => {\n document.addEventListener('mousemove', this.boundOnResizeMove);\n document.addEventListener('mouseup', this.boundOnResizeEnd);\n });\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n const containerRect = this.elementRef.nativeElement.querySelector('.query-browser-container')?.getBoundingClientRect();\n if (!containerRect) return;\n\n const newWidth = event.clientX - containerRect.left;\n const clamped = Math.max(\n QueryBrowserResourceComponent.MIN_PANEL_WIDTH,\n Math.min(QueryBrowserResourceComponent.MAX_PANEL_WIDTH, newWidth)\n );\n\n this.PanelWidth = clamped;\n this.zone.run(() => this.cdr.markForCheck());\n }\n\n private onResizeEnd(): void {\n if (!this.IsResizing) return;\n this.IsResizing = false;\n\n document.removeEventListener('mousemove', this.boundOnResizeMove);\n document.removeEventListener('mouseup', this.boundOnResizeEnd);\n\n // Persist width with debouncing\n UserInfoEngine.Instance.SetSettingDebounced(\n QueryBrowserResourceComponent.SETTINGS_KEY,\n this.PanelWidth.toString()\n );\n\n this.zone.run(() => this.cdr.markForCheck());\n }\n\n /** Case-insensitive UUID check whether a query is the currently selected query. */\n public IsQuerySelected(query: QueryInfo): boolean {\n return UUIDsEqual(this.selectedQuery?.ID, query.ID);\n }\n}\n","<!-- Query Browser Resource -->\n<div class=\"query-browser-container\" [class.resizing]=\"IsResizing\">\n <!-- Left Panel: Query Tree -->\n <div class=\"query-tree-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Header -->\n <div class=\"tree-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-database\"></i>\n <span>Queries</span>\n <span class=\"query-count\">({{ getTotalQueryCount() }})</span>\n </div>\n <div class=\"header-actions\">\n @if (CanCreateQuery) {\n <button class=\"icon-btn\" (click)=\"OpenCreateDrawer()\" title=\"New Query\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n <button class=\"icon-btn\" (click)=\"expandAll()\" title=\"Expand all\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"collapseAll()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-folder\"></i>\n </button>\n <button class=\"icon-btn\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Search -->\n <div class=\"tree-search\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n [value]=\"searchText\"\n placeholder=\"Search queries...\"\n (input)=\"onSearchChange($any($event.target).value)\">\n @if (searchText) {\n <button class=\"clear-btn\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Status Filters -->\n <div class=\"status-filter-bar\">\n @for (status of AllStatuses; track status) {\n @if (getStatusCount(status) > 0) {\n <button class=\"status-filter-chip\"\n [class.active]=\"StatusFilters[status]\"\n [style.--chip-color]=\"getStatusColor(status)\"\n (click)=\"toggleStatusFilter(status)\"\n [title]=\"(StatusFilters[status] ? 'Hide' : 'Show') + ' ' + status + ' queries'\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(status)\"></i>\n <span>{{ status }}</span>\n <span class=\"chip-count\">{{ getStatusCount(status) }}</span>\n </button>\n }\n }\n </div>\n\n <!-- Tree Content -->\n <div class=\"tree-content\">\n <!-- Loading -->\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading queries...\"></mj-loading>\n </div>\n }\n\n <!-- Empty -->\n @if (!isLoading && queries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database empty-icon\"></i>\n <p>No queries available</p>\n </div>\n }\n\n <!-- No results -->\n @if (!isLoading && searchText && filteredQueries.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>No queries match \"{{ searchText }}\"</p>\n </div>\n }\n\n <!-- Category Tree -->\n @if (!isLoading && queries.length > 0) {\n <div class=\"category-tree\">\n @for (node of categoryTree; track trackByCategory($index, node)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: node }\"></ng-container>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Resize Handle -->\n <div class=\"resize-handle\"\n [class.active]=\"IsResizing\"\n (mousedown)=\"onResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- Right Panel: Query Viewer -->\n <div class=\"query-viewer-panel\">\n <!-- No query selected -->\n @if (!selectedQuery) {\n <div class=\"no-selection\">\n <i class=\"fa-solid fa-hand-pointer no-selection-icon\"></i>\n <p class=\"no-selection-message\">Select a query from the list</p>\n <p class=\"no-selection-hint\">Click on a query to view and run it</p>\n @if (CanCreateQuery) {\n <button class=\"no-selection-create-btn\" (click)=\"OpenCreateDrawer()\">\n <i class=\"fa-solid fa-plus\"></i> New Query\n </button>\n }\n </div>\n }\n\n <!-- Query Viewer -->\n @if (selectedQuery) {\n <!-- Query Header with Status -->\n <div class=\"query-viewer-header\">\n <div class=\"query-viewer-title\">\n <i class=\"fa-solid fa-file-code\"></i>\n <span>{{ selectedQuery.Name }}</span>\n </div>\n <div class=\"query-viewer-header-actions\">\n @if (selectedQuery.Status !== 'Approved') {\n <span class=\"query-viewer-status-pill\"\n [style.background]=\"getStatusColor(selectedQuery.Status)\">\n <i class=\"fa-solid\" [class]=\"getStatusIcon(selectedQuery.Status)\"></i>\n {{ selectedQuery.Status }}\n </span>\n } @else {\n <span class=\"query-viewer-status-pill approved\"\n [style.background]=\"getStatusColor('Approved')\">\n <i class=\"fa-solid fa-check-circle\"></i>\n Approved\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"icon-btn\" (click)=\"OpenEditDrawer(selectedQuery)\" title=\"Edit Query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n </div>\n <mj-query-viewer\n [QueryId]=\"selectedQuery.ID\"\n [AutoRun]=\"true\"\n [SelectionMode]=\"'multiple'\"\n (EntityLinkClick)=\"onEntityLinkClick($event)\"\n (RowDoubleClick)=\"onRowDoubleClick($event)\"\n (OpenQueryRecord)=\"onOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"onCompositionTokenClick($event)\">\n </mj-query-viewer>\n }\n </div>\n</div>\n\n<!-- Category Node Template -->\n<ng-template #categoryNode let-node=\"node\">\n @if (hasVisibleContent(node)) {\n <div class=\"category-item\"\n [class.expanded]=\"node.expanded\"\n [style.padding-left.px]=\"node.level * 16 + 8\">\n <div class=\"category-header\" (click)=\"toggleExpand(node)\">\n <i class=\"fa-solid expand-icon\"\n [class.fa-chevron-down]=\"node.expanded\"\n [class.fa-chevron-right]=\"!node.expanded\"></i>\n <i class=\"fa-solid fa-folder category-icon\"\n [class.fa-folder-open]=\"node.expanded\"></i>\n <span class=\"category-name\">{{ node.category.Name }}</span>\n <span class=\"category-count\">({{ getNodeQueryCount(node) }})</span>\n @if (CanCreateQuery && node.category.ID !== '__uncategorized__') {\n <button class=\"category-add-btn\"\n (click)=\"OpenCreateDrawer(node.category.ID); $event.stopPropagation()\"\n title=\"New query in {{ node.category.Name }}\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n <!-- Queries in this category -->\n @if (node.expanded) {\n <div class=\"category-queries\">\n @for (query of node.queries; track trackByQuery($index, query)) {\n <div class=\"query-item\"\n [class.selected]=\"IsQuerySelected(query)\"\n [class.hidden]=\"!isQueryVisible(query)\"\n (click)=\"selectQuery(query, $event)\">\n <span class=\"status-dot\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\"></span>\n <i class=\"fa-solid fa-file-code query-icon\"></i>\n <div class=\"query-info\" [title]=\"query.Description || query.Name\">\n <span class=\"query-name\">{{ query.Name }}</span>\n @if (query.Description) {\n <span class=\"query-description\">{{ query.Description }}</span>\n }\n </div>\n @if (query.UsesTemplate) {\n <i class=\"fa-solid fa-sliders param-icon\" title=\"Has parameters\"></i>\n }\n @if (query.Status !== 'Approved') {\n <span class=\"query-status-badge\"\n [style.background]=\"getStatusColor(query.Status)\"\n [title]=\"query.Status\">\n {{ query.Status }}\n </span>\n }\n @if (CanEditQuery) {\n <button class=\"query-details-btn\" (click)=\"OpenEditDrawer(query, $event)\" title=\"Edit query\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n <!-- Child categories -->\n @if (node.expanded) {\n @for (child of node.children; track trackByCategory($index, child)) {\n <ng-container *ngTemplateOutlet=\"categoryNode; context: { node: child }\"></ng-container>\n }\n }\n </div>\n }\n</ng-template>\n\n<!-- Query Drawer Backdrop -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer-backdrop\" (click)=\"OnDrawerBackdropClick()\"></div>\n}\n\n<!-- Query Drawer Panel -->\n@if (ShowQueryDrawer) {\n <div class=\"query-drawer\">\n\n <!-- Drawer Header -->\n <div class=\"query-drawer-header\">\n <div class=\"query-drawer-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"DrawerMode === 'create'\" [class.fa-pen-to-square]=\"DrawerMode === 'edit'\"></i>\n <div>\n <div class=\"query-drawer-title-main\">{{ DrawerMode === 'create' ? 'New Query' : 'Edit Query' }}</div>\n @if (DrawerMode === 'edit' && DrawerName) {\n <div class=\"query-drawer-title-sub\">{{ DrawerName }}</div>\n }\n </div>\n </div>\n <button class=\"query-drawer-close\" (click)=\"CloseDrawer()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Drawer Body -->\n <div class=\"query-drawer-body\">\n\n <!-- Name -->\n <div class=\"drawer-field\" [class.drawer-field-error]=\"DrawerNameError\">\n <label class=\"drawer-label\">Name <span class=\"drawer-required\">*</span></label>\n <input class=\"drawer-input\"\n type=\"text\"\n [(ngModel)]=\"DrawerName\"\n (ngModelChange)=\"DrawerNameError = false\"\n placeholder=\"Enter query name\"\n [disabled]=\"IsSavingDrawer\">\n @if (DrawerNameError) {\n <span class=\"drawer-field-hint\">Name is required</span>\n }\n </div>\n\n <!-- Category + Status (side by side) -->\n <div class=\"drawer-row\">\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Category</label>\n <mj-tree-dropdown\n [BranchConfig]=\"CategoryBranchConfig\"\n [Value]=\"DrawerCategoryIDAsKey\"\n [SelectableTypes]=\"'branch'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Select category...'\"\n [EnableSearch]=\"true\"\n [Clearable]=\"true\"\n [Disabled]=\"IsSavingDrawer\"\n (ValueChange)=\"OnDrawerCategoryChange($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"drawer-field drawer-field-flex\">\n <label class=\"drawer-label\">Status</label>\n <select class=\"drawer-select\"\n [(ngModel)]=\"DrawerStatus\"\n [disabled]=\"IsSavingDrawer\">\n @for (s of DrawerStatuses; track s) {\n <option [value]=\"s\">{{ s }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Reusable -->\n <div class=\"drawer-field drawer-field-inline\">\n <label class=\"mj-checkbox drawer-reusable-label\">\n <input type=\"checkbox\"\n [(ngModel)]=\"DrawerReusable\"\n [disabled]=\"IsSavingDrawer\">\n <span>Reusable</span>\n </label>\n <span class=\"drawer-field-hint\">Allow other queries to reference this query using composition syntax</span>\n </div>\n\n <!-- Description -->\n <div class=\"drawer-field\">\n <label class=\"drawer-label\">Description</label>\n <textarea class=\"drawer-textarea\"\n rows=\"3\"\n [(ngModel)]=\"DrawerDescription\"\n placeholder=\"Optional description\"\n [disabled]=\"IsSavingDrawer\"></textarea>\n </div>\n\n <!-- SQL -->\n <div class=\"drawer-field drawer-field-sql\">\n <label class=\"drawer-label\">SQL</label>\n <mj-code-editor #drawerSqlEditor\n [language]=\"'sql'\"\n [indentWithTab]=\"true\"\n [readonly]=\"IsSavingDrawer\"\n (change)=\"OnDrawerSQLChange($event)\"\n class=\"drawer-sql-editor\">\n </mj-code-editor>\n </div>\n\n <!-- Open Full Record link (edit mode only) -->\n @if (DrawerMode === 'edit' && DrawerQueryId) {\n <div class=\"drawer-full-record\">\n <i class=\"fa-solid fa-circle-info\"></i>\n To manage Parameters, Fields, and Permissions —\n <button class=\"drawer-link-btn\" (click)=\"OpenFullRecord()\">\n Open full record <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </div>\n }\n\n </div>\n\n <!-- Drawer Footer -->\n <div class=\"query-drawer-footer\">\n\n <!-- Error message -->\n @if (DrawerSaveError) {\n <div class=\"drawer-error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> {{ DrawerSaveError }}\n </div>\n }\n\n <!-- Action buttons -->\n <div class=\"drawer-footer-actions\">\n <button class=\"drawer-btn drawer-btn-primary\"\n (click)=\"SaveDrawer()\"\n [disabled]=\"IsSavingDrawer || !DrawerName.trim()\">\n @if (IsSavingDrawer) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n <button class=\"drawer-btn drawer-btn-secondary\"\n (click)=\"CloseDrawer()\"\n [disabled]=\"IsSavingDrawer\">\n Cancel\n </button>\n </div>\n\n </div>\n\n </div>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"scheduling-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/Scheduling/scheduling-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAA2B,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK1D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,gCAAgC,EAAE,MAAM,+CAA+C,CAAC;;AASjG,qBAQa,4BAA6B,SAAQ,aAAc,YAAW,aAAa,EAAE,SAAS;IAwB/F,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,iBAAiB;IAxBpB,SAAS,UAAS;IAClB,SAAS,SAAe;IAExB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAC7C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAEnD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,kBAAkB,CAA2C;IAE9D,cAAc,SAAK;IACnB,UAAU,SAAK;IAEtB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,QAAQ,CAA2B;IAEpC,eAAe;;;;QAIpB;gBAGQ,GAAG,EAAE,iBAAiB,EACtB,iBAAiB,EAAE,gCAAgC;IAMvD,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjE,eAAe,IAAI,IAAI;IAMvB,WAAW,IAAI,IAAI;IAOnB,OAAO,CAAC,iBAAiB;IAYlB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAYhC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIzC,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,eAAe;IAShB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK5D,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKvD,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK3D,kBAAkB,IAAI,MAAM;IAKnC,aAAa,IAAI,IAAI;IAIrB,QAAQ,IAAI,IAAI;yCArHL,4BAA4B;2CAA5B,4BAA4B;CAmIxC"}
1
+ {"version":3,"file":"scheduling-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/Scheduling/scheduling-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAA2B,MAAM,eAAe,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK1D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,gCAAgC,EAAE,MAAM,+CAA+C,CAAC;;AASjG,qBAQa,4BAA6B,SAAQ,aAAc,YAAW,aAAa,EAAE,SAAS;IAwB/F,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,iBAAiB;IAxBpB,SAAS,UAAS;IAClB,SAAS,SAAe;IAExB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAC7C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAEnD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,kBAAkB,CAA2C;IAE9D,cAAc,SAAK;IACnB,UAAU,SAAK;IAEtB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,QAAQ,CAA2B;IAEpC,eAAe;;;;QAIpB;gBAGQ,GAAG,EAAE,iBAAiB,EACtB,iBAAiB,EAAE,gCAAgC;IAMvD,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjE,eAAe,IAAI,IAAI;IAMvB,WAAW,IAAI,IAAI;IAOnB,OAAO,CAAC,iBAAiB;IAYlB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAYhC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIzC,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,eAAe;IAShB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK5D,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKvD,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK3D,kBAAkB,IAAI,MAAM;IAKnC,aAAa,IAAI,IAAI;IAKrB,QAAQ,IAAI,IAAI;yCAtHL,4BAA4B;2CAA5B,4BAA4B;CAoIxC"}
@@ -165,6 +165,7 @@ let SchedulingDashboardComponent = class SchedulingDashboardComponent extends Ba
165
165
  return item ? item.text : 'Scheduling';
166
166
  }
167
167
  initDashboard() {
168
+ this.schedulingService.Provider = this.ProviderToUse;
168
169
  this.IsLoading = false;
169
170
  }
170
171
  loadData() {
@@ -1 +1 @@
1
- {"version":3,"file":"scheduling-dashboard.component.js","sourceRoot":"","sources":["../../src/Scheduling/scheduling-dashboard.component.ts","../../src/Scheduling/scheduling-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { SchedulingInstrumentationService } from './services/scheduling-instrumentation.service';\n\ninterface SchedulingDashboardState {\n activeTab: string;\n dashboardState: Record<string, unknown>;\n jobsState: Record<string, unknown>;\n activityState: Record<string, unknown>;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-scheduling-dashboard',\n templateUrl: './scheduling-dashboard.component.html',\n styleUrls: ['./scheduling-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseDashboard, 'SchedulingDashboard')\nexport class SchedulingDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n public IsLoading = false;\n public ActiveTab = 'dashboard';\n\n public DashboardState: Record<string, unknown> = {};\n public JobsState: Record<string, unknown> = {};\n public ActivityState: Record<string, unknown> = {};\n\n private visitedTabs = new Set<string>();\n private stateChangeSubject = new Subject<SchedulingDashboardState>();\n\n public ActiveJobCount = 0;\n public AlertCount = 0;\n\n private kpiSub: Subscription | undefined;\n private alertSub: Subscription | undefined;\n\n public NavigationItems = [\n { id: 'dashboard', text: 'Dashboard', icon: 'fa-solid fa-gauge-high' },\n { id: 'jobs', text: 'Jobs', icon: 'fa-solid fa-calendar-check' },\n { id: 'activity', text: 'Activity', icon: 'fa-solid fa-clock-rotate-left' }\n ];\n\n constructor(\n private cdr: ChangeDetectorRef,\n private schedulingService: SchedulingInstrumentationService\n ) {\n super();\n this.setupStateManagement();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Scheduling';\n }\n\n ngAfterViewInit(): void {\n this.visitedTabs.add(this.ActiveTab);\n this.loadSidebarCounts();\n this.cdr.detectChanges();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.stateChangeSubject.complete();\n if (this.kpiSub) this.kpiSub.unsubscribe();\n if (this.alertSub) this.alertSub.unsubscribe();\n }\n\n private loadSidebarCounts(): void {\n this.kpiSub = this.schedulingService.kpis$.subscribe(kpis => {\n this.ActiveJobCount = kpis.totalActiveJobs;\n this.cdr.markForCheck();\n });\n\n this.alertSub = this.schedulingService.alerts$.subscribe(alerts => {\n this.AlertCount = alerts.length;\n this.cdr.markForCheck();\n });\n }\n\n public OnTabChange(tabId: string): void {\n this.ActiveTab = tabId;\n this.visitedTabs.add(tabId);\n\n setTimeout(() => {\n SharedService.Instance.InvokeManualResize();\n }, 100);\n\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n public HasVisited(tabId: string): boolean {\n return this.visitedTabs.has(tabId);\n }\n\n private setupStateManagement(): void {\n this.stateChangeSubject.pipe(\n debounceTime(50)\n ).subscribe(state => {\n this.UserStateChanged.emit(state);\n });\n }\n\n private emitStateChange(): void {\n this.stateChangeSubject.next({\n activeTab: this.ActiveTab,\n dashboardState: this.DashboardState,\n jobsState: this.JobsState,\n activityState: this.ActivityState\n });\n }\n\n public OnDashboardStateChange(state: Record<string, unknown>): void {\n this.DashboardState = state;\n this.emitStateChange();\n }\n\n public OnJobsStateChange(state: Record<string, unknown>): void {\n this.JobsState = state;\n this.emitStateChange();\n }\n\n public OnActivityStateChange(state: Record<string, unknown>): void {\n this.ActivityState = state;\n this.emitStateChange();\n }\n\n public GetCurrentTabLabel(): string {\n const item = this.NavigationItems.find(n => n.id === this.ActiveTab);\n return item ? item.text : 'Scheduling';\n }\n\n initDashboard(): void {\n this.IsLoading = false;\n }\n\n loadData(): void {\n if (this.Config?.userState) {\n const state = this.Config.userState as Partial<SchedulingDashboardState>;\n if (state.activeTab) {\n this.ActiveTab = state.activeTab;\n this.visitedTabs.add(state.activeTab);\n }\n if (state.dashboardState) this.DashboardState = state.dashboardState;\n if (state.jobsState) this.JobsState = state.jobsState;\n if (state.activityState) this.ActivityState = state.activityState;\n this.cdr.markForCheck();\n }\n this.NotifyLoadComplete();\n }\n}\n","<div class=\"scheduling-dashboard-container\">\n <div class=\"dashboard-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Job Scheduling</span>\n </div>\n <div class=\"header-actions\">\n @if (AlertCount > 0) {\n <div class=\"status-badge\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{AlertCount}} Alert{{AlertCount !== 1 ? 's' : ''}}</span>\n </div>\n }\n @if (AlertCount === 0) {\n <div class=\"status-badge healthy\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Healthy</span>\n </div>\n }\n <span class=\"tab-label\">{{GetCurrentTabLabel()}}</span>\n </div>\n </div>\n\n <div class=\"dashboard-content\">\n <div class=\"sidebar\">\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Overview</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"ActiveTab === 'dashboard'\" (click)=\"OnTabChange('dashboard')\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n <span>Dashboard</span>\n </div>\n\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Management</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"ActiveTab === 'jobs'\" (click)=\"OnTabChange('jobs')\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Jobs</span>\n @if (ActiveJobCount > 0) {\n <span class=\"badge\">{{ActiveJobCount}}</span>\n }\n </div>\n <div class=\"nav-item\" [class.selected]=\"ActiveTab === 'activity'\" (click)=\"OnTabChange('activity')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span>Activity</span>\n </div>\n </div>\n\n <div class=\"main-content\">\n <div class=\"tab-container\">\n @switch (ActiveTab) {\n @case ('dashboard') {\n <div class=\"tab-content\">\n <app-scheduling-overview\n [initialState]=\"DashboardState\"\n (stateChange)=\"OnDashboardStateChange($event)\">\n </app-scheduling-overview>\n </div>\n }\n @case ('jobs') {\n <div class=\"tab-content\">\n <app-scheduling-jobs\n [initialState]=\"JobsState\"\n (stateChange)=\"OnJobsStateChange($event)\">\n </app-scheduling-jobs>\n </div>\n }\n @case ('activity') {\n <div class=\"tab-content\">\n <app-scheduling-activity\n [initialState]=\"ActivityState\"\n (stateChange)=\"OnActivityStateChange($event)\">\n </app-scheduling-activity>\n </div>\n }\n }\n </div>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"scheduling-dashboard.component.js","sourceRoot":"","sources":["../../src/Scheduling/scheduling-dashboard.component.ts","../../src/Scheduling/scheduling-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { ResourceData } from '@memberjunction/core-entities';\nimport { SchedulingInstrumentationService } from './services/scheduling-instrumentation.service';\n\ninterface SchedulingDashboardState {\n activeTab: string;\n dashboardState: Record<string, unknown>;\n jobsState: Record<string, unknown>;\n activityState: Record<string, unknown>;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-scheduling-dashboard',\n templateUrl: './scheduling-dashboard.component.html',\n styleUrls: ['./scheduling-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseDashboard, 'SchedulingDashboard')\nexport class SchedulingDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n public IsLoading = false;\n public ActiveTab = 'dashboard';\n\n public DashboardState: Record<string, unknown> = {};\n public JobsState: Record<string, unknown> = {};\n public ActivityState: Record<string, unknown> = {};\n\n private visitedTabs = new Set<string>();\n private stateChangeSubject = new Subject<SchedulingDashboardState>();\n\n public ActiveJobCount = 0;\n public AlertCount = 0;\n\n private kpiSub: Subscription | undefined;\n private alertSub: Subscription | undefined;\n\n public NavigationItems = [\n { id: 'dashboard', text: 'Dashboard', icon: 'fa-solid fa-gauge-high' },\n { id: 'jobs', text: 'Jobs', icon: 'fa-solid fa-calendar-check' },\n { id: 'activity', text: 'Activity', icon: 'fa-solid fa-clock-rotate-left' }\n ];\n\n constructor(\n private cdr: ChangeDetectorRef,\n private schedulingService: SchedulingInstrumentationService\n ) {\n super();\n this.setupStateManagement();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Scheduling';\n }\n\n ngAfterViewInit(): void {\n this.visitedTabs.add(this.ActiveTab);\n this.loadSidebarCounts();\n this.cdr.detectChanges();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.stateChangeSubject.complete();\n if (this.kpiSub) this.kpiSub.unsubscribe();\n if (this.alertSub) this.alertSub.unsubscribe();\n }\n\n private loadSidebarCounts(): void {\n this.kpiSub = this.schedulingService.kpis$.subscribe(kpis => {\n this.ActiveJobCount = kpis.totalActiveJobs;\n this.cdr.markForCheck();\n });\n\n this.alertSub = this.schedulingService.alerts$.subscribe(alerts => {\n this.AlertCount = alerts.length;\n this.cdr.markForCheck();\n });\n }\n\n public OnTabChange(tabId: string): void {\n this.ActiveTab = tabId;\n this.visitedTabs.add(tabId);\n\n setTimeout(() => {\n SharedService.Instance.InvokeManualResize();\n }, 100);\n\n this.emitStateChange();\n this.cdr.markForCheck();\n }\n\n public HasVisited(tabId: string): boolean {\n return this.visitedTabs.has(tabId);\n }\n\n private setupStateManagement(): void {\n this.stateChangeSubject.pipe(\n debounceTime(50)\n ).subscribe(state => {\n this.UserStateChanged.emit(state);\n });\n }\n\n private emitStateChange(): void {\n this.stateChangeSubject.next({\n activeTab: this.ActiveTab,\n dashboardState: this.DashboardState,\n jobsState: this.JobsState,\n activityState: this.ActivityState\n });\n }\n\n public OnDashboardStateChange(state: Record<string, unknown>): void {\n this.DashboardState = state;\n this.emitStateChange();\n }\n\n public OnJobsStateChange(state: Record<string, unknown>): void {\n this.JobsState = state;\n this.emitStateChange();\n }\n\n public OnActivityStateChange(state: Record<string, unknown>): void {\n this.ActivityState = state;\n this.emitStateChange();\n }\n\n public GetCurrentTabLabel(): string {\n const item = this.NavigationItems.find(n => n.id === this.ActiveTab);\n return item ? item.text : 'Scheduling';\n }\n\n initDashboard(): void {\n this.schedulingService.Provider = this.ProviderToUse;\n this.IsLoading = false;\n }\n\n loadData(): void {\n if (this.Config?.userState) {\n const state = this.Config.userState as Partial<SchedulingDashboardState>;\n if (state.activeTab) {\n this.ActiveTab = state.activeTab;\n this.visitedTabs.add(state.activeTab);\n }\n if (state.dashboardState) this.DashboardState = state.dashboardState;\n if (state.jobsState) this.JobsState = state.jobsState;\n if (state.activityState) this.ActivityState = state.activityState;\n this.cdr.markForCheck();\n }\n this.NotifyLoadComplete();\n }\n}\n","<div class=\"scheduling-dashboard-container\">\n <div class=\"dashboard-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Job Scheduling</span>\n </div>\n <div class=\"header-actions\">\n @if (AlertCount > 0) {\n <div class=\"status-badge\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{AlertCount}} Alert{{AlertCount !== 1 ? 's' : ''}}</span>\n </div>\n }\n @if (AlertCount === 0) {\n <div class=\"status-badge healthy\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Healthy</span>\n </div>\n }\n <span class=\"tab-label\">{{GetCurrentTabLabel()}}</span>\n </div>\n </div>\n\n <div class=\"dashboard-content\">\n <div class=\"sidebar\">\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Overview</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"ActiveTab === 'dashboard'\" (click)=\"OnTabChange('dashboard')\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n <span>Dashboard</span>\n </div>\n\n <div class=\"sidebar-section\">\n <div class=\"sidebar-section-title\">Management</div>\n </div>\n <div class=\"nav-item\" [class.selected]=\"ActiveTab === 'jobs'\" (click)=\"OnTabChange('jobs')\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Jobs</span>\n @if (ActiveJobCount > 0) {\n <span class=\"badge\">{{ActiveJobCount}}</span>\n }\n </div>\n <div class=\"nav-item\" [class.selected]=\"ActiveTab === 'activity'\" (click)=\"OnTabChange('activity')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span>Activity</span>\n </div>\n </div>\n\n <div class=\"main-content\">\n <div class=\"tab-container\">\n @switch (ActiveTab) {\n @case ('dashboard') {\n <div class=\"tab-content\">\n <app-scheduling-overview\n [initialState]=\"DashboardState\"\n (stateChange)=\"OnDashboardStateChange($event)\">\n </app-scheduling-overview>\n </div>\n }\n @case ('jobs') {\n <div class=\"tab-content\">\n <app-scheduling-jobs\n [initialState]=\"JobsState\"\n (stateChange)=\"OnJobsStateChange($event)\">\n </app-scheduling-jobs>\n </div>\n }\n @case ('activity') {\n <div class=\"tab-content\">\n <app-scheduling-activity\n [initialState]=\"ActivityState\"\n (stateChange)=\"OnActivityStateChange($event)\">\n </app-scheduling-activity>\n </div>\n }\n }\n </div>\n </div>\n </div>\n</div>\n"]}
@@ -1,3 +1,4 @@
1
+ import { IMetadataProvider } from '@memberjunction/core';
1
2
  import * as i0 from "@angular/core";
2
3
  export interface SchedulingKPIs {
3
4
  totalActiveJobs: number;
@@ -86,6 +87,10 @@ export interface AlertCondition {
86
87
  jobName?: string;
87
88
  }
88
89
  export declare class SchedulingInstrumentationService {
90
+ private _provider;
91
+ /** Set the metadata provider this service should use. Components should call this after injection. */
92
+ set Provider(value: IMetadataProvider | null);
93
+ get Provider(): IMetadataProvider;
89
94
  private readonly _dateRange$;
90
95
  private readonly _refreshTrigger$;
91
96
  private readonly _isLoading$;
@@ -1 +1 @@
1
- {"version":3,"file":"scheduling-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/Scheduling/services/scheduling-instrumentation.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheduling-instrumentation.service.d.ts","sourceRoot":"","sources":["../../../src/Scheduling/services/scheduling-instrumentation.service.ts"],"names":[],"mappings":"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"}