@memberjunction/ng-dashboards 5.0.0 → 5.1.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 (231) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +1 -1
  2. package/dist/AI/components/agents/agent-editor.component.js +1 -1
  3. package/dist/AI/components/agents/agent-filter-panel.component.js +1 -1
  4. package/dist/AI/components/charts/performance-heatmap.component.js +1 -1
  5. package/dist/AI/components/charts/time-series-chart.component.js +1 -1
  6. package/dist/AI/components/execution-monitoring.component.js +1 -1
  7. package/dist/AI/components/models/model-management.component.js +1 -1
  8. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +1 -1
  9. package/dist/AI/components/prompts/prompt-filter-panel.component.js +1 -1
  10. package/dist/AI/components/prompts/prompt-management.component.js +1 -1
  11. package/dist/AI/components/prompts/prompt-version-control.component.js +1 -1
  12. package/dist/AI/components/system/system-config-filter-panel.component.js +1 -1
  13. package/dist/AI/components/system/system-configuration.component.js +1 -1
  14. package/dist/AI/components/widgets/kpi-card.component.js +1 -1
  15. package/dist/AI/components/widgets/live-execution-widget.component.js +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.js +1 -1
  17. package/dist/APIKeys/api-key-create-dialog.component.js +1 -1
  18. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  19. package/dist/APIKeys/api-key-list.component.js +1 -1
  20. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  21. package/dist/APIKeys/api-scopes-panel.component.js +1 -1
  22. package/dist/APIKeys/api-usage-panel.component.js +1 -1
  23. package/dist/Actions/components/actions-list-view.component.js +1 -1
  24. package/dist/Actions/components/actions-overview.component.js +1 -1
  25. package/dist/Actions/components/categories-list-view.component.js +1 -1
  26. package/dist/Actions/components/code-management.component.js +1 -1
  27. package/dist/Actions/components/entity-integration.component.js +1 -1
  28. package/dist/Actions/components/execution-monitoring.component.js +1 -1
  29. package/dist/Actions/components/executions-list-view.component.js +1 -1
  30. package/dist/Actions/components/explorer/action-breadcrumb.component.js +1 -1
  31. package/dist/Actions/components/explorer/action-card.component.js +1 -1
  32. package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
  33. package/dist/Actions/components/explorer/action-list-item.component.js +1 -1
  34. package/dist/Actions/components/explorer/action-toolbar.component.js +1 -1
  35. package/dist/Actions/components/explorer/action-tree-panel.component.js +1 -1
  36. package/dist/Actions/components/explorer/new-action-panel.component.js +1 -1
  37. package/dist/Actions/components/explorer/new-category-panel.component.js +1 -1
  38. package/dist/Actions/components/scheduled-actions.component.js +1 -1
  39. package/dist/Actions/components/security-permissions.component.js +1 -1
  40. package/dist/Communication/communication-dashboard.component.js +1 -1
  41. package/dist/Communication/communication-logs-resource.component.js +1 -1
  42. package/dist/Communication/communication-monitor-resource.component.js +1 -1
  43. package/dist/Communication/communication-providers-resource.component.js +1 -1
  44. package/dist/Communication/communication-runs-resource.component.js +1 -1
  45. package/dist/Communication/communication-templates-resource.component.js +1 -1
  46. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -1
  47. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +1 -1
  48. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
  49. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -1
  50. package/dist/ComponentStudio/components/browser/component-browser.component.js +1 -1
  51. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +1 -1
  52. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +1 -1
  53. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +1 -1
  54. package/dist/ComponentStudio/components/editors/spec-editor.component.js +1 -1
  55. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +1 -1
  56. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +1 -1
  57. package/dist/ComponentStudio/components/text-import-dialog.component.js +1 -1
  58. package/dist/ComponentStudio/components/workspace/component-preview.component.js +1 -1
  59. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +1 -1
  60. package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
  61. package/dist/Credentials/components/credentials-categories-resource.component.js +1 -1
  62. package/dist/Credentials/components/credentials-list-resource.component.js +1 -1
  63. package/dist/Credentials/components/credentials-overview-resource.component.js +1 -1
  64. package/dist/Credentials/components/credentials-types-resource.component.js +1 -1
  65. package/dist/Credentials/credentials-dashboard.component.js +1 -1
  66. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +1 -1
  67. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +1 -1
  68. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +1 -1
  69. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +1 -1
  70. package/dist/DataExplorer/components/view-selector/view-selector.component.js +1 -1
  71. package/dist/DataExplorer/data-explorer-dashboard.component.js +1 -1
  72. package/dist/DataExplorer/data-explorer-resource.component.js +1 -1
  73. package/dist/EntityAdmin/entity-admin-dashboard.component.js +1 -1
  74. package/dist/Home/home-dashboard.component.js +1 -1
  75. package/dist/Lists/components/lists-browse-resource.component.js +1 -1
  76. package/dist/Lists/components/lists-categories-resource.component.js +1 -1
  77. package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
  78. package/dist/Lists/components/lists-operations-resource.component.js +1 -1
  79. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +1 -1
  80. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  81. package/dist/MCP/components/mcp-log-detail-panel.component.js +1 -1
  82. package/dist/MCP/components/mcp-server-dialog.component.js +1 -1
  83. package/dist/MCP/components/mcp-test-tool-dialog.component.js +1 -1
  84. package/dist/MCP/mcp-dashboard.component.js +1 -1
  85. package/dist/MCP/mcp-filter-panel.component.js +1 -1
  86. package/dist/MCP/mcp-resource.component.js +1 -1
  87. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  88. package/dist/Scheduling/components/job-slideout.component.js +1 -1
  89. package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -1
  90. package/dist/Scheduling/components/scheduling-activity.component.js +1 -1
  91. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -1
  92. package/dist/Scheduling/components/scheduling-jobs.component.js +1 -1
  93. package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -1
  94. package/dist/Scheduling/components/scheduling-overview.component.js +1 -1
  95. package/dist/Scheduling/scheduling-dashboard.component.js +1 -1
  96. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -1
  97. package/dist/Testing/components/testing-analytics-resource.component.js +1 -1
  98. package/dist/Testing/components/testing-analytics.component.js +1 -1
  99. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  100. package/dist/Testing/components/testing-dashboard-tab.component.js +1 -1
  101. package/dist/Testing/components/testing-explorer-resource.component.js +1 -1
  102. package/dist/Testing/components/testing-explorer.component.js +1 -1
  103. package/dist/Testing/components/testing-review-resource.component.js +1 -1
  104. package/dist/Testing/components/testing-review.component.js +1 -1
  105. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  106. package/dist/Testing/components/testing-runs.component.js +1 -1
  107. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +1 -1
  108. package/dist/Testing/components/widgets/suite-tree.component.js +2 -2
  109. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +1 -1
  110. package/dist/Testing/testing-dashboard.component.js +1 -1
  111. package/dist/VersionHistory/components/diff-resource.component.js +1 -1
  112. package/dist/VersionHistory/components/graph-resource.component.js +1 -1
  113. package/dist/VersionHistory/components/labels-resource.component.js +1 -1
  114. package/dist/VersionHistory/components/restore-resource.component.js +1 -1
  115. package/package.json +38 -38
  116. package/dist/AI/ai-dashboard.component.d.ts +0 -62
  117. package/dist/AI/ai-dashboard.component.d.ts.map +0 -1
  118. package/dist/AI/ai-dashboard.component.js +0 -338
  119. package/dist/AI/ai-dashboard.component.js.map +0 -1
  120. package/dist/AI/components/models/model-management-v2.component.d.ts +0 -96
  121. package/dist/AI/components/models/model-management-v2.component.d.ts.map +0 -1
  122. package/dist/AI/components/models/model-management-v2.component.js +0 -981
  123. package/dist/AI/components/models/model-management-v2.component.js.map +0 -1
  124. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts +0 -97
  125. package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +0 -1
  126. package/dist/AI/components/prompts/prompt-management-v2.component.js +0 -811
  127. package/dist/AI/components/prompts/prompt-management-v2.component.js.map +0 -1
  128. package/dist/Actions/actions-management-dashboard.component.d.ts +0 -52
  129. package/dist/Actions/actions-management-dashboard.component.d.ts.map +0 -1
  130. package/dist/Actions/actions-management-dashboard.component.js +0 -308
  131. package/dist/Actions/actions-management-dashboard.component.js.map +0 -1
  132. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +0 -44
  133. package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +0 -1
  134. package/dist/Credentials/components/credential-category-edit-panel.component.js +0 -456
  135. package/dist/Credentials/components/credential-category-edit-panel.component.js.map +0 -1
  136. package/dist/Credentials/components/credential-edit-panel.component.d.ts +0 -70
  137. package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +0 -1
  138. package/dist/Credentials/components/credential-edit-panel.component.js +0 -694
  139. package/dist/Credentials/components/credential-edit-panel.component.js.map +0 -1
  140. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +0 -56
  141. package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +0 -1
  142. package/dist/Credentials/components/credential-type-edit-panel.component.js +0 -563
  143. package/dist/Credentials/components/credential-type-edit-panel.component.js.map +0 -1
  144. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +0 -245
  145. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +0 -1
  146. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +0 -1143
  147. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +0 -1
  148. package/dist/EntityAdmin/components/entity-details.component.d.ts +0 -50
  149. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +0 -1
  150. package/dist/EntityAdmin/components/entity-details.component.js +0 -680
  151. package/dist/EntityAdmin/components/entity-details.component.js.map +0 -1
  152. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +0 -31
  153. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +0 -1
  154. package/dist/EntityAdmin/components/entity-filter-panel.component.js +0 -160
  155. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +0 -1
  156. package/dist/EntityAdmin/components/erd-composite.component.d.ts +0 -73
  157. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +0 -1
  158. package/dist/EntityAdmin/components/erd-composite.component.js +0 -271
  159. package/dist/EntityAdmin/components/erd-composite.component.js.map +0 -1
  160. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +0 -47
  161. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +0 -1
  162. package/dist/EntityAdmin/components/erd-diagram.component.js +0 -618
  163. package/dist/EntityAdmin/components/erd-diagram.component.js.map +0 -1
  164. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts +0 -20
  165. package/dist/Scheduling/components/scheduling-health-resource.component.d.ts.map +0 -1
  166. package/dist/Scheduling/components/scheduling-health-resource.component.js +0 -55
  167. package/dist/Scheduling/components/scheduling-health-resource.component.js.map +0 -1
  168. package/dist/Scheduling/components/scheduling-health.component.d.ts +0 -30
  169. package/dist/Scheduling/components/scheduling-health.component.d.ts.map +0 -1
  170. package/dist/Scheduling/components/scheduling-health.component.js +0 -315
  171. package/dist/Scheduling/components/scheduling-health.component.js.map +0 -1
  172. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts +0 -20
  173. package/dist/Scheduling/components/scheduling-history-resource.component.d.ts.map +0 -1
  174. package/dist/Scheduling/components/scheduling-history-resource.component.js +0 -55
  175. package/dist/Scheduling/components/scheduling-history-resource.component.js.map +0 -1
  176. package/dist/Scheduling/components/scheduling-history.component.d.ts +0 -48
  177. package/dist/Scheduling/components/scheduling-history.component.d.ts.map +0 -1
  178. package/dist/Scheduling/components/scheduling-history.component.js +0 -377
  179. package/dist/Scheduling/components/scheduling-history.component.js.map +0 -1
  180. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts +0 -20
  181. package/dist/Scheduling/components/scheduling-monitor-resource.component.d.ts.map +0 -1
  182. package/dist/Scheduling/components/scheduling-monitor-resource.component.js +0 -55
  183. package/dist/Scheduling/components/scheduling-monitor-resource.component.js.map +0 -1
  184. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts +0 -37
  185. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts.map +0 -1
  186. package/dist/Scheduling/components/scheduling-monitoring.component.js +0 -488
  187. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +0 -1
  188. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts +0 -20
  189. package/dist/Scheduling/components/scheduling-types-resource.component.d.ts.map +0 -1
  190. package/dist/Scheduling/components/scheduling-types-resource.component.js +0 -55
  191. package/dist/Scheduling/components/scheduling-types-resource.component.js.map +0 -1
  192. package/dist/Scheduling/components/scheduling-types.component.d.ts +0 -22
  193. package/dist/Scheduling/components/scheduling-types.component.d.ts.map +0 -1
  194. package/dist/Scheduling/components/scheduling-types.component.js +0 -165
  195. package/dist/Scheduling/components/scheduling-types.component.js.map +0 -1
  196. package/dist/Testing/components/testing-execution-resource.component.d.ts +0 -20
  197. package/dist/Testing/components/testing-execution-resource.component.d.ts.map +0 -1
  198. package/dist/Testing/components/testing-execution-resource.component.js +0 -55
  199. package/dist/Testing/components/testing-execution-resource.component.js.map +0 -1
  200. package/dist/Testing/components/testing-execution.component.d.ts +0 -71
  201. package/dist/Testing/components/testing-execution.component.d.ts.map +0 -1
  202. package/dist/Testing/components/testing-execution.component.js +0 -845
  203. package/dist/Testing/components/testing-execution.component.js.map +0 -1
  204. package/dist/Testing/components/testing-feedback-resource.component.d.ts +0 -20
  205. package/dist/Testing/components/testing-feedback-resource.component.d.ts.map +0 -1
  206. package/dist/Testing/components/testing-feedback-resource.component.js +0 -55
  207. package/dist/Testing/components/testing-feedback-resource.component.js.map +0 -1
  208. package/dist/Testing/components/testing-feedback.component.d.ts +0 -111
  209. package/dist/Testing/components/testing-feedback.component.d.ts.map +0 -1
  210. package/dist/Testing/components/testing-feedback.component.js +0 -1486
  211. package/dist/Testing/components/testing-feedback.component.js.map +0 -1
  212. package/dist/Testing/components/testing-overview-resource.component.d.ts +0 -20
  213. package/dist/Testing/components/testing-overview-resource.component.d.ts.map +0 -1
  214. package/dist/Testing/components/testing-overview-resource.component.js +0 -55
  215. package/dist/Testing/components/testing-overview-resource.component.js.map +0 -1
  216. package/dist/Testing/components/testing-overview.component.d.ts +0 -30
  217. package/dist/Testing/components/testing-overview.component.d.ts.map +0 -1
  218. package/dist/Testing/components/testing-overview.component.js +0 -361
  219. package/dist/Testing/components/testing-overview.component.js.map +0 -1
  220. package/dist/Testing/components/testing-version-comparison.component.d.ts +0 -62
  221. package/dist/Testing/components/testing-version-comparison.component.d.ts.map +0 -1
  222. package/dist/Testing/components/testing-version-comparison.component.js +0 -815
  223. package/dist/Testing/components/testing-version-comparison.component.js.map +0 -1
  224. package/dist/Testing/components/testing-version-resource.component.d.ts +0 -20
  225. package/dist/Testing/components/testing-version-resource.component.d.ts.map +0 -1
  226. package/dist/Testing/components/testing-version-resource.component.js +0 -55
  227. package/dist/Testing/components/testing-version-resource.component.js.map +0 -1
  228. package/dist/generic/base-dashboard.d.ts +0 -65
  229. package/dist/generic/base-dashboard.d.ts.map +0 -1
  230. package/dist/generic/base-dashboard.js +0 -74
  231. package/dist/generic/base-dashboard.js.map +0 -1
@@ -1,563 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
- import { Metadata } from '@memberjunction/core';
3
- import { MJNotificationService } from '@memberjunction/ng-notifications';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/forms";
7
- import * as i3 from "@memberjunction/ng-shared-generic";
8
- function CredentialTypeEditPanelComponent_div_0_mj_loading_14_Template(rf, ctx) { if (rf & 1) {
9
- i0.ɵɵelement(0, "mj-loading", 21);
10
- } }
11
- function CredentialTypeEditPanelComponent_div_0_form_15_button_13_Template(rf, ctx) { if (rf & 1) {
12
- const _r4 = i0.ɵɵgetCurrentView();
13
- i0.ɵɵelementStart(0, "button", 46);
14
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_form_15_button_13_Template_button_click_0_listener() { const cat_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.category = cat_r5); });
15
- i0.ɵɵelement(1, "i");
16
- i0.ɵɵelementStart(2, "span");
17
- i0.ɵɵtext(3);
18
- i0.ɵɵelementEnd()();
19
- } if (rf & 2) {
20
- const cat_r5 = ctx.$implicit;
21
- const ctx_r1 = i0.ɵɵnextContext(3);
22
- i0.ɵɵstyleProp("--cat-color", ctx_r1.getCategoryColor(cat_r5));
23
- i0.ɵɵclassProp("selected", ctx_r1.category === cat_r5);
24
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
25
- i0.ɵɵadvance();
26
- i0.ɵɵclassMap(ctx_r1.getCategoryIcon(cat_r5));
27
- i0.ɵɵadvance(2);
28
- i0.ɵɵtextInterpolate(cat_r5);
29
- } }
30
- function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template(rf, ctx) { if (rf & 1) {
31
- const _r6 = i0.ɵɵgetCurrentView();
32
- i0.ɵɵelementStart(0, "div", 49)(1, "div", 50)(2, "button", 51);
33
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_button_click_2_listener() { const i_r7 = i0.ɵɵrestoreView(_r6).index; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.moveFieldUp(i_r7)); });
34
- i0.ɵɵelement(3, "i", 52);
35
- i0.ɵɵelementEnd();
36
- i0.ɵɵelementStart(4, "button", 51);
37
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_button_click_4_listener() { const i_r7 = i0.ɵɵrestoreView(_r6).index; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.moveFieldDown(i_r7)); });
38
- i0.ɵɵelement(5, "i", 53);
39
- i0.ɵɵelementEnd()();
40
- i0.ɵɵelementStart(6, "div", 54)(7, "div", 55)(8, "input", 56);
41
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_input_ngModelChange_8_listener($event) { const field_r8 = i0.ɵɵrestoreView(_r6).$implicit; i0.ɵɵtwoWayBindingSet(field_r8.name, $event) || (field_r8.name = $event); return i0.ɵɵresetView($event); });
42
- i0.ɵɵelementEnd();
43
- i0.ɵɵelementStart(9, "input", 57);
44
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_input_ngModelChange_9_listener($event) { const field_r8 = i0.ɵɵrestoreView(_r6).$implicit; i0.ɵɵtwoWayBindingSet(field_r8.title, $event) || (field_r8.title = $event); return i0.ɵɵresetView($event); });
45
- i0.ɵɵelementEnd();
46
- i0.ɵɵelementStart(10, "select", 58);
47
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_select_ngModelChange_10_listener($event) { const field_r8 = i0.ɵɵrestoreView(_r6).$implicit; i0.ɵɵtwoWayBindingSet(field_r8.type, $event) || (field_r8.type = $event); return i0.ɵɵresetView($event); });
48
- i0.ɵɵelementStart(11, "option", 59);
49
- i0.ɵɵtext(12, "String");
50
- i0.ɵɵelementEnd();
51
- i0.ɵɵelementStart(13, "option", 60);
52
- i0.ɵɵtext(14, "Number");
53
- i0.ɵɵelementEnd();
54
- i0.ɵɵelementStart(15, "option", 61);
55
- i0.ɵɵtext(16, "Boolean");
56
- i0.ɵɵelementEnd()()();
57
- i0.ɵɵelementStart(17, "div", 55)(18, "input", 62);
58
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_input_ngModelChange_18_listener($event) { const field_r8 = i0.ɵɵrestoreView(_r6).$implicit; i0.ɵɵtwoWayBindingSet(field_r8.description, $event) || (field_r8.description = $event); return i0.ɵɵresetView($event); });
59
- i0.ɵɵelementEnd()();
60
- i0.ɵɵelementStart(19, "div", 63)(20, "label", 64)(21, "input", 65);
61
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_input_ngModelChange_21_listener($event) { const field_r8 = i0.ɵɵrestoreView(_r6).$implicit; i0.ɵɵtwoWayBindingSet(field_r8.required, $event) || (field_r8.required = $event); return i0.ɵɵresetView($event); });
62
- i0.ɵɵelementEnd();
63
- i0.ɵɵelementStart(22, "span");
64
- i0.ɵɵtext(23, "Required");
65
- i0.ɵɵelementEnd()();
66
- i0.ɵɵelementStart(24, "label", 64)(25, "input", 65);
67
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_input_ngModelChange_25_listener($event) { const field_r8 = i0.ɵɵrestoreView(_r6).$implicit; i0.ɵɵtwoWayBindingSet(field_r8.isSecret, $event) || (field_r8.isSecret = $event); return i0.ɵɵresetView($event); });
68
- i0.ɵɵelementEnd();
69
- i0.ɵɵelementStart(26, "span");
70
- i0.ɵɵelement(27, "i", 66);
71
- i0.ɵɵtext(28, " Secret");
72
- i0.ɵɵelementEnd()()()();
73
- i0.ɵɵelementStart(29, "button", 67);
74
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template_button_click_29_listener() { const i_r7 = i0.ɵɵrestoreView(_r6).index; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.removeSchemaField(i_r7)); });
75
- i0.ɵɵelement(30, "i", 68);
76
- i0.ɵɵelementEnd()();
77
- } if (rf & 2) {
78
- const field_r8 = ctx.$implicit;
79
- const i_r7 = ctx.index;
80
- const ctx_r1 = i0.ɵɵnextContext(4);
81
- i0.ɵɵadvance(2);
82
- i0.ɵɵproperty("disabled", i_r7 === 0 || ctx_r1.isSaving);
83
- i0.ɵɵadvance(2);
84
- i0.ɵɵproperty("disabled", i_r7 === ctx_r1.schemaFields.length - 1 || ctx_r1.isSaving);
85
- i0.ɵɵadvance(4);
86
- i0.ɵɵproperty("name", "fieldName_" + i_r7);
87
- i0.ɵɵtwoWayProperty("ngModel", field_r8.name);
88
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
89
- i0.ɵɵadvance();
90
- i0.ɵɵproperty("name", "fieldTitle_" + i_r7);
91
- i0.ɵɵtwoWayProperty("ngModel", field_r8.title);
92
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
93
- i0.ɵɵadvance();
94
- i0.ɵɵproperty("name", "fieldType_" + i_r7);
95
- i0.ɵɵtwoWayProperty("ngModel", field_r8.type);
96
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
97
- i0.ɵɵadvance(8);
98
- i0.ɵɵproperty("name", "fieldDesc_" + i_r7);
99
- i0.ɵɵtwoWayProperty("ngModel", field_r8.description);
100
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
101
- i0.ɵɵadvance(3);
102
- i0.ɵɵproperty("name", "fieldRequired_" + i_r7);
103
- i0.ɵɵtwoWayProperty("ngModel", field_r8.required);
104
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
105
- i0.ɵɵadvance(4);
106
- i0.ɵɵproperty("name", "fieldSecret_" + i_r7);
107
- i0.ɵɵtwoWayProperty("ngModel", field_r8.isSecret);
108
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
109
- i0.ɵɵadvance(4);
110
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
111
- } }
112
- function CredentialTypeEditPanelComponent_div_0_form_15_div_39_Template(rf, ctx) { if (rf & 1) {
113
- i0.ɵɵelementStart(0, "div", 47);
114
- i0.ɵɵtemplate(1, CredentialTypeEditPanelComponent_div_0_form_15_div_39_div_1_Template, 31, 21, "div", 48);
115
- i0.ɵɵelementEnd();
116
- } if (rf & 2) {
117
- const ctx_r1 = i0.ɵɵnextContext(3);
118
- i0.ɵɵadvance();
119
- i0.ɵɵproperty("ngForOf", ctx_r1.schemaFields);
120
- } }
121
- function CredentialTypeEditPanelComponent_div_0_form_15_div_40_Template(rf, ctx) { if (rf & 1) {
122
- i0.ɵɵelementStart(0, "div", 69);
123
- i0.ɵɵelement(1, "i", 25);
124
- i0.ɵɵelementStart(2, "span");
125
- i0.ɵɵtext(3, "No fields defined. Add fields that credentials of this type will need to store.");
126
- i0.ɵɵelementEnd()();
127
- } }
128
- function CredentialTypeEditPanelComponent_div_0_form_15_Template(rf, ctx) { if (rf & 1) {
129
- const _r3 = i0.ɵɵgetCurrentView();
130
- i0.ɵɵelementStart(0, "form", 22);
131
- i0.ɵɵlistener("submit", function CredentialTypeEditPanelComponent_div_0_form_15_Template_form_submit_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.save()); });
132
- i0.ɵɵelementStart(1, "div", 23)(2, "h3", 24);
133
- i0.ɵɵelement(3, "i", 25);
134
- i0.ɵɵtext(4, " Basic Information ");
135
- i0.ɵɵelementEnd();
136
- i0.ɵɵelementStart(5, "div", 26)(6, "label", 27);
137
- i0.ɵɵtext(7, "Name");
138
- i0.ɵɵelementEnd();
139
- i0.ɵɵelementStart(8, "input", 28);
140
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.name, $event) || (ctx_r1.name = $event); return i0.ɵɵresetView($event); });
141
- i0.ɵɵelementEnd()();
142
- i0.ɵɵelementStart(9, "div", 26)(10, "label", 29);
143
- i0.ɵɵtext(11, "Category");
144
- i0.ɵɵelementEnd();
145
- i0.ɵɵelementStart(12, "div", 30);
146
- i0.ɵɵtemplate(13, CredentialTypeEditPanelComponent_div_0_form_15_button_13_Template, 4, 8, "button", 31);
147
- i0.ɵɵelementEnd()();
148
- i0.ɵɵelementStart(14, "div", 26)(15, "label", 32);
149
- i0.ɵɵtext(16, "Description");
150
- i0.ɵɵelementEnd();
151
- i0.ɵɵelementStart(17, "textarea", 33);
152
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_Template_textarea_ngModelChange_17_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.description, $event) || (ctx_r1.description = $event); return i0.ɵɵresetView($event); });
153
- i0.ɵɵelementEnd()();
154
- i0.ɵɵelementStart(18, "div", 34)(19, "div", 26)(20, "label", 35);
155
- i0.ɵɵtext(21, "Icon Class");
156
- i0.ɵɵelementEnd();
157
- i0.ɵɵelementStart(22, "input", 36);
158
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.iconClass, $event) || (ctx_r1.iconClass = $event); return i0.ɵɵresetView($event); });
159
- i0.ɵɵelementEnd();
160
- i0.ɵɵelementStart(23, "span", 37);
161
- i0.ɵɵtext(24, "Font Awesome icon class");
162
- i0.ɵɵelementEnd()();
163
- i0.ɵɵelementStart(25, "div", 26)(26, "label", 38);
164
- i0.ɵɵtext(27, "Validation Endpoint");
165
- i0.ɵɵelementEnd();
166
- i0.ɵɵelementStart(28, "input", 39);
167
- i0.ɵɵtwoWayListener("ngModelChange", function CredentialTypeEditPanelComponent_div_0_form_15_Template_input_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.validationEndpoint, $event) || (ctx_r1.validationEndpoint = $event); return i0.ɵɵresetView($event); });
168
- i0.ɵɵelementEnd();
169
- i0.ɵɵelementStart(29, "span", 37);
170
- i0.ɵɵtext(30, "Optional API endpoint to validate credentials");
171
- i0.ɵɵelementEnd()()()();
172
- i0.ɵɵelementStart(31, "div", 23)(32, "div", 40)(33, "h3", 24);
173
- i0.ɵɵelement(34, "i", 41);
174
- i0.ɵɵtext(35, " Field Schema ");
175
- i0.ɵɵelementEnd();
176
- i0.ɵɵelementStart(36, "button", 42);
177
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_form_15_Template_button_click_36_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.addSchemaField()); });
178
- i0.ɵɵelement(37, "i", 43);
179
- i0.ɵɵtext(38, " Add Field ");
180
- i0.ɵɵelementEnd()();
181
- i0.ɵɵtemplate(39, CredentialTypeEditPanelComponent_div_0_form_15_div_39_Template, 2, 1, "div", 44)(40, CredentialTypeEditPanelComponent_div_0_form_15_div_40_Template, 4, 0, "div", 45);
182
- i0.ɵɵelementEnd()();
183
- } if (rf & 2) {
184
- const ctx_r1 = i0.ɵɵnextContext(2);
185
- i0.ɵɵadvance(8);
186
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.name);
187
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
188
- i0.ɵɵadvance(5);
189
- i0.ɵɵproperty("ngForOf", ctx_r1.categories);
190
- i0.ɵɵadvance(4);
191
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.description);
192
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
193
- i0.ɵɵadvance(5);
194
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.iconClass);
195
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
196
- i0.ɵɵadvance(6);
197
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.validationEndpoint);
198
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
199
- i0.ɵɵadvance(8);
200
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
201
- i0.ɵɵadvance(3);
202
- i0.ɵɵproperty("ngIf", ctx_r1.schemaFields.length > 0);
203
- i0.ɵɵadvance();
204
- i0.ɵɵproperty("ngIf", ctx_r1.schemaFields.length === 0);
205
- } }
206
- function CredentialTypeEditPanelComponent_div_0_button_18_Template(rf, ctx) { if (rf & 1) {
207
- const _r9 = i0.ɵɵgetCurrentView();
208
- i0.ɵɵelementStart(0, "button", 70);
209
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_button_18_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.deleteType()); });
210
- i0.ɵɵelement(1, "i", 68);
211
- i0.ɵɵelementStart(2, "span");
212
- i0.ɵɵtext(3, "Delete");
213
- i0.ɵɵelementEnd()();
214
- } if (rf & 2) {
215
- const ctx_r1 = i0.ɵɵnextContext(2);
216
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
217
- } }
218
- function CredentialTypeEditPanelComponent_div_0_i_23_Template(rf, ctx) { if (rf & 1) {
219
- i0.ɵɵelement(0, "i", 71);
220
- } }
221
- function CredentialTypeEditPanelComponent_div_0_i_24_Template(rf, ctx) { if (rf & 1) {
222
- i0.ɵɵelement(0, "i", 72);
223
- } }
224
- function CredentialTypeEditPanelComponent_div_0_Template(rf, ctx) { if (rf & 1) {
225
- const _r1 = i0.ɵɵgetCurrentView();
226
- i0.ɵɵelementStart(0, "div", 1);
227
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onBackdropClick($event)); });
228
- i0.ɵɵelementStart(1, "div", 2)(2, "div", 3)(3, "div", 4)(4, "div", 5);
229
- i0.ɵɵelement(5, "i");
230
- i0.ɵɵelementEnd();
231
- i0.ɵɵelementStart(6, "div", 6)(7, "h2");
232
- i0.ɵɵtext(8);
233
- i0.ɵɵelementEnd();
234
- i0.ɵɵelementStart(9, "span", 7);
235
- i0.ɵɵtext(10);
236
- i0.ɵɵelementEnd()()();
237
- i0.ɵɵelementStart(11, "button", 8);
238
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closePanel()); });
239
- i0.ɵɵelement(12, "i", 9);
240
- i0.ɵɵelementEnd()();
241
- i0.ɵɵelementStart(13, "div", 10);
242
- i0.ɵɵtemplate(14, CredentialTypeEditPanelComponent_div_0_mj_loading_14_Template, 1, 0, "mj-loading", 11)(15, CredentialTypeEditPanelComponent_div_0_form_15_Template, 41, 12, "form", 12);
243
- i0.ɵɵelementEnd();
244
- i0.ɵɵelementStart(16, "div", 13)(17, "div", 14);
245
- i0.ɵɵtemplate(18, CredentialTypeEditPanelComponent_div_0_button_18_Template, 4, 1, "button", 15);
246
- i0.ɵɵelementEnd();
247
- i0.ɵɵelementStart(19, "div", 16)(20, "button", 17);
248
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closePanel()); });
249
- i0.ɵɵtext(21, " Cancel ");
250
- i0.ɵɵelementEnd();
251
- i0.ɵɵelementStart(22, "button", 18);
252
- i0.ɵɵlistener("click", function CredentialTypeEditPanelComponent_div_0_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.save()); });
253
- i0.ɵɵtemplate(23, CredentialTypeEditPanelComponent_div_0_i_23_Template, 1, 0, "i", 19)(24, CredentialTypeEditPanelComponent_div_0_i_24_Template, 1, 0, "i", 20);
254
- i0.ɵɵelementStart(25, "span");
255
- i0.ɵɵtext(26);
256
- i0.ɵɵelementEnd()()()()()();
257
- } if (rf & 2) {
258
- const ctx_r1 = i0.ɵɵnextContext();
259
- i0.ɵɵadvance();
260
- i0.ɵɵclassProp("open", ctx_r1.isOpen);
261
- i0.ɵɵadvance(3);
262
- i0.ɵɵstyleProp("background-color", ctx_r1.getCategoryColor(ctx_r1.category) + "15")("color", ctx_r1.getCategoryColor(ctx_r1.category));
263
- i0.ɵɵadvance();
264
- i0.ɵɵclassMap(ctx_r1.iconClass || ctx_r1.getCategoryIcon(ctx_r1.category));
265
- i0.ɵɵadvance(3);
266
- i0.ɵɵtextInterpolate(ctx_r1.panelTitle);
267
- i0.ɵɵadvance(2);
268
- i0.ɵɵtextInterpolate1("", ctx_r1.category, " credential type");
269
- i0.ɵɵadvance();
270
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
271
- i0.ɵɵadvance(3);
272
- i0.ɵɵproperty("ngIf", ctx_r1.isLoading);
273
- i0.ɵɵadvance();
274
- i0.ɵɵproperty("ngIf", !ctx_r1.isLoading);
275
- i0.ɵɵadvance(3);
276
- i0.ɵɵproperty("ngIf", !ctx_r1.isNew);
277
- i0.ɵɵadvance(2);
278
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
279
- i0.ɵɵadvance(2);
280
- i0.ɵɵproperty("disabled", ctx_r1.isSaving || !ctx_r1.canSave);
281
- i0.ɵɵadvance();
282
- i0.ɵɵproperty("ngIf", ctx_r1.isSaving);
283
- i0.ɵɵadvance();
284
- i0.ɵɵproperty("ngIf", !ctx_r1.isSaving);
285
- i0.ɵɵadvance(2);
286
- i0.ɵɵtextInterpolate(ctx_r1.isNew ? "Create" : "Save");
287
- } }
288
- export function LoadCredentialTypeEditPanel() {
289
- // Prevents tree-shaking
290
- }
291
- export class CredentialTypeEditPanelComponent {
292
- cdr;
293
- credentialType = null;
294
- isOpen = false;
295
- close = new EventEmitter();
296
- saved = new EventEmitter();
297
- deleted = new EventEmitter();
298
- isLoading = false;
299
- isSaving = false;
300
- isNew = false;
301
- // Form fields
302
- name = '';
303
- description = '';
304
- category = 'Integration';
305
- iconClass = '';
306
- validationEndpoint = '';
307
- schemaFields = [];
308
- // Available categories
309
- categories = ['AI', 'Authentication', 'Communication', 'Database', 'Integration', 'Storage'];
310
- _metadata = new Metadata();
311
- constructor(cdr) {
312
- this.cdr = cdr;
313
- }
314
- ngOnInit() { }
315
- get panelTitle() {
316
- return this.isNew ? 'Create Credential Type' : 'Edit Credential Type';
317
- }
318
- get canSave() {
319
- return this.name.trim().length > 0 && this.category.length > 0;
320
- }
321
- async open(credentialType) {
322
- this.isLoading = true;
323
- this.isOpen = true;
324
- this.credentialType = credentialType;
325
- this.isNew = !credentialType || !credentialType.ID;
326
- this.cdr.markForCheck();
327
- this.resetForm();
328
- if (credentialType && credentialType.ID) {
329
- this.populateFromType(credentialType);
330
- }
331
- this.isLoading = false;
332
- this.cdr.markForCheck();
333
- }
334
- resetForm() {
335
- this.name = '';
336
- this.description = '';
337
- this.category = 'Integration';
338
- this.iconClass = '';
339
- this.validationEndpoint = '';
340
- this.schemaFields = [];
341
- }
342
- populateFromType(credentialType) {
343
- this.name = credentialType.Name || '';
344
- this.description = credentialType.Description || '';
345
- this.category = credentialType.Category || 'Integration';
346
- this.iconClass = credentialType.IconClass || '';
347
- this.validationEndpoint = credentialType.ValidationEndpoint || '';
348
- // Parse field schema
349
- this.parseFieldSchema(credentialType.FieldSchema);
350
- }
351
- parseFieldSchema(schemaJson) {
352
- try {
353
- if (!schemaJson) {
354
- this.schemaFields = [];
355
- return;
356
- }
357
- const schema = JSON.parse(schemaJson);
358
- const properties = schema.properties || {};
359
- const required = schema.required || [];
360
- this.schemaFields = Object.entries(properties).map(([name, prop]) => ({
361
- name,
362
- type: prop.type || 'string',
363
- title: prop.title || name,
364
- description: prop.description || '',
365
- isSecret: prop.isSecret === true,
366
- required: required.includes(name),
367
- order: typeof prop.order === 'number' ? prop.order : 999
368
- }));
369
- this.schemaFields.sort((a, b) => a.order - b.order);
370
- }
371
- catch (e) {
372
- console.error('Error parsing field schema:', e);
373
- this.schemaFields = [];
374
- }
375
- }
376
- buildFieldSchema() {
377
- if (this.schemaFields.length === 0) {
378
- return JSON.stringify({ type: 'object', properties: {}, required: [] });
379
- }
380
- const properties = {};
381
- const required = [];
382
- for (let i = 0; i < this.schemaFields.length; i++) {
383
- const field = this.schemaFields[i];
384
- properties[field.name] = {
385
- type: field.type,
386
- title: field.title,
387
- description: field.description,
388
- isSecret: field.isSecret,
389
- order: i
390
- };
391
- if (field.required) {
392
- required.push(field.name);
393
- }
394
- }
395
- return JSON.stringify({
396
- $schema: 'http://json-schema.org/draft-07/schema#',
397
- type: 'object',
398
- properties,
399
- required
400
- }, null, 2);
401
- }
402
- // Schema field management
403
- addSchemaField() {
404
- this.schemaFields.push({
405
- name: '',
406
- type: 'string',
407
- title: '',
408
- description: '',
409
- isSecret: false,
410
- required: false,
411
- order: this.schemaFields.length
412
- });
413
- this.cdr.markForCheck();
414
- }
415
- removeSchemaField(index) {
416
- this.schemaFields.splice(index, 1);
417
- this.cdr.markForCheck();
418
- }
419
- moveFieldUp(index) {
420
- if (index > 0) {
421
- const temp = this.schemaFields[index];
422
- this.schemaFields[index] = this.schemaFields[index - 1];
423
- this.schemaFields[index - 1] = temp;
424
- this.cdr.markForCheck();
425
- }
426
- }
427
- moveFieldDown(index) {
428
- if (index < this.schemaFields.length - 1) {
429
- const temp = this.schemaFields[index];
430
- this.schemaFields[index] = this.schemaFields[index + 1];
431
- this.schemaFields[index + 1] = temp;
432
- this.cdr.markForCheck();
433
- }
434
- }
435
- async save() {
436
- if (!this.canSave) {
437
- MJNotificationService.Instance.CreateSimpleNotification('Please fill in all required fields', 'warning', 3000);
438
- return;
439
- }
440
- this.isSaving = true;
441
- this.cdr.markForCheck();
442
- try {
443
- let entity;
444
- if (this.isNew) {
445
- entity = await this._metadata.GetEntityObject('MJ: Credential Types');
446
- }
447
- else {
448
- entity = this.credentialType;
449
- }
450
- entity.Name = this.name.trim();
451
- entity.Description = this.description.trim() || null;
452
- entity.Category = this.category;
453
- entity.IconClass = this.iconClass.trim() || null;
454
- entity.ValidationEndpoint = this.validationEndpoint.trim() || null;
455
- entity.FieldSchema = this.buildFieldSchema();
456
- const success = await entity.Save();
457
- if (success) {
458
- const action = this.isNew ? 'created' : 'updated';
459
- MJNotificationService.Instance.CreateSimpleNotification(`Credential type "${entity.Name}" ${action} successfully`, 'success', 3000);
460
- this.saved.emit(entity);
461
- this.closePanel();
462
- }
463
- else {
464
- const errorMessage = entity.LatestResult?.Message || 'Unknown error';
465
- console.error('Save failed:', errorMessage);
466
- MJNotificationService.Instance.CreateSimpleNotification(`Failed to save credential type: ${errorMessage}`, 'error', 5000);
467
- }
468
- }
469
- catch (error) {
470
- console.error('Error saving credential type:', error);
471
- MJNotificationService.Instance.CreateSimpleNotification('Error saving credential type', 'error', 3000);
472
- }
473
- finally {
474
- this.isSaving = false;
475
- this.cdr.markForCheck();
476
- }
477
- }
478
- async deleteType() {
479
- if (this.isNew || !this.credentialType)
480
- return;
481
- const confirmed = confirm(`Are you sure you want to delete "${this.credentialType.Name}"? This action cannot be undone.`);
482
- if (!confirmed)
483
- return;
484
- this.isSaving = true;
485
- this.cdr.markForCheck();
486
- try {
487
- const success = await this.credentialType.Delete();
488
- if (success) {
489
- MJNotificationService.Instance.CreateSimpleNotification(`Credential type "${this.credentialType.Name}" deleted successfully`, 'success', 3000);
490
- this.deleted.emit(this.credentialType.ID);
491
- this.closePanel();
492
- }
493
- else {
494
- const errorMessage = this.credentialType.LatestResult?.Message || 'Unknown error';
495
- MJNotificationService.Instance.CreateSimpleNotification(`Failed to delete credential type: ${errorMessage}`, 'error', 5000);
496
- }
497
- }
498
- catch (error) {
499
- console.error('Error deleting credential type:', error);
500
- MJNotificationService.Instance.CreateSimpleNotification('Error deleting credential type', 'error', 3000);
501
- }
502
- finally {
503
- this.isSaving = false;
504
- this.cdr.markForCheck();
505
- }
506
- }
507
- closePanel() {
508
- this.isOpen = false;
509
- this.credentialType = null;
510
- this.resetForm();
511
- this.close.emit();
512
- this.cdr.markForCheck();
513
- }
514
- onBackdropClick(event) {
515
- if (event.target.classList.contains('panel-backdrop')) {
516
- this.closePanel();
517
- }
518
- }
519
- getCategoryIcon(category) {
520
- const iconMap = {
521
- 'AI': 'fa-solid fa-brain',
522
- 'Communication': 'fa-solid fa-envelope',
523
- 'Storage': 'fa-solid fa-cloud',
524
- 'Database': 'fa-solid fa-database',
525
- 'Authentication': 'fa-solid fa-shield-halved',
526
- 'Integration': 'fa-solid fa-plug'
527
- };
528
- return iconMap[category] || 'fa-solid fa-key';
529
- }
530
- getCategoryColor(category) {
531
- const colorMap = {
532
- 'AI': '#8b5cf6',
533
- 'Communication': '#3b82f6',
534
- 'Storage': '#06b6d4',
535
- 'Database': '#f59e0b',
536
- 'Authentication': '#10b981',
537
- 'Integration': '#ec4899'
538
- };
539
- return colorMap[category] || '#6366f1';
540
- }
541
- static ɵfac = function CredentialTypeEditPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CredentialTypeEditPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
542
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialTypeEditPanelComponent, selectors: [["mj-credential-type-edit-panel"]], inputs: { credentialType: "credentialType", isOpen: "isOpen" }, outputs: { close: "close", saved: "saved", deleted: "deleted" }, decls: 1, vars: 1, consts: [["class", "panel-backdrop", 3, "click", 4, "ngIf"], [1, "panel-backdrop", 3, "click"], [1, "edit-panel"], [1, "panel-header"], [1, "header-content"], [1, "header-icon"], [1, "header-text"], [1, "header-subtitle"], [1, "close-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-times"], [1, "panel-body"], ["text", "Loading...", 4, "ngIf"], ["class", "type-form", 3, "submit", 4, "ngIf"], [1, "panel-footer"], [1, "footer-left"], ["class", "btn-delete", 3, "disabled", "click", 4, "ngIf"], [1, "footer-right"], [1, "btn-secondary", 3, "click", "disabled"], [1, "btn-primary", 3, "click", "disabled"], ["class", "fa-solid fa-spinner fa-spin", 4, "ngIf"], ["class", "fa-solid fa-check", 4, "ngIf"], ["text", "Loading..."], [1, "type-form", 3, "submit"], [1, "form-section"], [1, "section-title"], [1, "fa-solid", "fa-info-circle"], [1, "form-group"], ["for", "typeName", 1, "required"], ["type", "text", "id", "typeName", "name", "typeName", "placeholder", "e.g., OpenAI, SendGrid, AWS S3", "required", "", 3, "ngModelChange", "ngModel", "disabled"], ["for", "typeCategory", 1, "required"], [1, "category-selector"], ["type", "button", "class", "category-btn", 3, "selected", "--cat-color", "disabled", "click", 4, "ngFor", "ngForOf"], ["for", "typeDescription"], ["id", "typeDescription", "name", "typeDescription", "placeholder", "Optional description of this credential type...", "rows", "3", 3, "ngModelChange", "ngModel", "disabled"], [1, "form-row"], ["for", "typeIcon"], ["type", "text", "id", "typeIcon", "name", "typeIcon", "placeholder", "e.g., fa-brands fa-openai", 3, "ngModelChange", "ngModel", "disabled"], [1, "field-hint"], ["for", "validationEndpoint"], ["type", "text", "id", "validationEndpoint", "name", "validationEndpoint", "placeholder", "https://api.example.com/validate", 3, "ngModelChange", "ngModel", "disabled"], [1, "section-header-row"], [1, "fa-solid", "fa-list-check"], ["type", "button", 1, "btn-add-field", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["class", "schema-fields", 4, "ngIf"], ["class", "no-fields-message", 4, "ngIf"], ["type", "button", 1, "category-btn", 3, "click", "disabled"], [1, "schema-fields"], ["class", "schema-field", 4, "ngFor", "ngForOf"], [1, "schema-field"], [1, "field-drag-handle"], ["type", "button", 1, "move-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], [1, "fa-solid", "fa-chevron-down"], [1, "field-content"], [1, "field-row"], ["type", "text", "placeholder", "Field name (e.g., apiKey)", 1, "field-name-input", 3, "ngModelChange", "name", "ngModel", "disabled"], ["type", "text", "placeholder", "Display title", 1, "field-title-input", 3, "ngModelChange", "name", "ngModel", "disabled"], [1, "field-type-select", 3, "ngModelChange", "name", "ngModel", "disabled"], ["value", "string"], ["value", "number"], ["value", "boolean"], ["type", "text", "placeholder", "Field description (optional)", 1, "field-desc-input", 3, "ngModelChange", "name", "ngModel", "disabled"], [1, "field-options"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "name", "ngModel", "disabled"], [1, "fa-solid", "fa-lock"], ["type", "button", "title", "Remove field", 1, "remove-field-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-trash"], [1, "no-fields-message"], [1, "btn-delete", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check"]], template: function CredentialTypeEditPanelComponent_Template(rf, ctx) { if (rf & 1) {
543
- i0.ɵɵtemplate(0, CredentialTypeEditPanelComponent_div_0_Template, 27, 19, "div", 0);
544
- } if (rf & 2) {
545
- i0.ɵɵproperty("ngIf", ctx.isOpen);
546
- } }, dependencies: [i1.NgForOf, i1.NgIf, i2.ɵNgNoValidate, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgControlStatusGroup, i2.RequiredValidator, i2.NgModel, i2.NgForm, i3.LoadingComponent], styles: ["\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n display: flex;\n justify-content: flex-end;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.edit-panel[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 600px;\n height: 100%;\n background: #ffffff;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n transform: translateX(100%);\n animation: _ngcontent-%COMP%_slideIn 0.3s ease-out forwards;\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid #e5e7eb;\n background: linear-gradient(135deg, #f8fafc 0%, #ffffff 100%);\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.header-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n flex-shrink: 0;\n}\n\n.header-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: #1e293b;\n margin: 0 0 4px 0;\n}\n\n.header-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #64748b;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n background: #f1f5f9;\n border-radius: 8px;\n cursor: pointer;\n color: #64748b;\n font-size: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #e2e8f0;\n color: #334155;\n}\n\n.close-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.panel-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n scroll-behavior: smooth;\n -webkit-overflow-scrolling: touch;\n}\n\n\n\n.form-section[_ngcontent-%COMP%] {\n margin-bottom: 28px;\n}\n\n.form-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n font-weight: 600;\n color: #334155;\n margin: 0 0 16px 0;\n padding-bottom: 10px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6366f1;\n font-size: 14px;\n}\n\n.section-header-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n}\n\n.section-header-row[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0;\n border: none;\n}\n\n.btn-add-field[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #6366f1;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-add-field[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #4f46e5;\n}\n\n.btn-add-field[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 18px;\n}\n\n.form-group[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n font-size: 13px;\n font-weight: 500;\n color: #475569;\n margin-bottom: 6px;\n}\n\n.form-group[_ngcontent-%COMP%] label.required[_ngcontent-%COMP%]::after {\n content: '*';\n color: #ef4444;\n margin-left: 4px;\n}\n\n.form-group[_ngcontent-%COMP%] input[type=\"text\"][_ngcontent-%COMP%], \n.form-group[_ngcontent-%COMP%] input[type=\"number\"][_ngcontent-%COMP%], \n.form-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%], \n.form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n font-size: 14px;\n color: #1e293b;\n background: #ffffff;\n transition: all 0.15s ease;\n box-sizing: border-box;\n}\n\n.form-group[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus, \n.form-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%]:focus, \n.form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.form-group[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:disabled, \n.form-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%]:disabled, \n.form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]:disabled {\n background: #f8fafc;\n color: #94a3b8;\n cursor: not-allowed;\n}\n\n.form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 80px;\n}\n\n.field-hint[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n color: #94a3b8;\n margin-top: 5px;\n}\n\n.form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n\n\n\n.category-selector[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 10px;\n}\n\n.category-btn[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 12px 8px;\n border: 2px solid #e5e7eb;\n border-radius: 10px;\n background: #ffffff;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #64748b;\n}\n\n.category-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.category-btn[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 500;\n}\n\n.category-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--cat-color);\n background: color-mix(in srgb, var(--cat-color) 5%, white);\n}\n\n.category-btn.selected[_ngcontent-%COMP%] {\n border-color: var(--cat-color);\n background: color-mix(in srgb, var(--cat-color) 10%, white);\n color: var(--cat-color);\n}\n\n.category-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.schema-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.schema-field[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 14px;\n background: #f8fafc;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n}\n\n.field-drag-handle[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.move-btn[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: none;\n background: #e2e8f0;\n border-radius: 4px;\n cursor: pointer;\n color: #64748b;\n font-size: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n}\n\n.move-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #cbd5e1;\n color: #334155;\n}\n\n.move-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.field-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.field-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n}\n\n.field-name-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n font-family: monospace;\n}\n\n.field-title-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n}\n\n.field-type-select[_ngcontent-%COMP%] {\n width: 100px;\n padding: 8px 10px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.field-desc-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n}\n\n.field-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #64748b;\n cursor: pointer;\n}\n\n.checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 14px;\n height: 14px;\n accent-color: #6366f1;\n}\n\n.checkbox-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #f59e0b;\n}\n\n.remove-field-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #94a3b8;\n cursor: pointer;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n align-self: flex-start;\n}\n\n.remove-field-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #fef2f2;\n color: #dc2626;\n}\n\n.remove-field-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.no-fields-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px;\n background: #f8fafc;\n border: 2px dashed #e2e8f0;\n border-radius: 10px;\n color: #64748b;\n font-size: 13px;\n}\n\n.no-fields-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #94a3b8;\n}\n\n\n\n.panel-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid #e5e7eb;\n background: #f8fafc;\n}\n\n.footer-left[_ngcontent-%COMP%], \n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.btn-primary[_ngcontent-%COMP%], \n.btn-secondary[_ngcontent-%COMP%], \n.btn-delete[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: #6366f1;\n color: #ffffff;\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #4f46e5;\n}\n\n.btn-primary[_ngcontent-%COMP%]:disabled {\n background: #c7d2fe;\n cursor: not-allowed;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: #ffffff;\n color: #475569;\n border: 1px solid #d1d5db;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #f1f5f9;\n border-color: #94a3b8;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-delete[_ngcontent-%COMP%] {\n background: transparent;\n color: #dc2626;\n padding: 10px 16px;\n}\n\n.btn-delete[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #fef2f2;\n}\n\n.btn-delete[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n@media (max-width: 768px) {\n .edit-panel[_ngcontent-%COMP%] {\n max-width: 100%;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n }\n\n .header-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 18px;\n }\n\n .header-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .panel-body[_ngcontent-%COMP%] {\n padding: 20px;\n }\n\n .form-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .category-selector[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .schema-field[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .field-drag-handle[_ngcontent-%COMP%] {\n flex-direction: row;\n justify-content: flex-end;\n order: 1;\n }\n\n .field-content[_ngcontent-%COMP%] {\n order: 0;\n }\n\n .remove-field-btn[_ngcontent-%COMP%] {\n order: 2;\n align-self: flex-end;\n }\n\n .field-row[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .field-type-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .panel-footer[_ngcontent-%COMP%] {\n padding: 14px 20px;\n flex-direction: column-reverse;\n gap: 12px;\n }\n\n .footer-left[_ngcontent-%COMP%], \n .footer-right[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .footer-right[_ngcontent-%COMP%] {\n flex-direction: row;\n }\n\n .footer-right[_ngcontent-%COMP%] .btn-primary[_ngcontent-%COMP%], \n .footer-right[_ngcontent-%COMP%] .btn-secondary[_ngcontent-%COMP%] {\n flex: 1;\n justify-content: center;\n }\n\n .btn-delete[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n background: #fef2f2;\n }\n}\n\n@media (max-width: 480px) {\n .panel-header[_ngcontent-%COMP%] {\n padding: 14px 16px;\n }\n\n .header-content[_ngcontent-%COMP%] {\n gap: 12px;\n }\n\n .header-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 16px;\n border-radius: 10px;\n }\n\n .header-text[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n font-size: 15px;\n }\n\n .header-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .panel-body[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .category-selector[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n\n .category-btn[_ngcontent-%COMP%] {\n padding: 10px 6px;\n }\n\n .category-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .category-btn[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .schema-field[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .field-name-input[_ngcontent-%COMP%], \n .field-title-input[_ngcontent-%COMP%], \n .field-desc-input[_ngcontent-%COMP%], \n .field-type-select[_ngcontent-%COMP%] {\n font-size: 14px;\n padding: 10px 12px;\n }\n\n .panel-footer[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .btn-primary[_ngcontent-%COMP%], \n .btn-secondary[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 13px;\n }\n}\n\n\n\n.panel-body[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.panel-body[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.panel-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: #d1d5db;\n border-radius: 3px;\n}\n\n.panel-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n\n\n\n@keyframes _ngcontent-%COMP%_spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.fa-spin[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n}"], changeDetection: 0 });
547
- }
548
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialTypeEditPanelComponent, [{
549
- type: Component,
550
- args: [{ selector: 'mj-credential-type-edit-panel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"panel-backdrop\" *ngIf=\"isOpen\" (click)=\"onBackdropClick($event)\">\n <div class=\"edit-panel\" [class.open]=\"isOpen\">\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <div class=\"header-content\">\n <div class=\"header-icon\" [style.backgroundColor]=\"getCategoryColor(category) + '15'\" [style.color]=\"getCategoryColor(category)\">\n <i [class]=\"iconClass || getCategoryIcon(category)\"></i>\n </div>\n <div class=\"header-text\">\n <h2>{{panelTitle}}</h2>\n <span class=\"header-subtitle\">{{category}} credential type</span>\n </div>\n </div>\n <button class=\"close-btn\" (click)=\"closePanel()\" [disabled]=\"isSaving\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Body -->\n <div class=\"panel-body\">\n <mj-loading *ngIf=\"isLoading\" text=\"Loading...\"></mj-loading>\n\n <form *ngIf=\"!isLoading\" class=\"type-form\" (submit)=\"$event.preventDefault(); save()\">\n <!-- Basic Info Section -->\n <div class=\"form-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Basic Information\n </h3>\n\n <div class=\"form-group\">\n <label for=\"typeName\" class=\"required\">Name</label>\n <input\n type=\"text\"\n id=\"typeName\"\n name=\"typeName\"\n [(ngModel)]=\"name\"\n placeholder=\"e.g., OpenAI, SendGrid, AWS S3\"\n [disabled]=\"isSaving\"\n required\n />\n </div>\n\n <div class=\"form-group\">\n <label for=\"typeCategory\" class=\"required\">Category</label>\n <div class=\"category-selector\">\n <button\n type=\"button\"\n *ngFor=\"let cat of categories\"\n class=\"category-btn\"\n [class.selected]=\"category === cat\"\n [style.--cat-color]=\"getCategoryColor(cat)\"\n (click)=\"category = cat\"\n [disabled]=\"isSaving\"\n >\n <i [class]=\"getCategoryIcon(cat)\"></i>\n <span>{{cat}}</span>\n </button>\n </div>\n </div>\n\n <div class=\"form-group\">\n <label for=\"typeDescription\">Description</label>\n <textarea\n id=\"typeDescription\"\n name=\"typeDescription\"\n [(ngModel)]=\"description\"\n placeholder=\"Optional description of this credential type...\"\n rows=\"3\"\n [disabled]=\"isSaving\"\n ></textarea>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"typeIcon\">Icon Class</label>\n <input\n type=\"text\"\n id=\"typeIcon\"\n name=\"typeIcon\"\n [(ngModel)]=\"iconClass\"\n placeholder=\"e.g., fa-brands fa-openai\"\n [disabled]=\"isSaving\"\n />\n <span class=\"field-hint\">Font Awesome icon class</span>\n </div>\n\n <div class=\"form-group\">\n <label for=\"validationEndpoint\">Validation Endpoint</label>\n <input\n type=\"text\"\n id=\"validationEndpoint\"\n name=\"validationEndpoint\"\n [(ngModel)]=\"validationEndpoint\"\n placeholder=\"https://api.example.com/validate\"\n [disabled]=\"isSaving\"\n />\n <span class=\"field-hint\">Optional API endpoint to validate credentials</span>\n </div>\n </div>\n </div>\n\n <!-- Field Schema Section -->\n <div class=\"form-section\">\n <div class=\"section-header-row\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-list-check\"></i>\n Field Schema\n </h3>\n <button\n type=\"button\"\n class=\"btn-add-field\"\n (click)=\"addSchemaField()\"\n [disabled]=\"isSaving\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Add Field\n </button>\n </div>\n\n <div class=\"schema-fields\" *ngIf=\"schemaFields.length > 0\">\n <div class=\"schema-field\" *ngFor=\"let field of schemaFields; let i = index\">\n <div class=\"field-drag-handle\">\n <button type=\"button\" class=\"move-btn\" (click)=\"moveFieldUp(i)\" [disabled]=\"i === 0 || isSaving\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button type=\"button\" class=\"move-btn\" (click)=\"moveFieldDown(i)\" [disabled]=\"i === schemaFields.length - 1 || isSaving\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n\n <div class=\"field-content\">\n <div class=\"field-row\">\n <input\n type=\"text\"\n [name]=\"'fieldName_' + i\"\n [(ngModel)]=\"field.name\"\n placeholder=\"Field name (e.g., apiKey)\"\n class=\"field-name-input\"\n [disabled]=\"isSaving\"\n />\n <input\n type=\"text\"\n [name]=\"'fieldTitle_' + i\"\n [(ngModel)]=\"field.title\"\n placeholder=\"Display title\"\n class=\"field-title-input\"\n [disabled]=\"isSaving\"\n />\n <select [name]=\"'fieldType_' + i\" [(ngModel)]=\"field.type\" class=\"field-type-select\" [disabled]=\"isSaving\">\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <input\n type=\"text\"\n [name]=\"'fieldDesc_' + i\"\n [(ngModel)]=\"field.description\"\n placeholder=\"Field description (optional)\"\n class=\"field-desc-input\"\n [disabled]=\"isSaving\"\n />\n </div>\n\n <div class=\"field-options\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [name]=\"'fieldRequired_' + i\" [(ngModel)]=\"field.required\" [disabled]=\"isSaving\" />\n <span>Required</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [name]=\"'fieldSecret_' + i\" [(ngModel)]=\"field.isSecret\" [disabled]=\"isSaving\" />\n <span><i class=\"fa-solid fa-lock\"></i> Secret</span>\n </label>\n </div>\n </div>\n\n <button\n type=\"button\"\n class=\"remove-field-btn\"\n (click)=\"removeSchemaField(i)\"\n [disabled]=\"isSaving\"\n title=\"Remove field\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"no-fields-message\" *ngIf=\"schemaFields.length === 0\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No fields defined. Add fields that credentials of this type will need to store.</span>\n </div>\n </div>\n </form>\n </div>\n\n <!-- Panel Footer -->\n <div class=\"panel-footer\">\n <div class=\"footer-left\">\n <button\n class=\"btn-delete\"\n *ngIf=\"!isNew\"\n (click)=\"deleteType()\"\n [disabled]=\"isSaving\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n <span>Delete</span>\n </button>\n </div>\n <div class=\"footer-right\">\n <button\n class=\"btn-secondary\"\n (click)=\"closePanel()\"\n [disabled]=\"isSaving\"\n >\n Cancel\n </button>\n <button\n class=\"btn-primary\"\n (click)=\"save()\"\n [disabled]=\"isSaving || !canSave\"\n >\n <i class=\"fa-solid fa-spinner fa-spin\" *ngIf=\"isSaving\"></i>\n <i class=\"fa-solid fa-check\" *ngIf=\"!isSaving\"></i>\n <span>{{isNew ? 'Create' : 'Save'}}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["/* Panel Backdrop */\n.panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n display: flex;\n justify-content: flex-end;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Slide-in Panel */\n.edit-panel {\n width: 100%;\n max-width: 600px;\n height: 100%;\n background: #ffffff;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n transform: translateX(100%);\n animation: slideIn 0.3s ease-out forwards;\n}\n\n@keyframes slideIn {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n/* Panel Header */\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid #e5e7eb;\n background: linear-gradient(135deg, #f8fafc 0%, #ffffff 100%);\n}\n\n.header-content {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.header-icon {\n width: 48px;\n height: 48px;\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n flex-shrink: 0;\n}\n\n.header-text h2 {\n font-size: 18px;\n font-weight: 600;\n color: #1e293b;\n margin: 0 0 4px 0;\n}\n\n.header-subtitle {\n font-size: 13px;\n color: #64748b;\n}\n\n.close-btn {\n width: 36px;\n height: 36px;\n border: none;\n background: #f1f5f9;\n border-radius: 8px;\n cursor: pointer;\n color: #64748b;\n font-size: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n}\n\n.close-btn:hover:not(:disabled) {\n background: #e2e8f0;\n color: #334155;\n}\n\n.close-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Panel Body */\n.panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n scroll-behavior: smooth;\n -webkit-overflow-scrolling: touch;\n}\n\n/* Form Sections */\n.form-section {\n margin-bottom: 28px;\n}\n\n.form-section:last-child {\n margin-bottom: 0;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n font-weight: 600;\n color: #334155;\n margin: 0 0 16px 0;\n padding-bottom: 10px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.section-title i {\n color: #6366f1;\n font-size: 14px;\n}\n\n.section-header-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n}\n\n.section-header-row .section-title {\n margin: 0;\n padding: 0;\n border: none;\n}\n\n.btn-add-field {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #6366f1;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-add-field:hover:not(:disabled) {\n background: #4f46e5;\n}\n\n.btn-add-field:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Form Groups */\n.form-group {\n margin-bottom: 18px;\n}\n\n.form-group:last-child {\n margin-bottom: 0;\n}\n\n.form-group label {\n display: block;\n font-size: 13px;\n font-weight: 500;\n color: #475569;\n margin-bottom: 6px;\n}\n\n.form-group label.required::after {\n content: '*';\n color: #ef4444;\n margin-left: 4px;\n}\n\n.form-group input[type=\"text\"],\n.form-group input[type=\"number\"],\n.form-group select,\n.form-group textarea {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n font-size: 14px;\n color: #1e293b;\n background: #ffffff;\n transition: all 0.15s ease;\n box-sizing: border-box;\n}\n\n.form-group input:focus,\n.form-group select:focus,\n.form-group textarea:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.form-group input:disabled,\n.form-group select:disabled,\n.form-group textarea:disabled {\n background: #f8fafc;\n color: #94a3b8;\n cursor: not-allowed;\n}\n\n.form-group textarea {\n resize: vertical;\n min-height: 80px;\n}\n\n.field-hint {\n display: block;\n font-size: 12px;\n color: #94a3b8;\n margin-top: 5px;\n}\n\n.form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n\n/* Category Selector */\n.category-selector {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 10px;\n}\n\n.category-btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 12px 8px;\n border: 2px solid #e5e7eb;\n border-radius: 10px;\n background: #ffffff;\n cursor: pointer;\n transition: all 0.2s ease;\n color: #64748b;\n}\n\n.category-btn i {\n font-size: 18px;\n}\n\n.category-btn span {\n font-size: 11px;\n font-weight: 500;\n}\n\n.category-btn:hover:not(:disabled) {\n border-color: var(--cat-color);\n background: color-mix(in srgb, var(--cat-color) 5%, white);\n}\n\n.category-btn.selected {\n border-color: var(--cat-color);\n background: color-mix(in srgb, var(--cat-color) 10%, white);\n color: var(--cat-color);\n}\n\n.category-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Schema Fields */\n.schema-fields {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.schema-field {\n display: flex;\n gap: 12px;\n padding: 14px;\n background: #f8fafc;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n}\n\n.field-drag-handle {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.move-btn {\n width: 24px;\n height: 24px;\n border: none;\n background: #e2e8f0;\n border-radius: 4px;\n cursor: pointer;\n color: #64748b;\n font-size: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n}\n\n.move-btn:hover:not(:disabled) {\n background: #cbd5e1;\n color: #334155;\n}\n\n.move-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.field-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.field-row {\n display: flex;\n gap: 10px;\n}\n\n.field-name-input {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n font-family: monospace;\n}\n\n.field-title-input {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n}\n\n.field-type-select {\n width: 100px;\n padding: 8px 10px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.field-desc-input {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n}\n\n.field-options {\n display: flex;\n gap: 16px;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #64748b;\n cursor: pointer;\n}\n\n.checkbox-label input[type=\"checkbox\"] {\n width: 14px;\n height: 14px;\n accent-color: #6366f1;\n}\n\n.checkbox-label i {\n font-size: 10px;\n color: #f59e0b;\n}\n\n.remove-field-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #94a3b8;\n cursor: pointer;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n align-self: flex-start;\n}\n\n.remove-field-btn:hover:not(:disabled) {\n background: #fef2f2;\n color: #dc2626;\n}\n\n.remove-field-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.no-fields-message {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px;\n background: #f8fafc;\n border: 2px dashed #e2e8f0;\n border-radius: 10px;\n color: #64748b;\n font-size: 13px;\n}\n\n.no-fields-message i {\n color: #94a3b8;\n}\n\n/* Panel Footer */\n.panel-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid #e5e7eb;\n background: #f8fafc;\n}\n\n.footer-left,\n.footer-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.btn-primary,\n.btn-secondary,\n.btn-delete {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-primary {\n background: #6366f1;\n color: #ffffff;\n}\n\n.btn-primary:hover:not(:disabled) {\n background: #4f46e5;\n}\n\n.btn-primary:disabled {\n background: #c7d2fe;\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: #ffffff;\n color: #475569;\n border: 1px solid #d1d5db;\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: #f1f5f9;\n border-color: #94a3b8;\n}\n\n.btn-secondary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-delete {\n background: transparent;\n color: #dc2626;\n padding: 10px 16px;\n}\n\n.btn-delete:hover:not(:disabled) {\n background: #fef2f2;\n}\n\n.btn-delete:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Mobile Responsiveness */\n@media (max-width: 768px) {\n .edit-panel {\n max-width: 100%;\n }\n\n .panel-header {\n padding: 16px 20px;\n }\n\n .header-icon {\n width: 40px;\n height: 40px;\n font-size: 18px;\n }\n\n .header-text h2 {\n font-size: 16px;\n }\n\n .panel-body {\n padding: 20px;\n }\n\n .form-row {\n grid-template-columns: 1fr;\n }\n\n .category-selector {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .schema-field {\n flex-direction: column;\n }\n\n .field-drag-handle {\n flex-direction: row;\n justify-content: flex-end;\n order: 1;\n }\n\n .field-content {\n order: 0;\n }\n\n .remove-field-btn {\n order: 2;\n align-self: flex-end;\n }\n\n .field-row {\n flex-direction: column;\n }\n\n .field-type-select {\n width: 100%;\n }\n\n .panel-footer {\n padding: 14px 20px;\n flex-direction: column-reverse;\n gap: 12px;\n }\n\n .footer-left,\n .footer-right {\n width: 100%;\n }\n\n .footer-right {\n flex-direction: row;\n }\n\n .footer-right .btn-primary,\n .footer-right .btn-secondary {\n flex: 1;\n justify-content: center;\n }\n\n .btn-delete {\n width: 100%;\n justify-content: center;\n background: #fef2f2;\n }\n}\n\n@media (max-width: 480px) {\n .panel-header {\n padding: 14px 16px;\n }\n\n .header-content {\n gap: 12px;\n }\n\n .header-icon {\n width: 36px;\n height: 36px;\n font-size: 16px;\n border-radius: 10px;\n }\n\n .header-text h2 {\n font-size: 15px;\n }\n\n .header-subtitle {\n font-size: 12px;\n }\n\n .panel-body {\n padding: 16px;\n }\n\n .category-selector {\n grid-template-columns: repeat(3, 1fr);\n }\n\n .category-btn {\n padding: 10px 6px;\n }\n\n .category-btn i {\n font-size: 16px;\n }\n\n .category-btn span {\n font-size: 10px;\n }\n\n .schema-field {\n padding: 12px;\n }\n\n .field-name-input,\n .field-title-input,\n .field-desc-input,\n .field-type-select {\n font-size: 14px;\n padding: 10px 12px;\n }\n\n .panel-footer {\n padding: 12px 16px;\n }\n\n .btn-primary,\n .btn-secondary {\n padding: 10px 16px;\n font-size: 13px;\n }\n}\n\n/* Custom scrollbar */\n.panel-body::-webkit-scrollbar {\n width: 6px;\n}\n\n.panel-body::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.panel-body::-webkit-scrollbar-thumb {\n background: #d1d5db;\n border-radius: 3px;\n}\n\n.panel-body::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n}\n\n/* Animations */\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.fa-spin {\n animation: spin 1s linear infinite;\n}\n"] }]
551
- }], () => [{ type: i0.ChangeDetectorRef }], { credentialType: [{
552
- type: Input
553
- }], isOpen: [{
554
- type: Input
555
- }], close: [{
556
- type: Output
557
- }], saved: [{
558
- type: Output
559
- }], deleted: [{
560
- type: Output
561
- }] }); })();
562
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialTypeEditPanelComponent, { className: "CredentialTypeEditPanelComponent" }); })();
563
- //# sourceMappingURL=credential-type-edit-panel.component.js.map