@memberjunction/ng-dashboards 5.10.1 → 5.12.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.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +586 -223
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +23 -8
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2 -2
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
- package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
- package/dist/AI/components/system/system-configuration.component.js +2 -2
- package/dist/AI/components/widgets/kpi-card.component.js +7 -7
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +2 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +3 -3
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +3 -3
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +1 -1
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +2 -2
- package/dist/APIKeys/api-usage-panel.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/execution-monitoring.component.js +2 -2
- package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
- package/dist/Actions/components/explorer/action-card.component.js +2 -2
- package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
- package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
- package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
- package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +2 -2
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +3 -3
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +5 -5
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +2 -2
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +6 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +26 -8
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +5 -5
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +31 -2
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +753 -412
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts +0 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +3 -6
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +97 -5
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
- package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +5 -1
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +2 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +7 -3
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +27 -2
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +107 -4
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -2
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -2
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -2
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-filter-panel.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +55 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +664 -199
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/index.d.ts +0 -1
- package/dist/Scheduling/components/index.d.ts.map +1 -1
- package/dist/Scheduling/components/index.js +0 -1
- package/dist/Scheduling/components/index.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +2 -2
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +2 -2
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +5 -5
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +2 -2
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
- package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +2 -2
- package/dist/VersionHistory/components/diff-resource.component.js +2 -2
- package/dist/VersionHistory/components/graph-resource.component.js +2 -2
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +3 -3
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/__tests__/integration-data-service.test.js +1 -0
- package/dist/__tests__/integration-data-service.test.js.map +1 -1
- package/dist/module.d.ts +52 -49
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +25 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +42 -40
- package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
- package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
- package/dist/Scheduling/components/job-slideout.component.js +0 -459
- package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
|
@@ -16,7 +16,8 @@ import * as i2 from "@progress/kendo-angular-buttons";
|
|
|
16
16
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
17
17
|
import * as i4 from "@memberjunction/ng-credentials";
|
|
18
18
|
import * as i5 from "@memberjunction/ng-trees";
|
|
19
|
-
import * as i6 from "
|
|
19
|
+
import * as i6 from "@memberjunction/ng-scheduling";
|
|
20
|
+
import * as i7 from "../visual-editor/visual-editor.component";
|
|
20
21
|
const _c0 = ["entityTreeDropdown"];
|
|
21
22
|
const _forTrack0 = ($index, $item) => $item.Integration.ID;
|
|
22
23
|
const _forTrack1 = ($index, $item) => $item.Name;
|
|
@@ -44,14 +45,14 @@ function ConnectionsComponent_Conditional_1_Conditional_10_Template(rf, ctx) { i
|
|
|
44
45
|
i0.ɵɵelementEnd()();
|
|
45
46
|
} }
|
|
46
47
|
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
47
|
-
i0.ɵɵelement(0, "i",
|
|
48
|
+
i0.ɵɵelement(0, "i", 47);
|
|
48
49
|
} }
|
|
49
50
|
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
50
|
-
i0.ɵɵelement(0, "i",
|
|
51
|
+
i0.ɵɵelement(0, "i", 48);
|
|
51
52
|
} }
|
|
52
53
|
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
-
i0.ɵɵelementStart(0, "div",
|
|
54
|
-
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_1_Template, 1, 0, "i",
|
|
54
|
+
i0.ɵɵelementStart(0, "div", 46);
|
|
55
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_1_Template, 1, 0, "i", 47)(2, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_22_Conditional_2_Template, 1, 0, "i", 48);
|
|
55
56
|
i0.ɵɵelementStart(3, "span");
|
|
56
57
|
i0.ɵɵtext(4);
|
|
57
58
|
i0.ɵɵelementEnd()();
|
|
@@ -72,12 +73,12 @@ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_
|
|
|
72
73
|
} }
|
|
73
74
|
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
74
75
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
75
|
-
i0.ɵɵelementStart(0, "div", 38)(1, "div",
|
|
76
|
-
i0.ɵɵelement(2, "i",
|
|
77
|
-
i0.ɵɵelementStart(3, "span",
|
|
76
|
+
i0.ɵɵelementStart(0, "div", 38)(1, "div", 49);
|
|
77
|
+
i0.ɵɵelement(2, "i", 50);
|
|
78
|
+
i0.ɵɵelementStart(3, "span", 51);
|
|
78
79
|
i0.ɵɵtext(4, "Delete this integration and all its entity maps?");
|
|
79
80
|
i0.ɵɵelementEnd();
|
|
80
|
-
i0.ɵɵelementStart(5, "div",
|
|
81
|
+
i0.ɵɵelementStart(5, "div", 52)(6, "button", 53);
|
|
81
82
|
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
83
|
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
84
|
i0.ɵɵelementEnd();
|
|
@@ -98,35 +99,25 @@ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_26_
|
|
|
98
99
|
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
99
100
|
i0.ɵɵtext(0, " Test ");
|
|
100
101
|
} }
|
|
102
|
+
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
103
|
+
i0.ɵɵelement(0, "i", 41);
|
|
104
|
+
i0.ɵɵtext(1, " Syncing... ");
|
|
105
|
+
} }
|
|
106
|
+
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
107
|
+
i0.ɵɵtext(0, " Sync Now ");
|
|
108
|
+
} }
|
|
101
109
|
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
102
110
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
103
|
-
i0.ɵɵelementStart(0, "button",
|
|
111
|
+
i0.ɵɵelementStart(0, "button", 54);
|
|
104
112
|
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.ɵɵ
|
|
113
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Conditional_1_Template, 2, 0)(2, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Conditional_2_Template, 1, 0);
|
|
106
114
|
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
115
|
} if (rf & 2) {
|
|
126
116
|
const summary_r6 = i0.ɵɵnextContext().$implicit;
|
|
127
117
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
128
|
-
i0.ɵɵ
|
|
129
|
-
i0.ɵɵ
|
|
118
|
+
i0.ɵɵproperty("disabled", !!ctx_r1.SyncingIntegrationID);
|
|
119
|
+
i0.ɵɵadvance();
|
|
120
|
+
i0.ɵɵconditional(ctx_r1.IsSyncing(summary_r6.Integration.ID) ? 1 : 2);
|
|
130
121
|
} }
|
|
131
122
|
function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
132
123
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
@@ -168,12 +159,10 @@ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template(rf, ct
|
|
|
168
159
|
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
160
|
i0.ɵɵtext(29, " Configure ");
|
|
170
161
|
i0.ɵɵelementEnd();
|
|
171
|
-
i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Template,
|
|
172
|
-
i0.ɵɵelementStart(31, "
|
|
173
|
-
i0.ɵɵlistener("click", function
|
|
174
|
-
i0.ɵɵelement(
|
|
175
|
-
i0.ɵɵelementEnd();
|
|
176
|
-
i0.ɵɵconditionalCreate(34, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_34_Template, 10, 1, "div", 47);
|
|
162
|
+
i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Conditional_30_Template, 3, 2, "button", 43);
|
|
163
|
+
i0.ɵɵelementStart(31, "button", 44);
|
|
164
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template_button_click_31_listener() { const summary_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMenuAction("delete", summary_r6)); });
|
|
165
|
+
i0.ɵɵelement(32, "i", 45);
|
|
177
166
|
i0.ɵɵelementEnd()()();
|
|
178
167
|
} if (rf & 2) {
|
|
179
168
|
let tmp_21_0;
|
|
@@ -182,7 +171,7 @@ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template(rf, ct
|
|
|
182
171
|
i0.ɵɵadvance(3);
|
|
183
172
|
i0.ɵɵstyleProp("background-color", ctx_r1.GetIconBrandColor(summary_r6.Integration.Integration));
|
|
184
173
|
i0.ɵɵadvance();
|
|
185
|
-
i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(summary_r6.Integration.Integration));
|
|
174
|
+
i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(summary_r6.Integration.Integration, summary_r6.Icon));
|
|
186
175
|
i0.ɵɵadvance();
|
|
187
176
|
i0.ɵɵclassMap(ctx_r1.GetStatusBadgeClass(summary_r6));
|
|
188
177
|
i0.ɵɵadvance();
|
|
@@ -207,13 +196,11 @@ function ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template(rf, ct
|
|
|
207
196
|
i0.ɵɵconditional(ctx_r1.IsTestingCard(summary_r6.Integration.ID) ? 26 : 27);
|
|
208
197
|
i0.ɵɵadvance(4);
|
|
209
198
|
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
199
|
} }
|
|
213
200
|
function ConnectionsComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
214
201
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
215
202
|
i0.ɵɵelementStart(0, "div", 15);
|
|
216
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template,
|
|
203
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_1_Conditional_11_For_2_Template, 33, 17, "div", 19, _forTrack0);
|
|
217
204
|
i0.ɵɵelementStart(3, "div", 20);
|
|
218
205
|
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
206
|
i0.ɵɵelementStart(4, "div", 21)(5, "div", 22);
|
|
@@ -255,51 +242,232 @@ function ConnectionsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
|
255
242
|
i0.ɵɵconditional(!ctx_r1.IsLoading && ctx_r1.Connections.length > 0 ? 11 : -1);
|
|
256
243
|
} }
|
|
257
244
|
function ConnectionsComponent_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
258
|
-
const
|
|
259
|
-
i0.ɵɵelementStart(0, "app-visual-field-editor",
|
|
260
|
-
i0.ɵɵlistener("Close", function ConnectionsComponent_Conditional_2_Conditional_1_Template_app_visual_field_editor_Close_0_listener() { i0.ɵɵrestoreView(
|
|
245
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
246
|
+
i0.ɵɵelementStart(0, "app-visual-field-editor", 56);
|
|
247
|
+
i0.ɵɵlistener("Close", function ConnectionsComponent_Conditional_2_Conditional_1_Template_app_visual_field_editor_Close_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseEntityMapEditor()); });
|
|
261
248
|
i0.ɵɵelementEnd();
|
|
262
249
|
} if (rf & 2) {
|
|
263
250
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
264
251
|
i0.ɵɵproperty("EntityMap", ctx_r1.EditorEntityMap)("CompanyIntegrationID", ctx_r1.SelectedSummary.Integration.ID)("RunViewProvider", ctx_r1.RunViewToUse);
|
|
265
252
|
} }
|
|
253
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
254
|
+
i0.ɵɵelement(0, "i", 41);
|
|
255
|
+
i0.ɵɵtext(1, " Syncing... ");
|
|
256
|
+
} }
|
|
257
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
258
|
+
i0.ɵɵelement(0, "i", 36);
|
|
259
|
+
i0.ɵɵtext(1, " Sync Now ");
|
|
260
|
+
} }
|
|
266
261
|
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
262
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
263
|
+
i0.ɵɵelementStart(0, "button", 54);
|
|
264
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RunSync(ctx_r1.SelectedSummary.Integration.ID)); });
|
|
265
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Conditional_1_Template, 2, 0)(2, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Conditional_2_Template, 2, 0);
|
|
266
|
+
i0.ɵɵelementEnd();
|
|
267
|
+
} if (rf & 2) {
|
|
268
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
269
|
+
i0.ɵɵproperty("disabled", !!ctx_r1.SyncingIntegrationID);
|
|
270
|
+
i0.ɵɵadvance();
|
|
271
|
+
i0.ɵɵconditional(ctx_r1.IsSyncing(ctx_r1.SelectedSummary.Integration.ID) ? 1 : 2);
|
|
272
|
+
} }
|
|
273
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
267
274
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
268
|
-
i0.ɵɵelementStart(0, "
|
|
269
|
-
i0.ɵɵlistener("
|
|
270
|
-
i0.ɵɵ
|
|
271
|
-
|
|
275
|
+
i0.ɵɵelementStart(0, "mj-scheduled-job-summary", 86);
|
|
276
|
+
i0.ɵɵlistener("EditRequested", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_28_Template_mj_scheduled_job_summary_EditRequested_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenSchedulePanel()); });
|
|
277
|
+
i0.ɵɵelementEnd();
|
|
278
|
+
} if (rf & 2) {
|
|
279
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
280
|
+
i0.ɵɵproperty("ScheduledJobID", ctx_r1.ScheduledJobID);
|
|
281
|
+
} }
|
|
282
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
283
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
284
|
+
i0.ɵɵelementStart(0, "div", 72)(1, "span", 87);
|
|
285
|
+
i0.ɵɵtext(2, "No sync schedule configured");
|
|
272
286
|
i0.ɵɵelementEnd();
|
|
287
|
+
i0.ɵɵelementStart(3, "button", 88);
|
|
288
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_29_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenSchedulePanel()); });
|
|
289
|
+
i0.ɵɵelement(4, "i", 12);
|
|
290
|
+
i0.ɵɵtext(5, " Schedule Sync ");
|
|
291
|
+
i0.ɵɵelementEnd()();
|
|
273
292
|
} }
|
|
274
|
-
function
|
|
275
|
-
i0.ɵɵ
|
|
293
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_48_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
294
|
+
i0.ɵɵelement(0, "i", 47);
|
|
295
|
+
} }
|
|
296
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_48_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
297
|
+
i0.ɵɵelement(0, "i", 48);
|
|
298
|
+
} }
|
|
299
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
300
|
+
i0.ɵɵelementStart(0, "div", 89);
|
|
301
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_48_Conditional_1_Template, 1, 0, "i", 47)(2, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_48_Conditional_2_Template, 1, 0, "i", 48);
|
|
302
|
+
i0.ɵɵelementStart(3, "span");
|
|
303
|
+
i0.ɵɵtext(4);
|
|
304
|
+
i0.ɵɵelementEnd()();
|
|
305
|
+
} if (rf & 2) {
|
|
306
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
307
|
+
i0.ɵɵclassProp("sync-success", ctx_r1.SyncResult.Success)("sync-failure", !ctx_r1.SyncResult.Success);
|
|
308
|
+
i0.ɵɵadvance();
|
|
309
|
+
i0.ɵɵconditional(ctx_r1.SyncResult.Success ? 1 : 2);
|
|
310
|
+
i0.ɵɵadvance(3);
|
|
311
|
+
i0.ɵɵtextInterpolate(ctx_r1.SyncResult.Message || (ctx_r1.SyncResult.Success ? "Sync completed successfully" : "Sync failed"));
|
|
312
|
+
} }
|
|
313
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
314
|
+
i0.ɵɵelementStart(0, "option", 96);
|
|
315
|
+
i0.ɵɵtext(1);
|
|
316
|
+
i0.ɵɵelementEnd();
|
|
317
|
+
} if (rf & 2) {
|
|
318
|
+
const schema_r16 = ctx.$implicit;
|
|
319
|
+
i0.ɵɵproperty("value", schema_r16);
|
|
320
|
+
i0.ɵɵadvance();
|
|
321
|
+
i0.ɵɵtextInterpolate(schema_r16);
|
|
322
|
+
} }
|
|
323
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
324
|
+
i0.ɵɵelement(0, "i", 41);
|
|
325
|
+
i0.ɵɵtext(1, " Mapping... ");
|
|
326
|
+
} }
|
|
327
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
328
|
+
i0.ɵɵelement(0, "i", 82);
|
|
329
|
+
i0.ɵɵtext(1, " Auto-Map ");
|
|
330
|
+
} }
|
|
331
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
332
|
+
i0.ɵɵelementStart(0, "div", 110);
|
|
333
|
+
i0.ɵɵelement(1, "i", 47);
|
|
334
|
+
i0.ɵɵtext(2);
|
|
335
|
+
i0.ɵɵelementEnd();
|
|
336
|
+
} if (rf & 2) {
|
|
337
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
338
|
+
i0.ɵɵadvance(2);
|
|
339
|
+
i0.ɵɵtextInterpolate4(" Created ", ctx_r1.AutoMapResult.EntityMapsCreated, " entity map", ctx_r1.AutoMapResult.EntityMapsCreated !== 1 ? "s" : "", " with ", ctx_r1.AutoMapResult.FieldMapsCreated, " field map", ctx_r1.AutoMapResult.FieldMapsCreated !== 1 ? "s" : "", " ");
|
|
340
|
+
} }
|
|
341
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
342
|
+
i0.ɵɵelementStart(0, "div", 110);
|
|
343
|
+
i0.ɵɵelement(1, "i", 112);
|
|
344
|
+
i0.ɵɵtext(2, " All entities in this schema are already mapped. ");
|
|
345
|
+
i0.ɵɵelementEnd();
|
|
346
|
+
} }
|
|
347
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
348
|
+
i0.ɵɵelementStart(0, "div", 113);
|
|
349
|
+
i0.ɵɵelement(1, "i", 114);
|
|
350
|
+
i0.ɵɵtext(2);
|
|
351
|
+
i0.ɵɵelementEnd();
|
|
352
|
+
} if (rf & 2) {
|
|
353
|
+
const err_r17 = ctx.$implicit;
|
|
354
|
+
i0.ɵɵadvance(2);
|
|
355
|
+
i0.ɵɵtextInterpolate1(" ", err_r17);
|
|
356
|
+
} }
|
|
357
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
358
|
+
i0.ɵɵelementStart(0, "div", 111);
|
|
359
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Conditional_3_For_2_Template, 3, 1, "div", 113, i0.ɵɵrepeaterTrackByIdentity);
|
|
360
|
+
i0.ɵɵelementEnd();
|
|
361
|
+
} if (rf & 2) {
|
|
362
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
363
|
+
i0.ɵɵadvance();
|
|
364
|
+
i0.ɵɵrepeater(ctx_r1.AutoMapResult.Errors);
|
|
365
|
+
} }
|
|
366
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
367
|
+
i0.ɵɵelementStart(0, "div", 109);
|
|
368
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Conditional_1_Template, 3, 4, "div", 110)(2, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Conditional_2_Template, 3, 0, "div", 110);
|
|
369
|
+
i0.ɵɵconditionalCreate(3, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Conditional_3_Template, 3, 0, "div", 111);
|
|
370
|
+
i0.ɵɵelementEnd();
|
|
371
|
+
} if (rf & 2) {
|
|
372
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
373
|
+
i0.ɵɵclassProp("auto-map-success", ctx_r1.AutoMapResult.Errors.length === 0)("auto-map-partial", ctx_r1.AutoMapResult.Errors.length > 0 && ctx_r1.AutoMapResult.EntityMapsCreated > 0)("auto-map-failure", ctx_r1.AutoMapResult.EntityMapsCreated === 0 && ctx_r1.AutoMapResult.Errors.length > 0);
|
|
374
|
+
i0.ɵɵadvance();
|
|
375
|
+
i0.ɵɵconditional(ctx_r1.AutoMapResult.EntityMapsCreated > 0 ? 1 : ctx_r1.AutoMapResult.Errors.length === 0 ? 2 : -1);
|
|
376
|
+
i0.ɵɵadvance(2);
|
|
377
|
+
i0.ɵɵconditional(ctx_r1.AutoMapResult.Errors.length > 0 ? 3 : -1);
|
|
378
|
+
} }
|
|
379
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
380
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
381
|
+
i0.ɵɵelementStart(0, "div", 84)(1, "div", 90);
|
|
382
|
+
i0.ɵɵelement(2, "i", 82);
|
|
383
|
+
i0.ɵɵelementStart(3, "span");
|
|
384
|
+
i0.ɵɵtext(4, "Auto-map all entities in a schema to this integration with 1:1 field mappings");
|
|
385
|
+
i0.ɵɵelementEnd()();
|
|
386
|
+
i0.ɵɵelementStart(5, "div", 91)(6, "div", 92)(7, "label", 93);
|
|
387
|
+
i0.ɵɵtext(8, "Target Schema");
|
|
388
|
+
i0.ɵɵelementEnd();
|
|
389
|
+
i0.ɵɵelementStart(9, "select", 94);
|
|
390
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Template_select_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.AutoMapSelectedSchema, $event) || (ctx_r1.AutoMapSelectedSchema = $event); return i0.ɵɵresetView($event); });
|
|
391
|
+
i0.ɵɵelementStart(10, "option", 95);
|
|
392
|
+
i0.ɵɵtext(11, "Select schema...");
|
|
393
|
+
i0.ɵɵelementEnd();
|
|
394
|
+
i0.ɵɵrepeaterCreate(12, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_For_13_Template, 2, 2, "option", 96, i0.ɵɵrepeaterTrackByIdentity);
|
|
395
|
+
i0.ɵɵelementEnd()();
|
|
396
|
+
i0.ɵɵelementStart(14, "div", 97)(15, "label", 93);
|
|
397
|
+
i0.ɵɵtext(16, "Direction");
|
|
398
|
+
i0.ɵɵelementEnd();
|
|
399
|
+
i0.ɵɵelementStart(17, "div", 98)(18, "button", 99);
|
|
400
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AutoMapDirection = "Pull"); });
|
|
401
|
+
i0.ɵɵelement(19, "i", 100);
|
|
402
|
+
i0.ɵɵelementEnd();
|
|
403
|
+
i0.ɵɵelementStart(20, "button", 101);
|
|
404
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AutoMapDirection = "Bidirectional"); });
|
|
405
|
+
i0.ɵɵelement(21, "i", 102);
|
|
406
|
+
i0.ɵɵelementEnd();
|
|
407
|
+
i0.ɵɵelementStart(22, "button", 103);
|
|
408
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AutoMapDirection = "Push"); });
|
|
409
|
+
i0.ɵɵelement(23, "i", 59);
|
|
410
|
+
i0.ɵɵelementEnd()()();
|
|
411
|
+
i0.ɵɵelementStart(24, "div", 104)(25, "button", 105);
|
|
412
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RunAutoMap()); });
|
|
413
|
+
i0.ɵɵconditionalCreate(26, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_26_Template, 2, 0)(27, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_27_Template, 2, 0);
|
|
414
|
+
i0.ɵɵelementEnd();
|
|
415
|
+
i0.ɵɵelementStart(28, "button", 106);
|
|
416
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseAutoMapPanel()); });
|
|
417
|
+
i0.ɵɵelement(29, "i", 107);
|
|
418
|
+
i0.ɵɵelementEnd()()();
|
|
419
|
+
i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Conditional_30_Template, 4, 8, "div", 108);
|
|
420
|
+
i0.ɵɵelementEnd();
|
|
421
|
+
} if (rf & 2) {
|
|
422
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
423
|
+
i0.ɵɵadvance(9);
|
|
424
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.AutoMapSelectedSchema);
|
|
425
|
+
i0.ɵɵadvance();
|
|
426
|
+
i0.ɵɵproperty("ngValue", "");
|
|
427
|
+
i0.ɵɵadvance(2);
|
|
428
|
+
i0.ɵɵrepeater(ctx_r1.AutoMapSchemas);
|
|
429
|
+
i0.ɵɵadvance(6);
|
|
430
|
+
i0.ɵɵclassProp("active", ctx_r1.AutoMapDirection === "Pull");
|
|
431
|
+
i0.ɵɵadvance(2);
|
|
432
|
+
i0.ɵɵclassProp("active", ctx_r1.AutoMapDirection === "Bidirectional");
|
|
433
|
+
i0.ɵɵadvance(2);
|
|
434
|
+
i0.ɵɵclassProp("active", ctx_r1.AutoMapDirection === "Push");
|
|
435
|
+
i0.ɵɵadvance(3);
|
|
436
|
+
i0.ɵɵproperty("disabled", !ctx_r1.CanAutoMap);
|
|
437
|
+
i0.ɵɵadvance();
|
|
438
|
+
i0.ɵɵconditional(ctx_r1.IsAutoMapping ? 26 : 27);
|
|
439
|
+
i0.ɵɵadvance(4);
|
|
440
|
+
i0.ɵɵconditional(ctx_r1.AutoMapResult ? 30 : -1);
|
|
441
|
+
} }
|
|
442
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
443
|
+
i0.ɵɵelementStart(0, "div", 115);
|
|
276
444
|
i0.ɵɵelement(1, "i", 41);
|
|
277
445
|
i0.ɵɵtext(2, " Loading...");
|
|
278
446
|
i0.ɵɵelementEnd();
|
|
279
447
|
} }
|
|
280
|
-
function
|
|
281
|
-
i0.ɵɵelementStart(0, "div",
|
|
448
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
449
|
+
i0.ɵɵelementStart(0, "div", 116);
|
|
282
450
|
i0.ɵɵtext(1, "No source objects found in metadata");
|
|
283
451
|
i0.ɵɵelementEnd();
|
|
284
452
|
} }
|
|
285
|
-
function
|
|
286
|
-
i0.ɵɵelementStart(0, "option",
|
|
453
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_7_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
454
|
+
i0.ɵɵelementStart(0, "option", 96);
|
|
287
455
|
i0.ɵɵtext(1);
|
|
288
456
|
i0.ɵɵelementEnd();
|
|
289
457
|
} if (rf & 2) {
|
|
290
|
-
const
|
|
291
|
-
i0.ɵɵproperty("value",
|
|
458
|
+
const obj_r20 = ctx.$implicit;
|
|
459
|
+
i0.ɵɵproperty("value", obj_r20.Name);
|
|
292
460
|
i0.ɵɵadvance();
|
|
293
|
-
i0.ɵɵtextInterpolate(
|
|
461
|
+
i0.ɵɵtextInterpolate(obj_r20.Label || obj_r20.Name);
|
|
294
462
|
} }
|
|
295
|
-
function
|
|
296
|
-
const
|
|
297
|
-
i0.ɵɵelementStart(0, "select",
|
|
298
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
299
|
-
i0.ɵɵelementStart(1, "option",
|
|
463
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
464
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
465
|
+
i0.ɵɵelementStart(0, "select", 94);
|
|
466
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_7_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.AddMapSourceObjectName, $event) || (ctx_r1.AddMapSourceObjectName = $event); return i0.ɵɵresetView($event); });
|
|
467
|
+
i0.ɵɵelementStart(1, "option", 95);
|
|
300
468
|
i0.ɵɵtext(2, "Select source object...");
|
|
301
469
|
i0.ɵɵelementEnd();
|
|
302
|
-
i0.ɵɵrepeaterCreate(3,
|
|
470
|
+
i0.ɵɵrepeaterCreate(3, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_7_For_4_Template, 2, 2, "option", 96, _forTrack1);
|
|
303
471
|
i0.ɵɵelementEnd();
|
|
304
472
|
} if (rf & 2) {
|
|
305
473
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -309,53 +477,53 @@ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Conditi
|
|
|
309
477
|
i0.ɵɵadvance(2);
|
|
310
478
|
i0.ɵɵrepeater(ctx_r1.AvailableSourceObjects);
|
|
311
479
|
} }
|
|
312
|
-
function
|
|
480
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
313
481
|
i0.ɵɵelement(0, "i", 41);
|
|
314
482
|
} }
|
|
315
|
-
function
|
|
316
|
-
i0.ɵɵelement(0, "i",
|
|
483
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
484
|
+
i0.ɵɵelement(0, "i", 122);
|
|
317
485
|
i0.ɵɵtext(1, " Add ");
|
|
318
486
|
} }
|
|
319
|
-
function
|
|
320
|
-
const
|
|
321
|
-
i0.ɵɵelementStart(0, "div",
|
|
487
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
488
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
489
|
+
i0.ɵɵelementStart(0, "div", 84)(1, "div", 91)(2, "div", 92)(3, "label", 93);
|
|
322
490
|
i0.ɵɵtext(4, "Source Object");
|
|
323
491
|
i0.ɵɵelementEnd();
|
|
324
|
-
i0.ɵɵconditionalCreate(5,
|
|
492
|
+
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_5_Template, 3, 0, "div", 115)(6, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_6_Template, 2, 0, "div", 116)(7, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_7_Template, 5, 2, "select", 117);
|
|
325
493
|
i0.ɵɵelementEnd();
|
|
326
|
-
i0.ɵɵelementStart(8, "div",
|
|
494
|
+
i0.ɵɵelementStart(8, "div", 97)(9, "label", 93);
|
|
327
495
|
i0.ɵɵtext(10, "Direction");
|
|
328
496
|
i0.ɵɵelementEnd();
|
|
329
|
-
i0.ɵɵelementStart(11, "div",
|
|
330
|
-
i0.ɵɵlistener("click", function
|
|
331
|
-
i0.ɵɵelement(13, "i",
|
|
497
|
+
i0.ɵɵelementStart(11, "div", 98)(12, "button", 99);
|
|
498
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Pull"); });
|
|
499
|
+
i0.ɵɵelement(13, "i", 100);
|
|
332
500
|
i0.ɵɵelementEnd();
|
|
333
|
-
i0.ɵɵelementStart(14, "button",
|
|
334
|
-
i0.ɵɵlistener("click", function
|
|
335
|
-
i0.ɵɵelement(15, "i",
|
|
501
|
+
i0.ɵɵelementStart(14, "button", 101);
|
|
502
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Bidirectional"); });
|
|
503
|
+
i0.ɵɵelement(15, "i", 102);
|
|
336
504
|
i0.ɵɵelementEnd();
|
|
337
|
-
i0.ɵɵelementStart(16, "button",
|
|
338
|
-
i0.ɵɵlistener("click", function
|
|
339
|
-
i0.ɵɵelement(17, "i",
|
|
505
|
+
i0.ɵɵelementStart(16, "button", 103);
|
|
506
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddMapDirection = "Push"); });
|
|
507
|
+
i0.ɵɵelement(17, "i", 59);
|
|
340
508
|
i0.ɵɵelementEnd()()();
|
|
341
|
-
i0.ɵɵelementStart(18, "div",
|
|
509
|
+
i0.ɵɵelementStart(18, "div", 118)(19, "label", 93);
|
|
342
510
|
i0.ɵɵtext(20, "MJ Entity");
|
|
343
511
|
i0.ɵɵelementEnd();
|
|
344
|
-
i0.ɵɵelementStart(21, "div",
|
|
345
|
-
i0.ɵɵlistener("SelectionChange", function
|
|
512
|
+
i0.ɵɵelementStart(21, "div", 119)(22, "mj-tree-dropdown", 120, 0);
|
|
513
|
+
i0.ɵɵlistener("SelectionChange", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template_mj_tree_dropdown_SelectionChange_22_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnEntityTreeSelection($event)); });
|
|
346
514
|
i0.ɵɵelementEnd();
|
|
347
|
-
i0.ɵɵelementStart(24, "button",
|
|
348
|
-
i0.ɵɵlistener("click", function
|
|
515
|
+
i0.ɵɵelementStart(24, "button", 121);
|
|
516
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template_button_click_24_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenNewEntityDialog()); });
|
|
349
517
|
i0.ɵɵelement(25, "i", 12);
|
|
350
518
|
i0.ɵɵtext(26, " New ");
|
|
351
519
|
i0.ɵɵelementEnd()()();
|
|
352
|
-
i0.ɵɵelementStart(27, "div",
|
|
353
|
-
i0.ɵɵlistener("click", function
|
|
354
|
-
i0.ɵɵconditionalCreate(29,
|
|
520
|
+
i0.ɵɵelementStart(27, "div", 104)(28, "button", 105);
|
|
521
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveAddMap()); });
|
|
522
|
+
i0.ɵɵconditionalCreate(29, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_29_Template, 1, 0, "i", 41)(30, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Conditional_30_Template, 2, 0);
|
|
355
523
|
i0.ɵɵelementEnd();
|
|
356
|
-
i0.ɵɵelementStart(31, "button",
|
|
357
|
-
i0.ɵɵlistener("click", function
|
|
358
|
-
i0.ɵɵelement(32, "i",
|
|
524
|
+
i0.ɵɵelementStart(31, "button", 106);
|
|
525
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template_button_click_31_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseAddMapPanel()); });
|
|
526
|
+
i0.ɵɵelement(32, "i", 107);
|
|
359
527
|
i0.ɵɵelementEnd()()()();
|
|
360
528
|
} if (rf & 2) {
|
|
361
529
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -374,106 +542,106 @@ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_36_Templat
|
|
|
374
542
|
i0.ɵɵadvance();
|
|
375
543
|
i0.ɵɵconditional(ctx_r1.IsSavingAddMap ? 29 : 30);
|
|
376
544
|
} }
|
|
377
|
-
function
|
|
545
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_51_Template(rf, ctx) { if (rf & 1) {
|
|
378
546
|
i0.ɵɵelementStart(0, "div", 13);
|
|
379
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
547
|
+
i0.ɵɵelement(1, "mj-loading", 123);
|
|
380
548
|
i0.ɵɵelementEnd();
|
|
381
549
|
} }
|
|
382
|
-
function
|
|
383
|
-
const
|
|
384
|
-
i0.ɵɵelementStart(0, "div",
|
|
385
|
-
i0.ɵɵelement(1, "i",
|
|
550
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_52_Template(rf, ctx) { if (rf & 1) {
|
|
551
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
552
|
+
i0.ɵɵelementStart(0, "div", 85);
|
|
553
|
+
i0.ɵɵelement(1, "i", 124);
|
|
386
554
|
i0.ɵɵelementStart(2, "h3");
|
|
387
555
|
i0.ɵɵtext(3, "No entity maps configured");
|
|
388
556
|
i0.ɵɵelementEnd();
|
|
389
557
|
i0.ɵɵelementStart(4, "p");
|
|
390
558
|
i0.ɵɵtext(5, "Entity maps define how external objects sync to MJ entities.");
|
|
391
559
|
i0.ɵɵelementEnd();
|
|
392
|
-
i0.ɵɵelementStart(6, "button",
|
|
393
|
-
i0.ɵɵlistener("click", function
|
|
560
|
+
i0.ɵɵelementStart(6, "button", 125);
|
|
561
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_52_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ToggleAddMapPanel()); });
|
|
394
562
|
i0.ɵɵelement(7, "i", 12);
|
|
395
563
|
i0.ɵɵtext(8, " Add Your First Entity Map ");
|
|
396
564
|
i0.ɵɵelementEnd()();
|
|
397
565
|
} }
|
|
398
|
-
function
|
|
399
|
-
i0.ɵɵelementStart(0, "span",
|
|
400
|
-
i0.ɵɵelement(1, "i",
|
|
566
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_For_12_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
567
|
+
i0.ɵɵelementStart(0, "span", 142);
|
|
568
|
+
i0.ɵɵelement(1, "i", 146);
|
|
401
569
|
i0.ɵɵelementEnd();
|
|
402
570
|
} }
|
|
403
|
-
function
|
|
404
|
-
const
|
|
405
|
-
i0.ɵɵelementStart(0, "div",
|
|
406
|
-
i0.ɵɵlistener("click", function
|
|
407
|
-
i0.ɵɵelementStart(1, "span",
|
|
408
|
-
i0.ɵɵlistener("click", function
|
|
409
|
-
i0.ɵɵelementStart(2, "label",
|
|
410
|
-
i0.ɵɵlistener("change", function
|
|
411
|
-
i0.ɵɵelementEnd();
|
|
412
|
-
i0.ɵɵelement(4, "span",
|
|
571
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
572
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
573
|
+
i0.ɵɵelementStart(0, "div", 135);
|
|
574
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_For_12_Template_div_click_0_listener() { const em_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnEntityMapClick(em_r23)); });
|
|
575
|
+
i0.ɵɵelementStart(1, "span", 136);
|
|
576
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_For_12_Template_span_click_1_listener($event) { i0.ɵɵrestoreView(_r22); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
577
|
+
i0.ɵɵelementStart(2, "label", 137)(3, "input", 138);
|
|
578
|
+
i0.ɵɵlistener("change", function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_For_12_Template_input_change_3_listener($event) { const em_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnToggleMapEnabled(em_r23, $event)); });
|
|
579
|
+
i0.ɵɵelementEnd();
|
|
580
|
+
i0.ɵɵelement(4, "span", 139);
|
|
413
581
|
i0.ɵɵelementEnd()();
|
|
414
|
-
i0.ɵɵelementStart(5, "span",
|
|
582
|
+
i0.ɵɵelementStart(5, "span", 140);
|
|
415
583
|
i0.ɵɵtext(6);
|
|
416
584
|
i0.ɵɵelementEnd();
|
|
417
|
-
i0.ɵɵelementStart(7, "span",
|
|
585
|
+
i0.ɵɵelementStart(7, "span", 129)(8, "span");
|
|
418
586
|
i0.ɵɵtext(9);
|
|
419
587
|
i0.ɵɵelementEnd()();
|
|
420
|
-
i0.ɵɵelementStart(10, "span",
|
|
588
|
+
i0.ɵɵelementStart(10, "span", 141);
|
|
421
589
|
i0.ɵɵtext(11);
|
|
422
590
|
i0.ɵɵelementEnd();
|
|
423
|
-
i0.ɵɵelementStart(12, "span",
|
|
424
|
-
i0.ɵɵconditionalCreate(13,
|
|
425
|
-
i0.ɵɵelementStart(14, "span",
|
|
591
|
+
i0.ɵɵelementStart(12, "span", 131);
|
|
592
|
+
i0.ɵɵconditionalCreate(13, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_For_12_Conditional_13_Template, 2, 0, "span", 142);
|
|
593
|
+
i0.ɵɵelementStart(14, "span", 143);
|
|
426
594
|
i0.ɵɵelement(15, "i", 36);
|
|
427
595
|
i0.ɵɵelementEnd();
|
|
428
|
-
i0.ɵɵelementStart(16, "span",
|
|
429
|
-
i0.ɵɵelement(17, "i",
|
|
596
|
+
i0.ɵɵelementStart(16, "span", 144);
|
|
597
|
+
i0.ɵɵelement(17, "i", 145);
|
|
430
598
|
i0.ɵɵelementEnd()()();
|
|
431
599
|
} if (rf & 2) {
|
|
432
|
-
const
|
|
600
|
+
const em_r23 = ctx.$implicit;
|
|
433
601
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
434
|
-
i0.ɵɵclassProp("sync-disabled", !
|
|
602
|
+
i0.ɵɵclassProp("sync-disabled", !em_r23.SyncEnabled);
|
|
435
603
|
i0.ɵɵadvance(2);
|
|
436
|
-
i0.ɵɵproperty("title",
|
|
604
|
+
i0.ɵɵproperty("title", em_r23.SyncEnabled ? "Sync enabled" : "Sync disabled");
|
|
437
605
|
i0.ɵɵadvance();
|
|
438
|
-
i0.ɵɵproperty("checked",
|
|
606
|
+
i0.ɵɵproperty("checked", em_r23.SyncEnabled);
|
|
439
607
|
i0.ɵɵadvance(2);
|
|
440
|
-
i0.ɵɵproperty("title",
|
|
608
|
+
i0.ɵɵproperty("title", em_r23.ExternalObjectName);
|
|
441
609
|
i0.ɵɵadvance();
|
|
442
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
610
|
+
i0.ɵɵtextInterpolate1(" ", em_r23.ExternalObjectLabel ?? em_r23.ExternalObjectName, " ");
|
|
443
611
|
i0.ɵɵadvance(2);
|
|
444
|
-
i0.ɵɵclassMap(ctx_r1.DirectionBadgeClass(
|
|
612
|
+
i0.ɵɵclassMap(ctx_r1.DirectionBadgeClass(em_r23.SyncDirection));
|
|
445
613
|
i0.ɵɵadvance();
|
|
446
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.DirectionText(
|
|
614
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.DirectionText(em_r23.SyncDirection), " ");
|
|
447
615
|
i0.ɵɵadvance();
|
|
448
|
-
i0.ɵɵproperty("title",
|
|
616
|
+
i0.ɵɵproperty("title", em_r23.Entity);
|
|
449
617
|
i0.ɵɵadvance();
|
|
450
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
618
|
+
i0.ɵɵtextInterpolate1(" ", em_r23.Entity, " ");
|
|
451
619
|
i0.ɵɵadvance(2);
|
|
452
|
-
i0.ɵɵconditional(
|
|
620
|
+
i0.ɵɵconditional(em_r23.MatchStrategy ? 13 : -1);
|
|
453
621
|
i0.ɵɵadvance();
|
|
454
|
-
i0.ɵɵproperty("title", "Conflict: " +
|
|
622
|
+
i0.ɵɵproperty("title", "Conflict: " + em_r23.ConflictResolution);
|
|
455
623
|
} }
|
|
456
|
-
function
|
|
457
|
-
i0.ɵɵelementStart(0, "div",
|
|
624
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_ForEmpty_13_Template(rf, ctx) { if (rf & 1) {
|
|
625
|
+
i0.ɵɵelementStart(0, "div", 134);
|
|
458
626
|
i0.ɵɵtext(1, " No entity maps match your filter. ");
|
|
459
627
|
i0.ɵɵelementEnd();
|
|
460
628
|
} }
|
|
461
|
-
function
|
|
462
|
-
i0.ɵɵelementStart(0, "div",
|
|
629
|
+
function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
630
|
+
i0.ɵɵelementStart(0, "div", 126)(1, "span", 127);
|
|
463
631
|
i0.ɵɵtext(2, "Sync");
|
|
464
632
|
i0.ɵɵelementEnd();
|
|
465
|
-
i0.ɵɵelementStart(3, "span",
|
|
633
|
+
i0.ɵɵelementStart(3, "span", 128);
|
|
466
634
|
i0.ɵɵtext(4, "External Object");
|
|
467
635
|
i0.ɵɵelementEnd();
|
|
468
|
-
i0.ɵɵelement(5, "span",
|
|
469
|
-
i0.ɵɵelementStart(6, "span",
|
|
636
|
+
i0.ɵɵelement(5, "span", 129);
|
|
637
|
+
i0.ɵɵelementStart(6, "span", 130);
|
|
470
638
|
i0.ɵɵtext(7, "MJ Entity");
|
|
471
639
|
i0.ɵɵelementEnd();
|
|
472
|
-
i0.ɵɵelementStart(8, "span",
|
|
640
|
+
i0.ɵɵelementStart(8, "span", 131);
|
|
473
641
|
i0.ɵɵtext(9, "Config");
|
|
474
642
|
i0.ɵɵelementEnd()();
|
|
475
|
-
i0.ɵɵelementStart(10, "div",
|
|
476
|
-
i0.ɵɵrepeaterCreate(11,
|
|
643
|
+
i0.ɵɵelementStart(10, "div", 132);
|
|
644
|
+
i0.ɵɵrepeaterCreate(11, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_For_12_Template, 18, 13, "div", 133, _forTrack2, false, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_ForEmpty_13_Template, 2, 0, "div", 134);
|
|
477
645
|
i0.ɵɵelementEnd();
|
|
478
646
|
} if (rf & 2) {
|
|
479
647
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -481,18 +649,18 @@ function ConnectionsComponent_Conditional_2_Conditional_2_Conditional_39_Templat
|
|
|
481
649
|
i0.ɵɵrepeater(ctx_r1.DetailFilteredMaps);
|
|
482
650
|
} }
|
|
483
651
|
function ConnectionsComponent_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
484
|
-
const
|
|
485
|
-
i0.ɵɵelementStart(0, "div",
|
|
486
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
487
|
-
i0.ɵɵelement(2, "i",
|
|
652
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
653
|
+
i0.ɵɵelementStart(0, "div", 57)(1, "button", 58);
|
|
654
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseDetailView()); });
|
|
655
|
+
i0.ɵɵelement(2, "i", 59);
|
|
488
656
|
i0.ɵɵelementEnd();
|
|
489
|
-
i0.ɵɵelementStart(3, "div",
|
|
657
|
+
i0.ɵɵelementStart(3, "div", 60)(4, "div", 26);
|
|
490
658
|
i0.ɵɵelement(5, "i", 27);
|
|
491
659
|
i0.ɵɵelementEnd();
|
|
492
|
-
i0.ɵɵelementStart(6, "div",
|
|
660
|
+
i0.ɵɵelementStart(6, "div", 61)(7, "h2", 62);
|
|
493
661
|
i0.ɵɵtext(8);
|
|
494
662
|
i0.ɵɵelementEnd();
|
|
495
|
-
i0.ɵɵelementStart(9, "span",
|
|
663
|
+
i0.ɵɵelementStart(9, "span", 63);
|
|
496
664
|
i0.ɵɵtext(10);
|
|
497
665
|
i0.ɵɵelementStart(11, "span", 33);
|
|
498
666
|
i0.ɵɵtext(12, "\u00B7");
|
|
@@ -504,31 +672,48 @@ function ConnectionsComponent_Conditional_2_Conditional_2_Template(rf, ctx) { if
|
|
|
504
672
|
i0.ɵɵelementStart(16, "span");
|
|
505
673
|
i0.ɵɵtext(17);
|
|
506
674
|
i0.ɵɵelementEnd()()()();
|
|
507
|
-
i0.ɵɵelementStart(18, "div",
|
|
508
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_19_listener() { i0.ɵɵrestoreView(
|
|
509
|
-
i0.ɵɵelement(20, "i",
|
|
675
|
+
i0.ɵɵelementStart(18, "div", 64)(19, "button", 65);
|
|
676
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenEditPanel(ctx_r1.SelectedSummary)); });
|
|
677
|
+
i0.ɵɵelement(20, "i", 66);
|
|
510
678
|
i0.ɵɵelementEnd();
|
|
511
|
-
i0.ɵɵconditionalCreate(21, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Template, 3,
|
|
679
|
+
i0.ɵɵconditionalCreate(21, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_21_Template, 3, 2, "button", 43);
|
|
512
680
|
i0.ɵɵelementEnd()();
|
|
513
|
-
i0.ɵɵelementStart(22, "div",
|
|
514
|
-
i0.ɵɵ
|
|
515
|
-
i0.ɵɵelementStart(26, "span"
|
|
516
|
-
i0.ɵɵtext(27, "
|
|
681
|
+
i0.ɵɵelementStart(22, "div", 67)(23, "div", 68)(24, "div", 69);
|
|
682
|
+
i0.ɵɵelement(25, "i", 70);
|
|
683
|
+
i0.ɵɵelementStart(26, "span");
|
|
684
|
+
i0.ɵɵtext(27, "Sync Schedule");
|
|
685
|
+
i0.ɵɵelementEnd()()();
|
|
686
|
+
i0.ɵɵconditionalCreate(28, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_28_Template, 1, 1, "mj-scheduled-job-summary", 71)(29, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_29_Template, 6, 0, "div", 72);
|
|
517
687
|
i0.ɵɵelementEnd();
|
|
518
|
-
i0.ɵɵ
|
|
688
|
+
i0.ɵɵelementStart(30, "mj-scheduled-job-slide-panel", 73);
|
|
689
|
+
i0.ɵɵlistener("Close", function ConnectionsComponent_Conditional_2_Conditional_2_Template_mj_scheduled_job_slide_panel_Close_30_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseSchedulePanel()); })("Saved", function ConnectionsComponent_Conditional_2_Conditional_2_Template_mj_scheduled_job_slide_panel_Saved_30_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnScheduleSaved()); })("Deleted", function ConnectionsComponent_Conditional_2_Conditional_2_Template_mj_scheduled_job_slide_panel_Deleted_30_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnScheduleDeleted()); });
|
|
690
|
+
i0.ɵɵelementEnd();
|
|
691
|
+
i0.ɵɵelementStart(31, "div", 74)(32, "div", 75)(33, "span", 76);
|
|
692
|
+
i0.ɵɵtext(34);
|
|
693
|
+
i0.ɵɵelementStart(35, "span", 33);
|
|
694
|
+
i0.ɵɵtext(36, "\u00B7");
|
|
695
|
+
i0.ɵɵelementEnd();
|
|
696
|
+
i0.ɵɵtext(37);
|
|
519
697
|
i0.ɵɵelementEnd()();
|
|
520
|
-
i0.ɵɵelementStart(
|
|
521
|
-
i0.ɵɵelement(
|
|
522
|
-
i0.ɵɵelementStart(
|
|
523
|
-
i0.ɵɵlistener("input", function
|
|
698
|
+
i0.ɵɵelementStart(38, "div", 77)(39, "div", 78);
|
|
699
|
+
i0.ɵɵelement(40, "i", 79);
|
|
700
|
+
i0.ɵɵelementStart(41, "input", 80);
|
|
701
|
+
i0.ɵɵlistener("input", function ConnectionsComponent_Conditional_2_Conditional_2_Template_input_input_41_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDetailSearch($event)); });
|
|
524
702
|
i0.ɵɵelementEnd()();
|
|
525
|
-
i0.ɵɵelementStart(
|
|
526
|
-
i0.ɵɵlistener("click", function
|
|
527
|
-
i0.ɵɵelement(
|
|
528
|
-
i0.ɵɵtext(
|
|
703
|
+
i0.ɵɵelementStart(42, "button", 81);
|
|
704
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_42_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleAutoMapPanel()); });
|
|
705
|
+
i0.ɵɵelement(43, "i", 82);
|
|
706
|
+
i0.ɵɵtext(44, " Auto-Map Schema ");
|
|
707
|
+
i0.ɵɵelementEnd();
|
|
708
|
+
i0.ɵɵelementStart(45, "button", 81);
|
|
709
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_2_Conditional_2_Template_button_click_45_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleAddMapPanel()); });
|
|
710
|
+
i0.ɵɵelement(46, "i", 12);
|
|
711
|
+
i0.ɵɵtext(47, " Add Map ");
|
|
529
712
|
i0.ɵɵelementEnd()()();
|
|
530
|
-
i0.ɵɵconditionalCreate(
|
|
531
|
-
i0.ɵɵconditionalCreate(
|
|
713
|
+
i0.ɵɵconditionalCreate(48, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_48_Template, 5, 6, "div", 83);
|
|
714
|
+
i0.ɵɵconditionalCreate(49, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_49_Template, 31, 11, "div", 84);
|
|
715
|
+
i0.ɵɵconditionalCreate(50, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_50_Template, 33, 16, "div", 84);
|
|
716
|
+
i0.ɵɵconditionalCreate(51, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_51_Template, 2, 0, "div", 13)(52, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_52_Template, 9, 0, "div", 85)(53, ConnectionsComponent_Conditional_2_Conditional_2_Conditional_53_Template, 14, 1);
|
|
532
717
|
} if (rf & 2) {
|
|
533
718
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
534
719
|
i0.ɵɵadvance(4);
|
|
@@ -547,6 +732,10 @@ function ConnectionsComponent_Conditional_2_Conditional_2_Template(rf, ctx) { if
|
|
|
547
732
|
i0.ɵɵtextInterpolate(ctx_r1.GetStatusBadge(ctx_r1.SelectedSummary));
|
|
548
733
|
i0.ɵɵadvance(4);
|
|
549
734
|
i0.ɵɵconditional(ctx_r1.IsConnectionActive(ctx_r1.SelectedSummary) ? 21 : -1);
|
|
735
|
+
i0.ɵɵadvance(7);
|
|
736
|
+
i0.ɵɵconditional(ctx_r1.ScheduledJobID ? 28 : 29);
|
|
737
|
+
i0.ɵɵadvance(2);
|
|
738
|
+
i0.ɵɵproperty("IsOpen", ctx_r1.ShowScheduleSlidePanel)("ScheduledJobID", ctx_r1.ScheduledJobID)("JobTypeID", ctx_r1.IntegrationSyncJobTypeID)("DefaultConfiguration", ctx_r1.ScheduleDefaultConfiguration)("HideJobType", true);
|
|
550
739
|
i0.ɵɵadvance(4);
|
|
551
740
|
i0.ɵɵtextInterpolate2(" ", ctx_r1.DetailEntityMaps.length, " entity map", ctx_r1.DetailEntityMaps.length !== 1 ? "s" : "", " ");
|
|
552
741
|
i0.ɵɵadvance(3);
|
|
@@ -554,15 +743,21 @@ function ConnectionsComponent_Conditional_2_Conditional_2_Template(rf, ctx) { if
|
|
|
554
743
|
i0.ɵɵadvance(4);
|
|
555
744
|
i0.ɵɵproperty("value", ctx_r1.DetailSearchTerm);
|
|
556
745
|
i0.ɵɵadvance();
|
|
746
|
+
i0.ɵɵclassProp("active", ctx_r1.ShowAutoMapPanel);
|
|
747
|
+
i0.ɵɵadvance(3);
|
|
557
748
|
i0.ɵɵclassProp("active", ctx_r1.ShowAddMapPanel);
|
|
558
749
|
i0.ɵɵadvance(3);
|
|
559
|
-
i0.ɵɵconditional(ctx_r1.
|
|
750
|
+
i0.ɵɵconditional(ctx_r1.SyncResult ? 48 : -1);
|
|
751
|
+
i0.ɵɵadvance();
|
|
752
|
+
i0.ɵɵconditional(ctx_r1.ShowAutoMapPanel ? 49 : -1);
|
|
753
|
+
i0.ɵɵadvance();
|
|
754
|
+
i0.ɵɵconditional(ctx_r1.ShowAddMapPanel ? 50 : -1);
|
|
560
755
|
i0.ɵɵadvance();
|
|
561
|
-
i0.ɵɵconditional(ctx_r1.IsDetailLoading ?
|
|
756
|
+
i0.ɵɵconditional(ctx_r1.IsDetailLoading ? 51 : ctx_r1.DetailEntityMaps.length === 0 && !ctx_r1.ShowAddMapPanel ? 52 : ctx_r1.DetailEntityMaps.length > 0 ? 53 : -1);
|
|
562
757
|
} }
|
|
563
758
|
function ConnectionsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
564
759
|
i0.ɵɵelementStart(0, "div", 2);
|
|
565
|
-
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_2_Conditional_1_Template, 1, 3, "app-visual-field-editor",
|
|
760
|
+
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_2_Conditional_1_Template, 1, 3, "app-visual-field-editor", 55)(2, ConnectionsComponent_Conditional_2_Conditional_2_Template, 54, 29);
|
|
566
761
|
i0.ɵɵelementEnd();
|
|
567
762
|
} if (rf & 2) {
|
|
568
763
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -570,94 +765,94 @@ function ConnectionsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
|
570
765
|
i0.ɵɵconditional(ctx_r1.EditorEntityMap ? 1 : 2);
|
|
571
766
|
} }
|
|
572
767
|
function ConnectionsComponent_Conditional_3_For_9_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
573
|
-
i0.ɵɵelement(0, "i",
|
|
768
|
+
i0.ɵɵelement(0, "i", 122);
|
|
574
769
|
} }
|
|
575
770
|
function ConnectionsComponent_Conditional_3_For_9_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
576
771
|
i0.ɵɵtext(0);
|
|
577
772
|
} if (rf & 2) {
|
|
578
|
-
const
|
|
579
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
773
|
+
const step_r25 = i0.ɵɵnextContext().$implicit;
|
|
774
|
+
i0.ɵɵtextInterpolate1(" ", step_r25.Number, " ");
|
|
580
775
|
} }
|
|
581
776
|
function ConnectionsComponent_Conditional_3_For_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
582
|
-
i0.ɵɵelement(0, "div",
|
|
777
|
+
i0.ɵɵelement(0, "div", 162);
|
|
583
778
|
} if (rf & 2) {
|
|
584
|
-
const
|
|
779
|
+
const step_r25 = i0.ɵɵnextContext().$implicit;
|
|
585
780
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
586
|
-
i0.ɵɵclassProp("step-line-active", ctx_r1.IsStepCompleted(
|
|
781
|
+
i0.ɵɵclassProp("step-line-active", ctx_r1.IsStepCompleted(step_r25.Number));
|
|
587
782
|
} }
|
|
588
783
|
function ConnectionsComponent_Conditional_3_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
589
|
-
i0.ɵɵelementStart(0, "div",
|
|
590
|
-
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_3_For_9_Conditional_2_Template, 1, 0, "i",
|
|
784
|
+
i0.ɵɵelementStart(0, "div", 158)(1, "div", 159);
|
|
785
|
+
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_3_For_9_Conditional_2_Template, 1, 0, "i", 122)(3, ConnectionsComponent_Conditional_3_For_9_Conditional_3_Template, 1, 1);
|
|
591
786
|
i0.ɵɵelementEnd();
|
|
592
|
-
i0.ɵɵelementStart(4, "span",
|
|
787
|
+
i0.ɵɵelementStart(4, "span", 160);
|
|
593
788
|
i0.ɵɵtext(5);
|
|
594
789
|
i0.ɵɵelementEnd()();
|
|
595
|
-
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_For_9_Conditional_6_Template, 1, 2, "div",
|
|
790
|
+
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_For_9_Conditional_6_Template, 1, 2, "div", 161);
|
|
596
791
|
} if (rf & 2) {
|
|
597
|
-
const
|
|
792
|
+
const step_r25 = ctx.$implicit;
|
|
598
793
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
599
|
-
i0.ɵɵclassProp("step-active", ctx_r1.IsStepActive(
|
|
794
|
+
i0.ɵɵclassProp("step-active", ctx_r1.IsStepActive(step_r25.Number))("step-completed", ctx_r1.IsStepCompleted(step_r25.Number));
|
|
600
795
|
i0.ɵɵadvance(2);
|
|
601
|
-
i0.ɵɵconditional(ctx_r1.IsStepCompleted(
|
|
796
|
+
i0.ɵɵconditional(ctx_r1.IsStepCompleted(step_r25.Number) ? 2 : 3);
|
|
602
797
|
i0.ɵɵadvance(3);
|
|
603
|
-
i0.ɵɵtextInterpolate(
|
|
798
|
+
i0.ɵɵtextInterpolate(step_r25.Label);
|
|
604
799
|
i0.ɵɵadvance();
|
|
605
|
-
i0.ɵɵconditional(
|
|
800
|
+
i0.ɵɵconditional(step_r25.Number < ctx_r1.WizardSteps.length ? 6 : -1);
|
|
606
801
|
} }
|
|
607
802
|
function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
608
|
-
i0.ɵɵelementStart(0, "div",
|
|
609
|
-
i0.ɵɵelement(1, "i",
|
|
803
|
+
i0.ɵɵelementStart(0, "div", 167);
|
|
804
|
+
i0.ɵɵelement(1, "i", 169);
|
|
610
805
|
i0.ɵɵelementStart(2, "p");
|
|
611
806
|
i0.ɵɵtext(3, "No integrations configured");
|
|
612
807
|
i0.ɵɵelementEnd();
|
|
613
|
-
i0.ɵɵelementStart(4, "span",
|
|
808
|
+
i0.ɵɵelementStart(4, "span", 170);
|
|
614
809
|
i0.ɵɵtext(5, "Configure integration definitions in the admin area first.");
|
|
615
810
|
i0.ɵɵelementEnd()();
|
|
616
811
|
} }
|
|
617
812
|
function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
618
|
-
i0.ɵɵelementStart(0, "div",
|
|
619
|
-
i0.ɵɵelement(1, "i",
|
|
813
|
+
i0.ɵɵelementStart(0, "div", 167);
|
|
814
|
+
i0.ɵɵelement(1, "i", 171);
|
|
620
815
|
i0.ɵɵelementStart(2, "p");
|
|
621
816
|
i0.ɵɵtext(3, "No matching integrations");
|
|
622
817
|
i0.ɵɵelementEnd()();
|
|
623
818
|
} }
|
|
624
819
|
function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
625
|
-
i0.ɵɵelementStart(0, "div",
|
|
820
|
+
i0.ɵɵelementStart(0, "div", 176);
|
|
626
821
|
i0.ɵɵtext(1);
|
|
627
822
|
i0.ɵɵelementEnd();
|
|
628
823
|
} if (rf & 2) {
|
|
629
|
-
const
|
|
824
|
+
const def_r28 = i0.ɵɵnextContext().$implicit;
|
|
630
825
|
i0.ɵɵadvance();
|
|
631
|
-
i0.ɵɵtextInterpolate(
|
|
826
|
+
i0.ɵɵtextInterpolate(def_r28.Description);
|
|
632
827
|
} }
|
|
633
828
|
function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
634
|
-
const
|
|
635
|
-
i0.ɵɵelementStart(0, "div",
|
|
636
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Template_div_click_0_listener() { const
|
|
637
|
-
i0.ɵɵelementStart(1, "div",
|
|
829
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
830
|
+
i0.ɵɵelementStart(0, "div", 173);
|
|
831
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Template_div_click_0_listener() { const def_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectIntegration(def_r28)); });
|
|
832
|
+
i0.ɵɵelementStart(1, "div", 174);
|
|
638
833
|
i0.ɵɵelement(2, "i");
|
|
639
834
|
i0.ɵɵelementEnd();
|
|
640
|
-
i0.ɵɵelementStart(3, "div",
|
|
835
|
+
i0.ɵɵelementStart(3, "div", 175);
|
|
641
836
|
i0.ɵɵtext(4);
|
|
642
837
|
i0.ɵɵelementEnd();
|
|
643
|
-
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Conditional_5_Template, 2, 1, "div",
|
|
838
|
+
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Conditional_5_Template, 2, 1, "div", 176);
|
|
644
839
|
i0.ɵɵelementEnd();
|
|
645
840
|
} if (rf & 2) {
|
|
646
|
-
const
|
|
841
|
+
const def_r28 = ctx.$implicit;
|
|
647
842
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
648
|
-
i0.ɵɵclassProp("picker-selected", ctx_r1.IsSelectedIntegration(
|
|
843
|
+
i0.ɵɵclassProp("picker-selected", ctx_r1.IsSelectedIntegration(def_r28));
|
|
649
844
|
i0.ɵɵadvance();
|
|
650
|
-
i0.ɵɵstyleProp("background-color", ctx_r1.GetIconBrandColor(
|
|
845
|
+
i0.ɵɵstyleProp("background-color", ctx_r1.GetIconBrandColor(def_r28.Name));
|
|
651
846
|
i0.ɵɵadvance();
|
|
652
|
-
i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(
|
|
847
|
+
i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(def_r28.Name, def_r28.Get("Icon")));
|
|
653
848
|
i0.ɵɵadvance(2);
|
|
654
|
-
i0.ɵɵtextInterpolate(
|
|
849
|
+
i0.ɵɵtextInterpolate(def_r28.Name);
|
|
655
850
|
i0.ɵɵadvance();
|
|
656
|
-
i0.ɵɵconditional(
|
|
851
|
+
i0.ɵɵconditional(def_r28.Description ? 5 : -1);
|
|
657
852
|
} }
|
|
658
853
|
function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
659
|
-
i0.ɵɵelementStart(0, "div",
|
|
660
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Template, 6, 8, "div",
|
|
854
|
+
i0.ɵɵelementStart(0, "div", 168);
|
|
855
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_For_2_Template, 6, 8, "div", 172, _forTrack2);
|
|
661
856
|
i0.ɵɵelementEnd();
|
|
662
857
|
} if (rf & 2) {
|
|
663
858
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -665,16 +860,16 @@ function ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_Templat
|
|
|
665
860
|
i0.ɵɵrepeater(ctx_r1.FilteredIntegrations);
|
|
666
861
|
} }
|
|
667
862
|
function ConnectionsComponent_Conditional_3_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
668
|
-
const
|
|
669
|
-
i0.ɵɵelementStart(0, "div",
|
|
863
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
864
|
+
i0.ɵɵelementStart(0, "div", 152)(1, "h3", 163);
|
|
670
865
|
i0.ɵɵtext(2, "What system do you want to connect?");
|
|
671
866
|
i0.ɵɵelementEnd();
|
|
672
|
-
i0.ɵɵelementStart(3, "div",
|
|
673
|
-
i0.ɵɵelement(4, "i",
|
|
674
|
-
i0.ɵɵelementStart(5, "input",
|
|
675
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_11_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(
|
|
867
|
+
i0.ɵɵelementStart(3, "div", 164);
|
|
868
|
+
i0.ɵɵelement(4, "i", 165);
|
|
869
|
+
i0.ɵɵelementStart(5, "input", 166);
|
|
870
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_11_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.SearchQuery, $event) || (ctx_r1.SearchQuery = $event); return i0.ɵɵresetView($event); });
|
|
676
871
|
i0.ɵɵelementEnd()();
|
|
677
|
-
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_6_Template, 6, 0, "div",
|
|
872
|
+
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_6_Template, 6, 0, "div", 167)(7, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_7_Template, 4, 0, "div", 167)(8, ConnectionsComponent_Conditional_3_Conditional_11_Conditional_8_Template, 3, 0, "div", 168);
|
|
678
873
|
i0.ɵɵelementEnd();
|
|
679
874
|
} if (rf & 2) {
|
|
680
875
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -684,23 +879,23 @@ function ConnectionsComponent_Conditional_3_Conditional_11_Template(rf, ctx) { i
|
|
|
684
879
|
i0.ɵɵconditional(ctx_r1.FilteredIntegrations.length === 0 && ctx_r1.AvailableIntegrations.length === 0 ? 6 : ctx_r1.FilteredIntegrations.length === 0 ? 7 : 8);
|
|
685
880
|
} }
|
|
686
881
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
687
|
-
i0.ɵɵelementStart(0, "option",
|
|
882
|
+
i0.ɵɵelementStart(0, "option", 96);
|
|
688
883
|
i0.ɵɵtext(1);
|
|
689
884
|
i0.ɵɵelementEnd();
|
|
690
885
|
} if (rf & 2) {
|
|
691
|
-
const
|
|
692
|
-
i0.ɵɵproperty("value",
|
|
886
|
+
const company_r31 = ctx.$implicit;
|
|
887
|
+
i0.ɵɵproperty("value", company_r31.ID);
|
|
693
888
|
i0.ɵɵadvance();
|
|
694
|
-
i0.ɵɵtextInterpolate(
|
|
889
|
+
i0.ɵɵtextInterpolate(company_r31.Name);
|
|
695
890
|
} }
|
|
696
891
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
697
|
-
const
|
|
698
|
-
i0.ɵɵelementStart(0, "select",
|
|
699
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(
|
|
700
|
-
i0.ɵɵelementStart(1, "option",
|
|
892
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
893
|
+
i0.ɵɵelementStart(0, "select", 192);
|
|
894
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedCompanyID, $event) || (ctx_r1.SelectedCompanyID = $event); return i0.ɵɵresetView($event); });
|
|
895
|
+
i0.ɵɵelementStart(1, "option", 95);
|
|
701
896
|
i0.ɵɵtext(2, "Select a company...");
|
|
702
897
|
i0.ɵɵelementEnd();
|
|
703
|
-
i0.ɵɵrepeaterCreate(3, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_For_4_Template, 2, 2, "option",
|
|
898
|
+
i0.ɵɵrepeaterCreate(3, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_For_4_Template, 2, 2, "option", 96, _forTrack2);
|
|
704
899
|
i0.ɵɵelementEnd();
|
|
705
900
|
} if (rf & 2) {
|
|
706
901
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -711,26 +906,26 @@ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Templa
|
|
|
711
906
|
i0.ɵɵrepeater(ctx_r1.Companies);
|
|
712
907
|
} }
|
|
713
908
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
714
|
-
i0.ɵɵelement(0, "input",
|
|
909
|
+
i0.ɵɵelement(0, "input", 182);
|
|
715
910
|
} if (rf & 2) {
|
|
716
911
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
717
912
|
i0.ɵɵproperty("value", ctx_r1.Companies[0].Name);
|
|
718
913
|
} }
|
|
719
914
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
720
|
-
i0.ɵɵelementStart(0, "div",
|
|
915
|
+
i0.ɵɵelementStart(0, "div", 183);
|
|
721
916
|
i0.ɵɵtext(1, "No companies available. Create one in the admin area.");
|
|
722
917
|
i0.ɵɵelementEnd();
|
|
723
918
|
} }
|
|
724
919
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
725
|
-
const
|
|
726
|
-
i0.ɵɵelementStart(0, "div",
|
|
727
|
-
i0.ɵɵelement(2, "i",
|
|
920
|
+
const _r32 = i0.ɵɵgetCurrentView();
|
|
921
|
+
i0.ɵɵelementStart(0, "div", 188)(1, "div", 193);
|
|
922
|
+
i0.ɵɵelement(2, "i", 194);
|
|
728
923
|
i0.ɵɵelementStart(3, "span");
|
|
729
924
|
i0.ɵɵtext(4);
|
|
730
925
|
i0.ɵɵelementEnd()();
|
|
731
|
-
i0.ɵɵelementStart(5, "button",
|
|
732
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Template_button_click_5_listener() { i0.ɵɵrestoreView(
|
|
733
|
-
i0.ɵɵelement(6, "i",
|
|
926
|
+
i0.ɵɵelementStart(5, "button", 195);
|
|
927
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ClearCredential()); });
|
|
928
|
+
i0.ɵɵelement(6, "i", 107);
|
|
734
929
|
i0.ɵɵelementEnd()();
|
|
735
930
|
} if (rf & 2) {
|
|
736
931
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -738,39 +933,39 @@ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Templa
|
|
|
738
933
|
i0.ɵɵtextInterpolate(ctx_r1.SelectedCredential.Name);
|
|
739
934
|
} }
|
|
740
935
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
741
|
-
const
|
|
742
|
-
i0.ɵɵelementStart(0, "div",
|
|
743
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
744
|
-
i0.ɵɵelement(2, "i",
|
|
936
|
+
const _r33 = i0.ɵɵgetCurrentView();
|
|
937
|
+
i0.ɵɵelementStart(0, "div", 189)(1, "button", 42);
|
|
938
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ShowExistingCredentials()); });
|
|
939
|
+
i0.ɵɵelement(2, "i", 194);
|
|
745
940
|
i0.ɵɵtext(3, " Choose Existing Credential ");
|
|
746
941
|
i0.ɵɵelementEnd();
|
|
747
942
|
i0.ɵɵelementStart(4, "button", 42);
|
|
748
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template_button_click_4_listener() { i0.ɵɵrestoreView(
|
|
943
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenCredentialDialog()); });
|
|
749
944
|
i0.ɵɵelement(5, "i", 12);
|
|
750
945
|
i0.ɵɵtext(6, " Create New Credential ");
|
|
751
946
|
i0.ɵɵelementEnd()();
|
|
752
947
|
} }
|
|
753
948
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
754
|
-
i0.ɵɵelementStart(0, "div",
|
|
755
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
949
|
+
i0.ɵɵelementStart(0, "div", 190);
|
|
950
|
+
i0.ɵɵelement(1, "mj-loading", 196);
|
|
756
951
|
i0.ɵɵelementEnd();
|
|
757
952
|
} }
|
|
758
953
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
759
|
-
const
|
|
760
|
-
i0.ɵɵelementStart(0, "div",
|
|
761
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_For_2_Template_div_click_0_listener() { const
|
|
762
|
-
i0.ɵɵelement(1, "i",
|
|
954
|
+
const _r34 = i0.ɵɵgetCurrentView();
|
|
955
|
+
i0.ɵɵelementStart(0, "div", 198);
|
|
956
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_For_2_Template_div_click_0_listener() { const cred_r35 = i0.ɵɵrestoreView(_r34).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.SelectExistingCredential(cred_r35)); });
|
|
957
|
+
i0.ɵɵelement(1, "i", 194);
|
|
763
958
|
i0.ɵɵelementStart(2, "span");
|
|
764
959
|
i0.ɵɵtext(3);
|
|
765
960
|
i0.ɵɵelementEnd()();
|
|
766
961
|
} if (rf & 2) {
|
|
767
|
-
const
|
|
962
|
+
const cred_r35 = ctx.$implicit;
|
|
768
963
|
i0.ɵɵadvance(3);
|
|
769
|
-
i0.ɵɵtextInterpolate(
|
|
964
|
+
i0.ɵɵtextInterpolate(cred_r35.Name);
|
|
770
965
|
} }
|
|
771
966
|
function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
772
|
-
i0.ɵɵelementStart(0, "div",
|
|
773
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_For_2_Template, 4, 1, "div",
|
|
967
|
+
i0.ɵɵelementStart(0, "div", 191);
|
|
968
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_For_2_Template, 4, 1, "div", 197, _forTrack2);
|
|
774
969
|
i0.ɵɵelementEnd();
|
|
775
970
|
} if (rf & 2) {
|
|
776
971
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -778,35 +973,35 @@ function ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_Templa
|
|
|
778
973
|
i0.ɵɵrepeater(ctx_r1.ExistingCredentials);
|
|
779
974
|
} }
|
|
780
975
|
function ConnectionsComponent_Conditional_3_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
781
|
-
const
|
|
782
|
-
i0.ɵɵelementStart(0, "div",
|
|
976
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
977
|
+
i0.ɵɵelementStart(0, "div", 152)(1, "h3", 163);
|
|
783
978
|
i0.ɵɵtext(2, "Set up your connection");
|
|
784
979
|
i0.ɵɵelementEnd();
|
|
785
|
-
i0.ɵɵelementStart(3, "div",
|
|
980
|
+
i0.ɵɵelementStart(3, "div", 177)(4, "label", 178);
|
|
786
981
|
i0.ɵɵtext(5, "Connection Name");
|
|
787
982
|
i0.ɵɵelementEnd();
|
|
788
|
-
i0.ɵɵelementStart(6, "input",
|
|
789
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(
|
|
983
|
+
i0.ɵɵelementStart(6, "input", 179);
|
|
984
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ConnectionName, $event) || (ctx_r1.ConnectionName = $event); return i0.ɵɵresetView($event); });
|
|
790
985
|
i0.ɵɵelementEnd()();
|
|
791
|
-
i0.ɵɵelementStart(7, "div",
|
|
986
|
+
i0.ɵɵelementStart(7, "div", 177)(8, "label", 180);
|
|
792
987
|
i0.ɵɵtext(9, "Company");
|
|
793
988
|
i0.ɵɵelementEnd();
|
|
794
|
-
i0.ɵɵconditionalCreate(10, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Template, 5, 2, "select",
|
|
989
|
+
i0.ɵɵconditionalCreate(10, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_10_Template, 5, 2, "select", 181)(11, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_11_Template, 1, 1, "input", 182)(12, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_12_Template, 2, 0, "div", 183);
|
|
795
990
|
i0.ɵɵelementEnd();
|
|
796
|
-
i0.ɵɵelementStart(13, "div",
|
|
991
|
+
i0.ɵɵelementStart(13, "div", 177)(14, "label", 184);
|
|
797
992
|
i0.ɵɵtext(15, "Description ");
|
|
798
|
-
i0.ɵɵelementStart(16, "span",
|
|
993
|
+
i0.ɵɵelementStart(16, "span", 185);
|
|
799
994
|
i0.ɵɵtext(17, "(optional)");
|
|
800
995
|
i0.ɵɵelementEnd()();
|
|
801
|
-
i0.ɵɵelementStart(18, "textarea",
|
|
802
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Template_textarea_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(
|
|
996
|
+
i0.ɵɵelementStart(18, "textarea", 186);
|
|
997
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_3_Conditional_12_Template_textarea_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ConnectionDescription, $event) || (ctx_r1.ConnectionDescription = $event); return i0.ɵɵresetView($event); });
|
|
803
998
|
i0.ɵɵelementEnd()();
|
|
804
|
-
i0.ɵɵelementStart(19, "div",
|
|
999
|
+
i0.ɵɵelementStart(19, "div", 177)(20, "label", 187);
|
|
805
1000
|
i0.ɵɵtext(21, "Credential");
|
|
806
1001
|
i0.ɵɵelementEnd();
|
|
807
|
-
i0.ɵɵconditionalCreate(22, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Template, 7, 1, "div",
|
|
808
|
-
i0.ɵɵconditionalCreate(24, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_24_Template, 2, 0, "div",
|
|
809
|
-
i0.ɵɵconditionalCreate(25, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_Template, 3, 0, "div",
|
|
1002
|
+
i0.ɵɵconditionalCreate(22, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_22_Template, 7, 1, "div", 188)(23, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_23_Template, 7, 0, "div", 189);
|
|
1003
|
+
i0.ɵɵconditionalCreate(24, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_24_Template, 2, 0, "div", 190);
|
|
1004
|
+
i0.ɵɵconditionalCreate(25, ConnectionsComponent_Conditional_3_Conditional_12_Conditional_25_Template, 3, 0, "div", 191);
|
|
810
1005
|
i0.ɵɵelementEnd()();
|
|
811
1006
|
} if (rf & 2) {
|
|
812
1007
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -824,32 +1019,32 @@ function ConnectionsComponent_Conditional_3_Conditional_12_Template(rf, ctx) { i
|
|
|
824
1019
|
i0.ɵɵconditional(!ctx_r1.IsLoadingCredentials && ctx_r1.ExistingCredentials.length > 0 && !ctx_r1.SelectedCredential ? 25 : -1);
|
|
825
1020
|
} }
|
|
826
1021
|
function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
827
|
-
const
|
|
828
|
-
i0.ɵɵelementStart(0, "div",
|
|
829
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
830
|
-
i0.ɵɵelement(2, "i",
|
|
1022
|
+
const _r36 = i0.ɵɵgetCurrentView();
|
|
1023
|
+
i0.ɵɵelementStart(0, "div", 199)(1, "button", 202);
|
|
1024
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.TestNewConnection()); });
|
|
1025
|
+
i0.ɵɵelement(2, "i", 203);
|
|
831
1026
|
i0.ɵɵtext(3, " Test Connection ");
|
|
832
1027
|
i0.ɵɵelementEnd();
|
|
833
|
-
i0.ɵɵelementStart(4, "p",
|
|
1028
|
+
i0.ɵɵelementStart(4, "p", 204);
|
|
834
1029
|
i0.ɵɵtext(5, "We'll verify we can reach your system and authenticate.");
|
|
835
1030
|
i0.ɵɵelementEnd()();
|
|
836
1031
|
} }
|
|
837
1032
|
function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
838
|
-
i0.ɵɵelementStart(0, "div",
|
|
839
|
-
i0.ɵɵelement(2, "i",
|
|
1033
|
+
i0.ɵɵelementStart(0, "div", 200)(1, "div", 205);
|
|
1034
|
+
i0.ɵɵelement(2, "i", 206);
|
|
840
1035
|
i0.ɵɵelementEnd();
|
|
841
1036
|
i0.ɵɵelementStart(3, "p");
|
|
842
1037
|
i0.ɵɵtext(4, "Testing connection...");
|
|
843
1038
|
i0.ɵɵelementEnd()();
|
|
844
1039
|
} }
|
|
845
1040
|
function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
846
|
-
i0.ɵɵelement(0, "i",
|
|
1041
|
+
i0.ɵɵelement(0, "i", 47);
|
|
847
1042
|
} }
|
|
848
1043
|
function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
849
|
-
i0.ɵɵelement(0, "i",
|
|
1044
|
+
i0.ɵɵelement(0, "i", 48);
|
|
850
1045
|
} }
|
|
851
1046
|
function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
852
|
-
i0.ɵɵelementStart(0, "div",
|
|
1047
|
+
i0.ɵɵelementStart(0, "div", 210);
|
|
853
1048
|
i0.ɵɵtext(1);
|
|
854
1049
|
i0.ɵɵelementEnd();
|
|
855
1050
|
} if (rf & 2) {
|
|
@@ -858,22 +1053,22 @@ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditi
|
|
|
858
1053
|
i0.ɵɵtextInterpolate1(" Server version: ", ctx_r1.TestResult.ServerVersion, " ");
|
|
859
1054
|
} }
|
|
860
1055
|
function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
861
|
-
const
|
|
862
|
-
i0.ɵɵelementStart(0, "button",
|
|
863
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
864
|
-
i0.ɵɵelement(1, "i",
|
|
1056
|
+
const _r37 = i0.ɵɵgetCurrentView();
|
|
1057
|
+
i0.ɵɵelementStart(0, "button", 212);
|
|
1058
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.TestNewConnection()); });
|
|
1059
|
+
i0.ɵɵelement(1, "i", 213);
|
|
865
1060
|
i0.ɵɵtext(2, " Retry ");
|
|
866
1061
|
i0.ɵɵelementEnd();
|
|
867
1062
|
} }
|
|
868
1063
|
function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
869
|
-
i0.ɵɵelementStart(0, "div",
|
|
870
|
-
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_2_Template, 1, 0, "i",
|
|
1064
|
+
i0.ɵɵelementStart(0, "div", 207)(1, "div", 208);
|
|
1065
|
+
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_2_Template, 1, 0, "i", 47)(3, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_3_Template, 1, 0, "i", 48);
|
|
871
1066
|
i0.ɵɵelementEnd();
|
|
872
|
-
i0.ɵɵelementStart(4, "div",
|
|
1067
|
+
i0.ɵɵelementStart(4, "div", 209);
|
|
873
1068
|
i0.ɵɵtext(5);
|
|
874
1069
|
i0.ɵɵelementEnd();
|
|
875
|
-
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_6_Template, 2, 1, "div",
|
|
876
|
-
i0.ɵɵconditionalCreate(7, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_7_Template, 3, 0, "button",
|
|
1070
|
+
i0.ɵɵconditionalCreate(6, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_6_Template, 2, 1, "div", 210);
|
|
1071
|
+
i0.ɵɵconditionalCreate(7, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Conditional_7_Template, 3, 0, "button", 211);
|
|
877
1072
|
i0.ɵɵelementEnd();
|
|
878
1073
|
} if (rf & 2) {
|
|
879
1074
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -888,12 +1083,12 @@ function ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Templat
|
|
|
888
1083
|
i0.ɵɵconditional(!ctx_r1.TestResult.Success ? 7 : -1);
|
|
889
1084
|
} }
|
|
890
1085
|
function ConnectionsComponent_Conditional_3_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
891
|
-
i0.ɵɵelementStart(0, "div",
|
|
1086
|
+
i0.ɵɵelementStart(0, "div", 153)(1, "h3", 163);
|
|
892
1087
|
i0.ɵɵtext(2, "Let's verify everything works");
|
|
893
1088
|
i0.ɵɵelementEnd();
|
|
894
|
-
i0.ɵɵconditionalCreate(3, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_3_Template, 6, 0, "div",
|
|
895
|
-
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_4_Template, 5, 0, "div",
|
|
896
|
-
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Template, 8, 8, "div",
|
|
1089
|
+
i0.ɵɵconditionalCreate(3, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_3_Template, 6, 0, "div", 199);
|
|
1090
|
+
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_4_Template, 5, 0, "div", 200);
|
|
1091
|
+
i0.ɵɵconditionalCreate(5, ConnectionsComponent_Conditional_3_Conditional_13_Conditional_5_Template, 8, 8, "div", 201);
|
|
897
1092
|
i0.ɵɵelementEnd();
|
|
898
1093
|
} if (rf & 2) {
|
|
899
1094
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -905,9 +1100,9 @@ function ConnectionsComponent_Conditional_3_Conditional_13_Template(rf, ctx) { i
|
|
|
905
1100
|
i0.ɵɵconditional(ctx_r1.TestResult ? 5 : -1);
|
|
906
1101
|
} }
|
|
907
1102
|
function ConnectionsComponent_Conditional_3_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
908
|
-
const
|
|
1103
|
+
const _r38 = i0.ɵɵgetCurrentView();
|
|
909
1104
|
i0.ɵɵelementStart(0, "button", 42);
|
|
910
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_17_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
1105
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Conditional_17_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r38); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.PreviousStep()); });
|
|
911
1106
|
i0.ɵɵtext(1, " Back ");
|
|
912
1107
|
i0.ɵɵelementEnd();
|
|
913
1108
|
} }
|
|
@@ -922,29 +1117,29 @@ function ConnectionsComponent_Conditional_3_Conditional_20_Template(rf, ctx) { i
|
|
|
922
1117
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.NextButtonLabel, " ");
|
|
923
1118
|
} }
|
|
924
1119
|
function ConnectionsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
925
|
-
const
|
|
926
|
-
i0.ɵɵelementStart(0, "div", 3)(1, "div",
|
|
927
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Template_button_click_2_listener() { i0.ɵɵrestoreView(
|
|
928
|
-
i0.ɵɵelement(3, "i",
|
|
1120
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
1121
|
+
i0.ɵɵelementStart(0, "div", 3)(1, "div", 147)(2, "button", 148);
|
|
1122
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseWizard()); });
|
|
1123
|
+
i0.ɵɵelement(3, "i", 59);
|
|
929
1124
|
i0.ɵɵtext(4, " Back to Integrations ");
|
|
930
1125
|
i0.ɵɵelementEnd();
|
|
931
|
-
i0.ɵɵelementStart(5, "h2",
|
|
1126
|
+
i0.ɵɵelementStart(5, "h2", 149);
|
|
932
1127
|
i0.ɵɵtext(6, "New Integration");
|
|
933
1128
|
i0.ɵɵelementEnd()();
|
|
934
|
-
i0.ɵɵelementStart(7, "div",
|
|
1129
|
+
i0.ɵɵelementStart(7, "div", 150);
|
|
935
1130
|
i0.ɵɵrepeaterCreate(8, ConnectionsComponent_Conditional_3_For_9_Template, 7, 7, null, null, _forTrack3);
|
|
936
1131
|
i0.ɵɵelementEnd();
|
|
937
|
-
i0.ɵɵelementStart(10, "div",
|
|
938
|
-
i0.ɵɵconditionalCreate(11, ConnectionsComponent_Conditional_3_Conditional_11_Template, 9, 2, "div",
|
|
939
|
-
i0.ɵɵconditionalCreate(12, ConnectionsComponent_Conditional_3_Conditional_12_Template, 26, 6, "div",
|
|
940
|
-
i0.ɵɵconditionalCreate(13, ConnectionsComponent_Conditional_3_Conditional_13_Template, 6, 3, "div",
|
|
941
|
-
i0.ɵɵelementEnd();
|
|
942
|
-
i0.ɵɵelementStart(14, "div",
|
|
943
|
-
i0.ɵɵelement(15, "div",
|
|
944
|
-
i0.ɵɵelementStart(16, "div",
|
|
945
|
-
i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_3_Conditional_17_Template, 2, 0, "button",
|
|
946
|
-
i0.ɵɵelementStart(18, "button",
|
|
947
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Template_button_click_18_listener() { i0.ɵɵrestoreView(
|
|
1132
|
+
i0.ɵɵelementStart(10, "div", 151);
|
|
1133
|
+
i0.ɵɵconditionalCreate(11, ConnectionsComponent_Conditional_3_Conditional_11_Template, 9, 2, "div", 152);
|
|
1134
|
+
i0.ɵɵconditionalCreate(12, ConnectionsComponent_Conditional_3_Conditional_12_Template, 26, 6, "div", 152);
|
|
1135
|
+
i0.ɵɵconditionalCreate(13, ConnectionsComponent_Conditional_3_Conditional_13_Template, 6, 3, "div", 153);
|
|
1136
|
+
i0.ɵɵelementEnd();
|
|
1137
|
+
i0.ɵɵelementStart(14, "div", 154);
|
|
1138
|
+
i0.ɵɵelement(15, "div", 155);
|
|
1139
|
+
i0.ɵɵelementStart(16, "div", 156);
|
|
1140
|
+
i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_3_Conditional_17_Template, 2, 0, "button", 157);
|
|
1141
|
+
i0.ɵɵelementStart(18, "button", 54);
|
|
1142
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_3_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.FinishWizard()); });
|
|
948
1143
|
i0.ɵɵconditionalCreate(19, ConnectionsComponent_Conditional_3_Conditional_19_Template, 2, 0)(20, ConnectionsComponent_Conditional_3_Conditional_20_Template, 1, 1);
|
|
949
1144
|
i0.ɵɵelementEnd()()()();
|
|
950
1145
|
} if (rf & 2) {
|
|
@@ -965,20 +1160,20 @@ function ConnectionsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
|
965
1160
|
i0.ɵɵconditional(ctx_r1.IsSaving ? 19 : 20);
|
|
966
1161
|
} }
|
|
967
1162
|
function ConnectionsComponent_Conditional_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
968
|
-
i0.ɵɵelementStart(0, "div",
|
|
969
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
1163
|
+
i0.ɵɵelementStart(0, "div", 218);
|
|
1164
|
+
i0.ɵɵelement(1, "mj-loading", 219);
|
|
970
1165
|
i0.ɵɵelementEnd();
|
|
971
1166
|
} }
|
|
972
1167
|
function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
973
|
-
const
|
|
974
|
-
i0.ɵɵelementStart(0, "div",
|
|
975
|
-
i0.ɵɵelement(2, "i",
|
|
1168
|
+
const _r41 = i0.ɵɵgetCurrentView();
|
|
1169
|
+
i0.ɵɵelementStart(0, "div", 228)(1, "div", 231);
|
|
1170
|
+
i0.ɵɵelement(2, "i", 194);
|
|
976
1171
|
i0.ɵɵelementStart(3, "span");
|
|
977
1172
|
i0.ɵɵtext(4);
|
|
978
1173
|
i0.ɵɵelementEnd()();
|
|
979
|
-
i0.ɵɵelementStart(5, "button",
|
|
980
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Template_button_click_5_listener() { i0.ɵɵrestoreView(
|
|
981
|
-
i0.ɵɵelement(6, "i",
|
|
1174
|
+
i0.ɵɵelementStart(5, "button", 232);
|
|
1175
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r41); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ClearEditCredential()); });
|
|
1176
|
+
i0.ɵɵelement(6, "i", 107);
|
|
982
1177
|
i0.ɵɵelementEnd()();
|
|
983
1178
|
} if (rf & 2) {
|
|
984
1179
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -986,21 +1181,21 @@ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Templat
|
|
|
986
1181
|
i0.ɵɵtextInterpolate(ctx_r1.EditCredential.Name);
|
|
987
1182
|
} }
|
|
988
1183
|
function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
989
|
-
const
|
|
990
|
-
i0.ɵɵelementStart(0, "div",
|
|
991
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_For_2_Template_div_click_0_listener() { const
|
|
992
|
-
i0.ɵɵelement(1, "i",
|
|
1184
|
+
const _r43 = i0.ɵɵgetCurrentView();
|
|
1185
|
+
i0.ɵɵelementStart(0, "div", 237);
|
|
1186
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_For_2_Template_div_click_0_listener() { const cred_r44 = i0.ɵɵrestoreView(_r43).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.SelectEditCredential(cred_r44)); });
|
|
1187
|
+
i0.ɵɵelement(1, "i", 194);
|
|
993
1188
|
i0.ɵɵelementStart(2, "span");
|
|
994
1189
|
i0.ɵɵtext(3);
|
|
995
1190
|
i0.ɵɵelementEnd()();
|
|
996
1191
|
} if (rf & 2) {
|
|
997
|
-
const
|
|
1192
|
+
const cred_r44 = ctx.$implicit;
|
|
998
1193
|
i0.ɵɵadvance(3);
|
|
999
|
-
i0.ɵɵtextInterpolate(
|
|
1194
|
+
i0.ɵɵtextInterpolate(cred_r44.Name);
|
|
1000
1195
|
} }
|
|
1001
1196
|
function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
1002
|
-
i0.ɵɵelementStart(0, "div",
|
|
1003
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_For_2_Template, 4, 1, "div",
|
|
1197
|
+
i0.ɵɵelementStart(0, "div", 235);
|
|
1198
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_For_2_Template, 4, 1, "div", 236, _forTrack2);
|
|
1004
1199
|
i0.ɵɵelementEnd();
|
|
1005
1200
|
} if (rf & 2) {
|
|
1006
1201
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -1008,13 +1203,13 @@ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditi
|
|
|
1008
1203
|
i0.ɵɵrepeater(ctx_r1.EditCredentials);
|
|
1009
1204
|
} }
|
|
1010
1205
|
function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
1011
|
-
const
|
|
1012
|
-
i0.ɵɵelementStart(0, "div",
|
|
1013
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
1206
|
+
const _r42 = i0.ɵɵgetCurrentView();
|
|
1207
|
+
i0.ɵɵelementStart(0, "div", 233)(1, "button", 234);
|
|
1208
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r42); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenEditCredentialDialog()); });
|
|
1014
1209
|
i0.ɵɵelement(2, "i", 12);
|
|
1015
1210
|
i0.ɵɵtext(3, " New Credential ");
|
|
1016
1211
|
i0.ɵɵelementEnd()();
|
|
1017
|
-
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_Template, 3, 0, "div",
|
|
1212
|
+
i0.ɵɵconditionalCreate(4, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Conditional_4_Template, 3, 0, "div", 235);
|
|
1018
1213
|
} if (rf & 2) {
|
|
1019
1214
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1020
1215
|
i0.ɵɵadvance(4);
|
|
@@ -1028,47 +1223,47 @@ function ConnectionsComponent_Conditional_6_Conditional_9_Conditional_32_Templat
|
|
|
1028
1223
|
i0.ɵɵtext(0, " Save Changes ");
|
|
1029
1224
|
} }
|
|
1030
1225
|
function ConnectionsComponent_Conditional_6_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
1031
|
-
const
|
|
1032
|
-
i0.ɵɵelementStart(0, "div",
|
|
1226
|
+
const _r40 = i0.ɵɵgetCurrentView();
|
|
1227
|
+
i0.ɵɵelementStart(0, "div", 220)(1, "div", 221)(2, "label", 222);
|
|
1033
1228
|
i0.ɵɵtext(3, "Connection Name");
|
|
1034
1229
|
i0.ɵɵelementEnd();
|
|
1035
|
-
i0.ɵɵelementStart(4, "input",
|
|
1036
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_6_Conditional_9_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(
|
|
1230
|
+
i0.ɵɵelementStart(4, "input", 223);
|
|
1231
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_6_Conditional_9_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r40); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditName, $event) || (ctx_r1.EditName = $event); return i0.ɵɵresetView($event); });
|
|
1037
1232
|
i0.ɵɵelementEnd()();
|
|
1038
|
-
i0.ɵɵelementStart(5, "div",
|
|
1233
|
+
i0.ɵɵelementStart(5, "div", 221)(6, "label", 222);
|
|
1039
1234
|
i0.ɵɵtext(7, "Status");
|
|
1040
1235
|
i0.ɵɵelementEnd();
|
|
1041
|
-
i0.ɵɵelementStart(8, "div",
|
|
1042
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_6_Conditional_9_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(
|
|
1236
|
+
i0.ɵɵelementStart(8, "div", 224)(9, "label", 225)(10, "input", 226);
|
|
1237
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_6_Conditional_9_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r40); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditIsActive, $event) || (ctx_r1.EditIsActive = $event); return i0.ɵɵresetView($event); });
|
|
1043
1238
|
i0.ɵɵelementEnd();
|
|
1044
|
-
i0.ɵɵelement(11, "span",
|
|
1239
|
+
i0.ɵɵelement(11, "span", 139);
|
|
1045
1240
|
i0.ɵɵelementEnd();
|
|
1046
|
-
i0.ɵɵelementStart(12, "span",
|
|
1241
|
+
i0.ɵɵelementStart(12, "span", 227);
|
|
1047
1242
|
i0.ɵɵtext(13);
|
|
1048
1243
|
i0.ɵɵelementEnd()()();
|
|
1049
|
-
i0.ɵɵelementStart(14, "div",
|
|
1244
|
+
i0.ɵɵelementStart(14, "div", 221)(15, "label", 222);
|
|
1050
1245
|
i0.ɵɵtext(16, "Credential");
|
|
1051
1246
|
i0.ɵɵelementEnd();
|
|
1052
|
-
i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Template, 7, 1, "div",
|
|
1247
|
+
i0.ɵɵconditionalCreate(17, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_17_Template, 7, 1, "div", 228)(18, ConnectionsComponent_Conditional_6_Conditional_9_Conditional_18_Template, 5, 1);
|
|
1053
1248
|
i0.ɵɵelementEnd();
|
|
1054
|
-
i0.ɵɵelementStart(19, "div",
|
|
1249
|
+
i0.ɵɵelementStart(19, "div", 221)(20, "label", 222);
|
|
1055
1250
|
i0.ɵɵtext(21, "Integration");
|
|
1056
1251
|
i0.ɵɵelementEnd();
|
|
1057
|
-
i0.ɵɵelementStart(22, "div",
|
|
1252
|
+
i0.ɵɵelementStart(22, "div", 229);
|
|
1058
1253
|
i0.ɵɵtext(23);
|
|
1059
1254
|
i0.ɵɵelementEnd()();
|
|
1060
|
-
i0.ɵɵelementStart(24, "div",
|
|
1255
|
+
i0.ɵɵelementStart(24, "div", 221)(25, "label", 222);
|
|
1061
1256
|
i0.ɵɵtext(26, "Company");
|
|
1062
1257
|
i0.ɵɵelementEnd();
|
|
1063
|
-
i0.ɵɵelementStart(27, "div",
|
|
1258
|
+
i0.ɵɵelementStart(27, "div", 229);
|
|
1064
1259
|
i0.ɵɵtext(28);
|
|
1065
1260
|
i0.ɵɵelementEnd()()();
|
|
1066
|
-
i0.ɵɵelementStart(29, "div",
|
|
1067
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Template_button_click_30_listener() { i0.ɵɵrestoreView(
|
|
1261
|
+
i0.ɵɵelementStart(29, "div", 230)(30, "button", 54);
|
|
1262
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Template_button_click_30_listener() { i0.ɵɵrestoreView(_r40); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveEditChanges()); });
|
|
1068
1263
|
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
1264
|
i0.ɵɵelementEnd();
|
|
1070
1265
|
i0.ɵɵelementStart(33, "button", 42);
|
|
1071
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Template_button_click_33_listener() { i0.ɵɵrestoreView(
|
|
1266
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Conditional_9_Template_button_click_33_listener() { i0.ɵɵrestoreView(_r40); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseEditPanel()); });
|
|
1072
1267
|
i0.ɵɵtext(34, " Cancel ");
|
|
1073
1268
|
i0.ɵɵelementEnd()();
|
|
1074
1269
|
} if (rf & 2) {
|
|
@@ -1093,31 +1288,31 @@ function ConnectionsComponent_Conditional_6_Conditional_9_Template(rf, ctx) { if
|
|
|
1093
1288
|
i0.ɵɵconditional(ctx_r1.IsEditSaving ? 31 : 32);
|
|
1094
1289
|
} }
|
|
1095
1290
|
function ConnectionsComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
1096
|
-
const
|
|
1097
|
-
i0.ɵɵelementStart(0, "div",
|
|
1291
|
+
const _r39 = i0.ɵɵgetCurrentView();
|
|
1292
|
+
i0.ɵɵelementStart(0, "div", 214)(1, "div", 215)(2, "div", 216);
|
|
1098
1293
|
i0.ɵɵelement(3, "i");
|
|
1099
1294
|
i0.ɵɵelementEnd();
|
|
1100
1295
|
i0.ɵɵelementStart(4, "span");
|
|
1101
1296
|
i0.ɵɵtext(5, "Configure Integration");
|
|
1102
1297
|
i0.ɵɵelementEnd()();
|
|
1103
|
-
i0.ɵɵelementStart(6, "button",
|
|
1104
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Template_button_click_6_listener() { i0.ɵɵrestoreView(
|
|
1105
|
-
i0.ɵɵelement(7, "i",
|
|
1298
|
+
i0.ɵɵelementStart(6, "button", 217);
|
|
1299
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_6_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r39); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseEditPanel()); });
|
|
1300
|
+
i0.ɵɵelement(7, "i", 107);
|
|
1106
1301
|
i0.ɵɵelementEnd()();
|
|
1107
|
-
i0.ɵɵconditionalCreate(8, ConnectionsComponent_Conditional_6_Conditional_8_Template, 2, 0, "div",
|
|
1302
|
+
i0.ɵɵconditionalCreate(8, ConnectionsComponent_Conditional_6_Conditional_8_Template, 2, 0, "div", 218)(9, ConnectionsComponent_Conditional_6_Conditional_9_Template, 35, 10);
|
|
1108
1303
|
} if (rf & 2) {
|
|
1109
1304
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
1110
1305
|
i0.ɵɵadvance(2);
|
|
1111
1306
|
i0.ɵɵstyleProp("background-color", ctx_r1.GetIconBrandColor(ctx_r1.EditingSummary.Integration.Integration));
|
|
1112
1307
|
i0.ɵɵadvance();
|
|
1113
|
-
i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(ctx_r1.EditingSummary.Integration.Integration));
|
|
1308
|
+
i0.ɵɵclassMap(ctx_r1.GetIntegrationIcon(ctx_r1.EditingSummary.Integration.Integration, ctx_r1.EditingSummary.Icon));
|
|
1114
1309
|
i0.ɵɵadvance(5);
|
|
1115
1310
|
i0.ɵɵconditional(ctx_r1.IsEditLoading ? 8 : 9);
|
|
1116
1311
|
} }
|
|
1117
1312
|
function ConnectionsComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
1118
|
-
const
|
|
1119
|
-
i0.ɵɵelementStart(0, "mj-credential-dialog",
|
|
1120
|
-
i0.ɵɵlistener("close", function ConnectionsComponent_Conditional_7_Template_mj_credential_dialog_close_0_listener($event) { i0.ɵɵrestoreView(
|
|
1313
|
+
const _r45 = i0.ɵɵgetCurrentView();
|
|
1314
|
+
i0.ɵɵelementStart(0, "mj-credential-dialog", 238);
|
|
1315
|
+
i0.ɵɵlistener("close", function ConnectionsComponent_Conditional_7_Template_mj_credential_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r45); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.EditPanelOpen ? ctx_r1.OnEditCredentialDialogClose($event) : ctx_r1.OnCredentialDialogClose($event)); });
|
|
1121
1316
|
i0.ɵɵelementEnd();
|
|
1122
1317
|
} if (rf & 2) {
|
|
1123
1318
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -1130,23 +1325,23 @@ function ConnectionsComponent_Conditional_8_Conditional_16_Template(rf, ctx) { i
|
|
|
1130
1325
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.AddMapSourceObjectName, " ");
|
|
1131
1326
|
} }
|
|
1132
1327
|
function ConnectionsComponent_Conditional_8_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
1133
|
-
i0.ɵɵelementStart(0, "span",
|
|
1328
|
+
i0.ɵɵelementStart(0, "span", 250);
|
|
1134
1329
|
i0.ɵɵtext(1, "Select a source object in the Add Map form first");
|
|
1135
1330
|
i0.ɵɵelementEnd();
|
|
1136
1331
|
} }
|
|
1137
1332
|
function ConnectionsComponent_Conditional_8_Conditional_29_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
1138
|
-
i0.ɵɵelementStart(0, "div",
|
|
1139
|
-
i0.ɵɵelement(1, "i",
|
|
1333
|
+
i0.ɵɵelementStart(0, "div", 261);
|
|
1334
|
+
i0.ɵɵelement(1, "i", 114);
|
|
1140
1335
|
i0.ɵɵtext(2);
|
|
1141
1336
|
i0.ɵɵelementEnd();
|
|
1142
1337
|
} if (rf & 2) {
|
|
1143
|
-
const
|
|
1338
|
+
const warn_r47 = ctx.$implicit;
|
|
1144
1339
|
i0.ɵɵadvance(2);
|
|
1145
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
1340
|
+
i0.ɵɵtextInterpolate1(" ", warn_r47);
|
|
1146
1341
|
} }
|
|
1147
1342
|
function ConnectionsComponent_Conditional_8_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
1148
|
-
i0.ɵɵelementStart(0, "div",
|
|
1149
|
-
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_8_Conditional_29_For_2_Template, 3, 1, "div",
|
|
1343
|
+
i0.ɵɵelementStart(0, "div", 255);
|
|
1344
|
+
i0.ɵɵrepeaterCreate(1, ConnectionsComponent_Conditional_8_Conditional_29_For_2_Template, 3, 1, "div", 261, i0.ɵɵrepeaterTrackByIdentity);
|
|
1150
1345
|
i0.ɵɵelementEnd();
|
|
1151
1346
|
} if (rf & 2) {
|
|
1152
1347
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -1154,23 +1349,23 @@ function ConnectionsComponent_Conditional_8_Conditional_29_Template(rf, ctx) { i
|
|
|
1154
1349
|
i0.ɵɵrepeater(ctx_r1.DDLPreviewWarnings);
|
|
1155
1350
|
} }
|
|
1156
1351
|
function ConnectionsComponent_Conditional_8_Conditional_30_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
1157
|
-
i0.ɵɵelement(0, "i",
|
|
1352
|
+
i0.ɵɵelement(0, "i", 122);
|
|
1158
1353
|
i0.ɵɵtext(1, " Copied ");
|
|
1159
1354
|
} }
|
|
1160
1355
|
function ConnectionsComponent_Conditional_8_Conditional_30_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
1161
|
-
i0.ɵɵelement(0, "i",
|
|
1356
|
+
i0.ɵɵelement(0, "i", 265);
|
|
1162
1357
|
i0.ɵɵtext(1, " Copy ");
|
|
1163
1358
|
} }
|
|
1164
1359
|
function ConnectionsComponent_Conditional_8_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
1165
|
-
const
|
|
1166
|
-
i0.ɵɵelementStart(0, "div",
|
|
1360
|
+
const _r48 = i0.ɵɵgetCurrentView();
|
|
1361
|
+
i0.ɵɵelementStart(0, "div", 256)(1, "div", 262)(2, "span");
|
|
1167
1362
|
i0.ɵɵtext(3, "SQL Preview");
|
|
1168
1363
|
i0.ɵɵelementEnd();
|
|
1169
|
-
i0.ɵɵelementStart(4, "button",
|
|
1170
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_30_Template_button_click_4_listener() { i0.ɵɵrestoreView(
|
|
1364
|
+
i0.ɵɵelementStart(4, "button", 263);
|
|
1365
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Conditional_30_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r48); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CopyDDLToClipboard()); });
|
|
1171
1366
|
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
1367
|
i0.ɵɵelementEnd()();
|
|
1173
|
-
i0.ɵɵelementStart(7, "pre",
|
|
1368
|
+
i0.ɵɵelementStart(7, "pre", 264);
|
|
1174
1369
|
i0.ɵɵtext(8);
|
|
1175
1370
|
i0.ɵɵelementEnd()();
|
|
1176
1371
|
} if (rf & 2) {
|
|
@@ -1181,8 +1376,8 @@ function ConnectionsComponent_Conditional_8_Conditional_30_Template(rf, ctx) { i
|
|
|
1181
1376
|
i0.ɵɵtextInterpolate(ctx_r1.DDLPreview);
|
|
1182
1377
|
} }
|
|
1183
1378
|
function ConnectionsComponent_Conditional_8_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
1184
|
-
i0.ɵɵelementStart(0, "div",
|
|
1185
|
-
i0.ɵɵelement(2, "i",
|
|
1379
|
+
i0.ɵɵelementStart(0, "div", 257)(1, "h4");
|
|
1380
|
+
i0.ɵɵelement(2, "i", 266);
|
|
1186
1381
|
i0.ɵɵtext(3, " Next Steps");
|
|
1187
1382
|
i0.ɵɵelementEnd();
|
|
1188
1383
|
i0.ɵɵelementStart(4, "ol")(5, "li");
|
|
@@ -1203,55 +1398,55 @@ function ConnectionsComponent_Conditional_8_Conditional_34_Template(rf, ctx) { i
|
|
|
1203
1398
|
i0.ɵɵtext(1, " Generating... ");
|
|
1204
1399
|
} }
|
|
1205
1400
|
function ConnectionsComponent_Conditional_8_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
1206
|
-
i0.ɵɵelement(0, "i",
|
|
1401
|
+
i0.ɵɵelement(0, "i", 267);
|
|
1207
1402
|
i0.ɵɵtext(1, " Generate SQL ");
|
|
1208
1403
|
} }
|
|
1209
1404
|
function ConnectionsComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1210
|
-
const
|
|
1211
|
-
i0.ɵɵelementStart(0, "div",
|
|
1212
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_div_click_0_listener() { i0.ɵɵrestoreView(
|
|
1405
|
+
const _r46 = i0.ɵɵgetCurrentView();
|
|
1406
|
+
i0.ɵɵelementStart(0, "div", 239);
|
|
1407
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
|
|
1213
1408
|
i0.ɵɵelementEnd();
|
|
1214
|
-
i0.ɵɵelementStart(1, "div",
|
|
1409
|
+
i0.ɵɵelementStart(1, "div", 240)(2, "div", 241)(3, "h3");
|
|
1215
1410
|
i0.ɵɵtext(4, "Create New Entity Table");
|
|
1216
1411
|
i0.ɵɵelementEnd();
|
|
1217
|
-
i0.ɵɵelementStart(5, "button",
|
|
1218
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_5_listener() { i0.ɵɵrestoreView(
|
|
1219
|
-
i0.ɵɵelement(6, "i",
|
|
1412
|
+
i0.ɵɵelementStart(5, "button", 242);
|
|
1413
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
|
|
1414
|
+
i0.ɵɵelement(6, "i", 107);
|
|
1220
1415
|
i0.ɵɵelementEnd()();
|
|
1221
|
-
i0.ɵɵelementStart(7, "div",
|
|
1416
|
+
i0.ɵɵelementStart(7, "div", 243)(8, "p", 244);
|
|
1222
1417
|
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
1418
|
i0.ɵɵelementEnd();
|
|
1224
|
-
i0.ɵɵelementStart(10, "div",
|
|
1419
|
+
i0.ɵɵelementStart(10, "div", 245)(11, "div", 246)(12, "div", 247)(13, "label", 248);
|
|
1225
1420
|
i0.ɵɵtext(14, "Source Object");
|
|
1226
1421
|
i0.ɵɵelementEnd();
|
|
1227
|
-
i0.ɵɵelementStart(15, "div",
|
|
1228
|
-
i0.ɵɵconditionalCreate(16, ConnectionsComponent_Conditional_8_Conditional_16_Template, 1, 1)(17, ConnectionsComponent_Conditional_8_Conditional_17_Template, 2, 0, "span",
|
|
1422
|
+
i0.ɵɵelementStart(15, "div", 249);
|
|
1423
|
+
i0.ɵɵconditionalCreate(16, ConnectionsComponent_Conditional_8_Conditional_16_Template, 1, 1)(17, ConnectionsComponent_Conditional_8_Conditional_17_Template, 2, 0, "span", 250);
|
|
1229
1424
|
i0.ɵɵelementEnd()()();
|
|
1230
|
-
i0.ɵɵelementStart(18, "div",
|
|
1425
|
+
i0.ɵɵelementStart(18, "div", 246)(19, "div", 247)(20, "label", 248);
|
|
1231
1426
|
i0.ɵɵtext(21, "Schema");
|
|
1232
1427
|
i0.ɵɵelementEnd();
|
|
1233
|
-
i0.ɵɵelementStart(22, "input",
|
|
1234
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(
|
|
1428
|
+
i0.ɵɵelementStart(22, "input", 251);
|
|
1429
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntitySchema, $event) || (ctx_r1.NewEntitySchema = $event); return i0.ɵɵresetView($event); });
|
|
1235
1430
|
i0.ɵɵelementEnd()();
|
|
1236
|
-
i0.ɵɵelementStart(23, "span",
|
|
1431
|
+
i0.ɵɵelementStart(23, "span", 252);
|
|
1237
1432
|
i0.ɵɵtext(24, ".");
|
|
1238
1433
|
i0.ɵɵelementEnd();
|
|
1239
|
-
i0.ɵɵelementStart(25, "div",
|
|
1434
|
+
i0.ɵɵelementStart(25, "div", 253)(26, "label", 248);
|
|
1240
1435
|
i0.ɵɵtext(27, "Table Name");
|
|
1241
1436
|
i0.ɵɵelementEnd();
|
|
1242
|
-
i0.ɵɵelementStart(28, "input",
|
|
1243
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Template_input_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(
|
|
1437
|
+
i0.ɵɵelementStart(28, "input", 254);
|
|
1438
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ConnectionsComponent_Conditional_8_Template_input_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityTable, $event) || (ctx_r1.NewEntityTable = $event); return i0.ɵɵresetView($event); });
|
|
1244
1439
|
i0.ɵɵelementEnd()()()();
|
|
1245
|
-
i0.ɵɵconditionalCreate(29, ConnectionsComponent_Conditional_8_Conditional_29_Template, 3, 0, "div",
|
|
1246
|
-
i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_8_Conditional_30_Template, 9, 2, "div",
|
|
1247
|
-
i0.ɵɵconditionalCreate(31, ConnectionsComponent_Conditional_8_Conditional_31_Template, 13, 0, "div",
|
|
1440
|
+
i0.ɵɵconditionalCreate(29, ConnectionsComponent_Conditional_8_Conditional_29_Template, 3, 0, "div", 255);
|
|
1441
|
+
i0.ɵɵconditionalCreate(30, ConnectionsComponent_Conditional_8_Conditional_30_Template, 9, 2, "div", 256);
|
|
1442
|
+
i0.ɵɵconditionalCreate(31, ConnectionsComponent_Conditional_8_Conditional_31_Template, 13, 0, "div", 257);
|
|
1248
1443
|
i0.ɵɵelementEnd();
|
|
1249
|
-
i0.ɵɵelementStart(32, "div",
|
|
1250
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_33_listener() { i0.ɵɵrestoreView(
|
|
1444
|
+
i0.ɵɵelementStart(32, "div", 258)(33, "button", 259);
|
|
1445
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_33_listener() { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.PreviewDDL()); });
|
|
1251
1446
|
i0.ɵɵconditionalCreate(34, ConnectionsComponent_Conditional_8_Conditional_34_Template, 2, 0)(35, ConnectionsComponent_Conditional_8_Conditional_35_Template, 2, 0);
|
|
1252
1447
|
i0.ɵɵelementEnd();
|
|
1253
|
-
i0.ɵɵelementStart(36, "button",
|
|
1254
|
-
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_36_listener() { i0.ɵɵrestoreView(
|
|
1448
|
+
i0.ɵɵelementStart(36, "button", 260);
|
|
1449
|
+
i0.ɵɵlistener("click", function ConnectionsComponent_Conditional_8_Template_button_click_36_listener() { i0.ɵɵrestoreView(_r46); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseNewEntityDialog()); });
|
|
1255
1450
|
i0.ɵɵtext(37, " Done ");
|
|
1256
1451
|
i0.ɵɵelementEnd()()();
|
|
1257
1452
|
} if (rf & 2) {
|
|
@@ -1354,6 +1549,9 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
1354
1549
|
DetailFilteredMaps = [];
|
|
1355
1550
|
DetailSearchTerm = '';
|
|
1356
1551
|
IsDetailLoading = false;
|
|
1552
|
+
// Schedule state (for the selected integration)
|
|
1553
|
+
ScheduledJobID = null;
|
|
1554
|
+
ShowScheduleSlidePanel = false;
|
|
1357
1555
|
// Entity map editor state (field mapping detail view)
|
|
1358
1556
|
EditorEntityMap = null;
|
|
1359
1557
|
// Add entity map state
|
|
@@ -1390,6 +1588,16 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
1390
1588
|
DDLPreviewWarnings = [];
|
|
1391
1589
|
IsGeneratingDDL = false;
|
|
1392
1590
|
IsCreatingEntity = false;
|
|
1591
|
+
// Auto-map schema state
|
|
1592
|
+
ShowAutoMapPanel = false;
|
|
1593
|
+
AutoMapSchemas = [];
|
|
1594
|
+
AutoMapSelectedSchema = '';
|
|
1595
|
+
AutoMapDirection = 'Pull';
|
|
1596
|
+
IsAutoMapping = false;
|
|
1597
|
+
AutoMapResult = null;
|
|
1598
|
+
// Sync state
|
|
1599
|
+
SyncingIntegrationID = null;
|
|
1600
|
+
SyncResult = null;
|
|
1393
1601
|
// Delete confirmation state
|
|
1394
1602
|
DeleteConfirmID = null;
|
|
1395
1603
|
IsDeleting = false;
|
|
@@ -1454,8 +1662,8 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
1454
1662
|
const badge = this.GetStatusBadge(summary);
|
|
1455
1663
|
return `status-badge status-badge-${badge.toLowerCase()}`;
|
|
1456
1664
|
}
|
|
1457
|
-
GetIntegrationIcon(name) {
|
|
1458
|
-
return
|
|
1665
|
+
GetIntegrationIcon(name, icon) {
|
|
1666
|
+
return ResolveIntegrationIcon(name, icon);
|
|
1459
1667
|
}
|
|
1460
1668
|
GetIconBrandColor(name) {
|
|
1461
1669
|
return this.resolveBrandColor(name);
|
|
@@ -1681,17 +1889,37 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
1681
1889
|
// ---------------------------------------------------------------------------
|
|
1682
1890
|
// Sync action
|
|
1683
1891
|
// ---------------------------------------------------------------------------
|
|
1892
|
+
IsSyncing(integrationID) {
|
|
1893
|
+
return UUIDsEqual(this.SyncingIntegrationID, integrationID);
|
|
1894
|
+
}
|
|
1684
1895
|
async RunSync(integrationID) {
|
|
1896
|
+
if (this.SyncingIntegrationID)
|
|
1897
|
+
return;
|
|
1898
|
+
this.SyncingIntegrationID = integrationID;
|
|
1899
|
+
this.SyncResult = null;
|
|
1900
|
+
this.cdr.detectChanges();
|
|
1685
1901
|
try {
|
|
1686
1902
|
const result = await this.dataService.RunSync(integrationID);
|
|
1903
|
+
this.SyncResult = result;
|
|
1687
1904
|
if (!result.Success) {
|
|
1688
1905
|
console.error('[IntegrationConnections] Sync failed:', result.Message);
|
|
1689
1906
|
}
|
|
1690
1907
|
await this.LoadData();
|
|
1691
1908
|
}
|
|
1692
1909
|
catch (err) {
|
|
1910
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1911
|
+
this.SyncResult = { Success: false, Message: `Sync error: ${message}` };
|
|
1693
1912
|
console.error('[IntegrationConnections] RunSync error:', err);
|
|
1694
1913
|
}
|
|
1914
|
+
finally {
|
|
1915
|
+
this.SyncingIntegrationID = null;
|
|
1916
|
+
this.cdr.detectChanges();
|
|
1917
|
+
// Auto-clear result after 8 seconds
|
|
1918
|
+
setTimeout(() => {
|
|
1919
|
+
this.SyncResult = null;
|
|
1920
|
+
this.cdr.detectChanges();
|
|
1921
|
+
}, 8000);
|
|
1922
|
+
}
|
|
1695
1923
|
}
|
|
1696
1924
|
// ---------------------------------------------------------------------------
|
|
1697
1925
|
// Detail view (entity maps for a selected integration)
|
|
@@ -1699,10 +1927,14 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
1699
1927
|
async SelectIntegrationCard(summary) {
|
|
1700
1928
|
this.SelectedSummary = summary;
|
|
1701
1929
|
this.DetailSearchTerm = '';
|
|
1930
|
+
this.ScheduledJobID = null;
|
|
1702
1931
|
this.IsDetailLoading = true;
|
|
1703
1932
|
this.cdr.detectChanges();
|
|
1704
1933
|
try {
|
|
1705
|
-
const maps = await
|
|
1934
|
+
const [maps] = await Promise.all([
|
|
1935
|
+
this.loadEntityMapsForIntegration(summary.Integration.ID),
|
|
1936
|
+
this.loadScheduledJobForIntegration(summary.Integration.ID)
|
|
1937
|
+
]);
|
|
1706
1938
|
this.DetailEntityMaps = maps;
|
|
1707
1939
|
this.DetailFilteredMaps = maps;
|
|
1708
1940
|
}
|
|
@@ -1719,8 +1951,69 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
1719
1951
|
this.DetailEntityMaps = [];
|
|
1720
1952
|
this.DetailFilteredMaps = [];
|
|
1721
1953
|
this.DetailSearchTerm = '';
|
|
1954
|
+
this.ScheduledJobID = null;
|
|
1955
|
+
this.ShowScheduleSlidePanel = false;
|
|
1956
|
+
this.cdr.detectChanges();
|
|
1957
|
+
}
|
|
1958
|
+
// ---------------------------------------------------------------------------
|
|
1959
|
+
// Schedule management
|
|
1960
|
+
// ---------------------------------------------------------------------------
|
|
1961
|
+
OpenSchedulePanel() {
|
|
1962
|
+
this.ShowScheduleSlidePanel = true;
|
|
1722
1963
|
this.cdr.detectChanges();
|
|
1723
1964
|
}
|
|
1965
|
+
CloseSchedulePanel() {
|
|
1966
|
+
this.ShowScheduleSlidePanel = false;
|
|
1967
|
+
this.cdr.detectChanges();
|
|
1968
|
+
}
|
|
1969
|
+
async OnScheduleSaved() {
|
|
1970
|
+
this.ShowScheduleSlidePanel = false;
|
|
1971
|
+
if (this.SelectedSummary) {
|
|
1972
|
+
await this.loadScheduledJobForIntegration(this.SelectedSummary.Integration.ID);
|
|
1973
|
+
}
|
|
1974
|
+
this.cdr.detectChanges();
|
|
1975
|
+
}
|
|
1976
|
+
async OnScheduleDeleted() {
|
|
1977
|
+
this.ShowScheduleSlidePanel = false;
|
|
1978
|
+
this.ScheduledJobID = null;
|
|
1979
|
+
this.cdr.detectChanges();
|
|
1980
|
+
}
|
|
1981
|
+
get ScheduleDefaultConfiguration() {
|
|
1982
|
+
if (!this.SelectedSummary)
|
|
1983
|
+
return '{}';
|
|
1984
|
+
return JSON.stringify({
|
|
1985
|
+
CompanyIntegrationID: this.SelectedSummary.Integration.ID
|
|
1986
|
+
}, null, 2);
|
|
1987
|
+
}
|
|
1988
|
+
get IntegrationSyncJobTypeID() {
|
|
1989
|
+
return this.integrationSyncJobTypeID;
|
|
1990
|
+
}
|
|
1991
|
+
integrationSyncJobTypeID = null;
|
|
1992
|
+
async loadScheduledJobForIntegration(companyIntegrationID) {
|
|
1993
|
+
try {
|
|
1994
|
+
const md = new Metadata();
|
|
1995
|
+
const ci = await md.GetEntityObject('MJ: Company Integrations');
|
|
1996
|
+
await ci.Load(companyIntegrationID);
|
|
1997
|
+
const scheduledJobID = ci.Get('ScheduledJobID');
|
|
1998
|
+
this.ScheduledJobID = scheduledJobID ?? null;
|
|
1999
|
+
// Also look up the Integration Sync job type ID for pre-populating new schedules
|
|
2000
|
+
if (!this.integrationSyncJobTypeID) {
|
|
2001
|
+
const rv = new RunView();
|
|
2002
|
+
const typeResult = await rv.RunView({
|
|
2003
|
+
EntityName: 'MJ: Scheduled Job Types',
|
|
2004
|
+
ExtraFilter: `Name='Integration Sync'`,
|
|
2005
|
+
Fields: ['ID'],
|
|
2006
|
+
ResultType: 'simple'
|
|
2007
|
+
});
|
|
2008
|
+
if (typeResult.Success && typeResult.Results.length > 0) {
|
|
2009
|
+
this.integrationSyncJobTypeID = typeResult.Results[0].ID;
|
|
2010
|
+
}
|
|
2011
|
+
}
|
|
2012
|
+
}
|
|
2013
|
+
catch (err) {
|
|
2014
|
+
console.warn('[IntegrationConnections] Failed to load schedule info:', err);
|
|
2015
|
+
}
|
|
2016
|
+
}
|
|
1724
2017
|
OnDetailSearch(event) {
|
|
1725
2018
|
const input = event.target;
|
|
1726
2019
|
this.DetailSearchTerm = input.value;
|
|
@@ -2182,6 +2475,52 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
2182
2475
|
}
|
|
2183
2476
|
}
|
|
2184
2477
|
// ---------------------------------------------------------------------------
|
|
2478
|
+
// Auto-Map Schema
|
|
2479
|
+
// ---------------------------------------------------------------------------
|
|
2480
|
+
ToggleAutoMapPanel() {
|
|
2481
|
+
this.ShowAutoMapPanel = !this.ShowAutoMapPanel;
|
|
2482
|
+
if (this.ShowAutoMapPanel) {
|
|
2483
|
+
this.AutoMapSchemas = this.dataService.LoadSchemas();
|
|
2484
|
+
this.AutoMapSelectedSchema = '';
|
|
2485
|
+
this.AutoMapDirection = 'Pull';
|
|
2486
|
+
this.AutoMapResult = null;
|
|
2487
|
+
}
|
|
2488
|
+
this.cdr.detectChanges();
|
|
2489
|
+
}
|
|
2490
|
+
CloseAutoMapPanel() {
|
|
2491
|
+
this.ShowAutoMapPanel = false;
|
|
2492
|
+
this.AutoMapResult = null;
|
|
2493
|
+
this.cdr.detectChanges();
|
|
2494
|
+
}
|
|
2495
|
+
get CanAutoMap() {
|
|
2496
|
+
return !!this.AutoMapSelectedSchema && !this.IsAutoMapping;
|
|
2497
|
+
}
|
|
2498
|
+
async RunAutoMap() {
|
|
2499
|
+
if (!this.CanAutoMap || !this.SelectedSummary)
|
|
2500
|
+
return;
|
|
2501
|
+
this.IsAutoMapping = true;
|
|
2502
|
+
this.AutoMapResult = null;
|
|
2503
|
+
this.cdr.detectChanges();
|
|
2504
|
+
try {
|
|
2505
|
+
this.AutoMapResult = await this.dataService.AutoMapSchema(this.SelectedSummary.Integration.ID, this.AutoMapSelectedSchema, this.AutoMapDirection);
|
|
2506
|
+
// Reload entity maps to reflect new maps
|
|
2507
|
+
if (this.AutoMapResult.EntityMapsCreated > 0) {
|
|
2508
|
+
const maps = await this.loadEntityMapsForIntegration(this.SelectedSummary.Integration.ID);
|
|
2509
|
+
this.DetailEntityMaps = maps;
|
|
2510
|
+
this.DetailFilteredMaps = this.applyDetailFilter();
|
|
2511
|
+
this.EntityMapCounts = this.countMapsByIntegration(await this.loadAllEntityMaps());
|
|
2512
|
+
}
|
|
2513
|
+
}
|
|
2514
|
+
catch (err) {
|
|
2515
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
2516
|
+
this.AutoMapResult = { EntityMapsCreated: 0, FieldMapsCreated: 0, Errors: [message] };
|
|
2517
|
+
}
|
|
2518
|
+
finally {
|
|
2519
|
+
this.IsAutoMapping = false;
|
|
2520
|
+
this.cdr.detectChanges();
|
|
2521
|
+
}
|
|
2522
|
+
}
|
|
2523
|
+
// ---------------------------------------------------------------------------
|
|
2185
2524
|
// Private helpers
|
|
2186
2525
|
// ---------------------------------------------------------------------------
|
|
2187
2526
|
async loadWizardData() {
|
|
@@ -2209,20 +2548,25 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
2209
2548
|
this.cdr.detectChanges();
|
|
2210
2549
|
}
|
|
2211
2550
|
async saveCompanyIntegration() {
|
|
2212
|
-
if (this.SavedIntegrationID)
|
|
2213
|
-
return this.SavedIntegrationID;
|
|
2214
2551
|
if (!this.SelectedCompanyID || !this.SelectedIntegration)
|
|
2215
2552
|
return null;
|
|
2216
2553
|
const md = new Metadata();
|
|
2217
2554
|
const ci = await md.GetEntityObject('MJ: Company Integrations');
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
ci.CredentialID = this.SelectedCredential.ID;
|
|
2555
|
+
if (this.SavedIntegrationID) {
|
|
2556
|
+
// Record already exists — reload it so we can update fields that may have changed
|
|
2557
|
+
// (e.g. credential selected after initial save)
|
|
2558
|
+
const loaded = await ci.Load(this.SavedIntegrationID);
|
|
2559
|
+
if (!loaded)
|
|
2560
|
+
return this.SavedIntegrationID; // fallback to existing ID
|
|
2225
2561
|
}
|
|
2562
|
+
else {
|
|
2563
|
+
ci.NewRecord();
|
|
2564
|
+
ci.CompanyID = this.SelectedCompanyID;
|
|
2565
|
+
ci.IntegrationID = this.SelectedIntegration.ID;
|
|
2566
|
+
ci.IsActive = false;
|
|
2567
|
+
}
|
|
2568
|
+
ci.Name = this.ConnectionName || this.SelectedIntegration.Name;
|
|
2569
|
+
ci.CredentialID = this.SelectedCredential?.ID ?? null;
|
|
2226
2570
|
const saved = await ci.Save();
|
|
2227
2571
|
if (saved) {
|
|
2228
2572
|
this.SavedIntegrationID = ci.ID;
|
|
@@ -2250,9 +2594,6 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
2250
2594
|
}
|
|
2251
2595
|
return counts;
|
|
2252
2596
|
}
|
|
2253
|
-
resolveIconByName(name) {
|
|
2254
|
-
return ResolveIntegrationIcon(name);
|
|
2255
|
-
}
|
|
2256
2597
|
resolveBrandColor(name) {
|
|
2257
2598
|
const match = BRAND_COLOR_MAP.find(m => m.Pattern.test(name));
|
|
2258
2599
|
return match ? match.Color : '#6366f1';
|
|
@@ -2315,7 +2656,7 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
2315
2656
|
} if (rf & 2) {
|
|
2316
2657
|
let _t;
|
|
2317
2658
|
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"], [
|
|
2659
|
+
} }, 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", 3, "disabled"], ["title", "Delete integration", 1, "card-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [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"], ["kendoButton", "", "themeColor", "primary", 3, "click", "disabled"], [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, "fa-solid", "fa-pen-to-square"], [1, "schedule-section"], [1, "schedule-section-header"], [1, "schedule-section-title"], [1, "fa-solid", "fa-calendar-check"], [3, "ScheduledJobID"], [1, "schedule-empty"], [3, "Close", "Saved", "Deleted", "IsOpen", "ScheduledJobID", "JobTypeID", "DefaultConfiguration", "HideJobType"], [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, "fa-solid", "fa-wand-magic-sparkles"], [1, "sync-result-banner", 3, "sync-success", "sync-failure"], [1, "add-map-panel"], [1, "detail-empty"], [3, "EditRequested", "ScheduledJobID"], [1, "schedule-empty-text"], [1, "schedule-create-btn", 3, "click"], [1, "sync-result-banner"], [1, "auto-map-header"], [1, "add-map-row"], [1, "add-map-field"], [1, "add-map-label"], [1, "add-map-select", 3, "ngModelChange", "ngModel"], ["disabled", "", 3, "ngValue"], [3, "value"], [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-actions"], [1, "add-map-save-btn", 3, "click", "disabled"], [1, "add-map-cancel-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "auto-map-result", 3, "auto-map-success", "auto-map-partial", "auto-map-failure"], [1, "auto-map-result"], [1, "auto-map-result-summary"], [1, "auto-map-errors"], [1, "fa-solid", "fa-circle-info"], [1, "auto-map-error"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "add-map-loading"], [1, "add-map-hint"], [1, "add-map-select", 3, "ngModel"], [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, "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"], [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, "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
2660
|
i0.ɵɵelementStart(0, "div", 1);
|
|
2320
2661
|
i0.ɵɵconditionalCreate(1, ConnectionsComponent_Conditional_1_Template, 12, 5);
|
|
2321
2662
|
i0.ɵɵconditionalCreate(2, ConnectionsComponent_Conditional_2_Template, 3, 1, "div", 2);
|
|
@@ -2347,7 +2688,7 @@ let ConnectionsComponent = class ConnectionsComponent extends BaseResourceCompon
|
|
|
2347
2688
|
i0.ɵɵconditional(ctx.ShowCredentialDialog ? 7 : -1);
|
|
2348
2689
|
i0.ɵɵadvance();
|
|
2349
2690
|
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}"] });
|
|
2691
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.ButtonComponent, i3.LoadingComponent, i4.CredentialDialogComponent, i5.TreeDropdownComponent, i6.ScheduledJobSummaryComponent, i6.ScheduledJobSlidePanelComponent, i7.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-text-disabled);\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-text-secondary);\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-status-success);\n}\n\n.status-badge-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\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-status-success);\n}\n\n.card-test-result.test-failure[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\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-delete-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n background: none;\n border: 1px solid transparent;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 6px;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: all 0.15s;\n}\n\n.card-delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\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-text-secondary);\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-status-error);\n}\n\n.menu-item-danger[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\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-status-success);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-success);\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-status-success);\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-status-success);\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-brand-primary);\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-status-success-border);\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-status-success-text);\n font-size: 14px;\n font-weight: 500;\n}\n\n.credential-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\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-status-error);\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-text-secondary);\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-status-success);\n}\n\n.test-result-failure[_ngcontent-%COMP%] .test-result-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\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-text-secondary);\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-status-error);\n}\n\n.delete-confirm-text[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\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-brand-primary);\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-status-success);\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-text-secondary);\n}\n\n.edit-credential-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\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-status-error-bg);\n color: var(--mj-status-error);\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-text-secondary);\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.schedule-section[_ngcontent-%COMP%] {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 12px;\n padding: 16px 20px;\n margin-bottom: 16px;\n}\n\n.schedule-section-header[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.schedule-section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8rem;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.schedule-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0076b6;\n}\n\n.schedule-empty[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n}\n\n.schedule-empty-text[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n color: #94a3b8;\n}\n\n.schedule-create-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: linear-gradient(135deg, #0076b6 0%, #005a8c 100%);\n color: white;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.schedule-create-btn[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(0, 118, 182, 0.4);\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-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-brand-primary-hover);\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-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.add-map-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\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-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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-brand-primary);\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-brand-primary);\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-brand-primary);\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-brand-primary-hover);\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-brand-primary);\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-brand-primary);\n background: var(--mj-brand-primary-subtle);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\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: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n\n\n\n\n\n.sync-result-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 12px;\n animation: _ngcontent-%COMP%_fadeIn 200ms ease;\n}\n\n.sync-result-banner.sync-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.sync-result-banner.sync-failure[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n\n\n\n\n\n.auto-map-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.auto-map-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.auto-map-result[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 13px;\n}\n\n.auto-map-result.auto-map-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.auto-map-result.auto-map-partial[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n border: 1px solid var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n}\n\n.auto-map-result.auto-map-failure[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.auto-map-result-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.auto-map-errors[_ngcontent-%COMP%] {\n margin-top: 6px;\n font-size: 12px;\n}\n\n.auto-map-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\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);\n border-radius: var(--mj-radius-lg);\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-border-default);\n}\n\n.new-entity-dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: 600;\n color: var(--mj-text-primary);\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: var(--mj-text-sm);\n color: var(--mj-text-secondary);\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-bg-surface-card);\n color: var(--mj-text-primary);\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);\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: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.new-entity-dialog-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: var(--mj-text-sm);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\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-brand-primary);\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);\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);\n padding: 8px 0 4px;\n}\n\n.new-entity-dialog-hint[_ngcontent-%COMP%] {\n font-style: italic;\n color: var(--mj-text-disabled);\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-border-default);\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: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\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-brand-primary-hover);\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);\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-done-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n\n\n.new-entity-next-steps[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary-subtle);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: var(--mj-radius-md);\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-brand-primary-hover);\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-brand-primary-hover);\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);\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ddl-copy-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\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-status-warning);\n background: var(--mj-status-warning-subtle);\n padding: 6px 10px;\n border-radius: var(--mj-radius-sm);\n border-left: 3px solid var(--mj-status-warning);\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-border-default);\n border-radius: var(--mj-radius-md);\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-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-secondary);\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);\n background: var(--mj-bg-surface);\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-text-disabled);\n}\n\n.detail-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-secondary);\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-status-success);\n}\n\n.direction-badge.bidirectional[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-subtle);\n color: var(--mj-status-warning);\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-status-success);\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
2692
|
};
|
|
2352
2693
|
ConnectionsComponent = __decorate([
|
|
2353
2694
|
RegisterClass(BaseResourceComponent, 'IntegrationConnections')
|
|
@@ -2355,7 +2696,7 @@ ConnectionsComponent = __decorate([
|
|
|
2355
2696
|
export { ConnectionsComponent };
|
|
2356
2697
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConnectionsComponent, [{
|
|
2357
2698
|
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\">·</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\">·</span>\n {{ GetSourceTypeLabel(SelectedSummary) }}\n <span class=\"meta-separator\">·</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\">·</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 — 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"] }]
|
|
2699
|
+
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, summary.Icon)\" 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\">·</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\"\n [disabled]=\"!!SyncingIntegrationID\"\n (click)=\"RunSync(summary.Integration.ID)\">\n @if (IsSyncing(summary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Syncing...\n } @else {\n Sync Now\n }\n </button>\n }\n <button class=\"card-delete-btn\" (click)=\"OnMenuAction('delete', summary)\" title=\"Delete integration\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\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\">·</span>\n {{ GetSourceTypeLabel(SelectedSummary) }}\n <span class=\"meta-separator\">·</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\"\n [disabled]=\"!!SyncingIntegrationID\"\n (click)=\"RunSync(SelectedSummary.Integration.ID)\">\n @if (IsSyncing(SelectedSummary.Integration.ID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Syncing...\n } @else {\n <i class=\"fa-solid fa-arrows-rotate\"></i> Sync Now\n }\n </button>\n }\n </div>\n </div>\n\n <!-- Schedule section -->\n <div class=\"schedule-section\">\n <div class=\"schedule-section-header\">\n <div class=\"schedule-section-title\">\n <i class=\"fa-solid fa-calendar-check\"></i>\n <span>Sync Schedule</span>\n </div>\n </div>\n @if (ScheduledJobID) {\n <mj-scheduled-job-summary\n [ScheduledJobID]=\"ScheduledJobID\"\n (EditRequested)=\"OpenSchedulePanel()\">\n </mj-scheduled-job-summary>\n } @else {\n <div class=\"schedule-empty\">\n <span class=\"schedule-empty-text\">No sync schedule configured</span>\n <button class=\"schedule-create-btn\" (click)=\"OpenSchedulePanel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Schedule Sync\n </button>\n </div>\n }\n </div>\n\n <!-- Schedule slide panel -->\n <mj-scheduled-job-slide-panel\n [IsOpen]=\"ShowScheduleSlidePanel\"\n [ScheduledJobID]=\"ScheduledJobID\"\n [JobTypeID]=\"IntegrationSyncJobTypeID\"\n [DefaultConfiguration]=\"ScheduleDefaultConfiguration\"\n [HideJobType]=\"true\"\n (Close)=\"CloseSchedulePanel()\"\n (Saved)=\"OnScheduleSaved()\"\n (Deleted)=\"OnScheduleDeleted()\">\n </mj-scheduled-job-slide-panel>\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\">·</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)=\"ToggleAutoMapPanel()\" [class.active]=\"ShowAutoMapPanel\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Auto-Map Schema\n </button>\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 <!-- Sync result banner -->\n @if (SyncResult) {\n <div class=\"sync-result-banner\" [class.sync-success]=\"SyncResult.Success\" [class.sync-failure]=\"!SyncResult.Success\">\n @if (SyncResult.Success) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-solid fa-circle-xmark\"></i>\n }\n <span>{{ SyncResult.Message || (SyncResult.Success ? 'Sync completed successfully' : 'Sync failed') }}</span>\n </div>\n }\n\n <!-- Auto-Map Schema panel -->\n @if (ShowAutoMapPanel) {\n <div class=\"add-map-panel\">\n <div class=\"auto-map-header\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span>Auto-map all entities in a schema to this integration with 1:1 field mappings</span>\n </div>\n <div class=\"add-map-row\">\n <div class=\"add-map-field\">\n <label class=\"add-map-label\">Target Schema</label>\n <select class=\"add-map-select\" [(ngModel)]=\"AutoMapSelectedSchema\">\n <option [ngValue]=\"''\" disabled>Select schema...</option>\n @for (schema of AutoMapSchemas; track schema) {\n <option [value]=\"schema\">{{ schema }}</option>\n }\n </select>\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]=\"AutoMapDirection === 'Pull'\" (click)=\"AutoMapDirection = 'Pull'\" title=\"Pull from source\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n <button [class.active]=\"AutoMapDirection === 'Bidirectional'\" (click)=\"AutoMapDirection = 'Bidirectional'\" title=\"Bidirectional sync\">\n <i class=\"fa-solid fa-right-left\"></i>\n </button>\n <button [class.active]=\"AutoMapDirection === 'Push'\" (click)=\"AutoMapDirection = '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-actions\">\n <button class=\"add-map-save-btn\"\n [disabled]=\"!CanAutoMap\"\n (click)=\"RunAutoMap()\">\n @if (IsAutoMapping) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Mapping...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Auto-Map\n }\n </button>\n <button class=\"add-map-cancel-btn\" (click)=\"CloseAutoMapPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n @if (AutoMapResult) {\n <div class=\"auto-map-result\" [class.auto-map-success]=\"AutoMapResult.Errors.length === 0\"\n [class.auto-map-partial]=\"AutoMapResult.Errors.length > 0 && AutoMapResult.EntityMapsCreated > 0\"\n [class.auto-map-failure]=\"AutoMapResult.EntityMapsCreated === 0 && AutoMapResult.Errors.length > 0\">\n @if (AutoMapResult.EntityMapsCreated > 0) {\n <div class=\"auto-map-result-summary\">\n <i class=\"fa-solid fa-circle-check\"></i>\n Created {{ AutoMapResult.EntityMapsCreated }} entity map{{ AutoMapResult.EntityMapsCreated !== 1 ? 's' : '' }}\n with {{ AutoMapResult.FieldMapsCreated }} field map{{ AutoMapResult.FieldMapsCreated !== 1 ? 's' : '' }}\n </div>\n } @else if (AutoMapResult.Errors.length === 0) {\n <div class=\"auto-map-result-summary\">\n <i class=\"fa-solid fa-circle-info\"></i>\n All entities in this schema are already mapped.\n </div>\n }\n @if (AutoMapResult.Errors.length > 0) {\n <div class=\"auto-map-errors\">\n @for (err of AutoMapResult.Errors; track err) {\n <div class=\"auto-map-error\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ err }}</div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\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, def.Get('Icon'))\"></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, EditingSummary.Icon)\"></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 — 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-text-disabled);\n margin-bottom: 16px;\n}\n\n.empty-state h3 {\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-secondary);\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-status-success);\n}\n\n.status-badge-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\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-status-success);\n}\n\n.card-test-result.test-failure {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\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 Delete Button */\n.card-delete-btn {\n margin-left: auto;\n background: none;\n border: 1px solid transparent;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 6px;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: all 0.15s;\n}\n\n.card-delete-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error);\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-text-secondary);\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-status-error);\n}\n\n.menu-item-danger i {\n color: var(--mj-status-error);\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-status-success);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-success);\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-status-success);\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-status-success);\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-brand-primary);\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-status-success-border);\n border-radius: 8px;\n}\n\n.credential-info {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-success-text);\n font-size: 14px;\n font-weight: 500;\n}\n\n.credential-info i {\n color: var(--mj-status-success);\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-status-error);\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-text-secondary);\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-status-success);\n}\n\n.test-result-failure .test-result-icon {\n color: var(--mj-status-error);\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-text-secondary);\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-status-error);\n}\n\n.delete-confirm-text {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\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-brand-primary);\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-status-success);\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-text-secondary);\n}\n\n.edit-credential-info i {\n color: var(--mj-brand-primary);\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-status-error-bg);\n color: var(--mj-status-error);\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-text-secondary);\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/* Schedule section */\n.schedule-section {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 12px;\n padding: 16px 20px;\n margin-bottom: 16px;\n}\n\n.schedule-section-header {\n margin-bottom: 12px;\n}\n\n.schedule-section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.8rem;\n font-weight: 700;\n color: #475569;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.schedule-section-title i {\n color: #0076b6;\n}\n\n.schedule-empty {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n}\n\n.schedule-empty-text {\n font-size: 0.85rem;\n color: #94a3b8;\n}\n\n.schedule-create-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: linear-gradient(135deg, #0076b6 0%, #005a8c 100%);\n color: white;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.schedule-create-btn:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(0, 118, 182, 0.4);\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-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-brand-primary-hover);\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-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.add-map-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\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-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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-brand-primary);\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-brand-primary);\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-brand-primary);\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-brand-primary-hover);\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-brand-primary);\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-brand-primary);\n background: var(--mj-brand-primary-subtle);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\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: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ---------------------------------------------------------------------------\n Sync Result Banner\n --------------------------------------------------------------------------- */\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n margin-bottom: 12px;\n animation: fadeIn 200ms ease;\n}\n\n.sync-result-banner.sync-success {\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.sync-result-banner.sync-failure {\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n/* ---------------------------------------------------------------------------\n Auto-Map Schema Panel\n --------------------------------------------------------------------------- */\n\n.auto-map-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.auto-map-header i {\n color: var(--mj-brand-primary);\n}\n\n.auto-map-result {\n margin-top: 12px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 13px;\n}\n\n.auto-map-result.auto-map-success {\n background: var(--mj-status-success-bg);\n border: 1px solid var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.auto-map-result.auto-map-partial {\n background: var(--mj-status-warning-bg);\n border: 1px solid var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n}\n\n.auto-map-result.auto-map-failure {\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.auto-map-result-summary {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.auto-map-errors {\n margin-top: 6px;\n font-size: 12px;\n}\n\n.auto-map-error {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\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);\n border-radius: var(--mj-radius-lg);\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-border-default);\n}\n\n.new-entity-dialog-header h3 {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: 600;\n color: var(--mj-text-primary);\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: var(--mj-text-sm);\n color: var(--mj-text-secondary);\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-bg-surface-card);\n color: var(--mj-text-primary);\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);\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: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.new-entity-dialog-input {\n padding: 8px 12px;\n font-size: var(--mj-text-sm);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: border-color 0.15s ease;\n}\n\n.new-entity-dialog-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\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);\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);\n padding: 8px 0 4px;\n}\n\n.new-entity-dialog-hint {\n font-style: italic;\n color: var(--mj-text-disabled);\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-border-default);\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: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\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-brand-primary-hover);\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);\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.new-entity-dialog-done-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n/* Next steps callout inside dialog */\n.new-entity-next-steps {\n background: var(--mj-brand-primary-subtle);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: var(--mj-radius-md);\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-brand-primary-hover);\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-brand-primary-hover);\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);\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.ddl-copy-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\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-status-warning);\n background: var(--mj-status-warning-subtle);\n padding: 6px 10px;\n border-radius: var(--mj-radius-sm);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.ddl-warning i {\n margin-right: 4px;\n}\n\n.ddl-preview-block {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\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-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-secondary);\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);\n background: var(--mj-bg-surface);\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-text-disabled);\n}\n\n.detail-empty h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-secondary);\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-status-success);\n}\n\n.direction-badge.bidirectional {\n background: var(--mj-status-warning-subtle);\n color: var(--mj-status-warning);\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-status-success);\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
2700
|
}], null, { entityTreeDropdown: [{
|
|
2360
2701
|
type: ViewChild,
|
|
2361
2702
|
args: ['entityTreeDropdown']
|