@memberjunction/ng-dashboards 5.7.0 → 5.9.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 (79) 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 +5 -2
  7. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  8. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  9. package/dist/Home/home-dashboard.component.js +10 -7
  10. package/dist/Home/home-dashboard.component.js.map +1 -1
  11. package/dist/Integration/components/activity/activity.component.d.ts +96 -0
  12. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -0
  13. package/dist/Integration/components/activity/activity.component.js +961 -0
  14. package/dist/Integration/components/activity/activity.component.js.map +1 -0
  15. package/dist/Integration/components/connections/connections.component.d.ts +194 -0
  16. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -0
  17. package/dist/Integration/components/connections/connections.component.js +2368 -0
  18. package/dist/Integration/components/connections/connections.component.js.map +1 -0
  19. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +241 -0
  20. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -0
  21. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2373 -0
  22. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -0
  23. package/dist/Integration/components/overview/overview.component.d.ts +60 -0
  24. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -0
  25. package/dist/Integration/components/overview/overview.component.js +628 -0
  26. package/dist/Integration/components/overview/overview.component.js.map +1 -0
  27. package/dist/Integration/components/pipelines/pipelines.component.d.ts +203 -0
  28. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -0
  29. package/dist/Integration/components/pipelines/pipelines.component.js +2057 -0
  30. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -0
  31. package/dist/Integration/components/schedules/schedules.component.d.ts +110 -0
  32. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -0
  33. package/dist/Integration/components/schedules/schedules.component.js +842 -0
  34. package/dist/Integration/components/schedules/schedules.component.js.map +1 -0
  35. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +141 -0
  36. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -0
  37. package/dist/Integration/components/visual-editor/visual-editor.component.js +1538 -0
  38. package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -0
  39. package/dist/Integration/components/widgets/integration-card.component.d.ts +22 -0
  40. package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -0
  41. package/dist/Integration/components/widgets/integration-card.component.js +262 -0
  42. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -0
  43. package/dist/Integration/components/widgets/run-history-panel.component.d.ts +29 -0
  44. package/dist/Integration/components/widgets/run-history-panel.component.d.ts.map +1 -0
  45. package/dist/Integration/components/widgets/run-history-panel.component.js +399 -0
  46. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -0
  47. package/dist/Integration/index.d.ts +11 -0
  48. package/dist/Integration/index.d.ts.map +1 -0
  49. package/dist/Integration/index.js +20 -0
  50. package/dist/Integration/index.js.map +1 -0
  51. package/dist/Integration/integration.module.d.ts +26 -0
  52. package/dist/Integration/integration.module.d.ts.map +1 -0
  53. package/dist/Integration/integration.module.js +107 -0
  54. package/dist/Integration/integration.module.js.map +1 -0
  55. package/dist/Integration/services/integration-data.service.d.ts +268 -0
  56. package/dist/Integration/services/integration-data.service.d.ts.map +1 -0
  57. package/dist/Integration/services/integration-data.service.js +697 -0
  58. package/dist/Integration/services/integration-data.service.js.map +1 -0
  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.d.ts +2 -0
  64. package/dist/__tests__/integration-data-service.test.d.ts.map +1 -0
  65. package/dist/__tests__/integration-data-service.test.js +131 -0
  66. package/dist/__tests__/integration-data-service.test.js.map +1 -0
  67. package/dist/__tests__/mapping-validation.test.d.ts +2 -0
  68. package/dist/__tests__/mapping-validation.test.d.ts.map +1 -0
  69. package/dist/__tests__/mapping-validation.test.js +170 -0
  70. package/dist/__tests__/mapping-validation.test.js.map +1 -0
  71. package/dist/module.d.ts +2 -1
  72. package/dist/module.d.ts.map +1 -1
  73. package/dist/module.js +17 -6
  74. package/dist/module.js.map +1 -1
  75. package/dist/public-api.d.ts +2 -1
  76. package/dist/public-api.d.ts.map +1 -1
  77. package/dist/public-api.js +3 -1
  78. package/dist/public-api.js.map +1 -1
  79. package/package.json +42 -39
@@ -0,0 +1,2373 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { ChangeDetectorRef, Component, inject } from '@angular/core';
8
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
9
+ import { Metadata } from '@memberjunction/core';
10
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
11
+ import { IntegrationEngineBase } from '@memberjunction/integration-engine-base';
12
+ import { IntegrationDataService } from '../../services/integration-data.service';
13
+ import * as i0 from "@angular/core";
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";
19
+ import * as i6 from "@memberjunction/ng-shared-generic";
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..." });
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;
28
+ function MappingWorkspaceComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelement(0, "mj-loading", 3);
30
+ } }
31
+ function MappingWorkspaceComponent_Conditional_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵelement(0, "mj-loading", 9);
33
+ } }
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); });
272
+ i0.ɵɵelementEnd()();
273
+ } if (rf & 2) {
274
+ const ctx_r1 = i0.ɵɵnextContext(3);
275
+ i0.ɵɵadvance();
276
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.EntityMapSearchText);
277
+ } }
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()();
286
+ } }
287
+ function MappingWorkspaceComponent_Conditional_6_Conditional_7_Conditional_10_Template(rf, ctx) { if (rf & 1) {
288
+ i0.ɵɵelementStart(0, "p", 15);
289
+ i0.ɵɵtext(1);
290
+ i0.ɵɵelementEnd();
291
+ } if (rf & 2) {
292
+ const ctx_r1 = i0.ɵɵnextContext(3);
293
+ i0.ɵɵadvance();
294
+ i0.ɵɵtextInterpolate1("No matches for \"", ctx_r1.EntityMapSearchText, "\".");
295
+ } }
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);
317
+ i0.ɵɵtext(3);
318
+ i0.ɵɵelementEnd();
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);
1117
+ i0.ɵɵelementEnd();
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);
1126
+ i0.ɵɵelementEnd()();
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);
1129
+ i0.ɵɵelementEnd()()();
1130
+ } if (rf & 2) {
1131
+ const ctx_r1 = i0.ɵɵnextContext(4);
1132
+ i0.ɵɵadvance(4);
1133
+ i0.ɵɵrepeater(ctx_r1.GetPreviewColumns(ctx_r1.SourcePreviewData));
1134
+ i0.ɵɵadvance(3);
1135
+ i0.ɵɵrepeater(ctx_r1.SourcePreviewData);
1136
+ } }
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);
1148
+ i0.ɵɵelementEnd();
1149
+ } if (rf & 2) {
1150
+ const ctx_r1 = i0.ɵɵnextContext(3);
1151
+ i0.ɵɵadvance(7);
1152
+ i0.ɵɵconditional(ctx_r1.IsLoadingSourcePreview ? 7 : ctx_r1.SourcePreviewData.length === 0 ? 8 : 9);
1153
+ } }
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.");
1160
+ i0.ɵɵelementEnd();
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);
1165
+ i0.ɵɵelementEnd();
1166
+ } if (rf & 2) {
1167
+ const col_r52 = ctx.$implicit;
1168
+ i0.ɵɵadvance();
1169
+ i0.ɵɵtextInterpolate(col_r52);
1170
+ } }
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");
1173
+ i0.ɵɵtext(1);
1174
+ i0.ɵɵelementEnd();
1175
+ } if (rf & 2) {
1176
+ const col_r53 = ctx.$implicit;
1177
+ const row_r54 = i0.ɵɵnextContext().$implicit;
1178
+ const ctx_r1 = i0.ɵɵnextContext(5);
1179
+ i0.ɵɵadvance();
1180
+ i0.ɵɵtextInterpolate(ctx_r1.FormatPreviewValue(row_r54[col_r53]));
1181
+ } }
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));
1190
+ } }
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()()();
1198
+ } if (rf & 2) {
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);
1204
+ } }
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);
1216
+ i0.ɵɵelementEnd();
1217
+ } if (rf & 2) {
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);
1221
+ } }
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);
1230
+ i0.ɵɵelementEnd()();
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 ");
1235
+ i0.ɵɵelementEnd();
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 ");
1250
+ i0.ɵɵelementEnd();
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 ");
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();
1259
+ } if (rf & 2) {
1260
+ const ctx_r1 = i0.ɵɵnextContext(2);
1261
+ i0.ɵɵconditional(ctx_r1.ShowAutoMapBanner ? 0 : -1);
1262
+ i0.ɵɵadvance();
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, ")");
1266
+ i0.ɵɵadvance(2);
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);
1274
+ i0.ɵɵadvance(2);
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);
1284
+ } }
1285
+ function MappingWorkspaceComponent_Conditional_6_Conditional_16_Template(rf, ctx) { if (rf & 1) {
1286
+ i0.ɵɵelementStart(0, "p", 15);
1287
+ i0.ɵɵtext(1, "Select an integration to see run details.");
1288
+ i0.ɵɵelementEnd();
1289
+ } }
1290
+ function MappingWorkspaceComponent_Conditional_6_Conditional_17_Template(rf, ctx) { if (rf & 1) {
1291
+ i0.ɵɵelement(0, "mj-loading", 16);
1292
+ } }
1293
+ function MappingWorkspaceComponent_Conditional_6_Conditional_18_Template(rf, ctx) { if (rf & 1) {
1294
+ i0.ɵɵelementStart(0, "p", 15);
1295
+ i0.ɵɵtext(1, "No runs found.");
1296
+ i0.ɵɵelementEnd();
1297
+ } }
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);
1300
+ i0.ɵɵtext(2);
1301
+ i0.ɵɵelementEnd();
1302
+ i0.ɵɵelementStart(3, "div", 203)(4, "div", 204)(5, "span", 205);
1303
+ i0.ɵɵtext(6);
1304
+ i0.ɵɵelementEnd();
1305
+ i0.ɵɵelementStart(7, "span", 206);
1306
+ i0.ɵɵtext(8, "Created");
1307
+ i0.ɵɵelementEnd()();
1308
+ i0.ɵɵelementStart(9, "div", 204)(10, "span", 205);
1309
+ i0.ɵɵtext(11);
1310
+ i0.ɵɵelementEnd();
1311
+ i0.ɵɵelementStart(12, "span", 206);
1312
+ i0.ɵɵtext(13, "Updated");
1313
+ i0.ɵɵelementEnd()();
1314
+ i0.ɵɵelementStart(14, "div", 204)(15, "span", 205);
1315
+ i0.ɵɵtext(16);
1316
+ i0.ɵɵelementEnd();
1317
+ i0.ɵɵelementStart(17, "span", 206);
1318
+ i0.ɵɵtext(18, "Errors");
1319
+ i0.ɵɵelementEnd()()()();
1320
+ } if (rf & 2) {
1321
+ const detail_r55 = ctx.$implicit;
1322
+ i0.ɵɵadvance(2);
1323
+ i0.ɵɵtextInterpolate(detail_r55.Entity);
1324
+ i0.ɵɵadvance(4);
1325
+ i0.ɵɵtextInterpolate(detail_r55.RecordsCreated);
1326
+ i0.ɵɵadvance(5);
1327
+ i0.ɵɵtextInterpolate(detail_r55.RecordsUpdated);
1328
+ i0.ɵɵadvance(4);
1329
+ i0.ɵɵclassProp("has-errors", detail_r55.RecordsErrored > 0);
1330
+ i0.ɵɵadvance();
1331
+ i0.ɵɵtextInterpolate1(" ", detail_r55.RecordsErrored, " ");
1332
+ } }
1333
+ function MappingWorkspaceComponent_Conditional_6_Conditional_19_Conditional_22_Template(rf, ctx) { if (rf & 1) {
1334
+ i0.ɵɵelementStart(0, "h4", 200);
1335
+ i0.ɵɵtext(1, "Per-Entity Stats");
1336
+ i0.ɵɵelementEnd();
1337
+ i0.ɵɵrepeaterCreate(2, MappingWorkspaceComponent_Conditional_6_Conditional_19_Conditional_22_For_3_Template, 19, 6, "div", 201, _forTrack3);
1338
+ } if (rf & 2) {
1339
+ const ctx_r1 = i0.ɵɵnextContext(3);
1340
+ i0.ɵɵadvance(2);
1341
+ i0.ɵɵrepeater(ctx_r1.RunEntityDetails);
1342
+ } }
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);
1345
+ i0.ɵɵtext(3, "Status");
1346
+ i0.ɵɵelementEnd();
1347
+ i0.ɵɵelementStart(4, "span", 199);
1348
+ i0.ɵɵtext(5);
1349
+ i0.ɵɵelementEnd()();
1350
+ i0.ɵɵelementStart(6, "div", 197)(7, "span", 198);
1351
+ i0.ɵɵtext(8, "Started");
1352
+ i0.ɵɵelementEnd();
1353
+ i0.ɵɵelementStart(9, "span");
1354
+ i0.ɵɵtext(10);
1355
+ i0.ɵɵelementEnd()();
1356
+ i0.ɵɵelementStart(11, "div", 197)(12, "span", 198);
1357
+ i0.ɵɵtext(13, "Total Records");
1358
+ i0.ɵɵelementEnd();
1359
+ i0.ɵɵelementStart(14, "span");
1360
+ i0.ɵɵtext(15);
1361
+ i0.ɵɵpipe(16, "number");
1362
+ i0.ɵɵelementEnd()();
1363
+ i0.ɵɵelementStart(17, "div", 197)(18, "span", 198);
1364
+ i0.ɵɵtext(19, "Run By");
1365
+ i0.ɵɵelementEnd();
1366
+ i0.ɵɵelementStart(20, "span");
1367
+ i0.ɵɵtext(21);
1368
+ i0.ɵɵelementEnd()()();
1369
+ i0.ɵɵconditionalCreate(22, MappingWorkspaceComponent_Conditional_6_Conditional_19_Conditional_22_Template, 4, 0);
1370
+ } if (rf & 2) {
1371
+ const ctx_r1 = i0.ɵɵnextContext(2);
1372
+ i0.ɵɵadvance(4);
1373
+ i0.ɵɵclassMap("status-" + ctx_r1.RunStatusColor);
1374
+ i0.ɵɵadvance();
1375
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.LatestRun.Status, " ");
1376
+ i0.ɵɵadvance(5);
1377
+ i0.ɵɵtextInterpolate(ctx_r1.FormatDate(ctx_r1.LatestRun.StartedAt));
1378
+ i0.ɵɵadvance(5);
1379
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(16, 7, ctx_r1.LatestRun.TotalRecords));
1380
+ i0.ɵɵadvance(6);
1381
+ i0.ɵɵtextInterpolate(ctx_r1.LatestRun.RunByUser);
1382
+ i0.ɵɵadvance();
1383
+ i0.ɵɵconditional(ctx_r1.RunEntityDetails.length > 0 ? 22 : -1);
1384
+ } }
1385
+ function MappingWorkspaceComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
1386
+ const _r1 = i0.ɵɵgetCurrentView();
1387
+ i0.ɵɵelementStart(0, "div", 4)(1, "div", 5)(2, "div", 6)(3, "label", 7);
1388
+ i0.ɵɵtext(4, "Integration");
1389
+ i0.ɵɵelementEnd();
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)); });
1393
+ i0.ɵɵelementEnd()();
1394
+ i0.ɵɵconditionalCreate(6, MappingWorkspaceComponent_Conditional_6_Conditional_6_Template, 1, 0, "mj-loading", 9)(7, MappingWorkspaceComponent_Conditional_6_Conditional_7_Template, 12, 5);
1395
+ 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()();
1404
+ } if (rf & 2) {
1405
+ const ctx_r1 = i0.ɵɵnextContext();
1406
+ i0.ɵɵadvance(5);
1407
+ i0.ɵɵproperty("data", ctx_r1.Integrations)("textField", "Name")("valueField", "ID")("valuePrimitive", true);
1408
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedIntegrationID);
1409
+ i0.ɵɵproperty("defaultItem", i0.ɵɵpureFunction0(9, _c0));
1410
+ i0.ɵɵadvance();
1411
+ i0.ɵɵconditional(ctx_r1.IsLoadingEntityMaps ? 6 : ctx_r1.SelectedIntegrationID ? 7 : -1);
1412
+ i0.ɵɵadvance(3);
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);
1416
+ } }
1417
+ // ---------------------------------------------------------------------------
1418
+ // Component
1419
+ // ---------------------------------------------------------------------------
1420
+ let MappingWorkspaceComponent = class MappingWorkspaceComponent extends BaseResourceComponent {
1421
+ // --- Core data ---
1422
+ Integrations = [];
1423
+ EntityMaps = [];
1424
+ FieldMaps = [];
1425
+ RunEntityDetails = [];
1426
+ LatestRun = null;
1427
+ // --- Selection ---
1428
+ SelectedIntegrationID = '';
1429
+ SelectedMapID = null;
1430
+ EntityMapSearchText = '';
1431
+ // --- Loading ---
1432
+ IsLoadingIntegrations = false;
1433
+ IsLoadingEntityMaps = false;
1434
+ IsLoadingFieldMaps = false;
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;
1479
+ dataService = inject(IntegrationDataService);
1480
+ cdr = inject(ChangeDetectorRef);
1481
+ discoverCache = new Map();
1482
+ pendingCounter = 0;
1483
+ async ngOnInit() {
1484
+ await this.LoadIntegrations();
1485
+ }
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;
1515
+ if (!this.EntityMapSearchText.trim())
1516
+ return all;
1517
+ const search = this.EntityMapSearchText.toLowerCase();
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();
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
+ // =====================================================================
1565
+ async LoadIntegrations() {
1566
+ this.IsLoadingIntegrations = true;
1567
+ this.cdr.detectChanges();
1568
+ try {
1569
+ const summaries = await this.dataService.LoadIntegrationSummaries(this.RunViewToUse);
1570
+ this.Integrations = summaries.map(s => s.Integration);
1571
+ }
1572
+ finally {
1573
+ this.IsLoadingIntegrations = false;
1574
+ this.cdr.detectChanges();
1575
+ }
1576
+ }
1577
+ async OnIntegrationChange(integrationID) {
1578
+ this.SelectedIntegrationID = integrationID;
1579
+ this.SelectedMapID = null;
1580
+ this.FieldMaps = [];
1581
+ this.EditableFields = [];
1582
+ this.DestinationFields = [];
1583
+ this.RunEntityDetails = [];
1584
+ this.LatestRun = null;
1585
+ this.EntityMapSearchText = '';
1586
+ this.CloseAddPanel();
1587
+ this.CloseAllPreviews();
1588
+ if (!integrationID)
1589
+ return;
1590
+ // Load entity maps + latest run in parallel, and auto-discover source objects
1591
+ await Promise.all([
1592
+ this.LoadEntityMapsForIntegration(integrationID),
1593
+ this.LoadLatestRunForIntegration(integrationID),
1594
+ this.DiscoverSourceObjects(integrationID)
1595
+ ]);
1596
+ }
1597
+ async LoadEntityMapsForIntegration(integrationID) {
1598
+ this.IsLoadingEntityMaps = true;
1599
+ this.cdr.detectChanges();
1600
+ try {
1601
+ this.EntityMaps = await this.dataService.LoadEntityMaps(integrationID, this.RunViewToUse);
1602
+ }
1603
+ finally {
1604
+ this.IsLoadingEntityMaps = false;
1605
+ this.cdr.detectChanges();
1606
+ }
1607
+ }
1608
+ async LoadLatestRunForIntegration(integrationID) {
1609
+ this.IsLoadingRunDetails = true;
1610
+ this.cdr.detectChanges();
1611
+ try {
1612
+ const runs = await this.dataService.LoadRunHistory(integrationID, 1, this.RunViewToUse);
1613
+ this.LatestRun = runs.length > 0 ? runs[0] : null;
1614
+ if (this.LatestRun) {
1615
+ this.RunEntityDetails = await this.dataService.LoadRunDetails(this.LatestRun.ID, this.RunViewToUse);
1616
+ }
1617
+ }
1618
+ finally {
1619
+ this.IsLoadingRunDetails = false;
1620
+ this.cdr.detectChanges();
1621
+ }
1622
+ }
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
1674
+ this.IsLoadingFieldMaps = true;
1675
+ this.cdr.detectChanges();
1676
+ try {
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));
1684
+ }
1685
+ finally {
1686
+ this.IsLoadingFieldMaps = false;
1687
+ this.cdr.detectChanges();
1688
+ }
1689
+ }
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
+ });
2310
+ }
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';
2321
+ }
2322
+ // =====================================================================
2323
+ // Helpers
2324
+ // =====================================================================
2325
+ get RunStatusColor() {
2326
+ if (!this.LatestRun)
2327
+ return 'gray';
2328
+ if (this.LatestRun.Status === 'Success')
2329
+ return 'green';
2330
+ if (this.LatestRun.Status === 'Failed')
2331
+ return 'red';
2332
+ return 'amber';
2333
+ }
2334
+ FormatDate(dateStr) {
2335
+ if (!dateStr)
2336
+ return '--';
2337
+ return new Date(dateStr).toLocaleString(undefined, {
2338
+ month: 'short', day: 'numeric',
2339
+ hour: '2-digit', minute: '2-digit'
2340
+ });
2341
+ }
2342
+ async GetResourceDisplayName(_data) {
2343
+ return 'Mapping Workspace';
2344
+ }
2345
+ async GetResourceIconClass(_data) {
2346
+ return 'fa-solid fa-diagram-project';
2347
+ }
2348
+ static ɵfac = /*@__PURE__*/ (() => { let ɵMappingWorkspaceComponent_BaseFactory; return function MappingWorkspaceComponent_Factory(__ngFactoryType__) { return (ɵMappingWorkspaceComponent_BaseFactory || (ɵMappingWorkspaceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MappingWorkspaceComponent)))(__ngFactoryType__ || MappingWorkspaceComponent); }; })();
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) {
2350
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h2");
2351
+ i0.ɵɵelement(3, "i", 2);
2352
+ i0.ɵɵtext(4, " Mapping Workspace");
2353
+ i0.ɵɵelementEnd()();
2354
+ i0.ɵɵconditionalCreate(5, MappingWorkspaceComponent_Conditional_5_Template, 1, 0, "mj-loading", 3)(6, MappingWorkspaceComponent_Conditional_6_Template, 20, 10, "div", 4);
2355
+ i0.ɵɵelementEnd();
2356
+ } if (rf & 2) {
2357
+ i0.ɵɵadvance(5);
2358
+ i0.ɵɵconditional(ctx.IsLoadingIntegrations ? 5 : 6);
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; } }"] });
2360
+ };
2361
+ MappingWorkspaceComponent = __decorate([
2362
+ RegisterClass(BaseResourceComponent, 'IntegrationMappingWorkspace')
2363
+ ], MappingWorkspaceComponent);
2364
+ export { MappingWorkspaceComponent };
2365
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MappingWorkspaceComponent, [{
2366
+ type: Component,
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"] }]
2368
+ }], null, null); })();
2369
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MappingWorkspaceComponent, { className: "MappingWorkspaceComponent", filePath: "src/Integration/components/mapping-workspace/mapping-workspace.component.ts", lineNumber: 119 }); })();
2370
+ export function LoadMappingWorkspace() {
2371
+ // Tree-shaking prevention
2372
+ }
2373
+ //# sourceMappingURL=mapping-workspace.component.js.map