@memberjunction/ng-dashboards 2.128.0 → 2.130.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 (182) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -1
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +419 -109
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts +1 -1
  6. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +1 -1
  8. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  9. package/dist/AI/components/agents/agent-filter-panel.component.js +3 -3
  10. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  11. package/dist/AI/components/execution-monitoring.component.d.ts +1 -1
  12. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  13. package/dist/AI/components/execution-monitoring.component.js +3 -3
  14. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  15. package/dist/AI/components/models/{model-management-v2.component.d.ts → model-management.component.d.ts} +21 -5
  16. package/dist/AI/components/models/model-management.component.d.ts.map +1 -0
  17. package/dist/AI/components/models/model-management.component.js +1283 -0
  18. package/dist/AI/components/models/model-management.component.js.map +1 -0
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  21. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  22. package/dist/AI/components/prompts/{prompt-management-v2.component.d.ts → prompt-management.component.d.ts} +30 -5
  23. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -0
  24. package/dist/AI/components/prompts/prompt-management.component.js +1079 -0
  25. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -0
  26. package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
  27. package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
  28. package/dist/AI/components/prompts/prompt-version-control.component.js +1 -1
  29. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  30. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  31. package/dist/AI/components/system/system-configuration.component.d.ts +55 -11
  32. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  33. package/dist/AI/components/system/system-configuration.component.js +790 -131
  34. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  35. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
  36. package/dist/AI/components/widgets/kpi-card.component.js +3 -3
  37. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  38. package/dist/AI/index.d.ts +2 -2
  39. package/dist/AI/index.d.ts.map +1 -1
  40. package/dist/AI/index.js +2 -2
  41. package/dist/AI/index.js.map +1 -1
  42. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -6
  43. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  44. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  45. package/dist/Communication/communication-dashboard.component.d.ts +2 -0
  46. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  47. package/dist/Communication/communication-dashboard.component.js +5 -2
  48. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  49. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +3 -2
  50. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  51. package/dist/ComponentStudio/component-studio-dashboard.component.js +7 -3
  52. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  53. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +44 -0
  54. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +1 -0
  55. package/dist/Credentials/components/credential-category-edit-panel.component.js +456 -0
  56. package/dist/Credentials/components/credential-category-edit-panel.component.js.map +1 -0
  57. package/dist/Credentials/components/credential-edit-panel.component.d.ts +70 -0
  58. package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +1 -0
  59. package/dist/Credentials/components/credential-edit-panel.component.js +694 -0
  60. package/dist/Credentials/components/credential-edit-panel.component.js.map +1 -0
  61. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +56 -0
  62. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +1 -0
  63. package/dist/Credentials/components/credential-type-edit-panel.component.js +563 -0
  64. package/dist/Credentials/components/credential-type-edit-panel.component.js.map +1 -0
  65. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +81 -0
  66. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -0
  67. package/dist/Credentials/components/credentials-audit-resource.component.js +864 -0
  68. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -0
  69. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +61 -0
  70. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -0
  71. package/dist/Credentials/components/credentials-categories-resource.component.js +816 -0
  72. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -0
  73. package/dist/Credentials/components/credentials-list-resource.component.d.ts +83 -0
  74. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -0
  75. package/dist/Credentials/components/credentials-list-resource.component.js +1253 -0
  76. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -0
  77. package/dist/Credentials/components/credentials-overview-resource.component.d.ts +99 -0
  78. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -0
  79. package/dist/Credentials/components/credentials-overview-resource.component.js +936 -0
  80. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -0
  81. package/dist/Credentials/components/credentials-types-resource.component.d.ts +70 -0
  82. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -0
  83. package/dist/Credentials/components/credentials-types-resource.component.js +868 -0
  84. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -0
  85. package/dist/Credentials/credentials-dashboard.component.d.ts +37 -0
  86. package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -0
  87. package/dist/Credentials/credentials-dashboard.component.js +290 -0
  88. package/dist/Credentials/credentials-dashboard.component.js.map +1 -0
  89. package/dist/Credentials/index.d.ts +7 -0
  90. package/dist/Credentials/index.d.ts.map +1 -0
  91. package/dist/Credentials/index.js +9 -0
  92. package/dist/Credentials/index.js.map +1 -0
  93. package/dist/Credentials/pipes/group-by.pipe.d.ts +13 -0
  94. package/dist/Credentials/pipes/group-by.pipe.d.ts.map +1 -0
  95. package/dist/Credentials/pipes/group-by.pipe.js +29 -0
  96. package/dist/Credentials/pipes/group-by.pipe.js.map +1 -0
  97. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +2 -2
  98. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +2 -0
  99. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  100. package/dist/DataExplorer/data-explorer-dashboard.component.js +5 -0
  101. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  102. package/dist/DataExplorer/services/explorer-state.service.d.ts +5 -5
  103. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  104. package/dist/DataExplorer/services/explorer-state.service.js +125 -151
  105. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  106. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +15 -19
  107. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  108. package/dist/EntityAdmin/entity-admin-dashboard.component.js +70 -26
  109. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  110. package/dist/Home/home-dashboard.component.d.ts +6 -5
  111. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  112. package/dist/Home/home-dashboard.component.js +174 -166
  113. package/dist/Home/home-dashboard.component.js.map +1 -1
  114. package/dist/Scheduling/scheduling-dashboard.component.d.ts +2 -0
  115. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  116. package/dist/Scheduling/scheduling-dashboard.component.js +5 -2
  117. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  118. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  119. package/dist/Scheduling/services/scheduling-instrumentation.service.js +4 -2
  120. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  121. package/dist/SystemDiagnostics/index.d.ts +2 -0
  122. package/dist/SystemDiagnostics/index.d.ts.map +1 -0
  123. package/dist/SystemDiagnostics/index.js +3 -0
  124. package/dist/SystemDiagnostics/index.js.map +1 -0
  125. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +497 -0
  126. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -0
  127. package/dist/SystemDiagnostics/system-diagnostics.component.js +6063 -0
  128. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -0
  129. package/dist/Testing/components/testing-execution.component.d.ts +16 -5
  130. package/dist/Testing/components/testing-execution.component.d.ts.map +1 -1
  131. package/dist/Testing/components/testing-execution.component.js +452 -273
  132. package/dist/Testing/components/testing-execution.component.js.map +1 -1
  133. package/dist/Testing/components/testing-feedback.component.d.ts +70 -14
  134. package/dist/Testing/components/testing-feedback.component.d.ts.map +1 -1
  135. package/dist/Testing/components/testing-feedback.component.js +1177 -479
  136. package/dist/Testing/components/testing-feedback.component.js.map +1 -1
  137. package/dist/Testing/components/testing-overview.component.d.ts.map +1 -1
  138. package/dist/Testing/components/testing-overview.component.js +182 -162
  139. package/dist/Testing/components/testing-overview.component.js.map +1 -1
  140. package/dist/Testing/components/testing-version-comparison.component.d.ts +4 -0
  141. package/dist/Testing/components/testing-version-comparison.component.d.ts.map +1 -1
  142. package/dist/Testing/components/testing-version-comparison.component.js +19 -5
  143. package/dist/Testing/components/testing-version-comparison.component.js.map +1 -1
  144. package/dist/Testing/services/testing-instrumentation.service.d.ts +47 -1
  145. package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
  146. package/dist/Testing/services/testing-instrumentation.service.js +243 -60
  147. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
  148. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  149. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  150. package/dist/Testing/testing-dashboard.component.js +41 -36
  151. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  152. package/dist/module.d.ts +103 -95
  153. package/dist/module.d.ts.map +1 -1
  154. package/dist/module.js +90 -29
  155. package/dist/module.js.map +1 -1
  156. package/dist/public-api.d.ts +3 -1
  157. package/dist/public-api.d.ts.map +1 -1
  158. package/dist/public-api.js +21 -1
  159. package/dist/public-api.js.map +1 -1
  160. package/package.json +28 -25
  161. package/dist/AI/components/models/model-management-v2.component.d.ts.map +0 -1
  162. package/dist/AI/components/models/model-management-v2.component.js +0 -981
  163. package/dist/AI/components/models/model-management-v2.component.js.map +0 -1
  164. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +0 -1
  165. package/dist/AI/components/prompts/prompt-management-v2.component.js +0 -811
  166. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +0 -1
  167. package/dist/EntityAdmin/components/entity-details.component.d.ts +0 -50
  168. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +0 -1
  169. package/dist/EntityAdmin/components/entity-details.component.js +0 -680
  170. package/dist/EntityAdmin/components/entity-details.component.js.map +0 -1
  171. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +0 -31
  172. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +0 -1
  173. package/dist/EntityAdmin/components/entity-filter-panel.component.js +0 -160
  174. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +0 -1
  175. package/dist/EntityAdmin/components/erd-composite.component.d.ts +0 -73
  176. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +0 -1
  177. package/dist/EntityAdmin/components/erd-composite.component.js +0 -271
  178. package/dist/EntityAdmin/components/erd-composite.component.js.map +0 -1
  179. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +0 -47
  180. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +0 -1
  181. package/dist/EntityAdmin/components/erd-diagram.component.js +0 -618
  182. package/dist/EntityAdmin/components/erd-diagram.component.js.map +0 -1
@@ -0,0 +1,1253 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Component, ChangeDetectionStrategy, ViewChild } from '@angular/core';
8
+ import { Subject } from 'rxjs';
9
+ import { RegisterClass } from '@memberjunction/global';
10
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
11
+ import { RunView, Metadata } from '@memberjunction/core';
12
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/common";
15
+ import * as i2 from "@angular/forms";
16
+ import * as i3 from "@memberjunction/ng-shared-generic";
17
+ import * as i4 from "./credential-edit-panel.component";
18
+ const _c0 = ["editPanel"];
19
+ function CredentialsListResourceComponent_mj_loading_1_Template(rf, ctx) { if (rf & 1) {
20
+ i0.ɵɵelement(0, "mj-loading", 5);
21
+ } }
22
+ function CredentialsListResourceComponent_ng_container_2_span_12_Template(rf, ctx) { if (rf & 1) {
23
+ i0.ɵɵelementStart(0, "span", 44);
24
+ i0.ɵɵelement(1, "i", 45);
25
+ i0.ɵɵtext(2);
26
+ i0.ɵɵelementEnd();
27
+ } if (rf & 2) {
28
+ const ctx_r2 = i0.ɵɵnextContext(2);
29
+ i0.ɵɵadvance(2);
30
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getExpiringSoonCount(), " expiring ");
31
+ } }
32
+ function CredentialsListResourceComponent_ng_container_2_span_13_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelementStart(0, "span", 46);
34
+ i0.ɵɵelement(1, "i", 47);
35
+ i0.ɵɵtext(2);
36
+ i0.ɵɵelementEnd();
37
+ } if (rf & 2) {
38
+ const ctx_r2 = i0.ɵɵnextContext(2);
39
+ i0.ɵɵadvance(2);
40
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getExpiredCount(), " expired ");
41
+ } }
42
+ function CredentialsListResourceComponent_ng_container_2_button_15_Template(rf, ctx) { if (rf & 1) {
43
+ const _r4 = i0.ɵɵgetCurrentView();
44
+ i0.ɵɵelementStart(0, "button", 48);
45
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_button_15_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.createNewCredential()); });
46
+ i0.ɵɵelement(1, "i", 49);
47
+ i0.ɵɵelementStart(2, "span");
48
+ i0.ɵɵtext(3, "New Credential");
49
+ i0.ɵɵelementEnd()();
50
+ } }
51
+ function CredentialsListResourceComponent_ng_container_2_button_21_Template(rf, ctx) { if (rf & 1) {
52
+ const _r5 = i0.ɵɵgetCurrentView();
53
+ i0.ɵɵelementStart(0, "button", 50);
54
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_button_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onSearchChange("")); });
55
+ i0.ɵɵelement(1, "i", 51);
56
+ i0.ɵɵelementEnd();
57
+ } }
58
+ function CredentialsListResourceComponent_ng_container_2_option_25_Template(rf, ctx) { if (rf & 1) {
59
+ i0.ɵɵelementStart(0, "option", 52);
60
+ i0.ɵɵtext(1);
61
+ i0.ɵɵelementEnd();
62
+ } if (rf & 2) {
63
+ const type_r6 = ctx.$implicit;
64
+ i0.ɵɵproperty("value", type_r6.ID);
65
+ i0.ɵɵadvance();
66
+ i0.ɵɵtextInterpolate(type_r6.Name);
67
+ } }
68
+ function CredentialsListResourceComponent_ng_container_2_div_47_button_7_Template(rf, ctx) { if (rf & 1) {
69
+ const _r8 = i0.ɵɵgetCurrentView();
70
+ i0.ɵɵelementStart(0, "button", 60);
71
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_47_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.bulkToggleActive(true)); });
72
+ i0.ɵɵelement(1, "i", 61);
73
+ i0.ɵɵtext(2, " Activate ");
74
+ i0.ɵɵelementEnd();
75
+ } }
76
+ function CredentialsListResourceComponent_ng_container_2_div_47_button_8_Template(rf, ctx) { if (rf & 1) {
77
+ const _r9 = i0.ɵɵgetCurrentView();
78
+ i0.ɵɵelementStart(0, "button", 60);
79
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_47_button_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.bulkToggleActive(false)); });
80
+ i0.ɵɵelement(1, "i", 62);
81
+ i0.ɵɵtext(2, " Deactivate ");
82
+ i0.ɵɵelementEnd();
83
+ } }
84
+ function CredentialsListResourceComponent_ng_container_2_div_47_button_9_Template(rf, ctx) { if (rf & 1) {
85
+ const _r10 = i0.ɵɵgetCurrentView();
86
+ i0.ɵɵelementStart(0, "button", 63);
87
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_47_button_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.bulkDelete()); });
88
+ i0.ɵɵelement(1, "i", 64);
89
+ i0.ɵɵtext(2, " Delete ");
90
+ i0.ɵɵelementEnd();
91
+ } }
92
+ function CredentialsListResourceComponent_ng_container_2_div_47_Template(rf, ctx) { if (rf & 1) {
93
+ const _r7 = i0.ɵɵgetCurrentView();
94
+ i0.ɵɵelementStart(0, "div", 53)(1, "div", 54)(2, "span", 55);
95
+ i0.ɵɵtext(3);
96
+ i0.ɵɵelementEnd();
97
+ i0.ɵɵelementStart(4, "button", 56);
98
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_47_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.clearSelection()); });
99
+ i0.ɵɵtext(5, "Clear selection");
100
+ i0.ɵɵelementEnd()();
101
+ i0.ɵɵelementStart(6, "div", 57);
102
+ i0.ɵɵtemplate(7, CredentialsListResourceComponent_ng_container_2_div_47_button_7_Template, 3, 0, "button", 58)(8, CredentialsListResourceComponent_ng_container_2_div_47_button_8_Template, 3, 0, "button", 58)(9, CredentialsListResourceComponent_ng_container_2_div_47_button_9_Template, 3, 0, "button", 59);
103
+ i0.ɵɵelementEnd()();
104
+ } if (rf & 2) {
105
+ const ctx_r2 = i0.ɵɵnextContext(2);
106
+ i0.ɵɵadvance(3);
107
+ i0.ɵɵtextInterpolate1("", ctx_r2.selectedCredentials.size, " selected");
108
+ i0.ɵɵadvance(4);
109
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate);
110
+ i0.ɵɵadvance();
111
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate);
112
+ i0.ɵɵadvance();
113
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanDelete);
114
+ } }
115
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_1_Template(rf, ctx) { if (rf & 1) {
116
+ const _r12 = i0.ɵɵgetCurrentView();
117
+ i0.ɵɵelementStart(0, "div", 87)(1, "input", 88);
118
+ i0.ɵɵlistener("change", function CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_1_Template_input_change_1_listener() { i0.ɵɵrestoreView(_r12); const credential_r13 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleSelection(credential_r13)); });
119
+ i0.ɵɵelementEnd()();
120
+ } if (rf & 2) {
121
+ const credential_r13 = i0.ɵɵnextContext().$implicit;
122
+ const ctx_r2 = i0.ɵɵnextContext(3);
123
+ i0.ɵɵadvance();
124
+ i0.ɵɵproperty("checked", ctx_r2.selectedCredentials.has(credential_r13.ID));
125
+ } }
126
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_11_Template(rf, ctx) { if (rf & 1) {
127
+ const _r14 = i0.ɵɵgetCurrentView();
128
+ i0.ɵɵelementStart(0, "button", 89);
129
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_11_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r14); const credential_r13 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleCredentialActive(credential_r13, $event)); });
130
+ i0.ɵɵelement(1, "i");
131
+ i0.ɵɵelementEnd();
132
+ } if (rf & 2) {
133
+ const credential_r13 = i0.ɵɵnextContext().$implicit;
134
+ i0.ɵɵproperty("title", credential_r13.IsActive ? "Deactivate" : "Activate");
135
+ i0.ɵɵadvance();
136
+ i0.ɵɵclassMap(credential_r13.IsActive ? "fa-solid fa-toggle-on" : "fa-solid fa-toggle-off");
137
+ } }
138
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_12_Template(rf, ctx) { if (rf & 1) {
139
+ const _r15 = i0.ɵɵgetCurrentView();
140
+ i0.ɵɵelementStart(0, "button", 90);
141
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_12_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r15); const credential_r13 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.editCredential(credential_r13, $event)); });
142
+ i0.ɵɵelement(1, "i", 91);
143
+ i0.ɵɵelementEnd();
144
+ } }
145
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_13_Template(rf, ctx) { if (rf & 1) {
146
+ const _r16 = i0.ɵɵgetCurrentView();
147
+ i0.ɵɵelementStart(0, "button", 92);
148
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_13_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r16); const credential_r13 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.deleteCredential(credential_r13, $event)); });
149
+ i0.ɵɵelement(1, "i", 64);
150
+ i0.ɵɵelementEnd();
151
+ } }
152
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_p_18_Template(rf, ctx) { if (rf & 1) {
153
+ i0.ɵɵelementStart(0, "p", 93);
154
+ i0.ɵɵtext(1);
155
+ i0.ɵɵelementEnd();
156
+ } if (rf & 2) {
157
+ const credential_r13 = i0.ɵɵnextContext().$implicit;
158
+ i0.ɵɵadvance();
159
+ i0.ɵɵtextInterpolate1(" ", credential_r13.Description, " ");
160
+ } }
161
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_20_Template(rf, ctx) { if (rf & 1) {
162
+ i0.ɵɵelementStart(0, "div", 94);
163
+ i0.ɵɵelement(1, "i", 95);
164
+ i0.ɵɵelementStart(2, "span");
165
+ i0.ɵɵtext(3, "Default");
166
+ i0.ɵɵelementEnd()();
167
+ } }
168
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_21_Template(rf, ctx) { if (rf & 1) {
169
+ i0.ɵɵelementStart(0, "div", 94);
170
+ i0.ɵɵelement(1, "i", 96);
171
+ i0.ɵɵelementStart(2, "span");
172
+ i0.ɵɵtext(3);
173
+ i0.ɵɵelementEnd()();
174
+ } if (rf & 2) {
175
+ const credential_r13 = i0.ɵɵnextContext().$implicit;
176
+ const ctx_r2 = i0.ɵɵnextContext(3);
177
+ i0.ɵɵclassProp("warning", ctx_r2.isExpiringSoon(credential_r13))("danger", ctx_r2.isExpired(credential_r13));
178
+ i0.ɵɵadvance(3);
179
+ i0.ɵɵtextInterpolate2("", ctx_r2.isExpired(credential_r13) ? "Expired" : "Expires", ": ", ctx_r2.formatDate(credential_r13.ExpiresAt), "");
180
+ } }
181
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_22_Template(rf, ctx) { if (rf & 1) {
182
+ i0.ɵɵelementStart(0, "div", 94);
183
+ i0.ɵɵelement(1, "i", 45);
184
+ i0.ɵɵelementStart(2, "span");
185
+ i0.ɵɵtext(3);
186
+ i0.ɵɵelementEnd()();
187
+ } if (rf & 2) {
188
+ const credential_r13 = i0.ɵɵnextContext().$implicit;
189
+ const ctx_r2 = i0.ɵɵnextContext(3);
190
+ i0.ɵɵadvance(3);
191
+ i0.ɵɵtextInterpolate1("Last used: ", ctx_r2.formatDate(credential_r13.LastUsedAt), "");
192
+ } }
193
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_24_Template(rf, ctx) { if (rf & 1) {
194
+ i0.ɵɵelementStart(0, "div", 97);
195
+ i0.ɵɵelement(1, "i", 98);
196
+ i0.ɵɵtext(2);
197
+ i0.ɵɵelementEnd();
198
+ } if (rf & 2) {
199
+ const credential_r13 = i0.ɵɵnextContext().$implicit;
200
+ i0.ɵɵadvance(2);
201
+ i0.ɵɵtextInterpolate1(" ", credential_r13.Category, " ");
202
+ } }
203
+ function CredentialsListResourceComponent_ng_container_2_div_48_div_1_Template(rf, ctx) { if (rf & 1) {
204
+ const _r11 = i0.ɵɵgetCurrentView();
205
+ i0.ɵɵelementStart(0, "div", 67);
206
+ i0.ɵɵtemplate(1, CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_1_Template, 2, 1, "div", 68);
207
+ i0.ɵɵelementStart(2, "div", 69)(3, "div", 70);
208
+ i0.ɵɵelement(4, "i");
209
+ i0.ɵɵelementEnd();
210
+ i0.ɵɵelementStart(5, "div", 71)(6, "div", 72);
211
+ i0.ɵɵtext(7);
212
+ i0.ɵɵelementEnd();
213
+ i0.ɵɵelementStart(8, "div", 73);
214
+ i0.ɵɵtext(9);
215
+ i0.ɵɵelementEnd()();
216
+ i0.ɵɵelementStart(10, "div", 74);
217
+ i0.ɵɵtemplate(11, CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_11_Template, 2, 3, "button", 75)(12, CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_12_Template, 2, 0, "button", 76)(13, CredentialsListResourceComponent_ng_container_2_div_48_div_1_button_13_Template, 2, 0, "button", 77);
218
+ i0.ɵɵelementEnd()();
219
+ i0.ɵɵelementStart(14, "div", 78);
220
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_48_div_1_Template_div_click_14_listener() { const credential_r13 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.editCredential(credential_r13)); });
221
+ i0.ɵɵelementStart(15, "div", 79);
222
+ i0.ɵɵelement(16, "i");
223
+ i0.ɵɵtext(17);
224
+ i0.ɵɵelementEnd();
225
+ i0.ɵɵtemplate(18, CredentialsListResourceComponent_ng_container_2_div_48_div_1_p_18_Template, 2, 1, "p", 80);
226
+ i0.ɵɵelementStart(19, "div", 81);
227
+ i0.ɵɵtemplate(20, CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_20_Template, 4, 0, "div", 82)(21, CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_21_Template, 4, 6, "div", 83)(22, CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_22_Template, 4, 1, "div", 82);
228
+ i0.ɵɵelementEnd()();
229
+ i0.ɵɵelementStart(23, "div", 84);
230
+ i0.ɵɵtemplate(24, CredentialsListResourceComponent_ng_container_2_div_48_div_1_div_24_Template, 3, 1, "div", 85);
231
+ i0.ɵɵelementStart(25, "div", 86);
232
+ i0.ɵɵtext(26);
233
+ i0.ɵɵelementEnd()()();
234
+ } if (rf & 2) {
235
+ const credential_r13 = ctx.$implicit;
236
+ const ctx_r2 = i0.ɵɵnextContext(3);
237
+ i0.ɵɵclassProp("selected", ctx_r2.selectedCredentials.has(credential_r13.ID))("expired", ctx_r2.isExpired(credential_r13))("expiring", ctx_r2.isExpiringSoon(credential_r13));
238
+ i0.ɵɵadvance();
239
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate || ctx_r2.UserCanDelete);
240
+ i0.ɵɵadvance(2);
241
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(credential_r13));
242
+ i0.ɵɵadvance();
243
+ i0.ɵɵclassMap(credential_r13.IconClass || "fa-solid fa-key");
244
+ i0.ɵɵadvance(3);
245
+ i0.ɵɵtextInterpolate(credential_r13.Name);
246
+ i0.ɵɵadvance(2);
247
+ i0.ɵɵtextInterpolate(credential_r13.CredentialType || "Unknown Type");
248
+ i0.ɵɵadvance(2);
249
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate);
250
+ i0.ɵɵadvance();
251
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate);
252
+ i0.ɵɵadvance();
253
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanDelete);
254
+ i0.ɵɵadvance(2);
255
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(credential_r13));
256
+ i0.ɵɵadvance();
257
+ i0.ɵɵclassMap(ctx_r2.getStatusIcon(credential_r13));
258
+ i0.ɵɵadvance();
259
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getStatusLabel(credential_r13), " ");
260
+ i0.ɵɵadvance();
261
+ i0.ɵɵproperty("ngIf", credential_r13.Description);
262
+ i0.ɵɵadvance(2);
263
+ i0.ɵɵproperty("ngIf", credential_r13.IsDefault);
264
+ i0.ɵɵadvance();
265
+ i0.ɵɵproperty("ngIf", credential_r13.ExpiresAt);
266
+ i0.ɵɵadvance();
267
+ i0.ɵɵproperty("ngIf", credential_r13.LastUsedAt);
268
+ i0.ɵɵadvance(2);
269
+ i0.ɵɵproperty("ngIf", credential_r13.Category);
270
+ i0.ɵɵadvance(2);
271
+ i0.ɵɵtextInterpolate1(" Created ", ctx_r2.formatDate(credential_r13.__mj_CreatedAt), " ");
272
+ } }
273
+ function CredentialsListResourceComponent_ng_container_2_div_48_Template(rf, ctx) { if (rf & 1) {
274
+ i0.ɵɵelementStart(0, "div", 65);
275
+ i0.ɵɵtemplate(1, CredentialsListResourceComponent_ng_container_2_div_48_div_1_Template, 27, 25, "div", 66);
276
+ i0.ɵɵelementEnd();
277
+ } if (rf & 2) {
278
+ const ctx_r2 = i0.ɵɵnextContext(2);
279
+ i0.ɵɵadvance();
280
+ i0.ɵɵproperty("ngForOf", ctx_r2.filteredCredentials);
281
+ } }
282
+ function CredentialsListResourceComponent_ng_container_2_div_49_th_4_Template(rf, ctx) { if (rf & 1) {
283
+ const _r17 = i0.ɵɵgetCurrentView();
284
+ i0.ɵɵelementStart(0, "th", 110)(1, "input", 88);
285
+ i0.ɵɵlistener("change", function CredentialsListResourceComponent_ng_container_2_div_49_th_4_Template_input_change_1_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleSelectAll()); });
286
+ i0.ɵɵelementEnd()();
287
+ } if (rf & 2) {
288
+ const ctx_r2 = i0.ɵɵnextContext(3);
289
+ i0.ɵɵadvance();
290
+ i0.ɵɵproperty("checked", ctx_r2.isAllSelected());
291
+ } }
292
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_td_1_Template(rf, ctx) { if (rf & 1) {
293
+ const _r19 = i0.ɵɵgetCurrentView();
294
+ i0.ɵɵelementStart(0, "td", 110)(1, "input", 88);
295
+ i0.ɵɵlistener("change", function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_td_1_Template_input_change_1_listener() { i0.ɵɵrestoreView(_r19); const credential_r20 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleSelection(credential_r20)); });
296
+ i0.ɵɵelementEnd()();
297
+ } if (rf & 2) {
298
+ const credential_r20 = i0.ɵɵnextContext().$implicit;
299
+ const ctx_r2 = i0.ɵɵnextContext(3);
300
+ i0.ɵɵadvance();
301
+ i0.ɵɵproperty("checked", ctx_r2.selectedCredentials.has(credential_r20.ID));
302
+ } }
303
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_span_8_Template(rf, ctx) { if (rf & 1) {
304
+ i0.ɵɵelementStart(0, "span", 123);
305
+ i0.ɵɵtext(1);
306
+ i0.ɵɵelementEnd();
307
+ } if (rf & 2) {
308
+ const credential_r20 = i0.ɵɵnextContext().$implicit;
309
+ i0.ɵɵadvance();
310
+ i0.ɵɵtextInterpolate(credential_r20.Description);
311
+ } }
312
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_span_9_Template(rf, ctx) { if (rf & 1) {
313
+ i0.ɵɵelementStart(0, "span", 124);
314
+ i0.ɵɵtext(1, "Default");
315
+ i0.ɵɵelementEnd();
316
+ } }
317
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_span_13_Template(rf, ctx) { if (rf & 1) {
318
+ i0.ɵɵelementStart(0, "span", 125);
319
+ i0.ɵɵtext(1);
320
+ i0.ɵɵelementEnd();
321
+ } if (rf & 2) {
322
+ const credential_r20 = i0.ɵɵnextContext().$implicit;
323
+ i0.ɵɵadvance();
324
+ i0.ɵɵtextInterpolate(credential_r20.Category);
325
+ } }
326
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_span_14_Template(rf, ctx) { if (rf & 1) {
327
+ i0.ɵɵelementStart(0, "span");
328
+ i0.ɵɵtext(1, "-");
329
+ i0.ɵɵelementEnd();
330
+ } }
331
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_24_Template(rf, ctx) { if (rf & 1) {
332
+ const _r21 = i0.ɵɵgetCurrentView();
333
+ i0.ɵɵelementStart(0, "button", 126);
334
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_24_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r21); const credential_r20 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleCredentialActive(credential_r20, $event)); });
335
+ i0.ɵɵelement(1, "i");
336
+ i0.ɵɵelementEnd();
337
+ } if (rf & 2) {
338
+ const credential_r20 = i0.ɵɵnextContext().$implicit;
339
+ i0.ɵɵproperty("title", credential_r20.IsActive ? "Deactivate" : "Activate");
340
+ i0.ɵɵadvance();
341
+ i0.ɵɵclassMap(credential_r20.IsActive ? "fa-solid fa-toggle-on" : "fa-solid fa-toggle-off");
342
+ } }
343
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_25_Template(rf, ctx) { if (rf & 1) {
344
+ const _r22 = i0.ɵɵgetCurrentView();
345
+ i0.ɵɵelementStart(0, "button", 127);
346
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_25_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r22); const credential_r20 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.editCredential(credential_r20, $event)); });
347
+ i0.ɵɵelement(1, "i", 91);
348
+ i0.ɵɵelementEnd();
349
+ } }
350
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_26_Template(rf, ctx) { if (rf & 1) {
351
+ const _r23 = i0.ɵɵgetCurrentView();
352
+ i0.ɵɵelementStart(0, "button", 128);
353
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_26_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r23); const credential_r20 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.deleteCredential(credential_r20, $event)); });
354
+ i0.ɵɵelement(1, "i", 64);
355
+ i0.ɵɵelementEnd();
356
+ } }
357
+ function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_Template(rf, ctx) { if (rf & 1) {
358
+ const _r18 = i0.ɵɵgetCurrentView();
359
+ i0.ɵɵelementStart(0, "tr");
360
+ i0.ɵɵtemplate(1, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_td_1_Template, 2, 1, "td", 101);
361
+ i0.ɵɵelementStart(2, "td", 111);
362
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_49_tr_20_Template_td_click_2_listener() { const credential_r20 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.editCredential(credential_r20)); });
363
+ i0.ɵɵelementStart(3, "div", 112);
364
+ i0.ɵɵelement(4, "i", 113);
365
+ i0.ɵɵelementStart(5, "div", 114)(6, "span", 72);
366
+ i0.ɵɵtext(7);
367
+ i0.ɵɵelementEnd();
368
+ i0.ɵɵtemplate(8, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_span_8_Template, 2, 1, "span", 115);
369
+ i0.ɵɵelementEnd();
370
+ i0.ɵɵtemplate(9, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_span_9_Template, 2, 0, "span", 116);
371
+ i0.ɵɵelementEnd()();
372
+ i0.ɵɵelementStart(10, "td", 103);
373
+ i0.ɵɵtext(11);
374
+ i0.ɵɵelementEnd();
375
+ i0.ɵɵelementStart(12, "td", 104);
376
+ i0.ɵɵtemplate(13, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_span_13_Template, 2, 1, "span", 117)(14, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_span_14_Template, 2, 0, "span", 3);
377
+ i0.ɵɵelementEnd();
378
+ i0.ɵɵelementStart(15, "td", 105)(16, "span", 118);
379
+ i0.ɵɵtext(17);
380
+ i0.ɵɵelementEnd()();
381
+ i0.ɵɵelementStart(18, "td", 106);
382
+ i0.ɵɵtext(19);
383
+ i0.ɵɵelementEnd();
384
+ i0.ɵɵelementStart(20, "td", 107);
385
+ i0.ɵɵtext(21);
386
+ i0.ɵɵelementEnd();
387
+ i0.ɵɵelementStart(22, "td", 108)(23, "div", 119);
388
+ i0.ɵɵtemplate(24, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_24_Template, 2, 3, "button", 120)(25, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_25_Template, 2, 0, "button", 121)(26, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_button_26_Template, 2, 0, "button", 122);
389
+ i0.ɵɵelementEnd()()();
390
+ } if (rf & 2) {
391
+ const credential_r20 = ctx.$implicit;
392
+ const ctx_r2 = i0.ɵɵnextContext(3);
393
+ i0.ɵɵclassProp("selected", ctx_r2.selectedCredentials.has(credential_r20.ID))("expired", ctx_r2.isExpired(credential_r20));
394
+ i0.ɵɵadvance();
395
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate || ctx_r2.UserCanDelete);
396
+ i0.ɵɵadvance(3);
397
+ i0.ɵɵclassMap(credential_r20.IconClass || "fa-solid fa-key");
398
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(credential_r20));
399
+ i0.ɵɵadvance(3);
400
+ i0.ɵɵtextInterpolate(credential_r20.Name);
401
+ i0.ɵɵadvance();
402
+ i0.ɵɵproperty("ngIf", credential_r20.Description);
403
+ i0.ɵɵadvance();
404
+ i0.ɵɵproperty("ngIf", credential_r20.IsDefault);
405
+ i0.ɵɵadvance(2);
406
+ i0.ɵɵtextInterpolate(credential_r20.CredentialType || "-");
407
+ i0.ɵɵadvance(2);
408
+ i0.ɵɵproperty("ngIf", credential_r20.Category);
409
+ i0.ɵɵadvance();
410
+ i0.ɵɵproperty("ngIf", !credential_r20.Category);
411
+ i0.ɵɵadvance(2);
412
+ i0.ɵɵproperty("ngClass", ctx_r2.getStatusClass(credential_r20));
413
+ i0.ɵɵadvance();
414
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getStatusLabel(credential_r20), " ");
415
+ i0.ɵɵadvance();
416
+ i0.ɵɵclassProp("warning", ctx_r2.isExpiringSoon(credential_r20))("danger", ctx_r2.isExpired(credential_r20));
417
+ i0.ɵɵadvance();
418
+ i0.ɵɵtextInterpolate1(" ", credential_r20.ExpiresAt ? ctx_r2.formatDate(credential_r20.ExpiresAt) : "Never", " ");
419
+ i0.ɵɵadvance(2);
420
+ i0.ɵɵtextInterpolate1(" ", credential_r20.LastUsedAt ? ctx_r2.formatDate(credential_r20.LastUsedAt) : "Never", " ");
421
+ i0.ɵɵadvance(3);
422
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate);
423
+ i0.ɵɵadvance();
424
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate);
425
+ i0.ɵɵadvance();
426
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanDelete);
427
+ } }
428
+ function CredentialsListResourceComponent_ng_container_2_div_49_Template(rf, ctx) { if (rf & 1) {
429
+ i0.ɵɵelementStart(0, "div", 99)(1, "table", 100)(2, "thead")(3, "tr");
430
+ i0.ɵɵtemplate(4, CredentialsListResourceComponent_ng_container_2_div_49_th_4_Template, 2, 1, "th", 101);
431
+ i0.ɵɵelementStart(5, "th", 102);
432
+ i0.ɵɵtext(6, "Name");
433
+ i0.ɵɵelementEnd();
434
+ i0.ɵɵelementStart(7, "th", 103);
435
+ i0.ɵɵtext(8, "Type");
436
+ i0.ɵɵelementEnd();
437
+ i0.ɵɵelementStart(9, "th", 104);
438
+ i0.ɵɵtext(10, "Category");
439
+ i0.ɵɵelementEnd();
440
+ i0.ɵɵelementStart(11, "th", 105);
441
+ i0.ɵɵtext(12, "Status");
442
+ i0.ɵɵelementEnd();
443
+ i0.ɵɵelementStart(13, "th", 106);
444
+ i0.ɵɵtext(14, "Expires");
445
+ i0.ɵɵelementEnd();
446
+ i0.ɵɵelementStart(15, "th", 107);
447
+ i0.ɵɵtext(16, "Last Used");
448
+ i0.ɵɵelementEnd();
449
+ i0.ɵɵelementStart(17, "th", 108);
450
+ i0.ɵɵtext(18, "Actions");
451
+ i0.ɵɵelementEnd()()();
452
+ i0.ɵɵelementStart(19, "tbody");
453
+ i0.ɵɵtemplate(20, CredentialsListResourceComponent_ng_container_2_div_49_tr_20_Template, 27, 25, "tr", 109);
454
+ i0.ɵɵelementEnd()()();
455
+ } if (rf & 2) {
456
+ const ctx_r2 = i0.ɵɵnextContext(2);
457
+ i0.ɵɵadvance(4);
458
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanUpdate || ctx_r2.UserCanDelete);
459
+ i0.ɵɵadvance(16);
460
+ i0.ɵɵproperty("ngForOf", ctx_r2.filteredCredentials);
461
+ } }
462
+ function CredentialsListResourceComponent_ng_container_2_div_50_p_5_Template(rf, ctx) { if (rf & 1) {
463
+ const _r24 = i0.ɵɵgetCurrentView();
464
+ i0.ɵɵelementStart(0, "p");
465
+ i0.ɵɵtext(1, " No credentials match your current filters. ");
466
+ i0.ɵɵelementStart(2, "button", 56);
467
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_50_p_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.clearFilters()); });
468
+ i0.ɵɵtext(3, "Clear filters");
469
+ i0.ɵɵelementEnd()();
470
+ } }
471
+ function CredentialsListResourceComponent_ng_container_2_div_50_p_6_Template(rf, ctx) { if (rf & 1) {
472
+ i0.ɵɵelementStart(0, "p");
473
+ i0.ɵɵtext(1, " Get started by creating your first credential. ");
474
+ i0.ɵɵelementEnd();
475
+ } }
476
+ function CredentialsListResourceComponent_ng_container_2_div_50_button_7_Template(rf, ctx) { if (rf & 1) {
477
+ const _r25 = i0.ɵɵgetCurrentView();
478
+ i0.ɵɵelementStart(0, "button", 48);
479
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_div_50_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.createNewCredential()); });
480
+ i0.ɵɵelement(1, "i", 49);
481
+ i0.ɵɵtext(2, " Create Credential ");
482
+ i0.ɵɵelementEnd();
483
+ } }
484
+ function CredentialsListResourceComponent_ng_container_2_div_50_Template(rf, ctx) { if (rf & 1) {
485
+ i0.ɵɵelementStart(0, "div", 129)(1, "div", 130);
486
+ i0.ɵɵelement(2, "i", 11);
487
+ i0.ɵɵelementEnd();
488
+ i0.ɵɵelementStart(3, "h3");
489
+ i0.ɵɵtext(4, "No Credentials Found");
490
+ i0.ɵɵelementEnd();
491
+ i0.ɵɵtemplate(5, CredentialsListResourceComponent_ng_container_2_div_50_p_5_Template, 4, 0, "p", 3)(6, CredentialsListResourceComponent_ng_container_2_div_50_p_6_Template, 2, 0, "p", 3)(7, CredentialsListResourceComponent_ng_container_2_div_50_button_7_Template, 3, 0, "button", 17);
492
+ i0.ɵɵelementEnd();
493
+ } if (rf & 2) {
494
+ const ctx_r2 = i0.ɵɵnextContext(2);
495
+ i0.ɵɵadvance(5);
496
+ i0.ɵɵproperty("ngIf", ctx_r2.searchText || ctx_r2.selectedTypeFilter || ctx_r2.selectedStatusFilter);
497
+ i0.ɵɵadvance();
498
+ i0.ɵɵproperty("ngIf", !ctx_r2.searchText && !ctx_r2.selectedTypeFilter && !ctx_r2.selectedStatusFilter);
499
+ i0.ɵɵadvance();
500
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanCreate && !ctx_r2.searchText && !ctx_r2.selectedTypeFilter && !ctx_r2.selectedStatusFilter);
501
+ } }
502
+ function CredentialsListResourceComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
503
+ const _r2 = i0.ɵɵgetCurrentView();
504
+ i0.ɵɵelementContainerStart(0);
505
+ i0.ɵɵelementStart(1, "div", 6)(2, "div", 7)(3, "h2", 8);
506
+ i0.ɵɵtext(4, "Credentials");
507
+ i0.ɵɵelementEnd();
508
+ i0.ɵɵelementStart(5, "div", 9)(6, "span", 10);
509
+ i0.ɵɵelement(7, "i", 11);
510
+ i0.ɵɵtext(8);
511
+ i0.ɵɵelementEnd();
512
+ i0.ɵɵelementStart(9, "span", 12);
513
+ i0.ɵɵelement(10, "i", 13);
514
+ i0.ɵɵtext(11);
515
+ i0.ɵɵelementEnd();
516
+ i0.ɵɵtemplate(12, CredentialsListResourceComponent_ng_container_2_span_12_Template, 3, 1, "span", 14)(13, CredentialsListResourceComponent_ng_container_2_span_13_Template, 3, 1, "span", 15);
517
+ i0.ɵɵelementEnd()();
518
+ i0.ɵɵelementStart(14, "div", 16);
519
+ i0.ɵɵtemplate(15, CredentialsListResourceComponent_ng_container_2_button_15_Template, 4, 0, "button", 17);
520
+ i0.ɵɵelementEnd()();
521
+ i0.ɵɵelementStart(16, "div", 18)(17, "div", 19)(18, "div", 20);
522
+ i0.ɵɵelement(19, "i", 21);
523
+ i0.ɵɵelementStart(20, "input", 22);
524
+ i0.ɵɵlistener("input", function CredentialsListResourceComponent_ng_container_2_Template_input_input_20_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSearchChange($event.target.value)); });
525
+ i0.ɵɵelementEnd();
526
+ i0.ɵɵtemplate(21, CredentialsListResourceComponent_ng_container_2_button_21_Template, 2, 0, "button", 23);
527
+ i0.ɵɵelementEnd();
528
+ i0.ɵɵelementStart(22, "select", 24);
529
+ i0.ɵɵlistener("change", function CredentialsListResourceComponent_ng_container_2_Template_select_change_22_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTypeFilterChange($event.target.value)); });
530
+ i0.ɵɵelementStart(23, "option", 25);
531
+ i0.ɵɵtext(24, "All Types");
532
+ i0.ɵɵelementEnd();
533
+ i0.ɵɵtemplate(25, CredentialsListResourceComponent_ng_container_2_option_25_Template, 2, 2, "option", 26);
534
+ i0.ɵɵelementEnd();
535
+ i0.ɵɵelementStart(26, "select", 24);
536
+ i0.ɵɵlistener("change", function CredentialsListResourceComponent_ng_container_2_Template_select_change_26_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onStatusFilterChange($event.target.value)); });
537
+ i0.ɵɵelementStart(27, "option", 25);
538
+ i0.ɵɵtext(28, "All Statuses");
539
+ i0.ɵɵelementEnd();
540
+ i0.ɵɵelementStart(29, "option", 27);
541
+ i0.ɵɵtext(30, "Active");
542
+ i0.ɵɵelementEnd();
543
+ i0.ɵɵelementStart(31, "option", 28);
544
+ i0.ɵɵtext(32, "Inactive");
545
+ i0.ɵɵelementEnd();
546
+ i0.ɵɵelementStart(33, "option", 29);
547
+ i0.ɵɵtext(34, "Expiring Soon");
548
+ i0.ɵɵelementEnd();
549
+ i0.ɵɵelementStart(35, "option", 30);
550
+ i0.ɵɵtext(36, "Expired");
551
+ i0.ɵɵelementEnd()()();
552
+ i0.ɵɵelementStart(37, "div", 31)(38, "div", 32);
553
+ i0.ɵɵtext(39);
554
+ i0.ɵɵelementEnd();
555
+ i0.ɵɵelementStart(40, "div", 33)(41, "button", 34);
556
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_Template_button_click_41_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setViewMode("grid")); });
557
+ i0.ɵɵelement(42, "i", 35);
558
+ i0.ɵɵelementEnd();
559
+ i0.ɵɵelementStart(43, "button", 36);
560
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_Template_button_click_43_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setViewMode("list")); });
561
+ i0.ɵɵelement(44, "i", 37);
562
+ i0.ɵɵelementEnd()();
563
+ i0.ɵɵelementStart(45, "button", 38);
564
+ i0.ɵɵlistener("click", function CredentialsListResourceComponent_ng_container_2_Template_button_click_45_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.refresh()); });
565
+ i0.ɵɵelement(46, "i", 39);
566
+ i0.ɵɵelementEnd()()();
567
+ i0.ɵɵtemplate(47, CredentialsListResourceComponent_ng_container_2_div_47_Template, 10, 4, "div", 40)(48, CredentialsListResourceComponent_ng_container_2_div_48_Template, 2, 1, "div", 41)(49, CredentialsListResourceComponent_ng_container_2_div_49_Template, 21, 2, "div", 42)(50, CredentialsListResourceComponent_ng_container_2_div_50_Template, 8, 3, "div", 43);
568
+ i0.ɵɵelementContainerEnd();
569
+ } if (rf & 2) {
570
+ const ctx_r2 = i0.ɵɵnextContext();
571
+ i0.ɵɵadvance(8);
572
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.credentials.length, " total ");
573
+ i0.ɵɵadvance(3);
574
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getActiveCount(), " active ");
575
+ i0.ɵɵadvance();
576
+ i0.ɵɵproperty("ngIf", ctx_r2.getExpiringSoonCount() > 0);
577
+ i0.ɵɵadvance();
578
+ i0.ɵɵproperty("ngIf", ctx_r2.getExpiredCount() > 0);
579
+ i0.ɵɵadvance(2);
580
+ i0.ɵɵproperty("ngIf", ctx_r2.UserCanCreate);
581
+ i0.ɵɵadvance(5);
582
+ i0.ɵɵproperty("value", ctx_r2.searchText);
583
+ i0.ɵɵadvance();
584
+ i0.ɵɵproperty("ngIf", ctx_r2.searchText);
585
+ i0.ɵɵadvance();
586
+ i0.ɵɵproperty("value", ctx_r2.selectedTypeFilter);
587
+ i0.ɵɵadvance(3);
588
+ i0.ɵɵproperty("ngForOf", ctx_r2.types);
589
+ i0.ɵɵadvance();
590
+ i0.ɵɵproperty("value", ctx_r2.selectedStatusFilter);
591
+ i0.ɵɵadvance(13);
592
+ i0.ɵɵtextInterpolate2(" ", ctx_r2.filteredCredentials.length, " of ", ctx_r2.credentials.length, " ");
593
+ i0.ɵɵadvance(2);
594
+ i0.ɵɵclassProp("active", ctx_r2.viewMode === "grid");
595
+ i0.ɵɵadvance(2);
596
+ i0.ɵɵclassProp("active", ctx_r2.viewMode === "list");
597
+ i0.ɵɵadvance(4);
598
+ i0.ɵɵproperty("ngIf", ctx_r2.selectedCredentials.size > 0);
599
+ i0.ɵɵadvance();
600
+ i0.ɵɵproperty("ngIf", ctx_r2.viewMode === "grid" && ctx_r2.filteredCredentials.length > 0);
601
+ i0.ɵɵadvance();
602
+ i0.ɵɵproperty("ngIf", ctx_r2.viewMode === "list" && ctx_r2.filteredCredentials.length > 0);
603
+ i0.ɵɵadvance();
604
+ i0.ɵɵproperty("ngIf", ctx_r2.filteredCredentials.length === 0);
605
+ } }
606
+ export function LoadCredentialsListResource() {
607
+ // Prevents tree-shaking
608
+ }
609
+ let CredentialsListResourceComponent = class CredentialsListResourceComponent extends BaseResourceComponent {
610
+ cdr;
611
+ isLoading = true;
612
+ credentials = [];
613
+ filteredCredentials = [];
614
+ types = [];
615
+ // View state
616
+ viewMode = 'grid';
617
+ searchText = '';
618
+ selectedTypeFilter = '';
619
+ selectedStatusFilter = '';
620
+ showActiveOnly = false;
621
+ // Selection for bulk operations
622
+ selectedCredentials = new Set();
623
+ _isAllSelected = false;
624
+ // Permissions
625
+ _metadata = new Metadata();
626
+ _permissionCache = new Map();
627
+ destroy$ = new Subject();
628
+ editPanel;
629
+ constructor(cdr) {
630
+ super();
631
+ this.cdr = cdr;
632
+ }
633
+ ngOnInit() {
634
+ this.loadData();
635
+ }
636
+ ngOnDestroy() {
637
+ this.destroy$.next();
638
+ this.destroy$.complete();
639
+ }
640
+ async GetResourceDisplayName(data) {
641
+ return 'Credentials';
642
+ }
643
+ async GetResourceIconClass(data) {
644
+ return 'fa-solid fa-key';
645
+ }
646
+ // === Permission Checks ===
647
+ get UserCanCreate() {
648
+ return this.checkEntityPermission('MJ: Credentials', 'Create');
649
+ }
650
+ get UserCanUpdate() {
651
+ return this.checkEntityPermission('MJ: Credentials', 'Update');
652
+ }
653
+ get UserCanDelete() {
654
+ return this.checkEntityPermission('MJ: Credentials', 'Delete');
655
+ }
656
+ checkEntityPermission(entityName, permissionType) {
657
+ const cacheKey = `${entityName}_${permissionType}`;
658
+ if (this._permissionCache.has(cacheKey)) {
659
+ return this._permissionCache.get(cacheKey);
660
+ }
661
+ try {
662
+ const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);
663
+ if (!entityInfo) {
664
+ this._permissionCache.set(cacheKey, false);
665
+ return false;
666
+ }
667
+ const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);
668
+ let hasPermission = false;
669
+ switch (permissionType) {
670
+ case 'Create':
671
+ hasPermission = userPermissions.CanCreate;
672
+ break;
673
+ case 'Read':
674
+ hasPermission = userPermissions.CanRead;
675
+ break;
676
+ case 'Update':
677
+ hasPermission = userPermissions.CanUpdate;
678
+ break;
679
+ case 'Delete':
680
+ hasPermission = userPermissions.CanDelete;
681
+ break;
682
+ }
683
+ this._permissionCache.set(cacheKey, hasPermission);
684
+ return hasPermission;
685
+ }
686
+ catch (error) {
687
+ this._permissionCache.set(cacheKey, false);
688
+ return false;
689
+ }
690
+ }
691
+ async loadData() {
692
+ try {
693
+ this.isLoading = true;
694
+ this.cdr.markForCheck();
695
+ const rv = new RunView();
696
+ const [credResult, typeResult] = await rv.RunViews([
697
+ {
698
+ EntityName: 'MJ: Credentials',
699
+ OrderBy: '__mj_UpdatedAt DESC',
700
+ ResultType: 'entity_object'
701
+ },
702
+ {
703
+ EntityName: 'MJ: Credential Types',
704
+ OrderBy: 'Category, Name',
705
+ ResultType: 'entity_object'
706
+ }
707
+ ]);
708
+ if (credResult.Success) {
709
+ this.credentials = credResult.Results;
710
+ }
711
+ if (typeResult.Success) {
712
+ this.types = typeResult.Results;
713
+ }
714
+ this.applyFilters();
715
+ }
716
+ catch (error) {
717
+ console.error('Error loading credentials:', error);
718
+ MJNotificationService.Instance.CreateSimpleNotification('Error loading credentials', 'error', 3000);
719
+ }
720
+ finally {
721
+ this.isLoading = false;
722
+ this.NotifyLoadComplete();
723
+ this.cdr.markForCheck();
724
+ // Handle navigation params from Data.Configuration (passed via NavigationService)
725
+ this.handleNavigationConfig();
726
+ }
727
+ }
728
+ // === Navigation Handling ===
729
+ handleNavigationConfig() {
730
+ const config = this.Data?.Configuration;
731
+ if (!config) {
732
+ return;
733
+ }
734
+ // Apply filters from navigation config
735
+ if (config.typeId) {
736
+ this.selectedTypeFilter = config.typeId;
737
+ this.applyFilters();
738
+ }
739
+ if (config.openCreatePanel) {
740
+ // Open create panel (optionally with type/category pre-selected)
741
+ setTimeout(() => {
742
+ if (config.categoryId) {
743
+ this.createNewCredentialWithType(config.typeId, config.categoryId);
744
+ }
745
+ else if (config.typeId) {
746
+ this.createNewCredentialWithType(config.typeId);
747
+ }
748
+ else {
749
+ this.createNewCredential();
750
+ }
751
+ }, 100);
752
+ }
753
+ }
754
+ // === CRUD Operations ===
755
+ createNewCredential() {
756
+ if (this.editPanel) {
757
+ this.editPanel.open(null);
758
+ }
759
+ }
760
+ createNewCredentialWithType(typeId, categoryId) {
761
+ if (this.editPanel) {
762
+ this.editPanel.open(null, typeId, categoryId);
763
+ }
764
+ }
765
+ editCredential(credential, event) {
766
+ if (event) {
767
+ event.stopPropagation();
768
+ }
769
+ if (this.editPanel) {
770
+ this.editPanel.open(credential);
771
+ }
772
+ }
773
+ onCredentialSaved(credential) {
774
+ // Check if it's a new credential or update
775
+ const existingIndex = this.credentials.findIndex(c => c.ID === credential.ID);
776
+ if (existingIndex >= 0) {
777
+ // Update existing
778
+ this.credentials[existingIndex] = credential;
779
+ }
780
+ else {
781
+ // Add new
782
+ this.credentials.unshift(credential);
783
+ }
784
+ this.applyFilters();
785
+ this.cdr.markForCheck();
786
+ }
787
+ onCredentialDeleted(credentialId) {
788
+ this.credentials = this.credentials.filter(c => c.ID !== credentialId);
789
+ this.selectedCredentials.delete(credentialId);
790
+ this.applyFilters();
791
+ this.cdr.markForCheck();
792
+ }
793
+ async deleteCredential(credential, event) {
794
+ if (event) {
795
+ event.stopPropagation();
796
+ }
797
+ if (!this.UserCanDelete) {
798
+ MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to delete credentials', 'warning', 3000);
799
+ return;
800
+ }
801
+ const confirmed = confirm(`Are you sure you want to delete "${credential.Name}"? This action cannot be undone.`);
802
+ if (!confirmed)
803
+ return;
804
+ try {
805
+ const success = await credential.Delete();
806
+ if (success) {
807
+ MJNotificationService.Instance.CreateSimpleNotification(`Credential "${credential.Name}" deleted successfully`, 'success', 3000);
808
+ this.credentials = this.credentials.filter(c => c.ID !== credential.ID);
809
+ this.selectedCredentials.delete(credential.ID);
810
+ this.applyFilters();
811
+ }
812
+ else {
813
+ MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credential', 'error', 3000);
814
+ }
815
+ }
816
+ catch (error) {
817
+ console.error('Error deleting credential:', error);
818
+ MJNotificationService.Instance.CreateSimpleNotification('Error deleting credential', 'error', 3000);
819
+ }
820
+ }
821
+ async toggleCredentialActive(credential, event) {
822
+ if (event) {
823
+ event.stopPropagation();
824
+ }
825
+ if (!this.UserCanUpdate) {
826
+ MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to update credentials', 'warning', 3000);
827
+ return;
828
+ }
829
+ try {
830
+ credential.IsActive = !credential.IsActive;
831
+ const success = await credential.Save();
832
+ if (success) {
833
+ const status = credential.IsActive ? 'activated' : 'deactivated';
834
+ MJNotificationService.Instance.CreateSimpleNotification(`Credential "${credential.Name}" ${status}`, 'success', 2000);
835
+ this.applyFilters();
836
+ }
837
+ else {
838
+ // Revert on failure
839
+ credential.IsActive = !credential.IsActive;
840
+ MJNotificationService.Instance.CreateSimpleNotification('Failed to update credential', 'error', 3000);
841
+ }
842
+ }
843
+ catch (error) {
844
+ console.error('Error updating credential:', error);
845
+ credential.IsActive = !credential.IsActive;
846
+ MJNotificationService.Instance.CreateSimpleNotification('Error updating credential', 'error', 3000);
847
+ }
848
+ this.cdr.markForCheck();
849
+ }
850
+ // === Selection ===
851
+ toggleSelection(credential, event) {
852
+ if (event) {
853
+ event.stopPropagation();
854
+ }
855
+ if (this.selectedCredentials.has(credential.ID)) {
856
+ this.selectedCredentials.delete(credential.ID);
857
+ }
858
+ else {
859
+ this.selectedCredentials.add(credential.ID);
860
+ }
861
+ this.updateAllSelectedState();
862
+ this.cdr.markForCheck();
863
+ }
864
+ toggleSelectAll() {
865
+ if (this._isAllSelected) {
866
+ this.selectedCredentials.clear();
867
+ }
868
+ else {
869
+ this.filteredCredentials.forEach(c => this.selectedCredentials.add(c.ID));
870
+ }
871
+ this._isAllSelected = !this._isAllSelected;
872
+ this.cdr.markForCheck();
873
+ }
874
+ isAllSelected() {
875
+ return this._isAllSelected;
876
+ }
877
+ isSelected(credential) {
878
+ return this.selectedCredentials.has(credential.ID);
879
+ }
880
+ clearSelection() {
881
+ this.selectedCredentials.clear();
882
+ this._isAllSelected = false;
883
+ this.cdr.markForCheck();
884
+ }
885
+ updateAllSelectedState() {
886
+ this._isAllSelected = this.filteredCredentials.length > 0 &&
887
+ this.filteredCredentials.every(c => this.selectedCredentials.has(c.ID));
888
+ }
889
+ async deleteSelected() {
890
+ if (!this.UserCanDelete || this.selectedCredentials.size === 0)
891
+ return;
892
+ const count = this.selectedCredentials.size;
893
+ const confirmed = confirm(`Are you sure you want to delete ${count} credential(s)? This action cannot be undone.`);
894
+ if (!confirmed)
895
+ return;
896
+ let successCount = 0;
897
+ let failCount = 0;
898
+ for (const credId of this.selectedCredentials) {
899
+ const credential = this.credentials.find(c => c.ID === credId);
900
+ if (credential) {
901
+ try {
902
+ const success = await credential.Delete();
903
+ if (success) {
904
+ successCount++;
905
+ this.credentials = this.credentials.filter(c => c.ID !== credId);
906
+ }
907
+ else {
908
+ failCount++;
909
+ }
910
+ }
911
+ catch {
912
+ failCount++;
913
+ }
914
+ }
915
+ }
916
+ this.selectedCredentials.clear();
917
+ this.applyFilters();
918
+ if (successCount > 0) {
919
+ MJNotificationService.Instance.CreateSimpleNotification(`${successCount} credential(s) deleted${failCount > 0 ? `, ${failCount} failed` : ''}`, failCount > 0 ? 'warning' : 'success', 3000);
920
+ }
921
+ else {
922
+ MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credentials', 'error', 3000);
923
+ }
924
+ }
925
+ // === Filtering ===
926
+ onSearchChange(value) {
927
+ this.searchText = value;
928
+ this.applyFilters();
929
+ }
930
+ onTypeFilterChange(typeId) {
931
+ this.selectedTypeFilter = typeId;
932
+ this.applyFilters();
933
+ }
934
+ onStatusFilterChange(status) {
935
+ this.selectedStatusFilter = status;
936
+ this.applyFilters();
937
+ }
938
+ onActiveFilterChange(showActive) {
939
+ this.showActiveOnly = showActive;
940
+ this.applyFilters();
941
+ }
942
+ clearFilters() {
943
+ this.searchText = '';
944
+ this.selectedTypeFilter = '';
945
+ this.selectedStatusFilter = '';
946
+ this.showActiveOnly = false;
947
+ this.applyFilters();
948
+ }
949
+ get hasActiveFilters() {
950
+ return this.searchText !== '' ||
951
+ this.selectedTypeFilter !== '' ||
952
+ this.selectedStatusFilter !== '' ||
953
+ this.showActiveOnly;
954
+ }
955
+ applyFilters() {
956
+ let filtered = [...this.credentials];
957
+ const now = new Date();
958
+ const thirtyDaysFromNow = new Date();
959
+ thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);
960
+ // Filter by active status
961
+ if (this.showActiveOnly) {
962
+ filtered = filtered.filter(c => c.IsActive);
963
+ }
964
+ // Filter by status
965
+ if (this.selectedStatusFilter) {
966
+ filtered = filtered.filter(c => {
967
+ const statusClass = this.getStatusClass(c);
968
+ switch (this.selectedStatusFilter) {
969
+ case 'active': return statusClass === 'active';
970
+ case 'inactive': return statusClass === 'inactive';
971
+ case 'expired': return statusClass === 'expired';
972
+ case 'expiring': return statusClass === 'expiring';
973
+ default: return true;
974
+ }
975
+ });
976
+ }
977
+ // Filter by type
978
+ if (this.selectedTypeFilter) {
979
+ filtered = filtered.filter(c => c.CredentialTypeID === this.selectedTypeFilter);
980
+ }
981
+ // Filter by search text
982
+ if (this.searchText.trim()) {
983
+ const search = this.searchText.toLowerCase().trim();
984
+ filtered = filtered.filter(c => c.Name.toLowerCase().includes(search) ||
985
+ (c.Description && c.Description.toLowerCase().includes(search)) ||
986
+ (c.CredentialType && c.CredentialType.toLowerCase().includes(search)));
987
+ }
988
+ this.filteredCredentials = filtered;
989
+ this.updateAllSelectedState();
990
+ this.cdr.markForCheck();
991
+ }
992
+ // === View Mode ===
993
+ setViewMode(mode) {
994
+ this.viewMode = mode;
995
+ this.cdr.markForCheck();
996
+ }
997
+ // === Helpers ===
998
+ getTypeById(typeId) {
999
+ return this.types.find(t => t.ID === typeId);
1000
+ }
1001
+ getTypesByCategory() {
1002
+ const grouped = new Map();
1003
+ for (const type of this.types) {
1004
+ const category = type.Category;
1005
+ if (!grouped.has(category)) {
1006
+ grouped.set(category, []);
1007
+ }
1008
+ grouped.get(category).push(type);
1009
+ }
1010
+ return grouped;
1011
+ }
1012
+ getStatusClass(credential) {
1013
+ if (!credential.IsActive) {
1014
+ return 'inactive';
1015
+ }
1016
+ if (credential.ExpiresAt) {
1017
+ const expiresAt = new Date(credential.ExpiresAt);
1018
+ const now = new Date();
1019
+ const thirtyDays = 30 * 24 * 60 * 60 * 1000;
1020
+ if (expiresAt < now) {
1021
+ return 'expired';
1022
+ }
1023
+ if (expiresAt.getTime() - now.getTime() < thirtyDays) {
1024
+ return 'expiring';
1025
+ }
1026
+ }
1027
+ return 'active';
1028
+ }
1029
+ getStatusLabel(credential) {
1030
+ const statusClass = this.getStatusClass(credential);
1031
+ const labels = {
1032
+ 'active': 'Active',
1033
+ 'inactive': 'Inactive',
1034
+ 'expired': 'Expired',
1035
+ 'expiring': 'Expiring Soon'
1036
+ };
1037
+ return labels[statusClass] || 'Unknown';
1038
+ }
1039
+ getStatusIcon(credential) {
1040
+ const statusClass = this.getStatusClass(credential);
1041
+ const icons = {
1042
+ 'active': 'fa-solid fa-check-circle',
1043
+ 'inactive': 'fa-solid fa-minus-circle',
1044
+ 'expired': 'fa-solid fa-times-circle',
1045
+ 'expiring': 'fa-solid fa-clock'
1046
+ };
1047
+ return icons[statusClass] || 'fa-solid fa-circle';
1048
+ }
1049
+ formatDate(date) {
1050
+ if (!date)
1051
+ return 'Never';
1052
+ return new Date(date).toLocaleDateString('en-US', {
1053
+ month: 'short',
1054
+ day: 'numeric',
1055
+ year: 'numeric'
1056
+ });
1057
+ }
1058
+ formatDateTime(date) {
1059
+ if (!date)
1060
+ return 'Never';
1061
+ return new Date(date).toLocaleDateString('en-US', {
1062
+ month: 'short',
1063
+ day: 'numeric',
1064
+ year: 'numeric',
1065
+ hour: '2-digit',
1066
+ minute: '2-digit'
1067
+ });
1068
+ }
1069
+ getTimeAgo(date) {
1070
+ if (!date)
1071
+ return 'Never';
1072
+ const now = new Date();
1073
+ const then = new Date(date);
1074
+ const diffMs = now.getTime() - then.getTime();
1075
+ const diffMins = Math.floor(diffMs / 60000);
1076
+ const diffHours = Math.floor(diffMs / 3600000);
1077
+ const diffDays = Math.floor(diffMs / 86400000);
1078
+ if (diffMins < 1)
1079
+ return 'Just now';
1080
+ if (diffMins < 60)
1081
+ return `${diffMins}m ago`;
1082
+ if (diffHours < 24)
1083
+ return `${diffHours}h ago`;
1084
+ if (diffDays < 30)
1085
+ return `${diffDays}d ago`;
1086
+ return this.formatDate(date);
1087
+ }
1088
+ getTypeIcon(credential) {
1089
+ const type = this.getTypeById(credential.CredentialTypeID);
1090
+ if (!type)
1091
+ return 'fa-solid fa-key';
1092
+ const iconMap = {
1093
+ 'AI': 'fa-solid fa-brain',
1094
+ 'Communication': 'fa-solid fa-envelope',
1095
+ 'Storage': 'fa-solid fa-cloud',
1096
+ 'Database': 'fa-solid fa-database',
1097
+ 'Authentication': 'fa-solid fa-shield-halved',
1098
+ 'Integration': 'fa-solid fa-plug'
1099
+ };
1100
+ return iconMap[type.Category] || 'fa-solid fa-key';
1101
+ }
1102
+ refresh() {
1103
+ this.selectedCredentials.clear();
1104
+ this.loadData();
1105
+ }
1106
+ // === Stats ===
1107
+ get activeCount() {
1108
+ return this.credentials.filter(c => c.IsActive).length;
1109
+ }
1110
+ getActiveCount() {
1111
+ return this.activeCount;
1112
+ }
1113
+ get expiringCount() {
1114
+ const now = new Date();
1115
+ const thirtyDaysFromNow = new Date();
1116
+ thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);
1117
+ return this.credentials.filter(c => c.ExpiresAt &&
1118
+ new Date(c.ExpiresAt) >= now &&
1119
+ new Date(c.ExpiresAt) <= thirtyDaysFromNow &&
1120
+ c.IsActive).length;
1121
+ }
1122
+ getExpiringSoonCount() {
1123
+ return this.expiringCount;
1124
+ }
1125
+ get expiredCount() {
1126
+ const now = new Date();
1127
+ return this.credentials.filter(c => c.ExpiresAt && new Date(c.ExpiresAt) < now).length;
1128
+ }
1129
+ getExpiredCount() {
1130
+ return this.expiredCount;
1131
+ }
1132
+ // === Status Helpers ===
1133
+ isExpired(credential) {
1134
+ if (!credential.ExpiresAt)
1135
+ return false;
1136
+ return new Date(credential.ExpiresAt) < new Date();
1137
+ }
1138
+ isExpiringSoon(credential) {
1139
+ if (!credential.ExpiresAt)
1140
+ return false;
1141
+ const expiresAt = new Date(credential.ExpiresAt);
1142
+ const now = new Date();
1143
+ const thirtyDaysFromNow = new Date();
1144
+ thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);
1145
+ return expiresAt >= now && expiresAt <= thirtyDaysFromNow;
1146
+ }
1147
+ // === Bulk Operations ===
1148
+ async bulkToggleActive(active) {
1149
+ if (!this.UserCanUpdate || this.selectedCredentials.size === 0)
1150
+ return;
1151
+ let successCount = 0;
1152
+ let failCount = 0;
1153
+ for (const credId of this.selectedCredentials) {
1154
+ const credential = this.credentials.find(c => c.ID === credId);
1155
+ if (credential && credential.IsActive !== active) {
1156
+ try {
1157
+ credential.IsActive = active;
1158
+ const success = await credential.Save();
1159
+ if (success) {
1160
+ successCount++;
1161
+ }
1162
+ else {
1163
+ credential.IsActive = !active;
1164
+ failCount++;
1165
+ }
1166
+ }
1167
+ catch {
1168
+ credential.IsActive = !active;
1169
+ failCount++;
1170
+ }
1171
+ }
1172
+ }
1173
+ this.clearSelection();
1174
+ this.applyFilters();
1175
+ const action = active ? 'activated' : 'deactivated';
1176
+ if (successCount > 0) {
1177
+ MJNotificationService.Instance.CreateSimpleNotification(`${successCount} credential(s) ${action}${failCount > 0 ? `, ${failCount} failed` : ''}`, failCount > 0 ? 'warning' : 'success', 3000);
1178
+ }
1179
+ else if (failCount > 0) {
1180
+ MJNotificationService.Instance.CreateSimpleNotification(`Failed to ${action.slice(0, -1)} credentials`, 'error', 3000);
1181
+ }
1182
+ }
1183
+ async bulkDelete() {
1184
+ if (!this.UserCanDelete || this.selectedCredentials.size === 0)
1185
+ return;
1186
+ const count = this.selectedCredentials.size;
1187
+ const confirmed = confirm(`Are you sure you want to delete ${count} credential(s)? This action cannot be undone.`);
1188
+ if (!confirmed)
1189
+ return;
1190
+ let successCount = 0;
1191
+ let failCount = 0;
1192
+ for (const credId of this.selectedCredentials) {
1193
+ const credential = this.credentials.find(c => c.ID === credId);
1194
+ if (credential) {
1195
+ try {
1196
+ const success = await credential.Delete();
1197
+ if (success) {
1198
+ successCount++;
1199
+ this.credentials = this.credentials.filter(c => c.ID !== credId);
1200
+ }
1201
+ else {
1202
+ failCount++;
1203
+ }
1204
+ }
1205
+ catch {
1206
+ failCount++;
1207
+ }
1208
+ }
1209
+ }
1210
+ this.clearSelection();
1211
+ this.applyFilters();
1212
+ if (successCount > 0) {
1213
+ MJNotificationService.Instance.CreateSimpleNotification(`${successCount} credential(s) deleted${failCount > 0 ? `, ${failCount} failed` : ''}`, failCount > 0 ? 'warning' : 'success', 3000);
1214
+ }
1215
+ else {
1216
+ MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credentials', 'error', 3000);
1217
+ }
1218
+ }
1219
+ static ɵfac = function CredentialsListResourceComponent_Factory(t) { return new (t || CredentialsListResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
1220
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsListResourceComponent, selectors: [["mj-credentials-list-resource"]], viewQuery: function CredentialsListResourceComponent_Query(rf, ctx) { if (rf & 1) {
1221
+ i0.ɵɵviewQuery(_c0, 5);
1222
+ } if (rf & 2) {
1223
+ let _t;
1224
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.editPanel = _t.first);
1225
+ } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 3, consts: [["editPanel", ""], [1, "list-container"], ["text", "Loading credentials...", 4, "ngIf"], [4, "ngIf"], [3, "saved", "deleted", "credentialTypes"], ["text", "Loading credentials..."], [1, "list-header"], [1, "header-info"], [1, "list-title"], [1, "header-stats"], [1, "stat-item"], [1, "fa-solid", "fa-key"], [1, "stat-item", "active"], [1, "fa-solid", "fa-check-circle"], ["class", "stat-item warning", 4, "ngIf"], ["class", "stat-item danger", 4, "ngIf"], [1, "header-actions"], ["class", "btn-primary", 3, "click", 4, "ngIf"], [1, "toolbar"], [1, "toolbar-left"], [1, "search-container"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search credentials...", 3, "input", "value"], ["class", "search-clear", 3, "click", 4, "ngIf"], [1, "filter-select", 3, "change", "value"], ["value", ""], [3, "value", 4, "ngFor", "ngForOf"], ["value", "active"], ["value", "inactive"], ["value", "expiring"], ["value", "expired"], [1, "toolbar-right"], [1, "results-info"], [1, "view-toggle"], ["title", "Grid View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-grid-2"], ["title", "List View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-refresh"], ["class", "bulk-actions", 4, "ngIf"], ["class", "credentials-grid", 4, "ngIf"], ["class", "credentials-table-container", 4, "ngIf"], ["class", "empty-state", 4, "ngIf"], [1, "stat-item", "warning"], [1, "fa-solid", "fa-clock"], [1, "stat-item", "danger"], [1, "fa-solid", "fa-exclamation-circle"], [1, "btn-primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "search-clear", 3, "click"], [1, "fa-solid", "fa-times"], [3, "value"], [1, "bulk-actions"], [1, "bulk-info"], [1, "bulk-count"], [1, "btn-link", 3, "click"], [1, "bulk-buttons"], ["class", "btn-bulk", 3, "click", 4, "ngIf"], ["class", "btn-bulk danger", 3, "click", 4, "ngIf"], [1, "btn-bulk", 3, "click"], [1, "fa-solid", "fa-toggle-on"], [1, "fa-solid", "fa-toggle-off"], [1, "btn-bulk", "danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "credentials-grid"], ["class", "credential-card", 3, "selected", "expired", "expiring", 4, "ngFor", "ngForOf"], [1, "credential-card"], ["class", "card-select", 4, "ngIf"], [1, "card-header"], [1, "card-icon", 3, "ngClass"], [1, "card-title"], [1, "credential-name"], [1, "credential-type"], [1, "card-actions"], ["class", "action-btn", 3, "title", "click", 4, "ngIf"], ["class", "action-btn", "title", "Edit", 3, "click", 4, "ngIf"], ["class", "action-btn danger", "title", "Delete", 3, "click", 4, "ngIf"], [1, "card-body", 3, "click"], [1, "status-badge", 3, "ngClass"], ["class", "credential-description", 4, "ngIf"], [1, "credential-meta"], ["class", "meta-item", 4, "ngIf"], ["class", "meta-item", 3, "warning", "danger", 4, "ngIf"], [1, "card-footer"], ["class", "category-tag", 4, "ngIf"], [1, "created-info"], [1, "card-select"], ["type", "checkbox", 3, "change", "checked"], [1, "action-btn", 3, "click", "title"], ["title", "Edit", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-pen"], ["title", "Delete", 1, "action-btn", "danger", 3, "click"], [1, "credential-description"], [1, "meta-item"], [1, "fa-solid", "fa-star"], [1, "fa-solid", "fa-calendar"], [1, "category-tag"], [1, "fa-solid", "fa-folder"], [1, "credentials-table-container"], [1, "credentials-table"], ["class", "col-select", 4, "ngIf"], [1, "col-name"], [1, "col-type"], [1, "col-category"], [1, "col-status"], [1, "col-expires"], [1, "col-used"], [1, "col-actions"], [3, "selected", "expired", 4, "ngFor", "ngForOf"], [1, "col-select"], [1, "col-name", 3, "click"], [1, "name-cell"], [3, "ngClass"], [1, "name-info"], ["class", "credential-desc", 4, "ngIf"], ["class", "default-badge", 4, "ngIf"], ["class", "category-pill", 4, "ngIf"], [1, "status-pill", 3, "ngClass"], [1, "table-actions"], ["class", "table-action-btn", 3, "title", "click", 4, "ngIf"], ["class", "table-action-btn", "title", "Edit", 3, "click", 4, "ngIf"], ["class", "table-action-btn danger", "title", "Delete", 3, "click", 4, "ngIf"], [1, "credential-desc"], [1, "default-badge"], [1, "category-pill"], [1, "table-action-btn", 3, "click", "title"], ["title", "Edit", 1, "table-action-btn", 3, "click"], ["title", "Delete", 1, "table-action-btn", "danger", 3, "click"], [1, "empty-state"], [1, "empty-icon"]], template: function CredentialsListResourceComponent_Template(rf, ctx) { if (rf & 1) {
1226
+ const _r1 = i0.ɵɵgetCurrentView();
1227
+ i0.ɵɵelementStart(0, "div", 1);
1228
+ i0.ɵɵtemplate(1, CredentialsListResourceComponent_mj_loading_1_Template, 1, 0, "mj-loading", 2)(2, CredentialsListResourceComponent_ng_container_2_Template, 51, 20, "ng-container", 3);
1229
+ i0.ɵɵelementStart(3, "mj-credential-edit-panel", 4, 0);
1230
+ i0.ɵɵlistener("saved", function CredentialsListResourceComponent_Template_mj_credential_edit_panel_saved_3_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCredentialSaved($event)); })("deleted", function CredentialsListResourceComponent_Template_mj_credential_edit_panel_deleted_3_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCredentialDeleted($event)); });
1231
+ i0.ɵɵelementEnd()();
1232
+ } if (rf & 2) {
1233
+ i0.ɵɵadvance();
1234
+ i0.ɵɵproperty("ngIf", ctx.isLoading);
1235
+ i0.ɵɵadvance();
1236
+ i0.ɵɵproperty("ngIf", !ctx.isLoading);
1237
+ i0.ɵɵadvance();
1238
+ i0.ɵɵproperty("credentialTypes", ctx.types);
1239
+ } }, dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i3.LoadingComponent, i4.CredentialEditPanelComponent], styles: [".list-container[_ngcontent-%COMP%] {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--page-background, #f8fafc);\n}\n\n\n\n.list-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n flex-wrap: wrap;\n gap: 16px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.list-title[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.header-stats[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n.stat-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.stat-item.active[_ngcontent-%COMP%] {\n color: #10b981;\n}\n\n.stat-item.warning[_ngcontent-%COMP%] {\n color: #f59e0b;\n}\n\n.stat-item.danger[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: white;\n border: none;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3);\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 16px rgba(99, 102, 241, 0.4);\n}\n\n.btn-primary[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n background: var(--card-background, #ffffff);\n padding: 16px;\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n\n.toolbar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n flex: 1;\n}\n\n.toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.search-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n background: var(--input-background, #f9fafb);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n padding: 8px 12px;\n min-width: 280px;\n position: relative;\n}\n\n.search-container[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--text-secondary, #6b7280);\n margin-right: 8px;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n outline: none;\n flex: 1;\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n}\n\n.search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--border-color, #e5e7eb);\n border: none;\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n}\n\n.search-clear[_ngcontent-%COMP%]:hover {\n background: var(--text-secondary, #6b7280);\n color: white;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--input-background, #ffffff);\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n cursor: pointer;\n min-width: 140px;\n}\n\n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n}\n\n.results-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n white-space: nowrap;\n}\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--input-background, #f3f4f6);\n border-radius: 8px;\n padding: 4px;\n}\n\n.view-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.view-btn[_ngcontent-%COMP%]:hover {\n color: var(--accent-color, #6366f1);\n}\n\n.view-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: var(--accent-color, #6366f1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--button-background, #ffffff);\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--button-hover, #f3f4f6);\n color: var(--accent-color, #6366f1);\n}\n\n\n\n.bulk-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n border-radius: 10px;\n margin-bottom: 16px;\n color: white;\n}\n\n.bulk-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.bulk-count[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: rgba(255, 255, 255, 0.8);\n font-size: 13px;\n cursor: pointer;\n text-decoration: underline;\n padding: 0;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n color: white;\n}\n\n.bulk-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-bulk[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: rgba(255, 255, 255, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.3);\n border-radius: 6px;\n color: white;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-bulk[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.3);\n}\n\n.btn-bulk.danger[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.3);\n border-color: rgba(239, 68, 68, 0.5);\n}\n\n.btn-bulk.danger[_ngcontent-%COMP%]:hover {\n background: rgba(239, 68, 68, 0.5);\n}\n\n\n\n.credentials-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));\n gap: 20px;\n}\n\n.credential-card[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n transition: all 0.2s ease;\n position: relative;\n border: 2px solid transparent;\n}\n\n.credential-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n}\n\n.credential-card.selected[_ngcontent-%COMP%] {\n border-color: var(--accent-color, #6366f1);\n background: linear-gradient(to bottom, rgba(99, 102, 241, 0.03), white);\n}\n\n.credential-card.expired[_ngcontent-%COMP%] {\n border-color: rgba(239, 68, 68, 0.3);\n}\n\n.credential-card.expiring[_ngcontent-%COMP%] {\n border-color: rgba(245, 158, 11, 0.3);\n}\n\n.card-select[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 10;\n}\n\n.card-select[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--accent-color, #6366f1);\n}\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 16px;\n padding-left: 40px;\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.card-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n margin-right: 12px;\n flex-shrink: 0;\n}\n\n.card-icon.active[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n color: white;\n}\n\n.card-icon.inactive[_ngcontent-%COMP%] {\n background: var(--icon-inactive, #e5e7eb);\n color: var(--text-secondary, #6b7280);\n}\n\n.card-icon.expired[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n color: white;\n}\n\n.card-icon.expiring[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n color: white;\n}\n\n.card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.card-title[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.credential-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n color: var(--text-primary, #1f2937);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.credential-type[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n margin-top: 2px;\n}\n\n.card-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: 8px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.credential-card[_ngcontent-%COMP%]:hover .card-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--input-background, #f3f4f6);\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: var(--accent-color, #6366f1);\n color: white;\n}\n\n.action-btn.danger[_ngcontent-%COMP%]:hover {\n background: #ef4444;\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 16px;\n padding-left: 40px;\n cursor: pointer;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n margin-bottom: 12px;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.status-badge.active[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.inactive[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-badge.expired[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-badge.expiring[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.credential-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n line-height: 1.5;\n margin: 0 0 12px 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.credential-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.meta-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--accent-color, #6366f1);\n}\n\n.meta-item.warning[_ngcontent-%COMP%] {\n color: #f59e0b;\n}\n\n.meta-item.warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f59e0b;\n}\n\n.meta-item.danger[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.meta-item.danger[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.card-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n padding-left: 40px;\n background: var(--footer-background, #f9fafb);\n border-top: 1px solid var(--border-color, #f3f4f6);\n}\n\n.category-tag[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: var(--tag-background, #e0e7ff);\n color: var(--accent-color, #6366f1);\n border-radius: 6px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.category-tag[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.created-info[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--text-tertiary, #9ca3af);\n}\n\n\n\n.credentials-table-container[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.credentials-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.credentials-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--header-background, #f9fafb);\n}\n\n.credentials-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 12px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--text-secondary, #6b7280);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n}\n\n.credentials-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.credentials-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.2s ease;\n}\n\n.credentials-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--row-hover, #f9fafb);\n}\n\n.credentials-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.selected[_ngcontent-%COMP%] {\n background: rgba(99, 102, 241, 0.05);\n}\n\n.credentials-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.expired[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.03);\n}\n\n.col-select[_ngcontent-%COMP%] {\n width: 40px;\n}\n\n.col-select[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n accent-color: var(--accent-color, #6366f1);\n}\n\n.col-name[_ngcontent-%COMP%] {\n min-width: 240px;\n cursor: pointer;\n}\n\n.name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.name-cell[_ngcontent-%COMP%] i.active[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.name-cell[_ngcontent-%COMP%] i.inactive[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.name-cell[_ngcontent-%COMP%] i.expired[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.name-cell[_ngcontent-%COMP%] i.expiring[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.name-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n\n.name-info[_ngcontent-%COMP%] .credential-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n}\n\n.name-info[_ngcontent-%COMP%] .credential-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--text-secondary, #9ca3af);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.default-badge[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.col-type[_ngcontent-%COMP%], \n.col-category[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n.category-pill[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 10px;\n background: var(--tag-background, #e0e7ff);\n color: var(--accent-color, #6366f1);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.col-status[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n.status-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-pill.active[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-pill.inactive[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-pill.expired[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-pill.expiring[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #d97706;\n}\n\n.col-expires[_ngcontent-%COMP%], \n.col-used[_ngcontent-%COMP%] {\n white-space: nowrap;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n.col-expires.warning[_ngcontent-%COMP%] {\n color: #f59e0b;\n font-weight: 500;\n}\n\n.col-expires.danger[_ngcontent-%COMP%] {\n color: #ef4444;\n font-weight: 500;\n}\n\n.col-actions[_ngcontent-%COMP%] {\n width: 120px;\n}\n\n.table-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.credentials-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover .table-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.table-action-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--input-background, #f3f4f6);\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 13px;\n}\n\n.table-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--accent-color, #6366f1);\n color: white;\n}\n\n.table-action-btn.danger[_ngcontent-%COMP%]:hover {\n background: #ef4444;\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: 80px 24px;\n text-align: center;\n background: var(--card-background, #ffffff);\n border-radius: 16px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #e0e7ff 0%, #c7d2fe 100%);\n border-radius: 20px;\n margin-bottom: 24px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n color: var(--accent-color, #6366f1);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0 0 24px 0;\n max-width: 400px;\n line-height: 1.5;\n}\n\n.empty-state[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%] {\n color: var(--accent-color, #6366f1);\n text-decoration: underline;\n cursor: pointer;\n background: none;\n border: none;\n font-size: 14px;\n padding: 0;\n}\n\n.empty-state[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n.empty-state[_ngcontent-%COMP%] .btn-primary[_ngcontent-%COMP%] {\n margin-top: 0;\n}\n\n\n\n@media (max-width: 768px) {\n .list-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .list-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .list-title[_ngcontent-%COMP%] {\n font-size: 20px;\n }\n\n .header-stats[_ngcontent-%COMP%] {\n gap: 12px;\n }\n\n .stat-item[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .header-actions[_ngcontent-%COMP%] .btn-primary[_ngcontent-%COMP%] {\n flex: 1;\n justify-content: center;\n }\n\n .toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n padding: 12px;\n }\n\n .toolbar-left[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .search-container[_ngcontent-%COMP%] {\n min-width: 100%;\n }\n\n .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .toolbar-right[_ngcontent-%COMP%] {\n justify-content: space-between;\n }\n\n .credentials-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n \n\n .card-actions[_ngcontent-%COMP%] {\n opacity: 1;\n }\n\n .card-header[_ngcontent-%COMP%] {\n padding: 14px;\n padding-left: 36px;\n }\n\n .card-body[_ngcontent-%COMP%] {\n padding: 14px;\n padding-left: 36px;\n }\n\n .card-footer[_ngcontent-%COMP%] {\n padding: 10px 14px;\n padding-left: 36px;\n }\n\n .card-icon[_ngcontent-%COMP%] {\n width: 38px;\n height: 38px;\n }\n\n .card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .bulk-actions[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n text-align: center;\n }\n\n .bulk-info[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 8px;\n }\n\n .bulk-buttons[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .credentials-table-container[_ngcontent-%COMP%] {\n overflow-x: auto;\n }\n\n .credentials-table[_ngcontent-%COMP%] {\n min-width: 800px;\n }\n\n .empty-state[_ngcontent-%COMP%] {\n padding: 48px 20px;\n }\n\n .empty-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n }\n\n .empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n }\n\n .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n}\n\n@media (max-width: 480px) {\n .list-container[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .list-title[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n\n .header-stats[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n }\n\n .btn-primary[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 13px;\n }\n\n .btn-primary[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: none;\n }\n\n .btn-primary[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin: 0;\n }\n\n .toolbar[_ngcontent-%COMP%] {\n padding: 10px;\n }\n\n .view-toggle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .results-info[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .credential-card[_ngcontent-%COMP%] {\n border-radius: 10px;\n }\n\n .card-select[_ngcontent-%COMP%] {\n top: 10px;\n left: 10px;\n }\n\n .card-header[_ngcontent-%COMP%] {\n padding: 12px;\n padding-left: 32px;\n }\n\n .card-body[_ngcontent-%COMP%] {\n padding: 12px;\n padding-left: 32px;\n }\n\n .card-footer[_ngcontent-%COMP%] {\n padding: 10px 12px;\n padding-left: 32px;\n }\n\n .card-icon[_ngcontent-%COMP%] {\n width: 34px;\n height: 34px;\n margin-right: 10px;\n }\n\n .credential-name[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .credential-type[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .action-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n }\n\n .status-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 3px 8px;\n }\n\n .credential-meta[_ngcontent-%COMP%] {\n gap: 8px;\n }\n\n .meta-item[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .category-tag[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 3px 8px;\n }\n\n .created-info[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .empty-state[_ngcontent-%COMP%] {\n padding: 32px 16px;\n }\n\n .empty-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n margin-bottom: 16px;\n }\n\n .empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n }\n\n .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n}"], changeDetection: 0 });
1240
+ };
1241
+ CredentialsListResourceComponent = __decorate([
1242
+ RegisterClass(BaseResourceComponent, 'CredentialsListResource')
1243
+ ], CredentialsListResourceComponent);
1244
+ export { CredentialsListResourceComponent };
1245
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialsListResourceComponent, [{
1246
+ type: Component,
1247
+ args: [{ selector: 'mj-credentials-list-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"list-container\">\n <mj-loading *ngIf=\"isLoading\" text=\"Loading credentials...\"></mj-loading>\n\n <ng-container *ngIf=\"!isLoading\">\n <!-- Header with Stats -->\n <div class=\"list-header\">\n <div class=\"header-info\">\n <h2 class=\"list-title\">Credentials</h2>\n <div class=\"header-stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-key\"></i>\n {{credentials.length}} total\n </span>\n <span class=\"stat-item active\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{getActiveCount()}} active\n </span>\n <span class=\"stat-item warning\" *ngIf=\"getExpiringSoonCount() > 0\">\n <i class=\"fa-solid fa-clock\"></i>\n {{getExpiringSoonCount()}} expiring\n </span>\n <span class=\"stat-item danger\" *ngIf=\"getExpiredCount() > 0\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n {{getExpiredCount()}} expired\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-primary\" *ngIf=\"UserCanCreate\" (click)=\"createNewCredential()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Credential</span>\n </button>\n </div>\n </div>\n\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search credentials...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n <button class=\"search-clear\" *ngIf=\"searchText\" (click)=\"onSearchChange('')\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <select\n class=\"filter-select\"\n [value]=\"selectedTypeFilter\"\n (change)=\"onTypeFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Types</option>\n <option *ngFor=\"let type of types\" [value]=\"type.ID\">{{type.Name}}</option>\n </select>\n\n <select\n class=\"filter-select\"\n [value]=\"selectedStatusFilter\"\n (change)=\"onStatusFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"expiring\">Expiring Soon</option>\n <option value=\"expired\">Expired</option>\n </select>\n </div>\n\n <div class=\"toolbar-right\">\n <div class=\"results-info\">\n {{filteredCredentials.length}} of {{credentials.length}}\n </div>\n\n <div class=\"view-toggle\">\n <button\n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\"\n >\n <i class=\"fa-solid fa-grid-2\"></i>\n </button>\n <button\n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\"\n >\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Bulk Actions Bar -->\n <div class=\"bulk-actions\" *ngIf=\"selectedCredentials.size > 0\">\n <div class=\"bulk-info\">\n <span class=\"bulk-count\">{{selectedCredentials.size}} selected</span>\n <button class=\"btn-link\" (click)=\"clearSelection()\">Clear selection</button>\n </div>\n <div class=\"bulk-buttons\">\n <button class=\"btn-bulk\" *ngIf=\"UserCanUpdate\" (click)=\"bulkToggleActive(true)\">\n <i class=\"fa-solid fa-toggle-on\"></i>\n Activate\n </button>\n <button class=\"btn-bulk\" *ngIf=\"UserCanUpdate\" (click)=\"bulkToggleActive(false)\">\n <i class=\"fa-solid fa-toggle-off\"></i>\n Deactivate\n </button>\n <button class=\"btn-bulk danger\" *ngIf=\"UserCanDelete\" (click)=\"bulkDelete()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n </div>\n </div>\n\n <!-- Grid View -->\n <div class=\"credentials-grid\" *ngIf=\"viewMode === 'grid' && filteredCredentials.length > 0\">\n <div\n class=\"credential-card\"\n *ngFor=\"let credential of filteredCredentials\"\n [class.selected]=\"selectedCredentials.has(credential.ID)\"\n [class.expired]=\"isExpired(credential)\"\n [class.expiring]=\"isExpiringSoon(credential)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"card-select\" *ngIf=\"UserCanUpdate || UserCanDelete\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedCredentials.has(credential.ID)\"\n (change)=\"toggleSelection(credential)\"\n />\n </div>\n\n <div class=\"card-header\">\n <div class=\"card-icon\" [ngClass]=\"getStatusClass(credential)\">\n <i [class]=\"credential.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"card-title\">\n <div class=\"credential-name\">{{credential.Name}}</div>\n <div class=\"credential-type\">{{credential.CredentialType || 'Unknown Type'}}</div>\n </div>\n <div class=\"card-actions\">\n <button\n class=\"action-btn\"\n *ngIf=\"UserCanUpdate\"\n (click)=\"toggleCredentialActive(credential, $event)\"\n [title]=\"credential.IsActive ? 'Deactivate' : 'Activate'\"\n >\n <i [class]=\"credential.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\"></i>\n </button>\n <button\n class=\"action-btn\"\n *ngIf=\"UserCanUpdate\"\n (click)=\"editCredential(credential, $event)\"\n title=\"Edit\"\n >\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button\n class=\"action-btn danger\"\n *ngIf=\"UserCanDelete\"\n (click)=\"deleteCredential(credential, $event)\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"card-body\" (click)=\"editCredential(credential)\">\n <div class=\"status-badge\" [ngClass]=\"getStatusClass(credential)\">\n <i [class]=\"getStatusIcon(credential)\"></i>\n {{getStatusLabel(credential)}}\n </div>\n\n <p class=\"credential-description\" *ngIf=\"credential.Description\">\n {{credential.Description}}\n </p>\n\n <div class=\"credential-meta\">\n <div class=\"meta-item\" *ngIf=\"credential.IsDefault\">\n <i class=\"fa-solid fa-star\"></i>\n <span>Default</span>\n </div>\n <div class=\"meta-item\" *ngIf=\"credential.ExpiresAt\" [class.warning]=\"isExpiringSoon(credential)\" [class.danger]=\"isExpired(credential)\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{isExpired(credential) ? 'Expired' : 'Expires'}}: {{formatDate(credential.ExpiresAt)}}</span>\n </div>\n <div class=\"meta-item\" *ngIf=\"credential.LastUsedAt\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Last used: {{formatDate(credential.LastUsedAt)}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"card-footer\">\n <div class=\"category-tag\" *ngIf=\"credential.Category\">\n <i class=\"fa-solid fa-folder\"></i>\n {{credential.Category}}\n </div>\n <div class=\"created-info\">\n Created {{formatDate(credential.__mj_CreatedAt)}}\n </div>\n </div>\n </div>\n </div>\n\n <!-- List View -->\n <div class=\"credentials-table-container\" *ngIf=\"viewMode === 'list' && filteredCredentials.length > 0\">\n <table class=\"credentials-table\">\n <thead>\n <tr>\n <th class=\"col-select\" *ngIf=\"UserCanUpdate || UserCanDelete\">\n <input\n type=\"checkbox\"\n [checked]=\"isAllSelected()\"\n (change)=\"toggleSelectAll()\"\n />\n </th>\n <th class=\"col-name\">Name</th>\n <th class=\"col-type\">Type</th>\n <th class=\"col-category\">Category</th>\n <th class=\"col-status\">Status</th>\n <th class=\"col-expires\">Expires</th>\n <th class=\"col-used\">Last Used</th>\n <th class=\"col-actions\">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let credential of filteredCredentials\"\n [class.selected]=\"selectedCredentials.has(credential.ID)\"\n [class.expired]=\"isExpired(credential)\"\n >\n <td class=\"col-select\" *ngIf=\"UserCanUpdate || UserCanDelete\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedCredentials.has(credential.ID)\"\n (change)=\"toggleSelection(credential)\"\n />\n </td>\n <td class=\"col-name\" (click)=\"editCredential(credential)\">\n <div class=\"name-cell\">\n <i [class]=\"credential.IconClass || 'fa-solid fa-key'\" [ngClass]=\"getStatusClass(credential)\"></i>\n <div class=\"name-info\">\n <span class=\"credential-name\">{{credential.Name}}</span>\n <span class=\"credential-desc\" *ngIf=\"credential.Description\">{{credential.Description}}</span>\n </div>\n <span class=\"default-badge\" *ngIf=\"credential.IsDefault\">Default</span>\n </div>\n </td>\n <td class=\"col-type\">{{credential.CredentialType || '-'}}</td>\n <td class=\"col-category\">\n <span class=\"category-pill\" *ngIf=\"credential.Category\">{{credential.Category}}</span>\n <span *ngIf=\"!credential.Category\">-</span>\n </td>\n <td class=\"col-status\">\n <span class=\"status-pill\" [ngClass]=\"getStatusClass(credential)\">\n {{getStatusLabel(credential)}}\n </span>\n </td>\n <td class=\"col-expires\" [class.warning]=\"isExpiringSoon(credential)\" [class.danger]=\"isExpired(credential)\">\n {{credential.ExpiresAt ? formatDate(credential.ExpiresAt) : 'Never'}}\n </td>\n <td class=\"col-used\">\n {{credential.LastUsedAt ? formatDate(credential.LastUsedAt) : 'Never'}}\n </td>\n <td class=\"col-actions\">\n <div class=\"table-actions\">\n <button\n class=\"table-action-btn\"\n *ngIf=\"UserCanUpdate\"\n (click)=\"toggleCredentialActive(credential, $event)\"\n [title]=\"credential.IsActive ? 'Deactivate' : 'Activate'\"\n >\n <i [class]=\"credential.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\"></i>\n </button>\n <button\n class=\"table-action-btn\"\n *ngIf=\"UserCanUpdate\"\n (click)=\"editCredential(credential, $event)\"\n title=\"Edit\"\n >\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button\n class=\"table-action-btn danger\"\n *ngIf=\"UserCanDelete\"\n (click)=\"deleteCredential(credential, $event)\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Empty State -->\n <div class=\"empty-state\" *ngIf=\"filteredCredentials.length === 0\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <h3>No Credentials Found</h3>\n <p *ngIf=\"searchText || selectedTypeFilter || selectedStatusFilter\">\n No credentials match your current filters.\n <button class=\"btn-link\" (click)=\"clearFilters()\">Clear filters</button>\n </p>\n <p *ngIf=\"!searchText && !selectedTypeFilter && !selectedStatusFilter\">\n Get started by creating your first credential.\n </p>\n <button class=\"btn-primary\" *ngIf=\"UserCanCreate && !searchText && !selectedTypeFilter && !selectedStatusFilter\" (click)=\"createNewCredential()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n </ng-container>\n\n <!-- Edit Panel -->\n <mj-credential-edit-panel\n #editPanel\n [credentialTypes]=\"types\"\n (saved)=\"onCredentialSaved($event)\"\n (deleted)=\"onCredentialDeleted($event)\"\n ></mj-credential-edit-panel>\n</div>\n", styles: [".list-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--page-background, #f8fafc);\n}\n\n/* Header */\n.list-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n flex-wrap: wrap;\n gap: 16px;\n}\n\n.header-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.list-title {\n font-size: 24px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.header-stats {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.stat-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n.stat-item i {\n font-size: 12px;\n}\n\n.stat-item.active {\n color: #10b981;\n}\n\n.stat-item.warning {\n color: #f59e0b;\n}\n\n.stat-item.danger {\n color: #ef4444;\n}\n\n.header-actions {\n display: flex;\n gap: 12px;\n}\n\n.btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: white;\n border: none;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3);\n}\n\n.btn-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 16px rgba(99, 102, 241, 0.4);\n}\n\n.btn-primary i {\n font-size: 13px;\n}\n\n/* Toolbar */\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n background: var(--card-background, #ffffff);\n padding: 16px;\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n\n.toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n flex: 1;\n}\n\n.toolbar-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.search-container {\n display: flex;\n align-items: center;\n background: var(--input-background, #f9fafb);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n padding: 8px 12px;\n min-width: 280px;\n position: relative;\n}\n\n.search-container i {\n color: var(--text-secondary, #6b7280);\n margin-right: 8px;\n}\n\n.search-container input {\n border: none;\n background: transparent;\n outline: none;\n flex: 1;\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n}\n\n.search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--border-color, #e5e7eb);\n border: none;\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n}\n\n.search-clear:hover {\n background: var(--text-secondary, #6b7280);\n color: white;\n}\n\n.filter-select {\n padding: 8px 12px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--input-background, #ffffff);\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n cursor: pointer;\n min-width: 140px;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n}\n\n.results-info {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n white-space: nowrap;\n}\n\n.view-toggle {\n display: flex;\n background: var(--input-background, #f3f4f6);\n border-radius: 8px;\n padding: 4px;\n}\n\n.view-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.view-btn:hover {\n color: var(--accent-color, #6366f1);\n}\n\n.view-btn.active {\n background: white;\n color: var(--accent-color, #6366f1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--button-background, #ffffff);\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon:hover {\n background: var(--button-hover, #f3f4f6);\n color: var(--accent-color, #6366f1);\n}\n\n/* Bulk Actions Bar */\n.bulk-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n border-radius: 10px;\n margin-bottom: 16px;\n color: white;\n}\n\n.bulk-info {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.bulk-count {\n font-weight: 600;\n font-size: 14px;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: rgba(255, 255, 255, 0.8);\n font-size: 13px;\n cursor: pointer;\n text-decoration: underline;\n padding: 0;\n}\n\n.btn-link:hover {\n color: white;\n}\n\n.bulk-buttons {\n display: flex;\n gap: 8px;\n}\n\n.btn-bulk {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: rgba(255, 255, 255, 0.2);\n border: 1px solid rgba(255, 255, 255, 0.3);\n border-radius: 6px;\n color: white;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-bulk:hover {\n background: rgba(255, 255, 255, 0.3);\n}\n\n.btn-bulk.danger {\n background: rgba(239, 68, 68, 0.3);\n border-color: rgba(239, 68, 68, 0.5);\n}\n\n.btn-bulk.danger:hover {\n background: rgba(239, 68, 68, 0.5);\n}\n\n/* Credentials Grid */\n.credentials-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));\n gap: 20px;\n}\n\n.credential-card {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n transition: all 0.2s ease;\n position: relative;\n border: 2px solid transparent;\n}\n\n.credential-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\n}\n\n.credential-card.selected {\n border-color: var(--accent-color, #6366f1);\n background: linear-gradient(to bottom, rgba(99, 102, 241, 0.03), white);\n}\n\n.credential-card.expired {\n border-color: rgba(239, 68, 68, 0.3);\n}\n\n.credential-card.expiring {\n border-color: rgba(245, 158, 11, 0.3);\n}\n\n.card-select {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 10;\n}\n\n.card-select input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--accent-color, #6366f1);\n}\n\n.card-header {\n display: flex;\n align-items: center;\n padding: 16px;\n padding-left: 40px;\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.card-icon {\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n margin-right: 12px;\n flex-shrink: 0;\n}\n\n.card-icon.active {\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n color: white;\n}\n\n.card-icon.inactive {\n background: var(--icon-inactive, #e5e7eb);\n color: var(--text-secondary, #6b7280);\n}\n\n.card-icon.expired {\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n color: white;\n}\n\n.card-icon.expiring {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n color: white;\n}\n\n.card-icon i {\n font-size: 18px;\n}\n\n.card-title {\n flex: 1;\n min-width: 0;\n}\n\n.credential-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--text-primary, #1f2937);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.credential-type {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n margin-top: 2px;\n}\n\n.card-actions {\n display: flex;\n gap: 4px;\n margin-left: 8px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.credential-card:hover .card-actions {\n opacity: 1;\n}\n\n.action-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--input-background, #f3f4f6);\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.action-btn:hover {\n background: var(--accent-color, #6366f1);\n color: white;\n}\n\n.action-btn.danger:hover {\n background: #ef4444;\n}\n\n.card-body {\n padding: 16px;\n padding-left: 40px;\n cursor: pointer;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n margin-bottom: 12px;\n}\n\n.status-badge i {\n font-size: 10px;\n}\n\n.status-badge.active {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.inactive {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-badge.expired {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-badge.expiring {\n background: #fef3c7;\n color: #d97706;\n}\n\n.credential-description {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n line-height: 1.5;\n margin: 0 0 12px 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.credential-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n}\n\n.meta-item i {\n font-size: 11px;\n color: var(--accent-color, #6366f1);\n}\n\n.meta-item.warning {\n color: #f59e0b;\n}\n\n.meta-item.warning i {\n color: #f59e0b;\n}\n\n.meta-item.danger {\n color: #ef4444;\n}\n\n.meta-item.danger i {\n color: #ef4444;\n}\n\n.card-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n padding-left: 40px;\n background: var(--footer-background, #f9fafb);\n border-top: 1px solid var(--border-color, #f3f4f6);\n}\n\n.category-tag {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: var(--tag-background, #e0e7ff);\n color: var(--accent-color, #6366f1);\n border-radius: 6px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.category-tag i {\n font-size: 10px;\n}\n\n.created-info {\n font-size: 11px;\n color: var(--text-tertiary, #9ca3af);\n}\n\n/* Table View */\n.credentials-table-container {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.credentials-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.credentials-table thead {\n background: var(--header-background, #f9fafb);\n}\n\n.credentials-table th {\n padding: 12px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--text-secondary, #6b7280);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n}\n\n.credentials-table td {\n padding: 12px 16px;\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.credentials-table tbody tr {\n transition: background 0.2s ease;\n}\n\n.credentials-table tbody tr:hover {\n background: var(--row-hover, #f9fafb);\n}\n\n.credentials-table tbody tr.selected {\n background: rgba(99, 102, 241, 0.05);\n}\n\n.credentials-table tbody tr.expired {\n background: rgba(239, 68, 68, 0.03);\n}\n\n.col-select {\n width: 40px;\n}\n\n.col-select input[type=\"checkbox\"] {\n width: 16px;\n height: 16px;\n cursor: pointer;\n accent-color: var(--accent-color, #6366f1);\n}\n\n.col-name {\n min-width: 240px;\n cursor: pointer;\n}\n\n.name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.name-cell i {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.name-cell i.active {\n background: #d1fae5;\n color: #059669;\n}\n\n.name-cell i.inactive {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.name-cell i.expired {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.name-cell i.expiring {\n background: #fef3c7;\n color: #d97706;\n}\n\n.name-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1;\n}\n\n.name-info .credential-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n}\n\n.name-info .credential-desc {\n font-size: 12px;\n color: var(--text-secondary, #9ca3af);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.default-badge {\n background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.col-type,\n.col-category {\n white-space: nowrap;\n}\n\n.category-pill {\n display: inline-block;\n padding: 4px 10px;\n background: var(--tag-background, #e0e7ff);\n color: var(--accent-color, #6366f1);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.col-status {\n white-space: nowrap;\n}\n\n.status-pill {\n display: inline-flex;\n align-items: center;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-pill.active {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-pill.inactive {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-pill.expired {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-pill.expiring {\n background: #fef3c7;\n color: #d97706;\n}\n\n.col-expires,\n.col-used {\n white-space: nowrap;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n.col-expires.warning {\n color: #f59e0b;\n font-weight: 500;\n}\n\n.col-expires.danger {\n color: #ef4444;\n font-weight: 500;\n}\n\n.col-actions {\n width: 120px;\n}\n\n.table-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.credentials-table tbody tr:hover .table-actions {\n opacity: 1;\n}\n\n.table-action-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--input-background, #f3f4f6);\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 13px;\n}\n\n.table-action-btn:hover {\n background: var(--accent-color, #6366f1);\n color: white;\n}\n\n.table-action-btn.danger:hover {\n background: #ef4444;\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: 80px 24px;\n text-align: center;\n background: var(--card-background, #ffffff);\n border-radius: 16px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #e0e7ff 0%, #c7d2fe 100%);\n border-radius: 20px;\n margin-bottom: 24px;\n}\n\n.empty-icon i {\n font-size: 36px;\n color: var(--accent-color, #6366f1);\n}\n\n.empty-state h3 {\n font-size: 20px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.empty-state p {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0 0 24px 0;\n max-width: 400px;\n line-height: 1.5;\n}\n\n.empty-state .btn-link {\n color: var(--accent-color, #6366f1);\n text-decoration: underline;\n cursor: pointer;\n background: none;\n border: none;\n font-size: 14px;\n padding: 0;\n}\n\n.empty-state .btn-link:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n.empty-state .btn-primary {\n margin-top: 0;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .list-container {\n padding: 16px;\n }\n\n .list-header {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .list-title {\n font-size: 20px;\n }\n\n .header-stats {\n gap: 12px;\n }\n\n .stat-item {\n font-size: 12px;\n }\n\n .header-actions {\n width: 100%;\n }\n\n .header-actions .btn-primary {\n flex: 1;\n justify-content: center;\n }\n\n .toolbar {\n flex-direction: column;\n align-items: stretch;\n padding: 12px;\n }\n\n .toolbar-left {\n flex-direction: column;\n }\n\n .search-container {\n min-width: 100%;\n }\n\n .filter-select {\n width: 100%;\n }\n\n .toolbar-right {\n justify-content: space-between;\n }\n\n .credentials-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n /* Make card actions always visible on mobile */\n .card-actions {\n opacity: 1;\n }\n\n .card-header {\n padding: 14px;\n padding-left: 36px;\n }\n\n .card-body {\n padding: 14px;\n padding-left: 36px;\n }\n\n .card-footer {\n padding: 10px 14px;\n padding-left: 36px;\n }\n\n .card-icon {\n width: 38px;\n height: 38px;\n }\n\n .card-icon i {\n font-size: 16px;\n }\n\n .bulk-actions {\n flex-direction: column;\n gap: 12px;\n text-align: center;\n }\n\n .bulk-info {\n flex-direction: column;\n gap: 8px;\n }\n\n .bulk-buttons {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .credentials-table-container {\n overflow-x: auto;\n }\n\n .credentials-table {\n min-width: 800px;\n }\n\n .empty-state {\n padding: 48px 20px;\n }\n\n .empty-icon {\n width: 64px;\n height: 64px;\n }\n\n .empty-icon i {\n font-size: 28px;\n }\n\n .empty-state h3 {\n font-size: 18px;\n }\n}\n\n@media (max-width: 480px) {\n .list-container {\n padding: 12px;\n }\n\n .list-title {\n font-size: 18px;\n }\n\n .header-stats {\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n }\n\n .btn-primary {\n padding: 10px 16px;\n font-size: 13px;\n }\n\n .btn-primary span {\n display: none;\n }\n\n .btn-primary i {\n margin: 0;\n }\n\n .toolbar {\n padding: 10px;\n }\n\n .view-toggle {\n display: none;\n }\n\n .results-info {\n font-size: 12px;\n }\n\n .credential-card {\n border-radius: 10px;\n }\n\n .card-select {\n top: 10px;\n left: 10px;\n }\n\n .card-header {\n padding: 12px;\n padding-left: 32px;\n }\n\n .card-body {\n padding: 12px;\n padding-left: 32px;\n }\n\n .card-footer {\n padding: 10px 12px;\n padding-left: 32px;\n }\n\n .card-icon {\n width: 34px;\n height: 34px;\n margin-right: 10px;\n }\n\n .credential-name {\n font-size: 14px;\n }\n\n .credential-type {\n font-size: 11px;\n }\n\n .action-btn {\n width: 28px;\n height: 28px;\n }\n\n .status-badge {\n font-size: 10px;\n padding: 3px 8px;\n }\n\n .credential-meta {\n gap: 8px;\n }\n\n .meta-item {\n font-size: 11px;\n }\n\n .category-tag {\n font-size: 10px;\n padding: 3px 8px;\n }\n\n .created-info {\n font-size: 10px;\n }\n\n .empty-state {\n padding: 32px 16px;\n }\n\n .empty-icon {\n width: 56px;\n height: 56px;\n margin-bottom: 16px;\n }\n\n .empty-icon i {\n font-size: 24px;\n }\n\n .empty-state h3 {\n font-size: 16px;\n }\n\n .empty-state p {\n font-size: 13px;\n }\n}\n"] }]
1248
+ }], () => [{ type: i0.ChangeDetectorRef }], { editPanel: [{
1249
+ type: ViewChild,
1250
+ args: ['editPanel']
1251
+ }] }); })();
1252
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsListResourceComponent, { className: "CredentialsListResourceComponent", filePath: "src/Credentials/components/credentials-list-resource.component.ts", lineNumber: 24 }); })();
1253
+ //# sourceMappingURL=credentials-list-resource.component.js.map