@memberjunction/ng-dashboards 5.34.1 → 5.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +399 -292
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
  6. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  7. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  9. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
  10. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
  12. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  13. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
  14. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
  15. package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
  16. package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
  17. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
  18. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  19. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
  20. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  21. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
  22. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  23. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
  24. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  25. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
  27. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  28. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
  29. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
  31. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  32. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  33. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
  34. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  36. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
  37. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  41. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  45. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  46. package/dist/AI/components/models/model-management.component.js +370 -425
  47. package/dist/AI/components/models/model-management.component.js.map +1 -1
  48. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  49. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  51. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  52. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  53. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  55. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  56. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  57. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.js +403 -362
  59. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  60. package/dist/AI/components/tags/tags-resource.component.js +781 -783
  61. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  62. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  67. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  68. package/dist/Actions/components/actions-overview.component.js +79 -30
  69. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  70. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  71. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  72. package/dist/Actions/components/execution-monitoring.component.js +196 -142
  73. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  74. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  75. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  76. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  77. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  78. package/dist/Actions/components/explorer/index.d.ts +0 -1
  79. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  80. package/dist/Actions/components/explorer/index.js +0 -1
  81. package/dist/Actions/components/explorer/index.js.map +1 -1
  82. package/dist/Admin/admin-data-schema.component.js +32 -40
  83. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  84. package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
  85. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  86. package/dist/Admin/admin-identity-access.component.js +32 -40
  87. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  88. package/dist/Admin/admin-monitoring.component.js +32 -40
  89. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  90. package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
  91. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  92. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  93. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  94. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  95. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  96. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  97. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  98. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  99. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  100. package/dist/Communication/communication-logs-resource.component.js +80 -99
  101. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  102. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  103. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  104. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  105. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  106. package/dist/Communication/communication-providers-resource.component.js +44 -45
  107. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  108. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  109. package/dist/Communication/communication-runs-resource.component.js +60 -58
  110. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  111. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  112. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  113. package/dist/Communication/communication-templates-resource.component.js +139 -162
  114. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  115. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  116. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  117. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  118. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  119. package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
  120. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  121. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  122. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  123. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  124. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  125. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  126. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  127. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  128. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  129. package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
  130. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  131. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  132. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  133. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
  134. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  135. package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
  136. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  137. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  138. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  139. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
  140. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  141. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
  142. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  143. package/dist/Home/home-dashboard.component.d.ts +6 -0
  144. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  145. package/dist/Home/home-dashboard.component.js +521 -485
  146. package/dist/Home/home-dashboard.component.js.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  148. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  149. package/dist/Integration/components/activity/activity.component.js +309 -318
  150. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  151. package/dist/Integration/components/connections/connections.component.js +866 -847
  152. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.js +182 -163
  156. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  157. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.js +241 -241
  162. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  163. package/dist/Integration/integration.module.d.ts +1 -1
  164. package/dist/Integration/integration.module.d.ts.map +1 -1
  165. package/dist/Integration/integration.module.js +28 -1
  166. package/dist/Integration/integration.module.js.map +1 -1
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
  168. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  171. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  173. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  174. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  175. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  177. package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
  178. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  179. package/dist/Lists/components/lists-browse-resource.component.js +486 -532
  180. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  181. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  182. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  183. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  184. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  185. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  186. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  187. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  188. package/dist/Lists/components/lists-operations-resource.component.js +234 -246
  189. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  190. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  191. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  192. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  193. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  194. package/dist/MCP/mcp.module.d.ts +1 -1
  195. package/dist/MCP/mcp.module.d.ts.map +1 -1
  196. package/dist/MCP/mcp.module.js +34 -1
  197. package/dist/MCP/mcp.module.js.map +1 -1
  198. package/dist/Permissions/audit-log-resource.component.js +76 -85
  199. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  200. package/dist/Permissions/resource-access-resource.component.js +64 -69
  201. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  202. package/dist/Permissions/user-access-resource.component.js +63 -74
  203. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  204. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  205. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  206. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  207. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  208. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  209. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  210. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  211. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  213. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  217. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  218. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  219. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  220. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  221. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  222. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  223. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  224. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  225. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  226. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  227. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  228. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  229. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  230. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  231. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  232. package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
  233. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  234. package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
  235. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  236. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  237. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  238. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  239. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  240. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  241. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  242. package/dist/Testing/components/testing-analytics.component.js +420 -393
  243. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  244. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  245. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  246. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  247. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  248. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  249. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  250. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  251. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  252. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  253. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  254. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  255. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  256. package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
  257. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  258. package/dist/Testing/components/testing-explorer.component.js +587 -608
  259. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  260. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  261. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  262. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  263. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  264. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  265. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  266. package/dist/Testing/components/testing-review.component.js +310 -274
  267. package/dist/Testing/components/testing-review.component.js.map +1 -1
  268. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  269. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  270. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  271. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  272. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  273. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  274. package/dist/Testing/components/testing-runs.component.js +307 -273
  275. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  276. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  277. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  278. package/dist/Testing/testing-dashboard.component.js +107 -93
  279. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  280. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  281. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  282. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  283. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  284. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  285. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  286. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  287. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  288. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  289. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  290. package/dist/actions-dashboards.module.d.ts +15 -16
  291. package/dist/actions-dashboards.module.d.ts.map +1 -1
  292. package/dist/actions-dashboards.module.js +34 -11
  293. package/dist/actions-dashboards.module.js.map +1 -1
  294. package/dist/ai-dashboards.module.d.ts +45 -48
  295. package/dist/ai-dashboards.module.d.ts.map +1 -1
  296. package/dist/ai-dashboards.module.js +36 -10
  297. package/dist/ai-dashboards.module.js.map +1 -1
  298. package/dist/archiving-dashboards.module.d.ts +2 -1
  299. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  300. package/dist/archiving-dashboards.module.js +12 -2
  301. package/dist/archiving-dashboards.module.js.map +1 -1
  302. package/dist/communication-dashboards.module.d.ts +2 -1
  303. package/dist/communication-dashboards.module.d.ts.map +1 -1
  304. package/dist/communication-dashboards.module.js +24 -3
  305. package/dist/communication-dashboards.module.js.map +1 -1
  306. package/dist/core-dashboards.module.d.ts +1 -1
  307. package/dist/core-dashboards.module.d.ts.map +1 -1
  308. package/dist/core-dashboards.module.js +31 -1
  309. package/dist/core-dashboards.module.js.map +1 -1
  310. package/dist/credentials-dashboards.module.d.ts +1 -1
  311. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  312. package/dist/credentials-dashboards.module.js +28 -1
  313. package/dist/credentials-dashboards.module.js.map +1 -1
  314. package/dist/lists-dashboards.module.d.ts +1 -1
  315. package/dist/lists-dashboards.module.d.ts.map +1 -1
  316. package/dist/lists-dashboards.module.js +28 -1
  317. package/dist/lists-dashboards.module.js.map +1 -1
  318. package/dist/public-api.d.ts +2 -2
  319. package/dist/public-api.d.ts.map +1 -1
  320. package/dist/public-api.js +3 -3
  321. package/dist/public-api.js.map +1 -1
  322. package/dist/scheduling-dashboards.module.d.ts +1 -1
  323. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  324. package/dist/scheduling-dashboards.module.js +31 -1
  325. package/dist/scheduling-dashboards.module.js.map +1 -1
  326. package/dist/testing-dashboards.module.d.ts +8 -7
  327. package/dist/testing-dashboards.module.d.ts.map +1 -1
  328. package/dist/testing-dashboards.module.js +30 -0
  329. package/dist/testing-dashboards.module.js.map +1 -1
  330. package/package.json +52 -52
  331. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  332. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  333. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  334. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  335. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  336. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  337. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  338. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  339. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  340. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  341. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  342. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  343. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  344. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  345. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  346. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -10,43 +10,43 @@ import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
10
  import { RunView } from '@memberjunction/core';
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "@angular/common";
13
- import * as i2 from "@angular/forms";
13
+ import * as i2 from "@memberjunction/ng-ui-components";
14
14
  import * as i3 from "@memberjunction/ng-shared-generic";
15
- function CredentialsAuditResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelement(0, "mj-loading", 1);
15
+ function CredentialsAuditResourceComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelement(0, "mj-loading", 12);
17
17
  } }
18
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_48_For_8_Template(rf, ctx) { if (rf & 1) {
19
- i0.ɵɵelementStart(0, "div", 57)(1, "div", 62);
20
- i0.ɵɵelement(2, "div", 63)(3, "div", 64);
18
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_35_For_8_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵelementStart(0, "div", 37)(1, "div", 42);
20
+ i0.ɵɵelement(2, "div", 43)(3, "div", 44);
21
21
  i0.ɵɵelementEnd();
22
- i0.ɵɵelementStart(4, "span", 65);
22
+ i0.ɵɵelementStart(4, "span", 45);
23
23
  i0.ɵɵtext(5);
24
24
  i0.ɵɵelementEnd()();
25
25
  } if (rf & 2) {
26
- const data_r3 = ctx.$implicit;
26
+ const data_r1 = ctx.$implicit;
27
27
  const ctx_r1 = i0.ɵɵnextContext(3);
28
- i0.ɵɵproperty("title", data_r3.hour + ": " + (data_r3.success + data_r3.failed) + " events");
28
+ i0.ɵɵproperty("title", data_r1.hour + ": " + (data_r1.success + data_r1.failed) + " events");
29
29
  i0.ɵɵadvance(2);
30
- i0.ɵɵstyleProp("height", data_r3.success / ctx_r1.getMaxHourlyCount() * 100, "%");
30
+ i0.ɵɵstyleProp("height", data_r1.success / ctx_r1.getMaxHourlyCount() * 100, "%");
31
31
  i0.ɵɵadvance();
32
- i0.ɵɵstyleProp("height", data_r3.failed / ctx_r1.getMaxHourlyCount() * 100, "%");
32
+ i0.ɵɵstyleProp("height", data_r1.failed / ctx_r1.getMaxHourlyCount() * 100, "%");
33
33
  i0.ɵɵadvance(2);
34
- i0.ɵɵtextInterpolate(data_r3.hour.split(":")[0]);
34
+ i0.ɵɵtextInterpolate(data_r1.hour.split(":")[0]);
35
35
  } }
36
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_48_Template(rf, ctx) { if (rf & 1) {
37
- i0.ɵɵelementStart(0, "div", 27)(1, "div", 53)(2, "h3");
38
- i0.ɵɵelement(3, "i", 54);
36
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_35_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelementStart(0, "div", 29)(1, "div", 33)(2, "h3");
38
+ i0.ɵɵelement(3, "i", 34);
39
39
  i0.ɵɵtext(4, " Today's Activity ");
40
40
  i0.ɵɵelementEnd()();
41
- i0.ɵɵelementStart(5, "div", 55)(6, "div", 56);
42
- i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_2_Conditional_48_For_8_Template, 6, 6, "div", 57, i0.ɵɵrepeaterTrackByIdentity);
41
+ i0.ɵɵelementStart(5, "div", 35)(6, "div", 36);
42
+ i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_16_Conditional_35_For_8_Template, 6, 6, "div", 37, i0.ɵɵrepeaterTrackByIdentity);
43
43
  i0.ɵɵelementEnd()();
44
- i0.ɵɵelementStart(9, "div", 58)(10, "span", 59);
45
- i0.ɵɵelement(11, "span", 60);
44
+ i0.ɵɵelementStart(9, "div", 38)(10, "span", 39);
45
+ i0.ɵɵelement(11, "span", 40);
46
46
  i0.ɵɵtext(12, " Success ");
47
47
  i0.ɵɵelementEnd();
48
- i0.ɵɵelementStart(13, "span", 59);
49
- i0.ɵɵelement(14, "span", 61);
48
+ i0.ɵɵelementStart(13, "span", 39);
49
+ i0.ɵɵelement(14, "span", 41);
50
50
  i0.ɵɵtext(15, " Failed ");
51
51
  i0.ɵɵelementEnd()()();
52
52
  } if (rf & 2) {
@@ -54,273 +54,256 @@ function CredentialsAuditResourceComponent_Conditional_2_Conditional_48_Template
54
54
  i0.ɵɵadvance(7);
55
55
  i0.ɵɵrepeater(ctx_r1.hourlyData);
56
56
  } }
57
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_54_Template(rf, ctx) { if (rf & 1) {
58
- const _r4 = i0.ɵɵgetCurrentView();
59
- i0.ɵɵelementStart(0, "button", 66);
60
- i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Conditional_54_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
61
- i0.ɵɵelement(1, "i", 67);
62
- i0.ɵɵelementEnd();
63
- } }
64
- function CredentialsAuditResourceComponent_Conditional_2_For_66_Template(rf, ctx) { if (rf & 1) {
65
- i0.ɵɵelementStart(0, "option", 38);
66
- i0.ɵɵtext(1);
67
- i0.ɵɵelementEnd();
68
- } if (rf & 2) {
69
- const op_r5 = ctx.$implicit;
70
- i0.ɵɵproperty("value", op_r5);
71
- i0.ɵɵadvance();
72
- i0.ɵɵtextInterpolate(op_r5);
73
- } }
74
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_15_Template(rf, ctx) { if (rf & 1) {
75
- i0.ɵɵelementStart(0, "div", 85);
57
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_15_Template(rf, ctx) { if (rf & 1) {
58
+ i0.ɵɵelementStart(0, "div", 63);
76
59
  i0.ɵɵtext(1);
77
60
  i0.ɵɵelementEnd();
78
61
  } if (rf & 2) {
79
- const log_r7 = i0.ɵɵnextContext().$implicit;
62
+ const log_r4 = i0.ɵɵnextContext().$implicit;
80
63
  i0.ɵɵadvance();
81
- i0.ɵɵtextInterpolate1(" ", log_r7.Description, " ");
64
+ i0.ɵɵtextInterpolate1(" ", log_r4.Description, " ");
82
65
  } }
83
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_20_Template(rf, ctx) { if (rf & 1) {
84
- i0.ɵɵelementStart(0, "span", 88);
66
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_20_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelementStart(0, "span", 66);
85
68
  i0.ɵɵtext(1);
86
69
  i0.ɵɵelementEnd();
87
70
  } if (rf & 2) {
88
- const log_r7 = i0.ɵɵnextContext().$implicit;
71
+ const log_r4 = i0.ɵɵnextContext().$implicit;
89
72
  const ctx_r1 = i0.ɵɵnextContext(4);
90
73
  i0.ɵɵadvance();
91
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getSubsystem(log_r7), " ");
74
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getSubsystem(log_r4), " ");
92
75
  } }
93
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_21_Template(rf, ctx) { if (rf & 1) {
94
- i0.ɵɵelementStart(0, "span", 89);
95
- i0.ɵɵelement(1, "i", 92);
76
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_21_Template(rf, ctx) { if (rf & 1) {
77
+ i0.ɵɵelementStart(0, "span", 67);
78
+ i0.ɵɵelement(1, "i", 70);
96
79
  i0.ɵɵtext(2);
97
80
  i0.ɵɵelementEnd();
98
81
  } if (rf & 2) {
99
- const log_r7 = i0.ɵɵnextContext().$implicit;
82
+ const log_r4 = i0.ɵɵnextContext().$implicit;
100
83
  i0.ɵɵadvance(2);
101
- i0.ɵɵtextInterpolate1(" ", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialType, " ");
84
+ i0.ɵɵtextInterpolate1(" ", log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialType, " ");
102
85
  } }
103
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
104
- i0.ɵɵelementStart(0, "div", 94)(1, "span", 96);
86
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
87
+ i0.ɵɵelementStart(0, "div", 72)(1, "span", 74);
105
88
  i0.ɵɵtext(2, "IP Address");
106
89
  i0.ɵɵelementEnd();
107
- i0.ɵɵelementStart(3, "span", 97);
90
+ i0.ɵɵelementStart(3, "span", 75);
108
91
  i0.ɵɵtext(4);
109
92
  i0.ɵɵelementEnd()();
110
93
  } if (rf & 2) {
111
- const log_r7 = i0.ɵɵnextContext(2).$implicit;
94
+ const log_r4 = i0.ɵɵnextContext(2).$implicit;
112
95
  i0.ɵɵadvance(4);
113
- i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.ipAddress);
96
+ i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.ipAddress);
114
97
  } }
115
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
116
- i0.ɵɵelementStart(0, "div", 94)(1, "span", 96);
98
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵelementStart(0, "div", 72)(1, "span", 74);
117
100
  i0.ɵɵtext(2, "Duration");
118
101
  i0.ɵɵelementEnd();
119
- i0.ɵɵelementStart(3, "span", 97);
102
+ i0.ɵɵelementStart(3, "span", 75);
120
103
  i0.ɵɵtext(4);
121
104
  i0.ɵɵelementEnd()();
122
105
  } if (rf & 2) {
123
- const log_r7 = i0.ɵɵnextContext(2).$implicit;
106
+ const log_r4 = i0.ɵɵnextContext(2).$implicit;
124
107
  const ctx_r1 = i0.ɵɵnextContext(4);
125
108
  i0.ɵɵadvance(4);
126
- i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.duration));
109
+ i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.duration));
127
110
  } }
128
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
129
- i0.ɵɵelementStart(0, "div", 94)(1, "span", 96);
111
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
112
+ i0.ɵɵelementStart(0, "div", 72)(1, "span", 74);
130
113
  i0.ɵɵtext(2, "Credential ID");
131
114
  i0.ɵɵelementEnd();
132
- i0.ɵɵelementStart(3, "span", 98);
115
+ i0.ɵɵelementStart(3, "span", 76);
133
116
  i0.ɵɵtext(4);
134
117
  i0.ɵɵelementEnd()();
135
118
  } if (rf & 2) {
136
- const log_r7 = i0.ɵɵnextContext(2).$implicit;
119
+ const log_r4 = i0.ɵɵnextContext(2).$implicit;
137
120
  i0.ɵɵadvance(4);
138
- i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialId);
121
+ i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialId);
139
122
  } }
140
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_5_Template(rf, ctx) { if (rf & 1) {
141
- i0.ɵɵelementStart(0, "div", 95)(1, "span", 96);
123
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_5_Template(rf, ctx) { if (rf & 1) {
124
+ i0.ɵɵelementStart(0, "div", 73)(1, "span", 74);
142
125
  i0.ɵɵtext(2, "Error Message");
143
126
  i0.ɵɵelementEnd();
144
- i0.ɵɵelementStart(3, "span", 99);
127
+ i0.ɵɵelementStart(3, "span", 77);
145
128
  i0.ɵɵtext(4);
146
129
  i0.ɵɵelementEnd()();
147
130
  } if (rf & 2) {
148
- const log_r7 = i0.ɵɵnextContext(2).$implicit;
131
+ const log_r4 = i0.ɵɵnextContext(2).$implicit;
149
132
  i0.ɵɵadvance(4);
150
- i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.errorMessage);
133
+ i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.errorMessage);
151
134
  } }
152
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
153
- i0.ɵɵelementStart(0, "div", 95)(1, "span", 96);
135
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
136
+ i0.ɵɵelementStart(0, "div", 73)(1, "span", 74);
154
137
  i0.ɵɵtext(2, "User Agent");
155
138
  i0.ɵɵelementEnd();
156
- i0.ɵɵelementStart(3, "span", 100);
139
+ i0.ɵɵelementStart(3, "span", 78);
157
140
  i0.ɵɵtext(4);
158
141
  i0.ɵɵelementEnd()();
159
142
  } if (rf & 2) {
160
- const log_r7 = i0.ɵɵnextContext(2).$implicit;
143
+ const log_r4 = i0.ɵɵnextContext(2).$implicit;
161
144
  i0.ɵɵadvance(4);
162
- i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.userAgent);
145
+ i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.userAgent);
163
146
  } }
164
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Template(rf, ctx) { if (rf & 1) {
165
- i0.ɵɵelementStart(0, "div", 90)(1, "div", 93);
166
- i0.ɵɵconditionalCreate(2, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_2_Template, 5, 1, "div", 94);
167
- i0.ɵɵconditionalCreate(3, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_3_Template, 5, 1, "div", 94);
168
- i0.ɵɵconditionalCreate(4, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_4_Template, 5, 1, "div", 94);
169
- i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_5_Template, 5, 1, "div", 95);
170
- i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_6_Template, 5, 1, "div", 95);
147
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Template(rf, ctx) { if (rf & 1) {
148
+ i0.ɵɵelementStart(0, "div", 68)(1, "div", 71);
149
+ i0.ɵɵconditionalCreate(2, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_2_Template, 5, 1, "div", 72);
150
+ i0.ɵɵconditionalCreate(3, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_3_Template, 5, 1, "div", 72);
151
+ i0.ɵɵconditionalCreate(4, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_4_Template, 5, 1, "div", 72);
152
+ i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_5_Template, 5, 1, "div", 73);
153
+ i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_6_Template, 5, 1, "div", 73);
171
154
  i0.ɵɵelementEnd()();
172
155
  } if (rf & 2) {
173
- const log_r7 = i0.ɵɵnextContext().$implicit;
156
+ const log_r4 = i0.ɵɵnextContext().$implicit;
174
157
  i0.ɵɵadvance(2);
175
- i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.ipAddress) ? 2 : -1);
158
+ i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.ipAddress) ? 2 : -1);
176
159
  i0.ɵɵadvance();
177
- i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.duration) ? 3 : -1);
160
+ i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.duration) ? 3 : -1);
178
161
  i0.ɵɵadvance();
179
- i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialId) ? 4 : -1);
162
+ i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialId) ? 4 : -1);
180
163
  i0.ɵɵadvance();
181
- i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.errorMessage) ? 5 : -1);
164
+ i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.errorMessage) ? 5 : -1);
182
165
  i0.ɵɵadvance();
183
- i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.userAgent) ? 6 : -1);
166
+ i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.userAgent) ? 6 : -1);
184
167
  } }
185
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Template(rf, ctx) { if (rf & 1) {
186
- const _r6 = i0.ɵɵgetCurrentView();
187
- i0.ɵɵelementStart(0, "div", 74)(1, "div", 75);
188
- i0.ɵɵelement(2, "div", 76);
189
- i0.ɵɵelementEnd();
190
- i0.ɵɵelementStart(3, "div", 77);
191
- i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Template_div_click_3_listener() { const log_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleLogExpand(log_r7.ID)); });
192
- i0.ɵɵelementStart(4, "div", 78)(5, "div", 79);
168
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Template(rf, ctx) { if (rf & 1) {
169
+ const _r3 = i0.ɵɵgetCurrentView();
170
+ i0.ɵɵelementStart(0, "div", 52)(1, "div", 53);
171
+ i0.ɵɵelement(2, "div", 54);
172
+ i0.ɵɵelementEnd();
173
+ i0.ɵɵelementStart(3, "div", 55);
174
+ i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Template_div_click_3_listener() { const log_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleLogExpand(log_r4.ID)); });
175
+ i0.ɵɵelementStart(4, "div", 56)(5, "div", 57);
193
176
  i0.ɵɵelement(6, "i");
194
- i0.ɵɵelementStart(7, "span", 80);
177
+ i0.ɵɵelementStart(7, "span", 58);
195
178
  i0.ɵɵtext(8);
196
179
  i0.ɵɵelementEnd()();
197
- i0.ɵɵelementStart(9, "div", 81);
180
+ i0.ɵɵelementStart(9, "div", 59);
198
181
  i0.ɵɵtext(10);
199
182
  i0.ɵɵelementEnd()();
200
- i0.ɵɵelementStart(11, "div", 82)(12, "div", 83);
201
- i0.ɵɵelement(13, "i", 84);
183
+ i0.ɵɵelementStart(11, "div", 60)(12, "div", 61);
184
+ i0.ɵɵelement(13, "i", 62);
202
185
  i0.ɵɵtext(14);
203
186
  i0.ɵɵelementEnd();
204
- i0.ɵɵconditionalCreate(15, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_15_Template, 2, 1, "div", 85);
205
- i0.ɵɵelementStart(16, "div", 86)(17, "span", 87);
187
+ i0.ɵɵconditionalCreate(15, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_15_Template, 2, 1, "div", 63);
188
+ i0.ɵɵelementStart(16, "div", 64)(17, "span", 65);
206
189
  i0.ɵɵelement(18, "i");
207
190
  i0.ɵɵtext(19);
208
191
  i0.ɵɵelementEnd();
209
- i0.ɵɵconditionalCreate(20, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_20_Template, 2, 1, "span", 88);
210
- i0.ɵɵconditionalCreate(21, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_21_Template, 3, 1, "span", 89);
192
+ i0.ɵɵconditionalCreate(20, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_20_Template, 2, 1, "span", 66);
193
+ i0.ɵɵconditionalCreate(21, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_21_Template, 3, 1, "span", 67);
211
194
  i0.ɵɵelementEnd()();
212
- i0.ɵɵconditionalCreate(22, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Template, 7, 5, "div", 90);
213
- i0.ɵɵelementStart(23, "button", 91);
195
+ i0.ɵɵconditionalCreate(22, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Template, 7, 5, "div", 68);
196
+ i0.ɵɵelementStart(23, "button", 69);
214
197
  i0.ɵɵelement(24, "i");
215
198
  i0.ɵɵelementEnd()()();
216
199
  } if (rf & 2) {
217
- const log_r7 = ctx.$implicit;
200
+ const log_r4 = ctx.$implicit;
218
201
  const ctx_r1 = i0.ɵɵnextContext(4);
219
- i0.ɵɵclassProp("expanded", ctx_r1.expandedLogId === log_r7.ID)("failed", log_r7.Status === "Failed");
202
+ i0.ɵɵclassProp("expanded", ctx_r1.expandedLogId === log_r4.ID)("failed", log_r4.Status === "Failed");
220
203
  i0.ɵɵadvance(2);
221
- i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r7)));
204
+ i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r4)));
222
205
  i0.ɵɵadvance(4);
223
- i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(log_r7)));
224
- i0.ɵɵstyleProp("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r7)));
206
+ i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(log_r4)));
207
+ i0.ɵɵstyleProp("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r4)));
225
208
  i0.ɵɵadvance(2);
226
- i0.ɵɵtextInterpolate(ctx_r1.getOperationType(log_r7));
209
+ i0.ɵɵtextInterpolate(ctx_r1.getOperationType(log_r4));
227
210
  i0.ɵɵadvance(2);
228
- i0.ɵɵtextInterpolate(ctx_r1.formatTime(log_r7.__mj_CreatedAt));
211
+ i0.ɵɵtextInterpolate(ctx_r1.formatTime(log_r4.__mj_CreatedAt));
229
212
  i0.ɵɵadvance(4);
230
- i0.ɵɵtextInterpolate1(" ", log_r7.User || "Unknown", " ");
213
+ i0.ɵɵtextInterpolate1(" ", log_r4.User || "Unknown", " ");
231
214
  i0.ɵɵadvance();
232
- i0.ɵɵconditional(log_r7.Description ? 15 : -1);
215
+ i0.ɵɵconditional(log_r4.Description ? 15 : -1);
233
216
  i0.ɵɵadvance(2);
234
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r7.Status));
217
+ i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r4.Status));
235
218
  i0.ɵɵadvance();
236
- i0.ɵɵclassMap(log_r7.Status === "Success" ? "fa-solid fa-check" : "fa-solid fa-times");
219
+ i0.ɵɵclassMap(log_r4.Status === "Success" ? "fa-solid fa-check" : "fa-solid fa-times");
237
220
  i0.ɵɵadvance();
238
- i0.ɵɵtextInterpolate1(" ", log_r7.Status, " ");
221
+ i0.ɵɵtextInterpolate1(" ", log_r4.Status, " ");
239
222
  i0.ɵɵadvance();
240
- i0.ɵɵconditional(ctx_r1.getSubsystem(log_r7) ? 20 : -1);
223
+ i0.ɵɵconditional(ctx_r1.getSubsystem(log_r4) ? 20 : -1);
241
224
  i0.ɵɵadvance();
242
- i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialType) ? 21 : -1);
225
+ i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialType) ? 21 : -1);
243
226
  i0.ɵɵadvance();
244
- i0.ɵɵconditional(ctx_r1.expandedLogId === log_r7.ID ? 22 : -1);
227
+ i0.ɵɵconditional(ctx_r1.expandedLogId === log_r4.ID ? 22 : -1);
245
228
  i0.ɵɵadvance(2);
246
- i0.ɵɵclassMap(ctx_r1.expandedLogId === log_r7.ID ? "fa-solid fa-chevron-up" : "fa-solid fa-chevron-down");
229
+ i0.ɵɵclassMap(ctx_r1.expandedLogId === log_r4.ID ? "fa-solid fa-chevron-up" : "fa-solid fa-chevron-down");
247
230
  } }
248
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_Template(rf, ctx) { if (rf & 1) {
249
- i0.ɵɵelementStart(0, "div", 68)(1, "div", 69)(2, "span", 70);
231
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_Template(rf, ctx) { if (rf & 1) {
232
+ i0.ɵɵelementStart(0, "div", 46)(1, "div", 47)(2, "span", 48);
250
233
  i0.ɵɵtext(3);
251
234
  i0.ɵɵelementEnd();
252
- i0.ɵɵelementStart(4, "span", 71);
235
+ i0.ɵɵelementStart(4, "span", 49);
253
236
  i0.ɵɵtext(5);
254
237
  i0.ɵɵelementEnd()();
255
- i0.ɵɵelementStart(6, "div", 72);
256
- i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Template, 25, 23, "div", 73, i0.ɵɵrepeaterTrackByIdentity);
238
+ i0.ɵɵelementStart(6, "div", 50);
239
+ i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Template, 25, 23, "div", 51, i0.ɵɵrepeaterTrackByIdentity);
257
240
  i0.ɵɵelementEnd()();
258
241
  } if (rf & 2) {
259
- const group_r8 = ctx.$implicit;
242
+ const group_r5 = ctx.$implicit;
260
243
  i0.ɵɵadvance(3);
261
- i0.ɵɵtextInterpolate(group_r8.displayDate);
244
+ i0.ɵɵtextInterpolate(group_r5.displayDate);
262
245
  i0.ɵɵadvance(2);
263
- i0.ɵɵtextInterpolate1("", group_r8.logs.length, " events");
246
+ i0.ɵɵtextInterpolate1("", group_r5.logs.length, " events");
264
247
  i0.ɵɵadvance(2);
265
- i0.ɵɵrepeater(group_r8.logs);
248
+ i0.ɵɵrepeater(group_r5.logs);
266
249
  } }
267
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_Template(rf, ctx) { if (rf & 1) {
268
- i0.ɵɵelementStart(0, "div", 50);
269
- i0.ɵɵrepeaterCreate(1, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_Template, 9, 2, "div", 68, i0.ɵɵrepeaterTrackByIdentity);
250
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_Template(rf, ctx) { if (rf & 1) {
251
+ i0.ɵɵelementStart(0, "div", 30);
252
+ i0.ɵɵrepeaterCreate(1, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_Template, 9, 2, "div", 46, i0.ɵɵrepeaterTrackByIdentity);
270
253
  i0.ɵɵelementEnd();
271
254
  } if (rf & 2) {
272
255
  const ctx_r1 = i0.ɵɵnextContext(2);
273
256
  i0.ɵɵadvance();
274
257
  i0.ɵɵrepeater(ctx_r1.timelineGroups);
275
258
  } }
276
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_85_For_18_Template(rf, ctx) { if (rf & 1) {
277
- i0.ɵɵelementStart(0, "tr")(1, "td", 103);
259
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_37_For_18_Template(rf, ctx) { if (rf & 1) {
260
+ i0.ɵɵelementStart(0, "tr")(1, "td", 81);
278
261
  i0.ɵɵtext(2);
279
262
  i0.ɵɵelementEnd();
280
- i0.ɵɵelementStart(3, "td", 104);
263
+ i0.ɵɵelementStart(3, "td", 82);
281
264
  i0.ɵɵtext(4);
282
265
  i0.ɵɵelementEnd();
283
- i0.ɵɵelementStart(5, "td", 105)(6, "span", 106);
266
+ i0.ɵɵelementStart(5, "td", 83)(6, "span", 84);
284
267
  i0.ɵɵelement(7, "i");
285
268
  i0.ɵɵtext(8);
286
269
  i0.ɵɵelementEnd()();
287
- i0.ɵɵelementStart(9, "td", 107);
270
+ i0.ɵɵelementStart(9, "td", 85);
288
271
  i0.ɵɵtext(10);
289
272
  i0.ɵɵelementEnd();
290
- i0.ɵɵelementStart(11, "td", 108);
273
+ i0.ɵɵelementStart(11, "td", 86);
291
274
  i0.ɵɵtext(12);
292
275
  i0.ɵɵelementEnd();
293
- i0.ɵɵelementStart(13, "td", 109)(14, "span", 87);
276
+ i0.ɵɵelementStart(13, "td", 87)(14, "span", 65);
294
277
  i0.ɵɵelement(15, "i");
295
278
  i0.ɵɵtext(16);
296
279
  i0.ɵɵelementEnd()()();
297
280
  } if (rf & 2) {
298
- const log_r9 = ctx.$implicit;
281
+ const log_r6 = ctx.$implicit;
299
282
  const ctx_r1 = i0.ɵɵnextContext(3);
300
- i0.ɵɵclassProp("failed-row", log_r9.Status === "Failed");
283
+ i0.ɵɵclassProp("failed-row", log_r6.Status === "Failed");
301
284
  i0.ɵɵadvance(2);
302
- i0.ɵɵtextInterpolate(ctx_r1.formatDate(log_r9.__mj_CreatedAt));
285
+ i0.ɵɵtextInterpolate(ctx_r1.formatDate(log_r6.__mj_CreatedAt));
303
286
  i0.ɵɵadvance(2);
304
- i0.ɵɵtextInterpolate(log_r9.User || "Unknown");
287
+ i0.ɵɵtextInterpolate(log_r6.User || "Unknown");
305
288
  i0.ɵɵadvance(2);
306
- i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r9)) + "20")("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r9)));
289
+ i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r6)) + "20")("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r6)));
307
290
  i0.ɵɵadvance();
308
- i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(log_r9)));
291
+ i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(log_r6)));
309
292
  i0.ɵɵadvance();
310
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getOperationType(log_r9), " ");
293
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getOperationType(log_r6), " ");
311
294
  i0.ɵɵadvance(2);
312
- i0.ɵɵtextInterpolate(log_r9.Description || "-");
295
+ i0.ɵɵtextInterpolate(log_r6.Description || "-");
313
296
  i0.ɵɵadvance(2);
314
- i0.ɵɵtextInterpolate(ctx_r1.getSubsystem(log_r9) || "-");
297
+ i0.ɵɵtextInterpolate(ctx_r1.getSubsystem(log_r6) || "-");
315
298
  i0.ɵɵadvance(2);
316
- i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r9.Status));
299
+ i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r6.Status));
317
300
  i0.ɵɵadvance();
318
- i0.ɵɵclassMap(log_r9.Status === "Success" ? "fa-solid fa-check" : "fa-solid fa-times");
301
+ i0.ɵɵclassMap(log_r6.Status === "Success" ? "fa-solid fa-check" : "fa-solid fa-times");
319
302
  i0.ɵɵadvance();
320
- i0.ɵɵtextInterpolate1(" ", log_r9.Status, " ");
303
+ i0.ɵɵtextInterpolate1(" ", log_r6.Status, " ");
321
304
  } }
322
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_85_Template(rf, ctx) { if (rf & 1) {
323
- i0.ɵɵelementStart(0, "div", 51)(1, "table", 101)(2, "thead")(3, "tr")(4, "th");
305
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_37_Template(rf, ctx) { if (rf & 1) {
306
+ i0.ɵɵelementStart(0, "div", 31)(1, "table", 79)(2, "thead")(3, "tr")(4, "th");
324
307
  i0.ɵɵtext(5, "Timestamp");
325
308
  i0.ɵɵelementEnd();
326
309
  i0.ɵɵelementStart(6, "th");
@@ -339,36 +322,36 @@ function CredentialsAuditResourceComponent_Conditional_2_Conditional_85_Template
339
322
  i0.ɵɵtext(15, "Status");
340
323
  i0.ɵɵelementEnd()()();
341
324
  i0.ɵɵelementStart(16, "tbody");
342
- i0.ɵɵrepeaterCreate(17, CredentialsAuditResourceComponent_Conditional_2_Conditional_85_For_18_Template, 17, 17, "tr", 102, i0.ɵɵrepeaterTrackByIdentity);
325
+ i0.ɵɵrepeaterCreate(17, CredentialsAuditResourceComponent_Conditional_16_Conditional_37_For_18_Template, 17, 17, "tr", 80, i0.ɵɵrepeaterTrackByIdentity);
343
326
  i0.ɵɵelementEnd()()();
344
327
  } if (rf & 2) {
345
328
  const ctx_r1 = i0.ɵɵnextContext(2);
346
329
  i0.ɵɵadvance(17);
347
330
  i0.ɵɵrepeater(ctx_r1.filteredLogs);
348
331
  } }
349
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_5_Template(rf, ctx) { if (rf & 1) {
350
- const _r10 = i0.ɵɵgetCurrentView();
332
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_5_Template(rf, ctx) { if (rf & 1) {
333
+ const _r7 = i0.ɵɵgetCurrentView();
351
334
  i0.ɵɵelementStart(0, "p");
352
335
  i0.ɵɵtext(1, " No events match your current filters. ");
353
- i0.ɵɵelementStart(2, "button", 111);
354
- i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); ctx_r1.searchText = ""; ctx_r1.selectedStatus = ""; ctx_r1.selectedOperation = ""; return i0.ɵɵresetView(ctx_r1.applyFilters()); });
336
+ i0.ɵɵelementStart(2, "button", 89);
337
+ i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); ctx_r1.searchText = ""; ctx_r1.selectedStatus = ""; ctx_r1.selectedOperation = ""; return i0.ɵɵresetView(ctx_r1.applyFilters()); });
355
338
  i0.ɵɵtext(3, "Clear filters");
356
339
  i0.ɵɵelementEnd()();
357
340
  } }
358
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_6_Template(rf, ctx) { if (rf & 1) {
341
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_6_Template(rf, ctx) { if (rf & 1) {
359
342
  i0.ɵɵelementStart(0, "p");
360
343
  i0.ɵɵtext(1, " No credential access events in the selected time range. ");
361
344
  i0.ɵɵelementEnd();
362
345
  } }
363
- function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Template(rf, ctx) { if (rf & 1) {
364
- i0.ɵɵelementStart(0, "div", 52)(1, "div", 110);
365
- i0.ɵɵelement(2, "i", 14);
346
+ function CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Template(rf, ctx) { if (rf & 1) {
347
+ i0.ɵɵelementStart(0, "div", 32)(1, "div", 88);
348
+ i0.ɵɵelement(2, "i", 16);
366
349
  i0.ɵɵelementEnd();
367
350
  i0.ɵɵelementStart(3, "h3");
368
351
  i0.ɵɵtext(4, "No Audit Logs");
369
352
  i0.ɵɵelementEnd();
370
- i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_5_Template, 4, 0, "p");
371
- i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_6_Template, 2, 0, "p");
353
+ i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_5_Template, 4, 0, "p");
354
+ i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_6_Template, 2, 0, "p");
372
355
  i0.ɵɵelementEnd();
373
356
  } if (rf & 2) {
374
357
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -377,120 +360,53 @@ function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Template
377
360
  i0.ɵɵadvance();
378
361
  i0.ɵɵconditional(!ctx_r1.searchText && !ctx_r1.selectedStatus && !ctx_r1.selectedOperation ? 6 : -1);
379
362
  } }
380
- function CredentialsAuditResourceComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
381
- const _r1 = i0.ɵɵgetCurrentView();
382
- i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "h2", 4);
383
- i0.ɵɵtext(3, "Audit Trail");
384
- i0.ɵɵelementEnd();
385
- i0.ɵɵelementStart(4, "p", 5);
386
- i0.ɵɵtext(5, "Credential access and modification history");
387
- i0.ɵɵelementEnd()();
388
- i0.ɵɵelementStart(6, "div", 6)(7, "button", 7);
389
- i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.exportToCSV()); });
390
- i0.ɵɵelement(8, "i", 8);
391
- i0.ɵɵelementStart(9, "span");
392
- i0.ɵɵtext(10, "Export");
393
- i0.ɵɵelementEnd()();
394
- i0.ɵɵelementStart(11, "button", 9);
395
- i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.refresh()); });
396
- i0.ɵɵelement(12, "i", 10);
397
- i0.ɵɵelementEnd()()();
398
- i0.ɵɵelementStart(13, "div", 11)(14, "div", 12)(15, "div", 13);
399
- i0.ɵɵelement(16, "i", 14);
363
+ function CredentialsAuditResourceComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
364
+ i0.ɵɵelementStart(0, "div", 13)(1, "div", 14)(2, "div", 15);
365
+ i0.ɵɵelement(3, "i", 16);
400
366
  i0.ɵɵelementEnd();
401
- i0.ɵɵelementStart(17, "div", 15)(18, "div", 16);
402
- i0.ɵɵtext(19);
367
+ i0.ɵɵelementStart(4, "div", 17)(5, "div", 18);
368
+ i0.ɵɵtext(6);
403
369
  i0.ɵɵelementEnd();
404
- i0.ɵɵelementStart(20, "div", 17);
405
- i0.ɵɵtext(21, "Total Events");
370
+ i0.ɵɵelementStart(7, "div", 19);
371
+ i0.ɵɵtext(8, "Total Events");
406
372
  i0.ɵɵelementEnd()()();
407
- i0.ɵɵelementStart(22, "div", 12)(23, "div", 18);
408
- i0.ɵɵelement(24, "i", 19);
373
+ i0.ɵɵelementStart(9, "div", 14)(10, "div", 20);
374
+ i0.ɵɵelement(11, "i", 21);
409
375
  i0.ɵɵelementEnd();
410
- i0.ɵɵelementStart(25, "div", 15)(26, "div", 20);
411
- i0.ɵɵtext(27);
376
+ i0.ɵɵelementStart(12, "div", 17)(13, "div", 22);
377
+ i0.ɵɵtext(14);
412
378
  i0.ɵɵelementEnd();
413
- i0.ɵɵelementStart(28, "div", 17);
414
- i0.ɵɵtext(29, "Successful");
379
+ i0.ɵɵelementStart(15, "div", 19);
380
+ i0.ɵɵtext(16, "Successful");
415
381
  i0.ɵɵelementEnd()();
416
- i0.ɵɵelementStart(30, "div", 21);
417
- i0.ɵɵtext(31);
382
+ i0.ɵɵelementStart(17, "div", 23);
383
+ i0.ɵɵtext(18);
418
384
  i0.ɵɵelementEnd()();
419
- i0.ɵɵelementStart(32, "div", 12)(33, "div", 22);
420
- i0.ɵɵelement(34, "i", 23);
385
+ i0.ɵɵelementStart(19, "div", 14)(20, "div", 24);
386
+ i0.ɵɵelement(21, "i", 25);
421
387
  i0.ɵɵelementEnd();
422
- i0.ɵɵelementStart(35, "div", 15)(36, "div", 24);
423
- i0.ɵɵtext(37);
388
+ i0.ɵɵelementStart(22, "div", 17)(23, "div", 26);
389
+ i0.ɵɵtext(24);
424
390
  i0.ɵɵelementEnd();
425
- i0.ɵɵelementStart(38, "div", 17);
426
- i0.ɵɵtext(39, "Failed");
391
+ i0.ɵɵelementStart(25, "div", 19);
392
+ i0.ɵɵtext(26, "Failed");
427
393
  i0.ɵɵelementEnd()()();
428
- i0.ɵɵelementStart(40, "div", 12)(41, "div", 25);
429
- i0.ɵɵelement(42, "i", 26);
394
+ i0.ɵɵelementStart(27, "div", 14)(28, "div", 27);
395
+ i0.ɵɵelement(29, "i", 28);
430
396
  i0.ɵɵelementEnd();
431
- i0.ɵɵelementStart(43, "div", 15)(44, "div", 16);
432
- i0.ɵɵtext(45);
397
+ i0.ɵɵelementStart(30, "div", 17)(31, "div", 18);
398
+ i0.ɵɵtext(32);
433
399
  i0.ɵɵelementEnd();
434
- i0.ɵɵelementStart(46, "div", 17);
435
- i0.ɵɵtext(47, "Unique Users");
400
+ i0.ɵɵelementStart(33, "div", 19);
401
+ i0.ɵɵtext(34, "Unique Users");
436
402
  i0.ɵɵelementEnd()()()();
437
- i0.ɵɵconditionalCreate(48, CredentialsAuditResourceComponent_Conditional_2_Conditional_48_Template, 16, 0, "div", 27);
438
- i0.ɵɵelementStart(49, "div", 28)(50, "div", 29)(51, "div", 30);
439
- i0.ɵɵelement(52, "i", 31);
440
- i0.ɵɵelementStart(53, "input", 32);
441
- i0.ɵɵlistener("input", function CredentialsAuditResourceComponent_Conditional_2_Template_input_input_53_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSearchChange($event.target.value)); });
442
- i0.ɵɵelementEnd();
443
- i0.ɵɵconditionalCreate(54, CredentialsAuditResourceComponent_Conditional_2_Conditional_54_Template, 2, 0, "button", 33);
444
- i0.ɵɵelementEnd();
445
- i0.ɵɵelementStart(55, "select", 34);
446
- i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_Conditional_2_Template_select_change_55_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onStatusFilterChange($event.target.value)); });
447
- i0.ɵɵelementStart(56, "option", 35);
448
- i0.ɵɵtext(57, "All Statuses");
449
- i0.ɵɵelementEnd();
450
- i0.ɵɵelementStart(58, "option", 36);
451
- i0.ɵɵtext(59, "Success");
452
- i0.ɵɵelementEnd();
453
- i0.ɵɵelementStart(60, "option", 37);
454
- i0.ɵɵtext(61, "Failed");
455
- i0.ɵɵelementEnd()();
456
- i0.ɵɵelementStart(62, "select", 34);
457
- i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_Conditional_2_Template_select_change_62_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOperationFilterChange($event.target.value)); });
458
- i0.ɵɵelementStart(63, "option", 35);
459
- i0.ɵɵtext(64, "All Operations");
460
- i0.ɵɵelementEnd();
461
- i0.ɵɵrepeaterCreate(65, CredentialsAuditResourceComponent_Conditional_2_For_66_Template, 2, 2, "option", 38, i0.ɵɵrepeaterTrackByIdentity);
462
- i0.ɵɵelementEnd();
463
- i0.ɵɵelementStart(67, "select", 34);
464
- i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_Conditional_2_Template_select_change_67_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDateRangeChange($event.target.value)); });
465
- i0.ɵɵelementStart(68, "option", 39);
466
- i0.ɵɵtext(69, "Last 24 hours");
467
- i0.ɵɵelementEnd();
468
- i0.ɵɵelementStart(70, "option", 40);
469
- i0.ɵɵtext(71, "Last 7 days");
470
- i0.ɵɵelementEnd();
471
- i0.ɵɵelementStart(72, "option", 41);
472
- i0.ɵɵtext(73, "Last 30 days");
473
- i0.ɵɵelementEnd();
474
- i0.ɵɵelementStart(74, "option", 42);
475
- i0.ɵɵtext(75, "Last 90 days");
476
- i0.ɵɵelementEnd()()();
477
- i0.ɵɵelementStart(76, "div", 43)(77, "div", 44);
478
- i0.ɵɵtext(78);
479
- i0.ɵɵelementEnd();
480
- i0.ɵɵelementStart(79, "div", 45)(80, "button", 46);
481
- i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Template_button_click_80_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setViewMode("timeline")); });
482
- i0.ɵɵelement(81, "i", 47);
483
- i0.ɵɵelementEnd();
484
- i0.ɵɵelementStart(82, "button", 48);
485
- i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Template_button_click_82_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setViewMode("table")); });
486
- i0.ɵɵelement(83, "i", 49);
487
- i0.ɵɵelementEnd()()()();
488
- i0.ɵɵconditionalCreate(84, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_Template, 3, 0, "div", 50);
489
- i0.ɵɵconditionalCreate(85, CredentialsAuditResourceComponent_Conditional_2_Conditional_85_Template, 19, 0, "div", 51);
490
- i0.ɵɵconditionalCreate(86, CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Template, 7, 2, "div", 52);
403
+ i0.ɵɵconditionalCreate(35, CredentialsAuditResourceComponent_Conditional_16_Conditional_35_Template, 16, 0, "div", 29);
404
+ i0.ɵɵconditionalCreate(36, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_Template, 3, 0, "div", 30);
405
+ i0.ɵɵconditionalCreate(37, CredentialsAuditResourceComponent_Conditional_16_Conditional_37_Template, 19, 0, "div", 31);
406
+ i0.ɵɵconditionalCreate(38, CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Template, 7, 2, "div", 32);
491
407
  } if (rf & 2) {
492
408
  const ctx_r1 = i0.ɵɵnextContext();
493
- i0.ɵɵadvance(19);
409
+ i0.ɵɵadvance(6);
494
410
  i0.ɵɵtextInterpolate(ctx_r1.auditLogs.length);
495
411
  i0.ɵɵadvance(8);
496
412
  i0.ɵɵtextInterpolate(ctx_r1.getSuccessCount());
@@ -501,31 +417,13 @@ function CredentialsAuditResourceComponent_Conditional_2_Template(rf, ctx) { if
501
417
  i0.ɵɵadvance(8);
502
418
  i0.ɵɵtextInterpolate(ctx_r1.getUniqueUserCount());
503
419
  i0.ɵɵadvance(3);
504
- i0.ɵɵconditional(ctx_r1.hourlyData.length > 0 ? 48 : -1);
505
- i0.ɵɵadvance(5);
506
- i0.ɵɵproperty("value", ctx_r1.searchText);
420
+ i0.ɵɵconditional(ctx_r1.hourlyData.length > 0 ? 35 : -1);
507
421
  i0.ɵɵadvance();
508
- i0.ɵɵconditional(ctx_r1.searchText ? 54 : -1);
509
- i0.ɵɵadvance();
510
- i0.ɵɵproperty("value", ctx_r1.selectedStatus);
511
- i0.ɵɵadvance(7);
512
- i0.ɵɵproperty("value", ctx_r1.selectedOperation);
513
- i0.ɵɵadvance(3);
514
- i0.ɵɵrepeater(ctx_r1.getOperationList());
515
- i0.ɵɵadvance(2);
516
- i0.ɵɵproperty("value", ctx_r1.dateRange);
517
- i0.ɵɵadvance(11);
518
- i0.ɵɵtextInterpolate2(" ", ctx_r1.filteredLogs.length, " of ", ctx_r1.auditLogs.length, " events ");
519
- i0.ɵɵadvance(2);
520
- i0.ɵɵclassProp("active", ctx_r1.viewMode === "timeline");
521
- i0.ɵɵadvance(2);
522
- i0.ɵɵclassProp("active", ctx_r1.viewMode === "table");
523
- i0.ɵɵadvance(2);
524
- i0.ɵɵconditional(ctx_r1.viewMode === "timeline" && ctx_r1.timelineGroups.length > 0 ? 84 : -1);
422
+ i0.ɵɵconditional(ctx_r1.viewMode === "timeline" && ctx_r1.timelineGroups.length > 0 ? 36 : -1);
525
423
  i0.ɵɵadvance();
526
- i0.ɵɵconditional(ctx_r1.viewMode === "table" && ctx_r1.filteredLogs.length > 0 ? 85 : -1);
424
+ i0.ɵɵconditional(ctx_r1.viewMode === "table" && ctx_r1.filteredLogs.length > 0 ? 37 : -1);
527
425
  i0.ɵɵadvance();
528
- i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ? 86 : -1);
426
+ i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ? 38 : -1);
529
427
  } }
530
428
  // The Credential Access AuditLogType ID from metadata
531
429
  const CREDENTIAL_ACCESS_AUDIT_LOG_TYPE_ID = 'E8D4D100-E785-42D3-997F-ECFF3B0BCFC0';
@@ -544,6 +442,87 @@ let CredentialsAuditResourceComponent = class CredentialsAuditResourceComponent
544
442
  // Chart data
545
443
  hourlyData = [];
546
444
  operationCounts = new Map();
445
+ viewOptions = [
446
+ { key: 'timeline', icon: 'fa-solid fa-timeline', title: 'Timeline view' },
447
+ { key: 'table', icon: 'fa-solid fa-table', title: 'Table view' }
448
+ ];
449
+ get FilterFields() {
450
+ return [
451
+ {
452
+ key: 'status',
453
+ type: 'dropdown',
454
+ label: 'Status',
455
+ icon: 'fa-solid fa-circle-info',
456
+ placeholder: 'All Statuses',
457
+ options: [
458
+ { text: 'All Statuses', value: '' },
459
+ { text: 'Success', value: 'Success' },
460
+ { text: 'Failed', value: 'Failed' }
461
+ ]
462
+ },
463
+ {
464
+ key: 'operation',
465
+ type: 'dropdown',
466
+ label: 'Operation',
467
+ icon: 'fa-solid fa-bolt',
468
+ placeholder: 'All Operations',
469
+ filterable: true,
470
+ options: [
471
+ { text: 'All Operations', value: '' },
472
+ ...this.getOperationList().map(op => ({ text: op, value: op }))
473
+ ]
474
+ },
475
+ {
476
+ key: 'dateRange',
477
+ type: 'dropdown',
478
+ label: 'Time range',
479
+ icon: 'fa-solid fa-clock',
480
+ options: [
481
+ { text: 'Last 24 hours', value: '1' },
482
+ { text: 'Last 7 days', value: '7' },
483
+ { text: 'Last 30 days', value: '30' },
484
+ { text: 'Last 90 days', value: '90' }
485
+ ]
486
+ }
487
+ ];
488
+ }
489
+ get FilterValues() {
490
+ return {
491
+ status: this.selectedStatus,
492
+ operation: this.selectedOperation,
493
+ dateRange: this.dateRange
494
+ };
495
+ }
496
+ get ActiveFilterCount() {
497
+ let n = 0;
498
+ if (this.selectedStatus)
499
+ n++;
500
+ if (this.selectedOperation)
501
+ n++;
502
+ if (this.dateRange && this.dateRange !== '7')
503
+ n++; // 7-day is the default; don't count it
504
+ return n;
505
+ }
506
+ onFilterValuesChange(v) {
507
+ const next = (v ?? {});
508
+ if ((next.status ?? '') !== this.selectedStatus) {
509
+ this.onStatusFilterChange(next.status ?? '');
510
+ }
511
+ if ((next.operation ?? '') !== this.selectedOperation) {
512
+ this.onOperationFilterChange(next.operation ?? '');
513
+ }
514
+ if ((next.dateRange ?? '7') !== this.dateRange) {
515
+ this.onDateRangeChange(next.dateRange ?? '7');
516
+ }
517
+ }
518
+ resetFilters() {
519
+ if (this.selectedStatus)
520
+ this.onStatusFilterChange('');
521
+ if (this.selectedOperation)
522
+ this.onOperationFilterChange('');
523
+ if (this.dateRange !== '7')
524
+ this.onDateRangeChange('7');
525
+ }
547
526
  constructor(cdr) {
548
527
  super();
549
528
  this.cdr = cdr;
@@ -846,17 +825,51 @@ let CredentialsAuditResourceComponent = class CredentialsAuditResourceComponent
846
825
  link.click();
847
826
  }
848
827
  static ɵfac = function CredentialsAuditResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CredentialsAuditResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
849
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [[1, "audit-container"], ["text", "Loading audit logs..."], [1, "audit-header"], [1, "header-info"], [1, "audit-title"], [1, "audit-subtitle"], [1, "header-actions"], ["title", "Export to CSV", 1, "btn-secondary", 3, "click"], [1, "fa-solid", "fa-download"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "stats-grid"], [1, "stat-card"], [1, "stat-icon", "total"], [1, "fa-solid", "fa-clipboard-list"], [1, "stat-content"], [1, "stat-value"], [1, "stat-label"], [1, "stat-icon", "success"], [1, "fa-solid", "fa-check-circle"], [1, "stat-value", "success"], [1, "stat-rate"], [1, "stat-icon", "failed"], [1, "fa-solid", "fa-times-circle"], [1, "stat-value", "failed"], [1, "stat-icon", "users"], [1, "fa-solid", "fa-users"], [1, "activity-chart"], [1, "toolbar"], [1, "toolbar-left"], [1, "search-container"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search logs...", 3, "input", "value"], [1, "search-clear"], [1, "filter-select", 3, "change", "value"], ["value", ""], ["value", "Success"], ["value", "Failed"], [3, "value"], ["value", "1"], ["value", "7"], ["value", "30"], ["value", "90"], [1, "toolbar-right"], [1, "results-info"], [1, "view-toggle"], ["title", "Timeline View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-timeline"], ["title", "Table View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-table"], [1, "timeline-container"], [1, "audit-table-container"], [1, "empty-state"], [1, "chart-header"], [1, "fa-solid", "fa-chart-bar"], [1, "chart-container"], [1, "chart-bars"], [1, "chart-bar-wrapper", 3, "title"], [1, "chart-legend"], [1, "legend-item"], [1, "legend-color", "success"], [1, "legend-color", "failed"], [1, "chart-bar"], [1, "bar-segment", "success"], [1, "bar-segment", "failed"], [1, "chart-label"], [1, "search-clear", 3, "click"], [1, "fa-solid", "fa-times"], [1, "timeline-group"], [1, "timeline-date"], [1, "date-label"], [1, "date-count"], [1, "timeline-items"], [1, "timeline-item", 3, "expanded", "failed"], [1, "timeline-item"], [1, "timeline-line"], [1, "timeline-dot"], [1, "timeline-content", 3, "click"], [1, "timeline-header"], [1, "timeline-operation"], [1, "operation-name"], [1, "timeline-time"], [1, "timeline-body"], [1, "timeline-user"], [1, "fa-solid", "fa-user"], [1, "timeline-description"], [1, "timeline-badges"], [1, "status-badge", 3, "ngClass"], [1, "subsystem-badge"], [1, "type-badge"], [1, "timeline-details"], [1, "expand-btn"], [1, "fa-solid", "fa-key"], [1, "detail-grid"], [1, "detail-item"], [1, "detail-item", "full-width"], [1, "detail-label"], [1, "detail-value"], [1, "detail-value", "mono"], [1, "detail-value", "error"], [1, "detail-value", "mono", "small"], [1, "audit-table"], [3, "failed-row"], [1, "timestamp"], [1, "user"], [1, "operation"], [1, "operation-badge"], [1, "description"], [1, "subsystem"], [1, "status"], [1, "empty-icon"], [1, "btn-link", 3, "click"]], template: function CredentialsAuditResourceComponent_Template(rf, ctx) { if (rf & 1) {
850
- i0.ɵɵelementStart(0, "div", 0);
851
- i0.ɵɵconditionalCreate(1, CredentialsAuditResourceComponent_Conditional_1_Template, 1, 0, "mj-loading", 1);
852
- i0.ɵɵconditionalCreate(2, CredentialsAuditResourceComponent_Conditional_2_Template, 87, 20);
828
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 17, vars: 12, consts: [["Title", "Audit Trail", "Icon", "fa-solid fa-clipboard-list", "Subtitle", "Credential access and modification history"], ["meta", ""], ["Label", "events", 3, "Count", "Total"], ["actions", ""], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], [3, "KeyChange", "Options", "ActiveKey"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Export to CSV", 3, "click"], [1, "fa-solid", "fa-download"], [3, "Clicked", "Loading"], ["toolbar", ""], ["Placeholder", "Search logs...", 3, "ValueChange", "Value"], ["text", "Loading audit logs..."], [1, "stats-grid"], [1, "stat-card"], [1, "stat-icon", "total"], [1, "fa-solid", "fa-clipboard-list"], [1, "stat-content"], [1, "stat-value"], [1, "stat-label"], [1, "stat-icon", "success"], [1, "fa-solid", "fa-check-circle"], [1, "stat-value", "success"], [1, "stat-rate"], [1, "stat-icon", "failed"], [1, "fa-solid", "fa-times-circle"], [1, "stat-value", "failed"], [1, "stat-icon", "users"], [1, "fa-solid", "fa-users"], [1, "activity-chart"], [1, "timeline-container"], [1, "audit-table-container"], [1, "empty-state"], [1, "chart-header"], [1, "fa-solid", "fa-chart-bar"], [1, "chart-container"], [1, "chart-bars"], [1, "chart-bar-wrapper", 3, "title"], [1, "chart-legend"], [1, "legend-item"], [1, "legend-color", "success"], [1, "legend-color", "failed"], [1, "chart-bar"], [1, "bar-segment", "success"], [1, "bar-segment", "failed"], [1, "chart-label"], [1, "timeline-group"], [1, "timeline-date"], [1, "date-label"], [1, "date-count"], [1, "timeline-items"], [1, "timeline-item", 3, "expanded", "failed"], [1, "timeline-item"], [1, "timeline-line"], [1, "timeline-dot"], [1, "timeline-content", 3, "click"], [1, "timeline-header"], [1, "timeline-operation"], [1, "operation-name"], [1, "timeline-time"], [1, "timeline-body"], [1, "timeline-user"], [1, "fa-solid", "fa-user"], [1, "timeline-description"], [1, "timeline-badges"], [1, "status-badge", 3, "ngClass"], [1, "subsystem-badge"], [1, "type-badge"], [1, "timeline-details"], [1, "expand-btn"], [1, "fa-solid", "fa-key"], [1, "detail-grid"], [1, "detail-item"], [1, "detail-item", "full-width"], [1, "detail-label"], [1, "detail-value"], [1, "detail-value", "mono"], [1, "detail-value", "error"], [1, "detail-value", "mono", "small"], [1, "audit-table"], [3, "failed-row"], [1, "timestamp"], [1, "user"], [1, "operation"], [1, "operation-badge"], [1, "description"], [1, "subsystem"], [1, "status"], [1, "empty-icon"], [1, "btn-link", 3, "click"]], template: function CredentialsAuditResourceComponent_Template(rf, ctx) { if (rf & 1) {
829
+ i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
830
+ i0.ɵɵelement(3, "mj-stat-badge", 2);
831
+ i0.ɵɵelementEnd();
832
+ i0.ɵɵelementStart(4, "div", 3)(5, "mj-filter-popover", 4);
833
+ i0.ɵɵlistener("ClearAllRequested", function CredentialsAuditResourceComponent_Template_mj_filter_popover_ClearAllRequested_5_listener() { return ctx.resetFilters(); });
834
+ i0.ɵɵelementStart(6, "mj-filter-panel", 5);
835
+ i0.ɵɵlistener("ValuesChange", function CredentialsAuditResourceComponent_Template_mj_filter_panel_ValuesChange_6_listener($event) { return ctx.onFilterValuesChange($event); })("Reset", function CredentialsAuditResourceComponent_Template_mj_filter_panel_Reset_6_listener() { return ctx.resetFilters(); });
836
+ i0.ɵɵelementEnd()();
837
+ i0.ɵɵelementStart(7, "mj-view-toggle", 6);
838
+ i0.ɵɵlistener("KeyChange", function CredentialsAuditResourceComponent_Template_mj_view_toggle_KeyChange_7_listener($event) { return ctx.setViewMode($event); });
853
839
  i0.ɵɵelementEnd();
840
+ i0.ɵɵelementStart(8, "button", 7);
841
+ i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Template_button_click_8_listener() { return ctx.exportToCSV(); });
842
+ i0.ɵɵelement(9, "i", 8);
843
+ i0.ɵɵtext(10, " Export ");
844
+ i0.ɵɵelementEnd();
845
+ i0.ɵɵelementStart(11, "mj-refresh-button", 9);
846
+ i0.ɵɵlistener("Clicked", function CredentialsAuditResourceComponent_Template_mj_refresh_button_Clicked_11_listener() { return ctx.refresh(); });
847
+ i0.ɵɵelementEnd()();
848
+ i0.ɵɵelementStart(12, "div", 10)(13, "mj-page-search", 11);
849
+ i0.ɵɵlistener("ValueChange", function CredentialsAuditResourceComponent_Template_mj_page_search_ValueChange_13_listener($event) { return ctx.onSearchChange($event); });
850
+ i0.ɵɵelementEnd()()();
851
+ i0.ɵɵelementStart(14, "mj-page-body");
852
+ i0.ɵɵconditionalCreate(15, CredentialsAuditResourceComponent_Conditional_15_Template, 1, 0, "mj-loading", 12);
853
+ i0.ɵɵconditionalCreate(16, CredentialsAuditResourceComponent_Conditional_16_Template, 39, 9);
854
+ i0.ɵɵelementEnd()();
854
855
  } if (rf & 2) {
856
+ i0.ɵɵadvance(3);
857
+ i0.ɵɵproperty("Count", ctx.filteredLogs.length)("Total", ctx.auditLogs.length);
858
+ i0.ɵɵadvance(2);
859
+ i0.ɵɵproperty("ActiveCount", ctx.ActiveFilterCount)("ShowClearAll", ctx.ActiveFilterCount > 0);
860
+ i0.ɵɵadvance();
861
+ i0.ɵɵproperty("Fields", ctx.FilterFields)("Values", ctx.FilterValues);
855
862
  i0.ɵɵadvance();
856
- i0.ɵɵconditional(ctx.isLoading ? 1 : -1);
863
+ i0.ɵɵproperty("Options", ctx.viewOptions)("ActiveKey", ctx.viewMode);
864
+ i0.ɵɵadvance(4);
865
+ i0.ɵɵproperty("Loading", ctx.isLoading);
866
+ i0.ɵɵadvance(2);
867
+ i0.ɵɵproperty("Value", ctx.searchText);
868
+ i0.ɵɵadvance(2);
869
+ i0.ɵɵconditional(ctx.isLoading ? 15 : -1);
857
870
  i0.ɵɵadvance();
858
- i0.ɵɵconditional(!ctx.isLoading ? 2 : -1);
859
- } }, dependencies: [i1.NgClass, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i3.LoadingComponent], styles: [".audit-container[_ngcontent-%COMP%] {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n}\n\n\n\n.audit-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.audit-subtitle[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-brand-primary);\n}\n\n\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon.success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n color: var(--mj-status-success);\n}\n\n.stat-icon.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n color: var(--mj-status-error);\n}\n\n.stat-icon.users[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n}\n\n.stat-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.stat-value.success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.stat-value.failed[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.stat-rate[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n\n\n.activity-chart[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.chart-container[_ngcontent-%COMP%] {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar[_ngcontent-%COMP%] {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n}\n\n.bar-segment[_ngcontent-%COMP%] {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.bar-segment.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.chart-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.legend-color.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n\n\n.toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n min-width: 200px;\n}\n\n.search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n transition: all 0.2s ease;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--mj-border-default);\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 10px;\n}\n\n.search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-text-disabled);\n color: var(--mj-text-inverse);\n}\n\n.filter-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.results-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.timeline-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.date-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.date-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timeline-line[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.operation-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.timeline-body[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.timeline-user[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 4px;\n}\n\n.timeline-user[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.timeline-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.timeline-badges[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.unknown[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.subsystem-badge[_ngcontent-%COMP%], \n.type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.type-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.type-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.timeline-details[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-secondary);\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small[_ngcontent-%COMP%] {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.audit-table-container[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.audit-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timestamp[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n}\n\n.user[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.operation-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.description[_ngcontent-%COMP%] {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-border-strong);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n\n\n@media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .audit-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .search-container[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .toolbar-right[_ngcontent-%COMP%] {\n justify-content: space-between;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .chart-label[_ngcontent-%COMP%] {\n display: none;\n }\n\n .chart-label[_ngcontent-%COMP%]:nth-child(4n+1) {\n display: block;\n }\n}"], changeDetection: 0 });
871
+ i0.ɵɵconditional(!ctx.isLoading ? 16 : -1);
872
+ } }, dependencies: [i1.NgClass, i2.MJButtonDirective, i2.MJPageHeaderComponent, i2.MJPageLayoutComponent, i2.MJPageBodyComponent, i2.MJPageSearchComponent, i2.MJFilterPopoverComponent, i2.MJFilterPanelComponent, i2.MJViewToggleComponent, i2.MJStatBadgeComponent, i2.MJRefreshButtonComponent, i3.LoadingComponent], styles: ["\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon.success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n color: var(--mj-status-success);\n}\n\n.stat-icon.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n color: var(--mj-status-error);\n}\n\n.stat-icon.users[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n}\n\n.stat-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.stat-value.success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.stat-value.failed[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.stat-rate[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n\n\n.activity-chart[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.chart-container[_ngcontent-%COMP%] {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar[_ngcontent-%COMP%] {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n}\n\n.bar-segment[_ngcontent-%COMP%] {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.bar-segment.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.chart-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n}\n\n.legend-color.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n\n\n.timeline-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.date-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.date-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timeline-line[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.operation-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.timeline-body[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.timeline-user[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 4px;\n}\n\n.timeline-user[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.timeline-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.timeline-badges[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.unknown[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.subsystem-badge[_ngcontent-%COMP%], \n.type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.type-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.type-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.timeline-details[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-secondary);\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small[_ngcontent-%COMP%] {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.audit-table-container[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.audit-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timestamp[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n}\n\n.user[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.operation-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.description[_ngcontent-%COMP%] {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-border-strong);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n\n\n@media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .audit-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .search-container[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .toolbar-right[_ngcontent-%COMP%] {\n justify-content: space-between;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .chart-label[_ngcontent-%COMP%] {\n display: none;\n }\n\n .chart-label[_ngcontent-%COMP%]:nth-child(4n+1) {\n display: block;\n }\n}"], changeDetection: 0 });
860
873
  };
861
874
  CredentialsAuditResourceComponent = __decorate([
862
875
  RegisterClass(BaseResourceComponent, 'CredentialsAuditResource')
@@ -864,7 +877,7 @@ CredentialsAuditResourceComponent = __decorate([
864
877
  export { CredentialsAuditResourceComponent };
865
878
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialsAuditResourceComponent, [{
866
879
  type: Component,
867
- args: [{ standalone: false, selector: 'mj-credentials-audit-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"audit-container\">\n @if (isLoading) {\n <mj-loading text=\"Loading audit logs...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Header -->\n <div class=\"audit-header\">\n <div class=\"header-info\">\n <h2 class=\"audit-title\">Audit Trail</h2>\n <p class=\"audit-subtitle\">Credential access and modification history</p>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-secondary\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Export</span>\n </button>\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n <!-- Stats Cards -->\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-icon total\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{auditLogs.length}}</div>\n <div class=\"stat-label\">Total Events</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value success\">{{getSuccessCount()}}</div>\n <div class=\"stat-label\">Successful</div>\n </div>\n <div class=\"stat-rate\">{{getSuccessRate()}}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon failed\">\n <i class=\"fa-solid fa-times-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value failed\">{{getFailedCount()}}</div>\n <div class=\"stat-label\">Failed</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon users\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{getUniqueUserCount()}}</div>\n <div class=\"stat-label\">Unique Users</div>\n </div>\n </div>\n </div>\n <!-- Activity Chart -->\n @if (hourlyData.length > 0) {\n <div class=\"activity-chart\">\n <div class=\"chart-header\">\n <h3>\n <i class=\"fa-solid fa-chart-bar\"></i>\n Today's Activity\n </h3>\n </div>\n <div class=\"chart-container\">\n <div class=\"chart-bars\">\n @for (data of hourlyData; track data) {\n <div\n class=\"chart-bar-wrapper\"\n [title]=\"data.hour + ': ' + (data.success + data.failed) + ' events'\"\n >\n <div class=\"chart-bar\">\n <div\n class=\"bar-segment success\"\n [style.height.%]=\"(data.success / getMaxHourlyCount()) * 100\"\n ></div>\n <div\n class=\"bar-segment failed\"\n [style.height.%]=\"(data.failed / getMaxHourlyCount()) * 100\"\n ></div>\n </div>\n <span class=\"chart-label\">{{data.hour.split(':')[0]}}</span>\n </div>\n }\n </div>\n </div>\n <div class=\"chart-legend\">\n <span class=\"legend-item\">\n <span class=\"legend-color success\"></span>\n Success\n </span>\n <span class=\"legend-item\">\n <span class=\"legend-color failed\"></span>\n Failed\n </span>\n </div>\n </div>\n }\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n @if (searchText) {\n <button class=\"search-clear\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <select\n class=\"filter-select\"\n [value]=\"selectedStatus\"\n (change)=\"onStatusFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Statuses</option>\n <option value=\"Success\">Success</option>\n <option value=\"Failed\">Failed</option>\n </select>\n <select\n class=\"filter-select\"\n [value]=\"selectedOperation\"\n (change)=\"onOperationFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Operations</option>\n @for (op of getOperationList(); track op) {\n <option [value]=\"op\">{{op}}</option>\n }\n </select>\n <select\n class=\"filter-select\"\n [value]=\"dateRange\"\n (change)=\"onDateRangeChange($any($event.target).value)\"\n >\n <option value=\"1\">Last 24 hours</option>\n <option value=\"7\">Last 7 days</option>\n <option value=\"30\">Last 30 days</option>\n <option value=\"90\">Last 90 days</option>\n </select>\n </div>\n <div class=\"toolbar-right\">\n <div class=\"results-info\">\n {{filteredLogs.length}} of {{auditLogs.length}} events\n </div>\n <div class=\"view-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'timeline'\"\n (click)=\"setViewMode('timeline')\"\n title=\"Timeline View\"\n >\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'table'\"\n (click)=\"setViewMode('table')\"\n title=\"Table View\"\n >\n <i class=\"fa-solid fa-table\"></i>\n </button>\n </div>\n </div>\n </div>\n <!-- Timeline View -->\n @if (viewMode === 'timeline' && timelineGroups.length > 0) {\n <div class=\"timeline-container\">\n @for (group of timelineGroups; track group) {\n <div class=\"timeline-group\">\n <div class=\"timeline-date\">\n <span class=\"date-label\">{{group.displayDate}}</span>\n <span class=\"date-count\">{{group.logs.length}} events</span>\n </div>\n <div class=\"timeline-items\">\n @for (log of group.logs; track log) {\n <div\n class=\"timeline-item\"\n [class.expanded]=\"expandedLogId === log.ID\"\n [class.failed]=\"log.Status === 'Failed'\"\n >\n <div class=\"timeline-line\">\n <div\n class=\"timeline-dot\"\n [style.backgroundColor]=\"getOperationColor(getOperationType(log))\"\n ></div>\n </div>\n <div class=\"timeline-content\" (click)=\"toggleLogExpand(log.ID)\">\n <div class=\"timeline-header\">\n <div class=\"timeline-operation\">\n <i [class]=\"getOperationIcon(getOperationType(log))\" [style.color]=\"getOperationColor(getOperationType(log))\"></i>\n <span class=\"operation-name\">{{getOperationType(log)}}</span>\n </div>\n <div class=\"timeline-time\">{{formatTime(log.__mj_CreatedAt)}}</div>\n </div>\n <div class=\"timeline-body\">\n <div class=\"timeline-user\">\n <i class=\"fa-solid fa-user\"></i>\n {{log.User || 'Unknown'}}\n </div>\n @if (log.Description) {\n <div class=\"timeline-description\">\n {{log.Description}}\n </div>\n }\n <div class=\"timeline-badges\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n <i [class]=\"log.Status === 'Success' ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n {{log.Status}}\n </span>\n @if (getSubsystem(log)) {\n <span class=\"subsystem-badge\">\n {{getSubsystem(log)}}\n </span>\n }\n @if (log.parsedDetails?.credentialType) {\n <span class=\"type-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{log.parsedDetails?.credentialType}}\n </span>\n }\n </div>\n </div>\n @if (expandedLogId === log.ID) {\n <div class=\"timeline-details\">\n <div class=\"detail-grid\">\n @if (log.parsedDetails?.ipAddress) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">IP Address</span>\n <span class=\"detail-value\">{{log.parsedDetails?.ipAddress}}</span>\n </div>\n }\n @if (log.parsedDetails?.duration) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{formatDuration(log.parsedDetails?.duration)}}</span>\n </div>\n }\n @if (log.parsedDetails?.credentialId) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Credential ID</span>\n <span class=\"detail-value mono\">{{log.parsedDetails?.credentialId}}</span>\n </div>\n }\n @if (log.parsedDetails?.errorMessage) {\n <div class=\"detail-item full-width\">\n <span class=\"detail-label\">Error Message</span>\n <span class=\"detail-value error\">{{log.parsedDetails?.errorMessage}}</span>\n </div>\n }\n @if (log.parsedDetails?.userAgent) {\n <div class=\"detail-item full-width\">\n <span class=\"detail-label\">User Agent</span>\n <span class=\"detail-value mono small\">{{log.parsedDetails?.userAgent}}</span>\n </div>\n }\n </div>\n </div>\n }\n <button class=\"expand-btn\">\n <i [class]=\"expandedLogId === log.ID ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n <!-- Table View -->\n @if (viewMode === 'table' && filteredLogs.length > 0) {\n <div class=\"audit-table-container\">\n <table class=\"audit-table\">\n <thead>\n <tr>\n <th>Timestamp</th>\n <th>User</th>\n <th>Operation</th>\n <th>Description</th>\n <th>Subsystem</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log) {\n <tr [class.failed-row]=\"log.Status === 'Failed'\">\n <td class=\"timestamp\">{{formatDate(log.__mj_CreatedAt)}}</td>\n <td class=\"user\">{{log.User || 'Unknown'}}</td>\n <td class=\"operation\">\n <span class=\"operation-badge\" [style.backgroundColor]=\"getOperationColor(getOperationType(log)) + '20'\" [style.color]=\"getOperationColor(getOperationType(log))\">\n <i [class]=\"getOperationIcon(getOperationType(log))\"></i>\n {{getOperationType(log)}}\n </span>\n </td>\n <td class=\"description\">{{log.Description || '-'}}</td>\n <td class=\"subsystem\">{{getSubsystem(log) || '-'}}</td>\n <td class=\"status\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n <i [class]=\"log.Status === 'Success' ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n {{log.Status}}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n <!-- Empty State -->\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <h3>No Audit Logs</h3>\n @if (searchText || selectedStatus || selectedOperation) {\n <p>\n No events match your current filters.\n <button class=\"btn-link\" (click)=\"searchText = ''; selectedStatus = ''; selectedOperation = ''; applyFilters()\">Clear filters</button>\n </p>\n }\n @if (!searchText && !selectedStatus && !selectedOperation) {\n <p>\n No credential access events in the selected time range.\n </p>\n }\n </div>\n }\n }\n</div>\n", styles: [".audit-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n}\n\n/* Header */\n.audit-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title {\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.audit-subtitle {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.btn-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-brand-primary);\n}\n\n/* Stats Grid */\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon.success {\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n color: var(--mj-status-success);\n}\n\n.stat-icon.failed {\n background: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n color: var(--mj-status-error);\n}\n\n.stat-icon.users {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon i {\n font-size: 20px;\n}\n\n.stat-content {\n flex: 1;\n}\n\n.stat-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.stat-value.success {\n color: var(--mj-status-success);\n}\n\n.stat-value.failed {\n color: var(--mj-status-error);\n}\n\n.stat-label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.stat-rate {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n/* Activity Chart */\n.activity-chart {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header {\n margin-bottom: 16px;\n}\n\n.chart-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.chart-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.chart-container {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n}\n\n.bar-segment {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success {\n background: var(--mj-status-success);\n}\n\n.bar-segment.failed {\n background: var(--mj-status-error);\n}\n\n.chart-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n}\n\n.chart-legend {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.legend-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success {\n background: var(--mj-status-success);\n}\n\n.legend-color.failed {\n background: var(--mj-status-error);\n}\n\n/* Toolbar */\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n/* Search */\n.search-container {\n position: relative;\n min-width: 200px;\n}\n\n.search-container i.fa-search {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.search-container input {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n transition: all 0.2s ease;\n}\n\n.search-container input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--mj-border-default);\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 10px;\n}\n\n.search-clear:hover {\n background: var(--mj-text-disabled);\n color: var(--mj-text-inverse);\n}\n\n.filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.results-info {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n/* View Toggle */\n.view-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Timeline View */\n.timeline-container {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.date-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.date-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items {\n padding: 8px 0;\n}\n\n.timeline-item {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.timeline-item.failed {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.timeline-item.failed:hover {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timeline-line {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation i {\n font-size: 14px;\n}\n\n.operation-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-time {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.timeline-body {\n margin-bottom: 8px;\n}\n\n.timeline-user {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 4px;\n}\n\n.timeline-user i {\n font-size: 11px;\n}\n\n.timeline-description {\n font-size: 13px;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.timeline-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.failed {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.unknown {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge i {\n font-size: 10px;\n}\n\n.subsystem-badge,\n.type-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.type-badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.type-badge i {\n font-size: 10px;\n}\n\n/* Timeline Details */\n.timeline-details {\n margin-top: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-secondary);\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail-value.mono {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error {\n color: var(--mj-status-error);\n}\n\n.expand-btn {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn:hover {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn i {\n font-size: 10px;\n}\n\n/* Table View */\n.audit-table-container {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table th {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.audit-table td {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.audit-table tr:last-child td {\n border-bottom: none;\n}\n\n.audit-table tr:hover td {\n background: var(--mj-bg-surface-card);\n}\n\n.audit-table tr.failed-row td {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.audit-table tr.failed-row:hover td {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timestamp {\n font-family: monospace;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n}\n\n.user {\n font-weight: 500;\n}\n\n.operation-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge i {\n font-size: 10px;\n}\n\n.description {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem {\n color: var(--mj-text-secondary);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 32px;\n color: var(--mj-border-strong);\n}\n\n.empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n}\n\n.empty-state p {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n/* Responsive */\n@media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container {\n padding: 16px;\n }\n\n .audit-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid {\n grid-template-columns: 1fr;\n }\n\n .toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left {\n flex-direction: column;\n }\n\n .search-container {\n width: 100%;\n }\n\n .filter-select {\n width: 100%;\n }\n\n .toolbar-right {\n justify-content: space-between;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n\n .chart-label {\n display: none;\n }\n\n .chart-label:nth-child(4n+1) {\n display: block;\n }\n}\n"] }]
880
+ args: [{ standalone: false, selector: 'mj-credentials-audit-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Audit Trail\"\n Icon=\"fa-solid fa-clipboard-list\"\n Subtitle=\"Credential access and modification history\">\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredLogs.length\"\n [Total]=\"auditLogs.length\"\n Label=\"events\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-view-toggle\n [Options]=\"viewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> Export\n </button>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search logs...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (isLoading) {\n <mj-loading text=\"Loading audit logs...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Stats Cards -->\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-icon total\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{auditLogs.length}}</div>\n <div class=\"stat-label\">Total Events</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value success\">{{getSuccessCount()}}</div>\n <div class=\"stat-label\">Successful</div>\n </div>\n <div class=\"stat-rate\">{{getSuccessRate()}}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon failed\">\n <i class=\"fa-solid fa-times-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value failed\">{{getFailedCount()}}</div>\n <div class=\"stat-label\">Failed</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon users\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{getUniqueUserCount()}}</div>\n <div class=\"stat-label\">Unique Users</div>\n </div>\n </div>\n </div>\n <!-- Activity Chart -->\n @if (hourlyData.length > 0) {\n <div class=\"activity-chart\">\n <div class=\"chart-header\">\n <h3>\n <i class=\"fa-solid fa-chart-bar\"></i>\n Today's Activity\n </h3>\n </div>\n <div class=\"chart-container\">\n <div class=\"chart-bars\">\n @for (data of hourlyData; track data) {\n <div\n class=\"chart-bar-wrapper\"\n [title]=\"data.hour + ': ' + (data.success + data.failed) + ' events'\"\n >\n <div class=\"chart-bar\">\n <div\n class=\"bar-segment success\"\n [style.height.%]=\"(data.success / getMaxHourlyCount()) * 100\"\n ></div>\n <div\n class=\"bar-segment failed\"\n [style.height.%]=\"(data.failed / getMaxHourlyCount()) * 100\"\n ></div>\n </div>\n <span class=\"chart-label\">{{data.hour.split(':')[0]}}</span>\n </div>\n }\n </div>\n </div>\n <div class=\"chart-legend\">\n <span class=\"legend-item\">\n <span class=\"legend-color success\"></span>\n Success\n </span>\n <span class=\"legend-item\">\n <span class=\"legend-color failed\"></span>\n Failed\n </span>\n </div>\n </div>\n }\n <!-- Timeline View -->\n @if (viewMode === 'timeline' && timelineGroups.length > 0) {\n <div class=\"timeline-container\">\n @for (group of timelineGroups; track group) {\n <div class=\"timeline-group\">\n <div class=\"timeline-date\">\n <span class=\"date-label\">{{group.displayDate}}</span>\n <span class=\"date-count\">{{group.logs.length}} events</span>\n </div>\n <div class=\"timeline-items\">\n @for (log of group.logs; track log) {\n <div\n class=\"timeline-item\"\n [class.expanded]=\"expandedLogId === log.ID\"\n [class.failed]=\"log.Status === 'Failed'\"\n >\n <div class=\"timeline-line\">\n <div\n class=\"timeline-dot\"\n [style.backgroundColor]=\"getOperationColor(getOperationType(log))\"\n ></div>\n </div>\n <div class=\"timeline-content\" (click)=\"toggleLogExpand(log.ID)\">\n <div class=\"timeline-header\">\n <div class=\"timeline-operation\">\n <i [class]=\"getOperationIcon(getOperationType(log))\" [style.color]=\"getOperationColor(getOperationType(log))\"></i>\n <span class=\"operation-name\">{{getOperationType(log)}}</span>\n </div>\n <div class=\"timeline-time\">{{formatTime(log.__mj_CreatedAt)}}</div>\n </div>\n <div class=\"timeline-body\">\n <div class=\"timeline-user\">\n <i class=\"fa-solid fa-user\"></i>\n {{log.User || 'Unknown'}}\n </div>\n @if (log.Description) {\n <div class=\"timeline-description\">\n {{log.Description}}\n </div>\n }\n <div class=\"timeline-badges\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n <i [class]=\"log.Status === 'Success' ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n {{log.Status}}\n </span>\n @if (getSubsystem(log)) {\n <span class=\"subsystem-badge\">\n {{getSubsystem(log)}}\n </span>\n }\n @if (log.parsedDetails?.credentialType) {\n <span class=\"type-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{log.parsedDetails?.credentialType}}\n </span>\n }\n </div>\n </div>\n @if (expandedLogId === log.ID) {\n <div class=\"timeline-details\">\n <div class=\"detail-grid\">\n @if (log.parsedDetails?.ipAddress) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">IP Address</span>\n <span class=\"detail-value\">{{log.parsedDetails?.ipAddress}}</span>\n </div>\n }\n @if (log.parsedDetails?.duration) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{formatDuration(log.parsedDetails?.duration)}}</span>\n </div>\n }\n @if (log.parsedDetails?.credentialId) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Credential ID</span>\n <span class=\"detail-value mono\">{{log.parsedDetails?.credentialId}}</span>\n </div>\n }\n @if (log.parsedDetails?.errorMessage) {\n <div class=\"detail-item full-width\">\n <span class=\"detail-label\">Error Message</span>\n <span class=\"detail-value error\">{{log.parsedDetails?.errorMessage}}</span>\n </div>\n }\n @if (log.parsedDetails?.userAgent) {\n <div class=\"detail-item full-width\">\n <span class=\"detail-label\">User Agent</span>\n <span class=\"detail-value mono small\">{{log.parsedDetails?.userAgent}}</span>\n </div>\n }\n </div>\n </div>\n }\n <button class=\"expand-btn\">\n <i [class]=\"expandedLogId === log.ID ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n <!-- Table View -->\n @if (viewMode === 'table' && filteredLogs.length > 0) {\n <div class=\"audit-table-container\">\n <table class=\"audit-table\">\n <thead>\n <tr>\n <th>Timestamp</th>\n <th>User</th>\n <th>Operation</th>\n <th>Description</th>\n <th>Subsystem</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log) {\n <tr [class.failed-row]=\"log.Status === 'Failed'\">\n <td class=\"timestamp\">{{formatDate(log.__mj_CreatedAt)}}</td>\n <td class=\"user\">{{log.User || 'Unknown'}}</td>\n <td class=\"operation\">\n <span class=\"operation-badge\" [style.backgroundColor]=\"getOperationColor(getOperationType(log)) + '20'\" [style.color]=\"getOperationColor(getOperationType(log))\">\n <i [class]=\"getOperationIcon(getOperationType(log))\"></i>\n {{getOperationType(log)}}\n </span>\n </td>\n <td class=\"description\">{{log.Description || '-'}}</td>\n <td class=\"subsystem\">{{getSubsystem(log) || '-'}}</td>\n <td class=\"status\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n <i [class]=\"log.Status === 'Success' ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n {{log.Status}}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n <!-- Empty State -->\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <h3>No Audit Logs</h3>\n @if (searchText || selectedStatus || selectedOperation) {\n <p>\n No events match your current filters.\n <button class=\"btn-link\" (click)=\"searchText = ''; selectedStatus = ''; selectedOperation = ''; applyFilters()\">Clear filters</button>\n </p>\n }\n @if (!searchText && !selectedStatus && !selectedOperation) {\n <p>\n No credential access events in the selected time range.\n </p>\n }\n </div>\n }\n }\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* Stats Grid */\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon.success {\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n color: var(--mj-status-success);\n}\n\n.stat-icon.failed {\n background: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n color: var(--mj-status-error);\n}\n\n.stat-icon.users {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon i {\n font-size: 20px;\n}\n\n.stat-content {\n flex: 1;\n}\n\n.stat-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.stat-value.success {\n color: var(--mj-status-success);\n}\n\n.stat-value.failed {\n color: var(--mj-status-error);\n}\n\n.stat-label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-top: 4px;\n}\n\n.stat-rate {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n/* Activity Chart */\n.activity-chart {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header {\n margin-bottom: 16px;\n}\n\n.chart-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.chart-header h3 i {\n color: var(--mj-brand-primary);\n}\n\n.chart-container {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n}\n\n.bar-segment {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success {\n background: var(--mj-status-success);\n}\n\n.bar-segment.failed {\n background: var(--mj-status-error);\n}\n\n.chart-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n}\n\n.chart-legend {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.legend-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success {\n background: var(--mj-status-success);\n}\n\n.legend-color.failed {\n background: var(--mj-status-error);\n}\n\n/* Timeline View */\n.timeline-container {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.date-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.date-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items {\n padding: 8px 0;\n}\n\n.timeline-item {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.timeline-item.failed {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.timeline-item.failed:hover {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timeline-line {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation i {\n font-size: 14px;\n}\n\n.operation-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.timeline-time {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-secondary);\n}\n\n.timeline-body {\n margin-bottom: 8px;\n}\n\n.timeline-user {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n margin-bottom: 4px;\n}\n\n.timeline-user i {\n font-size: 11px;\n}\n\n.timeline-description {\n font-size: 13px;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n}\n\n.timeline-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.failed {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.unknown {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.status-badge i {\n font-size: 10px;\n}\n\n.subsystem-badge,\n.type-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.type-badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.type-badge i {\n font-size: 10px;\n}\n\n/* Timeline Details */\n.timeline-details {\n margin-top: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-secondary);\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.detail-value.mono {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error {\n color: var(--mj-status-error);\n}\n\n.expand-btn {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn:hover {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn i {\n font-size: 10px;\n}\n\n/* Table View */\n.audit-table-container {\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table th {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.audit-table td {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.audit-table tr:last-child td {\n border-bottom: none;\n}\n\n.audit-table tr:hover td {\n background: var(--mj-bg-surface-card);\n}\n\n.audit-table tr.failed-row td {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.audit-table tr.failed-row:hover td {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timestamp {\n font-family: monospace;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n}\n\n.user {\n font-weight: 500;\n}\n\n.operation-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge i {\n font-size: 10px;\n}\n\n.description {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem {\n color: var(--mj-text-secondary);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 32px;\n color: var(--mj-border-strong);\n}\n\n.empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n}\n\n.empty-state p {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n/* Responsive */\n@media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container {\n padding: 16px;\n }\n\n .audit-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid {\n grid-template-columns: 1fr;\n }\n\n .toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left {\n flex-direction: column;\n }\n\n .search-container {\n width: 100%;\n }\n\n .filter-select {\n width: 100%;\n }\n\n .toolbar-right {\n justify-content: space-between;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n\n .chart-label {\n display: none;\n }\n\n .chart-label:nth-child(4n+1) {\n display: block;\n }\n}\n"] }]
868
881
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
869
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsAuditResourceComponent, { className: "CredentialsAuditResourceComponent", filePath: "src/Credentials/components/credentials-audit-resource.component.ts", lineNumber: 38 }); })();
882
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsAuditResourceComponent, { className: "CredentialsAuditResourceComponent", filePath: "src/Credentials/components/credentials-audit-resource.component.ts", lineNumber: 39 }); })();
870
883
  //# sourceMappingURL=credentials-audit-resource.component.js.map