@memberjunction/ng-dashboards 5.8.0 → 5.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/AI/components/models/model-management.component.d.ts +2 -0
  2. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  3. package/dist/AI/components/models/model-management.component.js +44 -2
  4. package/dist/AI/components/models/model-management.component.js.map +1 -1
  5. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  6. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +15 -12
  7. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  8. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  9. package/dist/DataExplorer/components/view-selector/view-selector.component.js +16 -22
  10. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  11. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  12. package/dist/DataExplorer/data-explorer-dashboard.component.js +31 -11
  13. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  14. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  15. package/dist/Home/home-dashboard.component.js +10 -7
  16. package/dist/Home/home-dashboard.component.js.map +1 -1
  17. package/dist/Integration/components/activity/activity.component.d.ts +96 -0
  18. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -0
  19. package/dist/Integration/components/activity/activity.component.js +961 -0
  20. package/dist/Integration/components/activity/activity.component.js.map +1 -0
  21. package/dist/Integration/components/connections/connections.component.d.ts +194 -0
  22. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -0
  23. package/dist/Integration/components/connections/connections.component.js +2368 -0
  24. package/dist/Integration/components/connections/connections.component.js.map +1 -0
  25. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +213 -15
  26. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  27. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2093 -187
  28. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  29. package/dist/Integration/components/overview/overview.component.d.ts +60 -0
  30. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -0
  31. package/dist/Integration/components/overview/overview.component.js +628 -0
  32. package/dist/Integration/components/overview/overview.component.js.map +1 -0
  33. package/dist/Integration/components/pipelines/pipelines.component.d.ts +203 -0
  34. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -0
  35. package/dist/Integration/components/pipelines/pipelines.component.js +2057 -0
  36. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -0
  37. package/dist/Integration/components/schedules/schedules.component.d.ts +110 -0
  38. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -0
  39. package/dist/Integration/components/schedules/schedules.component.js +842 -0
  40. package/dist/Integration/components/schedules/schedules.component.js.map +1 -0
  41. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +141 -0
  42. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -0
  43. package/dist/Integration/components/visual-editor/visual-editor.component.js +1538 -0
  44. package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -0
  45. package/dist/Integration/components/widgets/run-history-panel.component.js +3 -2
  46. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  47. package/dist/Integration/index.d.ts +5 -3
  48. package/dist/Integration/index.d.ts.map +1 -1
  49. package/dist/Integration/index.js +11 -7
  50. package/dist/Integration/index.js.map +1 -1
  51. package/dist/Integration/integration.module.d.ts +20 -16
  52. package/dist/Integration/integration.module.d.ts.map +1 -1
  53. package/dist/Integration/integration.module.js +40 -21
  54. package/dist/Integration/integration.module.js.map +1 -1
  55. package/dist/Integration/services/integration-data.service.d.ts +123 -9
  56. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  57. package/dist/Integration/services/integration-data.service.js +385 -68
  58. package/dist/Integration/services/integration-data.service.js.map +1 -1
  59. package/dist/QueryBrowser/query-browser-resource.component.d.ts +27 -4
  60. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  61. package/dist/QueryBrowser/query-browser-resource.component.js +338 -144
  62. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  63. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  64. package/dist/__tests__/mapping-validation.test.d.ts +2 -0
  65. package/dist/__tests__/mapping-validation.test.d.ts.map +1 -0
  66. package/dist/__tests__/mapping-validation.test.js +170 -0
  67. package/dist/__tests__/mapping-validation.test.js.map +1 -0
  68. package/package.json +40 -38
  69. package/dist/Integration/components/connection-studio/connection-studio.component.d.ts +0 -81
  70. package/dist/Integration/components/connection-studio/connection-studio.component.d.ts.map +0 -1
  71. package/dist/Integration/components/connection-studio/connection-studio.component.js +0 -960
  72. package/dist/Integration/components/connection-studio/connection-studio.component.js.map +0 -1
  73. package/dist/Integration/components/control-tower/control-tower.component.d.ts +0 -43
  74. package/dist/Integration/components/control-tower/control-tower.component.d.ts.map +0 -1
  75. package/dist/Integration/components/control-tower/control-tower.component.js +0 -446
  76. package/dist/Integration/components/control-tower/control-tower.component.js.map +0 -1
  77. package/dist/Integration/components/sync-activity/sync-activity.component.d.ts +0 -65
  78. package/dist/Integration/components/sync-activity/sync-activity.component.d.ts.map +0 -1
  79. package/dist/Integration/components/sync-activity/sync-activity.component.js +0 -671
  80. package/dist/Integration/components/sync-activity/sync-activity.component.js.map +0 -1
  81. package/dist/__tests__/connection-studio.test.d.ts +0 -2
  82. package/dist/__tests__/connection-studio.test.d.ts.map +0 -1
  83. package/dist/__tests__/connection-studio.test.js +0 -186
  84. package/dist/__tests__/connection-studio.test.js.map +0 -1
@@ -6,41 +6,286 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { ChangeDetectorRef, Component, inject } from '@angular/core';
8
8
  import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
9
+ import { Metadata } from '@memberjunction/core';
9
10
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
11
+ import { IntegrationEngineBase } from '@memberjunction/integration-engine-base';
10
12
  import { IntegrationDataService } from '../../services/integration-data.service';
11
13
  import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/forms";
13
- import * as i2 from "@progress/kendo-angular-dropdowns";
14
- import * as i3 from "@progress/kendo-angular-inputs";
15
- import * as i4 from "@progress/kendo-angular-grid";
16
- import * as i5 from "@progress/kendo-angular-layout";
14
+ import * as i1 from "@angular/common";
15
+ import * as i2 from "@angular/forms";
16
+ import * as i3 from "@progress/kendo-angular-buttons";
17
+ import * as i4 from "@progress/kendo-angular-dropdowns";
18
+ import * as i5 from "@progress/kendo-angular-inputs";
17
19
  import * as i6 from "@memberjunction/ng-shared-generic";
18
- import * as i7 from "@angular/common";
19
20
  const _c0 = () => ({ ID: "", Name: "-- Select --" });
21
+ const _c1 = () => ["Pull", "Push", "Bidirectional"];
22
+ const _c2 = () => ({ Name: "", Label: "Select source object..." });
23
+ const _c3 = () => ({ ID: null, Name: "Select entity..." });
20
24
  const _forTrack0 = ($index, $item) => $item.ID;
25
+ const _forTrack1 = ($index, $item) => $item.Name;
26
+ const _forTrack2 = ($index, $item) => $item.Value;
27
+ const _forTrack3 = ($index, $item) => $item.EntityID;
21
28
  function MappingWorkspaceComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
22
29
  i0.ɵɵelement(0, "mj-loading", 3);
23
30
  } }
24
- function MappingWorkspaceComponent_Conditional_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
25
- i0.ɵɵelement(0, "mj-loading", 10);
31
+ function MappingWorkspaceComponent_Conditional_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵelement(0, "mj-loading", 9);
26
33
  } }
27
- function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
28
- const _r3 = i0.ɵɵgetCurrentView();
29
- i0.ɵɵelementStart(0, "div", 18)(1, "input", 20);
30
- i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_3_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.EntityMapSearchText, $event) || (ctx_r1.EntityMapSearchText = $event); return i0.ɵɵresetView($event); });
34
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_10_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelementStart(0, "div", 30);
36
+ i0.ɵɵelement(1, "i", 42);
37
+ i0.ɵɵtext(2, " Discovering objects... ");
38
+ i0.ɵɵelementEnd();
39
+ } }
40
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_11_Template(rf, ctx) { if (rf & 1) {
41
+ i0.ɵɵelementStart(0, "div", 31);
42
+ i0.ɵɵelement(1, "i", 43);
43
+ i0.ɵɵtext(2);
44
+ i0.ɵɵelementEnd();
45
+ } if (rf & 2) {
46
+ const ctx_r1 = i0.ɵɵnextContext(4);
47
+ i0.ɵɵadvance(2);
48
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.DiscoverError, " ");
49
+ } }
50
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_12_Template(rf, ctx) { if (rf & 1) {
51
+ i0.ɵɵelementStart(0, "div", 31);
52
+ i0.ɵɵtext(1, " No objects found in external system. ");
53
+ i0.ɵɵelementEnd();
54
+ } }
55
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_13_Template(rf, ctx) { if (rf & 1) {
56
+ const _r5 = i0.ɵɵgetCurrentView();
57
+ i0.ɵɵelementStart(0, "kendo-dropdownlist", 44);
58
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_13_Template_kendo_dropdownlist_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedSourceObjectName, $event) || (ctx_r1.SelectedSourceObjectName = $event); return i0.ɵɵresetView($event); });
59
+ i0.ɵɵlistener("valueChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_13_Template_kendo_dropdownlist_valueChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnSourceObjectChange($event)); });
60
+ i0.ɵɵelementEnd();
61
+ } if (rf & 2) {
62
+ const ctx_r1 = i0.ɵɵnextContext(4);
63
+ i0.ɵɵproperty("data", ctx_r1.DiscoveredObjects)("textField", "Label")("valueField", "Name")("valuePrimitive", true);
64
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedSourceObjectName);
65
+ i0.ɵɵproperty("filterable", true)("defaultItem", i0.ɵɵpureFunction0(7, _c2));
66
+ } }
67
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_21_Conditional_3_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelement(0, "mj-loading", 16);
69
+ } }
70
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_21_Conditional_4_Template(rf, ctx) { if (rf & 1) {
71
+ const _r6 = i0.ɵɵgetCurrentView();
72
+ i0.ɵɵelementStart(0, "kendo-dropdownlist", 45);
73
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_21_Conditional_4_Template_kendo_dropdownlist_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(5); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedEntityID, $event) || (ctx_r1.SelectedEntityID = $event); return i0.ɵɵresetView($event); });
74
+ i0.ɵɵelementEnd();
75
+ } if (rf & 2) {
76
+ const ctx_r1 = i0.ɵɵnextContext(5);
77
+ i0.ɵɵproperty("data", ctx_r1.MJEntities)("textField", "Name")("valueField", "ID")("valuePrimitive", true);
78
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedEntityID);
79
+ i0.ɵɵproperty("filterable", true)("defaultItem", i0.ɵɵpureFunction0(7, _c3));
80
+ } }
81
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_21_Template(rf, ctx) { if (rf & 1) {
82
+ i0.ɵɵelementStart(0, "div", 29)(1, "label");
83
+ i0.ɵɵtext(2, "Target MJ Entity");
84
+ i0.ɵɵelementEnd();
85
+ i0.ɵɵconditionalCreate(3, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_21_Conditional_3_Template, 1, 0, "mj-loading", 16)(4, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_21_Conditional_4_Template, 1, 8, "kendo-dropdownlist", 32);
86
+ i0.ɵɵelementEnd();
87
+ } if (rf & 2) {
88
+ const ctx_r1 = i0.ɵɵnextContext(4);
89
+ i0.ɵɵadvance(3);
90
+ i0.ɵɵconditional(ctx_r1.IsLoadingEntities ? 3 : 4);
91
+ } }
92
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_12_Template(rf, ctx) { if (rf & 1) {
93
+ i0.ɵɵelementStart(0, "span", 50);
94
+ i0.ɵɵtext(1);
95
+ i0.ɵɵelementEnd();
96
+ } if (rf & 2) {
97
+ const ctx_r1 = i0.ɵɵnextContext(5);
98
+ i0.ɵɵadvance();
99
+ i0.ɵɵtextInterpolate1("Suggested: ", ctx_r1.SuggestedTableName);
100
+ } }
101
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Conditional_2_Template(rf, ctx) { if (rf & 1) {
102
+ i0.ɵɵelement(0, "i", 42);
103
+ i0.ɵɵtext(1, " Generating... ");
104
+ } }
105
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Conditional_3_Template(rf, ctx) { if (rf & 1) {
106
+ i0.ɵɵelement(0, "i", 35);
107
+ i0.ɵɵtext(1, " Preview DDL ");
108
+ } }
109
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Conditional_4_Template(rf, ctx) { if (rf & 1) {
110
+ i0.ɵɵelementStart(0, "div", 53);
111
+ i0.ɵɵelement(1, "i", 43);
112
+ i0.ɵɵtext(2);
113
+ i0.ɵɵelementEnd();
114
+ } if (rf & 2) {
115
+ const ctx_r1 = i0.ɵɵnextContext(6);
116
+ i0.ɵɵadvance(2);
117
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.DDLPreviewError, " ");
118
+ } }
119
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Conditional_5_Template(rf, ctx) { if (rf & 1) {
120
+ i0.ɵɵelementStart(0, "pre", 54);
121
+ i0.ɵɵtext(1);
122
+ i0.ɵɵelementEnd();
123
+ } if (rf & 2) {
124
+ const ctx_r1 = i0.ɵɵnextContext(6);
125
+ i0.ɵɵadvance();
126
+ i0.ɵɵtextInterpolate(ctx_r1.DDLPreviewContent);
127
+ } }
128
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Template(rf, ctx) { if (rf & 1) {
129
+ const _r8 = i0.ɵɵgetCurrentView();
130
+ i0.ɵɵelementStart(0, "div", 51)(1, "button", 52);
131
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.PreviewDDL()); });
132
+ i0.ɵɵconditionalCreate(2, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Conditional_2_Template, 2, 0)(3, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Conditional_3_Template, 2, 0);
133
+ i0.ɵɵelementEnd();
134
+ i0.ɵɵconditionalCreate(4, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Conditional_4_Template, 3, 1, "div", 53);
135
+ i0.ɵɵconditionalCreate(5, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Conditional_5_Template, 2, 1, "pre", 54);
136
+ i0.ɵɵelementEnd();
137
+ } if (rf & 2) {
138
+ const ctx_r1 = i0.ɵɵnextContext(5);
139
+ i0.ɵɵadvance();
140
+ i0.ɵɵproperty("look", "outline")("size", "small")("disabled", ctx_r1.IsGeneratingDDL);
141
+ i0.ɵɵadvance();
142
+ i0.ɵɵconditional(ctx_r1.IsGeneratingDDL ? 2 : 3);
143
+ i0.ɵɵadvance(2);
144
+ i0.ɵɵconditional(ctx_r1.DDLPreviewError ? 4 : -1);
145
+ i0.ɵɵadvance();
146
+ i0.ɵɵconditional(ctx_r1.DDLPreviewContent ? 5 : -1);
147
+ } }
148
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Template(rf, ctx) { if (rf & 1) {
149
+ const _r7 = i0.ɵɵgetCurrentView();
150
+ i0.ɵɵelementStart(0, "div", 37)(1, "div", 46);
151
+ i0.ɵɵtext(2, "Define New Entity");
152
+ i0.ɵɵelementEnd();
153
+ i0.ɵɵelementStart(3, "div", 29)(4, "label");
154
+ i0.ɵɵtext(5, "DB Schema");
155
+ i0.ɵɵelementEnd();
156
+ i0.ɵɵelementStart(6, "kendo-combobox", 47);
157
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Template_kendo_combobox_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntitySchemaName, $event) || (ctx_r1.NewEntitySchemaName = $event); return i0.ɵɵresetView($event); });
158
+ i0.ɵɵlistener("valueChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Template_kendo_combobox_valueChange_6_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnSchemaNameChange()); });
159
+ i0.ɵɵelementEnd()();
160
+ i0.ɵɵelementStart(7, "div", 48)(8, "div", 29)(9, "label");
161
+ i0.ɵɵtext(10, "Table Name");
162
+ i0.ɵɵelementEnd();
163
+ i0.ɵɵelementStart(11, "input", 49);
164
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Template_input_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityTableName, $event) || (ctx_r1.NewEntityTableName = $event); return i0.ɵɵresetView($event); });
165
+ i0.ɵɵelementEnd();
166
+ i0.ɵɵconditionalCreate(12, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_12_Template, 2, 1, "span", 50);
167
+ i0.ɵɵelementEnd();
168
+ i0.ɵɵelementStart(13, "div", 29)(14, "label");
169
+ i0.ɵɵtext(15, "Entity Name");
170
+ i0.ɵɵelementEnd();
171
+ i0.ɵɵelementStart(16, "input", 49);
172
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityName, $event) || (ctx_r1.NewEntityName = $event); return i0.ɵɵresetView($event); });
173
+ i0.ɵɵelementEnd()()();
174
+ i0.ɵɵconditionalCreate(17, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Conditional_17_Template, 6, 6, "div", 51);
175
+ i0.ɵɵelementEnd();
176
+ } if (rf & 2) {
177
+ const ctx_r1 = i0.ɵɵnextContext(4);
178
+ i0.ɵɵadvance(6);
179
+ i0.ɵɵproperty("data", ctx_r1.DBSchemas);
180
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntitySchemaName);
181
+ i0.ɵɵproperty("allowCustom", true)("filterable", true)("placeholder", "Select or type schema...");
182
+ i0.ɵɵadvance(5);
183
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntityTableName);
184
+ i0.ɵɵproperty("placeholder", ctx_r1.SuggestedTableName || "Table name");
185
+ i0.ɵɵadvance();
186
+ i0.ɵɵconditional(ctx_r1.SuggestedTableName && !ctx_r1.NewEntityTableName ? 12 : -1);
187
+ i0.ɵɵadvance(4);
188
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntityName);
189
+ i0.ɵɵproperty("placeholder", ctx_r1.SuggestedEntityName || "Entity name");
190
+ i0.ɵɵadvance();
191
+ i0.ɵɵconditional(ctx_r1.SelectedSourceObjectName && ctx_r1.NewEntitySchemaName && ctx_r1.NewEntityTableName ? 17 : -1);
192
+ } }
193
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_29_Template(rf, ctx) { if (rf & 1) {
194
+ i0.ɵɵelement(0, "i", 42);
195
+ i0.ɵɵtext(1, " Saving... ");
196
+ } }
197
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_30_Template(rf, ctx) { if (rf & 1) {
198
+ i0.ɵɵelement(0, "i", 36);
199
+ i0.ɵɵtext(1, " Create Pending Map ");
200
+ } }
201
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_31_Template(rf, ctx) { if (rf & 1) {
202
+ i0.ɵɵelement(0, "i", 55);
203
+ i0.ɵɵtext(1, " Add Map ");
204
+ } }
205
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Template(rf, ctx) { if (rf & 1) {
206
+ const _r4 = i0.ɵɵgetCurrentView();
207
+ i0.ɵɵelementStart(0, "div", 22)(1, "div", 25)(2, "h5");
208
+ i0.ɵɵelement(3, "i", 26);
209
+ i0.ɵɵtext(4, " Add Entity Map");
210
+ i0.ɵɵelementEnd();
211
+ i0.ɵɵelementStart(5, "button", 27);
212
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseAddPanel()); });
213
+ i0.ɵɵelement(6, "i", 28);
214
+ i0.ɵɵelementEnd()();
215
+ i0.ɵɵelementStart(7, "div", 29)(8, "label");
216
+ i0.ɵɵtext(9, "Source Object");
217
+ i0.ɵɵelementEnd();
218
+ i0.ɵɵconditionalCreate(10, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_10_Template, 3, 0, "div", 30)(11, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_11_Template, 3, 1, "div", 31)(12, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_12_Template, 2, 0, "div", 31)(13, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_13_Template, 1, 8, "kendo-dropdownlist", 32);
219
+ i0.ɵɵelementEnd();
220
+ i0.ɵɵelementStart(14, "div", 33)(15, "button", 34);
221
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SetTargetMode("existing")); });
222
+ i0.ɵɵelement(16, "i", 35);
223
+ i0.ɵɵtext(17, " Existing Entity ");
224
+ i0.ɵɵelementEnd();
225
+ i0.ɵɵelementStart(18, "button", 34);
226
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SetTargetMode("new")); });
227
+ i0.ɵɵelement(19, "i", 36);
228
+ i0.ɵɵtext(20, " New Entity ");
229
+ i0.ɵɵelementEnd()();
230
+ i0.ɵɵconditionalCreate(21, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_21_Template, 5, 1, "div", 29);
231
+ i0.ɵɵconditionalCreate(22, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_22_Template, 18, 11, "div", 37);
232
+ i0.ɵɵelementStart(23, "div", 29)(24, "label");
233
+ i0.ɵɵtext(25, "Sync Direction");
234
+ i0.ɵɵelementEnd();
235
+ i0.ɵɵelementStart(26, "kendo-dropdownlist", 38);
236
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Template_kendo_dropdownlist_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.AddSyncDirection, $event) || (ctx_r1.AddSyncDirection = $event); return i0.ɵɵresetView($event); });
237
+ i0.ɵɵelementEnd()();
238
+ i0.ɵɵelementStart(27, "div", 39)(28, "button", 40);
239
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SaveAddMap()); });
240
+ i0.ɵɵconditionalCreate(29, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_29_Template, 2, 0)(30, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_30_Template, 2, 0)(31, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Conditional_31_Template, 2, 0);
241
+ i0.ɵɵelementEnd();
242
+ i0.ɵɵelementStart(32, "button", 41);
243
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Template_button_click_32_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseAddPanel()); });
244
+ i0.ɵɵtext(33, " Cancel ");
245
+ i0.ɵɵelementEnd()()();
246
+ } if (rf & 2) {
247
+ const ctx_r1 = i0.ɵɵnextContext(3);
248
+ i0.ɵɵadvance(10);
249
+ i0.ɵɵconditional(ctx_r1.IsDiscoveringObjects ? 10 : ctx_r1.DiscoverError ? 11 : ctx_r1.DiscoveredObjects.length === 0 ? 12 : 13);
250
+ i0.ɵɵadvance(5);
251
+ i0.ɵɵclassProp("active", ctx_r1.TargetMode === "existing");
252
+ i0.ɵɵadvance(3);
253
+ i0.ɵɵclassProp("active", ctx_r1.TargetMode === "new");
254
+ i0.ɵɵadvance(3);
255
+ i0.ɵɵconditional(ctx_r1.TargetMode === "existing" ? 21 : -1);
256
+ i0.ɵɵadvance();
257
+ i0.ɵɵconditional(ctx_r1.TargetMode === "new" ? 22 : -1);
258
+ i0.ɵɵadvance(4);
259
+ i0.ɵɵproperty("data", i0.ɵɵpureFunction0(14, _c1));
260
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.AddSyncDirection);
261
+ i0.ɵɵadvance(2);
262
+ i0.ɵɵproperty("themeColor", "primary")("size", "small")("disabled", !ctx_r1.IsAddFormValid || ctx_r1.IsSavingEntityMap);
263
+ i0.ɵɵadvance();
264
+ i0.ɵɵconditional(ctx_r1.IsSavingEntityMap ? 29 : ctx_r1.TargetMode === "new" ? 30 : 31);
265
+ i0.ɵɵadvance(3);
266
+ i0.ɵɵproperty("size", "small");
267
+ } }
268
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_8_Template(rf, ctx) { if (rf & 1) {
269
+ const _r9 = i0.ɵɵgetCurrentView();
270
+ i0.ɵɵelementStart(0, "div", 23)(1, "input", 56);
271
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_8_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.EntityMapSearchText, $event) || (ctx_r1.EntityMapSearchText = $event); return i0.ɵɵresetView($event); });
31
272
  i0.ɵɵelementEnd()();
32
273
  } if (rf & 2) {
33
274
  const ctx_r1 = i0.ɵɵnextContext(3);
34
275
  i0.ɵɵadvance();
35
276
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.EntityMapSearchText);
36
277
  } }
37
- function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_4_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelementStart(0, "p", 16);
39
- i0.ɵɵtext(1, "No entity maps configured.");
40
- i0.ɵɵelementEnd();
278
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_9_Template(rf, ctx) { if (rf & 1) {
279
+ const _r10 = i0.ɵɵgetCurrentView();
280
+ i0.ɵɵelementStart(0, "p", 15);
281
+ i0.ɵɵtext(1, " No entity maps configured. ");
282
+ i0.ɵɵelementStart(2, "a", 57);
283
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_9_Template_a_click_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenAddPanel()); });
284
+ i0.ɵɵtext(3, "Add one");
285
+ i0.ɵɵelementEnd()();
41
286
  } }
42
- function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
43
- i0.ɵɵelementStart(0, "p", 16);
287
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_10_Template(rf, ctx) { if (rf & 1) {
288
+ i0.ɵɵelementStart(0, "p", 15);
44
289
  i0.ɵɵtext(1);
45
290
  i0.ɵɵelementEnd();
46
291
  } if (rf & 2) {
@@ -48,220 +293,1080 @@ function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_5_Tem
48
293
  i0.ɵɵadvance();
49
294
  i0.ɵɵtextInterpolate1("No matches for \"", ctx_r1.EntityMapSearchText, "\".");
50
295
  } }
51
- function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
52
- const _r4 = i0.ɵɵgetCurrentView();
53
- i0.ɵɵelementStart(0, "div", 22);
54
- i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_6_For_2_Template_div_click_0_listener() { const em_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnEntityMapSelect(em_r5)); });
55
- i0.ɵɵelementStart(1, "div", 23)(2, "span", 24);
296
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
297
+ i0.ɵɵelementStart(0, "span", 68);
298
+ i0.ɵɵtext(1, "Pending");
299
+ i0.ɵɵelementEnd();
300
+ } }
301
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
302
+ const _r13 = i0.ɵɵgetCurrentView();
303
+ i0.ɵɵelementStart(0, "kendo-switch", 73);
304
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Conditional_16_Template_kendo_switch_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r13); const item_r12 = i0.ɵɵnextContext().$implicit; i0.ɵɵtwoWayBindingSet(item_r12.RealMap.SyncEnabled, $event) || (item_r12.RealMap.SyncEnabled = $event); return i0.ɵɵresetView($event); });
305
+ i0.ɵɵlistener("valueChange", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Conditional_16_Template_kendo_switch_valueChange_0_listener() { i0.ɵɵrestoreView(_r13); const item_r12 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnToggleEntityMap(item_r12.RealMap)); });
306
+ i0.ɵɵelementEnd();
307
+ } if (rf & 2) {
308
+ const item_r12 = i0.ɵɵnextContext().$implicit;
309
+ i0.ɵɵtwoWayProperty("ngModel", item_r12.RealMap.SyncEnabled);
310
+ i0.ɵɵproperty("size", "small");
311
+ } }
312
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
313
+ const _r11 = i0.ɵɵgetCurrentView();
314
+ i0.ɵɵelementStart(0, "div", 59);
315
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Template_div_click_0_listener() { const item_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnMapSelect(item_r12)); });
316
+ i0.ɵɵelementStart(1, "div", 60)(2, "span", 61);
56
317
  i0.ɵɵtext(3);
57
318
  i0.ɵɵelementEnd();
58
- i0.ɵɵelementStart(4, "span", 25);
59
- i0.ɵɵtext(5, "->");
319
+ i0.ɵɵelementStart(4, "span", 62);
320
+ i0.ɵɵelement(5, "i", 63);
321
+ i0.ɵɵelementEnd();
322
+ i0.ɵɵelementStart(6, "span", 64);
323
+ i0.ɵɵtext(7);
324
+ i0.ɵɵelementEnd()();
325
+ i0.ɵɵelementStart(8, "div", 65)(9, "div", 66)(10, "span", 67);
326
+ i0.ɵɵtext(11);
327
+ i0.ɵɵelementEnd();
328
+ i0.ɵɵconditionalCreate(12, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Conditional_12_Template, 2, 0, "span", 68);
329
+ i0.ɵɵelementEnd();
330
+ i0.ɵɵelementStart(13, "div", 69)(14, "button", 70);
331
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Template_button_click_14_listener($event) { const item_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnDeleteMap(item_r12, $event)); });
332
+ i0.ɵɵelement(15, "i", 71);
333
+ i0.ɵɵelementEnd();
334
+ i0.ɵɵconditionalCreate(16, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Conditional_16_Template, 1, 2, "kendo-switch", 72);
335
+ i0.ɵɵelementEnd()()();
336
+ } if (rf & 2) {
337
+ const item_r12 = ctx.$implicit;
338
+ const ctx_r1 = i0.ɵɵnextContext(4);
339
+ i0.ɵɵclassProp("selected", ctx_r1.IsSelectedMap(item_r12.ID))("pending", item_r12.IsPending);
340
+ i0.ɵɵadvance(3);
341
+ i0.ɵɵtextInterpolate(item_r12.SourceName);
342
+ i0.ɵɵadvance(4);
343
+ i0.ɵɵtextInterpolate(item_r12.TargetName);
344
+ i0.ɵɵadvance(4);
345
+ i0.ɵɵtextInterpolate(item_r12.SyncDirection);
346
+ i0.ɵɵadvance();
347
+ i0.ɵɵconditional(item_r12.IsPending ? 12 : -1);
348
+ i0.ɵɵadvance(4);
349
+ i0.ɵɵconditional(!item_r12.IsPending && item_r12.RealMap ? 16 : -1);
350
+ } }
351
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_Template(rf, ctx) { if (rf & 1) {
352
+ i0.ɵɵelementStart(0, "div", 24);
353
+ i0.ɵɵrepeaterCreate(1, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_For_2_Template, 17, 9, "div", 58, _forTrack0);
354
+ i0.ɵɵelementEnd();
355
+ } if (rf & 2) {
356
+ const ctx_r1 = i0.ɵɵnextContext(3);
357
+ i0.ɵɵadvance();
358
+ i0.ɵɵrepeater(ctx_r1.FilteredMaps);
359
+ } }
360
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
361
+ const _r3 = i0.ɵɵgetCurrentView();
362
+ i0.ɵɵelementStart(0, "div", 17)(1, "span", 18);
363
+ i0.ɵɵtext(2, "Entity Maps");
364
+ i0.ɵɵelementEnd();
365
+ i0.ɵɵelementStart(3, "div", 19)(4, "button", 20);
366
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_7_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenAddPanel()); });
367
+ i0.ɵɵelement(5, "i", 21);
368
+ i0.ɵɵtext(6, " Add Map ");
369
+ i0.ɵɵelementEnd()()();
370
+ i0.ɵɵconditionalCreate(7, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_7_Template, 34, 15, "div", 22);
371
+ i0.ɵɵconditionalCreate(8, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_8_Template, 2, 1, "div", 23);
372
+ i0.ɵɵconditionalCreate(9, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_9_Template, 4, 0, "p", 15)(10, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_10_Template, 2, 1, "p", 15)(11, MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_11_Template, 3, 0, "div", 24);
373
+ } if (rf & 2) {
374
+ const ctx_r1 = i0.ɵɵnextContext(2);
375
+ i0.ɵɵadvance(4);
376
+ i0.ɵɵproperty("look", "flat")("size", "small");
377
+ i0.ɵɵadvance(3);
378
+ i0.ɵɵconditional(ctx_r1.ShowAddPanel ? 7 : -1);
379
+ i0.ɵɵadvance();
380
+ i0.ɵɵconditional(ctx_r1.AllMaps.length > 0 ? 8 : -1);
381
+ i0.ɵɵadvance();
382
+ i0.ɵɵconditional(ctx_r1.AllMaps.length === 0 && !ctx_r1.ShowAddPanel ? 9 : ctx_r1.FilteredMaps.length === 0 && ctx_r1.AllMaps.length > 0 ? 10 : 11);
383
+ } }
384
+ function MappingWorkspaceComponent_Conditional_6_Conditional_9_Template(rf, ctx) { if (rf & 1) {
385
+ i0.ɵɵelementStart(0, "div", 11);
386
+ i0.ɵɵelement(1, "i", 74);
387
+ i0.ɵɵelementStart(2, "p");
388
+ i0.ɵɵtext(3, "Select an entity map from the left panel to view and edit field mappings.");
389
+ i0.ɵɵelementEnd()();
390
+ } }
391
+ function MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_19_Template(rf, ctx) { if (rf & 1) {
392
+ i0.ɵɵelement(0, "i", 55);
393
+ } }
394
+ function MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_20_Template(rf, ctx) { if (rf & 1) {
395
+ i0.ɵɵtext(0, " 2 ");
396
+ } }
397
+ function MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_35_Template(rf, ctx) { if (rf & 1) {
398
+ const _r14 = i0.ɵɵgetCurrentView();
399
+ i0.ɵɵelementStart(0, "div", 84)(1, "h4", 86);
400
+ i0.ɵɵelement(2, "i", 35);
401
+ i0.ɵɵtext(3, " Generated DDL ");
402
+ i0.ɵɵelementEnd();
403
+ i0.ɵɵelementStart(4, "pre", 87);
404
+ i0.ɵɵtext(5);
405
+ i0.ɵɵelementEnd();
406
+ i0.ɵɵelementStart(6, "div", 88)(7, "button", 89);
407
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_35_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CopyDDLToClipboard(ctx_r1.SelectedPendingMap.DDLContent)); });
408
+ i0.ɵɵelement(8, "i", 90);
409
+ i0.ɵɵtext(9, " Copy DDL ");
410
+ i0.ɵɵelementEnd()()();
411
+ } if (rf & 2) {
412
+ const ctx_r1 = i0.ɵɵnextContext(3);
413
+ i0.ɵɵadvance(5);
414
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedPendingMap.DDLContent);
415
+ i0.ɵɵadvance(2);
416
+ i0.ɵɵproperty("look", "outline")("size", "small");
417
+ } }
418
+ function MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_36_For_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
419
+ i0.ɵɵelement(0, "i", 98);
420
+ } }
421
+ function MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_36_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
422
+ i0.ɵɵelementStart(0, "span", 99);
423
+ i0.ɵɵtext(1, "*");
424
+ i0.ɵɵelementEnd();
425
+ } }
426
+ function MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_36_For_8_Template(rf, ctx) { if (rf & 1) {
427
+ i0.ɵɵelementStart(0, "div", 95)(1, "span", 96);
428
+ i0.ɵɵtext(2);
429
+ i0.ɵɵelementEnd();
430
+ i0.ɵɵelementStart(3, "span", 97);
431
+ i0.ɵɵtext(4);
432
+ i0.ɵɵelementEnd();
433
+ i0.ɵɵconditionalCreate(5, MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_36_For_8_Conditional_5_Template, 1, 0, "i", 98);
434
+ i0.ɵɵconditionalCreate(6, MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_36_For_8_Conditional_6_Template, 2, 0, "span", 99);
435
+ i0.ɵɵelementEnd();
436
+ } if (rf & 2) {
437
+ const field_r15 = ctx.$implicit;
438
+ i0.ɵɵadvance(2);
439
+ i0.ɵɵtextInterpolate(field_r15.Name);
440
+ i0.ɵɵadvance(2);
441
+ i0.ɵɵtextInterpolate(field_r15.Type);
442
+ i0.ɵɵadvance();
443
+ i0.ɵɵconditional(field_r15.IsPrimaryKey ? 5 : -1);
444
+ i0.ɵɵadvance();
445
+ i0.ɵɵconditional(field_r15.IsRequired ? 6 : -1);
446
+ } }
447
+ function MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_36_Template(rf, ctx) { if (rf & 1) {
448
+ i0.ɵɵelementStart(0, "div", 85)(1, "h4", 91);
449
+ i0.ɵɵelement(2, "i", 92);
450
+ i0.ɵɵtext(3, " Source Fields ");
451
+ i0.ɵɵelementStart(4, "span", 93);
452
+ i0.ɵɵtext(5);
453
+ i0.ɵɵelementEnd()();
454
+ i0.ɵɵelementStart(6, "div", 94);
455
+ i0.ɵɵrepeaterCreate(7, MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_36_For_8_Template, 7, 4, "div", 95, _forTrack1);
456
+ i0.ɵɵelementEnd()();
457
+ } if (rf & 2) {
458
+ const ctx_r1 = i0.ɵɵnextContext(3);
459
+ i0.ɵɵadvance(5);
460
+ i0.ɵɵtextInterpolate1("(", ctx_r1.SelectedPendingMap.SourceFields.length, ")");
461
+ i0.ɵɵadvance(2);
462
+ i0.ɵɵrepeater(ctx_r1.SelectedPendingMap.SourceFields);
463
+ } }
464
+ function MappingWorkspaceComponent_Conditional_6_Conditional_10_Template(rf, ctx) { if (rf & 1) {
465
+ i0.ɵɵelementStart(0, "div", 12)(1, "div", 75);
466
+ i0.ɵɵelement(2, "i", 76);
467
+ i0.ɵɵelementEnd();
468
+ i0.ɵɵelementStart(3, "h3");
469
+ i0.ɵɵtext(4);
470
+ i0.ɵɵelementEnd();
471
+ i0.ɵɵelementStart(5, "p");
472
+ i0.ɵɵtext(6, " This entity map is waiting for the target entity ");
473
+ i0.ɵɵelementStart(7, "strong");
474
+ i0.ɵɵtext(8);
475
+ i0.ɵɵelementEnd();
476
+ i0.ɵɵtext(9, " to be created. Run the DDL migration and CodeGen to activate this mapping. ");
477
+ i0.ɵɵelementEnd();
478
+ i0.ɵɵelementStart(10, "div", 77)(11, "div", 78)(12, "div", 79);
479
+ i0.ɵɵelement(13, "i", 55);
480
+ i0.ɵɵelementEnd();
481
+ i0.ɵɵelementStart(14, "span", 80);
482
+ i0.ɵɵtext(15, "Map Created");
483
+ i0.ɵɵelementEnd()();
484
+ i0.ɵɵelement(16, "div", 81);
485
+ i0.ɵɵelementStart(17, "div", 78)(18, "div", 82);
486
+ i0.ɵɵconditionalCreate(19, MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_19_Template, 1, 0, "i", 55)(20, MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_20_Template, 1, 0);
487
+ i0.ɵɵelementEnd();
488
+ i0.ɵɵelementStart(21, "span", 80);
489
+ i0.ɵɵtext(22, "DDL Generated");
490
+ i0.ɵɵelementEnd()();
491
+ i0.ɵɵelement(23, "div", 81);
492
+ i0.ɵɵelementStart(24, "div", 78)(25, "div", 83);
493
+ i0.ɵɵtext(26, "3");
494
+ i0.ɵɵelementEnd();
495
+ i0.ɵɵelementStart(27, "span", 80);
496
+ i0.ɵɵtext(28, "Deploy & CodeGen");
497
+ i0.ɵɵelementEnd()();
498
+ i0.ɵɵelement(29, "div", 81);
499
+ i0.ɵɵelementStart(30, "div", 78)(31, "div", 83);
500
+ i0.ɵɵtext(32, "4");
501
+ i0.ɵɵelementEnd();
502
+ i0.ɵɵelementStart(33, "span", 80);
503
+ i0.ɵɵtext(34, "Ready to Sync");
504
+ i0.ɵɵelementEnd()()();
505
+ i0.ɵɵconditionalCreate(35, MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_35_Template, 10, 3, "div", 84);
506
+ i0.ɵɵconditionalCreate(36, MappingWorkspaceComponent_Conditional_6_Conditional_10_Conditional_36_Template, 9, 1, "div", 85);
507
+ i0.ɵɵelementEnd();
508
+ } if (rf & 2) {
509
+ const ctx_r1 = i0.ɵɵnextContext(2);
510
+ i0.ɵɵadvance(4);
511
+ i0.ɵɵtextInterpolate1("Pending Entity: ", ctx_r1.SelectedPendingMap.EntityName);
512
+ i0.ɵɵadvance(4);
513
+ i0.ɵɵtextInterpolate2("", ctx_r1.SelectedPendingMap.SchemaName, ".", ctx_r1.SelectedPendingMap.TableName);
514
+ i0.ɵɵadvance(8);
515
+ i0.ɵɵclassProp("done", ctx_r1.SelectedPendingMap.DDLContent);
516
+ i0.ɵɵadvance(2);
517
+ i0.ɵɵproperty("ngClass", ctx_r1.GetPendingStepStatus(ctx_r1.SelectedPendingMap, 2));
518
+ i0.ɵɵadvance();
519
+ i0.ɵɵconditional(ctx_r1.SelectedPendingMap.DDLContent ? 19 : 20);
520
+ i0.ɵɵadvance(16);
521
+ i0.ɵɵconditional(ctx_r1.SelectedPendingMap.DDLContent ? 35 : -1);
522
+ i0.ɵɵadvance();
523
+ i0.ɵɵconditional(ctx_r1.SelectedPendingMap.SourceFields.length > 0 ? 36 : -1);
524
+ } }
525
+ function MappingWorkspaceComponent_Conditional_6_Conditional_11_Template(rf, ctx) { if (rf & 1) {
526
+ i0.ɵɵelement(0, "mj-loading", 13);
527
+ } }
528
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_0_Template(rf, ctx) { if (rf & 1) {
529
+ const _r17 = i0.ɵɵgetCurrentView();
530
+ i0.ɵɵelementStart(0, "div", 100);
531
+ i0.ɵɵelement(1, "i", 36);
532
+ i0.ɵɵelementStart(2, "div", 112)(3, "p")(4, "strong");
533
+ i0.ɵɵtext(5);
534
+ i0.ɵɵelementEnd();
535
+ i0.ɵɵtext(6, " by matching source and destination field names.");
536
+ i0.ɵɵelementEnd()();
537
+ i0.ɵɵelementStart(7, "button", 89);
538
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_0_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.DismissAutoMapBanner()); });
539
+ i0.ɵɵelement(8, "i", 28);
540
+ i0.ɵɵelementEnd()();
541
+ } if (rf & 2) {
542
+ const ctx_r1 = i0.ɵɵnextContext(3);
543
+ i0.ɵɵadvance(5);
544
+ i0.ɵɵtextInterpolate2("", ctx_r1.AutoMapCount, " field", ctx_r1.AutoMapCount !== 1 ? "s" : "", " auto-mapped");
545
+ i0.ɵɵadvance(2);
546
+ i0.ɵɵproperty("look", "flat")("size", "small");
547
+ } }
548
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_1_For_4_Template(rf, ctx) { if (rf & 1) {
549
+ i0.ɵɵelementStart(0, "span");
550
+ i0.ɵɵtext(1);
551
+ i0.ɵɵelementEnd();
552
+ } if (rf & 2) {
553
+ const warning_r18 = ctx.$implicit;
554
+ i0.ɵɵadvance();
555
+ i0.ɵɵtextInterpolate(warning_r18);
556
+ } }
557
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
558
+ i0.ɵɵelementStart(0, "div", 101);
559
+ i0.ɵɵelement(1, "i", 43);
560
+ i0.ɵɵelementStart(2, "div", 113);
561
+ i0.ɵɵrepeaterCreate(3, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_1_For_4_Template, 2, 1, "span", null, i0.ɵɵrepeaterTrackByIdentity);
562
+ i0.ɵɵelementEnd()();
563
+ } if (rf & 2) {
564
+ const ctx_r1 = i0.ɵɵnextContext(3);
565
+ i0.ɵɵadvance(3);
566
+ i0.ɵɵrepeater(ctx_r1.MappingValidation.Warnings);
567
+ } }
568
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_15_Template(rf, ctx) { if (rf & 1) {
569
+ i0.ɵɵelement(0, "i", 42);
570
+ i0.ɵɵtext(1, " Saving... ");
571
+ } }
572
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_16_Template(rf, ctx) { if (rf & 1) {
573
+ i0.ɵɵelement(0, "i", 114);
574
+ i0.ɵɵtext(1, " Save ");
575
+ } }
576
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_17_Template(rf, ctx) { if (rf & 1) {
577
+ const _r19 = i0.ɵɵgetCurrentView();
578
+ i0.ɵɵelementStart(0, "p", 15);
579
+ i0.ɵɵtext(1, " No field mappings yet. ");
580
+ i0.ɵɵelementStart(2, "a", 57);
581
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_17_Template_a_click_2_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddFieldMapping()); });
582
+ i0.ɵɵtext(3, "Add one");
583
+ i0.ɵɵelementEnd()();
584
+ } }
585
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
586
+ const _r21 = i0.ɵɵgetCurrentView();
587
+ i0.ɵɵelementStart(0, "input", 134);
588
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_3_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r21); const field_r22 = i0.ɵɵnextContext().$implicit; i0.ɵɵtwoWayBindingSet(field_r22.SourceFieldName, $event) || (field_r22.SourceFieldName = $event); return i0.ɵɵresetView($event); });
589
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_3_Template_input_ngModelChange_0_listener() { i0.ɵɵrestoreView(_r21); const field_r22 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFieldChanged(field_r22)); });
590
+ i0.ɵɵelementEnd();
591
+ } if (rf & 2) {
592
+ const field_r22 = i0.ɵɵnextContext().$implicit;
593
+ i0.ɵɵtwoWayProperty("ngModel", field_r22.SourceFieldName);
594
+ } }
595
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
596
+ i0.ɵɵelementStart(0, "span", 137);
597
+ i0.ɵɵtext(1);
598
+ i0.ɵɵelementEnd();
599
+ } if (rf & 2) {
600
+ const field_r22 = i0.ɵɵnextContext(2).$implicit;
601
+ i0.ɵɵadvance();
602
+ i0.ɵɵtextInterpolate(field_r22.SourceFieldType);
603
+ } }
604
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
605
+ i0.ɵɵelementStart(0, "span", 138);
606
+ i0.ɵɵelement(1, "i", 129);
607
+ i0.ɵɵtext(2, " PK");
608
+ i0.ɵɵelementEnd();
609
+ } }
610
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Conditional_5_Template(rf, ctx) { if (rf & 1) {
611
+ i0.ɵɵelementStart(0, "span", 139);
612
+ i0.ɵɵtext(1, "REQ");
613
+ i0.ɵɵelementEnd();
614
+ } }
615
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
616
+ i0.ɵɵelementStart(0, "span", 140);
617
+ i0.ɵɵtext(1, "RO");
618
+ i0.ɵɵelementEnd();
619
+ } }
620
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
621
+ i0.ɵɵelementStart(0, "div", 135);
622
+ i0.ɵɵtext(1);
623
+ i0.ɵɵelementEnd();
624
+ i0.ɵɵelementStart(2, "div", 136);
625
+ i0.ɵɵconditionalCreate(3, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Conditional_3_Template, 2, 1, "span", 137);
626
+ i0.ɵɵconditionalCreate(4, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Conditional_4_Template, 3, 0, "span", 138);
627
+ i0.ɵɵconditionalCreate(5, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Conditional_5_Template, 2, 0, "span", 139);
628
+ i0.ɵɵconditionalCreate(6, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Conditional_6_Template, 2, 0, "span", 140);
629
+ i0.ɵɵelementEnd();
630
+ } if (rf & 2) {
631
+ const field_r22 = i0.ɵɵnextContext().$implicit;
632
+ i0.ɵɵadvance();
633
+ i0.ɵɵtextInterpolate(field_r22.SourceFieldName);
634
+ i0.ɵɵadvance(2);
635
+ i0.ɵɵconditional(field_r22.SourceFieldType ? 3 : -1);
636
+ i0.ɵɵadvance();
637
+ i0.ɵɵconditional(field_r22.IsSourcePK ? 4 : -1);
638
+ i0.ɵɵadvance();
639
+ i0.ɵɵconditional(field_r22.IsSourceRequired ? 5 : -1);
640
+ i0.ɵɵadvance();
641
+ i0.ɵɵconditional(field_r22.IsSourceReadOnly ? 6 : -1);
642
+ } }
643
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
644
+ const _r23 = i0.ɵɵgetCurrentView();
645
+ i0.ɵɵelementStart(0, "button", 141);
646
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const field_r22 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ToggleTransformEditor(field_r22)); });
647
+ i0.ɵɵelement(1, "i");
648
+ i0.ɵɵelementStart(2, "span");
649
+ i0.ɵɵtext(3);
650
+ i0.ɵɵelementEnd();
651
+ i0.ɵɵelementStart(4, "span", 142);
652
+ i0.ɵɵtext(5);
653
+ i0.ɵɵelementEnd()();
654
+ } if (rf & 2) {
655
+ const field_r22 = i0.ɵɵnextContext().$implicit;
656
+ const ctx_r1 = i0.ɵɵnextContext(4);
657
+ i0.ɵɵproperty("title", field_r22.TransformPipeline.length + " transform step(s)");
658
+ i0.ɵɵadvance();
659
+ i0.ɵɵclassMap(ctx_r1.GetTransformIcon(field_r22.TransformPipeline[0].Type));
660
+ i0.ɵɵadvance(2);
661
+ i0.ɵɵtextInterpolate(ctx_r1.GetTransformLabel(field_r22.TransformPipeline[0].Type));
662
+ i0.ɵɵadvance(2);
663
+ i0.ɵɵtextInterpolate1("+", field_r22.TransformPipeline.length - 1);
664
+ } }
665
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
666
+ const _r24 = i0.ɵɵgetCurrentView();
667
+ i0.ɵɵelementStart(0, "button", 143);
668
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r24); const field_r22 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.ToggleTransformEditor(field_r22)); });
669
+ i0.ɵɵelement(1, "i", 63);
670
+ i0.ɵɵelementStart(2, "span");
671
+ i0.ɵɵtext(3);
672
+ i0.ɵɵelementEnd()();
673
+ } if (rf & 2) {
674
+ const field_r22 = i0.ɵɵnextContext().$implicit;
675
+ const ctx_r1 = i0.ɵɵnextContext(4);
676
+ i0.ɵɵadvance(3);
677
+ i0.ɵɵtextInterpolate(field_r22.TransformPipeline.length > 0 ? ctx_r1.GetTransformLabel(field_r22.TransformPipeline[0].Type) : "Direct");
678
+ } }
679
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_9_For_4_Template(rf, ctx) { if (rf & 1) {
680
+ i0.ɵɵelementStart(0, "option", 146);
681
+ i0.ɵɵtext(1);
682
+ i0.ɵɵelementEnd();
683
+ } if (rf & 2) {
684
+ const df_r26 = ctx.$implicit;
685
+ i0.ɵɵproperty("value", df_r26.Name);
686
+ i0.ɵɵadvance();
687
+ i0.ɵɵtextInterpolate(df_r26.Name);
688
+ } }
689
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
690
+ const _r25 = i0.ɵɵgetCurrentView();
691
+ i0.ɵɵelementStart(0, "select", 144);
692
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_9_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r25); const field_r22 = i0.ɵɵnextContext().$implicit; i0.ɵɵtwoWayBindingSet(field_r22.DestinationFieldName, $event) || (field_r22.DestinationFieldName = $event); return i0.ɵɵresetView($event); });
693
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_9_Template_select_ngModelChange_0_listener() { i0.ɵɵrestoreView(_r25); const field_r22 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFieldChanged(field_r22)); });
694
+ i0.ɵɵelementStart(1, "option", 145);
695
+ i0.ɵɵtext(2, "-- Select destination --");
696
+ i0.ɵɵelementEnd();
697
+ i0.ɵɵrepeaterCreate(3, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_9_For_4_Template, 2, 2, "option", 146, _forTrack0);
698
+ i0.ɵɵelementEnd();
699
+ } if (rf & 2) {
700
+ const field_r22 = i0.ɵɵnextContext().$implicit;
701
+ const ctx_r1 = i0.ɵɵnextContext(4);
702
+ i0.ɵɵtwoWayProperty("ngModel", field_r22.DestinationFieldName);
703
+ i0.ɵɵadvance(3);
704
+ i0.ɵɵrepeater(ctx_r1.DestinationFields);
705
+ } }
706
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
707
+ const _r27 = i0.ɵɵgetCurrentView();
708
+ i0.ɵɵelementStart(0, "input", 147);
709
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_10_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r27); const field_r22 = i0.ɵɵnextContext().$implicit; i0.ɵɵtwoWayBindingSet(field_r22.DestinationFieldName, $event) || (field_r22.DestinationFieldName = $event); return i0.ɵɵresetView($event); });
710
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_10_Template_input_ngModelChange_0_listener() { i0.ɵɵrestoreView(_r27); const field_r22 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFieldChanged(field_r22)); });
711
+ i0.ɵɵelementEnd();
712
+ } if (rf & 2) {
713
+ const field_r22 = i0.ɵɵnextContext().$implicit;
714
+ i0.ɵɵtwoWayProperty("ngModel", field_r22.DestinationFieldName);
715
+ } }
716
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_For_6_Template(rf, ctx) { if (rf & 1) {
717
+ i0.ɵɵelementStart(0, "option", 146);
718
+ i0.ɵɵtext(1);
719
+ i0.ɵɵelementEnd();
720
+ } if (rf & 2) {
721
+ const tt_r32 = ctx.$implicit;
722
+ i0.ɵɵproperty("value", tt_r32.Value);
723
+ i0.ɵɵadvance();
724
+ i0.ɵɵtextInterpolate(tt_r32.Label);
725
+ } }
726
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_17_Template(rf, ctx) { if (rf & 1) {
727
+ const _r34 = i0.ɵɵgetCurrentView();
728
+ i0.ɵɵelementStart(0, "div", 161)(1, "label");
729
+ i0.ɵɵtext(2, "Default value (when source is null)");
730
+ i0.ɵɵelementEnd();
731
+ i0.ɵɵelementStart(3, "input", 164);
732
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_17_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r34); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["DefaultValue"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
733
+ i0.ɵɵelementEnd()();
734
+ } if (rf & 2) {
735
+ const step_r31 = i0.ɵɵnextContext().$implicit;
736
+ i0.ɵɵadvance(3);
737
+ i0.ɵɵproperty("ngModel", step_r31.Config["DefaultValue"] ?? "");
738
+ } }
739
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_18_Template(rf, ctx) { if (rf & 1) {
740
+ const _r35 = i0.ɵɵgetCurrentView();
741
+ i0.ɵɵelementStart(0, "div", 162)(1, "div", 161)(2, "label");
742
+ i0.ɵɵtext(3, "Pattern");
743
+ i0.ɵɵelementEnd();
744
+ i0.ɵɵelementStart(4, "input", 165);
745
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_18_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r35); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Pattern"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
746
+ i0.ɵɵelementEnd()();
747
+ i0.ɵɵelementStart(5, "div", 161)(6, "label");
748
+ i0.ɵɵtext(7, "Replacement");
749
+ i0.ɵɵelementEnd();
750
+ i0.ɵɵelementStart(8, "input", 166);
751
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_18_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r35); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Replacement"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
752
+ i0.ɵɵelementEnd()();
753
+ i0.ɵɵelementStart(9, "div", 163)(10, "label");
754
+ i0.ɵɵtext(11, "Flags");
755
+ i0.ɵɵelementEnd();
756
+ i0.ɵɵelementStart(12, "input", 167);
757
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_18_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r35); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Flags"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
758
+ i0.ɵɵelementEnd()()();
759
+ } if (rf & 2) {
760
+ const step_r31 = i0.ɵɵnextContext().$implicit;
761
+ i0.ɵɵadvance(4);
762
+ i0.ɵɵproperty("ngModel", step_r31.Config["Pattern"] ?? "");
763
+ i0.ɵɵadvance(4);
764
+ i0.ɵɵproperty("ngModel", step_r31.Config["Replacement"] ?? "");
765
+ i0.ɵɵadvance(4);
766
+ i0.ɵɵproperty("ngModel", step_r31.Config["Flags"] ?? "g");
767
+ } }
768
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_19_Template(rf, ctx) { if (rf & 1) {
769
+ const _r36 = i0.ɵɵgetCurrentView();
770
+ i0.ɵɵelementStart(0, "div", 162)(1, "div", 161)(2, "label");
771
+ i0.ɵɵtext(3, "Delimiter");
772
+ i0.ɵɵelementEnd();
773
+ i0.ɵɵelementStart(4, "input", 168);
774
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_19_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r36); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Delimiter"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
775
+ i0.ɵɵelementEnd()();
776
+ i0.ɵɵelementStart(5, "div", 163)(6, "label");
777
+ i0.ɵɵtext(7, "Part index (0-based)");
778
+ i0.ɵɵelementEnd();
779
+ i0.ɵɵelementStart(8, "input", 169);
780
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_19_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r36); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Index"] = +$event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
781
+ i0.ɵɵelementEnd()()();
782
+ } if (rf & 2) {
783
+ const step_r31 = i0.ɵɵnextContext().$implicit;
784
+ i0.ɵɵadvance(4);
785
+ i0.ɵɵproperty("ngModel", step_r31.Config["Delimiter"] ?? ",");
786
+ i0.ɵɵadvance(4);
787
+ i0.ɵɵproperty("ngModel", step_r31.Config["Index"] ?? 0);
788
+ } }
789
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_20_For_5_Template(rf, ctx) { if (rf & 1) {
790
+ const _r38 = i0.ɵɵgetCurrentView();
791
+ i0.ɵɵelementStart(0, "button", 173);
792
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_20_For_5_Template_button_click_0_listener() { const sf_r39 = i0.ɵɵrestoreView(_r38).$implicit; const step_r31 = i0.ɵɵnextContext(2).$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.ToggleCombineField(step_r31.Config, sf_r39); return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
793
+ i0.ɵɵtext(1);
794
+ i0.ɵɵelementEnd();
795
+ } if (rf & 2) {
796
+ const sf_r39 = ctx.$implicit;
797
+ const step_r31 = i0.ɵɵnextContext(2).$implicit;
798
+ const ctx_r1 = i0.ɵɵnextContext(6);
799
+ i0.ɵɵclassProp("selected", ctx_r1.IsCombineFieldSelected(step_r31.Config, sf_r39));
800
+ i0.ɵɵadvance();
801
+ i0.ɵɵtextInterpolate1(" ", sf_r39, " ");
802
+ } }
803
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_20_Template(rf, ctx) { if (rf & 1) {
804
+ const _r37 = i0.ɵɵgetCurrentView();
805
+ i0.ɵɵelementStart(0, "div", 161)(1, "label");
806
+ i0.ɵɵtext(2, "Source fields to combine");
807
+ i0.ɵɵelementEnd();
808
+ i0.ɵɵelementStart(3, "div", 170);
809
+ i0.ɵɵrepeaterCreate(4, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_20_For_5_Template, 2, 3, "button", 171, i0.ɵɵrepeaterTrackByIdentity);
810
+ i0.ɵɵelementEnd()();
811
+ i0.ɵɵelementStart(6, "div", 163)(7, "label");
812
+ i0.ɵɵtext(8, "Separator");
813
+ i0.ɵɵelementEnd();
814
+ i0.ɵɵelementStart(9, "input", 172);
815
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_20_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r37); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Separator"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
816
+ i0.ɵɵelementEnd()();
817
+ } if (rf & 2) {
818
+ const step_r31 = i0.ɵɵnextContext().$implicit;
819
+ const ctx_r1 = i0.ɵɵnextContext(6);
820
+ i0.ɵɵadvance(4);
821
+ i0.ɵɵrepeater(ctx_r1.GetAvailableSourceFields());
822
+ i0.ɵɵadvance(5);
823
+ i0.ɵɵproperty("ngModel", step_r31.Config["Separator"] ?? " ");
824
+ } }
825
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_For_5_Template(rf, ctx) { if (rf & 1) {
826
+ const _r41 = i0.ɵɵgetCurrentView();
827
+ i0.ɵɵelementStart(0, "div", 175)(1, "input", 178);
828
+ i0.ɵɵlistener("change", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_For_5_Template_input_change_1_listener($event) { const entry_r42 = i0.ɵɵrestoreView(_r41).$implicit; const step_r31 = i0.ɵɵnextContext(2).$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.UpdateLookupEntry(step_r31.Config, entry_r42.key, $event.target.value, entry_r42.value); return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
829
+ i0.ɵɵelementEnd();
830
+ i0.ɵɵelement(2, "i", 179);
831
+ i0.ɵɵelementStart(3, "input", 180);
832
+ i0.ɵɵlistener("change", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_For_5_Template_input_change_3_listener($event) { const entry_r42 = i0.ɵɵrestoreView(_r41).$implicit; const step_r31 = i0.ɵɵnextContext(2).$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.UpdateLookupEntry(step_r31.Config, entry_r42.key, entry_r42.key, $event.target.value); return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
833
+ i0.ɵɵelementEnd();
834
+ i0.ɵɵelementStart(4, "button", 181);
835
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_For_5_Template_button_click_4_listener() { const entry_r42 = i0.ɵɵrestoreView(_r41).$implicit; const step_r31 = i0.ɵɵnextContext(2).$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.RemoveLookupEntry(step_r31.Config, entry_r42.key); return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
836
+ i0.ɵɵelement(5, "i", 28);
837
+ i0.ɵɵelementEnd()();
838
+ } if (rf & 2) {
839
+ const entry_r42 = ctx.$implicit;
840
+ i0.ɵɵadvance();
841
+ i0.ɵɵproperty("value", entry_r42.key);
842
+ i0.ɵɵadvance(2);
843
+ i0.ɵɵproperty("value", entry_r42.value);
844
+ } }
845
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_Template(rf, ctx) { if (rf & 1) {
846
+ const _r40 = i0.ɵɵgetCurrentView();
847
+ i0.ɵɵelementStart(0, "div", 161)(1, "label");
848
+ i0.ɵɵtext(2, "Value mapping");
849
+ i0.ɵɵelementEnd();
850
+ i0.ɵɵelementStart(3, "div", 174);
851
+ i0.ɵɵrepeaterCreate(4, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_For_5_Template, 6, 2, "div", 175, i0.ɵɵrepeaterTrackByIndex);
852
+ i0.ɵɵelementStart(6, "button", 176);
853
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r40); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.AddLookupEntry(step_r31.Config); return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
854
+ i0.ɵɵelement(7, "i", 21);
855
+ i0.ɵɵtext(8, " Add mapping ");
856
+ i0.ɵɵelementEnd()()();
857
+ i0.ɵɵelementStart(9, "div", 163)(10, "label");
858
+ i0.ɵɵtext(11, "Default (when no match)");
859
+ i0.ɵɵelementEnd();
860
+ i0.ɵɵelementStart(12, "input", 177);
861
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r40); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Default"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
862
+ i0.ɵɵelementEnd()();
863
+ } if (rf & 2) {
864
+ const step_r31 = i0.ɵɵnextContext().$implicit;
865
+ const ctx_r1 = i0.ɵɵnextContext(6);
866
+ i0.ɵɵadvance(4);
867
+ i0.ɵɵrepeater(ctx_r1.GetLookupEntries(step_r31.Config));
868
+ i0.ɵɵadvance(8);
869
+ i0.ɵɵproperty("ngModel", step_r31.Config["Default"] ?? "");
870
+ } }
871
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_22_Template(rf, ctx) { if (rf & 1) {
872
+ const _r43 = i0.ɵɵgetCurrentView();
873
+ i0.ɵɵelementStart(0, "div", 162)(1, "div", 163)(2, "label");
874
+ i0.ɵɵtext(3, "Format type");
875
+ i0.ɵɵelementEnd();
876
+ i0.ɵɵelementStart(4, "select", 144);
877
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_22_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r43); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["FormatType"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
878
+ i0.ɵɵelementStart(5, "option", 182);
879
+ i0.ɵɵtext(6, "Date");
880
+ i0.ɵɵelementEnd();
881
+ i0.ɵɵelementStart(7, "option", 183);
882
+ i0.ɵɵtext(8, "Number");
883
+ i0.ɵɵelementEnd();
884
+ i0.ɵɵelementStart(9, "option", 184);
885
+ i0.ɵɵtext(10, "String");
886
+ i0.ɵɵelementEnd()()();
887
+ i0.ɵɵelementStart(11, "div", 161)(12, "label");
888
+ i0.ɵɵtext(13, "Format string");
889
+ i0.ɵɵelementEnd();
890
+ i0.ɵɵelementStart(14, "input", 185);
891
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_22_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r43); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["FormatString"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
892
+ i0.ɵɵelementEnd()()();
893
+ } if (rf & 2) {
894
+ const step_r31 = i0.ɵɵnextContext().$implicit;
895
+ i0.ɵɵadvance(4);
896
+ i0.ɵɵproperty("ngModel", step_r31.Config["FormatType"] ?? "date");
897
+ i0.ɵɵadvance(10);
898
+ i0.ɵɵproperty("ngModel", step_r31.Config["FormatString"] ?? "ISO");
899
+ } }
900
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_23_Template(rf, ctx) { if (rf & 1) {
901
+ const _r44 = i0.ɵɵgetCurrentView();
902
+ i0.ɵɵelementStart(0, "div", 163)(1, "label");
903
+ i0.ɵɵtext(2, "Target type");
904
+ i0.ɵɵelementEnd();
905
+ i0.ɵɵelementStart(3, "select", 144);
906
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_23_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r44); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["TargetType"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
907
+ i0.ɵɵelementStart(4, "option", 184);
908
+ i0.ɵɵtext(5, "String");
909
+ i0.ɵɵelementEnd();
910
+ i0.ɵɵelementStart(6, "option", 183);
911
+ i0.ɵɵtext(7, "Number");
912
+ i0.ɵɵelementEnd();
913
+ i0.ɵɵelementStart(8, "option", 186);
914
+ i0.ɵɵtext(9, "Boolean");
915
+ i0.ɵɵelementEnd();
916
+ i0.ɵɵelementStart(10, "option", 182);
917
+ i0.ɵɵtext(11, "Date");
918
+ i0.ɵɵelementEnd()()();
919
+ } if (rf & 2) {
920
+ const step_r31 = i0.ɵɵnextContext().$implicit;
921
+ i0.ɵɵadvance(3);
922
+ i0.ɵɵproperty("ngModel", step_r31.Config["TargetType"] ?? "string");
923
+ } }
924
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_24_Template(rf, ctx) { if (rf & 1) {
925
+ const _r45 = i0.ɵɵgetCurrentView();
926
+ i0.ɵɵelementStart(0, "div", 162)(1, "div", 163)(2, "label");
927
+ i0.ɵɵtext(3, "Start index");
928
+ i0.ɵɵelementEnd();
929
+ i0.ɵɵelementStart(4, "input", 169);
930
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_24_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r45); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Start"] = +$event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
931
+ i0.ɵɵelementEnd()();
932
+ i0.ɵɵelementStart(5, "div", 163)(6, "label");
933
+ i0.ɵɵtext(7, "Length (blank = to end)");
934
+ i0.ɵɵelementEnd();
935
+ i0.ɵɵelementStart(8, "input", 187);
936
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_24_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r45); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Length"] = $event ? +$event : undefined; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
937
+ i0.ɵɵelementEnd()()();
938
+ } if (rf & 2) {
939
+ const step_r31 = i0.ɵɵnextContext().$implicit;
940
+ i0.ɵɵadvance(4);
941
+ i0.ɵɵproperty("ngModel", step_r31.Config["Start"] ?? 0);
942
+ i0.ɵɵadvance(4);
943
+ i0.ɵɵproperty("ngModel", step_r31.Config["Length"] ?? "");
944
+ } }
945
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_25_Template(rf, ctx) { if (rf & 1) {
946
+ const _r46 = i0.ɵɵgetCurrentView();
947
+ i0.ɵɵelementStart(0, "div", 161)(1, "label");
948
+ i0.ɵɵtext(2, "JavaScript expression ");
949
+ i0.ɵɵelementStart(3, "span", 188);
950
+ i0.ɵɵtext(4, "(use ");
951
+ i0.ɵɵelementStart(5, "code");
952
+ i0.ɵɵtext(6, "value");
953
+ i0.ɵɵelementEnd();
954
+ i0.ɵɵtext(7, " and ");
955
+ i0.ɵɵelementStart(8, "code");
956
+ i0.ɵɵtext(9, "fields");
957
+ i0.ɵɵelementEnd();
958
+ i0.ɵɵtext(10, ")");
959
+ i0.ɵɵelementEnd()();
960
+ i0.ɵɵelementStart(11, "textarea", 189);
961
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_25_Template_textarea_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r46); const step_r31 = i0.ɵɵnextContext().$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); step_r31.Config["Expression"] = $event; return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
962
+ i0.ɵɵelementEnd()();
963
+ } if (rf & 2) {
964
+ const step_r31 = i0.ɵɵnextContext().$implicit;
965
+ i0.ɵɵadvance(11);
966
+ i0.ɵɵproperty("ngModel", step_r31.Config["Expression"] ?? "value");
967
+ } }
968
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Template(rf, ctx) { if (rf & 1) {
969
+ const _r30 = i0.ɵɵgetCurrentView();
970
+ i0.ɵɵelementStart(0, "div", 151)(1, "div", 152)(2, "span", 153);
971
+ i0.ɵɵtext(3);
972
+ i0.ɵɵelementEnd();
973
+ i0.ɵɵelementStart(4, "select", 154);
974
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Template_select_ngModelChange_4_listener($event) { const step_r31 = i0.ɵɵrestoreView(_r30).$implicit; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnTransformTypeChange(field_r22, step_r31, $event)); });
975
+ i0.ɵɵrepeaterCreate(5, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_For_6_Template, 2, 2, "option", 146, _forTrack2);
976
+ i0.ɵɵelementEnd();
977
+ i0.ɵɵelementStart(7, "select", 155);
978
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Template_select_ngModelChange_7_listener($event) { const step_r31 = i0.ɵɵrestoreView(_r30).$implicit; i0.ɵɵtwoWayBindingSet(step_r31.OnError, $event) || (step_r31.OnError = $event); return i0.ɵɵresetView($event); });
979
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Template_select_ngModelChange_7_listener() { i0.ɵɵrestoreView(_r30); const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnTransformConfigChange(field_r22)); });
980
+ i0.ɵɵelementStart(8, "option", 156);
981
+ i0.ɵɵtext(9, "Fail");
982
+ i0.ɵɵelementEnd();
983
+ i0.ɵɵelementStart(10, "option", 157);
984
+ i0.ɵɵtext(11, "Skip row");
985
+ i0.ɵɵelementEnd();
986
+ i0.ɵɵelementStart(12, "option", 158);
987
+ i0.ɵɵtext(13, "Set null");
988
+ i0.ɵɵelementEnd()();
989
+ i0.ɵɵelementStart(14, "button", 159);
990
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Template_button_click_14_listener() { const ɵ$index_534_r33 = i0.ɵɵrestoreView(_r30).$index; const field_r22 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.RemoveTransformStep(field_r22, ɵ$index_534_r33)); });
991
+ i0.ɵɵelement(15, "i", 71);
992
+ i0.ɵɵelementEnd()();
993
+ i0.ɵɵelementStart(16, "div", 160);
994
+ i0.ɵɵconditionalCreate(17, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_17_Template, 4, 1, "div", 161)(18, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_18_Template, 13, 3, "div", 162)(19, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_19_Template, 9, 2, "div", 162)(20, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_20_Template, 10, 1)(21, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_21_Template, 13, 1)(22, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_22_Template, 15, 2, "div", 162)(23, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_23_Template, 12, 1, "div", 163)(24, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_24_Template, 9, 2, "div", 162)(25, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Case_25_Template, 12, 1, "div", 161);
995
+ i0.ɵɵelementEnd()();
996
+ } if (rf & 2) {
997
+ let tmp_30_0;
998
+ const step_r31 = ctx.$implicit;
999
+ const ɵ$index_534_r33 = ctx.$index;
1000
+ const ctx_r1 = i0.ɵɵnextContext(6);
1001
+ i0.ɵɵadvance(3);
1002
+ i0.ɵɵtextInterpolate(ɵ$index_534_r33 + 1);
1003
+ i0.ɵɵadvance();
1004
+ i0.ɵɵproperty("ngModel", step_r31.Type);
1005
+ i0.ɵɵadvance();
1006
+ i0.ɵɵrepeater(ctx_r1.TransformTypes);
1007
+ i0.ɵɵadvance(2);
1008
+ i0.ɵɵtwoWayProperty("ngModel", step_r31.OnError);
1009
+ i0.ɵɵadvance(10);
1010
+ i0.ɵɵconditional((tmp_30_0 = step_r31.Type) === "direct" ? 17 : tmp_30_0 === "regex" ? 18 : tmp_30_0 === "split" ? 19 : tmp_30_0 === "combine" ? 20 : tmp_30_0 === "lookup" ? 21 : tmp_30_0 === "format" ? 22 : tmp_30_0 === "coerce" ? 23 : tmp_30_0 === "substring" ? 24 : tmp_30_0 === "custom" ? 25 : -1);
1011
+ } }
1012
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
1013
+ const _r29 = i0.ɵɵgetCurrentView();
1014
+ i0.ɵɵelementStart(0, "div", 133)(1, "div", 148)(2, "span", 149);
1015
+ i0.ɵɵelement(3, "i", 36);
1016
+ i0.ɵɵtext(4, " Transform Pipeline");
1017
+ i0.ɵɵelementEnd();
1018
+ i0.ɵɵelementStart(5, "button", 150);
1019
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r29); const field_r22 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.AddTransformStep(field_r22)); });
1020
+ i0.ɵɵelement(6, "i", 21);
1021
+ i0.ɵɵtext(7, " Add Step ");
1022
+ i0.ɵɵelementEnd()();
1023
+ i0.ɵɵrepeaterCreate(8, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_For_9_Template, 26, 4, "div", 151, i0.ɵɵrepeaterTrackByIndex);
1024
+ i0.ɵɵelementEnd();
1025
+ } if (rf & 2) {
1026
+ const field_r22 = i0.ɵɵnextContext().$implicit;
1027
+ i0.ɵɵadvance(8);
1028
+ i0.ɵɵrepeater(field_r22.TransformPipeline);
1029
+ } }
1030
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Template(rf, ctx) { if (rf & 1) {
1031
+ const _r20 = i0.ɵɵgetCurrentView();
1032
+ i0.ɵɵelementStart(0, "div", 116)(1, "div", 117)(2, "div", 118);
1033
+ i0.ɵɵconditionalCreate(3, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_3_Template, 1, 1, "input", 119)(4, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_4_Template, 7, 5);
1034
+ i0.ɵɵelementEnd();
1035
+ i0.ɵɵelementStart(5, "div", 120);
1036
+ i0.ɵɵconditionalCreate(6, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_6_Template, 6, 5, "button", 121)(7, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_7_Template, 4, 1, "button", 122);
1037
+ i0.ɵɵelementEnd();
1038
+ i0.ɵɵelementStart(8, "div", 123);
1039
+ i0.ɵɵconditionalCreate(9, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_9_Template, 5, 1, "select", 124)(10, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_10_Template, 1, 1, "input", 125);
1040
+ i0.ɵɵelementEnd();
1041
+ i0.ɵɵelementStart(11, "div", 126)(12, "label", 127)(13, "input", 128);
1042
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Template_input_ngModelChange_13_listener($event) { const field_r22 = i0.ɵɵrestoreView(_r20).$implicit; i0.ɵɵtwoWayBindingSet(field_r22.IsKeyField, $event) || (field_r22.IsKeyField = $event); return i0.ɵɵresetView($event); });
1043
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Template_input_ngModelChange_13_listener() { const field_r22 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFieldChanged(field_r22)); });
1044
+ i0.ɵɵelementEnd();
1045
+ i0.ɵɵelement(14, "i", 129);
1046
+ i0.ɵɵelementEnd();
1047
+ i0.ɵɵelementStart(15, "label", 130)(16, "input", 128);
1048
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Template_input_ngModelChange_16_listener($event) { const field_r22 = i0.ɵɵrestoreView(_r20).$implicit; i0.ɵɵtwoWayBindingSet(field_r22.IsRequired, $event) || (field_r22.IsRequired = $event); return i0.ɵɵresetView($event); });
1049
+ i0.ɵɵlistener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Template_input_ngModelChange_16_listener() { const field_r22 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnFieldChanged(field_r22)); });
1050
+ i0.ɵɵelementEnd();
1051
+ i0.ɵɵelementStart(17, "span", 131);
1052
+ i0.ɵɵtext(18, "*");
1053
+ i0.ɵɵelementEnd()()();
1054
+ i0.ɵɵelementStart(19, "button", 132);
1055
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Template_button_click_19_listener() { const ɵ$index_430_r28 = i0.ɵɵrestoreView(_r20).$index; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.RemoveFieldMapping(ɵ$index_430_r28)); });
1056
+ i0.ɵɵelement(20, "i", 28);
1057
+ i0.ɵɵelementEnd()();
1058
+ i0.ɵɵconditionalCreate(21, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Conditional_21_Template, 10, 0, "div", 133);
1059
+ i0.ɵɵelementEnd();
1060
+ } if (rf & 2) {
1061
+ const field_r22 = ctx.$implicit;
1062
+ const ctx_r1 = i0.ɵɵnextContext(4);
1063
+ i0.ɵɵclassProp("validation-error", field_r22.IsRequired && !field_r22.DestinationFieldName)("has-transform", field_r22.TransformPipeline.length > 0);
1064
+ i0.ɵɵadvance(3);
1065
+ i0.ɵɵconditional(field_r22.IsNew ? 3 : 4);
1066
+ i0.ɵɵadvance(3);
1067
+ i0.ɵɵconditional(field_r22.TransformPipeline.length > 1 ? 6 : 7);
1068
+ i0.ɵɵadvance(3);
1069
+ i0.ɵɵconditional(ctx_r1.DestinationFields.length > 0 ? 9 : 10);
1070
+ i0.ɵɵadvance(4);
1071
+ i0.ɵɵtwoWayProperty("ngModel", field_r22.IsKeyField);
1072
+ i0.ɵɵadvance(3);
1073
+ i0.ɵɵtwoWayProperty("ngModel", field_r22.IsRequired);
1074
+ i0.ɵɵadvance(5);
1075
+ i0.ɵɵconditional(field_r22.ShowTransformEditor && field_r22.TransformPipeline.length > 0 ? 21 : -1);
1076
+ } }
1077
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1078
+ i0.ɵɵelementStart(0, "div", 107);
1079
+ i0.ɵɵrepeaterCreate(1, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_For_2_Template, 22, 10, "div", 115, i0.ɵɵrepeaterTrackByIdentity);
1080
+ i0.ɵɵelementEnd();
1081
+ } if (rf & 2) {
1082
+ const ctx_r1 = i0.ɵɵnextContext(3);
1083
+ i0.ɵɵadvance();
1084
+ i0.ɵɵrepeater(ctx_r1.ActiveEditableFields);
1085
+ } }
1086
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1087
+ i0.ɵɵelement(0, "mj-loading", 192);
1088
+ } }
1089
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1090
+ i0.ɵɵelementStart(0, "p", 15);
1091
+ i0.ɵɵtext(1, "No source data available.");
1092
+ i0.ɵɵelementEnd();
1093
+ } }
1094
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_9_For_5_Template(rf, ctx) { if (rf & 1) {
1095
+ i0.ɵɵelementStart(0, "th");
1096
+ i0.ɵɵtext(1);
1097
+ i0.ɵɵelementEnd();
1098
+ } if (rf & 2) {
1099
+ const col_r48 = ctx.$implicit;
1100
+ i0.ɵɵadvance();
1101
+ i0.ɵɵtextInterpolate(col_r48);
1102
+ } }
1103
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_9_For_8_For_2_Template(rf, ctx) { if (rf & 1) {
1104
+ i0.ɵɵelementStart(0, "td");
1105
+ i0.ɵɵtext(1);
1106
+ i0.ɵɵelementEnd();
1107
+ } if (rf & 2) {
1108
+ const col_r49 = ctx.$implicit;
1109
+ const row_r50 = i0.ɵɵnextContext().$implicit;
1110
+ const ctx_r1 = i0.ɵɵnextContext(5);
1111
+ i0.ɵɵadvance();
1112
+ i0.ɵɵtextInterpolate(ctx_r1.FormatPreviewValue(row_r50[col_r49]));
1113
+ } }
1114
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_9_For_8_Template(rf, ctx) { if (rf & 1) {
1115
+ i0.ɵɵelementStart(0, "tr");
1116
+ i0.ɵɵrepeaterCreate(1, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_9_For_8_For_2_Template, 2, 1, "td", null, i0.ɵɵrepeaterTrackByIdentity);
60
1117
  i0.ɵɵelementEnd();
61
- i0.ɵɵelementStart(6, "span", 26);
62
- i0.ɵɵtext(7);
1118
+ } if (rf & 2) {
1119
+ const ctx_r1 = i0.ɵɵnextContext(5);
1120
+ i0.ɵɵadvance();
1121
+ i0.ɵɵrepeater(ctx_r1.GetPreviewColumns(ctx_r1.SourcePreviewData));
1122
+ } }
1123
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_9_Template(rf, ctx) { if (rf & 1) {
1124
+ i0.ɵɵelementStart(0, "div", 193)(1, "table", 194)(2, "thead")(3, "tr");
1125
+ i0.ɵɵrepeaterCreate(4, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_9_For_5_Template, 2, 1, "th", null, i0.ɵɵrepeaterTrackByIdentity);
63
1126
  i0.ɵɵelementEnd()();
64
- i0.ɵɵelementStart(8, "div", 27)(9, "span", 28);
65
- i0.ɵɵtext(10);
66
- i0.ɵɵelementEnd();
67
- i0.ɵɵelementStart(11, "kendo-switch", 29);
68
- i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_6_For_2_Template_kendo_switch_ngModelChange_11_listener($event) { const em_r5 = i0.ɵɵrestoreView(_r4).$implicit; i0.ɵɵtwoWayBindingSet(em_r5.SyncEnabled, $event) || (em_r5.SyncEnabled = $event); return i0.ɵɵresetView($event); });
69
- i0.ɵɵlistener("valueChange", function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_6_For_2_Template_kendo_switch_valueChange_11_listener() { const em_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnToggleEntityMap(em_r5)); });
1127
+ i0.ɵɵelementStart(6, "tbody");
1128
+ i0.ɵɵrepeaterCreate(7, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_9_For_8_Template, 3, 0, "tr", null, i0.ɵɵrepeaterTrackByIndex);
70
1129
  i0.ɵɵelementEnd()()();
71
1130
  } if (rf & 2) {
72
- const em_r5 = ctx.$implicit;
73
1131
  const ctx_r1 = i0.ɵɵnextContext(4);
74
- i0.ɵɵclassProp("selected", ctx_r1.IsSelectedEntityMap(em_r5.ID));
75
- i0.ɵɵadvance(3);
76
- i0.ɵɵtextInterpolate(em_r5.ExternalObjectName);
77
1132
  i0.ɵɵadvance(4);
78
- i0.ɵɵtextInterpolate(em_r5.Entity);
1133
+ i0.ɵɵrepeater(ctx_r1.GetPreviewColumns(ctx_r1.SourcePreviewData));
79
1134
  i0.ɵɵadvance(3);
80
- i0.ɵɵtextInterpolate(em_r5.SyncDirection);
81
- i0.ɵɵadvance();
82
- i0.ɵɵtwoWayProperty("ngModel", em_r5.SyncEnabled);
83
- i0.ɵɵproperty("size", "small");
1135
+ i0.ɵɵrepeater(ctx_r1.SourcePreviewData);
84
1136
  } }
85
- function MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
86
- i0.ɵɵelementStart(0, "div", 19);
87
- i0.ɵɵrepeaterCreate(1, MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_6_For_2_Template, 12, 7, "div", 21, _forTrack0);
1137
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Template(rf, ctx) { if (rf & 1) {
1138
+ const _r47 = i0.ɵɵgetCurrentView();
1139
+ i0.ɵɵelementStart(0, "div", 111)(1, "div", 190)(2, "h4");
1140
+ i0.ɵɵelement(3, "i", 191);
1141
+ i0.ɵɵtext(4, " Source Data Preview");
1142
+ i0.ɵɵelementEnd();
1143
+ i0.ɵɵelementStart(5, "button", 27);
1144
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r47); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseSourcePreview()); });
1145
+ i0.ɵɵelement(6, "i", 28);
1146
+ i0.ɵɵelementEnd()();
1147
+ i0.ɵɵconditionalCreate(7, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_7_Template, 1, 0, "mj-loading", 192)(8, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_8_Template, 2, 0, "p", 15)(9, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Conditional_9_Template, 9, 0, "div", 193);
88
1148
  i0.ɵɵelementEnd();
89
1149
  } if (rf & 2) {
90
1150
  const ctx_r1 = i0.ɵɵnextContext(3);
91
- i0.ɵɵadvance();
92
- i0.ɵɵrepeater(ctx_r1.FilteredEntityMaps);
1151
+ i0.ɵɵadvance(7);
1152
+ i0.ɵɵconditional(ctx_r1.IsLoadingSourcePreview ? 7 : ctx_r1.SourcePreviewData.length === 0 ? 8 : 9);
93
1153
  } }
94
- function MappingWorkspaceComponent_Conditional_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
95
- i0.ɵɵelementStart(0, "div", 7)(1, "h4", 8);
96
- i0.ɵɵtext(2, "Entity Maps");
1154
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_7_Template(rf, ctx) { if (rf & 1) {
1155
+ i0.ɵɵelement(0, "mj-loading", 195);
1156
+ } }
1157
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_8_Template(rf, ctx) { if (rf & 1) {
1158
+ i0.ɵɵelementStart(0, "p", 15);
1159
+ i0.ɵɵtext(1, "No destination data available.");
97
1160
  i0.ɵɵelementEnd();
98
- i0.ɵɵconditionalCreate(3, MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_3_Template, 2, 1, "div", 18);
99
- i0.ɵɵconditionalCreate(4, MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_4_Template, 2, 0, "p", 16)(5, MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_5_Template, 2, 1, "p", 16)(6, MappingWorkspaceComponent_Conditional_6_Conditional_8_Conditional_6_Template, 3, 0, "div", 19);
1161
+ } }
1162
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_9_For_5_Template(rf, ctx) { if (rf & 1) {
1163
+ i0.ɵɵelementStart(0, "th");
1164
+ i0.ɵɵtext(1);
100
1165
  i0.ɵɵelementEnd();
101
1166
  } if (rf & 2) {
102
- const ctx_r1 = i0.ɵɵnextContext(2);
103
- i0.ɵɵadvance(3);
104
- i0.ɵɵconditional(ctx_r1.EntityMaps.length > 0 ? 3 : -1);
1167
+ const col_r52 = ctx.$implicit;
105
1168
  i0.ɵɵadvance();
106
- i0.ɵɵconditional(ctx_r1.EntityMaps.length === 0 ? 4 : ctx_r1.FilteredEntityMaps.length === 0 ? 5 : 6);
107
- } }
108
- function MappingWorkspaceComponent_Conditional_6_Conditional_11_Template(rf, ctx) { if (rf & 1) {
109
- i0.ɵɵelementStart(0, "div", 12);
110
- i0.ɵɵelement(1, "i", 30);
111
- i0.ɵɵelementStart(2, "p");
112
- i0.ɵɵtext(3, "Select an entity map from the left panel to view field mappings.");
113
- i0.ɵɵelementEnd()();
114
- } }
115
- function MappingWorkspaceComponent_Conditional_6_Conditional_12_Template(rf, ctx) { if (rf & 1) {
116
- i0.ɵɵelement(0, "mj-loading", 13);
1169
+ i0.ɵɵtextInterpolate(col_r52);
117
1170
  } }
118
- function MappingWorkspaceComponent_Conditional_6_Conditional_13_ng_template_8_Template(rf, ctx) { if (rf & 1) {
119
- i0.ɵɵelementStart(0, "span", 40);
1171
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_9_For_8_For_2_Template(rf, ctx) { if (rf & 1) {
1172
+ i0.ɵɵelementStart(0, "td");
120
1173
  i0.ɵɵtext(1);
121
1174
  i0.ɵɵelementEnd();
122
1175
  } if (rf & 2) {
123
- const dataItem_r6 = ctx.$implicit;
1176
+ const col_r53 = ctx.$implicit;
1177
+ const row_r54 = i0.ɵɵnextContext().$implicit;
1178
+ const ctx_r1 = i0.ɵɵnextContext(5);
124
1179
  i0.ɵɵadvance();
125
- i0.ɵɵtextInterpolate(dataItem_r6.Direction);
1180
+ i0.ɵɵtextInterpolate(ctx_r1.FormatPreviewValue(row_r54[col_r53]));
126
1181
  } }
127
- function MappingWorkspaceComponent_Conditional_6_Conditional_13_ng_template_10_Conditional_0_Template(rf, ctx) { if (rf & 1) {
128
- i0.ɵɵelement(0, "i", 41);
1182
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_9_For_8_Template(rf, ctx) { if (rf & 1) {
1183
+ i0.ɵɵelementStart(0, "tr");
1184
+ i0.ɵɵrepeaterCreate(1, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_9_For_8_For_2_Template, 2, 1, "td", null, i0.ɵɵrepeaterTrackByIdentity);
1185
+ i0.ɵɵelementEnd();
1186
+ } if (rf & 2) {
1187
+ const ctx_r1 = i0.ɵɵnextContext(5);
1188
+ i0.ɵɵadvance();
1189
+ i0.ɵɵrepeater(ctx_r1.GetPreviewColumns(ctx_r1.DestPreviewData));
129
1190
  } }
130
- function MappingWorkspaceComponent_Conditional_6_Conditional_13_ng_template_10_Template(rf, ctx) { if (rf & 1) {
131
- i0.ɵɵconditionalCreate(0, MappingWorkspaceComponent_Conditional_6_Conditional_13_ng_template_10_Conditional_0_Template, 1, 0, "i", 41);
1191
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_9_Template(rf, ctx) { if (rf & 1) {
1192
+ i0.ɵɵelementStart(0, "div", 193)(1, "table", 194)(2, "thead")(3, "tr");
1193
+ i0.ɵɵrepeaterCreate(4, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_9_For_5_Template, 2, 1, "th", null, i0.ɵɵrepeaterTrackByIdentity);
1194
+ i0.ɵɵelementEnd()();
1195
+ i0.ɵɵelementStart(6, "tbody");
1196
+ i0.ɵɵrepeaterCreate(7, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_9_For_8_Template, 3, 0, "tr", null, i0.ɵɵrepeaterTrackByIndex);
1197
+ i0.ɵɵelementEnd()()();
132
1198
  } if (rf & 2) {
133
- const dataItem_r7 = ctx.$implicit;
134
- i0.ɵɵconditional(dataItem_r7.IsKeyField ? 0 : -1);
1199
+ const ctx_r1 = i0.ɵɵnextContext(4);
1200
+ i0.ɵɵadvance(4);
1201
+ i0.ɵɵrepeater(ctx_r1.GetPreviewColumns(ctx_r1.DestPreviewData));
1202
+ i0.ɵɵadvance(3);
1203
+ i0.ɵɵrepeater(ctx_r1.DestPreviewData);
135
1204
  } }
136
- function MappingWorkspaceComponent_Conditional_6_Conditional_13_ng_template_12_Template(rf, ctx) { if (rf & 1) {
137
- i0.ɵɵelementStart(0, "span", 42);
138
- i0.ɵɵtext(1);
1205
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Template(rf, ctx) { if (rf & 1) {
1206
+ const _r51 = i0.ɵɵgetCurrentView();
1207
+ i0.ɵɵelementStart(0, "div", 111)(1, "div", 190)(2, "h4");
1208
+ i0.ɵɵelement(3, "i", 35);
1209
+ i0.ɵɵtext(4, " Destination Data Preview");
1210
+ i0.ɵɵelementEnd();
1211
+ i0.ɵɵelementStart(5, "button", 27);
1212
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r51); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.CloseDestPreview()); });
1213
+ i0.ɵɵelement(6, "i", 28);
1214
+ i0.ɵɵelementEnd()();
1215
+ i0.ɵɵconditionalCreate(7, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_7_Template, 1, 0, "mj-loading", 195)(8, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_8_Template, 2, 0, "p", 15)(9, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Conditional_9_Template, 9, 0, "div", 193);
139
1216
  i0.ɵɵelementEnd();
140
1217
  } if (rf & 2) {
141
- const dataItem_r8 = ctx.$implicit;
142
- i0.ɵɵclassMap("status-" + dataItem_r8.Status.toLowerCase());
143
- i0.ɵɵadvance();
144
- i0.ɵɵtextInterpolate1(" ", dataItem_r8.Status, " ");
1218
+ const ctx_r1 = i0.ɵɵnextContext(3);
1219
+ i0.ɵɵadvance(7);
1220
+ i0.ɵɵconditional(ctx_r1.IsLoadingDestPreview ? 7 : ctx_r1.DestPreviewData.length === 0 ? 8 : 9);
145
1221
  } }
146
- function MappingWorkspaceComponent_Conditional_6_Conditional_13_Template(rf, ctx) { if (rf & 1) {
147
- i0.ɵɵelementStart(0, "h3", 31);
148
- i0.ɵɵtext(1, " Field Mappings ");
149
- i0.ɵɵelementStart(2, "span", 32);
150
- i0.ɵɵtext(3);
1222
+ function MappingWorkspaceComponent_Conditional_6_Conditional_12_Template(rf, ctx) { if (rf & 1) {
1223
+ const _r16 = i0.ɵɵgetCurrentView();
1224
+ i0.ɵɵconditionalCreate(0, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_0_Template, 9, 4, "div", 100);
1225
+ i0.ɵɵconditionalCreate(1, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_1_Template, 5, 0, "div", 101);
1226
+ i0.ɵɵelementStart(2, "div", 102)(3, "h3", 103);
1227
+ i0.ɵɵtext(4, " Field Mappings ");
1228
+ i0.ɵɵelementStart(5, "span", 104);
1229
+ i0.ɵɵtext(6);
151
1230
  i0.ɵɵelementEnd()();
152
- i0.ɵɵelementStart(4, "kendo-grid", 33);
153
- i0.ɵɵelement(5, "kendo-grid-column", 34)(6, "kendo-grid-column", 35);
154
- i0.ɵɵelementStart(7, "kendo-grid-column", 36);
155
- i0.ɵɵtemplate(8, MappingWorkspaceComponent_Conditional_6_Conditional_13_ng_template_8_Template, 2, 1, "ng-template", 37);
1231
+ i0.ɵɵelementStart(7, "div", 105)(8, "button", 106);
1232
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.RerunAutoMap()); });
1233
+ i0.ɵɵelement(9, "i", 36);
1234
+ i0.ɵɵtext(10, " Auto-Map ");
156
1235
  i0.ɵɵelementEnd();
157
- i0.ɵɵelementStart(9, "kendo-grid-column", 38);
158
- i0.ɵɵtemplate(10, MappingWorkspaceComponent_Conditional_6_Conditional_13_ng_template_10_Template, 1, 1, "ng-template", 37);
1236
+ i0.ɵɵelementStart(11, "button", 89);
1237
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.AddFieldMapping()); });
1238
+ i0.ɵɵelement(12, "i", 21);
1239
+ i0.ɵɵtext(13, " Add Field ");
1240
+ i0.ɵɵelementEnd();
1241
+ i0.ɵɵelementStart(14, "button", 40);
1242
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveFieldMappings()); });
1243
+ i0.ɵɵconditionalCreate(15, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_15_Template, 2, 0)(16, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_16_Template, 2, 0);
1244
+ i0.ɵɵelementEnd()()();
1245
+ i0.ɵɵconditionalCreate(17, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_17_Template, 4, 0, "p", 15)(18, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_18_Template, 3, 0, "div", 107);
1246
+ i0.ɵɵelementStart(19, "div", 108)(20, "div", 109)(21, "button", 52);
1247
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.LoadSourcePreview()); });
1248
+ i0.ɵɵelement(22, "i", 110);
1249
+ i0.ɵɵtext(23, " Preview Source ");
159
1250
  i0.ɵɵelementEnd();
160
- i0.ɵɵelementStart(11, "kendo-grid-column", 39);
161
- i0.ɵɵtemplate(12, MappingWorkspaceComponent_Conditional_6_Conditional_13_ng_template_12_Template, 2, 3, "ng-template", 37);
1251
+ i0.ɵɵelementStart(24, "button", 52);
1252
+ i0.ɵɵlistener("click", function MappingWorkspaceComponent_Conditional_6_Conditional_12_Template_button_click_24_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.LoadDestPreview()); });
1253
+ i0.ɵɵelement(25, "i", 35);
1254
+ i0.ɵɵtext(26, " Preview Destination ");
162
1255
  i0.ɵɵelementEnd()();
1256
+ i0.ɵɵconditionalCreate(27, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_27_Template, 10, 1, "div", 111);
1257
+ i0.ɵɵconditionalCreate(28, MappingWorkspaceComponent_Conditional_6_Conditional_12_Conditional_28_Template, 10, 1, "div", 111);
1258
+ i0.ɵɵelementEnd();
163
1259
  } if (rf & 2) {
164
1260
  const ctx_r1 = i0.ɵɵnextContext(2);
165
- i0.ɵɵadvance(3);
166
- i0.ɵɵtextInterpolate1("(", ctx_r1.FieldMaps.length, ")");
167
- i0.ɵɵadvance();
168
- i0.ɵɵproperty("data", ctx_r1.FieldMaps)("height", 500)("resizable", true);
169
- i0.ɵɵadvance();
170
- i0.ɵɵproperty("width", 160);
1261
+ i0.ɵɵconditional(ctx_r1.ShowAutoMapBanner ? 0 : -1);
171
1262
  i0.ɵɵadvance();
172
- i0.ɵɵproperty("width", 160);
173
- i0.ɵɵadvance();
174
- i0.ɵɵproperty("width", 120);
1263
+ i0.ɵɵconditional(ctx_r1.ActiveEditableFields.length > 0 && !ctx_r1.MappingValidation.IsValid ? 1 : -1);
1264
+ i0.ɵɵadvance(5);
1265
+ i0.ɵɵtextInterpolate1("(", ctx_r1.ActiveEditableFields.length, ")");
175
1266
  i0.ɵɵadvance(2);
176
- i0.ɵɵproperty("width", 60);
1267
+ i0.ɵɵproperty("look", "outline")("size", "small")("disabled", ctx_r1.IsLoadingSourceFields);
1268
+ i0.ɵɵadvance(3);
1269
+ i0.ɵɵproperty("look", "outline")("size", "small");
1270
+ i0.ɵɵadvance(3);
1271
+ i0.ɵɵproperty("themeColor", "primary")("size", "small")("disabled", !ctx_r1.HasDirtyFields || ctx_r1.IsSavingFields);
1272
+ i0.ɵɵadvance();
1273
+ i0.ɵɵconditional(ctx_r1.IsSavingFields ? 15 : 16);
177
1274
  i0.ɵɵadvance(2);
178
- i0.ɵɵproperty("width", 80);
1275
+ i0.ɵɵconditional(ctx_r1.ActiveEditableFields.length === 0 ? 17 : 18);
1276
+ i0.ɵɵadvance(4);
1277
+ i0.ɵɵproperty("look", "outline")("size", "small")("disabled", ctx_r1.IsLoadingSourcePreview);
1278
+ i0.ɵɵadvance(3);
1279
+ i0.ɵɵproperty("look", "outline")("size", "small")("disabled", ctx_r1.IsLoadingDestPreview);
1280
+ i0.ɵɵadvance(3);
1281
+ i0.ɵɵconditional(ctx_r1.ShowSourcePreview ? 27 : -1);
1282
+ i0.ɵɵadvance();
1283
+ i0.ɵɵconditional(ctx_r1.ShowDestPreview ? 28 : -1);
179
1284
  } }
180
- function MappingWorkspaceComponent_Conditional_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
181
- i0.ɵɵelementStart(0, "p", 16);
1285
+ function MappingWorkspaceComponent_Conditional_6_Conditional_16_Template(rf, ctx) { if (rf & 1) {
1286
+ i0.ɵɵelementStart(0, "p", 15);
182
1287
  i0.ɵɵtext(1, "Select an integration to see run details.");
183
1288
  i0.ɵɵelementEnd();
184
1289
  } }
185
- function MappingWorkspaceComponent_Conditional_6_Conditional_19_Template(rf, ctx) { if (rf & 1) {
186
- i0.ɵɵelement(0, "mj-loading", 17);
1290
+ function MappingWorkspaceComponent_Conditional_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
1291
+ i0.ɵɵelement(0, "mj-loading", 16);
187
1292
  } }
188
- function MappingWorkspaceComponent_Conditional_6_Conditional_20_Template(rf, ctx) { if (rf & 1) {
189
- i0.ɵɵelementStart(0, "p", 16);
1293
+ function MappingWorkspaceComponent_Conditional_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1294
+ i0.ɵɵelementStart(0, "p", 15);
190
1295
  i0.ɵɵtext(1, "No runs found.");
191
1296
  i0.ɵɵelementEnd();
192
1297
  } }
193
- function MappingWorkspaceComponent_Conditional_6_Conditional_21_Conditional_22_For_3_Template(rf, ctx) { if (rf & 1) {
194
- i0.ɵɵelementStart(0, "div", 48)(1, "div", 49);
1298
+ function MappingWorkspaceComponent_Conditional_6_Conditional_19_Conditional_22_For_3_Template(rf, ctx) { if (rf & 1) {
1299
+ i0.ɵɵelementStart(0, "div", 201)(1, "div", 202);
195
1300
  i0.ɵɵtext(2);
196
1301
  i0.ɵɵelementEnd();
197
- i0.ɵɵelementStart(3, "div", 50)(4, "div", 51)(5, "span", 52);
1302
+ i0.ɵɵelementStart(3, "div", 203)(4, "div", 204)(5, "span", 205);
198
1303
  i0.ɵɵtext(6);
199
1304
  i0.ɵɵelementEnd();
200
- i0.ɵɵelementStart(7, "span", 53);
1305
+ i0.ɵɵelementStart(7, "span", 206);
201
1306
  i0.ɵɵtext(8, "Created");
202
1307
  i0.ɵɵelementEnd()();
203
- i0.ɵɵelementStart(9, "div", 51)(10, "span", 52);
1308
+ i0.ɵɵelementStart(9, "div", 204)(10, "span", 205);
204
1309
  i0.ɵɵtext(11);
205
1310
  i0.ɵɵelementEnd();
206
- i0.ɵɵelementStart(12, "span", 53);
1311
+ i0.ɵɵelementStart(12, "span", 206);
207
1312
  i0.ɵɵtext(13, "Updated");
208
1313
  i0.ɵɵelementEnd()();
209
- i0.ɵɵelementStart(14, "div", 51)(15, "span", 54);
1314
+ i0.ɵɵelementStart(14, "div", 204)(15, "span", 205);
210
1315
  i0.ɵɵtext(16);
211
1316
  i0.ɵɵelementEnd();
212
- i0.ɵɵelementStart(17, "span", 53);
1317
+ i0.ɵɵelementStart(17, "span", 206);
213
1318
  i0.ɵɵtext(18, "Errors");
214
1319
  i0.ɵɵelementEnd()()()();
215
1320
  } if (rf & 2) {
216
- const detail_r9 = ctx.$implicit;
1321
+ const detail_r55 = ctx.$implicit;
217
1322
  i0.ɵɵadvance(2);
218
- i0.ɵɵtextInterpolate(detail_r9.Entity);
1323
+ i0.ɵɵtextInterpolate(detail_r55.Entity);
219
1324
  i0.ɵɵadvance(4);
220
- i0.ɵɵtextInterpolate(detail_r9.RecordsCreated);
1325
+ i0.ɵɵtextInterpolate(detail_r55.RecordsCreated);
221
1326
  i0.ɵɵadvance(5);
222
- i0.ɵɵtextInterpolate(detail_r9.RecordsUpdated);
1327
+ i0.ɵɵtextInterpolate(detail_r55.RecordsUpdated);
223
1328
  i0.ɵɵadvance(4);
224
- i0.ɵɵclassProp("has-errors", detail_r9.RecordsErrored > 0);
1329
+ i0.ɵɵclassProp("has-errors", detail_r55.RecordsErrored > 0);
225
1330
  i0.ɵɵadvance();
226
- i0.ɵɵtextInterpolate1(" ", detail_r9.RecordsErrored, " ");
1331
+ i0.ɵɵtextInterpolate1(" ", detail_r55.RecordsErrored, " ");
227
1332
  } }
228
- function MappingWorkspaceComponent_Conditional_6_Conditional_21_Conditional_22_Template(rf, ctx) { if (rf & 1) {
229
- i0.ɵɵelementStart(0, "h4", 47);
1333
+ function MappingWorkspaceComponent_Conditional_6_Conditional_19_Conditional_22_Template(rf, ctx) { if (rf & 1) {
1334
+ i0.ɵɵelementStart(0, "h4", 200);
230
1335
  i0.ɵɵtext(1, "Per-Entity Stats");
231
1336
  i0.ɵɵelementEnd();
232
- i0.ɵɵrepeaterCreate(2, MappingWorkspaceComponent_Conditional_6_Conditional_21_Conditional_22_For_3_Template, 19, 6, "div", 48, _forTrack0);
1337
+ i0.ɵɵrepeaterCreate(2, MappingWorkspaceComponent_Conditional_6_Conditional_19_Conditional_22_For_3_Template, 19, 6, "div", 201, _forTrack3);
233
1338
  } if (rf & 2) {
234
1339
  const ctx_r1 = i0.ɵɵnextContext(3);
235
1340
  i0.ɵɵadvance(2);
236
1341
  i0.ɵɵrepeater(ctx_r1.RunEntityDetails);
237
1342
  } }
238
- function MappingWorkspaceComponent_Conditional_6_Conditional_21_Template(rf, ctx) { if (rf & 1) {
239
- i0.ɵɵelementStart(0, "div", 43)(1, "div", 44)(2, "span", 45);
1343
+ function MappingWorkspaceComponent_Conditional_6_Conditional_19_Template(rf, ctx) { if (rf & 1) {
1344
+ i0.ɵɵelementStart(0, "div", 196)(1, "div", 197)(2, "span", 198);
240
1345
  i0.ɵɵtext(3, "Status");
241
1346
  i0.ɵɵelementEnd();
242
- i0.ɵɵelementStart(4, "span", 46);
1347
+ i0.ɵɵelementStart(4, "span", 199);
243
1348
  i0.ɵɵtext(5);
244
1349
  i0.ɵɵelementEnd()();
245
- i0.ɵɵelementStart(6, "div", 44)(7, "span", 45);
1350
+ i0.ɵɵelementStart(6, "div", 197)(7, "span", 198);
246
1351
  i0.ɵɵtext(8, "Started");
247
1352
  i0.ɵɵelementEnd();
248
1353
  i0.ɵɵelementStart(9, "span");
249
1354
  i0.ɵɵtext(10);
250
1355
  i0.ɵɵelementEnd()();
251
- i0.ɵɵelementStart(11, "div", 44)(12, "span", 45);
1356
+ i0.ɵɵelementStart(11, "div", 197)(12, "span", 198);
252
1357
  i0.ɵɵtext(13, "Total Records");
253
1358
  i0.ɵɵelementEnd();
254
1359
  i0.ɵɵelementStart(14, "span");
255
1360
  i0.ɵɵtext(15);
256
1361
  i0.ɵɵpipe(16, "number");
257
1362
  i0.ɵɵelementEnd()();
258
- i0.ɵɵelementStart(17, "div", 44)(18, "span", 45);
1363
+ i0.ɵɵelementStart(17, "div", 197)(18, "span", 198);
259
1364
  i0.ɵɵtext(19, "Run By");
260
1365
  i0.ɵɵelementEnd();
261
1366
  i0.ɵɵelementStart(20, "span");
262
1367
  i0.ɵɵtext(21);
263
1368
  i0.ɵɵelementEnd()()();
264
- i0.ɵɵconditionalCreate(22, MappingWorkspaceComponent_Conditional_6_Conditional_21_Conditional_22_Template, 4, 0);
1369
+ i0.ɵɵconditionalCreate(22, MappingWorkspaceComponent_Conditional_6_Conditional_19_Conditional_22_Template, 4, 0);
265
1370
  } if (rf & 2) {
266
1371
  const ctx_r1 = i0.ɵɵnextContext(2);
267
1372
  i0.ɵɵadvance(4);
@@ -279,73 +1384,184 @@ function MappingWorkspaceComponent_Conditional_6_Conditional_21_Template(rf, ctx
279
1384
  } }
280
1385
  function MappingWorkspaceComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
281
1386
  const _r1 = i0.ɵɵgetCurrentView();
282
- i0.ɵɵelementStart(0, "kendo-splitter", 4)(1, "kendo-splitter-pane", 5)(2, "div", 6)(3, "div", 7)(4, "label", 8);
283
- i0.ɵɵtext(5, "Integration");
1387
+ i0.ɵɵelementStart(0, "div", 4)(1, "div", 5)(2, "div", 6)(3, "label", 7);
1388
+ i0.ɵɵtext(4, "Integration");
284
1389
  i0.ɵɵelementEnd();
285
- i0.ɵɵelementStart(6, "kendo-dropdownlist", 9);
286
- i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Template_kendo_dropdownlist_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedIntegrationID, $event) || (ctx_r1.SelectedIntegrationID = $event); return i0.ɵɵresetView($event); });
287
- i0.ɵɵlistener("valueChange", function MappingWorkspaceComponent_Conditional_6_Template_kendo_dropdownlist_valueChange_6_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnIntegrationChange($event)); });
288
- i0.ɵɵelementEnd()();
289
- i0.ɵɵconditionalCreate(7, MappingWorkspaceComponent_Conditional_6_Conditional_7_Template, 1, 0, "mj-loading", 10)(8, MappingWorkspaceComponent_Conditional_6_Conditional_8_Template, 7, 2, "div", 7);
1390
+ i0.ɵɵelementStart(5, "kendo-dropdownlist", 8);
1391
+ i0.ɵɵtwoWayListener("ngModelChange", function MappingWorkspaceComponent_Conditional_6_Template_kendo_dropdownlist_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedIntegrationID, $event) || (ctx_r1.SelectedIntegrationID = $event); return i0.ɵɵresetView($event); });
1392
+ i0.ɵɵlistener("valueChange", function MappingWorkspaceComponent_Conditional_6_Template_kendo_dropdownlist_valueChange_5_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnIntegrationChange($event)); });
290
1393
  i0.ɵɵelementEnd()();
291
- i0.ɵɵelementStart(9, "kendo-splitter-pane", 5)(10, "div", 11);
292
- i0.ɵɵconditionalCreate(11, MappingWorkspaceComponent_Conditional_6_Conditional_11_Template, 4, 0, "div", 12)(12, MappingWorkspaceComponent_Conditional_6_Conditional_12_Template, 1, 0, "mj-loading", 13)(13, MappingWorkspaceComponent_Conditional_6_Conditional_13_Template, 13, 9);
293
- i0.ɵɵelementEnd()();
294
- i0.ɵɵelementStart(14, "kendo-splitter-pane", 14)(15, "div", 15)(16, "h4", 8);
295
- i0.ɵɵtext(17, "Last Run Details");
1394
+ i0.ɵɵconditionalCreate(6, MappingWorkspaceComponent_Conditional_6_Conditional_6_Template, 1, 0, "mj-loading", 9)(7, MappingWorkspaceComponent_Conditional_6_Conditional_7_Template, 12, 5);
296
1395
  i0.ɵɵelementEnd();
297
- i0.ɵɵconditionalCreate(18, MappingWorkspaceComponent_Conditional_6_Conditional_18_Template, 2, 0, "p", 16)(19, MappingWorkspaceComponent_Conditional_6_Conditional_19_Template, 1, 0, "mj-loading", 17)(20, MappingWorkspaceComponent_Conditional_6_Conditional_20_Template, 2, 0, "p", 16)(21, MappingWorkspaceComponent_Conditional_6_Conditional_21_Template, 23, 9);
298
- i0.ɵɵelementEnd()()();
1396
+ i0.ɵɵelementStart(8, "div", 10);
1397
+ i0.ɵɵconditionalCreate(9, MappingWorkspaceComponent_Conditional_6_Conditional_9_Template, 4, 0, "div", 11)(10, MappingWorkspaceComponent_Conditional_6_Conditional_10_Template, 37, 9, "div", 12)(11, MappingWorkspaceComponent_Conditional_6_Conditional_11_Template, 1, 0, "mj-loading", 13)(12, MappingWorkspaceComponent_Conditional_6_Conditional_12_Template, 29, 21);
1398
+ i0.ɵɵelementEnd();
1399
+ i0.ɵɵelementStart(13, "div", 14)(14, "h4", 7);
1400
+ i0.ɵɵtext(15, "Last Run Details");
1401
+ i0.ɵɵelementEnd();
1402
+ i0.ɵɵconditionalCreate(16, MappingWorkspaceComponent_Conditional_6_Conditional_16_Template, 2, 0, "p", 15)(17, MappingWorkspaceComponent_Conditional_6_Conditional_17_Template, 1, 0, "mj-loading", 16)(18, MappingWorkspaceComponent_Conditional_6_Conditional_18_Template, 2, 0, "p", 15)(19, MappingWorkspaceComponent_Conditional_6_Conditional_19_Template, 23, 9);
1403
+ i0.ɵɵelementEnd()();
299
1404
  } if (rf & 2) {
300
1405
  const ctx_r1 = i0.ɵɵnextContext();
301
- i0.ɵɵproperty("orientation", "horizontal");
302
- i0.ɵɵadvance();
303
- i0.ɵɵproperty("size", "25%")("min", "200px");
304
1406
  i0.ɵɵadvance(5);
305
1407
  i0.ɵɵproperty("data", ctx_r1.Integrations)("textField", "Name")("valueField", "ID")("valuePrimitive", true);
306
1408
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedIntegrationID);
307
- i0.ɵɵproperty("defaultItem", i0.ɵɵpureFunction0(15, _c0));
1409
+ i0.ɵɵproperty("defaultItem", i0.ɵɵpureFunction0(9, _c0));
308
1410
  i0.ɵɵadvance();
309
- i0.ɵɵconditional(ctx_r1.IsLoadingEntityMaps ? 7 : ctx_r1.SelectedIntegrationID ? 8 : -1);
310
- i0.ɵɵadvance(2);
311
- i0.ɵɵproperty("size", "50%")("min", "300px");
312
- i0.ɵɵadvance(2);
313
- i0.ɵɵconditional(!ctx_r1.SelectedEntityMapID ? 11 : ctx_r1.IsLoadingFieldMaps ? 12 : 13);
1411
+ i0.ɵɵconditional(ctx_r1.IsLoadingEntityMaps ? 6 : ctx_r1.SelectedIntegrationID ? 7 : -1);
314
1412
  i0.ɵɵadvance(3);
315
- i0.ɵɵproperty("min", "200px");
316
- i0.ɵɵadvance(4);
317
- i0.ɵɵconditional(!ctx_r1.SelectedIntegrationID ? 18 : ctx_r1.IsLoadingRunDetails ? 19 : !ctx_r1.LatestRun ? 20 : 21);
1413
+ i0.ɵɵconditional(!ctx_r1.SelectedMapID ? 9 : ctx_r1.SelectedPendingMap ? 10 : ctx_r1.IsLoadingFieldMaps ? 11 : 12);
1414
+ i0.ɵɵadvance(7);
1415
+ i0.ɵɵconditional(!ctx_r1.SelectedIntegrationID ? 16 : ctx_r1.IsLoadingRunDetails ? 17 : !ctx_r1.LatestRun ? 18 : 19);
318
1416
  } }
1417
+ // ---------------------------------------------------------------------------
1418
+ // Component
1419
+ // ---------------------------------------------------------------------------
319
1420
  let MappingWorkspaceComponent = class MappingWorkspaceComponent extends BaseResourceComponent {
320
- /**
321
- * The Provider @Input is inherited from BaseAngularComponent.
322
- * Use this.RunViewToUse to get the appropriate IRunViewProvider
323
- * for multi-MJ-instance support.
324
- */
1421
+ // --- Core data ---
325
1422
  Integrations = [];
326
1423
  EntityMaps = [];
327
1424
  FieldMaps = [];
328
1425
  RunEntityDetails = [];
329
1426
  LatestRun = null;
1427
+ // --- Selection ---
330
1428
  SelectedIntegrationID = '';
331
- SelectedEntityMapID = null;
1429
+ SelectedMapID = null;
332
1430
  EntityMapSearchText = '';
1431
+ // --- Loading ---
333
1432
  IsLoadingIntegrations = false;
334
1433
  IsLoadingEntityMaps = false;
335
1434
  IsLoadingFieldMaps = false;
336
1435
  IsLoadingRunDetails = false;
1436
+ // --- Add Map flow ---
1437
+ ShowAddPanel = false;
1438
+ TargetMode = 'existing';
1439
+ // Source objects from discovery
1440
+ DiscoveredObjects = [];
1441
+ IsDiscoveringObjects = false;
1442
+ DiscoverError = '';
1443
+ SelectedSourceObjectName = '';
1444
+ // Target: existing entity
1445
+ MJEntities = [];
1446
+ IsLoadingEntities = false;
1447
+ SelectedEntityID = null;
1448
+ // Target: new entity
1449
+ NewEntitySchemaName = '';
1450
+ NewEntityTableName = '';
1451
+ NewEntityName = '';
1452
+ DBSchemas = [];
1453
+ // Sync direction for add flow
1454
+ AddSyncDirection = 'Pull';
1455
+ IsSavingEntityMap = false;
1456
+ // --- Pending entity maps (local state) ---
1457
+ PendingMaps = [];
1458
+ // --- DDL preview ---
1459
+ IsGeneratingDDL = false;
1460
+ DDLPreviewContent = '';
1461
+ DDLPreviewError = '';
1462
+ // --- Field mapping editing ---
1463
+ EditableFields = [];
1464
+ DestinationFields = [];
1465
+ IsLoadingDestFields = false;
1466
+ IsSavingFields = false;
1467
+ AutoMapCount = 0;
1468
+ ShowAutoMapBanner = false;
1469
+ // --- Source fields for auto-mapping ---
1470
+ SourceFields = [];
1471
+ IsLoadingSourceFields = false;
1472
+ // --- Data preview ---
1473
+ SourcePreviewData = [];
1474
+ DestPreviewData = [];
1475
+ IsLoadingSourcePreview = false;
1476
+ IsLoadingDestPreview = false;
1477
+ ShowSourcePreview = false;
1478
+ ShowDestPreview = false;
337
1479
  dataService = inject(IntegrationDataService);
338
1480
  cdr = inject(ChangeDetectorRef);
1481
+ discoverCache = new Map();
1482
+ pendingCounter = 0;
339
1483
  async ngOnInit() {
340
1484
  await this.LoadIntegrations();
341
1485
  }
342
- get FilteredEntityMaps() {
1486
+ // =====================================================================
1487
+ // Computed Properties
1488
+ // =====================================================================
1489
+ /** Merged list of real entity maps + pending maps, for the left panel */
1490
+ get AllMaps() {
1491
+ const realItems = this.EntityMaps.map(em => ({
1492
+ ID: em.ID,
1493
+ SourceName: em.ExternalObjectName,
1494
+ TargetName: em.Entity,
1495
+ SyncDirection: em.SyncDirection,
1496
+ SyncEnabled: em.SyncEnabled,
1497
+ IsPending: false,
1498
+ RealMap: em,
1499
+ PendingMap: null
1500
+ }));
1501
+ const pendingItems = this.PendingMaps.map(pm => ({
1502
+ ID: pm.LocalID,
1503
+ SourceName: pm.SourceObjectName,
1504
+ TargetName: pm.EntityName,
1505
+ SyncDirection: pm.SyncDirection,
1506
+ SyncEnabled: false,
1507
+ IsPending: true,
1508
+ RealMap: null,
1509
+ PendingMap: pm
1510
+ }));
1511
+ return [...realItems, ...pendingItems];
1512
+ }
1513
+ get FilteredMaps() {
1514
+ const all = this.AllMaps;
343
1515
  if (!this.EntityMapSearchText.trim())
344
- return this.EntityMaps;
1516
+ return all;
345
1517
  const search = this.EntityMapSearchText.toLowerCase();
346
- return this.EntityMaps.filter(em => em.ExternalObjectName.toLowerCase().includes(search)
347
- || em.Entity.toLowerCase().includes(search));
1518
+ return all.filter(m => m.SourceName.toLowerCase().includes(search)
1519
+ || m.TargetName.toLowerCase().includes(search));
1520
+ }
1521
+ get SelectedMap() {
1522
+ if (!this.SelectedMapID)
1523
+ return null;
1524
+ return this.AllMaps.find(m => UUIDsEqual(m.ID, this.SelectedMapID)) ?? null;
1525
+ }
1526
+ get SelectedEntityMap() {
1527
+ const map = this.SelectedMap;
1528
+ return map?.RealMap ?? null;
1529
+ }
1530
+ get SelectedPendingMap() {
1531
+ const map = this.SelectedMap;
1532
+ return map?.PendingMap ?? null;
1533
+ }
1534
+ get HasDirtyFields() {
1535
+ return this.EditableFields.some(f => f.IsDirty || f.IsNew);
1536
+ }
1537
+ get ActiveEditableFields() {
1538
+ return this.EditableFields.filter(f => f.Status !== 'Inactive');
1539
+ }
1540
+ get IsAddFormValid() {
1541
+ if (!this.SelectedSourceObjectName)
1542
+ return false;
1543
+ if (this.TargetMode === 'existing')
1544
+ return !!this.SelectedEntityID;
1545
+ return !!this.NewEntitySchemaName.trim() && !!this.NewEntityTableName.trim() && !!this.NewEntityName.trim();
348
1546
  }
1547
+ /** Auto-suggest table/entity names from selected source object */
1548
+ get SuggestedTableName() {
1549
+ if (!this.SelectedSourceObjectName)
1550
+ return '';
1551
+ return this.SelectedSourceObjectName.replace(/[^A-Za-z0-9_]/g, '_');
1552
+ }
1553
+ get SuggestedEntityName() {
1554
+ if (!this.SelectedSourceObjectName)
1555
+ return '';
1556
+ const obj = this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName);
1557
+ const label = obj?.Label || this.SelectedSourceObjectName;
1558
+ if (this.NewEntitySchemaName)
1559
+ return `${this.NewEntitySchemaName} ${label}`;
1560
+ return label;
1561
+ }
1562
+ // =====================================================================
1563
+ // Data Loading
1564
+ // =====================================================================
349
1565
  async LoadIntegrations() {
350
1566
  this.IsLoadingIntegrations = true;
351
1567
  this.cdr.detectChanges();
@@ -360,16 +1576,22 @@ let MappingWorkspaceComponent = class MappingWorkspaceComponent extends BaseReso
360
1576
  }
361
1577
  async OnIntegrationChange(integrationID) {
362
1578
  this.SelectedIntegrationID = integrationID;
363
- this.SelectedEntityMapID = null;
1579
+ this.SelectedMapID = null;
364
1580
  this.FieldMaps = [];
1581
+ this.EditableFields = [];
1582
+ this.DestinationFields = [];
365
1583
  this.RunEntityDetails = [];
366
1584
  this.LatestRun = null;
367
1585
  this.EntityMapSearchText = '';
1586
+ this.CloseAddPanel();
1587
+ this.CloseAllPreviews();
368
1588
  if (!integrationID)
369
1589
  return;
1590
+ // Load entity maps + latest run in parallel, and auto-discover source objects
370
1591
  await Promise.all([
371
1592
  this.LoadEntityMapsForIntegration(integrationID),
372
- this.LoadLatestRunForIntegration(integrationID)
1593
+ this.LoadLatestRunForIntegration(integrationID),
1594
+ this.DiscoverSourceObjects(integrationID)
373
1595
  ]);
374
1596
  }
375
1597
  async LoadEntityMapsForIntegration(integrationID) {
@@ -398,24 +1620,708 @@ let MappingWorkspaceComponent = class MappingWorkspaceComponent extends BaseReso
398
1620
  this.cdr.detectChanges();
399
1621
  }
400
1622
  }
401
- async OnEntityMapSelect(em) {
402
- this.SelectedEntityMapID = em.ID;
1623
+ /** Load source objects from IntegrationObject metadata via engine (cached per integration) */
1624
+ DiscoverSourceObjects(integrationID) {
1625
+ if (this.discoverCache.has(integrationID)) {
1626
+ this.DiscoveredObjects = this.discoverCache.get(integrationID);
1627
+ return Promise.resolve();
1628
+ }
1629
+ this.IsDiscoveringObjects = true;
1630
+ this.DiscoverError = '';
1631
+ this.DiscoveredObjects = [];
1632
+ this.cdr.detectChanges();
1633
+ try {
1634
+ const engine = IntegrationEngineBase.Instance;
1635
+ const integration = engine.GetIntegrationForCompanyIntegration(integrationID);
1636
+ if (!integration) {
1637
+ this.DiscoverError = 'Integration not found in metadata';
1638
+ return Promise.resolve();
1639
+ }
1640
+ const objects = engine.GetActiveIntegrationObjects(integration.ID);
1641
+ this.DiscoveredObjects = objects.map(o => ({
1642
+ Name: o.Name,
1643
+ Label: o.DisplayName || o.Name,
1644
+ Category: o.Category || 'Uncategorized',
1645
+ Description: o.Description || '',
1646
+ SupportsIncrementalSync: o.SupportsIncrementalSync,
1647
+ SupportsWrite: o.SupportsWrite
1648
+ }));
1649
+ this.discoverCache.set(integrationID, this.DiscoveredObjects);
1650
+ }
1651
+ catch (e) {
1652
+ this.DiscoverError = `Failed to load objects: ${e.message}`;
1653
+ }
1654
+ finally {
1655
+ this.IsDiscoveringObjects = false;
1656
+ this.cdr.detectChanges();
1657
+ }
1658
+ return Promise.resolve();
1659
+ }
1660
+ // =====================================================================
1661
+ // Entity Map Selection
1662
+ // =====================================================================
1663
+ async OnMapSelect(item) {
1664
+ this.SelectedMapID = item.ID;
1665
+ this.CloseAllPreviews();
1666
+ if (item.IsPending) {
1667
+ // Pending maps show the pending entity view in center panel
1668
+ this.EditableFields = [];
1669
+ this.DestinationFields = [];
1670
+ this.cdr.detectChanges();
1671
+ return;
1672
+ }
1673
+ // Real entity map — load field maps + dest fields, resolve source from metadata
403
1674
  this.IsLoadingFieldMaps = true;
404
1675
  this.cdr.detectChanges();
405
1676
  try {
406
- this.FieldMaps = await this.dataService.LoadFieldMaps(em.ID, this.RunViewToUse);
1677
+ await Promise.all([
1678
+ this.dataService.LoadFieldMaps(item.ID, this.RunViewToUse).then(fms => { this.FieldMaps = fms; }),
1679
+ this.LoadDestinationFields(item.RealMap.EntityID)
1680
+ ]);
1681
+ // Resolve source fields from IntegrationObject metadata
1682
+ this.SourceFields = this.resolveSourceFieldsFromMetadata(this.SelectedIntegrationID, item.RealMap.ExternalObjectName);
1683
+ this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));
407
1684
  }
408
1685
  finally {
409
1686
  this.IsLoadingFieldMaps = false;
410
1687
  this.cdr.detectChanges();
411
1688
  }
412
1689
  }
413
- IsSelectedEntityMap(id) {
414
- return UUIDsEqual(this.SelectedEntityMapID, id);
1690
+ IsSelectedMap(id) {
1691
+ return this.SelectedMapID === id || UUIDsEqual(this.SelectedMapID, id);
1692
+ }
1693
+ async OnToggleEntityMap(em) {
1694
+ await this.dataService.ToggleEntityMapEnabled(em.ID, em.SyncEnabled);
1695
+ }
1696
+ async OnDeleteMap(item, event) {
1697
+ event.stopPropagation();
1698
+ if (item.IsPending) {
1699
+ this.PendingMaps = this.PendingMaps.filter(p => p.LocalID !== item.ID);
1700
+ }
1701
+ else {
1702
+ const deleted = await this.dataService.DeleteEntityMap(item.ID);
1703
+ if (deleted) {
1704
+ this.EntityMaps = this.EntityMaps.filter(e => !UUIDsEqual(e.ID, item.ID));
1705
+ }
1706
+ }
1707
+ if (this.IsSelectedMap(item.ID)) {
1708
+ this.SelectedMapID = null;
1709
+ this.EditableFields = [];
1710
+ this.DestinationFields = [];
1711
+ }
1712
+ this.cdr.detectChanges();
1713
+ }
1714
+ // =====================================================================
1715
+ // Add Map Flow
1716
+ // =====================================================================
1717
+ OpenAddPanel() {
1718
+ this.ShowAddPanel = true;
1719
+ this.TargetMode = 'existing';
1720
+ this.ResetAddForm();
1721
+ this.EnsureEntitiesLoaded();
1722
+ this.LoadDBSchemas();
1723
+ }
1724
+ CloseAddPanel() {
1725
+ this.ShowAddPanel = false;
1726
+ this.ResetAddForm();
1727
+ }
1728
+ SetTargetMode(mode) {
1729
+ this.TargetMode = mode;
1730
+ }
1731
+ OnSourceObjectChange(objectName) {
1732
+ this.SelectedSourceObjectName = objectName;
1733
+ // Auto-suggest table/entity name for new entity mode
1734
+ if (this.TargetMode === 'new') {
1735
+ this.NewEntityTableName = this.SuggestedTableName;
1736
+ this.NewEntityName = this.SuggestedEntityName;
1737
+ }
1738
+ }
1739
+ OnSchemaNameChange() {
1740
+ // Update entity name suggestion when schema changes
1741
+ if (this.SelectedSourceObjectName) {
1742
+ this.NewEntityName = this.SuggestedEntityName;
1743
+ }
1744
+ }
1745
+ async SaveAddMap() {
1746
+ if (!this.IsAddFormValid || !this.SelectedIntegrationID)
1747
+ return;
1748
+ this.IsSavingEntityMap = true;
1749
+ this.cdr.detectChanges();
1750
+ try {
1751
+ if (this.TargetMode === 'existing') {
1752
+ await this.SaveExistingEntityMap();
1753
+ }
1754
+ else {
1755
+ await this.SaveNewEntityMap();
1756
+ }
1757
+ }
1758
+ finally {
1759
+ this.IsSavingEntityMap = false;
1760
+ this.cdr.detectChanges();
1761
+ }
1762
+ }
1763
+ async SaveExistingEntityMap() {
1764
+ const sourceObj = this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName);
1765
+ const result = await this.dataService.CreateEntityMap({
1766
+ CompanyIntegrationID: this.SelectedIntegrationID,
1767
+ ExternalObjectName: this.SelectedSourceObjectName,
1768
+ ExternalObjectLabel: sourceObj?.Label !== sourceObj?.Name ? sourceObj?.Label : undefined,
1769
+ EntityID: this.SelectedEntityID,
1770
+ SyncDirection: this.AddSyncDirection
1771
+ });
1772
+ if (result) {
1773
+ // Reload entity maps and auto-generate field mappings
1774
+ await this.LoadEntityMapsForIntegration(this.SelectedIntegrationID);
1775
+ const newMap = this.EntityMaps.find(em => em.ExternalObjectName === this.SelectedSourceObjectName);
1776
+ if (newMap) {
1777
+ this.SelectedMapID = newMap.ID;
1778
+ await this.AutoGenerateFieldMappings(newMap);
1779
+ }
1780
+ this.CloseAddPanel();
1781
+ }
1782
+ }
1783
+ async SaveNewEntityMap() {
1784
+ // Resolve source fields from IntegrationObject metadata
1785
+ const sourceFields = this.resolveSourceFieldsFromMetadata(this.SelectedIntegrationID, this.SelectedSourceObjectName);
1786
+ // Generate DDL preview
1787
+ let ddlContent = '';
1788
+ try {
1789
+ const ddlResult = await this.dataService.SchemaPreview(this.SelectedIntegrationID, [{
1790
+ SourceObjectName: this.SelectedSourceObjectName,
1791
+ SchemaName: this.NewEntitySchemaName.trim(),
1792
+ TableName: this.NewEntityTableName.trim(),
1793
+ EntityName: this.NewEntityName.trim()
1794
+ }], 'sqlserver');
1795
+ if (ddlResult.Success && ddlResult.Files.length > 0) {
1796
+ ddlContent = ddlResult.Files.map(f => f.Content).join('\n\n');
1797
+ }
1798
+ }
1799
+ catch {
1800
+ // DDL will be empty — not a blocker
1801
+ }
1802
+ // Create pending map entry
1803
+ const pendingMap = {
1804
+ LocalID: `pending-${++this.pendingCounter}`,
1805
+ SourceObjectName: this.SelectedSourceObjectName,
1806
+ SourceObjectLabel: this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName)?.Label || this.SelectedSourceObjectName,
1807
+ SchemaName: this.NewEntitySchemaName.trim(),
1808
+ TableName: this.NewEntityTableName.trim(),
1809
+ EntityName: this.NewEntityName.trim(),
1810
+ SyncDirection: this.AddSyncDirection,
1811
+ SourceFields: sourceFields,
1812
+ DDLContent: ddlContent,
1813
+ CreatedAt: new Date()
1814
+ };
1815
+ this.PendingMaps.push(pendingMap);
1816
+ this.SelectedMapID = pendingMap.LocalID;
1817
+ this.CloseAddPanel();
1818
+ }
1819
+ ResetAddForm() {
1820
+ this.SelectedSourceObjectName = '';
1821
+ this.SelectedEntityID = null;
1822
+ this.NewEntitySchemaName = '';
1823
+ this.NewEntityTableName = '';
1824
+ this.NewEntityName = '';
1825
+ this.AddSyncDirection = 'Pull';
1826
+ this.DDLPreviewContent = '';
1827
+ this.DDLPreviewError = '';
1828
+ }
1829
+ async EnsureEntitiesLoaded() {
1830
+ if (this.MJEntities.length > 0)
1831
+ return;
1832
+ this.IsLoadingEntities = true;
1833
+ this.cdr.detectChanges();
1834
+ try {
1835
+ this.MJEntities = await this.dataService.LoadMJEntities(this.RunViewToUse);
1836
+ }
1837
+ finally {
1838
+ this.IsLoadingEntities = false;
1839
+ this.cdr.detectChanges();
1840
+ }
1841
+ }
1842
+ LoadDBSchemas() {
1843
+ if (this.DBSchemas.length > 0)
1844
+ return;
1845
+ const md = new Metadata();
1846
+ const schemaSet = new Set();
1847
+ for (const entity of md.Entities) {
1848
+ if (entity.SchemaName) {
1849
+ schemaSet.add(entity.SchemaName);
1850
+ }
1851
+ }
1852
+ this.DBSchemas = Array.from(schemaSet).sort();
1853
+ }
1854
+ // =====================================================================
1855
+ // DDL Preview for Add Panel
1856
+ // =====================================================================
1857
+ async PreviewDDL() {
1858
+ if (!this.SelectedSourceObjectName || !this.NewEntitySchemaName.trim() || !this.NewEntityTableName.trim())
1859
+ return;
1860
+ this.IsGeneratingDDL = true;
1861
+ this.DDLPreviewContent = '';
1862
+ this.DDLPreviewError = '';
1863
+ this.cdr.detectChanges();
1864
+ try {
1865
+ const result = await this.dataService.SchemaPreview(this.SelectedIntegrationID, [{
1866
+ SourceObjectName: this.SelectedSourceObjectName,
1867
+ SchemaName: this.NewEntitySchemaName.trim(),
1868
+ TableName: this.NewEntityTableName.trim(),
1869
+ EntityName: this.NewEntityName.trim() || this.SuggestedEntityName
1870
+ }], 'sqlserver');
1871
+ if (result.Success && result.Files.length > 0) {
1872
+ this.DDLPreviewContent = result.Files.map(f => `-- ${f.Description}\n-- ${f.FilePath}\n\n${f.Content}`).join('\n\n');
1873
+ }
1874
+ else {
1875
+ this.DDLPreviewError = result.Message || 'No DDL generated';
1876
+ }
1877
+ }
1878
+ catch (e) {
1879
+ this.DDLPreviewError = `DDL generation failed: ${e.message}`;
1880
+ }
1881
+ finally {
1882
+ this.IsGeneratingDDL = false;
1883
+ this.cdr.detectChanges();
1884
+ }
1885
+ }
1886
+ // =====================================================================
1887
+ // Field Mapping
1888
+ // =====================================================================
1889
+ ToEditableField(fm) {
1890
+ // Look up source metadata from IntegrationObjectField entities
1891
+ const srcMeta = this.SourceFields.find(sf => sf.Name.toLowerCase() === fm.SourceFieldName.toLowerCase());
1892
+ return {
1893
+ ID: fm.ID,
1894
+ SourceFieldName: fm.SourceFieldName,
1895
+ SourceFieldLabel: fm.SourceFieldLabel ?? '',
1896
+ SourceFieldType: srcMeta?.Type ?? '',
1897
+ DestinationFieldName: fm.DestinationFieldName,
1898
+ DestinationFieldLabel: fm.DestinationFieldLabel ?? '',
1899
+ IsKeyField: fm.IsKeyField,
1900
+ IsRequired: fm.IsRequired,
1901
+ Direction: fm.Direction,
1902
+ Status: fm.Status,
1903
+ IsNew: false,
1904
+ IsDirty: false,
1905
+ IsSourcePK: srcMeta?.IsPrimaryKey ?? false,
1906
+ IsSourceRequired: srcMeta?.IsRequired ?? false,
1907
+ IsSourceReadOnly: srcMeta?.IsReadOnly ?? false,
1908
+ TransformPipeline: this.ParseTransformPipeline(fm.TransformPipeline),
1909
+ ShowTransformEditor: false
1910
+ };
1911
+ }
1912
+ ParseTransformPipeline(json) {
1913
+ if (!json || json.trim() === '')
1914
+ return [];
1915
+ try {
1916
+ const parsed = JSON.parse(json);
1917
+ if (!Array.isArray(parsed))
1918
+ return [];
1919
+ return parsed.map(step => ({
1920
+ Type: step.Type ?? 'direct',
1921
+ Config: step.Config ?? {},
1922
+ OnError: step.OnError ?? 'Fail'
1923
+ }));
1924
+ }
1925
+ catch {
1926
+ return [];
1927
+ }
1928
+ }
1929
+ SerializeTransformPipeline(steps) {
1930
+ if (steps.length === 0)
1931
+ return null;
1932
+ return JSON.stringify(steps.map(s => ({ Type: s.Type, Config: s.Config, OnError: s.OnError })));
1933
+ }
1934
+ async LoadDestinationFields(entityID) {
1935
+ this.IsLoadingDestFields = true;
1936
+ this.cdr.detectChanges();
1937
+ try {
1938
+ this.DestinationFields = await this.dataService.LoadEntityFields(entityID, this.RunViewToUse);
1939
+ }
1940
+ finally {
1941
+ this.IsLoadingDestFields = false;
1942
+ this.cdr.detectChanges();
1943
+ }
1944
+ }
1945
+ /** Auto-generate field mappings by matching source fields to destination by name */
1946
+ async AutoGenerateFieldMappings(entityMap) {
1947
+ // Resolve source fields from IntegrationObject metadata
1948
+ this.IsLoadingSourceFields = true;
1949
+ this.cdr.detectChanges();
1950
+ try {
1951
+ this.SourceFields = this.resolveSourceFieldsFromMetadata(this.SelectedIntegrationID, entityMap.ExternalObjectName);
1952
+ if (this.SourceFields.length === 0)
1953
+ return;
1954
+ // Load destination fields
1955
+ await this.LoadDestinationFields(entityMap.EntityID);
1956
+ // Match fields by name (case-insensitive)
1957
+ const matchedFields = this.MatchFieldsByName(this.SourceFields, this.DestinationFields);
1958
+ this.AutoMapCount = matchedFields.length;
1959
+ this.ShowAutoMapBanner = this.AutoMapCount > 0;
1960
+ // Create field maps for matches, preserving source field order via Priority
1961
+ for (let idx = 0; idx < matchedFields.length; idx++) {
1962
+ const match = matchedFields[idx];
1963
+ const displayName = match.sourceField.DisplayName || match.sourceField.Name;
1964
+ await this.dataService.CreateFieldMap({
1965
+ EntityMapID: entityMap.ID,
1966
+ SourceFieldName: match.sourceField.Name,
1967
+ SourceFieldLabel: displayName !== match.sourceField.Name ? displayName : undefined,
1968
+ DestinationFieldName: match.destField.Name,
1969
+ IsKeyField: match.sourceField.IsPrimaryKey,
1970
+ IsRequired: match.sourceField.IsRequired,
1971
+ Direction: 'SourceToDest',
1972
+ TransformPipeline: JSON.stringify([{ Type: 'direct', Config: {}, OnError: 'Fail' }]),
1973
+ Priority: match.sourceIndex
1974
+ });
1975
+ }
1976
+ // Reload field maps
1977
+ this.FieldMaps = await this.dataService.LoadFieldMaps(entityMap.ID, this.RunViewToUse);
1978
+ this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));
1979
+ }
1980
+ finally {
1981
+ this.IsLoadingSourceFields = false;
1982
+ this.cdr.detectChanges();
1983
+ }
1984
+ }
1985
+ MatchFieldsByName(sourceFields, destFields) {
1986
+ const matches = [];
1987
+ const destFieldMap = new Map();
1988
+ for (const df of destFields) {
1989
+ destFieldMap.set(df.Name.toLowerCase(), df);
1990
+ }
1991
+ for (let i = 0; i < sourceFields.length; i++) {
1992
+ const sf = sourceFields[i];
1993
+ const destMatch = destFieldMap.get(sf.Name.toLowerCase());
1994
+ if (destMatch) {
1995
+ matches.push({ sourceField: sf, destField: destMatch, sourceIndex: i });
1996
+ }
1997
+ }
1998
+ return matches;
1999
+ }
2000
+ /** Validation: count fields missing destination mapping */
2001
+ get UnmappedRequiredCount() {
2002
+ return this.EditableFields.filter(f => f.Status === 'Active' && f.IsRequired && !f.DestinationFieldName).length;
2003
+ }
2004
+ /** Validation: check if at least one key field is configured */
2005
+ get HasKeyField() {
2006
+ return this.EditableFields.some(f => f.Status === 'Active' && f.IsKeyField);
2007
+ }
2008
+ /** Validation: overall mapping readiness */
2009
+ get MappingValidation() {
2010
+ const warnings = [];
2011
+ if (this.UnmappedRequiredCount > 0) {
2012
+ warnings.push(`${this.UnmappedRequiredCount} required field(s) missing destination mapping`);
2013
+ }
2014
+ if (!this.HasKeyField && this.ActiveEditableFields.length > 0) {
2015
+ warnings.push('No key field configured — sync may create duplicates');
2016
+ }
2017
+ return { IsValid: warnings.length === 0, Warnings: warnings };
2018
+ }
2019
+ /** Re-run auto-mapping for the currently selected entity map */
2020
+ async RerunAutoMap() {
2021
+ if (!this.SelectedEntityMap)
2022
+ return;
2023
+ await this.AutoGenerateFieldMappings(this.SelectedEntityMap);
2024
+ }
2025
+ OnFieldChanged(field) {
2026
+ field.IsDirty = true;
2027
+ }
2028
+ AddFieldMapping() {
2029
+ this.EditableFields.push({
2030
+ ID: null,
2031
+ SourceFieldName: '',
2032
+ SourceFieldLabel: '',
2033
+ SourceFieldType: '',
2034
+ DestinationFieldName: '',
2035
+ DestinationFieldLabel: '',
2036
+ IsKeyField: false,
2037
+ IsRequired: false,
2038
+ Direction: 'SourceToDest',
2039
+ Status: 'Active',
2040
+ IsNew: true,
2041
+ IsDirty: true,
2042
+ IsSourcePK: false,
2043
+ IsSourceRequired: false,
2044
+ IsSourceReadOnly: false,
2045
+ TransformPipeline: [],
2046
+ ShowTransformEditor: false
2047
+ });
2048
+ this.cdr.detectChanges();
2049
+ }
2050
+ RemoveFieldMapping(index) {
2051
+ const field = this.EditableFields[index];
2052
+ if (field.IsNew) {
2053
+ this.EditableFields.splice(index, 1);
2054
+ }
2055
+ else if (field.ID) {
2056
+ field.Status = 'Inactive';
2057
+ field.IsDirty = true;
2058
+ }
2059
+ this.cdr.detectChanges();
2060
+ }
2061
+ async SaveFieldMappings() {
2062
+ if (!this.SelectedEntityMap)
2063
+ return;
2064
+ this.IsSavingFields = true;
2065
+ this.cdr.detectChanges();
2066
+ try {
2067
+ for (const field of this.EditableFields) {
2068
+ if (!field.IsDirty)
2069
+ continue;
2070
+ if (field.IsNew && field.SourceFieldName && field.DestinationFieldName) {
2071
+ await this.dataService.CreateFieldMap({
2072
+ EntityMapID: this.SelectedEntityMap.ID,
2073
+ SourceFieldName: field.SourceFieldName,
2074
+ SourceFieldLabel: field.SourceFieldLabel || undefined,
2075
+ DestinationFieldName: field.DestinationFieldName,
2076
+ DestinationFieldLabel: field.DestinationFieldLabel || undefined,
2077
+ IsKeyField: field.IsKeyField,
2078
+ IsRequired: field.IsRequired,
2079
+ Direction: field.Direction,
2080
+ TransformPipeline: this.SerializeTransformPipeline(field.TransformPipeline)
2081
+ });
2082
+ }
2083
+ else if (field.ID && field.Status === 'Inactive') {
2084
+ await this.dataService.DeleteFieldMap(field.ID);
2085
+ }
2086
+ else if (field.ID) {
2087
+ await this.dataService.UpdateFieldMap(field.ID, {
2088
+ SourceFieldName: field.SourceFieldName,
2089
+ DestinationFieldName: field.DestinationFieldName,
2090
+ IsKeyField: field.IsKeyField,
2091
+ IsRequired: field.IsRequired,
2092
+ Direction: field.Direction,
2093
+ Status: field.Status,
2094
+ TransformPipeline: this.SerializeTransformPipeline(field.TransformPipeline)
2095
+ });
2096
+ }
2097
+ }
2098
+ this.FieldMaps = await this.dataService.LoadFieldMaps(this.SelectedEntityMap.ID, this.RunViewToUse);
2099
+ this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));
2100
+ this.ShowAutoMapBanner = false;
2101
+ }
2102
+ finally {
2103
+ this.IsSavingFields = false;
2104
+ this.cdr.detectChanges();
2105
+ }
2106
+ }
2107
+ DismissAutoMapBanner() {
2108
+ this.ShowAutoMapBanner = false;
2109
+ }
2110
+ // =====================================================================
2111
+ // Transform Pipeline
2112
+ // =====================================================================
2113
+ /** Available transform types with display metadata */
2114
+ TransformTypes = [
2115
+ { Value: 'direct', Label: 'Direct', Icon: 'fa-solid fa-arrow-right', Description: 'Pass through as-is (with optional default)' },
2116
+ { Value: 'regex', Label: 'Regex', Icon: 'fa-solid fa-code', Description: 'Apply regex pattern replacement' },
2117
+ { Value: 'split', Label: 'Split', Icon: 'fa-solid fa-scissors', Description: 'Split text and extract a segment' },
2118
+ { Value: 'combine', Label: 'Combine', Icon: 'fa-solid fa-object-group', Description: 'Merge multiple source fields' },
2119
+ { Value: 'lookup', Label: 'Lookup', Icon: 'fa-solid fa-book', Description: 'Map values using a lookup table' },
2120
+ { Value: 'format', Label: 'Format', Icon: 'fa-solid fa-font', Description: 'Format dates, numbers, or strings' },
2121
+ { Value: 'coerce', Label: 'Coerce', Icon: 'fa-solid fa-exchange-alt', Description: 'Convert to a different data type' },
2122
+ { Value: 'substring', Label: 'Substring', Icon: 'fa-solid fa-text-width', Description: 'Extract a portion of text' },
2123
+ { Value: 'custom', Label: 'Custom', Icon: 'fa-solid fa-wand-magic-sparkles', Description: 'Custom JavaScript expression' }
2124
+ ];
2125
+ ToggleTransformEditor(field) {
2126
+ // Auto-add a direct step if none exist so the editor has something to show
2127
+ if (field.TransformPipeline.length === 0) {
2128
+ field.TransformPipeline.push({ Type: 'direct', Config: {}, OnError: 'Fail' });
2129
+ field.IsDirty = true;
2130
+ }
2131
+ field.ShowTransformEditor = !field.ShowTransformEditor;
2132
+ this.cdr.detectChanges();
2133
+ }
2134
+ AddTransformStep(field) {
2135
+ field.TransformPipeline.push({
2136
+ Type: 'direct',
2137
+ Config: {},
2138
+ OnError: 'Fail'
2139
+ });
2140
+ field.IsDirty = true;
2141
+ field.ShowTransformEditor = true;
2142
+ this.cdr.detectChanges();
2143
+ }
2144
+ RemoveTransformStep(field, stepIndex) {
2145
+ field.TransformPipeline.splice(stepIndex, 1);
2146
+ field.IsDirty = true;
2147
+ this.cdr.detectChanges();
2148
+ }
2149
+ OnTransformTypeChange(field, step, newType) {
2150
+ step.Type = newType;
2151
+ step.Config = this.GetDefaultConfigForType(newType);
2152
+ field.IsDirty = true;
2153
+ this.cdr.detectChanges();
2154
+ }
2155
+ OnTransformConfigChange(field) {
2156
+ field.IsDirty = true;
2157
+ }
2158
+ GetDefaultConfigForType(type) {
2159
+ switch (type) {
2160
+ case 'direct': return {};
2161
+ case 'regex': return { Pattern: '', Replacement: '', Flags: 'g' };
2162
+ case 'split': return { Delimiter: ',', Index: 0 };
2163
+ case 'combine': return { SourceFields: [], Separator: ' ' };
2164
+ case 'lookup': return { Map: {}, Default: null };
2165
+ case 'format': return { FormatString: 'ISO', FormatType: 'date' };
2166
+ case 'coerce': return { TargetType: 'string' };
2167
+ case 'substring': return { Start: 0, Length: 10 };
2168
+ case 'custom': return { Expression: 'value' };
2169
+ }
2170
+ }
2171
+ GetTransformLabel(type) {
2172
+ return this.TransformTypes.find(t => t.Value === type)?.Label ?? type;
2173
+ }
2174
+ GetTransformIcon(type) {
2175
+ return this.TransformTypes.find(t => t.Value === type)?.Icon ?? 'fa-solid fa-arrow-right';
2176
+ }
2177
+ /** For combine transforms: get available source field names */
2178
+ GetAvailableSourceFields() {
2179
+ return this.SourceFields.map(sf => sf.Name);
2180
+ }
2181
+ /**
2182
+ * Resolve source fields from IntegrationObjectField metadata via IntegrationEngineBase.
2183
+ * CompanyIntegrationID → Integration → IntegrationObject → IntegrationObjectFields.
2184
+ */
2185
+ resolveSourceFieldsFromMetadata(companyIntegrationID, externalObjectName) {
2186
+ const engine = IntegrationEngineBase.Instance;
2187
+ const integration = engine.GetIntegrationForCompanyIntegration(companyIntegrationID);
2188
+ if (!integration)
2189
+ return [];
2190
+ const obj = engine.GetIntegrationObject(integration.ID, externalObjectName);
2191
+ if (!obj)
2192
+ return [];
2193
+ return engine.GetIntegrationObjectFields(obj.ID)
2194
+ .filter(f => f.Status === 'Active')
2195
+ .sort((a, b) => a.Sequence - b.Sequence);
2196
+ }
2197
+ /** For lookup transforms: add a new key-value pair */
2198
+ AddLookupEntry(config) {
2199
+ const map = config['Map'] ?? {};
2200
+ map[''] = '';
2201
+ config['Map'] = map;
2202
+ }
2203
+ GetLookupEntries(config) {
2204
+ const map = config['Map'] ?? {};
2205
+ return Object.entries(map).map(([key, value]) => ({ key, value: String(value) }));
2206
+ }
2207
+ UpdateLookupEntry(config, oldKey, newKey, newValue) {
2208
+ const map = config['Map'] ?? {};
2209
+ if (oldKey !== newKey) {
2210
+ delete map[oldKey];
2211
+ }
2212
+ map[newKey] = newValue;
2213
+ config['Map'] = { ...map };
2214
+ }
2215
+ RemoveLookupEntry(config, key) {
2216
+ const map = config['Map'] ?? {};
2217
+ delete map[key];
2218
+ config['Map'] = { ...map };
2219
+ }
2220
+ /** For combine transforms: toggle a source field */
2221
+ ToggleCombineField(config, fieldName) {
2222
+ const fields = config['SourceFields'] ?? [];
2223
+ const idx = fields.indexOf(fieldName);
2224
+ if (idx >= 0) {
2225
+ fields.splice(idx, 1);
2226
+ }
2227
+ else {
2228
+ fields.push(fieldName);
2229
+ }
2230
+ config['SourceFields'] = [...fields];
2231
+ }
2232
+ IsCombineFieldSelected(config, fieldName) {
2233
+ const fields = config['SourceFields'] ?? [];
2234
+ return fields.includes(fieldName);
2235
+ }
2236
+ // =====================================================================
2237
+ // Data Preview
2238
+ // =====================================================================
2239
+ async LoadSourcePreview() {
2240
+ if (!this.SelectedEntityMap)
2241
+ return;
2242
+ this.IsLoadingSourcePreview = true;
2243
+ this.ShowSourcePreview = true;
2244
+ this.SourcePreviewData = [];
2245
+ this.cdr.detectChanges();
2246
+ try {
2247
+ const result = await this.dataService.PreviewSourceData(this.SelectedIntegrationID, this.SelectedEntityMap.ExternalObjectName, 5);
2248
+ this.SourcePreviewData = result;
2249
+ }
2250
+ catch (e) {
2251
+ console.error('[MappingWorkspace] Source preview failed:', e.message);
2252
+ }
2253
+ finally {
2254
+ this.IsLoadingSourcePreview = false;
2255
+ this.cdr.detectChanges();
2256
+ }
2257
+ }
2258
+ async LoadDestPreview() {
2259
+ if (!this.SelectedEntityMap)
2260
+ return;
2261
+ this.IsLoadingDestPreview = true;
2262
+ this.ShowDestPreview = true;
2263
+ this.DestPreviewData = [];
2264
+ this.cdr.detectChanges();
2265
+ try {
2266
+ const result = await this.dataService.PreviewDestinationData(this.SelectedEntityMap.EntityID, 5, this.RunViewToUse);
2267
+ this.DestPreviewData = result;
2268
+ }
2269
+ catch (e) {
2270
+ console.error('[MappingWorkspace] Dest preview failed:', e.message);
2271
+ }
2272
+ finally {
2273
+ this.IsLoadingDestPreview = false;
2274
+ this.cdr.detectChanges();
2275
+ }
2276
+ }
2277
+ CloseSourcePreview() {
2278
+ this.ShowSourcePreview = false;
2279
+ this.SourcePreviewData = [];
2280
+ }
2281
+ CloseDestPreview() {
2282
+ this.ShowDestPreview = false;
2283
+ this.DestPreviewData = [];
2284
+ }
2285
+ CloseAllPreviews() {
2286
+ this.CloseSourcePreview();
2287
+ this.CloseDestPreview();
2288
+ this.ShowAutoMapBanner = false;
2289
+ }
2290
+ GetPreviewColumns(data) {
2291
+ if (data.length === 0)
2292
+ return [];
2293
+ return Object.keys(data[0]).slice(0, 8); // Limit to 8 columns for readability
2294
+ }
2295
+ FormatPreviewValue(value) {
2296
+ if (value == null)
2297
+ return '--';
2298
+ if (typeof value === 'boolean')
2299
+ return value ? 'Yes' : 'No';
2300
+ const str = String(value);
2301
+ return str.length > 50 ? str.substring(0, 47) + '...' : str;
2302
+ }
2303
+ // =====================================================================
2304
+ // Pending Map Actions
2305
+ // =====================================================================
2306
+ CopyDDLToClipboard(ddl) {
2307
+ navigator.clipboard.writeText(ddl).catch(() => {
2308
+ console.error('[MappingWorkspace] Failed to copy DDL to clipboard');
2309
+ });
415
2310
  }
416
- OnToggleEntityMap(em) {
417
- console.log('[MappingWorkspace] Toggle entity map:', em.ID, 'enabled:', em.SyncEnabled);
2311
+ GetPendingStepStatus(pendingMap, step) {
2312
+ // Step 1: Map Created — always done for pending maps
2313
+ // Step 2: DDL Generated — done if DDL content exists
2314
+ // Step 3: Deploy & CodeGen — always future (manual step)
2315
+ // Step 4: Ready to Sync — always future
2316
+ if (step === 1)
2317
+ return 'done';
2318
+ if (step === 2)
2319
+ return pendingMap.DDLContent ? 'done' : 'current';
2320
+ return 'future';
418
2321
  }
2322
+ // =====================================================================
2323
+ // Helpers
2324
+ // =====================================================================
419
2325
  get RunStatusColor() {
420
2326
  if (!this.LatestRun)
421
2327
  return 'gray';
@@ -440,17 +2346,17 @@ let MappingWorkspaceComponent = class MappingWorkspaceComponent extends BaseReso
440
2346
  return 'fa-solid fa-diagram-project';
441
2347
  }
442
2348
  static ɵfac = /*@__PURE__*/ (() => { let ɵMappingWorkspaceComponent_BaseFactory; return function MappingWorkspaceComponent_Factory(__ngFactoryType__) { return (ɵMappingWorkspaceComponent_BaseFactory || (ɵMappingWorkspaceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MappingWorkspaceComponent)))(__ngFactoryType__ || MappingWorkspaceComponent); }; })();
443
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MappingWorkspaceComponent, selectors: [["app-mapping-workspace"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 1, consts: [[1, "mapping-workspace"], [1, "workspace-header"], [1, "fa-solid", "fa-diagram-project"], ["text", "Loading integrations...", "size", "medium"], [1, "workspace-splitter", 3, "orientation"], [3, "size", "min"], [1, "left-panel"], [1, "panel-section"], [1, "panel-label"], [3, "ngModelChange", "valueChange", "data", "textField", "valueField", "valuePrimitive", "ngModel", "defaultItem"], ["text", "Loading entity maps...", "size", "small"], [1, "center-panel"], [1, "placeholder-message"], ["text", "Loading field maps...", "size", "medium"], [3, "min"], [1, "right-panel"], [1, "empty-hint"], ["text", "Loading...", "size", "small"], [1, "search-box"], [1, "entity-map-list"], ["kendoTextBox", "", "placeholder", "Search entity maps...", 3, "ngModelChange", "ngModel"], [1, "entity-map-item", 3, "selected"], [1, "entity-map-item", 3, "click"], [1, "em-info"], [1, "em-name"], [1, "em-arrow"], [1, "em-entity"], [1, "em-controls"], [1, "em-direction"], [3, "ngModelChange", "valueChange", "ngModel", "size"], [1, "fa-solid", "fa-hand-pointer"], [1, "panel-title"], [1, "field-count"], [3, "data", "height", "resizable"], ["field", "SourceFieldName", "title", "Source Field", 3, "width"], ["field", "DestinationFieldName", "title", "Destination Field", 3, "width"], ["field", "Direction", "title", "Direction", 3, "width"], ["kendoGridCellTemplate", ""], ["field", "IsKeyField", "title", "Key", 3, "width"], ["field", "Status", "title", "Status", 3, "width"], [1, "direction-badge"], [1, "fa-solid", "fa-key", "key-icon"], [1, "status-badge"], [1, "run-summary-card"], [1, "run-summary-row"], [1, "label"], [1, "run-status"], [1, "panel-label", 2, "margin-top", "16px"], [1, "entity-stat-card"], [1, "entity-stat-name"], [1, "entity-stat-grid"], [1, "mini-stat"], [1, "mini-val"], [1, "mini-label"], [1, "mini-val", "error"]], template: function MappingWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
2349
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MappingWorkspaceComponent, selectors: [["app-mapping-workspace"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 1, consts: [[1, "mapping-workspace"], [1, "workspace-header"], [1, "fa-solid", "fa-diagram-project"], ["text", "Loading integrations...", "size", "medium"], [1, "workspace-body"], [1, "left-panel"], [1, "integration-selector"], [1, "panel-label"], [3, "ngModelChange", "valueChange", "data", "textField", "valueField", "valuePrimitive", "ngModel", "defaultItem"], ["text", "Loading entity maps...", "size", "small"], [1, "center-panel"], [1, "placeholder-message"], [1, "pending-entity-panel"], ["text", "Loading field maps...", "size", "medium"], [1, "right-panel"], [1, "empty-hint"], ["text", "Loading...", "size", "small"], [1, "entity-map-header"], [1, "panel-label", 2, "margin", "0"], [1, "header-actions"], ["kendoButton", "", "title", "Add entity map", 3, "click", "look", "size"], [1, "fa-solid", "fa-plus"], [1, "add-map-panel"], [1, "search-box"], [1, "entity-map-list"], [1, "add-panel-top"], [1, "fa-solid", "fa-plus-circle"], [1, "add-panel-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "form-group"], [1, "source-loading"], [1, "discover-error-inline"], [3, "data", "textField", "valueField", "valuePrimitive", "ngModel", "filterable", "defaultItem"], [1, "target-mode-toggle"], [1, "target-mode-btn", 3, "click"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "new-entity-form"], [3, "ngModelChange", "data", "ngModel"], [1, "add-form-actions"], ["kendoButton", "", 3, "click", "themeColor", "size", "disabled"], ["kendoButton", "", 3, "click", "size"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-triangle-exclamation"], [3, "ngModelChange", "valueChange", "data", "textField", "valueField", "valuePrimitive", "ngModel", "filterable", "defaultItem"], [3, "ngModelChange", "data", "textField", "valueField", "valuePrimitive", "ngModel", "filterable", "defaultItem"], [1, "section-label"], [3, "ngModelChange", "valueChange", "data", "ngModel", "allowCustom", "filterable", "placeholder"], [1, "form-row"], ["kendoTextBox", "", 3, "ngModelChange", "ngModel", "placeholder"], [1, "auto-hint"], [1, "ddl-preview-section"], ["kendoButton", "", 3, "click", "look", "size", "disabled"], [1, "discover-error-inline", 2, "margin-top", "8px"], [1, "ddl-preview-code"], [1, "fa-solid", "fa-check"], ["kendoTextBox", "", "placeholder", "Search entity maps...", 3, "ngModelChange", "ngModel"], ["href", "javascript:void(0)", 2, "color", "#4a6cf7", 3, "click"], [1, "entity-map-item", 3, "selected", "pending"], [1, "entity-map-item", 3, "click"], [1, "em-top-row"], [1, "em-name"], [1, "em-arrow"], [1, "fa-solid", "fa-arrow-right"], [1, "em-entity"], [1, "em-bottom-row"], [1, "em-badges"], [1, "badge", "badge-direction"], [1, "badge", "badge-pending"], [1, "em-actions"], ["title", "Delete", 1, "em-delete", 3, "click"], [1, "fa-solid", "fa-trash-can"], [3, "ngModel", "size"], [3, "ngModelChange", "valueChange", "ngModel", "size"], [1, "fa-solid", "fa-hand-pointer"], [1, "pending-icon"], [1, "fa-solid", "fa-clock"], [1, "pending-steps"], [1, "step"], [1, "step-circle", "done"], [1, "step-label"], [1, "step-connector"], [1, "step-circle", 3, "ngClass"], [1, "step-circle", "future"], [1, "ddl-preview-inline"], [1, "pending-fields-section"], [2, "font-size", "14px", "margin-bottom", "8px"], [1, "ddl-code-block"], [1, "ddl-actions"], ["kendoButton", "", 3, "click", "look", "size"], [1, "fa-solid", "fa-copy"], [2, "font-size", "14px", "margin", "16px 0 8px"], [1, "fa-solid", "fa-list"], [2, "color", "#999", "font-weight", "400"], [1, "pending-fields-list"], [1, "pending-field-item"], [1, "pending-field-name"], [1, "pending-field-type"], ["title", "Key field", 1, "fa-solid", "fa-key", "key-icon"], [1, "pending-field-req"], [1, "auto-map-banner"], [1, "validation-banner"], [1, "field-mapping-header"], [1, "panel-title"], [1, "field-count"], [1, "field-mapping-actions"], ["kendoButton", "", "title", "Auto-match source and destination fields by name", 3, "click", "look", "size", "disabled"], [1, "field-map-cards"], [1, "data-preview-section"], [1, "preview-actions"], [1, "fa-solid", "fa-cloud-arrow-down"], [1, "preview-panel"], [1, "banner-text"], [1, "validation-warnings"], [1, "fa-solid", "fa-floppy-disk"], [1, "field-map-card", 3, "validation-error", "has-transform"], [1, "field-map-card"], [1, "fmc-row"], [1, "fmc-source"], ["type", "text", "placeholder", "Source field name", 1, "fmc-input", 3, "ngModel"], [1, "fmc-transform-zone"], [1, "fmc-transform-pill", 3, "title"], ["title", "Click to change transform type", 1, "fmc-transform-pill", "fmc-transform-direct"], [1, "fmc-dest"], [1, "fmc-select", 3, "ngModel"], ["type", "text", "placeholder", "Destination field", 1, "fmc-input", 3, "ngModel"], [1, "fmc-flags"], ["title", "Key field for matching", 1, "fmc-flag"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-key"], ["title", "Required field", 1, "fmc-flag"], [1, "fmc-req-star"], ["title", "Remove mapping", 1, "fmc-remove", 3, "click"], [1, "fmc-transform-editor"], ["type", "text", "placeholder", "Source field name", 1, "fmc-input", 3, "ngModelChange", "ngModel"], [1, "fmc-field-name"], [1, "fmc-badges"], [1, "fmc-badge", "badge-type"], ["title", "Primary Key", 1, "fmc-badge", "badge-pk"], ["title", "Required", 1, "fmc-badge", "badge-req"], ["title", "Read-Only", 1, "fmc-badge", "badge-ro"], [1, "fmc-transform-pill", 3, "click", "title"], [1, "fmc-step-count"], ["title", "Click to change transform type", 1, "fmc-transform-pill", "fmc-transform-direct", 3, "click"], [1, "fmc-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], ["type", "text", "placeholder", "Destination field", 1, "fmc-input", 3, "ngModelChange", "ngModel"], [1, "fmc-te-header"], [1, "fmc-te-title"], ["title", "Add another step", 1, "fmc-te-add", 3, "click"], [1, "fmc-te-step"], [1, "fmc-te-step-header"], [1, "fmc-te-step-num"], [1, "fmc-te-type-select", 3, "ngModelChange", "ngModel"], ["title", "On error", 1, "fmc-te-error-select", 3, "ngModelChange", "ngModel"], ["value", "Fail"], ["value", "Skip"], ["value", "Null"], ["title", "Remove step", 1, "fmc-te-remove-step", 3, "click"], [1, "fmc-te-config"], [1, "fmc-te-field"], [1, "fmc-te-row"], [1, "fmc-te-field", "fmc-te-sm"], ["type", "text", "placeholder", "Leave empty for no default", 1, "fmc-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "e.g. (\\d{3})-(\\d{4})", 1, "fmc-input", "mono", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "e.g. $1$2", 1, "fmc-input", "mono", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "gi", 1, "fmc-input", "mono", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", ",", 1, "fmc-input", "mono", 3, "ngModelChange", "ngModel"], ["type", "number", "min", "0", 1, "fmc-input", 3, "ngModelChange", "ngModel"], [1, "fmc-combine-chips"], [1, "fmc-chip", 3, "selected"], ["type", "text", "placeholder", " ", 1, "fmc-input", "mono", 3, "ngModelChange", "ngModel"], [1, "fmc-chip", 3, "click"], [1, "fmc-lookup-table"], [1, "fmc-lookup-row"], [1, "fmc-lookup-add", 3, "click"], ["type", "text", "placeholder", "null", 1, "fmc-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "Source value", 1, "fmc-input", 3, "change", "value"], [1, "fa-solid", "fa-arrow-right", "fmc-lookup-arrow"], ["type", "text", "placeholder", "Mapped value", 1, "fmc-input", 3, "change", "value"], [1, "fmc-lookup-del", 3, "click"], ["value", "date"], ["value", "number"], ["value", "string"], ["type", "text", "placeholder", "ISO or decimal places", 1, "fmc-input", "mono", 3, "ngModelChange", "ngModel"], ["value", "boolean"], ["type", "number", "min", "1", 1, "fmc-input", 3, "ngModelChange", "ngModel"], [1, "fmc-te-hint"], ["placeholder", "value.toUpperCase()", "rows", "2", 1, "fmc-input", "mono", "fmc-textarea", 3, "ngModelChange", "ngModel"], [1, "preview-panel-header"], [1, "fa-solid", "fa-cloud"], ["text", "Loading source data...", "size", "small"], [1, "preview-table-wrapper"], [1, "preview-table"], ["text", "Loading destination data...", "size", "small"], [1, "run-summary-card"], [1, "run-summary-row"], [1, "label"], [1, "run-status"], [1, "panel-label", 2, "margin-top", "16px"], [1, "entity-stat-card"], [1, "entity-stat-name"], [1, "entity-stat-grid"], [1, "mini-stat"], [1, "mini-val"], [1, "mini-label"]], template: function MappingWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
444
2350
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h2");
445
2351
  i0.ɵɵelement(3, "i", 2);
446
2352
  i0.ɵɵtext(4, " Mapping Workspace");
447
2353
  i0.ɵɵelementEnd()();
448
- i0.ɵɵconditionalCreate(5, MappingWorkspaceComponent_Conditional_5_Template, 1, 0, "mj-loading", 3)(6, MappingWorkspaceComponent_Conditional_6_Template, 22, 16, "kendo-splitter", 4);
2354
+ i0.ɵɵconditionalCreate(5, MappingWorkspaceComponent_Conditional_5_Template, 1, 0, "mj-loading", 3)(6, MappingWorkspaceComponent_Conditional_6_Template, 20, 10, "div", 4);
449
2355
  i0.ɵɵelementEnd();
450
2356
  } if (rf & 2) {
451
2357
  i0.ɵɵadvance(5);
452
2358
  i0.ɵɵconditional(ctx.IsLoadingIntegrations ? 5 : 6);
453
- } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, i2.DropDownListComponent, i3.TextBoxDirective, i3.SwitchComponent, i4.GridComponent, i4.ColumnComponent, i4.CellTemplateDirective, i5.SplitterComponent, i5.SplitterPaneComponent, i6.LoadingComponent, i7.DecimalPipe], styles: [".mapping-workspace[_ngcontent-%COMP%] { padding: 24px; height: 100%; display: flex; flex-direction: column; }\n .workspace-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n h2 {\n margin: 0; font-size: 20px; font-weight: 600;\n i { margin-right: 8px; }\n }\n }\n .workspace-splitter[_ngcontent-%COMP%] { flex: 1; min-height: 500px; }\n\n .left-panel[_ngcontent-%COMP%], .center-panel[_ngcontent-%COMP%], .right-panel[_ngcontent-%COMP%] { padding: 16px; height: 100%; overflow-y: auto; }\n\n .panel-label[_ngcontent-%COMP%] {\n font-size: 12px; font-weight: 600; color: #666;\n text-transform: uppercase; letter-spacing: 0.5px;\n margin: 0 0 8px 0; display: block;\n }\n .panel-title[_ngcontent-%COMP%] {\n margin: 0 0 12px 0; font-size: 16px;\n .field-count { color: #888; font-weight: 400; }\n }\n .panel-section[_ngcontent-%COMP%] { margin-bottom: 20px; }\n .empty-hint[_ngcontent-%COMP%] { color: #999; font-size: 13px; font-style: italic; }\n\n .search-box[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n }\n\n .entity-map-list[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; }\n .entity-map-item[_ngcontent-%COMP%] {\n padding: 8px 10px; border-radius: 6px;\n cursor: pointer; border: 1px solid #eee; transition: all 0.15s;\n }\n .entity-map-item[_ngcontent-%COMP%]:hover { background: #f8f9fa; }\n .entity-map-item.selected[_ngcontent-%COMP%] { background: #f0f4ff; border-color: #4a6cf7; }\n .em-info[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 4px;\n font-size: 13px; margin-bottom: 4px;\n }\n .em-name[_ngcontent-%COMP%] { font-weight: 600; }\n .em-arrow[_ngcontent-%COMP%] { color: #999; }\n .em-entity[_ngcontent-%COMP%] { color: #666; }\n .em-controls[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between;\n font-size: 11px; color: #888;\n }\n .em-direction[_ngcontent-%COMP%] {\n background: #f0f0f0; padding: 1px 6px; border-radius: 4px; font-size: 10px;\n }\n\n .placeholder-message[_ngcontent-%COMP%] {\n display: flex; flex-direction: column; align-items: center;\n justify-content: center; height: 300px; color: #999;\n i { font-size: 36px; margin-bottom: 12px; }\n p { text-align: center; }\n }\n\n .direction-badge[_ngcontent-%COMP%] {\n font-size: 11px; background: #f0f0f0; padding: 2px 6px; border-radius: 4px;\n }\n .key-icon[_ngcontent-%COMP%] { color: #b5850a; font-size: 12px; }\n .status-badge[_ngcontent-%COMP%] {\n font-size: 11px; padding: 2px 6px; border-radius: 4px; font-weight: 500;\n }\n .status-active[_ngcontent-%COMP%] { background: #e6f9ed; color: #1b7a3d; }\n .status-inactive[_ngcontent-%COMP%] { background: #f0f0f0; color: #757575; }\n\n .run-summary-card[_ngcontent-%COMP%] {\n background: #f8f9fa; border-radius: 8px; padding: 12px;\n }\n .run-summary-row[_ngcontent-%COMP%] {\n display: flex; justify-content: space-between;\n padding: 4px 0; font-size: 13px;\n .label { color: #666; font-weight: 500; }\n }\n .run-status[_ngcontent-%COMP%] {\n font-size: 11px; padding: 2px 6px; border-radius: 4px; font-weight: 600;\n }\n .status-green[_ngcontent-%COMP%] { background: #e6f9ed; color: #1b7a3d; }\n .status-amber[_ngcontent-%COMP%] { background: #fff7e0; color: #b5850a; }\n .status-red[_ngcontent-%COMP%] { background: #fde8e8; color: #c62828; }\n\n .entity-stat-card[_ngcontent-%COMP%] {\n background: #f8f9fa; border-radius: 6px; padding: 10px;\n margin-bottom: 8px;\n }\n .entity-stat-name[_ngcontent-%COMP%] { font-size: 13px; font-weight: 600; margin-bottom: 6px; }\n .entity-stat-grid[_ngcontent-%COMP%] { display: flex; gap: 12px; }\n .mini-stat[_ngcontent-%COMP%] { text-align: center; }\n .mini-val[_ngcontent-%COMP%] { display: block; font-size: 16px; font-weight: 600; }\n .mini-val.has-errors[_ngcontent-%COMP%] { color: #c62828; }\n .mini-label[_ngcontent-%COMP%] { font-size: 10px; color: #888; }"] });
2359
+ } }, dependencies: [i1.NgClass, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.CheckboxControlValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.MinValidator, i2.NgModel, i3.ButtonComponent, i4.ComboBoxComponent, i4.DropDownListComponent, i5.TextBoxDirective, i5.SwitchComponent, i6.LoadingComponent, i1.DecimalPipe], styles: [".mapping-workspace[_ngcontent-%COMP%] { padding: 24px; height: 100%; display: flex; flex-direction: column; }\n.workspace-header[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 16px;\n}\n.workspace-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0; font-size: 20px; font-weight: 600;\n}\n.workspace-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 8px; color: var(--mj-color-indigo-500); }\n\n\n\n.workspace-body[_ngcontent-%COMP%] {\n display: flex; flex: 1; gap: 1px; background: var(--mj-border-default);\n border-radius: 10px; overflow: hidden; min-height: 500px;\n}\n\n.left-panel[_ngcontent-%COMP%] { width: 320px; min-width: 280px; background: var(--mj-bg-surface); padding: 16px; overflow-y: auto; flex-shrink: 0; }\n.center-panel[_ngcontent-%COMP%] { flex: 1; background: var(--mj-bg-surface); padding: 20px; overflow-y: auto; }\n.right-panel[_ngcontent-%COMP%] { width: 280px; min-width: 240px; background: var(--mj-bg-surface); padding: 16px; overflow-y: auto; flex-shrink: 0; }\n\n\n\n.panel-label[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 700; color: var(--mj-text-disabled);\n text-transform: uppercase; letter-spacing: 0.6px;\n margin: 0 0 6px 0; display: block;\n}\n.panel-title[_ngcontent-%COMP%] { margin: 0 0 12px 0; font-size: 16px; font-weight: 600; }\n.panel-title[_ngcontent-%COMP%] .field-count[_ngcontent-%COMP%] { color: var(--mj-text-disabled); font-weight: 400; font-size: 13px; }\n.empty-hint[_ngcontent-%COMP%] { color: var(--mj-text-disabled); font-size: 13px; font-style: italic; }\n.search-box[_ngcontent-%COMP%] { margin-bottom: 12px; }\n\n\n\n.integration-selector[_ngcontent-%COMP%] { margin-bottom: 20px; padding-bottom: 16px; border-bottom: 1px solid var(--mj-border-subtle); }\n\n\n\n.entity-map-header[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 10px;\n}\n.header-actions[_ngcontent-%COMP%] { display: flex; gap: 4px; }\n\n\n\n.add-map-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-page); border: 1px solid var(--mj-border-default); border-radius: 10px;\n padding: 16px; margin-bottom: 14px;\n}\n.add-panel-top[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 14px;\n}\n.add-panel-top[_ngcontent-%COMP%] h5[_ngcontent-%COMP%] { margin: 0; font-size: 14px; font-weight: 600; }\n.add-panel-close[_ngcontent-%COMP%] {\n background: none; border: none; cursor: pointer; color: var(--mj-text-disabled); font-size: 14px;\n}\n.add-panel-close[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); }\n\n.form-group[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; }\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] { font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.form-row[_ngcontent-%COMP%] { display: flex; gap: 10px; }\n.form-row[_ngcontent-%COMP%] .form-group[_ngcontent-%COMP%] { flex: 1; }\n\n.source-loading[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n font-size: 12px; color: var(--mj-text-disabled); padding: 6px 0;\n}\n.source-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-color-indigo-500); }\n\n.discover-error-inline[_ngcontent-%COMP%] {\n font-size: 12px; color: var(--mj-color-error-600); padding: 6px 0;\n}\n.discover-error-inline[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 4px; }\n\n\n\n.target-mode-toggle[_ngcontent-%COMP%] {\n display: flex; border: 1px solid var(--mj-border-default); border-radius: 6px;\n overflow: hidden; margin-bottom: 12px;\n}\n.target-mode-btn[_ngcontent-%COMP%] {\n flex: 1; padding: 8px 12px; font-size: 12px; font-weight: 600;\n text-align: center; cursor: pointer; background: var(--mj-bg-surface); border: none;\n color: var(--mj-text-muted); transition: all 0.15s;\n}\n.target-mode-btn[_ngcontent-%COMP%]:first-child { border-right: 1px solid var(--mj-border-default); }\n.target-mode-btn.active[_ngcontent-%COMP%] { background: var(--mj-color-indigo-500); color: var(--mj-bg-surface); }\n.target-mode-btn[_ngcontent-%COMP%]:not(.active):hover { background: var(--mj-status-info-bg); color: var(--mj-color-indigo-500); }\n.target-mode-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 4px; }\n\n\n\n.new-entity-form[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: 8px;\n padding: 14px; margin-bottom: 12px;\n}\n.new-entity-form[_ngcontent-%COMP%] .section-label[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 700; color: var(--mj-color-indigo-500);\n text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 10px;\n}\n.auto-hint[_ngcontent-%COMP%] { font-size: 10px; color: var(--mj-text-disabled); font-style: italic; }\n\n\n\n.ddl-preview-section[_ngcontent-%COMP%] { margin-top: 8px; }\n.ddl-preview-code[_ngcontent-%COMP%] {\n background: var(--mj-color-neutral-900); color: var(--mj-color-neutral-300); padding: 10px;\n border-radius: 4px; font-size: 11px; line-height: 1.5;\n max-height: 200px; overflow: auto; white-space: pre-wrap;\n word-break: break-word; margin-top: 8px;\n}\n\n.add-form-actions[_ngcontent-%COMP%] { display: flex; gap: 6px; padding-top: 4px; }\n\n\n\n.entity-map-list[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; }\n.entity-map-item[_ngcontent-%COMP%] {\n padding: 8px 10px; border-radius: 6px;\n cursor: pointer; border: 1px solid var(--mj-border-subtle); transition: all 0.15s;\n}\n.entity-map-item[_ngcontent-%COMP%]:hover { background: var(--mj-bg-page); }\n.entity-map-item.selected[_ngcontent-%COMP%] { background: var(--mj-status-info-bg); border-color: var(--mj-color-indigo-500); }\n.entity-map-item.pending[_ngcontent-%COMP%] { border-left: 3px solid var(--mj-status-warning); }\n\n.em-top-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 4px;\n font-size: 13px; margin-bottom: 4px;\n}\n.em-name[_ngcontent-%COMP%] { font-weight: 600; }\n.em-arrow[_ngcontent-%COMP%] { color: var(--mj-text-disabled); font-size: 11px; }\n.em-entity[_ngcontent-%COMP%] { color: var(--mj-text-muted); }\n\n.em-bottom-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between;\n font-size: 11px; color: var(--mj-text-disabled);\n}\n.em-badges[_ngcontent-%COMP%] { display: flex; gap: 4px; align-items: center; }\n.badge[_ngcontent-%COMP%] {\n font-size: 10px; padding: 1px 6px; border-radius: 4px; font-weight: 600;\n}\n.badge-direction[_ngcontent-%COMP%] { background: var(--mj-bg-surface-hover); color: var(--mj-text-muted); }\n.badge-pending[_ngcontent-%COMP%] { background: var(--mj-color-warning-50); color: var(--mj-color-warning-600); }\n\n.em-actions[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 4px; }\n.em-delete[_ngcontent-%COMP%] {\n opacity: 0; transition: opacity 0.15s;\n cursor: pointer; color: var(--mj-color-error-600); background: none; border: none;\n padding: 2px 4px; font-size: 12px;\n}\n.entity-map-item[_ngcontent-%COMP%]:hover .em-delete[_ngcontent-%COMP%] { opacity: 1; }\n\n\n\n.placeholder-message[_ngcontent-%COMP%] {\n display: flex; flex-direction: column; align-items: center;\n justify-content: center; height: 300px; color: var(--mj-text-disabled);\n}\n.placeholder-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 36px; margin-bottom: 12px; }\n.placeholder-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { text-align: center; }\n\n\n\n.pending-entity-panel[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg); border: 1px solid var(--mj-color-warning-200); border-radius: 10px;\n padding: 24px; text-align: center;\n}\n.pending-icon[_ngcontent-%COMP%] { font-size: 40px; color: var(--mj-status-warning); margin-bottom: 12px; }\n.pending-entity-panel[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] { font-size: 16px; margin-bottom: 8px; }\n.pending-entity-panel[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { font-size: 13px; color: var(--mj-text-disabled); margin-bottom: 16px; line-height: 1.5; }\n\n\n\n.pending-steps[_ngcontent-%COMP%] {\n display: flex; gap: 0; margin: 20px 0; justify-content: center; align-items: center;\n}\n.step[_ngcontent-%COMP%] {\n display: flex; flex-direction: column; align-items: center; gap: 6px;\n padding: 0 16px;\n}\n.step-circle[_ngcontent-%COMP%] {\n width: 36px; height: 36px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n font-size: 14px; font-weight: 700;\n}\n.step-circle.done[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-color-success-700); }\n.step-circle.current[_ngcontent-%COMP%] { background: var(--mj-color-indigo-500); color: var(--mj-bg-surface); }\n.step-circle.future[_ngcontent-%COMP%] { background: var(--mj-bg-surface-hover); color: var(--mj-text-disabled); }\n.step-label[_ngcontent-%COMP%] { font-size: 10px; font-weight: 600; color: var(--mj-text-disabled); text-transform: uppercase; white-space: nowrap; }\n.step-connector[_ngcontent-%COMP%] { width: 32px; height: 2px; background: var(--mj-border-default); align-self: center; margin-bottom: 18px; }\n.step-connector.done[_ngcontent-%COMP%] { background: var(--mj-color-success-700); }\n\n\n\n.ddl-preview-inline[_ngcontent-%COMP%] { margin-top: 16px; text-align: left; }\n.ddl-code-block[_ngcontent-%COMP%] {\n background: var(--mj-color-neutral-900); color: var(--mj-color-neutral-300); padding: 12px;\n border-radius: 6px; font-size: 12px; line-height: 1.5;\n max-height: 250px; overflow: auto; white-space: pre-wrap;\n}\n.ddl-actions[_ngcontent-%COMP%] { display: flex; gap: 8px; margin-top: 12px; justify-content: center; }\n\n\n\n.pending-fields-section[_ngcontent-%COMP%] { text-align: left; }\n.pending-fields-list[_ngcontent-%COMP%] {\n display: flex; flex-direction: column; gap: 2px;\n max-height: 200px; overflow-y: auto;\n}\n.pending-field-item[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n padding: 4px 8px; font-size: 13px; border-radius: 4px;\n}\n.pending-field-item[_ngcontent-%COMP%]:hover { background: var(--mj-status-warning-bg); }\n.pending-field-name[_ngcontent-%COMP%] { font-weight: 600; }\n.pending-field-type[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-disabled); background: var(--mj-bg-surface-hover); padding: 1px 6px; border-radius: 3px; }\n.pending-field-req[_ngcontent-%COMP%] { color: var(--mj-color-error-600); font-weight: 700; }\n\n\n\n.auto-map-banner[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg); border: 1px solid var(--mj-color-info-100); border-radius: 8px;\n padding: 12px 16px; margin-bottom: 16px;\n display: flex; align-items: center; gap: 12px;\n}\n.auto-map-banner[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] { color: var(--mj-color-indigo-500); font-size: 18px; }\n.auto-map-banner[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] { flex: 1; }\n.auto-map-banner[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { font-size: 13px; color: var(--mj-text-muted); margin: 0; }\n.auto-map-banner[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] { color: var(--mj-text-primary); }\n\n\n\n.field-mapping-header[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 16px;\n}\n.field-mapping-actions[_ngcontent-%COMP%] { display: flex; gap: 6px; }\n\n\n\n.field-map-cards[_ngcontent-%COMP%] {\n display: flex; flex-direction: column; gap: 6px;\n}\n\n.field-map-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n.field-map-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 2px 8px rgba(74, 108, 247, 0.06);\n}\n.field-map-card.has-transform[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-color-indigo-500);\n}\n.field-map-card.validation-error[_ngcontent-%COMP%] {\n border-color: var(--mj-color-warning-200);\n background: var(--mj-status-warning-bg);\n}\n\n\n\n.fmc-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 10px;\n padding: 10px 14px;\n}\n\n\n\n.fmc-source[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n}\n.fmc-field-name[_ngcontent-%COMP%] {\n font-size: 13px; font-weight: 600; color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n}\n.fmc-badges[_ngcontent-%COMP%] {\n display: flex; gap: 4px; margin-top: 3px; flex-wrap: wrap;\n}\n.fmc-badge[_ngcontent-%COMP%] {\n font-size: 9px; font-weight: 700; padding: 1px 5px;\n border-radius: 3px; text-transform: uppercase; letter-spacing: 0.3px;\n white-space: nowrap; line-height: 1.5;\n}\n.badge-type[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover); color: var(--mj-text-muted);\n}\n.badge-pk[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, var(--mj-color-warning-100), var(--mj-color-warning-200));\n color: var(--mj-color-warning-800);\n}\n.badge-pk[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 8px; margin-right: 2px; }\n.badge-req[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, var(--mj-color-error-100), var(--mj-color-error-200));\n color: var(--mj-color-error-800);\n}\n.badge-ro[_ngcontent-%COMP%] {\n background: var(--mj-color-purple-50); color: var(--mj-color-purple-700);\n}\n\n\n\n.fmc-transform-zone[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: flex; align-items: center; justify-content: center;\n width: 100px;\n}\n.fmc-arrow-btn[_ngcontent-%COMP%] {\n width: 32px; height: 32px;\n border-radius: 50%; border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page); color: var(--mj-text-disabled);\n cursor: pointer; font-size: 12px;\n display: flex; align-items: center; justify-content: center;\n transition: all 0.2s;\n}\n.fmc-arrow-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-color-indigo-500); color: var(--mj-bg-surface); border-color: var(--mj-color-indigo-500);\n transform: scale(1.1);\n}\n.fmc-transform-pill[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 4px;\n padding: 4px 10px; border-radius: 16px;\n background: linear-gradient(135deg, var(--mj-color-indigo-50), var(--mj-color-indigo-100));\n border: 1px solid var(--mj-color-indigo-200); color: var(--mj-color-indigo-700);\n font-size: 11px; font-weight: 600;\n cursor: pointer; transition: all 0.2s;\n white-space: nowrap;\n}\n.fmc-transform-pill[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, var(--mj-color-indigo-100), var(--mj-color-indigo-200));\n transform: scale(1.02);\n}\n.fmc-transform-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 10px; }\n.fmc-transform-direct[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, var(--mj-bg-page), var(--mj-bg-surface-hover));\n border-color: var(--mj-color-neutral-300); color: var(--mj-text-muted);\n}\n.fmc-transform-direct[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, var(--mj-color-indigo-50), var(--mj-color-indigo-100));\n border-color: var(--mj-color-indigo-200); color: var(--mj-color-indigo-700);\n}\n.fmc-step-count[_ngcontent-%COMP%] {\n background: var(--mj-color-indigo-700); color: var(--mj-bg-surface); font-size: 9px;\n padding: 0 4px; border-radius: 8px; font-weight: 700;\n}\n\n\n\n.fmc-dest[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n}\n.fmc-select[_ngcontent-%COMP%] {\n width: 100%; padding: 6px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; color: var(--mj-text-primary);\n background: var(--mj-bg-page);\n transition: border-color 0.15s;\n}\n.fmc-select[_ngcontent-%COMP%]:focus { border-color: var(--mj-color-indigo-500); outline: none; box-shadow: 0 0 0 2px rgba(74, 108, 247, 0.12); }\n\n\n\n.fmc-input[_ngcontent-%COMP%] {\n width: 100%; padding: 5px 8px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; color: var(--mj-text-primary);\n background: var(--mj-bg-page);\n transition: border-color 0.15s;\n}\n.fmc-input[_ngcontent-%COMP%]:focus { border-color: var(--mj-color-indigo-500); outline: none; box-shadow: 0 0 0 2px rgba(74, 108, 247, 0.12); }\n.fmc-input.mono[_ngcontent-%COMP%] { font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace; font-size: 12px; }\n\n\n\n.fmc-flags[_ngcontent-%COMP%] {\n display: flex; gap: 6px; flex-shrink: 0;\n}\n.fmc-flag[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 3px;\n font-size: 11px; color: var(--mj-text-disabled); cursor: pointer;\n padding: 2px 4px; border-radius: 4px;\n transition: color 0.15s;\n}\n.fmc-flag[_ngcontent-%COMP%]:hover { color: var(--mj-color-indigo-500); }\n.fmc-flag[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 13px; height: 13px; cursor: pointer;\n accent-color: var(--mj-color-indigo-500);\n}\n.fmc-flag[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 10px; }\n.fmc-req-star[_ngcontent-%COMP%] { font-size: 14px; font-weight: 700; color: inherit; }\n\n\n\n.fmc-remove[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: none; border: none; cursor: pointer;\n color: var(--mj-color-neutral-300); font-size: 13px; padding: 4px;\n border-radius: 4px; transition: all 0.15s;\n}\n.fmc-remove[_ngcontent-%COMP%]:hover { color: var(--mj-status-error); background: var(--mj-status-error-bg); }\n\n\n\n.fmc-transform-editor[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-bg-surface-hover);\n background: linear-gradient(180deg, var(--mj-color-indigo-50) 0%, var(--mj-bg-page) 100%);\n padding: 12px 14px;\n}\n.fmc-te-header[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 10px;\n}\n.fmc-te-title[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 700; color: var(--mj-color-indigo-500);\n text-transform: uppercase; letter-spacing: 0.5px;\n}\n.fmc-te-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 4px; }\n.fmc-te-add[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 600; color: var(--mj-color-indigo-500);\n background: none; border: 1px solid var(--mj-color-indigo-200);\n border-radius: 6px; padding: 3px 10px;\n cursor: pointer; transition: all 0.15s;\n}\n.fmc-te-add[_ngcontent-%COMP%]:hover { background: var(--mj-color-indigo-50); }\n.fmc-te-add[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 3px; font-size: 10px; }\n\n\n\n.fmc-te-step[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 10px 12px;\n margin-bottom: 8px;\n transition: box-shadow 0.15s;\n}\n.fmc-te-step[_ngcontent-%COMP%]:hover { box-shadow: 0 1px 4px rgba(0,0,0,0.05); }\n.fmc-te-step[_ngcontent-%COMP%]:last-child { margin-bottom: 0; }\n\n.fmc-te-step-header[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px; margin-bottom: 8px;\n}\n.fmc-te-step-num[_ngcontent-%COMP%] {\n width: 22px; height: 22px; border-radius: 50%;\n background: linear-gradient(135deg, var(--mj-color-indigo-500), var(--mj-color-indigo-500));\n color: var(--mj-bg-surface); font-size: 11px; font-weight: 700;\n display: flex; align-items: center; justify-content: center;\n flex-shrink: 0;\n}\n.fmc-te-type-select[_ngcontent-%COMP%] {\n flex: 1; padding: 4px 8px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary); background: var(--mj-bg-page);\n}\n.fmc-te-type-select[_ngcontent-%COMP%]:focus { border-color: var(--mj-color-indigo-500); outline: none; }\n.fmc-te-error-select[_ngcontent-%COMP%] {\n width: 100px; padding: 4px 6px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 11px; color: var(--mj-text-muted);\n background: var(--mj-bg-page);\n}\n.fmc-te-error-select[_ngcontent-%COMP%]:focus { border-color: var(--mj-color-indigo-500); outline: none; }\n.fmc-te-remove-step[_ngcontent-%COMP%] {\n background: none; border: none; cursor: pointer;\n color: var(--mj-color-neutral-300); font-size: 12px; padding: 4px;\n border-radius: 4px; transition: all 0.15s;\n}\n.fmc-te-remove-step[_ngcontent-%COMP%]:hover { color: var(--mj-status-error); background: var(--mj-status-error-bg); }\n\n\n\n.fmc-te-config[_ngcontent-%COMP%] {\n padding-left: 30px;\n}\n.fmc-te-field[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n.fmc-te-field[_ngcontent-%COMP%]:last-child { margin-bottom: 0; }\n.fmc-te-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block; font-size: 11px; font-weight: 600;\n color: var(--mj-text-muted); margin-bottom: 3px;\n}\n.fmc-te-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover); padding: 0 3px; border-radius: 3px;\n font-size: 10px; color: var(--mj-color-indigo-700);\n}\n.fmc-te-hint[_ngcontent-%COMP%] { font-weight: 400; color: var(--mj-text-disabled); }\n.fmc-te-row[_ngcontent-%COMP%] {\n display: flex; gap: 10px; align-items: flex-end;\n}\n.fmc-te-sm[_ngcontent-%COMP%] { max-width: 140px; }\n.fmc-textarea[_ngcontent-%COMP%] {\n resize: vertical; min-height: 40px;\n}\n\n\n\n.fmc-combine-chips[_ngcontent-%COMP%] {\n display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px;\n}\n.fmc-chip[_ngcontent-%COMP%] {\n font-size: 11px; padding: 3px 8px; border-radius: 14px;\n border: 1px solid var(--mj-border-default); background: var(--mj-bg-surface);\n color: var(--mj-text-muted); cursor: pointer;\n transition: all 0.15s; font-weight: 500;\n}\n.fmc-chip[_ngcontent-%COMP%]:hover { border-color: var(--mj-color-indigo-300); color: var(--mj-color-indigo-700); }\n.fmc-chip.selected[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, var(--mj-color-indigo-50), var(--mj-color-indigo-100));\n border-color: var(--mj-color-indigo-400); color: var(--mj-color-indigo-700); font-weight: 600;\n}\n\n\n\n.fmc-lookup-table[_ngcontent-%COMP%] {\n display: flex; flex-direction: column; gap: 4px; margin-top: 4px;\n}\n.fmc-lookup-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 6px;\n}\n.fmc-lookup-row[_ngcontent-%COMP%] .fmc-input[_ngcontent-%COMP%] { flex: 1; }\n.fmc-lookup-arrow[_ngcontent-%COMP%] { color: var(--mj-color-indigo-200); font-size: 10px; flex-shrink: 0; }\n.fmc-lookup-del[_ngcontent-%COMP%] {\n background: none; border: none; cursor: pointer;\n color: var(--mj-color-neutral-300); font-size: 11px; padding: 2px;\n transition: color 0.15s;\n}\n.fmc-lookup-del[_ngcontent-%COMP%]:hover { color: var(--mj-status-error); }\n.fmc-lookup-add[_ngcontent-%COMP%] {\n font-size: 11px; color: var(--mj-color-indigo-500); background: none;\n border: 1px dashed var(--mj-color-indigo-200); border-radius: 6px;\n padding: 4px 10px; cursor: pointer;\n transition: all 0.15s; margin-top: 2px;\n}\n.fmc-lookup-add[_ngcontent-%COMP%]:hover { background: var(--mj-color-indigo-50); }\n.fmc-lookup-add[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 3px; font-size: 10px; }\n\n\n\n.data-preview-section[_ngcontent-%COMP%] { margin-top: 24px; border-top: 1px solid var(--mj-border-subtle); padding-top: 16px; }\n.preview-actions[_ngcontent-%COMP%] { display: flex; gap: 8px; margin-bottom: 12px; }\n\n.preview-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-page); border: 1px solid var(--mj-border-default); border-radius: 8px;\n padding: 12px; margin-bottom: 12px;\n}\n.preview-panel-header[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 8px;\n}\n.preview-panel-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] { font-size: 13px; font-weight: 600; margin: 0; }\n.preview-panel-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { margin-right: 6px; color: var(--mj-color-indigo-500); }\n\n.preview-table-wrapper[_ngcontent-%COMP%] { overflow-x: auto; }\n.preview-table[_ngcontent-%COMP%] {\n width: 100%; border-collapse: collapse; font-size: 12px;\n}\n.preview-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left; padding: 5px 8px;\n background: var(--mj-border-default); font-weight: 600; font-size: 10px;\n text-transform: uppercase; color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default); white-space: nowrap;\n}\n.preview-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 4px 8px; border-bottom: 1px solid var(--mj-border-subtle);\n white-space: nowrap; max-width: 150px; overflow: hidden; text-overflow: ellipsis;\n}\n.preview-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover { background: var(--mj-status-info-bg); }\n\n\n\n.run-summary-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-page); border-radius: 8px; padding: 12px;\n}\n.run-summary-row[_ngcontent-%COMP%] {\n display: flex; justify-content: space-between;\n padding: 4px 0; font-size: 13px;\n}\n.run-summary-row[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] { color: var(--mj-text-muted); font-weight: 500; }\n.run-status[_ngcontent-%COMP%] {\n font-size: 11px; padding: 2px 6px; border-radius: 4px; font-weight: 600;\n}\n.status-green[_ngcontent-%COMP%] { background: var(--mj-status-success-bg); color: var(--mj-color-success-700); }\n.status-amber[_ngcontent-%COMP%] { background: var(--mj-color-warning-50); color: var(--mj-color-warning-600); }\n.status-red[_ngcontent-%COMP%] { background: var(--mj-status-error-bg); color: var(--mj-color-error-600); }\n\n.entity-stat-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-page); border-radius: 6px; padding: 10px;\n margin-bottom: 8px;\n}\n.entity-stat-name[_ngcontent-%COMP%] { font-size: 13px; font-weight: 600; margin-bottom: 6px; }\n.entity-stat-grid[_ngcontent-%COMP%] { display: flex; gap: 12px; }\n.mini-stat[_ngcontent-%COMP%] { text-align: center; }\n.mini-val[_ngcontent-%COMP%] { display: block; font-size: 16px; font-weight: 600; }\n.mini-val.has-errors[_ngcontent-%COMP%] { color: var(--mj-color-error-600); }\n.mini-label[_ngcontent-%COMP%] { font-size: 10px; color: var(--mj-text-disabled); }\n\n\n\n.validation-banner[_ngcontent-%COMP%] {\n background: var(--mj-color-warning-50); border: 1px solid var(--mj-color-warning-200); border-radius: 8px;\n padding: 10px 14px; margin-bottom: 14px;\n display: flex; align-items: flex-start; gap: 10px;\n font-size: 13px; color: var(--mj-color-warning-600);\n}\n.validation-banner[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] { margin-top: 2px; }\n.validation-warnings[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 2px; }\n\n.field-map-card.validation-error[_ngcontent-%COMP%] .fmc-source[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-color-warning-600);\n padding-left: 8px;\n}\n\n\n\n@media (max-width: 1100px) { .right-panel[_ngcontent-%COMP%] { display: none; } }\n@media (max-width: 800px) { .left-panel[_ngcontent-%COMP%] { width: 260px; } }"] });
454
2360
  };
455
2361
  MappingWorkspaceComponent = __decorate([
456
2362
  RegisterClass(BaseResourceComponent, 'IntegrationMappingWorkspace')
@@ -458,9 +2364,9 @@ MappingWorkspaceComponent = __decorate([
458
2364
  export { MappingWorkspaceComponent };
459
2365
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MappingWorkspaceComponent, [{
460
2366
  type: Component,
461
- args: [{ standalone: false, selector: 'app-mapping-workspace', template: "<div class=\"mapping-workspace\">\n <div class=\"workspace-header\">\n <h2><i class=\"fa-solid fa-diagram-project\"></i> Mapping Workspace</h2>\n </div>\n\n @if (IsLoadingIntegrations) {\n <mj-loading text=\"Loading integrations...\" size=\"medium\"></mj-loading>\n } @else {\n <kendo-splitter [orientation]=\"'horizontal'\" class=\"workspace-splitter\">\n <!-- Left Panel: Integration selector + Entity maps -->\n <kendo-splitter-pane [size]=\"'25%'\" [min]=\"'200px'\">\n <div class=\"left-panel\">\n <div class=\"panel-section\">\n <label class=\"panel-label\">Integration</label>\n <kendo-dropdownlist\n [data]=\"Integrations\"\n [textField]=\"'Name'\"\n [valueField]=\"'ID'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"SelectedIntegrationID\"\n (valueChange)=\"OnIntegrationChange($event)\"\n [defaultItem]=\"{ ID: '', Name: '-- Select --' }\">\n </kendo-dropdownlist>\n </div>\n\n @if (IsLoadingEntityMaps) {\n <mj-loading text=\"Loading entity maps...\" size=\"small\"></mj-loading>\n } @else if (SelectedIntegrationID) {\n <div class=\"panel-section\">\n <h4 class=\"panel-label\">Entity Maps</h4>\n @if (EntityMaps.length > 0) {\n <div class=\"search-box\">\n <input kendoTextBox\n [(ngModel)]=\"EntityMapSearchText\"\n placeholder=\"Search entity maps...\" />\n </div>\n }\n @if (EntityMaps.length === 0) {\n <p class=\"empty-hint\">No entity maps configured.</p>\n } @else if (FilteredEntityMaps.length === 0) {\n <p class=\"empty-hint\">No matches for \"{{ EntityMapSearchText }}\".</p>\n } @else {\n <div class=\"entity-map-list\">\n @for (em of FilteredEntityMaps; track em.ID) {\n <div class=\"entity-map-item\"\n [class.selected]=\"IsSelectedEntityMap(em.ID)\"\n (click)=\"OnEntityMapSelect(em)\">\n <div class=\"em-info\">\n <span class=\"em-name\">{{ em.ExternalObjectName }}</span>\n <span class=\"em-arrow\">-></span>\n <span class=\"em-entity\">{{ em.Entity }}</span>\n </div>\n <div class=\"em-controls\">\n <span class=\"em-direction\">{{ em.SyncDirection }}</span>\n <kendo-switch\n [(ngModel)]=\"em.SyncEnabled\"\n [size]=\"'small'\"\n (valueChange)=\"OnToggleEntityMap(em)\">\n </kendo-switch>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </kendo-splitter-pane>\n\n <!-- Center Panel: Field mapping grid -->\n <kendo-splitter-pane [size]=\"'50%'\" [min]=\"'300px'\">\n <div class=\"center-panel\">\n @if (!SelectedEntityMapID) {\n <div class=\"placeholder-message\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select an entity map from the left panel to view field mappings.</p>\n </div>\n } @else if (IsLoadingFieldMaps) {\n <mj-loading text=\"Loading field maps...\" size=\"medium\"></mj-loading>\n } @else {\n <h3 class=\"panel-title\">\n Field Mappings\n <span class=\"field-count\">({{ FieldMaps.length }})</span>\n </h3>\n <kendo-grid [data]=\"FieldMaps\" [height]=\"500\" [resizable]=\"true\">\n <kendo-grid-column field=\"SourceFieldName\" title=\"Source Field\" [width]=\"160\">\n </kendo-grid-column>\n <kendo-grid-column field=\"DestinationFieldName\" title=\"Destination Field\" [width]=\"160\">\n </kendo-grid-column>\n <kendo-grid-column field=\"Direction\" title=\"Direction\" [width]=\"120\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <span class=\"direction-badge\">{{ dataItem.Direction }}</span>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"IsKeyField\" title=\"Key\" [width]=\"60\">\n <ng-template kendoGridCellTemplate let-dataItem>\n @if (dataItem.IsKeyField) {\n <i class=\"fa-solid fa-key key-icon\"></i>\n }\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"Status\" title=\"Status\" [width]=\"80\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <span class=\"status-badge\" [class]=\"'status-' + dataItem.Status.toLowerCase()\">\n {{ dataItem.Status }}\n </span>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n }\n </div>\n </kendo-splitter-pane>\n\n <!-- Right Panel: Run detail view -->\n <kendo-splitter-pane [min]=\"'200px'\">\n <div class=\"right-panel\">\n <h4 class=\"panel-label\">Last Run Details</h4>\n @if (!SelectedIntegrationID) {\n <p class=\"empty-hint\">Select an integration to see run details.</p>\n } @else if (IsLoadingRunDetails) {\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n } @else if (!LatestRun) {\n <p class=\"empty-hint\">No runs found.</p>\n } @else {\n <div class=\"run-summary-card\">\n <div class=\"run-summary-row\">\n <span class=\"label\">Status</span>\n <span class=\"run-status\" [class]=\"'status-' + RunStatusColor\">\n {{ LatestRun.Status }}\n </span>\n </div>\n <div class=\"run-summary-row\">\n <span class=\"label\">Started</span>\n <span>{{ FormatDate(LatestRun.StartedAt) }}</span>\n </div>\n <div class=\"run-summary-row\">\n <span class=\"label\">Total Records</span>\n <span>{{ LatestRun.TotalRecords | number }}</span>\n </div>\n <div class=\"run-summary-row\">\n <span class=\"label\">Run By</span>\n <span>{{ LatestRun.RunByUser }}</span>\n </div>\n </div>\n\n @if (RunEntityDetails.length > 0) {\n <h4 class=\"panel-label\" style=\"margin-top: 16px;\">Per-Entity Stats</h4>\n @for (detail of RunEntityDetails; track detail.ID) {\n <div class=\"entity-stat-card\">\n <div class=\"entity-stat-name\">{{ detail.Entity }}</div>\n <div class=\"entity-stat-grid\">\n <div class=\"mini-stat\">\n <span class=\"mini-val\">{{ detail.RecordsCreated }}</span>\n <span class=\"mini-label\">Created</span>\n </div>\n <div class=\"mini-stat\">\n <span class=\"mini-val\">{{ detail.RecordsUpdated }}</span>\n <span class=\"mini-label\">Updated</span>\n </div>\n <div class=\"mini-stat\">\n <span class=\"mini-val error\" [class.has-errors]=\"detail.RecordsErrored > 0\">\n {{ detail.RecordsErrored }}\n </span>\n <span class=\"mini-label\">Errors</span>\n </div>\n </div>\n </div>\n }\n }\n }\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n }\n</div>\n", styles: ["\n .mapping-workspace { padding: 24px; height: 100%; display: flex; flex-direction: column; }\n .workspace-header {\n margin-bottom: 16px;\n h2 {\n margin: 0; font-size: 20px; font-weight: 600;\n i { margin-right: 8px; }\n }\n }\n .workspace-splitter { flex: 1; min-height: 500px; }\n\n .left-panel, .center-panel, .right-panel { padding: 16px; height: 100%; overflow-y: auto; }\n\n .panel-label {\n font-size: 12px; font-weight: 600; color: #666;\n text-transform: uppercase; letter-spacing: 0.5px;\n margin: 0 0 8px 0; display: block;\n }\n .panel-title {\n margin: 0 0 12px 0; font-size: 16px;\n .field-count { color: #888; font-weight: 400; }\n }\n .panel-section { margin-bottom: 20px; }\n .empty-hint { color: #999; font-size: 13px; font-style: italic; }\n\n .search-box {\n margin-bottom: 12px;\n }\n\n .entity-map-list { display: flex; flex-direction: column; gap: 4px; }\n .entity-map-item {\n padding: 8px 10px; border-radius: 6px;\n cursor: pointer; border: 1px solid #eee; transition: all 0.15s;\n }\n .entity-map-item:hover { background: #f8f9fa; }\n .entity-map-item.selected { background: #f0f4ff; border-color: #4a6cf7; }\n .em-info {\n display: flex; align-items: center; gap: 4px;\n font-size: 13px; margin-bottom: 4px;\n }\n .em-name { font-weight: 600; }\n .em-arrow { color: #999; }\n .em-entity { color: #666; }\n .em-controls {\n display: flex; align-items: center; justify-content: space-between;\n font-size: 11px; color: #888;\n }\n .em-direction {\n background: #f0f0f0; padding: 1px 6px; border-radius: 4px; font-size: 10px;\n }\n\n .placeholder-message {\n display: flex; flex-direction: column; align-items: center;\n justify-content: center; height: 300px; color: #999;\n i { font-size: 36px; margin-bottom: 12px; }\n p { text-align: center; }\n }\n\n .direction-badge {\n font-size: 11px; background: #f0f0f0; padding: 2px 6px; border-radius: 4px;\n }\n .key-icon { color: #b5850a; font-size: 12px; }\n .status-badge {\n font-size: 11px; padding: 2px 6px; border-radius: 4px; font-weight: 500;\n }\n .status-active { background: #e6f9ed; color: #1b7a3d; }\n .status-inactive { background: #f0f0f0; color: #757575; }\n\n .run-summary-card {\n background: #f8f9fa; border-radius: 8px; padding: 12px;\n }\n .run-summary-row {\n display: flex; justify-content: space-between;\n padding: 4px 0; font-size: 13px;\n .label { color: #666; font-weight: 500; }\n }\n .run-status {\n font-size: 11px; padding: 2px 6px; border-radius: 4px; font-weight: 600;\n }\n .status-green { background: #e6f9ed; color: #1b7a3d; }\n .status-amber { background: #fff7e0; color: #b5850a; }\n .status-red { background: #fde8e8; color: #c62828; }\n\n .entity-stat-card {\n background: #f8f9fa; border-radius: 6px; padding: 10px;\n margin-bottom: 8px;\n }\n .entity-stat-name { font-size: 13px; font-weight: 600; margin-bottom: 6px; }\n .entity-stat-grid { display: flex; gap: 12px; }\n .mini-stat { text-align: center; }\n .mini-val { display: block; font-size: 16px; font-weight: 600; }\n .mini-val.has-errors { color: #c62828; }\n .mini-label { font-size: 10px; color: #888; }\n "] }]
2367
+ args: [{ standalone: false, selector: 'app-mapping-workspace', template: "<div class=\"mapping-workspace\">\n <div class=\"workspace-header\">\n <h2><i class=\"fa-solid fa-diagram-project\"></i> Mapping Workspace</h2>\n </div>\n\n @if (IsLoadingIntegrations) {\n <mj-loading text=\"Loading integrations...\" size=\"medium\"></mj-loading>\n } @else {\n <div class=\"workspace-body\">\n <!-- ============================================================ -->\n <!-- LEFT PANEL: Integration selector + Entity map list -->\n <!-- ============================================================ -->\n <div class=\"left-panel\">\n <div class=\"integration-selector\">\n <label class=\"panel-label\">Integration</label>\n <kendo-dropdownlist\n [data]=\"Integrations\"\n [textField]=\"'Name'\"\n [valueField]=\"'ID'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"SelectedIntegrationID\"\n (valueChange)=\"OnIntegrationChange($event)\"\n [defaultItem]=\"{ ID: '', Name: '-- Select --' }\">\n </kendo-dropdownlist>\n </div>\n\n @if (IsLoadingEntityMaps) {\n <mj-loading text=\"Loading entity maps...\" size=\"small\"></mj-loading>\n } @else if (SelectedIntegrationID) {\n <!-- Entity Map Header -->\n <div class=\"entity-map-header\">\n <span class=\"panel-label\" style=\"margin: 0;\">Entity Maps</span>\n <div class=\"header-actions\">\n <button kendoButton [look]=\"'flat'\" [size]=\"'small'\"\n (click)=\"OpenAddPanel()\" title=\"Add entity map\">\n <i class=\"fa-solid fa-plus\"></i> Add Map\n </button>\n </div>\n </div>\n\n <!-- ==================== ADD MAP PANEL ==================== -->\n @if (ShowAddPanel) {\n <div class=\"add-map-panel\">\n <div class=\"add-panel-top\">\n <h5><i class=\"fa-solid fa-plus-circle\"></i> Add Entity Map</h5>\n <button class=\"add-panel-close\" (click)=\"CloseAddPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Source Object Dropdown -->\n <div class=\"form-group\">\n <label>Source Object</label>\n @if (IsDiscoveringObjects) {\n <div class=\"source-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Discovering objects...\n </div>\n } @else if (DiscoverError) {\n <div class=\"discover-error-inline\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n {{ DiscoverError }}\n </div>\n } @else if (DiscoveredObjects.length === 0) {\n <div class=\"discover-error-inline\">\n No objects found in external system.\n </div>\n } @else {\n <kendo-dropdownlist\n [data]=\"DiscoveredObjects\"\n [textField]=\"'Label'\"\n [valueField]=\"'Name'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"SelectedSourceObjectName\"\n (valueChange)=\"OnSourceObjectChange($event)\"\n [filterable]=\"true\"\n [defaultItem]=\"{ Name: '', Label: 'Select source object...' }\">\n </kendo-dropdownlist>\n }\n </div>\n\n <!-- Target Mode Toggle -->\n <div class=\"target-mode-toggle\">\n <button class=\"target-mode-btn\"\n [class.active]=\"TargetMode === 'existing'\"\n (click)=\"SetTargetMode('existing')\">\n <i class=\"fa-solid fa-database\"></i> Existing Entity\n </button>\n <button class=\"target-mode-btn\"\n [class.active]=\"TargetMode === 'new'\"\n (click)=\"SetTargetMode('new')\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> New Entity\n </button>\n </div>\n\n <!-- Existing entity picker -->\n @if (TargetMode === 'existing') {\n <div class=\"form-group\">\n <label>Target MJ Entity</label>\n @if (IsLoadingEntities) {\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n } @else {\n <kendo-dropdownlist\n [data]=\"MJEntities\"\n [textField]=\"'Name'\"\n [valueField]=\"'ID'\"\n [valuePrimitive]=\"true\"\n [(ngModel)]=\"SelectedEntityID\"\n [filterable]=\"true\"\n [defaultItem]=\"{ ID: null, Name: 'Select entity...' }\">\n </kendo-dropdownlist>\n }\n </div>\n }\n\n <!-- New entity form -->\n @if (TargetMode === 'new') {\n <div class=\"new-entity-form\">\n <div class=\"section-label\">Define New Entity</div>\n <div class=\"form-group\">\n <label>DB Schema</label>\n <kendo-combobox\n [data]=\"DBSchemas\"\n [(ngModel)]=\"NewEntitySchemaName\"\n (valueChange)=\"OnSchemaNameChange()\"\n [allowCustom]=\"true\"\n [filterable]=\"true\"\n [placeholder]=\"'Select or type schema...'\">\n </kendo-combobox>\n </div>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Table Name</label>\n <input kendoTextBox [(ngModel)]=\"NewEntityTableName\"\n [placeholder]=\"SuggestedTableName || 'Table name'\" />\n @if (SuggestedTableName && !NewEntityTableName) {\n <span class=\"auto-hint\">Suggested: {{ SuggestedTableName }}</span>\n }\n </div>\n <div class=\"form-group\">\n <label>Entity Name</label>\n <input kendoTextBox [(ngModel)]=\"NewEntityName\"\n [placeholder]=\"SuggestedEntityName || 'Entity name'\" />\n </div>\n </div>\n\n <!-- DDL Preview -->\n @if (SelectedSourceObjectName && NewEntitySchemaName && NewEntityTableName) {\n <div class=\"ddl-preview-section\">\n <button kendoButton [look]=\"'outline'\" [size]=\"'small'\"\n [disabled]=\"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-database\"></i> Preview DDL\n }\n </button>\n @if (DDLPreviewError) {\n <div class=\"discover-error-inline\" style=\"margin-top: 8px;\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> {{ DDLPreviewError }}\n </div>\n }\n @if (DDLPreviewContent) {\n <pre class=\"ddl-preview-code\">{{ DDLPreviewContent }}</pre>\n }\n </div>\n }\n </div>\n }\n\n <!-- Sync direction -->\n <div class=\"form-group\">\n <label>Sync Direction</label>\n <kendo-dropdownlist\n [data]=\"['Pull', 'Push', 'Bidirectional']\"\n [(ngModel)]=\"AddSyncDirection\">\n </kendo-dropdownlist>\n </div>\n\n <!-- Save / Cancel -->\n <div class=\"add-form-actions\">\n <button kendoButton [themeColor]=\"'primary'\" [size]=\"'small'\"\n [disabled]=\"!IsAddFormValid || IsSavingEntityMap\"\n (click)=\"SaveAddMap()\">\n @if (IsSavingEntityMap) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else if (TargetMode === 'new') {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Create Pending Map\n } @else {\n <i class=\"fa-solid fa-check\"></i> Add Map\n }\n </button>\n <button kendoButton [size]=\"'small'\" (click)=\"CloseAddPanel()\">\n Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- Search -->\n @if (AllMaps.length > 0) {\n <div class=\"search-box\">\n <input kendoTextBox\n [(ngModel)]=\"EntityMapSearchText\"\n placeholder=\"Search entity maps...\" />\n </div>\n }\n\n <!-- Entity Map List -->\n @if (AllMaps.length === 0 && !ShowAddPanel) {\n <p class=\"empty-hint\">\n No entity maps configured.\n <a href=\"javascript:void(0)\" (click)=\"OpenAddPanel()\" style=\"color: #4a6cf7;\">Add one</a>\n </p>\n } @else if (FilteredMaps.length === 0 && AllMaps.length > 0) {\n <p class=\"empty-hint\">No matches for \"{{ EntityMapSearchText }}\".</p>\n } @else {\n <div class=\"entity-map-list\">\n @for (item of FilteredMaps; track item.ID) {\n <div class=\"entity-map-item\"\n [class.selected]=\"IsSelectedMap(item.ID)\"\n [class.pending]=\"item.IsPending\"\n (click)=\"OnMapSelect(item)\">\n <div class=\"em-top-row\">\n <span class=\"em-name\">{{ item.SourceName }}</span>\n <span class=\"em-arrow\"><i class=\"fa-solid fa-arrow-right\"></i></span>\n <span class=\"em-entity\">{{ item.TargetName }}</span>\n </div>\n <div class=\"em-bottom-row\">\n <div class=\"em-badges\">\n <span class=\"badge badge-direction\">{{ item.SyncDirection }}</span>\n @if (item.IsPending) {\n <span class=\"badge badge-pending\">Pending</span>\n }\n </div>\n <div class=\"em-actions\">\n <button class=\"em-delete\" title=\"Delete\"\n (click)=\"OnDeleteMap(item, $event)\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n @if (!item.IsPending && item.RealMap) {\n <kendo-switch\n [(ngModel)]=\"item.RealMap.SyncEnabled\"\n [size]=\"'small'\"\n (valueChange)=\"OnToggleEntityMap(item.RealMap)\">\n </kendo-switch>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n <!-- ============================================================ -->\n <!-- CENTER PANEL: Field mapping / Pending entity / Placeholder -->\n <!-- ============================================================ -->\n <div class=\"center-panel\">\n @if (!SelectedMapID) {\n <!-- No selection placeholder -->\n <div class=\"placeholder-message\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select an entity map from the left panel to view and edit field mappings.</p>\n </div>\n } @else if (SelectedPendingMap) {\n <!-- ==================== PENDING ENTITY VIEW ==================== -->\n <div class=\"pending-entity-panel\">\n <div class=\"pending-icon\"><i class=\"fa-solid fa-clock\"></i></div>\n <h3>Pending Entity: {{ SelectedPendingMap.EntityName }}</h3>\n <p>\n This entity map is waiting for the target entity\n <strong>{{ SelectedPendingMap.SchemaName }}.{{ SelectedPendingMap.TableName }}</strong>\n to be created. Run the DDL migration and CodeGen to activate this mapping.\n </p>\n\n <!-- Progress stepper -->\n <div class=\"pending-steps\">\n <div class=\"step\">\n <div class=\"step-circle done\"><i class=\"fa-solid fa-check\"></i></div>\n <span class=\"step-label\">Map Created</span>\n </div>\n <div class=\"step-connector\" [class.done]=\"SelectedPendingMap.DDLContent\"></div>\n <div class=\"step\">\n <div class=\"step-circle\" [ngClass]=\"GetPendingStepStatus(SelectedPendingMap, 2)\">\n @if (SelectedPendingMap.DDLContent) {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n 2\n }\n </div>\n <span class=\"step-label\">DDL Generated</span>\n </div>\n <div class=\"step-connector\"></div>\n <div class=\"step\">\n <div class=\"step-circle future\">3</div>\n <span class=\"step-label\">Deploy & CodeGen</span>\n </div>\n <div class=\"step-connector\"></div>\n <div class=\"step\">\n <div class=\"step-circle future\">4</div>\n <span class=\"step-label\">Ready to Sync</span>\n </div>\n </div>\n\n <!-- DDL content -->\n @if (SelectedPendingMap.DDLContent) {\n <div class=\"ddl-preview-inline\">\n <h4 style=\"font-size: 14px; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-database\"></i> Generated DDL\n </h4>\n <pre class=\"ddl-code-block\">{{ SelectedPendingMap.DDLContent }}</pre>\n <div class=\"ddl-actions\">\n <button kendoButton [look]=\"'outline'\" [size]=\"'small'\"\n (click)=\"CopyDDLToClipboard(SelectedPendingMap.DDLContent)\">\n <i class=\"fa-solid fa-copy\"></i> Copy DDL\n </button>\n </div>\n </div>\n }\n\n <!-- Source fields list -->\n @if (SelectedPendingMap.SourceFields.length > 0) {\n <div class=\"pending-fields-section\">\n <h4 style=\"font-size: 14px; margin: 16px 0 8px;\">\n <i class=\"fa-solid fa-list\"></i> Source Fields\n <span style=\"color: #999; font-weight: 400;\">({{ SelectedPendingMap.SourceFields.length }})</span>\n </h4>\n <div class=\"pending-fields-list\">\n @for (field of SelectedPendingMap.SourceFields; track field.Name) {\n <div class=\"pending-field-item\">\n <span class=\"pending-field-name\">{{ field.Name }}</span>\n <span class=\"pending-field-type\">{{ field.Type }}</span>\n @if (field.IsPrimaryKey) {\n <i class=\"fa-solid fa-key key-icon\" title=\"Key field\"></i>\n }\n @if (field.IsRequired) {\n <span class=\"pending-field-req\">*</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n } @else if (IsLoadingFieldMaps) {\n <mj-loading text=\"Loading field maps...\" size=\"medium\"></mj-loading>\n } @else {\n <!-- ==================== FIELD MAPPING EDITOR ==================== -->\n\n <!-- Auto-map banner -->\n @if (ShowAutoMapBanner) {\n <div class=\"auto-map-banner\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <div class=\"banner-text\">\n <p><strong>{{ AutoMapCount }} field{{ AutoMapCount !== 1 ? 's' : '' }} auto-mapped</strong> by matching source and destination field names.</p>\n </div>\n <button kendoButton [look]=\"'flat'\" [size]=\"'small'\" (click)=\"DismissAutoMapBanner()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n <!-- Validation warnings -->\n @if (ActiveEditableFields.length > 0 && !MappingValidation.IsValid) {\n <div class=\"validation-banner\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div class=\"validation-warnings\">\n @for (warning of MappingValidation.Warnings; track warning) {\n <span>{{ warning }}</span>\n }\n </div>\n </div>\n }\n\n <div class=\"field-mapping-header\">\n <h3 class=\"panel-title\">\n Field Mappings\n <span class=\"field-count\">({{ ActiveEditableFields.length }})</span>\n </h3>\n <div class=\"field-mapping-actions\">\n <button kendoButton [look]=\"'outline'\" [size]=\"'small'\"\n [disabled]=\"IsLoadingSourceFields\"\n (click)=\"RerunAutoMap()\" title=\"Auto-match source and destination fields by name\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Auto-Map\n </button>\n <button kendoButton [look]=\"'outline'\" [size]=\"'small'\"\n (click)=\"AddFieldMapping()\">\n <i class=\"fa-solid fa-plus\"></i> Add Field\n </button>\n <button kendoButton [themeColor]=\"'primary'\" [size]=\"'small'\"\n [disabled]=\"!HasDirtyFields || IsSavingFields\"\n (click)=\"SaveFieldMappings()\">\n @if (IsSavingFields) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n </div>\n </div>\n\n @if (ActiveEditableFields.length === 0) {\n <p class=\"empty-hint\">\n No field mappings yet.\n <a href=\"javascript:void(0)\" (click)=\"AddFieldMapping()\" style=\"color: #4a6cf7;\">Add one</a>\n </p>\n } @else {\n <div class=\"field-map-cards\">\n @for (field of ActiveEditableFields; track field; let i = $index) {\n <div class=\"field-map-card\" [class.validation-error]=\"field.IsRequired && !field.DestinationFieldName\"\n [class.has-transform]=\"field.TransformPipeline.length > 0\">\n\n <!-- Main mapping row -->\n <div class=\"fmc-row\">\n <!-- Source column -->\n <div class=\"fmc-source\">\n @if (field.IsNew) {\n <input type=\"text\" class=\"fmc-input\" [(ngModel)]=\"field.SourceFieldName\"\n (ngModelChange)=\"OnFieldChanged(field)\" placeholder=\"Source field name\" />\n } @else {\n <div class=\"fmc-field-name\">{{ field.SourceFieldName }}</div>\n <div class=\"fmc-badges\">\n @if (field.SourceFieldType) {\n <span class=\"fmc-badge badge-type\">{{ field.SourceFieldType }}</span>\n }\n @if (field.IsSourcePK) {\n <span class=\"fmc-badge badge-pk\" title=\"Primary Key\"><i class=\"fa-solid fa-key\"></i> PK</span>\n }\n @if (field.IsSourceRequired) {\n <span class=\"fmc-badge badge-req\" title=\"Required\">REQ</span>\n }\n @if (field.IsSourceReadOnly) {\n <span class=\"fmc-badge badge-ro\" title=\"Read-Only\">RO</span>\n }\n </div>\n }\n </div>\n\n <!-- Transform indicator -->\n <div class=\"fmc-transform-zone\">\n @if (field.TransformPipeline.length > 1) {\n <button class=\"fmc-transform-pill\" (click)=\"ToggleTransformEditor(field)\"\n [title]=\"field.TransformPipeline.length + ' transform step(s)'\">\n <i [class]=\"GetTransformIcon(field.TransformPipeline[0].Type)\"></i>\n <span>{{ GetTransformLabel(field.TransformPipeline[0].Type) }}</span>\n <span class=\"fmc-step-count\">+{{ field.TransformPipeline.length - 1 }}</span>\n </button>\n } @else {\n <button class=\"fmc-transform-pill fmc-transform-direct\" (click)=\"ToggleTransformEditor(field)\"\n title=\"Click to change transform type\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n <span>{{ field.TransformPipeline.length > 0 ? GetTransformLabel(field.TransformPipeline[0].Type) : 'Direct' }}</span>\n </button>\n }\n </div>\n\n <!-- Destination column -->\n <div class=\"fmc-dest\">\n @if (DestinationFields.length > 0) {\n <select class=\"fmc-select\" [(ngModel)]=\"field.DestinationFieldName\"\n (ngModelChange)=\"OnFieldChanged(field)\">\n <option value=\"\">-- Select destination --</option>\n @for (df of DestinationFields; track df.ID) {\n <option [value]=\"df.Name\">{{ df.Name }}</option>\n }\n </select>\n } @else {\n <input type=\"text\" class=\"fmc-input\" [(ngModel)]=\"field.DestinationFieldName\"\n (ngModelChange)=\"OnFieldChanged(field)\" placeholder=\"Destination field\" />\n }\n </div>\n\n <!-- Sync flags -->\n <div class=\"fmc-flags\">\n <label class=\"fmc-flag\" title=\"Key field for matching\">\n <input type=\"checkbox\" [(ngModel)]=\"field.IsKeyField\"\n (ngModelChange)=\"OnFieldChanged(field)\" />\n <i class=\"fa-solid fa-key\"></i>\n </label>\n <label class=\"fmc-flag\" title=\"Required field\">\n <input type=\"checkbox\" [(ngModel)]=\"field.IsRequired\"\n (ngModelChange)=\"OnFieldChanged(field)\" />\n <span class=\"fmc-req-star\">*</span>\n </label>\n </div>\n\n <!-- Remove button -->\n <button class=\"fmc-remove\" title=\"Remove mapping\" (click)=\"RemoveFieldMapping(i)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Transform pipeline editor (expandable) -->\n @if (field.ShowTransformEditor && field.TransformPipeline.length > 0) {\n <div class=\"fmc-transform-editor\">\n <div class=\"fmc-te-header\">\n <span class=\"fmc-te-title\"><i class=\"fa-solid fa-wand-magic-sparkles\"></i> Transform Pipeline</span>\n <button class=\"fmc-te-add\" (click)=\"AddTransformStep(field)\" title=\"Add another step\">\n <i class=\"fa-solid fa-plus\"></i> Add Step\n </button>\n </div>\n @for (step of field.TransformPipeline; track $index; let si = $index) {\n <div class=\"fmc-te-step\">\n <div class=\"fmc-te-step-header\">\n <span class=\"fmc-te-step-num\">{{ si + 1 }}</span>\n <select class=\"fmc-te-type-select\" [ngModel]=\"step.Type\"\n (ngModelChange)=\"OnTransformTypeChange(field, step, $event)\">\n @for (tt of TransformTypes; track tt.Value) {\n <option [value]=\"tt.Value\">{{ tt.Label }}</option>\n }\n </select>\n <select class=\"fmc-te-error-select\" [(ngModel)]=\"step.OnError\"\n (ngModelChange)=\"OnTransformConfigChange(field)\" title=\"On error\">\n <option value=\"Fail\">Fail</option>\n <option value=\"Skip\">Skip row</option>\n <option value=\"Null\">Set null</option>\n </select>\n <button class=\"fmc-te-remove-step\" (click)=\"RemoveTransformStep(field, si)\" title=\"Remove step\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n\n <!-- Config editors per type -->\n <div class=\"fmc-te-config\">\n @switch (step.Type) {\n @case ('direct') {\n <div class=\"fmc-te-field\">\n <label>Default value (when source is null)</label>\n <input type=\"text\" class=\"fmc-input\" [ngModel]=\"step.Config['DefaultValue'] ?? ''\"\n (ngModelChange)=\"step.Config['DefaultValue'] = $event; OnTransformConfigChange(field)\"\n placeholder=\"Leave empty for no default\" />\n </div>\n }\n @case ('regex') {\n <div class=\"fmc-te-row\">\n <div class=\"fmc-te-field\">\n <label>Pattern</label>\n <input type=\"text\" class=\"fmc-input mono\" [ngModel]=\"step.Config['Pattern'] ?? ''\"\n (ngModelChange)=\"step.Config['Pattern'] = $event; OnTransformConfigChange(field)\"\n placeholder=\"e.g. (\\d{3})-(\\d{4})\" />\n </div>\n <div class=\"fmc-te-field\">\n <label>Replacement</label>\n <input type=\"text\" class=\"fmc-input mono\" [ngModel]=\"step.Config['Replacement'] ?? ''\"\n (ngModelChange)=\"step.Config['Replacement'] = $event; OnTransformConfigChange(field)\"\n placeholder=\"e.g. $1$2\" />\n </div>\n <div class=\"fmc-te-field fmc-te-sm\">\n <label>Flags</label>\n <input type=\"text\" class=\"fmc-input mono\" [ngModel]=\"step.Config['Flags'] ?? 'g'\"\n (ngModelChange)=\"step.Config['Flags'] = $event; OnTransformConfigChange(field)\"\n placeholder=\"gi\" />\n </div>\n </div>\n }\n @case ('split') {\n <div class=\"fmc-te-row\">\n <div class=\"fmc-te-field\">\n <label>Delimiter</label>\n <input type=\"text\" class=\"fmc-input mono\" [ngModel]=\"step.Config['Delimiter'] ?? ','\"\n (ngModelChange)=\"step.Config['Delimiter'] = $event; OnTransformConfigChange(field)\"\n placeholder=\",\" />\n </div>\n <div class=\"fmc-te-field fmc-te-sm\">\n <label>Part index (0-based)</label>\n <input type=\"number\" class=\"fmc-input\" [ngModel]=\"step.Config['Index'] ?? 0\"\n (ngModelChange)=\"step.Config['Index'] = +$event; OnTransformConfigChange(field)\"\n min=\"0\" />\n </div>\n </div>\n }\n @case ('combine') {\n <div class=\"fmc-te-field\">\n <label>Source fields to combine</label>\n <div class=\"fmc-combine-chips\">\n @for (sf of GetAvailableSourceFields(); track sf) {\n <button class=\"fmc-chip\" [class.selected]=\"IsCombineFieldSelected(step.Config, sf)\"\n (click)=\"ToggleCombineField(step.Config, sf); OnTransformConfigChange(field)\">\n {{ sf }}\n </button>\n }\n </div>\n </div>\n <div class=\"fmc-te-field fmc-te-sm\">\n <label>Separator</label>\n <input type=\"text\" class=\"fmc-input mono\" [ngModel]=\"step.Config['Separator'] ?? ' '\"\n (ngModelChange)=\"step.Config['Separator'] = $event; OnTransformConfigChange(field)\"\n placeholder=\" \" />\n </div>\n }\n @case ('lookup') {\n <div class=\"fmc-te-field\">\n <label>Value mapping</label>\n <div class=\"fmc-lookup-table\">\n @for (entry of GetLookupEntries(step.Config); track $index) {\n <div class=\"fmc-lookup-row\">\n <input type=\"text\" class=\"fmc-input\" [value]=\"entry.key\" placeholder=\"Source value\"\n (change)=\"UpdateLookupEntry(step.Config, entry.key, $any($event.target).value, entry.value); OnTransformConfigChange(field)\" />\n <i class=\"fa-solid fa-arrow-right fmc-lookup-arrow\"></i>\n <input type=\"text\" class=\"fmc-input\" [value]=\"entry.value\" placeholder=\"Mapped value\"\n (change)=\"UpdateLookupEntry(step.Config, entry.key, entry.key, $any($event.target).value); OnTransformConfigChange(field)\" />\n <button class=\"fmc-lookup-del\" (click)=\"RemoveLookupEntry(step.Config, entry.key); OnTransformConfigChange(field)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n <button class=\"fmc-lookup-add\" (click)=\"AddLookupEntry(step.Config); OnTransformConfigChange(field)\">\n <i class=\"fa-solid fa-plus\"></i> Add mapping\n </button>\n </div>\n </div>\n <div class=\"fmc-te-field fmc-te-sm\">\n <label>Default (when no match)</label>\n <input type=\"text\" class=\"fmc-input\" [ngModel]=\"step.Config['Default'] ?? ''\"\n (ngModelChange)=\"step.Config['Default'] = $event; OnTransformConfigChange(field)\"\n placeholder=\"null\" />\n </div>\n }\n @case ('format') {\n <div class=\"fmc-te-row\">\n <div class=\"fmc-te-field fmc-te-sm\">\n <label>Format type</label>\n <select class=\"fmc-select\" [ngModel]=\"step.Config['FormatType'] ?? 'date'\"\n (ngModelChange)=\"step.Config['FormatType'] = $event; OnTransformConfigChange(field)\">\n <option value=\"date\">Date</option>\n <option value=\"number\">Number</option>\n <option value=\"string\">String</option>\n </select>\n </div>\n <div class=\"fmc-te-field\">\n <label>Format string</label>\n <input type=\"text\" class=\"fmc-input mono\" [ngModel]=\"step.Config['FormatString'] ?? 'ISO'\"\n (ngModelChange)=\"step.Config['FormatString'] = $event; OnTransformConfigChange(field)\"\n placeholder=\"ISO or decimal places\" />\n </div>\n </div>\n }\n @case ('coerce') {\n <div class=\"fmc-te-field fmc-te-sm\">\n <label>Target type</label>\n <select class=\"fmc-select\" [ngModel]=\"step.Config['TargetType'] ?? 'string'\"\n (ngModelChange)=\"step.Config['TargetType'] = $event; OnTransformConfigChange(field)\">\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"date\">Date</option>\n </select>\n </div>\n }\n @case ('substring') {\n <div class=\"fmc-te-row\">\n <div class=\"fmc-te-field fmc-te-sm\">\n <label>Start index</label>\n <input type=\"number\" class=\"fmc-input\" [ngModel]=\"step.Config['Start'] ?? 0\"\n (ngModelChange)=\"step.Config['Start'] = +$event; OnTransformConfigChange(field)\"\n min=\"0\" />\n </div>\n <div class=\"fmc-te-field fmc-te-sm\">\n <label>Length (blank = to end)</label>\n <input type=\"number\" class=\"fmc-input\" [ngModel]=\"step.Config['Length'] ?? ''\"\n (ngModelChange)=\"step.Config['Length'] = $event ? +$event : undefined; OnTransformConfigChange(field)\"\n min=\"1\" />\n </div>\n </div>\n }\n @case ('custom') {\n <div class=\"fmc-te-field\">\n <label>JavaScript expression <span class=\"fmc-te-hint\">(use <code>value</code> and <code>fields</code>)</span></label>\n <textarea class=\"fmc-input mono fmc-textarea\" [ngModel]=\"step.Config['Expression'] ?? 'value'\"\n (ngModelChange)=\"step.Config['Expression'] = $event; OnTransformConfigChange(field)\"\n placeholder=\"value.toUpperCase()\" rows=\"2\"></textarea>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Data Preview Section -->\n <div class=\"data-preview-section\">\n <div class=\"preview-actions\">\n <button kendoButton [look]=\"'outline'\" [size]=\"'small'\"\n [disabled]=\"IsLoadingSourcePreview\"\n (click)=\"LoadSourcePreview()\">\n <i class=\"fa-solid fa-cloud-arrow-down\"></i> Preview Source\n </button>\n <button kendoButton [look]=\"'outline'\" [size]=\"'small'\"\n [disabled]=\"IsLoadingDestPreview\"\n (click)=\"LoadDestPreview()\">\n <i class=\"fa-solid fa-database\"></i> Preview Destination\n </button>\n </div>\n\n @if (ShowSourcePreview) {\n <div class=\"preview-panel\">\n <div class=\"preview-panel-header\">\n <h4><i class=\"fa-solid fa-cloud\"></i> Source Data Preview</h4>\n <button class=\"add-panel-close\" (click)=\"CloseSourcePreview()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n @if (IsLoadingSourcePreview) {\n <mj-loading text=\"Loading source data...\" size=\"small\"></mj-loading>\n } @else if (SourcePreviewData.length === 0) {\n <p class=\"empty-hint\">No source data available.</p>\n } @else {\n <div class=\"preview-table-wrapper\">\n <table class=\"preview-table\">\n <thead>\n <tr>\n @for (col of GetPreviewColumns(SourcePreviewData); track col) {\n <th>{{ col }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of SourcePreviewData; track $index) {\n <tr>\n @for (col of GetPreviewColumns(SourcePreviewData); track col) {\n <td>{{ FormatPreviewValue(row[col]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n @if (ShowDestPreview) {\n <div class=\"preview-panel\">\n <div class=\"preview-panel-header\">\n <h4><i class=\"fa-solid fa-database\"></i> Destination Data Preview</h4>\n <button class=\"add-panel-close\" (click)=\"CloseDestPreview()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n @if (IsLoadingDestPreview) {\n <mj-loading text=\"Loading destination data...\" size=\"small\"></mj-loading>\n } @else if (DestPreviewData.length === 0) {\n <p class=\"empty-hint\">No destination data available.</p>\n } @else {\n <div class=\"preview-table-wrapper\">\n <table class=\"preview-table\">\n <thead>\n <tr>\n @for (col of GetPreviewColumns(DestPreviewData); track col) {\n <th>{{ col }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of DestPreviewData; track $index) {\n <tr>\n @for (col of GetPreviewColumns(DestPreviewData); track col) {\n <td>{{ FormatPreviewValue(row[col]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- ============================================================ -->\n <!-- RIGHT PANEL: Last run details -->\n <!-- ============================================================ -->\n <div class=\"right-panel\">\n <h4 class=\"panel-label\">Last Run Details</h4>\n @if (!SelectedIntegrationID) {\n <p class=\"empty-hint\">Select an integration to see run details.</p>\n } @else if (IsLoadingRunDetails) {\n <mj-loading text=\"Loading...\" size=\"small\"></mj-loading>\n } @else if (!LatestRun) {\n <p class=\"empty-hint\">No runs found.</p>\n } @else {\n <div class=\"run-summary-card\">\n <div class=\"run-summary-row\">\n <span class=\"label\">Status</span>\n <span class=\"run-status\" [class]=\"'status-' + RunStatusColor\">\n {{ LatestRun.Status }}\n </span>\n </div>\n <div class=\"run-summary-row\">\n <span class=\"label\">Started</span>\n <span>{{ FormatDate(LatestRun.StartedAt) }}</span>\n </div>\n <div class=\"run-summary-row\">\n <span class=\"label\">Total Records</span>\n <span>{{ LatestRun.TotalRecords | number }}</span>\n </div>\n <div class=\"run-summary-row\">\n <span class=\"label\">Run By</span>\n <span>{{ LatestRun.RunByUser }}</span>\n </div>\n </div>\n\n @if (RunEntityDetails.length > 0) {\n <h4 class=\"panel-label\" style=\"margin-top: 16px;\">Per-Entity Stats</h4>\n @for (detail of RunEntityDetails; track detail.EntityID) {\n <div class=\"entity-stat-card\">\n <div class=\"entity-stat-name\">{{ detail.Entity }}</div>\n <div class=\"entity-stat-grid\">\n <div class=\"mini-stat\">\n <span class=\"mini-val\">{{ detail.RecordsCreated }}</span>\n <span class=\"mini-label\">Created</span>\n </div>\n <div class=\"mini-stat\">\n <span class=\"mini-val\">{{ detail.RecordsUpdated }}</span>\n <span class=\"mini-label\">Updated</span>\n </div>\n <div class=\"mini-stat\">\n <span class=\"mini-val\" [class.has-errors]=\"detail.RecordsErrored > 0\">\n {{ detail.RecordsErrored }}\n </span>\n <span class=\"mini-label\">Errors</span>\n </div>\n </div>\n </div>\n }\n }\n }\n </div>\n </div>\n }\n</div>\n", styles: [".mapping-workspace { padding: 24px; height: 100%; display: flex; flex-direction: column; }\n.workspace-header {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 16px;\n}\n.workspace-header h2 {\n margin: 0; font-size: 20px; font-weight: 600;\n}\n.workspace-header h2 i { margin-right: 8px; color: var(--mj-color-indigo-500); }\n\n/* ===== Three-panel layout ===== */\n.workspace-body {\n display: flex; flex: 1; gap: 1px; background: var(--mj-border-default);\n border-radius: 10px; overflow: hidden; min-height: 500px;\n}\n\n.left-panel { width: 320px; min-width: 280px; background: var(--mj-bg-surface); padding: 16px; overflow-y: auto; flex-shrink: 0; }\n.center-panel { flex: 1; background: var(--mj-bg-surface); padding: 20px; overflow-y: auto; }\n.right-panel { width: 280px; min-width: 240px; background: var(--mj-bg-surface); padding: 16px; overflow-y: auto; flex-shrink: 0; }\n\n/* ===== Shared ===== */\n.panel-label {\n font-size: 11px; font-weight: 700; color: var(--mj-text-disabled);\n text-transform: uppercase; letter-spacing: 0.6px;\n margin: 0 0 6px 0; display: block;\n}\n.panel-title { margin: 0 0 12px 0; font-size: 16px; font-weight: 600; }\n.panel-title .field-count { color: var(--mj-text-disabled); font-weight: 400; font-size: 13px; }\n.empty-hint { color: var(--mj-text-disabled); font-size: 13px; font-style: italic; }\n.search-box { margin-bottom: 12px; }\n\n/* ===== Integration selector ===== */\n.integration-selector { margin-bottom: 20px; padding-bottom: 16px; border-bottom: 1px solid var(--mj-border-subtle); }\n\n/* ===== Entity Map Header ===== */\n.entity-map-header {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 10px;\n}\n.header-actions { display: flex; gap: 4px; }\n\n/* ===== Add Map Panel ===== */\n.add-map-panel {\n background: var(--mj-bg-page); border: 1px solid var(--mj-border-default); border-radius: 10px;\n padding: 16px; margin-bottom: 14px;\n}\n.add-panel-top {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 14px;\n}\n.add-panel-top h5 { margin: 0; font-size: 14px; font-weight: 600; }\n.add-panel-close {\n background: none; border: none; cursor: pointer; color: var(--mj-text-disabled); font-size: 14px;\n}\n.add-panel-close:hover { color: var(--mj-text-primary); }\n\n.form-group { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; }\n.form-group label { font-size: 12px; font-weight: 600; color: var(--mj-text-muted); }\n.form-row { display: flex; gap: 10px; }\n.form-row .form-group { flex: 1; }\n\n.source-loading {\n display: flex; align-items: center; gap: 8px;\n font-size: 12px; color: var(--mj-text-disabled); padding: 6px 0;\n}\n.source-loading i { color: var(--mj-color-indigo-500); }\n\n.discover-error-inline {\n font-size: 12px; color: var(--mj-color-error-600); padding: 6px 0;\n}\n.discover-error-inline i { margin-right: 4px; }\n\n/* Target mode toggle */\n.target-mode-toggle {\n display: flex; border: 1px solid var(--mj-border-default); border-radius: 6px;\n overflow: hidden; margin-bottom: 12px;\n}\n.target-mode-btn {\n flex: 1; padding: 8px 12px; font-size: 12px; font-weight: 600;\n text-align: center; cursor: pointer; background: var(--mj-bg-surface); border: none;\n color: var(--mj-text-muted); transition: all 0.15s;\n}\n.target-mode-btn:first-child { border-right: 1px solid var(--mj-border-default); }\n.target-mode-btn.active { background: var(--mj-color-indigo-500); color: var(--mj-bg-surface); }\n.target-mode-btn:not(.active):hover { background: var(--mj-status-info-bg); color: var(--mj-color-indigo-500); }\n.target-mode-btn i { margin-right: 4px; }\n\n/* New entity form */\n.new-entity-form {\n background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: 8px;\n padding: 14px; margin-bottom: 12px;\n}\n.new-entity-form .section-label {\n font-size: 11px; font-weight: 700; color: var(--mj-color-indigo-500);\n text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 10px;\n}\n.auto-hint { font-size: 10px; color: var(--mj-text-disabled); font-style: italic; }\n\n/* DDL preview in add panel */\n.ddl-preview-section { margin-top: 8px; }\n.ddl-preview-code {\n background: var(--mj-color-neutral-900); color: var(--mj-color-neutral-300); padding: 10px;\n border-radius: 4px; font-size: 11px; line-height: 1.5;\n max-height: 200px; overflow: auto; white-space: pre-wrap;\n word-break: break-word; margin-top: 8px;\n}\n\n.add-form-actions { display: flex; gap: 6px; padding-top: 4px; }\n\n/* ===== Entity Map List ===== */\n.entity-map-list { display: flex; flex-direction: column; gap: 4px; }\n.entity-map-item {\n padding: 8px 10px; border-radius: 6px;\n cursor: pointer; border: 1px solid var(--mj-border-subtle); transition: all 0.15s;\n}\n.entity-map-item:hover { background: var(--mj-bg-page); }\n.entity-map-item.selected { background: var(--mj-status-info-bg); border-color: var(--mj-color-indigo-500); }\n.entity-map-item.pending { border-left: 3px solid var(--mj-status-warning); }\n\n.em-top-row {\n display: flex; align-items: center; gap: 4px;\n font-size: 13px; margin-bottom: 4px;\n}\n.em-name { font-weight: 600; }\n.em-arrow { color: var(--mj-text-disabled); font-size: 11px; }\n.em-entity { color: var(--mj-text-muted); }\n\n.em-bottom-row {\n display: flex; align-items: center; justify-content: space-between;\n font-size: 11px; color: var(--mj-text-disabled);\n}\n.em-badges { display: flex; gap: 4px; align-items: center; }\n.badge {\n font-size: 10px; padding: 1px 6px; border-radius: 4px; font-weight: 600;\n}\n.badge-direction { background: var(--mj-bg-surface-hover); color: var(--mj-text-muted); }\n.badge-pending { background: var(--mj-color-warning-50); color: var(--mj-color-warning-600); }\n\n.em-actions { display: flex; align-items: center; gap: 4px; }\n.em-delete {\n opacity: 0; transition: opacity 0.15s;\n cursor: pointer; color: var(--mj-color-error-600); background: none; border: none;\n padding: 2px 4px; font-size: 12px;\n}\n.entity-map-item:hover .em-delete { opacity: 1; }\n\n/* ===== Center Panel: Placeholder ===== */\n.placeholder-message {\n display: flex; flex-direction: column; align-items: center;\n justify-content: center; height: 300px; color: var(--mj-text-disabled);\n}\n.placeholder-message i { font-size: 36px; margin-bottom: 12px; }\n.placeholder-message p { text-align: center; }\n\n/* ===== Pending Entity Panel ===== */\n.pending-entity-panel {\n background: var(--mj-status-warning-bg); border: 1px solid var(--mj-color-warning-200); border-radius: 10px;\n padding: 24px; text-align: center;\n}\n.pending-icon { font-size: 40px; color: var(--mj-status-warning); margin-bottom: 12px; }\n.pending-entity-panel h3 { font-size: 16px; margin-bottom: 8px; }\n.pending-entity-panel p { font-size: 13px; color: var(--mj-text-disabled); margin-bottom: 16px; line-height: 1.5; }\n\n/* Stepper */\n.pending-steps {\n display: flex; gap: 0; margin: 20px 0; justify-content: center; align-items: center;\n}\n.step {\n display: flex; flex-direction: column; align-items: center; gap: 6px;\n padding: 0 16px;\n}\n.step-circle {\n width: 36px; height: 36px; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n font-size: 14px; font-weight: 700;\n}\n.step-circle.done { background: var(--mj-status-success-bg); color: var(--mj-color-success-700); }\n.step-circle.current { background: var(--mj-color-indigo-500); color: var(--mj-bg-surface); }\n.step-circle.future { background: var(--mj-bg-surface-hover); color: var(--mj-text-disabled); }\n.step-label { font-size: 10px; font-weight: 600; color: var(--mj-text-disabled); text-transform: uppercase; white-space: nowrap; }\n.step-connector { width: 32px; height: 2px; background: var(--mj-border-default); align-self: center; margin-bottom: 18px; }\n.step-connector.done { background: var(--mj-color-success-700); }\n\n/* DDL in pending view */\n.ddl-preview-inline { margin-top: 16px; text-align: left; }\n.ddl-code-block {\n background: var(--mj-color-neutral-900); color: var(--mj-color-neutral-300); padding: 12px;\n border-radius: 6px; font-size: 12px; line-height: 1.5;\n max-height: 250px; overflow: auto; white-space: pre-wrap;\n}\n.ddl-actions { display: flex; gap: 8px; margin-top: 12px; justify-content: center; }\n\n/* Pending fields list */\n.pending-fields-section { text-align: left; }\n.pending-fields-list {\n display: flex; flex-direction: column; gap: 2px;\n max-height: 200px; overflow-y: auto;\n}\n.pending-field-item {\n display: flex; align-items: center; gap: 8px;\n padding: 4px 8px; font-size: 13px; border-radius: 4px;\n}\n.pending-field-item:hover { background: var(--mj-status-warning-bg); }\n.pending-field-name { font-weight: 600; }\n.pending-field-type { font-size: 11px; color: var(--mj-text-disabled); background: var(--mj-bg-surface-hover); padding: 1px 6px; border-radius: 3px; }\n.pending-field-req { color: var(--mj-color-error-600); font-weight: 700; }\n\n/* ===== Auto-map banner ===== */\n.auto-map-banner {\n background: var(--mj-status-info-bg); border: 1px solid var(--mj-color-info-100); border-radius: 8px;\n padding: 12px 16px; margin-bottom: 16px;\n display: flex; align-items: center; gap: 12px;\n}\n.auto-map-banner > i { color: var(--mj-color-indigo-500); font-size: 18px; }\n.auto-map-banner .banner-text { flex: 1; }\n.auto-map-banner .banner-text p { font-size: 13px; color: var(--mj-text-muted); margin: 0; }\n.auto-map-banner .banner-text strong { color: var(--mj-text-primary); }\n\n/* ===== Field Mapping Editor ===== */\n.field-mapping-header {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 16px;\n}\n.field-mapping-actions { display: flex; gap: 6px; }\n\n/* ===== Field Map Cards (New world-class design) ===== */\n.field-map-cards {\n display: flex; flex-direction: column; gap: 6px;\n}\n\n.field-map-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n.field-map-card:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 2px 8px rgba(74, 108, 247, 0.06);\n}\n.field-map-card.has-transform {\n border-left: 3px solid var(--mj-color-indigo-500);\n}\n.field-map-card.validation-error {\n border-color: var(--mj-color-warning-200);\n background: var(--mj-status-warning-bg);\n}\n\n/* Main mapping row */\n.fmc-row {\n display: flex; align-items: center; gap: 10px;\n padding: 10px 14px;\n}\n\n/* Source column */\n.fmc-source {\n flex: 1; min-width: 0;\n}\n.fmc-field-name {\n font-size: 13px; font-weight: 600; color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n}\n.fmc-badges {\n display: flex; gap: 4px; margin-top: 3px; flex-wrap: wrap;\n}\n.fmc-badge {\n font-size: 9px; font-weight: 700; padding: 1px 5px;\n border-radius: 3px; text-transform: uppercase; letter-spacing: 0.3px;\n white-space: nowrap; line-height: 1.5;\n}\n.badge-type {\n background: var(--mj-bg-surface-hover); color: var(--mj-text-muted);\n}\n.badge-pk {\n background: linear-gradient(135deg, var(--mj-color-warning-100), var(--mj-color-warning-200));\n color: var(--mj-color-warning-800);\n}\n.badge-pk i { font-size: 8px; margin-right: 2px; }\n.badge-req {\n background: linear-gradient(135deg, var(--mj-color-error-100), var(--mj-color-error-200));\n color: var(--mj-color-error-800);\n}\n.badge-ro {\n background: var(--mj-color-purple-50); color: var(--mj-color-purple-700);\n}\n\n/* Transform zone (center arrow / pill) */\n.fmc-transform-zone {\n flex-shrink: 0;\n display: flex; align-items: center; justify-content: center;\n width: 100px;\n}\n.fmc-arrow-btn {\n width: 32px; height: 32px;\n border-radius: 50%; border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-page); color: var(--mj-text-disabled);\n cursor: pointer; font-size: 12px;\n display: flex; align-items: center; justify-content: center;\n transition: all 0.2s;\n}\n.fmc-arrow-btn:hover {\n background: var(--mj-color-indigo-500); color: var(--mj-bg-surface); border-color: var(--mj-color-indigo-500);\n transform: scale(1.1);\n}\n.fmc-transform-pill {\n display: flex; align-items: center; gap: 4px;\n padding: 4px 10px; border-radius: 16px;\n background: linear-gradient(135deg, var(--mj-color-indigo-50), var(--mj-color-indigo-100));\n border: 1px solid var(--mj-color-indigo-200); color: var(--mj-color-indigo-700);\n font-size: 11px; font-weight: 600;\n cursor: pointer; transition: all 0.2s;\n white-space: nowrap;\n}\n.fmc-transform-pill:hover {\n background: linear-gradient(135deg, var(--mj-color-indigo-100), var(--mj-color-indigo-200));\n transform: scale(1.02);\n}\n.fmc-transform-pill i { font-size: 10px; }\n.fmc-transform-direct {\n background: linear-gradient(135deg, var(--mj-bg-page), var(--mj-bg-surface-hover));\n border-color: var(--mj-color-neutral-300); color: var(--mj-text-muted);\n}\n.fmc-transform-direct:hover {\n background: linear-gradient(135deg, var(--mj-color-indigo-50), var(--mj-color-indigo-100));\n border-color: var(--mj-color-indigo-200); color: var(--mj-color-indigo-700);\n}\n.fmc-step-count {\n background: var(--mj-color-indigo-700); color: var(--mj-bg-surface); font-size: 9px;\n padding: 0 4px; border-radius: 8px; font-weight: 700;\n}\n\n/* Destination column */\n.fmc-dest {\n flex: 1; min-width: 0;\n}\n.fmc-select {\n width: 100%; padding: 6px 10px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; color: var(--mj-text-primary);\n background: var(--mj-bg-page);\n transition: border-color 0.15s;\n}\n.fmc-select:focus { border-color: var(--mj-color-indigo-500); outline: none; box-shadow: 0 0 0 2px rgba(74, 108, 247, 0.12); }\n\n/* Shared input style */\n.fmc-input {\n width: 100%; padding: 5px 8px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 13px; color: var(--mj-text-primary);\n background: var(--mj-bg-page);\n transition: border-color 0.15s;\n}\n.fmc-input:focus { border-color: var(--mj-color-indigo-500); outline: none; box-shadow: 0 0 0 2px rgba(74, 108, 247, 0.12); }\n.fmc-input.mono { font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace; font-size: 12px; }\n\n/* Flags (key, required) */\n.fmc-flags {\n display: flex; gap: 6px; flex-shrink: 0;\n}\n.fmc-flag {\n display: flex; align-items: center; gap: 3px;\n font-size: 11px; color: var(--mj-text-disabled); cursor: pointer;\n padding: 2px 4px; border-radius: 4px;\n transition: color 0.15s;\n}\n.fmc-flag:hover { color: var(--mj-color-indigo-500); }\n.fmc-flag input[type=\"checkbox\"] {\n width: 13px; height: 13px; cursor: pointer;\n accent-color: var(--mj-color-indigo-500);\n}\n.fmc-flag i { font-size: 10px; }\n.fmc-req-star { font-size: 14px; font-weight: 700; color: inherit; }\n\n/* Remove button */\n.fmc-remove {\n flex-shrink: 0;\n background: none; border: none; cursor: pointer;\n color: var(--mj-color-neutral-300); font-size: 13px; padding: 4px;\n border-radius: 4px; transition: all 0.15s;\n}\n.fmc-remove:hover { color: var(--mj-status-error); background: var(--mj-status-error-bg); }\n\n/* ===== Transform Pipeline Editor ===== */\n.fmc-transform-editor {\n border-top: 1px solid var(--mj-bg-surface-hover);\n background: linear-gradient(180deg, var(--mj-color-indigo-50) 0%, var(--mj-bg-page) 100%);\n padding: 12px 14px;\n}\n.fmc-te-header {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 10px;\n}\n.fmc-te-title {\n font-size: 11px; font-weight: 700; color: var(--mj-color-indigo-500);\n text-transform: uppercase; letter-spacing: 0.5px;\n}\n.fmc-te-title i { margin-right: 4px; }\n.fmc-te-add {\n font-size: 11px; font-weight: 600; color: var(--mj-color-indigo-500);\n background: none; border: 1px solid var(--mj-color-indigo-200);\n border-radius: 6px; padding: 3px 10px;\n cursor: pointer; transition: all 0.15s;\n}\n.fmc-te-add:hover { background: var(--mj-color-indigo-50); }\n.fmc-te-add i { margin-right: 3px; font-size: 10px; }\n\n/* Individual transform step */\n.fmc-te-step {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 10px 12px;\n margin-bottom: 8px;\n transition: box-shadow 0.15s;\n}\n.fmc-te-step:hover { box-shadow: 0 1px 4px rgba(0,0,0,0.05); }\n.fmc-te-step:last-child { margin-bottom: 0; }\n\n.fmc-te-step-header {\n display: flex; align-items: center; gap: 8px; margin-bottom: 8px;\n}\n.fmc-te-step-num {\n width: 22px; height: 22px; border-radius: 50%;\n background: linear-gradient(135deg, var(--mj-color-indigo-500), var(--mj-color-indigo-500));\n color: var(--mj-bg-surface); font-size: 11px; font-weight: 700;\n display: flex; align-items: center; justify-content: center;\n flex-shrink: 0;\n}\n.fmc-te-type-select {\n flex: 1; padding: 4px 8px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary); background: var(--mj-bg-page);\n}\n.fmc-te-type-select:focus { border-color: var(--mj-color-indigo-500); outline: none; }\n.fmc-te-error-select {\n width: 100px; padding: 4px 6px; border: 1px solid var(--mj-border-default);\n border-radius: 6px; font-size: 11px; color: var(--mj-text-muted);\n background: var(--mj-bg-page);\n}\n.fmc-te-error-select:focus { border-color: var(--mj-color-indigo-500); outline: none; }\n.fmc-te-remove-step {\n background: none; border: none; cursor: pointer;\n color: var(--mj-color-neutral-300); font-size: 12px; padding: 4px;\n border-radius: 4px; transition: all 0.15s;\n}\n.fmc-te-remove-step:hover { color: var(--mj-status-error); background: var(--mj-status-error-bg); }\n\n/* Config area */\n.fmc-te-config {\n padding-left: 30px;\n}\n.fmc-te-field {\n margin-bottom: 8px;\n}\n.fmc-te-field:last-child { margin-bottom: 0; }\n.fmc-te-field label {\n display: block; font-size: 11px; font-weight: 600;\n color: var(--mj-text-muted); margin-bottom: 3px;\n}\n.fmc-te-field label code {\n background: var(--mj-bg-surface-hover); padding: 0 3px; border-radius: 3px;\n font-size: 10px; color: var(--mj-color-indigo-700);\n}\n.fmc-te-hint { font-weight: 400; color: var(--mj-text-disabled); }\n.fmc-te-row {\n display: flex; gap: 10px; align-items: flex-end;\n}\n.fmc-te-sm { max-width: 140px; }\n.fmc-textarea {\n resize: vertical; min-height: 40px;\n}\n\n/* Combine chips */\n.fmc-combine-chips {\n display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px;\n}\n.fmc-chip {\n font-size: 11px; padding: 3px 8px; border-radius: 14px;\n border: 1px solid var(--mj-border-default); background: var(--mj-bg-surface);\n color: var(--mj-text-muted); cursor: pointer;\n transition: all 0.15s; font-weight: 500;\n}\n.fmc-chip:hover { border-color: var(--mj-color-indigo-300); color: var(--mj-color-indigo-700); }\n.fmc-chip.selected {\n background: linear-gradient(135deg, var(--mj-color-indigo-50), var(--mj-color-indigo-100));\n border-color: var(--mj-color-indigo-400); color: var(--mj-color-indigo-700); font-weight: 600;\n}\n\n/* Lookup table */\n.fmc-lookup-table {\n display: flex; flex-direction: column; gap: 4px; margin-top: 4px;\n}\n.fmc-lookup-row {\n display: flex; align-items: center; gap: 6px;\n}\n.fmc-lookup-row .fmc-input { flex: 1; }\n.fmc-lookup-arrow { color: var(--mj-color-indigo-200); font-size: 10px; flex-shrink: 0; }\n.fmc-lookup-del {\n background: none; border: none; cursor: pointer;\n color: var(--mj-color-neutral-300); font-size: 11px; padding: 2px;\n transition: color 0.15s;\n}\n.fmc-lookup-del:hover { color: var(--mj-status-error); }\n.fmc-lookup-add {\n font-size: 11px; color: var(--mj-color-indigo-500); background: none;\n border: 1px dashed var(--mj-color-indigo-200); border-radius: 6px;\n padding: 4px 10px; cursor: pointer;\n transition: all 0.15s; margin-top: 2px;\n}\n.fmc-lookup-add:hover { background: var(--mj-color-indigo-50); }\n.fmc-lookup-add i { margin-right: 3px; font-size: 10px; }\n\n/* ===== Data Preview ===== */\n.data-preview-section { margin-top: 24px; border-top: 1px solid var(--mj-border-subtle); padding-top: 16px; }\n.preview-actions { display: flex; gap: 8px; margin-bottom: 12px; }\n\n.preview-panel {\n background: var(--mj-bg-page); border: 1px solid var(--mj-border-default); border-radius: 8px;\n padding: 12px; margin-bottom: 12px;\n}\n.preview-panel-header {\n display: flex; align-items: center; justify-content: space-between;\n margin-bottom: 8px;\n}\n.preview-panel-header h4 { font-size: 13px; font-weight: 600; margin: 0; }\n.preview-panel-header h4 i { margin-right: 6px; color: var(--mj-color-indigo-500); }\n\n.preview-table-wrapper { overflow-x: auto; }\n.preview-table {\n width: 100%; border-collapse: collapse; font-size: 12px;\n}\n.preview-table th {\n text-align: left; padding: 5px 8px;\n background: var(--mj-border-default); font-weight: 600; font-size: 10px;\n text-transform: uppercase; color: var(--mj-text-muted);\n border-bottom: 1px solid var(--mj-border-default); white-space: nowrap;\n}\n.preview-table td {\n padding: 4px 8px; border-bottom: 1px solid var(--mj-border-subtle);\n white-space: nowrap; max-width: 150px; overflow: hidden; text-overflow: ellipsis;\n}\n.preview-table tr:hover { background: var(--mj-status-info-bg); }\n\n/* ===== Right panel: run details ===== */\n.run-summary-card {\n background: var(--mj-bg-page); border-radius: 8px; padding: 12px;\n}\n.run-summary-row {\n display: flex; justify-content: space-between;\n padding: 4px 0; font-size: 13px;\n}\n.run-summary-row .label { color: var(--mj-text-muted); font-weight: 500; }\n.run-status {\n font-size: 11px; padding: 2px 6px; border-radius: 4px; font-weight: 600;\n}\n.status-green { background: var(--mj-status-success-bg); color: var(--mj-color-success-700); }\n.status-amber { background: var(--mj-color-warning-50); color: var(--mj-color-warning-600); }\n.status-red { background: var(--mj-status-error-bg); color: var(--mj-color-error-600); }\n\n.entity-stat-card {\n background: var(--mj-bg-page); border-radius: 6px; padding: 10px;\n margin-bottom: 8px;\n}\n.entity-stat-name { font-size: 13px; font-weight: 600; margin-bottom: 6px; }\n.entity-stat-grid { display: flex; gap: 12px; }\n.mini-stat { text-align: center; }\n.mini-val { display: block; font-size: 16px; font-weight: 600; }\n.mini-val.has-errors { color: var(--mj-color-error-600); }\n.mini-label { font-size: 10px; color: var(--mj-text-disabled); }\n\n/* ===== Validation ===== */\n.validation-banner {\n background: var(--mj-color-warning-50); border: 1px solid var(--mj-color-warning-200); border-radius: 8px;\n padding: 10px 14px; margin-bottom: 14px;\n display: flex; align-items: flex-start; gap: 10px;\n font-size: 13px; color: var(--mj-color-warning-600);\n}\n.validation-banner > i { margin-top: 2px; }\n.validation-warnings { display: flex; flex-direction: column; gap: 2px; }\n\n.field-map-card.validation-error .fmc-source {\n border-left: 3px solid var(--mj-color-warning-600);\n padding-left: 8px;\n}\n\n/* ===== Responsive ===== */\n@media (max-width: 1100px) { .right-panel { display: none; } }\n@media (max-width: 800px) { .left-panel { width: 260px; } }\n"] }]
462
2368
  }], null, null); })();
463
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MappingWorkspaceComponent, { className: "MappingWorkspaceComponent", filePath: "src/Integration/components/mapping-workspace/mapping-workspace.component.ts", lineNumber: 114 }); })();
2369
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MappingWorkspaceComponent, { className: "MappingWorkspaceComponent", filePath: "src/Integration/components/mapping-workspace/mapping-workspace.component.ts", lineNumber: 118 }); })();
464
2370
  export function LoadMappingWorkspace() {
465
2371
  // Tree-shaking prevention
466
2372
  }