@memberjunction/ng-dashboards 5.38.0 → 5.40.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 (321) hide show
  1. package/README.md +14 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +217 -860
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1717 -7802
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  31. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  33. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  35. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  37. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  39. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  41. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  43. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  45. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  47. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  49. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  50. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  51. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  53. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  54. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  55. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  57. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  58. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  59. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  61. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  63. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  65. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +333 -0
  67. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +2125 -0
  69. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  71. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  73. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  74. package/dist/AI/components/autotagging/shared/classify.format.d.ts +58 -0
  75. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/shared/classify.format.js +260 -0
  77. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  78. package/dist/AI/components/autotagging/shared/classify.types.d.ts +319 -0
  79. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  81. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  83. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  85. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +77 -0
  87. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/history-tab.component.js +519 -0
  89. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  90. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  91. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  92. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  93. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  94. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +131 -0
  95. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  96. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +813 -0
  97. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  98. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +177 -0
  99. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  100. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1465 -0
  101. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  102. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +78 -0
  103. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  104. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +492 -0
  105. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  106. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  107. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  108. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  109. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  110. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +56 -0
  111. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  112. package/dist/AI/components/autotagging/tabs/types-tab.component.js +271 -0
  113. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  114. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  115. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  116. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +306 -290
  117. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  118. package/dist/AI/components/execution-monitoring.component.js +1 -1
  119. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  120. package/dist/AI/components/models/model-management.component.js +209 -208
  121. package/dist/AI/components/models/model-management.component.js.map +1 -1
  122. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  123. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  124. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  125. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  126. package/dist/AI/components/system/system-configuration.component.js +17 -17
  127. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  128. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  129. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  130. package/dist/AI/components/tags/tags-resource.component.js +578 -538
  131. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  132. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  133. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  134. package/dist/AI/components/vectors/vector-management-resource.component.js +331 -303
  135. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  136. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  137. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  138. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  139. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  140. package/dist/AI/services/cache-metrics.d.ts +50 -0
  141. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  142. package/dist/AI/services/cache-metrics.js +43 -0
  143. package/dist/AI/services/cache-metrics.js.map +1 -0
  144. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  145. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  146. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  147. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  148. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  149. package/dist/Actions/components/actions-overview.component.js +141 -141
  150. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  151. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  152. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  153. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  154. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  155. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  156. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  157. package/dist/Admin/admin-data-schema.component.js +2 -2
  158. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  159. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  160. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  161. package/dist/Admin/admin-identity-access.component.js +2 -2
  162. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  163. package/dist/Admin/admin-monitoring.component.js +2 -2
  164. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  165. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  166. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  167. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  168. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  169. package/dist/Communication/communication-logs-resource.component.js +72 -50
  170. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  171. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  172. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  173. package/dist/Communication/communication-providers-resource.component.js +52 -51
  174. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  175. package/dist/Communication/communication-runs-resource.component.js +39 -38
  176. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  177. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  178. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  179. package/dist/Communication/communication-templates-resource.component.js +92 -89
  180. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  181. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  182. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  183. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  184. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  185. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  186. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  187. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  188. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  189. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  190. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  191. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  192. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  193. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  194. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  195. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  196. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  197. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  198. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  199. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  200. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  201. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  202. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  203. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  204. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  205. package/dist/DevTools/app-state-inspector.component.js +18 -17
  206. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  207. package/dist/DevTools/class-registry.component.js +88 -85
  208. package/dist/DevTools/class-registry.component.js.map +1 -1
  209. package/dist/DevTools/event-monitor.component.js +155 -150
  210. package/dist/DevTools/event-monitor.component.js.map +1 -1
  211. package/dist/DevTools/graphql-console.component.js +245 -243
  212. package/dist/DevTools/graphql-console.component.js.map +1 -1
  213. package/dist/DevTools/layout-inspector.component.js +18 -17
  214. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  215. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  216. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  217. package/dist/Home/home-dashboard.component.js +2 -2
  218. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  219. package/dist/Integration/components/activity/activity.component.js +236 -229
  220. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  221. package/dist/Integration/components/connections/connections.component.js +390 -389
  222. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  223. package/dist/Integration/components/overview/overview.component.js +2 -2
  224. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  225. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +14 -11
  226. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  227. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  228. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  229. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -119
  230. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  231. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  232. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  233. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  234. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  235. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  236. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  237. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  238. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  239. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  240. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  241. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  242. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  243. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  244. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  245. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  246. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  247. package/dist/KnowledgeHub/index.d.ts +3 -0
  248. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  249. package/dist/KnowledgeHub/index.js +3 -0
  250. package/dist/KnowledgeHub/index.js.map +1 -1
  251. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  252. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  253. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  254. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  255. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  256. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  257. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  258. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  259. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  260. package/dist/MCP/mcp-dashboard.component.js +443 -438
  261. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  262. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  263. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  264. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  265. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  266. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  267. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  268. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  269. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  270. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  271. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  272. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  273. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  274. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  275. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  276. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  277. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  278. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  279. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  280. package/dist/Testing/components/testing-explorer.component.js +436 -427
  281. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  282. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  283. package/dist/Testing/components/testing-runs.component.js +116 -115
  284. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  285. package/dist/Testing/testing-dashboard.component.js +6 -7
  286. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  287. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  288. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  289. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  290. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  291. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  292. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  293. package/dist/ai-dashboards.module.d.ts +57 -35
  294. package/dist/ai-dashboards.module.d.ts.map +1 -1
  295. package/dist/ai-dashboards.module.js +80 -1
  296. package/dist/ai-dashboards.module.js.map +1 -1
  297. package/dist/communication-dashboards.module.d.ts +1 -1
  298. package/dist/communication-dashboards.module.d.ts.map +1 -1
  299. package/dist/communication-dashboards.module.js +7 -1
  300. package/dist/communication-dashboards.module.js.map +1 -1
  301. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  302. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  303. package/dist/data-explorer-dashboards.module.js +5 -14
  304. package/dist/data-explorer-dashboards.module.js.map +1 -1
  305. package/dist/public-api.d.ts +3 -0
  306. package/dist/public-api.d.ts.map +1 -1
  307. package/dist/public-api.js +3 -0
  308. package/dist/public-api.js.map +1 -1
  309. package/dist/testing-dashboards.module.d.ts +4 -5
  310. package/dist/testing-dashboards.module.d.ts.map +1 -1
  311. package/dist/testing-dashboards.module.js +7 -5
  312. package/dist/testing-dashboards.module.js.map +1 -1
  313. package/package.json +57 -54
  314. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  315. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  316. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  317. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  318. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  319. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  320. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  321. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"layout-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/layout-inspector.component.ts","../../src/DevTools/layout-inspector.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { TabConfig } from '@memberjunction/ng-ui-components';\nimport { WorkspaceStateManager, GoldenLayoutManager } from '@memberjunction/ng-base-application';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\ninterface LayoutSection {\n id: 'workspace' | 'golden';\n label: string;\n icon: string;\n description: string;\n}\n\n/**\n * Layout Inspector — read-only view of the current workspace + Golden Layout\n * configuration. Replaces the legacy \"Log Layout (Debug)\" user-menu item that\n * only printed to console.\n */\n@RegisterClass(BaseResourceComponent, 'LayoutInspector')\n@Component({\n standalone: false,\n selector: 'mj-layout-inspector',\n templateUrl: './layout-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class LayoutInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Sections: LayoutSection[] = [\n { id: 'workspace', label: 'Workspace State', icon: 'fa-solid fa-table-columns', description: 'Tabs, active tab, app state' },\n { id: 'golden', label: 'Golden Layout', icon: 'fa-solid fa-window-restore', description: 'Active layout JSON config' }\n ];\n\n public ActiveSection: 'workspace' | 'golden' = 'workspace';\n public LayoutJson = '{}';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private layout: GoldenLayoutManager\n ) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ activeSection?: 'workspace' | 'golden' }>('layoutInspector');\n if (p?.activeSection) this.ActiveSection = p.activeSection;\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Layout Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-table-columns'; }\n\n /** Sections rendered as horizontal tabs in the chrome's [toolbar] slot. */\n public get tabsConfig(): TabConfig[] {\n return this.Sections.map(s => ({\n key: s.id,\n label: s.label,\n icon: s.icon\n }));\n }\n\n /** Adapter for `<mj-tab-nav>`'s string-typed `(TabChange)` output. */\n public onTabChange(key: string): void {\n const section = this.Sections.find(s => s.id === key);\n if (section) {\n this.OnSectionClick(section);\n }\n }\n\n public OnSectionClick(section: LayoutSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n this.refresh();\n }\n\n public refresh(): void {\n this.LayoutJson = JSON.stringify(this.computeData(), this.jsonReplacer, 2);\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public async OnCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.LayoutJson);\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public OnDownload(): void {\n const blob = new Blob([this.LayoutJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n a.download = `mj-layout-${this.ActiveSection}-${stamp}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get SectionLabel(): string {\n return this.Sections.find(s => s.id === this.ActiveSection)?.label ?? '';\n }\n\n // ---------- private ----------\n\n private computeData(): unknown {\n if (this.ActiveSection === 'workspace') {\n return this.workspace.GetConfiguration();\n }\n // Golden Layout: GoldenLayoutManager exposes its raw config when active\n const layoutAny = this.layout as unknown as { GetCurrentLayoutConfig?: () => unknown; CurrentConfig?: unknown };\n if (typeof layoutAny.GetCurrentLayoutConfig === 'function') {\n return layoutAny.GetCurrentLayoutConfig();\n }\n if (layoutAny.CurrentConfig !== undefined) {\n return layoutAny.CurrentConfig;\n }\n return { note: 'Golden Layout config is not currently exposed by GoldenLayoutManager.' };\n }\n\n private jsonReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Map) return Object.fromEntries(value.entries());\n if (value instanceof Set) return Array.from(value);\n if (typeof value === 'function') return `[Function ${(value as { name: string }).name || 'anonymous'}]`;\n return value;\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Layout inspector\"\n Title=\"Layout Inspector\"\n Subtitle=\"Workspace + Golden Layout configuration\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\n\n <div class=\"mj-inspector__content\">\n <div class=\"mj-inspector__content-head\">\n <h4 class=\"mj-inspector__content-title\">{{ SectionLabel }}</h4>\n <span class=\"mj-inspector__content-meta\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n <div class=\"mj-inspector__editor\">\n <mj-code-editor\n [(ngModel)]=\"LayoutJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"layout-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/layout-inspector.component.ts","../../src/DevTools/layout-inspector.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { TabConfig } from '@memberjunction/ng-ui-components';\nimport { WorkspaceStateManager, GoldenLayoutManager } from '@memberjunction/ng-base-application';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\ninterface LayoutSection {\n id: 'workspace' | 'golden';\n label: string;\n icon: string;\n description: string;\n}\n\n/**\n * Layout Inspector — read-only view of the current workspace + Golden Layout\n * configuration. Replaces the legacy \"Log Layout (Debug)\" user-menu item that\n * only printed to console.\n */\n@RegisterClass(BaseResourceComponent, 'LayoutInspector')\n@Component({\n standalone: false,\n selector: 'mj-layout-inspector',\n templateUrl: './layout-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class LayoutInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Sections: LayoutSection[] = [\n { id: 'workspace', label: 'Workspace State', icon: 'fa-solid fa-table-columns', description: 'Tabs, active tab, app state' },\n { id: 'golden', label: 'Golden Layout', icon: 'fa-solid fa-window-restore', description: 'Active layout JSON config' }\n ];\n\n public ActiveSection: 'workspace' | 'golden' = 'workspace';\n public LayoutJson = '{}';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private layout: GoldenLayoutManager\n ) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ activeSection?: 'workspace' | 'golden' }>('layoutInspector');\n if (p?.activeSection) this.ActiveSection = p.activeSection;\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Layout Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-table-columns'; }\n\n /** Sections rendered as horizontal tabs in the chrome's [toolbar] slot. */\n public get tabsConfig(): TabConfig[] {\n return this.Sections.map(s => ({\n key: s.id,\n label: s.label,\n icon: s.icon\n }));\n }\n\n /** Adapter for `<mj-tab-nav>`'s string-typed `(TabChange)` output. */\n public onTabChange(key: string): void {\n const section = this.Sections.find(s => s.id === key);\n if (section) {\n this.OnSectionClick(section);\n }\n }\n\n public OnSectionClick(section: LayoutSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n this.refresh();\n }\n\n public refresh(): void {\n this.LayoutJson = JSON.stringify(this.computeData(), this.jsonReplacer, 2);\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public async OnCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.LayoutJson);\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public OnDownload(): void {\n const blob = new Blob([this.LayoutJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n a.download = `mj-layout-${this.ActiveSection}-${stamp}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get SectionLabel(): string {\n return this.Sections.find(s => s.id === this.ActiveSection)?.label ?? '';\n }\n\n // ---------- private ----------\n\n private computeData(): unknown {\n if (this.ActiveSection === 'workspace') {\n return this.workspace.GetConfiguration();\n }\n // Golden Layout: GoldenLayoutManager exposes its raw config when active\n const layoutAny = this.layout as unknown as { GetCurrentLayoutConfig?: () => unknown; CurrentConfig?: unknown };\n if (typeof layoutAny.GetCurrentLayoutConfig === 'function') {\n return layoutAny.GetCurrentLayoutConfig();\n }\n if (layoutAny.CurrentConfig !== undefined) {\n return layoutAny.CurrentConfig;\n }\n return { note: 'Golden Layout config is not currently exposed by GoldenLayoutManager.' };\n }\n\n private jsonReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Map) return Object.fromEntries(value.entries());\n if (value instanceof Set) return Array.from(value);\n if (typeof value === 'function') return `[Function ${(value as { name: string }).name || 'anonymous'}]`;\n return value;\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Layout inspector\"\n Title=\"Layout Inspector\"\n Subtitle=\"Workspace + Golden Layout configuration\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">{{ CopyConfirmed ? 'Copied' : 'Copy' }}</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\n\n <div class=\"mj-inspector__content\">\n <div class=\"mj-inspector__content-head\">\n <h4 class=\"mj-inspector__content-title\">{{ SectionLabel }}</h4>\n <span class=\"mj-inspector__content-meta\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n <div class=\"mj-inspector__editor\">\n <mj-code-editor\n [(ngModel)]=\"LayoutJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n"]}
@@ -16,17 +16,17 @@ import * as i1 from "@memberjunction/ng-ui-components";
16
16
  import * as i2 from "@memberjunction/ng-shared-generic";
17
17
  import * as i3 from "@memberjunction/ng-entity-relationship-diagram";
18
18
  const _c0 = ["erdComposite"];
19
- function EntityAdminDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
20
- i0.ɵɵelementStart(0, "div", 8);
21
- i0.ɵɵelement(1, "mj-loading", 11);
19
+ function EntityAdminDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
20
+ i0.ɵɵelementStart(0, "div", 9);
21
+ i0.ɵɵelement(1, "mj-loading", 12);
22
22
  i0.ɵɵelementEnd();
23
23
  } if (rf & 2) {
24
24
  const ctx_r0 = i0.ɵɵnextContext();
25
25
  i0.ɵɵadvance();
26
26
  i0.ɵɵproperty("text", ctx_r0.loadingMessage);
27
27
  } }
28
- function EntityAdminDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelementStart(0, "div", 9)(1, "p", 12);
28
+ function EntityAdminDashboardComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelementStart(0, "div", 10)(1, "p", 13);
30
30
  i0.ɵɵtext(2);
31
31
  i0.ɵɵelementEnd()();
32
32
  } if (rf & 2) {
@@ -34,10 +34,10 @@ function EntityAdminDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf
34
34
  i0.ɵɵadvance(2);
35
35
  i0.ɵɵtextInterpolate(ctx_r0.error);
36
36
  } }
37
- function EntityAdminDashboardComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
37
+ function EntityAdminDashboardComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
38
38
  const _r2 = i0.ɵɵgetCurrentView();
39
- i0.ɵɵelementStart(0, "div", 10)(1, "mj-erd-composite", 13, 0);
40
- i0.ɵɵlistener("stateChange", function EntityAdminDashboardComponent_Conditional_11_Template_mj_erd_composite_stateChange_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onStateChange($event)); })("userStateChange", function EntityAdminDashboardComponent_Conditional_11_Template_mj_erd_composite_userStateChange_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onUserStateChange($event)); })("entityOpened", function EntityAdminDashboardComponent_Conditional_11_Template_mj_erd_composite_entityOpened_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onEntityOpened($event)); })("openRecord", function EntityAdminDashboardComponent_Conditional_11_Template_mj_erd_composite_openRecord_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onOpenRecord($event)); });
39
+ i0.ɵɵelementStart(0, "div", 11)(1, "mj-erd-composite", 14, 0);
40
+ i0.ɵɵlistener("stateChange", function EntityAdminDashboardComponent_Conditional_12_Template_mj_erd_composite_stateChange_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onStateChange($event)); })("userStateChange", function EntityAdminDashboardComponent_Conditional_12_Template_mj_erd_composite_userStateChange_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onUserStateChange($event)); })("entityOpened", function EntityAdminDashboardComponent_Conditional_12_Template_mj_erd_composite_entityOpened_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onEntityOpened($event)); })("openRecord", function EntityAdminDashboardComponent_Conditional_12_Template_mj_erd_composite_openRecord_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onOpenRecord($event)); });
41
41
  i0.ɵɵelementEnd()();
42
42
  } if (rf & 2) {
43
43
  const ctx_r0 = i0.ɵɵnextContext();
@@ -190,33 +190,34 @@ let EntityAdminDashboardComponent = class EntityAdminDashboardComponent extends
190
190
  } if (rf & 2) {
191
191
  let _t;
192
192
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.erdComposite = _t.first);
193
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 12, vars: 8, consts: [["erdComposite", ""], ["Title", "Entity Admin", "Icon", "fa-solid fa-database", "Subtitle", "Browse and configure entity definitions"], ["meta", ""], ["Label", "entities", 3, "Count", "Total"], ["actions", ""], ["mjButton", "", "size", "sm", "title", "Toggle Filters", 3, "click", "variant"], [1, "fa-solid", "fa-filter"], [3, "Flex", "Padding"], [1, "loading-container"], [1, "error-container"], [1, "dashboard-content"], ["size", "large", 3, "text"], [1, "error-message"], [3, "stateChange", "userStateChange", "entityOpened", "openRecord", "isRefreshingERD"]], template: function EntityAdminDashboardComponent_Template(rf, ctx) { if (rf & 1) {
193
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 13, vars: 8, consts: [["erdComposite", ""], ["Title", "Entity Admin", "Icon", "fa-solid fa-database", "Subtitle", "Browse and configure entity definitions"], ["meta", ""], ["Label", "entities", 3, "Count", "Total"], ["actions", ""], ["mjButton", "", "size", "sm", "title", "Toggle Filters", 3, "click", "variant"], [1, "fa-solid", "fa-filter"], [1, "action-btn-label"], [3, "Flex", "Padding"], [1, "loading-container"], [1, "error-container"], [1, "dashboard-content"], ["size", "large", 3, "text"], [1, "error-message"], [3, "stateChange", "userStateChange", "entityOpened", "openRecord", "isRefreshingERD"]], template: function EntityAdminDashboardComponent_Template(rf, ctx) { if (rf & 1) {
194
194
  i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 1)(2, "div", 2);
195
195
  i0.ɵɵelement(3, "mj-stat-badge", 3);
196
196
  i0.ɵɵelementEnd();
197
197
  i0.ɵɵelementStart(4, "div", 4)(5, "button", 5);
198
198
  i0.ɵɵlistener("click", function EntityAdminDashboardComponent_Template_button_click_5_listener() { return ctx.toggleFilterPanel(); });
199
199
  i0.ɵɵelement(6, "i", 6);
200
- i0.ɵɵtext(7, " Filters ");
201
- i0.ɵɵelementEnd()()();
202
- i0.ɵɵelementStart(8, "mj-page-body", 7);
203
- i0.ɵɵconditionalCreate(9, EntityAdminDashboardComponent_Conditional_9_Template, 2, 1, "div", 8);
204
- i0.ɵɵconditionalCreate(10, EntityAdminDashboardComponent_Conditional_10_Template, 3, 1, "div", 9);
200
+ i0.ɵɵelementStart(7, "span", 7);
201
+ i0.ɵɵtext(8, "Filters");
202
+ i0.ɵɵelementEnd()()()();
203
+ i0.ɵɵelementStart(9, "mj-page-body", 8);
204
+ i0.ɵɵconditionalCreate(10, EntityAdminDashboardComponent_Conditional_10_Template, 2, 1, "div", 9);
205
205
  i0.ɵɵconditionalCreate(11, EntityAdminDashboardComponent_Conditional_11_Template, 3, 1, "div", 10);
206
+ i0.ɵɵconditionalCreate(12, EntityAdminDashboardComponent_Conditional_12_Template, 3, 1, "div", 11);
206
207
  i0.ɵɵelementEnd()();
207
208
  } if (rf & 2) {
208
209
  i0.ɵɵadvance(3);
209
210
  i0.ɵɵproperty("Count", ctx.filteredEntities.length)("Total", ctx.TotalEntityCount);
210
211
  i0.ɵɵadvance(2);
211
212
  i0.ɵɵproperty("variant", ctx.filterPanelVisible ? "primary" : "secondary");
212
- i0.ɵɵadvance(3);
213
+ i0.ɵɵadvance(4);
213
214
  i0.ɵɵproperty("Flex", true)("Padding", false);
214
215
  i0.ɵɵadvance();
215
- i0.ɵɵconditional(ctx.isLoading ? 9 : -1);
216
+ i0.ɵɵconditional(ctx.isLoading ? 10 : -1);
216
217
  i0.ɵɵadvance();
217
- i0.ɵɵconditional(ctx.error ? 10 : -1);
218
+ i0.ɵɵconditional(ctx.error ? 11 : -1);
218
219
  i0.ɵɵadvance();
219
- i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 11 : -1);
220
+ i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 12 : -1);
220
221
  } }, dependencies: [i1.MJButtonDirective, i1.MJPageHeaderComponent, i1.MJPageLayoutComponent, i1.MJPageBodyComponent, i1.MJStatBadgeComponent, i2.LoadingComponent, i3.ERDCompositeComponent], styles: ["\n\n\n\n\n\n\n\n.loading-container[_ngcontent-%COMP%], \n.error-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n flex: 1;\n border-radius: var(--mj-radius-lg);\n}\n\n.loading-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.error-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-normal);\n color: var(--mj-text-secondary);\n}\n\n\n\n.error-message[_ngcontent-%COMP%] {\n color: var(--mj-status-error-text);\n font-weight: var(--mj-font-medium);\n}\n\n\n\n.dashboard-content[_ngcontent-%COMP%] {\n overflow: hidden;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n\n\n.loading-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--mj-space-4);\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring[_ngcontent-%COMP%] {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1.5s linear infinite;\n}\n\n.spinner-ring[_ngcontent-%COMP%]:nth-child(1) {\n border-top-color: var(--mj-brand-primary);\n animation-delay: 0s;\n}\n\n.spinner-ring[_ngcontent-%COMP%]:nth-child(2) {\n border-top-color: var(--mj-brand-tertiary);\n animation-delay: 0.3s;\n transform: scale(0.8);\n}\n\n.spinner-ring[_ngcontent-%COMP%]:nth-child(3) {\n border-top-color: var(--mj-brand-accent);\n animation-delay: 0.6s;\n transform: scale(0.6);\n}\n\n.loading-text[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}"] });
221
222
  };
222
223
  EntityAdminDashboardComponent = __decorate([
@@ -225,7 +226,7 @@ EntityAdminDashboardComponent = __decorate([
225
226
  export { EntityAdminDashboardComponent };
226
227
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EntityAdminDashboardComponent, [{
227
228
  type: Component,
228
- args: [{ standalone: false, selector: 'mj-entity-admin-dashboard', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Entity Admin\"\n Icon=\"fa-solid fa-database\"\n Subtitle=\"Browse and configure entity definitions\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions \u00A72. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredEntities.length\"\n [Total]=\"TotalEntityCount\"\n Label=\"entities\">\n </mj-stat-badge>\n </div>\n <div actions>\n <button\n mjButton\n [variant]=\"filterPanelVisible ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i> Filters\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"loadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error }}</p>\n </div>\n }\n\n @if (!isLoading && !error) {\n <div class=\"dashboard-content\">\n <mj-erd-composite\n #erdComposite\n [isRefreshingERD]=\"isRefreshingERD\"\n (stateChange)=\"onStateChange($event)\"\n (userStateChange)=\"onUserStateChange($event)\"\n (entityOpened)=\"onEntityOpened($event)\"\n (openRecord)=\"onOpenRecord($event)\"\n >\n </mj-erd-composite>\n </div>\n }\n </mj-page-body>\n</mj-page-layout>", styles: ["/**\n * Entity Admin Dashboard Component - MJ Design Token Styled\n * Reference implementation for MJ design token usage\n */\n\n/* Loading and Error Containers */\n.loading-container,\n.error-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n flex: 1;\n border-radius: var(--mj-radius-lg);\n}\n\n.loading-container p,\n.error-container p {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-normal);\n color: var(--mj-text-secondary);\n}\n\n/* Error Message */\n.error-message {\n color: var(--mj-status-error-text);\n font-weight: var(--mj-font-medium);\n}\n\n/* Dashboard Content */\n.dashboard-content {\n overflow: hidden;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* Loading Spinner */\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--mj-space-4);\n}\n\n.loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: spin 1.5s linear infinite;\n}\n\n.spinner-ring:nth-child(1) {\n border-top-color: var(--mj-brand-primary);\n animation-delay: 0s;\n}\n\n.spinner-ring:nth-child(2) {\n border-top-color: var(--mj-brand-tertiary);\n animation-delay: 0.3s;\n transform: scale(0.8);\n}\n\n.spinner-ring:nth-child(3) {\n border-top-color: var(--mj-brand-accent);\n animation-delay: 0.6s;\n transform: scale(0.6);\n}\n\n.loading-text {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n"] }]
229
+ args: [{ standalone: false, selector: 'mj-entity-admin-dashboard', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Entity Admin\"\n Icon=\"fa-solid fa-database\"\n Subtitle=\"Browse and configure entity definitions\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions \u00A72. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredEntities.length\"\n [Total]=\"TotalEntityCount\"\n Label=\"entities\">\n </mj-stat-badge>\n </div>\n <div actions>\n <button\n mjButton\n [variant]=\"filterPanelVisible ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i> <span class=\"action-btn-label\">Filters</span>\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"loadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error }}</p>\n </div>\n }\n\n @if (!isLoading && !error) {\n <div class=\"dashboard-content\">\n <mj-erd-composite\n #erdComposite\n [isRefreshingERD]=\"isRefreshingERD\"\n (stateChange)=\"onStateChange($event)\"\n (userStateChange)=\"onUserStateChange($event)\"\n (entityOpened)=\"onEntityOpened($event)\"\n (openRecord)=\"onOpenRecord($event)\"\n >\n </mj-erd-composite>\n </div>\n }\n </mj-page-body>\n</mj-page-layout>", styles: ["/**\n * Entity Admin Dashboard Component - MJ Design Token Styled\n * Reference implementation for MJ design token usage\n */\n\n/* Loading and Error Containers */\n.loading-container,\n.error-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n flex: 1;\n border-radius: var(--mj-radius-lg);\n}\n\n.loading-container p,\n.error-container p {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-normal);\n color: var(--mj-text-secondary);\n}\n\n/* Error Message */\n.error-message {\n color: var(--mj-status-error-text);\n font-weight: var(--mj-font-medium);\n}\n\n/* Dashboard Content */\n.dashboard-content {\n overflow: hidden;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* Loading Spinner */\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--mj-space-4);\n}\n\n.loading-spinner {\n position: relative;\n width: 60px;\n height: 60px;\n}\n\n.spinner-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-radius: 50%;\n animation: spin 1.5s linear infinite;\n}\n\n.spinner-ring:nth-child(1) {\n border-top-color: var(--mj-brand-primary);\n animation-delay: 0s;\n}\n\n.spinner-ring:nth-child(2) {\n border-top-color: var(--mj-brand-tertiary);\n animation-delay: 0.3s;\n transform: scale(0.8);\n}\n\n.spinner-ring:nth-child(3) {\n border-top-color: var(--mj-brand-accent);\n animation-delay: 0.6s;\n transform: scale(0.6);\n}\n\n.loading-text {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-secondary);\n text-align: center;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n"] }]
229
230
  }], null, { erdComposite: [{
230
231
  type: ViewChild,
231
232
  args: ['erdComposite', { static: false }]
@@ -1 +1 @@
1
- {"version":3,"file":"entity-admin-dashboard.component.js","sourceRoot":"","sources":["../../src/EntityAdmin/entity-admin-dashboard.component.ts","../../src/EntityAdmin/entity-admin-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewChild, AfterViewInit, OnDestroy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { EntityInfo, CompositeKey, Metadata } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { ERDCompositeComponent, ERDCompositeState } from '@memberjunction/ng-entity-relationship-diagram';\nimport { ResourceData, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\n\n/** Settings key for ERD state persistence */\nconst ERD_SETTINGS_KEY = 'MJ.Admin.Entity.ERD';\n\n@Component({\n standalone: false,\n selector: 'mj-entity-admin-dashboard',\n templateUrl: './entity-admin-dashboard.component.html',\n styleUrls: ['./entity-admin-dashboard.component.css']\n})\n@RegisterClass(BaseDashboard, 'EntityAdmin')\nexport class EntityAdminDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n @ViewChild('erdComposite', { static: false }) erdComposite!: ERDCompositeComponent;\n\n public isLoading = false;\n public isRefreshingERD = false;\n public loadingMessage = '';\n public error: string | null = null;\n\n // Filter panel visibility for header controls\n public filterPanelVisible = true;\n public selectedEntity: EntityInfo | null = null;\n public filteredEntities: EntityInfo[] = [];\n\n /** Total unfiltered entity count — feeds the chrome's X-of-Y badge. */\n public get TotalEntityCount(): number {\n return this.erdComposite?.entities?.length ?? 0;\n }\n\n // State management\n private userStateChangeSubject = new Subject<ERDCompositeState>();\n private hasLoadedUserState = false;\n private metadata = this.ProviderToUse;\n private userSettingEntity: MJUserSettingEntity | null = null;\n\n ngAfterViewInit(): void {\n // Setup debounced state persistence to MJ: User Settings\n this.userStateChangeSubject.pipe(\n debounceTime(1000)\n ).subscribe(state => {\n this.saveStateToUserSettings(state);\n });\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Entity Administration\"\n }\n\n override ngOnDestroy(): void {\n this.userStateChangeSubject.complete();\n super.ngOnDestroy();\n }\n\n protected initDashboard(): void {\n // Initialize dashboard - called by BaseDashboard\n }\n\n protected loadData(): void {\n // Data loading is handled by ERDCompositeComponent\n }\n\n public toggleFilterPanel(): void {\n this.filterPanelVisible = !this.filterPanelVisible;\n if (this.erdComposite) {\n this.erdComposite.onToggleFilterPanel();\n }\n }\n\n public onStateChange(state: ERDCompositeState): void {\n // Update local state to keep header controls in sync\n this.filterPanelVisible = state.filterPanelVisible;\n this.filteredEntities = this.erdComposite?.filteredEntities || [];\n\n if (state.selectedEntityId && this.erdComposite) {\n this.selectedEntity = this.erdComposite.entities.find(e => UUIDsEqual(e.ID, state.selectedEntityId)) || null;\n } else {\n this.selectedEntity = null;\n }\n\n // Load user state when data becomes available for the first time\n if (this.erdComposite?.isDataLoaded && !this.hasLoadedUserState) {\n this.hasLoadedUserState = true;\n this.loadStateFromUserSettings();\n }\n }\n\n public onUserStateChange(state: ERDCompositeState): void {\n // Queue state for debounced persistence\n this.userStateChangeSubject.next(state);\n }\n\n public onEntityOpened(entity: EntityInfo): void {\n this.openEntity(entity);\n }\n\n public onOpenRecord(event: {EntityName: string, RecordID: string}): void {\n this.OpenEntityRecord.emit({\n EntityName: event.EntityName,\n RecordPKey: new CompositeKey([{FieldName: 'ID', Value: event.RecordID}])\n });\n }\n\n public openEntity(entity: EntityInfo): void {\n this.Interaction.emit({\n type: 'openEntity',\n entity: entity,\n data: { entityId: entity.ID, entityName: entity.Name }\n });\n }\n\n /**\n * Load ERD state from MJ: User Settings entity using UserInfoEngine for cached access\n */\n private async loadStateFromUserSettings(): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) {\n this.NotifyLoadComplete();\n return;\n }\n\n const engine = UserInfoEngine.Instance;\n\n // Find setting from cached user settings\n const setting = engine.UserSettings.find(s => s.Setting === ERD_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n if (this.userSettingEntity.Value) {\n const savedState = JSON.parse(this.userSettingEntity.Value) as Partial<ERDCompositeState>;\n if (this.erdComposite) {\n this.erdComposite.loadUserState(savedState);\n }\n }\n }\n\n this.NotifyLoadComplete();\n } catch (error) {\n console.warn('Failed to load ERD state from User Settings:', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Save ERD state to MJ: User Settings entity using UserInfoEngine for cached lookup\n */\n private async saveStateToUserSettings(state: ERDCompositeState): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n // Find existing setting from cached user settings if not already loaded\n if (!this.userSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === ERD_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n } else {\n this.userSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.userSettingEntity.UserID = userId;\n this.userSettingEntity.Setting = ERD_SETTINGS_KEY;\n }\n }\n\n // Save the state as JSON\n this.userSettingEntity.Value = JSON.stringify(state);\n await this.userSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save ERD state to User Settings:', error);\n }\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Entity Admin\"\n Icon=\"fa-solid fa-database\"\n Subtitle=\"Browse and configure entity definitions\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredEntities.length\"\n [Total]=\"TotalEntityCount\"\n Label=\"entities\">\n </mj-stat-badge>\n </div>\n <div actions>\n <button\n mjButton\n [variant]=\"filterPanelVisible ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i> Filters\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"loadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error }}</p>\n </div>\n }\n\n @if (!isLoading && !error) {\n <div class=\"dashboard-content\">\n <mj-erd-composite\n #erdComposite\n [isRefreshingERD]=\"isRefreshingERD\"\n (stateChange)=\"onStateChange($event)\"\n (userStateChange)=\"onUserStateChange($event)\"\n (entityOpened)=\"onEntityOpened($event)\"\n (openRecord)=\"onOpenRecord($event)\"\n >\n </mj-erd-composite>\n </div>\n }\n </mj-page-body>\n</mj-page-layout>"]}
1
+ {"version":3,"file":"entity-admin-dashboard.component.js","sourceRoot":"","sources":["../../src/EntityAdmin/entity-admin-dashboard.component.ts","../../src/EntityAdmin/entity-admin-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewChild, AfterViewInit, OnDestroy } from '@angular/core';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { EntityInfo, CompositeKey, Metadata } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { ERDCompositeComponent, ERDCompositeState } from '@memberjunction/ng-entity-relationship-diagram';\nimport { ResourceData, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\n\n/** Settings key for ERD state persistence */\nconst ERD_SETTINGS_KEY = 'MJ.Admin.Entity.ERD';\n\n@Component({\n standalone: false,\n selector: 'mj-entity-admin-dashboard',\n templateUrl: './entity-admin-dashboard.component.html',\n styleUrls: ['./entity-admin-dashboard.component.css']\n})\n@RegisterClass(BaseDashboard, 'EntityAdmin')\nexport class EntityAdminDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {\n @ViewChild('erdComposite', { static: false }) erdComposite!: ERDCompositeComponent;\n\n public isLoading = false;\n public isRefreshingERD = false;\n public loadingMessage = '';\n public error: string | null = null;\n\n // Filter panel visibility for header controls\n public filterPanelVisible = true;\n public selectedEntity: EntityInfo | null = null;\n public filteredEntities: EntityInfo[] = [];\n\n /** Total unfiltered entity count — feeds the chrome's X-of-Y badge. */\n public get TotalEntityCount(): number {\n return this.erdComposite?.entities?.length ?? 0;\n }\n\n // State management\n private userStateChangeSubject = new Subject<ERDCompositeState>();\n private hasLoadedUserState = false;\n private metadata = this.ProviderToUse;\n private userSettingEntity: MJUserSettingEntity | null = null;\n\n ngAfterViewInit(): void {\n // Setup debounced state persistence to MJ: User Settings\n this.userStateChangeSubject.pipe(\n debounceTime(1000)\n ).subscribe(state => {\n this.saveStateToUserSettings(state);\n });\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"Entity Administration\"\n }\n\n override ngOnDestroy(): void {\n this.userStateChangeSubject.complete();\n super.ngOnDestroy();\n }\n\n protected initDashboard(): void {\n // Initialize dashboard - called by BaseDashboard\n }\n\n protected loadData(): void {\n // Data loading is handled by ERDCompositeComponent\n }\n\n public toggleFilterPanel(): void {\n this.filterPanelVisible = !this.filterPanelVisible;\n if (this.erdComposite) {\n this.erdComposite.onToggleFilterPanel();\n }\n }\n\n public onStateChange(state: ERDCompositeState): void {\n // Update local state to keep header controls in sync\n this.filterPanelVisible = state.filterPanelVisible;\n this.filteredEntities = this.erdComposite?.filteredEntities || [];\n\n if (state.selectedEntityId && this.erdComposite) {\n this.selectedEntity = this.erdComposite.entities.find(e => UUIDsEqual(e.ID, state.selectedEntityId)) || null;\n } else {\n this.selectedEntity = null;\n }\n\n // Load user state when data becomes available for the first time\n if (this.erdComposite?.isDataLoaded && !this.hasLoadedUserState) {\n this.hasLoadedUserState = true;\n this.loadStateFromUserSettings();\n }\n }\n\n public onUserStateChange(state: ERDCompositeState): void {\n // Queue state for debounced persistence\n this.userStateChangeSubject.next(state);\n }\n\n public onEntityOpened(entity: EntityInfo): void {\n this.openEntity(entity);\n }\n\n public onOpenRecord(event: {EntityName: string, RecordID: string}): void {\n this.OpenEntityRecord.emit({\n EntityName: event.EntityName,\n RecordPKey: new CompositeKey([{FieldName: 'ID', Value: event.RecordID}])\n });\n }\n\n public openEntity(entity: EntityInfo): void {\n this.Interaction.emit({\n type: 'openEntity',\n entity: entity,\n data: { entityId: entity.ID, entityName: entity.Name }\n });\n }\n\n /**\n * Load ERD state from MJ: User Settings entity using UserInfoEngine for cached access\n */\n private async loadStateFromUserSettings(): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) {\n this.NotifyLoadComplete();\n return;\n }\n\n const engine = UserInfoEngine.Instance;\n\n // Find setting from cached user settings\n const setting = engine.UserSettings.find(s => s.Setting === ERD_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n if (this.userSettingEntity.Value) {\n const savedState = JSON.parse(this.userSettingEntity.Value) as Partial<ERDCompositeState>;\n if (this.erdComposite) {\n this.erdComposite.loadUserState(savedState);\n }\n }\n }\n\n this.NotifyLoadComplete();\n } catch (error) {\n console.warn('Failed to load ERD state from User Settings:', error);\n this.NotifyLoadComplete();\n }\n }\n\n /**\n * Save ERD state to MJ: User Settings entity using UserInfoEngine for cached lookup\n */\n private async saveStateToUserSettings(state: ERDCompositeState): Promise<void> {\n try {\n const userId = this.metadata.CurrentUser?.ID;\n if (!userId) return;\n\n // Find existing setting from cached user settings if not already loaded\n if (!this.userSettingEntity) {\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === ERD_SETTINGS_KEY);\n\n if (setting) {\n this.userSettingEntity = setting;\n } else {\n this.userSettingEntity = await this.metadata.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n this.userSettingEntity.UserID = userId;\n this.userSettingEntity.Setting = ERD_SETTINGS_KEY;\n }\n }\n\n // Save the state as JSON\n this.userSettingEntity.Value = JSON.stringify(state);\n await this.userSettingEntity.Save();\n } catch (error) {\n console.warn('Failed to save ERD state to User Settings:', error);\n }\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Entity Admin\"\n Icon=\"fa-solid fa-database\"\n Subtitle=\"Browse and configure entity definitions\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredEntities.length\"\n [Total]=\"TotalEntityCount\"\n Label=\"entities\">\n </mj-stat-badge>\n </div>\n <div actions>\n <button\n mjButton\n [variant]=\"filterPanelVisible ? 'primary' : 'secondary'\"\n size=\"sm\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i> <span class=\"action-btn-label\">Filters</span>\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"loadingMessage\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <p class=\"error-message\">{{ error }}</p>\n </div>\n }\n\n @if (!isLoading && !error) {\n <div class=\"dashboard-content\">\n <mj-erd-composite\n #erdComposite\n [isRefreshingERD]=\"isRefreshingERD\"\n (stateChange)=\"onStateChange($event)\"\n (userStateChange)=\"onUserStateChange($event)\"\n (entityOpened)=\"onEntityOpened($event)\"\n (openRecord)=\"onOpenRecord($event)\"\n >\n </mj-erd-composite>\n </div>\n }\n </mj-page-body>\n</mj-page-layout>"]}