@memberjunction/ng-dashboards 5.11.0 → 5.13.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 (229) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -2
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +586 -223
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +2 -2
  6. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
  7. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
  8. package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
  9. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  10. package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
  11. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
  12. package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
  13. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
  14. package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
  15. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
  16. package/dist/AI/components/charts/time-series-chart.component.js +23 -8
  17. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
  18. package/dist/AI/components/execution-monitoring.component.js +2 -2
  19. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  20. package/dist/AI/components/models/model-management.component.js +2 -2
  21. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
  22. package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
  23. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  24. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
  26. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
  27. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
  28. package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
  29. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
  30. package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
  31. package/dist/AI/components/system/system-configuration.component.js +2 -2
  32. package/dist/AI/components/widgets/kpi-card.component.js +7 -7
  33. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
  34. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
  35. package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
  36. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
  37. package/dist/AI/index.d.ts +1 -0
  38. package/dist/AI/index.d.ts.map +1 -1
  39. package/dist/AI/index.js +2 -0
  40. package/dist/AI/index.js.map +1 -1
  41. package/dist/APIKeys/api-applications-panel.component.js +3 -3
  42. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  43. package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
  44. package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
  45. package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
  46. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  47. package/dist/APIKeys/api-key-list.component.js +3 -3
  48. package/dist/APIKeys/api-key-list.component.js.map +1 -1
  49. package/dist/APIKeys/api-keys-resource.component.js +1 -1
  50. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  51. package/dist/APIKeys/api-scopes-panel.component.js +2 -2
  52. package/dist/APIKeys/api-usage-panel.component.js +2 -2
  53. package/dist/Actions/components/actions-overview.component.js +2 -2
  54. package/dist/Actions/components/execution-monitoring.component.js +2 -2
  55. package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
  56. package/dist/Actions/components/explorer/action-card.component.js +2 -2
  57. package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
  58. package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
  59. package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
  60. package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
  61. package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
  62. package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
  63. package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
  64. package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
  65. package/dist/Communication/communication-dashboard.component.js +2 -2
  66. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  67. package/dist/Communication/communication-logs-resource.component.js +3 -3
  68. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  69. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  70. package/dist/Communication/communication-monitor-resource.component.js +5 -5
  71. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  72. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  73. package/dist/Communication/communication-providers-resource.component.js +3 -3
  74. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  75. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  76. package/dist/Communication/communication-runs-resource.component.js +3 -3
  77. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  78. package/dist/Communication/communication-templates-resource.component.js +2 -2
  79. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  80. package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
  81. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
  82. package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
  83. package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
  84. package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
  85. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
  86. package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
  87. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
  88. package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
  89. package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
  90. package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
  91. package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
  92. package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
  93. package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
  94. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
  95. package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
  96. package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
  97. package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
  98. package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
  99. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
  100. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  101. package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
  102. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
  107. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
  109. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
  111. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  112. package/dist/Credentials/credentials-dashboard.component.js +2 -2
  113. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
  114. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
  115. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  116. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
  117. package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
  118. package/dist/DataExplorer/data-explorer-dashboard.component.js +4 -4
  119. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  120. package/dist/Home/home-dashboard.component.js +2 -2
  121. package/dist/Integration/components/activity/activity.component.d.ts +1 -1
  122. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  123. package/dist/Integration/components/activity/activity.component.js +5 -5
  124. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  125. package/dist/Integration/components/connections/connections.component.d.ts +31 -2
  126. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  127. package/dist/Integration/components/connections/connections.component.js +753 -412
  128. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  129. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
  130. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  131. package/dist/Integration/components/overview/overview.component.d.ts +0 -1
  132. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  133. package/dist/Integration/components/overview/overview.component.js +3 -6
  134. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  135. package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
  136. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  137. package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
  138. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  139. package/dist/Integration/components/schedules/schedules.component.js +97 -5
  140. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  141. package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
  142. package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
  143. package/dist/Integration/components/widgets/integration-card.component.js +5 -1
  144. package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
  145. package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
  146. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  147. package/dist/Integration/integration.module.d.ts +2 -1
  148. package/dist/Integration/integration.module.d.ts.map +1 -1
  149. package/dist/Integration/integration.module.js +7 -3
  150. package/dist/Integration/integration.module.js.map +1 -1
  151. package/dist/Integration/services/integration-data.service.d.ts +27 -2
  152. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  153. package/dist/Integration/services/integration-data.service.js +107 -4
  154. package/dist/Integration/services/integration-data.service.js.map +1 -1
  155. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  156. package/dist/Lists/components/lists-browse-resource.component.js +25 -24
  157. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  158. package/dist/Lists/components/lists-categories-resource.component.js +2 -2
  159. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  160. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  161. package/dist/Lists/components/lists-my-lists-resource.component.js +26 -25
  162. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  163. package/dist/Lists/components/lists-operations-resource.component.js +2 -2
  164. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  165. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
  166. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  167. package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
  168. package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
  169. package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
  170. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  171. package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
  172. package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
  173. package/dist/MCP/mcp-dashboard.component.js +2 -2
  174. package/dist/MCP/mcp-filter-panel.component.js +2 -2
  175. package/dist/QueryBrowser/query-browser-resource.component.js +7 -7
  176. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  177. package/dist/Scheduling/components/index.d.ts +0 -1
  178. package/dist/Scheduling/components/index.d.ts.map +1 -1
  179. package/dist/Scheduling/components/index.js +0 -1
  180. package/dist/Scheduling/components/index.js.map +1 -1
  181. package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
  182. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
  183. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  184. package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
  185. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  186. package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
  187. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  188. package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
  189. package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
  190. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  191. package/dist/Testing/components/testing-analytics.component.js +2 -2
  192. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  193. package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
  194. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  195. package/dist/Testing/components/testing-explorer.component.js +2 -2
  196. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  197. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  198. package/dist/Testing/components/testing-review.component.js +5 -5
  199. package/dist/Testing/components/testing-review.component.js.map +1 -1
  200. package/dist/Testing/components/testing-runs.component.js +2 -2
  201. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  202. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
  203. package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
  204. package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
  205. package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
  206. package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
  207. package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
  208. package/dist/Testing/testing-dashboard.component.js +2 -2
  209. package/dist/VersionHistory/components/diff-resource.component.js +2 -2
  210. package/dist/VersionHistory/components/graph-resource.component.js +2 -2
  211. package/dist/VersionHistory/components/labels-resource.component.js +3 -3
  212. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  213. package/dist/VersionHistory/components/restore-resource.component.js +3 -3
  214. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  215. package/dist/__tests__/integration-data-service.test.js +1 -0
  216. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  217. package/dist/module.d.ts +52 -49
  218. package/dist/module.d.ts.map +1 -1
  219. package/dist/module.js +25 -6
  220. package/dist/module.js.map +1 -1
  221. package/dist/public-api.d.ts +1 -1
  222. package/dist/public-api.d.ts.map +1 -1
  223. package/dist/public-api.js +1 -1
  224. package/dist/public-api.js.map +1 -1
  225. package/package.json +42 -40
  226. package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
  227. package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
  228. package/dist/Scheduling/components/job-slideout.component.js +0 -459
  229. package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"mapping-workspace.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/mapping-workspace/mapping-workspace.component.ts","../../../../src/Integration/components/mapping-workspace/mapping-workspace.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { Metadata } from '@memberjunction/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJIntegrationObjectFieldEntity, MJCompanyIntegrationEntity } from '@memberjunction/core-entities';\nimport { IntegrationEngineBase } from '@memberjunction/integration-engine-base';\nimport {\n IntegrationDataService,\n IntegrationRunRow,\n EntityMapRow,\n FieldMapRow,\n RunDetailRow\n} from '../../services/integration-data.service';\n\n// ---------------------------------------------------------------------------\n// Interfaces\n// ---------------------------------------------------------------------------\n\n/** Source object from integration metadata */\ninterface DiscoveredObject {\n Name: string;\n Label: string;\n Category: string;\n Description: string;\n SupportsIncrementalSync: boolean;\n SupportsWrite: boolean;\n}\n\n/** Target MJ entity for the picker */\ninterface MJEntityOption {\n ID: string;\n Name: string;\n}\n\n/** MJ entity field for field mapping destination picker */\ninterface MJFieldOption {\n ID: string;\n Name: string;\n Type: string;\n IsRequired: boolean;\n}\n\n/** Transform type for the pipeline builder */\ntype TransformType = 'direct' | 'regex' | 'split' | 'combine' | 'lookup' | 'format' | 'coerce' | 'substring' | 'custom';\n\n/** A single step in a transform pipeline */\ninterface TransformStepUI {\n Type: TransformType;\n Config: Record<string, unknown>;\n OnError: 'Skip' | 'Null' | 'Fail';\n}\n\n/** Editable field map row used in the center panel */\ninterface EditableFieldMap {\n ID: string | null;\n SourceFieldName: string;\n SourceFieldLabel: string;\n SourceFieldType: string;\n DestinationFieldName: string;\n DestinationFieldLabel: string;\n IsKeyField: boolean;\n IsRequired: boolean;\n Direction: 'Both' | 'DestToSource' | 'SourceToDest';\n Status: 'Active' | 'Inactive';\n IsNew: boolean;\n IsDirty: boolean;\n // Source metadata (from connector discovery)\n IsSourcePK: boolean;\n IsSourceRequired: boolean;\n IsSourceReadOnly: boolean;\n // Transform pipeline\n TransformPipeline: TransformStepUI[];\n ShowTransformEditor: boolean;\n}\n\n/** Pending entity map — entity hasn't been created yet */\ninterface PendingMapEntry {\n LocalID: string;\n SourceObjectName: string;\n SourceObjectLabel: string;\n SchemaName: string;\n TableName: string;\n EntityName: string;\n SyncDirection: 'Bidirectional' | 'Pull' | 'Push';\n SourceFields: MJIntegrationObjectFieldEntity[];\n DDLContent: string;\n CreatedAt: Date;\n}\n\n/** Combined list item for left panel — merges real and pending maps */\ninterface MapListItem {\n ID: string;\n SourceName: string;\n TargetName: string;\n SyncDirection: string;\n SyncEnabled: boolean;\n IsPending: boolean;\n RealMap: EntityMapRow | null;\n PendingMap: PendingMapEntry | null;\n}\n\ntype TargetMode = 'existing' | 'new';\n\n/** Data preview row — key/value record */\ntype PreviewRecord = Record<string, string | number | boolean | null>;\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@RegisterClass(BaseResourceComponent, 'IntegrationMappingWorkspace')\n@Component({\n standalone: false,\n selector: 'app-mapping-workspace',\n templateUrl: './mapping-workspace.component.html',\n styleUrls: ['./mapping-workspace.component.css']\n})\nexport class MappingWorkspaceComponent extends BaseResourceComponent implements OnInit {\n\n // --- Core data ---\n Integrations: MJCompanyIntegrationEntity[] = [];\n EntityMaps: EntityMapRow[] = [];\n FieldMaps: FieldMapRow[] = [];\n RunEntityDetails: RunDetailRow[] = [];\n LatestRun: IntegrationRunRow | null = null;\n\n // --- Selection ---\n SelectedIntegrationID = '';\n SelectedMapID: string | null = null;\n EntityMapSearchText = '';\n\n // --- Loading ---\n IsLoadingIntegrations = false;\n IsLoadingEntityMaps = false;\n IsLoadingFieldMaps = false;\n IsLoadingRunDetails = false;\n\n // --- Add Map flow ---\n ShowAddPanel = false;\n TargetMode: TargetMode = 'existing';\n\n // Source objects from discovery\n DiscoveredObjects: DiscoveredObject[] = [];\n IsDiscoveringObjects = false;\n DiscoverError = '';\n SelectedSourceObjectName = '';\n\n // Target: existing entity\n MJEntities: MJEntityOption[] = [];\n IsLoadingEntities = false;\n SelectedEntityID: string | null = null;\n\n // Target: new entity\n NewEntitySchemaName = '';\n NewEntityTableName = '';\n NewEntityName = '';\n DBSchemas: string[] = [];\n\n // Sync direction for add flow\n AddSyncDirection: 'Bidirectional' | 'Pull' | 'Push' = 'Pull';\n IsSavingEntityMap = false;\n\n // --- Pending entity maps (local state) ---\n PendingMaps: PendingMapEntry[] = [];\n\n // --- DDL preview ---\n IsGeneratingDDL = false;\n DDLPreviewContent = '';\n DDLPreviewError = '';\n\n // --- Field mapping editing ---\n EditableFields: EditableFieldMap[] = [];\n DestinationFields: MJFieldOption[] = [];\n IsLoadingDestFields = false;\n IsSavingFields = false;\n AutoMapCount = 0;\n ShowAutoMapBanner = false;\n\n // --- Source fields for auto-mapping ---\n SourceFields: MJIntegrationObjectFieldEntity[] = [];\n IsLoadingSourceFields = false;\n\n // --- Data preview ---\n SourcePreviewData: PreviewRecord[] = [];\n DestPreviewData: PreviewRecord[] = [];\n IsLoadingSourcePreview = false;\n IsLoadingDestPreview = false;\n ShowSourcePreview = false;\n ShowDestPreview = false;\n\n private dataService = inject(IntegrationDataService);\n private cdr = inject(ChangeDetectorRef);\n private discoverCache = new Map<string, DiscoveredObject[]>();\n private pendingCounter = 0;\n\n async ngOnInit(): Promise<void> {\n await this.LoadIntegrations();\n }\n\n // =====================================================================\n // Computed Properties\n // =====================================================================\n\n /** Merged list of real entity maps + pending maps, for the left panel */\n get AllMaps(): MapListItem[] {\n const realItems: MapListItem[] = this.EntityMaps.map(em => ({\n ID: em.ID,\n SourceName: em.ExternalObjectName,\n TargetName: em.Entity,\n SyncDirection: em.SyncDirection,\n SyncEnabled: em.SyncEnabled,\n IsPending: false,\n RealMap: em,\n PendingMap: null\n }));\n\n const pendingItems: MapListItem[] = this.PendingMaps.map(pm => ({\n ID: pm.LocalID,\n SourceName: pm.SourceObjectName,\n TargetName: pm.EntityName,\n SyncDirection: pm.SyncDirection,\n SyncEnabled: false,\n IsPending: true,\n RealMap: null,\n PendingMap: pm\n }));\n\n return [...realItems, ...pendingItems];\n }\n\n get FilteredMaps(): MapListItem[] {\n const all = this.AllMaps;\n if (!this.EntityMapSearchText.trim()) return all;\n const search = this.EntityMapSearchText.toLowerCase();\n return all.filter(\n m => m.SourceName.toLowerCase().includes(search)\n || m.TargetName.toLowerCase().includes(search)\n );\n }\n\n get SelectedMap(): MapListItem | null {\n if (!this.SelectedMapID) return null;\n return this.AllMaps.find(m => UUIDsEqual(m.ID, this.SelectedMapID)) ?? null;\n }\n\n get SelectedEntityMap(): EntityMapRow | null {\n const map = this.SelectedMap;\n return map?.RealMap ?? null;\n }\n\n get SelectedPendingMap(): PendingMapEntry | null {\n const map = this.SelectedMap;\n return map?.PendingMap ?? null;\n }\n\n get HasDirtyFields(): boolean {\n return this.EditableFields.some(f => f.IsDirty || f.IsNew);\n }\n\n get ActiveEditableFields(): EditableFieldMap[] {\n return this.EditableFields.filter(f => f.Status !== 'Inactive');\n }\n\n get IsAddFormValid(): boolean {\n if (!this.SelectedSourceObjectName) return false;\n if (this.TargetMode === 'existing') return !!this.SelectedEntityID;\n return !!this.NewEntitySchemaName.trim() && !!this.NewEntityTableName.trim() && !!this.NewEntityName.trim();\n }\n\n /** Auto-suggest table/entity names from selected source object */\n get SuggestedTableName(): string {\n if (!this.SelectedSourceObjectName) return '';\n return this.SelectedSourceObjectName.replace(/[^A-Za-z0-9_]/g, '_');\n }\n\n get SuggestedEntityName(): string {\n if (!this.SelectedSourceObjectName) return '';\n const obj = this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName);\n const label = obj?.Label || this.SelectedSourceObjectName;\n if (this.NewEntitySchemaName) return `${this.NewEntitySchemaName} ${label}`;\n return label;\n }\n\n // =====================================================================\n // Data Loading\n // =====================================================================\n\n async LoadIntegrations(): Promise<void> {\n this.IsLoadingIntegrations = true;\n this.cdr.detectChanges();\n try {\n const summaries = await this.dataService.LoadIntegrationSummaries(this.RunViewToUse);\n this.Integrations = summaries.map(s => s.Integration);\n } finally {\n this.IsLoadingIntegrations = false;\n this.cdr.detectChanges();\n }\n }\n\n async OnIntegrationChange(integrationID: string): Promise<void> {\n this.SelectedIntegrationID = integrationID;\n this.SelectedMapID = null;\n this.FieldMaps = [];\n this.EditableFields = [];\n this.DestinationFields = [];\n this.RunEntityDetails = [];\n this.LatestRun = null;\n this.EntityMapSearchText = '';\n this.CloseAddPanel();\n this.CloseAllPreviews();\n\n if (!integrationID) return;\n\n // Load entity maps + latest run in parallel, and auto-discover source objects\n await Promise.all([\n this.LoadEntityMapsForIntegration(integrationID),\n this.LoadLatestRunForIntegration(integrationID),\n this.DiscoverSourceObjects(integrationID)\n ]);\n }\n\n private async LoadEntityMapsForIntegration(integrationID: string): Promise<void> {\n this.IsLoadingEntityMaps = true;\n this.cdr.detectChanges();\n try {\n this.EntityMaps = await this.dataService.LoadEntityMaps(integrationID, this.RunViewToUse);\n } finally {\n this.IsLoadingEntityMaps = false;\n this.cdr.detectChanges();\n }\n }\n\n private async LoadLatestRunForIntegration(integrationID: string): Promise<void> {\n this.IsLoadingRunDetails = true;\n this.cdr.detectChanges();\n try {\n const runs = await this.dataService.LoadRunHistory(integrationID, 1, this.RunViewToUse);\n this.LatestRun = runs.length > 0 ? runs[0] : null;\n if (this.LatestRun) {\n this.RunEntityDetails = await this.dataService.LoadRunDetails(this.LatestRun.ID, this.RunViewToUse);\n }\n } finally {\n this.IsLoadingRunDetails = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Load source objects from IntegrationObject metadata via engine (cached per integration) */\n private DiscoverSourceObjects(integrationID: string): Promise<void> {\n if (this.discoverCache.has(integrationID)) {\n this.DiscoveredObjects = this.discoverCache.get(integrationID)!;\n return Promise.resolve();\n }\n\n this.IsDiscoveringObjects = true;\n this.DiscoverError = '';\n this.DiscoveredObjects = [];\n this.cdr.detectChanges();\n\n try {\n const engine = IntegrationEngineBase.Instance;\n const integration = engine.GetIntegrationForCompanyIntegration(integrationID);\n if (!integration) {\n this.DiscoverError = 'Integration not found in metadata';\n return Promise.resolve();\n }\n\n const objects = engine.GetActiveIntegrationObjects(integration.ID);\n this.DiscoveredObjects = objects.map(o => ({\n Name: o.Name,\n Label: o.DisplayName || o.Name,\n Category: o.Category || 'Uncategorized',\n Description: o.Description || '',\n SupportsIncrementalSync: o.SupportsIncrementalSync,\n SupportsWrite: o.SupportsWrite\n }));\n this.discoverCache.set(integrationID, this.DiscoveredObjects);\n } catch (e) {\n this.DiscoverError = `Failed to load objects: ${(e as Error).message}`;\n } finally {\n this.IsDiscoveringObjects = false;\n this.cdr.detectChanges();\n }\n return Promise.resolve();\n }\n\n // =====================================================================\n // Entity Map Selection\n // =====================================================================\n\n async OnMapSelect(item: MapListItem): Promise<void> {\n this.SelectedMapID = item.ID;\n this.CloseAllPreviews();\n\n if (item.IsPending) {\n // Pending maps show the pending entity view in center panel\n this.EditableFields = [];\n this.DestinationFields = [];\n this.cdr.detectChanges();\n return;\n }\n\n // Real entity map — load field maps + dest fields, resolve source from metadata\n this.IsLoadingFieldMaps = true;\n this.cdr.detectChanges();\n try {\n await Promise.all([\n this.dataService.LoadFieldMaps(item.ID, this.RunViewToUse).then(fms => { this.FieldMaps = fms; }),\n this.LoadDestinationFields(item.RealMap!.EntityID)\n ]);\n\n // Resolve source fields from IntegrationObject metadata\n this.SourceFields = this.resolveSourceFieldsFromMetadata(\n this.SelectedIntegrationID,\n item.RealMap!.ExternalObjectName\n );\n\n this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));\n } finally {\n this.IsLoadingFieldMaps = false;\n this.cdr.detectChanges();\n }\n }\n\n IsSelectedMap(id: string): boolean {\n return this.SelectedMapID === id || UUIDsEqual(this.SelectedMapID, id);\n }\n\n async OnToggleEntityMap(em: EntityMapRow): Promise<void> {\n await this.dataService.ToggleEntityMapEnabled(em.ID, em.SyncEnabled);\n }\n\n async OnDeleteMap(item: MapListItem, event: Event): Promise<void> {\n event.stopPropagation();\n if (item.IsPending) {\n this.PendingMaps = this.PendingMaps.filter(p => p.LocalID !== item.ID);\n } else {\n const deleted = await this.dataService.DeleteEntityMap(item.ID);\n if (deleted) {\n this.EntityMaps = this.EntityMaps.filter(e => !UUIDsEqual(e.ID, item.ID));\n }\n }\n\n if (this.IsSelectedMap(item.ID)) {\n this.SelectedMapID = null;\n this.EditableFields = [];\n this.DestinationFields = [];\n }\n this.cdr.detectChanges();\n }\n\n // =====================================================================\n // Add Map Flow\n // =====================================================================\n\n OpenAddPanel(): void {\n this.ShowAddPanel = true;\n this.TargetMode = 'existing';\n this.ResetAddForm();\n this.EnsureEntitiesLoaded();\n this.LoadDBSchemas();\n }\n\n CloseAddPanel(): void {\n this.ShowAddPanel = false;\n this.ResetAddForm();\n }\n\n SetTargetMode(mode: TargetMode): void {\n this.TargetMode = mode;\n }\n\n OnSourceObjectChange(objectName: string): void {\n this.SelectedSourceObjectName = objectName;\n // Auto-suggest table/entity name for new entity mode\n if (this.TargetMode === 'new') {\n this.NewEntityTableName = this.SuggestedTableName;\n this.NewEntityName = this.SuggestedEntityName;\n }\n }\n\n OnSchemaNameChange(): void {\n // Update entity name suggestion when schema changes\n if (this.SelectedSourceObjectName) {\n this.NewEntityName = this.SuggestedEntityName;\n }\n }\n\n async SaveAddMap(): Promise<void> {\n if (!this.IsAddFormValid || !this.SelectedIntegrationID) return;\n this.IsSavingEntityMap = true;\n this.cdr.detectChanges();\n\n try {\n if (this.TargetMode === 'existing') {\n await this.SaveExistingEntityMap();\n } else {\n await this.SaveNewEntityMap();\n }\n } finally {\n this.IsSavingEntityMap = false;\n this.cdr.detectChanges();\n }\n }\n\n private async SaveExistingEntityMap(): Promise<void> {\n const sourceObj = this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName);\n const result = await this.dataService.CreateEntityMap({\n CompanyIntegrationID: this.SelectedIntegrationID,\n ExternalObjectName: this.SelectedSourceObjectName,\n ExternalObjectLabel: sourceObj?.Label !== sourceObj?.Name ? sourceObj?.Label : undefined,\n EntityID: this.SelectedEntityID!,\n SyncDirection: this.AddSyncDirection\n });\n\n if (result) {\n // Reload entity maps and auto-generate field mappings\n await this.LoadEntityMapsForIntegration(this.SelectedIntegrationID);\n const newMap = this.EntityMaps.find(\n em => em.ExternalObjectName === this.SelectedSourceObjectName\n );\n if (newMap) {\n this.SelectedMapID = newMap.ID;\n await this.AutoGenerateFieldMappings(newMap);\n }\n this.CloseAddPanel();\n }\n }\n\n private async SaveNewEntityMap(): Promise<void> {\n // Resolve source fields from IntegrationObject metadata\n const sourceFields = this.resolveSourceFieldsFromMetadata(\n this.SelectedIntegrationID,\n this.SelectedSourceObjectName\n );\n\n // Generate DDL preview\n let ddlContent = '';\n try {\n const ddlResult = await this.dataService.SchemaPreview(\n this.SelectedIntegrationID,\n [{\n SourceObjectName: this.SelectedSourceObjectName,\n SchemaName: this.NewEntitySchemaName.trim(),\n TableName: this.NewEntityTableName.trim(),\n EntityName: this.NewEntityName.trim()\n }],\n 'sqlserver'\n );\n if (ddlResult.Success && ddlResult.Files.length > 0) {\n ddlContent = ddlResult.Files.map(f => f.Content).join('\\n\\n');\n }\n } catch {\n // DDL will be empty — not a blocker\n }\n\n // Create pending map entry\n const pendingMap: PendingMapEntry = {\n LocalID: `pending-${++this.pendingCounter}`,\n SourceObjectName: this.SelectedSourceObjectName,\n SourceObjectLabel: this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName)?.Label || this.SelectedSourceObjectName,\n SchemaName: this.NewEntitySchemaName.trim(),\n TableName: this.NewEntityTableName.trim(),\n EntityName: this.NewEntityName.trim(),\n SyncDirection: this.AddSyncDirection,\n SourceFields: sourceFields,\n DDLContent: ddlContent,\n CreatedAt: new Date()\n };\n\n this.PendingMaps.push(pendingMap);\n this.SelectedMapID = pendingMap.LocalID;\n this.CloseAddPanel();\n }\n\n private ResetAddForm(): void {\n this.SelectedSourceObjectName = '';\n this.SelectedEntityID = null;\n this.NewEntitySchemaName = '';\n this.NewEntityTableName = '';\n this.NewEntityName = '';\n this.AddSyncDirection = 'Pull';\n this.DDLPreviewContent = '';\n this.DDLPreviewError = '';\n }\n\n private async EnsureEntitiesLoaded(): Promise<void> {\n if (this.MJEntities.length > 0) return;\n this.IsLoadingEntities = true;\n this.cdr.detectChanges();\n try {\n this.MJEntities = await this.dataService.LoadMJEntities(this.RunViewToUse);\n } finally {\n this.IsLoadingEntities = false;\n this.cdr.detectChanges();\n }\n }\n\n private LoadDBSchemas(): void {\n if (this.DBSchemas.length > 0) return;\n const md = new Metadata();\n const schemaSet = new Set<string>();\n for (const entity of md.Entities) {\n if (entity.SchemaName) {\n schemaSet.add(entity.SchemaName);\n }\n }\n this.DBSchemas = Array.from(schemaSet).sort();\n }\n\n // =====================================================================\n // DDL Preview for Add Panel\n // =====================================================================\n\n async PreviewDDL(): Promise<void> {\n if (!this.SelectedSourceObjectName || !this.NewEntitySchemaName.trim() || !this.NewEntityTableName.trim()) return;\n this.IsGeneratingDDL = true;\n this.DDLPreviewContent = '';\n this.DDLPreviewError = '';\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.SchemaPreview(\n this.SelectedIntegrationID,\n [{\n SourceObjectName: this.SelectedSourceObjectName,\n SchemaName: this.NewEntitySchemaName.trim(),\n TableName: this.NewEntityTableName.trim(),\n EntityName: this.NewEntityName.trim() || this.SuggestedEntityName\n }],\n 'sqlserver'\n );\n\n if (result.Success && result.Files.length > 0) {\n this.DDLPreviewContent = result.Files.map(f => `-- ${f.Description}\\n-- ${f.FilePath}\\n\\n${f.Content}`).join('\\n\\n');\n } else {\n this.DDLPreviewError = result.Message || 'No DDL generated';\n }\n } catch (e) {\n this.DDLPreviewError = `DDL generation failed: ${(e as Error).message}`;\n } finally {\n this.IsGeneratingDDL = false;\n this.cdr.detectChanges();\n }\n }\n\n // =====================================================================\n // Field Mapping\n // =====================================================================\n\n private ToEditableField(fm: FieldMapRow): EditableFieldMap {\n // Look up source metadata from IntegrationObjectField entities\n const srcMeta = this.SourceFields.find(\n sf => sf.Name.toLowerCase() === fm.SourceFieldName.toLowerCase()\n );\n return {\n ID: fm.ID,\n SourceFieldName: fm.SourceFieldName,\n SourceFieldLabel: fm.SourceFieldLabel ?? '',\n SourceFieldType: srcMeta?.Type ?? '',\n DestinationFieldName: fm.DestinationFieldName,\n DestinationFieldLabel: fm.DestinationFieldLabel ?? '',\n IsKeyField: fm.IsKeyField,\n IsRequired: fm.IsRequired,\n Direction: fm.Direction,\n Status: fm.Status as 'Active' | 'Inactive',\n IsNew: false,\n IsDirty: false,\n IsSourcePK: srcMeta?.IsPrimaryKey ?? false,\n IsSourceRequired: srcMeta?.IsRequired ?? false,\n IsSourceReadOnly: srcMeta?.IsReadOnly ?? false,\n TransformPipeline: this.ParseTransformPipeline(fm.TransformPipeline),\n ShowTransformEditor: false\n };\n }\n\n private ParseTransformPipeline(json: string | null): TransformStepUI[] {\n if (!json || json.trim() === '') return [];\n try {\n const parsed: unknown = JSON.parse(json);\n if (!Array.isArray(parsed)) return [];\n return (parsed as TransformStepUI[]).map(step => ({\n Type: step.Type ?? 'direct',\n Config: (step.Config as Record<string, unknown>) ?? {},\n OnError: step.OnError ?? 'Fail'\n }));\n } catch {\n return [];\n }\n }\n\n SerializeTransformPipeline(steps: TransformStepUI[]): string | null {\n if (steps.length === 0) return null;\n return JSON.stringify(steps.map(s => ({ Type: s.Type, Config: s.Config, OnError: s.OnError })));\n }\n\n private async LoadDestinationFields(entityID: string): Promise<void> {\n this.IsLoadingDestFields = true;\n this.cdr.detectChanges();\n try {\n this.DestinationFields = await this.dataService.LoadEntityFields(entityID, this.RunViewToUse);\n } finally {\n this.IsLoadingDestFields = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Auto-generate field mappings by matching source fields to destination by name */\n async AutoGenerateFieldMappings(entityMap: EntityMapRow): Promise<void> {\n // Resolve source fields from IntegrationObject metadata\n this.IsLoadingSourceFields = true;\n this.cdr.detectChanges();\n try {\n this.SourceFields = this.resolveSourceFieldsFromMetadata(\n this.SelectedIntegrationID,\n entityMap.ExternalObjectName\n );\n\n if (this.SourceFields.length === 0) return;\n\n // Load destination fields\n await this.LoadDestinationFields(entityMap.EntityID);\n\n // Match fields by name (case-insensitive)\n const matchedFields = this.MatchFieldsByName(this.SourceFields, this.DestinationFields);\n this.AutoMapCount = matchedFields.length;\n this.ShowAutoMapBanner = this.AutoMapCount > 0;\n\n // Create field maps for matches, preserving source field order via Priority\n for (let idx = 0; idx < matchedFields.length; idx++) {\n const match = matchedFields[idx];\n const displayName = match.sourceField.DisplayName || match.sourceField.Name;\n await this.dataService.CreateFieldMap({\n EntityMapID: entityMap.ID,\n SourceFieldName: match.sourceField.Name,\n SourceFieldLabel: displayName !== match.sourceField.Name ? displayName : undefined,\n DestinationFieldName: match.destField.Name,\n IsKeyField: match.sourceField.IsPrimaryKey,\n IsRequired: match.sourceField.IsRequired,\n Direction: 'SourceToDest',\n TransformPipeline: JSON.stringify([{ Type: 'direct', Config: {}, OnError: 'Fail' }]),\n Priority: match.sourceIndex\n });\n }\n\n // Reload field maps\n this.FieldMaps = await this.dataService.LoadFieldMaps(entityMap.ID, this.RunViewToUse);\n this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));\n } finally {\n this.IsLoadingSourceFields = false;\n this.cdr.detectChanges();\n }\n }\n\n private MatchFieldsByName(\n sourceFields: MJIntegrationObjectFieldEntity[],\n destFields: MJFieldOption[]\n ): Array<{ sourceField: MJIntegrationObjectFieldEntity; destField: MJFieldOption; sourceIndex: number }> {\n const matches: Array<{ sourceField: MJIntegrationObjectFieldEntity; destField: MJFieldOption; sourceIndex: number }> = [];\n const destFieldMap = new Map<string, MJFieldOption>();\n for (const df of destFields) {\n destFieldMap.set(df.Name.toLowerCase(), df);\n }\n\n for (let i = 0; i < sourceFields.length; i++) {\n const sf = sourceFields[i];\n const destMatch = destFieldMap.get(sf.Name.toLowerCase());\n if (destMatch) {\n matches.push({ sourceField: sf, destField: destMatch, sourceIndex: i });\n }\n }\n return matches;\n }\n\n /** Validation: count fields missing destination mapping */\n get UnmappedRequiredCount(): number {\n return this.EditableFields.filter(\n f => f.Status === 'Active' && f.IsRequired && !f.DestinationFieldName\n ).length;\n }\n\n /** Validation: check if at least one key field is configured */\n get HasKeyField(): boolean {\n return this.EditableFields.some(f => f.Status === 'Active' && f.IsKeyField);\n }\n\n /** Validation: overall mapping readiness */\n get MappingValidation(): { IsValid: boolean; Warnings: string[] } {\n const warnings: string[] = [];\n if (this.UnmappedRequiredCount > 0) {\n warnings.push(`${this.UnmappedRequiredCount} required field(s) missing destination mapping`);\n }\n if (!this.HasKeyField && this.ActiveEditableFields.length > 0) {\n warnings.push('No key field configured — sync may create duplicates');\n }\n return { IsValid: warnings.length === 0, Warnings: warnings };\n }\n\n /** Re-run auto-mapping for the currently selected entity map */\n async RerunAutoMap(): Promise<void> {\n if (!this.SelectedEntityMap) return;\n await this.AutoGenerateFieldMappings(this.SelectedEntityMap);\n }\n\n OnFieldChanged(field: EditableFieldMap): void {\n field.IsDirty = true;\n }\n\n AddFieldMapping(): void {\n this.EditableFields.push({\n ID: null,\n SourceFieldName: '',\n SourceFieldLabel: '',\n SourceFieldType: '',\n DestinationFieldName: '',\n DestinationFieldLabel: '',\n IsKeyField: false,\n IsRequired: false,\n Direction: 'SourceToDest',\n Status: 'Active',\n IsNew: true,\n IsDirty: true,\n IsSourcePK: false,\n IsSourceRequired: false,\n IsSourceReadOnly: false,\n TransformPipeline: [],\n ShowTransformEditor: false\n });\n this.cdr.detectChanges();\n }\n\n RemoveFieldMapping(index: number): void {\n const field = this.EditableFields[index];\n if (field.IsNew) {\n this.EditableFields.splice(index, 1);\n } else if (field.ID) {\n field.Status = 'Inactive';\n field.IsDirty = true;\n }\n this.cdr.detectChanges();\n }\n\n async SaveFieldMappings(): Promise<void> {\n if (!this.SelectedEntityMap) return;\n this.IsSavingFields = true;\n this.cdr.detectChanges();\n\n try {\n for (const field of this.EditableFields) {\n if (!field.IsDirty) continue;\n\n if (field.IsNew && field.SourceFieldName && field.DestinationFieldName) {\n await this.dataService.CreateFieldMap({\n EntityMapID: this.SelectedEntityMap.ID,\n SourceFieldName: field.SourceFieldName,\n SourceFieldLabel: field.SourceFieldLabel || undefined,\n DestinationFieldName: field.DestinationFieldName,\n DestinationFieldLabel: field.DestinationFieldLabel || undefined,\n IsKeyField: field.IsKeyField,\n IsRequired: field.IsRequired,\n Direction: field.Direction,\n TransformPipeline: this.SerializeTransformPipeline(field.TransformPipeline)\n });\n } else if (field.ID && field.Status === 'Inactive') {\n await this.dataService.DeleteFieldMap(field.ID);\n } else if (field.ID) {\n await this.dataService.UpdateFieldMap(field.ID, {\n SourceFieldName: field.SourceFieldName,\n DestinationFieldName: field.DestinationFieldName,\n IsKeyField: field.IsKeyField,\n IsRequired: field.IsRequired,\n Direction: field.Direction,\n Status: field.Status,\n TransformPipeline: this.SerializeTransformPipeline(field.TransformPipeline)\n });\n }\n }\n\n this.FieldMaps = await this.dataService.LoadFieldMaps(this.SelectedEntityMap.ID, this.RunViewToUse);\n this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));\n this.ShowAutoMapBanner = false;\n } finally {\n this.IsSavingFields = false;\n this.cdr.detectChanges();\n }\n }\n\n DismissAutoMapBanner(): void {\n this.ShowAutoMapBanner = false;\n }\n\n // =====================================================================\n // Transform Pipeline\n // =====================================================================\n\n /** Available transform types with display metadata */\n readonly TransformTypes: Array<{ Value: TransformType; Label: string; Icon: string; Description: string }> = [\n { Value: 'direct', Label: 'Direct', Icon: 'fa-solid fa-arrow-right', Description: 'Pass through as-is (with optional default)' },\n { Value: 'regex', Label: 'Regex', Icon: 'fa-solid fa-code', Description: 'Apply regex pattern replacement' },\n { Value: 'split', Label: 'Split', Icon: 'fa-solid fa-scissors', Description: 'Split text and extract a segment' },\n { Value: 'combine', Label: 'Combine', Icon: 'fa-solid fa-object-group', Description: 'Merge multiple source fields' },\n { Value: 'lookup', Label: 'Lookup', Icon: 'fa-solid fa-book', Description: 'Map values using a lookup table' },\n { Value: 'format', Label: 'Format', Icon: 'fa-solid fa-font', Description: 'Format dates, numbers, or strings' },\n { Value: 'coerce', Label: 'Coerce', Icon: 'fa-solid fa-exchange-alt', Description: 'Convert to a different data type' },\n { Value: 'substring', Label: 'Substring', Icon: 'fa-solid fa-text-width', Description: 'Extract a portion of text' },\n { Value: 'custom', Label: 'Custom', Icon: 'fa-solid fa-wand-magic-sparkles', Description: 'Custom JavaScript expression' }\n ];\n\n ToggleTransformEditor(field: EditableFieldMap): void {\n // Auto-add a direct step if none exist so the editor has something to show\n if (field.TransformPipeline.length === 0) {\n field.TransformPipeline.push({ Type: 'direct', Config: {}, OnError: 'Fail' });\n field.IsDirty = true;\n }\n field.ShowTransformEditor = !field.ShowTransformEditor;\n this.cdr.detectChanges();\n }\n\n AddTransformStep(field: EditableFieldMap): void {\n field.TransformPipeline.push({\n Type: 'direct',\n Config: {},\n OnError: 'Fail'\n });\n field.IsDirty = true;\n field.ShowTransformEditor = true;\n this.cdr.detectChanges();\n }\n\n RemoveTransformStep(field: EditableFieldMap, stepIndex: number): void {\n field.TransformPipeline.splice(stepIndex, 1);\n field.IsDirty = true;\n this.cdr.detectChanges();\n }\n\n OnTransformTypeChange(field: EditableFieldMap, step: TransformStepUI, newType: TransformType): void {\n step.Type = newType;\n step.Config = this.GetDefaultConfigForType(newType);\n field.IsDirty = true;\n this.cdr.detectChanges();\n }\n\n OnTransformConfigChange(field: EditableFieldMap): void {\n field.IsDirty = true;\n }\n\n private GetDefaultConfigForType(type: TransformType): Record<string, unknown> {\n switch (type) {\n case 'direct': return {};\n case 'regex': return { Pattern: '', Replacement: '', Flags: 'g' };\n case 'split': return { Delimiter: ',', Index: 0 };\n case 'combine': return { SourceFields: [], Separator: ' ' };\n case 'lookup': return { Map: {}, Default: null };\n case 'format': return { FormatString: 'ISO', FormatType: 'date' };\n case 'coerce': return { TargetType: 'string' };\n case 'substring': return { Start: 0, Length: 10 };\n case 'custom': return { Expression: 'value' };\n }\n }\n\n GetTransformLabel(type: TransformType): string {\n return this.TransformTypes.find(t => t.Value === type)?.Label ?? type;\n }\n\n GetTransformIcon(type: TransformType): string {\n return this.TransformTypes.find(t => t.Value === type)?.Icon ?? 'fa-solid fa-arrow-right';\n }\n\n /** For combine transforms: get available source field names */\n GetAvailableSourceFields(): string[] {\n return this.SourceFields.map(sf => sf.Name);\n }\n\n /**\n * Resolve source fields from IntegrationObjectField metadata via IntegrationEngineBase.\n * CompanyIntegrationID → Integration → IntegrationObject → IntegrationObjectFields.\n */\n private resolveSourceFieldsFromMetadata(\n companyIntegrationID: string,\n externalObjectName: string\n ): MJIntegrationObjectFieldEntity[] {\n const engine = IntegrationEngineBase.Instance;\n const integration = engine.GetIntegrationForCompanyIntegration(companyIntegrationID);\n if (!integration) return [];\n\n const obj = engine.GetIntegrationObject(integration.ID, externalObjectName);\n if (!obj) return [];\n\n return engine.GetIntegrationObjectFields(obj.ID)\n .filter(f => f.Status === 'Active')\n .sort((a, b) => a.Sequence - b.Sequence);\n }\n\n /** For lookup transforms: add a new key-value pair */\n AddLookupEntry(config: Record<string, unknown>): void {\n const map = (config['Map'] as Record<string, string>) ?? {};\n map[''] = '';\n config['Map'] = map;\n }\n\n GetLookupEntries(config: Record<string, unknown>): Array<{ key: string; value: string }> {\n const map = (config['Map'] as Record<string, string>) ?? {};\n return Object.entries(map).map(([key, value]) => ({ key, value: String(value) }));\n }\n\n UpdateLookupEntry(config: Record<string, unknown>, oldKey: string, newKey: string, newValue: string): void {\n const map = (config['Map'] as Record<string, string>) ?? {};\n if (oldKey !== newKey) {\n delete map[oldKey];\n }\n map[newKey] = newValue;\n config['Map'] = { ...map };\n }\n\n RemoveLookupEntry(config: Record<string, unknown>, key: string): void {\n const map = (config['Map'] as Record<string, string>) ?? {};\n delete map[key];\n config['Map'] = { ...map };\n }\n\n /** For combine transforms: toggle a source field */\n ToggleCombineField(config: Record<string, unknown>, fieldName: string): void {\n const fields = (config['SourceFields'] as string[]) ?? [];\n const idx = fields.indexOf(fieldName);\n if (idx >= 0) {\n fields.splice(idx, 1);\n } else {\n fields.push(fieldName);\n }\n config['SourceFields'] = [...fields];\n }\n\n IsCombineFieldSelected(config: Record<string, unknown>, fieldName: string): boolean {\n const fields = (config['SourceFields'] as string[]) ?? [];\n return fields.includes(fieldName);\n }\n\n // =====================================================================\n // Data Preview\n // =====================================================================\n\n async LoadSourcePreview(): Promise<void> {\n if (!this.SelectedEntityMap) return;\n this.IsLoadingSourcePreview = true;\n this.ShowSourcePreview = true;\n this.SourcePreviewData = [];\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.PreviewSourceData(\n this.SelectedIntegrationID,\n this.SelectedEntityMap.ExternalObjectName,\n 5\n );\n this.SourcePreviewData = result;\n } catch (e) {\n console.error('[MappingWorkspace] Source preview failed:', (e as Error).message);\n } finally {\n this.IsLoadingSourcePreview = false;\n this.cdr.detectChanges();\n }\n }\n\n async LoadDestPreview(): Promise<void> {\n if (!this.SelectedEntityMap) return;\n this.IsLoadingDestPreview = true;\n this.ShowDestPreview = true;\n this.DestPreviewData = [];\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.PreviewDestinationData(\n this.SelectedEntityMap.EntityID,\n 5,\n this.RunViewToUse\n );\n this.DestPreviewData = result;\n } catch (e) {\n console.error('[MappingWorkspace] Dest preview failed:', (e as Error).message);\n } finally {\n this.IsLoadingDestPreview = false;\n this.cdr.detectChanges();\n }\n }\n\n CloseSourcePreview(): void {\n this.ShowSourcePreview = false;\n this.SourcePreviewData = [];\n }\n\n CloseDestPreview(): void {\n this.ShowDestPreview = false;\n this.DestPreviewData = [];\n }\n\n private CloseAllPreviews(): void {\n this.CloseSourcePreview();\n this.CloseDestPreview();\n this.ShowAutoMapBanner = false;\n }\n\n GetPreviewColumns(data: PreviewRecord[]): string[] {\n if (data.length === 0) return [];\n return Object.keys(data[0]).slice(0, 8); // Limit to 8 columns for readability\n }\n\n FormatPreviewValue(value: string | number | boolean | null): string {\n if (value == null) return '--';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n const str = String(value);\n return str.length > 50 ? str.substring(0, 47) + '...' : str;\n }\n\n // =====================================================================\n // Pending Map Actions\n // =====================================================================\n\n CopyDDLToClipboard(ddl: string): void {\n navigator.clipboard.writeText(ddl).catch(() => {\n console.error('[MappingWorkspace] Failed to copy DDL to clipboard');\n });\n }\n\n GetPendingStepStatus(pendingMap: PendingMapEntry, step: number): 'current' | 'done' | 'future' {\n // Step 1: Map Created — always done for pending maps\n // Step 2: DDL Generated — done if DDL content exists\n // Step 3: Deploy & CodeGen — always future (manual step)\n // Step 4: Ready to Sync — always future\n if (step === 1) return 'done';\n if (step === 2) return pendingMap.DDLContent ? 'done' : 'current';\n return 'future';\n }\n\n // =====================================================================\n // Helpers\n // =====================================================================\n\n get RunStatusColor(): string {\n if (!this.LatestRun) return 'gray';\n if (this.LatestRun.Status === 'Success') return 'green';\n if (this.LatestRun.Status === 'Failed') return 'red';\n return 'amber';\n }\n\n FormatDate(dateStr: string | null): string {\n if (!dateStr) return '--';\n return new Date(dateStr).toLocaleString(undefined, {\n month: 'short', day: 'numeric',\n hour: '2-digit', minute: '2-digit'\n });\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Mapping Workspace';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n}\n\nexport function LoadMappingWorkspace(): void {\n // Tree-shaking prevention\n}\n","<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"]}
1
+ {"version":3,"file":"mapping-workspace.component.js","sourceRoot":"","sources":["../../../../src/Integration/components/mapping-workspace/mapping-workspace.component.ts","../../../../src/Integration/components/mapping-workspace/mapping-workspace.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { Metadata } from '@memberjunction/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJIntegrationObjectFieldEntity, MJCompanyIntegrationEntity } from '@memberjunction/core-entities';\nimport { IntegrationEngineBase } from '@memberjunction/integration-engine-base';\nimport {\n IntegrationDataService,\n IntegrationRunRow,\n EntityMapRow,\n FieldMapRow,\n RunDetailRow\n} from '../../services/integration-data.service';\n\n// ---------------------------------------------------------------------------\n// Interfaces\n// ---------------------------------------------------------------------------\n\n/** Source object from integration metadata */\ninterface DiscoveredObject {\n Name: string;\n Label: string;\n Category: string;\n Description: string;\n SupportsIncrementalSync: boolean;\n SupportsWrite: boolean;\n}\n\n/** Target MJ entity for the picker */\ninterface MJEntityOption {\n ID: string;\n Name: string;\n}\n\n/** MJ entity field for field mapping destination picker */\ninterface MJFieldOption {\n ID: string;\n Name: string;\n Type: string;\n IsRequired: boolean;\n}\n\n/** Transform type for the pipeline builder */\ntype TransformType = 'direct' | 'regex' | 'split' | 'combine' | 'lookup' | 'format' | 'coerce' | 'substring' | 'custom';\n\n/** A single step in a transform pipeline */\ninterface TransformStepUI {\n Type: TransformType;\n Config: Record<string, unknown>;\n OnError: 'Skip' | 'Null' | 'Fail';\n}\n\n/** Editable field map row used in the center panel */\ninterface EditableFieldMap {\n ID: string | null;\n SourceFieldName: string;\n SourceFieldLabel: string;\n SourceFieldType: string;\n DestinationFieldName: string;\n DestinationFieldLabel: string;\n IsKeyField: boolean;\n IsRequired: boolean;\n Direction: 'Both' | 'DestToSource' | 'SourceToDest';\n Status: 'Active' | 'Inactive';\n IsNew: boolean;\n IsDirty: boolean;\n // Source metadata (from connector discovery)\n IsSourcePK: boolean;\n IsSourceRequired: boolean;\n IsSourceReadOnly: boolean;\n // Transform pipeline\n TransformPipeline: TransformStepUI[];\n ShowTransformEditor: boolean;\n}\n\n/** Pending entity map — entity hasn't been created yet */\ninterface PendingMapEntry {\n LocalID: string;\n SourceObjectName: string;\n SourceObjectLabel: string;\n SchemaName: string;\n TableName: string;\n EntityName: string;\n SyncDirection: 'Bidirectional' | 'Pull' | 'Push';\n SourceFields: MJIntegrationObjectFieldEntity[];\n DDLContent: string;\n CreatedAt: Date;\n}\n\n/** Combined list item for left panel — merges real and pending maps */\ninterface MapListItem {\n ID: string;\n SourceName: string;\n TargetName: string;\n SyncDirection: string;\n SyncEnabled: boolean;\n IsPending: boolean;\n RealMap: EntityMapRow | null;\n PendingMap: PendingMapEntry | null;\n}\n\ntype TargetMode = 'existing' | 'new';\n\n/** Data preview row — key/value record */\ntype PreviewRecord = Record<string, string | number | boolean | null>;\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n@RegisterClass(BaseResourceComponent, 'IntegrationMappingWorkspace')\n@Component({\n standalone: false,\n selector: 'app-mapping-workspace',\n templateUrl: './mapping-workspace.component.html',\n styleUrls: ['./mapping-workspace.component.css']\n})\nexport class MappingWorkspaceComponent extends BaseResourceComponent implements OnInit {\n\n // --- Core data ---\n Integrations: MJCompanyIntegrationEntity[] = [];\n EntityMaps: EntityMapRow[] = [];\n FieldMaps: FieldMapRow[] = [];\n RunEntityDetails: RunDetailRow[] = [];\n LatestRun: IntegrationRunRow | null = null;\n\n // --- Selection ---\n SelectedIntegrationID = '';\n SelectedMapID: string | null = null;\n EntityMapSearchText = '';\n\n // --- Loading ---\n IsLoadingIntegrations = false;\n IsLoadingEntityMaps = false;\n IsLoadingFieldMaps = false;\n IsLoadingRunDetails = false;\n\n // --- Add Map flow ---\n ShowAddPanel = false;\n TargetMode: TargetMode = 'existing';\n\n // Source objects from discovery\n DiscoveredObjects: DiscoveredObject[] = [];\n IsDiscoveringObjects = false;\n DiscoverError = '';\n SelectedSourceObjectName = '';\n\n // Target: existing entity\n MJEntities: MJEntityOption[] = [];\n IsLoadingEntities = false;\n SelectedEntityID: string | null = null;\n\n // Target: new entity\n NewEntitySchemaName = '';\n NewEntityTableName = '';\n NewEntityName = '';\n DBSchemas: string[] = [];\n\n // Sync direction for add flow\n AddSyncDirection: 'Bidirectional' | 'Pull' | 'Push' = 'Pull';\n IsSavingEntityMap = false;\n\n // --- Pending entity maps (local state) ---\n PendingMaps: PendingMapEntry[] = [];\n\n // --- DDL preview ---\n IsGeneratingDDL = false;\n DDLPreviewContent = '';\n DDLPreviewError = '';\n\n // --- Field mapping editing ---\n EditableFields: EditableFieldMap[] = [];\n DestinationFields: MJFieldOption[] = [];\n IsLoadingDestFields = false;\n IsSavingFields = false;\n AutoMapCount = 0;\n ShowAutoMapBanner = false;\n\n // --- Source fields for auto-mapping ---\n SourceFields: MJIntegrationObjectFieldEntity[] = [];\n IsLoadingSourceFields = false;\n\n // --- Data preview ---\n SourcePreviewData: PreviewRecord[] = [];\n DestPreviewData: PreviewRecord[] = [];\n IsLoadingSourcePreview = false;\n IsLoadingDestPreview = false;\n ShowSourcePreview = false;\n ShowDestPreview = false;\n\n private dataService = inject(IntegrationDataService);\n private cdr = inject(ChangeDetectorRef);\n private discoverCache = new Map<string, DiscoveredObject[]>();\n private pendingCounter = 0;\n\n async ngOnInit(): Promise<void> {\n await this.LoadIntegrations();\n }\n\n // =====================================================================\n // Computed Properties\n // =====================================================================\n\n /** Merged list of real entity maps + pending maps, for the left panel */\n get AllMaps(): MapListItem[] {\n const realItems: MapListItem[] = this.EntityMaps.map(em => ({\n ID: em.ID,\n SourceName: em.ExternalObjectName,\n TargetName: em.Entity,\n SyncDirection: em.SyncDirection,\n SyncEnabled: em.SyncEnabled,\n IsPending: false,\n RealMap: em,\n PendingMap: null\n }));\n\n const pendingItems: MapListItem[] = this.PendingMaps.map(pm => ({\n ID: pm.LocalID,\n SourceName: pm.SourceObjectName,\n TargetName: pm.EntityName,\n SyncDirection: pm.SyncDirection,\n SyncEnabled: false,\n IsPending: true,\n RealMap: null,\n PendingMap: pm\n }));\n\n return [...realItems, ...pendingItems];\n }\n\n get FilteredMaps(): MapListItem[] {\n const all = this.AllMaps;\n if (!this.EntityMapSearchText.trim()) return all;\n const search = this.EntityMapSearchText.toLowerCase();\n return all.filter(\n m => m.SourceName.toLowerCase().includes(search)\n || m.TargetName.toLowerCase().includes(search)\n );\n }\n\n get SelectedMap(): MapListItem | null {\n if (!this.SelectedMapID) return null;\n return this.AllMaps.find(m => UUIDsEqual(m.ID, this.SelectedMapID)) ?? null;\n }\n\n get SelectedEntityMap(): EntityMapRow | null {\n const map = this.SelectedMap;\n return map?.RealMap ?? null;\n }\n\n get SelectedPendingMap(): PendingMapEntry | null {\n const map = this.SelectedMap;\n return map?.PendingMap ?? null;\n }\n\n get HasDirtyFields(): boolean {\n return this.EditableFields.some(f => f.IsDirty || f.IsNew);\n }\n\n get ActiveEditableFields(): EditableFieldMap[] {\n return this.EditableFields.filter(f => f.Status !== 'Inactive');\n }\n\n get IsAddFormValid(): boolean {\n if (!this.SelectedSourceObjectName) return false;\n if (this.TargetMode === 'existing') return !!this.SelectedEntityID;\n return !!this.NewEntitySchemaName.trim() && !!this.NewEntityTableName.trim() && !!this.NewEntityName.trim();\n }\n\n /** Auto-suggest table/entity names from selected source object */\n get SuggestedTableName(): string {\n if (!this.SelectedSourceObjectName) return '';\n return this.SelectedSourceObjectName.replace(/[^A-Za-z0-9_]/g, '_');\n }\n\n get SuggestedEntityName(): string {\n if (!this.SelectedSourceObjectName) return '';\n const obj = this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName);\n const label = obj?.Label || this.SelectedSourceObjectName;\n if (this.NewEntitySchemaName) return `${this.NewEntitySchemaName} ${label}`;\n return label;\n }\n\n // =====================================================================\n // Data Loading\n // =====================================================================\n\n async LoadIntegrations(): Promise<void> {\n this.IsLoadingIntegrations = true;\n this.cdr.detectChanges();\n try {\n const summaries = await this.dataService.LoadIntegrationSummaries(this.RunViewToUse);\n this.Integrations = summaries.map(s => s.Integration);\n } finally {\n this.IsLoadingIntegrations = false;\n this.cdr.detectChanges();\n }\n }\n\n async OnIntegrationChange(integrationID: string): Promise<void> {\n this.SelectedIntegrationID = integrationID;\n this.SelectedMapID = null;\n this.FieldMaps = [];\n this.EditableFields = [];\n this.DestinationFields = [];\n this.RunEntityDetails = [];\n this.LatestRun = null;\n this.EntityMapSearchText = '';\n this.CloseAddPanel();\n this.CloseAllPreviews();\n\n if (!integrationID) return;\n\n // Load entity maps + latest run in parallel, and auto-discover source objects\n await Promise.all([\n this.LoadEntityMapsForIntegration(integrationID),\n this.LoadLatestRunForIntegration(integrationID),\n this.DiscoverSourceObjects(integrationID)\n ]);\n }\n\n private async LoadEntityMapsForIntegration(integrationID: string): Promise<void> {\n this.IsLoadingEntityMaps = true;\n this.cdr.detectChanges();\n try {\n this.EntityMaps = await this.dataService.LoadEntityMaps(integrationID, this.RunViewToUse);\n } finally {\n this.IsLoadingEntityMaps = false;\n this.cdr.detectChanges();\n }\n }\n\n private async LoadLatestRunForIntegration(integrationID: string): Promise<void> {\n this.IsLoadingRunDetails = true;\n this.cdr.detectChanges();\n try {\n const runs = await this.dataService.LoadRunHistory(integrationID, 1, this.RunViewToUse);\n this.LatestRun = runs.length > 0 ? runs[0] : null;\n if (this.LatestRun) {\n this.RunEntityDetails = await this.dataService.LoadRunDetails(this.LatestRun.ID, this.RunViewToUse);\n }\n } finally {\n this.IsLoadingRunDetails = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Load source objects from IntegrationObject metadata via engine (cached per integration) */\n private DiscoverSourceObjects(integrationID: string): Promise<void> {\n if (this.discoverCache.has(integrationID)) {\n this.DiscoveredObjects = this.discoverCache.get(integrationID)!;\n return Promise.resolve();\n }\n\n this.IsDiscoveringObjects = true;\n this.DiscoverError = '';\n this.DiscoveredObjects = [];\n this.cdr.detectChanges();\n\n try {\n const engine = IntegrationEngineBase.Instance;\n const integration = engine.GetIntegrationForCompanyIntegration(integrationID);\n if (!integration) {\n this.DiscoverError = 'Integration not found in metadata';\n return Promise.resolve();\n }\n\n const objects = engine.GetActiveIntegrationObjects(integration.ID);\n this.DiscoveredObjects = objects.map(o => ({\n Name: o.Name,\n Label: o.DisplayName || o.Name,\n Category: o.Category || 'Uncategorized',\n Description: o.Description || '',\n SupportsIncrementalSync: o.SupportsIncrementalSync,\n SupportsWrite: o.SupportsWrite\n }));\n this.discoverCache.set(integrationID, this.DiscoveredObjects);\n } catch (e) {\n this.DiscoverError = `Failed to load objects: ${(e as Error).message}`;\n } finally {\n this.IsDiscoveringObjects = false;\n this.cdr.detectChanges();\n }\n return Promise.resolve();\n }\n\n // =====================================================================\n // Entity Map Selection\n // =====================================================================\n\n async OnMapSelect(item: MapListItem): Promise<void> {\n this.SelectedMapID = item.ID;\n this.CloseAllPreviews();\n\n if (item.IsPending) {\n // Pending maps show the pending entity view in center panel\n this.EditableFields = [];\n this.DestinationFields = [];\n this.cdr.detectChanges();\n return;\n }\n\n // Real entity map — load field maps + dest fields, resolve source from metadata\n this.IsLoadingFieldMaps = true;\n this.cdr.detectChanges();\n try {\n await Promise.all([\n this.dataService.LoadFieldMaps(item.ID, this.RunViewToUse).then(fms => { this.FieldMaps = fms; }),\n this.LoadDestinationFields(item.RealMap!.EntityID)\n ]);\n\n // Resolve source fields from IntegrationObject metadata\n this.SourceFields = this.resolveSourceFieldsFromMetadata(\n this.SelectedIntegrationID,\n item.RealMap!.ExternalObjectName\n );\n\n this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));\n } finally {\n this.IsLoadingFieldMaps = false;\n this.cdr.detectChanges();\n }\n }\n\n IsSelectedMap(id: string): boolean {\n return this.SelectedMapID === id || UUIDsEqual(this.SelectedMapID, id);\n }\n\n async OnToggleEntityMap(em: EntityMapRow): Promise<void> {\n await this.dataService.ToggleEntityMapEnabled(em.ID, em.SyncEnabled);\n }\n\n async OnDeleteMap(item: MapListItem, event: Event): Promise<void> {\n event.stopPropagation();\n if (item.IsPending) {\n this.PendingMaps = this.PendingMaps.filter(p => p.LocalID !== item.ID);\n } else {\n const deleted = await this.dataService.DeleteEntityMap(item.ID);\n if (deleted) {\n this.EntityMaps = this.EntityMaps.filter(e => !UUIDsEqual(e.ID, item.ID));\n }\n }\n\n if (this.IsSelectedMap(item.ID)) {\n this.SelectedMapID = null;\n this.EditableFields = [];\n this.DestinationFields = [];\n }\n this.cdr.detectChanges();\n }\n\n // =====================================================================\n // Add Map Flow\n // =====================================================================\n\n OpenAddPanel(): void {\n this.ShowAddPanel = true;\n this.TargetMode = 'existing';\n this.ResetAddForm();\n this.EnsureEntitiesLoaded();\n this.LoadDBSchemas();\n }\n\n CloseAddPanel(): void {\n this.ShowAddPanel = false;\n this.ResetAddForm();\n }\n\n SetTargetMode(mode: TargetMode): void {\n this.TargetMode = mode;\n }\n\n OnSourceObjectChange(objectName: string): void {\n this.SelectedSourceObjectName = objectName;\n // Auto-suggest table/entity name for new entity mode\n if (this.TargetMode === 'new') {\n this.NewEntityTableName = this.SuggestedTableName;\n this.NewEntityName = this.SuggestedEntityName;\n }\n }\n\n OnSchemaNameChange(): void {\n // Update entity name suggestion when schema changes\n if (this.SelectedSourceObjectName) {\n this.NewEntityName = this.SuggestedEntityName;\n }\n }\n\n async SaveAddMap(): Promise<void> {\n if (!this.IsAddFormValid || !this.SelectedIntegrationID) return;\n this.IsSavingEntityMap = true;\n this.cdr.detectChanges();\n\n try {\n if (this.TargetMode === 'existing') {\n await this.SaveExistingEntityMap();\n } else {\n await this.SaveNewEntityMap();\n }\n } finally {\n this.IsSavingEntityMap = false;\n this.cdr.detectChanges();\n }\n }\n\n private async SaveExistingEntityMap(): Promise<void> {\n const sourceObj = this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName);\n const result = await this.dataService.CreateEntityMap({\n CompanyIntegrationID: this.SelectedIntegrationID,\n ExternalObjectName: this.SelectedSourceObjectName,\n ExternalObjectLabel: sourceObj?.Label !== sourceObj?.Name ? sourceObj?.Label : undefined,\n EntityID: this.SelectedEntityID!,\n SyncDirection: this.AddSyncDirection\n });\n\n if (result) {\n // Reload entity maps and auto-generate field mappings\n await this.LoadEntityMapsForIntegration(this.SelectedIntegrationID);\n const newMap = this.EntityMaps.find(\n em => em.ExternalObjectName === this.SelectedSourceObjectName\n );\n if (newMap) {\n this.SelectedMapID = newMap.ID;\n await this.AutoGenerateFieldMappings(newMap);\n }\n this.CloseAddPanel();\n }\n }\n\n private async SaveNewEntityMap(): Promise<void> {\n // Resolve source fields from IntegrationObject metadata\n const sourceFields = this.resolveSourceFieldsFromMetadata(\n this.SelectedIntegrationID,\n this.SelectedSourceObjectName\n );\n\n // Generate DDL preview\n let ddlContent = '';\n try {\n const ddlResult = await this.dataService.SchemaPreview(\n this.SelectedIntegrationID,\n [{\n SourceObjectName: this.SelectedSourceObjectName,\n SchemaName: this.NewEntitySchemaName.trim(),\n TableName: this.NewEntityTableName.trim(),\n EntityName: this.NewEntityName.trim()\n }],\n 'sqlserver'\n );\n if (ddlResult.Success && ddlResult.Files.length > 0) {\n ddlContent = ddlResult.Files.map(f => f.Content).join('\\n\\n');\n }\n } catch {\n // DDL will be empty — not a blocker\n }\n\n // Create pending map entry\n const pendingMap: PendingMapEntry = {\n LocalID: `pending-${++this.pendingCounter}`,\n SourceObjectName: this.SelectedSourceObjectName,\n SourceObjectLabel: this.DiscoveredObjects.find(o => o.Name === this.SelectedSourceObjectName)?.Label || this.SelectedSourceObjectName,\n SchemaName: this.NewEntitySchemaName.trim(),\n TableName: this.NewEntityTableName.trim(),\n EntityName: this.NewEntityName.trim(),\n SyncDirection: this.AddSyncDirection,\n SourceFields: sourceFields,\n DDLContent: ddlContent,\n CreatedAt: new Date()\n };\n\n this.PendingMaps.push(pendingMap);\n this.SelectedMapID = pendingMap.LocalID;\n this.CloseAddPanel();\n }\n\n private ResetAddForm(): void {\n this.SelectedSourceObjectName = '';\n this.SelectedEntityID = null;\n this.NewEntitySchemaName = '';\n this.NewEntityTableName = '';\n this.NewEntityName = '';\n this.AddSyncDirection = 'Pull';\n this.DDLPreviewContent = '';\n this.DDLPreviewError = '';\n }\n\n private async EnsureEntitiesLoaded(): Promise<void> {\n if (this.MJEntities.length > 0) return;\n this.IsLoadingEntities = true;\n this.cdr.detectChanges();\n try {\n this.MJEntities = await this.dataService.LoadMJEntities(this.RunViewToUse);\n } finally {\n this.IsLoadingEntities = false;\n this.cdr.detectChanges();\n }\n }\n\n private LoadDBSchemas(): void {\n if (this.DBSchemas.length > 0) return;\n const md = new Metadata();\n const schemaSet = new Set<string>();\n for (const entity of md.Entities) {\n if (entity.SchemaName) {\n schemaSet.add(entity.SchemaName);\n }\n }\n this.DBSchemas = Array.from(schemaSet).sort();\n }\n\n // =====================================================================\n // DDL Preview for Add Panel\n // =====================================================================\n\n async PreviewDDL(): Promise<void> {\n if (!this.SelectedSourceObjectName || !this.NewEntitySchemaName.trim() || !this.NewEntityTableName.trim()) return;\n this.IsGeneratingDDL = true;\n this.DDLPreviewContent = '';\n this.DDLPreviewError = '';\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.SchemaPreview(\n this.SelectedIntegrationID,\n [{\n SourceObjectName: this.SelectedSourceObjectName,\n SchemaName: this.NewEntitySchemaName.trim(),\n TableName: this.NewEntityTableName.trim(),\n EntityName: this.NewEntityName.trim() || this.SuggestedEntityName\n }],\n 'sqlserver'\n );\n\n if (result.Success && result.Files.length > 0) {\n this.DDLPreviewContent = result.Files.map(f => `-- ${f.Description}\\n-- ${f.FilePath}\\n\\n${f.Content}`).join('\\n\\n');\n } else {\n this.DDLPreviewError = result.Message || 'No DDL generated';\n }\n } catch (e) {\n this.DDLPreviewError = `DDL generation failed: ${(e as Error).message}`;\n } finally {\n this.IsGeneratingDDL = false;\n this.cdr.detectChanges();\n }\n }\n\n // =====================================================================\n // Field Mapping\n // =====================================================================\n\n private ToEditableField(fm: FieldMapRow): EditableFieldMap {\n // Look up source metadata from IntegrationObjectField entities\n const srcMeta = this.SourceFields.find(\n sf => sf.Name.toLowerCase() === fm.SourceFieldName.toLowerCase()\n );\n return {\n ID: fm.ID,\n SourceFieldName: fm.SourceFieldName,\n SourceFieldLabel: fm.SourceFieldLabel ?? '',\n SourceFieldType: srcMeta?.Type ?? '',\n DestinationFieldName: fm.DestinationFieldName,\n DestinationFieldLabel: fm.DestinationFieldLabel ?? '',\n IsKeyField: fm.IsKeyField,\n IsRequired: fm.IsRequired,\n Direction: fm.Direction,\n Status: fm.Status as 'Active' | 'Inactive',\n IsNew: false,\n IsDirty: false,\n IsSourcePK: srcMeta?.IsPrimaryKey ?? false,\n IsSourceRequired: srcMeta?.IsRequired ?? false,\n IsSourceReadOnly: srcMeta?.IsReadOnly ?? false,\n TransformPipeline: this.ParseTransformPipeline(fm.TransformPipeline),\n ShowTransformEditor: false\n };\n }\n\n private ParseTransformPipeline(json: string | null): TransformStepUI[] {\n if (!json || json.trim() === '') return [];\n try {\n const parsed: unknown = JSON.parse(json);\n if (!Array.isArray(parsed)) return [];\n return (parsed as TransformStepUI[]).map(step => ({\n Type: step.Type ?? 'direct',\n Config: (step.Config as Record<string, unknown>) ?? {},\n OnError: step.OnError ?? 'Fail'\n }));\n } catch {\n return [];\n }\n }\n\n SerializeTransformPipeline(steps: TransformStepUI[]): string | null {\n if (steps.length === 0) return null;\n return JSON.stringify(steps.map(s => ({ Type: s.Type, Config: s.Config, OnError: s.OnError })));\n }\n\n private async LoadDestinationFields(entityID: string): Promise<void> {\n this.IsLoadingDestFields = true;\n this.cdr.detectChanges();\n try {\n this.DestinationFields = await this.dataService.LoadEntityFields(entityID, this.RunViewToUse);\n } finally {\n this.IsLoadingDestFields = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Auto-generate field mappings by matching source fields to destination by name */\n async AutoGenerateFieldMappings(entityMap: EntityMapRow): Promise<void> {\n // Resolve source fields from IntegrationObject metadata\n this.IsLoadingSourceFields = true;\n this.cdr.detectChanges();\n try {\n this.SourceFields = this.resolveSourceFieldsFromMetadata(\n this.SelectedIntegrationID,\n entityMap.ExternalObjectName\n );\n\n if (this.SourceFields.length === 0) return;\n\n // Load destination fields\n await this.LoadDestinationFields(entityMap.EntityID);\n\n // Match fields by name (case-insensitive)\n const matchedFields = this.MatchFieldsByName(this.SourceFields, this.DestinationFields);\n this.AutoMapCount = matchedFields.length;\n this.ShowAutoMapBanner = this.AutoMapCount > 0;\n\n // Create field maps for matches, preserving source field order via Priority\n for (let idx = 0; idx < matchedFields.length; idx++) {\n const match = matchedFields[idx];\n const displayName = match.sourceField.DisplayName || match.sourceField.Name;\n await this.dataService.CreateFieldMap({\n EntityMapID: entityMap.ID,\n SourceFieldName: match.sourceField.Name,\n SourceFieldLabel: displayName !== match.sourceField.Name ? displayName : undefined,\n DestinationFieldName: match.destField.Name,\n IsKeyField: match.sourceField.IsPrimaryKey,\n IsRequired: match.sourceField.IsRequired,\n Direction: 'SourceToDest',\n TransformPipeline: JSON.stringify([{ Type: 'direct', Config: {}, OnError: 'Fail' }]),\n Priority: match.sourceIndex\n });\n }\n\n // Reload field maps\n this.FieldMaps = await this.dataService.LoadFieldMaps(entityMap.ID, this.RunViewToUse);\n this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));\n } finally {\n this.IsLoadingSourceFields = false;\n this.cdr.detectChanges();\n }\n }\n\n private MatchFieldsByName(\n sourceFields: MJIntegrationObjectFieldEntity[],\n destFields: MJFieldOption[]\n ): Array<{ sourceField: MJIntegrationObjectFieldEntity; destField: MJFieldOption; sourceIndex: number }> {\n const matches: Array<{ sourceField: MJIntegrationObjectFieldEntity; destField: MJFieldOption; sourceIndex: number }> = [];\n const destFieldMap = new Map<string, MJFieldOption>();\n for (const df of destFields) {\n destFieldMap.set(df.Name.toLowerCase(), df);\n }\n\n for (let i = 0; i < sourceFields.length; i++) {\n const sf = sourceFields[i];\n const destMatch = destFieldMap.get(sf.Name.toLowerCase());\n if (destMatch) {\n matches.push({ sourceField: sf, destField: destMatch, sourceIndex: i });\n }\n }\n return matches;\n }\n\n /** Validation: count fields missing destination mapping */\n get UnmappedRequiredCount(): number {\n return this.EditableFields.filter(\n f => f.Status === 'Active' && f.IsRequired && !f.DestinationFieldName\n ).length;\n }\n\n /** Validation: check if at least one key field is configured */\n get HasKeyField(): boolean {\n return this.EditableFields.some(f => f.Status === 'Active' && f.IsKeyField);\n }\n\n /** Validation: overall mapping readiness */\n get MappingValidation(): { IsValid: boolean; Warnings: string[] } {\n const warnings: string[] = [];\n if (this.UnmappedRequiredCount > 0) {\n warnings.push(`${this.UnmappedRequiredCount} required field(s) missing destination mapping`);\n }\n if (!this.HasKeyField && this.ActiveEditableFields.length > 0) {\n warnings.push('No key field configured — sync may create duplicates');\n }\n return { IsValid: warnings.length === 0, Warnings: warnings };\n }\n\n /** Re-run auto-mapping for the currently selected entity map */\n async RerunAutoMap(): Promise<void> {\n if (!this.SelectedEntityMap) return;\n await this.AutoGenerateFieldMappings(this.SelectedEntityMap);\n }\n\n OnFieldChanged(field: EditableFieldMap): void {\n field.IsDirty = true;\n }\n\n AddFieldMapping(): void {\n this.EditableFields.push({\n ID: null,\n SourceFieldName: '',\n SourceFieldLabel: '',\n SourceFieldType: '',\n DestinationFieldName: '',\n DestinationFieldLabel: '',\n IsKeyField: false,\n IsRequired: false,\n Direction: 'SourceToDest',\n Status: 'Active',\n IsNew: true,\n IsDirty: true,\n IsSourcePK: false,\n IsSourceRequired: false,\n IsSourceReadOnly: false,\n TransformPipeline: [],\n ShowTransformEditor: false\n });\n this.cdr.detectChanges();\n }\n\n RemoveFieldMapping(index: number): void {\n const field = this.EditableFields[index];\n if (field.IsNew) {\n this.EditableFields.splice(index, 1);\n } else if (field.ID) {\n field.Status = 'Inactive';\n field.IsDirty = true;\n }\n this.cdr.detectChanges();\n }\n\n async SaveFieldMappings(): Promise<void> {\n if (!this.SelectedEntityMap) return;\n this.IsSavingFields = true;\n this.cdr.detectChanges();\n\n try {\n for (const field of this.EditableFields) {\n if (!field.IsDirty) continue;\n\n if (field.IsNew && field.SourceFieldName && field.DestinationFieldName) {\n await this.dataService.CreateFieldMap({\n EntityMapID: this.SelectedEntityMap.ID,\n SourceFieldName: field.SourceFieldName,\n SourceFieldLabel: field.SourceFieldLabel || undefined,\n DestinationFieldName: field.DestinationFieldName,\n DestinationFieldLabel: field.DestinationFieldLabel || undefined,\n IsKeyField: field.IsKeyField,\n IsRequired: field.IsRequired,\n Direction: field.Direction,\n TransformPipeline: this.SerializeTransformPipeline(field.TransformPipeline)\n });\n } else if (field.ID && field.Status === 'Inactive') {\n await this.dataService.DeleteFieldMap(field.ID);\n } else if (field.ID) {\n await this.dataService.UpdateFieldMap(field.ID, {\n SourceFieldName: field.SourceFieldName,\n DestinationFieldName: field.DestinationFieldName,\n IsKeyField: field.IsKeyField,\n IsRequired: field.IsRequired,\n Direction: field.Direction,\n Status: field.Status,\n TransformPipeline: this.SerializeTransformPipeline(field.TransformPipeline)\n });\n }\n }\n\n this.FieldMaps = await this.dataService.LoadFieldMaps(this.SelectedEntityMap.ID, this.RunViewToUse);\n this.EditableFields = this.FieldMaps.map(fm => this.ToEditableField(fm));\n this.ShowAutoMapBanner = false;\n } finally {\n this.IsSavingFields = false;\n this.cdr.detectChanges();\n }\n }\n\n DismissAutoMapBanner(): void {\n this.ShowAutoMapBanner = false;\n }\n\n // =====================================================================\n // Transform Pipeline\n // =====================================================================\n\n /** Available transform types with display metadata */\n readonly TransformTypes: Array<{ Value: TransformType; Label: string; Icon: string; Description: string }> = [\n { Value: 'direct', Label: 'Direct', Icon: 'fa-solid fa-arrow-right', Description: 'Pass through as-is (with optional default)' },\n { Value: 'regex', Label: 'Regex', Icon: 'fa-solid fa-code', Description: 'Apply regex pattern replacement' },\n { Value: 'split', Label: 'Split', Icon: 'fa-solid fa-scissors', Description: 'Split text and extract a segment' },\n { Value: 'combine', Label: 'Combine', Icon: 'fa-solid fa-object-group', Description: 'Merge multiple source fields' },\n { Value: 'lookup', Label: 'Lookup', Icon: 'fa-solid fa-book', Description: 'Map values using a lookup table' },\n { Value: 'format', Label: 'Format', Icon: 'fa-solid fa-font', Description: 'Format dates, numbers, or strings' },\n { Value: 'coerce', Label: 'Coerce', Icon: 'fa-solid fa-exchange-alt', Description: 'Convert to a different data type' },\n { Value: 'substring', Label: 'Substring', Icon: 'fa-solid fa-text-width', Description: 'Extract a portion of text' },\n { Value: 'custom', Label: 'Custom', Icon: 'fa-solid fa-wand-magic-sparkles', Description: 'Custom JavaScript expression' }\n ];\n\n ToggleTransformEditor(field: EditableFieldMap): void {\n // Auto-add a direct step if none exist so the editor has something to show\n if (field.TransformPipeline.length === 0) {\n field.TransformPipeline.push({ Type: 'direct', Config: {}, OnError: 'Fail' });\n field.IsDirty = true;\n }\n field.ShowTransformEditor = !field.ShowTransformEditor;\n this.cdr.detectChanges();\n }\n\n AddTransformStep(field: EditableFieldMap): void {\n field.TransformPipeline.push({\n Type: 'direct',\n Config: {},\n OnError: 'Fail'\n });\n field.IsDirty = true;\n field.ShowTransformEditor = true;\n this.cdr.detectChanges();\n }\n\n RemoveTransformStep(field: EditableFieldMap, stepIndex: number): void {\n field.TransformPipeline.splice(stepIndex, 1);\n field.IsDirty = true;\n this.cdr.detectChanges();\n }\n\n OnTransformTypeChange(field: EditableFieldMap, step: TransformStepUI, newType: TransformType): void {\n step.Type = newType;\n step.Config = this.GetDefaultConfigForType(newType);\n field.IsDirty = true;\n this.cdr.detectChanges();\n }\n\n OnTransformConfigChange(field: EditableFieldMap): void {\n field.IsDirty = true;\n }\n\n private GetDefaultConfigForType(type: TransformType): Record<string, unknown> {\n switch (type) {\n case 'direct': return {};\n case 'regex': return { Pattern: '', Replacement: '', Flags: 'g' };\n case 'split': return { Delimiter: ',', Index: 0 };\n case 'combine': return { SourceFields: [], Separator: ' ' };\n case 'lookup': return { Map: {}, Default: null };\n case 'format': return { FormatString: 'ISO', FormatType: 'date' };\n case 'coerce': return { TargetType: 'string' };\n case 'substring': return { Start: 0, Length: 10 };\n case 'custom': return { Expression: 'value' };\n }\n }\n\n GetTransformLabel(type: TransformType): string {\n return this.TransformTypes.find(t => t.Value === type)?.Label ?? type;\n }\n\n GetTransformIcon(type: TransformType): string {\n return this.TransformTypes.find(t => t.Value === type)?.Icon ?? 'fa-solid fa-arrow-right';\n }\n\n /** For combine transforms: get available source field names */\n GetAvailableSourceFields(): string[] {\n return this.SourceFields.map(sf => sf.Name);\n }\n\n /**\n * Resolve source fields from IntegrationObjectField metadata via IntegrationEngineBase.\n * CompanyIntegrationID → Integration → IntegrationObject → IntegrationObjectFields.\n */\n private resolveSourceFieldsFromMetadata(\n companyIntegrationID: string,\n externalObjectName: string\n ): MJIntegrationObjectFieldEntity[] {\n const engine = IntegrationEngineBase.Instance;\n const integration = engine.GetIntegrationForCompanyIntegration(companyIntegrationID);\n if (!integration) return [];\n\n const obj = engine.GetIntegrationObject(integration.ID, externalObjectName);\n if (!obj) return [];\n\n return engine.GetIntegrationObjectFields(obj.ID)\n .filter(f => f.Status === 'Active')\n .sort((a, b) => a.Sequence - b.Sequence);\n }\n\n /** For lookup transforms: add a new key-value pair */\n AddLookupEntry(config: Record<string, unknown>): void {\n const map = (config['Map'] as Record<string, string>) ?? {};\n map[''] = '';\n config['Map'] = map;\n }\n\n GetLookupEntries(config: Record<string, unknown>): Array<{ key: string; value: string }> {\n const map = (config['Map'] as Record<string, string>) ?? {};\n return Object.entries(map).map(([key, value]) => ({ key, value: String(value) }));\n }\n\n UpdateLookupEntry(config: Record<string, unknown>, oldKey: string, newKey: string, newValue: string): void {\n const map = (config['Map'] as Record<string, string>) ?? {};\n if (oldKey !== newKey) {\n delete map[oldKey];\n }\n map[newKey] = newValue;\n config['Map'] = { ...map };\n }\n\n RemoveLookupEntry(config: Record<string, unknown>, key: string): void {\n const map = (config['Map'] as Record<string, string>) ?? {};\n delete map[key];\n config['Map'] = { ...map };\n }\n\n /** For combine transforms: toggle a source field */\n ToggleCombineField(config: Record<string, unknown>, fieldName: string): void {\n const fields = (config['SourceFields'] as string[]) ?? [];\n const idx = fields.indexOf(fieldName);\n if (idx >= 0) {\n fields.splice(idx, 1);\n } else {\n fields.push(fieldName);\n }\n config['SourceFields'] = [...fields];\n }\n\n IsCombineFieldSelected(config: Record<string, unknown>, fieldName: string): boolean {\n const fields = (config['SourceFields'] as string[]) ?? [];\n return fields.includes(fieldName);\n }\n\n // =====================================================================\n // Data Preview\n // =====================================================================\n\n async LoadSourcePreview(): Promise<void> {\n if (!this.SelectedEntityMap) return;\n this.IsLoadingSourcePreview = true;\n this.ShowSourcePreview = true;\n this.SourcePreviewData = [];\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.PreviewSourceData(\n this.SelectedIntegrationID,\n this.SelectedEntityMap.ExternalObjectName,\n 5\n );\n this.SourcePreviewData = result;\n } catch (e) {\n console.error('[MappingWorkspace] Source preview failed:', (e as Error).message);\n } finally {\n this.IsLoadingSourcePreview = false;\n this.cdr.detectChanges();\n }\n }\n\n async LoadDestPreview(): Promise<void> {\n if (!this.SelectedEntityMap) return;\n this.IsLoadingDestPreview = true;\n this.ShowDestPreview = true;\n this.DestPreviewData = [];\n this.cdr.detectChanges();\n\n try {\n const result = await this.dataService.PreviewDestinationData(\n this.SelectedEntityMap.EntityID,\n 5,\n this.RunViewToUse\n );\n this.DestPreviewData = result;\n } catch (e) {\n console.error('[MappingWorkspace] Dest preview failed:', (e as Error).message);\n } finally {\n this.IsLoadingDestPreview = false;\n this.cdr.detectChanges();\n }\n }\n\n CloseSourcePreview(): void {\n this.ShowSourcePreview = false;\n this.SourcePreviewData = [];\n }\n\n CloseDestPreview(): void {\n this.ShowDestPreview = false;\n this.DestPreviewData = [];\n }\n\n private CloseAllPreviews(): void {\n this.CloseSourcePreview();\n this.CloseDestPreview();\n this.ShowAutoMapBanner = false;\n }\n\n GetPreviewColumns(data: PreviewRecord[]): string[] {\n if (data.length === 0) return [];\n return Object.keys(data[0]).slice(0, 8); // Limit to 8 columns for readability\n }\n\n FormatPreviewValue(value: string | number | boolean | null): string {\n if (value == null) return '--';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n const str = String(value);\n return str.length > 50 ? str.substring(0, 47) + '...' : str;\n }\n\n // =====================================================================\n // Pending Map Actions\n // =====================================================================\n\n CopyDDLToClipboard(ddl: string): void {\n navigator.clipboard.writeText(ddl).catch(() => {\n console.error('[MappingWorkspace] Failed to copy DDL to clipboard');\n });\n }\n\n GetPendingStepStatus(pendingMap: PendingMapEntry, step: number): 'current' | 'done' | 'future' {\n // Step 1: Map Created — always done for pending maps\n // Step 2: DDL Generated — done if DDL content exists\n // Step 3: Deploy & CodeGen — always future (manual step)\n // Step 4: Ready to Sync — always future\n if (step === 1) return 'done';\n if (step === 2) return pendingMap.DDLContent ? 'done' : 'current';\n return 'future';\n }\n\n // =====================================================================\n // Helpers\n // =====================================================================\n\n get RunStatusColor(): string {\n if (!this.LatestRun) return 'gray';\n if (this.LatestRun.Status === 'Success') return 'green';\n if (this.LatestRun.Status === 'Failed') return 'red';\n return 'amber';\n }\n\n FormatDate(dateStr: string | null): string {\n if (!dateStr) return '--';\n return new Date(dateStr).toLocaleString(undefined, {\n month: 'short', day: 'numeric',\n hour: '2-digit', minute: '2-digit'\n });\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Mapping Workspace';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-diagram-project';\n }\n}\n\nexport function LoadMappingWorkspace(): void {\n // Tree-shaking prevention\n}\n","<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: var(--mj-brand-primary);\">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: var(--mj-text-muted); 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: var(--mj-brand-primary);\">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"]}