@memberjunction/ng-dashboards 5.8.0 → 5.10.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 (84) hide show
  1. package/dist/AI/components/models/model-management.component.d.ts +2 -0
  2. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  3. package/dist/AI/components/models/model-management.component.js +44 -2
  4. package/dist/AI/components/models/model-management.component.js.map +1 -1
  5. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  6. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +15 -12
  7. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  8. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  9. package/dist/DataExplorer/components/view-selector/view-selector.component.js +16 -22
  10. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  11. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  12. package/dist/DataExplorer/data-explorer-dashboard.component.js +31 -11
  13. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  14. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  15. package/dist/Home/home-dashboard.component.js +10 -7
  16. package/dist/Home/home-dashboard.component.js.map +1 -1
  17. package/dist/Integration/components/activity/activity.component.d.ts +96 -0
  18. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -0
  19. package/dist/Integration/components/activity/activity.component.js +961 -0
  20. package/dist/Integration/components/activity/activity.component.js.map +1 -0
  21. package/dist/Integration/components/connections/connections.component.d.ts +194 -0
  22. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -0
  23. package/dist/Integration/components/connections/connections.component.js +2368 -0
  24. package/dist/Integration/components/connections/connections.component.js.map +1 -0
  25. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +213 -15
  26. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  27. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2093 -187
  28. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  29. package/dist/Integration/components/overview/overview.component.d.ts +60 -0
  30. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -0
  31. package/dist/Integration/components/overview/overview.component.js +628 -0
  32. package/dist/Integration/components/overview/overview.component.js.map +1 -0
  33. package/dist/Integration/components/pipelines/pipelines.component.d.ts +203 -0
  34. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -0
  35. package/dist/Integration/components/pipelines/pipelines.component.js +2057 -0
  36. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -0
  37. package/dist/Integration/components/schedules/schedules.component.d.ts +110 -0
  38. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -0
  39. package/dist/Integration/components/schedules/schedules.component.js +842 -0
  40. package/dist/Integration/components/schedules/schedules.component.js.map +1 -0
  41. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +141 -0
  42. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -0
  43. package/dist/Integration/components/visual-editor/visual-editor.component.js +1538 -0
  44. package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -0
  45. package/dist/Integration/components/widgets/run-history-panel.component.js +3 -2
  46. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  47. package/dist/Integration/index.d.ts +5 -3
  48. package/dist/Integration/index.d.ts.map +1 -1
  49. package/dist/Integration/index.js +11 -7
  50. package/dist/Integration/index.js.map +1 -1
  51. package/dist/Integration/integration.module.d.ts +20 -16
  52. package/dist/Integration/integration.module.d.ts.map +1 -1
  53. package/dist/Integration/integration.module.js +40 -21
  54. package/dist/Integration/integration.module.js.map +1 -1
  55. package/dist/Integration/services/integration-data.service.d.ts +123 -9
  56. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  57. package/dist/Integration/services/integration-data.service.js +385 -68
  58. package/dist/Integration/services/integration-data.service.js.map +1 -1
  59. package/dist/QueryBrowser/query-browser-resource.component.d.ts +27 -4
  60. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  61. package/dist/QueryBrowser/query-browser-resource.component.js +338 -144
  62. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  63. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  64. package/dist/__tests__/mapping-validation.test.d.ts +2 -0
  65. package/dist/__tests__/mapping-validation.test.d.ts.map +1 -0
  66. package/dist/__tests__/mapping-validation.test.js +170 -0
  67. package/dist/__tests__/mapping-validation.test.js.map +1 -0
  68. package/package.json +40 -38
  69. package/dist/Integration/components/connection-studio/connection-studio.component.d.ts +0 -81
  70. package/dist/Integration/components/connection-studio/connection-studio.component.d.ts.map +0 -1
  71. package/dist/Integration/components/connection-studio/connection-studio.component.js +0 -960
  72. package/dist/Integration/components/connection-studio/connection-studio.component.js.map +0 -1
  73. package/dist/Integration/components/control-tower/control-tower.component.d.ts +0 -43
  74. package/dist/Integration/components/control-tower/control-tower.component.d.ts.map +0 -1
  75. package/dist/Integration/components/control-tower/control-tower.component.js +0 -446
  76. package/dist/Integration/components/control-tower/control-tower.component.js.map +0 -1
  77. package/dist/Integration/components/sync-activity/sync-activity.component.d.ts +0 -65
  78. package/dist/Integration/components/sync-activity/sync-activity.component.d.ts.map +0 -1
  79. package/dist/Integration/components/sync-activity/sync-activity.component.js +0 -671
  80. package/dist/Integration/components/sync-activity/sync-activity.component.js.map +0 -1
  81. package/dist/__tests__/connection-studio.test.d.ts +0 -2
  82. package/dist/__tests__/connection-studio.test.d.ts.map +0 -1
  83. package/dist/__tests__/connection-studio.test.js +0 -186
  84. package/dist/__tests__/connection-studio.test.js.map +0 -1
@@ -0,0 +1,2368 @@
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 { ChangeDetectorRef, Component, inject, ViewChild } from '@angular/core';
8
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
9
+ import { CompositeKey, Metadata, RunView } from '@memberjunction/core';
10
+ import { IntegrationEngineBase } from '@memberjunction/integration-engine-base';
11
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
12
+ import { IntegrationDataService, ResolveIntegrationIcon } from '../../services/integration-data.service';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/forms";
15
+ import * as i2 from "@progress/kendo-angular-buttons";
16
+ import * as i3 from "@memberjunction/ng-shared-generic";
17
+ import * as i4 from "@memberjunction/ng-credentials";
18
+ import * as i5 from "@memberjunction/ng-trees";
19
+ import * as i6 from "../visual-editor/visual-editor.component";
20
+ const _c0 = ["entityTreeDropdown"];
21
+ const _forTrack0 = ($index, $item) => $item.Integration.ID;
22
+ const _forTrack1 = ($index, $item) => $item.Name;
23
+ const _forTrack2 = ($index, $item) => $item.ID;
24
+ const _forTrack3 = ($index, $item) => $item.Number;
25
+ function ConnectionsComponent_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵelementStart(0, "div", 13);
27
+ i0.ɵɵelement(1, "mj-loading", 16);
28
+ i0.ɵɵelementEnd();
29
+ } }
30
+ function ConnectionsComponent_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
31
+ const _r3 = i0.ɵɵgetCurrentView();
32
+ i0.ɵɵelementStart(0, "div", 14);
33
+ i0.ɵɵelement(1, "i", 17);
34
+ i0.ɵɵelementStart(2, "h3");
35
+ i0.ɵɵtext(3, "No integrations yet");
36
+ i0.ɵɵelementEnd();
37
+ i0.ɵɵelementStart(4, "p");
38
+ i0.ɵɵtext(5, "Connect your first external system to start syncing data.");
39
+ i0.ɵɵelementEnd();
40
+ i0.ɵɵelementStart(6, "button", 18);
41
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_10_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenWizard()); });
42
+ i0.ɵɵelement(7, "i", 12);
43
+ i0.ɵɵtext(8, " Add Your First Integration ");
44
+ i0.ɵɵelementEnd()();
45
+ } }
46
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
47
+ i0.ɵɵelement(0, "i", 49);
48
+ } }
49
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelement(0, "i", 50);
51
+ } }
52
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵelementStart(0, "div", 48);
54
+ i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_1_Template, 1, 0, "i", 49)(2, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_2_Template, 1, 0, "i", 50);
55
+ i0.ɵɵelementStart(3, "span");
56
+ i0.ɵɵtext(4);
57
+ i0.ɵɵelementEnd()();
58
+ } if (rf & 2) {
59
+ const testResult_r7 = ctx;
60
+ i0.ɵɵclassProp("test-success", testResult_r7.Success)("test-failure", !testResult_r7.Success);
61
+ i0.ɵɵadvance();
62
+ i0.ɵɵconditional(testResult_r7.Success ? 1 : 2);
63
+ i0.ɵɵadvance(3);
64
+ i0.ɵɵtextInterpolate(testResult_r7.Message);
65
+ } }
66
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Conditional_7_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelement(0, "i", 41);
68
+ i0.ɵɵtext(1, " Deleting... ");
69
+ } }
70
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Conditional_8_Template(rf, ctx) { if (rf & 1) {
71
+ i0.ɵɵtext(0, " Delete ");
72
+ } }
73
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
74
+ const _r8 = i0.ɵɵgetCurrentView();
75
+ i0.ɵɵelementStart(0, "div", 38)(1, "div", 51);
76
+ i0.ɵɵelement(2, "i", 52);
77
+ i0.ɵɵelementStart(3, "span", 53);
78
+ i0.ɵɵtext(4, "Delete this integration and all its entity maps?");
79
+ i0.ɵɵelementEnd();
80
+ i0.ɵɵelementStart(5, "div", 54)(6, "button", 55);
81
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r8); const summary_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ConfirmDelete(summary_r6.Integration.ID)); });
82
+ i0.ɵɵconditionalCreate(7, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Conditional_7_Template, 2, 0)(8, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Conditional_8_Template, 1, 0);
83
+ i0.ɵɵelementEnd();
84
+ i0.ɵɵelementStart(9, "button", 42);
85
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.CancelDelete()); });
86
+ i0.ɵɵtext(10, " Cancel ");
87
+ i0.ɵɵelementEnd()()()();
88
+ } if (rf & 2) {
89
+ const ctx_r1 = i0.ɵɵnextContext(4);
90
+ i0.ɵɵadvance(6);
91
+ i0.ɵɵproperty("disabled", ctx_r1.IsDeleting);
92
+ i0.ɵɵadvance();
93
+ i0.ɵɵconditional(ctx_r1.IsDeleting ? 7 : 8);
94
+ } }
95
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_26_Template(rf, ctx) { if (rf & 1) {
96
+ i0.ɵɵelement(0, "i", 41);
97
+ } }
98
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_27_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵtext(0, " Test ");
100
+ } }
101
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
102
+ const _r9 = i0.ɵɵgetCurrentView();
103
+ i0.ɵɵelementStart(0, "button", 18);
104
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const summary_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RunSync(summary_r6.Integration.ID)); });
105
+ i0.ɵɵtext(1, " Sync Now ");
106
+ i0.ɵɵelementEnd();
107
+ } }
108
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
109
+ const _r10 = i0.ɵɵgetCurrentView();
110
+ i0.ɵɵelementStart(0, "div", 47)(1, "button", 56);
111
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_34_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r10); const summary_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMenuAction("edit", summary_r6)); });
112
+ i0.ɵɵelement(2, "i", 57);
113
+ i0.ɵɵtext(3, " Edit ");
114
+ i0.ɵɵelementEnd();
115
+ i0.ɵɵelementStart(4, "button", 56);
116
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_34_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r10); const summary_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMenuAction("disable", summary_r6)); });
117
+ i0.ɵɵelement(5, "i", 58);
118
+ i0.ɵɵtext(6);
119
+ i0.ɵɵelementEnd();
120
+ i0.ɵɵelementStart(7, "button", 59);
121
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_34_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r10); const summary_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMenuAction("delete", summary_r6)); });
122
+ i0.ɵɵelement(8, "i", 60);
123
+ i0.ɵɵtext(9, " Delete ");
124
+ i0.ɵɵelementEnd()();
125
+ } if (rf & 2) {
126
+ const summary_r6 = i0.ɵɵnextContext().$implicit;
127
+ const ctx_r1 = i0.ɵɵnextContext(3);
128
+ i0.ɵɵadvance(6);
129
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.GetMenuActionLabel(summary_r6), " ");
130
+ } }
131
+ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
132
+ const _r5 = i0.ɵɵgetCurrentView();
133
+ i0.ɵɵelementStart(0, "div", 19)(1, "div", 24);
134
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template_div_click_1_listener() { const summary_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectIntegrationCard(summary_r6)); });
135
+ i0.ɵɵelementStart(2, "div", 25)(3, "div", 26);
136
+ i0.ɵɵelement(4, "i", 27);
137
+ i0.ɵɵelementEnd();
138
+ i0.ɵɵelementStart(5, "span");
139
+ i0.ɵɵtext(6);
140
+ i0.ɵɵelementEnd()();
141
+ i0.ɵɵelementStart(7, "div", 28)(8, "div", 29);
142
+ i0.ɵɵtext(9);
143
+ i0.ɵɵelementEnd();
144
+ i0.ɵɵelementStart(10, "div", 30);
145
+ i0.ɵɵtext(11);
146
+ i0.ɵɵelementEnd();
147
+ i0.ɵɵelementStart(12, "div", 31)(13, "span", 32);
148
+ i0.ɵɵtext(14);
149
+ i0.ɵɵelementEnd();
150
+ i0.ɵɵelementStart(15, "span", 33);
151
+ i0.ɵɵtext(16, "\u00B7");
152
+ i0.ɵɵelementEnd();
153
+ i0.ɵɵelementStart(17, "span", 34);
154
+ i0.ɵɵtext(18);
155
+ i0.ɵɵelementEnd()();
156
+ i0.ɵɵelementStart(19, "div", 35);
157
+ i0.ɵɵelement(20, "i", 36);
158
+ i0.ɵɵtext(21);
159
+ i0.ɵɵelementEnd();
160
+ i0.ɵɵconditionalCreate(22, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Template, 5, 6, "div", 37);
161
+ i0.ɵɵelementEnd()();
162
+ i0.ɵɵconditionalCreate(23, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Template, 11, 2, "div", 38);
163
+ i0.ɵɵelementStart(24, "div", 39)(25, "button", 40);
164
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template_button_click_25_listener() { const summary_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.TestExistingConnection(summary_r6.Integration.ID)); });
165
+ i0.ɵɵconditionalCreate(26, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_26_Template, 1, 0, "i", 41)(27, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_27_Template, 1, 0);
166
+ i0.ɵɵelementEnd();
167
+ i0.ɵɵelementStart(28, "button", 42);
168
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template_button_click_28_listener() { const summary_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMenuAction("edit", summary_r6)); });
169
+ i0.ɵɵtext(29, " Configure ");
170
+ i0.ɵɵelementEnd();
171
+ i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Template, 2, 0, "button", 43);
172
+ i0.ɵɵelementStart(31, "div", 44)(32, "button", 45);
173
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template_button_click_32_listener($event) { const summary_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleMenu(summary_r6.Integration.ID, $event)); });
174
+ i0.ɵɵelement(33, "i", 46);
175
+ i0.ɵɵelementEnd();
176
+ i0.ɵɵconditionalCreate(34, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_34_Template, 10, 1, "div", 47);
177
+ i0.ɵɵelementEnd()()();
178
+ } if (rf & 2) {
179
+ let tmp_21_0;
180
+ const summary_r6 = ctx.$implicit;
181
+ const ctx_r1 = i0.ɵɵnextContext(3);
182
+ i0.ɵɵadvance(3);
183
+ i0.ɵɵstyleProp("background-color", ctx_r1.GetIconBrandColor(summary_r6.Integration.Integration));
184
+ i0.ɵɵadvance();
185
+ i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(summary_r6.Integration.Integration));
186
+ i0.ɵɵadvance();
187
+ i0.ɵɵclassMap(ctx_r1.GetStatusBadgeClass(summary_r6));
188
+ i0.ɵɵadvance();
189
+ i0.ɵɵtextInterpolate(ctx_r1.GetStatusBadge(summary_r6));
190
+ i0.ɵɵadvance(3);
191
+ i0.ɵɵtextInterpolate(summary_r6.Integration.Name);
192
+ i0.ɵɵadvance(2);
193
+ i0.ɵɵtextInterpolate(summary_r6.Integration.Company);
194
+ i0.ɵɵadvance(3);
195
+ i0.ɵɵtextInterpolate(ctx_r1.GetSourceTypeLabel(summary_r6));
196
+ i0.ɵɵadvance(4);
197
+ i0.ɵɵtextInterpolate(ctx_r1.GetCredentialHint(summary_r6));
198
+ i0.ɵɵadvance(3);
199
+ i0.ɵɵtextInterpolate1(" Syncing ", ctx_r1.GetEntityMapCount(summary_r6.Integration.ID), " entities ");
200
+ i0.ɵɵadvance();
201
+ i0.ɵɵconditional((tmp_21_0 = ctx_r1.GetCardTestResult(summary_r6.Integration.ID)) ? 22 : -1, tmp_21_0);
202
+ i0.ɵɵadvance();
203
+ i0.ɵɵconditional(ctx_r1.IsDeleteConfirming(summary_r6.Integration.ID) ? 23 : -1);
204
+ i0.ɵɵadvance(2);
205
+ i0.ɵɵproperty("disabled", !!ctx_r1.TestingCardID);
206
+ i0.ɵɵadvance();
207
+ i0.ɵɵconditional(ctx_r1.IsTestingCard(summary_r6.Integration.ID) ? 26 : 27);
208
+ i0.ɵɵadvance(4);
209
+ i0.ɵɵconditional(ctx_r1.IsConnectionActive(summary_r6) ? 30 : -1);
210
+ i0.ɵɵadvance(4);
211
+ i0.ɵɵconditional(ctx_r1.IsMenuOpen(summary_r6.Integration.ID) ? 34 : -1);
212
+ } }
213
+ function ConnectionsComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
214
+ const _r4 = i0.ɵɵgetCurrentView();
215
+ i0.ɵɵelementStart(0, "div", 15);
216
+ i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template, 35, 18, "div", 19, _forTrack0);
217
+ i0.ɵɵelementStart(3, "div", 20);
218
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenWizard()); });
219
+ i0.ɵɵelementStart(4, "div", 21)(5, "div", 22);
220
+ i0.ɵɵelement(6, "i", 12);
221
+ i0.ɵɵelementEnd();
222
+ i0.ɵɵelementStart(7, "span", 23);
223
+ i0.ɵɵtext(8, "Add Integration");
224
+ i0.ɵɵelementEnd()()()();
225
+ } if (rf & 2) {
226
+ const ctx_r1 = i0.ɵɵnextContext(2);
227
+ i0.ɵɵadvance();
228
+ i0.ɵɵrepeater(ctx_r1.Connections);
229
+ } }
230
+ function ConnectionsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
231
+ const _r1 = i0.ɵɵgetCurrentView();
232
+ i0.ɵɵelementStart(0, "div", 7)(1, "div", 8)(2, "h2", 9);
233
+ i0.ɵɵtext(3, "Integrations");
234
+ i0.ɵɵelementEnd();
235
+ i0.ɵɵelementStart(4, "span", 10);
236
+ i0.ɵɵtext(5);
237
+ i0.ɵɵelementEnd()();
238
+ i0.ɵɵelementStart(6, "button", 11);
239
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenWizard()); });
240
+ i0.ɵɵelement(7, "i", 12);
241
+ i0.ɵɵtext(8, " Add Integration ");
242
+ i0.ɵɵelementEnd()();
243
+ i0.ɵɵconditionalCreate(9, ConnectionsComponent_Conditional_1_Conditional_9_Template, 2, 0, "div", 13);
244
+ i0.ɵɵconditionalCreate(10, ConnectionsComponent_Conditional_1_Conditional_10_Template, 9, 0, "div", 14);
245
+ i0.ɵɵconditionalCreate(11, ConnectionsComponent_Conditional_1_Conditional_11_Template, 9, 0, "div", 15);
246
+ } if (rf & 2) {
247
+ const ctx_r1 = i0.ɵɵnextContext();
248
+ i0.ɵɵadvance(5);
249
+ i0.ɵɵtextInterpolate2("", ctx_r1.Connections.length, " integration", ctx_r1.Connections.length !== 1 ? "s" : "");
250
+ i0.ɵɵadvance(4);
251
+ i0.ɵɵconditional(ctx_r1.IsLoading ? 9 : -1);
252
+ i0.ɵɵadvance();
253
+ i0.ɵɵconditional(!ctx_r1.IsLoading && ctx_r1.Connections.length === 0 ? 10 : -1);
254
+ i0.ɵɵadvance();
255
+ i0.ɵɵconditional(!ctx_r1.IsLoading && ctx_r1.Connections.length > 0 ? 11 : -1);
256
+ } }
257
+ function ConnectionsComponent_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
258
+ const _r11 = i0.ɵɵgetCurrentView();
259
+ i0.ɵɵelementStart(0, "app-visual-field-editor", 62);
260
+ i0.ɵɵlistener("Close", function ConnectionsComponent_Conditional_2_Conditional_1_Template_app_visual_field_editor_Close_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseEntityMapEditor()); });
261
+ i0.ɵɵelementEnd();
262
+ } if (rf & 2) {
263
+ const ctx_r1 = i0.ɵɵnextContext(2);
264
+ i0.ɵɵproperty("EntityMap", ctx_r1.EditorEntityMap)("CompanyIntegrationID", ctx_r1.SelectedSummary.Integration.ID)("RunViewProvider", ctx_r1.RunViewToUse);
265
+ } }
266
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
267
+ const _r13 = i0.ɵɵgetCurrentView();
268
+ i0.ɵɵelementStart(0, "button", 18);
269
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RunSync(ctx_r1.SelectedSummary.Integration.ID)); });
270
+ i0.ɵɵelement(1, "i", 36);
271
+ i0.ɵɵtext(2, " Sync Now ");
272
+ i0.ɵɵelementEnd();
273
+ } }
274
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_5_Template(rf, ctx) { if (rf & 1) {
275
+ i0.ɵɵelementStart(0, "div", 85);
276
+ i0.ɵɵelement(1, "i", 41);
277
+ i0.ɵɵtext(2, " Loading...");
278
+ i0.ɵɵelementEnd();
279
+ } }
280
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_6_Template(rf, ctx) { if (rf & 1) {
281
+ i0.ɵɵelementStart(0, "div", 86);
282
+ i0.ɵɵtext(1, "No source objects found in metadata");
283
+ i0.ɵɵelementEnd();
284
+ } }
285
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_7_For_4_Template(rf, ctx) { if (rf & 1) {
286
+ i0.ɵɵelementStart(0, "option", 105);
287
+ i0.ɵɵtext(1);
288
+ i0.ɵɵelementEnd();
289
+ } if (rf & 2) {
290
+ const obj_r16 = ctx.$implicit;
291
+ i0.ɵɵproperty("value", obj_r16.Name);
292
+ i0.ɵɵadvance();
293
+ i0.ɵɵtextInterpolate(obj_r16.Label || obj_r16.Name);
294
+ } }
295
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_7_Template(rf, ctx) { if (rf & 1) {
296
+ const _r15 = i0.ɵɵgetCurrentView();
297
+ i0.ɵɵelementStart(0, "select", 103);
298
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_7_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.AddMapSourceObjectName, $event) || (ctx_r1.AddMapSourceObjectName = $event); return i0.ɵɵresetView($event); });
299
+ i0.ɵɵelementStart(1, "option", 104);
300
+ i0.ɵɵtext(2, "Select source object...");
301
+ i0.ɵɵelementEnd();
302
+ i0.ɵɵrepeaterCreate(3, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_7_For_4_Template, 2, 2, "option", 105, _forTrack1);
303
+ i0.ɵɵelementEnd();
304
+ } if (rf & 2) {
305
+ const ctx_r1 = i0.ɵɵnextContext(4);
306
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.AddMapSourceObjectName);
307
+ i0.ɵɵadvance();
308
+ i0.ɵɵproperty("ngValue", "");
309
+ i0.ɵɵadvance(2);
310
+ i0.ɵɵrepeater(ctx_r1.AvailableSourceObjects);
311
+ } }
312
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_29_Template(rf, ctx) { if (rf & 1) {
313
+ i0.ɵɵelement(0, "i", 41);
314
+ } }
315
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_30_Template(rf, ctx) { if (rf & 1) {
316
+ i0.ɵɵelement(0, "i", 106);
317
+ i0.ɵɵtext(1, " Add ");
318
+ } }
319
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template(rf, ctx) { if (rf & 1) {
320
+ const _r14 = i0.ɵɵgetCurrentView();
321
+ i0.ɵɵelementStart(0, "div", 80)(1, "div", 82)(2, "div", 83)(3, "label", 84);
322
+ i0.ɵɵtext(4, "Source Object");
323
+ i0.ɵɵelementEnd();
324
+ i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_5_Template, 3, 0, "div", 85)(6, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_6_Template, 2, 0, "div", 86)(7, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_7_Template, 5, 2, "select", 87);
325
+ i0.ɵɵelementEnd();
326
+ i0.ɵɵelementStart(8, "div", 88)(9, "label", 84);
327
+ i0.ɵɵtext(10, "Direction");
328
+ i0.ɵɵelementEnd();
329
+ i0.ɵɵelementStart(11, "div", 89)(12, "button", 90);
330
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Pull"); });
331
+ i0.ɵɵelement(13, "i", 91);
332
+ i0.ɵɵelementEnd();
333
+ i0.ɵɵelementStart(14, "button", 92);
334
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Bidirectional"); });
335
+ i0.ɵɵelement(15, "i", 93);
336
+ i0.ɵɵelementEnd();
337
+ i0.ɵɵelementStart(16, "button", 94);
338
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Push"); });
339
+ i0.ɵɵelement(17, "i", 65);
340
+ i0.ɵɵelementEnd()()();
341
+ i0.ɵɵelementStart(18, "div", 95)(19, "label", 84);
342
+ i0.ɵɵtext(20, "MJ Entity");
343
+ i0.ɵɵelementEnd();
344
+ i0.ɵɵelementStart(21, "div", 96)(22, "mj-tree-dropdown", 97, 0);
345
+ i0.ɵɵlistener("SelectionChange", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template_mj_tree_dropdown_SelectionChange_22_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnEntityTreeSelection($event)); });
346
+ i0.ɵɵelementEnd();
347
+ i0.ɵɵelementStart(24, "button", 98);
348
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template_button_click_24_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenNewEntityDialog()); });
349
+ i0.ɵɵelement(25, "i", 12);
350
+ i0.ɵɵtext(26, " New ");
351
+ i0.ɵɵelementEnd()()();
352
+ i0.ɵɵelementStart(27, "div", 99)(28, "button", 100);
353
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveAddMap()); });
354
+ i0.ɵɵconditionalCreate(29, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_29_Template, 1, 0, "i", 41)(30, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditional_30_Template, 2, 0);
355
+ i0.ɵɵelementEnd();
356
+ i0.ɵɵelementStart(31, "button", 101);
357
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template_button_click_31_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseAddMapPanel()); });
358
+ i0.ɵɵelement(32, "i", 102);
359
+ i0.ɵɵelementEnd()()()();
360
+ } if (rf & 2) {
361
+ const ctx_r1 = i0.ɵɵnextContext(3);
362
+ i0.ɵɵadvance(5);
363
+ i0.ɵɵconditional(ctx_r1.IsLoadingSourceObjects ? 5 : ctx_r1.AvailableSourceObjects.length === 0 ? 6 : 7);
364
+ i0.ɵɵadvance(7);
365
+ i0.ɵɵclassProp("active", ctx_r1.AddMapDirection === "Pull");
366
+ i0.ɵɵadvance(2);
367
+ i0.ɵɵclassProp("active", ctx_r1.AddMapDirection === "Bidirectional");
368
+ i0.ɵɵadvance(2);
369
+ i0.ɵɵclassProp("active", ctx_r1.AddMapDirection === "Push");
370
+ i0.ɵɵadvance(6);
371
+ i0.ɵɵproperty("BranchConfig", ctx_r1.EntityBranchConfig)("LeafConfig", ctx_r1.EntityLeafConfig)("Value", ctx_r1.AddMapEntityIDAsKey)("SelectableTypes", "leaf")("SelectionMode", "single")("Placeholder", "Search entities by schema...")("EnableSearch", true);
372
+ i0.ɵɵadvance(6);
373
+ i0.ɵɵproperty("disabled", !ctx_r1.CanSaveAddMap || ctx_r1.IsSavingAddMap);
374
+ i0.ɵɵadvance();
375
+ i0.ɵɵconditional(ctx_r1.IsSavingAddMap ? 29 : 30);
376
+ } }
377
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_37_Template(rf, ctx) { if (rf & 1) {
378
+ i0.ɵɵelementStart(0, "div", 13);
379
+ i0.ɵɵelement(1, "mj-loading", 107);
380
+ i0.ɵɵelementEnd();
381
+ } }
382
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_38_Template(rf, ctx) { if (rf & 1) {
383
+ const _r17 = i0.ɵɵgetCurrentView();
384
+ i0.ɵɵelementStart(0, "div", 81);
385
+ i0.ɵɵelement(1, "i", 108);
386
+ i0.ɵɵelementStart(2, "h3");
387
+ i0.ɵɵtext(3, "No entity maps configured");
388
+ i0.ɵɵelementEnd();
389
+ i0.ɵɵelementStart(4, "p");
390
+ i0.ɵɵtext(5, "Entity maps define how external objects sync to MJ entities.");
391
+ i0.ɵɵelementEnd();
392
+ i0.ɵɵelementStart(6, "button", 109);
393
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_38_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleAddMapPanel()); });
394
+ i0.ɵɵelement(7, "i", 12);
395
+ i0.ɵɵtext(8, " Add Your First Entity Map ");
396
+ i0.ɵɵelementEnd()();
397
+ } }
398
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_For_12_Conditional_13_Template(rf, ctx) { if (rf & 1) {
399
+ i0.ɵɵelementStart(0, "span", 126);
400
+ i0.ɵɵelement(1, "i", 130);
401
+ i0.ɵɵelementEnd();
402
+ } }
403
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_For_12_Template(rf, ctx) { if (rf & 1) {
404
+ const _r18 = i0.ɵɵgetCurrentView();
405
+ i0.ɵɵelementStart(0, "div", 119);
406
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_For_12_Template_div_click_0_listener() { const em_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnEntityMapClick(em_r19)); });
407
+ i0.ɵɵelementStart(1, "span", 120);
408
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_For_12_Template_span_click_1_listener($event) { i0.ɵɵrestoreView(_r18); return i0.ɵɵresetView($event.stopPropagation()); });
409
+ i0.ɵɵelementStart(2, "label", 121)(3, "input", 122);
410
+ i0.ɵɵlistener("change", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_For_12_Template_input_change_3_listener($event) { const em_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnToggleMapEnabled(em_r19, $event)); });
411
+ i0.ɵɵelementEnd();
412
+ i0.ɵɵelement(4, "span", 123);
413
+ i0.ɵɵelementEnd()();
414
+ i0.ɵɵelementStart(5, "span", 124);
415
+ i0.ɵɵtext(6);
416
+ i0.ɵɵelementEnd();
417
+ i0.ɵɵelementStart(7, "span", 113)(8, "span");
418
+ i0.ɵɵtext(9);
419
+ i0.ɵɵelementEnd()();
420
+ i0.ɵɵelementStart(10, "span", 125);
421
+ i0.ɵɵtext(11);
422
+ i0.ɵɵelementEnd();
423
+ i0.ɵɵelementStart(12, "span", 115);
424
+ i0.ɵɵconditionalCreate(13, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_For_12_Conditional_13_Template, 2, 0, "span", 126);
425
+ i0.ɵɵelementStart(14, "span", 127);
426
+ i0.ɵɵelement(15, "i", 36);
427
+ i0.ɵɵelementEnd();
428
+ i0.ɵɵelementStart(16, "span", 128);
429
+ i0.ɵɵelement(17, "i", 129);
430
+ i0.ɵɵelementEnd()()();
431
+ } if (rf & 2) {
432
+ const em_r19 = ctx.$implicit;
433
+ const ctx_r1 = i0.ɵɵnextContext(4);
434
+ i0.ɵɵclassProp("sync-disabled", !em_r19.SyncEnabled);
435
+ i0.ɵɵadvance(2);
436
+ i0.ɵɵproperty("title", em_r19.SyncEnabled ? "Sync enabled" : "Sync disabled");
437
+ i0.ɵɵadvance();
438
+ i0.ɵɵproperty("checked", em_r19.SyncEnabled);
439
+ i0.ɵɵadvance(2);
440
+ i0.ɵɵproperty("title", em_r19.ExternalObjectName);
441
+ i0.ɵɵadvance();
442
+ i0.ɵɵtextInterpolate1(" ", em_r19.ExternalObjectLabel ?? em_r19.ExternalObjectName, " ");
443
+ i0.ɵɵadvance(2);
444
+ i0.ɵɵclassMap(ctx_r1.DirectionBadgeClass(em_r19.SyncDirection));
445
+ i0.ɵɵadvance();
446
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.DirectionText(em_r19.SyncDirection), " ");
447
+ i0.ɵɵadvance();
448
+ i0.ɵɵproperty("title", em_r19.Entity);
449
+ i0.ɵɵadvance();
450
+ i0.ɵɵtextInterpolate1(" ", em_r19.Entity, " ");
451
+ i0.ɵɵadvance(2);
452
+ i0.ɵɵconditional(em_r19.MatchStrategy ? 13 : -1);
453
+ i0.ɵɵadvance();
454
+ i0.ɵɵproperty("title", "Conflict: " + em_r19.ConflictResolution);
455
+ } }
456
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_ForEmpty_13_Template(rf, ctx) { if (rf & 1) {
457
+ i0.ɵɵelementStart(0, "div", 118);
458
+ i0.ɵɵtext(1, " No entity maps match your filter. ");
459
+ i0.ɵɵelementEnd();
460
+ } }
461
+ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_Template(rf, ctx) { if (rf & 1) {
462
+ i0.ɵɵelementStart(0, "div", 110)(1, "span", 111);
463
+ i0.ɵɵtext(2, "Sync");
464
+ i0.ɵɵelementEnd();
465
+ i0.ɵɵelementStart(3, "span", 112);
466
+ i0.ɵɵtext(4, "External Object");
467
+ i0.ɵɵelementEnd();
468
+ i0.ɵɵelement(5, "span", 113);
469
+ i0.ɵɵelementStart(6, "span", 114);
470
+ i0.ɵɵtext(7, "MJ Entity");
471
+ i0.ɵɵelementEnd();
472
+ i0.ɵɵelementStart(8, "span", 115);
473
+ i0.ɵɵtext(9, "Config");
474
+ i0.ɵɵelementEnd()();
475
+ i0.ɵɵelementStart(10, "div", 116);
476
+ i0.ɵɵrepeaterCreate(11, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_For_12_Template, 18, 13, "div", 117, _forTrack2, false, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_ForEmpty_13_Template, 2, 0, "div", 118);
477
+ i0.ɵɵelementEnd();
478
+ } if (rf & 2) {
479
+ const ctx_r1 = i0.ɵɵnextContext(3);
480
+ i0.ɵɵadvance(11);
481
+ i0.ɵɵrepeater(ctx_r1.DetailFilteredMaps);
482
+ } }
483
+ function ConnectionsComponent_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
484
+ const _r12 = i0.ɵɵgetCurrentView();
485
+ i0.ɵɵelementStart(0, "div", 63)(1, "button", 64);
486
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseDetailView()); });
487
+ i0.ɵɵelement(2, "i", 65);
488
+ i0.ɵɵelementEnd();
489
+ i0.ɵɵelementStart(3, "div", 66)(4, "div", 26);
490
+ i0.ɵɵelement(5, "i", 27);
491
+ i0.ɵɵelementEnd();
492
+ i0.ɵɵelementStart(6, "div", 67)(7, "h2", 68);
493
+ i0.ɵɵtext(8);
494
+ i0.ɵɵelementEnd();
495
+ i0.ɵɵelementStart(9, "span", 69);
496
+ i0.ɵɵtext(10);
497
+ i0.ɵɵelementStart(11, "span", 33);
498
+ i0.ɵɵtext(12, "\u00B7");
499
+ i0.ɵɵelementEnd();
500
+ i0.ɵɵtext(13);
501
+ i0.ɵɵelementStart(14, "span", 33);
502
+ i0.ɵɵtext(15, "\u00B7");
503
+ i0.ɵɵelementEnd();
504
+ i0.ɵɵelementStart(16, "span");
505
+ i0.ɵɵtext(17);
506
+ i0.ɵɵelementEnd()()()();
507
+ i0.ɵɵelementStart(18, "div", 70)(19, "button", 71);
508
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenEditPanel(ctx_r1.SelectedSummary)); });
509
+ i0.ɵɵelement(20, "i", 57);
510
+ i0.ɵɵelementEnd();
511
+ i0.ɵɵconditionalCreate(21, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Template, 3, 0, "button", 43);
512
+ i0.ɵɵelementEnd()();
513
+ i0.ɵɵelementStart(22, "div", 72)(23, "div", 73)(24, "span", 74);
514
+ i0.ɵɵtext(25);
515
+ i0.ɵɵelementStart(26, "span", 33);
516
+ i0.ɵɵtext(27, "\u00B7");
517
+ i0.ɵɵelementEnd();
518
+ i0.ɵɵtext(28);
519
+ i0.ɵɵelementEnd()();
520
+ i0.ɵɵelementStart(29, "div", 75)(30, "div", 76);
521
+ i0.ɵɵelement(31, "i", 77);
522
+ i0.ɵɵelementStart(32, "input", 78);
523
+ i0.ɵɵlistener("input", function ConnectionsComponent_Conditional_2_Conditional_2_Template_input_input_32_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDetailSearch($event)); });
524
+ i0.ɵɵelementEnd()();
525
+ i0.ɵɵelementStart(33, "button", 79);
526
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_33_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleAddMapPanel()); });
527
+ i0.ɵɵelement(34, "i", 12);
528
+ i0.ɵɵtext(35, " Add Map ");
529
+ i0.ɵɵelementEnd()()();
530
+ i0.ɵɵconditionalCreate(36, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Template, 33, 16, "div", 80);
531
+ i0.ɵɵconditionalCreate(37, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_37_Template, 2, 0, "div", 13)(38, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_38_Template, 9, 0, "div", 81)(39, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_Template, 14, 1);
532
+ } if (rf & 2) {
533
+ const ctx_r1 = i0.ɵɵnextContext(2);
534
+ i0.ɵɵadvance(4);
535
+ i0.ɵɵstyleProp("background-color", ctx_r1.GetIconBrandColor(ctx_r1.SelectedSummary.Integration.Integration));
536
+ i0.ɵɵadvance();
537
+ i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(ctx_r1.SelectedSummary.Integration.Integration));
538
+ i0.ɵɵadvance(3);
539
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedSummary.Integration.Name);
540
+ i0.ɵɵadvance(2);
541
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.SelectedSummary.Integration.Company, " ");
542
+ i0.ɵɵadvance(3);
543
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.GetSourceTypeLabel(ctx_r1.SelectedSummary), " ");
544
+ i0.ɵɵadvance(3);
545
+ i0.ɵɵclassMap(ctx_r1.GetStatusBadgeClass(ctx_r1.SelectedSummary));
546
+ i0.ɵɵadvance();
547
+ i0.ɵɵtextInterpolate(ctx_r1.GetStatusBadge(ctx_r1.SelectedSummary));
548
+ i0.ɵɵadvance(4);
549
+ i0.ɵɵconditional(ctx_r1.IsConnectionActive(ctx_r1.SelectedSummary) ? 21 : -1);
550
+ i0.ɵɵadvance(4);
551
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.DetailEntityMaps.length, " entity map", ctx_r1.DetailEntityMaps.length !== 1 ? "s" : "", " ");
552
+ i0.ɵɵadvance(3);
553
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.DetailActiveMapCount, " active ");
554
+ i0.ɵɵadvance(4);
555
+ i0.ɵɵproperty("value", ctx_r1.DetailSearchTerm);
556
+ i0.ɵɵadvance();
557
+ i0.ɵɵclassProp("active", ctx_r1.ShowAddMapPanel);
558
+ i0.ɵɵadvance(3);
559
+ i0.ɵɵconditional(ctx_r1.ShowAddMapPanel ? 36 : -1);
560
+ i0.ɵɵadvance();
561
+ i0.ɵɵconditional(ctx_r1.IsDetailLoading ? 37 : ctx_r1.DetailEntityMaps.length === 0 && !ctx_r1.ShowAddMapPanel ? 38 : ctx_r1.DetailEntityMaps.length > 0 ? 39 : -1);
562
+ } }
563
+ function ConnectionsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
564
+ i0.ɵɵelementStart(0, "div", 2);
565
+ i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_2_Conditional_1_Template, 1, 3, "app-visual-field-editor", 61)(2, ConnectionsComponent_Conditional_2_Conditional_2_Template, 40, 19);
566
+ i0.ɵɵelementEnd();
567
+ } if (rf & 2) {
568
+ const ctx_r1 = i0.ɵɵnextContext();
569
+ i0.ɵɵadvance();
570
+ i0.ɵɵconditional(ctx_r1.EditorEntityMap ? 1 : 2);
571
+ } }
572
+ function ConnectionsComponent_Conditional_3_For_9_Conditional_2_Template(rf, ctx) { if (rf & 1) {
573
+ i0.ɵɵelement(0, "i", 106);
574
+ } }
575
+ function ConnectionsComponent_Conditional_3_For_9_Conditional_3_Template(rf, ctx) { if (rf & 1) {
576
+ i0.ɵɵtext(0);
577
+ } if (rf & 2) {
578
+ const step_r21 = i0.ɵɵnextContext().$implicit;
579
+ i0.ɵɵtextInterpolate1(" ", step_r21.Number, " ");
580
+ } }
581
+ function ConnectionsComponent_Conditional_3_For_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
582
+ i0.ɵɵelement(0, "div", 147);
583
+ } if (rf & 2) {
584
+ const step_r21 = i0.ɵɵnextContext().$implicit;
585
+ const ctx_r1 = i0.ɵɵnextContext(2);
586
+ i0.ɵɵclassProp("step-line-active", ctx_r1.IsStepCompleted(step_r21.Number));
587
+ } }
588
+ function ConnectionsComponent_Conditional_3_For_9_Template(rf, ctx) { if (rf & 1) {
589
+ i0.ɵɵelementStart(0, "div", 143)(1, "div", 144);
590
+ i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_3_For_9_Conditional_2_Template, 1, 0, "i", 106)(3, ConnectionsComponent_Conditional_3_For_9_Conditional_3_Template, 1, 1);
591
+ i0.ɵɵelementEnd();
592
+ i0.ɵɵelementStart(4, "span", 145);
593
+ i0.ɵɵtext(5);
594
+ i0.ɵɵelementEnd()();
595
+ i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_For_9_Conditional_6_Template, 1, 2, "div", 146);
596
+ } if (rf & 2) {
597
+ const step_r21 = ctx.$implicit;
598
+ const ctx_r1 = i0.ɵɵnextContext(2);
599
+ i0.ɵɵclassProp("step-active", ctx_r1.IsStepActive(step_r21.Number))("step-completed", ctx_r1.IsStepCompleted(step_r21.Number));
600
+ i0.ɵɵadvance(2);
601
+ i0.ɵɵconditional(ctx_r1.IsStepCompleted(step_r21.Number) ? 2 : 3);
602
+ i0.ɵɵadvance(3);
603
+ i0.ɵɵtextInterpolate(step_r21.Label);
604
+ i0.ɵɵadvance();
605
+ i0.ɵɵconditional(step_r21.Number < ctx_r1.WizardSteps.length ? 6 : -1);
606
+ } }
607
+ function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
608
+ i0.ɵɵelementStart(0, "div", 152);
609
+ i0.ɵɵelement(1, "i", 154);
610
+ i0.ɵɵelementStart(2, "p");
611
+ i0.ɵɵtext(3, "No integrations configured");
612
+ i0.ɵɵelementEnd();
613
+ i0.ɵɵelementStart(4, "span", 155);
614
+ i0.ɵɵtext(5, "Configure integration definitions in the admin area first.");
615
+ i0.ɵɵelementEnd()();
616
+ } }
617
+ function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
618
+ i0.ɵɵelementStart(0, "div", 152);
619
+ i0.ɵɵelement(1, "i", 156);
620
+ i0.ɵɵelementStart(2, "p");
621
+ i0.ɵɵtext(3, "No matching integrations");
622
+ i0.ɵɵelementEnd()();
623
+ } }
624
+ function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
625
+ i0.ɵɵelementStart(0, "div", 161);
626
+ i0.ɵɵtext(1);
627
+ i0.ɵɵelementEnd();
628
+ } if (rf & 2) {
629
+ const def_r24 = i0.ɵɵnextContext().$implicit;
630
+ i0.ɵɵadvance();
631
+ i0.ɵɵtextInterpolate(def_r24.Description);
632
+ } }
633
+ function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
634
+ const _r23 = i0.ɵɵgetCurrentView();
635
+ i0.ɵɵelementStart(0, "div", 158);
636
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Template_div_click_0_listener() { const def_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectIntegration(def_r24)); });
637
+ i0.ɵɵelementStart(1, "div", 159);
638
+ i0.ɵɵelement(2, "i");
639
+ i0.ɵɵelementEnd();
640
+ i0.ɵɵelementStart(3, "div", 160);
641
+ i0.ɵɵtext(4);
642
+ i0.ɵɵelementEnd();
643
+ i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Conditional_5_Template, 2, 1, "div", 161);
644
+ i0.ɵɵelementEnd();
645
+ } if (rf & 2) {
646
+ const def_r24 = ctx.$implicit;
647
+ const ctx_r1 = i0.ɵɵnextContext(4);
648
+ i0.ɵɵclassProp("picker-selected", ctx_r1.IsSelectedIntegration(def_r24));
649
+ i0.ɵɵadvance();
650
+ i0.ɵɵstyleProp("background-color", ctx_r1.GetIconBrandColor(def_r24.Name));
651
+ i0.ɵɵadvance();
652
+ i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(def_r24.Name));
653
+ i0.ɵɵadvance(2);
654
+ i0.ɵɵtextInterpolate(def_r24.Name);
655
+ i0.ɵɵadvance();
656
+ i0.ɵɵconditional(def_r24.Description ? 5 : -1);
657
+ } }
658
+ function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_Template(rf, ctx) { if (rf & 1) {
659
+ i0.ɵɵelementStart(0, "div", 153);
660
+ i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Template, 6, 8, "div", 157, _forTrack2);
661
+ i0.ɵɵelementEnd();
662
+ } if (rf & 2) {
663
+ const ctx_r1 = i0.ɵɵnextContext(3);
664
+ i0.ɵɵadvance();
665
+ i0.ɵɵrepeater(ctx_r1.FilteredIntegrations);
666
+ } }
667
+ function ConnectionsComponent_Conditional_3_Conditional_11_Template(rf, ctx) { if (rf & 1) {
668
+ const _r22 = i0.ɵɵgetCurrentView();
669
+ i0.ɵɵelementStart(0, "div", 136)(1, "h3", 148);
670
+ i0.ɵɵtext(2, "What system do you want to connect?");
671
+ i0.ɵɵelementEnd();
672
+ i0.ɵɵelementStart(3, "div", 149);
673
+ i0.ɵɵelement(4, "i", 150);
674
+ i0.ɵɵelementStart(5, "input", 151);
675
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_11_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.SearchQuery, $event) || (ctx_r1.SearchQuery = $event); return i0.ɵɵresetView($event); });
676
+ i0.ɵɵelementEnd()();
677
+ i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_6_Template, 6, 0, "div", 152)(7, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_7_Template, 4, 0, "div", 152)(8, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_Template, 3, 0, "div", 153);
678
+ i0.ɵɵelementEnd();
679
+ } if (rf & 2) {
680
+ const ctx_r1 = i0.ɵɵnextContext(2);
681
+ i0.ɵɵadvance(5);
682
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SearchQuery);
683
+ i0.ɵɵadvance();
684
+ i0.ɵɵconditional(ctx_r1.FilteredIntegrations.length === 0 && ctx_r1.AvailableIntegrations.length === 0 ? 6 : ctx_r1.FilteredIntegrations.length === 0 ? 7 : 8);
685
+ } }
686
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_For_4_Template(rf, ctx) { if (rf & 1) {
687
+ i0.ɵɵelementStart(0, "option", 105);
688
+ i0.ɵɵtext(1);
689
+ i0.ɵɵelementEnd();
690
+ } if (rf & 2) {
691
+ const company_r27 = ctx.$implicit;
692
+ i0.ɵɵproperty("value", company_r27.ID);
693
+ i0.ɵɵadvance();
694
+ i0.ɵɵtextInterpolate(company_r27.Name);
695
+ } }
696
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
697
+ const _r26 = i0.ɵɵgetCurrentView();
698
+ i0.ɵɵelementStart(0, "select", 177);
699
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedCompanyID, $event) || (ctx_r1.SelectedCompanyID = $event); return i0.ɵɵresetView($event); });
700
+ i0.ɵɵelementStart(1, "option", 104);
701
+ i0.ɵɵtext(2, "Select a company...");
702
+ i0.ɵɵelementEnd();
703
+ i0.ɵɵrepeaterCreate(3, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_For_4_Template, 2, 2, "option", 105, _forTrack2);
704
+ i0.ɵɵelementEnd();
705
+ } if (rf & 2) {
706
+ const ctx_r1 = i0.ɵɵnextContext(3);
707
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedCompanyID);
708
+ i0.ɵɵadvance();
709
+ i0.ɵɵproperty("ngValue", null);
710
+ i0.ɵɵadvance(2);
711
+ i0.ɵɵrepeater(ctx_r1.Companies);
712
+ } }
713
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_11_Template(rf, ctx) { if (rf & 1) {
714
+ i0.ɵɵelement(0, "input", 167);
715
+ } if (rf & 2) {
716
+ const ctx_r1 = i0.ɵɵnextContext(3);
717
+ i0.ɵɵproperty("value", ctx_r1.Companies[0].Name);
718
+ } }
719
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_12_Template(rf, ctx) { if (rf & 1) {
720
+ i0.ɵɵelementStart(0, "div", 168);
721
+ i0.ɵɵtext(1, "No companies available. Create one in the admin area.");
722
+ i0.ɵɵelementEnd();
723
+ } }
724
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Template(rf, ctx) { if (rf & 1) {
725
+ const _r28 = i0.ɵɵgetCurrentView();
726
+ i0.ɵɵelementStart(0, "div", 173)(1, "div", 178);
727
+ i0.ɵɵelement(2, "i", 179);
728
+ i0.ɵɵelementStart(3, "span");
729
+ i0.ɵɵtext(4);
730
+ i0.ɵɵelementEnd()();
731
+ i0.ɵɵelementStart(5, "button", 180);
732
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ClearCredential()); });
733
+ i0.ɵɵelement(6, "i", 102);
734
+ i0.ɵɵelementEnd()();
735
+ } if (rf & 2) {
736
+ const ctx_r1 = i0.ɵɵnextContext(3);
737
+ i0.ɵɵadvance(4);
738
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedCredential.Name);
739
+ } }
740
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template(rf, ctx) { if (rf & 1) {
741
+ const _r29 = i0.ɵɵgetCurrentView();
742
+ i0.ɵɵelementStart(0, "div", 174)(1, "button", 42);
743
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ShowExistingCredentials()); });
744
+ i0.ɵɵelement(2, "i", 179);
745
+ i0.ɵɵtext(3, " Choose Existing Credential ");
746
+ i0.ɵɵelementEnd();
747
+ i0.ɵɵelementStart(4, "button", 42);
748
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenCredentialDialog()); });
749
+ i0.ɵɵelement(5, "i", 12);
750
+ i0.ɵɵtext(6, " Create New Credential ");
751
+ i0.ɵɵelementEnd()();
752
+ } }
753
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_24_Template(rf, ctx) { if (rf & 1) {
754
+ i0.ɵɵelementStart(0, "div", 175);
755
+ i0.ɵɵelement(1, "mj-loading", 181);
756
+ i0.ɵɵelementEnd();
757
+ } }
758
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_For_2_Template(rf, ctx) { if (rf & 1) {
759
+ const _r30 = i0.ɵɵgetCurrentView();
760
+ i0.ɵɵelementStart(0, "div", 183);
761
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_For_2_Template_div_click_0_listener() { const cred_r31 = i0.ɵɵrestoreView(_r30).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectExistingCredential(cred_r31)); });
762
+ i0.ɵɵelement(1, "i", 179);
763
+ i0.ɵɵelementStart(2, "span");
764
+ i0.ɵɵtext(3);
765
+ i0.ɵɵelementEnd()();
766
+ } if (rf & 2) {
767
+ const cred_r31 = ctx.$implicit;
768
+ i0.ɵɵadvance(3);
769
+ i0.ɵɵtextInterpolate(cred_r31.Name);
770
+ } }
771
+ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_Template(rf, ctx) { if (rf & 1) {
772
+ i0.ɵɵelementStart(0, "div", 176);
773
+ i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_For_2_Template, 4, 1, "div", 182, _forTrack2);
774
+ i0.ɵɵelementEnd();
775
+ } if (rf & 2) {
776
+ const ctx_r1 = i0.ɵɵnextContext(3);
777
+ i0.ɵɵadvance();
778
+ i0.ɵɵrepeater(ctx_r1.ExistingCredentials);
779
+ } }
780
+ function ConnectionsComponent_Conditional_3_Conditional_12_Template(rf, ctx) { if (rf & 1) {
781
+ const _r25 = i0.ɵɵgetCurrentView();
782
+ i0.ɵɵelementStart(0, "div", 136)(1, "h3", 148);
783
+ i0.ɵɵtext(2, "Set up your connection");
784
+ i0.ɵɵelementEnd();
785
+ i0.ɵɵelementStart(3, "div", 162)(4, "label", 163);
786
+ i0.ɵɵtext(5, "Connection Name");
787
+ i0.ɵɵelementEnd();
788
+ i0.ɵɵelementStart(6, "input", 164);
789
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ConnectionName, $event) || (ctx_r1.ConnectionName = $event); return i0.ɵɵresetView($event); });
790
+ i0.ɵɵelementEnd()();
791
+ i0.ɵɵelementStart(7, "div", 162)(8, "label", 165);
792
+ i0.ɵɵtext(9, "Company");
793
+ i0.ɵɵelementEnd();
794
+ i0.ɵɵconditionalCreate(10, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Template, 5, 2, "select", 166)(11, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_11_Template, 1, 1, "input", 167)(12, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_12_Template, 2, 0, "div", 168);
795
+ i0.ɵɵelementEnd();
796
+ i0.ɵɵelementStart(13, "div", 162)(14, "label", 169);
797
+ i0.ɵɵtext(15, "Description ");
798
+ i0.ɵɵelementStart(16, "span", 170);
799
+ i0.ɵɵtext(17, "(optional)");
800
+ i0.ɵɵelementEnd()();
801
+ i0.ɵɵelementStart(18, "textarea", 171);
802
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Template_textarea_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ConnectionDescription, $event) || (ctx_r1.ConnectionDescription = $event); return i0.ɵɵresetView($event); });
803
+ i0.ɵɵelementEnd()();
804
+ i0.ɵɵelementStart(19, "div", 162)(20, "label", 172);
805
+ i0.ɵɵtext(21, "Credential");
806
+ i0.ɵɵelementEnd();
807
+ i0.ɵɵconditionalCreate(22, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Template, 7, 1, "div", 173)(23, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template, 7, 0, "div", 174);
808
+ i0.ɵɵconditionalCreate(24, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_24_Template, 2, 0, "div", 175);
809
+ i0.ɵɵconditionalCreate(25, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_Template, 3, 0, "div", 176);
810
+ i0.ɵɵelementEnd()();
811
+ } if (rf & 2) {
812
+ const ctx_r1 = i0.ɵɵnextContext(2);
813
+ i0.ɵɵadvance(6);
814
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ConnectionName);
815
+ i0.ɵɵadvance(4);
816
+ i0.ɵɵconditional(ctx_r1.NeedsCompanyPicker ? 10 : ctx_r1.Companies.length === 1 ? 11 : 12);
817
+ i0.ɵɵadvance(8);
818
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ConnectionDescription);
819
+ i0.ɵɵadvance(4);
820
+ i0.ɵɵconditional(ctx_r1.SelectedCredential ? 22 : 23);
821
+ i0.ɵɵadvance(2);
822
+ i0.ɵɵconditional(ctx_r1.IsLoadingCredentials ? 24 : -1);
823
+ i0.ɵɵadvance();
824
+ i0.ɵɵconditional(!ctx_r1.IsLoadingCredentials && ctx_r1.ExistingCredentials.length > 0 && !ctx_r1.SelectedCredential ? 25 : -1);
825
+ } }
826
+ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
827
+ const _r32 = i0.ɵɵgetCurrentView();
828
+ i0.ɵɵelementStart(0, "div", 184)(1, "button", 187);
829
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.TestNewConnection()); });
830
+ i0.ɵɵelement(2, "i", 188);
831
+ i0.ɵɵtext(3, " Test Connection ");
832
+ i0.ɵɵelementEnd();
833
+ i0.ɵɵelementStart(4, "p", 189);
834
+ i0.ɵɵtext(5, "We'll verify we can reach your system and authenticate.");
835
+ i0.ɵɵelementEnd()();
836
+ } }
837
+ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
838
+ i0.ɵɵelementStart(0, "div", 185)(1, "div", 190);
839
+ i0.ɵɵelement(2, "i", 191);
840
+ i0.ɵɵelementEnd();
841
+ i0.ɵɵelementStart(3, "p");
842
+ i0.ɵɵtext(4, "Testing connection...");
843
+ i0.ɵɵelementEnd()();
844
+ } }
845
+ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_2_Template(rf, ctx) { if (rf & 1) {
846
+ i0.ɵɵelement(0, "i", 49);
847
+ } }
848
+ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_3_Template(rf, ctx) { if (rf & 1) {
849
+ i0.ɵɵelement(0, "i", 50);
850
+ } }
851
+ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_6_Template(rf, ctx) { if (rf & 1) {
852
+ i0.ɵɵelementStart(0, "div", 195);
853
+ i0.ɵɵtext(1);
854
+ i0.ɵɵelementEnd();
855
+ } if (rf & 2) {
856
+ const ctx_r1 = i0.ɵɵnextContext(4);
857
+ i0.ɵɵadvance();
858
+ i0.ɵɵtextInterpolate1(" Server version: ", ctx_r1.TestResult.ServerVersion, " ");
859
+ } }
860
+ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_7_Template(rf, ctx) { if (rf & 1) {
861
+ const _r33 = i0.ɵɵgetCurrentView();
862
+ i0.ɵɵelementStart(0, "button", 197);
863
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.TestNewConnection()); });
864
+ i0.ɵɵelement(1, "i", 198);
865
+ i0.ɵɵtext(2, " Retry ");
866
+ i0.ɵɵelementEnd();
867
+ } }
868
+ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Template(rf, ctx) { if (rf & 1) {
869
+ i0.ɵɵelementStart(0, "div", 192)(1, "div", 193);
870
+ i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_2_Template, 1, 0, "i", 49)(3, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_3_Template, 1, 0, "i", 50);
871
+ i0.ɵɵelementEnd();
872
+ i0.ɵɵelementStart(4, "div", 194);
873
+ i0.ɵɵtext(5);
874
+ i0.ɵɵelementEnd();
875
+ i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_6_Template, 2, 1, "div", 195);
876
+ i0.ɵɵconditionalCreate(7, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_7_Template, 3, 0, "button", 196);
877
+ i0.ɵɵelementEnd();
878
+ } if (rf & 2) {
879
+ const ctx_r1 = i0.ɵɵnextContext(3);
880
+ i0.ɵɵclassProp("test-result-success", ctx_r1.TestResult.Success)("test-result-failure", !ctx_r1.TestResult.Success);
881
+ i0.ɵɵadvance(2);
882
+ i0.ɵɵconditional(ctx_r1.TestResult.Success ? 2 : 3);
883
+ i0.ɵɵadvance(3);
884
+ i0.ɵɵtextInterpolate(ctx_r1.TestResult.Message);
885
+ i0.ɵɵadvance();
886
+ i0.ɵɵconditional(ctx_r1.TestResult.Success && ctx_r1.TestResult.ServerVersion ? 6 : -1);
887
+ i0.ɵɵadvance();
888
+ i0.ɵɵconditional(!ctx_r1.TestResult.Success ? 7 : -1);
889
+ } }
890
+ function ConnectionsComponent_Conditional_3_Conditional_13_Template(rf, ctx) { if (rf & 1) {
891
+ i0.ɵɵelementStart(0, "div", 137)(1, "h3", 148);
892
+ i0.ɵɵtext(2, "Let's verify everything works");
893
+ i0.ɵɵelementEnd();
894
+ i0.ɵɵconditionalCreate(3, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_3_Template, 6, 0, "div", 184);
895
+ i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_4_Template, 5, 0, "div", 185);
896
+ i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Template, 8, 8, "div", 186);
897
+ i0.ɵɵelementEnd();
898
+ } if (rf & 2) {
899
+ const ctx_r1 = i0.ɵɵnextContext(2);
900
+ i0.ɵɵadvance(3);
901
+ i0.ɵɵconditional(!ctx_r1.TestResult && !ctx_r1.IsTesting ? 3 : -1);
902
+ i0.ɵɵadvance();
903
+ i0.ɵɵconditional(ctx_r1.IsTesting ? 4 : -1);
904
+ i0.ɵɵadvance();
905
+ i0.ɵɵconditional(ctx_r1.TestResult ? 5 : -1);
906
+ } }
907
+ function ConnectionsComponent_Conditional_3_Conditional_17_Template(rf, ctx) { if (rf & 1) {
908
+ const _r34 = i0.ɵɵgetCurrentView();
909
+ i0.ɵɵelementStart(0, "button", 42);
910
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_17_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.PreviousStep()); });
911
+ i0.ɵɵtext(1, " Back ");
912
+ i0.ɵɵelementEnd();
913
+ } }
914
+ function ConnectionsComponent_Conditional_3_Conditional_19_Template(rf, ctx) { if (rf & 1) {
915
+ i0.ɵɵelement(0, "i", 41);
916
+ i0.ɵɵtext(1, " Saving... ");
917
+ } }
918
+ function ConnectionsComponent_Conditional_3_Conditional_20_Template(rf, ctx) { if (rf & 1) {
919
+ i0.ɵɵtext(0);
920
+ } if (rf & 2) {
921
+ const ctx_r1 = i0.ɵɵnextContext(2);
922
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.NextButtonLabel, " ");
923
+ } }
924
+ function ConnectionsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
925
+ const _r20 = i0.ɵɵgetCurrentView();
926
+ i0.ɵɵelementStart(0, "div", 3)(1, "div", 131)(2, "button", 132);
927
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseWizard()); });
928
+ i0.ɵɵelement(3, "i", 65);
929
+ i0.ɵɵtext(4, " Back to Integrations ");
930
+ i0.ɵɵelementEnd();
931
+ i0.ɵɵelementStart(5, "h2", 133);
932
+ i0.ɵɵtext(6, "New Integration");
933
+ i0.ɵɵelementEnd()();
934
+ i0.ɵɵelementStart(7, "div", 134);
935
+ i0.ɵɵrepeaterCreate(8, ConnectionsComponent_Conditional_3_For_9_Template, 7, 7, null, null, _forTrack3);
936
+ i0.ɵɵelementEnd();
937
+ i0.ɵɵelementStart(10, "div", 135);
938
+ i0.ɵɵconditionalCreate(11, ConnectionsComponent_Conditional_3_Conditional_11_Template, 9, 2, "div", 136);
939
+ i0.ɵɵconditionalCreate(12, ConnectionsComponent_Conditional_3_Conditional_12_Template, 26, 6, "div", 136);
940
+ i0.ɵɵconditionalCreate(13, ConnectionsComponent_Conditional_3_Conditional_13_Template, 6, 3, "div", 137);
941
+ i0.ɵɵelementEnd();
942
+ i0.ɵɵelementStart(14, "div", 138);
943
+ i0.ɵɵelement(15, "div", 139);
944
+ i0.ɵɵelementStart(16, "div", 140);
945
+ i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_3_Conditional_17_Template, 2, 0, "button", 141);
946
+ i0.ɵɵelementStart(18, "button", 142);
947
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.FinishWizard()); });
948
+ i0.ɵɵconditionalCreate(19, ConnectionsComponent_Conditional_3_Conditional_19_Template, 2, 0)(20, ConnectionsComponent_Conditional_3_Conditional_20_Template, 1, 1);
949
+ i0.ɵɵelementEnd()()()();
950
+ } if (rf & 2) {
951
+ const ctx_r1 = i0.ɵɵnextContext();
952
+ i0.ɵɵadvance(8);
953
+ i0.ɵɵrepeater(ctx_r1.WizardSteps);
954
+ i0.ɵɵadvance(3);
955
+ i0.ɵɵconditional(ctx_r1.WizardStep === 1 ? 11 : -1);
956
+ i0.ɵɵadvance();
957
+ i0.ɵɵconditional(ctx_r1.WizardStep === 2 ? 12 : -1);
958
+ i0.ɵɵadvance();
959
+ i0.ɵɵconditional(ctx_r1.WizardStep === 3 ? 13 : -1);
960
+ i0.ɵɵadvance(4);
961
+ i0.ɵɵconditional(ctx_r1.WizardStep > 1 ? 17 : -1);
962
+ i0.ɵɵadvance();
963
+ i0.ɵɵproperty("disabled", ctx_r1.IsNextDisabled || ctx_r1.IsSaving);
964
+ i0.ɵɵadvance();
965
+ i0.ɵɵconditional(ctx_r1.IsSaving ? 19 : 20);
966
+ } }
967
+ function ConnectionsComponent_Conditional_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
968
+ i0.ɵɵelementStart(0, "div", 203);
969
+ i0.ɵɵelement(1, "mj-loading", 204);
970
+ i0.ɵɵelementEnd();
971
+ } }
972
+ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Template(rf, ctx) { if (rf & 1) {
973
+ const _r37 = i0.ɵɵgetCurrentView();
974
+ i0.ɵɵelementStart(0, "div", 213)(1, "div", 216);
975
+ i0.ɵɵelement(2, "i", 179);
976
+ i0.ɵɵelementStart(3, "span");
977
+ i0.ɵɵtext(4);
978
+ i0.ɵɵelementEnd()();
979
+ i0.ɵɵelementStart(5, "button", 217);
980
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r37); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ClearEditCredential()); });
981
+ i0.ɵɵelement(6, "i", 102);
982
+ i0.ɵɵelementEnd()();
983
+ } if (rf & 2) {
984
+ const ctx_r1 = i0.ɵɵnextContext(3);
985
+ i0.ɵɵadvance(4);
986
+ i0.ɵɵtextInterpolate(ctx_r1.EditCredential.Name);
987
+ } }
988
+ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
989
+ const _r39 = i0.ɵɵgetCurrentView();
990
+ i0.ɵɵelementStart(0, "div", 222);
991
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_For_2_Template_div_click_0_listener() { const cred_r40 = i0.ɵɵrestoreView(_r39).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.SelectEditCredential(cred_r40)); });
992
+ i0.ɵɵelement(1, "i", 179);
993
+ i0.ɵɵelementStart(2, "span");
994
+ i0.ɵɵtext(3);
995
+ i0.ɵɵelementEnd()();
996
+ } if (rf & 2) {
997
+ const cred_r40 = ctx.$implicit;
998
+ i0.ɵɵadvance(3);
999
+ i0.ɵɵtextInterpolate(cred_r40.Name);
1000
+ } }
1001
+ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
1002
+ i0.ɵɵelementStart(0, "div", 220);
1003
+ i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_For_2_Template, 4, 1, "div", 221, _forTrack2);
1004
+ i0.ɵɵelementEnd();
1005
+ } if (rf & 2) {
1006
+ const ctx_r1 = i0.ɵɵnextContext(4);
1007
+ i0.ɵɵadvance();
1008
+ i0.ɵɵrepeater(ctx_r1.EditCredentials);
1009
+ } }
1010
+ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1011
+ const _r38 = i0.ɵɵgetCurrentView();
1012
+ i0.ɵɵelementStart(0, "div", 218)(1, "button", 219);
1013
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenEditCredentialDialog()); });
1014
+ i0.ɵɵelement(2, "i", 12);
1015
+ i0.ɵɵtext(3, " New Credential ");
1016
+ i0.ɵɵelementEnd()();
1017
+ i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_Template, 3, 0, "div", 220);
1018
+ } if (rf & 2) {
1019
+ const ctx_r1 = i0.ɵɵnextContext(3);
1020
+ i0.ɵɵadvance(4);
1021
+ i0.ɵɵconditional(ctx_r1.EditCredentials.length > 0 ? 4 : -1);
1022
+ } }
1023
+ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_31_Template(rf, ctx) { if (rf & 1) {
1024
+ i0.ɵɵelement(0, "i", 41);
1025
+ i0.ɵɵtext(1, " Saving... ");
1026
+ } }
1027
+ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_32_Template(rf, ctx) { if (rf & 1) {
1028
+ i0.ɵɵtext(0, " Save Changes ");
1029
+ } }
1030
+ function ConnectionsComponent_Conditional_6_Conditional_9_Template(rf, ctx) { if (rf & 1) {
1031
+ const _r36 = i0.ɵɵgetCurrentView();
1032
+ i0.ɵɵelementStart(0, "div", 205)(1, "div", 206)(2, "label", 207);
1033
+ i0.ɵɵtext(3, "Connection Name");
1034
+ i0.ɵɵelementEnd();
1035
+ i0.ɵɵelementStart(4, "input", 208);
1036
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_6_Conditional_9_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditName, $event) || (ctx_r1.EditName = $event); return i0.ɵɵresetView($event); });
1037
+ i0.ɵɵelementEnd()();
1038
+ i0.ɵɵelementStart(5, "div", 206)(6, "label", 207);
1039
+ i0.ɵɵtext(7, "Status");
1040
+ i0.ɵɵelementEnd();
1041
+ i0.ɵɵelementStart(8, "div", 209)(9, "label", 210)(10, "input", 211);
1042
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_6_Conditional_9_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditIsActive, $event) || (ctx_r1.EditIsActive = $event); return i0.ɵɵresetView($event); });
1043
+ i0.ɵɵelementEnd();
1044
+ i0.ɵɵelement(11, "span", 123);
1045
+ i0.ɵɵelementEnd();
1046
+ i0.ɵɵelementStart(12, "span", 212);
1047
+ i0.ɵɵtext(13);
1048
+ i0.ɵɵelementEnd()()();
1049
+ i0.ɵɵelementStart(14, "div", 206)(15, "label", 207);
1050
+ i0.ɵɵtext(16, "Credential");
1051
+ i0.ɵɵelementEnd();
1052
+ i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Template, 7, 1, "div", 213)(18, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Template, 5, 1);
1053
+ i0.ɵɵelementEnd();
1054
+ i0.ɵɵelementStart(19, "div", 206)(20, "label", 207);
1055
+ i0.ɵɵtext(21, "Integration");
1056
+ i0.ɵɵelementEnd();
1057
+ i0.ɵɵelementStart(22, "div", 214);
1058
+ i0.ɵɵtext(23);
1059
+ i0.ɵɵelementEnd()();
1060
+ i0.ɵɵelementStart(24, "div", 206)(25, "label", 207);
1061
+ i0.ɵɵtext(26, "Company");
1062
+ i0.ɵɵelementEnd();
1063
+ i0.ɵɵelementStart(27, "div", 214);
1064
+ i0.ɵɵtext(28);
1065
+ i0.ɵɵelementEnd()()();
1066
+ i0.ɵɵelementStart(29, "div", 215)(30, "button", 142);
1067
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Template_button_click_30_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveEditChanges()); });
1068
+ i0.ɵɵconditionalCreate(31, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_31_Template, 2, 0)(32, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_32_Template, 1, 0);
1069
+ i0.ɵɵelementEnd();
1070
+ i0.ɵɵelementStart(33, "button", 42);
1071
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Template_button_click_33_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseEditPanel()); });
1072
+ i0.ɵɵtext(34, " Cancel ");
1073
+ i0.ɵɵelementEnd()();
1074
+ } if (rf & 2) {
1075
+ const ctx_r1 = i0.ɵɵnextContext(2);
1076
+ i0.ɵɵadvance(4);
1077
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.EditName);
1078
+ i0.ɵɵadvance(6);
1079
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.EditIsActive);
1080
+ i0.ɵɵadvance(2);
1081
+ i0.ɵɵclassProp("active", ctx_r1.EditIsActive);
1082
+ i0.ɵɵadvance();
1083
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.EditIsActive ? "Active" : "Inactive", " ");
1084
+ i0.ɵɵadvance(4);
1085
+ i0.ɵɵconditional(ctx_r1.EditCredential ? 17 : 18);
1086
+ i0.ɵɵadvance(6);
1087
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.EditingSummary.Integration.Integration, " ");
1088
+ i0.ɵɵadvance(5);
1089
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.EditingSummary.Integration.Company, " ");
1090
+ i0.ɵɵadvance(2);
1091
+ i0.ɵɵproperty("disabled", ctx_r1.IsEditSaving || !ctx_r1.EditName.trim());
1092
+ i0.ɵɵadvance();
1093
+ i0.ɵɵconditional(ctx_r1.IsEditSaving ? 31 : 32);
1094
+ } }
1095
+ function ConnectionsComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1096
+ const _r35 = i0.ɵɵgetCurrentView();
1097
+ i0.ɵɵelementStart(0, "div", 199)(1, "div", 200)(2, "div", 201);
1098
+ i0.ɵɵelement(3, "i");
1099
+ i0.ɵɵelementEnd();
1100
+ i0.ɵɵelementStart(4, "span");
1101
+ i0.ɵɵtext(5, "Configure Integration");
1102
+ i0.ɵɵelementEnd()();
1103
+ i0.ɵɵelementStart(6, "button", 202);
1104
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseEditPanel()); });
1105
+ i0.ɵɵelement(7, "i", 102);
1106
+ i0.ɵɵelementEnd()();
1107
+ i0.ɵɵconditionalCreate(8, ConnectionsComponent_Conditional_6_Conditional_8_Template, 2, 0, "div", 203)(9, ConnectionsComponent_Conditional_6_Conditional_9_Template, 35, 10);
1108
+ } if (rf & 2) {
1109
+ const ctx_r1 = i0.ɵɵnextContext();
1110
+ i0.ɵɵadvance(2);
1111
+ i0.ɵɵstyleProp("background-color", ctx_r1.GetIconBrandColor(ctx_r1.EditingSummary.Integration.Integration));
1112
+ i0.ɵɵadvance();
1113
+ i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(ctx_r1.EditingSummary.Integration.Integration));
1114
+ i0.ɵɵadvance(5);
1115
+ i0.ɵɵconditional(ctx_r1.IsEditLoading ? 8 : 9);
1116
+ } }
1117
+ function ConnectionsComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1118
+ const _r41 = i0.ɵɵgetCurrentView();
1119
+ i0.ɵɵelementStart(0, "mj-credential-dialog", 223);
1120
+ i0.ɵɵlistener("close", function ConnectionsComponent_Conditional_7_Template_mj_credential_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.EditPanelOpen ? ctx_r1.OnEditCredentialDialogClose($event) : ctx_r1.OnCredentialDialogClose($event)); });
1121
+ i0.ɵɵelementEnd();
1122
+ } if (rf & 2) {
1123
+ const ctx_r1 = i0.ɵɵnextContext();
1124
+ i0.ɵɵproperty("Visible", true)("PreselectedTypeId", ctx_r1.PreselectedCredentialTypeId);
1125
+ } }
1126
+ function ConnectionsComponent_Conditional_8_Conditional_16_Template(rf, ctx) { if (rf & 1) {
1127
+ i0.ɵɵtext(0);
1128
+ } if (rf & 2) {
1129
+ const ctx_r1 = i0.ɵɵnextContext(2);
1130
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.AddMapSourceObjectName, " ");
1131
+ } }
1132
+ function ConnectionsComponent_Conditional_8_Conditional_17_Template(rf, ctx) { if (rf & 1) {
1133
+ i0.ɵɵelementStart(0, "span", 235);
1134
+ i0.ɵɵtext(1, "Select a source object in the Add Map form first");
1135
+ i0.ɵɵelementEnd();
1136
+ } }
1137
+ function ConnectionsComponent_Conditional_8_Conditional_29_For_2_Template(rf, ctx) { if (rf & 1) {
1138
+ i0.ɵɵelementStart(0, "div", 246);
1139
+ i0.ɵɵelement(1, "i", 247);
1140
+ i0.ɵɵtext(2);
1141
+ i0.ɵɵelementEnd();
1142
+ } if (rf & 2) {
1143
+ const warn_r43 = ctx.$implicit;
1144
+ i0.ɵɵadvance(2);
1145
+ i0.ɵɵtextInterpolate1(" ", warn_r43);
1146
+ } }
1147
+ function ConnectionsComponent_Conditional_8_Conditional_29_Template(rf, ctx) { if (rf & 1) {
1148
+ i0.ɵɵelementStart(0, "div", 240);
1149
+ i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_8_Conditional_29_For_2_Template, 3, 1, "div", 246, i0.ɵɵrepeaterTrackByIdentity);
1150
+ i0.ɵɵelementEnd();
1151
+ } if (rf & 2) {
1152
+ const ctx_r1 = i0.ɵɵnextContext(2);
1153
+ i0.ɵɵadvance();
1154
+ i0.ɵɵrepeater(ctx_r1.DDLPreviewWarnings);
1155
+ } }
1156
+ function ConnectionsComponent_Conditional_8_Conditional_30_Conditional_5_Template(rf, ctx) { if (rf & 1) {
1157
+ i0.ɵɵelement(0, "i", 106);
1158
+ i0.ɵɵtext(1, " Copied ");
1159
+ } }
1160
+ function ConnectionsComponent_Conditional_8_Conditional_30_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1161
+ i0.ɵɵelement(0, "i", 251);
1162
+ i0.ɵɵtext(1, " Copy ");
1163
+ } }
1164
+ function ConnectionsComponent_Conditional_8_Conditional_30_Template(rf, ctx) { if (rf & 1) {
1165
+ const _r44 = i0.ɵɵgetCurrentView();
1166
+ i0.ɵɵelementStart(0, "div", 241)(1, "div", 248)(2, "span");
1167
+ i0.ɵɵtext(3, "SQL Preview");
1168
+ i0.ɵɵelementEnd();
1169
+ i0.ɵɵelementStart(4, "button", 249);
1170
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_30_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r44); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CopyDDLToClipboard()); });
1171
+ i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_8_Conditional_30_Conditional_5_Template, 2, 0)(6, ConnectionsComponent_Conditional_8_Conditional_30_Conditional_6_Template, 2, 0);
1172
+ i0.ɵɵelementEnd()();
1173
+ i0.ɵɵelementStart(7, "pre", 250);
1174
+ i0.ɵɵtext(8);
1175
+ i0.ɵɵelementEnd()();
1176
+ } if (rf & 2) {
1177
+ const ctx_r1 = i0.ɵɵnextContext(2);
1178
+ i0.ɵɵadvance(5);
1179
+ i0.ɵɵconditional(ctx_r1.DDLCopied ? 5 : 6);
1180
+ i0.ɵɵadvance(3);
1181
+ i0.ɵɵtextInterpolate(ctx_r1.DDLPreview);
1182
+ } }
1183
+ function ConnectionsComponent_Conditional_8_Conditional_31_Template(rf, ctx) { if (rf & 1) {
1184
+ i0.ɵɵelementStart(0, "div", 242)(1, "h4");
1185
+ i0.ɵɵelement(2, "i", 252);
1186
+ i0.ɵɵtext(3, " Next Steps");
1187
+ i0.ɵɵelementEnd();
1188
+ i0.ɵɵelementStart(4, "ol")(5, "li");
1189
+ i0.ɵɵtext(6, "Copy the SQL above and save it as a migration file");
1190
+ i0.ɵɵelementEnd();
1191
+ i0.ɵɵelementStart(7, "li");
1192
+ i0.ɵɵtext(8, "Run the migration against your database");
1193
+ i0.ɵɵelementEnd();
1194
+ i0.ɵɵelementStart(9, "li");
1195
+ i0.ɵɵtext(10, "Run CodeGen to register the new entity in MemberJunction");
1196
+ i0.ɵɵelementEnd();
1197
+ i0.ɵɵelementStart(11, "li");
1198
+ i0.ɵɵtext(12, "Refresh the page \u2014 the new entity will appear in the entity picker");
1199
+ i0.ɵɵelementEnd()()();
1200
+ } }
1201
+ function ConnectionsComponent_Conditional_8_Conditional_34_Template(rf, ctx) { if (rf & 1) {
1202
+ i0.ɵɵelement(0, "i", 41);
1203
+ i0.ɵɵtext(1, " Generating... ");
1204
+ } }
1205
+ function ConnectionsComponent_Conditional_8_Conditional_35_Template(rf, ctx) { if (rf & 1) {
1206
+ i0.ɵɵelement(0, "i", 253);
1207
+ i0.ɵɵtext(1, " Generate SQL ");
1208
+ } }
1209
+ function ConnectionsComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1210
+ const _r42 = i0.ɵɵgetCurrentView();
1211
+ i0.ɵɵelementStart(0, "div", 224);
1212
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r42); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
1213
+ i0.ɵɵelementEnd();
1214
+ i0.ɵɵelementStart(1, "div", 225)(2, "div", 226)(3, "h3");
1215
+ i0.ɵɵtext(4, "Create New Entity Table");
1216
+ i0.ɵɵelementEnd();
1217
+ i0.ɵɵelementStart(5, "button", 227);
1218
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r42); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
1219
+ i0.ɵɵelement(6, "i", 102);
1220
+ i0.ɵɵelementEnd()();
1221
+ i0.ɵɵelementStart(7, "div", 228)(8, "p", 229);
1222
+ i0.ɵɵtext(9, " Generate a SQL migration to create a new database table for this integration's data. After running the migration and CodeGen, the new entity will appear in the entity picker. ");
1223
+ i0.ɵɵelementEnd();
1224
+ i0.ɵɵelementStart(10, "div", 230)(11, "div", 231)(12, "div", 232)(13, "label", 233);
1225
+ i0.ɵɵtext(14, "Source Object");
1226
+ i0.ɵɵelementEnd();
1227
+ i0.ɵɵelementStart(15, "div", 234);
1228
+ i0.ɵɵconditionalCreate(16, ConnectionsComponent_Conditional_8_Conditional_16_Template, 1, 1)(17, ConnectionsComponent_Conditional_8_Conditional_17_Template, 2, 0, "span", 235);
1229
+ i0.ɵɵelementEnd()()();
1230
+ i0.ɵɵelementStart(18, "div", 231)(19, "div", 232)(20, "label", 233);
1231
+ i0.ɵɵtext(21, "Schema");
1232
+ i0.ɵɵelementEnd();
1233
+ i0.ɵɵelementStart(22, "input", 236);
1234
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r42); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntitySchema, $event) || (ctx_r1.NewEntitySchema = $event); return i0.ɵɵresetView($event); });
1235
+ i0.ɵɵelementEnd()();
1236
+ i0.ɵɵelementStart(23, "span", 237);
1237
+ i0.ɵɵtext(24, ".");
1238
+ i0.ɵɵelementEnd();
1239
+ i0.ɵɵelementStart(25, "div", 238)(26, "label", 233);
1240
+ i0.ɵɵtext(27, "Table Name");
1241
+ i0.ɵɵelementEnd();
1242
+ i0.ɵɵelementStart(28, "input", 239);
1243
+ i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Template_input_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r42); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityTable, $event) || (ctx_r1.NewEntityTable = $event); return i0.ɵɵresetView($event); });
1244
+ i0.ɵɵelementEnd()()()();
1245
+ i0.ɵɵconditionalCreate(29, ConnectionsComponent_Conditional_8_Conditional_29_Template, 3, 0, "div", 240);
1246
+ i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_8_Conditional_30_Template, 9, 2, "div", 241);
1247
+ i0.ɵɵconditionalCreate(31, ConnectionsComponent_Conditional_8_Conditional_31_Template, 13, 0, "div", 242);
1248
+ i0.ɵɵelementEnd();
1249
+ i0.ɵɵelementStart(32, "div", 243)(33, "button", 244);
1250
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_33_listener() { i0.ɵɵrestoreView(_r42); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.PreviewDDL()); });
1251
+ i0.ɵɵconditionalCreate(34, ConnectionsComponent_Conditional_8_Conditional_34_Template, 2, 0)(35, ConnectionsComponent_Conditional_8_Conditional_35_Template, 2, 0);
1252
+ i0.ɵɵelementEnd();
1253
+ i0.ɵɵelementStart(36, "button", 245);
1254
+ i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_36_listener() { i0.ɵɵrestoreView(_r42); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
1255
+ i0.ɵɵtext(37, " Done ");
1256
+ i0.ɵɵelementEnd()()();
1257
+ } if (rf & 2) {
1258
+ const ctx_r1 = i0.ɵɵnextContext();
1259
+ i0.ɵɵadvance(16);
1260
+ i0.ɵɵconditional(ctx_r1.AddMapSourceObjectName ? 16 : 17);
1261
+ i0.ɵɵadvance(6);
1262
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntitySchema);
1263
+ i0.ɵɵadvance(6);
1264
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntityTable);
1265
+ i0.ɵɵadvance();
1266
+ i0.ɵɵconditional(ctx_r1.DDLPreviewWarnings.length > 0 ? 29 : -1);
1267
+ i0.ɵɵadvance();
1268
+ i0.ɵɵconditional(ctx_r1.DDLPreview ? 30 : -1);
1269
+ i0.ɵɵadvance();
1270
+ i0.ɵɵconditional(ctx_r1.DDLPreview ? 31 : -1);
1271
+ i0.ɵɵadvance(2);
1272
+ i0.ɵɵproperty("disabled", !ctx_r1.CanGenerateSQL || ctx_r1.IsGeneratingDDL);
1273
+ i0.ɵɵadvance();
1274
+ i0.ɵɵconditional(ctx_r1.IsGeneratingDDL ? 34 : 35);
1275
+ } }
1276
+ /** Brand color mapping for known integration names */
1277
+ const BRAND_COLOR_MAP = [
1278
+ { Pattern: /hubspot/i, Color: '#ff7a59' },
1279
+ { Pattern: /salesforce/i, Color: '#00a1e0' },
1280
+ { Pattern: /stripe/i, Color: '#635bff' },
1281
+ { Pattern: /slack/i, Color: '#4a154b' },
1282
+ { Pattern: /google/i, Color: '#4285f4' },
1283
+ { Pattern: /microsoft|azure|dynamics/i, Color: '#00a4ef' },
1284
+ { Pattern: /github/i, Color: '#24292f' },
1285
+ { Pattern: /jira|atlassian/i, Color: '#0052cc' },
1286
+ { Pattern: /mailchimp/i, Color: '#ffe01b' },
1287
+ { Pattern: /shopify/i, Color: '#96bf48' },
1288
+ { Pattern: /wordpress/i, Color: '#21759b' },
1289
+ { Pattern: /dropbox/i, Color: '#0061ff' },
1290
+ { Pattern: /aws|amazon/i, Color: '#ff9900' },
1291
+ { Pattern: /yourmembership|ym/i, Color: '#1a73e8' },
1292
+ { Pattern: /quickbooks|intuit/i, Color: '#2ca01c' },
1293
+ { Pattern: /zendesk/i, Color: '#03363d' },
1294
+ { Pattern: /database|sql|mysql|postgres/i, Color: '#336791' },
1295
+ { Pattern: /api|rest|graphql/i, Color: '#e535ab' },
1296
+ { Pattern: /file|csv|excel/i, Color: '#217346' },
1297
+ { Pattern: /ftp|sftp/i, Color: '#555' }
1298
+ ];
1299
+ const WIZARD_STEPS = [
1300
+ { Number: 1, Label: 'Choose Integration' },
1301
+ { Number: 2, Label: 'Configure' },
1302
+ { Number: 3, Label: 'Test' }
1303
+ ];
1304
+ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceComponent {
1305
+ // --- Main view state ---
1306
+ Connections = [];
1307
+ EntityMapCounts = new Map();
1308
+ IsLoading = true;
1309
+ // --- Card test state ---
1310
+ TestingCardID = null;
1311
+ TestCardResults = new Map();
1312
+ // --- Wizard state ---
1313
+ WizardOpen = false;
1314
+ WizardStep = 1;
1315
+ WizardSteps = WIZARD_STEPS;
1316
+ AvailableIntegrations = [];
1317
+ SearchQuery = '';
1318
+ // Step 1
1319
+ SelectedIntegration = null;
1320
+ // Step 2
1321
+ ConnectionName = '';
1322
+ SelectedCompanyID = null;
1323
+ ConnectionDescription = '';
1324
+ Companies = [];
1325
+ SelectedCredentialID = null;
1326
+ ShowCredentialDialog = false;
1327
+ PreselectedCredentialTypeId;
1328
+ ExistingCredentials = [];
1329
+ IsLoadingCredentials = false;
1330
+ SelectedCredential = null;
1331
+ // Step 3
1332
+ TestResult = null;
1333
+ IsTesting = false;
1334
+ // Save state
1335
+ IsSaving = false;
1336
+ SavedIntegrationID = null;
1337
+ // Card menu
1338
+ OpenMenuID = null;
1339
+ // Edit panel state
1340
+ EditPanelOpen = false;
1341
+ EditingSummary = null;
1342
+ EditEntity = null;
1343
+ EditName = '';
1344
+ EditDescription = '';
1345
+ EditCredentialID = null;
1346
+ EditCredential = null;
1347
+ EditCredentials = [];
1348
+ EditIsActive = false;
1349
+ IsEditSaving = false;
1350
+ IsEditLoading = false;
1351
+ // Detail view state (replaces card grid when an integration is selected)
1352
+ SelectedSummary = null;
1353
+ DetailEntityMaps = [];
1354
+ DetailFilteredMaps = [];
1355
+ DetailSearchTerm = '';
1356
+ IsDetailLoading = false;
1357
+ // Entity map editor state (field mapping detail view)
1358
+ EditorEntityMap = null;
1359
+ // Add entity map state
1360
+ ShowAddMapPanel = false;
1361
+ AvailableSourceObjects = [];
1362
+ IsLoadingSourceObjects = false;
1363
+ AddMapSourceObjectName = '';
1364
+ AddMapEntityID = '';
1365
+ AddMapDirection = 'Pull';
1366
+ IsSavingAddMap = false;
1367
+ // Tree dropdown config for MJ Entity picker (schema → entities)
1368
+ entityTreeDropdown;
1369
+ EntityBranchConfig = {
1370
+ EntityName: 'MJ: Schema Info',
1371
+ DisplayField: 'SchemaName',
1372
+ IDField: 'SchemaName',
1373
+ ParentIDField: '', // flat list of schemas, no nesting
1374
+ DefaultIcon: 'fa-solid fa-database',
1375
+ OrderBy: 'SchemaName ASC'
1376
+ };
1377
+ EntityLeafConfig = {
1378
+ EntityName: 'MJ: Entities',
1379
+ DisplayField: 'Name',
1380
+ IDField: 'ID',
1381
+ ParentField: 'SchemaName',
1382
+ DefaultIcon: 'fa-solid fa-table',
1383
+ OrderBy: 'Name ASC'
1384
+ };
1385
+ // Create New Entity state
1386
+ ShowCreateEntity = false;
1387
+ NewEntitySchema = '';
1388
+ NewEntityTable = '';
1389
+ DDLPreview = null;
1390
+ DDLPreviewWarnings = [];
1391
+ IsGeneratingDDL = false;
1392
+ IsCreatingEntity = false;
1393
+ // Delete confirmation state
1394
+ DeleteConfirmID = null;
1395
+ IsDeleting = false;
1396
+ dataService = inject(IntegrationDataService);
1397
+ cdr = inject(ChangeDetectorRef);
1398
+ documentClickHandler = null;
1399
+ async ngOnInit() {
1400
+ this.documentClickHandler = (e) => this.onDocumentClick(e);
1401
+ document.addEventListener('click', this.documentClickHandler);
1402
+ await this.LoadData();
1403
+ }
1404
+ ngOnDestroy() {
1405
+ if (this.documentClickHandler) {
1406
+ document.removeEventListener('click', this.documentClickHandler);
1407
+ }
1408
+ }
1409
+ // ---------------------------------------------------------------------------
1410
+ // Resource overrides
1411
+ // ---------------------------------------------------------------------------
1412
+ async GetResourceDisplayName(_data) {
1413
+ return 'Integrations';
1414
+ }
1415
+ async GetResourceIconClass(_data) {
1416
+ return 'fa-solid fa-plug';
1417
+ }
1418
+ // ---------------------------------------------------------------------------
1419
+ // Data loading
1420
+ // ---------------------------------------------------------------------------
1421
+ async LoadData() {
1422
+ this.IsLoading = true;
1423
+ this.cdr.detectChanges();
1424
+ try {
1425
+ const provider = this.RunViewToUse;
1426
+ const [summaries, entityMaps] = await Promise.all([
1427
+ this.dataService.LoadIntegrationSummaries(provider),
1428
+ this.loadAllEntityMaps()
1429
+ ]);
1430
+ this.Connections = summaries;
1431
+ this.EntityMapCounts = this.countMapsByIntegration(entityMaps);
1432
+ }
1433
+ catch (err) {
1434
+ console.error('[IntegrationConnections] Failed to load data:', err);
1435
+ }
1436
+ finally {
1437
+ this.IsLoading = false;
1438
+ this.cdr.detectChanges();
1439
+ }
1440
+ }
1441
+ // ---------------------------------------------------------------------------
1442
+ // Card helpers
1443
+ // ---------------------------------------------------------------------------
1444
+ GetStatusBadge(summary) {
1445
+ if (summary.LatestRun?.Status === 'In Progress')
1446
+ return 'Syncing';
1447
+ if (summary.StatusColor === 'green')
1448
+ return 'Connected';
1449
+ if (summary.StatusColor === 'red')
1450
+ return 'Error';
1451
+ return 'Inactive';
1452
+ }
1453
+ GetStatusBadgeClass(summary) {
1454
+ const badge = this.GetStatusBadge(summary);
1455
+ return `status-badge status-badge-${badge.toLowerCase()}`;
1456
+ }
1457
+ GetIntegrationIcon(name) {
1458
+ return this.resolveIconByName(name);
1459
+ }
1460
+ GetIconBrandColor(name) {
1461
+ return this.resolveBrandColor(name);
1462
+ }
1463
+ GetEntityMapCount(integrationID) {
1464
+ for (const [key, value] of this.EntityMapCounts) {
1465
+ if (UUIDsEqual(key, integrationID))
1466
+ return value;
1467
+ }
1468
+ return 0;
1469
+ }
1470
+ GetCredentialHint(summary) {
1471
+ const driverClass = summary.Integration.DriverClassName;
1472
+ if (driverClass?.toLowerCase().includes('oauth'))
1473
+ return 'OAuth2 Connected';
1474
+ return 'API Key configured';
1475
+ }
1476
+ GetSourceTypeLabel(summary) {
1477
+ return summary.SourceType?.Name ?? 'API';
1478
+ }
1479
+ IsConnectionActive(summary) {
1480
+ return summary.Integration.IsActive === true;
1481
+ }
1482
+ // ---------------------------------------------------------------------------
1483
+ // Card menu
1484
+ // ---------------------------------------------------------------------------
1485
+ ToggleMenu(integrationID, event) {
1486
+ event.stopPropagation();
1487
+ this.OpenMenuID = this.OpenMenuID === integrationID ? null : integrationID;
1488
+ this.cdr.detectChanges();
1489
+ }
1490
+ IsMenuOpen(integrationID) {
1491
+ return this.OpenMenuID === integrationID;
1492
+ }
1493
+ OnMenuAction(action, summary) {
1494
+ this.OpenMenuID = null;
1495
+ switch (action) {
1496
+ case 'edit':
1497
+ this.OpenEditPanel(summary);
1498
+ break;
1499
+ case 'disable':
1500
+ this.toggleConnectionActive(summary);
1501
+ break;
1502
+ case 'delete':
1503
+ this.ShowDeleteConfirm(summary.Integration.ID);
1504
+ break;
1505
+ }
1506
+ }
1507
+ GetMenuActionLabel(summary) {
1508
+ return this.IsConnectionActive(summary) ? 'Disable' : 'Enable';
1509
+ }
1510
+ // ---------------------------------------------------------------------------
1511
+ // Edit panel
1512
+ // ---------------------------------------------------------------------------
1513
+ async OpenEditPanel(summary) {
1514
+ this.EditingSummary = summary;
1515
+ this.EditName = summary.Integration.Name;
1516
+ this.EditDescription = '';
1517
+ this.EditIsActive = summary.Integration.IsActive === true;
1518
+ this.EditCredentialID = null;
1519
+ this.EditCredential = null;
1520
+ this.EditCredentials = [];
1521
+ this.EditEntity = null;
1522
+ this.EditPanelOpen = true;
1523
+ this.IsEditLoading = true;
1524
+ this.cdr.detectChanges();
1525
+ try {
1526
+ const md = new Metadata();
1527
+ const ci = await md.GetEntityObject('MJ: Company Integrations');
1528
+ await ci.Load(summary.Integration.ID);
1529
+ this.EditEntity = ci;
1530
+ this.EditName = ci.Name;
1531
+ this.EditIsActive = ci.IsActive === true;
1532
+ if (ci.CredentialID) {
1533
+ this.EditCredentialID = ci.CredentialID;
1534
+ }
1535
+ await this.loadEditCredentials();
1536
+ }
1537
+ catch (err) {
1538
+ console.error('[IntegrationConnections] Failed to load connection for editing:', err);
1539
+ }
1540
+ finally {
1541
+ this.IsEditLoading = false;
1542
+ this.cdr.detectChanges();
1543
+ }
1544
+ }
1545
+ CloseEditPanel() {
1546
+ this.EditPanelOpen = false;
1547
+ setTimeout(() => {
1548
+ if (!this.EditPanelOpen) {
1549
+ this.EditingSummary = null;
1550
+ this.EditEntity = null;
1551
+ this.cdr.detectChanges();
1552
+ }
1553
+ }, 350);
1554
+ this.cdr.detectChanges();
1555
+ }
1556
+ async SaveEditChanges() {
1557
+ if (!this.EditEntity)
1558
+ return;
1559
+ this.IsEditSaving = true;
1560
+ this.cdr.detectChanges();
1561
+ try {
1562
+ this.EditEntity.Name = this.EditName;
1563
+ this.EditEntity.IsActive = this.EditIsActive;
1564
+ if (this.EditCredentialID) {
1565
+ this.EditEntity.CredentialID = this.EditCredentialID;
1566
+ }
1567
+ const saved = await this.EditEntity.Save();
1568
+ if (saved) {
1569
+ this.CloseEditPanel();
1570
+ await this.LoadData();
1571
+ }
1572
+ else {
1573
+ console.error('[IntegrationConnections] Save failed:', this.EditEntity.LatestResult?.CompleteMessage ?? this.EditEntity.LatestResult?.Message);
1574
+ }
1575
+ }
1576
+ catch (err) {
1577
+ console.error('[IntegrationConnections] Save error:', err);
1578
+ }
1579
+ finally {
1580
+ this.IsEditSaving = false;
1581
+ this.cdr.detectChanges();
1582
+ }
1583
+ }
1584
+ SelectEditCredential(credential) {
1585
+ this.EditCredential = credential;
1586
+ this.EditCredentialID = credential.ID;
1587
+ }
1588
+ ClearEditCredential() {
1589
+ this.EditCredential = null;
1590
+ this.EditCredentialID = null;
1591
+ }
1592
+ OpenEditCredentialDialog() {
1593
+ this.PreselectedCredentialTypeId = undefined;
1594
+ this.ShowCredentialDialog = true;
1595
+ this.cdr.detectChanges();
1596
+ }
1597
+ OnEditCredentialDialogClose(result) {
1598
+ this.ShowCredentialDialog = false;
1599
+ if (result.success && result.credential) {
1600
+ this.EditCredential = result.credential;
1601
+ this.EditCredentialID = result.credential.ID;
1602
+ }
1603
+ this.cdr.detectChanges();
1604
+ }
1605
+ // ---------------------------------------------------------------------------
1606
+ // Delete confirmation
1607
+ // ---------------------------------------------------------------------------
1608
+ ShowDeleteConfirm(integrationID) {
1609
+ this.DeleteConfirmID = integrationID;
1610
+ this.cdr.detectChanges();
1611
+ }
1612
+ CancelDelete() {
1613
+ this.DeleteConfirmID = null;
1614
+ this.cdr.detectChanges();
1615
+ }
1616
+ async ConfirmDelete(integrationID) {
1617
+ this.IsDeleting = true;
1618
+ this.cdr.detectChanges();
1619
+ try {
1620
+ const md = new Metadata();
1621
+ const ci = await md.GetEntityObject('MJ: Company Integrations');
1622
+ await ci.Load(integrationID);
1623
+ const deleted = await ci.Delete();
1624
+ if (deleted) {
1625
+ this.DeleteConfirmID = null;
1626
+ await this.LoadData();
1627
+ }
1628
+ else {
1629
+ console.error('[IntegrationConnections] Delete failed:', ci.LatestResult?.CompleteMessage ?? ci.LatestResult?.Message);
1630
+ }
1631
+ }
1632
+ catch (err) {
1633
+ console.error('[IntegrationConnections] Delete error:', err);
1634
+ }
1635
+ finally {
1636
+ this.IsDeleting = false;
1637
+ this.cdr.detectChanges();
1638
+ }
1639
+ }
1640
+ IsDeleteConfirming(integrationID) {
1641
+ return UUIDsEqual(this.DeleteConfirmID, integrationID);
1642
+ }
1643
+ // ---------------------------------------------------------------------------
1644
+ // Card test
1645
+ // ---------------------------------------------------------------------------
1646
+ async TestExistingConnection(integrationID) {
1647
+ if (this.TestingCardID)
1648
+ return;
1649
+ this.TestingCardID = integrationID;
1650
+ this.TestCardResults.delete(integrationID);
1651
+ this.cdr.detectChanges();
1652
+ try {
1653
+ const result = await this.dataService.TestConnection(integrationID);
1654
+ this.TestCardResults.set(integrationID, {
1655
+ Success: result.Success,
1656
+ Message: result.Message
1657
+ });
1658
+ }
1659
+ catch (err) {
1660
+ const message = err instanceof Error ? err.message : String(err);
1661
+ this.TestCardResults.set(integrationID, {
1662
+ Success: false,
1663
+ Message: `Test failed: ${message}`
1664
+ });
1665
+ }
1666
+ finally {
1667
+ this.TestingCardID = null;
1668
+ this.cdr.detectChanges();
1669
+ }
1670
+ }
1671
+ IsTestingCard(integrationID) {
1672
+ return UUIDsEqual(this.TestingCardID, integrationID);
1673
+ }
1674
+ GetCardTestResult(integrationID) {
1675
+ for (const [key, value] of this.TestCardResults) {
1676
+ if (UUIDsEqual(key, integrationID))
1677
+ return value;
1678
+ }
1679
+ return null;
1680
+ }
1681
+ // ---------------------------------------------------------------------------
1682
+ // Sync action
1683
+ // ---------------------------------------------------------------------------
1684
+ async RunSync(integrationID) {
1685
+ try {
1686
+ const result = await this.dataService.RunSync(integrationID);
1687
+ if (!result.Success) {
1688
+ console.error('[IntegrationConnections] Sync failed:', result.Message);
1689
+ }
1690
+ await this.LoadData();
1691
+ }
1692
+ catch (err) {
1693
+ console.error('[IntegrationConnections] RunSync error:', err);
1694
+ }
1695
+ }
1696
+ // ---------------------------------------------------------------------------
1697
+ // Detail view (entity maps for a selected integration)
1698
+ // ---------------------------------------------------------------------------
1699
+ async SelectIntegrationCard(summary) {
1700
+ this.SelectedSummary = summary;
1701
+ this.DetailSearchTerm = '';
1702
+ this.IsDetailLoading = true;
1703
+ this.cdr.detectChanges();
1704
+ try {
1705
+ const maps = await this.loadEntityMapsForIntegration(summary.Integration.ID);
1706
+ this.DetailEntityMaps = maps;
1707
+ this.DetailFilteredMaps = maps;
1708
+ }
1709
+ catch (err) {
1710
+ console.error('[IntegrationConnections] Failed to load entity maps:', err);
1711
+ }
1712
+ finally {
1713
+ this.IsDetailLoading = false;
1714
+ this.cdr.detectChanges();
1715
+ }
1716
+ }
1717
+ CloseDetailView() {
1718
+ this.SelectedSummary = null;
1719
+ this.DetailEntityMaps = [];
1720
+ this.DetailFilteredMaps = [];
1721
+ this.DetailSearchTerm = '';
1722
+ this.cdr.detectChanges();
1723
+ }
1724
+ OnDetailSearch(event) {
1725
+ const input = event.target;
1726
+ this.DetailSearchTerm = input.value;
1727
+ this.DetailFilteredMaps = this.applyDetailFilter();
1728
+ this.cdr.detectChanges();
1729
+ }
1730
+ DirectionLabel(direction) {
1731
+ if (direction === 'Pull')
1732
+ return '\u2192';
1733
+ if (direction === 'Push')
1734
+ return '\u2190';
1735
+ if (direction === 'Bidirectional')
1736
+ return '\u2194';
1737
+ return '\u2192';
1738
+ }
1739
+ DirectionText(direction) {
1740
+ if (direction === 'Pull')
1741
+ return 'Pull \u2192';
1742
+ if (direction === 'Push')
1743
+ return '\u2190 Push';
1744
+ if (direction === 'Bidirectional')
1745
+ return '\u2194 Bi';
1746
+ return 'Pull \u2192';
1747
+ }
1748
+ DirectionBadgeClass(direction) {
1749
+ if (direction === 'Pull')
1750
+ return 'direction-badge pull';
1751
+ if (direction === 'Push')
1752
+ return 'direction-badge push';
1753
+ if (direction === 'Bidirectional')
1754
+ return 'direction-badge bidirectional';
1755
+ return 'direction-badge';
1756
+ }
1757
+ async OnToggleMapEnabled(em, event) {
1758
+ const checkbox = event.target;
1759
+ const newValue = checkbox.checked;
1760
+ em.SyncEnabled = newValue;
1761
+ this.cdr.detectChanges();
1762
+ try {
1763
+ await this.dataService.ToggleEntityMapEnabled(em.ID, newValue);
1764
+ }
1765
+ catch (err) {
1766
+ em.SyncEnabled = !newValue;
1767
+ checkbox.checked = !newValue;
1768
+ console.error('[IntegrationConnections] Failed to toggle SyncEnabled:', err);
1769
+ this.cdr.detectChanges();
1770
+ }
1771
+ }
1772
+ get DetailActiveMapCount() {
1773
+ return this.DetailEntityMaps.filter(m => m.SyncEnabled).length;
1774
+ }
1775
+ applyDetailFilter() {
1776
+ if (!this.DetailSearchTerm.trim())
1777
+ return this.DetailEntityMaps;
1778
+ const term = this.DetailSearchTerm.toLowerCase();
1779
+ return this.DetailEntityMaps.filter(m => (m.ExternalObjectLabel ?? m.ExternalObjectName).toLowerCase().includes(term) ||
1780
+ m.Entity.toLowerCase().includes(term));
1781
+ }
1782
+ // ---------------------------------------------------------------------------
1783
+ // Entity map editor (field mapping detail)
1784
+ // ---------------------------------------------------------------------------
1785
+ OnEntityMapClick(em) {
1786
+ this.EditorEntityMap = em;
1787
+ this.cdr.detectChanges();
1788
+ }
1789
+ CloseEntityMapEditor() {
1790
+ this.EditorEntityMap = null;
1791
+ this.cdr.detectChanges();
1792
+ }
1793
+ // ---------------------------------------------------------------------------
1794
+ // Add entity map
1795
+ // ---------------------------------------------------------------------------
1796
+ async ToggleAddMapPanel() {
1797
+ this.ShowAddMapPanel = !this.ShowAddMapPanel;
1798
+ if (this.ShowAddMapPanel) {
1799
+ this.resetAddMapState();
1800
+ await this.loadAddMapData();
1801
+ }
1802
+ this.cdr.detectChanges();
1803
+ }
1804
+ CloseAddMapPanel() {
1805
+ this.ShowAddMapPanel = false;
1806
+ this.cdr.detectChanges();
1807
+ }
1808
+ get CanSaveAddMap() {
1809
+ return !!this.AddMapSourceObjectName && !!this.AddMapEntityID;
1810
+ }
1811
+ get AddMapEntityIDAsKey() {
1812
+ return this.AddMapEntityID ? CompositeKey.FromID(this.AddMapEntityID) : null;
1813
+ }
1814
+ OnEntityTreeSelection(node) {
1815
+ if (!node || Array.isArray(node))
1816
+ return;
1817
+ if (node.Type === 'leaf') {
1818
+ this.AddMapEntityID = node.ID;
1819
+ }
1820
+ }
1821
+ // ---------------------------------------------------------------------------
1822
+ // New Entity dialog (generates SQL migration for a new table)
1823
+ // ---------------------------------------------------------------------------
1824
+ OpenNewEntityDialog() {
1825
+ this.ShowCreateEntity = true;
1826
+ this.NewEntitySchema = '';
1827
+ this.NewEntityTable = '';
1828
+ this.DDLPreview = null;
1829
+ this.DDLPreviewWarnings = [];
1830
+ this.DDLCopied = false;
1831
+ this.cdr.detectChanges();
1832
+ }
1833
+ CloseNewEntityDialog() {
1834
+ this.ShowCreateEntity = false;
1835
+ this.DDLPreview = null;
1836
+ this.DDLPreviewWarnings = [];
1837
+ this.DDLCopied = false;
1838
+ this.cdr.detectChanges();
1839
+ }
1840
+ DDLCopied = false;
1841
+ async CopyDDLToClipboard() {
1842
+ if (!this.DDLPreview)
1843
+ return;
1844
+ try {
1845
+ await navigator.clipboard.writeText(this.DDLPreview);
1846
+ this.DDLCopied = true;
1847
+ this.cdr.detectChanges();
1848
+ setTimeout(() => {
1849
+ this.DDLCopied = false;
1850
+ this.cdr.detectChanges();
1851
+ }, 2000);
1852
+ }
1853
+ catch {
1854
+ // Fallback: select text in the pre block
1855
+ console.warn('[IntegrationConnections] Clipboard API not available');
1856
+ }
1857
+ }
1858
+ get CanGenerateSQL() {
1859
+ return !!this.NewEntitySchema.trim()
1860
+ && !!this.NewEntityTable.trim()
1861
+ && !!this.AddMapSourceObjectName;
1862
+ }
1863
+ get NewEntityName() {
1864
+ if (!this.NewEntityTable.trim())
1865
+ return '';
1866
+ return this.NewEntityTable.trim()
1867
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
1868
+ .replace(/_/g, ' ');
1869
+ }
1870
+ async PreviewDDL() {
1871
+ if (!this.CanGenerateSQL || !this.SelectedSummary)
1872
+ return;
1873
+ this.IsGeneratingDDL = true;
1874
+ this.DDLPreview = null;
1875
+ this.DDLPreviewWarnings = [];
1876
+ this.cdr.detectChanges();
1877
+ try {
1878
+ const objects = [{
1879
+ SourceObjectName: this.AddMapSourceObjectName,
1880
+ SchemaName: this.NewEntitySchema.trim(),
1881
+ TableName: this.NewEntityTable.trim(),
1882
+ EntityName: this.NewEntityName
1883
+ }];
1884
+ const result = await this.dataService.SchemaPreview(this.SelectedSummary.Integration.ID, objects);
1885
+ if (result.Success) {
1886
+ this.DDLPreview = result.Files.map(f => f.Content).join('\n\n');
1887
+ this.DDLPreviewWarnings = result.Warnings ?? [];
1888
+ }
1889
+ else {
1890
+ this.DDLPreview = `-- Error: ${result.Message}`;
1891
+ }
1892
+ }
1893
+ catch (err) {
1894
+ const msg = err instanceof Error ? err.message : String(err);
1895
+ this.DDLPreview = `-- Failed to generate DDL: ${msg}`;
1896
+ }
1897
+ finally {
1898
+ this.IsGeneratingDDL = false;
1899
+ this.cdr.detectChanges();
1900
+ }
1901
+ }
1902
+ async SaveAddMap() {
1903
+ if (!this.CanSaveAddMap || !this.SelectedSummary)
1904
+ return;
1905
+ this.IsSavingAddMap = true;
1906
+ this.cdr.detectChanges();
1907
+ try {
1908
+ const sourceObj = this.AvailableSourceObjects.find(o => o.Name === this.AddMapSourceObjectName);
1909
+ const result = await this.dataService.CreateEntityMap({
1910
+ CompanyIntegrationID: this.SelectedSummary.Integration.ID,
1911
+ ExternalObjectName: this.AddMapSourceObjectName,
1912
+ ExternalObjectLabel: sourceObj?.Label !== sourceObj?.Name ? sourceObj?.Label : undefined,
1913
+ EntityID: this.AddMapEntityID,
1914
+ SyncDirection: this.AddMapDirection
1915
+ });
1916
+ if (result) {
1917
+ this.ShowAddMapPanel = false;
1918
+ const maps = await this.loadEntityMapsForIntegration(this.SelectedSummary.Integration.ID);
1919
+ this.DetailEntityMaps = maps;
1920
+ this.DetailFilteredMaps = this.applyDetailFilter();
1921
+ // Update entity map count
1922
+ this.EntityMapCounts = this.countMapsByIntegration(await this.loadAllEntityMaps());
1923
+ }
1924
+ }
1925
+ catch (err) {
1926
+ console.error('[IntegrationConnections] Failed to create entity map:', err);
1927
+ }
1928
+ finally {
1929
+ this.IsSavingAddMap = false;
1930
+ this.cdr.detectChanges();
1931
+ }
1932
+ }
1933
+ resetAddMapState() {
1934
+ this.AddMapSourceObjectName = '';
1935
+ this.AddMapEntityID = '';
1936
+ this.AddMapDirection = 'Pull';
1937
+ this.AvailableSourceObjects = [];
1938
+ this.ShowCreateEntity = false;
1939
+ this.NewEntitySchema = '';
1940
+ this.NewEntityTable = '';
1941
+ this.DDLPreview = null;
1942
+ this.DDLPreviewWarnings = [];
1943
+ }
1944
+ async loadAddMapData() {
1945
+ if (!this.SelectedSummary)
1946
+ return;
1947
+ this.IsLoadingSourceObjects = true;
1948
+ this.cdr.detectChanges();
1949
+ try {
1950
+ // Load source objects from IntegrationEngineBase metadata
1951
+ const engine = IntegrationEngineBase.Instance;
1952
+ const integration = engine.GetIntegrationForCompanyIntegration(this.SelectedSummary.Integration.ID);
1953
+ if (integration) {
1954
+ const objects = engine.GetActiveIntegrationObjects(integration.ID);
1955
+ // Filter out objects that already have entity maps
1956
+ const existingNames = new Set(this.DetailEntityMaps.map(m => m.ExternalObjectName));
1957
+ this.AvailableSourceObjects = objects
1958
+ .filter(o => !existingNames.has(o.Name))
1959
+ .map(o => ({
1960
+ Name: o.Name,
1961
+ Label: o.DisplayName || o.Name
1962
+ }));
1963
+ }
1964
+ }
1965
+ catch (err) {
1966
+ console.error('[IntegrationConnections] Failed to load source objects:', err);
1967
+ }
1968
+ finally {
1969
+ this.IsLoadingSourceObjects = false;
1970
+ this.cdr.detectChanges();
1971
+ }
1972
+ }
1973
+ async loadEntityMapsForIntegration(companyIntegrationID) {
1974
+ const rv = new RunView(this.RunViewToUse ?? null);
1975
+ const result = await rv.RunView({
1976
+ EntityName: 'MJ: Company Integration Entity Maps',
1977
+ ExtraFilter: `CompanyIntegrationID='${companyIntegrationID}'`,
1978
+ OrderBy: 'Priority, ExternalObjectName',
1979
+ Fields: ['ID', 'CompanyIntegrationID', 'ExternalObjectName', 'ExternalObjectLabel',
1980
+ 'EntityID', 'SyncDirection', 'SyncEnabled', 'MatchStrategy',
1981
+ 'ConflictResolution', 'Priority', 'DeleteBehavior', 'Status', 'Entity'],
1982
+ ResultType: 'simple'
1983
+ });
1984
+ return result.Results;
1985
+ }
1986
+ // ---------------------------------------------------------------------------
1987
+ // Wizard: open/close
1988
+ // ---------------------------------------------------------------------------
1989
+ async OpenWizard() {
1990
+ this.resetWizardState();
1991
+ this.WizardOpen = true;
1992
+ this.cdr.detectChanges();
1993
+ await this.loadWizardData();
1994
+ }
1995
+ CloseWizard() {
1996
+ this.WizardOpen = false;
1997
+ if (this.SavedIntegrationID) {
1998
+ this.LoadData();
1999
+ }
2000
+ this.cdr.detectChanges();
2001
+ }
2002
+ OnKeydown(event) {
2003
+ if (event.key === 'Escape') {
2004
+ this.CloseWizard();
2005
+ }
2006
+ }
2007
+ // ---------------------------------------------------------------------------
2008
+ // Wizard: navigation
2009
+ // ---------------------------------------------------------------------------
2010
+ NextStep() {
2011
+ if (this.WizardStep < 3) {
2012
+ this.WizardStep = (this.WizardStep + 1);
2013
+ if (this.WizardStep === 3) {
2014
+ this.TestResult = null;
2015
+ }
2016
+ this.cdr.detectChanges();
2017
+ }
2018
+ }
2019
+ PreviousStep() {
2020
+ if (this.WizardStep > 1) {
2021
+ this.WizardStep = (this.WizardStep - 1);
2022
+ this.cdr.detectChanges();
2023
+ }
2024
+ }
2025
+ get IsNextDisabled() {
2026
+ if (this.WizardStep === 1)
2027
+ return !this.SelectedIntegration;
2028
+ if (this.WizardStep === 2)
2029
+ return !this.ConnectionName.trim() || !this.SelectedCompanyID;
2030
+ if (this.WizardStep === 3)
2031
+ return !this.TestResult?.Success;
2032
+ return false;
2033
+ }
2034
+ get NextButtonLabel() {
2035
+ if (this.WizardStep === 3)
2036
+ return 'Finish';
2037
+ return 'Next';
2038
+ }
2039
+ IsStepCompleted(stepNumber) {
2040
+ return stepNumber < this.WizardStep;
2041
+ }
2042
+ IsStepActive(stepNumber) {
2043
+ return stepNumber === this.WizardStep;
2044
+ }
2045
+ // ---------------------------------------------------------------------------
2046
+ // Wizard Step 1: Choose integration
2047
+ // ---------------------------------------------------------------------------
2048
+ SelectIntegration(def) {
2049
+ this.SelectedIntegration = def;
2050
+ this.ConnectionName = def.Name;
2051
+ }
2052
+ IsSelectedIntegration(def) {
2053
+ return UUIDsEqual(this.SelectedIntegration?.ID, def.ID);
2054
+ }
2055
+ get FilteredIntegrations() {
2056
+ if (!this.SearchQuery.trim())
2057
+ return this.AvailableIntegrations;
2058
+ const query = this.SearchQuery.toLowerCase();
2059
+ return this.AvailableIntegrations.filter(i => i.Name.toLowerCase().includes(query) ||
2060
+ (i.Description?.toLowerCase().includes(query) ?? false));
2061
+ }
2062
+ // ---------------------------------------------------------------------------
2063
+ // Wizard Step 2: Configure
2064
+ // ---------------------------------------------------------------------------
2065
+ get NeedsCompanyPicker() {
2066
+ return this.Companies.length > 1;
2067
+ }
2068
+ get IntegrationCredentialTypeID() {
2069
+ return this.SelectedIntegration?.CredentialTypeID ?? null;
2070
+ }
2071
+ async ShowExistingCredentials() {
2072
+ this.IsLoadingCredentials = true;
2073
+ this.cdr.detectChanges();
2074
+ const rv = new RunView();
2075
+ const filter = this.IntegrationCredentialTypeID
2076
+ ? `CredentialTypeID='${this.IntegrationCredentialTypeID}' AND IsActive=1`
2077
+ : 'IsActive=1';
2078
+ const result = await rv.RunView({
2079
+ EntityName: 'MJ: Credentials',
2080
+ ExtraFilter: filter,
2081
+ OrderBy: 'Name',
2082
+ ResultType: 'entity_object'
2083
+ });
2084
+ this.ExistingCredentials = result.Results;
2085
+ this.IsLoadingCredentials = false;
2086
+ this.cdr.detectChanges();
2087
+ }
2088
+ SelectExistingCredential(credential) {
2089
+ this.SelectedCredential = credential;
2090
+ this.SelectedCredentialID = credential.ID;
2091
+ }
2092
+ OpenCredentialDialog() {
2093
+ this.PreselectedCredentialTypeId = this.IntegrationCredentialTypeID ?? undefined;
2094
+ this.ShowCredentialDialog = true;
2095
+ this.cdr.detectChanges();
2096
+ }
2097
+ OnCredentialDialogClose(result) {
2098
+ this.ShowCredentialDialog = false;
2099
+ if (result.success && result.credential) {
2100
+ this.SelectedCredential = result.credential;
2101
+ this.SelectedCredentialID = result.credential.ID;
2102
+ }
2103
+ this.cdr.detectChanges();
2104
+ }
2105
+ ClearCredential() {
2106
+ this.SelectedCredential = null;
2107
+ this.SelectedCredentialID = null;
2108
+ }
2109
+ // ---------------------------------------------------------------------------
2110
+ // Wizard Step 3: Test connection
2111
+ // ---------------------------------------------------------------------------
2112
+ async TestNewConnection() {
2113
+ this.IsTesting = true;
2114
+ this.TestResult = null;
2115
+ this.cdr.detectChanges();
2116
+ try {
2117
+ const companyIntegrationID = await this.saveCompanyIntegration();
2118
+ if (!companyIntegrationID) {
2119
+ this.TestResult = {
2120
+ Success: false,
2121
+ Message: 'Could not save integration to test. Check your configuration.'
2122
+ };
2123
+ this.IsTesting = false;
2124
+ this.cdr.detectChanges();
2125
+ return;
2126
+ }
2127
+ const result = await this.dataService.TestConnection(companyIntegrationID);
2128
+ this.TestResult = {
2129
+ Success: result.Success,
2130
+ Message: result.Message,
2131
+ ServerVersion: result.ServerVersion ?? undefined
2132
+ };
2133
+ }
2134
+ catch (err) {
2135
+ const message = err instanceof Error ? err.message : String(err);
2136
+ this.TestResult = {
2137
+ Success: false,
2138
+ Message: `Connection test failed: ${message}`
2139
+ };
2140
+ }
2141
+ finally {
2142
+ this.IsTesting = false;
2143
+ this.cdr.detectChanges();
2144
+ }
2145
+ }
2146
+ // ---------------------------------------------------------------------------
2147
+ // Wizard: finish
2148
+ // ---------------------------------------------------------------------------
2149
+ async FinishWizard() {
2150
+ if (this.WizardStep < 3) {
2151
+ this.NextStep();
2152
+ return;
2153
+ }
2154
+ // On step 3 with a successful test — activate the integration and close
2155
+ if (!this.SavedIntegrationID)
2156
+ return;
2157
+ this.IsSaving = true;
2158
+ this.cdr.detectChanges();
2159
+ try {
2160
+ const md = new Metadata();
2161
+ const ci = await md.GetEntityObject('MJ: Company Integrations');
2162
+ await ci.Load(this.SavedIntegrationID);
2163
+ ci.IsActive = true;
2164
+ ci.Name = this.ConnectionName;
2165
+ await ci.Save();
2166
+ }
2167
+ catch (err) {
2168
+ console.error('[IntegrationConnections] Failed to activate integration:', err);
2169
+ }
2170
+ finally {
2171
+ this.IsSaving = false;
2172
+ this.WizardOpen = false;
2173
+ await this.LoadData();
2174
+ // Auto-select the newly created integration to show its detail view
2175
+ if (this.SavedIntegrationID) {
2176
+ const newSummary = this.Connections.find(c => UUIDsEqual(c.Integration.ID, this.SavedIntegrationID));
2177
+ if (newSummary) {
2178
+ await this.SelectIntegrationCard(newSummary);
2179
+ }
2180
+ }
2181
+ this.cdr.detectChanges();
2182
+ }
2183
+ }
2184
+ // ---------------------------------------------------------------------------
2185
+ // Private helpers
2186
+ // ---------------------------------------------------------------------------
2187
+ async loadWizardData() {
2188
+ try {
2189
+ const provider = this.RunViewToUse;
2190
+ const rv = new RunView(provider ?? null);
2191
+ const [integrations, companyResult] = await Promise.all([
2192
+ this.dataService.LoadIntegrationDefinitions(provider),
2193
+ rv.RunView({
2194
+ EntityName: 'MJ: Companies',
2195
+ Fields: ['ID', 'Name'],
2196
+ OrderBy: 'Name',
2197
+ ResultType: 'simple'
2198
+ })
2199
+ ]);
2200
+ this.AvailableIntegrations = integrations;
2201
+ this.Companies = companyResult.Success ? companyResult.Results : [];
2202
+ if (this.Companies.length === 1) {
2203
+ this.SelectedCompanyID = this.Companies[0].ID;
2204
+ }
2205
+ }
2206
+ catch (err) {
2207
+ console.error('[IntegrationConnections] Failed to load wizard data:', err);
2208
+ }
2209
+ this.cdr.detectChanges();
2210
+ }
2211
+ async saveCompanyIntegration() {
2212
+ if (this.SavedIntegrationID)
2213
+ return this.SavedIntegrationID;
2214
+ if (!this.SelectedCompanyID || !this.SelectedIntegration)
2215
+ return null;
2216
+ const md = new Metadata();
2217
+ const ci = await md.GetEntityObject('MJ: Company Integrations');
2218
+ ci.NewRecord();
2219
+ ci.CompanyID = this.SelectedCompanyID;
2220
+ ci.IntegrationID = this.SelectedIntegration.ID;
2221
+ ci.Name = this.ConnectionName || this.SelectedIntegration.Name;
2222
+ ci.IsActive = false;
2223
+ if (this.SelectedCredential) {
2224
+ ci.CredentialID = this.SelectedCredential.ID;
2225
+ }
2226
+ const saved = await ci.Save();
2227
+ if (saved) {
2228
+ this.SavedIntegrationID = ci.ID;
2229
+ return ci.ID;
2230
+ }
2231
+ console.error('[IntegrationConnections] Failed to save company integration:', ci.LatestResult?.CompleteMessage ?? ci.LatestResult?.Message);
2232
+ return null;
2233
+ }
2234
+ async loadAllEntityMaps() {
2235
+ const rv = new RunView(this.RunViewToUse ?? null);
2236
+ const result = await rv.RunView({
2237
+ EntityName: 'MJ: Company Integration Entity Maps',
2238
+ ExtraFilter: '',
2239
+ OrderBy: 'CompanyIntegrationID',
2240
+ Fields: ['ID', 'CompanyIntegrationID'],
2241
+ ResultType: 'simple'
2242
+ });
2243
+ return result.Results;
2244
+ }
2245
+ countMapsByIntegration(maps) {
2246
+ const counts = new Map();
2247
+ for (const map of maps) {
2248
+ const current = counts.get(map.CompanyIntegrationID) ?? 0;
2249
+ counts.set(map.CompanyIntegrationID, current + 1);
2250
+ }
2251
+ return counts;
2252
+ }
2253
+ resolveIconByName(name) {
2254
+ return ResolveIntegrationIcon(name);
2255
+ }
2256
+ resolveBrandColor(name) {
2257
+ const match = BRAND_COLOR_MAP.find(m => m.Pattern.test(name));
2258
+ return match ? match.Color : '#6366f1';
2259
+ }
2260
+ async toggleConnectionActive(summary) {
2261
+ const md = new Metadata();
2262
+ const ci = await md.GetEntityObject('MJ: Company Integrations');
2263
+ await ci.Load(summary.Integration.ID);
2264
+ ci.IsActive = !summary.Integration.IsActive;
2265
+ const saved = await ci.Save();
2266
+ if (saved) {
2267
+ await this.LoadData();
2268
+ }
2269
+ }
2270
+ async loadEditCredentials() {
2271
+ const rv = new RunView();
2272
+ const result = await rv.RunView({
2273
+ EntityName: 'MJ: Credentials',
2274
+ ExtraFilter: 'IsActive=1',
2275
+ OrderBy: 'Name',
2276
+ ResultType: 'entity_object'
2277
+ });
2278
+ this.EditCredentials = result.Results;
2279
+ // Pre-select the current credential if one is set
2280
+ if (this.EditCredentialID) {
2281
+ this.EditCredential = this.EditCredentials.find(c => UUIDsEqual(c.ID, this.EditCredentialID)) ?? null;
2282
+ }
2283
+ }
2284
+ resetWizardState() {
2285
+ this.WizardStep = 1;
2286
+ this.AvailableIntegrations = [];
2287
+ this.SearchQuery = '';
2288
+ this.SelectedIntegration = null;
2289
+ this.ConnectionName = '';
2290
+ this.SelectedCompanyID = null;
2291
+ this.ConnectionDescription = '';
2292
+ this.SelectedCredentialID = null;
2293
+ this.SelectedCredential = null;
2294
+ this.ShowCredentialDialog = false;
2295
+ this.ExistingCredentials = [];
2296
+ this.Companies = [];
2297
+ this.TestResult = null;
2298
+ this.IsTesting = false;
2299
+ this.IsSaving = false;
2300
+ this.SavedIntegrationID = null;
2301
+ this.OpenMenuID = null;
2302
+ }
2303
+ onDocumentClick(e) {
2304
+ if (this.OpenMenuID) {
2305
+ const target = e.target;
2306
+ if (!target.closest('.card-menu-wrapper')) {
2307
+ this.OpenMenuID = null;
2308
+ this.cdr.detectChanges();
2309
+ }
2310
+ }
2311
+ }
2312
+ static ɵfac = /*@__PURE__*/ (() => { let ɵConnectionsComponent_BaseFactory; return function ConnectionsComponent_Factory(__ngFactoryType__) { return (ɵConnectionsComponent_BaseFactory || (ɵConnectionsComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ConnectionsComponent)))(__ngFactoryType__ || ConnectionsComponent); }; })();
2313
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConnectionsComponent, selectors: [["app-integration-connections"]], viewQuery: function ConnectionsComponent_Query(rf, ctx) { if (rf & 1) {
2314
+ i0.ɵɵviewQuery(_c0, 5);
2315
+ } if (rf & 2) {
2316
+ let _t;
2317
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entityTreeDropdown = _t.first);
2318
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 14, consts: [["entityTreeDropdown", ""], [1, "connections-container"], [1, "detail-view"], [1, "wizard-inline"], [1, "edit-panel-backdrop", 3, "click"], [1, "edit-panel"], [3, "Visible", "PreselectedTypeId"], [1, "connections-header"], [1, "header-left"], [1, "header-title"], [1, "header-count"], ["kendoButton", "", 1, "add-connection-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "loading-container"], [1, "empty-state"], [1, "card-grid"], ["text", "Loading integrations..."], [1, "fa-solid", "fa-plug", "empty-icon"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [1, "connection-card"], [1, "connection-card", "new-connection-card", 3, "click"], [1, "new-card-content"], [1, "new-card-icon"], [1, "new-card-label"], [1, "card-clickable", 3, "click"], [1, "card-header"], [1, "icon-circle"], [1, "icon-large"], [1, "card-body"], [1, "card-name"], [1, "card-company"], [1, "card-meta"], [1, "meta-label"], [1, "meta-separator"], [1, "meta-value"], [1, "card-sync-info"], [1, "fa-solid", "fa-arrows-rotate"], [1, "card-test-result", 3, "test-success", "test-failure"], [1, "delete-confirm-overlay"], [1, "card-footer"], ["kendoButton", "", "look", "outline", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["kendoButton", "", "look", "outline", 3, "click"], ["kendoButton", "", "themeColor", "primary"], [1, "card-menu-wrapper"], [1, "menu-trigger", 3, "click"], [1, "fa-solid", "fa-ellipsis-vertical"], [1, "card-menu-dropdown"], [1, "card-test-result"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-circle-xmark"], [1, "delete-confirm-content"], [1, "fa-solid", "fa-triangle-exclamation", "delete-warn-icon"], [1, "delete-confirm-text"], [1, "delete-confirm-actions"], ["kendoButton", "", "themeColor", "error", 3, "click", "disabled"], [1, "menu-item", 3, "click"], [1, "fa-solid", "fa-pen-to-square"], [1, "fa-solid", "fa-toggle-off"], [1, "menu-item", "menu-item-danger", 3, "click"], [1, "fa-solid", "fa-trash-can"], [3, "EntityMap", "CompanyIntegrationID", "RunViewProvider"], [3, "Close", "EntityMap", "CompanyIntegrationID", "RunViewProvider"], [1, "detail-header"], ["title", "Back to Integrations", 1, "detail-back-btn", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "detail-header-info"], [1, "detail-header-text"], [1, "detail-title"], [1, "detail-subtitle"], [1, "detail-header-actions"], ["title", "Configure", 1, "detail-edit-btn", 3, "click"], [1, "detail-toolbar"], [1, "detail-toolbar-left"], [1, "detail-map-count"], [1, "detail-toolbar-right"], [1, "detail-search"], [1, "fa-solid", "fa-filter"], ["type", "text", "placeholder", "Filter entity maps...", 3, "input", "value"], [1, "add-map-btn", 3, "click"], [1, "add-map-panel"], [1, "detail-empty"], [1, "add-map-row"], [1, "add-map-field"], [1, "add-map-label"], [1, "add-map-loading"], [1, "add-map-hint"], [1, "add-map-select", 3, "ngModel"], [1, "add-map-direction-col"], [1, "add-map-direction-btns"], ["title", "Pull from source", 3, "click"], [1, "fa-solid", "fa-arrow-right"], ["title", "Bidirectional sync", 3, "click"], [1, "fa-solid", "fa-right-left"], ["title", "Push to source", 3, "click"], [1, "add-map-field", "add-map-entity-field"], [1, "entity-picker-row"], [3, "SelectionChange", "BranchConfig", "LeafConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch"], ["title", "Create new entity table", 1, "new-entity-btn", 3, "click"], [1, "add-map-actions"], [1, "add-map-save-btn", 3, "click", "disabled"], [1, "add-map-cancel-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "add-map-select", 3, "ngModelChange", "ngModel"], ["disabled", "", 3, "ngValue"], [3, "value"], [1, "fa-solid", "fa-check"], ["text", "Loading entity maps..."], [1, "fa-solid", "fa-cube"], [1, "add-map-btn", "add-map-btn-lg", 3, "click"], [1, "detail-table-head"], [1, "dt-col-toggle"], [1, "dt-col-source"], [1, "dt-col-direction"], [1, "dt-col-dest"], [1, "dt-col-meta"], [1, "detail-table-body"], [1, "detail-map-row", 3, "sync-disabled"], [1, "detail-table-empty"], [1, "detail-map-row", 3, "click"], [1, "dt-col-toggle", 3, "click"], [1, "toggle-switch", 3, "title"], ["type", "checkbox", 3, "change", "checked"], [1, "toggle-slider"], [1, "dt-col-source", 3, "title"], [1, "dt-col-dest", 3, "title"], ["title", "Match strategy configured", 1, "detail-config-badge"], [1, "detail-config-badge", 3, "title"], [1, "map-edit-hint"], [1, "fa-solid", "fa-chevron-right"], [1, "fa-solid", "fa-link"], [1, "wizard-header"], [1, "wizard-back-btn", 3, "click"], [1, "wizard-title"], [1, "step-indicator"], [1, "wizard-body"], [1, "step-content"], [1, "step-content", "step-content-centered"], [1, "wizard-footer"], [1, "footer-left"], [1, "footer-right"], ["kendoButton", "", "look", "outline"], ["kendoButton", "", "themeColor", "primary", 3, "click", "disabled"], [1, "step-item"], [1, "step-circle"], [1, "step-label"], [1, "step-line", 3, "step-line-active"], [1, "step-line"], [1, "step-title"], [1, "search-bar"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search integrations...", 1, "search-input", 3, "ngModelChange", "ngModel"], [1, "no-integrations"], [1, "integration-picker-grid"], [1, "fa-solid", "fa-puzzle-piece"], [1, "no-integrations-hint"], [1, "fa-solid", "fa-search"], [1, "integration-picker-card", 3, "picker-selected"], [1, "integration-picker-card", 3, "click"], [1, "picker-icon-circle"], [1, "picker-name"], [1, "picker-description"], [1, "form-group"], ["for", "connectionName", 1, "form-label"], ["id", "connectionName", "type", "text", "placeholder", "e.g. Production HubSpot", 1, "form-input", 3, "ngModelChange", "ngModel"], ["for", "companySelect", 1, "form-label"], ["id", "companySelect", 1, "form-input", 3, "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "form-hint"], ["for", "connectionDescription", 1, "form-label"], [1, "optional-label"], ["id", "connectionDescription", "placeholder", "Notes about this connection...", "rows", "3", 1, "form-input", "form-textarea", 3, "ngModelChange", "ngModel"], [1, "form-label"], [1, "credential-selected"], [1, "credential-actions"], [1, "credential-loading"], [1, "credential-list"], ["id", "companySelect", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "credential-info"], [1, "fa-solid", "fa-key"], [1, "credential-clear", 3, "click"], ["text", "Loading credentials...", "size", "small"], [1, "credential-list-item"], [1, "credential-list-item", 3, "click"], [1, "test-prompt"], [1, "test-running"], [1, "test-result", 3, "test-result-success", "test-result-failure"], ["kendoButton", "", "themeColor", "primary", "size", "large", 3, "click"], [1, "fa-solid", "fa-vial"], [1, "test-hint"], [1, "test-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-3x"], [1, "test-result"], [1, "test-result-icon"], [1, "test-result-message"], [1, "test-result-detail"], ["kendoButton", "", "look", "outline", 1, "test-retry-btn"], ["kendoButton", "", "look", "outline", 1, "test-retry-btn", 3, "click"], [1, "fa-solid", "fa-rotate-right"], [1, "edit-panel-header"], [1, "edit-panel-title"], [1, "edit-icon-circle"], [1, "edit-close-btn", 3, "click"], [1, "edit-panel-loading"], ["text", "Loading...", "size", "small"], [1, "edit-panel-body"], [1, "edit-form-group"], [1, "edit-form-label"], ["type", "text", "placeholder", "Connection name...", 1, "edit-form-input", 3, "ngModelChange", "ngModel"], [1, "edit-toggle-row"], [1, "toggle-switch"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "edit-toggle-label"], [1, "edit-credential-selected"], [1, "edit-readonly-field"], [1, "edit-panel-footer"], [1, "edit-credential-info"], [1, "edit-credential-clear", 3, "click"], [1, "edit-credential-actions"], ["kendoButton", "", "look", "outline", "size", "small", 3, "click"], [1, "edit-credential-list"], [1, "edit-credential-item"], [1, "edit-credential-item", 3, "click"], [3, "close", "Visible", "PreselectedTypeId"], [1, "new-entity-backdrop", 3, "click"], [1, "new-entity-dialog"], [1, "new-entity-dialog-header"], [1, "new-entity-dialog-close", 3, "click"], [1, "new-entity-dialog-body"], [1, "new-entity-dialog-desc"], [1, "new-entity-dialog-form"], [1, "new-entity-dialog-row"], [1, "new-entity-dialog-field"], [1, "new-entity-dialog-label"], [1, "new-entity-dialog-value"], [1, "new-entity-dialog-hint"], ["type", "text", "placeholder", "e.g. hubspot", 1, "new-entity-dialog-input", 3, "ngModelChange", "ngModel"], [1, "new-entity-dialog-dot"], [1, "new-entity-dialog-field", "new-entity-dialog-field-wide"], ["type", "text", "placeholder", "e.g. Contact", 1, "new-entity-dialog-input", 3, "ngModelChange", "ngModel"], [1, "ddl-warnings"], [1, "ddl-preview-block"], [1, "new-entity-next-steps"], [1, "new-entity-dialog-footer"], [1, "new-entity-preview-btn", 3, "click", "disabled"], [1, "new-entity-dialog-done-btn", 3, "click"], [1, "ddl-warning"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "ddl-preview-header"], ["title", "Copy to clipboard", 1, "ddl-copy-btn", 3, "click"], [1, "ddl-preview-code"], [1, "fa-regular", "fa-copy"], [1, "fa-solid", "fa-list-check"], [1, "fa-solid", "fa-code"]], template: function ConnectionsComponent_Template(rf, ctx) { if (rf & 1) {
2319
+ i0.ɵɵelementStart(0, "div", 1);
2320
+ i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_1_Template, 12, 5);
2321
+ i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_2_Template, 3, 1, "div", 2);
2322
+ i0.ɵɵconditionalCreate(3, ConnectionsComponent_Conditional_3_Template, 21, 6, "div", 3);
2323
+ i0.ɵɵelementEnd();
2324
+ i0.ɵɵelementStart(4, "div", 4);
2325
+ i0.ɵɵlistener("click", function ConnectionsComponent_Template_div_click_4_listener() { return ctx.CloseEditPanel(); });
2326
+ i0.ɵɵelementEnd();
2327
+ i0.ɵɵelementStart(5, "div", 5);
2328
+ i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_6_Template, 10, 5);
2329
+ i0.ɵɵelementEnd();
2330
+ i0.ɵɵconditionalCreate(7, ConnectionsComponent_Conditional_7_Template, 1, 2, "mj-credential-dialog", 6);
2331
+ i0.ɵɵconditionalCreate(8, ConnectionsComponent_Conditional_8_Template, 38, 8);
2332
+ } if (rf & 2) {
2333
+ i0.ɵɵclassProp("detail-active", !!ctx.SelectedSummary)("editor-active", !!ctx.EditorEntityMap);
2334
+ i0.ɵɵadvance();
2335
+ i0.ɵɵconditional(!ctx.WizardOpen && !ctx.SelectedSummary ? 1 : -1);
2336
+ i0.ɵɵadvance();
2337
+ i0.ɵɵconditional(!ctx.WizardOpen && ctx.SelectedSummary ? 2 : -1);
2338
+ i0.ɵɵadvance();
2339
+ i0.ɵɵconditional(ctx.WizardOpen ? 3 : -1);
2340
+ i0.ɵɵadvance();
2341
+ i0.ɵɵclassProp("open", ctx.EditPanelOpen);
2342
+ i0.ɵɵadvance();
2343
+ i0.ɵɵclassProp("open", ctx.EditPanelOpen);
2344
+ i0.ɵɵadvance();
2345
+ i0.ɵɵconditional(ctx.EditingSummary ? 6 : -1);
2346
+ i0.ɵɵadvance();
2347
+ i0.ɵɵconditional(ctx.ShowCredentialDialog ? 7 : -1);
2348
+ i0.ɵɵadvance();
2349
+ i0.ɵɵconditional(ctx.ShowCreateEntity ? 8 : -1);
2350
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.ButtonComponent, i3.LoadingComponent, i4.CredentialDialogComponent, i5.TreeDropdownComponent, i6.VisualFieldEditorComponent], styles: ["\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.connections-container[_ngcontent-%COMP%] {\n padding: 24px;\n max-width: 1400px;\n width: 100%;\n margin: 0 auto;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n box-sizing: border-box;\n}\n\n\n\n\n.connections-container.detail-active[_ngcontent-%COMP%], \n.connections-container.editor-active[_ngcontent-%COMP%] {\n overflow: hidden;\n}\n\n.connections-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 12px;\n}\n\n.header-title[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n margin: 0;\n color: var(--mj-text-primary);\n}\n\n.header-count[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n.add-connection-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n\n\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n color: var(--mj-color-neutral-300);\n margin-bottom: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-color-neutral-700);\n margin: 0 0 8px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin: 0 0 24px;\n}\n\n\n\n\n\n\n.card-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 20px;\n}\n\n\n\n\n\n\n.connection-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n transition: box-shadow 0.2s ease, transform 0.2s ease;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n}\n\n.connection-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n}\n\n\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 16px 0;\n}\n\n.icon-circle[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n}\n\n.icon-large[_ngcontent-%COMP%] {\n font-size: 22px;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n padding: 4px 10px;\n border-radius: 20px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-badge-connected[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-600);\n}\n\n.status-badge-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-color-error-600);\n}\n\n.status-badge-inactive[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n}\n\n.status-badge-syncing[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n\n\n.card-body[_ngcontent-%COMP%] {\n padding: 12px 16px;\n flex: 1;\n}\n\n.card-name[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.card-company[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin-bottom: 10px;\n}\n\n.card-meta[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.meta-separator[_ngcontent-%COMP%] {\n margin: 0 6px;\n}\n\n.meta-label[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.card-sync-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.card-sync-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.card-test-result[_ngcontent-%COMP%] {\n font-size: 12px;\n padding: 6px 10px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n}\n\n.card-test-result.test-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-600);\n}\n\n.card-test-result.test-failure[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-color-error-600);\n}\n\n.card-test-result[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n.card-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.card-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.card-menu-wrapper[_ngcontent-%COMP%] {\n position: relative;\n margin-left: auto;\n}\n\n.menu-trigger[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 6px;\n color: var(--mj-text-disabled);\n font-size: 16px;\n transition: background 0.15s;\n}\n\n.menu-trigger[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.card-menu-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n right: 0;\n top: 100%;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n min-width: 160px;\n z-index: 50;\n padding: 4px;\n}\n\n.menu-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n border-radius: 6px;\n transition: background 0.15s;\n text-align: left;\n}\n\n.menu-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.menu-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.menu-item-danger[_ngcontent-%COMP%] {\n color: var(--mj-color-error-600);\n}\n\n.menu-item-danger[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-error-600);\n}\n\n.menu-item-danger[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n}\n\n\n\n\n\n\n.new-connection-card[_ngcontent-%COMP%] {\n border: 2px dashed var(--mj-border-strong);\n background: var(--mj-bg-page);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n transition: background 0.2s, border-color 0.2s;\n}\n\n.new-connection-card[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n box-shadow: none;\n transform: none;\n}\n\n.new-card-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n\n.new-card-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--mj-bg-surface-active);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n color: var(--mj-text-muted);\n transition: background 0.2s, color 0.2s;\n}\n\n.new-connection-card[_ngcontent-%COMP%]:hover .new-card-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.new-card-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n.new-connection-card[_ngcontent-%COMP%]:hover .new-card-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n.wizard-inline[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-width: 720px;\n margin: 0 auto;\n}\n\n\n\n.wizard-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 0 0 20px;\n}\n\n.wizard-back-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n padding: 6px 10px;\n border-radius: 6px;\n transition: background 0.15s, color 0.15s;\n}\n\n.wizard-back-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.wizard-title[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n\n\n\n\n\n.step-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 32px;\n gap: 0;\n}\n\n.step-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n position: relative;\n}\n\n.step-circle[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 600;\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-disabled);\n border: 2px solid var(--mj-border-default);\n transition: all 0.2s;\n}\n\n.step-active[_ngcontent-%COMP%] .step-circle[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.step-completed[_ngcontent-%COMP%] .step-circle[_ngcontent-%COMP%] {\n background: var(--mj-color-success-600);\n color: var(--mj-text-inverse);\n border-color: var(--mj-color-success-600);\n}\n\n.step-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n}\n\n.step-active[_ngcontent-%COMP%] .step-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.step-completed[_ngcontent-%COMP%] .step-label[_ngcontent-%COMP%] {\n color: var(--mj-color-success-600);\n}\n\n.step-line[_ngcontent-%COMP%] {\n width: 48px;\n height: 2px;\n background: var(--mj-border-default);\n margin: 0 8px;\n margin-bottom: 20px;\n transition: background 0.2s;\n}\n\n.step-line-active[_ngcontent-%COMP%] {\n background: var(--mj-color-success-600);\n}\n\n\n\n\n\n\n.wizard-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 0 24px 24px;\n}\n\n.step-content[_ngcontent-%COMP%] {\n min-height: 300px;\n}\n\n.step-content-centered[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n}\n\n.step-title[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 20px;\n}\n\n.step-content-centered[_ngcontent-%COMP%] .step-title[_ngcontent-%COMP%] {\n margin-bottom: 32px;\n}\n\n\n\n.search-bar[_ngcontent-%COMP%] {\n position: relative;\n margin-bottom: 20px;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 14px 10px 40px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n}\n\n.search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n\n\n.no-integrations[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-disabled);\n text-align: center;\n}\n\n.no-integrations[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n}\n\n.no-integrations[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin: 0 0 4px;\n}\n\n.no-integrations-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.integration-picker-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n}\n\n.integration-picker-card[_ngcontent-%COMP%] {\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n cursor: pointer;\n text-align: center;\n transition: border-color 0.2s, background 0.15s;\n}\n\n.integration-picker-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-color-info-100);\n background: var(--mj-bg-page);\n}\n\n.integration-picker-card.picker-selected[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: var(--mj-status-info-bg);\n}\n\n.picker-icon-circle[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n margin: 0 auto 10px;\n font-size: 18px;\n}\n\n.picker-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.picker-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n line-height: 1.3;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n\n\n\n\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.form-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.optional-label[_ngcontent-%COMP%] {\n font-weight: 400;\n color: var(--mj-text-disabled);\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.form-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input[_ngcontent-%COMP%]:disabled {\n background: var(--mj-bg-page);\n color: var(--mj-text-muted);\n}\n\n.form-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 72px;\n}\n\n.form-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n}\n\n\n\n.credential-selected[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-color-success-200);\n border-radius: 8px;\n}\n\n.credential-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-color-success-800);\n font-size: 14px;\n font-weight: 500;\n}\n\n.credential-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-success-600);\n}\n\n.credential-clear[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n transition: color 0.15s;\n}\n\n.credential-clear[_ngcontent-%COMP%]:hover {\n color: var(--mj-color-error-600);\n}\n\n.credential-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.credential-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.credential-loading[_ngcontent-%COMP%] {\n padding: 16px 0;\n}\n\n.credential-list[_ngcontent-%COMP%] {\n margin-top: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.credential-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-color-neutral-700);\n border-bottom: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n}\n\n.credential-list-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.credential-list-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-page);\n}\n\n.credential-list-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n}\n\n\n\n\n\n\n.test-prompt[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.test-hint[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\n\n.test-running[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n color: var(--mj-brand-primary);\n}\n\n.test-spinner[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.test-running[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 500;\n margin: 0;\n}\n\n\n\n.test-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 24px;\n border-radius: 12px;\n max-width: 400px;\n}\n\n.test-result-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n}\n\n.test-result-failure[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n}\n\n.test-result-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n animation: _ngcontent-%COMP%_scaleIn 0.3s ease-out;\n}\n\n.test-result-success[_ngcontent-%COMP%] .test-result-icon[_ngcontent-%COMP%] {\n color: var(--mj-color-success-600);\n}\n\n.test-result-failure[_ngcontent-%COMP%] .test-result-icon[_ngcontent-%COMP%] {\n color: var(--mj-color-error-600);\n}\n\n@keyframes _ngcontent-%COMP%_scaleIn {\n from {\n transform: scale(0.5);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.test-result-message[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-color-neutral-700);\n text-align: center;\n}\n\n.test-result-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.test-retry-btn[_ngcontent-%COMP%] {\n margin-top: 4px;\n}\n\n\n\n.toggle-switch[_ngcontent-%COMP%] {\n position: relative;\n display: inline-block;\n width: 44px;\n height: 24px;\n flex-shrink: 0;\n}\n\n.toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.toggle-slider[_ngcontent-%COMP%] {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-border-strong);\n border-radius: 24px;\n transition: background 0.2s;\n}\n\n.toggle-slider[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n height: 18px;\n width: 18px;\n left: 3px;\n bottom: 3px;\n background: var(--mj-bg-surface);\n border-radius: 50%;\n transition: transform 0.2s;\n}\n\n.toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .toggle-slider[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.toggle-switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .toggle-slider[_ngcontent-%COMP%]::before {\n transform: translateX(20px);\n}\n\n\n\n\n\n\n.wizard-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.footer-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .connections-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .card-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .integration-picker-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .step-indicator[_ngcontent-%COMP%] {\n padding: 16px;\n overflow-x: auto;\n }\n\n .step-line[_ngcontent-%COMP%] {\n width: 24px;\n }\n\n .credential-actions[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n}\n\n@media (max-width: 480px) {\n .integration-picker-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .card-footer[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n\n\n\n\n\n.delete-confirm-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: rgba(255, 255, 255, 0.95);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 5;\n border-radius: 12px;\n animation: _ngcontent-%COMP%_fadeIn 150ms ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.delete-confirm-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 20px;\n text-align: center;\n}\n\n.delete-warn-icon[_ngcontent-%COMP%] {\n font-size: 28px;\n color: var(--mj-color-error-600);\n}\n\n.delete-confirm-text[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-color-neutral-700);\n max-width: 220px;\n}\n\n.delete-confirm-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: 4px;\n}\n\n\n\n\n\n\n.edit-panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.1);\n z-index: 99;\n opacity: 0;\n pointer-events: none;\n transition: opacity 300ms ease;\n}\n\n.edit-panel-backdrop.open[_ngcontent-%COMP%] {\n opacity: 1;\n pointer-events: auto;\n}\n\n.edit-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 400px;\n max-width: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.08);\n z-index: 100;\n transform: translateX(100%);\n transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.edit-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.edit-panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.edit-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.edit-icon-circle[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n}\n\n.edit-close-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n font-size: 14px;\n transition: all 150ms ease;\n}\n\n.edit-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.edit-panel-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 48px 20px;\n}\n\n.edit-panel-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.edit-form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.edit-form-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.edit-form-input[_ngcontent-%COMP%] {\n height: 36px;\n padding: 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n transition: border-color 150ms ease;\n}\n\n.edit-form-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-color-indigo-500);\n}\n\n.edit-readonly-field[_ngcontent-%COMP%] {\n padding: 8px 12px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.edit-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.edit-toggle-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n}\n\n.edit-toggle-label.active[_ngcontent-%COMP%] {\n color: var(--mj-color-success-600);\n}\n\n.edit-credential-selected[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-page);\n}\n\n.edit-credential-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n}\n\n.edit-credential-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-indigo-500);\n}\n\n.edit-credential-clear[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n transition: all 150ms ease;\n}\n\n.edit-credential-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-error-200);\n color: var(--mj-color-error-600);\n}\n\n.edit-credential-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.edit-credential-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 6px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n\n.edit-credential-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n cursor: pointer;\n transition: background 150ms ease;\n}\n\n.edit-credential-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.edit-credential-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.edit-panel-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.card-clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n\n\n\n\n\n.detail-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.detail-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.detail-header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.detail-header-text[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.detail-title[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detail-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.detail-header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n\n\n.detail-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.detail-toolbar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-map-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.detail-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.detail-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.detail-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n border: none;\n outline: none;\n background: transparent;\n font-size: 13px;\n color: var(--mj-text-primary);\n width: 200px;\n}\n\n.detail-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n\n\n.add-map-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-color-indigo-200);\n border-radius: 6px;\n background: var(--mj-color-indigo-50);\n color: var(--mj-color-indigo-600);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n white-space: nowrap;\n}\n\n.add-map-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-indigo-100);\n border-color: var(--mj-color-indigo-300);\n}\n\n.add-map-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-color-indigo-500);\n color: var(--mj-bg-surface);\n border-color: var(--mj-color-indigo-500);\n}\n\n.add-map-btn-lg[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding: 10px 20px;\n font-size: 14px;\n}\n\n\n\n.add-map-panel[_ngcontent-%COMP%] {\n padding: 16px;\n margin-bottom: 12px;\n background: var(--mj-color-indigo-50);\n border: 1px solid var(--mj-color-indigo-200);\n border-radius: 8px;\n animation: _ngcontent-%COMP%_fadeIn 200ms ease;\n}\n\n.add-map-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n gap: 12px;\n}\n\n.add-map-field[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.add-map-label[_ngcontent-%COMP%] {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 6px;\n}\n\n.add-map-select[_ngcontent-%COMP%] {\n width: 100%;\n height: 34px;\n padding: 0 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n cursor: pointer;\n}\n\n.add-map-select[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-color-indigo-500);\n}\n\n.add-map-direction-col[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.add-map-direction-btns[_ngcontent-%COMP%] {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.add-map-direction-btns[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 7px 12px;\n border: none;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 13px;\n cursor: pointer;\n transition: all 150ms ease;\n border-right: 1px solid var(--mj-border-default);\n}\n\n.add-map-direction-btns[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:last-child {\n border-right: none;\n}\n\n.add-map-direction-btns[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.add-map-direction-btns[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%] {\n background: var(--mj-color-indigo-500);\n color: var(--mj-bg-surface);\n}\n\n.add-map-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.add-map-save-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-color-indigo-500);\n color: var(--mj-bg-surface);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n white-space: nowrap;\n}\n\n.add-map-save-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-indigo-600);\n}\n\n.add-map-save-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.add-map-cancel-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 13px;\n transition: all 150ms ease;\n}\n\n.add-map-cancel-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.add-map-loading[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n}\n\n.add-map-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-indigo-500);\n margin-right: 4px;\n}\n\n.add-map-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n font-style: italic;\n}\n\n\n\n.add-map-entity-field[_ngcontent-%COMP%] {\n flex: 2;\n min-width: 280px;\n}\n\n\n\n.entity-picker-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.entity-picker-row[_ngcontent-%COMP%] mj-tree-dropdown[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.new-entity-btn[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-color-primary-600, #4f46e5);\n background: var(--mj-color-primary-50, #eef2ff);\n border: 1px solid var(--mj-color-primary-200, #c7d2fe);\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.15s ease;\n}\n\n.new-entity-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-primary-100, #e0e7ff);\n border-color: var(--mj-color-primary-300, #a5b4fc);\n}\n\n\n\n\n\n\n.new-entity-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease;\n}\n\n.new-entity-dialog[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 640px;\n max-width: 90vw;\n max-height: 85vh;\n background: var(--mj-bg-surface, #fff);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n.new-entity-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-color-neutral-200, #e5e7eb);\n}\n\n.new-entity-dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary, #111827);\n}\n\n.new-entity-dialog-close[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n font-size: 14px;\n color: var(--mj-text-secondary, #6b7280);\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-neutral-100, #f3f4f6);\n color: var(--mj-text-primary, #111827);\n}\n\n.new-entity-dialog-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.new-entity-dialog-desc[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary, #6b7280);\n line-height: 1.5;\n}\n\n.new-entity-dialog-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.new-entity-dialog-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n}\n\n.new-entity-dialog-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n}\n\n.new-entity-dialog-field-wide[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.new-entity-dialog-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n.new-entity-dialog-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: 14px;\n border: 1px solid var(--mj-color-neutral-300, #d1d5db);\n border-radius: 6px;\n background: var(--mj-bg-surface, #fff);\n color: var(--mj-text-primary, #111827);\n transition: border-color 0.15s ease;\n}\n\n.new-entity-dialog-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-color-primary-400, #818cf8);\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.1);\n}\n\n.new-entity-dialog-dot[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-secondary, #6b7280);\n padding-bottom: 6px;\n user-select: none;\n}\n\n.new-entity-dialog-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary, #111827);\n padding: 8px 0 4px;\n}\n\n.new-entity-dialog-hint[_ngcontent-%COMP%] {\n font-style: italic;\n color: var(--mj-text-disabled, #9ca3af);\n font-weight: 400;\n}\n\n.new-entity-dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-color-neutral-200, #e5e7eb);\n}\n\n.new-entity-preview-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n color: #fff;\n background: var(--mj-color-primary-600, #4f46e5);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.15s ease;\n}\n\n.new-entity-preview-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-color-primary-700, #4338ca);\n}\n\n.new-entity-preview-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.new-entity-dialog-done-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary, #6b7280);\n background: transparent;\n border: 1px solid var(--mj-color-neutral-300, #d1d5db);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-done-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-neutral-50, #f9fafb);\n border-color: var(--mj-color-neutral-400, #9ca3af);\n}\n\n\n\n.new-entity-next-steps[_ngcontent-%COMP%] {\n background: var(--mj-color-primary-50, #eef2ff);\n border: 1px solid var(--mj-color-primary-200, #c7d2fe);\n border-radius: 8px;\n padding: 14px 16px;\n}\n\n.new-entity-next-steps[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-color-primary-700, #4338ca);\n}\n\n.new-entity-next-steps[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n.new-entity-next-steps[_ngcontent-%COMP%] ol[_ngcontent-%COMP%] {\n margin: 0;\n padding-left: 20px;\n font-size: 13px;\n color: var(--mj-color-primary-800, #3730a3);\n line-height: 1.7;\n}\n\n\n\n.ddl-copy-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary, #6b7280);\n background: transparent;\n border: 1px solid var(--mj-color-neutral-300, #d1d5db);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ddl-copy-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-neutral-100, #f3f4f6);\n border-color: var(--mj-color-neutral-400, #9ca3af);\n}\n\n\n\n.ddl-warnings[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ddl-warning[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-color-warning-700, #a16207);\n background: var(--mj-color-warning-50, #fffbeb);\n padding: 6px 10px;\n border-radius: 4px;\n border-left: 3px solid var(--mj-color-warning-400, #facc15);\n}\n\n.ddl-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n}\n\n.ddl-preview-block[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-color-neutral-200, #e5e7eb);\n border-radius: 8px;\n overflow: hidden;\n max-height: 300px;\n display: flex;\n flex-direction: column;\n}\n\n.ddl-preview-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--mj-color-neutral-50, #f9fafb);\n border-bottom: 1px solid var(--mj-color-neutral-200, #e5e7eb);\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n.ddl-preview-code[_ngcontent-%COMP%] {\n margin: 0;\n padding: 12px 16px;\n font-size: 12px;\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;\n line-height: 1.6;\n color: var(--mj-text-primary, #111827);\n background: var(--mj-bg-surface, #fff);\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n flex: 1;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.detail-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.detail-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n color: var(--mj-color-neutral-300);\n}\n\n.detail-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-color-neutral-600);\n margin: 0 0 6px;\n}\n\n.detail-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 13px;\n margin: 0;\n max-width: 400px;\n}\n\n\n\n.detail-table-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px 8px 0 0;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n}\n\n.detail-table-body[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-top: none;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.detail-map-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n font-size: 13px;\n}\n\n.detail-map-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.detail-map-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-page);\n cursor: pointer;\n}\n\n.detail-map-row.sync-disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n}\n\n\n\n.dt-col-toggle[_ngcontent-%COMP%] {\n width: 60px;\n flex-shrink: 0;\n}\n\n.dt-col-source[_ngcontent-%COMP%] {\n flex: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.dt-col-direction[_ngcontent-%COMP%] {\n width: 80px;\n flex-shrink: 0;\n text-align: center;\n}\n\n.dt-col-dest[_ngcontent-%COMP%] {\n flex: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.dt-col-meta[_ngcontent-%COMP%] {\n width: 80px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n justify-content: flex-end;\n}\n\n\n\n.direction-badge[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 4px;\n white-space: nowrap;\n}\n\n.direction-badge.pull[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n.direction-badge.push[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-600);\n}\n\n.direction-badge.bidirectional[_ngcontent-%COMP%] {\n background: #fef3c7;\n color: #92400e;\n}\n\n\n\n.detail-config-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 4px;\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-disabled);\n font-size: 11px;\n}\n\n\n\n.detail-back-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 16px;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n flex-shrink: 0;\n}\n\n.detail-back-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.detail-edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 14px;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n flex-shrink: 0;\n}\n\n.detail-edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.map-edit-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 11px;\n transition: color 0.15s;\n}\n\n.detail-map-row[_ngcontent-%COMP%]:hover .map-edit-hint[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n\n.ve-header-title-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n}\n\n.ve-source-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.ve-direction-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.ve-dest-label[_ngcontent-%COMP%] {\n color: var(--mj-color-success-600);\n}\n\n.ve-stat-inline[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.ve-stat-inline[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n.detail-table-empty[_ngcontent-%COMP%] {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}"] });
2351
+ };
2352
+ ConnectionsComponent = __decorate([
2353
+ RegisterClass(BaseResourceComponent, 'IntegrationConnections')
2354
+ ], ConnectionsComponent);
2355
+ export { ConnectionsComponent };
2356
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConnectionsComponent, [{
2357
+ type: Component,
2358
+ args: [{ standalone: false, selector: 'app-integration-connections', template: "<!-- Main container -->\n<div class=\"connections-container\" [class.detail-active]=\"!!SelectedSummary\"\n [class.editor-active]=\"!!EditorEntityMap\">\n\n <!-- ======================================================================\n CARD GRID VIEW (shown when no wizard and no detail selected)\n ====================================================================== -->\n @if (!WizardOpen && !SelectedSummary) {\n <!-- Header -->\n <div class=\"connections-header\">\n <div class=\"header-left\">\n <h2 class=\"header-title\">Integrations</h2>\n <span class=\"header-count\">{{ Connections.length }} integration{{ Connections.length !== 1 ? 's' : '' }}</span>\n </div>\n <button kendoButton (click)=\"OpenWizard()\" class=\"add-connection-btn\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Integration\n </button>\n </div>\n\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading integrations...\"></mj-loading>\n </div>\n }\n\n <!-- Empty state -->\n @if (!IsLoading && Connections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-plug empty-icon\"></i>\n <h3>No integrations yet</h3>\n <p>Connect your first external system to start syncing data.</p>\n <button kendoButton (click)=\"OpenWizard()\" themeColor=\"primary\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Your First Integration\n </button>\n </div>\n }\n\n <!-- Card grid -->\n @if (!IsLoading && Connections.length > 0) {\n <div class=\"card-grid\">\n @for (summary of Connections; track summary.Integration.ID) {\n <div class=\"connection-card\">\n <!-- Card header + body: clickable to open detail view -->\n <div class=\"card-clickable\" (click)=\"SelectIntegrationCard(summary)\">\n <div class=\"card-header\">\n <div class=\"icon-circle\" [style.background-color]=\"GetIconBrandColor(summary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(summary.Integration.Integration)\" class=\"icon-large\"></i>\n </div>\n <span [class]=\"GetStatusBadgeClass(summary)\">{{ GetStatusBadge(summary) }}</span>\n </div>\n\n <!-- Card body -->\n <div class=\"card-body\">\n <div class=\"card-name\">{{ summary.Integration.Name }}</div>\n <div class=\"card-company\">{{ summary.Integration.Company }}</div>\n <div class=\"card-meta\">\n <span class=\"meta-label\">{{ GetSourceTypeLabel(summary) }}</span>\n <span class=\"meta-separator\">&middot;</span>\n <span class=\"meta-value\">{{ GetCredentialHint(summary) }}</span>\n </div>\n <div class=\"card-sync-info\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Syncing {{ GetEntityMapCount(summary.Integration.ID) }} entities\n </div>\n\n <!-- Inline test result -->\n @if (GetCardTestResult(summary.Integration.ID); as testResult) {\n <div class=\"card-test-result\" [class.test-success]=\"testResult.Success\" [class.test-failure]=\"!testResult.Success\">\n @if (testResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span>{{ testResult.Message }}</span>\n </div>\n }\n </div>\n </div><!-- /card-clickable -->\n\n <!-- Delete confirmation overlay -->\n @if (IsDeleteConfirming(summary.Integration.ID)) {\n <div class=\"delete-confirm-overlay\">\n <div class=\"delete-confirm-content\">\n <i class=\"fa-solid fa-triangle-exclamation delete-warn-icon\"></i>\n <span class=\"delete-confirm-text\">Delete this integration and all its entity maps?</span>\n <div class=\"delete-confirm-actions\">\n <button kendoButton\n themeColor=\"error\"\n [disabled]=\"IsDeleting\"\n (click)=\"ConfirmDelete(summary.Integration.ID)\">\n @if (IsDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Deleting...\n } @else {\n Delete\n }\n </button>\n <button kendoButton look=\"outline\" (click)=\"CancelDelete()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Card footer -->\n <div class=\"card-footer\">\n <button kendoButton\n look=\"outline\"\n [disabled]=\"!!TestingCardID\"\n (click)=\"TestExistingConnection(summary.Integration.ID)\">\n @if (IsTestingCard(summary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n Test\n }\n </button>\n <button kendoButton look=\"outline\" (click)=\"OnMenuAction('edit', summary)\">\n Configure\n </button>\n @if (IsConnectionActive(summary)) {\n <button kendoButton themeColor=\"primary\" (click)=\"RunSync(summary.Integration.ID)\">\n Sync Now\n </button>\n }\n <div class=\"card-menu-wrapper\">\n <button class=\"menu-trigger\" (click)=\"ToggleMenu(summary.Integration.ID, $event)\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n @if (IsMenuOpen(summary.Integration.ID)) {\n <div class=\"card-menu-dropdown\">\n <button class=\"menu-item\" (click)=\"OnMenuAction('edit', summary)\">\n <i class=\"fa-solid fa-pen-to-square\"></i> Edit\n </button>\n <button class=\"menu-item\" (click)=\"OnMenuAction('disable', summary)\">\n <i class=\"fa-solid fa-toggle-off\"></i> {{ GetMenuActionLabel(summary) }}\n </button>\n <button class=\"menu-item menu-item-danger\" (click)=\"OnMenuAction('delete', summary)\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- New connection card -->\n <div class=\"connection-card new-connection-card\" (click)=\"OpenWizard()\">\n <div class=\"new-card-content\">\n <div class=\"new-card-icon\">\n <i class=\"fa-solid fa-plus\"></i>\n </div>\n <span class=\"new-card-label\">Add Integration</span>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- ======================================================================\n DETAIL VIEW (entity maps for selected integration)\n ====================================================================== -->\n @if (!WizardOpen && SelectedSummary) {\n <div class=\"detail-view\">\n\n <!-- ================================================================\n ENTITY MAP EDITOR (field mapping detail for a selected map)\n ================================================================ -->\n @if (EditorEntityMap) {\n <app-visual-field-editor\n [EntityMap]=\"EditorEntityMap\"\n [CompanyIntegrationID]=\"SelectedSummary!.Integration.ID\"\n [RunViewProvider]=\"RunViewToUse\"\n (Close)=\"CloseEntityMapEditor()\">\n </app-visual-field-editor>\n\n <!-- ================================================================\n ENTITY MAPS LIST (shown when no editor map is selected)\n ================================================================ -->\n } @else {\n <!-- Detail header -->\n <div class=\"detail-header\">\n <button class=\"detail-back-btn\" (click)=\"CloseDetailView()\" title=\"Back to Integrations\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <div class=\"detail-header-info\">\n <div class=\"icon-circle\" [style.background-color]=\"GetIconBrandColor(SelectedSummary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(SelectedSummary.Integration.Integration)\" class=\"icon-large\"></i>\n </div>\n <div class=\"detail-header-text\">\n <h2 class=\"detail-title\">{{ SelectedSummary.Integration.Name }}</h2>\n <span class=\"detail-subtitle\">\n {{ SelectedSummary.Integration.Company }}\n <span class=\"meta-separator\">&middot;</span>\n {{ GetSourceTypeLabel(SelectedSummary) }}\n <span class=\"meta-separator\">&middot;</span>\n <span [class]=\"GetStatusBadgeClass(SelectedSummary)\">{{ GetStatusBadge(SelectedSummary) }}</span>\n </span>\n </div>\n </div>\n <div class=\"detail-header-actions\">\n <button class=\"detail-edit-btn\" (click)=\"OpenEditPanel(SelectedSummary)\" title=\"Configure\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n @if (IsConnectionActive(SelectedSummary)) {\n <button kendoButton themeColor=\"primary\" (click)=\"RunSync(SelectedSummary.Integration.ID)\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> Sync Now\n </button>\n }\n </div>\n </div>\n\n <!-- Entity maps toolbar -->\n <div class=\"detail-toolbar\">\n <div class=\"detail-toolbar-left\">\n <span class=\"detail-map-count\">\n {{ DetailEntityMaps.length }} entity map{{ DetailEntityMaps.length !== 1 ? 's' : '' }}\n <span class=\"meta-separator\">&middot;</span>\n {{ DetailActiveMapCount }} active\n </span>\n </div>\n <div class=\"detail-toolbar-right\">\n <div class=\"detail-search\">\n <i class=\"fa-solid fa-filter\"></i>\n <input type=\"text\"\n placeholder=\"Filter entity maps...\"\n [value]=\"DetailSearchTerm\"\n (input)=\"OnDetailSearch($event)\" />\n </div>\n <button class=\"add-map-btn\" (click)=\"ToggleAddMapPanel()\" [class.active]=\"ShowAddMapPanel\">\n <i class=\"fa-solid fa-plus\"></i> Add Map\n </button>\n </div>\n </div>\n\n <!-- Add Entity Map inline form -->\n @if (ShowAddMapPanel) {\n <div class=\"add-map-panel\">\n <div class=\"add-map-row\">\n <div class=\"add-map-field\">\n <label class=\"add-map-label\">Source Object</label>\n @if (IsLoadingSourceObjects) {\n <div class=\"add-map-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading...</div>\n } @else if (AvailableSourceObjects.length === 0) {\n <div class=\"add-map-hint\">No source objects found in metadata</div>\n } @else {\n <select class=\"add-map-select\" [(ngModel)]=\"AddMapSourceObjectName\">\n <option [ngValue]=\"''\" disabled>Select source object...</option>\n @for (obj of AvailableSourceObjects; track obj.Name) {\n <option [value]=\"obj.Name\">{{ obj.Label || obj.Name }}</option>\n }\n </select>\n }\n </div>\n\n <div class=\"add-map-direction-col\">\n <label class=\"add-map-label\">Direction</label>\n <div class=\"add-map-direction-btns\">\n <button [class.active]=\"AddMapDirection === 'Pull'\" (click)=\"AddMapDirection = 'Pull'\" title=\"Pull from source\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button [class.active]=\"AddMapDirection === 'Bidirectional'\" (click)=\"AddMapDirection = 'Bidirectional'\" title=\"Bidirectional sync\">\n <i class=\"fa-solid fa-right-left\"></i>\n </button>\n <button [class.active]=\"AddMapDirection === 'Push'\" (click)=\"AddMapDirection = 'Push'\" title=\"Push to source\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"add-map-field add-map-entity-field\">\n <label class=\"add-map-label\">MJ Entity</label>\n <div class=\"entity-picker-row\">\n <mj-tree-dropdown\n #entityTreeDropdown\n [BranchConfig]=\"EntityBranchConfig\"\n [LeafConfig]=\"EntityLeafConfig\"\n [Value]=\"AddMapEntityIDAsKey\"\n [SelectableTypes]=\"'leaf'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Search entities by schema...'\"\n [EnableSearch]=\"true\"\n (SelectionChange)=\"OnEntityTreeSelection($event)\">\n </mj-tree-dropdown>\n <button class=\"new-entity-btn\" (click)=\"OpenNewEntityDialog()\" title=\"Create new entity table\">\n <i class=\"fa-solid fa-plus\"></i> New\n </button>\n </div>\n </div>\n\n <div class=\"add-map-actions\">\n <button class=\"add-map-save-btn\"\n [disabled]=\"!CanSaveAddMap || IsSavingAddMap\"\n (click)=\"SaveAddMap()\">\n @if (IsSavingAddMap) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-check\"></i> Add\n }\n </button>\n <button class=\"add-map-cancel-btn\" (click)=\"CloseAddMapPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Entity maps table -->\n @if (IsDetailLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading entity maps...\"></mj-loading>\n </div>\n } @else if (DetailEntityMaps.length === 0 && !ShowAddMapPanel) {\n <div class=\"detail-empty\">\n <i class=\"fa-solid fa-cube\"></i>\n <h3>No entity maps configured</h3>\n <p>Entity maps define how external objects sync to MJ entities.</p>\n <button class=\"add-map-btn add-map-btn-lg\" (click)=\"ToggleAddMapPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Your First Entity Map\n </button>\n </div>\n } @else if (DetailEntityMaps.length > 0) {\n <!-- Table header -->\n <div class=\"detail-table-head\">\n <span class=\"dt-col-toggle\">Sync</span>\n <span class=\"dt-col-source\">External Object</span>\n <span class=\"dt-col-direction\"></span>\n <span class=\"dt-col-dest\">MJ Entity</span>\n <span class=\"dt-col-meta\">Config</span>\n </div>\n\n <!-- Table body -->\n <div class=\"detail-table-body\">\n @for (em of DetailFilteredMaps; track em.ID) {\n <div class=\"detail-map-row\" [class.sync-disabled]=\"!em.SyncEnabled\" (click)=\"OnEntityMapClick(em)\">\n <span class=\"dt-col-toggle\" (click)=\"$event.stopPropagation()\">\n <label class=\"toggle-switch\" [title]=\"em.SyncEnabled ? 'Sync enabled' : 'Sync disabled'\">\n <input type=\"checkbox\"\n [checked]=\"em.SyncEnabled\"\n (change)=\"OnToggleMapEnabled(em, $event)\" />\n <span class=\"toggle-slider\"></span>\n </label>\n </span>\n <span class=\"dt-col-source\" [title]=\"em.ExternalObjectName\">\n {{ em.ExternalObjectLabel ?? em.ExternalObjectName }}\n </span>\n <span class=\"dt-col-direction\">\n <span [class]=\"DirectionBadgeClass(em.SyncDirection)\">\n {{ DirectionText(em.SyncDirection) }}\n </span>\n </span>\n <span class=\"dt-col-dest\" [title]=\"em.Entity\">\n {{ em.Entity }}\n </span>\n <span class=\"dt-col-meta\">\n @if (em.MatchStrategy) {\n <span class=\"detail-config-badge\" title=\"Match strategy configured\">\n <i class=\"fa-solid fa-link\"></i>\n </span>\n }\n <span class=\"detail-config-badge\" [title]=\"'Conflict: ' + em.ConflictResolution\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </span>\n <span class=\"map-edit-hint\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </span>\n </span>\n </div>\n } @empty {\n <div class=\"detail-table-empty\">\n No entity maps match your filter.\n </div>\n }\n </div>\n }\n }\n\n </div>\n }\n\n <!-- ======================================================================\n WIZARD (inline, replaces card grid when open)\n ====================================================================== -->\n @if (WizardOpen) {\n <div class=\"wizard-inline\">\n <!-- Wizard header -->\n <div class=\"wizard-header\">\n <button class=\"wizard-back-btn\" (click)=\"CloseWizard()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back to Integrations\n </button>\n <h2 class=\"wizard-title\">New Integration</h2>\n </div>\n\n <!-- Step indicator -->\n <div class=\"step-indicator\">\n @for (step of WizardSteps; track step.Number) {\n <div class=\"step-item\" [class.step-active]=\"IsStepActive(step.Number)\" [class.step-completed]=\"IsStepCompleted(step.Number)\">\n <div class=\"step-circle\">\n @if (IsStepCompleted(step.Number)) {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n {{ step.Number }}\n }\n </div>\n <span class=\"step-label\">{{ step.Label }}</span>\n </div>\n @if (step.Number < WizardSteps.length) {\n <div class=\"step-line\" [class.step-line-active]=\"IsStepCompleted(step.Number)\"></div>\n }\n }\n </div>\n\n <!-- Step content -->\n <div class=\"wizard-body\">\n\n <!-- Step 1: Choose Integration -->\n @if (WizardStep === 1) {\n <div class=\"step-content\">\n <h3 class=\"step-title\">What system do you want to connect?</h3>\n <div class=\"search-bar\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Search integrations...\"\n [(ngModel)]=\"SearchQuery\" />\n </div>\n\n @if (FilteredIntegrations.length === 0 && AvailableIntegrations.length === 0) {\n <div class=\"no-integrations\">\n <i class=\"fa-solid fa-puzzle-piece\"></i>\n <p>No integrations configured</p>\n <span class=\"no-integrations-hint\">Configure integration definitions in the admin area first.</span>\n </div>\n } @else if (FilteredIntegrations.length === 0) {\n <div class=\"no-integrations\">\n <i class=\"fa-solid fa-search\"></i>\n <p>No matching integrations</p>\n </div>\n } @else {\n <div class=\"integration-picker-grid\">\n @for (def of FilteredIntegrations; track def.ID) {\n <div class=\"integration-picker-card\"\n [class.picker-selected]=\"IsSelectedIntegration(def)\"\n (click)=\"SelectIntegration(def)\">\n <div class=\"picker-icon-circle\" [style.background-color]=\"GetIconBrandColor(def.Name)\">\n <i [class]=\"GetIntegrationIcon(def.Name)\"></i>\n </div>\n <div class=\"picker-name\">{{ def.Name }}</div>\n @if (def.Description) {\n <div class=\"picker-description\">{{ def.Description }}</div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Step 2: Configure Connection -->\n @if (WizardStep === 2) {\n <div class=\"step-content\">\n <h3 class=\"step-title\">Set up your connection</h3>\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"connectionName\">Connection Name</label>\n <input id=\"connectionName\"\n type=\"text\"\n class=\"form-input\"\n placeholder=\"e.g. Production HubSpot\"\n [(ngModel)]=\"ConnectionName\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"companySelect\">Company</label>\n @if (NeedsCompanyPicker) {\n <select id=\"companySelect\" class=\"form-input\" [(ngModel)]=\"SelectedCompanyID\">\n <option [ngValue]=\"null\" disabled>Select a company...</option>\n @for (company of Companies; track company.ID) {\n <option [value]=\"company.ID\">{{ company.Name }}</option>\n }\n </select>\n } @else if (Companies.length === 1) {\n <input type=\"text\" class=\"form-input\" [value]=\"Companies[0].Name\" disabled />\n } @else {\n <div class=\"form-hint\">No companies available. Create one in the admin area.</div>\n }\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"connectionDescription\">Description <span class=\"optional-label\">(optional)</span></label>\n <textarea id=\"connectionDescription\"\n class=\"form-input form-textarea\"\n placeholder=\"Notes about this connection...\"\n [(ngModel)]=\"ConnectionDescription\"\n rows=\"3\"></textarea>\n </div>\n\n <!-- Credential section -->\n <div class=\"form-group\">\n <label class=\"form-label\">Credential</label>\n @if (SelectedCredential) {\n <div class=\"credential-selected\">\n <div class=\"credential-info\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ SelectedCredential.Name }}</span>\n </div>\n <button class=\"credential-clear\" (click)=\"ClearCredential()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n } @else {\n <div class=\"credential-actions\">\n <button kendoButton look=\"outline\" (click)=\"ShowExistingCredentials()\">\n <i class=\"fa-solid fa-key\"></i>\n Choose Existing Credential\n </button>\n <button kendoButton look=\"outline\" (click)=\"OpenCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create New Credential\n </button>\n </div>\n }\n\n @if (IsLoadingCredentials) {\n <div class=\"credential-loading\">\n <mj-loading text=\"Loading credentials...\" size=\"small\"></mj-loading>\n </div>\n }\n\n @if (!IsLoadingCredentials && ExistingCredentials.length > 0 && !SelectedCredential) {\n <div class=\"credential-list\">\n @for (cred of ExistingCredentials; track cred.ID) {\n <div class=\"credential-list-item\" (click)=\"SelectExistingCredential(cred)\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ cred.Name }}</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Step 3: Test Connection -->\n @if (WizardStep === 3) {\n <div class=\"step-content step-content-centered\">\n <h3 class=\"step-title\">Let's verify everything works</h3>\n\n @if (!TestResult && !IsTesting) {\n <div class=\"test-prompt\">\n <button kendoButton\n themeColor=\"primary\"\n size=\"large\"\n (click)=\"TestNewConnection()\">\n <i class=\"fa-solid fa-vial\"></i>\n Test Connection\n </button>\n <p class=\"test-hint\">We'll verify we can reach your system and authenticate.</p>\n </div>\n }\n\n @if (IsTesting) {\n <div class=\"test-running\">\n <div class=\"test-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin fa-3x\"></i>\n </div>\n <p>Testing connection...</p>\n </div>\n }\n\n @if (TestResult) {\n <div class=\"test-result\" [class.test-result-success]=\"TestResult.Success\" [class.test-result-failure]=\"!TestResult.Success\">\n <div class=\"test-result-icon\">\n @if (TestResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n </div>\n <div class=\"test-result-message\">{{ TestResult.Message }}</div>\n @if (TestResult.Success && TestResult.ServerVersion) {\n <div class=\"test-result-detail\">\n Server version: {{ TestResult.ServerVersion }}\n </div>\n }\n @if (!TestResult.Success) {\n <button kendoButton look=\"outline\" (click)=\"TestNewConnection()\" class=\"test-retry-btn\">\n <i class=\"fa-solid fa-rotate-right\"></i>\n Retry\n </button>\n }\n </div>\n }\n </div>\n }\n\n </div>\n\n <!-- Wizard footer -->\n <div class=\"wizard-footer\">\n <div class=\"footer-left\"></div>\n <div class=\"footer-right\">\n @if (WizardStep > 1) {\n <button kendoButton look=\"outline\" (click)=\"PreviousStep()\">\n Back\n </button>\n }\n <button kendoButton\n themeColor=\"primary\"\n [disabled]=\"IsNextDisabled || IsSaving\"\n (click)=\"FinishWizard()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n {{ NextButtonLabel }}\n }\n </button>\n </div>\n </div>\n </div>\n }\n\n</div>\n\n<!-- Edit panel (slide-in) -->\n<div class=\"edit-panel-backdrop\"\n [class.open]=\"EditPanelOpen\"\n (click)=\"CloseEditPanel()\"></div>\n<div class=\"edit-panel\" [class.open]=\"EditPanelOpen\">\n @if (EditingSummary) {\n <!-- Header -->\n <div class=\"edit-panel-header\">\n <div class=\"edit-panel-title\">\n <div class=\"edit-icon-circle\"\n [style.background-color]=\"GetIconBrandColor(EditingSummary.Integration.Integration)\">\n <i [class]=\"GetIntegrationIcon(EditingSummary.Integration.Integration)\"></i>\n </div>\n <span>Configure Integration</span>\n </div>\n <button class=\"edit-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n @if (IsEditLoading) {\n <div class=\"edit-panel-loading\">\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <!-- Edit form -->\n <div class=\"edit-panel-body\">\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Connection Name</label>\n <input type=\"text\"\n class=\"edit-form-input\"\n [(ngModel)]=\"EditName\"\n placeholder=\"Connection name...\" />\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Status</label>\n <div class=\"edit-toggle-row\">\n <label class=\"toggle-switch\">\n <input type=\"checkbox\" [(ngModel)]=\"EditIsActive\" />\n <span class=\"toggle-slider\"></span>\n </label>\n <span class=\"edit-toggle-label\" [class.active]=\"EditIsActive\">\n {{ EditIsActive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Credential</label>\n @if (EditCredential) {\n <div class=\"edit-credential-selected\">\n <div class=\"edit-credential-info\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ EditCredential.Name }}</span>\n </div>\n <button class=\"edit-credential-clear\" (click)=\"ClearEditCredential()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n } @else {\n <div class=\"edit-credential-actions\">\n <button kendoButton look=\"outline\" size=\"small\" (click)=\"OpenEditCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i> New Credential\n </button>\n </div>\n @if (EditCredentials.length > 0) {\n <div class=\"edit-credential-list\">\n @for (cred of EditCredentials; track cred.ID) {\n <div class=\"edit-credential-item\" (click)=\"SelectEditCredential(cred)\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ cred.Name }}</span>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Integration</label>\n <div class=\"edit-readonly-field\">\n {{ EditingSummary.Integration.Integration }}\n </div>\n </div>\n\n <div class=\"edit-form-group\">\n <label class=\"edit-form-label\">Company</label>\n <div class=\"edit-readonly-field\">\n {{ EditingSummary.Integration.Company }}\n </div>\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"edit-panel-footer\">\n <button kendoButton\n themeColor=\"primary\"\n [disabled]=\"IsEditSaving || !EditName.trim()\"\n (click)=\"SaveEditChanges()\">\n @if (IsEditSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save Changes\n }\n </button>\n <button kendoButton look=\"outline\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n </div>\n }\n }\n</div>\n\n<!-- Credential dialog (shared between wizard and edit panel) -->\n@if (ShowCredentialDialog) {\n <mj-credential-dialog\n [Visible]=\"true\"\n [PreselectedTypeId]=\"PreselectedCredentialTypeId\"\n (close)=\"EditPanelOpen ? OnEditCredentialDialogClose($event) : OnCredentialDialogClose($event)\">\n </mj-credential-dialog>\n}\n\n<!-- New Entity dialog -->\n@if (ShowCreateEntity) {\n <div class=\"new-entity-backdrop\" (click)=\"CloseNewEntityDialog()\"></div>\n <div class=\"new-entity-dialog\">\n <div class=\"new-entity-dialog-header\">\n <h3>Create New Entity Table</h3>\n <button class=\"new-entity-dialog-close\" (click)=\"CloseNewEntityDialog()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"new-entity-dialog-body\">\n <p class=\"new-entity-dialog-desc\">\n Generate a SQL migration to create a new database table for this integration's data.\n After running the migration and CodeGen, the new entity will appear in the entity picker.\n </p>\n\n <div class=\"new-entity-dialog-form\">\n <div class=\"new-entity-dialog-row\">\n <div class=\"new-entity-dialog-field\">\n <label class=\"new-entity-dialog-label\">Source Object</label>\n <div class=\"new-entity-dialog-value\">\n @if (AddMapSourceObjectName) {\n {{ AddMapSourceObjectName }}\n } @else {\n <span class=\"new-entity-dialog-hint\">Select a source object in the Add Map form first</span>\n }\n </div>\n </div>\n </div>\n <div class=\"new-entity-dialog-row\">\n <div class=\"new-entity-dialog-field\">\n <label class=\"new-entity-dialog-label\">Schema</label>\n <input type=\"text\"\n class=\"new-entity-dialog-input\"\n placeholder=\"e.g. hubspot\"\n [(ngModel)]=\"NewEntitySchema\" />\n </div>\n <span class=\"new-entity-dialog-dot\">.</span>\n <div class=\"new-entity-dialog-field new-entity-dialog-field-wide\">\n <label class=\"new-entity-dialog-label\">Table Name</label>\n <input type=\"text\"\n class=\"new-entity-dialog-input\"\n placeholder=\"e.g. Contact\"\n [(ngModel)]=\"NewEntityTable\" />\n </div>\n </div>\n </div>\n\n @if (DDLPreviewWarnings.length > 0) {\n <div class=\"ddl-warnings\">\n @for (warn of DDLPreviewWarnings; track warn) {\n <div class=\"ddl-warning\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ warn }}</div>\n }\n </div>\n }\n\n @if (DDLPreview) {\n <div class=\"ddl-preview-block\">\n <div class=\"ddl-preview-header\">\n <span>SQL Preview</span>\n <button class=\"ddl-copy-btn\" (click)=\"CopyDDLToClipboard()\" title=\"Copy to clipboard\">\n @if (DDLCopied) {\n <i class=\"fa-solid fa-check\"></i> Copied\n } @else {\n <i class=\"fa-regular fa-copy\"></i> Copy\n }\n </button>\n </div>\n <pre class=\"ddl-preview-code\">{{ DDLPreview }}</pre>\n </div>\n }\n\n @if (DDLPreview) {\n <div class=\"new-entity-next-steps\">\n <h4><i class=\"fa-solid fa-list-check\"></i> Next Steps</h4>\n <ol>\n <li>Copy the SQL above and save it as a migration file</li>\n <li>Run the migration against your database</li>\n <li>Run CodeGen to register the new entity in MemberJunction</li>\n <li>Refresh the page &mdash; the new entity will appear in the entity picker</li>\n </ol>\n </div>\n }\n </div>\n <div class=\"new-entity-dialog-footer\">\n <button class=\"new-entity-preview-btn\"\n [disabled]=\"!CanGenerateSQL || IsGeneratingDDL\"\n (click)=\"PreviewDDL()\">\n @if (IsGeneratingDDL) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating...\n } @else {\n <i class=\"fa-solid fa-code\"></i> Generate SQL\n }\n </button>\n <button class=\"new-entity-dialog-done-btn\" (click)=\"CloseNewEntityDialog()\">\n Done\n </button>\n </div>\n </div>\n}\n", styles: ["/* ---------------------------------------------------------------------------\n Host & Container \u2014 flex chain for scrollable detail view\n --------------------------------------------------------------------------- */\n\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.connections-container {\n padding: 24px;\n max-width: 1400px;\n width: 100%;\n margin: 0 auto;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n box-sizing: border-box;\n}\n\n/* When detail or editor view is active, prevent container scrolling\n so the inner .detail-table-body handles its own scroll */\n.connections-container.detail-active,\n.connections-container.editor-active {\n overflow: hidden;\n}\n\n.connections-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-left {\n display: flex;\n align-items: baseline;\n gap: 12px;\n}\n\n.header-title {\n font-size: 24px;\n font-weight: 700;\n margin: 0;\n color: var(--mj-text-primary);\n}\n\n.header-count {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n.add-connection-btn i {\n margin-right: 6px;\n}\n\n/* ---------------------------------------------------------------------------\n Loading & Empty States\n --------------------------------------------------------------------------- */\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-color-neutral-300);\n margin-bottom: 16px;\n}\n\n.empty-state h3 {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-color-neutral-700);\n margin: 0 0 8px;\n}\n\n.empty-state p {\n font-size: 14px;\n margin: 0 0 24px;\n}\n\n/* ---------------------------------------------------------------------------\n Card Grid\n --------------------------------------------------------------------------- */\n\n.card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 20px;\n}\n\n/* ---------------------------------------------------------------------------\n Connection Card\n --------------------------------------------------------------------------- */\n\n.connection-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);\n transition: box-shadow 0.2s ease, transform 0.2s ease;\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: hidden;\n}\n\n.connection-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n transform: translateY(-2px);\n}\n\n/* Card Header */\n.card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 16px 0;\n}\n\n.icon-circle {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n flex-shrink: 0;\n}\n\n.icon-large {\n font-size: 22px;\n}\n\n/* Status Badge */\n.status-badge {\n font-size: 12px;\n font-weight: 600;\n padding: 4px 10px;\n border-radius: 20px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-badge-connected {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-600);\n}\n\n.status-badge-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-color-error-600);\n}\n\n.status-badge-inactive {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-muted);\n}\n\n.status-badge-syncing {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n/* Card Body */\n.card-body {\n padding: 12px 16px;\n flex: 1;\n}\n\n.card-name {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 2px;\n}\n\n.card-company {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin-bottom: 10px;\n}\n\n.card-meta {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n}\n\n.meta-separator {\n margin: 0 6px;\n}\n\n.meta-label {\n font-weight: 500;\n}\n\n.card-sync-info {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n}\n\n.card-sync-info i {\n margin-right: 4px;\n color: var(--mj-text-disabled);\n}\n\n/* Card inline test result */\n.card-test-result {\n font-size: 12px;\n padding: 6px 10px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n}\n\n.card-test-result.test-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-600);\n}\n\n.card-test-result.test-failure {\n background: var(--mj-status-error-bg);\n color: var(--mj-color-error-600);\n}\n\n.card-test-result span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Card Footer */\n.card-footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.card-footer button {\n font-size: 13px;\n}\n\n/* Card Menu */\n.card-menu-wrapper {\n position: relative;\n margin-left: auto;\n}\n\n.menu-trigger {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 6px;\n color: var(--mj-text-disabled);\n font-size: 16px;\n transition: background 0.15s;\n}\n\n.menu-trigger:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.card-menu-dropdown {\n position: absolute;\n right: 0;\n top: 100%;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n min-width: 160px;\n z-index: 50;\n padding: 4px;\n}\n\n.menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 8px 12px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n border-radius: 6px;\n transition: background 0.15s;\n text-align: left;\n}\n\n.menu-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.menu-item i {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.menu-item-danger {\n color: var(--mj-color-error-600);\n}\n\n.menu-item-danger i {\n color: var(--mj-color-error-600);\n}\n\n.menu-item-danger:hover {\n background: var(--mj-status-error-bg);\n}\n\n/* ---------------------------------------------------------------------------\n New Connection Card\n --------------------------------------------------------------------------- */\n\n.new-connection-card {\n border: 2px dashed var(--mj-border-strong);\n background: var(--mj-bg-page);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n transition: background 0.2s, border-color 0.2s;\n}\n\n.new-connection-card:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n box-shadow: none;\n transform: none;\n}\n\n.new-card-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n}\n\n.new-card-icon {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--mj-bg-surface-active);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n color: var(--mj-text-muted);\n transition: background 0.2s, color 0.2s;\n}\n\n.new-connection-card:hover .new-card-icon {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.new-card-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n.new-connection-card:hover .new-card-label {\n color: var(--mj-brand-primary);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard (inline, replaces card grid)\n --------------------------------------------------------------------------- */\n\n.wizard-inline {\n display: flex;\n flex-direction: column;\n height: 100%;\n max-width: 720px;\n margin: 0 auto;\n}\n\n/* Wizard Header */\n.wizard-header {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 0 0 20px;\n}\n\n.wizard-back-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n padding: 6px 10px;\n border-radius: 6px;\n transition: background 0.15s, color 0.15s;\n}\n\n.wizard-back-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.wizard-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n/* ---------------------------------------------------------------------------\n Step Indicator\n --------------------------------------------------------------------------- */\n\n.step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 32px;\n gap: 0;\n}\n\n.step-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n position: relative;\n}\n\n.step-circle {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 600;\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-disabled);\n border: 2px solid var(--mj-border-default);\n transition: all 0.2s;\n}\n\n.step-active .step-circle {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.step-completed .step-circle {\n background: var(--mj-color-success-600);\n color: var(--mj-text-inverse);\n border-color: var(--mj-color-success-600);\n}\n\n.step-label {\n font-size: 11px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n}\n\n.step-active .step-label {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.step-completed .step-label {\n color: var(--mj-color-success-600);\n}\n\n.step-line {\n width: 48px;\n height: 2px;\n background: var(--mj-border-default);\n margin: 0 8px;\n margin-bottom: 20px;\n transition: background 0.2s;\n}\n\n.step-line-active {\n background: var(--mj-color-success-600);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard Body\n --------------------------------------------------------------------------- */\n\n.wizard-body {\n flex: 1;\n overflow-y: auto;\n padding: 0 24px 24px;\n}\n\n.step-content {\n min-height: 300px;\n}\n\n.step-content-centered {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n}\n\n.step-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 20px;\n}\n\n.step-content-centered .step-title {\n margin-bottom: 32px;\n}\n\n/* Search bar */\n.search-bar {\n position: relative;\n margin-bottom: 20px;\n}\n\n.search-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.search-input {\n width: 100%;\n padding: 10px 14px 10px 40px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n}\n\n.search-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* No integrations */\n.no-integrations {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-disabled);\n text-align: center;\n}\n\n.no-integrations i {\n font-size: 36px;\n margin-bottom: 12px;\n}\n\n.no-integrations p {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin: 0 0 4px;\n}\n\n.no-integrations-hint {\n font-size: 13px;\n}\n\n/* Integration picker grid */\n.integration-picker-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n}\n\n.integration-picker-card {\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n cursor: pointer;\n text-align: center;\n transition: border-color 0.2s, background 0.15s;\n}\n\n.integration-picker-card:hover {\n border-color: var(--mj-color-info-100);\n background: var(--mj-bg-page);\n}\n\n.integration-picker-card.picker-selected {\n border-color: var(--mj-brand-primary);\n background: var(--mj-status-info-bg);\n}\n\n.picker-icon-circle {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n margin: 0 auto 10px;\n font-size: 18px;\n}\n\n.picker-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.picker-description {\n font-size: 12px;\n color: var(--mj-text-disabled);\n line-height: 1.3;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n/* ---------------------------------------------------------------------------\n Form Controls (Step 2)\n --------------------------------------------------------------------------- */\n\n.form-group {\n margin-bottom: 20px;\n}\n\n.form-label {\n display: block;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.optional-label {\n font-weight: 400;\n color: var(--mj-text-disabled);\n}\n\n.form-input {\n width: 100%;\n padding: 10px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n}\n\n.form-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.form-input:disabled {\n background: var(--mj-bg-page);\n color: var(--mj-text-muted);\n}\n\n.form-textarea {\n resize: vertical;\n min-height: 72px;\n}\n\n.form-hint {\n font-size: 13px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n}\n\n/* Credential section */\n.credential-selected {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-color-success-200);\n border-radius: 8px;\n}\n\n.credential-info {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-color-success-800);\n font-size: 14px;\n font-weight: 500;\n}\n\n.credential-info i {\n color: var(--mj-color-success-600);\n}\n\n.credential-clear {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n transition: color 0.15s;\n}\n\n.credential-clear:hover {\n color: var(--mj-color-error-600);\n}\n\n.credential-actions {\n display: flex;\n gap: 8px;\n}\n\n.credential-actions button {\n font-size: 13px;\n}\n\n.credential-loading {\n padding: 16px 0;\n}\n\n.credential-list {\n margin-top: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.credential-list-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n cursor: pointer;\n font-size: 14px;\n color: var(--mj-color-neutral-700);\n border-bottom: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n}\n\n.credential-list-item:last-child {\n border-bottom: none;\n}\n\n.credential-list-item:hover {\n background: var(--mj-bg-page);\n}\n\n.credential-list-item i {\n color: var(--mj-text-disabled);\n}\n\n/* ---------------------------------------------------------------------------\n Test Connection (Step 3)\n --------------------------------------------------------------------------- */\n\n.test-prompt {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.test-hint {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\n\n.test-running {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n color: var(--mj-brand-primary);\n}\n\n.test-spinner {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.test-running p {\n font-size: 15px;\n font-weight: 500;\n margin: 0;\n}\n\n/* Test result */\n.test-result {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n padding: 24px;\n border-radius: 12px;\n max-width: 400px;\n}\n\n.test-result-success {\n background: var(--mj-status-success-bg);\n}\n\n.test-result-failure {\n background: var(--mj-status-error-bg);\n}\n\n.test-result-icon {\n font-size: 48px;\n animation: scaleIn 0.3s ease-out;\n}\n\n.test-result-success .test-result-icon {\n color: var(--mj-color-success-600);\n}\n\n.test-result-failure .test-result-icon {\n color: var(--mj-color-error-600);\n}\n\n@keyframes scaleIn {\n from {\n transform: scale(0.5);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n.test-result-message {\n font-size: 15px;\n font-weight: 500;\n color: var(--mj-color-neutral-700);\n text-align: center;\n}\n\n.test-result-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.test-retry-btn {\n margin-top: 4px;\n}\n\n/* Toggle switch */\n.toggle-switch {\n position: relative;\n display: inline-block;\n width: 44px;\n height: 24px;\n flex-shrink: 0;\n}\n\n.toggle-switch input {\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.toggle-slider {\n position: absolute;\n cursor: pointer;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-border-strong);\n border-radius: 24px;\n transition: background 0.2s;\n}\n\n.toggle-slider::before {\n content: '';\n position: absolute;\n height: 18px;\n width: 18px;\n left: 3px;\n bottom: 3px;\n background: var(--mj-bg-surface);\n border-radius: 50%;\n transition: transform 0.2s;\n}\n\n.toggle-switch input:checked + .toggle-slider {\n background: var(--mj-brand-primary);\n}\n\n.toggle-switch input:checked + .toggle-slider::before {\n transform: translateX(20px);\n}\n\n/* ---------------------------------------------------------------------------\n Wizard Footer\n --------------------------------------------------------------------------- */\n\n.wizard-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.footer-left {\n display: flex;\n align-items: center;\n}\n\n.footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* ---------------------------------------------------------------------------\n Responsive\n --------------------------------------------------------------------------- */\n\n@media (max-width: 768px) {\n .connections-container {\n padding: 16px;\n }\n\n .card-grid {\n grid-template-columns: 1fr;\n }\n\n .integration-picker-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .step-indicator {\n padding: 16px;\n overflow-x: auto;\n }\n\n .step-line {\n width: 24px;\n }\n\n .credential-actions {\n flex-direction: column;\n }\n}\n\n@media (max-width: 480px) {\n .integration-picker-grid {\n grid-template-columns: 1fr;\n }\n\n .card-footer {\n flex-wrap: wrap;\n }\n}\n\n/* ---------------------------------------------------------------------------\n Delete confirmation overlay\n --------------------------------------------------------------------------- */\n\n.delete-confirm-overlay {\n position: absolute;\n inset: 0;\n background: rgba(255, 255, 255, 0.95);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 5;\n border-radius: 12px;\n animation: fadeIn 150ms ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.delete-confirm-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 20px;\n text-align: center;\n}\n\n.delete-warn-icon {\n font-size: 28px;\n color: var(--mj-color-error-600);\n}\n\n.delete-confirm-text {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-color-neutral-700);\n max-width: 220px;\n}\n\n.delete-confirm-actions {\n display: flex;\n gap: 8px;\n margin-top: 4px;\n}\n\n/* ---------------------------------------------------------------------------\n Edit panel (slide-in)\n --------------------------------------------------------------------------- */\n\n.edit-panel-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.1);\n z-index: 99;\n opacity: 0;\n pointer-events: none;\n transition: opacity 300ms ease;\n}\n\n.edit-panel-backdrop.open {\n opacity: 1;\n pointer-events: auto;\n}\n\n.edit-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 400px;\n max-width: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -8px 0 24px rgba(0, 0, 0, 0.08);\n z-index: 100;\n transform: translateX(100%);\n transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.edit-panel.open {\n transform: translateX(0);\n}\n\n.edit-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.edit-panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.edit-icon-circle {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n}\n\n.edit-close-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n font-size: 14px;\n transition: all 150ms ease;\n}\n\n.edit-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.edit-panel-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 48px 20px;\n}\n\n.edit-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.edit-form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.edit-form-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.edit-form-input {\n height: 36px;\n padding: 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n transition: border-color 150ms ease;\n}\n\n.edit-form-input:focus {\n border-color: var(--mj-color-indigo-500);\n}\n\n.edit-readonly-field {\n padding: 8px 12px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.edit-toggle-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.edit-toggle-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-disabled);\n}\n\n.edit-toggle-label.active {\n color: var(--mj-color-success-600);\n}\n\n.edit-credential-selected {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-page);\n}\n\n.edit-credential-info {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n}\n\n.edit-credential-info i {\n color: var(--mj-color-indigo-500);\n}\n\n.edit-credential-clear {\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--mj-text-disabled);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n transition: all 150ms ease;\n}\n\n.edit-credential-clear:hover {\n background: var(--mj-color-error-200);\n color: var(--mj-color-error-600);\n}\n\n.edit-credential-actions {\n display: flex;\n gap: 8px;\n}\n\n.edit-credential-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 6px;\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n\n.edit-credential-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-color-neutral-700);\n cursor: pointer;\n transition: background 150ms ease;\n}\n\n.edit-credential-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.edit-credential-item i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.edit-panel-footer {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n/* ---------------------------------------------------------------------------\n Card clickable area\n --------------------------------------------------------------------------- */\n\n.card-clickable {\n cursor: pointer;\n}\n\n/* ---------------------------------------------------------------------------\n Detail View (entity maps for a selected integration)\n --------------------------------------------------------------------------- */\n\n.detail-view {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.detail-header {\n display: flex;\n align-items: center;\n gap: 16px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.detail-header-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n.detail-header-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.detail-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detail-subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.detail-header-actions {\n display: flex;\n gap: 8px;\n flex-shrink: 0;\n}\n\n/* Detail toolbar */\n.detail-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.detail-toolbar-left {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-map-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.detail-search {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n}\n\n.detail-search i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.detail-search input {\n border: none;\n outline: none;\n background: transparent;\n font-size: 13px;\n color: var(--mj-text-primary);\n width: 200px;\n}\n\n.detail-search input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Add Map button */\n.add-map-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-color-indigo-200);\n border-radius: 6px;\n background: var(--mj-color-indigo-50);\n color: var(--mj-color-indigo-600);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n white-space: nowrap;\n}\n\n.add-map-btn:hover {\n background: var(--mj-color-indigo-100);\n border-color: var(--mj-color-indigo-300);\n}\n\n.add-map-btn.active {\n background: var(--mj-color-indigo-500);\n color: var(--mj-bg-surface);\n border-color: var(--mj-color-indigo-500);\n}\n\n.add-map-btn-lg {\n margin-top: 16px;\n padding: 10px 20px;\n font-size: 14px;\n}\n\n/* Add map inline panel */\n.add-map-panel {\n padding: 16px;\n margin-bottom: 12px;\n background: var(--mj-color-indigo-50);\n border: 1px solid var(--mj-color-indigo-200);\n border-radius: 8px;\n animation: fadeIn 200ms ease;\n}\n\n.add-map-row {\n display: flex;\n align-items: flex-end;\n gap: 12px;\n}\n\n.add-map-field {\n flex: 1;\n min-width: 0;\n}\n\n.add-map-label {\n display: block;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: 6px;\n}\n\n.add-map-select {\n width: 100%;\n height: 34px;\n padding: 0 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n outline: none;\n cursor: pointer;\n}\n\n.add-map-select:focus {\n border-color: var(--mj-color-indigo-500);\n}\n\n.add-map-direction-col {\n flex-shrink: 0;\n}\n\n.add-map-direction-btns {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.add-map-direction-btns button {\n padding: 7px 12px;\n border: none;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 13px;\n cursor: pointer;\n transition: all 150ms ease;\n border-right: 1px solid var(--mj-border-default);\n}\n\n.add-map-direction-btns button:last-child {\n border-right: none;\n}\n\n.add-map-direction-btns button:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.add-map-direction-btns button.active {\n background: var(--mj-color-indigo-500);\n color: var(--mj-bg-surface);\n}\n\n.add-map-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.add-map-save-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-color-indigo-500);\n color: var(--mj-bg-surface);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n white-space: nowrap;\n}\n\n.add-map-save-btn:hover {\n background: var(--mj-color-indigo-600);\n}\n\n.add-map-save-btn:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.add-map-cancel-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 34px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 13px;\n transition: all 150ms ease;\n}\n\n.add-map-cancel-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.add-map-loading {\n font-size: 12px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n}\n\n.add-map-loading i {\n color: var(--mj-color-indigo-500);\n margin-right: 4px;\n}\n\n.add-map-hint {\n font-size: 12px;\n color: var(--mj-text-disabled);\n padding: 8px 0;\n font-style: italic;\n}\n\n/* Entity field needs more room for tree dropdown */\n.add-map-entity-field {\n flex: 2;\n min-width: 280px;\n}\n\n/* Entity picker row: tree dropdown + New button side by side */\n.entity-picker-row {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.entity-picker-row mj-tree-dropdown {\n flex: 1;\n min-width: 0;\n}\n\n.new-entity-btn {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-color-primary-600, #4f46e5);\n background: var(--mj-color-primary-50, #eef2ff);\n border: 1px solid var(--mj-color-primary-200, #c7d2fe);\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: all 0.15s ease;\n}\n\n.new-entity-btn:hover {\n background: var(--mj-color-primary-100, #e0e7ff);\n border-color: var(--mj-color-primary-300, #a5b4fc);\n}\n\n/* ---------------------------------------------------------------------------\n New Entity Dialog\n --------------------------------------------------------------------------- */\n\n.new-entity-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: fadeIn 0.15s ease;\n}\n\n.new-entity-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 640px;\n max-width: 90vw;\n max-height: 85vh;\n background: var(--mj-bg-surface, #fff);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n animation: fadeIn 0.2s ease;\n}\n\n.new-entity-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-color-neutral-200, #e5e7eb);\n}\n\n.new-entity-dialog-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary, #111827);\n}\n\n.new-entity-dialog-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n font-size: 14px;\n color: var(--mj-text-secondary, #6b7280);\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-close:hover {\n background: var(--mj-color-neutral-100, #f3f4f6);\n color: var(--mj-text-primary, #111827);\n}\n\n.new-entity-dialog-body {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.new-entity-dialog-desc {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary, #6b7280);\n line-height: 1.5;\n}\n\n.new-entity-dialog-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.new-entity-dialog-row {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n}\n\n.new-entity-dialog-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 120px;\n}\n\n.new-entity-dialog-field-wide {\n flex: 1;\n}\n\n.new-entity-dialog-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n.new-entity-dialog-input {\n padding: 8px 12px;\n font-size: 14px;\n border: 1px solid var(--mj-color-neutral-300, #d1d5db);\n border-radius: 6px;\n background: var(--mj-bg-surface, #fff);\n color: var(--mj-text-primary, #111827);\n transition: border-color 0.15s ease;\n}\n\n.new-entity-dialog-input:focus {\n outline: none;\n border-color: var(--mj-color-primary-400, #818cf8);\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.1);\n}\n\n.new-entity-dialog-dot {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-secondary, #6b7280);\n padding-bottom: 6px;\n user-select: none;\n}\n\n.new-entity-dialog-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary, #111827);\n padding: 8px 0 4px;\n}\n\n.new-entity-dialog-hint {\n font-style: italic;\n color: var(--mj-text-disabled, #9ca3af);\n font-weight: 400;\n}\n\n.new-entity-dialog-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-color-neutral-200, #e5e7eb);\n}\n\n.new-entity-preview-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n color: #fff;\n background: var(--mj-color-primary-600, #4f46e5);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n white-space: nowrap;\n transition: background 0.15s ease;\n}\n\n.new-entity-preview-btn:hover:not(:disabled) {\n background: var(--mj-color-primary-700, #4338ca);\n}\n\n.new-entity-preview-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.new-entity-dialog-done-btn {\n display: inline-flex;\n align-items: center;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary, #6b7280);\n background: transparent;\n border: 1px solid var(--mj-color-neutral-300, #d1d5db);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-done-btn:hover {\n background: var(--mj-color-neutral-50, #f9fafb);\n border-color: var(--mj-color-neutral-400, #9ca3af);\n}\n\n/* Next steps callout inside dialog */\n.new-entity-next-steps {\n background: var(--mj-color-primary-50, #eef2ff);\n border: 1px solid var(--mj-color-primary-200, #c7d2fe);\n border-radius: 8px;\n padding: 14px 16px;\n}\n\n.new-entity-next-steps h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-color-primary-700, #4338ca);\n}\n\n.new-entity-next-steps h4 i {\n margin-right: 6px;\n}\n\n.new-entity-next-steps ol {\n margin: 0;\n padding-left: 20px;\n font-size: 13px;\n color: var(--mj-color-primary-800, #3730a3);\n line-height: 1.7;\n}\n\n/* DDL copy button */\n.ddl-copy-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-secondary, #6b7280);\n background: transparent;\n border: 1px solid var(--mj-color-neutral-300, #d1d5db);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ddl-copy-btn:hover {\n background: var(--mj-color-neutral-100, #f3f4f6);\n border-color: var(--mj-color-neutral-400, #9ca3af);\n}\n\n/* DDL Preview */\n.ddl-warnings {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.ddl-warning {\n font-size: 12px;\n color: var(--mj-color-warning-700, #a16207);\n background: var(--mj-color-warning-50, #fffbeb);\n padding: 6px 10px;\n border-radius: 4px;\n border-left: 3px solid var(--mj-color-warning-400, #facc15);\n}\n\n.ddl-warning i {\n margin-right: 4px;\n}\n\n.ddl-preview-block {\n border: 1px solid var(--mj-color-neutral-200, #e5e7eb);\n border-radius: 8px;\n overflow: hidden;\n max-height: 300px;\n display: flex;\n flex-direction: column;\n}\n\n.ddl-preview-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--mj-color-neutral-50, #f9fafb);\n border-bottom: 1px solid var(--mj-color-neutral-200, #e5e7eb);\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n.ddl-preview-code {\n margin: 0;\n padding: 12px 16px;\n font-size: 12px;\n font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;\n line-height: 1.6;\n color: var(--mj-text-primary, #111827);\n background: var(--mj-bg-surface, #fff);\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n flex: 1;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Detail empty state */\n.detail-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.detail-empty i {\n font-size: 36px;\n margin-bottom: 12px;\n color: var(--mj-color-neutral-300);\n}\n\n.detail-empty h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-color-neutral-600);\n margin: 0 0 6px;\n}\n\n.detail-empty p {\n font-size: 13px;\n margin: 0;\n max-width: 400px;\n}\n\n/* Detail table */\n.detail-table-head {\n display: flex;\n align-items: center;\n padding: 8px 16px;\n background: var(--mj-bg-page);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px 8px 0 0;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-secondary);\n}\n\n.detail-table-body {\n border: 1px solid var(--mj-border-default);\n border-top: none;\n border-radius: 0 0 8px 8px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.detail-map-row {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n transition: background 0.15s;\n font-size: 13px;\n}\n\n.detail-map-row:last-child {\n border-bottom: none;\n}\n\n.detail-map-row:hover {\n background: var(--mj-bg-page);\n cursor: pointer;\n}\n\n.detail-map-row.sync-disabled {\n opacity: 0.5;\n}\n\n/* Column widths (shared between head and body) */\n.dt-col-toggle {\n width: 60px;\n flex-shrink: 0;\n}\n\n.dt-col-source {\n flex: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.dt-col-direction {\n width: 80px;\n flex-shrink: 0;\n text-align: center;\n}\n\n.dt-col-dest {\n flex: 2;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-primary);\n}\n\n.dt-col-meta {\n width: 80px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n justify-content: flex-end;\n}\n\n/* Direction badge */\n.direction-badge {\n font-size: 11px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 4px;\n white-space: nowrap;\n}\n\n.direction-badge.pull {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n.direction-badge.push {\n background: var(--mj-status-success-bg);\n color: var(--mj-color-success-600);\n}\n\n.direction-badge.bidirectional {\n background: #fef3c7;\n color: #92400e;\n}\n\n/* Config badges */\n.detail-config-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 4px;\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-disabled);\n font-size: 11px;\n}\n\n/* Detail back button (icon-only) */\n.detail-back-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 16px;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n flex-shrink: 0;\n}\n\n.detail-back-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* Detail edit button (icon-only) */\n.detail-edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 14px;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n flex-shrink: 0;\n}\n\n.detail-edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* Chevron hint on entity map rows */\n.map-edit-hint {\n color: var(--mj-text-disabled);\n font-size: 11px;\n transition: color 0.15s;\n}\n\n.detail-map-row:hover .map-edit-hint {\n color: var(--mj-brand-primary);\n}\n\n/* Entity map editor header */\n.ve-header-title-inline {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n}\n\n.ve-source-label {\n color: var(--mj-brand-primary);\n}\n\n.ve-direction-icon {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.ve-dest-label {\n color: var(--mj-color-success-600);\n}\n\n.ve-stat-inline {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.ve-stat-inline strong {\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n.detail-table-empty {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n"] }]
2359
+ }], null, { entityTreeDropdown: [{
2360
+ type: ViewChild,
2361
+ args: ['entityTreeDropdown']
2362
+ }] }); })();
2363
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConnectionsComponent, { className: "ConnectionsComponent", filePath: "src/Integration/components/connections/connections.component.ts", lineNumber: 68 }); })();
2364
+ export function LoadConnectionsComponent() {
2365
+ // Tree-shaking prevention: importing this module causes
2366
+ // @RegisterClass decorators to fire, registering components.
2367
+ }
2368
+ //# sourceMappingURL=connections.component.js.map