@memberjunction/ng-dashboards 2.127.0 → 2.129.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 (171) 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/components/view-config-panel/view-config-panel.component.d.ts +3 -3
  99. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -1
  100. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +50 -19
  101. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -1
  102. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +17 -1
  103. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  104. package/dist/DataExplorer/components/view-selector/view-selector.component.js +77 -45
  105. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  106. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +36 -0
  107. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  108. package/dist/DataExplorer/data-explorer-dashboard.component.js +552 -368
  109. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  110. package/dist/DataExplorer/services/explorer-state.service.d.ts +5 -5
  111. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  112. package/dist/DataExplorer/services/explorer-state.service.js +125 -151
  113. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  114. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +15 -19
  115. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  116. package/dist/EntityAdmin/entity-admin-dashboard.component.js +70 -26
  117. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  118. package/dist/Home/home-dashboard.component.d.ts +6 -5
  119. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  120. package/dist/Home/home-dashboard.component.js +174 -166
  121. package/dist/Home/home-dashboard.component.js.map +1 -1
  122. package/dist/Scheduling/scheduling-dashboard.component.d.ts +2 -0
  123. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  124. package/dist/Scheduling/scheduling-dashboard.component.js +5 -2
  125. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  126. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  127. package/dist/Scheduling/services/scheduling-instrumentation.service.js +4 -2
  128. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  129. package/dist/SystemDiagnostics/index.d.ts +2 -0
  130. package/dist/SystemDiagnostics/index.d.ts.map +1 -0
  131. package/dist/SystemDiagnostics/index.js +3 -0
  132. package/dist/SystemDiagnostics/index.js.map +1 -0
  133. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +497 -0
  134. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -0
  135. package/dist/SystemDiagnostics/system-diagnostics.component.js +6063 -0
  136. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -0
  137. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  138. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  139. package/dist/Testing/testing-dashboard.component.js +5 -2
  140. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  141. package/dist/module.d.ts +103 -94
  142. package/dist/module.d.ts.map +1 -1
  143. package/dist/module.js +94 -29
  144. package/dist/module.js.map +1 -1
  145. package/dist/public-api.d.ts +3 -1
  146. package/dist/public-api.d.ts.map +1 -1
  147. package/dist/public-api.js +21 -1
  148. package/dist/public-api.js.map +1 -1
  149. package/package.json +28 -25
  150. package/dist/AI/components/models/model-management-v2.component.d.ts.map +0 -1
  151. package/dist/AI/components/models/model-management-v2.component.js +0 -981
  152. package/dist/AI/components/models/model-management-v2.component.js.map +0 -1
  153. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +0 -1
  154. package/dist/AI/components/prompts/prompt-management-v2.component.js +0 -811
  155. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +0 -1
  156. package/dist/EntityAdmin/components/entity-details.component.d.ts +0 -50
  157. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +0 -1
  158. package/dist/EntityAdmin/components/entity-details.component.js +0 -680
  159. package/dist/EntityAdmin/components/entity-details.component.js.map +0 -1
  160. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +0 -31
  161. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +0 -1
  162. package/dist/EntityAdmin/components/entity-filter-panel.component.js +0 -160
  163. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +0 -1
  164. package/dist/EntityAdmin/components/erd-composite.component.d.ts +0 -73
  165. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +0 -1
  166. package/dist/EntityAdmin/components/erd-composite.component.js +0 -271
  167. package/dist/EntityAdmin/components/erd-composite.component.js.map +0 -1
  168. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +0 -47
  169. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +0 -1
  170. package/dist/EntityAdmin/components/erd-diagram.component.js +0 -618
  171. package/dist/EntityAdmin/components/erd-diagram.component.js.map +0 -1
@@ -0,0 +1,816 @@
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 { RegisterClass } from '@memberjunction/global';
9
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
+ import { RunView, Metadata } from '@memberjunction/core';
11
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@memberjunction/ng-shared";
14
+ import * as i2 from "@angular/common";
15
+ import * as i3 from "@memberjunction/ng-shared-generic";
16
+ import * as i4 from "./credential-category-edit-panel.component";
17
+ const _c0 = ["categoryEditPanel"];
18
+ function CredentialsCategoriesResourceComponent_mj_loading_1_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵelement(0, "mj-loading", 5);
20
+ } }
21
+ function CredentialsCategoriesResourceComponent_ng_container_2_button_13_Template(rf, ctx) { if (rf & 1) {
22
+ const _r3 = i0.ɵɵgetCurrentView();
23
+ i0.ɵɵelementStart(0, "button", 34);
24
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_button_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.createNewCategory()); });
25
+ i0.ɵɵelement(1, "i", 35);
26
+ i0.ɵɵelementStart(2, "span");
27
+ i0.ɵɵtext(3, "New Category");
28
+ i0.ɵɵelementEnd()();
29
+ } }
30
+ function CredentialsCategoriesResourceComponent_ng_container_2_button_19_Template(rf, ctx) { if (rf & 1) {
31
+ const _r5 = i0.ɵɵgetCurrentView();
32
+ i0.ɵɵelementStart(0, "button", 36);
33
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_button_19_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.clearSearch()); });
34
+ i0.ɵɵelement(1, "i", 37);
35
+ i0.ɵɵelementEnd();
36
+ } }
37
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_2_Template(rf, ctx) { if (rf & 1) {
38
+ const _r8 = i0.ɵɵgetCurrentView();
39
+ i0.ɵɵelementStart(0, "button", 54);
40
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_2_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r8); const node_r7 = i0.ɵɵnextContext().$implicit; const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.toggleExpand(node_r7, $event)); });
41
+ i0.ɵɵelement(1, "i");
42
+ i0.ɵɵelementEnd();
43
+ } if (rf & 2) {
44
+ const node_r7 = i0.ɵɵnextContext().$implicit;
45
+ i0.ɵɵadvance();
46
+ i0.ɵɵclassMap(node_r7.expanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
47
+ } }
48
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_span_3_Template(rf, ctx) { if (rf & 1) {
49
+ i0.ɵɵelement(0, "span", 55);
50
+ } }
51
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_div_9_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵelementStart(0, "div", 56);
53
+ i0.ɵɵtext(1);
54
+ i0.ɵɵpipe(2, "slice");
55
+ i0.ɵɵelementEnd();
56
+ } if (rf & 2) {
57
+ const node_r7 = i0.ɵɵnextContext().$implicit;
58
+ i0.ɵɵadvance();
59
+ i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind3(2, 2, node_r7.category.Description, 0, 50), "", node_r7.category.Description.length > 50 ? "..." : "", " ");
60
+ } }
61
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_span_11_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵelementStart(0, "span", 57);
63
+ i0.ɵɵelement(1, "i", 12);
64
+ i0.ɵɵtext(2);
65
+ i0.ɵɵelementEnd();
66
+ } if (rf & 2) {
67
+ const node_r7 = i0.ɵɵnextContext().$implicit;
68
+ i0.ɵɵadvance(2);
69
+ i0.ɵɵtextInterpolate1(" ", node_r7.typeCount, " ");
70
+ } }
71
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_span_12_Template(rf, ctx) { if (rf & 1) {
72
+ i0.ɵɵelementStart(0, "span", 58);
73
+ i0.ɵɵelement(1, "i", 59);
74
+ i0.ɵɵtext(2);
75
+ i0.ɵɵelementEnd();
76
+ } if (rf & 2) {
77
+ const node_r7 = i0.ɵɵnextContext().$implicit;
78
+ i0.ɵɵadvance(2);
79
+ i0.ɵɵtextInterpolate1(" ", node_r7.children.length, " ");
80
+ } }
81
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_14_Template(rf, ctx) { if (rf & 1) {
82
+ const _r9 = i0.ɵɵgetCurrentView();
83
+ i0.ɵɵelementStart(0, "button", 60);
84
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_14_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r9); const node_r7 = i0.ɵɵnextContext().$implicit; const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.editCategory(node_r7, $event)); });
85
+ i0.ɵɵelement(1, "i", 61);
86
+ i0.ɵɵelementEnd();
87
+ } }
88
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_15_Template(rf, ctx) { if (rf & 1) {
89
+ const _r10 = i0.ɵɵgetCurrentView();
90
+ i0.ɵɵelementStart(0, "button", 62);
91
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_15_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r10); const node_r7 = i0.ɵɵnextContext().$implicit; const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.deleteCategory(node_r7, $event)); });
92
+ i0.ɵɵelement(1, "i", 63);
93
+ i0.ɵɵelementEnd();
94
+ } }
95
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_Template(rf, ctx) { if (rf & 1) {
96
+ const _r6 = i0.ɵɵgetCurrentView();
97
+ i0.ɵɵelementStart(0, "div", 40);
98
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_Template_div_click_0_listener() { const node_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.selectNode(node_r7)); });
99
+ i0.ɵɵelementStart(1, "div", 41);
100
+ i0.ɵɵtemplate(2, CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_2_Template, 2, 2, "button", 42)(3, CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_span_3_Template, 1, 0, "span", 43);
101
+ i0.ɵɵelementStart(4, "div", 44);
102
+ i0.ɵɵelement(5, "i");
103
+ i0.ɵɵelementEnd();
104
+ i0.ɵɵelementStart(6, "div", 45)(7, "div", 46);
105
+ i0.ɵɵtext(8);
106
+ i0.ɵɵelementEnd();
107
+ i0.ɵɵtemplate(9, CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_div_9_Template, 3, 6, "div", 47);
108
+ i0.ɵɵelementEnd();
109
+ i0.ɵɵelementStart(10, "div", 48);
110
+ i0.ɵɵtemplate(11, CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_span_11_Template, 3, 1, "span", 49)(12, CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_span_12_Template, 3, 1, "span", 50);
111
+ i0.ɵɵelementEnd();
112
+ i0.ɵɵelementStart(13, "div", 51);
113
+ i0.ɵɵtemplate(14, CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_14_Template, 2, 0, "button", 52)(15, CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_button_15_Template, 2, 0, "button", 53);
114
+ i0.ɵɵelementEnd()()();
115
+ } if (rf & 2) {
116
+ const node_r7 = ctx.$implicit;
117
+ const i_r11 = ctx.index;
118
+ const ctx_r3 = i0.ɵɵnextContext(3);
119
+ i0.ɵɵstyleProp("padding-left", 12 + node_r7.level * 20, "px");
120
+ i0.ɵɵclassProp("selected", (ctx_r3.selectedNode == null ? null : ctx_r3.selectedNode.category == null ? null : ctx_r3.selectedNode.category.ID) === node_r7.category.ID);
121
+ i0.ɵɵadvance(2);
122
+ i0.ɵɵproperty("ngIf", node_r7.children.length > 0);
123
+ i0.ɵɵadvance();
124
+ i0.ɵɵproperty("ngIf", node_r7.children.length === 0);
125
+ i0.ɵɵadvance();
126
+ i0.ɵɵstyleProp("background-color", ctx_r3.getCategoryColor(i_r11) + "15")("color", ctx_r3.getCategoryColor(i_r11));
127
+ i0.ɵɵadvance();
128
+ i0.ɵɵclassMap(node_r7.category.IconClass || "fa-solid fa-folder");
129
+ i0.ɵɵadvance(3);
130
+ i0.ɵɵtextInterpolate(node_r7.category.Name);
131
+ i0.ɵɵadvance();
132
+ i0.ɵɵproperty("ngIf", node_r7.category.Description);
133
+ i0.ɵɵadvance(2);
134
+ i0.ɵɵproperty("ngIf", node_r7.typeCount > 0);
135
+ i0.ɵɵadvance();
136
+ i0.ɵɵproperty("ngIf", node_r7.children.length > 0);
137
+ i0.ɵɵadvance(2);
138
+ i0.ɵɵproperty("ngIf", ctx_r3.UserCanUpdate);
139
+ i0.ɵɵadvance();
140
+ i0.ɵɵproperty("ngIf", ctx_r3.UserCanDelete && node_r7.children.length === 0 && node_r7.typeCount === 0);
141
+ } }
142
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_29_Template(rf, ctx) { if (rf & 1) {
143
+ i0.ɵɵelementStart(0, "div", 38);
144
+ i0.ɵɵtemplate(1, CredentialsCategoriesResourceComponent_ng_container_2_div_29_div_1_Template, 16, 18, "div", 39);
145
+ i0.ɵɵelementEnd();
146
+ } if (rf & 2) {
147
+ const ctx_r3 = i0.ɵɵnextContext(2);
148
+ i0.ɵɵadvance();
149
+ i0.ɵɵproperty("ngForOf", ctx_r3.getFlattenedNodes());
150
+ } }
151
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_30_p_5_Template(rf, ctx) { if (rf & 1) {
152
+ const _r12 = i0.ɵɵgetCurrentView();
153
+ i0.ɵɵelementStart(0, "p");
154
+ i0.ɵɵtext(1, " No categories match your search. ");
155
+ i0.ɵɵelementStart(2, "button", 67);
156
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_30_p_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r12); const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.clearSearch()); });
157
+ i0.ɵɵtext(3, "Clear search");
158
+ i0.ɵɵelementEnd()();
159
+ } }
160
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_30_p_6_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵelementStart(0, "p");
162
+ i0.ɵɵtext(1, " Get started by creating your first category. ");
163
+ i0.ɵɵelementEnd();
164
+ } }
165
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_30_button_7_Template(rf, ctx) { if (rf & 1) {
166
+ const _r13 = i0.ɵɵgetCurrentView();
167
+ i0.ɵɵelementStart(0, "button", 34);
168
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_30_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.createNewCategory()); });
169
+ i0.ɵɵelement(1, "i", 35);
170
+ i0.ɵɵtext(2, " Create Category ");
171
+ i0.ɵɵelementEnd();
172
+ } }
173
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_30_Template(rf, ctx) { if (rf & 1) {
174
+ i0.ɵɵelementStart(0, "div", 64)(1, "div", 65);
175
+ i0.ɵɵelement(2, "i", 66);
176
+ i0.ɵɵelementEnd();
177
+ i0.ɵɵelementStart(3, "h3");
178
+ i0.ɵɵtext(4, "No Categories");
179
+ i0.ɵɵelementEnd();
180
+ i0.ɵɵtemplate(5, CredentialsCategoriesResourceComponent_ng_container_2_div_30_p_5_Template, 4, 0, "p", 3)(6, CredentialsCategoriesResourceComponent_ng_container_2_div_30_p_6_Template, 2, 0, "p", 3)(7, CredentialsCategoriesResourceComponent_ng_container_2_div_30_button_7_Template, 3, 0, "button", 14);
181
+ i0.ɵɵelementEnd();
182
+ } if (rf & 2) {
183
+ const ctx_r3 = i0.ɵɵnextContext(2);
184
+ i0.ɵɵadvance(5);
185
+ i0.ɵɵproperty("ngIf", ctx_r3.searchText);
186
+ i0.ɵɵadvance();
187
+ i0.ɵɵproperty("ngIf", !ctx_r3.searchText);
188
+ i0.ɵɵadvance();
189
+ i0.ɵɵproperty("ngIf", ctx_r3.UserCanCreate && !ctx_r3.searchText);
190
+ } }
191
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_span_7_Template(rf, ctx) { if (rf & 1) {
192
+ i0.ɵɵelementStart(0, "span", 85);
193
+ i0.ɵɵtext(1);
194
+ i0.ɵɵelementEnd();
195
+ } if (rf & 2) {
196
+ const ctx_r3 = i0.ɵɵnextContext(3);
197
+ i0.ɵɵadvance();
198
+ i0.ɵɵtextInterpolate1(" Level ", ctx_r3.selectedNode.level + 1, " ");
199
+ } }
200
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_button_9_Template(rf, ctx) { if (rf & 1) {
201
+ const _r15 = i0.ɵɵgetCurrentView();
202
+ i0.ɵɵelementStart(0, "button", 60);
203
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_31_button_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.editCategory(ctx_r3.selectedNode)); });
204
+ i0.ɵɵelement(1, "i", 61);
205
+ i0.ɵɵelementEnd();
206
+ } }
207
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_24_Template(rf, ctx) { if (rf & 1) {
208
+ i0.ɵɵelementStart(0, "div", 86)(1, "h3");
209
+ i0.ɵɵelement(2, "i", 87);
210
+ i0.ɵɵtext(3, " Description ");
211
+ i0.ɵɵelementEnd();
212
+ i0.ɵɵelementStart(4, "p", 88);
213
+ i0.ɵɵtext(5);
214
+ i0.ɵɵelementEnd()();
215
+ } if (rf & 2) {
216
+ const ctx_r3 = i0.ɵɵnextContext(3);
217
+ i0.ɵɵadvance(5);
218
+ i0.ɵɵtextInterpolate(ctx_r3.selectedNode.category.Description);
219
+ } }
220
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_25_div_5_div_6_Template(rf, ctx) { if (rf & 1) {
221
+ i0.ɵɵelementStart(0, "div", 97);
222
+ i0.ɵɵtext(1);
223
+ i0.ɵɵpipe(2, "slice");
224
+ i0.ɵɵelementEnd();
225
+ } if (rf & 2) {
226
+ const type_r16 = i0.ɵɵnextContext().$implicit;
227
+ i0.ɵɵadvance();
228
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind3(2, 1, type_r16.Description, 0, 60));
229
+ } }
230
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_25_div_5_Template(rf, ctx) { if (rf & 1) {
231
+ i0.ɵɵelementStart(0, "div", 92)(1, "div", 93);
232
+ i0.ɵɵelement(2, "i");
233
+ i0.ɵɵelementEnd();
234
+ i0.ɵɵelementStart(3, "div", 94)(4, "div", 95);
235
+ i0.ɵɵtext(5);
236
+ i0.ɵɵelementEnd();
237
+ i0.ɵɵtemplate(6, CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_25_div_5_div_6_Template, 3, 5, "div", 96);
238
+ i0.ɵɵelementEnd()();
239
+ } if (rf & 2) {
240
+ const type_r16 = ctx.$implicit;
241
+ i0.ɵɵadvance(2);
242
+ i0.ɵɵclassMap(type_r16.IconClass || "fa-solid fa-key");
243
+ i0.ɵɵadvance(3);
244
+ i0.ɵɵtextInterpolate(type_r16.Name);
245
+ i0.ɵɵadvance();
246
+ i0.ɵɵproperty("ngIf", type_r16.Description);
247
+ } }
248
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_25_Template(rf, ctx) { if (rf & 1) {
249
+ i0.ɵɵelementStart(0, "div", 89)(1, "h3");
250
+ i0.ɵɵelement(2, "i", 12);
251
+ i0.ɵɵtext(3, " Credential Types ");
252
+ i0.ɵɵelementEnd();
253
+ i0.ɵɵelementStart(4, "div", 90);
254
+ i0.ɵɵtemplate(5, CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_25_div_5_Template, 7, 4, "div", 91);
255
+ i0.ɵɵelementEnd()();
256
+ } if (rf & 2) {
257
+ const ctx_r3 = i0.ɵɵnextContext(3);
258
+ i0.ɵɵadvance(5);
259
+ i0.ɵɵproperty("ngForOf", ctx_r3.getTypesForCategory(ctx_r3.selectedNode.category.Name));
260
+ } }
261
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_26_div_5_span_4_Template(rf, ctx) { if (rf & 1) {
262
+ i0.ɵɵelementStart(0, "span", 103);
263
+ i0.ɵɵtext(1);
264
+ i0.ɵɵelementEnd();
265
+ } if (rf & 2) {
266
+ const child_r18 = i0.ɵɵnextContext().$implicit;
267
+ i0.ɵɵadvance();
268
+ i0.ɵɵtextInterpolate1("", child_r18.typeCount, " types");
269
+ } }
270
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_26_div_5_Template(rf, ctx) { if (rf & 1) {
271
+ const _r17 = i0.ɵɵgetCurrentView();
272
+ i0.ɵɵelementStart(0, "div", 101);
273
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_26_div_5_Template_div_click_0_listener() { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r3 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r3.selectNode(child_r18)); });
274
+ i0.ɵɵelement(1, "i");
275
+ i0.ɵɵelementStart(2, "span");
276
+ i0.ɵɵtext(3);
277
+ i0.ɵɵelementEnd();
278
+ i0.ɵɵtemplate(4, CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_26_div_5_span_4_Template, 2, 1, "span", 102);
279
+ i0.ɵɵelementEnd();
280
+ } if (rf & 2) {
281
+ const child_r18 = ctx.$implicit;
282
+ i0.ɵɵadvance();
283
+ i0.ɵɵclassMap(child_r18.category.IconClass || "fa-solid fa-folder");
284
+ i0.ɵɵadvance(2);
285
+ i0.ɵɵtextInterpolate(child_r18.category.Name);
286
+ i0.ɵɵadvance();
287
+ i0.ɵɵproperty("ngIf", child_r18.typeCount > 0);
288
+ } }
289
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_26_Template(rf, ctx) { if (rf & 1) {
290
+ i0.ɵɵelementStart(0, "div", 98)(1, "h3");
291
+ i0.ɵɵelement(2, "i", 11);
292
+ i0.ɵɵtext(3, " Subcategories ");
293
+ i0.ɵɵelementEnd();
294
+ i0.ɵɵelementStart(4, "div", 99);
295
+ i0.ɵɵtemplate(5, CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_26_div_5_Template, 5, 4, "div", 100);
296
+ i0.ɵɵelementEnd()();
297
+ } if (rf & 2) {
298
+ const ctx_r3 = i0.ɵɵnextContext(3);
299
+ i0.ɵɵadvance(5);
300
+ i0.ɵɵproperty("ngForOf", ctx_r3.selectedNode.children);
301
+ } }
302
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_button_28_Template(rf, ctx) { if (rf & 1) {
303
+ const _r19 = i0.ɵɵgetCurrentView();
304
+ i0.ɵɵelementStart(0, "button", 104);
305
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_31_button_28_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.viewTypesForCategory(ctx_r3.selectedNode.category.Name)); });
306
+ i0.ɵɵelement(1, "i", 12);
307
+ i0.ɵɵtext(2, " View Types ");
308
+ i0.ɵɵelementEnd();
309
+ } }
310
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_31_Template(rf, ctx) { if (rf & 1) {
311
+ const _r14 = i0.ɵɵgetCurrentView();
312
+ i0.ɵɵelementStart(0, "div", 68)(1, "div", 69)(2, "div", 70);
313
+ i0.ɵɵelement(3, "i");
314
+ i0.ɵɵelementEnd();
315
+ i0.ɵɵelementStart(4, "div", 71)(5, "h2");
316
+ i0.ɵɵtext(6);
317
+ i0.ɵɵelementEnd();
318
+ i0.ɵɵtemplate(7, CredentialsCategoriesResourceComponent_ng_container_2_div_31_span_7_Template, 2, 1, "span", 72);
319
+ i0.ɵɵelementEnd();
320
+ i0.ɵɵelementStart(8, "div", 73);
321
+ i0.ɵɵtemplate(9, CredentialsCategoriesResourceComponent_ng_container_2_div_31_button_9_Template, 2, 0, "button", 52);
322
+ i0.ɵɵelementStart(10, "button", 74);
323
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_31_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r14); const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.selectedNode = null); });
324
+ i0.ɵɵelement(11, "i", 37);
325
+ i0.ɵɵelementEnd()()();
326
+ i0.ɵɵelementStart(12, "div", 75)(13, "div", 76)(14, "div", 77)(15, "div", 78);
327
+ i0.ɵɵtext(16);
328
+ i0.ɵɵelementEnd();
329
+ i0.ɵɵelementStart(17, "div", 79);
330
+ i0.ɵɵtext(18, "Credential Types");
331
+ i0.ɵɵelementEnd()();
332
+ i0.ɵɵelementStart(19, "div", 77)(20, "div", 78);
333
+ i0.ɵɵtext(21);
334
+ i0.ɵɵelementEnd();
335
+ i0.ɵɵelementStart(22, "div", 79);
336
+ i0.ɵɵtext(23, "Subcategories");
337
+ i0.ɵɵelementEnd()()();
338
+ i0.ɵɵtemplate(24, CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_24_Template, 6, 1, "div", 80)(25, CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_25_Template, 6, 1, "div", 81)(26, CredentialsCategoriesResourceComponent_ng_container_2_div_31_div_26_Template, 6, 1, "div", 82);
339
+ i0.ɵɵelementStart(27, "div", 83);
340
+ i0.ɵɵtemplate(28, CredentialsCategoriesResourceComponent_ng_container_2_div_31_button_28_Template, 3, 0, "button", 84);
341
+ i0.ɵɵelementStart(29, "button", 34);
342
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_div_31_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r14); const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.createCredentialWithCategory(ctx_r3.selectedNode.category.ID)); });
343
+ i0.ɵɵelement(30, "i", 35);
344
+ i0.ɵɵtext(31, " Create Credential ");
345
+ i0.ɵɵelementEnd()()()();
346
+ } if (rf & 2) {
347
+ const ctx_r3 = i0.ɵɵnextContext(2);
348
+ i0.ɵɵadvance(2);
349
+ i0.ɵɵstyleProp("background-color", ctx_r3.getCategoryColor(0) + "15")("color", ctx_r3.getCategoryColor(0));
350
+ i0.ɵɵadvance();
351
+ i0.ɵɵclassMap(ctx_r3.selectedNode.category.IconClass || "fa-solid fa-folder");
352
+ i0.ɵɵadvance(3);
353
+ i0.ɵɵtextInterpolate(ctx_r3.selectedNode.category.Name);
354
+ i0.ɵɵadvance();
355
+ i0.ɵɵproperty("ngIf", ctx_r3.selectedNode.level > 0);
356
+ i0.ɵɵadvance(2);
357
+ i0.ɵɵproperty("ngIf", ctx_r3.UserCanUpdate);
358
+ i0.ɵɵadvance(7);
359
+ i0.ɵɵtextInterpolate(ctx_r3.selectedNode.typeCount);
360
+ i0.ɵɵadvance(5);
361
+ i0.ɵɵtextInterpolate(ctx_r3.selectedNode.children.length);
362
+ i0.ɵɵadvance(3);
363
+ i0.ɵɵproperty("ngIf", ctx_r3.selectedNode.category.Description);
364
+ i0.ɵɵadvance();
365
+ i0.ɵɵproperty("ngIf", ctx_r3.selectedNode.typeCount > 0);
366
+ i0.ɵɵadvance();
367
+ i0.ɵɵproperty("ngIf", ctx_r3.selectedNode.children.length > 0);
368
+ i0.ɵɵadvance(2);
369
+ i0.ɵɵproperty("ngIf", ctx_r3.selectedNode.typeCount > 0);
370
+ } }
371
+ function CredentialsCategoriesResourceComponent_ng_container_2_div_32_Template(rf, ctx) { if (rf & 1) {
372
+ i0.ɵɵelementStart(0, "div", 105)(1, "div", 106);
373
+ i0.ɵɵelement(2, "i", 107);
374
+ i0.ɵɵelementEnd();
375
+ i0.ɵɵelementStart(3, "h3");
376
+ i0.ɵɵtext(4, "Select a Category");
377
+ i0.ɵɵelementEnd();
378
+ i0.ɵɵelementStart(5, "p");
379
+ i0.ɵɵtext(6, "Click on a category to view its details and credential types");
380
+ i0.ɵɵelementEnd()();
381
+ } }
382
+ function CredentialsCategoriesResourceComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
383
+ const _r2 = i0.ɵɵgetCurrentView();
384
+ i0.ɵɵelementContainerStart(0);
385
+ i0.ɵɵelementStart(1, "div", 6)(2, "div", 7)(3, "h2", 8);
386
+ i0.ɵɵtext(4, "Categories");
387
+ i0.ɵɵelementEnd();
388
+ i0.ɵɵelementStart(5, "div", 9)(6, "span", 10);
389
+ i0.ɵɵelement(7, "i", 11);
390
+ i0.ɵɵtext(8);
391
+ i0.ɵɵelementEnd();
392
+ i0.ɵɵelementStart(9, "span", 10);
393
+ i0.ɵɵelement(10, "i", 12);
394
+ i0.ɵɵtext(11);
395
+ i0.ɵɵelementEnd()()();
396
+ i0.ɵɵelementStart(12, "div", 13);
397
+ i0.ɵɵtemplate(13, CredentialsCategoriesResourceComponent_ng_container_2_button_13_Template, 4, 0, "button", 14);
398
+ i0.ɵɵelementEnd()();
399
+ i0.ɵɵelementStart(14, "div", 15)(15, "div", 16)(16, "div", 17);
400
+ i0.ɵɵelement(17, "i", 18);
401
+ i0.ɵɵelementStart(18, "input", 19);
402
+ i0.ɵɵlistener("input", function CredentialsCategoriesResourceComponent_ng_container_2_Template_input_input_18_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.onSearchChange($event.target.value)); });
403
+ i0.ɵɵelementEnd();
404
+ i0.ɵɵtemplate(19, CredentialsCategoriesResourceComponent_ng_container_2_button_19_Template, 2, 0, "button", 20);
405
+ i0.ɵɵelementEnd()();
406
+ i0.ɵɵelementStart(20, "div", 21)(21, "button", 22);
407
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r2); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.expandAll()); });
408
+ i0.ɵɵelement(22, "i", 23);
409
+ i0.ɵɵelementEnd();
410
+ i0.ɵɵelementStart(23, "button", 24);
411
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r2); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.collapseAll()); });
412
+ i0.ɵɵelement(24, "i", 25);
413
+ i0.ɵɵelementEnd();
414
+ i0.ɵɵelementStart(25, "button", 26);
415
+ i0.ɵɵlistener("click", function CredentialsCategoriesResourceComponent_ng_container_2_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r2); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.refresh()); });
416
+ i0.ɵɵelement(26, "i", 27);
417
+ i0.ɵɵelementEnd()()();
418
+ i0.ɵɵelementStart(27, "div", 28)(28, "div", 29);
419
+ i0.ɵɵtemplate(29, CredentialsCategoriesResourceComponent_ng_container_2_div_29_Template, 2, 1, "div", 30)(30, CredentialsCategoriesResourceComponent_ng_container_2_div_30_Template, 8, 3, "div", 31);
420
+ i0.ɵɵelementEnd();
421
+ i0.ɵɵtemplate(31, CredentialsCategoriesResourceComponent_ng_container_2_div_31_Template, 32, 15, "div", 32)(32, CredentialsCategoriesResourceComponent_ng_container_2_div_32_Template, 7, 0, "div", 33);
422
+ i0.ɵɵelementEnd();
423
+ i0.ɵɵelementContainerEnd();
424
+ } if (rf & 2) {
425
+ const ctx_r3 = i0.ɵɵnextContext();
426
+ i0.ɵɵadvance(8);
427
+ i0.ɵɵtextInterpolate1(" ", ctx_r3.categories.length, " categories ");
428
+ i0.ɵɵadvance(3);
429
+ i0.ɵɵtextInterpolate1(" ", ctx_r3.getTotalTypeCount(), " types ");
430
+ i0.ɵɵadvance(2);
431
+ i0.ɵɵproperty("ngIf", ctx_r3.UserCanCreate);
432
+ i0.ɵɵadvance(5);
433
+ i0.ɵɵproperty("value", ctx_r3.searchText);
434
+ i0.ɵɵadvance();
435
+ i0.ɵɵproperty("ngIf", ctx_r3.searchText);
436
+ i0.ɵɵadvance(10);
437
+ i0.ɵɵproperty("ngIf", ctx_r3.categoryTree.length > 0);
438
+ i0.ɵɵadvance();
439
+ i0.ɵɵproperty("ngIf", ctx_r3.categoryTree.length === 0);
440
+ i0.ɵɵadvance();
441
+ i0.ɵɵproperty("ngIf", ctx_r3.selectedNode);
442
+ i0.ɵɵadvance();
443
+ i0.ɵɵproperty("ngIf", !ctx_r3.selectedNode && ctx_r3.categoryTree.length > 0);
444
+ } }
445
+ export function LoadCredentialsCategoriesResource() {
446
+ // Prevents tree-shaking
447
+ }
448
+ let CredentialsCategoriesResourceComponent = class CredentialsCategoriesResourceComponent extends BaseResourceComponent {
449
+ cdr;
450
+ navigationService;
451
+ isLoading = true;
452
+ categories = [];
453
+ categoryTree = [];
454
+ types = [];
455
+ selectedNode = null;
456
+ searchText = '';
457
+ // Permissions
458
+ _metadata = new Metadata();
459
+ _permissionCache = new Map();
460
+ categoryEditPanel;
461
+ constructor(cdr, navigationService) {
462
+ super();
463
+ this.cdr = cdr;
464
+ this.navigationService = navigationService;
465
+ }
466
+ ngOnInit() {
467
+ this.loadData();
468
+ }
469
+ ngOnDestroy() {
470
+ // Cleanup if needed
471
+ }
472
+ async GetResourceDisplayName(data) {
473
+ return 'Categories';
474
+ }
475
+ async GetResourceIconClass(data) {
476
+ return 'fa-solid fa-folder-tree';
477
+ }
478
+ // === Permission Checks ===
479
+ get UserCanCreate() {
480
+ return this.checkEntityPermission('MJ: Credential Categories', 'Create');
481
+ }
482
+ get UserCanUpdate() {
483
+ return this.checkEntityPermission('MJ: Credential Categories', 'Update');
484
+ }
485
+ get UserCanDelete() {
486
+ return this.checkEntityPermission('MJ: Credential Categories', 'Delete');
487
+ }
488
+ checkEntityPermission(entityName, permissionType) {
489
+ const cacheKey = `${entityName}_${permissionType}`;
490
+ if (this._permissionCache.has(cacheKey)) {
491
+ return this._permissionCache.get(cacheKey);
492
+ }
493
+ try {
494
+ const entityInfo = this._metadata.Entities.find(e => e.Name === entityName);
495
+ if (!entityInfo) {
496
+ this._permissionCache.set(cacheKey, false);
497
+ return false;
498
+ }
499
+ const userPermissions = entityInfo.GetUserPermisions(this._metadata.CurrentUser);
500
+ let hasPermission = false;
501
+ switch (permissionType) {
502
+ case 'Create':
503
+ hasPermission = userPermissions.CanCreate;
504
+ break;
505
+ case 'Read':
506
+ hasPermission = userPermissions.CanRead;
507
+ break;
508
+ case 'Update':
509
+ hasPermission = userPermissions.CanUpdate;
510
+ break;
511
+ case 'Delete':
512
+ hasPermission = userPermissions.CanDelete;
513
+ break;
514
+ }
515
+ this._permissionCache.set(cacheKey, hasPermission);
516
+ return hasPermission;
517
+ }
518
+ catch (error) {
519
+ this._permissionCache.set(cacheKey, false);
520
+ return false;
521
+ }
522
+ }
523
+ async loadData() {
524
+ try {
525
+ this.isLoading = true;
526
+ this.cdr.markForCheck();
527
+ const rv = new RunView();
528
+ const [catResult, typeResult] = await rv.RunViews([
529
+ {
530
+ EntityName: 'MJ: Credential Categories',
531
+ OrderBy: 'Name',
532
+ ResultType: 'entity_object'
533
+ },
534
+ {
535
+ EntityName: 'MJ: Credential Types',
536
+ ResultType: 'entity_object'
537
+ }
538
+ ]);
539
+ if (catResult.Success) {
540
+ this.categories = catResult.Results;
541
+ }
542
+ if (typeResult.Success) {
543
+ this.types = typeResult.Results;
544
+ }
545
+ this.buildTree();
546
+ }
547
+ catch (error) {
548
+ console.error('Error loading credential categories:', error);
549
+ MJNotificationService.Instance.CreateSimpleNotification('Error loading categories', 'error', 3000);
550
+ }
551
+ finally {
552
+ this.isLoading = false;
553
+ this.NotifyLoadComplete();
554
+ this.cdr.markForCheck();
555
+ }
556
+ }
557
+ buildTree() {
558
+ const categoryMap = new Map();
559
+ // Create nodes for all categories with stats
560
+ for (const category of this.categories) {
561
+ const typesInCategory = this.types.filter(t => t.Category === category.Name);
562
+ categoryMap.set(category.ID, {
563
+ category,
564
+ children: [],
565
+ expanded: true,
566
+ level: 0,
567
+ typeCount: typesInCategory.length
568
+ });
569
+ }
570
+ // Build tree structure
571
+ const roots = [];
572
+ for (const category of this.categories) {
573
+ const node = categoryMap.get(category.ID);
574
+ if (category.ParentID) {
575
+ const parent = categoryMap.get(category.ParentID);
576
+ if (parent) {
577
+ node.level = parent.level + 1;
578
+ parent.children.push(node);
579
+ }
580
+ else {
581
+ roots.push(node);
582
+ }
583
+ }
584
+ else {
585
+ roots.push(node);
586
+ }
587
+ }
588
+ // Sort children recursively
589
+ const sortNodes = (nodes) => {
590
+ nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));
591
+ for (const node of nodes) {
592
+ sortNodes(node.children);
593
+ }
594
+ };
595
+ sortNodes(roots);
596
+ this.categoryTree = roots;
597
+ }
598
+ // === CRUD Operations ===
599
+ createNewCategory() {
600
+ if (this.categoryEditPanel) {
601
+ this.categoryEditPanel.open(null);
602
+ }
603
+ }
604
+ createChildCategory(parentNode, event) {
605
+ if (event) {
606
+ event.stopPropagation();
607
+ }
608
+ if (this.categoryEditPanel) {
609
+ this.categoryEditPanel.open(null, parentNode.category.ID);
610
+ }
611
+ }
612
+ editCategory(node, event) {
613
+ if (event) {
614
+ event.stopPropagation();
615
+ }
616
+ if (this.categoryEditPanel) {
617
+ this.categoryEditPanel.open(node.category);
618
+ }
619
+ }
620
+ async deleteCategory(node, event) {
621
+ if (event) {
622
+ event.stopPropagation();
623
+ }
624
+ if (!this.UserCanDelete) {
625
+ MJNotificationService.Instance.CreateSimpleNotification('You do not have permission to delete categories', 'warning', 3000);
626
+ return;
627
+ }
628
+ if (node.children.length > 0) {
629
+ MJNotificationService.Instance.CreateSimpleNotification(`Cannot delete "${node.category.Name}" - it has ${node.children.length} subcategories`, 'warning', 4000);
630
+ return;
631
+ }
632
+ if (node.typeCount > 0) {
633
+ MJNotificationService.Instance.CreateSimpleNotification(`Cannot delete "${node.category.Name}" - it has ${node.typeCount} credential type(s) using it`, 'warning', 4000);
634
+ return;
635
+ }
636
+ const confirmed = confirm(`Are you sure you want to delete "${node.category.Name}"? This action cannot be undone.`);
637
+ if (!confirmed)
638
+ return;
639
+ try {
640
+ const success = await node.category.Delete();
641
+ if (success) {
642
+ MJNotificationService.Instance.CreateSimpleNotification(`Category "${node.category.Name}" deleted successfully`, 'success', 3000);
643
+ this.categories = this.categories.filter(c => c.ID !== node.category.ID);
644
+ if (this.selectedNode?.category.ID === node.category.ID) {
645
+ this.selectedNode = null;
646
+ }
647
+ this.buildTree();
648
+ this.cdr.markForCheck();
649
+ }
650
+ else {
651
+ MJNotificationService.Instance.CreateSimpleNotification('Failed to delete category', 'error', 3000);
652
+ }
653
+ }
654
+ catch (error) {
655
+ console.error('Error deleting category:', error);
656
+ MJNotificationService.Instance.CreateSimpleNotification('Error deleting category', 'error', 3000);
657
+ }
658
+ }
659
+ // === Panel Event Handlers ===
660
+ onCategorySaved(category) {
661
+ const existingIndex = this.categories.findIndex(c => c.ID === category.ID);
662
+ if (existingIndex >= 0) {
663
+ this.categories[existingIndex] = category;
664
+ }
665
+ else {
666
+ this.categories.push(category);
667
+ }
668
+ this.buildTree();
669
+ this.cdr.markForCheck();
670
+ }
671
+ onCategoryDeleted(categoryId) {
672
+ this.categories = this.categories.filter(c => c.ID !== categoryId);
673
+ if (this.selectedNode?.category.ID === categoryId) {
674
+ this.selectedNode = null;
675
+ }
676
+ this.buildTree();
677
+ this.cdr.markForCheck();
678
+ }
679
+ // === Selection ===
680
+ selectNode(node) {
681
+ this.selectedNode = this.selectedNode?.category.ID === node.category.ID ? null : node;
682
+ this.cdr.markForCheck();
683
+ }
684
+ toggleExpand(node, event) {
685
+ if (event) {
686
+ event.stopPropagation();
687
+ }
688
+ node.expanded = !node.expanded;
689
+ this.cdr.markForCheck();
690
+ }
691
+ // === Search ===
692
+ onSearchChange(value) {
693
+ this.searchText = value;
694
+ if (value) {
695
+ this.expandAll();
696
+ }
697
+ this.cdr.markForCheck();
698
+ }
699
+ clearSearch() {
700
+ this.searchText = '';
701
+ this.cdr.markForCheck();
702
+ }
703
+ expandAll() {
704
+ const expand = (nodes) => {
705
+ for (const node of nodes) {
706
+ node.expanded = true;
707
+ expand(node.children);
708
+ }
709
+ };
710
+ expand(this.categoryTree);
711
+ this.cdr.markForCheck();
712
+ }
713
+ collapseAll() {
714
+ const collapse = (nodes) => {
715
+ for (const node of nodes) {
716
+ node.expanded = false;
717
+ collapse(node.children);
718
+ }
719
+ };
720
+ collapse(this.categoryTree);
721
+ this.cdr.markForCheck();
722
+ }
723
+ getFlattenedNodes() {
724
+ const result = [];
725
+ const searchLower = this.searchText.toLowerCase().trim();
726
+ const flatten = (nodes) => {
727
+ for (const node of nodes) {
728
+ if (searchLower) {
729
+ const matches = this.nodeMatchesSearch(node, searchLower);
730
+ if (matches) {
731
+ result.push(node);
732
+ }
733
+ }
734
+ else {
735
+ result.push(node);
736
+ }
737
+ if (node.expanded && node.children.length > 0) {
738
+ flatten(node.children);
739
+ }
740
+ }
741
+ };
742
+ flatten(this.categoryTree);
743
+ return result;
744
+ }
745
+ nodeMatchesSearch(node, searchLower) {
746
+ const nameMatch = node.category.Name.toLowerCase().includes(searchLower);
747
+ const descMatch = node.category.Description?.toLowerCase().includes(searchLower);
748
+ return nameMatch || descMatch || false;
749
+ }
750
+ getTotalTypeCount() {
751
+ return this.types.length;
752
+ }
753
+ getTypesForCategory(categoryName) {
754
+ return this.types.filter(t => t.Category === categoryName);
755
+ }
756
+ createCredentialWithCategory(categoryId, event) {
757
+ if (event) {
758
+ event.stopPropagation();
759
+ }
760
+ // Navigate to Credentials nav item with the category pre-selected and create panel open
761
+ this.navigationService.OpenNavItemByName('Credentials', {
762
+ categoryId: categoryId,
763
+ openCreatePanel: true
764
+ });
765
+ }
766
+ viewTypesForCategory(categoryName, event) {
767
+ if (event) {
768
+ event.stopPropagation();
769
+ }
770
+ // Navigate to Types nav item filtered by this category
771
+ this.navigationService.OpenNavItemByName('Types', {
772
+ categoryFilter: categoryName
773
+ });
774
+ }
775
+ getCategoryColor(index) {
776
+ const colors = ['#6366f1', '#8b5cf6', '#ec4899', '#f59e0b', '#10b981', '#3b82f6', '#06b6d4'];
777
+ return colors[index % colors.length];
778
+ }
779
+ refresh() {
780
+ this.selectedNode = null;
781
+ this.loadData();
782
+ }
783
+ static ɵfac = function CredentialsCategoriesResourceComponent_Factory(t) { return new (t || CredentialsCategoriesResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.NavigationService)); };
784
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsCategoriesResourceComponent, selectors: [["mj-credentials-categories-resource"]], viewQuery: function CredentialsCategoriesResourceComponent_Query(rf, ctx) { if (rf & 1) {
785
+ i0.ɵɵviewQuery(_c0, 5);
786
+ } if (rf & 2) {
787
+ let _t;
788
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.categoryEditPanel = _t.first);
789
+ } }, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 2, consts: [["categoryEditPanel", ""], [1, "categories-container"], ["text", "Loading categories...", 4, "ngIf"], [4, "ngIf"], [3, "saved", "deleted"], ["text", "Loading categories..."], [1, "categories-header"], [1, "header-info"], [1, "categories-title"], [1, "header-stats"], [1, "stat-item"], [1, "fa-solid", "fa-folder-tree"], [1, "fa-solid", "fa-shapes"], [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 categories...", 3, "input", "value"], ["class", "search-clear", 3, "click", 4, "ngIf"], [1, "toolbar-right"], ["title", "Expand All", 1, "btn-text", 3, "click"], [1, "fa-solid", "fa-expand"], ["title", "Collapse All", 1, "btn-text", 3, "click"], [1, "fa-solid", "fa-compress"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "categories-layout"], [1, "tree-panel"], ["class", "tree-container", 4, "ngIf"], ["class", "empty-state", 4, "ngIf"], ["class", "detail-panel", 4, "ngIf"], ["class", "no-selection", 4, "ngIf"], [1, "btn-primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "search-clear", 3, "click"], [1, "fa-solid", "fa-times"], [1, "tree-container"], ["class", "tree-node", 3, "selected", "padding-left", "click", 4, "ngFor", "ngForOf"], [1, "tree-node", 3, "click"], [1, "node-content"], ["class", "expand-btn", 3, "click", 4, "ngIf"], ["class", "expand-placeholder", 4, "ngIf"], [1, "node-icon"], [1, "node-info"], [1, "node-name"], ["class", "node-description", 4, "ngIf"], [1, "node-badges"], ["class", "badge types", 4, "ngIf"], ["class", "badge children", 4, "ngIf"], [1, "node-actions"], ["class", "action-btn", "title", "Edit", 3, "click", 4, "ngIf"], ["class", "action-btn danger", "title", "Delete", 3, "click", 4, "ngIf"], [1, "expand-btn", 3, "click"], [1, "expand-placeholder"], [1, "node-description"], [1, "badge", "types"], [1, "badge", "children"], [1, "fa-solid", "fa-folder"], ["title", "Edit", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-pen"], ["title", "Delete", 1, "action-btn", "danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "empty-state"], [1, "empty-icon"], [1, "fa-solid", "fa-folder-open"], [1, "btn-link", 3, "click"], [1, "detail-panel"], [1, "detail-header"], [1, "detail-icon"], [1, "detail-title"], ["class", "level-badge", 4, "ngIf"], [1, "detail-actions"], [1, "close-btn", 3, "click"], [1, "detail-body"], [1, "detail-stats"], [1, "detail-stat"], [1, "stat-value"], [1, "stat-label"], ["class", "description-section", 4, "ngIf"], ["class", "types-section", 4, "ngIf"], ["class", "subcategories-section", 4, "ngIf"], [1, "detail-quick-actions"], ["class", "btn-secondary", 3, "click", 4, "ngIf"], [1, "level-badge"], [1, "description-section"], [1, "fa-solid", "fa-align-left"], [1, "description"], [1, "types-section"], [1, "type-list"], ["class", "type-item", 4, "ngFor", "ngForOf"], [1, "type-item"], [1, "type-icon"], [1, "type-info"], [1, "type-name"], ["class", "type-desc", 4, "ngIf"], [1, "type-desc"], [1, "subcategories-section"], [1, "subcategory-list"], ["class", "subcategory-item", 3, "click", 4, "ngFor", "ngForOf"], [1, "subcategory-item", 3, "click"], ["class", "sub-type-count", 4, "ngIf"], [1, "sub-type-count"], [1, "btn-secondary", 3, "click"], [1, "no-selection"], [1, "no-selection-icon"], [1, "fa-solid", "fa-hand-pointer"]], template: function CredentialsCategoriesResourceComponent_Template(rf, ctx) { if (rf & 1) {
790
+ const _r1 = i0.ɵɵgetCurrentView();
791
+ i0.ɵɵelementStart(0, "div", 1);
792
+ i0.ɵɵtemplate(1, CredentialsCategoriesResourceComponent_mj_loading_1_Template, 1, 0, "mj-loading", 2)(2, CredentialsCategoriesResourceComponent_ng_container_2_Template, 33, 9, "ng-container", 3);
793
+ i0.ɵɵelementEnd();
794
+ i0.ɵɵelementStart(3, "mj-credential-category-edit-panel", 4, 0);
795
+ i0.ɵɵlistener("saved", function CredentialsCategoriesResourceComponent_Template_mj_credential_category_edit_panel_saved_3_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCategorySaved($event)); })("deleted", function CredentialsCategoriesResourceComponent_Template_mj_credential_category_edit_panel_deleted_3_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCategoryDeleted($event)); });
796
+ i0.ɵɵelementEnd();
797
+ } if (rf & 2) {
798
+ i0.ɵɵadvance();
799
+ i0.ɵɵproperty("ngIf", ctx.isLoading);
800
+ i0.ɵɵadvance();
801
+ i0.ɵɵproperty("ngIf", !ctx.isLoading);
802
+ } }, dependencies: [i2.NgForOf, i2.NgIf, i3.LoadingComponent, i4.CredentialCategoryEditPanelComponent, i2.SlicePipe], styles: [".categories-container[_ngcontent-%COMP%] {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--background-secondary, #f8fafc);\n}\n\n\n\n.categories-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 20px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.categories-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 gap: 16px;\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 color: var(--accent-color, #6366f1);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n.btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: white;\n border: none;\n border-radius: 8px;\n font-size: 13px;\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 12px rgba(99, 102, 241, 0.4);\n}\n\n.btn-primary[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n}\n\n\n\n.toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n margin-bottom: 20px;\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: 1;\n}\n\n.toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n max-width: 320px;\n}\n\n.search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-secondary, #9ca3af);\n font-size: 13px;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 36px 8px 36px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n background: var(--input-background, #f9fafb);\n transition: all 0.2s ease;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n background: white;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder {\n color: var(--text-secondary, #9ca3af);\n}\n\n.search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--button-hover, #e5e7eb);\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n transition: all 0.2s ease;\n}\n\n.search-clear[_ngcontent-%COMP%]:hover {\n background: var(--text-secondary, #9ca3af);\n color: white;\n}\n\n\n\n.btn-text[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-text[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f3f4f6);\n color: var(--text-primary, #1f2937);\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 background: transparent;\n border: none;\n border-radius: 8px;\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(--hover-background, #f3f4f6);\n color: var(--text-primary, #1f2937);\n}\n\n\n\n.categories-layout[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 380px;\n gap: 20px;\n min-height: 500px;\n}\n\n\n\n.tree-panel[_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.tree-container[_ngcontent-%COMP%] {\n max-height: calc(100vh - 300px);\n overflow-y: auto;\n}\n\n\n\n.tree-node[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.tree-node[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.tree-node[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n}\n\n.tree-node.selected[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.08) 0%, rgba(99, 102, 241, 0.04) 100%);\n border-left: 3px solid var(--accent-color, #6366f1);\n}\n\n.node-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n width: 100%;\n gap: 8px;\n}\n\n\n\n.expand-btn[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--text-secondary, #9ca3af);\n border-radius: 4px;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n background: var(--button-hover, #e5e7eb);\n color: var(--text-primary, #1f2937);\n}\n\n.expand-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.expand-placeholder[_ngcontent-%COMP%] {\n width: 24px;\n flex-shrink: 0;\n}\n\n\n\n.node-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.node-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.node-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.node-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n line-height: 1.3;\n}\n\n.node-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n.node-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.badge.types[_ngcontent-%COMP%] {\n background: rgba(99, 102, 241, 0.1);\n color: var(--accent-color, #6366f1);\n}\n\n.badge.children[_ngcontent-%COMP%] {\n background: var(--badge-background, #f3f4f6);\n color: var(--text-secondary, #6b7280);\n}\n\n.badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.node-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s ease;\n flex-shrink: 0;\n}\n\n.tree-node[_ngcontent-%COMP%]:hover .node-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--button-background, #f3f4f6);\n border: none;\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 color: white;\n}\n\n.action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.detail-panel[_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 display: flex;\n flex-direction: column;\n}\n\n.detail-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.detail-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.detail-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n}\n\n.detail-title[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.detail-title[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0;\n line-height: 1.3;\n}\n\n.level-badge[_ngcontent-%COMP%] {\n display: inline-block;\n margin-top: 4px;\n padding: 2px 8px;\n background: var(--badge-background, #f3f4f6);\n border-radius: 10px;\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n}\n\n.detail-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--button-background, #f3f4f6);\n border: none;\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #e5e7eb);\n color: var(--text-primary, #1f2937);\n}\n\n\n\n.detail-body[_ngcontent-%COMP%] {\n padding: 20px;\n flex: 1;\n overflow-y: auto;\n}\n\n\n\n.detail-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.detail-stat[_ngcontent-%COMP%] {\n background: var(--stat-background, #f9fafb);\n border-radius: 10px;\n padding: 16px;\n text-align: center;\n}\n\n.detail-stat[_ngcontent-%COMP%] .stat-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--accent-color, #6366f1);\n line-height: 1;\n}\n\n.detail-stat[_ngcontent-%COMP%] .stat-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n margin-top: 4px;\n}\n\n\n\n.description-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.description-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], \n.types-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], \n.subcategories-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--text-secondary, #6b7280);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0 0 12px 0;\n}\n\n.description-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.types-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.subcategories-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.description[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-primary, #374151);\n line-height: 1.6;\n margin: 0;\n}\n\n\n\n.types-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.type-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.type-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--item-background, #f9fafb);\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n.type-item[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f3f4f6);\n}\n\n.type-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 6px;\n flex-shrink: 0;\n}\n\n.type-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--accent-color, #6366f1);\n}\n\n.type-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.type-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #1f2937);\n}\n\n.type-desc[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n.subcategories-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.subcategory-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.subcategory-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--item-background, #f9fafb);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.subcategory-item[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f3f4f6);\n}\n\n.subcategory-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--accent-color, #6366f1);\n}\n\n.subcategory-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n}\n\n.sub-type-count[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n background: var(--badge-background, #e5e7eb);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n\n\n.detail-quick-actions[_ngcontent-%COMP%] {\n margin-top: auto;\n padding-top: 16px;\n border-top: 1px solid var(--border-color, #f3f4f6);\n display: flex;\n gap: 8px;\n}\n\n.detail-quick-actions[_ngcontent-%COMP%] .btn-secondary[_ngcontent-%COMP%], \n.detail-quick-actions[_ngcontent-%COMP%] .btn-primary[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px;\n background: var(--button-background, #f3f4f6);\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #374151);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #e5e7eb);\n}\n\n\n\n.no-selection[_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 display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n text-align: center;\n}\n\n.no-selection-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 16px;\n}\n\n.no-selection-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--text-secondary, #9ca3af);\n}\n\n.no-selection[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.no-selection[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--text-secondary, #d1d5db);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\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 20px 0;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--accent-color, #6366f1);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n\n\n@media (max-width: 1024px) {\n .categories-layout[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .detail-panel[_ngcontent-%COMP%], \n .no-selection[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n@media (max-width: 768px) {\n .categories-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .categories-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n }\n\n .toolbar-left[_ngcontent-%COMP%], \n .toolbar-right[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .search-container[_ngcontent-%COMP%] {\n max-width: none;\n }\n\n .toolbar-right[_ngcontent-%COMP%] {\n justify-content: flex-end;\n }\n}"], changeDetection: 0 });
803
+ };
804
+ CredentialsCategoriesResourceComponent = __decorate([
805
+ RegisterClass(BaseResourceComponent, 'CredentialsCategoriesResource')
806
+ ], CredentialsCategoriesResourceComponent);
807
+ export { CredentialsCategoriesResourceComponent };
808
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialsCategoriesResourceComponent, [{
809
+ type: Component,
810
+ args: [{ selector: 'mj-credentials-categories-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"categories-container\">\n <mj-loading *ngIf=\"isLoading\" text=\"Loading categories...\"></mj-loading>\n\n <ng-container *ngIf=\"!isLoading\">\n <!-- Header -->\n <div class=\"categories-header\">\n <div class=\"header-info\">\n <h2 class=\"categories-title\">Categories</h2>\n <div class=\"header-stats\">\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n {{categories.length}} categories\n </span>\n <span class=\"stat-item\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{getTotalTypeCount()}} types\n </span>\n </div>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-primary\" *ngIf=\"UserCanCreate\" (click)=\"createNewCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Category</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 categories...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n <button class=\"search-clear\" *ngIf=\"searchText\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"toolbar-right\">\n <button class=\"btn-text\" (click)=\"expandAll()\" title=\"Expand All\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n <button class=\"btn-text\" (click)=\"collapseAll()\" title=\"Collapse All\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"categories-layout\">\n <!-- Tree Container -->\n <div class=\"tree-panel\">\n <div class=\"tree-container\" *ngIf=\"categoryTree.length > 0\">\n <div\n class=\"tree-node\"\n *ngFor=\"let node of getFlattenedNodes(); let i = index\"\n [class.selected]=\"selectedNode?.category?.ID === node.category.ID\"\n [style.padding-left.px]=\"12 + (node.level * 20)\"\n (click)=\"selectNode(node)\"\n >\n <div class=\"node-content\">\n <button\n class=\"expand-btn\"\n *ngIf=\"node.children.length > 0\"\n (click)=\"toggleExpand(node, $event)\"\n >\n <i [class]=\"node.expanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n </button>\n <span class=\"expand-placeholder\" *ngIf=\"node.children.length === 0\"></span>\n\n <div class=\"node-icon\" [style.backgroundColor]=\"getCategoryColor(i) + '15'\" [style.color]=\"getCategoryColor(i)\">\n <i [class]=\"node.category.IconClass || 'fa-solid fa-folder'\"></i>\n </div>\n\n <div class=\"node-info\">\n <div class=\"node-name\">{{node.category.Name}}</div>\n <div class=\"node-description\" *ngIf=\"node.category.Description\">\n {{node.category.Description | slice:0:50}}{{node.category.Description.length > 50 ? '...' : ''}}\n </div>\n </div>\n\n <div class=\"node-badges\">\n <span class=\"badge types\" *ngIf=\"node.typeCount > 0\">\n <i class=\"fa-solid fa-shapes\"></i>\n {{node.typeCount}}\n </span>\n <span class=\"badge children\" *ngIf=\"node.children.length > 0\">\n <i class=\"fa-solid fa-folder\"></i>\n {{node.children.length}}\n </span>\n </div>\n\n <div class=\"node-actions\">\n <button\n class=\"action-btn\"\n *ngIf=\"UserCanUpdate\"\n (click)=\"editCategory(node, $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 && node.children.length === 0 && node.typeCount === 0\"\n (click)=\"deleteCategory(node, $event)\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"empty-state\" *ngIf=\"categoryTree.length === 0\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Categories</h3>\n <p *ngIf=\"searchText\">\n No categories match your search.\n <button class=\"btn-link\" (click)=\"clearSearch()\">Clear search</button>\n </p>\n <p *ngIf=\"!searchText\">\n Get started by creating your first category.\n </p>\n <button class=\"btn-primary\" *ngIf=\"UserCanCreate && !searchText\" (click)=\"createNewCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Category\n </button>\n </div>\n </div>\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" *ngIf=\"selectedNode\">\n <div class=\"detail-header\">\n <div class=\"detail-icon\" [style.backgroundColor]=\"getCategoryColor(0) + '15'\" [style.color]=\"getCategoryColor(0)\">\n <i [class]=\"selectedNode.category.IconClass || 'fa-solid fa-folder'\"></i>\n </div>\n <div class=\"detail-title\">\n <h2>{{selectedNode.category.Name}}</h2>\n <span class=\"level-badge\" *ngIf=\"selectedNode.level > 0\">\n Level {{selectedNode.level + 1}}\n </span>\n </div>\n <div class=\"detail-actions\">\n <button class=\"action-btn\" *ngIf=\"UserCanUpdate\" (click)=\"editCategory(selectedNode)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button class=\"close-btn\" (click)=\"selectedNode = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"detail-body\">\n <!-- Stats -->\n <div class=\"detail-stats\">\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedNode.typeCount}}</div>\n <div class=\"stat-label\">Credential Types</div>\n </div>\n <div class=\"detail-stat\">\n <div class=\"stat-value\">{{selectedNode.children.length}}</div>\n <div class=\"stat-label\">Subcategories</div>\n </div>\n </div>\n\n <!-- Description -->\n <div class=\"description-section\" *ngIf=\"selectedNode.category.Description\">\n <h3>\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h3>\n <p class=\"description\">{{selectedNode.category.Description}}</p>\n </div>\n\n <!-- Types in Category -->\n <div class=\"types-section\" *ngIf=\"selectedNode.typeCount > 0\">\n <h3>\n <i class=\"fa-solid fa-shapes\"></i>\n Credential Types\n </h3>\n <div class=\"type-list\">\n <div class=\"type-item\" *ngFor=\"let type of getTypesForCategory(selectedNode.category.Name)\">\n <div class=\"type-icon\">\n <i [class]=\"type.IconClass || 'fa-solid fa-key'\"></i>\n </div>\n <div class=\"type-info\">\n <div class=\"type-name\">{{type.Name}}</div>\n <div class=\"type-desc\" *ngIf=\"type.Description\">{{type.Description | slice:0:60}}</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Subcategories -->\n <div class=\"subcategories-section\" *ngIf=\"selectedNode.children.length > 0\">\n <h3>\n <i class=\"fa-solid fa-folder-tree\"></i>\n Subcategories\n </h3>\n <div class=\"subcategory-list\">\n <div class=\"subcategory-item\" *ngFor=\"let child of selectedNode.children\" (click)=\"selectNode(child)\">\n <i [class]=\"child.category.IconClass || 'fa-solid fa-folder'\"></i>\n <span>{{child.category.Name}}</span>\n <span class=\"sub-type-count\" *ngIf=\"child.typeCount > 0\">{{child.typeCount}} types</span>\n </div>\n </div>\n </div>\n\n <!-- Quick Actions -->\n <div class=\"detail-quick-actions\">\n <button\n class=\"btn-secondary\"\n *ngIf=\"selectedNode.typeCount > 0\"\n (click)=\"viewTypesForCategory(selectedNode.category.Name)\"\n >\n <i class=\"fa-solid fa-shapes\"></i>\n View Types\n </button>\n <button\n class=\"btn-primary\"\n (click)=\"createCredentialWithCategory(selectedNode.category.ID)\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create Credential\n </button>\n </div>\n\n </div>\n </div>\n\n <!-- No Selection -->\n <div class=\"no-selection\" *ngIf=\"!selectedNode && categoryTree.length > 0\">\n <div class=\"no-selection-icon\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n </div>\n <h3>Select a Category</h3>\n <p>Click on a category to view its details and credential types</p>\n </div>\n </div>\n </ng-container>\n</div>\n\n<!-- Category Edit Panel -->\n<mj-credential-category-edit-panel\n #categoryEditPanel\n (saved)=\"onCategorySaved($any($event))\"\n (deleted)=\"onCategoryDeleted($any($event))\"\n></mj-credential-category-edit-panel>\n", styles: [".categories-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--background-secondary, #f8fafc);\n}\n\n/* Header */\n.categories-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 20px;\n}\n\n.header-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.categories-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 gap: 16px;\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 color: var(--accent-color, #6366f1);\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n/* Primary Button */\n.btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);\n color: white;\n border: none;\n border-radius: 8px;\n font-size: 13px;\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 12px rgba(99, 102, 241, 0.4);\n}\n\n.btn-primary:active {\n transform: translateY(0);\n}\n\n/* Toolbar */\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n margin-bottom: 20px;\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: 1;\n}\n\n.toolbar-right {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Search */\n.search-container {\n position: relative;\n flex: 1;\n max-width: 320px;\n}\n\n.search-container i.fa-search {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-secondary, #9ca3af);\n font-size: 13px;\n}\n\n.search-container input {\n width: 100%;\n padding: 8px 36px 8px 36px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n background: var(--input-background, #f9fafb);\n transition: all 0.2s ease;\n}\n\n.search-container input:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n background: white;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.search-container input::placeholder {\n color: var(--text-secondary, #9ca3af);\n}\n\n.search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--button-hover, #e5e7eb);\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n transition: all 0.2s ease;\n}\n\n.search-clear:hover {\n background: var(--text-secondary, #9ca3af);\n color: white;\n}\n\n/* Toolbar Buttons */\n.btn-text {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-text:hover {\n background: var(--hover-background, #f3f4f6);\n color: var(--text-primary, #1f2937);\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon:hover {\n background: var(--hover-background, #f3f4f6);\n color: var(--text-primary, #1f2937);\n}\n\n/* Layout */\n.categories-layout {\n display: grid;\n grid-template-columns: 1fr 380px;\n gap: 20px;\n min-height: 500px;\n}\n\n/* Tree Panel */\n.tree-panel {\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.tree-container {\n max-height: calc(100vh - 300px);\n overflow-y: auto;\n}\n\n/* Tree Node */\n.tree-node {\n display: flex;\n align-items: center;\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.tree-node:last-child {\n border-bottom: none;\n}\n\n.tree-node:hover {\n background: var(--hover-background, #f9fafb);\n}\n\n.tree-node.selected {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.08) 0%, rgba(99, 102, 241, 0.04) 100%);\n border-left: 3px solid var(--accent-color, #6366f1);\n}\n\n.node-content {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n width: 100%;\n gap: 8px;\n}\n\n/* Expand Button */\n.expand-btn {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--text-secondary, #9ca3af);\n border-radius: 4px;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.expand-btn:hover {\n background: var(--button-hover, #e5e7eb);\n color: var(--text-primary, #1f2937);\n}\n\n.expand-btn i {\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.expand-placeholder {\n width: 24px;\n flex-shrink: 0;\n}\n\n/* Node Icon */\n.node-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.node-icon i {\n font-size: 14px;\n}\n\n/* Node Info */\n.node-info {\n flex: 1;\n min-width: 0;\n}\n\n.node-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--text-primary, #1f2937);\n line-height: 1.3;\n}\n\n.node-description {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Node Badges */\n.node-badges {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.badge {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 500;\n}\n\n.badge.types {\n background: rgba(99, 102, 241, 0.1);\n color: var(--accent-color, #6366f1);\n}\n\n.badge.children {\n background: var(--badge-background, #f3f4f6);\n color: var(--text-secondary, #6b7280);\n}\n\n.badge i {\n font-size: 10px;\n}\n\n/* Node Actions */\n.node-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s ease;\n flex-shrink: 0;\n}\n\n.tree-node:hover .node-actions {\n opacity: 1;\n}\n\n.action-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--button-background, #f3f4f6);\n border: none;\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 color: white;\n}\n\n.action-btn i {\n font-size: 12px;\n}\n\n/* Detail Panel */\n.detail-panel {\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 display: flex;\n flex-direction: column;\n}\n\n.detail-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.detail-icon {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.detail-icon i {\n font-size: 20px;\n}\n\n.detail-title {\n flex: 1;\n min-width: 0;\n}\n\n.detail-title h2 {\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0;\n line-height: 1.3;\n}\n\n.level-badge {\n display: inline-block;\n margin-top: 4px;\n padding: 2px 8px;\n background: var(--badge-background, #f3f4f6);\n border-radius: 10px;\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n}\n\n.detail-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n.close-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--button-background, #f3f4f6);\n border: none;\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.close-btn:hover {\n background: var(--hover-background, #e5e7eb);\n color: var(--text-primary, #1f2937);\n}\n\n/* Detail Body */\n.detail-body {\n padding: 20px;\n flex: 1;\n overflow-y: auto;\n}\n\n/* Detail Stats */\n.detail-stats {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.detail-stat {\n background: var(--stat-background, #f9fafb);\n border-radius: 10px;\n padding: 16px;\n text-align: center;\n}\n\n.detail-stat .stat-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--accent-color, #6366f1);\n line-height: 1;\n}\n\n.detail-stat .stat-label {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n margin-top: 4px;\n}\n\n/* Description Section */\n.description-section {\n margin-bottom: 20px;\n}\n\n.description-section h3,\n.types-section h3,\n.subcategories-section h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--text-secondary, #6b7280);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin: 0 0 12px 0;\n}\n\n.description-section h3 i,\n.types-section h3 i,\n.subcategories-section h3 i {\n font-size: 12px;\n}\n\n.description {\n font-size: 14px;\n color: var(--text-primary, #374151);\n line-height: 1.6;\n margin: 0;\n}\n\n/* Types Section */\n.types-section {\n margin-bottom: 20px;\n}\n\n.type-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.type-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--item-background, #f9fafb);\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n.type-item:hover {\n background: var(--hover-background, #f3f4f6);\n}\n\n.type-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 6px;\n flex-shrink: 0;\n}\n\n.type-icon i {\n font-size: 12px;\n color: var(--accent-color, #6366f1);\n}\n\n.type-info {\n flex: 1;\n min-width: 0;\n}\n\n.type-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #1f2937);\n}\n\n.type-desc {\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Subcategories Section */\n.subcategories-section {\n margin-bottom: 20px;\n}\n\n.subcategory-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.subcategory-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--item-background, #f9fafb);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.subcategory-item:hover {\n background: var(--hover-background, #f3f4f6);\n}\n\n.subcategory-item i {\n font-size: 14px;\n color: var(--accent-color, #6366f1);\n}\n\n.subcategory-item span {\n flex: 1;\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n}\n\n.sub-type-count {\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n background: var(--badge-background, #e5e7eb);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n/* Quick Actions */\n.detail-quick-actions {\n margin-top: auto;\n padding-top: 16px;\n border-top: 1px solid var(--border-color, #f3f4f6);\n display: flex;\n gap: 8px;\n}\n\n.detail-quick-actions .btn-secondary,\n.detail-quick-actions .btn-primary {\n flex: 1;\n}\n\n.btn-secondary {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px;\n background: var(--button-background, #f3f4f6);\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #374151);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary:hover {\n background: var(--hover-background, #e5e7eb);\n}\n\n/* No Selection State */\n.no-selection {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n text-align: center;\n}\n\n.no-selection-icon {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 16px;\n}\n\n.no-selection-icon i {\n font-size: 24px;\n color: var(--text-secondary, #9ca3af);\n}\n\n.no-selection h3 {\n font-size: 16px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.no-selection p {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 32px;\n color: var(--text-secondary, #d1d5db);\n}\n\n.empty-state h3 {\n font-size: 18px;\n font-weight: 600;\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 20px 0;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--accent-color, #6366f1);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n/* Responsive */\n@media (max-width: 1024px) {\n .categories-layout {\n grid-template-columns: 1fr;\n }\n\n .detail-panel,\n .no-selection {\n display: none;\n }\n}\n\n@media (max-width: 768px) {\n .categories-container {\n padding: 16px;\n }\n\n .categories-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .toolbar {\n flex-direction: column;\n gap: 12px;\n }\n\n .toolbar-left,\n .toolbar-right {\n width: 100%;\n }\n\n .search-container {\n max-width: none;\n }\n\n .toolbar-right {\n justify-content: flex-end;\n }\n}\n"] }]
811
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.NavigationService }], { categoryEditPanel: [{
812
+ type: ViewChild,
813
+ args: ['categoryEditPanel']
814
+ }] }); })();
815
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsCategoriesResourceComponent, { className: "CredentialsCategoriesResourceComponent", filePath: "src/Credentials/components/credentials-categories-resource.component.ts", lineNumber: 28 }); })();
816
+ //# sourceMappingURL=credentials-categories-resource.component.js.map