@memberjunction/ng-dashboards 5.34.0 → 5.35.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 (348) 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 +75 -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 +400 -89
  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.js +990 -992
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  41. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  45. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  46. package/dist/AI/components/models/model-management.component.js +370 -425
  47. package/dist/AI/components/models/model-management.component.js.map +1 -1
  48. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  49. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  51. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  52. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  53. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  55. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  56. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  57. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.js +403 -362
  59. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  60. package/dist/AI/components/tags/tags-resource.component.js +781 -783
  61. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  62. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  67. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  68. package/dist/Actions/components/actions-overview.component.js +79 -30
  69. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  70. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  71. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  72. package/dist/Actions/components/execution-monitoring.component.js +196 -142
  73. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  74. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  75. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  76. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  77. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  78. package/dist/Actions/components/explorer/index.d.ts +0 -1
  79. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  80. package/dist/Actions/components/explorer/index.js +0 -1
  81. package/dist/Actions/components/explorer/index.js.map +1 -1
  82. package/dist/Admin/admin-data-schema.component.js +32 -40
  83. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  84. package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
  85. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  86. package/dist/Admin/admin-identity-access.component.js +32 -40
  87. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  88. package/dist/Admin/admin-monitoring.component.js +32 -40
  89. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  90. package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
  91. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  92. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  93. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  94. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  95. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  96. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  97. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  98. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  99. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  100. package/dist/Communication/communication-logs-resource.component.js +80 -99
  101. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  102. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  103. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  104. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  105. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  106. package/dist/Communication/communication-providers-resource.component.js +44 -45
  107. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  108. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  109. package/dist/Communication/communication-runs-resource.component.js +60 -58
  110. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  111. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  112. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  113. package/dist/Communication/communication-templates-resource.component.js +139 -162
  114. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  115. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  116. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  117. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  118. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  119. package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
  120. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  121. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  122. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  123. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  124. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  125. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  126. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  127. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  128. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  129. package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
  130. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  131. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  132. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  133. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
  134. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  135. package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
  136. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  137. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  138. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  139. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
  140. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  141. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
  142. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  143. package/dist/Home/home-dashboard.component.d.ts +6 -0
  144. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  145. package/dist/Home/home-dashboard.component.js +521 -485
  146. package/dist/Home/home-dashboard.component.js.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  148. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  149. package/dist/Integration/components/activity/activity.component.js +309 -318
  150. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  151. package/dist/Integration/components/connections/connections.component.js +866 -847
  152. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.js +182 -163
  156. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  157. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.js +241 -241
  162. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  163. package/dist/Integration/integration.module.d.ts +1 -1
  164. package/dist/Integration/integration.module.d.ts.map +1 -1
  165. package/dist/Integration/integration.module.js +28 -1
  166. package/dist/Integration/integration.module.js.map +1 -1
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
  168. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  171. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  173. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  174. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  175. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  177. package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
  178. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  179. package/dist/Lists/components/lists-browse-resource.component.js +486 -532
  180. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  181. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  182. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  183. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  184. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  185. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  186. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  187. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  188. package/dist/Lists/components/lists-operations-resource.component.js +234 -246
  189. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  190. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  191. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  192. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  193. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  194. package/dist/MCP/mcp.module.d.ts +1 -1
  195. package/dist/MCP/mcp.module.d.ts.map +1 -1
  196. package/dist/MCP/mcp.module.js +34 -1
  197. package/dist/MCP/mcp.module.js.map +1 -1
  198. package/dist/Permissions/audit-log-resource.component.js +76 -85
  199. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  200. package/dist/Permissions/resource-access-resource.component.js +64 -69
  201. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  202. package/dist/Permissions/user-access-resource.component.js +63 -74
  203. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  204. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  205. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  206. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  207. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  208. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  209. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  210. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  211. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  213. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  217. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  218. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  219. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  220. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  221. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  222. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  223. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  224. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  225. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  226. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  227. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  228. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  229. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  230. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  231. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  232. package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
  233. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  234. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -0
  235. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  236. package/dist/SystemDiagnostics/system-diagnostics.component.js +812 -784
  237. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  238. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  239. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  240. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  241. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  242. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  243. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  244. package/dist/Testing/components/testing-analytics.component.js +420 -393
  245. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  246. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  247. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  248. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  249. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  250. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  251. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  252. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  253. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  254. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  255. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  256. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  257. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  258. package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
  259. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  260. package/dist/Testing/components/testing-explorer.component.js +587 -608
  261. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  262. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  263. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  264. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  265. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  266. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  267. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  268. package/dist/Testing/components/testing-review.component.js +310 -274
  269. package/dist/Testing/components/testing-review.component.js.map +1 -1
  270. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  271. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  272. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  273. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  274. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  275. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  276. package/dist/Testing/components/testing-runs.component.js +307 -273
  277. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  278. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  279. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  280. package/dist/Testing/testing-dashboard.component.js +107 -93
  281. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  282. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  283. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  284. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  285. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  286. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  287. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  288. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  289. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  290. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  291. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  292. package/dist/actions-dashboards.module.d.ts +15 -16
  293. package/dist/actions-dashboards.module.d.ts.map +1 -1
  294. package/dist/actions-dashboards.module.js +34 -11
  295. package/dist/actions-dashboards.module.js.map +1 -1
  296. package/dist/ai-dashboards.module.d.ts +45 -48
  297. package/dist/ai-dashboards.module.d.ts.map +1 -1
  298. package/dist/ai-dashboards.module.js +36 -10
  299. package/dist/ai-dashboards.module.js.map +1 -1
  300. package/dist/archiving-dashboards.module.d.ts +2 -1
  301. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  302. package/dist/archiving-dashboards.module.js +12 -2
  303. package/dist/archiving-dashboards.module.js.map +1 -1
  304. package/dist/communication-dashboards.module.d.ts +2 -1
  305. package/dist/communication-dashboards.module.d.ts.map +1 -1
  306. package/dist/communication-dashboards.module.js +24 -3
  307. package/dist/communication-dashboards.module.js.map +1 -1
  308. package/dist/core-dashboards.module.d.ts +1 -1
  309. package/dist/core-dashboards.module.d.ts.map +1 -1
  310. package/dist/core-dashboards.module.js +31 -1
  311. package/dist/core-dashboards.module.js.map +1 -1
  312. package/dist/credentials-dashboards.module.d.ts +1 -1
  313. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  314. package/dist/credentials-dashboards.module.js +28 -1
  315. package/dist/credentials-dashboards.module.js.map +1 -1
  316. package/dist/lists-dashboards.module.d.ts +1 -1
  317. package/dist/lists-dashboards.module.d.ts.map +1 -1
  318. package/dist/lists-dashboards.module.js +28 -1
  319. package/dist/lists-dashboards.module.js.map +1 -1
  320. package/dist/public-api.d.ts +2 -2
  321. package/dist/public-api.d.ts.map +1 -1
  322. package/dist/public-api.js +3 -3
  323. package/dist/public-api.js.map +1 -1
  324. package/dist/scheduling-dashboards.module.d.ts +1 -1
  325. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  326. package/dist/scheduling-dashboards.module.js +31 -1
  327. package/dist/scheduling-dashboards.module.js.map +1 -1
  328. package/dist/testing-dashboards.module.d.ts +8 -7
  329. package/dist/testing-dashboards.module.d.ts.map +1 -1
  330. package/dist/testing-dashboards.module.js +30 -0
  331. package/dist/testing-dashboards.module.js.map +1 -1
  332. package/package.json +52 -52
  333. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  334. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  335. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  336. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  337. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  338. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  339. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  340. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  341. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  342. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  343. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  344. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  345. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  346. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  347. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  348. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -14,9 +14,9 @@ import * as i1 from "@angular/forms";
14
14
  import * as i2 from "@memberjunction/ng-ui-components";
15
15
  import * as i3 from "@memberjunction/ng-shared-generic";
16
16
  const _forTrack0 = ($index, $item) => $item.ID;
17
- function PermissionsUserAccessResourceComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
18
- i0.ɵɵelementStart(0, "div", 9);
19
- i0.ɵɵelement(1, "i", 17);
17
+ function PermissionsUserAccessResourceComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
18
+ i0.ɵɵelementStart(0, "div", 3);
19
+ i0.ɵɵelement(1, "i", 11);
20
20
  i0.ɵɵelementStart(2, "span");
21
21
  i0.ɵɵtext(3);
22
22
  i0.ɵɵelementEnd()();
@@ -25,8 +25,8 @@ function PermissionsUserAccessResourceComponent_Conditional_12_Template(rf, ctx)
25
25
  i0.ɵɵadvance(3);
26
26
  i0.ɵɵtextInterpolate(ctx_r0.ErrorMessage);
27
27
  } }
28
- function PermissionsUserAccessResourceComponent_For_18_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelementStart(0, "option", 13);
28
+ function PermissionsUserAccessResourceComponent_For_11_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelementStart(0, "option", 7);
30
30
  i0.ɵɵtext(1);
31
31
  i0.ɵɵelementEnd();
32
32
  } if (rf & 2) {
@@ -35,9 +35,9 @@ function PermissionsUserAccessResourceComponent_For_18_Template(rf, ctx) { if (r
35
35
  i0.ɵɵadvance();
36
36
  i0.ɵɵtextInterpolate2("", user_r2.Name, "", user_r2.Email ? " \u2014 " + user_r2.Email : "");
37
37
  } }
38
- function PermissionsUserAccessResourceComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
39
- i0.ɵɵelementStart(0, "div", 14);
40
- i0.ɵɵelement(1, "i", 18);
38
+ function PermissionsUserAccessResourceComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
39
+ i0.ɵɵelementStart(0, "div", 8);
40
+ i0.ɵɵelement(1, "i", 12);
41
41
  i0.ɵɵelementStart(2, "span");
42
42
  i0.ɵɵtext(3);
43
43
  i0.ɵɵelementEnd()();
@@ -46,25 +46,25 @@ function PermissionsUserAccessResourceComponent_Conditional_19_Template(rf, ctx)
46
46
  i0.ɵɵadvance(3);
47
47
  i0.ɵɵtextInterpolate(ctx_r0.SelectedUserRoles.join(", "));
48
48
  } }
49
- function PermissionsUserAccessResourceComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
50
- i0.ɵɵelement(0, "mj-loading", 15);
49
+ function PermissionsUserAccessResourceComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelement(0, "mj-loading", 9);
51
51
  } }
52
- function PermissionsUserAccessResourceComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelementStart(0, "div", 16);
54
- i0.ɵɵelement(1, "i", 19);
52
+ function PermissionsUserAccessResourceComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵelementStart(0, "div", 10);
54
+ i0.ɵɵelement(1, "i", 13);
55
55
  i0.ɵɵelementStart(2, "p");
56
56
  i0.ɵɵtext(3, "Select a user above to see their access report.");
57
57
  i0.ɵɵelementEnd()();
58
58
  } }
59
- function PermissionsUserAccessResourceComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
60
- i0.ɵɵelementStart(0, "div", 16);
61
- i0.ɵɵelement(1, "i", 20);
59
+ function PermissionsUserAccessResourceComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
60
+ i0.ɵɵelementStart(0, "div", 10);
61
+ i0.ɵɵelement(1, "i", 14);
62
62
  i0.ɵɵelementStart(2, "p");
63
63
  i0.ɵɵtext(3, "This user has no permissions granted in any domain.");
64
64
  i0.ɵɵelementEnd()();
65
65
  } }
66
- function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
67
- i0.ɵɵelementStart(0, "span", 35);
66
+ function PermissionsUserAccessResourceComponent_Conditional_16_For_9_Conditional_9_For_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelementStart(0, "span", 29);
68
68
  i0.ɵɵtext(1);
69
69
  i0.ɵɵelementEnd();
70
70
  } if (rf & 2) {
@@ -72,8 +72,8 @@ function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional
72
72
  i0.ɵɵadvance();
73
73
  i0.ɵɵtextInterpolate(row_r5.ResourceID);
74
74
  } }
75
- function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_For_10_Template(rf, ctx) { if (rf & 1) {
76
- i0.ɵɵelementStart(0, "span", 37);
75
+ function PermissionsUserAccessResourceComponent_Conditional_16_For_9_Conditional_9_For_14_For_10_Template(rf, ctx) { if (rf & 1) {
76
+ i0.ɵɵelementStart(0, "span", 31);
77
77
  i0.ɵɵtext(1);
78
78
  i0.ɵɵelementEnd();
79
79
  } if (rf & 2) {
@@ -81,19 +81,19 @@ function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional
81
81
  i0.ɵɵadvance();
82
82
  i0.ɵɵtextInterpolate(action_r6);
83
83
  } }
84
- function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_Template(rf, ctx) { if (rf & 1) {
85
- i0.ɵɵelementStart(0, "tr")(1, "td", 33)(2, "span", 34);
84
+ function PermissionsUserAccessResourceComponent_Conditional_16_For_9_Conditional_9_For_14_Template(rf, ctx) { if (rf & 1) {
85
+ i0.ɵɵelementStart(0, "tr")(1, "td", 27)(2, "span", 28);
86
86
  i0.ɵɵtext(3);
87
87
  i0.ɵɵelementEnd();
88
- i0.ɵɵconditionalCreate(4, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_Conditional_4_Template, 2, 1, "span", 35);
88
+ i0.ɵɵconditionalCreate(4, PermissionsUserAccessResourceComponent_Conditional_16_For_9_Conditional_9_For_14_Conditional_4_Template, 2, 1, "span", 29);
89
89
  i0.ɵɵelementEnd();
90
90
  i0.ɵɵelementStart(5, "td");
91
91
  i0.ɵɵtext(6);
92
92
  i0.ɵɵelementEnd();
93
- i0.ɵɵelementStart(7, "td")(8, "div", 36);
94
- i0.ɵɵrepeaterCreate(9, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_For_10_Template, 2, 1, "span", 37, i0.ɵɵrepeaterTrackByIdentity);
93
+ i0.ɵɵelementStart(7, "td")(8, "div", 30);
94
+ i0.ɵɵrepeaterCreate(9, PermissionsUserAccessResourceComponent_Conditional_16_For_9_Conditional_9_For_14_For_10_Template, 2, 1, "span", 31, i0.ɵɵrepeaterTrackByIdentity);
95
95
  i0.ɵɵelementEnd()();
96
- i0.ɵɵelementStart(11, "td")(12, "span", 38);
96
+ i0.ɵɵelementStart(11, "td")(12, "span", 32);
97
97
  i0.ɵɵtext(13);
98
98
  i0.ɵɵelementEnd()()();
99
99
  } if (rf & 2) {
@@ -111,8 +111,8 @@ function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional
111
111
  i0.ɵɵadvance();
112
112
  i0.ɵɵtextInterpolate1(" ", row_r5.Effect, " ");
113
113
  } }
114
- function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
115
- i0.ɵɵelementStart(0, "div", 31)(1, "table", 32)(2, "thead")(3, "tr")(4, "th");
114
+ function PermissionsUserAccessResourceComponent_Conditional_16_For_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
115
+ i0.ɵɵelementStart(0, "div", 25)(1, "table", 26)(2, "thead")(3, "tr")(4, "th");
116
116
  i0.ɵɵtext(5, "Resource");
117
117
  i0.ɵɵelementEnd();
118
118
  i0.ɵɵelementStart(6, "th");
@@ -125,28 +125,28 @@ function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional
125
125
  i0.ɵɵtext(11, "Effect");
126
126
  i0.ɵɵelementEnd()()();
127
127
  i0.ɵɵelementStart(12, "tbody");
128
- i0.ɵɵrepeaterCreate(13, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_Template, 14, 8, "tr", null, i0.ɵɵcomponentInstance().TrackByPermission, true);
128
+ i0.ɵɵrepeaterCreate(13, PermissionsUserAccessResourceComponent_Conditional_16_For_9_Conditional_9_For_14_Template, 14, 8, "tr", null, i0.ɵɵcomponentInstance().TrackByPermission, true);
129
129
  i0.ɵɵelementEnd()()();
130
130
  } if (rf & 2) {
131
131
  const group_r4 = i0.ɵɵnextContext().$implicit;
132
132
  i0.ɵɵadvance(13);
133
133
  i0.ɵɵrepeater(group_r4.Rows);
134
134
  } }
135
- function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Template(rf, ctx) { if (rf & 1) {
135
+ function PermissionsUserAccessResourceComponent_Conditional_16_For_9_Template(rf, ctx) { if (rf & 1) {
136
136
  const _r3 = i0.ɵɵgetCurrentView();
137
- i0.ɵɵelementStart(0, "div", 24)(1, "button", 25);
138
- i0.ɵɵlistener("click", function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Template_button_click_1_listener() { const group_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.ToggleGroup(group_r4)); });
139
- i0.ɵɵelementStart(2, "div", 26);
140
- i0.ɵɵelement(3, "i", 27);
141
- i0.ɵɵelementStart(4, "span", 28);
137
+ i0.ɵɵelementStart(0, "div", 18)(1, "button", 19);
138
+ i0.ɵɵlistener("click", function PermissionsUserAccessResourceComponent_Conditional_16_For_9_Template_button_click_1_listener() { const group_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.ToggleGroup(group_r4)); });
139
+ i0.ɵɵelementStart(2, "div", 20);
140
+ i0.ɵɵelement(3, "i", 21);
141
+ i0.ɵɵelementStart(4, "span", 22);
142
142
  i0.ɵɵtext(5);
143
143
  i0.ɵɵelementEnd();
144
- i0.ɵɵelementStart(6, "span", 29);
144
+ i0.ɵɵelementStart(6, "span", 23);
145
145
  i0.ɵɵtext(7);
146
146
  i0.ɵɵelementEnd()();
147
- i0.ɵɵelement(8, "i", 30);
147
+ i0.ɵɵelement(8, "i", 24);
148
148
  i0.ɵɵelementEnd();
149
- i0.ɵɵconditionalCreate(9, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_Template, 15, 0, "div", 31);
149
+ i0.ɵɵconditionalCreate(9, PermissionsUserAccessResourceComponent_Conditional_16_For_9_Conditional_9_Template, 15, 0, "div", 25);
150
150
  i0.ɵɵelementEnd();
151
151
  } if (rf & 2) {
152
152
  const group_r4 = ctx.$implicit;
@@ -162,8 +162,8 @@ function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Template(rf
162
162
  i0.ɵɵadvance();
163
163
  i0.ɵɵconditional(group_r4.Expanded ? 9 : -1);
164
164
  } }
165
- function PermissionsUserAccessResourceComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
166
- i0.ɵɵelementStart(0, "div", 21)(1, "strong");
165
+ function PermissionsUserAccessResourceComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
166
+ i0.ɵɵelementStart(0, "div", 15)(1, "strong");
167
167
  i0.ɵɵtext(2);
168
168
  i0.ɵɵelementEnd();
169
169
  i0.ɵɵtext(3);
@@ -172,8 +172,8 @@ function PermissionsUserAccessResourceComponent_Conditional_23_Template(rf, ctx)
172
172
  i0.ɵɵelementEnd();
173
173
  i0.ɵɵtext(6);
174
174
  i0.ɵɵelementEnd();
175
- i0.ɵɵelementStart(7, "div", 22);
176
- i0.ɵɵrepeaterCreate(8, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Template, 10, 9, "div", 23, i0.ɵɵcomponentInstance().TrackByDomain, true);
175
+ i0.ɵɵelementStart(7, "div", 16);
176
+ i0.ɵɵrepeaterCreate(8, PermissionsUserAccessResourceComponent_Conditional_16_For_9_Template, 10, 9, "div", 17, i0.ɵɵcomponentInstance().TrackByDomain, true);
177
177
  i0.ɵɵelementEnd();
178
178
  } if (rf & 2) {
179
179
  const ctx_r0 = i0.ɵɵnextContext();
@@ -286,48 +286,37 @@ let PermissionsUserAccessResourceComponent = class PermissionsUserAccessResource
286
286
  return this.DomainGroups.reduce((sum, g) => sum + g.Count, 0);
287
287
  }
288
288
  static ɵfac = function PermissionsUserAccessResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PermissionsUserAccessResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
289
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PermissionsUserAccessResourceComponent, selectors: [["mj-permissions-user-access-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 24, vars: 8, consts: [[1, "permissions-container"], [1, "header"], [1, "header-left"], [1, "fa-solid", "fa-user", "header-icon"], [1, "header-title"], [1, "header-actions"], ["mjButton", "", "variant", "secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-arrows-rotate"], [1, "description"], [1, "message", "error-message"], [1, "selector-row"], ["for", "user-select", 1, "selector-label"], ["id", "user-select", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"], [3, "ngValue"], ["title", "Roles assigned to this user", 1, "roles-badge"], ["text", "Loading permissions...", "size", "medium"], [1, "empty-state"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-user-tag"], [1, "fa-solid", "fa-user-slash"], [1, "fa-solid", "fa-folder-open"], [1, "total-summary"], [1, "domain-groups"], [1, "domain-group", 3, "expanded"], [1, "domain-group"], ["type", "button", 1, "domain-header", 3, "click"], [1, "domain-header-left"], [1, "domain-icon"], [1, "domain-name"], [1, "domain-count"], [1, "fa-solid", "fa-chevron-down", "toggle-icon"], [1, "domain-body"], [1, "perms-table"], [1, "resource-cell"], [1, "resource-name"], [1, "resource-id"], [1, "action-chips"], [1, "action-chip"], [1, "effect-badge"]], template: function PermissionsUserAccessResourceComponent_Template(rf, ctx) { if (rf & 1) {
290
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
291
- i0.ɵɵelement(3, "i", 3);
292
- i0.ɵɵelementStart(4, "h2", 4);
293
- i0.ɵɵtext(5, "User Access Report");
294
- i0.ɵɵelementEnd()();
295
- i0.ɵɵelementStart(6, "div", 5)(7, "button", 6);
296
- i0.ɵɵlistener("click", function PermissionsUserAccessResourceComponent_Template_button_click_7_listener() { return ctx.loadUsers(); });
297
- i0.ɵɵelement(8, "i", 7);
298
- i0.ɵɵtext(9, " Refresh ");
289
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PermissionsUserAccessResourceComponent, selectors: [["mj-permissions-user-access-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 17, vars: 7, consts: [["Title", "User Access Report", "Icon", "fa-solid fa-user", "Subtitle", "See every resource a user can access across all registered permission domains"], ["actions", ""], [3, "Clicked", "Loading", "Disabled"], [1, "message", "error-message"], [1, "selector-row"], ["for", "user-select", 1, "selector-label"], ["id", "user-select", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"], [3, "ngValue"], ["title", "Roles assigned to this user", 1, "roles-badge"], ["text", "Loading permissions...", "size", "medium"], [1, "empty-state"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-user-tag"], [1, "fa-solid", "fa-user-slash"], [1, "fa-solid", "fa-folder-open"], [1, "total-summary"], [1, "domain-groups"], [1, "domain-group", 3, "expanded"], [1, "domain-group"], ["type", "button", 1, "domain-header", 3, "click"], [1, "domain-header-left"], [1, "domain-icon"], [1, "domain-name"], [1, "domain-count"], [1, "fa-solid", "fa-chevron-down", "toggle-icon"], [1, "domain-body"], [1, "perms-table"], [1, "resource-cell"], [1, "resource-name"], [1, "resource-id"], [1, "action-chips"], [1, "action-chip"], [1, "effect-badge"]], template: function PermissionsUserAccessResourceComponent_Template(rf, ctx) { if (rf & 1) {
290
+ i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1)(3, "mj-refresh-button", 2);
291
+ i0.ɵɵlistener("Clicked", function PermissionsUserAccessResourceComponent_Template_mj_refresh_button_Clicked_3_listener() { return ctx.loadUsers(); });
299
292
  i0.ɵɵelementEnd()()();
300
- i0.ɵɵelementStart(10, "p", 8);
301
- i0.ɵɵtext(11, " Select a user to see every resource they can access across all registered permission domains. ");
302
- i0.ɵɵelementEnd();
303
- i0.ɵɵconditionalCreate(12, PermissionsUserAccessResourceComponent_Conditional_12_Template, 4, 1, "div", 9);
304
- i0.ɵɵelementStart(13, "div", 10)(14, "label", 11);
305
- i0.ɵɵtext(15, "User:");
306
- i0.ɵɵelementEnd();
307
- i0.ɵɵelementStart(16, "select", 12);
308
- i0.ɵɵlistener("ngModelChange", function PermissionsUserAccessResourceComponent_Template_select_ngModelChange_16_listener($event) { return ctx.OnUserChanged($event); });
309
- i0.ɵɵrepeaterCreate(17, PermissionsUserAccessResourceComponent_For_18_Template, 2, 3, "option", 13, _forTrack0);
293
+ i0.ɵɵelementStart(4, "mj-page-body");
294
+ i0.ɵɵconditionalCreate(5, PermissionsUserAccessResourceComponent_Conditional_5_Template, 4, 1, "div", 3);
295
+ i0.ɵɵelementStart(6, "div", 4)(7, "label", 5);
296
+ i0.ɵɵtext(8, "User:");
310
297
  i0.ɵɵelementEnd();
311
- i0.ɵɵconditionalCreate(19, PermissionsUserAccessResourceComponent_Conditional_19_Template, 4, 1, "div", 14);
298
+ i0.ɵɵelementStart(9, "select", 6);
299
+ i0.ɵɵlistener("ngModelChange", function PermissionsUserAccessResourceComponent_Template_select_ngModelChange_9_listener($event) { return ctx.OnUserChanged($event); });
300
+ i0.ɵɵrepeaterCreate(10, PermissionsUserAccessResourceComponent_For_11_Template, 2, 3, "option", 7, _forTrack0);
312
301
  i0.ɵɵelementEnd();
313
- i0.ɵɵconditionalCreate(20, PermissionsUserAccessResourceComponent_Conditional_20_Template, 1, 0, "mj-loading", 15)(21, PermissionsUserAccessResourceComponent_Conditional_21_Template, 4, 0, "div", 16)(22, PermissionsUserAccessResourceComponent_Conditional_22_Template, 4, 0, "div", 16)(23, PermissionsUserAccessResourceComponent_Conditional_23_Template, 10, 4);
302
+ i0.ɵɵconditionalCreate(12, PermissionsUserAccessResourceComponent_Conditional_12_Template, 4, 1, "div", 8);
314
303
  i0.ɵɵelementEnd();
304
+ i0.ɵɵconditionalCreate(13, PermissionsUserAccessResourceComponent_Conditional_13_Template, 1, 0, "mj-loading", 9)(14, PermissionsUserAccessResourceComponent_Conditional_14_Template, 4, 0, "div", 10)(15, PermissionsUserAccessResourceComponent_Conditional_15_Template, 4, 0, "div", 10)(16, PermissionsUserAccessResourceComponent_Conditional_16_Template, 10, 4);
305
+ i0.ɵɵelementEnd()();
315
306
  } if (rf & 2) {
316
- i0.ɵɵadvance(7);
317
- i0.ɵɵproperty("disabled", ctx.IsLoadingUsers || ctx.IsLoadingPermissions);
318
- i0.ɵɵadvance();
319
- i0.ɵɵclassProp("fa-spin", ctx.IsLoadingUsers);
320
- i0.ɵɵadvance(4);
321
- i0.ɵɵconditional(ctx.ErrorMessage ? 12 : -1);
307
+ i0.ɵɵadvance(3);
308
+ i0.ɵɵproperty("Loading", ctx.IsLoadingUsers)("Disabled", ctx.IsLoadingPermissions);
309
+ i0.ɵɵadvance(2);
310
+ i0.ɵɵconditional(ctx.ErrorMessage ? 5 : -1);
322
311
  i0.ɵɵadvance(4);
323
312
  i0.ɵɵproperty("ngModel", ctx.SelectedUserId)("disabled", ctx.IsLoadingUsers || ctx.IsLoadingPermissions);
324
313
  i0.ɵɵadvance();
325
314
  i0.ɵɵrepeater(ctx.Users);
326
315
  i0.ɵɵadvance(2);
327
- i0.ɵɵconditional(ctx.SelectedUserRoles.length > 0 ? 19 : -1);
316
+ i0.ɵɵconditional(ctx.SelectedUserRoles.length > 0 ? 12 : -1);
328
317
  i0.ɵɵadvance();
329
- i0.ɵɵconditional(ctx.IsLoadingPermissions ? 20 : !ctx.SelectedUserId ? 21 : ctx.DomainGroups.length === 0 ? 22 : 23);
330
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i3.LoadingComponent], styles: [".permissions-container[_ngcontent-%COMP%] {\n padding: 24px;\n max-width: 1080px;\n margin: 0 auto;\n height: 100%;\n overflow-y: auto;\n box-sizing: border-box;\n}\n\n\n\n.header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-icon[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.header-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.description[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 14px;\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n\n\n.tab-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 10px 16px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font: inherit;\n font-weight: 500;\n border-bottom: 2px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.selector-row.wrap[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n}\n\n.mj-input.mono[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, monospace);\n min-width: 300px;\n}\n\n.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.message[_ngcontent-%COMP%] {\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n}\n\n.error-message[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n\n\n.user-selector-row[_ngcontent-%COMP%], \n.selector-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.user-selector-label[_ngcontent-%COMP%], \n.selector-label[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n#user-select[_ngcontent-%COMP%], \n#domain-select[_ngcontent-%COMP%] {\n min-width: 320px;\n flex: 0 1 auto;\n}\n\n.roles-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 48px 16px;\n color: var(--mj-text-muted);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 12px;\n display: block;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n.total-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 13px;\n margin-bottom: 12px;\n}\n\n.total-summary[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n\n\n.domain-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.domain-group[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.domain-header[_ngcontent-%COMP%] {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: none;\n cursor: pointer;\n text-align: left;\n color: var(--mj-text-primary);\n font: inherit;\n}\n\n.domain-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.domain-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.domain-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.domain-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n}\n\n.domain-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.toggle-icon[_ngcontent-%COMP%] {\n transition: transform 0.15s ease;\n color: var(--mj-text-muted);\n}\n\n.toggle-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.domain-body[_ngcontent-%COMP%] {\n padding: 0;\n background: var(--mj-bg-surface);\n overflow-x: auto;\n}\n\n\n\n.perms-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.perms-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.perms-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 8px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.perms-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-weight: 600;\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.5px;\n}\n\n.perms-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.perms-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.resource-cell[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.resource-name[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.resource-id[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: var(--mj-font-mono, monospace);\n}\n\n\n\n.action-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.action-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n\n\n.effect-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.effect-allow[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.effect-deny[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}"] });
318
+ i0.ɵɵconditional(ctx.IsLoadingPermissions ? 13 : !ctx.SelectedUserId ? 14 : ctx.DomainGroups.length === 0 ? 15 : 16);
319
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJPageHeaderComponent, i2.MJPageLayoutComponent, i2.MJPageBodyComponent, i2.MJRefreshButtonComponent, i3.LoadingComponent], styles: ["\n\n.tab-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 10px 16px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font: inherit;\n font-weight: 500;\n border-bottom: 2px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.selector-row.wrap[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n}\n\n.mj-input.mono[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, monospace);\n min-width: 300px;\n}\n\n.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.message[_ngcontent-%COMP%] {\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n}\n\n.error-message[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n\n\n.user-selector-row[_ngcontent-%COMP%], \n.selector-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.user-selector-label[_ngcontent-%COMP%], \n.selector-label[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n#user-select[_ngcontent-%COMP%], \n#domain-select[_ngcontent-%COMP%] {\n min-width: 320px;\n flex: 0 1 auto;\n}\n\n.roles-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 48px 16px;\n color: var(--mj-text-muted);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 12px;\n display: block;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n.total-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 13px;\n margin-bottom: 12px;\n}\n\n.total-summary[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n\n\n.domain-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.domain-group[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.domain-header[_ngcontent-%COMP%] {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: none;\n cursor: pointer;\n text-align: left;\n color: var(--mj-text-primary);\n font: inherit;\n}\n\n.domain-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.domain-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.domain-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.domain-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n}\n\n.domain-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.toggle-icon[_ngcontent-%COMP%] {\n transition: transform 0.15s ease;\n color: var(--mj-text-muted);\n}\n\n.toggle-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.domain-body[_ngcontent-%COMP%] {\n padding: 0;\n background: var(--mj-bg-surface);\n overflow-x: auto;\n}\n\n\n\n.perms-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.perms-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.perms-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 8px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.perms-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-weight: 600;\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.5px;\n}\n\n.perms-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.perms-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.resource-cell[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.resource-name[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.resource-id[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: var(--mj-font-mono, monospace);\n}\n\n\n\n.action-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.action-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n\n\n.effect-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.effect-allow[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.effect-deny[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}"] });
331
320
  };
332
321
  PermissionsUserAccessResourceComponent = __decorate([
333
322
  RegisterClass(BaseResourceComponent, 'PermissionsUserAccessResource')
@@ -335,7 +324,7 @@ PermissionsUserAccessResourceComponent = __decorate([
335
324
  export { PermissionsUserAccessResourceComponent };
336
325
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PermissionsUserAccessResourceComponent, [{
337
326
  type: Component,
338
- args: [{ standalone: false, selector: 'mj-permissions-user-access-resource', template: "<div class=\"permissions-container\">\n <div class=\"header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-user header-icon\"></i>\n <h2 class=\"header-title\">User Access Report</h2>\n </div>\n <div class=\"header-actions\">\n <button mjButton variant=\"secondary\" (click)=\"loadUsers()\" [disabled]=\"IsLoadingUsers || IsLoadingPermissions\">\n <i class=\"fa-solid fa-arrows-rotate\" [class.fa-spin]=\"IsLoadingUsers\"></i> Refresh\n </button>\n </div>\n </div>\n\n <p class=\"description\">\n Select a user to see every resource they can access across all registered permission domains.\n </p>\n\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n\n <div class=\"selector-row\">\n <label class=\"selector-label\" for=\"user-select\">User:</label>\n <select\n id=\"user-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedUserId\"\n (ngModelChange)=\"OnUserChanged($event)\"\n [disabled]=\"IsLoadingUsers || IsLoadingPermissions\"\n >\n @for (user of Users; track user.ID) {\n <option [ngValue]=\"user.ID\">{{ user.Name }}{{ user.Email ? ' \u2014 ' + user.Email : '' }}</option>\n }\n </select>\n\n @if (SelectedUserRoles.length > 0) {\n <div class=\"roles-badge\" title=\"Roles assigned to this user\">\n <i class=\"fa-solid fa-user-tag\"></i>\n <span>{{ SelectedUserRoles.join(', ') }}</span>\n </div>\n }\n </div>\n\n @if (IsLoadingPermissions) {\n <mj-loading text=\"Loading permissions...\" size=\"medium\"></mj-loading>\n } @else if (!SelectedUserId) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>Select a user above to see their access report.</p>\n </div>\n } @else if (DomainGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>This user has no permissions granted in any domain.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ TotalCount }}</strong> permission{{ TotalCount === 1 ? '' : 's' }} across\n <strong>{{ DomainGroups.length }}</strong> domain{{ DomainGroups.length === 1 ? '' : 's' }}\n </div>\n\n <div class=\"domain-groups\">\n @for (group of DomainGroups; track TrackByDomain($index, group)) {\n <div class=\"domain-group\" [class.expanded]=\"group.Expanded\">\n <button type=\"button\" class=\"domain-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"domain-header-left\">\n <i [class]=\"group.Icon\" class=\"domain-icon\"></i>\n <span class=\"domain-name\">{{ group.DomainName }}</span>\n <span class=\"domain-count\">{{ group.Count }}</span>\n </div>\n <i class=\"fa-solid fa-chevron-down toggle-icon\" [class.rotated]=\"group.Expanded\"></i>\n </button>\n\n @if (group.Expanded) {\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Resource</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Rows; track TrackByPermission($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.ResourceName || row.ResourceID || '\u2014' }}</span>\n @if (row.ResourceID && row.ResourceName && row.ResourceName !== row.ResourceID) {\n <span class=\"resource-id\">{{ row.ResourceID }}</span>\n }\n </td>\n <td>{{ row.ResourceType }}</td>\n <td>\n <div class=\"action-chips\">\n @for (action of row.Actions; track action) {\n <span class=\"action-chip\">{{ action }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"effect-badge\" [class.effect-allow]=\"row.Effect === 'Allow'\" [class.effect-deny]=\"row.Effect === 'Deny'\">\n {{ row.Effect }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".permissions-container {\n padding: 24px;\n max-width: 1080px;\n margin: 0 auto;\n height: 100%;\n overflow-y: auto;\n box-sizing: border-box;\n}\n\n/* Header */\n.header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-icon {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.header-title {\n margin: 0;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.description {\n color: var(--mj-text-secondary);\n font-size: 14px;\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n/* Tab bar */\n.tab-bar {\n display: flex;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.tab {\n background: transparent;\n border: none;\n padding: 10px 16px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font: inherit;\n font-weight: 500;\n border-bottom: 2px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.tab:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.selector-row.wrap {\n flex-wrap: wrap;\n}\n\n.mj-input.mono {\n font-family: var(--mj-font-mono, monospace);\n min-width: 300px;\n}\n\n.muted {\n color: var(--mj-text-muted);\n}\n\n/* Messages */\n.message {\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n}\n\n.error-message {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n/* User selector (legacy name kept for User Access tab, plus generic selector-row for Resource tab) */\n.user-selector-row,\n.selector-row {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.user-selector-label,\n.selector-label {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n#user-select,\n#domain-select {\n min-width: 320px;\n flex: 0 1 auto;\n}\n\n.roles-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* Empty state */\n.empty-state {\n text-align: center;\n padding: 48px 16px;\n color: var(--mj-text-muted);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n.empty-state i {\n font-size: 32px;\n margin-bottom: 12px;\n display: block;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n.total-summary {\n color: var(--mj-text-secondary);\n font-size: 13px;\n margin-bottom: 12px;\n}\n\n.total-summary strong {\n color: var(--mj-text-primary);\n}\n\n/* Domain groups */\n.domain-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.domain-group {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.domain-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: none;\n cursor: pointer;\n text-align: left;\n color: var(--mj-text-primary);\n font: inherit;\n}\n\n.domain-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.domain-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.domain-icon {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.domain-name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.domain-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.toggle-icon {\n transition: transform 0.15s ease;\n color: var(--mj-text-muted);\n}\n\n.toggle-icon.rotated {\n transform: rotate(180deg);\n}\n\n.domain-body {\n padding: 0;\n background: var(--mj-bg-surface);\n overflow-x: auto;\n}\n\n/* Permissions table */\n.perms-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.perms-table th,\n.perms-table td {\n padding: 8px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.perms-table th {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-weight: 600;\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.5px;\n}\n\n.perms-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.perms-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.resource-cell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.resource-name {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.resource-id {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: var(--mj-font-mono, monospace);\n}\n\n/* Action chips */\n.action-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.action-chip {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n/* Effect badge */\n.effect-badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.effect-allow {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.effect-deny {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n"] }]
327
+ args: [{ standalone: false, selector: 'mj-permissions-user-access-resource', template: "<mj-page-layout>\n <mj-page-header\n Title=\"User Access Report\"\n Icon=\"fa-solid fa-user\"\n Subtitle=\"See every resource a user can access across all registered permission domains\">\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoadingUsers\" [Disabled]=\"IsLoadingPermissions\" (Clicked)=\"loadUsers()\"></mj-refresh-button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n\n <div class=\"selector-row\">\n <label class=\"selector-label\" for=\"user-select\">User:</label>\n <select\n id=\"user-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedUserId\"\n (ngModelChange)=\"OnUserChanged($event)\"\n [disabled]=\"IsLoadingUsers || IsLoadingPermissions\"\n >\n @for (user of Users; track user.ID) {\n <option [ngValue]=\"user.ID\">{{ user.Name }}{{ user.Email ? ' \u2014 ' + user.Email : '' }}</option>\n }\n </select>\n\n @if (SelectedUserRoles.length > 0) {\n <div class=\"roles-badge\" title=\"Roles assigned to this user\">\n <i class=\"fa-solid fa-user-tag\"></i>\n <span>{{ SelectedUserRoles.join(', ') }}</span>\n </div>\n }\n </div>\n\n @if (IsLoadingPermissions) {\n <mj-loading text=\"Loading permissions...\" size=\"medium\"></mj-loading>\n } @else if (!SelectedUserId) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>Select a user above to see their access report.</p>\n </div>\n } @else if (DomainGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>This user has no permissions granted in any domain.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ TotalCount }}</strong> permission{{ TotalCount === 1 ? '' : 's' }} across\n <strong>{{ DomainGroups.length }}</strong> domain{{ DomainGroups.length === 1 ? '' : 's' }}\n </div>\n\n <div class=\"domain-groups\">\n @for (group of DomainGroups; track TrackByDomain($index, group)) {\n <div class=\"domain-group\" [class.expanded]=\"group.Expanded\">\n <button type=\"button\" class=\"domain-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"domain-header-left\">\n <i [class]=\"group.Icon\" class=\"domain-icon\"></i>\n <span class=\"domain-name\">{{ group.DomainName }}</span>\n <span class=\"domain-count\">{{ group.Count }}</span>\n </div>\n <i class=\"fa-solid fa-chevron-down toggle-icon\" [class.rotated]=\"group.Expanded\"></i>\n </button>\n\n @if (group.Expanded) {\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Resource</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Rows; track TrackByPermission($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.ResourceName || row.ResourceID || '\u2014' }}</span>\n @if (row.ResourceID && row.ResourceName && row.ResourceName !== row.ResourceID) {\n <span class=\"resource-id\">{{ row.ResourceID }}</span>\n }\n </td>\n <td>{{ row.ResourceType }}</td>\n <td>\n <div class=\"action-chips\">\n @for (action of row.Actions; track action) {\n <span class=\"action-chip\">{{ action }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"effect-badge\" [class.effect-allow]=\"row.Effect === 'Allow'\" [class.effect-deny]=\"row.Effect === 'Deny'\">\n {{ row.Effect }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* Tab bar */\n.tab-bar {\n display: flex;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.tab {\n background: transparent;\n border: none;\n padding: 10px 16px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font: inherit;\n font-weight: 500;\n border-bottom: 2px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.tab:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.selector-row.wrap {\n flex-wrap: wrap;\n}\n\n.mj-input.mono {\n font-family: var(--mj-font-mono, monospace);\n min-width: 300px;\n}\n\n.muted {\n color: var(--mj-text-muted);\n}\n\n/* Messages */\n.message {\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n}\n\n.error-message {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n/* User selector (legacy name kept for User Access tab, plus generic selector-row for Resource tab) */\n.user-selector-row,\n.selector-row {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.user-selector-label,\n.selector-label {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n#user-select,\n#domain-select {\n min-width: 320px;\n flex: 0 1 auto;\n}\n\n.roles-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* Empty state */\n.empty-state {\n text-align: center;\n padding: 48px 16px;\n color: var(--mj-text-muted);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n.empty-state i {\n font-size: 32px;\n margin-bottom: 12px;\n display: block;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n.total-summary {\n color: var(--mj-text-secondary);\n font-size: 13px;\n margin-bottom: 12px;\n}\n\n.total-summary strong {\n color: var(--mj-text-primary);\n}\n\n/* Domain groups */\n.domain-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.domain-group {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.domain-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: none;\n cursor: pointer;\n text-align: left;\n color: var(--mj-text-primary);\n font: inherit;\n}\n\n.domain-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.domain-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.domain-icon {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.domain-name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.domain-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.toggle-icon {\n transition: transform 0.15s ease;\n color: var(--mj-text-muted);\n}\n\n.toggle-icon.rotated {\n transform: rotate(180deg);\n}\n\n.domain-body {\n padding: 0;\n background: var(--mj-bg-surface);\n overflow-x: auto;\n}\n\n/* Permissions table */\n.perms-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.perms-table th,\n.perms-table td {\n padding: 8px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.perms-table th {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-weight: 600;\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.5px;\n}\n\n.perms-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.perms-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.resource-cell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.resource-name {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.resource-id {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: var(--mj-font-mono, monospace);\n}\n\n/* Action chips */\n.action-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.action-chip {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n/* Effect badge */\n.effect-badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.effect-allow {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.effect-deny {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n"] }]
339
328
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
340
329
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PermissionsUserAccessResourceComponent, { className: "PermissionsUserAccessResourceComponent", filePath: "src/Permissions/user-access-resource.component.ts", lineNumber: 27 }); })();
341
330
  /** Tree-shaking prevention — referenced from `public-api.ts`. */
@@ -1 +1 @@
1
- {"version":3,"file":"user-access-resource.component.js","sourceRoot":"","sources":["../../src/Permissions/user-access-resource.component.ts","../../src/Permissions/user-access-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { Metadata, NormalizedPermission, PermissionAction } from '@memberjunction/core';\nimport { PermissionEngine, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\nimport {\n PermissionsDomainGroup,\n PermissionsUserOption,\n groupPermissionsByDomain,\n loadPermissionsUsers,\n resolvePermissionsUser,\n} from './permissions-shared';\n\n/**\n * User Access Report resource — one of three tabs in the Permissions admin application.\n * Lets an admin pick any user and see every resource that user has access to across\n * every registered permission domain. Powered by `PermissionEngine.GetAllUserPermissions`.\n */\n@RegisterClass(BaseResourceComponent, 'PermissionsUserAccessResource')\n@Component({\n standalone: false,\n selector: 'mj-permissions-user-access-resource',\n templateUrl: './user-access-resource.component.html',\n styleUrls: ['./permissions-resource.component.css'],\n})\nexport class PermissionsUserAccessResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n Users: PermissionsUserOption[] = [];\n SelectedUserId: string | null = null;\n SelectedUserRoles: string[] = [];\n DomainGroups: PermissionsDomainGroup[] = [];\n IsLoadingUsers = true;\n IsLoadingPermissions = false;\n ErrorMessage: string | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n override async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'User Access Report';\n }\n\n override async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-user';\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadUsers();\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async loadUsers(): Promise<void> {\n this.IsLoadingUsers = true;\n this.ErrorMessage = null;\n try {\n this.Users = await loadPermissionsUsers();\n const md = this.ProviderToUse;\n this.SelectedUserId = md.CurrentUser?.ID ?? null;\n if (this.SelectedUserId) {\n await this.loadPermissionsForSelectedUser();\n }\n } catch (e) {\n this.ErrorMessage = `Error loading users: ${e instanceof Error ? e.message : String(e)}`;\n }\n this.IsLoadingUsers = false;\n this.cdr.detectChanges();\n }\n\n async OnUserChanged(userId: string): Promise<void> {\n this.SelectedUserId = userId;\n await this.loadPermissionsForSelectedUser();\n }\n\n private async loadPermissionsForSelectedUser(): Promise<void> {\n this.IsLoadingPermissions = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n try {\n const user = await resolvePermissionsUser(this.SelectedUserId!, this.Users);\n if (!user) {\n this.ErrorMessage = 'Could not load roles for the selected user.';\n this.DomainGroups = [];\n this.IsLoadingPermissions = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.SelectedUserRoles = (user.UserRoles ?? []).map((ur) => ur.Role).filter((n): n is string => !!n);\n const rows = await PermissionEngine.Instance.GetAllUserPermissions(user);\n const orderMap = new Map<string, number>();\n for (const d of PermissionEngine.Instance.Domains) {\n orderMap.set(d.Name, d.DisplayOrder ?? 999);\n }\n this.DomainGroups = groupPermissionsByDomain(rows, orderMap);\n } catch (e) {\n this.ErrorMessage = `Error loading permissions: ${e instanceof Error ? e.message : String(e)}`;\n this.DomainGroups = [];\n }\n\n this.IsLoadingPermissions = false;\n this.cdr.detectChanges();\n }\n\n ToggleGroup(group: PermissionsDomainGroup): void {\n group.Expanded = !group.Expanded;\n this.cdr.detectChanges();\n }\n\n TrackByDomain(_index: number, group: PermissionsDomainGroup): string {\n return group.DomainName;\n }\n\n TrackByPermission(_index: number, row: NormalizedPermission): string {\n return row.SourceRecordID ?? `${row.DomainName}|${row.ResourceType}|${row.ResourceID ?? ''}|${row.GranteeID ?? ''}`;\n }\n\n ActionsLabel(actions: PermissionAction[]): string {\n return actions.join(', ');\n }\n\n get TotalCount(): number {\n return this.DomainGroups.reduce((sum, g) => sum + g.Count, 0);\n }\n}\n\n/** Tree-shaking prevention — referenced from `public-api.ts`. */\nexport function LoadPermissionsUserAccessResource(): void {\n // intentionally empty\n}\n","<div class=\"permissions-container\">\n <div class=\"header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-user header-icon\"></i>\n <h2 class=\"header-title\">User Access Report</h2>\n </div>\n <div class=\"header-actions\">\n <button mjButton variant=\"secondary\" (click)=\"loadUsers()\" [disabled]=\"IsLoadingUsers || IsLoadingPermissions\">\n <i class=\"fa-solid fa-arrows-rotate\" [class.fa-spin]=\"IsLoadingUsers\"></i> Refresh\n </button>\n </div>\n </div>\n\n <p class=\"description\">\n Select a user to see every resource they can access across all registered permission domains.\n </p>\n\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n\n <div class=\"selector-row\">\n <label class=\"selector-label\" for=\"user-select\">User:</label>\n <select\n id=\"user-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedUserId\"\n (ngModelChange)=\"OnUserChanged($event)\"\n [disabled]=\"IsLoadingUsers || IsLoadingPermissions\"\n >\n @for (user of Users; track user.ID) {\n <option [ngValue]=\"user.ID\">{{ user.Name }}{{ user.Email ? ' — ' + user.Email : '' }}</option>\n }\n </select>\n\n @if (SelectedUserRoles.length > 0) {\n <div class=\"roles-badge\" title=\"Roles assigned to this user\">\n <i class=\"fa-solid fa-user-tag\"></i>\n <span>{{ SelectedUserRoles.join(', ') }}</span>\n </div>\n }\n </div>\n\n @if (IsLoadingPermissions) {\n <mj-loading text=\"Loading permissions...\" size=\"medium\"></mj-loading>\n } @else if (!SelectedUserId) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>Select a user above to see their access report.</p>\n </div>\n } @else if (DomainGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>This user has no permissions granted in any domain.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ TotalCount }}</strong> permission{{ TotalCount === 1 ? '' : 's' }} across\n <strong>{{ DomainGroups.length }}</strong> domain{{ DomainGroups.length === 1 ? '' : 's' }}\n </div>\n\n <div class=\"domain-groups\">\n @for (group of DomainGroups; track TrackByDomain($index, group)) {\n <div class=\"domain-group\" [class.expanded]=\"group.Expanded\">\n <button type=\"button\" class=\"domain-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"domain-header-left\">\n <i [class]=\"group.Icon\" class=\"domain-icon\"></i>\n <span class=\"domain-name\">{{ group.DomainName }}</span>\n <span class=\"domain-count\">{{ group.Count }}</span>\n </div>\n <i class=\"fa-solid fa-chevron-down toggle-icon\" [class.rotated]=\"group.Expanded\"></i>\n </button>\n\n @if (group.Expanded) {\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Resource</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Rows; track TrackByPermission($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.ResourceName || row.ResourceID || '—' }}</span>\n @if (row.ResourceID && row.ResourceName && row.ResourceName !== row.ResourceID) {\n <span class=\"resource-id\">{{ row.ResourceID }}</span>\n }\n </td>\n <td>{{ row.ResourceType }}</td>\n <td>\n <div class=\"action-chips\">\n @for (action of row.Actions; track action) {\n <span class=\"action-chip\">{{ action }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"effect-badge\" [class.effect-allow]=\"row.Effect === 'Allow'\" [class.effect-deny]=\"row.Effect === 'Deny'\">\n {{ row.Effect }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"user-access-resource.component.js","sourceRoot":"","sources":["../../src/Permissions/user-access-resource.component.ts","../../src/Permissions/user-access-resource.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAqB,SAAS,EAAqB,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,gBAAgB,EAAgB,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAGH,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;;;;;;;ICC1B,8BAAmC;IACjC,wBAA8C;IAC9C,4BAAM;IAAA,YAAkB;IAC1B,AAD0B,iBAAO,EAC3B;;;IADE,eAAkB;IAAlB,yCAAkB;;;IActB,iCAA4B;IAAA,YAAyD;IAAA,iBAAS;;;IAAtF,oCAAmB;IAAC,cAAyD;IAAzD,4FAAyD;;;IAKvF,8BAA6D;IAC3D,wBAAoC;IACpC,4BAAM;IAAA,YAAkC;IAC1C,AAD0C,iBAAO,EAC3C;;;IADE,eAAkC;IAAlC,yDAAkC;;;IAM5C,gCAAqE;;;IAErE,+BAAyB;IACvB,wBAAsC;IACtC,yBAAG;IAAA,+DAA+C;IACpD,AADoD,iBAAI,EAClD;;;IAEN,+BAAyB;IACvB,wBAAuC;IACvC,yBAAG;IAAA,mEAAmD;IACxD,AADwD,iBAAI,EACtD;;;IAoCgB,gCAA0B;IAAA,YAAoB;IAAA,iBAAO;;;IAA3B,cAAoB;IAApB,uCAAoB;;;IAO5C,gCAA0B;IAAA,YAAY;IAAA,iBAAO;;;IAAnB,cAAY;IAAZ,+BAAY;;;IAT1C,AADF,AADF,0BAAI,aACwB,eACI;IAAA,YAA+C;IAAA,iBAAO;IAClF,oJAAiF;IAGnF,iBAAK;IACL,0BAAI;IAAA,YAAsB;IAAA,iBAAK;IAE7B,AADF,0BAAI,cACwB;IACxB,wKAEC;IAEL,AADE,iBAAM,EACH;IAEH,AADF,2BAAI,gBACmH;IACnH,aACF;IAEJ,AADE,AADE,iBAAO,EACJ,EACF;;;IAlB2B,eAA+C;IAA/C,0EAA+C;IAC3E,cAEC;IAFD,gHAEC;IAEC,eAAsB;IAAtB,yCAAsB;IAGtB,eAEC;IAFD,6BAEC;IAIwB,eAA6C;IAAC,AAA9C,yDAA6C,yCAA4C;IAClH,cACF;IADE,8CACF;;;IA1BJ,AADF,AADF,AADF,AADF,+BAAyB,gBACI,YAClB,SACD,SACE;IAAA,wBAAQ;IAAA,iBAAK;IACjB,0BAAI;IAAA,oBAAI;IAAA,iBAAK;IACb,0BAAI;IAAA,uBAAO;IAAA,iBAAK;IAChB,2BAAI;IAAA,uBAAM;IAEd,AADE,AADY,iBAAK,EACZ,EACC;IACR,8BAAO;IACL,uLAsBC;IAGP,AADE,AADE,iBAAQ,EACF,EACJ;;;IAzBA,gBAsBC;IAtBD,4BAsBC;;;;IA3CT,AADF,+BAA4D,iBACe;IAA7B,6OAAS,4BAAkB,KAAC;IACtE,+BAAgC;IAC9B,wBAAgD;IAChD,gCAA0B;IAAA,YAAsB;IAAA,iBAAO;IACvD,gCAA2B;IAAA,YAAiB;IAC9C,AAD8C,iBAAO,EAC/C;IACN,wBAAqF;IACvF,iBAAS;IAET,+HAAsB;IAuCxB,iBAAM;;;IAjDoB,6CAAiC;IAGlD,eAAoB;IAApB,4BAAoB;IACG,eAAsB;IAAtB,yCAAsB;IACrB,eAAiB;IAAjB,oCAAiB;IAEE,cAAgC;IAAhC,4CAAgC;IAGlF,cAsCC;IAtCD,4CAsCC;;;IAtDL,AADF,+BAA2B,aACjB;IAAA,YAAgB;IAAA,iBAAS;IAAC,YAClC;IAAA,8BAAQ;IAAA,YAAyB;IAAA,iBAAS;IAAC,YAC7C;IAAA,iBAAM;IAEN,+BAA2B;IACzB,4JAmDC;IACH,iBAAM;;;IAzDI,eAAgB;IAAhB,uCAAgB;IAAU,cAClC;IADkC,oFAClC;IAAQ,eAAyB;IAAzB,gDAAyB;IAAU,cAC7C;IAD6C,kFAC7C;IAGE,eAmDC;IAnDD,kCAmDC;;ADjGP;;;;GAIG;AAQI,IAAM,sCAAsC,GAA5C,MAAM,sCAAuC,SAAQ,qBAAqB;IASzD;IARpB,KAAK,GAA4B,EAAE,CAAC;IACpC,cAAc,GAAkB,IAAI,CAAC;IACrC,iBAAiB,GAAa,EAAE,CAAC;IACjC,YAAY,GAA6B,EAAE,CAAC;IAC5C,cAAc,GAAG,IAAI,CAAC;IACtB,oBAAoB,GAAG,KAAK,CAAC;IAC7B,YAAY,GAAkB,IAAI,CAAC;IAEnC,YAAoB,GAAsB;QACtC,KAAK,EAAE,CAAC;QADQ,QAAG,GAAH,GAAG,CAAmB;IAE1C,CAAC;IAEQ,KAAK,CAAC,sBAAsB,CAAC,KAAmB;QACrD,OAAO,oBAAoB,CAAC;IAChC,CAAC;IAEQ,KAAK,CAAC,oBAAoB,CAAC,KAAmB;QACnD,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEQ,KAAK,CAAC,QAAQ;QACnB,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAEQ,WAAW;QAChB,KAAK,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,SAAS;QACX,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,IAAI,CAAC;YACjD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;YAChD,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,wBAAwB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc;QAC9B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,8BAA8B;QACxC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,cAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,IAAI,CAAC,YAAY,GAAG,6CAA6C,CAAC;gBAClE,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;gBACvB,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;gBAClC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO;YACX,CAAC;YAED,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrG,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAChD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,CAAC,YAAY,GAAG,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,8BAA8B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,KAA6B;QACrC,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,aAAa,CAAC,MAAc,EAAE,KAA6B;QACvD,OAAO,KAAK,CAAC,UAAU,CAAC;IAC5B,CAAC;IAED,iBAAiB,CAAC,MAAc,EAAE,GAAyB;QACvD,OAAO,GAAG,CAAC,cAAc,IAAI,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;IACxH,CAAC;IAED,YAAY,CAAC,OAA2B;QACpC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;gIAvGQ,sCAAsC;6DAAtC,sCAAsC;YCpB7C,AADF,AAJF,AADF,sCAAgB,wBAI6E,aAC5E,2BAC6F;YAAxB,kIAAW,eAAW,IAAC;YAE3G,AADE,AAD0G,iBAAoB,EACxH,EACS;YAEjB,oCAAc;YAEd,wGAAoB;YAQlB,AADF,8BAA0B,eACwB;YAAA,qBAAK;YAAA,iBAAQ;YAC7D,iCAMC;YAFC,yIAAiB,yBAAqB,IAAC;YAGvC,8GAEC;YACH,iBAAS;YAET,0GAAoC;YAMtC,iBAAM;YAcJ,AALA,AALA,AAFF,iHAA4B,qFAEE,qFAKU,2EAK/B;YA8DX,AADE,iBAAe,EACA;;YA7GQ,eAA0B;YAAC,AAA3B,4CAA0B,sCAAkC;YAMnF,eAKC;YALD,2CAKC;YAOG,eAA0B;YAE1B,AAFA,4CAA0B,4DAEyB;YAEnD,cAEC;YAFD,wBAEC;YAGH,eAKC;YALD,4DAKC;YAGH,cAwEC;YAxED,oHAwEC;;;ADvFU,sCAAsC;IAPlD,aAAa,CAAC,qBAAqB,EAAE,+BAA+B,CAAC;GAOzD,sCAAsC,CAwGlD;;iFAxGY,sCAAsC;cANlD,SAAS;6BACM,KAAK,YACP,qCAAqC;;kFAItC,sCAAsC;AA0GnD,iEAAiE;AACjE,MAAM,UAAU,iCAAiC;IAC7C,sBAAsB;AAC1B,CAAC","sourcesContent":["import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { Metadata, NormalizedPermission, PermissionAction } from '@memberjunction/core';\nimport { PermissionEngine, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\nimport {\n PermissionsDomainGroup,\n PermissionsUserOption,\n groupPermissionsByDomain,\n loadPermissionsUsers,\n resolvePermissionsUser,\n} from './permissions-shared';\n\n/**\n * User Access Report resource — one of three tabs in the Permissions admin application.\n * Lets an admin pick any user and see every resource that user has access to across\n * every registered permission domain. Powered by `PermissionEngine.GetAllUserPermissions`.\n */\n@RegisterClass(BaseResourceComponent, 'PermissionsUserAccessResource')\n@Component({\n standalone: false,\n selector: 'mj-permissions-user-access-resource',\n templateUrl: './user-access-resource.component.html',\n styleUrls: ['./permissions-resource.component.css'],\n})\nexport class PermissionsUserAccessResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n Users: PermissionsUserOption[] = [];\n SelectedUserId: string | null = null;\n SelectedUserRoles: string[] = [];\n DomainGroups: PermissionsDomainGroup[] = [];\n IsLoadingUsers = true;\n IsLoadingPermissions = false;\n ErrorMessage: string | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n override async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'User Access Report';\n }\n\n override async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-user';\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadUsers();\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async loadUsers(): Promise<void> {\n this.IsLoadingUsers = true;\n this.ErrorMessage = null;\n try {\n this.Users = await loadPermissionsUsers();\n const md = this.ProviderToUse;\n this.SelectedUserId = md.CurrentUser?.ID ?? null;\n if (this.SelectedUserId) {\n await this.loadPermissionsForSelectedUser();\n }\n } catch (e) {\n this.ErrorMessage = `Error loading users: ${e instanceof Error ? e.message : String(e)}`;\n }\n this.IsLoadingUsers = false;\n this.cdr.detectChanges();\n }\n\n async OnUserChanged(userId: string): Promise<void> {\n this.SelectedUserId = userId;\n await this.loadPermissionsForSelectedUser();\n }\n\n private async loadPermissionsForSelectedUser(): Promise<void> {\n this.IsLoadingPermissions = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n try {\n const user = await resolvePermissionsUser(this.SelectedUserId!, this.Users);\n if (!user) {\n this.ErrorMessage = 'Could not load roles for the selected user.';\n this.DomainGroups = [];\n this.IsLoadingPermissions = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.SelectedUserRoles = (user.UserRoles ?? []).map((ur) => ur.Role).filter((n): n is string => !!n);\n const rows = await PermissionEngine.Instance.GetAllUserPermissions(user);\n const orderMap = new Map<string, number>();\n for (const d of PermissionEngine.Instance.Domains) {\n orderMap.set(d.Name, d.DisplayOrder ?? 999);\n }\n this.DomainGroups = groupPermissionsByDomain(rows, orderMap);\n } catch (e) {\n this.ErrorMessage = `Error loading permissions: ${e instanceof Error ? e.message : String(e)}`;\n this.DomainGroups = [];\n }\n\n this.IsLoadingPermissions = false;\n this.cdr.detectChanges();\n }\n\n ToggleGroup(group: PermissionsDomainGroup): void {\n group.Expanded = !group.Expanded;\n this.cdr.detectChanges();\n }\n\n TrackByDomain(_index: number, group: PermissionsDomainGroup): string {\n return group.DomainName;\n }\n\n TrackByPermission(_index: number, row: NormalizedPermission): string {\n return row.SourceRecordID ?? `${row.DomainName}|${row.ResourceType}|${row.ResourceID ?? ''}|${row.GranteeID ?? ''}`;\n }\n\n ActionsLabel(actions: PermissionAction[]): string {\n return actions.join(', ');\n }\n\n get TotalCount(): number {\n return this.DomainGroups.reduce((sum, g) => sum + g.Count, 0);\n }\n}\n\n/** Tree-shaking prevention — referenced from `public-api.ts`. */\nexport function LoadPermissionsUserAccessResource(): void {\n // intentionally empty\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"User Access Report\"\n Icon=\"fa-solid fa-user\"\n Subtitle=\"See every resource a user can access across all registered permission domains\">\n <div actions>\n <mj-refresh-button [Loading]=\"IsLoadingUsers\" [Disabled]=\"IsLoadingPermissions\" (Clicked)=\"loadUsers()\"></mj-refresh-button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n\n <div class=\"selector-row\">\n <label class=\"selector-label\" for=\"user-select\">User:</label>\n <select\n id=\"user-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedUserId\"\n (ngModelChange)=\"OnUserChanged($event)\"\n [disabled]=\"IsLoadingUsers || IsLoadingPermissions\"\n >\n @for (user of Users; track user.ID) {\n <option [ngValue]=\"user.ID\">{{ user.Name }}{{ user.Email ? ' — ' + user.Email : '' }}</option>\n }\n </select>\n\n @if (SelectedUserRoles.length > 0) {\n <div class=\"roles-badge\" title=\"Roles assigned to this user\">\n <i class=\"fa-solid fa-user-tag\"></i>\n <span>{{ SelectedUserRoles.join(', ') }}</span>\n </div>\n }\n </div>\n\n @if (IsLoadingPermissions) {\n <mj-loading text=\"Loading permissions...\" size=\"medium\"></mj-loading>\n } @else if (!SelectedUserId) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>Select a user above to see their access report.</p>\n </div>\n } @else if (DomainGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>This user has no permissions granted in any domain.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ TotalCount }}</strong> permission{{ TotalCount === 1 ? '' : 's' }} across\n <strong>{{ DomainGroups.length }}</strong> domain{{ DomainGroups.length === 1 ? '' : 's' }}\n </div>\n\n <div class=\"domain-groups\">\n @for (group of DomainGroups; track TrackByDomain($index, group)) {\n <div class=\"domain-group\" [class.expanded]=\"group.Expanded\">\n <button type=\"button\" class=\"domain-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"domain-header-left\">\n <i [class]=\"group.Icon\" class=\"domain-icon\"></i>\n <span class=\"domain-name\">{{ group.DomainName }}</span>\n <span class=\"domain-count\">{{ group.Count }}</span>\n </div>\n <i class=\"fa-solid fa-chevron-down toggle-icon\" [class.rotated]=\"group.Expanded\"></i>\n </button>\n\n @if (group.Expanded) {\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Resource</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Rows; track TrackByPermission($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.ResourceName || row.ResourceID || '—' }}</span>\n @if (row.ResourceID && row.ResourceName && row.ResourceName !== row.ResourceID) {\n <span class=\"resource-id\">{{ row.ResourceID }}</span>\n }\n </td>\n <td>{{ row.ResourceType }}</td>\n <td>\n <div class=\"action-chips\">\n @for (action of row.Actions; track action) {\n <span class=\"action-chip\">{{ action }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"effect-badge\" [class.effect-allow]=\"row.Effect === 'Allow'\" [class.effect-deny]=\"row.Effect === 'Deny'\">\n {{ row.Effect }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n"]}