@memberjunction/ng-dashboards 5.34.1 → 5.36.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 (407) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +399 -292
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
  6. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  7. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  9. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +96 -0
  10. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/analytics/ai-analytics-resource.component.js +453 -122
  12. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  13. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
  14. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
  15. package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
  16. package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
  17. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
  18. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  19. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
  20. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  21. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
  22. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  23. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
  24. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  25. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
  27. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  28. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
  29. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
  31. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  32. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  33. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
  34. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  36. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
  37. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  40. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2084 -2079
  41. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  44. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  45. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  46. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  47. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  48. package/dist/AI/components/models/model-management.component.js +370 -425
  49. package/dist/AI/components/models/model-management.component.js.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  51. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  52. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  53. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  55. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  56. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  57. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  59. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  60. package/dist/AI/components/system/system-configuration.component.js +403 -362
  61. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  62. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  63. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/tags/tags-resource.component.js +1423 -1438
  65. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  66. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  67. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  69. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  70. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  71. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  72. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  73. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  74. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  75. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  76. package/dist/Actions/components/actions-overview.component.js +202 -158
  77. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  78. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  79. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  80. package/dist/Actions/components/execution-monitoring.component.js +191 -142
  81. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  82. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  83. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  84. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  85. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  86. package/dist/Actions/components/explorer/index.d.ts +0 -1
  87. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  88. package/dist/Actions/components/explorer/index.js +0 -1
  89. package/dist/Actions/components/explorer/index.js.map +1 -1
  90. package/dist/Admin/admin-data-schema.component.js +19 -79
  91. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  92. package/dist/Admin/admin-dev-tools-resource.component.js +19 -79
  93. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  94. package/dist/Admin/admin-identity-access.component.js +19 -79
  95. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  96. package/dist/Admin/admin-monitoring.component.js +19 -79
  97. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  98. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  99. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  100. package/dist/Admin/base-admin-container.component.js +26 -17
  101. package/dist/Admin/base-admin-container.component.js.map +1 -1
  102. package/dist/ApplicationRoles/application-roles-resource.component.js +92 -91
  103. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  104. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  105. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  106. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  107. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  108. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  109. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  110. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  111. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  112. package/dist/Communication/communication-logs-resource.component.js +80 -99
  113. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  114. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  115. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  116. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  117. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  118. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  119. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  120. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  121. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  122. package/dist/Communication/communication-providers-resource.component.js +44 -45
  123. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  124. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  125. package/dist/Communication/communication-runs-resource.component.js +60 -58
  126. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  127. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  128. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  129. package/dist/Communication/communication-templates-resource.component.js +139 -162
  130. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  131. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  132. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  133. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  134. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  135. package/dist/Credentials/components/credentials-categories-resource.component.js +238 -266
  136. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  137. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  138. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  139. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  140. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  141. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  142. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  143. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  144. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  145. package/dist/Credentials/components/credentials-types-resource.component.js +290 -305
  146. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  147. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  148. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  149. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +41 -21
  150. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  151. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  152. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  153. package/dist/DatabaseDesigner/components/entity-list.component.js +148 -155
  154. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  155. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  156. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  157. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +25 -1
  158. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  159. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  160. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  161. package/dist/DevTools/app-state-inspector.component.js +46 -72
  162. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  163. package/dist/DevTools/class-registry.component.js +88 -100
  164. package/dist/DevTools/class-registry.component.js.map +1 -1
  165. package/dist/DevTools/event-monitor.component.js +158 -168
  166. package/dist/DevTools/event-monitor.component.js.map +1 -1
  167. package/dist/DevTools/graphql-console.component.js +257 -264
  168. package/dist/DevTools/graphql-console.component.js.map +1 -1
  169. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  170. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  171. package/dist/DevTools/layout-inspector.component.js +46 -64
  172. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  173. package/dist/DevTools/lazy-module-status.component.js +75 -84
  174. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  175. package/dist/DevTools/settings-explorer.component.js +76 -85
  176. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  177. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  178. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  179. package/dist/EntityAdmin/entity-admin-dashboard.component.js +24 -16
  180. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  181. package/dist/Home/home-dashboard.component.d.ts +6 -0
  182. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  183. package/dist/Home/home-dashboard.component.js +521 -485
  184. package/dist/Home/home-dashboard.component.js.map +1 -1
  185. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  186. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  187. package/dist/Integration/components/activity/activity.component.js +307 -318
  188. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  189. package/dist/Integration/components/connections/connections.component.js +654 -648
  190. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  191. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  192. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  193. package/dist/Integration/components/overview/overview.component.js +182 -163
  194. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  195. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  196. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  197. package/dist/Integration/components/pipelines/pipelines.component.js +595 -606
  198. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  199. package/dist/Integration/components/schedules/schedules.component.js +230 -241
  200. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  201. package/dist/Integration/integration.module.d.ts +1 -1
  202. package/dist/Integration/integration.module.d.ts.map +1 -1
  203. package/dist/Integration/integration.module.js +28 -1
  204. package/dist/Integration/integration.module.js.map +1 -1
  205. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  206. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  207. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1138 -1147
  208. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  209. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  210. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  211. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  212. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  213. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +684 -697
  214. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  215. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  216. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  217. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  218. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  219. package/dist/Lists/components/lists-browse-resource.component.d.ts +120 -1
  220. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  221. package/dist/Lists/components/lists-browse-resource.component.js +1239 -610
  222. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  223. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  224. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  225. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  226. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  227. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  228. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  229. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  230. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  231. package/dist/Lists/components/lists-operations-resource.component.js +1460 -272
  232. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  233. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  234. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  235. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  236. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  237. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  238. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  239. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  240. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  241. package/dist/Lists/index.d.ts +1 -0
  242. package/dist/Lists/index.d.ts.map +1 -1
  243. package/dist/Lists/index.js +1 -0
  244. package/dist/Lists/index.js.map +1 -1
  245. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  246. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  247. package/dist/Lists/services/list-set-operations.service.js +236 -10
  248. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  249. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  250. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  251. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  252. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  253. package/dist/MCP/mcp.module.d.ts +1 -1
  254. package/dist/MCP/mcp.module.d.ts.map +1 -1
  255. package/dist/MCP/mcp.module.js +34 -1
  256. package/dist/MCP/mcp.module.js.map +1 -1
  257. package/dist/Permissions/audit-log-resource.component.js +76 -85
  258. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  259. package/dist/Permissions/resource-access-resource.component.js +64 -69
  260. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  261. package/dist/Permissions/user-access-resource.component.js +63 -74
  262. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  263. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  264. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  265. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  266. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  267. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  268. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  269. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  270. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  271. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  272. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  273. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  274. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  275. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  276. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  277. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  278. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  279. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  280. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  281. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  282. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  283. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  284. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  285. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  286. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  287. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  288. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  289. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  290. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  291. package/dist/Scheduling/scheduling-dashboard.component.js +259 -103
  292. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  293. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  294. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  295. package/dist/SystemDiagnostics/system-diagnostics.component.js +1009 -1264
  296. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  297. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  298. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  299. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  300. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  301. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  302. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  303. package/dist/Testing/components/testing-analytics.component.js +420 -393
  304. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  305. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  306. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  307. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  308. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  309. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  310. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  311. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  312. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  313. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  314. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  315. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  316. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  317. package/dist/Testing/components/testing-explorer.component.d.ts +38 -6
  318. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  319. package/dist/Testing/components/testing-explorer.component.js +679 -786
  320. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  321. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  322. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  323. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  324. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  325. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  326. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  327. package/dist/Testing/components/testing-review.component.js +310 -274
  328. package/dist/Testing/components/testing-review.component.js.map +1 -1
  329. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  330. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  331. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  332. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  333. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  334. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  335. package/dist/Testing/components/testing-runs.component.js +307 -273
  336. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  337. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  338. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  339. package/dist/Testing/testing-dashboard.component.js +114 -99
  340. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  341. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  342. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  343. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  344. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  345. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  346. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  347. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  348. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  349. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  350. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  351. package/dist/actions-dashboards.module.d.ts +15 -16
  352. package/dist/actions-dashboards.module.d.ts.map +1 -1
  353. package/dist/actions-dashboards.module.js +34 -11
  354. package/dist/actions-dashboards.module.js.map +1 -1
  355. package/dist/ai-dashboards.module.d.ts +45 -48
  356. package/dist/ai-dashboards.module.d.ts.map +1 -1
  357. package/dist/ai-dashboards.module.js +51 -10
  358. package/dist/ai-dashboards.module.js.map +1 -1
  359. package/dist/archiving-dashboards.module.d.ts +2 -1
  360. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  361. package/dist/archiving-dashboards.module.js +12 -2
  362. package/dist/archiving-dashboards.module.js.map +1 -1
  363. package/dist/communication-dashboards.module.d.ts +9 -6
  364. package/dist/communication-dashboards.module.d.ts.map +1 -1
  365. package/dist/communication-dashboards.module.js +37 -7
  366. package/dist/communication-dashboards.module.js.map +1 -1
  367. package/dist/core-dashboards.module.d.ts +1 -1
  368. package/dist/core-dashboards.module.d.ts.map +1 -1
  369. package/dist/core-dashboards.module.js +46 -1
  370. package/dist/core-dashboards.module.js.map +1 -1
  371. package/dist/credentials-dashboards.module.d.ts +1 -1
  372. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  373. package/dist/credentials-dashboards.module.js +28 -1
  374. package/dist/credentials-dashboards.module.js.map +1 -1
  375. package/dist/lists-dashboards.module.d.ts +10 -9
  376. package/dist/lists-dashboards.module.d.ts.map +1 -1
  377. package/dist/lists-dashboards.module.js +40 -2
  378. package/dist/lists-dashboards.module.js.map +1 -1
  379. package/dist/public-api.d.ts +3 -2
  380. package/dist/public-api.d.ts.map +1 -1
  381. package/dist/public-api.js +4 -3
  382. package/dist/public-api.js.map +1 -1
  383. package/dist/scheduling-dashboards.module.d.ts +1 -1
  384. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  385. package/dist/scheduling-dashboards.module.js +31 -1
  386. package/dist/scheduling-dashboards.module.js.map +1 -1
  387. package/dist/testing-dashboards.module.d.ts +8 -7
  388. package/dist/testing-dashboards.module.d.ts.map +1 -1
  389. package/dist/testing-dashboards.module.js +42 -0
  390. package/dist/testing-dashboards.module.js.map +1 -1
  391. package/package.json +53 -52
  392. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  393. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  394. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  395. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  396. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  397. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  398. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  399. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  400. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  401. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  402. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  403. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  404. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  405. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  406. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  407. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"credentials-types-resource.component.js","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-types-resource.component.ts","../../../src/Credentials/components/credentials-types-resource.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,uBAAuB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEpH,OAAO,EAAE,aAAa,EAAG,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;;;;;;;;;ICHrE,gCAA4D;;;;IAyBtD,kCAAsD;IAA1B,qNAAS,sBAAe,KAAC;IACnD,wBAAgC;IAChC,4BAAM;IAAA,wBAAQ;IAChB,AADgB,iBAAO,EACd;;;;IAgBP,kCAA0D;IAA7B,qNAAS,sBAAe,EAAE,CAAC,KAAC;IACvD,wBAAiC;IACnC,iBAAS;;;IAUT,kCAAsB;IAAA,YAAO;IAAA,iBAAS;;;IAA9B,8BAAa;IAAC,cAAO;IAAP,4BAAO;;;IAoCnB,+BAA8B;IAC5B,YACF;;IAAA,iBAAM;;;IADJ,cACF;IADE,mIACF;;;IAIE,gCAAyB;IACvB,wBAA+B;IAC/B,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,wDACF;;;IAGA,gCAAgC;IAC9B,wBAAiC;IACjC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,2DACF;;;IAGA,gCAAiC;IAC/B,wBAAiC;IACjC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,+DACF;;;;IAMF,kCAEyB;IADvB,sRAAS,+CAAqC,KAAC;IAE/C,wBAAgC;IAClC,iBAAS;;;;IAGT,kCAEoB;IADlB,uRAAS,gCAAsB,KAAC;IAEhC,wBAA+B;IACjC,iBAAS;;;;IAGT,kCAEsB;IADpB,uRAAS,kCAAwB,KAAC;IAElC,wBAAiC;IACnC,iBAAS;;;;IAxDf,+BAIG;IADD,0OAAS,0BAAgB,KAAC;IAE1B,+BAAwI;IACtI,oBAAqD;IACvD,iBAAM;IAEJ,AADF,+BAAuB,cACE;IAAA,YAAa;IAAA,iBAAM;IAC1C,+HAAwB;IAKxB,+BAAuB;IACrB,gIAAgC;IAMhC,gIAA4B;IAM5B,kIAA8B;IAOlC,AADE,iBAAM,EACF;IACN,gCAA0B;IACxB,oIAA+B;IAO/B,oIAAqB;IAOrB,oIAAmD;IAOrD,iBAAM;IACN,yBAA+C;IACjD,iBAAM;;;;IA1DJ,0DAAuC;IAGhB,cAAgE;IAAC,AAAjE,oFAAgE,oDAAgD;IAClI,cAA6C;IAA7C,qDAA6C;IAGzB,eAAa;IAAb,kCAAa;IACpC,cAIC;IAJD,8CAIC;IAEC,eAKC;IALD,sDAKC;IACD,cAKC;IALD,kDAKC;IACD,cAKC;IALD,qDAKC;IAIH,eAMC;IAND,0DAMC;IACD,cAMC;IAND,gDAMC;IACD,cAMC;IAND,iFAMC;;;IAhET,AADF,+BAA8B,cACuD;IACjF,oBAAwF;IACxF,gCAA4B;IAAA,YAAa;IAAA,iBAAO;IAChD,gCAAoB;IAAA,YAAsB;IAC5C,AAD4C,iBAAO,EAC7C;IACN,+BAAwB;IACtB,8IA8DC;IAEL,AADE,iBAAM,EACF;;;;IAtEyB,cAAqD;IAArD,2EAAqD;IAC7E,cAAoC;IAApC,oDAAoC;IAAC,+DAA2C;IACvD,eAAa;IAAb,mCAAa;IACrB,eAAsB;IAAtB,4CAAsB;IAG1C,eA8DC;IA9DD,8BA8DC;;;;IAWD,yBAAG;IACD,sDACA;IAAA,kCAAkD;IAAzB,oOAAS,qBAAc,KAAC;IAAC,6BAAa;IACjE,AADiE,iBAAS,EACtE;;;IAGJ,yBAAG;IACD,qEACF;IAAA,iBAAI;;;;IAGJ,kCAAsD;IAA1B,oOAAS,sBAAe,KAAC;IACnD,wBAAgC;IAChC,6BACF;IAAA,iBAAS;;;IAnBX,AADF,+BAAyB,cACC;IACtB,wBAAiC;IACnC,iBAAM;IACN,0BAAI;IAAA,yCAAyB;IAAA,iBAAK;IAClC,2HAA4C;IAM5C,2HAA8C;IAK9C,oIAA+D;IAMjE,iBAAM;;;IAjBJ,eAKC;IALD,6EAKC;IACD,cAIC;IAJD,+EAIC;IACD,cAKC;IALD,uGAKC;;;;IAoBG,kCAAwF;IAA9C,qOAAS,oCAAsB,KAAC;IACxE,wBAA+B;IACjC,iBAAS;;;IAoBP,AADF,+BAAiC,cACP;IAAA,YAA8B;IAAA,iBAAM;IAC5D,+BAAwB;IAAA,wBAAQ;IAClC,AADkC,iBAAM,EAClC;;;IAFoB,eAA8B;IAA9B,uDAA8B;;;IAM1D,6BAAuB;IACrB,YACF;IAAA,iBAAI;;;IADF,cACF;IADE,gEACF;;;IAgBc,gCAA2B;IACzB,wBAAgC;IAAC,wBACnC;IAAA,iBAAO;;;IAGP,gCAA6B;IAAA,wBAAQ;IAAA,iBAAO;;;IAKhD,6BAA6B;IAC3B,YACF;IAAA,iBAAI;;;IADF,cACF;IADE,qDACF;;;IAhBA,AADF,AADF,+BAAwB,cACI,eACC;IAAA,YAAc;IAAA,iBAAO;IAE5C,AADF,gCAA2B,eACA;IAAA,YAAa;IAAA,iBAAO;IAC7C,uJAAqB;IAKrB,uJAAqB;IAIzB,AADE,iBAAO,EACH;IACN,oJAAwB;IAK1B,iBAAM;;;IAlBuB,eAAc;IAAd,oCAAc;IAEZ,eAAa;IAAb,mCAAa;IACtC,cAIC;IAJD,4CAIC;IACD,cAEC;IAFD,4CAEC;IAGL,cAIC;IAJD,+CAIC;;;IArBP,+BAAwB;IACtB,oKAsBC;IACH,iBAAM;;;IAvBJ,cAsBC;IAtBD,sCAsBC;;;IAIH,+BAAuB;IACrB,wBAAuC;IACvC,4BAAM;IAAA,2CAA2B;IACnC,AADmC,iBAAO,EACpC;;;IAKN,AADF,+BAAgC,SAC1B;IACF,wBAAwC;IACxC,4BACF;IAAA,iBAAK;IACL,+BAAiC;IAC/B,yBAAgC;IAChC,4BAAM;IAAA,YAAmC;IAE7C,AADE,AAD2C,iBAAO,EAC5C,EACF;;;IAFI,eAAmC;IAAnC,4DAAmC;;;;IAO3C,AADF,+BAAkC,iBAC4C;IAAhD,qOAAS,mDAAqC,KAAC;IACzE,wBAAgC;IAChC,mCACF;IACF,AADE,iBAAS,EACL;;;;IAtGR,AADF,AADF,+BAAyB,cACI,cACiI;IACxJ,oBAA6D;IAC/D,iBAAM;IAEJ,AADF,+BAA0B,SACpB;IAAA,YAAqB;IAAA,iBAAK;IAC9B,gCAA8J;IAC5J,oBAAwD;IACxD,YACF;IACF,AADE,iBAAO,EACH;IACN,gCAA4B;IAC1B,sIAAqB;IAKrB,mCAAkD;IAAxB,uNAAS,oBAAa,KAAC;IAC/C,yBAAiC;IAGvC,AADE,AADE,iBAAS,EACL,EACF;IAKA,AADF,AADF,AAFF,gCAAyB,eAEG,eACC,eACC;IAAA,aAAgC;IAAA,iBAAM;IAC9D,gCAAwB;IAAA,4BAAW;IACrC,AADqC,iBAAM,EACrC;IAEJ,AADF,gCAAgC,eACN;IAAA,aAA4B;IAAA,iBAAM;IAC1D,gCAAwB;IAAA,uBAAM;IAChC,AADgC,iBAAM,EAChC;IACN,mIAAsC;IAMxC,iBAAM;IACN,iIAAgC;IAM9B,AADF,gCAA4B,UACtB;IACF,yBAAsC;IACtC,+BACF;IAAA,iBAAK;IACL,mIAAmC;IA2BnC,mIAAqC;IAMvC,iBAAM;IACN,mIAAuC;IAavC,mIAA+B;IASnC,AADE,iBAAM,EACF;;;IAzGuB,eAAwE;IAAC,AAAzE,gGAAwE,gEAAwD;IACpJ,cAAqD;IAArD,iEAAqD;IAGpD,eAAqB;IAArB,8CAAqB;IACI,cAAwE;IAAC,AAAzE,gGAAwE,gEAAwD;IACxJ,cAAgD;IAAhD,mEAAgD;IACnD,cACF;IADE,6DACF;IAGA,eAIC;IAJD,gDAIC;IAUyB,eAAgC;IAAhC,yDAAgC;IAIhC,eAA4B;IAA5B,qDAA4B;IAGtD,eAKC;IALD,iEAKC;IAEH,cAIC;IAJD,2DAIC;IAMC,eA0BC;IA1BD,8DA0BC;IACD,cAKC;IALD,gEAKC;IAEH,cAWC;IAXD,kEAWC;IAED,cAOC;IAPD,0DAOC;;;IAOH,AADF,+BAA0B,eACO;IAC7B,yBAAwC;IAC1C,iBAAM;IACN,0BAAI;IAAA,wCAAwB;IAAA,iBAAK;IACjC,yBAAG;IAAA,+EAA+D;IACpE,AADoE,iBAAI,EAClE;;;;IA5RN,AADF,AADF,8BAA0B,aACC,YACC;IAAA,gCAAgB;IAAA,iBAAK;IAE3C,AADF,8BAA0B,cACA;IACtB,uBAAkC;IAClC,YACF;IAAA,iBAAO;IACP,+BAAwB;IACtB,wBAAkC;IAClC,aACF;IAAA,iBAAO;IACP,gCAAwB;IACtB,yBAA+B;IAC/B,aACF;IAEJ,AADE,AADE,iBAAO,EACH,EACF;IACN,gCAA4B;IAC1B,uHAAqB;IAOzB,AADE,iBAAM,EACF;IAIF,AADF,AADF,gCAAqB,eACO,eACM;IAC5B,yBAAkC;IAClC,kCAKI;IADF,2MAAS,0CAAyC,KAAC;IAJrD,iBAKI;IACJ,uHAAkB;IAKpB,iBAAM;IACN,mCAIG;IADD,8MAAU,kDAAiD,KAAC;IAE5D,mCAAiB;IAAA,+BAAc;IAAA,iBAAS;IACxC,0IAEC;IAEL,AADE,iBAAS,EACL;IAEJ,AADF,gCAA2B,eACC;IACxB,aACF;IAAA,iBAAM;IACN,mCAA6D;IAApC,sMAAS,gBAAS,KAAC;IAC1C,yBAAmC;IAGzC,AADE,AADE,iBAAS,EACL,EACF;IAGJ,AAFF,gCAA0B,eAEA;IACtB,wIAyEC;;IACD,oHAAkC;IAyBpC,iBAAM;IAEN,sHAAoB;IA+GpB,oHAAiD;IASnD,iBAAM;;;IA1RE,eACF;IADE,0DACF;IAGE,eACF;IADE,oEACF;IAGE,eACF;IADE,6EACF;IAIF,eAKC;IALD,gDAKC;IAWG,eAAoB;IAApB,yCAAoB;IAGtB,cAIC;IAJD,6CAIC;IAID,cAAgC;IAAhC,qDAAgC;IAIhC,eAEC;IAFD,gCAEC;IAKD,eACF;IADE,+FACF;IASA,eAyEC;IAzED,qCAAA,2BAAoB,EAyEnB;IACD,eAwBC;IAxBD,6DAwBC;IAGH,cA6GC;IA7GD,+CA6GC;IAED,cAQC;IARD,mFAQC;;ADxQA,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,qBAAqB;IAoB5D;IAnBL,SAAS,GAAG,IAAI,CAAC;IACjB,KAAK,GAAoB,EAAE,CAAC;IAC5B,aAAa,GAAoB,EAAE,CAAC;IACpC,WAAW,GAAyB,EAAE,CAAC;IACvC,YAAY,GAAyB,IAAI,CAAC;IAC1C,gBAAgB,GAA0B,EAAE,CAAC;IAEpD,UAAU;IACH,UAAU,GAAG,EAAE,CAAC;IAChB,sBAAsB,GAAG,EAAE,CAAC;IAC5B,UAAU,GAAa,EAAE,CAAC;IAEjC,cAAc;IACN,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;IAC/B,gBAAgB,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE1B,aAAa,CAAoC;IAE7E,YACY,GAAsB;QAC9B,KAAK,EAAE,CAAC;QADA,QAAG,GAAH,GAAG,CAAmB;IAElC,CAAC;IAED,QAAQ;QACJ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAED,WAAW;QACP,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,oBAAoB;IACxB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACzC,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED,4BAA4B;IAE5B,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IACnE,CAAC;IAEO,qBAAqB,CAAC,UAAkB,EAAE,cAAuD;QACrG,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;QAEnD,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;QAChD,CAAC;QAED,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;gBACd,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACjB,CAAC;YAED,MAAM,eAAe,GAAG,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACjF,IAAI,aAAa,GAAG,KAAK,CAAC;YAE1B,QAAQ,cAAc,EAAE,CAAC;gBACrB,KAAK,QAAQ;oBAAE,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC;oBAAC,MAAM;gBAChE,KAAK,MAAM;oBAAE,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC;oBAAC,MAAM;gBAC5D,KAAK,QAAQ;oBAAE,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC;oBAAC,MAAM;gBAChE,KAAK,QAAQ;oBAAE,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC;oBAAC,MAAM;YACpE,CAAC;YAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACnD,OAAO,aAAa,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,QAAQ;QAClB,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAExB,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC;gBAC/C;oBACI,UAAU,EAAE,sBAAsB;oBAClC,OAAO,EAAE,gBAAgB;oBACzB,UAAU,EAAE,eAAe;iBAC9B;gBACD;oBACI,UAAU,EAAE,iBAAiB;oBAC7B,UAAU,EAAE,eAAe;iBAC9B;aACJ,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM,SAAS,GAAG,UAAU,CAAC,OAAmC,CAAC;gBACjE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAA+B,CAAC,CAAC,CAAC,EAAE,CAAC;gBAExF,gCAAgC;gBAChC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAEnE,4BAA4B;gBAC5B,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3E,CAAC;YAED,+EAA+E;YAC/E,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAE9B,IAAI,CAAC,YAAY,EAAE,CAAC;QAExB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,gCAAgC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7G,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAEO,sBAAsB;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,+CAA+C;QAC/C,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,cAAwB,CAAC;QAClE,CAAC;IACL,CAAC;IAEO,mBAAmB,CAAC,IAA4B;QACpD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAC;QACrC,iBAAiB,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAE5D,qDAAqD;QACrD,MAAM,YAAY,GAAG,IAAqB,CAAC;QAC3C,YAAY,CAAC,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC;QACtD,YAAY,CAAC,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC1E,YAAY,CAAC,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACpD,CAAC,CAAC,SAAS;YACX,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG;YAC5B,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAC7C,CAAC,MAAM,CAAC;QAET,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,0BAA0B;IAEnB,aAAa;QAChB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAEM,QAAQ,CAAC,IAAmB,EAAE,KAAa;QAC9C,IAAI,KAAK,EAAE,CAAC;YACR,KAAK,CAAC,eAAe,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAmB,EAAE,KAAa;QACtD,IAAI,KAAK,EAAE,CAAC;YACR,KAAK,CAAC,eAAe,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,uDAAuD,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAClI,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YAC3B,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,kBAAkB,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,eAAe,yBAAyB,EACtF,SAAS,EACT,IAAI,CACP,CAAC;YACF,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,oCAAoC,IAAI,CAAC,IAAI,kCAAkC,CAAC,CAAC;QAC3G,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,OAAO,EAAE,CAAC;gBACV,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,oBAAoB,IAAI,CAAC,IAAI,wBAAwB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;gBAChI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChE,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,CAAC;gBACD,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,kCAAkC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/G,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,gCAAgC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7G,CAAC;IACL,CAAC;IAEM,uBAAuB,CAAC,IAAmB,EAAE,KAAa;QAC7D,IAAI,KAAK,EAAE,CAAC;YACR,KAAK,CAAC,eAAe,EAAE,CAAC;QAC5B,CAAC;QACD,oFAAoF;QACpF,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,aAAa,EAAE;YACpD,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,eAAe,EAAE,IAAI;SACxB,CAAC,CAAC;IACP,CAAC;IAED,+BAA+B;IAExB,WAAW,CAAC,IAA4B;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,YAAY,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QAED,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,aAAa,CAAC,MAAc;QAC/B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,oBAAoB;IAEb,cAAc,CAAC,KAAa;QAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAEM,sBAAsB,CAAC,QAAgB;QAC1C,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC;QACvC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAEM,YAAY;QACf,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAEO,YAAY;QAChB,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,qBAAqB;QACrB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAChF,CAAC;QAED,wBAAwB;QACxB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YACpD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC/D,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC5C,CAAC;QACN,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,oBAAoB;IAEb,UAAU,CAAC,IAAmB;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEM,WAAW;QACd,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEO,gBAAgB,CAAC,UAAkB;QACvC,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAkF,CAAC;YACvH,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAEvC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtE,IAAI;gBACJ,IAAI,EAAG,IAAI,CAAC,IAAe,IAAI,QAAQ;gBACvC,KAAK,EAAG,IAAI,CAAC,KAAgB,IAAI,IAAI;gBACrC,WAAW,EAAG,IAAI,CAAC,WAAsB,IAAI,EAAE;gBAC/C,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;gBAChC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;aACpC,CAAC,CAAC,CAAC;YAEJ,gDAAgD;YAChD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBACnE,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBACnE,OAAO,MAAM,GAAG,MAAM,CAAC;YAC3B,CAAC,CAAC,CAAC;QAEP,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,kBAAkB;IAEX,eAAe,CAAC,QAAgB;QACnC,MAAM,OAAO,GAA2B;YACpC,IAAI,EAAE,mBAAmB;YACzB,eAAe,EAAE,sBAAsB;YACvC,SAAS,EAAE,mBAAmB;YAC9B,UAAU,EAAE,sBAAsB;YAClC,gBAAgB,EAAE,2BAA2B;YAC7C,aAAa,EAAE,kBAAkB;SACpC,CAAC;QACF,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC;IAClD,CAAC;IAEM,gBAAgB,CAAC,QAAgB;QACpC,MAAM,QAAQ,GAA2B;YACrC,IAAI,EAAE,yBAAyB;YAC/B,eAAe,EAAE,yBAAyB;YAC1C,SAAS,EAAE,yBAAyB;YACpC,UAAU,EAAE,0BAA0B;YACtC,gBAAgB,EAAE,0BAA0B;YAC5C,aAAa,EAAE,yBAAyB;SAC3C,CAAC;QACF,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,yBAAyB,CAAC;IAC3D,CAAC;IAEM,kBAAkB;QACrB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;QACnD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,4FAA4F;IACrF,cAAc,CAAC,IAAmB;QACrC,OAAO,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IAEM,uBAAuB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;2HA9YQ,iCAAiC;6DAAjC,iCAAiC;;;;;;;YC9B9C,8BAA6B;YAC3B,0GAAiB;YAIjB,2FAAkB;YAoSpB,iBAAM;YAGN,2DAIC;YADC,AADA,iLAAS,uBAAyB,KAAC,wKACxB,yBAA2B,KAAC;YACxC,iBAAgC;;YA/S/B,cAEC;YAFD,wCAEC;YAED,cAmSC;YAnSD,yCAmSC;;;AD1QU,iCAAiC;IAR7C,aAAa,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;GAQpD,iCAAiC,CA+Y7C;;iFA/YY,iCAAiC;cAP7C,SAAS;6BACI,KAAK,YACL,+BAA+B,mBAGxB,uBAAuB,CAAC,MAAM;;kBAmB9C,SAAS;mBAAC,eAAe;;kFAjBjB,iCAAiC","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ResourceData, MJCredentialTypeEntity, MJCredentialEntity } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialTypeEditPanelComponent } from '@memberjunction/ng-credentials';\ninterface FieldSchemaProperty {\n name: string;\n type: string;\n title: string;\n description: string;\n isSecret: boolean;\n required: boolean;\n}\n\ninterface TypeWithStats extends MJCredentialTypeEntity {\n credentialCount: number;\n activeCount: number;\n expiringCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'CredentialsTypesResource')\n@Component({\n standalone: false,\n selector: 'mj-credentials-types-resource',\n templateUrl: './credentials-types-resource.component.html',\n styleUrls: ['./credentials-types-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CredentialsTypesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public types: TypeWithStats[] = [];\n public filteredTypes: TypeWithStats[] = [];\n public credentials: MJCredentialEntity[] = [];\n public selectedType: TypeWithStats | null = null;\n public schemaProperties: FieldSchemaProperty[] = [];\n\n // Filters\n public searchText = '';\n public selectedCategoryFilter = '';\n public categories: string[] = [];\n\n // Permissions\n private _metadata = this.ProviderToUse;\n private _permissionCache = new Map<string, boolean>();\n\n @ViewChild('typeEditPanel') typeEditPanel!: CredentialTypeEditPanelComponent;\n\n constructor(\n private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n // Cleanup if needed\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Credential Types';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-cubes';\n }\n\n // === Permission Checks ===\n\n public get UserCanCreate(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Create');\n }\n\n public get UserCanUpdate(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Update');\n }\n\n public get UserCanDelete(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Delete');\n }\n\n public get UserCanCreateCredential(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Create');\n }\n\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n\n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create': hasPermission = userPermissions.CanCreate; break;\n case 'Read': hasPermission = userPermissions.CanRead; break;\n case 'Update': hasPermission = userPermissions.CanUpdate; break;\n case 'Delete': hasPermission = userPermissions.CanDelete; break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [typeResult, credResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credential Types',\n OrderBy: 'Category, Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Credentials',\n ResultType: 'entity_object'\n }\n ]);\n\n if (typeResult.Success) {\n const baseTypes = typeResult.Results as MJCredentialTypeEntity[];\n this.credentials = credResult.Success ? credResult.Results as MJCredentialEntity[] : [];\n\n // Calculate stats for each type\n this.types = baseTypes.map(type => this.enrichTypeWithStats(type));\n\n // Extract unique categories\n this.categories = [...new Set(this.types.map(t => t.Category))].sort();\n }\n\n // Apply any navigation config (e.g., category filter from Categories nav item)\n this.handleNavigationConfig();\n\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading credential types:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading credential types', 'error', 3000);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private handleNavigationConfig(): void {\n const config = this.Data?.Configuration;\n if (!config) {\n return;\n }\n\n // Apply category filter from navigation config\n if (config.categoryFilter) {\n this.selectedCategoryFilter = config.categoryFilter as string;\n }\n }\n\n private enrichTypeWithStats(type: MJCredentialTypeEntity): TypeWithStats {\n const typeCredentials = this.credentials.filter(c => UUIDsEqual(c.CredentialTypeID, type.ID));\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n\n // Add stats properties directly to the entity object\n const enrichedType = type as TypeWithStats;\n enrichedType.credentialCount = typeCredentials.length;\n enrichedType.activeCount = typeCredentials.filter(c => c.IsActive).length;\n enrichedType.expiringCount = typeCredentials.filter(c =>\n c.ExpiresAt &&\n new Date(c.ExpiresAt) >= now &&\n new Date(c.ExpiresAt) <= thirtyDaysFromNow\n ).length;\n\n return enrichedType;\n }\n\n // === CRUD Operations ===\n\n public createNewType(): void {\n if (this.typeEditPanel) {\n this.typeEditPanel.open(null);\n }\n }\n\n public editType(type: TypeWithStats, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.typeEditPanel) {\n this.typeEditPanel.open(type);\n }\n }\n\n public async deleteType(type: TypeWithStats, event?: Event): Promise<void> {\n if (event) {\n event.stopPropagation();\n }\n\n if (!this.UserCanDelete) {\n MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to delete credential types', 'warning', 3000);\n return;\n }\n\n if (type.credentialCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Cannot delete \"${type.Name}\" - it has ${type.credentialCount} credential(s) using it`,\n 'warning',\n 4000\n );\n return;\n }\n\n const confirmed = confirm(`Are you sure you want to delete \"${type.Name}\"? This action cannot be undone.`);\n if (!confirmed) return;\n\n try {\n const success = await type.Delete();\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Credential type \"${type.Name}\" deleted successfully`, 'success', 3000);\n this.types = this.types.filter(t => !UUIDsEqual(t.ID, type.ID));\n if (UUIDsEqual(this.selectedType?.ID, type.ID)) {\n this.closeDetail();\n }\n this.applyFilters();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credential type', 'error', 3000);\n }\n } catch (error) {\n console.error('Error deleting credential type:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error deleting credential type', 'error', 3000);\n }\n }\n\n public createCredentialForType(type: TypeWithStats, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Navigate to Credentials nav item with the type pre-selected and create panel open\n this.navigationService.OpenNavItemByName('Credentials', {\n typeId: type.ID,\n openCreatePanel: true\n });\n }\n\n // === Panel Event Handlers ===\n\n public onTypeSaved(type: MJCredentialTypeEntity): void {\n const existingIndex = this.types.findIndex(t => UUIDsEqual(t.ID, type.ID));\n const enrichedType = this.enrichTypeWithStats(type);\n\n if (existingIndex >= 0) {\n this.types[existingIndex] = enrichedType;\n } else {\n this.types.unshift(enrichedType);\n }\n\n // Update categories if a new one was added\n if (!this.categories.includes(type.Category)) {\n this.categories = [...new Set(this.types.map(t => t.Category))].sort();\n }\n\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n public onTypeDeleted(typeId: string): void {\n this.types = this.types.filter(t => !UUIDsEqual(t.ID, typeId));\n if (UUIDsEqual(this.selectedType?.ID, typeId)) {\n this.closeDetail();\n }\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n // === Filtering ===\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n }\n\n public onCategoryFilterChange(category: string): void {\n this.selectedCategoryFilter = category;\n this.applyFilters();\n }\n\n public clearFilters(): void {\n this.searchText = '';\n this.selectedCategoryFilter = '';\n this.applyFilters();\n }\n\n private applyFilters(): void {\n let filtered = [...this.types];\n\n // Filter by category\n if (this.selectedCategoryFilter) {\n filtered = filtered.filter(t => t.Category === this.selectedCategoryFilter);\n }\n\n // Filter by search text\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase().trim();\n filtered = filtered.filter(t =>\n t.Name.toLowerCase().includes(search) ||\n (t.Description && t.Description.toLowerCase().includes(search)) ||\n t.Category.toLowerCase().includes(search)\n );\n }\n\n this.filteredTypes = filtered;\n this.cdr.markForCheck();\n }\n\n // === Selection ===\n\n public selectType(type: TypeWithStats): void {\n this.selectedType = type;\n this.parseFieldSchema(type.FieldSchema);\n this.cdr.markForCheck();\n }\n\n public closeDetail(): void {\n this.selectedType = null;\n this.schemaProperties = [];\n this.cdr.markForCheck();\n }\n\n private parseFieldSchema(schemaJson: string): void {\n try {\n const schema = JSON.parse(schemaJson) as { properties?: Record<string, Record<string, unknown>>; required?: string[] };\n const properties = schema.properties || {};\n const required = schema.required || [];\n\n this.schemaProperties = Object.entries(properties).map(([name, prop]) => ({\n name,\n type: (prop.type as string) || 'string',\n title: (prop.title as string) || name,\n description: (prop.description as string) || '',\n isSecret: prop.isSecret === true,\n required: required.includes(name)\n }));\n\n // Sort by order if available, otherwise by name\n this.schemaProperties.sort((a, b) => {\n const propA = properties[a.name];\n const propB = properties[b.name];\n const orderA = typeof propA.order === 'number' ? propA.order : 999;\n const orderB = typeof propB.order === 'number' ? propB.order : 999;\n return orderA - orderB;\n });\n\n } catch (e) {\n console.error('Failed to parse field schema:', e);\n this.schemaProperties = [];\n }\n }\n\n // === Helpers ===\n\n public getCategoryIcon(category: string): string {\n const iconMap: Record<string, string> = {\n 'AI': 'fa-solid fa-brain',\n 'Communication': 'fa-solid fa-envelope',\n 'Storage': 'fa-solid fa-cloud',\n 'Database': 'fa-solid fa-database',\n 'Authentication': 'fa-solid fa-shield-halved',\n 'Integration': 'fa-solid fa-plug'\n };\n return iconMap[category] || 'fa-solid fa-key';\n }\n\n public getCategoryColor(category: string): string {\n const colorMap: Record<string, string> = {\n 'AI': 'var(--mj-brand-primary)',\n 'Communication': 'var(--mj-brand-primary)',\n 'Storage': 'var(--mj-brand-primary)',\n 'Database': 'var(--mj-status-warning)',\n 'Authentication': 'var(--mj-status-success)',\n 'Integration': 'var(--mj-brand-primary)'\n };\n return colorMap[category] || 'var(--mj-brand-primary)';\n }\n\n public getTypesByCategory(): Map<string, TypeWithStats[]> {\n const grouped = new Map<string, TypeWithStats[]>();\n for (const type of this.filteredTypes) {\n const category = type.Category;\n if (!grouped.has(category)) {\n grouped.set(category, []);\n }\n grouped.get(category)!.push(type);\n }\n return grouped;\n }\n\n /** Case-insensitive UUID check whether a credential type is the currently selected type. */\n public IsTypeSelected(type: TypeWithStats): boolean {\n return UUIDsEqual(this.selectedType?.ID, type.ID);\n }\n\n public getTotalCredentialCount(): number {\n return this.types.reduce((sum, t) => sum + t.credentialCount, 0);\n }\n\n public refresh(): void {\n this.loadData();\n }\n}\n","<div class=\"types-container\">\n @if (isLoading) {\n <mj-loading text=\"Loading credential types...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Header -->\n <div class=\"types-header\">\n <div class=\"header-info\">\n <h2 class=\"types-title\">Credential Types</h2>\n <div class=\"header-stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{types.length}} types\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-folder\"></i>\n {{categories.length}} categories\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-key\"></i>\n {{getTotalCredentialCount()}} credentials\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n @if (UserCanCreate) {\n <button class=\"btn-primary\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Type</span>\n </button>\n }\n </div>\n </div>\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search types...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n @if (searchText) {\n <button class=\"search-clear\" (click)=\"onSearchChange('')\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <select\n class=\"filter-select\"\n [value]=\"selectedCategoryFilter\"\n (change)=\"onCategoryFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Categories</option>\n @for (cat of categories; track cat) {\n <option [value]=\"cat\">{{cat}}</option>\n }\n </select>\n </div>\n <div class=\"toolbar-right\">\n <div class=\"results-info\">\n {{filteredTypes.length}} of {{types.length}} types\n </div>\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n <div class=\"types-layout\">\n <!-- Types List -->\n <div class=\"types-list\">\n @for (entry of getTypesByCategory() | keyvalue; track entry) {\n <div class=\"category-section\">\n <div class=\"category-header\" [style.borderLeftColor]=\"getCategoryColor(entry.key)\">\n <i [class]=\"getCategoryIcon(entry.key)\" [style.color]=\"getCategoryColor(entry.key)\"></i>\n <span class=\"category-name\">{{entry.key}}</span>\n <span class=\"count\">{{entry.value.length}}</span>\n </div>\n <div class=\"type-items\">\n @for (type of entry.value; track type) {\n <div\n class=\"type-item\"\n [class.selected]=\"IsTypeSelected(type)\"\n (click)=\"selectType(type)\"\n >\n <div class=\"type-icon\" [style.backgroundColor]=\"getCategoryColor(type.Category) + '15'\" [style.color]=\"getCategoryColor(type.Category)\">\n <i [class]=\"type.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"type-info\">\n <div class=\"type-name\">{{type.Name}}</div>\n @if (type.Description) {\n <div class=\"type-description\">\n {{type.Description | slice:0:60}}{{type.Description.length > 60 ? '...' : ''}}\n </div>\n }\n <div class=\"type-meta\">\n @if (type.credentialCount > 0) {\n <span class=\"meta-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{type.credentialCount}}\n </span>\n }\n @if (type.activeCount > 0) {\n <span class=\"meta-badge active\">\n <i class=\"fa-solid fa-check\"></i>\n {{type.activeCount}} active\n </span>\n }\n @if (type.expiringCount > 0) {\n <span class=\"meta-badge warning\">\n <i class=\"fa-solid fa-clock\"></i>\n {{type.expiringCount}} expiring\n </span>\n }\n </div>\n </div>\n <div class=\"type-actions\">\n @if (UserCanCreateCredential) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"createCredentialForType(type, $event)\"\n title=\"Add Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editType(type, $event)\"\n title=\"Edit Type\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && type.credentialCount === 0) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"deleteType(type, $event)\"\n title=\"Delete Type\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n <i class=\"fa-solid fa-chevron-right arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n @if (filteredTypes.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <h3>No Credential Types Found</h3>\n @if (searchText || selectedCategoryFilter) {\n <p>\n No types match your current filters.\n <button class=\"btn-link\" (click)=\"clearFilters()\">Clear filters</button>\n </p>\n }\n @if (!searchText && !selectedCategoryFilter) {\n <p>\n Get started by creating your first credential type.\n </p>\n }\n @if (UserCanCreate && !searchText && !selectedCategoryFilter) {\n <button class=\"btn-primary\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Type\n </button>\n }\n </div>\n }\n </div>\n <!-- Type Detail -->\n @if (selectedType) {\n <div class=\"type-detail\">\n <div class=\"detail-header\">\n <div class=\"detail-icon\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '15'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"selectedType.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"detail-title\">\n <h2>{{selectedType.Name}}</h2>\n <span class=\"category-badge\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '20'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"getCategoryIcon(selectedType.Category)\"></i>\n {{selectedType.Category}}\n </span>\n </div>\n <div class=\"detail-actions\">\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"editType(selectedType)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n <button class=\"close-btn\" (click)=\"closeDetail()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-body\">\n <!-- Stats Row -->\n <div class=\"detail-stats\">\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedType.credentialCount}}</div>\n <div class=\"stat-label\">Credentials</div>\n </div>\n <div class=\"detail-stat active\">\n <div class=\"stat-value\">{{selectedType.activeCount}}</div>\n <div class=\"stat-label\">Active</div>\n </div>\n @if (selectedType.expiringCount > 0) {\n <div class=\"detail-stat warning\">\n <div class=\"stat-value\">{{selectedType.expiringCount}}</div>\n <div class=\"stat-label\">Expiring</div>\n </div>\n }\n </div>\n @if (selectedType.Description) {\n <p class=\"description\">\n {{selectedType.Description}}\n </p>\n }\n <div class=\"schema-section\">\n <h3>\n <i class=\"fa-solid fa-list-check\"></i>\n Field Schema\n </h3>\n @if (schemaProperties.length > 0) {\n <div class=\"field-list\">\n @for (prop of schemaProperties; track prop) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{prop.title}}</span>\n <span class=\"field-badges\">\n <span class=\"badge type\">{{prop.type}}</span>\n @if (prop.isSecret) {\n <span class=\"badge secret\">\n <i class=\"fa-solid fa-lock\"></i> Secret\n </span>\n }\n @if (prop.required) {\n <span class=\"badge required\">Required</span>\n }\n </span>\n </div>\n @if (prop.description) {\n <p class=\"field-description\">\n {{prop.description}}\n </p>\n }\n </div>\n }\n </div>\n }\n @if (schemaProperties.length === 0) {\n <div class=\"no-fields\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No fields defined in schema</span>\n </div>\n }\n </div>\n @if (selectedType.ValidationEndpoint) {\n <div class=\"validation-section\">\n <h3>\n <i class=\"fa-solid fa-check-circle\"></i>\n Validation\n </h3>\n <div class=\"validation-endpoint\">\n <i class=\"fa-solid fa-link\"></i>\n <span>{{selectedType.ValidationEndpoint}}</span>\n </div>\n </div>\n }\n <!-- Quick Actions -->\n @if (UserCanCreateCredential) {\n <div class=\"detail-quick-actions\">\n <button class=\"btn-primary\" (click)=\"createCredentialForType(selectedType)\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection -->\n @if (!selectedType && filteredTypes.length > 0) {\n <div class=\"no-selection\">\n <div class=\"no-selection-icon\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n </div>\n <h3>Select a Credential Type</h3>\n <p>Click on a credential type to view its details and field schema</p>\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Type Edit Panel -->\n<mj-credential-type-edit-panel\n #typeEditPanel\n (saved)=\"onTypeSaved($any($event))\"\n (deleted)=\"onTypeDeleted($any($event))\"\n></mj-credential-type-edit-panel>\n"]}
1
+ {"version":3,"file":"credentials-types-resource.component.js","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-types-resource.component.ts","../../../src/Credentials/components/credentials-types-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ResourceData, MJCredentialTypeEntity, MJCredentialEntity } from '@memberjunction/core-entities';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialTypeEditPanelComponent } from '@memberjunction/ng-credentials';\nimport { FilterFieldConfig } from '@memberjunction/ng-ui-components';\ninterface FieldSchemaProperty {\n name: string;\n type: string;\n title: string;\n description: string;\n isSecret: boolean;\n required: boolean;\n}\n\ninterface TypeWithStats extends MJCredentialTypeEntity {\n credentialCount: number;\n activeCount: number;\n expiringCount: number;\n}\n\n@RegisterClass(BaseResourceComponent, 'CredentialsTypesResource')\n@Component({\n standalone: false,\n selector: 'mj-credentials-types-resource',\n templateUrl: './credentials-types-resource.component.html',\n styleUrls: ['./credentials-types-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CredentialsTypesResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = true;\n public types: TypeWithStats[] = [];\n public filteredTypes: TypeWithStats[] = [];\n public credentials: MJCredentialEntity[] = [];\n public selectedType: TypeWithStats | null = null;\n public schemaProperties: FieldSchemaProperty[] = [];\n\n // Filters\n public searchText = '';\n public selectedCategoryFilter = '';\n public categories: string[] = [];\n\n // Permissions\n private _metadata = this.ProviderToUse;\n private _permissionCache = new Map<string, boolean>();\n\n @ViewChild('typeEditPanel') typeEditPanel!: CredentialTypeEditPanelComponent;\n\n public get FilterFields(): FilterFieldConfig[] {\n return [\n {\n key: 'categoryFilter',\n type: 'dropdown',\n label: 'Category',\n icon: 'fa-solid fa-folder',\n placeholder: 'All Categories',\n filterable: true,\n options: [\n { text: 'All Categories', value: '' },\n ...this.categories.map(c => ({ text: c, value: c }))\n ]\n }\n ];\n }\n public get FilterValues(): Record<string, unknown> {\n return { categoryFilter: this.selectedCategoryFilter };\n }\n public get ActiveFilterCount(): number {\n return this.selectedCategoryFilter ? 1 : 0;\n }\n public onFilterValuesChange(v: Record<string, unknown>): void {\n const next = (v ?? {}) as { categoryFilter?: string };\n if ((next.categoryFilter ?? '') !== this.selectedCategoryFilter) {\n this.onCategoryFilterChange(next.categoryFilter ?? '');\n }\n }\n public resetFilters(): void {\n if (this.selectedCategoryFilter) this.onCategoryFilterChange('');\n }\n\n constructor(\n private cdr: ChangeDetectorRef) {\n super();\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n // Cleanup if needed\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Credential Types';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-cubes';\n }\n\n // === Permission Checks ===\n\n public get UserCanCreate(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Create');\n }\n\n public get UserCanUpdate(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Update');\n }\n\n public get UserCanDelete(): boolean {\n return this.checkEntityPermission('MJ: Credential Types', 'Delete');\n }\n\n public get UserCanCreateCredential(): boolean {\n return this.checkEntityPermission('MJ: Credentials', 'Create');\n }\n\n private checkEntityPermission(entityName: string, permissionType: 'Create' | 'Read' | 'Update' | 'Delete'): boolean {\n const cacheKey = `${entityName}_${permissionType}`;\n\n if (this._permissionCache.has(cacheKey)) {\n return this._permissionCache.get(cacheKey)!;\n }\n\n try {\n const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n\n const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);\n let hasPermission = false;\n\n switch (permissionType) {\n case 'Create': hasPermission = userPermissions.CanCreate; break;\n case 'Read': hasPermission = userPermissions.CanRead; break;\n case 'Update': hasPermission = userPermissions.CanUpdate; break;\n case 'Delete': hasPermission = userPermissions.CanDelete; break;\n }\n\n this._permissionCache.set(cacheKey, hasPermission);\n return hasPermission;\n } catch (error) {\n this._permissionCache.set(cacheKey, false);\n return false;\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.markForCheck();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [typeResult, credResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Credential Types',\n OrderBy: 'Category, Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Credentials',\n ResultType: 'entity_object'\n }\n ]);\n\n if (typeResult.Success) {\n const baseTypes = typeResult.Results as MJCredentialTypeEntity[];\n this.credentials = credResult.Success ? credResult.Results as MJCredentialEntity[] : [];\n\n // Calculate stats for each type\n this.types = baseTypes.map(type => this.enrichTypeWithStats(type));\n\n // Extract unique categories\n this.categories = [...new Set(this.types.map(t => t.Category))].sort();\n }\n\n // Apply any navigation config (e.g., category filter from Categories nav item)\n this.handleNavigationConfig();\n\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading credential types:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error loading credential types', 'error', 3000);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n private handleNavigationConfig(): void {\n const config = this.Data?.Configuration;\n if (!config) {\n return;\n }\n\n // Apply category filter from navigation config\n if (config.categoryFilter) {\n this.selectedCategoryFilter = config.categoryFilter as string;\n }\n }\n\n private enrichTypeWithStats(type: MJCredentialTypeEntity): TypeWithStats {\n const typeCredentials = this.credentials.filter(c => UUIDsEqual(c.CredentialTypeID, type.ID));\n const now = new Date();\n const thirtyDaysFromNow = new Date();\n thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);\n\n // Add stats properties directly to the entity object\n const enrichedType = type as TypeWithStats;\n enrichedType.credentialCount = typeCredentials.length;\n enrichedType.activeCount = typeCredentials.filter(c => c.IsActive).length;\n enrichedType.expiringCount = typeCredentials.filter(c =>\n c.ExpiresAt &&\n new Date(c.ExpiresAt) >= now &&\n new Date(c.ExpiresAt) <= thirtyDaysFromNow\n ).length;\n\n return enrichedType;\n }\n\n // === CRUD Operations ===\n\n public createNewType(): void {\n if (this.typeEditPanel) {\n this.typeEditPanel.open(null);\n }\n }\n\n public editType(type: TypeWithStats, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.typeEditPanel) {\n this.typeEditPanel.open(type);\n }\n }\n\n public async deleteType(type: TypeWithStats, event?: Event): Promise<void> {\n if (event) {\n event.stopPropagation();\n }\n\n if (!this.UserCanDelete) {\n MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to delete credential types', 'warning', 3000);\n return;\n }\n\n if (type.credentialCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Cannot delete \"${type.Name}\" - it has ${type.credentialCount} credential(s) using it`,\n 'warning',\n 4000\n );\n return;\n }\n\n const confirmed = confirm(`Are you sure you want to delete \"${type.Name}\"? This action cannot be undone.`);\n if (!confirmed) return;\n\n try {\n const success = await type.Delete();\n if (success) {\n MJNotificationService.Instance.CreateSimpleNotification(`Credential type \"${type.Name}\" deleted successfully`, 'success', 3000);\n this.types = this.types.filter(t => !UUIDsEqual(t.ID, type.ID));\n if (UUIDsEqual(this.selectedType?.ID, type.ID)) {\n this.closeDetail();\n }\n this.applyFilters();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credential type', 'error', 3000);\n }\n } catch (error) {\n console.error('Error deleting credential type:', error);\n MJNotificationService.Instance.CreateSimpleNotification('Error deleting credential type', 'error', 3000);\n }\n }\n\n public createCredentialForType(type: TypeWithStats, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n // Navigate to Credentials nav item with the type pre-selected and create panel open\n this.navigationService.OpenNavItemByName('Credentials', {\n typeId: type.ID,\n openCreatePanel: true\n });\n }\n\n // === Panel Event Handlers ===\n\n public onTypeSaved(type: MJCredentialTypeEntity): void {\n const existingIndex = this.types.findIndex(t => UUIDsEqual(t.ID, type.ID));\n const enrichedType = this.enrichTypeWithStats(type);\n\n if (existingIndex >= 0) {\n this.types[existingIndex] = enrichedType;\n } else {\n this.types.unshift(enrichedType);\n }\n\n // Update categories if a new one was added\n if (!this.categories.includes(type.Category)) {\n this.categories = [...new Set(this.types.map(t => t.Category))].sort();\n }\n\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n public onTypeDeleted(typeId: string): void {\n this.types = this.types.filter(t => !UUIDsEqual(t.ID, typeId));\n if (UUIDsEqual(this.selectedType?.ID, typeId)) {\n this.closeDetail();\n }\n this.applyFilters();\n this.cdr.markForCheck();\n }\n\n // === Filtering ===\n\n public onSearchChange(value: string): void {\n this.searchText = value;\n this.applyFilters();\n }\n\n public onCategoryFilterChange(category: string): void {\n this.selectedCategoryFilter = category;\n this.applyFilters();\n }\n\n public clearFilters(): void {\n this.searchText = '';\n this.selectedCategoryFilter = '';\n this.applyFilters();\n }\n\n private applyFilters(): void {\n let filtered = [...this.types];\n\n // Filter by category\n if (this.selectedCategoryFilter) {\n filtered = filtered.filter(t => t.Category === this.selectedCategoryFilter);\n }\n\n // Filter by search text\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase().trim();\n filtered = filtered.filter(t =>\n t.Name.toLowerCase().includes(search) ||\n (t.Description && t.Description.toLowerCase().includes(search)) ||\n t.Category.toLowerCase().includes(search)\n );\n }\n\n this.filteredTypes = filtered;\n this.cdr.markForCheck();\n }\n\n // === Selection ===\n\n public selectType(type: TypeWithStats): void {\n this.selectedType = type;\n this.parseFieldSchema(type.FieldSchema);\n this.cdr.markForCheck();\n }\n\n public closeDetail(): void {\n this.selectedType = null;\n this.schemaProperties = [];\n this.cdr.markForCheck();\n }\n\n private parseFieldSchema(schemaJson: string): void {\n try {\n const schema = JSON.parse(schemaJson) as { properties?: Record<string, Record<string, unknown>>; required?: string[] };\n const properties = schema.properties || {};\n const required = schema.required || [];\n\n this.schemaProperties = Object.entries(properties).map(([name, prop]) => ({\n name,\n type: (prop.type as string) || 'string',\n title: (prop.title as string) || name,\n description: (prop.description as string) || '',\n isSecret: prop.isSecret === true,\n required: required.includes(name)\n }));\n\n // Sort by order if available, otherwise by name\n this.schemaProperties.sort((a, b) => {\n const propA = properties[a.name];\n const propB = properties[b.name];\n const orderA = typeof propA.order === 'number' ? propA.order : 999;\n const orderB = typeof propB.order === 'number' ? propB.order : 999;\n return orderA - orderB;\n });\n\n } catch (e) {\n console.error('Failed to parse field schema:', e);\n this.schemaProperties = [];\n }\n }\n\n // === Helpers ===\n\n public getCategoryIcon(category: string): string {\n const iconMap: Record<string, string> = {\n 'AI': 'fa-solid fa-brain',\n 'Communication': 'fa-solid fa-envelope',\n 'Storage': 'fa-solid fa-cloud',\n 'Database': 'fa-solid fa-database',\n 'Authentication': 'fa-solid fa-shield-halved',\n 'Integration': 'fa-solid fa-plug'\n };\n return iconMap[category] || 'fa-solid fa-key';\n }\n\n public getCategoryColor(category: string): string {\n const colorMap: Record<string, string> = {\n 'AI': 'var(--mj-brand-primary)',\n 'Communication': 'var(--mj-brand-primary)',\n 'Storage': 'var(--mj-brand-primary)',\n 'Database': 'var(--mj-status-warning)',\n 'Authentication': 'var(--mj-status-success)',\n 'Integration': 'var(--mj-brand-primary)'\n };\n return colorMap[category] || 'var(--mj-brand-primary)';\n }\n\n public getTypesByCategory(): Map<string, TypeWithStats[]> {\n const grouped = new Map<string, TypeWithStats[]>();\n for (const type of this.filteredTypes) {\n const category = type.Category;\n if (!grouped.has(category)) {\n grouped.set(category, []);\n }\n grouped.get(category)!.push(type);\n }\n return grouped;\n }\n\n /** Case-insensitive UUID check whether a credential type is the currently selected type. */\n public IsTypeSelected(type: TypeWithStats): boolean {\n return UUIDsEqual(this.selectedType?.ID, type.ID);\n }\n\n public getTotalCredentialCount(): number {\n return this.types.reduce((sum, t) => sum + t.credentialCount, 0);\n }\n\n public refresh(): void {\n this.loadData();\n }\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Credential Types\"\n Icon=\"fa-solid fa-shapes\">\n <div meta>\n <!-- Result-count of the filtered Types list — passes the meta rule\n (filtered/total is signal about how the filter narrowed the data,\n not visible by glancing at the list). Cross-entity reference\n counts (categories, credentials) dropped per chrome slot\n discipline audit Task B — those belong on their own pages. -->\n <mj-stat-badge\n [Count]=\"filteredTypes.length\"\n [Total]=\"types.length\"\n Label=\"types\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n @if (UserCanCreate) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i> New Type\n </button>\n }\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search types...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n @if (isLoading) {\n <mj-loading text=\"Loading credential types...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <div class=\"types-layout\">\n <!-- Types List -->\n <div class=\"types-list\">\n @for (entry of getTypesByCategory() | keyvalue; track entry) {\n <div class=\"category-section\">\n <div class=\"category-header\" [style.borderLeftColor]=\"getCategoryColor(entry.key)\">\n <i [class]=\"getCategoryIcon(entry.key)\" [style.color]=\"getCategoryColor(entry.key)\"></i>\n <span class=\"category-name\">{{entry.key}}</span>\n <span class=\"count\">{{entry.value.length}}</span>\n </div>\n <div class=\"type-items\">\n @for (type of entry.value; track type) {\n <div\n class=\"type-item\"\n [class.selected]=\"IsTypeSelected(type)\"\n (click)=\"selectType(type)\"\n >\n <div class=\"type-icon\" [style.backgroundColor]=\"getCategoryColor(type.Category) + '15'\" [style.color]=\"getCategoryColor(type.Category)\">\n <i [class]=\"type.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"type-info\">\n <div class=\"type-name\">{{type.Name}}</div>\n @if (type.Description) {\n <div class=\"type-description\">\n {{type.Description | slice:0:60}}{{type.Description.length > 60 ? '...' : ''}}\n </div>\n }\n <div class=\"type-meta\">\n @if (type.credentialCount > 0) {\n <span class=\"meta-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{type.credentialCount}}\n </span>\n }\n @if (type.activeCount > 0) {\n <span class=\"meta-badge active\">\n <i class=\"fa-solid fa-check\"></i>\n {{type.activeCount}} active\n </span>\n }\n @if (type.expiringCount > 0) {\n <span class=\"meta-badge warning\">\n <i class=\"fa-solid fa-clock\"></i>\n {{type.expiringCount}} expiring\n </span>\n }\n </div>\n </div>\n <div class=\"type-actions\">\n @if (UserCanCreateCredential) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"createCredentialForType(type, $event)\"\n title=\"Add Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editType(type, $event)\"\n title=\"Edit Type\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n @if (UserCanDelete && type.credentialCount === 0) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"deleteType(type, $event)\"\n title=\"Delete Type\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n <i class=\"fa-solid fa-chevron-right arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n @if (filteredTypes.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <h3>No Credential Types Found</h3>\n @if (searchText || selectedCategoryFilter) {\n <p>\n No types match your current filters.\n <button class=\"btn-link\" (click)=\"clearFilters()\">Clear filters</button>\n </p>\n }\n @if (!searchText && !selectedCategoryFilter) {\n <p>\n Get started by creating your first credential type.\n </p>\n }\n @if (UserCanCreate && !searchText && !selectedCategoryFilter) {\n <button class=\"btn-primary\" (click)=\"createNewType()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Type\n </button>\n }\n </div>\n }\n </div>\n <!-- Type Detail -->\n @if (selectedType) {\n <div class=\"type-detail\">\n <div class=\"detail-header\">\n <div class=\"detail-icon\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '15'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"selectedType.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"detail-title\">\n <h2>{{selectedType.Name}}</h2>\n <span class=\"category-badge\" [style.backgroundColor]=\"getCategoryColor(selectedType.Category) + '20'\" [style.color]=\"getCategoryColor(selectedType.Category)\">\n <i [class]=\"getCategoryIcon(selectedType.Category)\"></i>\n {{selectedType.Category}}\n </span>\n </div>\n <div class=\"detail-actions\">\n @if (UserCanUpdate) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"editType(selectedType)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n <button class=\"close-btn\" (click)=\"closeDetail()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"detail-body\">\n <!-- Stats Row -->\n <div class=\"detail-stats\">\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedType.credentialCount}}</div>\n <div class=\"stat-label\">Credentials</div>\n </div>\n <div class=\"detail-stat active\">\n <div class=\"stat-value\">{{selectedType.activeCount}}</div>\n <div class=\"stat-label\">Active</div>\n </div>\n @if (selectedType.expiringCount > 0) {\n <div class=\"detail-stat warning\">\n <div class=\"stat-value\">{{selectedType.expiringCount}}</div>\n <div class=\"stat-label\">Expiring</div>\n </div>\n }\n </div>\n @if (selectedType.Description) {\n <p class=\"description\">\n {{selectedType.Description}}\n </p>\n }\n <div class=\"schema-section\">\n <h3>\n <i class=\"fa-solid fa-list-check\"></i>\n Field Schema\n </h3>\n @if (schemaProperties.length > 0) {\n <div class=\"field-list\">\n @for (prop of schemaProperties; track prop) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{prop.title}}</span>\n <span class=\"field-badges\">\n <span class=\"badge type\">{{prop.type}}</span>\n @if (prop.isSecret) {\n <span class=\"badge secret\">\n <i class=\"fa-solid fa-lock\"></i> Secret\n </span>\n }\n @if (prop.required) {\n <span class=\"badge required\">Required</span>\n }\n </span>\n </div>\n @if (prop.description) {\n <p class=\"field-description\">\n {{prop.description}}\n </p>\n }\n </div>\n }\n </div>\n }\n @if (schemaProperties.length === 0) {\n <div class=\"no-fields\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No fields defined in schema</span>\n </div>\n }\n </div>\n @if (selectedType.ValidationEndpoint) {\n <div class=\"validation-section\">\n <h3>\n <i class=\"fa-solid fa-check-circle\"></i>\n Validation\n </h3>\n <div class=\"validation-endpoint\">\n <i class=\"fa-solid fa-link\"></i>\n <span>{{selectedType.ValidationEndpoint}}</span>\n </div>\n </div>\n }\n <!-- Quick Actions -->\n @if (UserCanCreateCredential) {\n <div class=\"detail-quick-actions\">\n <button class=\"btn-primary\" (click)=\"createCredentialForType(selectedType)\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n }\n </div>\n </div>\n }\n <!-- No Selection -->\n @if (!selectedType && filteredTypes.length > 0) {\n <div class=\"no-selection\">\n <div class=\"no-selection-icon\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n </div>\n <h3>Select a Credential Type</h3>\n <p>Click on a credential type to view its details and field schema</p>\n </div>\n }\n </div>\n }\n </mj-page-body>\n\n <!-- Type Edit Panel -->\n <mj-credential-type-edit-panel\n #typeEditPanel\n (saved)=\"onTypeSaved($any($event))\"\n (deleted)=\"onTypeDeleted($any($event))\"\n ></mj-credential-type-edit-panel>\n</mj-page-layout>\n"]}
@@ -46,6 +46,14 @@ export declare class DatabaseDesignerDashboardComponent extends BaseDashboard {
46
46
  OnModifyPanelClosed(): void;
47
47
  /** Called when the modify wizard successfully alters an entity. */
48
48
  OnEntityModified(): void;
49
+ /**
50
+ * React to ?entity= changes that arrive after initial load — e.g. clicking a Home pin
51
+ * for a specific entity, or browser back/forward — when this tab is re-focused rather
52
+ * than freshly mounted (so initDashboard() does not run again). Without this, the modify
53
+ * panel would not open for the pinned/linked entity. (initDashboard handles the very
54
+ * first load via _deepLinkEntityId.)
55
+ */
56
+ protected OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void;
49
57
  private openModifyPanel;
50
58
  static ɵfac: i0.ɵɵFactoryDeclaration<DatabaseDesignerDashboardComponent, never>;
51
59
  static ɵcmp: i0.ɵɵComponentDeclaration<DatabaseDesignerDashboardComponent, "mj-database-designer-dashboard", never, {}, {}, never, never, false, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"database-designer-dashboard.component.d.ts","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/database-designer-dashboard.component.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,aAAa,EAAyB,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAEnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;;AAEtE,qBAQa,kCAAmC,SAAQ,aAAa;IAIjE,+DAA+D;IAC/D,SAAS,CAAC,QAAQ,CAAC,eAAe,0BAAmC;IAErE,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAIjD,6EAA6E;IACzC,OAAO,CAAC,SAAS,CAAC,CAA0B;IAIhF;;;;;OAKG;IACH,SAAgB,mBAAmB,QAAO,OAAO,CAM/C;IAIF,qEAAqE;IAC9D,QAAQ,EAAE,gBAAgB,EAAE,CAAM;IAElC,iBAAiB,UAAS;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAIvC,gDAAgD;IACzC,gBAAgB,UAAS;IAEhC,0EAA0E;IACnE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE5C,sEAAsE;IACtE,OAAO,CAAC,iBAAiB,CAAuB;IAI1C,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlE,kEAAkE;IAClE,SAAS,CAAC,aAAa,IAAI,IAAI;IAO/B,+DAA+D;cAC/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BzC,sCAAsC;IAC/B,WAAW,IAAI,IAAI;IAK1B,qDAAqD;IAC9C,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAInD,sEAAsE;IAC/D,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAMnD,uEAAuE;IAChE,cAAc,IAAI,IAAI;IAK7B,6DAA6D;IACtD,eAAe,IAAI,IAAI;IAM9B,kDAAkD;IAC3C,mBAAmB,IAAI,IAAI;IAMlC,mEAAmE;IAC5D,gBAAgB,IAAI,IAAI;IAQ/B,OAAO,CAAC,eAAe;yCA1Id,kCAAkC;2CAAlC,kCAAkC;CA+I9C;AAED,oEAAoE;AACpE,wBAAgB,6BAA6B,IAAI,IAAI,CAA+B"}
1
+ {"version":3,"file":"database-designer-dashboard.component.d.ts","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/database-designer-dashboard.component.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,aAAa,EAAyB,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAEnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;;AAEtE,qBAQa,kCAAmC,SAAQ,aAAa;IAIjE,+DAA+D;IAC/D,SAAS,CAAC,QAAQ,CAAC,eAAe,0BAAmC;IAErE,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAIjD,6EAA6E;IACzC,OAAO,CAAC,SAAS,CAAC,CAA0B;IAIhF;;;;;OAKG;IACH,SAAgB,mBAAmB,QAAO,OAAO,CAM/C;IAIF,qEAAqE;IAC9D,QAAQ,EAAE,gBAAgB,EAAE,CAAM;IAElC,iBAAiB,UAAS;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAIvC,gDAAgD;IACzC,gBAAgB,UAAS;IAEhC,0EAA0E;IACnE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE5C,sEAAsE;IACtE,OAAO,CAAC,iBAAiB,CAAuB;IAI1C,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlE,kEAAkE;IAClE,SAAS,CAAC,aAAa,IAAI,IAAI;IAO/B,+DAA+D;cAC/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BzC,sCAAsC;IAC/B,WAAW,IAAI,IAAI;IAK1B,qDAAqD;IAC9C,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAInD,sEAAsE;IAC/D,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAMnD,uEAAuE;IAChE,cAAc,IAAI,IAAI;IAK7B,6DAA6D;IACtD,eAAe,IAAI,IAAI;IAM9B,kDAAkD;IAC3C,mBAAmB,IAAI,IAAI;IAMlC,mEAAmE;IAC5D,gBAAgB,IAAI,IAAI;IAM/B;;;;;;OAMG;cACgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAgB/G,OAAO,CAAC,eAAe;yCA/Jd,kCAAkC;2CAAlC,kCAAkC;CAoK9C;AAED,oEAAoE;AACpE,wBAAgB,6BAA6B,IAAI,IAAI,CAA+B"}
@@ -30,23 +30,23 @@ import * as i1 from "@memberjunction/ng-versions";
30
30
  import * as i2 from "./entity-list.component";
31
31
  import * as i3 from "./create-wizard/database-create-wizard.component";
32
32
  import * as i4 from "./modify/database-modify.component";
33
- function DatabaseDesignerDashboardComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
33
+ function DatabaseDesignerDashboardComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
34
34
  const _r1 = i0.ɵɵgetCurrentView();
35
- i0.ɵɵelementStart(0, "mj-slide-panel", 5);
36
- i0.ɵɵlistener("Closed", function DatabaseDesignerDashboardComponent_Conditional_3_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWizardClosed()); });
37
- i0.ɵɵelementStart(1, "mj-database-create-wizard", 6);
38
- i0.ɵɵlistener("EntityCreated", function DatabaseDesignerDashboardComponent_Conditional_3_Template_mj_database_create_wizard_EntityCreated_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityCreated()); })("Cancelled", function DatabaseDesignerDashboardComponent_Conditional_3_Template_mj_database_create_wizard_Cancelled_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWizardClosed()); });
35
+ i0.ɵɵelementStart(0, "mj-slide-panel", 3);
36
+ i0.ɵɵlistener("Closed", function DatabaseDesignerDashboardComponent_Conditional_1_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWizardClosed()); });
37
+ i0.ɵɵelementStart(1, "mj-database-create-wizard", 4);
38
+ i0.ɵɵlistener("EntityCreated", function DatabaseDesignerDashboardComponent_Conditional_1_Template_mj_database_create_wizard_EntityCreated_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityCreated()); })("Cancelled", function DatabaseDesignerDashboardComponent_Conditional_1_Template_mj_database_create_wizard_Cancelled_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWizardClosed()); });
39
39
  i0.ɵɵelementEnd()();
40
40
  } if (rf & 2) {
41
41
  const ctx_r1 = i0.ɵɵnextContext();
42
42
  i0.ɵɵproperty("Visible", ctx_r1.ShowCreateWizard)("Resizable", true)("WidthPx", 9999)("MaxWidthRatio", 1)("MinWidthPx", 960);
43
43
  } }
44
- function DatabaseDesignerDashboardComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
44
+ function DatabaseDesignerDashboardComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
45
45
  const _r3 = i0.ɵɵgetCurrentView();
46
- i0.ɵɵelementStart(0, "mj-slide-panel", 7);
47
- i0.ɵɵlistener("Closed", function DatabaseDesignerDashboardComponent_Conditional_4_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnModifyPanelClosed()); });
48
- i0.ɵɵelementStart(1, "mj-database-modify", 8);
49
- i0.ɵɵlistener("EntityModified", function DatabaseDesignerDashboardComponent_Conditional_4_Template_mj_database_modify_EntityModified_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityModified()); })("Cancelled", function DatabaseDesignerDashboardComponent_Conditional_4_Template_mj_database_modify_Cancelled_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnModifyPanelClosed()); });
46
+ i0.ɵɵelementStart(0, "mj-slide-panel", 5);
47
+ i0.ɵɵlistener("Closed", function DatabaseDesignerDashboardComponent_Conditional_2_Template_mj_slide_panel_Closed_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnModifyPanelClosed()); });
48
+ i0.ɵɵelementStart(1, "mj-database-modify", 6);
49
+ i0.ɵɵlistener("EntityModified", function DatabaseDesignerDashboardComponent_Conditional_2_Template_mj_database_modify_EntityModified_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEntityModified()); })("Cancelled", function DatabaseDesignerDashboardComponent_Conditional_2_Template_mj_database_modify_Cancelled_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnModifyPanelClosed()); });
50
50
  i0.ɵɵelementEnd()();
51
51
  } if (rf & 2) {
52
52
  const ctx_r1 = i0.ɵɵnextContext();
@@ -161,6 +161,27 @@ let DatabaseDesignerDashboardComponent = class DatabaseDesignerDashboardComponen
161
161
  DatabaseDesignerEngine.Instance.invalidateCache();
162
162
  this.loadData();
163
163
  }
164
+ /**
165
+ * React to ?entity= changes that arrive after initial load — e.g. clicking a Home pin
166
+ * for a specific entity, or browser back/forward — when this tab is re-focused rather
167
+ * than freshly mounted (so initDashboard() does not run again). Without this, the modify
168
+ * panel would not open for the pinned/linked entity. (initDashboard handles the very
169
+ * first load via _deepLinkEntityId.)
170
+ */
171
+ OnQueryParamsChanged(params, _source) {
172
+ const entityId = params['entity'] || null;
173
+ if (entityId) {
174
+ if (entityId !== this.ModifyEntityId) {
175
+ const target = this.Entities.find(e => e.entityId === entityId);
176
+ if (target) {
177
+ this.openModifyPanel(target);
178
+ }
179
+ }
180
+ }
181
+ else if (this.ModifyEntityId) {
182
+ this.OnModifyPanelClosed();
183
+ }
184
+ }
164
185
  // ─── Helpers ───────────────────────────────────────────────────────────
165
186
  openModifyPanel(entity) {
166
187
  this.ModifyEntityId = entity.entityId;
@@ -173,19 +194,18 @@ let DatabaseDesignerDashboardComponent = class DatabaseDesignerDashboardComponen
173
194
  } if (rf & 2) {
174
195
  let _t;
175
196
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.modifyRef = _t.first);
176
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 2, consts: [[1, "database-designer-dashboard"], [1, "database-designer-content"], [3, "NewEntity", "EditEntity", "ViewEntity"], ["Mode", "slide", "Title", "New Entity", 3, "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx"], ["Mode", "slide", "Title", "Edit Entity", 3, "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx", "CanClose"], ["Mode", "slide", "Title", "New Entity", 3, "Closed", "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx"], [3, "EntityCreated", "Cancelled"], ["Mode", "slide", "Title", "Edit Entity", 3, "Closed", "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx", "CanClose"], [3, "EntityModified", "Cancelled", "EntityId"]], template: function DatabaseDesignerDashboardComponent_Template(rf, ctx) { if (rf & 1) {
177
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "mj-database-entity-list", 2);
178
- i0.ɵɵlistener("NewEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_NewEntity_2_listener() { return ctx.OnNewEntity(); })("EditEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_EditEntity_2_listener($event) { return ctx.OnEditEntity($event); })("ViewEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_ViewEntity_2_listener($event) { return ctx.OnViewEntity($event); });
179
- i0.ɵɵelementEnd()();
180
- i0.ɵɵconditionalCreate(3, DatabaseDesignerDashboardComponent_Conditional_3_Template, 2, 5, "mj-slide-panel", 3);
181
- i0.ɵɵconditionalCreate(4, DatabaseDesignerDashboardComponent_Conditional_4_Template, 2, 7, "mj-slide-panel", 4);
197
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [[3, "NewEntity", "EditEntity", "ViewEntity"], ["Mode", "slide", "Title", "New Entity", 3, "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx"], ["Mode", "slide", "Title", "Edit Entity", 3, "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx", "CanClose"], ["Mode", "slide", "Title", "New Entity", 3, "Closed", "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx"], [3, "EntityCreated", "Cancelled"], ["Mode", "slide", "Title", "Edit Entity", 3, "Closed", "Visible", "Resizable", "WidthPx", "MaxWidthRatio", "MinWidthPx", "CanClose"], [3, "EntityModified", "Cancelled", "EntityId"]], template: function DatabaseDesignerDashboardComponent_Template(rf, ctx) { if (rf & 1) {
198
+ i0.ɵɵelementStart(0, "mj-database-entity-list", 0);
199
+ i0.ɵɵlistener("NewEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_NewEntity_0_listener() { return ctx.OnNewEntity(); })("EditEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_EditEntity_0_listener($event) { return ctx.OnEditEntity($event); })("ViewEntity", function DatabaseDesignerDashboardComponent_Template_mj_database_entity_list_ViewEntity_0_listener($event) { return ctx.OnViewEntity($event); });
182
200
  i0.ɵɵelementEnd();
201
+ i0.ɵɵconditionalCreate(1, DatabaseDesignerDashboardComponent_Conditional_1_Template, 2, 5, "mj-slide-panel", 1);
202
+ i0.ɵɵconditionalCreate(2, DatabaseDesignerDashboardComponent_Conditional_2_Template, 2, 7, "mj-slide-panel", 2);
183
203
  } if (rf & 2) {
184
- i0.ɵɵadvance(3);
185
- i0.ɵɵconditional(ctx.ShowCreateWizard ? 3 : -1);
186
204
  i0.ɵɵadvance();
187
- i0.ɵɵconditional(ctx.ModifyEntityId ? 4 : -1);
188
- } }, dependencies: [i1.MjSlidePanelComponent, i2.EntityListComponent, i3.DatabaseCreateWizardComponent, i4.DatabaseModifyComponent], styles: ["\n\n\n.database-designer-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n position: relative;\n}\n\n\n\n\n.database-designer-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n margin: 16px;\n box-shadow: 0 1px 4px color-mix(in srgb, var(--mj-border-strong) 20%, transparent);\n}\n\n\n\n\n.panel-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 32px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.panel-placeholder[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n}\n\n.panel-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n}"], changeDetection: 0 });
205
+ i0.ɵɵconditional(ctx.ShowCreateWizard ? 1 : -1);
206
+ i0.ɵɵadvance();
207
+ i0.ɵɵconditional(ctx.ModifyEntityId ? 2 : -1);
208
+ } }, dependencies: [i1.MjSlidePanelComponent, i2.EntityListComponent, i3.DatabaseCreateWizardComponent, i4.DatabaseModifyComponent], styles: ["\n\n\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background: var(--mj-bg-page);\n position: relative;\n}\n\nmj-database-entity-list[_ngcontent-%COMP%] {\n display: block;\n flex: 1;\n min-height: 0;\n}\n\n\n\n\n.panel-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 32px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.panel-placeholder[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n}\n\n.panel-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.95rem;\n}"], changeDetection: 0 });
189
209
  };
190
210
  DatabaseDesignerDashboardComponent = __decorate([
191
211
  RegisterClass(BaseResourceComponent, 'DatabaseDesignerDashboard')
@@ -193,7 +213,7 @@ DatabaseDesignerDashboardComponent = __decorate([
193
213
  export { DatabaseDesignerDashboardComponent };
194
214
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DatabaseDesignerDashboardComponent, [{
195
215
  type: Component,
196
- args: [{ standalone: false, selector: 'mj-database-designer-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"database-designer-dashboard\">\n\n <!-- \u2500\u2500 Main entity list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <div class=\"database-designer-content\">\n <mj-database-entity-list\n (NewEntity)=\"OnNewEntity()\"\n (EditEntity)=\"OnEditEntity($event)\"\n (ViewEntity)=\"OnViewEntity($event)\">\n </mj-database-entity-list>\n </div>\n\n <!-- \u2500\u2500 Create Wizard slide-over panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n @if (ShowCreateWizard) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"New Entity\"\n [Visible]=\"ShowCreateWizard\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n (Closed)=\"OnWizardClosed()\">\n <mj-database-create-wizard\n (EntityCreated)=\"OnEntityCreated()\"\n (Cancelled)=\"OnWizardClosed()\">\n </mj-database-create-wizard>\n </mj-slide-panel>\n }\n\n <!-- \u2500\u2500 Modify slide-over panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n @if (ModifyEntityId) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Edit Entity\"\n [Visible]=\"!!ModifyEntityId\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n [CanClose]=\"ModifyPanelCanClose\"\n (Closed)=\"OnModifyPanelClosed()\">\n <mj-database-modify\n [EntityId]=\"ModifyEntityId!\"\n (EntityModified)=\"OnEntityModified()\"\n (Cancelled)=\"OnModifyPanelClosed()\">\n </mj-database-modify>\n </mj-slide-panel>\n }\n\n</div>\n", styles: ["/* \u2500\u2500 Dashboard root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.database-designer-dashboard {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-page);\n overflow: hidden;\n position: relative;\n}\n\n/* \u2500\u2500 Content area \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.database-designer-content {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border-radius: 8px;\n margin: 16px;\n box-shadow: 0 1px 4px color-mix(in srgb, var(--mj-border-strong) 20%, transparent);\n}\n\n/* \u2500\u2500 Placeholder (pre-Phase 5d/5e wiring) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.panel-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 32px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.panel-placeholder i {\n font-size: 2rem;\n}\n\n.panel-placeholder p {\n margin: 0;\n font-size: 0.95rem;\n}\n"] }]
216
+ args: [{ standalone: false, selector: 'mj-database-designer-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n Thin wrapper \u2014 the entity-list component owns the interior chrome card\n (<mj-page-header-interior>) and the scrollable body. The dashboard's role is\n to host the slide-over panels (create-wizard, modify) and route their lifecycle.\n-->\n<mj-database-entity-list\n (NewEntity)=\"OnNewEntity()\"\n (EditEntity)=\"OnEditEntity($event)\"\n (ViewEntity)=\"OnViewEntity($event)\">\n</mj-database-entity-list>\n\n <!-- \u2500\u2500 Create Wizard slide-over panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n @if (ShowCreateWizard) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"New Entity\"\n [Visible]=\"ShowCreateWizard\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n (Closed)=\"OnWizardClosed()\">\n <mj-database-create-wizard\n (EntityCreated)=\"OnEntityCreated()\"\n (Cancelled)=\"OnWizardClosed()\">\n </mj-database-create-wizard>\n </mj-slide-panel>\n }\n\n <!-- \u2500\u2500 Modify slide-over panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n @if (ModifyEntityId) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Edit Entity\"\n [Visible]=\"!!ModifyEntityId\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n [CanClose]=\"ModifyPanelCanClose\"\n (Closed)=\"OnModifyPanelClosed()\">\n <mj-database-modify\n [EntityId]=\"ModifyEntityId!\"\n (EntityModified)=\"OnEntityModified()\"\n (Cancelled)=\"OnModifyPanelClosed()\">\n </mj-database-modify>\n </mj-slide-panel>\n }\n", styles: ["/*\n Database Designer dashboard root \u2014 thin wrapper that hosts the entity-list\n child + slide-over panels. The entity-list owns its own interior chrome\n (<mj-page-header-interior>) so this component is a flex column that just\n lets the child fill the body. See Section 10 of plans/explorer-chrome-conventions.md.\n*/\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n background: var(--mj-bg-page);\n position: relative;\n}\n\nmj-database-entity-list {\n display: block;\n flex: 1;\n min-height: 0;\n}\n\n/* \u2500\u2500 Placeholder (pre-Phase 5d/5e wiring) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.panel-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n padding: 60px 32px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.panel-placeholder i {\n font-size: 2rem;\n}\n\n.panel-placeholder p {\n margin: 0;\n font-size: 0.95rem;\n}\n"] }]
197
217
  }], null, { modifyRef: [{
198
218
  type: ViewChild,
199
219
  args: [DatabaseModifyComponent]
@@ -1 +1 @@
1
- {"version":3,"file":"database-designer-dashboard.component.js","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/database-designer-dashboard.component.ts","../../../src/DatabaseDesigner/components/database-designer-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module database-designer-dashboard.component\n * @description Root dashboard for the Database Designer feature area.\n *\n * Registered as 'DatabaseDesignerDashboard' via `@RegisterClass(BaseDashboard, ...)`.\n * Registered as a navigation item via metadata (metadata/applications/).\n *\n * Lifecycle:\n * - `initDashboard()` — sync ?entity= URL param (deep-link support), initialize slide-panel state\n * - `loadData()` — delegate to DatabaseDesignerEngine singleton; pass result to EntityListComponent\n *\n * The wizard and modify panels open as MjSlidePanel drawers so the entity\n * list remains visible behind them. The dashboard orchestrates all state\n * transitions; child components communicate only via @Output events.\n */\n\nimport {\n Component, ChangeDetectionStrategy, ChangeDetectorRef,\n inject, ViewChild,\n} from '@angular/core';\nimport { BaseDashboard, BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { ResourceData } from '@memberjunction/core-entities';\n\nimport { DatabaseDesignerEngine } from '../services/database-designer.engine.js';\nimport { DatabaseDesignerService } from '../services/database-designer.service.js';\nimport { DatabaseModifyComponent } from './modify/database-modify.component.js';\nimport type { AccessibleEntity } from '../database-designer.types.js';\n\n@Component({\n standalone: false,\n selector: 'mj-database-designer-dashboard',\n templateUrl: './database-designer-dashboard.component.html',\n styleUrls: ['./database-designer-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n@RegisterClass(BaseResourceComponent, 'DatabaseDesignerDashboard')\nexport class DatabaseDesignerDashboardComponent extends BaseDashboard {\n\n // ─── Injected services ─────────────────────────────────────────────────\n\n /** Angular DI: write operations (create, modify, validate). */\n protected readonly designerService = inject(DatabaseDesignerService);\n\n /** Change detection ref for OnPush updates. */\n private readonly cdr = inject(ChangeDetectorRef);\n\n // ─── ViewChild ─────────────────────────────────────────────────────────\n\n /** Reference to the active modify component — used for close-guard state. */\n @ViewChild(DatabaseModifyComponent) private modifyRef?: DatabaseModifyComponent;\n\n // ─── Slide-panel close guard ───────────────────────────────────────────\n\n /**\n * Passed as `[CanClose]` to the modify slide panel.\n * Prevents the panel from closing while a pipeline is running and prompts the user\n * for confirmation. Defined as an arrow function so `this` is captured correctly\n * when called by `MjSlidePanelComponent` (no angular binding issues).\n */\n public readonly ModifyPanelCanClose = (): boolean => {\n if (!this.modifyRef?.IsPipelineRunning) return true;\n return window.confirm(\n 'A pipeline operation is in progress. Closing will hide the progress panel ' +\n 'but the operation will continue running on the server.\\n\\nAre you sure?'\n );\n };\n\n // ─── Entity list ───────────────────────────────────────────────────────\n\n /** Entities displayed in EntityListComponent — set by loadData(). */\n public Entities: AccessibleEntity[] = [];\n\n public IsLoadingEntities = false;\n public LoadError: string | null = null;\n\n // ─── Slide panel state ─────────────────────────────────────────────────\n\n /** Whether the Create Wizard drawer is open. */\n public ShowCreateWizard = false;\n\n /** ID of the entity currently being modified; null if panel is closed. */\n public ModifyEntityId: string | null = null;\n\n /** ID to deep-link into on first load (from ?entity= query param). */\n private _deepLinkEntityId: string | null = null;\n\n // ─── BaseDashboard implementation ──────────────────────────────────────\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Database Designer';\n }\n\n /** Sync ?entity=<id> URL param; set initial slide-panel state. */\n protected initDashboard(): void {\n const params = this.GetQueryParams();\n if (params['entity']) {\n this._deepLinkEntityId = params['entity'];\n }\n }\n\n /** Load accessible entities from the engine's cached store. */\n protected async loadData(): Promise<void> {\n this.IsLoadingEntities = true;\n this.LoadError = null;\n this.cdr.markForCheck();\n\n try {\n this.Entities = await DatabaseDesignerEngine.Instance.loadAccessibleEntities();\n\n // Honor deep-link: open modify panel if the entity exists in the list.\n if (this._deepLinkEntityId) {\n const target = this.Entities.find(e => e.entityId === this._deepLinkEntityId);\n if (target) {\n this.openModifyPanel(target);\n }\n this._deepLinkEntityId = null;\n }\n } catch (err) {\n this.LoadError = err instanceof Error ? err.message : String(err);\n } finally {\n this.IsLoadingEntities = false;\n this.cdr.markForCheck();\n }\n }\n\n // ─── Entity list event handlers ────────────────────────────────────────\n\n /** Opens the Create Wizard drawer. */\n public OnNewEntity(): void {\n this.ShowCreateWizard = true;\n this.cdr.markForCheck();\n }\n\n /** Opens the Modify panel for an existing entity. */\n public OnEditEntity(entity: AccessibleEntity): void {\n this.openModifyPanel(entity);\n }\n\n /** Opens the Modify panel (read-only view) for an existing entity. */\n public OnViewEntity(entity: AccessibleEntity): void {\n this.openModifyPanel(entity);\n }\n\n // ─── Slide-panel event handlers ────────────────────────────────────────\n\n /** Called when the Create Wizard drawer closes (cancel or success). */\n public OnWizardClosed(): void {\n this.ShowCreateWizard = false;\n this.cdr.markForCheck();\n }\n\n /** Called when the wizard successfully creates an entity. */\n public OnEntityCreated(): void {\n this.ShowCreateWizard = false;\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadData();\n }\n\n /** Called when the Modify panel drawer closes. */\n public OnModifyPanelClosed(): void {\n this.ModifyEntityId = null;\n this.UpdateQueryParams({ entity: null });\n this.cdr.markForCheck();\n }\n\n /** Called when the modify wizard successfully alters an entity. */\n public OnEntityModified(): void {\n this.ModifyEntityId = null;\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadData();\n }\n\n // ─── Helpers ───────────────────────────────────────────────────────────\n\n private openModifyPanel(entity: AccessibleEntity): void {\n this.ModifyEntityId = entity.entityId;\n this.UpdateQueryParams({ entity: entity.entityId });\n this.cdr.markForCheck();\n }\n}\n\n/** Tree-shaking prevention — called from module's public-api.ts. */\nexport function LoadDatabaseDesignerDashboard(): void { /* noop — forces import */ }\n","<div class=\"database-designer-dashboard\">\n\n <!-- ── Main entity list ───────────────────────────────────────────────── -->\n <div class=\"database-designer-content\">\n <mj-database-entity-list\n (NewEntity)=\"OnNewEntity()\"\n (EditEntity)=\"OnEditEntity($event)\"\n (ViewEntity)=\"OnViewEntity($event)\">\n </mj-database-entity-list>\n </div>\n\n <!-- ── Create Wizard slide-over panel ────────────────────────────────── -->\n @if (ShowCreateWizard) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"New Entity\"\n [Visible]=\"ShowCreateWizard\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n (Closed)=\"OnWizardClosed()\">\n <mj-database-create-wizard\n (EntityCreated)=\"OnEntityCreated()\"\n (Cancelled)=\"OnWizardClosed()\">\n </mj-database-create-wizard>\n </mj-slide-panel>\n }\n\n <!-- ── Modify slide-over panel ───────────────────────────────────────── -->\n @if (ModifyEntityId) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Edit Entity\"\n [Visible]=\"!!ModifyEntityId\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n [CanClose]=\"ModifyPanelCanClose\"\n (Closed)=\"OnModifyPanelClosed()\">\n <mj-database-modify\n [EntityId]=\"ModifyEntityId!\"\n (EntityModified)=\"OnEntityModified()\"\n (Cancelled)=\"OnModifyPanelClosed()\">\n </mj-database-modify>\n </mj-slide-panel>\n }\n\n</div>\n"]}
1
+ {"version":3,"file":"database-designer-dashboard.component.js","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/database-designer-dashboard.component.ts","../../../src/DatabaseDesigner/components/database-designer-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module database-designer-dashboard.component\n * @description Root dashboard for the Database Designer feature area.\n *\n * Registered as 'DatabaseDesignerDashboard' via `@RegisterClass(BaseDashboard, ...)`.\n * Registered as a navigation item via metadata (metadata/applications/).\n *\n * Lifecycle:\n * - `initDashboard()` — sync ?entity= URL param (deep-link support), initialize slide-panel state\n * - `loadData()` — delegate to DatabaseDesignerEngine singleton; pass result to EntityListComponent\n *\n * The wizard and modify panels open as MjSlidePanel drawers so the entity\n * list remains visible behind them. The dashboard orchestrates all state\n * transitions; child components communicate only via @Output events.\n */\n\nimport {\n Component, ChangeDetectionStrategy, ChangeDetectorRef,\n inject, ViewChild,\n} from '@angular/core';\nimport { BaseDashboard, BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { ResourceData } from '@memberjunction/core-entities';\n\nimport { DatabaseDesignerEngine } from '../services/database-designer.engine.js';\nimport { DatabaseDesignerService } from '../services/database-designer.service.js';\nimport { DatabaseModifyComponent } from './modify/database-modify.component.js';\nimport type { AccessibleEntity } from '../database-designer.types.js';\n\n@Component({\n standalone: false,\n selector: 'mj-database-designer-dashboard',\n templateUrl: './database-designer-dashboard.component.html',\n styleUrls: ['./database-designer-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n@RegisterClass(BaseResourceComponent, 'DatabaseDesignerDashboard')\nexport class DatabaseDesignerDashboardComponent extends BaseDashboard {\n\n // ─── Injected services ─────────────────────────────────────────────────\n\n /** Angular DI: write operations (create, modify, validate). */\n protected readonly designerService = inject(DatabaseDesignerService);\n\n /** Change detection ref for OnPush updates. */\n private readonly cdr = inject(ChangeDetectorRef);\n\n // ─── ViewChild ─────────────────────────────────────────────────────────\n\n /** Reference to the active modify component — used for close-guard state. */\n @ViewChild(DatabaseModifyComponent) private modifyRef?: DatabaseModifyComponent;\n\n // ─── Slide-panel close guard ───────────────────────────────────────────\n\n /**\n * Passed as `[CanClose]` to the modify slide panel.\n * Prevents the panel from closing while a pipeline is running and prompts the user\n * for confirmation. Defined as an arrow function so `this` is captured correctly\n * when called by `MjSlidePanelComponent` (no angular binding issues).\n */\n public readonly ModifyPanelCanClose = (): boolean => {\n if (!this.modifyRef?.IsPipelineRunning) return true;\n return window.confirm(\n 'A pipeline operation is in progress. Closing will hide the progress panel ' +\n 'but the operation will continue running on the server.\\n\\nAre you sure?'\n );\n };\n\n // ─── Entity list ───────────────────────────────────────────────────────\n\n /** Entities displayed in EntityListComponent — set by loadData(). */\n public Entities: AccessibleEntity[] = [];\n\n public IsLoadingEntities = false;\n public LoadError: string | null = null;\n\n // ─── Slide panel state ─────────────────────────────────────────────────\n\n /** Whether the Create Wizard drawer is open. */\n public ShowCreateWizard = false;\n\n /** ID of the entity currently being modified; null if panel is closed. */\n public ModifyEntityId: string | null = null;\n\n /** ID to deep-link into on first load (from ?entity= query param). */\n private _deepLinkEntityId: string | null = null;\n\n // ─── BaseDashboard implementation ──────────────────────────────────────\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Database Designer';\n }\n\n /** Sync ?entity=<id> URL param; set initial slide-panel state. */\n protected initDashboard(): void {\n const params = this.GetQueryParams();\n if (params['entity']) {\n this._deepLinkEntityId = params['entity'];\n }\n }\n\n /** Load accessible entities from the engine's cached store. */\n protected async loadData(): Promise<void> {\n this.IsLoadingEntities = true;\n this.LoadError = null;\n this.cdr.markForCheck();\n\n try {\n this.Entities = await DatabaseDesignerEngine.Instance.loadAccessibleEntities();\n\n // Honor deep-link: open modify panel if the entity exists in the list.\n if (this._deepLinkEntityId) {\n const target = this.Entities.find(e => e.entityId === this._deepLinkEntityId);\n if (target) {\n this.openModifyPanel(target);\n }\n this._deepLinkEntityId = null;\n }\n } catch (err) {\n this.LoadError = err instanceof Error ? err.message : String(err);\n } finally {\n this.IsLoadingEntities = false;\n this.cdr.markForCheck();\n }\n }\n\n // ─── Entity list event handlers ────────────────────────────────────────\n\n /** Opens the Create Wizard drawer. */\n public OnNewEntity(): void {\n this.ShowCreateWizard = true;\n this.cdr.markForCheck();\n }\n\n /** Opens the Modify panel for an existing entity. */\n public OnEditEntity(entity: AccessibleEntity): void {\n this.openModifyPanel(entity);\n }\n\n /** Opens the Modify panel (read-only view) for an existing entity. */\n public OnViewEntity(entity: AccessibleEntity): void {\n this.openModifyPanel(entity);\n }\n\n // ─── Slide-panel event handlers ────────────────────────────────────────\n\n /** Called when the Create Wizard drawer closes (cancel or success). */\n public OnWizardClosed(): void {\n this.ShowCreateWizard = false;\n this.cdr.markForCheck();\n }\n\n /** Called when the wizard successfully creates an entity. */\n public OnEntityCreated(): void {\n this.ShowCreateWizard = false;\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadData();\n }\n\n /** Called when the Modify panel drawer closes. */\n public OnModifyPanelClosed(): void {\n this.ModifyEntityId = null;\n this.UpdateQueryParams({ entity: null });\n this.cdr.markForCheck();\n }\n\n /** Called when the modify wizard successfully alters an entity. */\n public OnEntityModified(): void {\n this.ModifyEntityId = null;\n DatabaseDesignerEngine.Instance.invalidateCache();\n this.loadData();\n }\n\n /**\n * React to ?entity= changes that arrive after initial load — e.g. clicking a Home pin\n * for a specific entity, or browser back/forward — when this tab is re-focused rather\n * than freshly mounted (so initDashboard() does not run again). Without this, the modify\n * panel would not open for the pinned/linked entity. (initDashboard handles the very\n * first load via _deepLinkEntityId.)\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void {\n const entityId = params['entity'] || null;\n if (entityId) {\n if (entityId !== this.ModifyEntityId) {\n const target = this.Entities.find(e => e.entityId === entityId);\n if (target) {\n this.openModifyPanel(target);\n }\n }\n } else if (this.ModifyEntityId) {\n this.OnModifyPanelClosed();\n }\n }\n\n // ─── Helpers ───────────────────────────────────────────────────────────\n\n private openModifyPanel(entity: AccessibleEntity): void {\n this.ModifyEntityId = entity.entityId;\n this.UpdateQueryParams({ entity: entity.entityId });\n this.cdr.markForCheck();\n }\n}\n\n/** Tree-shaking prevention — called from module's public-api.ts. */\nexport function LoadDatabaseDesignerDashboard(): void { /* noop — forces import */ }\n","<!--\n Thin wrapper — the entity-list component owns the interior chrome card\n (<mj-page-header-interior>) and the scrollable body. The dashboard's role is\n to host the slide-over panels (create-wizard, modify) and route their lifecycle.\n-->\n<mj-database-entity-list\n (NewEntity)=\"OnNewEntity()\"\n (EditEntity)=\"OnEditEntity($event)\"\n (ViewEntity)=\"OnViewEntity($event)\">\n</mj-database-entity-list>\n\n <!-- ── Create Wizard slide-over panel ────────────────────────────────── -->\n @if (ShowCreateWizard) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"New Entity\"\n [Visible]=\"ShowCreateWizard\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n (Closed)=\"OnWizardClosed()\">\n <mj-database-create-wizard\n (EntityCreated)=\"OnEntityCreated()\"\n (Cancelled)=\"OnWizardClosed()\">\n </mj-database-create-wizard>\n </mj-slide-panel>\n }\n\n <!-- ── Modify slide-over panel ───────────────────────────────────────── -->\n @if (ModifyEntityId) {\n <mj-slide-panel\n Mode=\"slide\"\n Title=\"Edit Entity\"\n [Visible]=\"!!ModifyEntityId\"\n [Resizable]=\"true\"\n [WidthPx]=\"9999\"\n [MaxWidthRatio]=\"1\"\n [MinWidthPx]=\"960\"\n [CanClose]=\"ModifyPanelCanClose\"\n (Closed)=\"OnModifyPanelClosed()\">\n <mj-database-modify\n [EntityId]=\"ModifyEntityId!\"\n (EntityModified)=\"OnEntityModified()\"\n (Cancelled)=\"OnModifyPanelClosed()\">\n </mj-database-modify>\n </mj-slide-panel>\n }\n"]}
@@ -22,6 +22,8 @@ export declare class EntityListComponent implements OnInit, OnDestroy {
22
22
  ErrorMessage: string | null;
23
23
  /** Full unfiltered list from the engine. */
24
24
  private _allEntities;
25
+ /** Public accessor for the chrome's X-of-Y badge. */
26
+ get TotalEntityCount(): number;
25
27
  /** Cached sorted unique schema names — recomputed only when _allEntities changes. */
26
28
  private _availableFilterSchemas;
27
29
  /** Currently displayed (filtered + sorted) rows. */
@@ -1 +1 @@
1
- {"version":3,"file":"entity-list.component.d.ts","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/entity-list.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACQ,MAAM,EAAE,SAAS,EAAU,YAAY,EAErD,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;;AAItE,KAAK,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AACnF,KAAK,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpC,qBAOa,mBAAoB,YAAW,MAAM,EAAE,SAAS;IAEzD,4DAA4D;IAC5D,SAA0B,UAAU,iCAAwC;IAC5E,oEAAoE;IACpE,SAA0B,UAAU,iCAAwC;IAC5E,iDAAiD;IACjD,SAA0B,SAAS,qBAA4B;IAExD,SAAS,UAAS;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4CAA4C;IAC5C,OAAO,CAAC,YAAY,CAA0B;IAE9C,qFAAqF;IACrF,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,oDAAoD;IAC7C,gBAAgB,EAAE,gBAAgB,EAAE,CAAM;IAEjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6C;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAEjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAIjD,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAOnB,IAAI,UAAU,IAAI,MAAM,CAAgC;IACxD,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,EAA4B;IAEpD,IAAI,cAAc,IAAI,MAAM,CAAgC;IAC5D,IAAI,cAAc,CAAC,CAAC,EAAE,MAAM,EAA4B;IAExD,oFAAoF;IACpF,IAAI,sBAAsB,IAAI,MAAM,EAAE,CAAyC;IAE/E,IAAI,SAAS,IAAI,SAAS,CAAmC;IAC7D,IAAI,aAAa,IAAI,aAAa,CAAiC;IAEnE,0EAA0E;IACnE,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IASpC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI5C,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI5C,WAAW,IAAI,IAAI;IAInB,SAAS,IAAI,IAAI;IAKjB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAI5D,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAMrC,OAAO,CAAC,WAAW;YAaL,YAAY;IAwB1B,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,SAAS;yCA3JR,mBAAmB;2CAAnB,mBAAmB;CAqK/B"}
1
+ {"version":3,"file":"entity-list.component.d.ts","sourceRoot":"","sources":["../../../src/DatabaseDesigner/components/entity-list.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACQ,MAAM,EAAE,SAAS,EAAU,YAAY,EAErD,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;;AAItE,KAAK,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AACnF,KAAK,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpC,qBAOa,mBAAoB,YAAW,MAAM,EAAE,SAAS;IAEzD,4DAA4D;IAC5D,SAA0B,UAAU,iCAAwC;IAC5E,oEAAoE;IACpE,SAA0B,UAAU,iCAAwC;IAC5E,iDAAiD;IACjD,SAA0B,SAAS,qBAA4B;IAExD,SAAS,UAAS;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4CAA4C;IAC5C,OAAO,CAAC,YAAY,CAA0B;IAE9C,qDAAqD;IACrD,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,qFAAqF;IACrF,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,oDAAoD;IAC7C,gBAAgB,EAAE,gBAAgB,EAAE,CAAM;IAEjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6C;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAEjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAIjD,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAOnB,IAAI,UAAU,IAAI,MAAM,CAAgC;IACxD,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,EAA4B;IAEpD,IAAI,cAAc,IAAI,MAAM,CAAgC;IAC5D,IAAI,cAAc,CAAC,CAAC,EAAE,MAAM,EAA4B;IAExD,oFAAoF;IACpF,IAAI,sBAAsB,IAAI,MAAM,EAAE,CAAyC;IAE/E,IAAI,SAAS,IAAI,SAAS,CAAmC;IAC7D,IAAI,aAAa,IAAI,aAAa,CAAiC;IAEnE,0EAA0E;IACnE,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IASpC,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI5C,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI5C,WAAW,IAAI,IAAI;IAInB,SAAS,IAAI,IAAI;IAKjB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAI5D,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAMrC,OAAO,CAAC,WAAW;YAaL,YAAY;IAwB1B,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,SAAS;yCAhKR,mBAAmB;2CAAnB,mBAAmB;CA0K/B"}