@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 i2 from "@memberjunction/ng-ui-components";
14
14
  import * as i3 from "@memberjunction/ng-shared-generic";
15
15
  import * as i4 from "@angular/common";
16
16
  const _forTrack0 = ($index, $item) => $item.ID;
17
- function PermissionsResourceAccessResourceComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
18
- i0.ɵɵelementStart(0, "div", 6);
19
- i0.ɵɵelement(1, "i", 18);
17
+ function PermissionsResourceAccessResourceComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
18
+ i0.ɵɵelementStart(0, "div", 1);
19
+ i0.ɵɵelement(1, "i", 13);
20
20
  i0.ɵɵelementStart(2, "span");
21
21
  i0.ɵɵtext(3);
22
22
  i0.ɵɵelementEnd()();
@@ -25,8 +25,8 @@ function PermissionsResourceAccessResourceComponent_Conditional_8_Template(rf, c
25
25
  i0.ɵɵadvance(3);
26
26
  i0.ɵɵtextInterpolate(ctx_r0.ErrorMessage);
27
27
  } }
28
- function PermissionsResourceAccessResourceComponent_For_14_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelementStart(0, "option", 10);
28
+ function PermissionsResourceAccessResourceComponent_For_9_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelementStart(0, "option", 5);
30
30
  i0.ɵɵtext(1);
31
31
  i0.ɵɵelementEnd();
32
32
  } if (rf & 2) {
@@ -35,27 +35,27 @@ function PermissionsResourceAccessResourceComponent_For_14_Template(rf, ctx) { i
35
35
  i0.ɵɵadvance();
36
36
  i0.ɵɵtextInterpolate(d_r2.Name);
37
37
  } }
38
- function PermissionsResourceAccessResourceComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
39
- i0.ɵɵelement(0, "i", 19);
38
+ function PermissionsResourceAccessResourceComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
39
+ i0.ɵɵelement(0, "i", 14);
40
40
  i0.ɵɵtext(1, " Looking up... ");
41
41
  } }
42
- function PermissionsResourceAccessResourceComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
43
- i0.ɵɵelement(0, "i", 20);
42
+ function PermissionsResourceAccessResourceComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
43
+ i0.ɵɵelement(0, "i", 15);
44
44
  i0.ɵɵtext(1, " Lookup ");
45
45
  } }
46
- function PermissionsResourceAccessResourceComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
47
- i0.ɵɵelement(0, "mj-loading", 16);
46
+ function PermissionsResourceAccessResourceComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
47
+ i0.ɵɵelement(0, "mj-loading", 11);
48
48
  } }
49
- function PermissionsResourceAccessResourceComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
50
- i0.ɵɵelementStart(0, "div", 17);
51
- i0.ɵɵelement(1, "i", 21);
49
+ function PermissionsResourceAccessResourceComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelementStart(0, "div", 12);
51
+ i0.ɵɵelement(1, "i", 16);
52
52
  i0.ɵɵelementStart(2, "p");
53
53
  i0.ɵɵtext(3, "Pick a domain and enter a resource type + ID, then press Lookup to see who has access.");
54
54
  i0.ɵɵelementEnd()();
55
55
  } }
56
- function PermissionsResourceAccessResourceComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
57
- i0.ɵɵelementStart(0, "div", 17);
58
- i0.ɵɵelement(1, "i", 22);
56
+ function PermissionsResourceAccessResourceComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
57
+ i0.ɵɵelementStart(0, "div", 12);
58
+ i0.ɵɵelement(1, "i", 17);
59
59
  i0.ɵɵelementStart(2, "p");
60
60
  i0.ɵɵtext(3, "No grantees found for ");
61
61
  i0.ɵɵelementStart(4, "strong");
@@ -68,8 +68,8 @@ function PermissionsResourceAccessResourceComponent_Conditional_26_Template(rf,
68
68
  i0.ɵɵadvance(5);
69
69
  i0.ɵɵtextInterpolate(ctx_r0.LastQueryLabel);
70
70
  } }
71
- function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
72
- i0.ɵɵelementStart(0, "span", 28);
71
+ function PermissionsResourceAccessResourceComponent_Conditional_22_For_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
72
+ i0.ɵɵelementStart(0, "span", 23);
73
73
  i0.ɵɵtext(1);
74
74
  i0.ɵɵelementEnd();
75
75
  } if (rf & 2) {
@@ -77,8 +77,8 @@ function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Condit
77
77
  i0.ɵɵadvance();
78
78
  i0.ɵɵtextInterpolate(row_r3.GranteeID);
79
79
  } }
80
- function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_For_10_Template(rf, ctx) { if (rf & 1) {
81
- i0.ɵɵelementStart(0, "span", 30);
80
+ function PermissionsResourceAccessResourceComponent_Conditional_22_For_22_For_10_Template(rf, ctx) { if (rf & 1) {
81
+ i0.ɵɵelementStart(0, "span", 25);
82
82
  i0.ɵɵtext(1);
83
83
  i0.ɵɵelementEnd();
84
84
  } if (rf & 2) {
@@ -86,7 +86,7 @@ function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_For_10
86
86
  i0.ɵɵadvance();
87
87
  i0.ɵɵtextInterpolate(action_r4);
88
88
  } }
89
- function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Conditional_15_Template(rf, ctx) { if (rf & 1) {
89
+ function PermissionsResourceAccessResourceComponent_Conditional_22_For_22_Conditional_15_Template(rf, ctx) { if (rf & 1) {
90
90
  i0.ɵɵelementStart(0, "span");
91
91
  i0.ɵɵtext(1);
92
92
  i0.ɵɵpipe(2, "date");
@@ -96,28 +96,28 @@ function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Condit
96
96
  i0.ɵɵadvance();
97
97
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, row_r3.ExpiresAt, "short"));
98
98
  } }
99
- function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Conditional_16_Template(rf, ctx) { if (rf & 1) {
100
- i0.ɵɵelementStart(0, "span", 32);
99
+ function PermissionsResourceAccessResourceComponent_Conditional_22_For_22_Conditional_16_Template(rf, ctx) { if (rf & 1) {
100
+ i0.ɵɵelementStart(0, "span", 27);
101
101
  i0.ɵɵtext(1, "\u2014");
102
102
  i0.ɵɵelementEnd();
103
103
  } }
104
- function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Template(rf, ctx) { if (rf & 1) {
105
- i0.ɵɵelementStart(0, "tr")(1, "td", 26)(2, "span", 27);
104
+ function PermissionsResourceAccessResourceComponent_Conditional_22_For_22_Template(rf, ctx) { if (rf & 1) {
105
+ i0.ɵɵelementStart(0, "tr")(1, "td", 21)(2, "span", 22);
106
106
  i0.ɵɵtext(3);
107
107
  i0.ɵɵelementEnd();
108
- i0.ɵɵconditionalCreate(4, PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Conditional_4_Template, 2, 1, "span", 28);
108
+ i0.ɵɵconditionalCreate(4, PermissionsResourceAccessResourceComponent_Conditional_22_For_22_Conditional_4_Template, 2, 1, "span", 23);
109
109
  i0.ɵɵelementEnd();
110
110
  i0.ɵɵelementStart(5, "td");
111
111
  i0.ɵɵtext(6);
112
112
  i0.ɵɵelementEnd();
113
- i0.ɵɵelementStart(7, "td")(8, "div", 29);
114
- i0.ɵɵrepeaterCreate(9, PermissionsResourceAccessResourceComponent_Conditional_27_For_22_For_10_Template, 2, 1, "span", 30, i0.ɵɵrepeaterTrackByIdentity);
113
+ i0.ɵɵelementStart(7, "td")(8, "div", 24);
114
+ i0.ɵɵrepeaterCreate(9, PermissionsResourceAccessResourceComponent_Conditional_22_For_22_For_10_Template, 2, 1, "span", 25, i0.ɵɵrepeaterTrackByIdentity);
115
115
  i0.ɵɵelementEnd()();
116
- i0.ɵɵelementStart(11, "td")(12, "span", 31);
116
+ i0.ɵɵelementStart(11, "td")(12, "span", 26);
117
117
  i0.ɵɵtext(13);
118
118
  i0.ɵɵelementEnd()();
119
119
  i0.ɵɵelementStart(14, "td");
120
- i0.ɵɵconditionalCreate(15, PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Conditional_15_Template, 3, 4, "span")(16, PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Conditional_16_Template, 2, 0, "span", 32);
120
+ i0.ɵɵconditionalCreate(15, PermissionsResourceAccessResourceComponent_Conditional_22_For_22_Conditional_15_Template, 3, 4, "span")(16, PermissionsResourceAccessResourceComponent_Conditional_22_For_22_Conditional_16_Template, 2, 0, "span", 27);
121
121
  i0.ɵɵelementEnd()();
122
122
  } if (rf & 2) {
123
123
  const row_r3 = ctx.$implicit;
@@ -136,15 +136,15 @@ function PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Templa
136
136
  i0.ɵɵadvance(2);
137
137
  i0.ɵɵconditional(row_r3.ExpiresAt ? 15 : 16);
138
138
  } }
139
- function PermissionsResourceAccessResourceComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
140
- i0.ɵɵelementStart(0, "div", 23)(1, "strong");
139
+ function PermissionsResourceAccessResourceComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
140
+ i0.ɵɵelementStart(0, "div", 18)(1, "strong");
141
141
  i0.ɵɵtext(2);
142
142
  i0.ɵɵelementEnd();
143
143
  i0.ɵɵtext(3);
144
144
  i0.ɵɵelementStart(4, "strong");
145
145
  i0.ɵɵtext(5);
146
146
  i0.ɵɵelementEnd()();
147
- i0.ɵɵelementStart(6, "div", 24)(7, "table", 25)(8, "thead")(9, "tr")(10, "th");
147
+ i0.ɵɵelementStart(6, "div", 19)(7, "table", 20)(8, "thead")(9, "tr")(10, "th");
148
148
  i0.ɵɵtext(11, "Grantee");
149
149
  i0.ɵɵelementEnd();
150
150
  i0.ɵɵelementStart(12, "th");
@@ -160,7 +160,7 @@ function PermissionsResourceAccessResourceComponent_Conditional_27_Template(rf,
160
160
  i0.ɵɵtext(19, "Expires");
161
161
  i0.ɵɵelementEnd()()();
162
162
  i0.ɵɵelementStart(20, "tbody");
163
- i0.ɵɵrepeaterCreate(21, PermissionsResourceAccessResourceComponent_Conditional_27_For_22_Template, 17, 9, "tr", null, i0.ɵɵcomponentInstance().TrackByResourceRow, true);
163
+ i0.ɵɵrepeaterCreate(21, PermissionsResourceAccessResourceComponent_Conditional_22_For_22_Template, 17, 9, "tr", null, i0.ɵɵcomponentInstance().TrackByResourceRow, true);
164
164
  i0.ɵɵelementEnd()()();
165
165
  } if (rf & 2) {
166
166
  const ctx_r0 = i0.ɵɵnextContext();
@@ -270,44 +270,39 @@ let PermissionsResourceAccessResourceComponent = class PermissionsResourceAccess
270
270
  return row.SourceRecordID ?? `${row.GranteeType}|${row.GranteeID ?? ''}`;
271
271
  }
272
272
  static ɵfac = function PermissionsResourceAccessResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PermissionsResourceAccessResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
273
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PermissionsResourceAccessResourceComponent, selectors: [["mj-permissions-resource-access-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 28, vars: 14, consts: [[1, "permissions-container"], [1, "header"], [1, "header-left"], [1, "fa-solid", "fa-cube", "header-icon"], [1, "header-title"], [1, "description"], [1, "message", "error-message"], [1, "selector-row", "wrap"], ["for", "domain-select", 1, "selector-label"], ["id", "domain-select", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"], [3, "ngValue"], ["for", "rtype-input", 1, "selector-label"], ["id", "rtype-input", "Placeholder", "Select or type a resource type", 3, "ngModelChange", "Data", "ValuePrimitive", "Filterable", "AllowCustom", "Disabled", "ngModel"], ["for", "rid-input", 1, "selector-label"], ["id", "rid-input", "placeholder", "UUID or record ID", 1, "mj-input", "mono", 3, "ngModelChange", "ngModel", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["text", "Looking up grantees...", "size", "medium"], [1, "empty-state"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-cube"], [1, "fa-solid", "fa-user-slash"], [1, "total-summary"], [1, "domain-body"], [1, "perms-table"], [1, "resource-cell"], [1, "resource-name"], [1, "resource-id"], [1, "action-chips"], [1, "action-chip"], [1, "effect-badge"], [1, "muted"]], template: function PermissionsResourceAccessResourceComponent_Template(rf, ctx) { if (rf & 1) {
274
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
275
- i0.ɵɵelement(3, "i", 3);
276
- i0.ɵɵelementStart(4, "h2", 4);
277
- i0.ɵɵtext(5, "Resource Access Report");
278
- i0.ɵɵelementEnd()()();
279
- i0.ɵɵelementStart(6, "p", 5);
280
- i0.ɵɵtext(7, " Look up every grantee for a specific resource. Pick a permission domain, supply the resource type and the resource's ID, then press Lookup. ");
281
- i0.ɵɵelementEnd();
282
- i0.ɵɵconditionalCreate(8, PermissionsResourceAccessResourceComponent_Conditional_8_Template, 4, 1, "div", 6);
283
- i0.ɵɵelementStart(9, "div", 7)(10, "label", 8);
284
- i0.ɵɵtext(11, "Domain:");
273
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PermissionsResourceAccessResourceComponent, selectors: [["mj-permissions-resource-access-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 23, vars: 14, consts: [["Title", "Resource Access Report", "Icon", "fa-solid fa-cube", "Subtitle", "Look up every grantee for a specific resource"], [1, "message", "error-message"], [1, "selector-row", "wrap"], ["for", "domain-select", 1, "selector-label"], ["id", "domain-select", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"], [3, "ngValue"], ["for", "rtype-input", 1, "selector-label"], ["id", "rtype-input", "Placeholder", "Select or type a resource type", 3, "ngModelChange", "Data", "ValuePrimitive", "Filterable", "AllowCustom", "Disabled", "ngModel"], ["for", "rid-input", 1, "selector-label"], ["id", "rid-input", "placeholder", "UUID or record ID", 1, "mj-input", "mono", 3, "ngModelChange", "ngModel", "disabled"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["text", "Looking up grantees...", "size", "medium"], [1, "empty-state"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-cube"], [1, "fa-solid", "fa-user-slash"], [1, "total-summary"], [1, "domain-body"], [1, "perms-table"], [1, "resource-cell"], [1, "resource-name"], [1, "resource-id"], [1, "action-chips"], [1, "action-chip"], [1, "effect-badge"], [1, "muted"]], template: function PermissionsResourceAccessResourceComponent_Template(rf, ctx) { if (rf & 1) {
274
+ i0.ɵɵelementStart(0, "mj-page-layout");
275
+ i0.ɵɵelement(1, "mj-page-header", 0);
276
+ i0.ɵɵelementStart(2, "mj-page-body");
277
+ i0.ɵɵconditionalCreate(3, PermissionsResourceAccessResourceComponent_Conditional_3_Template, 4, 1, "div", 1);
278
+ i0.ɵɵelementStart(4, "div", 2)(5, "label", 3);
279
+ i0.ɵɵtext(6, "Domain:");
285
280
  i0.ɵɵelementEnd();
286
- i0.ɵɵelementStart(12, "select", 9);
287
- i0.ɵɵlistener("ngModelChange", function PermissionsResourceAccessResourceComponent_Template_select_ngModelChange_12_listener($event) { return ctx.OnDomainChanged($event); });
288
- i0.ɵɵrepeaterCreate(13, PermissionsResourceAccessResourceComponent_For_14_Template, 2, 2, "option", 10, _forTrack0);
281
+ i0.ɵɵelementStart(7, "select", 4);
282
+ i0.ɵɵlistener("ngModelChange", function PermissionsResourceAccessResourceComponent_Template_select_ngModelChange_7_listener($event) { return ctx.OnDomainChanged($event); });
283
+ i0.ɵɵrepeaterCreate(8, PermissionsResourceAccessResourceComponent_For_9_Template, 2, 2, "option", 5, _forTrack0);
289
284
  i0.ɵɵelementEnd();
290
- i0.ɵɵelementStart(15, "label", 11);
291
- i0.ɵɵtext(16, "Resource Type:");
285
+ i0.ɵɵelementStart(10, "label", 6);
286
+ i0.ɵɵtext(11, "Resource Type:");
292
287
  i0.ɵɵelementEnd();
293
- i0.ɵɵelementStart(17, "mj-combobox", 12);
294
- i0.ɵɵtwoWayListener("ngModelChange", function PermissionsResourceAccessResourceComponent_Template_mj_combobox_ngModelChange_17_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.ResourceTypeInput, $event) || (ctx.ResourceTypeInput = $event); return $event; });
288
+ i0.ɵɵelementStart(12, "mj-combobox", 7);
289
+ i0.ɵɵtwoWayListener("ngModelChange", function PermissionsResourceAccessResourceComponent_Template_mj_combobox_ngModelChange_12_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.ResourceTypeInput, $event) || (ctx.ResourceTypeInput = $event); return $event; });
295
290
  i0.ɵɵelementEnd();
296
- i0.ɵɵelementStart(18, "label", 13);
297
- i0.ɵɵtext(19, "Resource ID:");
291
+ i0.ɵɵelementStart(13, "label", 8);
292
+ i0.ɵɵtext(14, "Resource ID:");
298
293
  i0.ɵɵelementEnd();
299
- i0.ɵɵelementStart(20, "input", 14);
300
- i0.ɵɵtwoWayListener("ngModelChange", function PermissionsResourceAccessResourceComponent_Template_input_ngModelChange_20_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.ResourceIdInput, $event) || (ctx.ResourceIdInput = $event); return $event; });
294
+ i0.ɵɵelementStart(15, "input", 9);
295
+ i0.ɵɵtwoWayListener("ngModelChange", function PermissionsResourceAccessResourceComponent_Template_input_ngModelChange_15_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.ResourceIdInput, $event) || (ctx.ResourceIdInput = $event); return $event; });
301
296
  i0.ɵɵelementEnd();
302
- i0.ɵɵelementStart(21, "button", 15);
303
- i0.ɵɵlistener("click", function PermissionsResourceAccessResourceComponent_Template_button_click_21_listener() { return ctx.OnLookupResource(); });
304
- i0.ɵɵconditionalCreate(22, PermissionsResourceAccessResourceComponent_Conditional_22_Template, 2, 0)(23, PermissionsResourceAccessResourceComponent_Conditional_23_Template, 2, 0);
297
+ i0.ɵɵelementStart(16, "button", 10);
298
+ i0.ɵɵlistener("click", function PermissionsResourceAccessResourceComponent_Template_button_click_16_listener() { return ctx.OnLookupResource(); });
299
+ i0.ɵɵconditionalCreate(17, PermissionsResourceAccessResourceComponent_Conditional_17_Template, 2, 0)(18, PermissionsResourceAccessResourceComponent_Conditional_18_Template, 2, 0);
300
+ i0.ɵɵelementEnd()();
301
+ i0.ɵɵconditionalCreate(19, PermissionsResourceAccessResourceComponent_Conditional_19_Template, 1, 0, "mj-loading", 11)(20, PermissionsResourceAccessResourceComponent_Conditional_20_Template, 4, 0, "div", 12)(21, PermissionsResourceAccessResourceComponent_Conditional_21_Template, 7, 1, "div", 12)(22, PermissionsResourceAccessResourceComponent_Conditional_22_Template, 23, 3);
305
302
  i0.ɵɵelementEnd()();
306
- i0.ɵɵconditionalCreate(24, PermissionsResourceAccessResourceComponent_Conditional_24_Template, 1, 0, "mj-loading", 16)(25, PermissionsResourceAccessResourceComponent_Conditional_25_Template, 4, 0, "div", 17)(26, PermissionsResourceAccessResourceComponent_Conditional_26_Template, 7, 1, "div", 17)(27, PermissionsResourceAccessResourceComponent_Conditional_27_Template, 23, 3);
307
- i0.ɵɵelementEnd();
308
303
  } if (rf & 2) {
309
- i0.ɵɵadvance(8);
310
- i0.ɵɵconditional(ctx.ErrorMessage ? 8 : -1);
304
+ i0.ɵɵadvance(3);
305
+ i0.ɵɵconditional(ctx.ErrorMessage ? 3 : -1);
311
306
  i0.ɵɵadvance(4);
312
307
  i0.ɵɵproperty("ngModel", ctx.SelectedDomainName)("disabled", ctx.IsLoading);
313
308
  i0.ɵɵadvance();
@@ -321,10 +316,10 @@ let PermissionsResourceAccessResourceComponent = class PermissionsResourceAccess
321
316
  i0.ɵɵadvance();
322
317
  i0.ɵɵproperty("disabled", ctx.IsLoading);
323
318
  i0.ɵɵadvance();
324
- i0.ɵɵconditional(ctx.IsLoading ? 22 : 23);
319
+ i0.ɵɵconditional(ctx.IsLoading ? 17 : 18);
325
320
  i0.ɵɵadvance(2);
326
- i0.ɵɵconditional(ctx.IsLoading ? 24 : !ctx.LastQueryLabel ? 25 : ctx.ResourceAccessRows.length === 0 ? 26 : 27);
327
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i2.MJComboboxComponent, i3.LoadingComponent, i4.DatePipe], 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}"] });
321
+ i0.ɵɵconditional(ctx.IsLoading ? 19 : !ctx.LastQueryLabel ? 20 : ctx.ResourceAccessRows.length === 0 ? 21 : 22);
322
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i2.MJComboboxComponent, i2.MJPageHeaderComponent, i2.MJPageLayoutComponent, i2.MJPageBodyComponent, i3.LoadingComponent, i4.DatePipe], 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}"] });
328
323
  };
329
324
  PermissionsResourceAccessResourceComponent = __decorate([
330
325
  RegisterClass(BaseResourceComponent, 'PermissionsResourceAccessResource')
@@ -332,7 +327,7 @@ PermissionsResourceAccessResourceComponent = __decorate([
332
327
  export { PermissionsResourceAccessResourceComponent };
333
328
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PermissionsResourceAccessResourceComponent, [{
334
329
  type: Component,
335
- args: [{ standalone: false, selector: 'mj-permissions-resource-access-resource', template: "<div class=\"permissions-container\">\n <div class=\"header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-cube header-icon\"></i>\n <h2 class=\"header-title\">Resource Access Report</h2>\n </div>\n </div>\n\n <p class=\"description\">\n Look up every grantee for a specific resource. Pick a permission domain, supply the resource\n type and the resource's ID, then press Lookup.\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 wrap\">\n <label class=\"selector-label\" for=\"domain-select\">Domain:</label>\n <select\n id=\"domain-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedDomainName\"\n (ngModelChange)=\"OnDomainChanged($event)\"\n [disabled]=\"IsLoading\"\n >\n @for (d of Domains; track d.ID) {\n <option [ngValue]=\"d.Name\">{{ d.Name }}</option>\n }\n </select>\n\n <label class=\"selector-label\" for=\"rtype-input\">Resource Type:</label>\n <mj-combobox\n id=\"rtype-input\"\n [Data]=\"ResourceTypes\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n [AllowCustom]=\"true\"\n Placeholder=\"Select or type a resource type\"\n [Disabled]=\"IsLoading || !SelectedDomainName\"\n [(ngModel)]=\"ResourceTypeInput\">\n </mj-combobox>\n\n <label class=\"selector-label\" for=\"rid-input\">Resource ID:</label>\n <input\n id=\"rid-input\"\n class=\"mj-input mono\"\n placeholder=\"UUID or record ID\"\n [(ngModel)]=\"ResourceIdInput\"\n [disabled]=\"IsLoading\"\n />\n\n <button\n mjButton\n variant=\"primary\"\n (click)=\"OnLookupResource()\"\n [disabled]=\"IsLoading\"\n >\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Looking up...\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i> Lookup\n }\n </button>\n </div>\n\n @if (IsLoading) {\n <mj-loading text=\"Looking up grantees...\" size=\"medium\"></mj-loading>\n } @else if (!LastQueryLabel) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cube\"></i>\n <p>Pick a domain and enter a resource type + ID, then press Lookup to see who has access.</p>\n </div>\n } @else if (ResourceAccessRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>No grantees found for <strong>{{ LastQueryLabel }}</strong>.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ ResourceAccessRows.length }}</strong> grantee{{ ResourceAccessRows.length === 1 ? '' : 's' }}\n on <strong>{{ LastQueryLabel }}</strong>\n </div>\n\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Grantee</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n <th>Expires</th>\n </tr>\n </thead>\n <tbody>\n @for (row of ResourceAccessRows; track TrackByResourceRow($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.GranteeName || row.GranteeID || row.GranteeType }}</span>\n @if (row.GranteeID && row.GranteeName && row.GranteeName !== row.GranteeID) {\n <span class=\"resource-id\">{{ row.GranteeID }}</span>\n }\n </td>\n <td>{{ row.GranteeType }}</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 <td>\n @if (row.ExpiresAt) {\n <span>{{ row.ExpiresAt | date:'short' }}</span>\n } @else {\n <span class=\"muted\">\u2014</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\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"] }]
330
+ args: [{ standalone: false, selector: 'mj-permissions-resource-access-resource', template: "<mj-page-layout>\n <mj-page-header\n Title=\"Resource Access Report\"\n Icon=\"fa-solid fa-cube\"\n Subtitle=\"Look up every grantee for a specific resource\">\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 wrap\">\n <label class=\"selector-label\" for=\"domain-select\">Domain:</label>\n <select\n id=\"domain-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedDomainName\"\n (ngModelChange)=\"OnDomainChanged($event)\"\n [disabled]=\"IsLoading\"\n >\n @for (d of Domains; track d.ID) {\n <option [ngValue]=\"d.Name\">{{ d.Name }}</option>\n }\n </select>\n\n <label class=\"selector-label\" for=\"rtype-input\">Resource Type:</label>\n <mj-combobox\n id=\"rtype-input\"\n [Data]=\"ResourceTypes\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n [AllowCustom]=\"true\"\n Placeholder=\"Select or type a resource type\"\n [Disabled]=\"IsLoading || !SelectedDomainName\"\n [(ngModel)]=\"ResourceTypeInput\">\n </mj-combobox>\n\n <label class=\"selector-label\" for=\"rid-input\">Resource ID:</label>\n <input\n id=\"rid-input\"\n class=\"mj-input mono\"\n placeholder=\"UUID or record ID\"\n [(ngModel)]=\"ResourceIdInput\"\n [disabled]=\"IsLoading\"\n />\n\n <button\n mjButton\n variant=\"primary\"\n (click)=\"OnLookupResource()\"\n [disabled]=\"IsLoading\"\n >\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Looking up...\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i> Lookup\n }\n </button>\n </div>\n\n @if (IsLoading) {\n <mj-loading text=\"Looking up grantees...\" size=\"medium\"></mj-loading>\n } @else if (!LastQueryLabel) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cube\"></i>\n <p>Pick a domain and enter a resource type + ID, then press Lookup to see who has access.</p>\n </div>\n } @else if (ResourceAccessRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>No grantees found for <strong>{{ LastQueryLabel }}</strong>.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ ResourceAccessRows.length }}</strong> grantee{{ ResourceAccessRows.length === 1 ? '' : 's' }}\n on <strong>{{ LastQueryLabel }}</strong>\n </div>\n\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Grantee</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n <th>Expires</th>\n </tr>\n </thead>\n <tbody>\n @for (row of ResourceAccessRows; track TrackByResourceRow($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.GranteeName || row.GranteeID || row.GranteeType }}</span>\n @if (row.GranteeID && row.GranteeName && row.GranteeName !== row.GranteeID) {\n <span class=\"resource-id\">{{ row.GranteeID }}</span>\n }\n </td>\n <td>{{ row.GranteeType }}</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 <td>\n @if (row.ExpiresAt) {\n <span>{{ row.ExpiresAt | date:'short' }}</span>\n } @else {\n <span class=\"muted\">\u2014</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\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"] }]
336
331
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
337
332
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PermissionsResourceAccessResourceComponent, { className: "PermissionsResourceAccessResourceComponent", filePath: "src/Permissions/resource-access-resource.component.ts", lineNumber: 20 }); })();
338
333
  /** Tree-shaking prevention — referenced from `public-api.ts`. */
@@ -1 +1 @@
1
- {"version":3,"file":"resource-access-resource.component.js","sourceRoot":"","sources":["../../src/Permissions/resource-access-resource.component.ts","../../src/Permissions/resource-access-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { NormalizedPermission } from '@memberjunction/core';\nimport { MJPermissionDomainEntity, PermissionEngine, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\n/**\n * Resource Access Report resource — one of three tabs in the Permissions admin application.\n * Given a (domain, resource type, resource ID) triple, lists every grantee on that resource\n * with their effective actions, effect (Allow/Deny), and optional expiration.\n * Powered by `PermissionEngine.GetResourcePermissions`.\n */\n@RegisterClass(BaseResourceComponent, 'PermissionsResourceAccessResource')\n@Component({\n standalone: false,\n selector: 'mj-permissions-resource-access-resource',\n templateUrl: './resource-access-resource.component.html',\n styleUrls: ['./permissions-resource.component.css'],\n})\nexport class PermissionsResourceAccessResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n Domains: MJPermissionDomainEntity[] = [];\n SelectedDomainName: string | null = null;\n /** Auto-populated whenever the selected domain changes. Empty = adapter doesn't enumerate its types. */\n ResourceTypes: string[] = [];\n ResourceTypeInput = '';\n ResourceIdInput = '';\n ResourceAccessRows: NormalizedPermission[] = [];\n IsLoading = false;\n LastQueryLabel: string | null = null;\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 'Resource Access Report';\n }\n\n override async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-cube';\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n this.Domains = PermissionEngine.Instance.Domains;\n if (this.Domains.length > 0) {\n this.SelectedDomainName = this.Domains[0].Name;\n this.loadResourceTypesForDomain(this.SelectedDomainName);\n }\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async OnLookupResource(): Promise<void> {\n if (!this.SelectedDomainName) {\n this.ErrorMessage = 'Pick a permission domain first.';\n return;\n }\n if (!this.ResourceTypeInput.trim() || !this.ResourceIdInput.trim()) {\n this.ErrorMessage = 'Resource type and resource ID are both required.';\n return;\n }\n\n this.ErrorMessage = null;\n this.IsLoading = true;\n this.ResourceAccessRows = [];\n this.LastQueryLabel = null;\n this.cdr.detectChanges();\n\n try {\n const rows = await PermissionEngine.Instance.GetResourcePermissions(\n this.SelectedDomainName,\n this.ResourceTypeInput.trim(),\n this.ResourceIdInput.trim()\n );\n this.ResourceAccessRows = rows.sort((a, b) =>\n (a.GranteeName ?? '').localeCompare(b.GranteeName ?? '')\n );\n this.LastQueryLabel = `${this.SelectedDomainName} / ${this.ResourceTypeInput.trim()} / ${this.ResourceIdInput.trim()}`;\n } catch (e) {\n this.ErrorMessage = `Error looking up resource: ${e instanceof Error ? e.message : String(e)}`;\n }\n\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n\n OnDomainChanged(domainName: string): void {\n this.SelectedDomainName = domainName;\n this.loadResourceTypesForDomain(domainName);\n this.ResourceAccessRows = [];\n this.LastQueryLabel = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Populate {@link ResourceTypes} from the provider behind `domainName`. If the\n * current `ResourceTypeInput` isn't a member of the new list, clear it — the\n * previous choice doesn't make sense against a different domain. When a\n * domain has exactly one supported type we auto-select it so the user\n * doesn't have to open the picker for a trivial choice.\n */\n private loadResourceTypesForDomain(domainName: string | null): void {\n if (!domainName) {\n this.ResourceTypes = [];\n this.ResourceTypeInput = '';\n return;\n }\n this.ResourceTypes = PermissionEngine.Instance.GetResourceTypes(domainName, this.ProviderToUse);\n if (this.ResourceTypes.length === 1) {\n this.ResourceTypeInput = this.ResourceTypes[0];\n } else if (!this.ResourceTypes.includes(this.ResourceTypeInput)) {\n this.ResourceTypeInput = '';\n }\n }\n\n TrackByResourceRow(_index: number, row: NormalizedPermission): string {\n return row.SourceRecordID ?? `${row.GranteeType}|${row.GranteeID ?? ''}`;\n }\n}\n\n/** Tree-shaking prevention — referenced from `public-api.ts`. */\nexport function LoadPermissionsResourceAccessResource(): 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-cube header-icon\"></i>\n <h2 class=\"header-title\">Resource Access Report</h2>\n </div>\n </div>\n\n <p class=\"description\">\n Look up every grantee for a specific resource. Pick a permission domain, supply the resource\n type and the resource's ID, then press Lookup.\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 wrap\">\n <label class=\"selector-label\" for=\"domain-select\">Domain:</label>\n <select\n id=\"domain-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedDomainName\"\n (ngModelChange)=\"OnDomainChanged($event)\"\n [disabled]=\"IsLoading\"\n >\n @for (d of Domains; track d.ID) {\n <option [ngValue]=\"d.Name\">{{ d.Name }}</option>\n }\n </select>\n\n <label class=\"selector-label\" for=\"rtype-input\">Resource Type:</label>\n <mj-combobox\n id=\"rtype-input\"\n [Data]=\"ResourceTypes\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n [AllowCustom]=\"true\"\n Placeholder=\"Select or type a resource type\"\n [Disabled]=\"IsLoading || !SelectedDomainName\"\n [(ngModel)]=\"ResourceTypeInput\">\n </mj-combobox>\n\n <label class=\"selector-label\" for=\"rid-input\">Resource ID:</label>\n <input\n id=\"rid-input\"\n class=\"mj-input mono\"\n placeholder=\"UUID or record ID\"\n [(ngModel)]=\"ResourceIdInput\"\n [disabled]=\"IsLoading\"\n />\n\n <button\n mjButton\n variant=\"primary\"\n (click)=\"OnLookupResource()\"\n [disabled]=\"IsLoading\"\n >\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Looking up...\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i> Lookup\n }\n </button>\n </div>\n\n @if (IsLoading) {\n <mj-loading text=\"Looking up grantees...\" size=\"medium\"></mj-loading>\n } @else if (!LastQueryLabel) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cube\"></i>\n <p>Pick a domain and enter a resource type + ID, then press Lookup to see who has access.</p>\n </div>\n } @else if (ResourceAccessRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>No grantees found for <strong>{{ LastQueryLabel }}</strong>.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ ResourceAccessRows.length }}</strong> grantee{{ ResourceAccessRows.length === 1 ? '' : 's' }}\n on <strong>{{ LastQueryLabel }}</strong>\n </div>\n\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Grantee</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n <th>Expires</th>\n </tr>\n </thead>\n <tbody>\n @for (row of ResourceAccessRows; track TrackByResourceRow($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.GranteeName || row.GranteeID || row.GranteeType }}</span>\n @if (row.GranteeID && row.GranteeName && row.GranteeName !== row.GranteeID) {\n <span class=\"resource-id\">{{ row.GranteeID }}</span>\n }\n </td>\n <td>{{ row.GranteeType }}</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 <td>\n @if (row.ExpiresAt) {\n <span>{{ row.ExpiresAt | date:'short' }}</span>\n } @else {\n <span class=\"muted\">—</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"resource-access-resource.component.js","sourceRoot":"","sources":["../../src/Permissions/resource-access-resource.component.ts","../../src/Permissions/resource-access-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { NormalizedPermission } from '@memberjunction/core';\nimport { MJPermissionDomainEntity, PermissionEngine, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\n/**\n * Resource Access Report resource — one of three tabs in the Permissions admin application.\n * Given a (domain, resource type, resource ID) triple, lists every grantee on that resource\n * with their effective actions, effect (Allow/Deny), and optional expiration.\n * Powered by `PermissionEngine.GetResourcePermissions`.\n */\n@RegisterClass(BaseResourceComponent, 'PermissionsResourceAccessResource')\n@Component({\n standalone: false,\n selector: 'mj-permissions-resource-access-resource',\n templateUrl: './resource-access-resource.component.html',\n styleUrls: ['./permissions-resource.component.css'],\n})\nexport class PermissionsResourceAccessResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n Domains: MJPermissionDomainEntity[] = [];\n SelectedDomainName: string | null = null;\n /** Auto-populated whenever the selected domain changes. Empty = adapter doesn't enumerate its types. */\n ResourceTypes: string[] = [];\n ResourceTypeInput = '';\n ResourceIdInput = '';\n ResourceAccessRows: NormalizedPermission[] = [];\n IsLoading = false;\n LastQueryLabel: string | null = null;\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 'Resource Access Report';\n }\n\n override async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-cube';\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n this.Domains = PermissionEngine.Instance.Domains;\n if (this.Domains.length > 0) {\n this.SelectedDomainName = this.Domains[0].Name;\n this.loadResourceTypesForDomain(this.SelectedDomainName);\n }\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async OnLookupResource(): Promise<void> {\n if (!this.SelectedDomainName) {\n this.ErrorMessage = 'Pick a permission domain first.';\n return;\n }\n if (!this.ResourceTypeInput.trim() || !this.ResourceIdInput.trim()) {\n this.ErrorMessage = 'Resource type and resource ID are both required.';\n return;\n }\n\n this.ErrorMessage = null;\n this.IsLoading = true;\n this.ResourceAccessRows = [];\n this.LastQueryLabel = null;\n this.cdr.detectChanges();\n\n try {\n const rows = await PermissionEngine.Instance.GetResourcePermissions(\n this.SelectedDomainName,\n this.ResourceTypeInput.trim(),\n this.ResourceIdInput.trim()\n );\n this.ResourceAccessRows = rows.sort((a, b) =>\n (a.GranteeName ?? '').localeCompare(b.GranteeName ?? '')\n );\n this.LastQueryLabel = `${this.SelectedDomainName} / ${this.ResourceTypeInput.trim()} / ${this.ResourceIdInput.trim()}`;\n } catch (e) {\n this.ErrorMessage = `Error looking up resource: ${e instanceof Error ? e.message : String(e)}`;\n }\n\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n\n OnDomainChanged(domainName: string): void {\n this.SelectedDomainName = domainName;\n this.loadResourceTypesForDomain(domainName);\n this.ResourceAccessRows = [];\n this.LastQueryLabel = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Populate {@link ResourceTypes} from the provider behind `domainName`. If the\n * current `ResourceTypeInput` isn't a member of the new list, clear it — the\n * previous choice doesn't make sense against a different domain. When a\n * domain has exactly one supported type we auto-select it so the user\n * doesn't have to open the picker for a trivial choice.\n */\n private loadResourceTypesForDomain(domainName: string | null): void {\n if (!domainName) {\n this.ResourceTypes = [];\n this.ResourceTypeInput = '';\n return;\n }\n this.ResourceTypes = PermissionEngine.Instance.GetResourceTypes(domainName, this.ProviderToUse);\n if (this.ResourceTypes.length === 1) {\n this.ResourceTypeInput = this.ResourceTypes[0];\n } else if (!this.ResourceTypes.includes(this.ResourceTypeInput)) {\n this.ResourceTypeInput = '';\n }\n }\n\n TrackByResourceRow(_index: number, row: NormalizedPermission): string {\n return row.SourceRecordID ?? `${row.GranteeType}|${row.GranteeID ?? ''}`;\n }\n}\n\n/** Tree-shaking prevention — referenced from `public-api.ts`. */\nexport function LoadPermissionsResourceAccessResource(): void {\n // intentionally empty\n}\n","<mj-page-layout>\n <mj-page-header\n Title=\"Resource Access Report\"\n Icon=\"fa-solid fa-cube\"\n Subtitle=\"Look up every grantee for a specific resource\">\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 wrap\">\n <label class=\"selector-label\" for=\"domain-select\">Domain:</label>\n <select\n id=\"domain-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedDomainName\"\n (ngModelChange)=\"OnDomainChanged($event)\"\n [disabled]=\"IsLoading\"\n >\n @for (d of Domains; track d.ID) {\n <option [ngValue]=\"d.Name\">{{ d.Name }}</option>\n }\n </select>\n\n <label class=\"selector-label\" for=\"rtype-input\">Resource Type:</label>\n <mj-combobox\n id=\"rtype-input\"\n [Data]=\"ResourceTypes\"\n [ValuePrimitive]=\"true\"\n [Filterable]=\"true\"\n [AllowCustom]=\"true\"\n Placeholder=\"Select or type a resource type\"\n [Disabled]=\"IsLoading || !SelectedDomainName\"\n [(ngModel)]=\"ResourceTypeInput\">\n </mj-combobox>\n\n <label class=\"selector-label\" for=\"rid-input\">Resource ID:</label>\n <input\n id=\"rid-input\"\n class=\"mj-input mono\"\n placeholder=\"UUID or record ID\"\n [(ngModel)]=\"ResourceIdInput\"\n [disabled]=\"IsLoading\"\n />\n\n <button\n mjButton\n variant=\"primary\"\n (click)=\"OnLookupResource()\"\n [disabled]=\"IsLoading\"\n >\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Looking up...\n } @else {\n <i class=\"fa-solid fa-magnifying-glass\"></i> Lookup\n }\n </button>\n </div>\n\n @if (IsLoading) {\n <mj-loading text=\"Looking up grantees...\" size=\"medium\"></mj-loading>\n } @else if (!LastQueryLabel) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cube\"></i>\n <p>Pick a domain and enter a resource type + ID, then press Lookup to see who has access.</p>\n </div>\n } @else if (ResourceAccessRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>No grantees found for <strong>{{ LastQueryLabel }}</strong>.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ ResourceAccessRows.length }}</strong> grantee{{ ResourceAccessRows.length === 1 ? '' : 's' }}\n on <strong>{{ LastQueryLabel }}</strong>\n </div>\n\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Grantee</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n <th>Expires</th>\n </tr>\n </thead>\n <tbody>\n @for (row of ResourceAccessRows; track TrackByResourceRow($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.GranteeName || row.GranteeID || row.GranteeType }}</span>\n @if (row.GranteeID && row.GranteeName && row.GranteeName !== row.GranteeID) {\n <span class=\"resource-id\">{{ row.GranteeID }}</span>\n }\n </td>\n <td>{{ row.GranteeType }}</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 <td>\n @if (row.ExpiresAt) {\n <span>{{ row.ExpiresAt | date:'short' }}</span>\n } @else {\n <span class=\"muted\">—</span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </mj-page-body>\n</mj-page-layout>\n"]}