@memberjunction/ng-dashboards 3.3.0 → 4.0.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 (581) hide show
  1. package/dist/AI/ai-dashboard.component.d.ts +62 -0
  2. package/dist/AI/ai-dashboard.component.d.ts.map +1 -0
  3. package/dist/AI/ai-dashboard.component.js +338 -0
  4. package/dist/AI/ai-dashboard.component.js.map +1 -0
  5. package/dist/AI/components/agents/agent-configuration.component.d.ts +36 -5
  6. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  7. package/dist/AI/components/agents/agent-configuration.component.js +287 -141
  8. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  9. package/dist/AI/components/agents/agent-editor.component.d.ts +14 -5
  10. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  11. package/dist/AI/components/agents/agent-editor.component.js +149 -211
  12. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  13. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  14. package/dist/AI/components/agents/agent-filter-panel.component.js +4 -4
  15. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  16. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
  17. package/dist/AI/components/charts/performance-heatmap.component.js +4 -6
  18. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  19. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  20. package/dist/AI/components/charts/time-series-chart.component.js +6 -7
  21. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  22. package/dist/AI/components/execution-monitoring.component.d.ts +0 -4
  23. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  24. package/dist/AI/components/execution-monitoring.component.js +33 -37
  25. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  26. package/dist/AI/components/models/model-management-v2.component.d.ts +96 -0
  27. package/dist/AI/components/models/model-management-v2.component.d.ts.map +1 -0
  28. package/dist/AI/components/models/model-management-v2.component.js +981 -0
  29. package/dist/AI/components/models/model-management-v2.component.js.map +1 -0
  30. package/dist/AI/components/models/model-management.component.d.ts +26 -6
  31. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  32. package/dist/AI/components/models/model-management.component.js +216 -103
  33. package/dist/AI/components/models/model-management.component.js.map +1 -1
  34. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  35. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +22 -17
  36. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  37. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +1 -1
  38. package/dist/AI/components/prompts/prompt-filter-panel.component.js +4 -4
  39. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
  40. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +97 -0
  41. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +1 -0
  42. package/dist/AI/components/prompts/prompt-management-v2.component.js +811 -0
  43. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +1 -0
  44. package/dist/AI/components/prompts/prompt-management.component.d.ts +26 -6
  45. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  46. package/dist/AI/components/prompts/prompt-management.component.js +164 -57
  47. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  48. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  49. package/dist/AI/components/prompts/prompt-version-control.component.js +33 -28
  50. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  51. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +1 -1
  52. package/dist/AI/components/system/system-config-filter-panel.component.js +4 -4
  53. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
  54. package/dist/AI/components/system/system-configuration.component.d.ts +0 -4
  55. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  56. package/dist/AI/components/system/system-configuration.component.js +26 -27
  57. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  58. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
  59. package/dist/AI/components/widgets/kpi-card.component.js +52 -42
  60. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  61. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
  62. package/dist/AI/components/widgets/live-execution-widget.component.js +7 -7
  63. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  64. package/dist/APIKeys/api-applications-panel.component.d.ts +5 -5
  65. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  66. package/dist/APIKeys/api-applications-panel.component.js +242 -239
  67. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  68. package/dist/APIKeys/api-key-create-dialog.component.d.ts +4 -5
  69. package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
  70. package/dist/APIKeys/api-key-create-dialog.component.js +237 -217
  71. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  72. package/dist/APIKeys/api-key-edit-panel.component.d.ts +1 -3
  73. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  74. package/dist/APIKeys/api-key-edit-panel.component.js +268 -249
  75. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  76. package/dist/APIKeys/api-key-list.component.d.ts +2 -3
  77. package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
  78. package/dist/APIKeys/api-key-list.component.js +136 -133
  79. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  80. package/dist/APIKeys/api-keys-resource.component.d.ts +6 -6
  81. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  82. package/dist/APIKeys/api-keys-resource.component.js +335 -358
  83. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  84. package/dist/APIKeys/api-scopes-panel.component.d.ts +0 -2
  85. package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
  86. package/dist/APIKeys/api-scopes-panel.component.js +151 -155
  87. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  88. package/dist/APIKeys/api-usage-panel.component.d.ts +0 -2
  89. package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
  90. package/dist/APIKeys/api-usage-panel.component.js +237 -234
  91. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  92. package/dist/Actions/actions-management-dashboard.component.d.ts +52 -0
  93. package/dist/Actions/actions-management-dashboard.component.d.ts.map +1 -0
  94. package/dist/Actions/actions-management-dashboard.component.js +308 -0
  95. package/dist/Actions/actions-management-dashboard.component.js.map +1 -0
  96. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
  97. package/dist/Actions/components/actions-list-view.component.js +15 -14
  98. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  99. package/dist/Actions/components/actions-overview.component.d.ts +3 -6
  100. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  101. package/dist/Actions/components/actions-overview.component.js +17 -19
  102. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  103. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
  104. package/dist/Actions/components/categories-list-view.component.js +6 -6
  105. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  106. package/dist/Actions/components/code-management.component.d.ts +0 -4
  107. package/dist/Actions/components/code-management.component.d.ts.map +1 -1
  108. package/dist/Actions/components/code-management.component.js +3 -9
  109. package/dist/Actions/components/code-management.component.js.map +1 -1
  110. package/dist/Actions/components/entity-integration.component.d.ts +0 -4
  111. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
  112. package/dist/Actions/components/entity-integration.component.js +3 -9
  113. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  114. package/dist/Actions/components/execution-monitoring.component.d.ts +3 -6
  115. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  116. package/dist/Actions/components/execution-monitoring.component.js +13 -16
  117. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  118. package/dist/Actions/components/executions-list-view.component.d.ts.map +1 -1
  119. package/dist/Actions/components/executions-list-view.component.js +3 -3
  120. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  121. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts +22 -0
  122. package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts.map +1 -0
  123. package/dist/Actions/components/explorer/action-breadcrumb.component.js +139 -0
  124. package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -0
  125. package/dist/Actions/components/explorer/action-card.component.d.ts +39 -0
  126. package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -0
  127. package/dist/Actions/components/explorer/action-card.component.js +411 -0
  128. package/dist/Actions/components/explorer/action-card.component.js.map +1 -0
  129. package/dist/Actions/components/explorer/action-explorer.component.d.ts +58 -0
  130. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -0
  131. package/dist/Actions/components/explorer/action-explorer.component.js +523 -0
  132. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -0
  133. package/dist/Actions/components/explorer/action-list-item.component.d.ts +24 -0
  134. package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -0
  135. package/dist/Actions/components/explorer/action-list-item.component.js +210 -0
  136. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -0
  137. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +63 -0
  138. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +1 -0
  139. package/dist/Actions/components/explorer/action-toolbar.component.js +484 -0
  140. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -0
  141. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts +57 -0
  142. package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -0
  143. package/dist/Actions/components/explorer/action-tree-panel.component.js +455 -0
  144. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -0
  145. package/dist/Actions/components/explorer/index.d.ts +9 -0
  146. package/dist/Actions/components/explorer/index.d.ts.map +1 -0
  147. package/dist/Actions/components/explorer/index.js +10 -0
  148. package/dist/Actions/components/explorer/index.js.map +1 -0
  149. package/dist/Actions/components/explorer/new-action-panel.component.d.ts +49 -0
  150. package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -0
  151. package/dist/Actions/components/explorer/new-action-panel.component.js +359 -0
  152. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -0
  153. package/dist/Actions/components/explorer/new-category-panel.component.d.ts +37 -0
  154. package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -0
  155. package/dist/Actions/components/explorer/new-category-panel.component.js +282 -0
  156. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -0
  157. package/dist/Actions/components/scheduled-actions.component.d.ts +0 -4
  158. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
  159. package/dist/Actions/components/scheduled-actions.component.js +3 -9
  160. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  161. package/dist/Actions/components/security-permissions.component.d.ts +0 -4
  162. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
  163. package/dist/Actions/components/security-permissions.component.js +3 -9
  164. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  165. package/dist/Actions/index.d.ts +2 -6
  166. package/dist/Actions/index.d.ts.map +1 -1
  167. package/dist/Actions/index.js +4 -7
  168. package/dist/Actions/index.js.map +1 -1
  169. package/dist/Actions/services/action-explorer-state.service.d.ts +104 -0
  170. package/dist/Actions/services/action-explorer-state.service.d.ts.map +1 -0
  171. package/dist/Actions/services/action-explorer-state.service.js +352 -0
  172. package/dist/Actions/services/action-explorer-state.service.js.map +1 -0
  173. package/dist/Communication/communication-dashboard.component.d.ts +2 -7
  174. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  175. package/dist/Communication/communication-dashboard.component.js +143 -107
  176. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  177. package/dist/Communication/communication-logs-resource.component.d.ts +10 -8
  178. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  179. package/dist/Communication/communication-logs-resource.component.js +270 -134
  180. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  181. package/dist/Communication/communication-monitor-resource.component.d.ts +38 -7
  182. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  183. package/dist/Communication/communication-monitor-resource.component.js +469 -186
  184. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  185. package/dist/Communication/communication-providers-resource.component.d.ts +16 -9
  186. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  187. package/dist/Communication/communication-providers-resource.component.js +262 -139
  188. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  189. package/dist/Communication/communication-runs-resource.component.d.ts +4 -6
  190. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  191. package/dist/Communication/communication-runs-resource.component.js +168 -159
  192. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  193. package/dist/Communication/communication-templates-resource.component.d.ts +39 -0
  194. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -0
  195. package/dist/Communication/communication-templates-resource.component.js +388 -0
  196. package/dist/Communication/communication-templates-resource.component.js.map +1 -0
  197. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +69 -271
  198. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  199. package/dist/ComponentStudio/component-studio-dashboard.component.js +705 -1808
  200. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  201. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +68 -0
  202. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -0
  203. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +400 -0
  204. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -0
  205. package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
  206. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +25 -22
  207. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  208. package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
  209. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +16 -16
  210. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  211. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts +44 -0
  212. package/dist/ComponentStudio/components/browser/component-browser.component.d.ts.map +1 -0
  213. package/dist/ComponentStudio/components/browser/component-browser.component.js +638 -0
  214. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -0
  215. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts +35 -0
  216. package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts.map +1 -0
  217. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +380 -0
  218. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -0
  219. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +24 -0
  220. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -0
  221. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +221 -0
  222. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -0
  223. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts +28 -0
  224. package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts.map +1 -0
  225. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +263 -0
  226. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -0
  227. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts +34 -0
  228. package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts.map +1 -0
  229. package/dist/ComponentStudio/components/editors/spec-editor.component.js +307 -0
  230. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -0
  231. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts +29 -0
  232. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts.map +1 -0
  233. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +159 -0
  234. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -0
  235. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts +20 -0
  236. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -0
  237. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +192 -0
  238. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -0
  239. package/dist/ComponentStudio/components/text-import-dialog.component.d.ts.map +1 -1
  240. package/dist/ComponentStudio/components/text-import-dialog.component.js +4 -4
  241. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  242. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +57 -0
  243. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -0
  244. package/dist/ComponentStudio/components/workspace/component-preview.component.js +343 -0
  245. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -0
  246. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +15 -0
  247. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -0
  248. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +144 -0
  249. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -0
  250. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +203 -0
  251. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -0
  252. package/dist/ComponentStudio/services/component-studio-state.service.js +651 -0
  253. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -0
  254. package/dist/ComponentStudio/services/component-version.service.d.ts +120 -0
  255. package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -0
  256. package/dist/ComponentStudio/services/component-version.service.js +394 -0
  257. package/dist/ComponentStudio/services/component-version.service.js.map +1 -0
  258. package/dist/Credentials/components/credential-category-edit-panel.component.js +1 -1
  259. package/dist/Credentials/components/credential-edit-panel.component.js +1 -1
  260. package/dist/Credentials/components/credential-type-edit-panel.component.js +1 -1
  261. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +0 -1
  262. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  263. package/dist/Credentials/components/credentials-audit-resource.component.js +200 -196
  264. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  265. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +1 -2
  266. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  267. package/dist/Credentials/components/credentials-categories-resource.component.js +195 -190
  268. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  269. package/dist/Credentials/components/credentials-list-resource.component.d.ts +1 -2
  270. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  271. package/dist/Credentials/components/credentials-list-resource.component.js +252 -241
  272. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  273. package/dist/Credentials/components/credentials-overview-resource.component.d.ts +0 -1
  274. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  275. package/dist/Credentials/components/credentials-overview-resource.component.js +228 -226
  276. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  277. package/dist/Credentials/components/credentials-types-resource.component.d.ts +1 -2
  278. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  279. package/dist/Credentials/components/credentials-types-resource.component.js +214 -210
  280. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  281. package/dist/Credentials/credentials-dashboard.component.d.ts +0 -1
  282. package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
  283. package/dist/Credentials/credentials-dashboard.component.js +31 -44
  284. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  285. package/dist/Credentials/pipes/group-by.pipe.d.ts.map +1 -1
  286. package/dist/Credentials/pipes/group-by.pipe.js +2 -1
  287. package/dist/Credentials/pipes/group-by.pipe.js.map +1 -1
  288. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -1
  289. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  290. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -80
  291. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  292. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  293. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +46 -45
  294. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  295. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +1 -1
  296. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +7 -7
  297. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +1 -1
  298. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +2 -2
  299. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  300. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +15 -15
  301. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  302. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +245 -0
  303. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -0
  304. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +1143 -0
  305. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -0
  306. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  307. package/dist/DataExplorer/components/view-selector/view-selector.component.js +17 -11
  308. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  309. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +0 -4
  310. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  311. package/dist/DataExplorer/data-explorer-dashboard.component.js +49 -54
  312. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  313. package/dist/DataExplorer/data-explorer-resource.component.d.ts +0 -1
  314. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  315. package/dist/DataExplorer/data-explorer-resource.component.js +3 -6
  316. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  317. package/dist/DataExplorer/index.d.ts +2 -2
  318. package/dist/DataExplorer/index.d.ts.map +1 -1
  319. package/dist/DataExplorer/index.js +2 -2
  320. package/dist/DataExplorer/index.js.map +1 -1
  321. package/dist/EntityAdmin/components/entity-details.component.d.ts +50 -0
  322. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +1 -0
  323. package/dist/EntityAdmin/components/entity-details.component.js +680 -0
  324. package/dist/EntityAdmin/components/entity-details.component.js.map +1 -0
  325. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +31 -0
  326. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +1 -0
  327. package/dist/EntityAdmin/components/entity-filter-panel.component.js +160 -0
  328. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -0
  329. package/dist/EntityAdmin/components/erd-composite.component.d.ts +73 -0
  330. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +1 -0
  331. package/dist/EntityAdmin/components/erd-composite.component.js +271 -0
  332. package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -0
  333. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +47 -0
  334. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +1 -0
  335. package/dist/EntityAdmin/components/erd-diagram.component.js +618 -0
  336. package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -0
  337. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +0 -1
  338. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  339. package/dist/EntityAdmin/entity-admin-dashboard.component.js +6 -7
  340. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  341. package/dist/Home/home-application.d.ts +0 -5
  342. package/dist/Home/home-application.d.ts.map +1 -1
  343. package/dist/Home/home-application.js +0 -9
  344. package/dist/Home/home-application.js.map +1 -1
  345. package/dist/Home/home-dashboard.component.d.ts +0 -4
  346. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  347. package/dist/Home/home-dashboard.component.js +141 -139
  348. package/dist/Home/home-dashboard.component.js.map +1 -1
  349. package/dist/Lists/components/lists-browse-resource.component.d.ts +0 -1
  350. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  351. package/dist/Lists/components/lists-browse-resource.component.js +761 -685
  352. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  353. package/dist/Lists/components/lists-categories-resource.component.d.ts +0 -1
  354. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  355. package/dist/Lists/components/lists-categories-resource.component.js +340 -316
  356. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  357. package/dist/Lists/components/lists-my-lists-resource.component.d.ts +0 -1
  358. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  359. package/dist/Lists/components/lists-my-lists-resource.component.js +530 -482
  360. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  361. package/dist/Lists/components/lists-operations-resource.component.d.ts +0 -1
  362. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  363. package/dist/Lists/components/lists-operations-resource.component.js +508 -455
  364. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  365. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  366. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +44 -39
  367. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  368. package/dist/Lists/index.d.ts +0 -1
  369. package/dist/Lists/index.d.ts.map +1 -1
  370. package/dist/Lists/index.js +0 -11
  371. package/dist/Lists/index.js.map +1 -1
  372. package/dist/MCP/components/mcp-connection-dialog.component.d.ts +68 -0
  373. package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -0
  374. package/dist/MCP/components/mcp-connection-dialog.component.js +523 -0
  375. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -0
  376. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts +73 -0
  377. package/dist/MCP/components/mcp-log-detail-panel.component.d.ts.map +1 -0
  378. package/dist/MCP/components/mcp-log-detail-panel.component.js +533 -0
  379. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -0
  380. package/dist/MCP/components/mcp-server-dialog.component.d.ts +76 -0
  381. package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -0
  382. package/dist/MCP/components/mcp-server-dialog.component.js +546 -0
  383. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -0
  384. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts +267 -0
  385. package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -0
  386. package/dist/MCP/components/mcp-test-tool-dialog.component.js +1300 -0
  387. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -0
  388. package/dist/MCP/index.d.ts +11 -0
  389. package/dist/MCP/index.d.ts.map +1 -0
  390. package/dist/MCP/index.js +15 -0
  391. package/dist/MCP/index.js.map +1 -0
  392. package/dist/MCP/mcp-dashboard.component.d.ts +467 -0
  393. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -0
  394. package/dist/MCP/mcp-dashboard.component.js +2765 -0
  395. package/dist/MCP/mcp-dashboard.component.js.map +1 -0
  396. package/dist/MCP/mcp-filter-panel.component.d.ts +54 -0
  397. package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -0
  398. package/dist/MCP/mcp-filter-panel.component.js +288 -0
  399. package/dist/MCP/mcp-filter-panel.component.js.map +1 -0
  400. package/dist/MCP/mcp-resource.component.d.ts +26 -0
  401. package/dist/MCP/mcp-resource.component.d.ts.map +1 -0
  402. package/dist/MCP/mcp-resource.component.js +54 -0
  403. package/dist/MCP/mcp-resource.component.js.map +1 -0
  404. package/dist/MCP/mcp.module.d.ts +24 -0
  405. package/dist/MCP/mcp.module.d.ts.map +1 -0
  406. package/dist/MCP/mcp.module.js +113 -0
  407. package/dist/MCP/mcp.module.js.map +1 -0
  408. package/dist/MCP/services/mcp-tools.service.d.ts +115 -0
  409. package/dist/MCP/services/mcp-tools.service.d.ts.map +1 -0
  410. package/dist/MCP/services/mcp-tools.service.js +221 -0
  411. package/dist/MCP/services/mcp-tools.service.js.map +1 -0
  412. package/dist/QueryBrowser/query-browser-resource.component.d.ts +0 -1
  413. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  414. package/dist/QueryBrowser/query-browser-resource.component.js +79 -88
  415. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  416. package/dist/Scheduling/components/index.d.ts +5 -8
  417. package/dist/Scheduling/components/index.d.ts.map +1 -1
  418. package/dist/Scheduling/components/index.js +6 -9
  419. package/dist/Scheduling/components/index.js.map +1 -1
  420. package/dist/Scheduling/components/job-slideout.component.d.ts +45 -0
  421. package/dist/Scheduling/components/job-slideout.component.d.ts.map +1 -0
  422. package/dist/Scheduling/components/job-slideout.component.js +459 -0
  423. package/dist/Scheduling/components/job-slideout.component.js.map +1 -0
  424. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +15 -0
  425. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -0
  426. package/dist/Scheduling/components/scheduling-activity-resource.component.js +45 -0
  427. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -0
  428. package/dist/Scheduling/components/scheduling-activity.component.d.ts +71 -0
  429. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -0
  430. package/dist/Scheduling/components/scheduling-activity.component.js +714 -0
  431. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -0
  432. package/dist/Scheduling/components/scheduling-health-resource.component.js +1 -1
  433. package/dist/Scheduling/components/scheduling-health.component.js +1 -1
  434. package/dist/Scheduling/components/scheduling-history-resource.component.js +1 -1
  435. package/dist/Scheduling/components/scheduling-history.component.js +1 -1
  436. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +3 -8
  437. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  438. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +5 -15
  439. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  440. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +52 -34
  441. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  442. package/dist/Scheduling/components/scheduling-jobs.component.js +452 -262
  443. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  444. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +1 -1
  445. package/dist/Scheduling/components/scheduling-monitoring.component.js +1 -1
  446. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +15 -0
  447. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -0
  448. package/dist/Scheduling/components/scheduling-overview-resource.component.js +45 -0
  449. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -0
  450. package/dist/Scheduling/components/scheduling-overview.component.d.ts +43 -0
  451. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -0
  452. package/dist/Scheduling/components/scheduling-overview.component.js +600 -0
  453. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -0
  454. package/dist/Scheduling/components/scheduling-types-resource.component.js +1 -1
  455. package/dist/Scheduling/components/scheduling-types.component.js +1 -1
  456. package/dist/Scheduling/scheduling-dashboard.component.d.ts +22 -33
  457. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  458. package/dist/Scheduling/scheduling-dashboard.component.js +173 -175
  459. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  460. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +49 -6
  461. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  462. package/dist/Scheduling/services/scheduling-instrumentation.service.js +218 -149
  463. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  464. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +0 -4
  465. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  466. package/dist/SystemDiagnostics/system-diagnostics.component.js +1552 -1534
  467. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  468. package/dist/Testing/components/index.d.ts +7 -8
  469. package/dist/Testing/components/index.d.ts.map +1 -1
  470. package/dist/Testing/components/index.js +8 -9
  471. package/dist/Testing/components/index.js.map +1 -1
  472. package/dist/Testing/components/testing-analytics-resource.component.d.ts +0 -4
  473. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  474. package/dist/Testing/components/testing-analytics-resource.component.js +3 -9
  475. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  476. package/dist/Testing/components/testing-analytics.component.d.ts +52 -37
  477. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  478. package/dist/Testing/components/testing-analytics.component.js +1024 -570
  479. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  480. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +16 -0
  481. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -0
  482. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +47 -0
  483. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -0
  484. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +57 -0
  485. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -0
  486. package/dist/Testing/components/testing-dashboard-tab.component.js +649 -0
  487. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -0
  488. package/dist/Testing/components/testing-execution-resource.component.js +1 -1
  489. package/dist/Testing/components/testing-execution.component.js +1 -1
  490. package/dist/Testing/components/testing-explorer-resource.component.d.ts +16 -0
  491. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -0
  492. package/dist/Testing/components/testing-explorer-resource.component.js +47 -0
  493. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -0
  494. package/dist/Testing/components/testing-explorer.component.d.ts +193 -0
  495. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -0
  496. package/dist/Testing/components/testing-explorer.component.js +2219 -0
  497. package/dist/Testing/components/testing-explorer.component.js.map +1 -0
  498. package/dist/Testing/components/testing-feedback-resource.component.js +1 -1
  499. package/dist/Testing/components/testing-feedback.component.js +1 -1
  500. package/dist/Testing/components/testing-overview-resource.component.js +1 -1
  501. package/dist/Testing/components/testing-overview.component.js +1 -1
  502. package/dist/Testing/components/testing-review-resource.component.d.ts +16 -0
  503. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -0
  504. package/dist/Testing/components/testing-review-resource.component.js +47 -0
  505. package/dist/Testing/components/testing-review-resource.component.js.map +1 -0
  506. package/dist/Testing/components/testing-review.component.d.ts +60 -0
  507. package/dist/Testing/components/testing-review.component.d.ts.map +1 -0
  508. package/dist/Testing/components/testing-review.component.js +985 -0
  509. package/dist/Testing/components/testing-review.component.js.map +1 -0
  510. package/dist/Testing/components/testing-runs-resource.component.d.ts +16 -0
  511. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -0
  512. package/dist/Testing/components/testing-runs-resource.component.js +47 -0
  513. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -0
  514. package/dist/Testing/components/testing-runs.component.d.ts +82 -0
  515. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -0
  516. package/dist/Testing/components/testing-runs.component.js +1067 -0
  517. package/dist/Testing/components/testing-runs.component.js.map +1 -0
  518. package/dist/Testing/components/testing-version-comparison.component.js +1 -1
  519. package/dist/Testing/components/testing-version-resource.component.js +1 -1
  520. package/dist/Testing/components/widgets/oracle-breakdown-table.component.d.ts.map +1 -1
  521. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +73 -61
  522. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  523. package/dist/Testing/components/widgets/suite-tree.component.d.ts.map +1 -1
  524. package/dist/Testing/components/widgets/suite-tree.component.js +34 -31
  525. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  526. package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts.map +1 -1
  527. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +180 -171
  528. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  529. package/dist/Testing/testing-dashboard.component.d.ts +12 -16
  530. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  531. package/dist/Testing/testing-dashboard.component.js +51 -72
  532. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  533. package/dist/VersionHistory/components/diff-resource.component.d.ts +119 -0
  534. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -0
  535. package/dist/VersionHistory/components/diff-resource.component.js +1162 -0
  536. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -0
  537. package/dist/VersionHistory/components/graph-resource.component.d.ts +67 -0
  538. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -0
  539. package/dist/VersionHistory/components/graph-resource.component.js +521 -0
  540. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -0
  541. package/dist/VersionHistory/components/index.d.ts +5 -0
  542. package/dist/VersionHistory/components/index.d.ts.map +1 -0
  543. package/dist/VersionHistory/components/index.js +5 -0
  544. package/dist/VersionHistory/components/index.js.map +1 -0
  545. package/dist/VersionHistory/components/labels-resource.component.d.ts +89 -0
  546. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -0
  547. package/dist/VersionHistory/components/labels-resource.component.js +968 -0
  548. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -0
  549. package/dist/VersionHistory/components/restore-resource.component.d.ts +40 -0
  550. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -0
  551. package/dist/VersionHistory/components/restore-resource.component.js +472 -0
  552. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -0
  553. package/dist/VersionHistory/index.d.ts +2 -0
  554. package/dist/VersionHistory/index.d.ts.map +1 -0
  555. package/dist/VersionHistory/index.js +2 -0
  556. package/dist/VersionHistory/index.js.map +1 -0
  557. package/dist/generic/base-dashboard.d.ts +65 -0
  558. package/dist/generic/base-dashboard.d.ts.map +1 -0
  559. package/dist/generic/base-dashboard.js +74 -0
  560. package/dist/generic/base-dashboard.js.map +1 -0
  561. package/dist/module.d.ts +127 -104
  562. package/dist/module.d.ts.map +1 -1
  563. package/dist/module.js +221 -95
  564. package/dist/module.js.map +1 -1
  565. package/dist/public-api.d.ts +22 -19
  566. package/dist/public-api.d.ts.map +1 -1
  567. package/dist/public-api.js +28 -119
  568. package/dist/public-api.js.map +1 -1
  569. package/dist/shared/pipes/highlight-search.pipe.d.ts +17 -0
  570. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -0
  571. package/dist/shared/pipes/highlight-search.pipe.js +41 -0
  572. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -0
  573. package/dist/shared/pipes/index.d.ts +2 -0
  574. package/dist/shared/pipes/index.d.ts.map +1 -0
  575. package/dist/shared/pipes/index.js +2 -0
  576. package/dist/shared/pipes/index.js.map +1 -0
  577. package/dist/shared/shared-pipes.module.d.ts +11 -0
  578. package/dist/shared/shared-pipes.module.d.ts.map +1 -0
  579. package/dist/shared/shared-pipes.module.js +24 -0
  580. package/dist/shared/shared-pipes.module.js.map +1 -0
  581. package/package.json +65 -56
@@ -1,23 +1,24 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import { RunView } from '@memberjunction/core';
3
+ import { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "@angular/common";
5
6
  import * as i2 from "@angular/forms";
6
7
  import * as i3 from "@memberjunction/ng-shared-generic";
7
- function APIKeyListComponent_button_11_Template(rf, ctx) { if (rf & 1) {
8
+ function APIKeyListComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
8
9
  const _r1 = i0.ɵɵgetCurrentView();
9
10
  i0.ɵɵelementStart(0, "button", 22);
10
- i0.ɵɵlistener("click", function APIKeyListComponent_button_11_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
11
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_11_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
11
12
  i0.ɵɵelement(1, "i", 23);
12
13
  i0.ɵɵelementEnd();
13
14
  } }
14
- function APIKeyListComponent_mj_loading_45_Template(rf, ctx) { if (rf & 1) {
15
- i0.ɵɵelement(0, "mj-loading", 24);
15
+ function APIKeyListComponent_Conditional_45_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelement(0, "mj-loading", 19);
16
17
  } }
17
- function APIKeyListComponent_div_46_div_22_div_16_ng_container_2_span_1_Template(rf, ctx) { if (rf & 1) {
18
- i0.ɵɵelementStart(0, "span", 61);
18
+ function APIKeyListComponent_Conditional_46_For_23_Conditional_16_For_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵelementStart(0, "span", 57);
19
20
  i0.ɵɵelement(1, "i");
20
- i0.ɵɵelementStart(2, "span", 62);
21
+ i0.ɵɵelementStart(2, "span", 58);
21
22
  i0.ɵɵtext(3);
22
23
  i0.ɵɵelementEnd()();
23
24
  } if (rf & 2) {
@@ -29,17 +30,14 @@ function APIKeyListComponent_div_46_div_22_div_16_ng_container_2_span_1_Template
29
30
  i0.ɵɵadvance(2);
30
31
  i0.ɵɵtextInterpolate(cat_r6.count);
31
32
  } }
32
- function APIKeyListComponent_div_46_div_22_div_16_ng_container_2_Template(rf, ctx) { if (rf & 1) {
33
- i0.ɵɵelementContainerStart(0);
34
- i0.ɵɵtemplate(1, APIKeyListComponent_div_46_div_22_div_16_ng_container_2_span_1_Template, 4, 8, "span", 60);
35
- i0.ɵɵelementContainerEnd();
33
+ function APIKeyListComponent_Conditional_46_For_23_Conditional_16_For_3_Template(rf, ctx) { if (rf & 1) {
34
+ i0.ɵɵconditionalCreate(0, APIKeyListComponent_Conditional_46_For_23_Conditional_16_For_3_Conditional_0_Template, 4, 8, "span", 56);
36
35
  } if (rf & 2) {
37
- const i_r7 = ctx.index;
38
- i0.ɵɵadvance();
39
- i0.ɵɵproperty("ngIf", i_r7 < 3);
36
+ const ɵ$index_154_r7 = ctx.$index;
37
+ i0.ɵɵconditional(ɵ$index_154_r7 < 3 ? 0 : -1);
40
38
  } }
41
- function APIKeyListComponent_div_46_div_22_div_16_span_3_Template(rf, ctx) { if (rf & 1) {
42
- i0.ɵɵelementStart(0, "span", 63);
39
+ function APIKeyListComponent_Conditional_46_For_23_Conditional_16_Conditional_4_Template(rf, ctx) { if (rf & 1) {
40
+ i0.ɵɵelementStart(0, "span", 54);
43
41
  i0.ɵɵtext(1);
44
42
  i0.ɵɵelementEnd();
45
43
  } if (rf & 2) {
@@ -48,58 +46,60 @@ function APIKeyListComponent_div_46_div_22_div_16_span_3_Template(rf, ctx) { if
48
46
  i0.ɵɵadvance();
49
47
  i0.ɵɵtextInterpolate1(" +", ctx_r1.getScopeInfo(key_r5).categories.length - 3, " ");
50
48
  } }
51
- function APIKeyListComponent_div_46_div_22_div_16_Template(rf, ctx) { if (rf & 1) {
52
- i0.ɵɵelementStart(0, "div", 55)(1, "div", 56);
53
- i0.ɵɵtemplate(2, APIKeyListComponent_div_46_div_22_div_16_ng_container_2_Template, 2, 1, "ng-container", 57)(3, APIKeyListComponent_div_46_div_22_div_16_span_3_Template, 2, 1, "span", 58);
49
+ function APIKeyListComponent_Conditional_46_For_23_Conditional_16_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelementStart(0, "div", 45)(1, "div", 53);
51
+ i0.ɵɵrepeaterCreate(2, APIKeyListComponent_Conditional_46_For_23_Conditional_16_For_3_Template, 1, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
52
+ i0.ɵɵconditionalCreate(4, APIKeyListComponent_Conditional_46_For_23_Conditional_16_Conditional_4_Template, 2, 1, "span", 54);
54
53
  i0.ɵɵelementEnd();
55
- i0.ɵɵelementStart(4, "span", 59);
56
- i0.ɵɵtext(5);
54
+ i0.ɵɵelementStart(5, "span", 55);
55
+ i0.ɵɵtext(6);
57
56
  i0.ɵɵelementEnd()();
58
57
  } if (rf & 2) {
59
58
  const key_r5 = i0.ɵɵnextContext().$implicit;
60
59
  const ctx_r1 = i0.ɵɵnextContext(2);
61
60
  i0.ɵɵadvance(2);
62
- i0.ɵɵproperty("ngForOf", ctx_r1.getScopeInfo(key_r5).categories);
63
- i0.ɵɵadvance();
64
- i0.ɵɵproperty("ngIf", ctx_r1.getScopeInfo(key_r5).categories.length > 3);
61
+ i0.ɵɵrepeater(ctx_r1.getScopeInfo(key_r5).categories);
62
+ i0.ɵɵadvance(2);
63
+ i0.ɵɵconditional(ctx_r1.getScopeInfo(key_r5).categories.length > 3 ? 4 : -1);
65
64
  i0.ɵɵadvance(2);
66
65
  i0.ɵɵtextInterpolate1(" ", ctx_r1.getScopeInfo(key_r5).count, " total ");
67
66
  } }
68
- function APIKeyListComponent_div_46_div_22_span_17_Template(rf, ctx) { if (rf & 1) {
69
- i0.ɵɵelementStart(0, "span", 64);
70
- i0.ɵɵelement(1, "i", 65);
67
+ function APIKeyListComponent_Conditional_46_For_23_Conditional_17_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementStart(0, "span", 46);
69
+ i0.ɵɵelement(1, "i", 59);
71
70
  i0.ɵɵtext(2, " None ");
72
71
  i0.ɵɵelementEnd();
73
72
  } }
74
- function APIKeyListComponent_div_46_div_22_Template(rf, ctx) { if (rf & 1) {
73
+ function APIKeyListComponent_Conditional_46_For_23_Template(rf, ctx) { if (rf & 1) {
75
74
  const _r4 = i0.ɵɵgetCurrentView();
76
- i0.ɵɵelementStart(0, "div", 36);
77
- i0.ɵɵlistener("click", function APIKeyListComponent_div_46_div_22_Template_div_click_0_listener() { const key_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.selectKey(key_r5)); });
78
- i0.ɵɵelementStart(1, "div", 37)(2, "div", 38);
79
- i0.ɵɵelement(3, "i", 39);
75
+ i0.ɵɵelementStart(0, "div", 34);
76
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_46_For_23_Template_div_click_0_listener() { const key_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.selectKey(key_r5)); });
77
+ i0.ɵɵelementStart(1, "div", 35)(2, "div", 36);
78
+ i0.ɵɵelement(3, "i", 37);
80
79
  i0.ɵɵelementEnd();
81
- i0.ɵɵelementStart(4, "div", 40)(5, "span", 41);
80
+ i0.ɵɵelementStart(4, "div", 38)(5, "span", 39);
82
81
  i0.ɵɵtext(6);
83
82
  i0.ɵɵelementEnd();
84
- i0.ɵɵelementStart(7, "code", 42);
83
+ i0.ɵɵelementStart(7, "code", 40);
85
84
  i0.ɵɵtext(8);
86
85
  i0.ɵɵelementEnd()()();
87
- i0.ɵɵelementStart(9, "div", 43)(10, "span", 44);
86
+ i0.ɵɵelementStart(9, "div", 41)(10, "span", 42);
88
87
  i0.ɵɵtext(11);
89
88
  i0.ɵɵelementEnd()();
90
- i0.ɵɵelementStart(12, "div", 45)(13, "span", 46);
89
+ i0.ɵɵelementStart(12, "div", 43)(13, "span", 44);
91
90
  i0.ɵɵtext(14);
92
91
  i0.ɵɵelementEnd()();
93
- i0.ɵɵelementStart(15, "div", 30);
94
- i0.ɵɵtemplate(16, APIKeyListComponent_div_46_div_22_div_16_Template, 6, 3, "div", 47)(17, APIKeyListComponent_div_46_div_22_span_17_Template, 3, 0, "span", 48);
92
+ i0.ɵɵelementStart(15, "div", 28);
93
+ i0.ɵɵconditionalCreate(16, APIKeyListComponent_Conditional_46_For_23_Conditional_16_Template, 7, 2, "div", 45);
94
+ i0.ɵɵconditionalCreate(17, APIKeyListComponent_Conditional_46_For_23_Conditional_17_Template, 3, 0, "span", 46);
95
95
  i0.ɵɵelementEnd();
96
- i0.ɵɵelementStart(18, "div", 49)(19, "span", 50);
96
+ i0.ɵɵelementStart(18, "div", 47)(19, "span", 48);
97
97
  i0.ɵɵtext(20);
98
98
  i0.ɵɵelementEnd()();
99
- i0.ɵɵelementStart(21, "div", 51)(22, "span", 52);
99
+ i0.ɵɵelementStart(21, "div", 49)(22, "span", 50);
100
100
  i0.ɵɵtext(23);
101
101
  i0.ɵɵelementEnd()();
102
- i0.ɵɵelementStart(24, "div", 53)(25, "span", 54);
102
+ i0.ɵɵelementStart(24, "div", 51)(25, "span", 52);
103
103
  i0.ɵɵtext(26);
104
104
  i0.ɵɵelementEnd()()();
105
105
  } if (rf & 2) {
@@ -110,7 +110,7 @@ function APIKeyListComponent_div_46_div_22_Template(rf, ctx) { if (rf & 1) {
110
110
  i0.ɵɵadvance(4);
111
111
  i0.ɵɵtextInterpolate(key_r5.Label);
112
112
  i0.ɵɵadvance(2);
113
- i0.ɵɵtextInterpolate1("...", key_r5.Hash.slice(-12), "");
113
+ i0.ɵɵtextInterpolate1("...", key_r5.Hash.slice(-12));
114
114
  i0.ɵɵadvance(3);
115
115
  i0.ɵɵtextInterpolate(key_r5.User);
116
116
  i0.ɵɵadvance(2);
@@ -118,9 +118,9 @@ function APIKeyListComponent_div_46_div_22_Template(rf, ctx) { if (rf & 1) {
118
118
  i0.ɵɵadvance();
119
119
  i0.ɵɵtextInterpolate1(" ", key_r5.Status, " ");
120
120
  i0.ɵɵadvance(2);
121
- i0.ɵɵproperty("ngIf", ctx_r1.getScopeInfo(key_r5).count > 0);
121
+ i0.ɵɵconditional(ctx_r1.getScopeInfo(key_r5).count > 0 ? 16 : -1);
122
122
  i0.ɵɵadvance();
123
- i0.ɵɵproperty("ngIf", ctx_r1.getScopeInfo(key_r5).count === 0);
123
+ i0.ɵɵconditional(ctx_r1.getScopeInfo(key_r5).count === 0 ? 17 : -1);
124
124
  i0.ɵɵadvance(2);
125
125
  i0.ɵɵproperty("ngClass", ctx_r1.getExpirationClass(key_r5));
126
126
  i0.ɵɵadvance();
@@ -132,7 +132,7 @@ function APIKeyListComponent_div_46_div_22_Template(rf, ctx) { if (rf & 1) {
132
132
  i0.ɵɵadvance(3);
133
133
  i0.ɵɵtextInterpolate(ctx_r1.formatDate(key_r5.__mj_CreatedAt));
134
134
  } }
135
- function APIKeyListComponent_div_46_div_23_span_2_Template(rf, ctx) { if (rf & 1) {
135
+ function APIKeyListComponent_Conditional_46_Conditional_24_Conditional_2_Template(rf, ctx) { if (rf & 1) {
136
136
  i0.ɵɵelementStart(0, "span");
137
137
  i0.ɵɵtext(1);
138
138
  i0.ɵɵelementEnd();
@@ -141,7 +141,7 @@ function APIKeyListComponent_div_46_div_23_span_2_Template(rf, ctx) { if (rf & 1
141
141
  i0.ɵɵadvance();
142
142
  i0.ɵɵtextInterpolate1("No keys matching \"", ctx_r1.SearchText, "\"");
143
143
  } }
144
- function APIKeyListComponent_div_46_div_23_span_3_Template(rf, ctx) { if (rf & 1) {
144
+ function APIKeyListComponent_Conditional_46_Conditional_24_Conditional_3_Template(rf, ctx) { if (rf & 1) {
145
145
  i0.ɵɵelementStart(0, "span");
146
146
  i0.ɵɵtext(1);
147
147
  i0.ɵɵelementEnd();
@@ -150,71 +150,75 @@ function APIKeyListComponent_div_46_div_23_span_3_Template(rf, ctx) { if (rf & 1
150
150
  i0.ɵɵadvance();
151
151
  i0.ɵɵtextInterpolate1("No ", ctx_r1.Filter, " keys found");
152
152
  } }
153
- function APIKeyListComponent_div_46_div_23_span_4_Template(rf, ctx) { if (rf & 1) {
153
+ function APIKeyListComponent_Conditional_46_Conditional_24_Conditional_4_Template(rf, ctx) { if (rf & 1) {
154
154
  i0.ɵɵelementStart(0, "span");
155
155
  i0.ɵɵtext(1, "No API keys created yet");
156
156
  i0.ɵɵelementEnd();
157
157
  } }
158
- function APIKeyListComponent_div_46_div_23_button_5_Template(rf, ctx) { if (rf & 1) {
158
+ function APIKeyListComponent_Conditional_46_Conditional_24_Conditional_5_Template(rf, ctx) { if (rf & 1) {
159
159
  const _r8 = i0.ɵɵgetCurrentView();
160
- i0.ɵɵelementStart(0, "button", 69);
161
- i0.ɵɵlistener("click", function APIKeyListComponent_div_46_div_23_button_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.requestCreate()); });
160
+ i0.ɵɵelementStart(0, "button", 61);
161
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_46_Conditional_24_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.requestCreate()); });
162
162
  i0.ɵɵelement(1, "i", 10);
163
163
  i0.ɵɵtext(2, " Generate Your First Key ");
164
164
  i0.ɵɵelementEnd();
165
165
  } }
166
- function APIKeyListComponent_div_46_div_23_Template(rf, ctx) { if (rf & 1) {
167
- i0.ɵɵelementStart(0, "div", 66);
168
- i0.ɵɵelement(1, "i", 39);
169
- i0.ɵɵtemplate(2, APIKeyListComponent_div_46_div_23_span_2_Template, 2, 1, "span", 67)(3, APIKeyListComponent_div_46_div_23_span_3_Template, 2, 1, "span", 67)(4, APIKeyListComponent_div_46_div_23_span_4_Template, 2, 0, "span", 67)(5, APIKeyListComponent_div_46_div_23_button_5_Template, 3, 0, "button", 68);
166
+ function APIKeyListComponent_Conditional_46_Conditional_24_Template(rf, ctx) { if (rf & 1) {
167
+ i0.ɵɵelementStart(0, "div", 33);
168
+ i0.ɵɵelement(1, "i", 37);
169
+ i0.ɵɵconditionalCreate(2, APIKeyListComponent_Conditional_46_Conditional_24_Conditional_2_Template, 2, 1, "span");
170
+ i0.ɵɵconditionalCreate(3, APIKeyListComponent_Conditional_46_Conditional_24_Conditional_3_Template, 2, 1, "span");
171
+ i0.ɵɵconditionalCreate(4, APIKeyListComponent_Conditional_46_Conditional_24_Conditional_4_Template, 2, 0, "span");
172
+ i0.ɵɵconditionalCreate(5, APIKeyListComponent_Conditional_46_Conditional_24_Conditional_5_Template, 3, 0, "button", 60);
170
173
  i0.ɵɵelementEnd();
171
174
  } if (rf & 2) {
172
175
  const ctx_r1 = i0.ɵɵnextContext(2);
173
176
  i0.ɵɵadvance(2);
174
- i0.ɵɵproperty("ngIf", ctx_r1.SearchText);
177
+ i0.ɵɵconditional(ctx_r1.SearchText ? 2 : -1);
175
178
  i0.ɵɵadvance();
176
- i0.ɵɵproperty("ngIf", !ctx_r1.SearchText && ctx_r1.Filter !== "all");
179
+ i0.ɵɵconditional(!ctx_r1.SearchText && ctx_r1.Filter !== "all" ? 3 : -1);
177
180
  i0.ɵɵadvance();
178
- i0.ɵɵproperty("ngIf", !ctx_r1.SearchText && ctx_r1.Filter === "all");
181
+ i0.ɵɵconditional(!ctx_r1.SearchText && ctx_r1.Filter === "all" ? 4 : -1);
179
182
  i0.ɵɵadvance();
180
- i0.ɵɵproperty("ngIf", ctx_r1.Filter === "all" && !ctx_r1.SearchText);
183
+ i0.ɵɵconditional(ctx_r1.Filter === "all" && !ctx_r1.SearchText ? 5 : -1);
181
184
  } }
182
- function APIKeyListComponent_div_46_Template(rf, ctx) { if (rf & 1) {
185
+ function APIKeyListComponent_Conditional_46_Template(rf, ctx) { if (rf & 1) {
183
186
  const _r3 = i0.ɵɵgetCurrentView();
184
- i0.ɵɵelementStart(0, "div", 25)(1, "div", 26)(2, "div", 27);
185
- i0.ɵɵlistener("click", function APIKeyListComponent_div_46_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("Label")); });
187
+ i0.ɵɵelementStart(0, "div", 20)(1, "div", 24)(2, "div", 25);
188
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_46_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("Label")); });
186
189
  i0.ɵɵtext(3, " Key ");
187
190
  i0.ɵɵelement(4, "i");
188
191
  i0.ɵɵelementEnd();
189
- i0.ɵɵelementStart(5, "div", 28);
190
- i0.ɵɵlistener("click", function APIKeyListComponent_div_46_Template_div_click_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("User")); });
192
+ i0.ɵɵelementStart(5, "div", 26);
193
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_46_Template_div_click_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("User")); });
191
194
  i0.ɵɵtext(6, " Owner ");
192
195
  i0.ɵɵelement(7, "i");
193
196
  i0.ɵɵelementEnd();
194
- i0.ɵɵelementStart(8, "div", 29);
195
- i0.ɵɵlistener("click", function APIKeyListComponent_div_46_Template_div_click_8_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("Status")); });
197
+ i0.ɵɵelementStart(8, "div", 27);
198
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_46_Template_div_click_8_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("Status")); });
196
199
  i0.ɵɵtext(9, " Status ");
197
200
  i0.ɵɵelement(10, "i");
198
201
  i0.ɵɵelementEnd();
199
- i0.ɵɵelementStart(11, "div", 30);
202
+ i0.ɵɵelementStart(11, "div", 28);
200
203
  i0.ɵɵtext(12, " Scopes ");
201
204
  i0.ɵɵelementEnd();
202
- i0.ɵɵelementStart(13, "div", 31);
203
- i0.ɵɵlistener("click", function APIKeyListComponent_div_46_Template_div_click_13_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("ExpiresAt")); });
205
+ i0.ɵɵelementStart(13, "div", 29);
206
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_46_Template_div_click_13_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("ExpiresAt")); });
204
207
  i0.ɵɵtext(14, " Expires ");
205
208
  i0.ɵɵelement(15, "i");
206
209
  i0.ɵɵelementEnd();
207
- i0.ɵɵelementStart(16, "div", 32);
208
- i0.ɵɵlistener("click", function APIKeyListComponent_div_46_Template_div_click_16_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("LastUsedAt")); });
210
+ i0.ɵɵelementStart(16, "div", 30);
211
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_46_Template_div_click_16_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("LastUsedAt")); });
209
212
  i0.ɵɵtext(17, " Last Used ");
210
213
  i0.ɵɵelement(18, "i");
211
214
  i0.ɵɵelementEnd();
212
- i0.ɵɵelementStart(19, "div", 33);
213
- i0.ɵɵlistener("click", function APIKeyListComponent_div_46_Template_div_click_19_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("__mj_CreatedAt")); });
215
+ i0.ɵɵelementStart(19, "div", 31);
216
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_46_Template_div_click_19_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSort("__mj_CreatedAt")); });
214
217
  i0.ɵɵtext(20, " Created ");
215
218
  i0.ɵɵelement(21, "i");
216
219
  i0.ɵɵelementEnd()();
217
- i0.ɵɵtemplate(22, APIKeyListComponent_div_46_div_22_Template, 27, 18, "div", 34)(23, APIKeyListComponent_div_46_div_23_Template, 6, 4, "div", 35);
220
+ i0.ɵɵrepeaterCreate(22, APIKeyListComponent_Conditional_46_For_23_Template, 27, 18, "div", 32, i0.ɵɵrepeaterTrackByIdentity);
221
+ i0.ɵɵconditionalCreate(24, APIKeyListComponent_Conditional_46_Conditional_24_Template, 6, 4, "div", 33);
218
222
  i0.ɵɵelementEnd();
219
223
  } if (rf & 2) {
220
224
  const ctx_r1 = i0.ɵɵnextContext();
@@ -231,14 +235,14 @@ function APIKeyListComponent_div_46_Template(rf, ctx) { if (rf & 1) {
231
235
  i0.ɵɵadvance(3);
232
236
  i0.ɵɵclassMap(ctx_r1.getSortIcon("__mj_CreatedAt"));
233
237
  i0.ɵɵadvance();
234
- i0.ɵɵproperty("ngForOf", ctx_r1.getPaginatedKeys());
235
- i0.ɵɵadvance();
236
- i0.ɵɵproperty("ngIf", ctx_r1.FilteredKeys.length === 0);
238
+ i0.ɵɵrepeater(ctx_r1.getPaginatedKeys());
239
+ i0.ɵɵadvance(2);
240
+ i0.ɵɵconditional(ctx_r1.FilteredKeys.length === 0 ? 24 : -1);
237
241
  } }
238
- function APIKeyListComponent_div_47_ng_container_6_button_1_Template(rf, ctx) { if (rf & 1) {
242
+ function APIKeyListComponent_Conditional_47_For_7_Conditional_0_Template(rf, ctx) { if (rf & 1) {
239
243
  const _r10 = i0.ɵɵgetCurrentView();
240
- i0.ɵɵelementStart(0, "button", 78);
241
- i0.ɵɵlistener("click", function APIKeyListComponent_div_47_ng_container_6_button_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const page_r11 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.goToPage(page_r11)); });
244
+ i0.ɵɵelementStart(0, "button", 69);
245
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_47_For_7_Conditional_0_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const page_r11 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.goToPage(page_r11)); });
242
246
  i0.ɵɵtext(1);
243
247
  i0.ɵɵelementEnd();
244
248
  } if (rf & 2) {
@@ -248,35 +252,33 @@ function APIKeyListComponent_div_47_ng_container_6_button_1_Template(rf, ctx) {
248
252
  i0.ɵɵadvance();
249
253
  i0.ɵɵtextInterpolate1(" ", page_r11, " ");
250
254
  } }
251
- function APIKeyListComponent_div_47_ng_container_6_span_2_Template(rf, ctx) { if (rf & 1) {
252
- i0.ɵɵelementStart(0, "span", 79);
255
+ function APIKeyListComponent_Conditional_47_For_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
256
+ i0.ɵɵelementStart(0, "span", 68);
253
257
  i0.ɵɵtext(1, "...");
254
258
  i0.ɵɵelementEnd();
255
259
  } }
256
- function APIKeyListComponent_div_47_ng_container_6_Template(rf, ctx) { if (rf & 1) {
257
- i0.ɵɵelementContainerStart(0);
258
- i0.ɵɵtemplate(1, APIKeyListComponent_div_47_ng_container_6_button_1_Template, 2, 3, "button", 76)(2, APIKeyListComponent_div_47_ng_container_6_span_2_Template, 2, 0, "span", 77);
259
- i0.ɵɵelementContainerEnd();
260
+ function APIKeyListComponent_Conditional_47_For_7_Template(rf, ctx) { if (rf & 1) {
261
+ i0.ɵɵconditionalCreate(0, APIKeyListComponent_Conditional_47_For_7_Conditional_0_Template, 2, 3, "button", 67);
262
+ i0.ɵɵconditionalCreate(1, APIKeyListComponent_Conditional_47_For_7_Conditional_1_Template, 2, 0, "span", 68);
260
263
  } if (rf & 2) {
261
264
  const page_r11 = ctx.$implicit;
265
+ i0.ɵɵconditional(page_r11 > 0 ? 0 : -1);
262
266
  i0.ɵɵadvance();
263
- i0.ɵɵproperty("ngIf", page_r11 > 0);
264
- i0.ɵɵadvance();
265
- i0.ɵɵproperty("ngIf", page_r11 === -1);
267
+ i0.ɵɵconditional(page_r11 === -1 ? 1 : -1);
266
268
  } }
267
- function APIKeyListComponent_div_47_Template(rf, ctx) { if (rf & 1) {
269
+ function APIKeyListComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
268
270
  const _r9 = i0.ɵɵgetCurrentView();
269
- i0.ɵɵelementStart(0, "div", 70)(1, "div", 71);
271
+ i0.ɵɵelementStart(0, "div", 21)(1, "div", 62);
270
272
  i0.ɵɵtext(2);
271
273
  i0.ɵɵelementEnd();
272
- i0.ɵɵelementStart(3, "div", 72)(4, "button", 73);
273
- i0.ɵɵlistener("click", function APIKeyListComponent_div_47_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.goToPage(ctx_r1.CurrentPage - 1)); });
274
- i0.ɵɵelement(5, "i", 74);
274
+ i0.ɵɵelementStart(3, "div", 63)(4, "button", 64);
275
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_47_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.goToPage(ctx_r1.CurrentPage - 1)); });
276
+ i0.ɵɵelement(5, "i", 65);
275
277
  i0.ɵɵelementEnd();
276
- i0.ɵɵtemplate(6, APIKeyListComponent_div_47_ng_container_6_Template, 3, 2, "ng-container", 57);
277
- i0.ɵɵelementStart(7, "button", 73);
278
- i0.ɵɵlistener("click", function APIKeyListComponent_div_47_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.goToPage(ctx_r1.CurrentPage + 1)); });
279
- i0.ɵɵelement(8, "i", 75);
278
+ i0.ɵɵrepeaterCreate(6, APIKeyListComponent_Conditional_47_For_7_Template, 2, 2, null, null, i0.ɵɵrepeaterTrackByIdentity);
279
+ i0.ɵɵelementStart(8, "button", 64);
280
+ i0.ɵɵlistener("click", function APIKeyListComponent_Conditional_47_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.goToPage(ctx_r1.CurrentPage + 1)); });
281
+ i0.ɵɵelement(9, "i", 66);
280
282
  i0.ɵɵelementEnd()()();
281
283
  } if (rf & 2) {
282
284
  const ctx_r1 = i0.ɵɵnextContext();
@@ -285,14 +287,10 @@ function APIKeyListComponent_div_47_Template(rf, ctx) { if (rf & 1) {
285
287
  i0.ɵɵadvance(2);
286
288
  i0.ɵɵproperty("disabled", ctx_r1.CurrentPage === 1);
287
289
  i0.ɵɵadvance(2);
288
- i0.ɵɵproperty("ngForOf", ctx_r1.getPageNumbers());
289
- i0.ɵɵadvance();
290
+ i0.ɵɵrepeater(ctx_r1.getPageNumbers());
291
+ i0.ɵɵadvance(2);
290
292
  i0.ɵɵproperty("disabled", ctx_r1.CurrentPage === ctx_r1.getTotalPages());
291
293
  } }
292
- /** Tree shaking prevention function */
293
- export function LoadAPIKeyList() {
294
- // This function prevents tree shaking
295
- }
296
294
  /**
297
295
  * List view component for displaying and filtering API keys
298
296
  */
@@ -326,18 +324,13 @@ export class APIKeyListComponent {
326
324
  // Scope counts per key
327
325
  KeyScopeMap = new Map();
328
326
  AllScopes = [];
329
- // Category config for scope display
330
- categoryConfig = {
331
- 'Entities': { icon: 'fa-solid fa-database', color: '#6366f1' },
332
- 'Agents': { icon: 'fa-solid fa-robot', color: '#10b981' },
333
- 'Admin': { icon: 'fa-solid fa-shield-halved', color: '#f59e0b' },
334
- 'Actions': { icon: 'fa-solid fa-bolt', color: '#8b5cf6' },
335
- 'Queries': { icon: 'fa-solid fa-magnifying-glass', color: '#3b82f6' },
336
- 'Views': { icon: 'fa-solid fa-eye', color: '#06b6d4' },
337
- 'Reports': { icon: 'fa-solid fa-chart-bar', color: '#ef4444' },
338
- 'Communication': { icon: 'fa-solid fa-envelope', color: '#ec4899' },
339
- 'Other': { icon: 'fa-solid fa-ellipsis', color: '#6b7280' }
327
+ // Default UI config for categories without explicit configuration
328
+ defaultUIConfig = {
329
+ icon: 'fa-solid fa-ellipsis',
330
+ color: '#6b7280'
340
331
  };
332
+ // Dynamic category UI config built from root scopes
333
+ categoryUIConfigs = new Map();
341
334
  async ngOnInit() {
342
335
  await this.loadKeys();
343
336
  }
@@ -353,17 +346,14 @@ export class APIKeyListComponent {
353
346
  this.IsLoading = true;
354
347
  try {
355
348
  const rv = new RunView();
356
- // Load keys, scopes, and key-scope assignments in parallel
357
- const [keysResult, scopesResult, keyScopesResult] = await rv.RunViews([
349
+ const base = APIKeysEngineBase.Instance;
350
+ // Load keys and key-scope assignments (scopes from cache)
351
+ const [keysResult, keyScopesResult] = await rv.RunViews([
358
352
  {
359
353
  EntityName: 'MJ: API Keys',
360
354
  OrderBy: '__mj_CreatedAt DESC',
361
355
  ResultType: 'entity_object'
362
356
  },
363
- {
364
- EntityName: 'MJ: API Scopes',
365
- ResultType: 'entity_object'
366
- },
367
357
  {
368
358
  EntityName: 'MJ: API Key Scopes',
369
359
  ResultType: 'entity_object'
@@ -371,7 +361,18 @@ export class APIKeyListComponent {
371
361
  ]);
372
362
  if (keysResult.Success) {
373
363
  this.AllKeys = keysResult.Results;
374
- this.AllScopes = (scopesResult.Success ? scopesResult.Results : []);
364
+ this.AllScopes = base.Scopes;
365
+ // Build category UI config from root scopes
366
+ this.categoryUIConfigs.clear();
367
+ for (const scope of this.AllScopes) {
368
+ if (!scope.ParentID) {
369
+ const uiConfig = parseAPIScopeUIConfig(scope);
370
+ this.categoryUIConfigs.set(scope.Category, {
371
+ icon: uiConfig.icon || this.defaultUIConfig.icon,
372
+ color: uiConfig.color || this.defaultUIConfig.color
373
+ });
374
+ }
375
+ }
375
376
  // Build scope lookup map
376
377
  const scopeMap = new Map();
377
378
  for (const scope of this.AllScopes) {
@@ -397,7 +398,7 @@ export class APIKeyListComponent {
397
398
  for (const [keyId, data] of keyToScopes.entries()) {
398
399
  const categories = Array.from(data.categories.entries())
399
400
  .map(([category, count]) => {
400
- const config = this.categoryConfig[category] || this.categoryConfig['Other'];
401
+ const config = this.categoryUIConfigs.get(category) || this.defaultUIConfig;
401
402
  return {
402
403
  category,
403
404
  count,
@@ -698,7 +699,7 @@ export class APIKeyListComponent {
698
699
  }
699
700
  }
700
701
  static ɵfac = function APIKeyListComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || APIKeyListComponent)(); };
701
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIKeyListComponent, selectors: [["mj-api-key-list"]], inputs: { Filter: "Filter" }, outputs: { KeySelected: "KeySelected", CreateRequested: "CreateRequested" }, features: [i0.ɵɵNgOnChangesFeature], decls: 48, vars: 29, consts: [[1, "list-container"], [1, "list-header"], [1, "header-left"], [1, "count-badge"], [1, "header-right"], [1, "search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search keys...", 3, "ngModelChange", "ngModel"], ["class", "clear-search", 3, "click", 4, "ngIf"], [1, "create-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "filter-tabs"], [1, "filter-tab", 3, "click"], [1, "tab-count"], [1, "fa-solid", "fa-check-circle", "status-active"], [1, "fa-solid", "fa-clock", "status-warning"], [1, "fa-solid", "fa-circle-exclamation", "status-danger"], [1, "fa-solid", "fa-question-circle", "status-info"], [1, "fa-solid", "fa-ban", "status-revoked"], ["text", "Loading API keys...", 4, "ngIf"], ["class", "key-grid", 4, "ngIf"], ["class", "pagination", 4, "ngIf"], [1, "clear-search", 3, "click"], [1, "fa-solid", "fa-times"], ["text", "Loading API keys..."], [1, "key-grid"], [1, "grid-header"], [1, "col-key", "sortable", 3, "click"], [1, "col-owner", "sortable", 3, "click"], [1, "col-status", "sortable", 3, "click"], [1, "col-scopes"], [1, "col-expires", "sortable", 3, "click"], [1, "col-used", "sortable", 3, "click"], [1, "col-created", "sortable", 3, "click"], ["class", "grid-row", 3, "click", 4, "ngFor", "ngForOf"], ["class", "empty-state", 4, "ngIf"], [1, "grid-row", 3, "click"], [1, "col-key"], [1, "key-icon"], [1, "fa-solid", "fa-key"], [1, "key-details"], [1, "key-label"], [1, "key-hash"], [1, "col-owner"], [1, "owner-name"], [1, "col-status"], [1, "status-badge"], ["class", "scopes-display", 4, "ngIf"], ["class", "no-scopes", 4, "ngIf"], [1, "col-expires"], [1, "expires-value", 3, "ngClass"], [1, "col-used"], [1, "used-value"], [1, "col-created"], [1, "created-value"], [1, "scopes-display"], [1, "scope-badges"], [4, "ngFor", "ngForOf"], ["class", "scope-more", 4, "ngIf"], [1, "scopes-total"], ["class", "scope-badge", 3, "backgroundColor", "color", "title", 4, "ngIf"], [1, "scope-badge", 3, "title"], [1, "badge-count"], [1, "scope-more"], [1, "no-scopes"], [1, "fa-solid", "fa-shield-xmark"], [1, "empty-state"], [4, "ngIf"], ["class", "create-empty-btn", 3, "click", 4, "ngIf"], [1, "create-empty-btn", 3, "click"], [1, "pagination"], [1, "page-info"], [1, "page-buttons"], [1, "page-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], [1, "fa-solid", "fa-chevron-right"], ["class", "page-btn", 3, "active", "click", 4, "ngIf"], ["class", "page-ellipsis", 4, "ngIf"], [1, "page-btn", 3, "click"], [1, "page-ellipsis"]], template: function APIKeyListComponent_Template(rf, ctx) { if (rf & 1) {
702
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIKeyListComponent, selectors: [["mj-api-key-list"]], inputs: { Filter: "Filter" }, outputs: { KeySelected: "KeySelected", CreateRequested: "CreateRequested" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 48, vars: 29, consts: [[1, "list-container"], [1, "list-header"], [1, "header-left"], [1, "count-badge"], [1, "header-right"], [1, "search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search keys...", 3, "ngModelChange", "ngModel"], [1, "clear-search"], [1, "create-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "filter-tabs"], [1, "filter-tab", 3, "click"], [1, "tab-count"], [1, "fa-solid", "fa-check-circle", "status-active"], [1, "fa-solid", "fa-clock", "status-warning"], [1, "fa-solid", "fa-circle-exclamation", "status-danger"], [1, "fa-solid", "fa-question-circle", "status-info"], [1, "fa-solid", "fa-ban", "status-revoked"], ["text", "Loading API keys..."], [1, "key-grid"], [1, "pagination"], [1, "clear-search", 3, "click"], [1, "fa-solid", "fa-times"], [1, "grid-header"], [1, "col-key", "sortable", 3, "click"], [1, "col-owner", "sortable", 3, "click"], [1, "col-status", "sortable", 3, "click"], [1, "col-scopes"], [1, "col-expires", "sortable", 3, "click"], [1, "col-used", "sortable", 3, "click"], [1, "col-created", "sortable", 3, "click"], [1, "grid-row"], [1, "empty-state"], [1, "grid-row", 3, "click"], [1, "col-key"], [1, "key-icon"], [1, "fa-solid", "fa-key"], [1, "key-details"], [1, "key-label"], [1, "key-hash"], [1, "col-owner"], [1, "owner-name"], [1, "col-status"], [1, "status-badge"], [1, "scopes-display"], [1, "no-scopes"], [1, "col-expires"], [1, "expires-value", 3, "ngClass"], [1, "col-used"], [1, "used-value"], [1, "col-created"], [1, "created-value"], [1, "scope-badges"], [1, "scope-more"], [1, "scopes-total"], [1, "scope-badge", 3, "backgroundColor", "color", "title"], [1, "scope-badge", 3, "title"], [1, "badge-count"], [1, "fa-solid", "fa-shield-xmark"], [1, "create-empty-btn"], [1, "create-empty-btn", 3, "click"], [1, "page-info"], [1, "page-buttons"], [1, "page-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], [1, "fa-solid", "fa-chevron-right"], [1, "page-btn", 3, "active"], [1, "page-ellipsis"], [1, "page-btn", 3, "click"]], template: function APIKeyListComponent_Template(rf, ctx) { if (rf & 1) {
702
703
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h3");
703
704
  i0.ɵɵtext(4, "API Keys");
704
705
  i0.ɵɵelementEnd();
@@ -711,7 +712,7 @@ export class APIKeyListComponent {
711
712
  i0.ɵɵtwoWayListener("ngModelChange", function APIKeyListComponent_Template_input_ngModelChange_10_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SearchText, $event) || (ctx.SearchText = $event); return $event; });
712
713
  i0.ɵɵlistener("ngModelChange", function APIKeyListComponent_Template_input_ngModelChange_10_listener() { return ctx.onSearch(); });
713
714
  i0.ɵɵelementEnd();
714
- i0.ɵɵtemplate(11, APIKeyListComponent_button_11_Template, 2, 0, "button", 8);
715
+ i0.ɵɵconditionalCreate(11, APIKeyListComponent_Conditional_11_Template, 2, 0, "button", 8);
715
716
  i0.ɵɵelementEnd();
716
717
  i0.ɵɵelementStart(12, "button", 9);
717
718
  i0.ɵɵlistener("click", function APIKeyListComponent_Template_button_click_12_listener() { return ctx.requestCreate(); });
@@ -759,15 +760,17 @@ export class APIKeyListComponent {
759
760
  i0.ɵɵelementStart(43, "span", 13);
760
761
  i0.ɵɵtext(44);
761
762
  i0.ɵɵelementEnd()()();
762
- i0.ɵɵtemplate(45, APIKeyListComponent_mj_loading_45_Template, 1, 0, "mj-loading", 19)(46, APIKeyListComponent_div_46_Template, 24, 14, "div", 20)(47, APIKeyListComponent_div_47_Template, 9, 6, "div", 21);
763
+ i0.ɵɵconditionalCreate(45, APIKeyListComponent_Conditional_45_Template, 1, 0, "mj-loading", 19);
764
+ i0.ɵɵconditionalCreate(46, APIKeyListComponent_Conditional_46_Template, 25, 13, "div", 20);
765
+ i0.ɵɵconditionalCreate(47, APIKeyListComponent_Conditional_47_Template, 10, 5, "div", 21);
763
766
  i0.ɵɵelementEnd();
764
767
  } if (rf & 2) {
765
768
  i0.ɵɵadvance(6);
766
- i0.ɵɵtextInterpolate2("", ctx.FilteredKeys.length, " of ", ctx.AllKeys.length, "");
769
+ i0.ɵɵtextInterpolate2("", ctx.FilteredKeys.length, " of ", ctx.AllKeys.length);
767
770
  i0.ɵɵadvance(4);
768
771
  i0.ɵɵtwoWayProperty("ngModel", ctx.SearchText);
769
772
  i0.ɵɵadvance();
770
- i0.ɵɵproperty("ngIf", ctx.SearchText);
773
+ i0.ɵɵconditional(ctx.SearchText ? 11 : -1);
771
774
  i0.ɵɵadvance(5);
772
775
  i0.ɵɵclassProp("active", ctx.Filter === "all");
773
776
  i0.ɵɵadvance(3);
@@ -793,16 +796,16 @@ export class APIKeyListComponent {
793
796
  i0.ɵɵadvance(4);
794
797
  i0.ɵɵtextInterpolate(ctx.Stats.revoked);
795
798
  i0.ɵɵadvance();
796
- i0.ɵɵproperty("ngIf", ctx.IsLoading);
799
+ i0.ɵɵconditional(ctx.IsLoading ? 45 : -1);
797
800
  i0.ɵɵadvance();
798
- i0.ɵɵproperty("ngIf", !ctx.IsLoading);
801
+ i0.ɵɵconditional(!ctx.IsLoading ? 46 : -1);
799
802
  i0.ɵɵadvance();
800
- i0.ɵɵproperty("ngIf", !ctx.IsLoading && ctx.FilteredKeys.length > ctx.PageSize);
801
- } }, dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.LoadingComponent], styles: [".list-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n\n\n.list-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-left[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #78350f;\n}\n\n.count-badge[_ngcontent-%COMP%] {\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.7);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #92400e;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.search-box[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-box[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n color: #9ca3af;\n font-size: 14px;\n}\n\n.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 260px;\n padding: 10px 36px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #f59e0b;\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n\n.clear-search[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #e5e7eb;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-search[_ngcontent-%COMP%]:hover {\n background: #d1d5db;\n}\n\n.clear-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n position: static;\n font-size: 10px;\n color: #6b7280;\n}\n\n\n\n.create-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-btn[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n\n\n.filter-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n padding: 0 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n overflow-x: auto;\n}\n\n.filter-tab[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 16px;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.2s ease;\n}\n\n.filter-tab[_ngcontent-%COMP%]:hover {\n color: #374151;\n background: #f3f4f6;\n}\n\n.filter-tab.active[_ngcontent-%COMP%] {\n color: #f59e0b;\n border-bottom-color: #f59e0b;\n}\n\n.filter-tab.has-warning[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.filter-tab.has-danger[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.tab-count[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.status-active[_ngcontent-%COMP%] { color: #10b981; }\n.status-warning[_ngcontent-%COMP%] { color: #f59e0b; }\n.status-danger[_ngcontent-%COMP%] { color: #ef4444; }\n.status-info[_ngcontent-%COMP%] { color: #6b7280; }\n.status-revoked[_ngcontent-%COMP%] { color: #6b7280; }\n\n\n\n.key-grid[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.grid-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 2fr 1fr 90px 160px 100px 110px 100px;\n gap: 12px;\n padding: 14px 24px;\n background: #f3f4f6;\n border-bottom: 1px solid #e5e7eb;\n font-size: 11px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n}\n\n.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s ease;\n}\n\n.sortable[_ngcontent-%COMP%]:hover {\n color: #374151;\n}\n\n.sortable[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.5;\n}\n\n\n\n.grid-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 2fr 1fr 90px 160px 100px 110px 100px;\n gap: 12px;\n padding: 16px 24px;\n border-bottom: 1px solid #f3f4f6;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n}\n\n.grid-row[_ngcontent-%COMP%]:hover {\n background: #fefce8;\n}\n\n.grid-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n\n\n.col-key[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n}\n\n.key-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #6b7280 0%, #4b5563 100%);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.key-icon.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n}\n\n.key-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: white;\n}\n\n.key-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.key-label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.key-hash[_ngcontent-%COMP%] {\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 11px;\n color: #6b7280;\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n\n\n.owner-name[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #374151;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n}\n\n.status-badge.active[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.revoked[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n\n\n.col-scopes[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.scopes-display[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-badges[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.scope-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n cursor: default;\n transition: transform 0.15s ease;\n}\n\n.scope-badge[_ngcontent-%COMP%]:hover {\n transform: scale(1.05);\n}\n\n.scope-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.badge-count[_ngcontent-%COMP%] {\n font-weight: 700;\n}\n\n.scope-more[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 6px;\n background: #f3f4f6;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 600;\n color: #6b7280;\n}\n\n.scopes-total[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #9ca3af;\n}\n\n.no-scopes[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #d1d5db;\n}\n\n.no-scopes[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n.expires-value[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.expires-value.never[_ngcontent-%COMP%] {\n color: #6b7280;\n}\n\n.expires-value.ok[_ngcontent-%COMP%] {\n color: #059669;\n}\n\n.expires-value.warning[_ngcontent-%COMP%] {\n color: #d97706;\n font-weight: 500;\n}\n\n.expires-value.critical[_ngcontent-%COMP%] {\n color: #dc2626;\n font-weight: 600;\n}\n\n.expires-value.expired[_ngcontent-%COMP%] {\n color: #dc2626;\n font-weight: 600;\n}\n\n\n\n.used-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #374151;\n}\n\n.used-value.never[_ngcontent-%COMP%] {\n color: #9ca3af;\n font-style: italic;\n}\n\n\n\n.created-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\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 color: #6b7280;\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #374151;\n}\n\n.create-empty-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 20px;\n padding: 12px 24px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-empty-btn[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n\n\n.pagination[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n}\n\n.page-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\n}\n\n.page-buttons[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.page-btn[_ngcontent-%COMP%] {\n min-width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #374151;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.page-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.page-btn.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.page-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.page-ellipsis[_ngcontent-%COMP%] {\n padding: 0 8px;\n color: #9ca3af;\n}\n\n\n\n@media (max-width: 1200px) {\n .grid-header[_ngcontent-%COMP%], \n .grid-row[_ngcontent-%COMP%] {\n grid-template-columns: 2fr 1fr 90px 120px 100px;\n }\n\n .col-used[_ngcontent-%COMP%], \n .col-created[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n@media (max-width: 1024px) {\n .grid-header[_ngcontent-%COMP%], \n .grid-row[_ngcontent-%COMP%] {\n grid-template-columns: 2fr 90px 110px 100px;\n }\n\n .col-owner[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n@media (max-width: 768px) {\n .list-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-right[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: space-between;\n }\n\n .search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 180px;\n }\n\n .grid-header[_ngcontent-%COMP%], \n .grid-row[_ngcontent-%COMP%] {\n grid-template-columns: 2fr 90px 100px;\n }\n\n .col-expires[_ngcontent-%COMP%], \n .col-scopes[_ngcontent-%COMP%] {\n display: none;\n }\n\n .filter-tabs[_ngcontent-%COMP%] {\n padding: 0 16px;\n }\n}"] });
803
+ i0.ɵɵconditional(!ctx.IsLoading && ctx.FilteredKeys.length > ctx.PageSize ? 47 : -1);
804
+ } }, dependencies: [i1.NgClass, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.LoadingComponent], styles: [".list-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n\n\n.list-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-left[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #78350f;\n}\n\n.count-badge[_ngcontent-%COMP%] {\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.7);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #92400e;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.search-box[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-box[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n color: #9ca3af;\n font-size: 14px;\n}\n\n.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 260px;\n padding: 10px 36px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #f59e0b;\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n\n.clear-search[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #e5e7eb;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-search[_ngcontent-%COMP%]:hover {\n background: #d1d5db;\n}\n\n.clear-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n position: static;\n font-size: 10px;\n color: #6b7280;\n}\n\n\n\n.create-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-btn[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n\n\n.filter-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n padding: 0 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n overflow-x: auto;\n}\n\n.filter-tab[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 16px;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.2s ease;\n}\n\n.filter-tab[_ngcontent-%COMP%]:hover {\n color: #374151;\n background: #f3f4f6;\n}\n\n.filter-tab.active[_ngcontent-%COMP%] {\n color: #f59e0b;\n border-bottom-color: #f59e0b;\n}\n\n.filter-tab.has-warning[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.filter-tab.has-danger[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.tab-count[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.status-active[_ngcontent-%COMP%] { color: #10b981; }\n.status-warning[_ngcontent-%COMP%] { color: #f59e0b; }\n.status-danger[_ngcontent-%COMP%] { color: #ef4444; }\n.status-info[_ngcontent-%COMP%] { color: #6b7280; }\n.status-revoked[_ngcontent-%COMP%] { color: #6b7280; }\n\n\n\n.key-grid[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.grid-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 2fr 1fr 90px 160px 100px 110px 100px;\n gap: 12px;\n padding: 14px 24px;\n background: #f3f4f6;\n border-bottom: 1px solid #e5e7eb;\n font-size: 11px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n}\n\n.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s ease;\n}\n\n.sortable[_ngcontent-%COMP%]:hover {\n color: #374151;\n}\n\n.sortable[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.5;\n}\n\n\n\n.grid-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 2fr 1fr 90px 160px 100px 110px 100px;\n gap: 12px;\n padding: 16px 24px;\n border-bottom: 1px solid #f3f4f6;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n}\n\n.grid-row[_ngcontent-%COMP%]:hover {\n background: #fefce8;\n}\n\n.grid-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n\n\n.col-key[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n}\n\n.key-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #6b7280 0%, #4b5563 100%);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.key-icon.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n}\n\n.key-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: white;\n}\n\n.key-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.key-label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.key-hash[_ngcontent-%COMP%] {\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 11px;\n color: #6b7280;\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n\n\n.owner-name[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #374151;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n}\n\n.status-badge.active[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.revoked[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n\n\n.col-scopes[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.scopes-display[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-badges[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.scope-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n cursor: default;\n transition: transform 0.15s ease;\n}\n\n.scope-badge[_ngcontent-%COMP%]:hover {\n transform: scale(1.05);\n}\n\n.scope-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.badge-count[_ngcontent-%COMP%] {\n font-weight: 700;\n}\n\n.scope-more[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 6px;\n background: #f3f4f6;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 600;\n color: #6b7280;\n}\n\n.scopes-total[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #9ca3af;\n}\n\n.no-scopes[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #d1d5db;\n}\n\n.no-scopes[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n.expires-value[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.expires-value.never[_ngcontent-%COMP%] {\n color: #6b7280;\n}\n\n.expires-value.ok[_ngcontent-%COMP%] {\n color: #059669;\n}\n\n.expires-value.warning[_ngcontent-%COMP%] {\n color: #d97706;\n font-weight: 500;\n}\n\n.expires-value.critical[_ngcontent-%COMP%] {\n color: #dc2626;\n font-weight: 600;\n}\n\n.expires-value.expired[_ngcontent-%COMP%] {\n color: #dc2626;\n font-weight: 600;\n}\n\n\n\n.used-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #374151;\n}\n\n.used-value.never[_ngcontent-%COMP%] {\n color: #9ca3af;\n font-style: italic;\n}\n\n\n\n.created-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\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 color: #6b7280;\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #374151;\n}\n\n.create-empty-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 20px;\n padding: 12px 24px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-empty-btn[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n\n\n.pagination[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n}\n\n.page-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\n}\n\n.page-buttons[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.page-btn[_ngcontent-%COMP%] {\n min-width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #374151;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.page-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.page-btn.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.page-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.page-ellipsis[_ngcontent-%COMP%] {\n padding: 0 8px;\n color: #9ca3af;\n}\n\n\n\n@media (max-width: 1200px) {\n .grid-header[_ngcontent-%COMP%], \n .grid-row[_ngcontent-%COMP%] {\n grid-template-columns: 2fr 1fr 90px 120px 100px;\n }\n\n .col-used[_ngcontent-%COMP%], \n .col-created[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n@media (max-width: 1024px) {\n .grid-header[_ngcontent-%COMP%], \n .grid-row[_ngcontent-%COMP%] {\n grid-template-columns: 2fr 90px 110px 100px;\n }\n\n .col-owner[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n@media (max-width: 768px) {\n .list-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-right[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: space-between;\n }\n\n .search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 180px;\n }\n\n .grid-header[_ngcontent-%COMP%], \n .grid-row[_ngcontent-%COMP%] {\n grid-template-columns: 2fr 90px 100px;\n }\n\n .col-expires[_ngcontent-%COMP%], \n .col-scopes[_ngcontent-%COMP%] {\n display: none;\n }\n\n .filter-tabs[_ngcontent-%COMP%] {\n padding: 0 16px;\n }\n}"] });
802
805
  }
803
806
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(APIKeyListComponent, [{
804
807
  type: Component,
805
- args: [{ selector: 'mj-api-key-list', template: "<div class=\"list-container\">\n <!-- Header -->\n <div class=\"list-header\">\n <div class=\"header-left\">\n <h3>API Keys</h3>\n <span class=\"count-badge\">{{FilteredKeys.length}} of {{AllKeys.length}}</span>\n </div>\n <div class=\"header-right\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\" [(ngModel)]=\"SearchText\"\n (ngModelChange)=\"onSearch()\"\n placeholder=\"Search keys...\" />\n <button class=\"clear-search\" *ngIf=\"SearchText\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <button class=\"create-btn\" (click)=\"requestCreate()\">\n <i class=\"fa-solid fa-plus\"></i>\n Generate Key\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs -->\n <div class=\"filter-tabs\">\n <button class=\"filter-tab\" [class.active]=\"Filter === 'all'\"\n (click)=\"setFilter('all')\">\n All\n <span class=\"tab-count\">{{Stats.total}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'active'\"\n (click)=\"setFilter('active')\">\n <i class=\"fa-solid fa-check-circle status-active\"></i>\n Active\n <span class=\"tab-count\">{{Stats.active}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'expiring'\"\n [class.has-warning]=\"Stats.expiring > 0\"\n (click)=\"setFilter('expiring')\">\n <i class=\"fa-solid fa-clock status-warning\"></i>\n Expiring Soon\n <span class=\"tab-count\">{{Stats.expiring}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'expired'\"\n [class.has-danger]=\"Stats.expired > 0\"\n (click)=\"setFilter('expired')\">\n <i class=\"fa-solid fa-circle-exclamation status-danger\"></i>\n Expired\n <span class=\"tab-count\">{{Stats.expired}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'never-used'\"\n (click)=\"setFilter('never-used')\">\n <i class=\"fa-solid fa-question-circle status-info\"></i>\n Never Used\n <span class=\"tab-count\">{{Stats.neverUsed}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'revoked'\"\n (click)=\"setFilter('revoked')\">\n <i class=\"fa-solid fa-ban status-revoked\"></i>\n Revoked\n <span class=\"tab-count\">{{Stats.revoked}}</span>\n </button>\n </div>\n\n <!-- Loading -->\n <mj-loading *ngIf=\"IsLoading\" text=\"Loading API keys...\"></mj-loading>\n\n <!-- Grid -->\n <div class=\"key-grid\" *ngIf=\"!IsLoading\">\n <!-- Header Row -->\n <div class=\"grid-header\">\n <div class=\"col-key sortable\" (click)=\"toggleSort('Label')\">\n Key\n <i [class]=\"getSortIcon('Label')\"></i>\n </div>\n <div class=\"col-owner sortable\" (click)=\"toggleSort('User')\">\n Owner\n <i [class]=\"getSortIcon('User')\"></i>\n </div>\n <div class=\"col-status sortable\" (click)=\"toggleSort('Status')\">\n Status\n <i [class]=\"getSortIcon('Status')\"></i>\n </div>\n <div class=\"col-scopes\">\n Scopes\n </div>\n <div class=\"col-expires sortable\" (click)=\"toggleSort('ExpiresAt')\">\n Expires\n <i [class]=\"getSortIcon('ExpiresAt')\"></i>\n </div>\n <div class=\"col-used sortable\" (click)=\"toggleSort('LastUsedAt')\">\n Last Used\n <i [class]=\"getSortIcon('LastUsedAt')\"></i>\n </div>\n <div class=\"col-created sortable\" (click)=\"toggleSort('__mj_CreatedAt')\">\n Created\n <i [class]=\"getSortIcon('__mj_CreatedAt')\"></i>\n </div>\n </div>\n\n <!-- Key Rows -->\n <div class=\"grid-row\" *ngFor=\"let key of getPaginatedKeys()\"\n (click)=\"selectKey(key)\">\n <div class=\"col-key\">\n <div class=\"key-icon\" [class.active]=\"key.Status === 'Active'\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"key-details\">\n <span class=\"key-label\">{{key.Label}}</span>\n <code class=\"key-hash\">...{{key.Hash.slice(-12)}}</code>\n </div>\n </div>\n <div class=\"col-owner\">\n <span class=\"owner-name\">{{key.User}}</span>\n </div>\n <div class=\"col-status\">\n <span class=\"status-badge\" [class.active]=\"key.Status === 'Active'\"\n [class.revoked]=\"key.Status === 'Revoked'\">\n {{key.Status}}\n </span>\n </div>\n <div class=\"col-scopes\">\n <div class=\"scopes-display\" *ngIf=\"getScopeInfo(key).count > 0\">\n <div class=\"scope-badges\">\n <ng-container *ngFor=\"let cat of getScopeInfo(key).categories; let i = index\">\n <span class=\"scope-badge\" *ngIf=\"i < 3\"\n [style.backgroundColor]=\"cat.color + '15'\"\n [style.color]=\"cat.color\"\n [title]=\"cat.category + ': ' + cat.count + ' scope(s)'\">\n <i [class]=\"cat.icon\"></i>\n <span class=\"badge-count\">{{cat.count}}</span>\n </span>\n </ng-container>\n <span class=\"scope-more\" *ngIf=\"getScopeInfo(key).categories.length > 3\">\n +{{getScopeInfo(key).categories.length - 3}}\n </span>\n </div>\n <span class=\"scopes-total\">\n {{getScopeInfo(key).count}} total\n </span>\n </div>\n <span class=\"no-scopes\" *ngIf=\"getScopeInfo(key).count === 0\">\n <i class=\"fa-solid fa-shield-xmark\"></i>\n None\n </span>\n </div>\n <div class=\"col-expires\">\n <span class=\"expires-value\" [ngClass]=\"getExpirationClass(key)\">\n {{formatExpiration(key.ExpiresAt)}}\n </span>\n </div>\n <div class=\"col-used\">\n <span class=\"used-value\" [class.never]=\"!key.LastUsedAt\">\n {{formatDate(key.LastUsedAt)}}\n </span>\n </div>\n <div class=\"col-created\">\n <span class=\"created-value\">{{formatDate(key.__mj_CreatedAt)}}</span>\n </div>\n </div>\n\n <!-- Empty State -->\n <div class=\"empty-state\" *ngIf=\"FilteredKeys.length === 0\">\n <i class=\"fa-solid fa-key\"></i>\n <span *ngIf=\"SearchText\">No keys matching \"{{SearchText}}\"</span>\n <span *ngIf=\"!SearchText && Filter !== 'all'\">No {{Filter}} keys found</span>\n <span *ngIf=\"!SearchText && Filter === 'all'\">No API keys created yet</span>\n <button class=\"create-empty-btn\" *ngIf=\"Filter === 'all' && !SearchText\"\n (click)=\"requestCreate()\">\n <i class=\"fa-solid fa-plus\"></i>\n Generate Your First Key\n </button>\n </div>\n </div>\n\n <!-- Pagination -->\n <div class=\"pagination\" *ngIf=\"!IsLoading && FilteredKeys.length > PageSize\">\n <div class=\"page-info\">\n Showing {{(CurrentPage - 1) * PageSize + 1}} - {{Math.min(CurrentPage * PageSize, FilteredKeys.length)}}\n of {{FilteredKeys.length}}\n </div>\n <div class=\"page-buttons\">\n <button class=\"page-btn\" [disabled]=\"CurrentPage === 1\"\n (click)=\"goToPage(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n <ng-container *ngFor=\"let page of getPageNumbers()\">\n <button class=\"page-btn\" *ngIf=\"page > 0\"\n [class.active]=\"page === CurrentPage\"\n (click)=\"goToPage(page)\">\n {{page}}\n </button>\n <span class=\"page-ellipsis\" *ngIf=\"page === -1\">...</span>\n </ng-container>\n <button class=\"page-btn\" [disabled]=\"CurrentPage === getTotalPages()\"\n (click)=\"goToPage(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n </div>\n</div>\n", styles: [".list-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n/* Header */\n.list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-left h3 {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #78350f;\n}\n\n.count-badge {\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.7);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #92400e;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* Search Box */\n.search-box {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-box i {\n position: absolute;\n left: 12px;\n color: #9ca3af;\n font-size: 14px;\n}\n\n.search-box input {\n width: 260px;\n padding: 10px 36px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.search-box input:focus {\n outline: none;\n border-color: #f59e0b;\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n\n.clear-search {\n position: absolute;\n right: 8px;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #e5e7eb;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-search:hover {\n background: #d1d5db;\n}\n\n.clear-search i {\n position: static;\n font-size: 10px;\n color: #6b7280;\n}\n\n/* Create Button */\n.create-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-btn:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n/* Filter Tabs */\n.filter-tabs {\n display: flex;\n gap: 4px;\n padding: 0 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n overflow-x: auto;\n}\n\n.filter-tab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 16px;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.2s ease;\n}\n\n.filter-tab:hover {\n color: #374151;\n background: #f3f4f6;\n}\n\n.filter-tab.active {\n color: #f59e0b;\n border-bottom-color: #f59e0b;\n}\n\n.filter-tab.has-warning .tab-count {\n background: #fef3c7;\n color: #d97706;\n}\n\n.filter-tab.has-danger .tab-count {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.tab-count {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.status-active { color: #10b981; }\n.status-warning { color: #f59e0b; }\n.status-danger { color: #ef4444; }\n.status-info { color: #6b7280; }\n.status-revoked { color: #6b7280; }\n\n/* Key Grid */\n.key-grid {\n flex: 1;\n overflow-y: auto;\n}\n\n.grid-header {\n display: grid;\n grid-template-columns: 2fr 1fr 90px 160px 100px 110px 100px;\n gap: 12px;\n padding: 14px 24px;\n background: #f3f4f6;\n border-bottom: 1px solid #e5e7eb;\n font-size: 11px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n}\n\n.sortable {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s ease;\n}\n\n.sortable:hover {\n color: #374151;\n}\n\n.sortable i {\n font-size: 10px;\n opacity: 0.5;\n}\n\n/* Grid Rows */\n.grid-row {\n display: grid;\n grid-template-columns: 2fr 1fr 90px 160px 100px 110px 100px;\n gap: 12px;\n padding: 16px 24px;\n border-bottom: 1px solid #f3f4f6;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n}\n\n.grid-row:hover {\n background: #fefce8;\n}\n\n.grid-row:last-child {\n border-bottom: none;\n}\n\n/* Key Column */\n.col-key {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n}\n\n.key-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #6b7280 0%, #4b5563 100%);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.key-icon.active {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n}\n\n.key-icon i {\n font-size: 16px;\n color: white;\n}\n\n.key-details {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.key-label {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.key-hash {\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 11px;\n color: #6b7280;\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n/* Owner Column */\n.owner-name {\n font-size: 14px;\n color: #374151;\n}\n\n/* Status Column */\n.status-badge {\n display: inline-block;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n}\n\n.status-badge.active {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.revoked {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n/* Scopes Column */\n.col-scopes {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.scopes-display {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-badges {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.scope-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n cursor: default;\n transition: transform 0.15s ease;\n}\n\n.scope-badge:hover {\n transform: scale(1.05);\n}\n\n.scope-badge i {\n font-size: 10px;\n}\n\n.badge-count {\n font-weight: 700;\n}\n\n.scope-more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 6px;\n background: #f3f4f6;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 600;\n color: #6b7280;\n}\n\n.scopes-total {\n font-size: 11px;\n color: #9ca3af;\n}\n\n.no-scopes {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #d1d5db;\n}\n\n.no-scopes i {\n font-size: 11px;\n}\n\n/* Expires Column */\n.expires-value {\n font-size: 13px;\n}\n\n.expires-value.never {\n color: #6b7280;\n}\n\n.expires-value.ok {\n color: #059669;\n}\n\n.expires-value.warning {\n color: #d97706;\n font-weight: 500;\n}\n\n.expires-value.critical {\n color: #dc2626;\n font-weight: 600;\n}\n\n.expires-value.expired {\n color: #dc2626;\n font-weight: 600;\n}\n\n/* Used Column */\n.used-value {\n font-size: 13px;\n color: #374151;\n}\n\n.used-value.never {\n color: #9ca3af;\n font-style: italic;\n}\n\n/* Created Column */\n.created-value {\n font-size: 13px;\n color: #6b7280;\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 color: #6b7280;\n text-align: center;\n}\n\n.empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state span {\n font-size: 16px;\n color: #374151;\n}\n\n.create-empty-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 20px;\n padding: 12px 24px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-empty-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n/* Pagination */\n.pagination {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n}\n\n.page-info {\n font-size: 13px;\n color: #6b7280;\n}\n\n.page-buttons {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.page-btn {\n min-width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #374151;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.page-btn:hover:not(:disabled) {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.page-btn.active {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.page-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.page-ellipsis {\n padding: 0 8px;\n color: #9ca3af;\n}\n\n/* Responsive */\n@media (max-width: 1200px) {\n .grid-header,\n .grid-row {\n grid-template-columns: 2fr 1fr 90px 120px 100px;\n }\n\n .col-used,\n .col-created {\n display: none;\n }\n}\n\n@media (max-width: 1024px) {\n .grid-header,\n .grid-row {\n grid-template-columns: 2fr 90px 110px 100px;\n }\n\n .col-owner {\n display: none;\n }\n}\n\n@media (max-width: 768px) {\n .list-header {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n\n .search-box input {\n width: 180px;\n }\n\n .grid-header,\n .grid-row {\n grid-template-columns: 2fr 90px 100px;\n }\n\n .col-expires,\n .col-scopes {\n display: none;\n }\n\n .filter-tabs {\n padding: 0 16px;\n }\n}\n"] }]
808
+ args: [{ standalone: false, selector: 'mj-api-key-list', template: "<div class=\"list-container\">\n <!-- Header -->\n <div class=\"list-header\">\n <div class=\"header-left\">\n <h3>API Keys</h3>\n <span class=\"count-badge\">{{FilteredKeys.length}} of {{AllKeys.length}}</span>\n </div>\n <div class=\"header-right\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\" [(ngModel)]=\"SearchText\"\n (ngModelChange)=\"onSearch()\"\n placeholder=\"Search keys...\" />\n @if (SearchText) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <button class=\"create-btn\" (click)=\"requestCreate()\">\n <i class=\"fa-solid fa-plus\"></i>\n Generate Key\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs -->\n <div class=\"filter-tabs\">\n <button class=\"filter-tab\" [class.active]=\"Filter === 'all'\"\n (click)=\"setFilter('all')\">\n All\n <span class=\"tab-count\">{{Stats.total}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'active'\"\n (click)=\"setFilter('active')\">\n <i class=\"fa-solid fa-check-circle status-active\"></i>\n Active\n <span class=\"tab-count\">{{Stats.active}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'expiring'\"\n [class.has-warning]=\"Stats.expiring > 0\"\n (click)=\"setFilter('expiring')\">\n <i class=\"fa-solid fa-clock status-warning\"></i>\n Expiring Soon\n <span class=\"tab-count\">{{Stats.expiring}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'expired'\"\n [class.has-danger]=\"Stats.expired > 0\"\n (click)=\"setFilter('expired')\">\n <i class=\"fa-solid fa-circle-exclamation status-danger\"></i>\n Expired\n <span class=\"tab-count\">{{Stats.expired}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'never-used'\"\n (click)=\"setFilter('never-used')\">\n <i class=\"fa-solid fa-question-circle status-info\"></i>\n Never Used\n <span class=\"tab-count\">{{Stats.neverUsed}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'revoked'\"\n (click)=\"setFilter('revoked')\">\n <i class=\"fa-solid fa-ban status-revoked\"></i>\n Revoked\n <span class=\"tab-count\">{{Stats.revoked}}</span>\n </button>\n </div>\n\n <!-- Loading -->\n @if (IsLoading) {\n <mj-loading text=\"Loading API keys...\"></mj-loading>\n }\n\n <!-- Grid -->\n @if (!IsLoading) {\n <div class=\"key-grid\">\n <!-- Header Row -->\n <div class=\"grid-header\">\n <div class=\"col-key sortable\" (click)=\"toggleSort('Label')\">\n Key\n <i [class]=\"getSortIcon('Label')\"></i>\n </div>\n <div class=\"col-owner sortable\" (click)=\"toggleSort('User')\">\n Owner\n <i [class]=\"getSortIcon('User')\"></i>\n </div>\n <div class=\"col-status sortable\" (click)=\"toggleSort('Status')\">\n Status\n <i [class]=\"getSortIcon('Status')\"></i>\n </div>\n <div class=\"col-scopes\">\n Scopes\n </div>\n <div class=\"col-expires sortable\" (click)=\"toggleSort('ExpiresAt')\">\n Expires\n <i [class]=\"getSortIcon('ExpiresAt')\"></i>\n </div>\n <div class=\"col-used sortable\" (click)=\"toggleSort('LastUsedAt')\">\n Last Used\n <i [class]=\"getSortIcon('LastUsedAt')\"></i>\n </div>\n <div class=\"col-created sortable\" (click)=\"toggleSort('__mj_CreatedAt')\">\n Created\n <i [class]=\"getSortIcon('__mj_CreatedAt')\"></i>\n </div>\n </div>\n <!-- Key Rows -->\n @for (key of getPaginatedKeys(); track key) {\n <div class=\"grid-row\"\n (click)=\"selectKey(key)\">\n <div class=\"col-key\">\n <div class=\"key-icon\" [class.active]=\"key.Status === 'Active'\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"key-details\">\n <span class=\"key-label\">{{key.Label}}</span>\n <code class=\"key-hash\">...{{key.Hash.slice(-12)}}</code>\n </div>\n </div>\n <div class=\"col-owner\">\n <span class=\"owner-name\">{{key.User}}</span>\n </div>\n <div class=\"col-status\">\n <span class=\"status-badge\" [class.active]=\"key.Status === 'Active'\"\n [class.revoked]=\"key.Status === 'Revoked'\">\n {{key.Status}}\n </span>\n </div>\n <div class=\"col-scopes\">\n @if (getScopeInfo(key).count > 0) {\n <div class=\"scopes-display\">\n <div class=\"scope-badges\">\n @for (cat of getScopeInfo(key).categories; track cat; let i = $index) {\n @if (i < 3) {\n <span class=\"scope-badge\"\n [style.backgroundColor]=\"cat.color + '15'\"\n [style.color]=\"cat.color\"\n [title]=\"cat.category + ': ' + cat.count + ' scope(s)'\">\n <i [class]=\"cat.icon\"></i>\n <span class=\"badge-count\">{{cat.count}}</span>\n </span>\n }\n }\n @if (getScopeInfo(key).categories.length > 3) {\n <span class=\"scope-more\">\n +{{getScopeInfo(key).categories.length - 3}}\n </span>\n }\n </div>\n <span class=\"scopes-total\">\n {{getScopeInfo(key).count}} total\n </span>\n </div>\n }\n @if (getScopeInfo(key).count === 0) {\n <span class=\"no-scopes\">\n <i class=\"fa-solid fa-shield-xmark\"></i>\n None\n </span>\n }\n </div>\n <div class=\"col-expires\">\n <span class=\"expires-value\" [ngClass]=\"getExpirationClass(key)\">\n {{formatExpiration(key.ExpiresAt)}}\n </span>\n </div>\n <div class=\"col-used\">\n <span class=\"used-value\" [class.never]=\"!key.LastUsedAt\">\n {{formatDate(key.LastUsedAt)}}\n </span>\n </div>\n <div class=\"col-created\">\n <span class=\"created-value\">{{formatDate(key.__mj_CreatedAt)}}</span>\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n @if (SearchText) {\n <span>No keys matching \"{{SearchText}}\"</span>\n }\n @if (!SearchText && Filter !== 'all') {\n <span>No {{Filter}} keys found</span>\n }\n @if (!SearchText && Filter === 'all') {\n <span>No API keys created yet</span>\n }\n @if (Filter === 'all' && !SearchText) {\n <button class=\"create-empty-btn\"\n (click)=\"requestCreate()\">\n <i class=\"fa-solid fa-plus\"></i>\n Generate Your First Key\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Pagination -->\n @if (!IsLoading && FilteredKeys.length > PageSize) {\n <div class=\"pagination\">\n <div class=\"page-info\">\n Showing {{(CurrentPage - 1) * PageSize + 1}} - {{Math.min(CurrentPage * PageSize, FilteredKeys.length)}}\n of {{FilteredKeys.length}}\n </div>\n <div class=\"page-buttons\">\n <button class=\"page-btn\" [disabled]=\"CurrentPage === 1\"\n (click)=\"goToPage(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n @for (page of getPageNumbers(); track page) {\n @if (page > 0) {\n <button class=\"page-btn\"\n [class.active]=\"page === CurrentPage\"\n (click)=\"goToPage(page)\">\n {{page}}\n </button>\n }\n @if (page === -1) {\n <span class=\"page-ellipsis\">...</span>\n }\n }\n <button class=\"page-btn\" [disabled]=\"CurrentPage === getTotalPages()\"\n (click)=\"goToPage(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n </div>\n }\n</div>\n", styles: [".list-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n/* Header */\n.list-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-left h3 {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: #78350f;\n}\n\n.count-badge {\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.7);\n border-radius: 20px;\n font-size: 13px;\n font-weight: 500;\n color: #92400e;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* Search Box */\n.search-box {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-box i {\n position: absolute;\n left: 12px;\n color: #9ca3af;\n font-size: 14px;\n}\n\n.search-box input {\n width: 260px;\n padding: 10px 36px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 14px;\n transition: all 0.2s ease;\n}\n\n.search-box input:focus {\n outline: none;\n border-color: #f59e0b;\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n\n.clear-search {\n position: absolute;\n right: 8px;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #e5e7eb;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-search:hover {\n background: #d1d5db;\n}\n\n.clear-search i {\n position: static;\n font-size: 10px;\n color: #6b7280;\n}\n\n/* Create Button */\n.create-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-btn:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n/* Filter Tabs */\n.filter-tabs {\n display: flex;\n gap: 4px;\n padding: 0 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n overflow-x: auto;\n}\n\n.filter-tab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 16px;\n background: transparent;\n border: none;\n border-bottom: 2px solid transparent;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.2s ease;\n}\n\n.filter-tab:hover {\n color: #374151;\n background: #f3f4f6;\n}\n\n.filter-tab.active {\n color: #f59e0b;\n border-bottom-color: #f59e0b;\n}\n\n.filter-tab.has-warning .tab-count {\n background: #fef3c7;\n color: #d97706;\n}\n\n.filter-tab.has-danger .tab-count {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.tab-count {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.status-active { color: #10b981; }\n.status-warning { color: #f59e0b; }\n.status-danger { color: #ef4444; }\n.status-info { color: #6b7280; }\n.status-revoked { color: #6b7280; }\n\n/* Key Grid */\n.key-grid {\n flex: 1;\n overflow-y: auto;\n}\n\n.grid-header {\n display: grid;\n grid-template-columns: 2fr 1fr 90px 160px 100px 110px 100px;\n gap: 12px;\n padding: 14px 24px;\n background: #f3f4f6;\n border-bottom: 1px solid #e5e7eb;\n font-size: 11px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n}\n\n.sortable {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: color 0.2s ease;\n}\n\n.sortable:hover {\n color: #374151;\n}\n\n.sortable i {\n font-size: 10px;\n opacity: 0.5;\n}\n\n/* Grid Rows */\n.grid-row {\n display: grid;\n grid-template-columns: 2fr 1fr 90px 160px 100px 110px 100px;\n gap: 12px;\n padding: 16px 24px;\n border-bottom: 1px solid #f3f4f6;\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n}\n\n.grid-row:hover {\n background: #fefce8;\n}\n\n.grid-row:last-child {\n border-bottom: none;\n}\n\n/* Key Column */\n.col-key {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n}\n\n.key-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #6b7280 0%, #4b5563 100%);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.key-icon.active {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n}\n\n.key-icon i {\n font-size: 16px;\n color: white;\n}\n\n.key-details {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.key-label {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.key-hash {\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 11px;\n color: #6b7280;\n background: #f3f4f6;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n/* Owner Column */\n.owner-name {\n font-size: 14px;\n color: #374151;\n}\n\n/* Status Column */\n.status-badge {\n display: inline-block;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n}\n\n.status-badge.active {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.revoked {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n/* Scopes Column */\n.col-scopes {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.scopes-display {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.scope-badges {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.scope-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n cursor: default;\n transition: transform 0.15s ease;\n}\n\n.scope-badge:hover {\n transform: scale(1.05);\n}\n\n.scope-badge i {\n font-size: 10px;\n}\n\n.badge-count {\n font-weight: 700;\n}\n\n.scope-more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px 6px;\n background: #f3f4f6;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 600;\n color: #6b7280;\n}\n\n.scopes-total {\n font-size: 11px;\n color: #9ca3af;\n}\n\n.no-scopes {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #d1d5db;\n}\n\n.no-scopes i {\n font-size: 11px;\n}\n\n/* Expires Column */\n.expires-value {\n font-size: 13px;\n}\n\n.expires-value.never {\n color: #6b7280;\n}\n\n.expires-value.ok {\n color: #059669;\n}\n\n.expires-value.warning {\n color: #d97706;\n font-weight: 500;\n}\n\n.expires-value.critical {\n color: #dc2626;\n font-weight: 600;\n}\n\n.expires-value.expired {\n color: #dc2626;\n font-weight: 600;\n}\n\n/* Used Column */\n.used-value {\n font-size: 13px;\n color: #374151;\n}\n\n.used-value.never {\n color: #9ca3af;\n font-style: italic;\n}\n\n/* Created Column */\n.created-value {\n font-size: 13px;\n color: #6b7280;\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 color: #6b7280;\n text-align: center;\n}\n\n.empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.3;\n}\n\n.empty-state span {\n font-size: 16px;\n color: #374151;\n}\n\n.create-empty-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 20px;\n padding: 12px 24px;\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-empty-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n/* Pagination */\n.pagination {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n}\n\n.page-info {\n font-size: 13px;\n color: #6b7280;\n}\n\n.page-buttons {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.page-btn {\n min-width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #374151;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.page-btn:hover:not(:disabled) {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.page-btn.active {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border-color: #f59e0b;\n color: white;\n}\n\n.page-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.page-ellipsis {\n padding: 0 8px;\n color: #9ca3af;\n}\n\n/* Responsive */\n@media (max-width: 1200px) {\n .grid-header,\n .grid-row {\n grid-template-columns: 2fr 1fr 90px 120px 100px;\n }\n\n .col-used,\n .col-created {\n display: none;\n }\n}\n\n@media (max-width: 1024px) {\n .grid-header,\n .grid-row {\n grid-template-columns: 2fr 90px 110px 100px;\n }\n\n .col-owner {\n display: none;\n }\n}\n\n@media (max-width: 768px) {\n .list-header {\n flex-direction: column;\n gap: 16px;\n }\n\n .header-right {\n width: 100%;\n justify-content: space-between;\n }\n\n .search-box input {\n width: 180px;\n }\n\n .grid-header,\n .grid-row {\n grid-template-columns: 2fr 90px 100px;\n }\n\n .col-expires,\n .col-scopes {\n display: none;\n }\n\n .filter-tabs {\n padding: 0 16px;\n }\n}\n"] }]
806
809
  }], null, { Filter: [{
807
810
  type: Input
808
811
  }], KeySelected: [{
@@ -810,5 +813,5 @@ export class APIKeyListComponent {
810
813
  }], CreateRequested: [{
811
814
  type: Output
812
815
  }] }); })();
813
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIKeyListComponent, { className: "APIKeyListComponent", filePath: "src/APIKeys/api-key-list.component.ts", lineNumber: 36 }); })();
816
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIKeyListComponent, { className: "APIKeyListComponent", filePath: "src/apikeys/api-key-list.component.ts", lineNumber: 32 }); })();
814
817
  //# sourceMappingURL=api-key-list.component.js.map