@memberjunction/ng-dashboards 5.3.0 → 5.4.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 (173) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  2. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  3. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  4. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  5. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  6. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  7. package/dist/AI/components/models/model-management.component.js.map +1 -1
  8. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  9. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
  10. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  11. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  12. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
  13. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  14. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  15. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  16. package/dist/AI/index.js.map +1 -1
  17. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  18. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  19. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  20. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  21. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  22. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  23. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  24. package/dist/APIKeys/api-key-list.component.js +2 -2
  25. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  26. package/dist/APIKeys/api-keys-resource.component.js +2 -2
  27. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  28. package/dist/APIKeys/api-scopes-panel.component.js +2 -2
  29. package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
  30. package/dist/APIKeys/api-usage-panel.component.js +2 -2
  31. package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
  32. package/dist/APIKeys/index.js.map +1 -1
  33. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  34. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  35. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  36. package/dist/Actions/components/code-management.component.js.map +1 -1
  37. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  38. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  39. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  40. package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -1
  41. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  42. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  43. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  44. package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
  45. package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
  46. package/dist/Actions/components/explorer/index.js.map +1 -1
  47. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  48. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  49. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  50. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  51. package/dist/Actions/index.js.map +1 -1
  52. package/dist/Actions/services/action-explorer-state.service.js.map +1 -1
  53. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  54. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  55. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  56. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  57. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  58. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  59. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  60. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  61. package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
  62. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
  63. package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
  64. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  65. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  66. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  67. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  68. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
  69. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  70. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  71. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  72. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  73. package/dist/ComponentStudio/index.js.map +1 -1
  74. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  75. package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
  76. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  77. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  78. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  79. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  80. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  81. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  82. package/dist/Credentials/index.js.map +1 -1
  83. package/dist/Credentials/pipes/group-by.pipe.js.map +1 -1
  84. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  85. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  86. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +1 -1
  87. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +25 -3
  88. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  89. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +158 -34
  90. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  91. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  92. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +57 -23
  93. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  94. package/dist/DataExplorer/data-explorer-dashboard.component.js +600 -445
  95. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  96. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  97. package/dist/DataExplorer/index.js.map +1 -1
  98. package/dist/DataExplorer/models/explorer-state.interface.d.ts +25 -0
  99. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  100. package/dist/DataExplorer/models/explorer-state.interface.js +6 -1
  101. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  102. package/dist/DataExplorer/services/explorer-state.service.d.ts +21 -3
  103. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  104. package/dist/DataExplorer/services/explorer-state.service.js +70 -36
  105. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  106. package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
  107. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  108. package/dist/Home/home-application.js.map +1 -1
  109. package/dist/Home/home-dashboard.component.d.ts +20 -5
  110. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  111. package/dist/Home/home-dashboard.component.js +128 -79
  112. package/dist/Home/home-dashboard.component.js.map +1 -1
  113. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  114. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  115. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  116. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  117. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  118. package/dist/Lists/index.js.map +1 -1
  119. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  120. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  121. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  122. package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
  123. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  124. package/dist/MCP/index.js.map +1 -1
  125. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  126. package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
  127. package/dist/MCP/mcp-resource.component.js.map +1 -1
  128. package/dist/MCP/mcp.module.js.map +1 -1
  129. package/dist/MCP/services/mcp-tools.service.js.map +1 -1
  130. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  131. package/dist/Scheduling/components/index.js.map +1 -1
  132. package/dist/Scheduling/components/job-slideout.component.js.map +1 -1
  133. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  134. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  135. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  136. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  137. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  138. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  139. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  140. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  141. package/dist/SystemDiagnostics/index.js.map +1 -1
  142. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  143. package/dist/SystemDiagnostics/system-diagnostics.component.js +3 -3
  144. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  145. package/dist/Testing/components/index.js.map +1 -1
  146. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  147. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  148. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  149. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  150. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  151. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  152. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  153. package/dist/Testing/components/testing-review.component.js.map +1 -1
  154. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  155. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  156. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  157. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  158. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  159. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
  160. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  161. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  162. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  163. package/dist/VersionHistory/components/index.js.map +1 -1
  164. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  165. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  166. package/dist/VersionHistory/index.js.map +1 -1
  167. package/dist/__tests__/dashboards.test.js.map +1 -1
  168. package/dist/module.js.map +1 -1
  169. package/dist/public-api.js.map +1 -1
  170. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
  171. package/dist/shared/pipes/index.js.map +1 -1
  172. package/dist/shared/shared-pipes.module.js.map +1 -1
  173. package/package.json +38 -38
@@ -801,11 +801,11 @@ export class APIKeyListComponent {
801
801
  i0.ɵɵconditional(!ctx.IsLoading ? 46 : -1);
802
802
  i0.ɵɵadvance();
803
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}"] });
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: var(--mj-bg-surface);\n border-radius: 12px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-md);\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, var(--mj-color-brand-100) 0%, var(--mj-color-brand-200) 100%);\n border-bottom: 1px solid var(--mj-color-accent-300);\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: var(--mj-color-brand-800);\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: var(--mj-color-brand-800);\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: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 260px;\n padding: 10px 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\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: var(--mj-brand-primary);\n box-shadow: var(--mj-focus-ring);\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: var(--mj-border-default);\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: var(--mj-color-neutral-300);\n}\n\n.clear-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n position: static;\n font-size: 10px;\n color: var(--mj-text-secondary);\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: var(--mj-brand-primary);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-inverse);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-btn[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-brand-md);\n}\n\n\n\n.filter-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n padding: 0 24px;\n background: var(--mj-bg-page);\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.2s ease;\n}\n\n.filter-tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-color-neutral-700);\n background: var(--mj-bg-surface-sunken);\n}\n\n.filter-tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.filter-tab.has-warning[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background: var(--mj-color-brand-100);\n color: var(--mj-brand-primary-hover);\n}\n\n.filter-tab.has-danger[_ngcontent-%COMP%] .tab-count[_ngcontent-%COMP%] {\n background: var(--mj-color-error-100);\n color: var(--mj-color-error-600);\n}\n\n.tab-count[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: var(--mj-border-default);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.status-active[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.status-warning[_ngcontent-%COMP%] { color: var(--mj-color-warning-500); }\n.status-danger[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.status-info[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.status-revoked[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\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: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\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: var(--mj-color-neutral-700);\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 var(--mj-bg-surface-sunken);\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n}\n\n.grid-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-brand-50);\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, var(--mj-text-secondary) 0%, var(--mj-color-neutral-600) 100%);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.key-icon.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.key-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-inverse);\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: var(--mj-text-primary);\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: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n\n\n.owner-name[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-color-neutral-700);\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: var(--mj-color-success-100);\n color: var(--mj-color-success-600);\n}\n\n.status-badge.revoked[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.scopes-total[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.no-scopes[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-color-neutral-300);\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: var(--mj-text-secondary);\n}\n\n.expires-value.ok[_ngcontent-%COMP%] {\n color: var(--mj-color-success-600);\n}\n\n.expires-value.warning[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary-hover);\n font-weight: 500;\n}\n\n.expires-value.critical[_ngcontent-%COMP%] {\n color: var(--mj-color-error-600);\n font-weight: 600;\n}\n\n.expires-value.expired[_ngcontent-%COMP%] {\n color: var(--mj-color-error-600);\n font-weight: 600;\n}\n\n\n\n.used-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n}\n\n.used-value.never[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n\n\n.created-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n color: var(--mj-text-secondary);\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: var(--mj-color-neutral-700);\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: var(--mj-brand-primary);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-inverse);\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: var(--mj-shadow-brand-md);\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: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.page-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\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: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-color-neutral-700);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.page-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.page-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-text-muted);\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}"] });
805
805
  }
806
806
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(APIKeyListComponent, [{
807
807
  type: Component,
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"] }]
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: var(--mj-bg-surface);\n border-radius: 12px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-md);\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, var(--mj-color-brand-100) 0%, var(--mj-color-brand-200) 100%);\n border-bottom: 1px solid var(--mj-color-accent-300);\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: var(--mj-color-brand-800);\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: var(--mj-color-brand-800);\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: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.search-box input {\n width: 260px;\n padding: 10px 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\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: var(--mj-brand-primary);\n box-shadow: var(--mj-focus-ring);\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: var(--mj-border-default);\n border: none;\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-search:hover {\n background: var(--mj-color-neutral-300);\n}\n\n.clear-search i {\n position: static;\n font-size: 10px;\n color: var(--mj-text-secondary);\n}\n\n/* Create Button */\n.create-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-inverse);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-btn:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-brand-md);\n}\n\n/* Filter Tabs */\n.filter-tabs {\n display: flex;\n gap: 4px;\n padding: 0 24px;\n background: var(--mj-bg-page);\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.2s ease;\n}\n\n.filter-tab:hover {\n color: var(--mj-color-neutral-700);\n background: var(--mj-bg-surface-sunken);\n}\n\n.filter-tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.filter-tab.has-warning .tab-count {\n background: var(--mj-color-brand-100);\n color: var(--mj-brand-primary-hover);\n}\n\n.filter-tab.has-danger .tab-count {\n background: var(--mj-color-error-100);\n color: var(--mj-color-error-600);\n}\n\n.tab-count {\n padding: 2px 8px;\n background: var(--mj-border-default);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.status-active { color: var(--mj-status-success); }\n.status-warning { color: var(--mj-color-warning-500); }\n.status-danger { color: var(--mj-status-error); }\n.status-info { color: var(--mj-text-secondary); }\n.status-revoked { color: var(--mj-text-secondary); }\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: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary);\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: var(--mj-color-neutral-700);\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 var(--mj-bg-surface-sunken);\n cursor: pointer;\n transition: background 0.2s ease;\n align-items: center;\n}\n\n.grid-row:hover {\n background: var(--mj-color-brand-50);\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, var(--mj-text-secondary) 0%, var(--mj-color-neutral-600) 100%);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.key-icon.active {\n background: var(--mj-brand-primary);\n}\n\n.key-icon i {\n font-size: 16px;\n color: var(--mj-text-inverse);\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: var(--mj-text-primary);\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: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n/* Owner Column */\n.owner-name {\n font-size: 14px;\n color: var(--mj-color-neutral-700);\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: var(--mj-color-success-100);\n color: var(--mj-color-success-600);\n}\n\n.status-badge.revoked {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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: var(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 10px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.scopes-total {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.no-scopes {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-color-neutral-300);\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: var(--mj-text-secondary);\n}\n\n.expires-value.ok {\n color: var(--mj-color-success-600);\n}\n\n.expires-value.warning {\n color: var(--mj-brand-primary-hover);\n font-weight: 500;\n}\n\n.expires-value.critical {\n color: var(--mj-color-error-600);\n font-weight: 600;\n}\n\n.expires-value.expired {\n color: var(--mj-color-error-600);\n font-weight: 600;\n}\n\n/* Used Column */\n.used-value {\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n}\n\n.used-value.never {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* Created Column */\n.created-value {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n color: var(--mj-text-secondary);\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: var(--mj-color-neutral-700);\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: var(--mj-brand-primary);\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-inverse);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.create-empty-btn:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-brand-md);\n}\n\n/* Pagination */\n.pagination {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.page-info {\n font-size: 13px;\n color: var(--mj-text-secondary);\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: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-color-neutral-700);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.page-btn:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.page-btn.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\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: var(--mj-text-muted);\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"] }]
809
809
  }], null, { Filter: [{
810
810
  type: Input
811
811
  }], KeySelected: [{
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-list.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-key-list.component.ts","../../src/APIKeys/api-key-list.component.html"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-key-list.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-key-list.component.ts","../../src/APIKeys/api-key-list.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIKeyScopeEntity, MJAPIScopeEntity } from '@memberjunction/core-entities';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\n\n/** Filter options for the list */\nexport type APIKeyFilter = 'all' | 'active' | 'revoked' | 'expiring' | 'expired' | 'never-used';\n\n/** Category scope display */\ninterface CategoryScopeCount {\n category: string;\n count: number;\n color: string;\n icon: string;\n}\n\n/** Scope info for display */\ninterface KeyScopeInfo {\n count: number;\n preview: string[];\n categories: CategoryScopeCount[];\n}\n/**\n * List view component for displaying and filtering API keys\n */\n@Component({\n standalone: false,\n selector: 'mj-api-key-list',\n templateUrl: './api-key-list.component.html',\n styleUrls: ['./api-key-list.component.css']\n})\nexport class APIKeyListComponent implements OnInit, OnChanges {\n @Input() Filter: APIKeyFilter = 'all';\n @Output() KeySelected = new EventEmitter<MJAPIKeyEntity>();\n @Output() CreateRequested = new EventEmitter<void>();\n\n // Expose Math for template\n public Math = Math;\n\n // Data\n public AllKeys: MJAPIKeyEntity[] = [];\n public FilteredKeys: MJAPIKeyEntity[] = [];\n public IsLoading = true;\n\n // Search\n public SearchText = '';\n\n // Sorting\n public SortField: 'Label' | 'Status' | 'User' | 'LastUsedAt' | 'ExpiresAt' | '__mj_CreatedAt' = '__mj_CreatedAt';\n public SortDirection: 'asc' | 'desc' = 'desc';\n\n // Pagination\n public PageSize = 20;\n public CurrentPage = 1;\n\n // Statistics\n public Stats = {\n total: 0,\n active: 0,\n revoked: 0,\n expiring: 0,\n expired: 0,\n neverUsed: 0\n };\n\n // Scope counts per key\n public KeyScopeMap = new Map<string, KeyScopeInfo>();\n private AllScopes: MJAPIScopeEntity[] = [];\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: '#6b7280'\n };\n\n // Dynamic category UI config built from root scopes\n private categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n\n async ngOnInit(): Promise<void> {\n await this.loadKeys();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['Filter'] && !changes['Filter'].firstChange) {\n this.applyFilters();\n }\n }\n\n /**\n * Load all API keys\n */\n public async loadKeys(): Promise<void> {\n this.IsLoading = true;\n try {\n const rv = new RunView();\n const base = APIKeysEngineBase.Instance;\n\n // Load keys and key-scope assignments (scopes from cache)\n const [keysResult, keyScopesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: API Keys',\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: API Key Scopes',\n ResultType: 'entity_object'\n }\n ]);\n\n if (keysResult.Success) {\n this.AllKeys = keysResult.Results as MJAPIKeyEntity[];\n this.AllScopes = base.Scopes;\n\n // Build category UI config from root scopes\n this.categoryUIConfigs.clear();\n for (const scope of this.AllScopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n this.categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n // Build scope lookup map\n const scopeMap = new Map<string, MJAPIScopeEntity>();\n for (const scope of this.AllScopes) {\n scopeMap.set(scope.ID, scope);\n }\n\n // Build key scope counts with category breakdown\n this.KeyScopeMap.clear();\n if (keyScopesResult.Success) {\n const keyScopes = keyScopesResult.Results as MJAPIKeyScopeEntity[];\n const keyToScopes = new Map<string, { names: string[]; categories: Map<string, number> }>();\n\n for (const ks of keyScopes) {\n if (!keyToScopes.has(ks.APIKeyID)) {\n keyToScopes.set(ks.APIKeyID, { names: [], categories: new Map() });\n }\n const scope = scopeMap.get(ks.ScopeID);\n if (scope) {\n const keyData = keyToScopes.get(ks.APIKeyID)!;\n keyData.names.push(scope.FullPath || scope.Name);\n const category = scope.Category || 'Other';\n keyData.categories.set(category, (keyData.categories.get(category) || 0) + 1);\n }\n }\n\n for (const [keyId, data] of keyToScopes.entries()) {\n const categories: CategoryScopeCount[] = Array.from(data.categories.entries())\n .map(([category, count]) => {\n const config = this.categoryUIConfigs.get(category) || this.defaultUIConfig;\n return {\n category,\n count,\n color: config.color,\n icon: config.icon\n };\n })\n .sort((a, b) => b.count - a.count);\n\n this.KeyScopeMap.set(keyId, {\n count: data.names.length,\n preview: data.names.slice(0, 3),\n categories\n });\n }\n }\n\n this.calculateStats();\n this.applyFilters();\n }\n } catch (error) {\n console.error('Error loading API keys:', error);\n } finally {\n this.IsLoading = false;\n }\n }\n\n /**\n * Get scope info for a key\n */\n public getScopeInfo(key: MJAPIKeyEntity): KeyScopeInfo {\n return this.KeyScopeMap.get(key.ID) || { count: 0, preview: [], categories: [] };\n }\n\n /**\n * Calculate statistics\n */\n private calculateStats(): void {\n const now = new Date();\n const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n this.Stats = {\n total: this.AllKeys.length,\n active: this.AllKeys.filter(k => k.Status === 'Active').length,\n revoked: this.AllKeys.filter(k => k.Status === 'Revoked').length,\n expiring: this.AllKeys.filter(k =>\n k.Status === 'Active' &&\n k.ExpiresAt &&\n new Date(k.ExpiresAt) > now &&\n new Date(k.ExpiresAt) < thirtyDaysFromNow\n ).length,\n expired: this.AllKeys.filter(k =>\n k.ExpiresAt && new Date(k.ExpiresAt) < now\n ).length,\n neverUsed: this.AllKeys.filter(k =>\n k.Status === 'Active' && !k.LastUsedAt\n ).length\n };\n }\n\n /**\n * Apply filters and sorting\n */\n public applyFilters(): void {\n const now = new Date();\n const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n let filtered = [...this.AllKeys];\n\n // Apply status filter\n switch (this.Filter) {\n case 'active':\n filtered = filtered.filter(k => k.Status === 'Active');\n break;\n case 'revoked':\n filtered = filtered.filter(k => k.Status === 'Revoked');\n break;\n case 'expiring':\n filtered = filtered.filter(k =>\n k.Status === 'Active' &&\n k.ExpiresAt &&\n new Date(k.ExpiresAt) > now &&\n new Date(k.ExpiresAt) < thirtyDaysFromNow\n );\n break;\n case 'expired':\n filtered = filtered.filter(k =>\n k.ExpiresAt && new Date(k.ExpiresAt) < now\n );\n break;\n case 'never-used':\n filtered = filtered.filter(k =>\n k.Status === 'Active' && !k.LastUsedAt\n );\n break;\n }\n\n // Apply search filter\n if (this.SearchText.trim()) {\n const search = this.SearchText.toLowerCase();\n filtered = filtered.filter(k =>\n k.Label.toLowerCase().includes(search) ||\n (k.Description && k.Description.toLowerCase().includes(search)) ||\n k.User.toLowerCase().includes(search) ||\n k.Hash.toLowerCase().includes(search)\n );\n }\n\n // Apply sorting\n filtered.sort((a, b) => {\n let aVal: string | number | Date | null = null;\n let bVal: string | number | Date | null = null;\n\n switch (this.SortField) {\n case 'Label':\n aVal = a.Label.toLowerCase();\n bVal = b.Label.toLowerCase();\n break;\n case 'Status':\n aVal = a.Status;\n bVal = b.Status;\n break;\n case 'User':\n aVal = a.User.toLowerCase();\n bVal = b.User.toLowerCase();\n break;\n case 'LastUsedAt':\n aVal = a.LastUsedAt ? new Date(a.LastUsedAt).getTime() : 0;\n bVal = b.LastUsedAt ? new Date(b.LastUsedAt).getTime() : 0;\n break;\n case 'ExpiresAt':\n aVal = a.ExpiresAt ? new Date(a.ExpiresAt).getTime() : Number.MAX_SAFE_INTEGER;\n bVal = b.ExpiresAt ? new Date(b.ExpiresAt).getTime() : Number.MAX_SAFE_INTEGER;\n break;\n case '__mj_CreatedAt':\n aVal = new Date(a.__mj_CreatedAt).getTime();\n bVal = new Date(b.__mj_CreatedAt).getTime();\n break;\n }\n\n if (aVal < bVal) return this.SortDirection === 'asc' ? -1 : 1;\n if (aVal > bVal) return this.SortDirection === 'asc' ? 1 : -1;\n return 0;\n });\n\n this.FilteredKeys = filtered;\n this.CurrentPage = 1;\n }\n\n /**\n * Handle search input\n */\n public onSearch(): void {\n this.applyFilters();\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.SearchText = '';\n this.applyFilters();\n }\n\n /**\n * Set filter\n */\n public setFilter(filter: APIKeyFilter): void {\n this.Filter = filter;\n this.applyFilters();\n }\n\n /**\n * Toggle sort\n */\n public toggleSort(field: typeof this.SortField): void {\n if (this.SortField === field) {\n this.SortDirection = this.SortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDirection = field === 'Label' ? 'asc' : 'desc';\n }\n this.applyFilters();\n }\n\n /**\n * Get sort icon class\n */\n public getSortIcon(field: typeof this.SortField): string {\n if (this.SortField !== field) return 'fa-solid fa-sort';\n return this.SortDirection === 'asc' ? 'fa-solid fa-sort-up' : 'fa-solid fa-sort-down';\n }\n\n /**\n * Get paginated keys\n */\n public getPaginatedKeys(): MJAPIKeyEntity[] {\n const start = (this.CurrentPage - 1) * this.PageSize;\n return this.FilteredKeys.slice(start, start + this.PageSize);\n }\n\n /**\n * Get total pages\n */\n public getTotalPages(): number {\n return Math.ceil(this.FilteredKeys.length / this.PageSize);\n }\n\n /**\n * Go to page\n */\n public goToPage(page: number): void {\n if (page >= 1 && page <= this.getTotalPages()) {\n this.CurrentPage = page;\n }\n }\n\n /**\n * Get page numbers to display\n */\n public getPageNumbers(): number[] {\n const total = this.getTotalPages();\n const current = this.CurrentPage;\n const pages: number[] = [];\n\n if (total <= 7) {\n for (let i = 1; i <= total; i++) pages.push(i);\n } else {\n pages.push(1);\n if (current > 3) pages.push(-1); // ellipsis\n\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n\n for (let i = start; i <= end; i++) pages.push(i);\n\n if (current < total - 2) pages.push(-1); // ellipsis\n pages.push(total);\n }\n\n return pages;\n }\n\n /**\n * Select a key\n */\n public selectKey(key: MJAPIKeyEntity): void {\n this.KeySelected.emit(key);\n }\n\n /**\n * Request key creation\n */\n public requestCreate(): void {\n this.CreateRequested.emit();\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const d = new Date(date);\n const diff = now.getTime() - d.getTime();\n const days = Math.floor(diff / 86400000);\n\n if (days === 0) {\n const hours = Math.floor(diff / 3600000);\n if (hours === 0) {\n const minutes = Math.floor(diff / 60000);\n return minutes < 1 ? 'Just now' : `${minutes}m ago`;\n }\n return `${hours}h ago`;\n }\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n /**\n * Format expiration for display\n */\n public formatExpiration(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const d = new Date(date);\n const diff = d.getTime() - now.getTime();\n\n if (diff < 0) return 'Expired';\n\n const days = Math.floor(diff / 86400000);\n if (days === 0) return 'Today';\n if (days === 1) return 'Tomorrow';\n if (days < 30) return `${days} days`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n /**\n * Get expiration status class\n */\n public getExpirationClass(key: MJAPIKeyEntity): string {\n if (!key.ExpiresAt) return 'never';\n\n const now = new Date();\n const expiresAt = new Date(key.ExpiresAt);\n const diff = expiresAt.getTime() - now.getTime();\n const days = Math.floor(diff / 86400000);\n\n if (diff < 0) return 'expired';\n if (days < 7) return 'critical';\n if (days < 30) return 'warning';\n return 'ok';\n }\n\n /**\n * Get filter count\n */\n public getFilterCount(filter: APIKeyFilter): number {\n switch (filter) {\n case 'all': return this.Stats.total;\n case 'active': return this.Stats.active;\n case 'revoked': return this.Stats.revoked;\n case 'expiring': return this.Stats.expiring;\n case 'expired': return this.Stats.expired;\n case 'never-used': return this.Stats.neverUsed;\n }\n }\n}\n","<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"]}