@memberjunction/ng-dashboards 5.34.1 → 5.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +399 -292
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
  6. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  7. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  9. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +96 -0
  10. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/analytics/ai-analytics-resource.component.js +453 -122
  12. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  13. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
  14. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
  15. package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
  16. package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
  17. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
  18. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  19. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
  20. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  21. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
  22. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  23. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
  24. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  25. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
  27. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  28. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
  29. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
  31. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  32. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  33. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
  34. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  36. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
  37. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  40. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2084 -2079
  41. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  44. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  45. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  46. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  47. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  48. package/dist/AI/components/models/model-management.component.js +370 -425
  49. package/dist/AI/components/models/model-management.component.js.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  51. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  52. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  53. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  55. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  56. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  57. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  59. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  60. package/dist/AI/components/system/system-configuration.component.js +403 -362
  61. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  62. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  63. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/tags/tags-resource.component.js +1423 -1438
  65. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  66. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  67. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  69. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  70. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  71. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  72. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  73. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  74. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  75. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  76. package/dist/Actions/components/actions-overview.component.js +202 -158
  77. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  78. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  79. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  80. package/dist/Actions/components/execution-monitoring.component.js +191 -142
  81. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  82. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  83. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  84. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  85. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  86. package/dist/Actions/components/explorer/index.d.ts +0 -1
  87. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  88. package/dist/Actions/components/explorer/index.js +0 -1
  89. package/dist/Actions/components/explorer/index.js.map +1 -1
  90. package/dist/Admin/admin-data-schema.component.js +19 -79
  91. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  92. package/dist/Admin/admin-dev-tools-resource.component.js +19 -79
  93. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  94. package/dist/Admin/admin-identity-access.component.js +19 -79
  95. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  96. package/dist/Admin/admin-monitoring.component.js +19 -79
  97. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  98. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  99. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  100. package/dist/Admin/base-admin-container.component.js +26 -17
  101. package/dist/Admin/base-admin-container.component.js.map +1 -1
  102. package/dist/ApplicationRoles/application-roles-resource.component.js +92 -91
  103. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  104. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  105. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  106. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  107. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  108. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  109. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  110. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  111. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  112. package/dist/Communication/communication-logs-resource.component.js +80 -99
  113. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  114. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  115. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  116. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  117. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  118. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  119. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  120. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  121. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  122. package/dist/Communication/communication-providers-resource.component.js +44 -45
  123. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  124. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  125. package/dist/Communication/communication-runs-resource.component.js +60 -58
  126. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  127. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  128. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  129. package/dist/Communication/communication-templates-resource.component.js +139 -162
  130. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  131. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  132. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  133. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  134. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  135. package/dist/Credentials/components/credentials-categories-resource.component.js +238 -266
  136. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  137. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  138. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  139. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  140. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  141. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  142. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  143. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  144. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  145. package/dist/Credentials/components/credentials-types-resource.component.js +290 -305
  146. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  147. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  148. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  149. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +41 -21
  150. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  151. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  152. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  153. package/dist/DatabaseDesigner/components/entity-list.component.js +148 -155
  154. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  155. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  156. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  157. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +25 -1
  158. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  159. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  160. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  161. package/dist/DevTools/app-state-inspector.component.js +46 -72
  162. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  163. package/dist/DevTools/class-registry.component.js +88 -100
  164. package/dist/DevTools/class-registry.component.js.map +1 -1
  165. package/dist/DevTools/event-monitor.component.js +158 -168
  166. package/dist/DevTools/event-monitor.component.js.map +1 -1
  167. package/dist/DevTools/graphql-console.component.js +257 -264
  168. package/dist/DevTools/graphql-console.component.js.map +1 -1
  169. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  170. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  171. package/dist/DevTools/layout-inspector.component.js +46 -64
  172. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  173. package/dist/DevTools/lazy-module-status.component.js +75 -84
  174. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  175. package/dist/DevTools/settings-explorer.component.js +76 -85
  176. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  177. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  178. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  179. package/dist/EntityAdmin/entity-admin-dashboard.component.js +24 -16
  180. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  181. package/dist/Home/home-dashboard.component.d.ts +6 -0
  182. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  183. package/dist/Home/home-dashboard.component.js +521 -485
  184. package/dist/Home/home-dashboard.component.js.map +1 -1
  185. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  186. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  187. package/dist/Integration/components/activity/activity.component.js +307 -318
  188. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  189. package/dist/Integration/components/connections/connections.component.js +654 -648
  190. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  191. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  192. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  193. package/dist/Integration/components/overview/overview.component.js +182 -163
  194. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  195. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  196. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  197. package/dist/Integration/components/pipelines/pipelines.component.js +595 -606
  198. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  199. package/dist/Integration/components/schedules/schedules.component.js +230 -241
  200. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  201. package/dist/Integration/integration.module.d.ts +1 -1
  202. package/dist/Integration/integration.module.d.ts.map +1 -1
  203. package/dist/Integration/integration.module.js +28 -1
  204. package/dist/Integration/integration.module.js.map +1 -1
  205. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  206. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  207. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1138 -1147
  208. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  209. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  210. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  211. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  212. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  213. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +684 -697
  214. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  215. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  216. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  217. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  218. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  219. package/dist/Lists/components/lists-browse-resource.component.d.ts +120 -1
  220. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  221. package/dist/Lists/components/lists-browse-resource.component.js +1239 -610
  222. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  223. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  224. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  225. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  226. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  227. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  228. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  229. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  230. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  231. package/dist/Lists/components/lists-operations-resource.component.js +1460 -272
  232. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  233. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  234. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  235. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  236. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  237. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  238. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  239. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  240. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  241. package/dist/Lists/index.d.ts +1 -0
  242. package/dist/Lists/index.d.ts.map +1 -1
  243. package/dist/Lists/index.js +1 -0
  244. package/dist/Lists/index.js.map +1 -1
  245. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  246. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  247. package/dist/Lists/services/list-set-operations.service.js +236 -10
  248. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  249. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  250. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  251. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  252. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  253. package/dist/MCP/mcp.module.d.ts +1 -1
  254. package/dist/MCP/mcp.module.d.ts.map +1 -1
  255. package/dist/MCP/mcp.module.js +34 -1
  256. package/dist/MCP/mcp.module.js.map +1 -1
  257. package/dist/Permissions/audit-log-resource.component.js +76 -85
  258. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  259. package/dist/Permissions/resource-access-resource.component.js +64 -69
  260. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  261. package/dist/Permissions/user-access-resource.component.js +63 -74
  262. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  263. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  264. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  265. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  266. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  267. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  268. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  269. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  270. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  271. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  272. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  273. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  274. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  275. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  276. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  277. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  278. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  279. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  280. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  281. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  282. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  283. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  284. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  285. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  286. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  287. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  288. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  289. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  290. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  291. package/dist/Scheduling/scheduling-dashboard.component.js +259 -103
  292. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  293. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  294. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  295. package/dist/SystemDiagnostics/system-diagnostics.component.js +1009 -1264
  296. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  297. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  298. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  299. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  300. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  301. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  302. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  303. package/dist/Testing/components/testing-analytics.component.js +420 -393
  304. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  305. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  306. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  307. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  308. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  309. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  310. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  311. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  312. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  313. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  314. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  315. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  316. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  317. package/dist/Testing/components/testing-explorer.component.d.ts +38 -6
  318. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  319. package/dist/Testing/components/testing-explorer.component.js +679 -786
  320. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  321. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  322. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  323. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  324. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  325. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  326. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  327. package/dist/Testing/components/testing-review.component.js +310 -274
  328. package/dist/Testing/components/testing-review.component.js.map +1 -1
  329. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  330. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  331. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  332. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  333. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  334. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  335. package/dist/Testing/components/testing-runs.component.js +307 -273
  336. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  337. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  338. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  339. package/dist/Testing/testing-dashboard.component.js +114 -99
  340. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  341. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  342. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  343. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  344. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  345. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  346. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  347. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  348. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  349. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  350. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  351. package/dist/actions-dashboards.module.d.ts +15 -16
  352. package/dist/actions-dashboards.module.d.ts.map +1 -1
  353. package/dist/actions-dashboards.module.js +34 -11
  354. package/dist/actions-dashboards.module.js.map +1 -1
  355. package/dist/ai-dashboards.module.d.ts +45 -48
  356. package/dist/ai-dashboards.module.d.ts.map +1 -1
  357. package/dist/ai-dashboards.module.js +51 -10
  358. package/dist/ai-dashboards.module.js.map +1 -1
  359. package/dist/archiving-dashboards.module.d.ts +2 -1
  360. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  361. package/dist/archiving-dashboards.module.js +12 -2
  362. package/dist/archiving-dashboards.module.js.map +1 -1
  363. package/dist/communication-dashboards.module.d.ts +9 -6
  364. package/dist/communication-dashboards.module.d.ts.map +1 -1
  365. package/dist/communication-dashboards.module.js +37 -7
  366. package/dist/communication-dashboards.module.js.map +1 -1
  367. package/dist/core-dashboards.module.d.ts +1 -1
  368. package/dist/core-dashboards.module.d.ts.map +1 -1
  369. package/dist/core-dashboards.module.js +46 -1
  370. package/dist/core-dashboards.module.js.map +1 -1
  371. package/dist/credentials-dashboards.module.d.ts +1 -1
  372. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  373. package/dist/credentials-dashboards.module.js +28 -1
  374. package/dist/credentials-dashboards.module.js.map +1 -1
  375. package/dist/lists-dashboards.module.d.ts +10 -9
  376. package/dist/lists-dashboards.module.d.ts.map +1 -1
  377. package/dist/lists-dashboards.module.js +40 -2
  378. package/dist/lists-dashboards.module.js.map +1 -1
  379. package/dist/public-api.d.ts +3 -2
  380. package/dist/public-api.d.ts.map +1 -1
  381. package/dist/public-api.js +4 -3
  382. package/dist/public-api.js.map +1 -1
  383. package/dist/scheduling-dashboards.module.d.ts +1 -1
  384. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  385. package/dist/scheduling-dashboards.module.js +31 -1
  386. package/dist/scheduling-dashboards.module.js.map +1 -1
  387. package/dist/testing-dashboards.module.d.ts +8 -7
  388. package/dist/testing-dashboards.module.d.ts.map +1 -1
  389. package/dist/testing-dashboards.module.js +42 -0
  390. package/dist/testing-dashboards.module.js.map +1 -1
  391. package/package.json +53 -52
  392. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  393. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  394. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  395. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  396. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  397. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  398. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  399. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  400. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  401. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  402. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  403. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  404. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  405. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  406. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  407. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -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":";;;;;;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;;;;;;;ICM1B,8BAAmC;IACjC,wBAA8C;IAC9C,4BAAM;IAAA,YAAkB;IAC1B,AAD0B,iBAAO,EAC3B;;;IADE,eAAkB;IAAlB,yCAAkB;;;IActB,kCAA4B;IAAA,YAAyD;IAAA,iBAAS;;;IAAtF,oCAAmB;IAAC,cAAyD;IAAzD,4FAAyD;;;IAKvF,+BAA6D;IAC3D,wBAAoC;IACpC,4BAAM;IAAA,YAAkC;IAC1C,AAD0C,iBAAO,EAC3C;;;IADE,eAAkC;IAAlC,yDAAkC;;;IAM5C,iCAAqE;;;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;;ADtGP;;;;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;YCxB/C,AADF,AADF,8BAAmC,aACb,aACO;YACvB,uBAA4C;YAC5C,6BAAyB;YAAA,kCAAkB;YAC7C,AAD6C,iBAAK,EAC5C;YAEJ,AADF,8BAA4B,gBACqF;YAA1E,mHAAS,eAAW,IAAC;YACxD,uBAA0E;YAAC,yBAC7E;YAEJ,AADE,AADE,iBAAS,EACL,EACF;YAEN,6BAAuB;YACrB,gHACF;YAAA,iBAAI;YAEJ,0GAAoB;YAQlB,AADF,gCAA0B,iBACwB;YAAA,sBAAK;YAAA,iBAAQ;YAC7D,mCAMC;YAFC,0IAAiB,yBAAqB,IAAC;YAGvC,+GAEC;YACH,iBAAS;YAET,2GAAoC;YAMtC,iBAAM;YAcJ,AALA,AALA,AAFF,kHAA4B,qFAEE,qFAKU,2EAK/B;YA6DX,iBAAM;;YAhH2D,eAAmD;YAAnD,yEAAmD;YACvE,cAAgC;YAAhC,6CAAgC;YAS3E,eAKC;YALD,4CAKC;YAOG,eAA0B;YAE1B,AAFA,4CAA0B,4DAEyB;YAEnD,cAEC;YAFD,wBAEC;YAGH,eAKC;YALD,4DAKC;YAGH,cAwEC;YAxED,oHAwEC;;;AD5FU,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","<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":"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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","<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"]}