@expeed/ngx-data-mapper 1.3.0 → 1.3.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"expeed-ngx-data-mapper.mjs","sources":["../../../projects/ngx-data-mapper/src/lib/models/json-schema.model.ts","../../../projects/ngx-data-mapper/src/lib/services/mapping.service.ts","../../../projects/ngx-data-mapper/src/lib/services/transformation.service.ts","../../../projects/ngx-data-mapper/src/lib/services/svg-connector.service.ts","../../../projects/ngx-data-mapper/src/lib/services/schema-parser.service.ts","../../../projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.ts","../../../projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.html","../../../projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.ts","../../../projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.html","../../../projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.ts","../../../projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.html","../../../projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.ts","../../../projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.html","../../../projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.ts","../../../projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.html","../../../projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.ts","../../../projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.html","../../../projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.ts","../../../projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.html","../../../projects/ngx-data-mapper/src/lib/components/schema-editor/field-item/field-item.component.ts","../../../projects/ngx-data-mapper/src/lib/components/schema-editor/field-item/field-item.component.html","../../../projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.ts","../../../projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.html","../../../projects/ngx-data-mapper/src/public-api.ts","../../../projects/ngx-data-mapper/src/expeed-ngx-data-mapper.ts"],"sourcesContent":["/**\r\n * Standard JSON Schema (draft-07) TypeScript interfaces\r\n */\r\n\r\nexport interface JsonSchema {\r\n $schema?: string;\r\n $id?: string;\r\n title?: string;\r\n description?: string;\r\n type?: JsonSchemaType | JsonSchemaType[];\r\n properties?: Record<string, JsonSchema>;\r\n items?: JsonSchema;\r\n required?: string[];\r\n enum?: (string | number | boolean | null)[];\r\n const?: unknown;\r\n default?: unknown;\r\n\r\n // String validations\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: string;\r\n format?: string;\r\n\r\n // Number validations\r\n minimum?: number;\r\n maximum?: number;\r\n exclusiveMinimum?: number;\r\n exclusiveMaximum?: number;\r\n multipleOf?: number;\r\n\r\n // Array validations\r\n minItems?: number;\r\n maxItems?: number;\r\n uniqueItems?: boolean;\r\n\r\n // Object validations\r\n minProperties?: number;\r\n maxProperties?: number;\r\n additionalProperties?: boolean | JsonSchema;\r\n\r\n // Combining schemas\r\n allOf?: JsonSchema[];\r\n anyOf?: JsonSchema[];\r\n oneOf?: JsonSchema[];\r\n not?: JsonSchema;\r\n\r\n // References\r\n $ref?: string;\r\n definitions?: Record<string, JsonSchema>;\r\n}\r\n\r\nexport type JsonSchemaType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'null';\r\n\r\n/**\r\n * Helper type for working with JSON schemas in the UI\r\n */\r\nexport interface JsonSchemaField {\r\n name: string;\r\n path: string;\r\n schema: JsonSchema;\r\n children?: JsonSchemaField[];\r\n expanded?: boolean;\r\n}\r\n\r\n/**\r\n * Convert JSON Schema to flat field list for UI rendering\r\n */\r\nexport function schemaToFields(schema: JsonSchema, parentPath: string = ''): JsonSchemaField[] {\r\n const fields: JsonSchemaField[] = [];\r\n\r\n if (schema.type === 'object' && schema.properties) {\r\n for (const [name, propSchema] of Object.entries(schema.properties)) {\r\n const path = parentPath ? `${parentPath}.${name}` : name;\r\n const field: JsonSchemaField = {\r\n name,\r\n path,\r\n schema: propSchema,\r\n expanded: false,\r\n };\r\n\r\n if (propSchema.type === 'object' && propSchema.properties) {\r\n field.children = schemaToFields(propSchema, path);\r\n } else if (propSchema.type === 'array' && propSchema.items) {\r\n field.children = schemaToFields(propSchema.items, `${path}[]`);\r\n }\r\n\r\n fields.push(field);\r\n }\r\n }\r\n\r\n return fields;\r\n}\r\n\r\n/**\r\n * Get the simple type for display purposes\r\n */\r\nexport function getSchemaType(schema: JsonSchema): string {\r\n if (Array.isArray(schema.type)) {\r\n return schema.type.filter(t => t !== 'null').join(' | ');\r\n }\r\n if (schema.type === 'integer') {\r\n return 'number';\r\n }\r\n if (schema.format === 'date' || schema.format === 'date-time') {\r\n return 'date';\r\n }\r\n return schema.type || 'any';\r\n}\r\n\r\n/**\r\n * Create an empty JSON Schema for a new schema definition\r\n */\r\nexport function createEmptySchema(title: string = 'New Schema'): JsonSchema {\r\n return {\r\n $schema: 'http://json-schema.org/draft-07/schema#',\r\n title,\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n}\r\n\r\n/**\r\n * Add a property to a schema\r\n */\r\nexport function addProperty(\r\n schema: JsonSchema,\r\n name: string,\r\n type: JsonSchemaType,\r\n options?: { description?: string; required?: boolean }\r\n): JsonSchema {\r\n const newSchema = { ...schema };\r\n newSchema.properties = { ...newSchema.properties };\r\n\r\n const propSchema: JsonSchema = { type };\r\n if (options?.description) {\r\n propSchema.description = options.description;\r\n }\r\n\r\n if (type === 'object') {\r\n propSchema.properties = {};\r\n } else if (type === 'array') {\r\n propSchema.items = { type: 'string' };\r\n }\r\n\r\n newSchema.properties[name] = propSchema;\r\n\r\n if (options?.required) {\r\n newSchema.required = [...(newSchema.required || []), name];\r\n }\r\n\r\n return newSchema;\r\n}\r\n\r\n/**\r\n * Remove a property from a schema\r\n */\r\nexport function removeProperty(schema: JsonSchema, name: string): JsonSchema {\r\n const newSchema = { ...schema };\r\n newSchema.properties = { ...newSchema.properties };\r\n delete newSchema.properties[name];\r\n newSchema.required = (newSchema.required || []).filter(r => r !== name);\r\n return newSchema;\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\nimport {\n FieldMapping,\n ArrayMapping,\n ArrayToObjectMapping,\n ArraySelectorConfig,\n SchemaField,\n TransformationConfig,\n Connection,\n DragState,\n ArrayFilterConfig,\n DefaultValue,\n} from '../models/schema.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MappingService {\n private mappings = signal<FieldMapping[]>([]);\n private arrayMappings = signal<ArrayMapping[]>([]);\n private arrayToObjectMappings = signal<ArrayToObjectMapping[]>([]);\n private defaultValues = signal<DefaultValue[]>([]);\n private selectedMappingId = signal<string | null>(null);\n private _sourceSchemaRef = signal<string | null>(null);\n private _targetSchemaRef = signal<string | null>(null);\n private dragState = signal<DragState>({\n isDragging: false,\n sourceField: null,\n startPoint: null,\n currentPoint: null,\n dragMode: 'new',\n });\n\n readonly allMappings = computed(() => this.mappings());\n readonly allArrayMappings = computed(() => this.arrayMappings());\n readonly allArrayToObjectMappings = computed(() => this.arrayToObjectMappings());\n readonly allDefaultValues = computed(() => this.defaultValues());\n readonly sourceSchemaRef = computed(() => this._sourceSchemaRef());\n readonly targetSchemaRef = computed(() => this._targetSchemaRef());\n readonly selectedMapping = computed(() => {\n const id = this.selectedMappingId();\n return this.mappings().find((m) => m.id === id) || null;\n });\n readonly currentDragState = computed(() => this.dragState());\n\n private generateId(): string {\n return `mapping-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n startDrag(field: SchemaField, startPoint: { x: number; y: number }): void {\n this.dragState.set({\n isDragging: true,\n sourceField: field,\n startPoint,\n currentPoint: startPoint,\n dragMode: 'new',\n });\n }\n\n startEndpointDrag(\n mappingId: string,\n endpointType: 'source' | 'target',\n startPoint: { x: number; y: number },\n sourceFieldIndex?: number\n ): void {\n const mapping = this.mappings().find(m => m.id === mappingId);\n if (!mapping) return;\n\n // For source endpoint, we show the line from target back to cursor\n // For target endpoint, we show the line from source(s) to cursor\n const dragMode = endpointType === 'source' ? 'move-source' : 'move-target';\n\n this.dragState.set({\n isDragging: true,\n sourceField: endpointType === 'source'\n ? mapping.sourceFields[sourceFieldIndex ?? 0]\n : mapping.targetField,\n startPoint,\n currentPoint: startPoint,\n dragMode,\n mappingId,\n sourceFieldIndex,\n });\n }\n\n updateDragPosition(currentPoint: { x: number; y: number }): void {\n this.dragState.update((state) => ({\n ...state,\n currentPoint,\n }));\n }\n\n endDrag(): void {\n this.dragState.set({\n isDragging: false,\n sourceField: null,\n startPoint: null,\n currentPoint: null,\n dragMode: 'new',\n });\n }\n\n changeSourceField(mappingId: string, newSourceField: SchemaField, sourceFieldIndex?: number): void {\n const mapping = this.mappings().find(m => m.id === mappingId);\n if (!mapping) return;\n\n // Don't allow if new source is the same as target\n if (newSourceField.id === mapping.targetField.id) return;\n\n // Don't allow if source already exists in the mapping\n if (mapping.sourceFields.some(sf => sf.id === newSourceField.id)) return;\n\n if (sourceFieldIndex !== undefined && mapping.sourceFields.length > 1) {\n // Replace specific source field in multi-source mapping\n const newSourceFields = [...mapping.sourceFields];\n newSourceFields[sourceFieldIndex] = newSourceField;\n this.mappings.update(mappings =>\n mappings.map(m => m.id === mappingId ? { ...m, sourceFields: newSourceFields } : m)\n );\n } else {\n // Single source mapping - replace the source field\n this.mappings.update(mappings =>\n mappings.map(m => m.id === mappingId ? { ...m, sourceFields: [newSourceField] } : m)\n );\n }\n }\n\n changeTargetField(mappingId: string, newTargetField: SchemaField): void {\n const mapping = this.mappings().find(m => m.id === mappingId);\n if (!mapping) return;\n\n // Don't allow if new target is same as any source\n if (mapping.sourceFields.some(sf => sf.id === newTargetField.id)) return;\n\n // Check if another mapping already targets this field\n const existingMapping = this.mappings().find(\n m => m.targetField.id === newTargetField.id && m.id !== mappingId\n );\n\n if (existingMapping) {\n // Merge into existing mapping (add sources)\n const mergedSources = [\n ...existingMapping.sourceFields,\n ...mapping.sourceFields.filter(\n sf => !existingMapping.sourceFields.some(esf => esf.id === sf.id)\n ),\n ];\n\n this.mappings.update(mappings =>\n mappings\n .filter(m => m.id !== mappingId) // Remove old mapping\n .map(m => m.id === existingMapping.id\n ? {\n ...m,\n sourceFields: mergedSources,\n transformations: mergedSources.length > 1\n ? [{ type: 'concat' as const, separator: ' ' }]\n : m.transformations,\n }\n : m\n )\n );\n } else {\n // Simply update the target field\n this.mappings.update(mappings =>\n mappings.map(m => m.id === mappingId ? { ...m, targetField: newTargetField } : m)\n );\n }\n }\n\n createMapping(\n sourceFields: SchemaField[],\n targetField: SchemaField,\n transformation?: TransformationConfig\n ): FieldMapping {\n // Check if this is an array-to-array mapping\n const sourceField = sourceFields[0];\n if (sourceField.type === 'array' && targetField.type === 'array') {\n return this.createArrayMapping(sourceField, targetField);\n }\n\n // Check if this is an array-to-object mapping\n if (sourceField.type === 'array' && targetField.type === 'object') {\n return this.createArrayToObjectMapping(sourceField, targetField);\n }\n\n // Check if fields are within arrays and need array context\n const arrayMappingId = this.findOrCreateArrayContext(sourceField, targetField);\n\n // Check if fields need array-to-object context\n const arrayToObjectMappingId = this.findOrCreateArrayToObjectContext(sourceField, targetField);\n\n const existingMapping = this.mappings().find(\n (m) => m.targetField.id === targetField.id\n );\n\n if (existingMapping) {\n // Add source fields to existing mapping (for concat scenarios)\n const updatedMapping: FieldMapping = {\n ...existingMapping,\n sourceFields: [\n ...existingMapping.sourceFields,\n ...sourceFields.filter(\n (sf) => !existingMapping.sourceFields.some((esf) => esf.id === sf.id)\n ),\n ],\n transformations:\n existingMapping.sourceFields.length + sourceFields.length > 1\n ? [{ type: 'concat', separator: ' ', ...transformation }]\n : transformation ? [transformation] : [{ type: 'direct' }],\n };\n\n this.mappings.update((mappings) =>\n mappings.map((m) => (m.id === existingMapping.id ? updatedMapping : m))\n );\n\n return updatedMapping;\n }\n\n const newMapping: FieldMapping = {\n id: this.generateId(),\n sourceFields,\n targetField,\n transformations: transformation ? [transformation] : [{ type: 'direct' }],\n isArrayMapping: false, // Only true for array-to-array connections\n arrayMappingId, // Links to parent array mapping if within array context\n isArrayToObjectMapping: false,\n arrayToObjectMappingId, // Links to parent array-to-object mapping if applicable\n };\n\n this.mappings.update((mappings) => [...mappings, newMapping]);\n\n // If this is part of an array mapping, add to itemMappings\n if (arrayMappingId) {\n this.arrayMappings.update((ams) =>\n ams.map((am) =>\n am.id === arrayMappingId\n ? { ...am, itemMappings: [...am.itemMappings, newMapping] }\n : am\n )\n );\n }\n\n // If this is part of an array-to-object mapping, add to itemMappings\n if (arrayToObjectMappingId) {\n this.arrayToObjectMappings.update((ams) =>\n ams.map((am) =>\n am.id === arrayToObjectMappingId\n ? { ...am, itemMappings: [...am.itemMappings, newMapping] }\n : am\n )\n );\n }\n\n return newMapping;\n }\n\n private createArrayMapping(\n sourceArray: SchemaField,\n targetArray: SchemaField\n ): FieldMapping {\n // Check if array mapping already exists\n const existingArrayMapping = this.arrayMappings().find(\n (am) => am.sourceArray.id === sourceArray.id && am.targetArray.id === targetArray.id\n );\n\n if (existingArrayMapping) {\n // Return a dummy field mapping representing the array mapping\n const existing = this.mappings().find(m => m.id === existingArrayMapping.id);\n if (existing) return existing;\n }\n\n const arrayMapping: ArrayMapping = {\n id: this.generateId(),\n sourceArray,\n targetArray,\n itemMappings: [],\n };\n\n this.arrayMappings.update((ams) => [...ams, arrayMapping]);\n\n // Also create a field mapping to visualize the array connection\n const fieldMapping: FieldMapping = {\n id: arrayMapping.id,\n sourceFields: [sourceArray],\n targetField: targetArray,\n transformations: [{ type: 'direct' }],\n isArrayMapping: true,\n };\n\n this.mappings.update((mappings) => [...mappings, fieldMapping]);\n\n return fieldMapping;\n }\n\n private createArrayToObjectMapping(\n sourceArray: SchemaField,\n targetObject: SchemaField\n ): FieldMapping {\n // Check if array-to-object mapping already exists\n const existingMapping = this.arrayToObjectMappings().find(\n (am) => am.sourceArray.id === sourceArray.id && am.targetObject.id === targetObject.id\n );\n\n if (existingMapping) {\n const existing = this.mappings().find(m => m.id === existingMapping.id);\n if (existing) return existing;\n }\n\n const arrayToObjectMapping: ArrayToObjectMapping = {\n id: this.generateId(),\n sourceArray,\n targetObject,\n selector: { mode: 'first' }, // Default to first item\n itemMappings: [],\n };\n\n this.arrayToObjectMappings.update((ams) => [...ams, arrayToObjectMapping]);\n\n // Create a field mapping to visualize the connection\n const fieldMapping: FieldMapping = {\n id: arrayToObjectMapping.id,\n sourceFields: [sourceArray],\n targetField: targetObject,\n transformations: [{ type: 'direct' }],\n isArrayToObjectMapping: true,\n };\n\n this.mappings.update((mappings) => [...mappings, fieldMapping]);\n\n return fieldMapping;\n }\n\n private findOrCreateArrayContext(\n sourceField: SchemaField,\n targetField: SchemaField\n ): string | undefined {\n // If both fields are array items, check if an array mapping exists\n if (sourceField.isArrayItem && targetField.isArrayItem) {\n const existingArrayMapping = this.arrayMappings().find(\n (am) =>\n am.sourceArray.path === sourceField.parentArrayPath &&\n am.targetArray.path === targetField.parentArrayPath\n );\n\n if (existingArrayMapping) {\n return existingArrayMapping.id;\n }\n }\n\n return undefined;\n }\n\n private findOrCreateArrayToObjectContext(\n sourceField: SchemaField,\n targetField: SchemaField\n ): string | undefined {\n // If source is array item and target is within an object (not array item)\n if (sourceField.isArrayItem && !targetField.isArrayItem && targetField.path.includes('.')) {\n // Find the parent object path\n const targetParts = targetField.path.split('.');\n const parentObjectPath = targetParts.slice(0, -1).join('.');\n\n const existingMapping = this.arrayToObjectMappings().find(\n (am) =>\n am.sourceArray.path === sourceField.parentArrayPath &&\n am.targetObject.path === parentObjectPath\n );\n\n if (existingMapping) {\n return existingMapping.id;\n }\n }\n\n return undefined;\n }\n\n getArrayMapping(id: string): ArrayMapping | undefined {\n return this.arrayMappings().find((am) => am.id === id);\n }\n\n getArrayMappingForField(field: SchemaField): ArrayMapping | undefined {\n if (!field.parentArrayPath) return undefined;\n return this.arrayMappings().find(\n (am) =>\n am.sourceArray.path === field.parentArrayPath ||\n am.targetArray.path === field.parentArrayPath\n );\n }\n\n removeArrayMapping(arrayMappingId: string): void {\n // Remove the array mapping\n this.arrayMappings.update((ams) => ams.filter((am) => am.id !== arrayMappingId));\n\n // Remove all field mappings associated with this array mapping\n this.mappings.update((mappings) =>\n mappings.filter((m) => m.arrayMappingId !== arrayMappingId && m.id !== arrayMappingId)\n );\n }\n\n updateArrayFilter(arrayMappingId: string, filter: ArrayFilterConfig | undefined): void {\n this.arrayMappings.update((ams) =>\n ams.map((am) =>\n am.id === arrayMappingId ? { ...am, filter } : am\n )\n );\n }\n\n getArrayToObjectMapping(id: string): ArrayToObjectMapping | undefined {\n return this.arrayToObjectMappings().find((am) => am.id === id);\n }\n\n updateArrayToObjectSelector(mappingId: string, selector: ArraySelectorConfig): void {\n this.arrayToObjectMappings.update((ams) =>\n ams.map((am) =>\n am.id === mappingId ? { ...am, selector } : am\n )\n );\n }\n\n removeArrayToObjectMapping(mappingId: string): void {\n // Remove the array-to-object mapping\n this.arrayToObjectMappings.update((ams) => ams.filter((am) => am.id !== mappingId));\n\n // Remove all field mappings associated with this mapping\n this.mappings.update((mappings) =>\n mappings.filter((m) => m.arrayToObjectMappingId !== mappingId && m.id !== mappingId)\n );\n }\n\n updateMapping(\n mappingId: string,\n updates: Partial<FieldMapping>\n ): void {\n this.mappings.update((mappings) =>\n mappings.map((m) => (m.id === mappingId ? { ...m, ...updates } : m))\n );\n }\n\n updateTransformations(\n mappingId: string,\n transformations: TransformationConfig[]\n ): void {\n this.mappings.update((mappings) =>\n mappings.map((m) =>\n m.id === mappingId ? { ...m, transformations } : m\n )\n );\n }\n\n removeMapping(mappingId: string): void {\n this.mappings.update((mappings) =>\n mappings.filter((m) => m.id !== mappingId)\n );\n if (this.selectedMappingId() === mappingId) {\n this.selectedMappingId.set(null);\n }\n }\n\n removeSourceFromMapping(mappingId: string, sourceFieldId: string): void {\n const mapping = this.mappings().find((m) => m.id === mappingId);\n if (!mapping) return;\n\n if (mapping.sourceFields.length <= 1) {\n this.removeMapping(mappingId);\n } else {\n this.mappings.update((mappings) =>\n mappings.map((m) =>\n m.id === mappingId\n ? {\n ...m,\n sourceFields: m.sourceFields.filter(\n (sf) => sf.id !== sourceFieldId\n ),\n transformations:\n m.sourceFields.length - 1 === 1\n ? [{ type: 'direct' }]\n : m.transformations,\n }\n : m\n )\n );\n }\n }\n\n selectMapping(mappingId: string | null): void {\n this.selectedMappingId.set(mappingId);\n }\n\n getMappingForTarget(targetFieldId: string): FieldMapping | undefined {\n return this.mappings().find((m) => m.targetField.id === targetFieldId);\n }\n\n getMappingsForSource(sourceFieldId: string): FieldMapping[] {\n return this.mappings().filter((m) =>\n m.sourceFields.some((sf) => sf.id === sourceFieldId)\n );\n }\n\n clearAllMappings(): void {\n this.mappings.set([]);\n this.arrayMappings.set([]);\n this.arrayToObjectMappings.set([]);\n this.defaultValues.set([]);\n this.selectedMappingId.set(null);\n this._sourceSchemaRef.set(null);\n this._targetSchemaRef.set(null);\n }\n\n setSourceSchemaRef(ref: string | null): void {\n this._sourceSchemaRef.set(ref);\n }\n\n setTargetSchemaRef(ref: string | null): void {\n this._targetSchemaRef.set(ref);\n }\n\n // Default value methods\n setDefaultValue(targetField: SchemaField, value: string | number | boolean | Date | null): DefaultValue {\n const existingDefault = this.defaultValues().find(d => d.targetField.id === targetField.id);\n\n if (existingDefault) {\n const updated: DefaultValue = { ...existingDefault, value };\n this.defaultValues.update(dv => dv.map(d => d.id === existingDefault.id ? updated : d));\n return updated;\n }\n\n const newDefault: DefaultValue = {\n id: this.generateId(),\n targetField,\n value,\n };\n\n this.defaultValues.update(dv => [...dv, newDefault]);\n return newDefault;\n }\n\n getDefaultValue(targetFieldId: string): DefaultValue | undefined {\n return this.defaultValues().find(d => d.targetField.id === targetFieldId);\n }\n\n removeDefaultValue(targetFieldId: string): void {\n this.defaultValues.update(dv => dv.filter(d => d.targetField.id !== targetFieldId));\n }\n\n hasDefaultValue(targetFieldId: string): boolean {\n return this.defaultValues().some(d => d.targetField.id === targetFieldId);\n }\n\n exportMappings(name?: string, description?: string): string {\n const exportData: Record<string, unknown> = {\n version: '1.0',\n name: name || 'Mapping Configuration',\n description: description || '',\n mappings: this.mappings(),\n arrayMappings: this.arrayMappings(),\n arrayToObjectMappings: this.arrayToObjectMappings(),\n defaultValues: this.defaultValues(),\n };\n\n // Include schema refs if set\n if (this._sourceSchemaRef()) {\n exportData['sourceSchemaRef'] = this._sourceSchemaRef();\n }\n if (this._targetSchemaRef()) {\n exportData['targetSchemaRef'] = this._targetSchemaRef();\n }\n\n return JSON.stringify(exportData, null, 2);\n }\n\n /**\n * Export mappings as a MappingDocument object (not stringified)\n */\n exportMappingsAsObject(name?: string, description?: string): object {\n const exportData: Record<string, unknown> = {\n version: '1.0',\n name: name || 'Mapping Configuration',\n description: description || '',\n mappings: this.mappings(),\n arrayMappings: this.arrayMappings(),\n arrayToObjectMappings: this.arrayToObjectMappings(),\n defaultValues: this.defaultValues(),\n };\n\n // Include schema refs if set\n if (this._sourceSchemaRef()) {\n exportData['sourceSchemaRef'] = this._sourceSchemaRef();\n }\n if (this._targetSchemaRef()) {\n exportData['targetSchemaRef'] = this._targetSchemaRef();\n }\n\n return exportData;\n }\n\n importMappings(json: string): void {\n try {\n const data = JSON.parse(json);\n if (data.mappings) {\n this.mappings.set(data.mappings as FieldMapping[]);\n this.arrayMappings.set(data.arrayMappings as ArrayMapping[] || []);\n this.arrayToObjectMappings.set(data.arrayToObjectMappings as ArrayToObjectMapping[] || []);\n this.defaultValues.set(data.defaultValues as DefaultValue[] || []);\n this._sourceSchemaRef.set(data.sourceSchemaRef || null);\n this._targetSchemaRef.set(data.targetSchemaRef || null);\n } else {\n // Legacy format\n this.mappings.set(data as FieldMapping[]);\n }\n } catch (e) {\n console.error('Failed to import mappings:', e);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n TransformationConfig,\n TransformationType,\n SchemaField,\n FilterGroup,\n FilterCondition,\n FilterItem,\n FilterOperator,\n} from '../models/schema.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TransformationService {\n applyTransformation(\n sourceValues: Record<string, unknown>,\n sourceFields: SchemaField[],\n config: TransformationConfig\n ): string {\n const values = sourceFields.map((f) => this.getValueByPath(sourceValues, f.path));\n\n switch (config.type) {\n case 'direct':\n return String(values[0] ?? '');\n\n case 'concat':\n if (config.template) {\n return this.applyTemplate(config.template, sourceFields, sourceValues);\n }\n return values.join(config.separator ?? ' ');\n\n case 'substring':\n const str = String(values[0] ?? '');\n return str.substring(\n config.startIndex ?? 0,\n config.endIndex ?? str.length\n );\n\n case 'replace':\n return String(values[0] ?? '').replace(\n new RegExp(config.searchValue ?? '', 'g'),\n config.replaceValue ?? ''\n );\n\n case 'uppercase':\n return String(values[0] ?? '').toUpperCase();\n\n case 'lowercase':\n return String(values[0] ?? '').toLowerCase();\n\n case 'trim':\n return String(values[0] ?? '').trim();\n\n case 'mask':\n return this.applyMask(String(values[0] ?? ''), config.pattern ?? '');\n\n case 'dateFormat':\n return this.formatDate(\n values[0],\n config.inputFormat,\n config.outputFormat\n );\n\n case 'extractYear':\n return this.extractDatePart(values[0], 'year');\n\n case 'extractMonth':\n return this.extractDatePart(values[0], 'month');\n\n case 'extractDay':\n return this.extractDatePart(values[0], 'day');\n\n case 'extractHour':\n return this.extractDatePart(values[0], 'hour');\n\n case 'extractMinute':\n return this.extractDatePart(values[0], 'minute');\n\n case 'extractSecond':\n return this.extractDatePart(values[0], 'second');\n\n case 'numberFormat':\n return this.formatNumber(\n values[0],\n config.decimalPlaces,\n config.prefix,\n config.suffix\n );\n\n case 'template':\n return this.applyTemplate(\n config.template ?? '',\n sourceFields,\n sourceValues\n );\n\n default:\n return String(values[0] ?? '');\n }\n }\n\n /**\n * Apply a transformation to a single value (for chained transformations)\n */\n applyTransformationToValue(\n value: unknown,\n config: TransformationConfig\n ): string {\n const str = String(value ?? '');\n\n switch (config.type) {\n case 'direct':\n return str;\n\n case 'concat':\n // For single value, just return it (concat needs multiple values)\n return str;\n\n case 'substring':\n return str.substring(\n config.startIndex ?? 0,\n config.endIndex ?? str.length\n );\n\n case 'replace':\n return str.replace(\n new RegExp(config.searchValue ?? '', 'g'),\n config.replaceValue ?? ''\n );\n\n case 'uppercase':\n return str.toUpperCase();\n\n case 'lowercase':\n return str.toLowerCase();\n\n case 'trim':\n return str.trim();\n\n case 'mask':\n return this.applyMask(str, config.pattern ?? '');\n\n case 'dateFormat':\n return this.formatDate(value, config.inputFormat, config.outputFormat);\n\n case 'extractYear':\n return this.extractDatePart(value, 'year');\n\n case 'extractMonth':\n return this.extractDatePart(value, 'month');\n\n case 'extractDay':\n return this.extractDatePart(value, 'day');\n\n case 'extractHour':\n return this.extractDatePart(value, 'hour');\n\n case 'extractMinute':\n return this.extractDatePart(value, 'minute');\n\n case 'extractSecond':\n return this.extractDatePart(value, 'second');\n\n case 'numberFormat':\n return this.formatNumber(\n value,\n config.decimalPlaces,\n config.prefix,\n config.suffix\n );\n\n case 'template':\n // For single value, replace {0} with the value\n return (config.template ?? '').replace(/\\{0\\}/g, str);\n\n default:\n return str;\n }\n }\n\n /**\n * Apply multiple transformations in sequence, respecting conditions\n */\n applyTransformations(\n sourceValues: Record<string, unknown>,\n sourceFields: SchemaField[],\n transformations: TransformationConfig[]\n ): string {\n if (transformations.length === 0) {\n return '';\n }\n\n // Get initial value for first transformation\n const initialValues = sourceFields.map((f) => this.getValueByPath(sourceValues, f.path));\n const initialValue = initialValues.length === 1 ? initialValues[0] : initialValues.join(' ');\n\n // Apply first transformation using source fields (check condition first)\n let result: string;\n if (this.isConditionMet(initialValue, transformations[0])) {\n result = this.applyTransformation(sourceValues, sourceFields, transformations[0]);\n } else {\n result = String(initialValue ?? '');\n }\n\n // Apply subsequent transformations to the result\n for (let i = 1; i < transformations.length; i++) {\n if (this.isConditionMet(result, transformations[i])) {\n result = this.applyTransformationToValue(result, transformations[i]);\n }\n // If condition not met, result passes through unchanged\n }\n\n return result;\n }\n\n private getValueByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, part) => {\n if (acc && typeof acc === 'object') {\n return (acc as Record<string, unknown>)[part];\n }\n return undefined;\n }, obj);\n }\n\n private applyTemplate(\n template: string,\n sourceFields: SchemaField[],\n sourceValues: Record<string, unknown>\n ): string {\n let result = template;\n // Replace positional placeholders {0}, {1}, etc.\n sourceFields.forEach((field, index) => {\n const value = this.getValueByPath(sourceValues, field.path);\n result = result.replace(\n new RegExp(`\\\\{${index}\\\\}`, 'g'),\n String(value ?? '')\n );\n });\n return result;\n }\n\n private formatDate(\n value: unknown,\n inputFormat?: string,\n outputFormat?: string\n ): string {\n if (!value) return '';\n try {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n // Simple format implementation\n const format = outputFormat ?? 'YYYY-MM-DD';\n return format\n .replace('YYYY', date.getFullYear().toString())\n .replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'))\n .replace('DD', date.getDate().toString().padStart(2, '0'))\n .replace('HH', date.getHours().toString().padStart(2, '0'))\n .replace('mm', date.getMinutes().toString().padStart(2, '0'))\n .replace('ss', date.getSeconds().toString().padStart(2, '0'));\n } catch {\n return String(value);\n }\n }\n\n private extractDatePart(\n value: unknown,\n part: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'\n ): string {\n if (!value) return '';\n try {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n switch (part) {\n case 'year':\n return date.getFullYear().toString();\n case 'month':\n return (date.getMonth() + 1).toString().padStart(2, '0');\n case 'day':\n return date.getDate().toString().padStart(2, '0');\n case 'hour':\n return date.getHours().toString().padStart(2, '0');\n case 'minute':\n return date.getMinutes().toString().padStart(2, '0');\n case 'second':\n return date.getSeconds().toString().padStart(2, '0');\n default:\n return String(value);\n }\n } catch {\n return String(value);\n }\n }\n\n private formatNumber(\n value: unknown,\n decimalPlaces?: number,\n prefix?: string,\n suffix?: string\n ): string {\n if (value === null || value === undefined) return '';\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n let formatted = decimalPlaces !== undefined\n ? num.toFixed(decimalPlaces)\n : num.toString();\n\n return `${prefix ?? ''}${formatted}${suffix ?? ''}`;\n }\n\n private applyMask(input: string, pattern: string): string {\n if (!pattern) return input;\n\n let result = '';\n let inputIndex = 0;\n\n for (let i = 0; i < pattern.length; i++) {\n const patternChar = pattern.charAt(i);\n if (patternChar === '#') {\n if (inputIndex < input.length) {\n result += input.charAt(inputIndex);\n inputIndex++;\n }\n } else {\n result += patternChar;\n }\n }\n\n return result;\n }\n\n getTransformationLabel(type: TransformationType): string {\n const labels: Record<TransformationType, string> = {\n direct: 'Direct Mapping',\n concat: 'Concatenate',\n substring: 'Substring',\n replace: 'Find & Replace',\n uppercase: 'Uppercase',\n lowercase: 'Lowercase',\n trim: 'Trim',\n mask: 'Mask',\n dateFormat: 'Date Format',\n extractYear: 'Extract Year',\n extractMonth: 'Extract Month',\n extractDay: 'Extract Day',\n extractHour: 'Extract Hour',\n extractMinute: 'Extract Minute',\n extractSecond: 'Extract Second',\n numberFormat: 'Number Format',\n template: 'Template',\n };\n return labels[type];\n }\n\n getAvailableTransformations(): { type: TransformationType; label: string; category?: string }[] {\n return [\n { type: 'direct', label: 'Direct Mapping' },\n { type: 'concat', label: 'Concatenate', category: 'String' },\n { type: 'substring', label: 'Substring', category: 'String' },\n { type: 'replace', label: 'Find & Replace', category: 'String' },\n { type: 'uppercase', label: 'Uppercase', category: 'String' },\n { type: 'lowercase', label: 'Lowercase', category: 'String' },\n { type: 'trim', label: 'Trim', category: 'String' },\n { type: 'mask', label: 'Mask', category: 'String' },\n { type: 'template', label: 'Template', category: 'String' },\n { type: 'dateFormat', label: 'Format Date', category: 'Date' },\n { type: 'extractYear', label: 'Extract Year', category: 'Date' },\n { type: 'extractMonth', label: 'Extract Month', category: 'Date' },\n { type: 'extractDay', label: 'Extract Day', category: 'Date' },\n { type: 'extractHour', label: 'Extract Hour', category: 'Date' },\n { type: 'extractMinute', label: 'Extract Minute', category: 'Date' },\n { type: 'extractSecond', label: 'Extract Second', category: 'Date' },\n { type: 'numberFormat', label: 'Number Format', category: 'Number' },\n ];\n }\n\n // Condition evaluation methods\n evaluateCondition(value: unknown, condition: FilterGroup): boolean {\n return this.evaluateGroup(value, condition);\n }\n\n private evaluateGroup(value: unknown, group: FilterGroup): boolean {\n if (group.children.length === 0) {\n return true; // Empty group is always true\n }\n\n if (group.logic === 'and') {\n return group.children.every(child => this.evaluateItem(value, child));\n } else {\n return group.children.some(child => this.evaluateItem(value, child));\n }\n }\n\n private evaluateItem(value: unknown, item: FilterItem): boolean {\n if (item.type === 'group') {\n return this.evaluateGroup(value, item);\n } else {\n return this.evaluateConditionItem(value, item);\n }\n }\n\n private evaluateConditionItem(value: unknown, condition: FilterCondition): boolean {\n const strValue = String(value ?? '');\n const numValue = Number(value);\n const condValue = condition.value;\n\n switch (condition.operator) {\n case 'equals':\n return strValue === String(condValue);\n case 'notEquals':\n return strValue !== String(condValue);\n case 'contains':\n return strValue.includes(String(condValue));\n case 'notContains':\n return !strValue.includes(String(condValue));\n case 'startsWith':\n return strValue.startsWith(String(condValue));\n case 'endsWith':\n return strValue.endsWith(String(condValue));\n case 'isEmpty':\n return strValue === '' || value === null || value === undefined;\n case 'isNotEmpty':\n return strValue !== '' && value !== null && value !== undefined;\n case 'greaterThan':\n return !isNaN(numValue) && numValue > Number(condValue);\n case 'lessThan':\n return !isNaN(numValue) && numValue < Number(condValue);\n case 'greaterThanOrEqual':\n return !isNaN(numValue) && numValue >= Number(condValue);\n case 'lessThanOrEqual':\n return !isNaN(numValue) && numValue <= Number(condValue);\n case 'isTrue':\n return value === true || strValue.toLowerCase() === 'true';\n case 'isFalse':\n return value === false || strValue.toLowerCase() === 'false';\n default:\n return true;\n }\n }\n\n /**\n * Check if a transformation's condition is met\n */\n isConditionMet(value: unknown, config: TransformationConfig): boolean {\n if (!config.condition?.enabled || !config.condition.root) {\n return true; // No condition means always apply\n }\n return this.evaluateCondition(value, config.condition.root);\n }\n}\n","import { Injectable } from '@angular/core';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface ConnectionPath {\n id: string;\n mappingId: string;\n path: string;\n sourcePoints: Point[];\n targetPoint: Point;\n midPoint: Point;\n isSelected: boolean;\n hasTransformation: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SvgConnectorService {\n createBezierPath(start: Point, end: Point): string {\n const dx = end.x - start.x;\n const controlPointOffset = Math.min(Math.abs(dx) * 0.5, 150);\n\n const cp1x = start.x + controlPointOffset;\n const cp1y = start.y;\n const cp2x = end.x - controlPointOffset;\n const cp2y = end.y;\n\n return `M ${start.x} ${start.y} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${end.x} ${end.y}`;\n }\n\n createMultiSourcePath(sources: Point[], target: Point): { paths: string[]; mergePoint: Point } {\n const mergeX = target.x - 80;\n const mergeY = target.y;\n const mergePoint = { x: mergeX, y: mergeY };\n\n const paths = sources.map((source) => {\n // Path from source to merge point\n const dx1 = mergeX - source.x;\n const cp1Offset = Math.min(Math.abs(dx1) * 0.4, 100);\n\n return `M ${source.x} ${source.y} C ${source.x + cp1Offset} ${source.y}, ${mergeX - cp1Offset} ${mergeY}, ${mergeX} ${mergeY}`;\n });\n\n // Add path from merge point to target\n const finalPath = `M ${mergeX} ${mergeY} L ${target.x} ${target.y}`;\n paths.push(finalPath);\n\n return { paths, mergePoint };\n }\n\n getMidPoint(start: Point, end: Point): Point {\n return {\n x: (start.x + end.x) / 2,\n y: (start.y + end.y) / 2,\n };\n }\n\n getMultiSourceMidPoint(sources: Point[], target: Point): Point {\n const mergeX = target.x - 80;\n return {\n x: mergeX,\n y: target.y,\n };\n }\n\n calculateConnectionPoint(\n rect: DOMRect,\n side: 'source' | 'target',\n containerRect: DOMRect\n ): Point {\n const relativeY = rect.top - containerRect.top + rect.height / 2;\n // Offset to position endpoint circles outside the schema panels\n const endpointOffset = 8;\n\n if (side === 'source') {\n return {\n x: rect.right - containerRect.left + endpointOffset,\n y: relativeY,\n };\n } else {\n return {\n x: rect.left - containerRect.left - endpointOffset,\n y: relativeY,\n };\n }\n }\n\n isPointNearPath(\n point: Point,\n pathStart: Point,\n pathEnd: Point,\n threshold: number = 10\n ): boolean {\n // Simplified hit detection using distance to line segment\n const A = point.x - pathStart.x;\n const B = point.y - pathStart.y;\n const C = pathEnd.x - pathStart.x;\n const D = pathEnd.y - pathStart.y;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n let param = -1;\n\n if (lenSq !== 0) {\n param = dot / lenSq;\n }\n\n let xx: number, yy: number;\n\n if (param < 0) {\n xx = pathStart.x;\n yy = pathStart.y;\n } else if (param > 1) {\n xx = pathEnd.x;\n yy = pathEnd.y;\n } else {\n xx = pathStart.x + param * C;\n yy = pathStart.y + param * D;\n }\n\n const dx = point.x - xx;\n const dy = point.y - yy;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n return distance <= threshold;\n }\n\n createDragPath(start: Point, end: Point): string {\n return this.createBezierPath(start, end);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SchemaField, SchemaDefinition } from '../models/schema.model';\nimport { JsonSchema } from '../models/json-schema.model';\n\n// Extended schema document with filtering options\nexport interface SchemaDocument extends JsonSchema {\n $ref?: string;\n $defs?: Record<string, JsonSchema>; // Alternative to definitions\n exclude?: string[];\n include?: string[];\n}\n\nexport interface ModelRegistry {\n [modelName: string]: JsonSchema;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SchemaParserService {\n private modelRegistry: ModelRegistry = {};\n private idCounter = 0;\n\n registerModels(models: ModelRegistry): void {\n this.modelRegistry = { ...this.modelRegistry, ...models };\n }\n\n clearRegistry(): void {\n this.modelRegistry = {};\n }\n\n parseSchema(\n schemaJson: string | SchemaDocument,\n schemaName: string = 'Schema'\n ): SchemaDefinition {\n const schema: SchemaDocument =\n typeof schemaJson === 'string' ? JSON.parse(schemaJson) : schemaJson;\n\n this.idCounter = 0;\n\n // Extract definitions from the schema document itself\n const localDefs = schema.$defs || schema.definitions || {};\n const combinedRegistry = { ...this.modelRegistry, ...localDefs };\n\n let resolvedSchema: JsonSchema;\n\n if (schema.$ref) {\n // Resolve the reference\n resolvedSchema = this.resolveRef(schema.$ref, combinedRegistry);\n } else if (schema.properties) {\n // Direct schema with properties\n resolvedSchema = schema as JsonSchema;\n } else {\n throw new Error('Schema must have either $ref or properties');\n }\n\n // Build fields from the resolved schema\n let fields = this.buildFields(resolvedSchema, combinedRegistry, '');\n\n // Apply exclude filter\n if (schema.exclude && schema.exclude.length > 0) {\n fields = this.applyExclude(fields, schema.exclude);\n }\n\n // Apply include filter (only if specified)\n if (schema.include && schema.include.length > 0) {\n fields = this.applyInclude(fields, schema.include);\n }\n\n return {\n name: schema.title || schemaName,\n fields,\n };\n }\n\n private resolveRef(\n ref: string,\n registry: Record<string, JsonSchema>\n ): JsonSchema {\n // Handle different ref formats:\n // #model, #/definitions/model, #/$defs/model, model\n let modelName: string;\n\n if (ref.startsWith('#/$defs/')) {\n modelName = ref.substring(8);\n } else if (ref.startsWith('#/definitions/')) {\n modelName = ref.substring(14);\n } else if (ref.startsWith('#')) {\n modelName = ref.substring(1);\n } else {\n modelName = ref;\n }\n\n const resolved = registry[modelName];\n if (!resolved) {\n throw new Error(`Cannot resolve reference: ${ref}. Model \"${modelName}\" not found in registry.`);\n }\n\n // If the resolved schema also has a $ref, resolve it recursively\n if (resolved.$ref) {\n return this.resolveRef(resolved.$ref, registry);\n }\n\n return resolved;\n }\n\n private buildFields(\n schema: JsonSchema,\n registry: Record<string, JsonSchema>,\n parentPath: string,\n arrayContext?: { isArrayItem: boolean; parentArrayPath: string }\n ): SchemaField[] {\n const fields: SchemaField[] = [];\n\n if (!schema.properties) {\n return fields;\n }\n\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n const path = parentPath ? `${parentPath}.${name}` : name;\n const field = this.buildField(name, propSchema, registry, path, arrayContext);\n fields.push(field);\n }\n\n return fields;\n }\n\n private buildField(\n name: string,\n schema: JsonSchema,\n registry: Record<string, JsonSchema>,\n path: string,\n arrayContext?: { isArrayItem: boolean; parentArrayPath: string }\n ): SchemaField {\n // Resolve $ref if present\n let resolvedSchema = schema;\n if (schema.$ref) {\n resolvedSchema = { ...this.resolveRef(schema.$ref, registry), ...schema };\n delete resolvedSchema.$ref;\n }\n\n const fieldType = this.mapType(resolvedSchema);\n const field: SchemaField = {\n id: `field-${++this.idCounter}-${name}`,\n name,\n type: fieldType,\n path,\n description: resolvedSchema.description,\n isArrayItem: arrayContext?.isArrayItem,\n parentArrayPath: arrayContext?.parentArrayPath,\n };\n\n // Handle nested objects\n if (fieldType === 'object' && resolvedSchema.properties) {\n field.children = this.buildFields(resolvedSchema, registry, path, arrayContext);\n field.expanded = true;\n }\n\n // Handle arrays with object items\n if (fieldType === 'array' && resolvedSchema.items) {\n let itemSchema = resolvedSchema.items;\n if (itemSchema.$ref) {\n itemSchema = this.resolveRef(itemSchema.$ref, registry);\n }\n if (itemSchema.properties) {\n // Mark children as array items with reference to parent array\n field.children = this.buildFields(itemSchema, registry, `${path}[]`, {\n isArrayItem: true,\n parentArrayPath: path,\n });\n field.expanded = true;\n }\n }\n\n return field;\n }\n\n private mapType(\n schema: JsonSchema\n ): 'string' | 'number' | 'boolean' | 'object' | 'array' | 'date' {\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n const format = schema.format;\n\n // Check format first for date types\n if (format === 'date' || format === 'date-time' || format === 'time') {\n return 'date';\n }\n\n switch (type) {\n case 'string':\n return 'string';\n case 'number':\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'object':\n return 'object';\n case 'array':\n return 'array';\n default:\n // If type is not specified but has properties, it's an object\n if (schema.properties) {\n return 'object';\n }\n return 'string';\n }\n }\n\n private applyExclude(fields: SchemaField[], exclude: string[]): SchemaField[] {\n return fields\n .filter((field) => !exclude.includes(field.name) && !exclude.includes(field.path))\n .map((field) => {\n if (field.children) {\n // Filter nested fields by checking both full path and relative name\n const filteredChildren = this.applyExclude(field.children, exclude);\n return { ...field, children: filteredChildren };\n }\n return field;\n });\n }\n\n private applyInclude(fields: SchemaField[], include: string[]): SchemaField[] {\n return fields\n .filter((field) => {\n // Include if field name or path matches\n if (include.includes(field.name) || include.includes(field.path)) {\n return true;\n }\n // Include if any child path matches\n if (field.children) {\n return this.hasIncludedChild(field.children, include);\n }\n return false;\n })\n .map((field) => {\n if (field.children) {\n // Keep parent but filter children\n const filteredChildren = this.applyInclude(field.children, include);\n return { ...field, children: filteredChildren.length > 0 ? filteredChildren : field.children };\n }\n return field;\n });\n }\n\n private hasIncludedChild(fields: SchemaField[], include: string[]): boolean {\n return fields.some((field) => {\n if (include.includes(field.name) || include.includes(field.path)) {\n return true;\n }\n if (field.children) {\n return this.hasIncludedChild(field.children, include);\n }\n return false;\n });\n }\n\n // Utility method to create a schema document from model name\n createSchemaFromRef(\n modelRef: string,\n options?: { exclude?: string[]; include?: string[]; title?: string }\n ): SchemaDocument {\n return {\n $ref: modelRef,\n title: options?.title,\n exclude: options?.exclude,\n include: options?.include,\n };\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n ViewChildren,\n QueryList,\n AfterViewInit,\n OnDestroy,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SchemaField, FieldMapping, DefaultValue } from '../../models/schema.model';\nimport { MappingService } from '../../services/mapping.service';\n\nexport interface FieldPositionEvent {\n field: SchemaField;\n element: HTMLElement;\n rect: DOMRect;\n}\n\n@Component({\n selector: 'schema-tree',\n standalone: true,\n imports: [CommonModule, MatIconModule, MatTooltipModule],\n templateUrl: './schema-tree.component.html',\n styleUrl: './schema-tree.component.scss',\n})\nexport class SchemaTreeComponent implements AfterViewInit, OnDestroy {\n @Input() schema!: { name: string; fields: SchemaField[] };\n @Input() side: 'source' | 'target' = 'source';\n @Input() mappings: FieldMapping[] = [];\n @Input() defaultValues: DefaultValue[] = [];\n @Input() showSchemaName: boolean = true;\n\n @Output() fieldDragStart = new EventEmitter<FieldPositionEvent>();\n @Output() fieldDragEnd = new EventEmitter<void>();\n @Output() fieldDrop = new EventEmitter<FieldPositionEvent>();\n @Output() sourceDrop = new EventEmitter<FieldPositionEvent>(); // For endpoint dragging - drop on source field\n @Output() fieldPositionsChanged = new EventEmitter<Map<string, DOMRect>>();\n @Output() fieldDefaultValueClick = new EventEmitter<FieldPositionEvent>();\n\n @ViewChild('schemaFields') schemaFieldsContainer!: ElementRef<HTMLDivElement>;\n @ViewChildren('fieldItem') fieldItems!: QueryList<ElementRef>;\n\n private mappingService = inject(MappingService);\n private resizeObserver!: ResizeObserver;\n private scrollHandler = () => this.onScroll();\n\n ngAfterViewInit(): void {\n this.emitFieldPositions();\n\n this.resizeObserver = new ResizeObserver(() => {\n this.emitFieldPositions();\n });\n\n this.fieldItems.changes.subscribe(() => {\n this.emitFieldPositions();\n });\n\n // Add scroll listener to update connector positions\n if (this.schemaFieldsContainer?.nativeElement) {\n this.schemaFieldsContainer.nativeElement.addEventListener('scroll', this.scrollHandler, { passive: true });\n }\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.schemaFieldsContainer?.nativeElement) {\n this.schemaFieldsContainer.nativeElement.removeEventListener('scroll', this.scrollHandler);\n }\n }\n\n onScroll(): void {\n this.emitFieldPositions();\n }\n\n emitFieldPositions(): void {\n setTimeout(() => {\n const positions = new Map<string, DOMRect>();\n this.fieldItems.forEach((item) => {\n const fieldId = item.nativeElement.getAttribute('data-field-id');\n if (fieldId) {\n positions.set(fieldId, item.nativeElement.getBoundingClientRect());\n }\n });\n this.fieldPositionsChanged.emit(positions);\n });\n }\n\n toggleExpand(field: SchemaField, event: Event): void {\n event.stopPropagation();\n field.expanded = !field.expanded;\n setTimeout(() => this.emitFieldPositions(), 50);\n }\n\n onDragStart(event: MouseEvent, field: SchemaField): void {\n if (this.side !== 'source') return;\n\n // Don't start new drag if endpoint dragging is in progress\n const dragState = this.mappingService.currentDragState();\n if (dragState.isDragging) return;\n\n const element = event.currentTarget as HTMLElement;\n const rect = element.getBoundingClientRect();\n\n this.fieldDragStart.emit({ field, element, rect });\n }\n\n isEndpointDragMode(): boolean {\n const dragState = this.mappingService.currentDragState();\n return dragState.isDragging && (dragState.dragMode === 'move-source' || dragState.dragMode === 'move-target');\n }\n\n isSourceEndpointDragging(): boolean {\n const dragState = this.mappingService.currentDragState();\n return dragState.isDragging && dragState.dragMode === 'move-source';\n }\n\n isTargetEndpointDragging(): boolean {\n const dragState = this.mappingService.currentDragState();\n return dragState.isDragging && dragState.dragMode === 'move-target';\n }\n\n onDragOver(event: DragEvent): void {\n if (this.side === 'target') {\n event.preventDefault();\n }\n }\n\n onDrop(event: MouseEvent, field: SchemaField): void {\n const element = event.currentTarget as HTMLElement;\n const rect = element.getBoundingClientRect();\n\n // Check if endpoint dragging is in progress (via MappingService drag state)\n const dragState = this.mappingService.currentDragState();\n\n // Handle source drop during endpoint dragging (moving source endpoint)\n if (this.side === 'source' && dragState.isDragging && dragState.dragMode === 'move-source') {\n this.sourceDrop.emit({ field, element, rect });\n return;\n }\n\n // Handle target drop (either endpoint dragging or new mapping)\n if (this.side === 'target') {\n this.fieldDrop.emit({ field, element, rect });\n }\n }\n\n getTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n string: 'text_fields',\n number: 'pin',\n boolean: 'toggle_on',\n object: 'data_object',\n array: 'data_array',\n date: 'calendar_today',\n };\n return icons[type] || 'help_outline';\n }\n\n isFieldMapped(field: SchemaField): boolean {\n if (this.side === 'source') {\n return this.mappings.some((m) =>\n m.sourceFields.some((sf) => sf.id === field.id)\n );\n } else {\n return this.mappings.some((m) => m.targetField.id === field.id);\n }\n }\n\n getFieldMappingCount(field: SchemaField): number {\n if (this.side === 'source') {\n return this.mappings.filter((m) =>\n m.sourceFields.some((sf) => sf.id === field.id)\n ).length;\n } else {\n const mapping = this.mappings.find((m) => m.targetField.id === field.id);\n return mapping ? mapping.sourceFields.length : 0;\n }\n }\n\n hasDefaultValue(field: SchemaField): boolean {\n return this.defaultValues.some(d => d.targetField.id === field.id);\n }\n\n getDefaultValueDisplay(field: SchemaField): string {\n const defaultValue = this.defaultValues.find(d => d.targetField.id === field.id);\n if (!defaultValue || defaultValue.value === null) return '';\n\n if (defaultValue.targetField.type === 'date' && defaultValue.value) {\n return new Date(defaultValue.value as string).toLocaleDateString();\n }\n return String(defaultValue.value);\n }\n\n onFieldClick(event: MouseEvent, field: SchemaField): void {\n // Only handle clicks on target fields that are leaf nodes (no children) or have specific types\n if (this.side !== 'target') return;\n if (field.type === 'object' || field.type === 'array') return;\n\n // Don't trigger if the field is already mapped (unless it has a default value)\n if (this.isFieldMapped(field) && !this.hasDefaultValue(field)) return;\n\n // Allow clicking on unmapped fields OR fields with default values (to edit them)\n if (!this.isFieldMapped(field) || this.hasDefaultValue(field)) {\n event.stopPropagation();\n\n const element = event.currentTarget as HTMLElement;\n const rect = element.getBoundingClientRect();\n\n this.fieldDefaultValueClick.emit({ field, element, rect });\n }\n }\n\n trackByFieldId(index: number, field: SchemaField): string {\n return field.id;\n }\n}\n","<div class=\"schema-tree\" [class.source]=\"side === 'source'\" [class.target]=\"side === 'target'\">\n <div class=\"schema-header\">\n @if (showSchemaName) {\n <span class=\"schema-title\">{{ schema.name }}</span>\n }\n <span class=\"schema-badge\">{{ side === 'source' ? 'Source' : 'Target' }}</span>\n </div>\n\n <div class=\"schema-fields\" #schemaFields>\n <ng-container *ngTemplateOutlet=\"fieldList; context: { fields: schema.fields, level: 0 }\"></ng-container>\n </div>\n</div>\n\n<ng-template #fieldList let-fields=\"fields\" let-level=\"level\">\n @for (field of fields; track trackByFieldId($index, field)) {\n <div\n #fieldItem\n class=\"field-item\"\n [class.mapped]=\"isFieldMapped(field)\"\n [class.has-default]=\"hasDefaultValue(field)\"\n [class.has-children]=\"field.children && field.children.length > 0\"\n [class.expanded]=\"field.expanded\"\n [class.is-array]=\"field.type === 'array'\"\n [class.draggable]=\"side === 'source' && ((!field.children || field.children.length === 0) || field.type === 'array') && !isEndpointDragMode()\"\n [class.droppable]=\"(side === 'target' && ((!field.children || field.children.length === 0) || field.type === 'array' || field.type === 'object')) || (side === 'source' && isSourceEndpointDragging() && ((!field.children || field.children.length === 0) || field.type === 'array'))\"\n [class.endpoint-drop-target]=\"(side === 'source' && isSourceEndpointDragging()) || (side === 'target' && isTargetEndpointDragging())\"\n [class.clickable]=\"side === 'target' && (!isFieldMapped(field) || hasDefaultValue(field)) && field.type !== 'object' && field.type !== 'array'\"\n [style.padding-left.px]=\"16 + level * 20\"\n [attr.data-field-id]=\"field.id\"\n (mousedown)=\"onDragStart($event, field)\"\n (mouseup)=\"onDrop($event, field)\"\n (click)=\"onFieldClick($event, field)\"\n >\n <!-- Expand/Collapse button for nested objects -->\n @if (field.children && field.children.length > 0) {\n <button class=\"expand-btn\" (click)=\"toggleExpand(field, $event)\">\n <mat-icon>{{ field.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n </button>\n } @else {\n <span class=\"expand-placeholder\"></span>\n }\n\n <!-- Field type icon -->\n <mat-icon class=\"type-icon\" [matTooltip]=\"field.type\">{{ getTypeIcon(field.type) }}</mat-icon>\n\n <!-- Field name with array indicator -->\n <span class=\"field-name\">{{ field.name }}@if (field.type === 'array') {<span class=\"array-indicator\">[]</span>}</span>\n\n <!-- Mapping indicator -->\n @if (isFieldMapped(field)) {\n <span class=\"mapping-indicator\" [matTooltip]=\"getFieldMappingCount(field) + ' mapping(s)'\">\n <mat-icon>{{ field.type === 'array' ? 'loop' : 'link' }}</mat-icon>\n @if (getFieldMappingCount(field) > 1) {\n <span class=\"mapping-count\">{{ getFieldMappingCount(field) }}</span>\n }\n </span>\n }\n\n <!-- Default value indicator -->\n @if (hasDefaultValue(field)) {\n <span class=\"default-indicator\" [matTooltip]=\"'Default: ' + getDefaultValueDisplay(field)\">\n <mat-icon>edit</mat-icon>\n <span class=\"default-value\">{{ getDefaultValueDisplay(field) }}</span>\n </span>\n }\n\n <!-- Connection point - show for leaf nodes, arrays, and objects (on target for array-to-object) -->\n @if ((!field.children || field.children.length === 0) || field.type === 'array' || (side === 'target' && field.type === 'object')) {\n <div class=\"connection-point\" [class.source]=\"side === 'source'\" [class.target]=\"side === 'target'\" [class.array-point]=\"field.type === 'array'\" [class.object-point]=\"field.type === 'object'\">\n <span class=\"point-dot\"></span>\n </div>\n }\n </div>\n\n <!-- Nested children -->\n @if (field.children && field.children.length > 0 && field.expanded) {\n <div class=\"nested-fields\">\n <ng-container *ngTemplateOutlet=\"fieldList; context: { fields: field.children, level: level + 1 }\"></ng-container>\n </div>\n }\n }\n</ng-template>\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n FilterCondition,\r\n FilterGroup,\r\n FilterItem,\r\n FilterOperator,\r\n} from '../../models/schema.model';\r\n\r\ninterface OperatorOption {\r\n value: FilterOperator;\r\n label: string;\r\n needsValue: boolean;\r\n}\r\n\r\nexport interface ConditionField {\r\n path: string;\r\n name: string;\r\n type: 'string' | 'number' | 'boolean';\r\n}\r\n\r\n@Component({\r\n selector: 'condition-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n MatFormFieldModule,\r\n MatRadioModule,\r\n MatSlideToggleModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './condition-builder.component.html',\r\n styleUrl: './condition-builder.component.scss',\r\n})\r\nexport class ConditionBuilderComponent implements OnInit {\r\n // Available fields for conditions (optional - if not provided, uses 'value' as the only field)\r\n @Input() fields: ConditionField[] = [];\r\n\r\n // The condition group to edit\r\n @Input() condition: FilterGroup | null = null;\r\n\r\n // Whether to show a compact/inline version\r\n @Input() compact = false;\r\n\r\n // Emits when condition changes\r\n @Output() conditionChange = new EventEmitter<FilterGroup>();\r\n\r\n rootGroup!: FilterGroup;\r\n\r\n // Default field for transformation conditions (the input value)\r\n private defaultField: ConditionField = { path: 'value', name: 'Input value', type: 'string' };\r\n\r\n // Operators by type\r\n stringOperators: OperatorOption[] = [\r\n { value: 'equals', label: 'equals', needsValue: true },\r\n { value: 'notEquals', label: 'not equals', needsValue: true },\r\n { value: 'contains', label: 'contains', needsValue: true },\r\n { value: 'notContains', label: 'not contain', needsValue: true },\r\n { value: 'startsWith', label: 'starts with', needsValue: true },\r\n { value: 'endsWith', label: 'ends with', needsValue: true },\r\n { value: 'isEmpty', label: 'is empty', needsValue: false },\r\n { value: 'isNotEmpty', label: 'is not empty', needsValue: false },\r\n ];\r\n\r\n numberOperators: OperatorOption[] = [\r\n { value: 'equals', label: 'equals', needsValue: true },\r\n { value: 'notEquals', label: 'not equals', needsValue: true },\r\n { value: 'greaterThan', label: '>', needsValue: true },\r\n { value: 'lessThan', label: '<', needsValue: true },\r\n { value: 'greaterThanOrEqual', label: '>=', needsValue: true },\r\n { value: 'lessThanOrEqual', label: '<=', needsValue: true },\r\n ];\r\n\r\n booleanOperators: OperatorOption[] = [\r\n { value: 'isTrue', label: 'is true', needsValue: false },\r\n { value: 'isFalse', label: 'is false', needsValue: false },\r\n ];\r\n\r\n ngOnInit(): void {\r\n if (this.condition) {\r\n this.rootGroup = this.cloneGroup(this.condition);\r\n } else {\r\n this.rootGroup = this.createEmptyGroup();\r\n }\r\n }\r\n\r\n get availableFields(): ConditionField[] {\r\n return this.fields.length > 0 ? this.fields : [this.defaultField];\r\n }\r\n\r\n get showFieldSelector(): boolean {\r\n return this.fields.length > 1;\r\n }\r\n\r\n private createEmptyGroup(): FilterGroup {\r\n return {\r\n id: this.generateId(),\r\n type: 'group',\r\n logic: 'and',\r\n children: [],\r\n };\r\n }\r\n\r\n private generateId(): string {\r\n return `cond-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private cloneGroup(group: FilterGroup): FilterGroup {\r\n return {\r\n ...group,\r\n children: group.children.map((child) =>\r\n child.type === 'group' ? this.cloneGroup(child) : { ...child }\r\n ),\r\n };\r\n }\r\n\r\n getOperatorsForField(fieldPath: string): OperatorOption[] {\r\n const field = this.availableFields.find((f) => f.path === fieldPath);\r\n if (!field) return this.stringOperators;\r\n\r\n switch (field.type) {\r\n case 'number':\r\n return this.numberOperators;\r\n case 'boolean':\r\n return this.booleanOperators;\r\n default:\r\n return this.stringOperators;\r\n }\r\n }\r\n\r\n operatorNeedsValue(operator: FilterOperator): boolean {\r\n const allOperators = [...this.stringOperators, ...this.numberOperators, ...this.booleanOperators];\r\n const op = allOperators.find((o) => o.value === operator);\r\n return op?.needsValue ?? true;\r\n }\r\n\r\n isCondition(item: FilterItem): item is FilterCondition {\r\n return item.type === 'condition';\r\n }\r\n\r\n isGroup(item: FilterItem): item is FilterGroup {\r\n return item.type === 'group';\r\n }\r\n\r\n addCondition(group: FilterGroup): void {\r\n const firstField = this.availableFields[0];\r\n const newCondition: FilterCondition = {\r\n id: this.generateId(),\r\n type: 'condition',\r\n field: firstField.path,\r\n fieldName: firstField.name,\r\n operator: 'isNotEmpty',\r\n value: '',\r\n valueType: firstField.type,\r\n };\r\n group.children = [...group.children, newCondition];\r\n this.emitChange();\r\n }\r\n\r\n addGroup(parentGroup: FilterGroup): void {\r\n const newGroup: FilterGroup = {\r\n id: this.generateId(),\r\n type: 'group',\r\n logic: parentGroup.logic === 'and' ? 'or' : 'and',\r\n children: [],\r\n };\r\n parentGroup.children = [...parentGroup.children, newGroup];\r\n this.emitChange();\r\n }\r\n\r\n removeItem(parentGroup: FilterGroup, itemId: string): void {\r\n parentGroup.children = parentGroup.children.filter((c) => c.id !== itemId);\r\n this.emitChange();\r\n }\r\n\r\n onFieldChange(condition: FilterCondition, fieldPath: string): void {\r\n const field = this.availableFields.find((f) => f.path === fieldPath);\r\n if (field) {\r\n condition.field = fieldPath;\r\n condition.fieldName = field.name;\r\n condition.valueType = field.type;\r\n const operators = this.getOperatorsForField(fieldPath);\r\n condition.operator = operators[0].value;\r\n condition.value = '';\r\n }\r\n this.emitChange();\r\n }\r\n\r\n onOperatorChange(condition: FilterCondition, operator: FilterOperator): void {\r\n condition.operator = operator;\r\n if (!this.operatorNeedsValue(operator)) {\r\n condition.value = '';\r\n }\r\n this.emitChange();\r\n }\r\n\r\n onValueChange(condition: FilterCondition, value: string | boolean): void {\r\n if (condition.valueType === 'number') {\r\n condition.value = parseFloat(value as string) || 0;\r\n } else {\r\n condition.value = value;\r\n }\r\n this.emitChange();\r\n }\r\n\r\n onLogicChange(group: FilterGroup, logic: 'and' | 'or'): void {\r\n group.logic = logic;\r\n this.emitChange();\r\n }\r\n\r\n private emitChange(): void {\r\n this.rootGroup = this.cloneGroup(this.rootGroup);\r\n this.conditionChange.emit(this.rootGroup);\r\n }\r\n\r\n getConditionSummary(): string {\r\n return this.summarizeGroup(this.rootGroup);\r\n }\r\n\r\n private summarizeGroup(group: FilterGroup): string {\r\n if (group.children.length === 0) return '';\r\n\r\n const parts = group.children.map(child => {\r\n if (child.type === 'condition') {\r\n return this.summarizeCondition(child);\r\n } else {\r\n return `(${this.summarizeGroup(child)})`;\r\n }\r\n });\r\n\r\n return parts.join(` ${group.logic.toUpperCase()} `);\r\n }\r\n\r\n private summarizeCondition(cond: FilterCondition): string {\r\n const opLabel = this.getOperatorLabel(cond.operator);\r\n if (this.operatorNeedsValue(cond.operator)) {\r\n return `${opLabel} \"${cond.value}\"`;\r\n }\r\n return opLabel;\r\n }\r\n\r\n private getOperatorLabel(operator: FilterOperator): string {\r\n const allOperators = [...this.stringOperators, ...this.numberOperators, ...this.booleanOperators];\r\n const op = allOperators.find((o) => o.value === operator);\r\n return op?.label || operator;\r\n }\r\n}\r\n","<div class=\"condition-builder\" [class.compact]=\"compact\">\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: rootGroup, isRoot: true }\"></ng-container>\r\n</div>\r\n\r\n<!-- Recursive group template -->\r\n<ng-template #groupTemplate let-group=\"group\" let-isRoot=\"isRoot\" let-parentGroup=\"parentGroup\">\r\n <div class=\"filter-group\" [class.root-group]=\"isRoot\" [class.nested-group]=\"!isRoot\">\r\n <!-- Group header with logic toggle (only show if multiple children or nested) -->\r\n @if (group.children.length > 1 || !isRoot) {\r\n <div class=\"group-header\">\r\n <div class=\"logic-toggle\">\r\n <button\r\n type=\"button\"\r\n class=\"logic-btn\"\r\n [class.active]=\"group.logic === 'and'\"\r\n (click)=\"onLogicChange(group, 'and')\"\r\n >\r\n AND\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"logic-btn\"\r\n [class.active]=\"group.logic === 'or'\"\r\n (click)=\"onLogicChange(group, 'or')\"\r\n >\r\n OR\r\n </button>\r\n </div>\r\n @if (!isRoot) {\r\n <button mat-icon-button class=\"remove-group-btn\" matTooltip=\"Remove group\" (click)=\"removeItem(parentGroup, group.id)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Group children -->\r\n <div class=\"group-children\">\r\n @for (item of group.children; track item.id; let i = $index) {\r\n <!-- Logic connector between items -->\r\n @if (i > 0) {\r\n <div class=\"logic-connector\">\r\n <span class=\"logic-badge\" [class.and]=\"group.logic === 'and'\" [class.or]=\"group.logic === 'or'\">\r\n {{ group.logic | uppercase }}\r\n </span>\r\n </div>\r\n }\r\n\r\n @if (isCondition(item)) {\r\n <!-- Condition row -->\r\n <div class=\"condition-row\">\r\n <!-- Field selector (only if multiple fields) -->\r\n @if (showFieldSelector) {\r\n <mat-form-field appearance=\"outline\" class=\"field-select\">\r\n <mat-select [value]=\"item.field\" (selectionChange)=\"onFieldChange(item, $event.value)\">\r\n @for (field of availableFields; track field.path) {\r\n <mat-option [value]=\"field.path\">{{ field.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Operator selector -->\r\n <mat-form-field appearance=\"outline\" class=\"operator-select\">\r\n <mat-select [value]=\"item.operator\" (selectionChange)=\"onOperatorChange(item, $event.value)\">\r\n @for (op of getOperatorsForField(item.field); track op.value) {\r\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Value input (only if operator needs value) -->\r\n @if (operatorNeedsValue(item.operator)) {\r\n @if (item.valueType === 'boolean') {\r\n <mat-slide-toggle\r\n [checked]=\"item.value === true\"\r\n (change)=\"onValueChange(item, $event.checked)\"\r\n class=\"bool-toggle\"\r\n >\r\n </mat-slide-toggle>\r\n } @else if (item.valueType === 'number') {\r\n <mat-form-field appearance=\"outline\" class=\"value-input\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [value]=\"item.value\"\r\n (input)=\"onValueChange(item, $any($event.target).value)\"\r\n placeholder=\"value\"\r\n />\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"value-input\">\r\n <input\r\n matInput\r\n type=\"text\"\r\n [value]=\"item.value\"\r\n (input)=\"onValueChange(item, $any($event.target).value)\"\r\n placeholder=\"value\"\r\n />\r\n </mat-form-field>\r\n }\r\n }\r\n\r\n <!-- Remove condition button -->\r\n <button mat-icon-button class=\"remove-btn\" matTooltip=\"Remove\" (click)=\"removeItem(group, item.id)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n } @else if (isGroup(item)) {\r\n <!-- Nested group -->\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: item, isRoot: false, parentGroup: group }\"></ng-container>\r\n }\r\n }\r\n\r\n <!-- Empty state -->\r\n @if (group.children.length === 0) {\r\n <div class=\"empty-group\">\r\n <span>No conditions defined</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Group actions -->\r\n <div class=\"group-actions\">\r\n <button type=\"button\" class=\"add-btn\" (click)=\"addCondition(group)\">\r\n <mat-icon>add</mat-icon>\r\n @if (!compact) {\r\n <span>Add condition</span>\r\n }\r\n </button>\r\n @if (!compact && group.children.length > 0) {\r\n <button type=\"button\" class=\"add-btn add-group-btn\" (click)=\"addGroup(group)\">\r\n <mat-icon>folder_open</mat-icon>\r\n <span>Add group</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport {\n FieldMapping,\n FilterGroup,\n TransformationConfig,\n TransformationType,\n} from '../../models/schema.model';\nimport { ConditionBuilderComponent } from '../condition-builder/condition-builder.component';\nimport { TransformationService } from '../../services/transformation.service';\n\n@Component({\n selector: 'transformation-popover',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatIconModule,\n MatButtonModule,\n MatSelectModule,\n MatInputModule,\n MatFormFieldModule,\n MatTooltipModule,\n MatCheckboxModule,\n DragDropModule,\n ConditionBuilderComponent,\n ],\n templateUrl: './transformation-popover.component.html',\n styleUrl: './transformation-popover.component.scss',\n})\nexport class TransformationPopoverComponent implements OnInit, OnChanges {\n @Input() mapping!: FieldMapping;\n @Input() position: { x: number; y: number } = { x: 0, y: 0 };\n @Input() sampleData: Record<string, unknown> = {};\n\n @Output() save = new EventEmitter<TransformationConfig[]>();\n @Output() delete = new EventEmitter<void>();\n @Output() close = new EventEmitter<void>();\n\n private transformationService = inject(TransformationService);\n\n // Array of transformation steps\n steps: TransformationConfig[] = [];\n\n // Preview results for each step\n stepPreviews: string[] = [];\n // Input values for each step (to show input → output)\n stepInputs: string[] = [];\n finalPreview: string = '';\n\n // Track which step is expanded (-1 means none, used in single-step mode)\n expandedStepIndex: number = -1;\n\n availableTransformations = this.transformationService.getAvailableTransformations();\n\n ngOnInit(): void {\n this.initFromMapping();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['mapping'] || changes['sampleData']) {\n this.initFromMapping();\n }\n }\n\n private initFromMapping(): void {\n if (this.mapping) {\n // Copy transformations array, with fallback for empty/undefined\n if (this.mapping.transformations && this.mapping.transformations.length > 0) {\n this.steps = this.mapping.transformations.map(t => ({ ...t }));\n } else {\n // Fallback to a single direct transformation\n this.steps = [{ type: 'direct' }];\n }\n this.updatePreview();\n }\n }\n\n // Check if we're in multi-step mode (more than one step)\n get isMultiStep(): boolean {\n return this.steps.length > 1;\n }\n\n onStepTypeChange(index: number): void {\n const step = this.steps[index];\n\n // Set defaults based on type\n switch (step.type) {\n case 'concat':\n step.separator = step.separator ?? ' ';\n step.template = step.template ?? this.getDefaultTemplate();\n break;\n case 'substring':\n step.startIndex = step.startIndex ?? 0;\n step.endIndex = step.endIndex ?? 10;\n break;\n case 'replace':\n step.searchValue = step.searchValue ?? '';\n step.replaceValue = step.replaceValue ?? '';\n break;\n case 'dateFormat':\n step.outputFormat = step.outputFormat ?? 'YYYY-MM-DD';\n break;\n case 'numberFormat':\n step.decimalPlaces = step.decimalPlaces ?? 2;\n break;\n case 'mask':\n step.pattern = step.pattern ?? '(###) ###-####';\n break;\n }\n\n this.updatePreview();\n }\n\n private getDefaultTemplate(): string {\n return this.mapping.sourceFields.map((_, i) => `{${i}}`).join(' ');\n }\n\n addStep(): void {\n this.steps.push({ type: 'direct' });\n // Expand the newly added step\n this.expandedStepIndex = this.steps.length - 1;\n this.updatePreview();\n }\n\n removeStep(index: number): void {\n if (this.steps.length > 1) {\n this.steps.splice(index, 1);\n // Collapse after deletion\n this.expandedStepIndex = -1;\n this.updatePreview();\n }\n }\n\n onStepDrop(event: CdkDragDrop<TransformationConfig[]>): void {\n if (event.previousIndex !== event.currentIndex) {\n moveItemInArray(this.steps, event.previousIndex, event.currentIndex);\n // Move expanded index with the step\n if (this.expandedStepIndex === event.previousIndex) {\n this.expandedStepIndex = event.currentIndex;\n } else if (\n this.expandedStepIndex > event.previousIndex &&\n this.expandedStepIndex <= event.currentIndex\n ) {\n this.expandedStepIndex--;\n } else if (\n this.expandedStepIndex < event.previousIndex &&\n this.expandedStepIndex >= event.currentIndex\n ) {\n this.expandedStepIndex++;\n }\n this.updatePreview();\n }\n }\n\n toggleStep(index: number): void {\n if (this.expandedStepIndex === index) {\n this.expandedStepIndex = -1; // Collapse\n } else {\n this.expandedStepIndex = index; // Expand\n }\n }\n\n isStepExpanded(index: number): boolean {\n return this.expandedStepIndex === index;\n }\n\n updatePreview(): void {\n if (!this.mapping || !this.sampleData) {\n this.stepPreviews = [];\n this.stepInputs = [];\n this.finalPreview = '';\n return;\n }\n\n this.stepPreviews = [];\n this.stepInputs = [];\n let currentValue: unknown = null;\n\n // Get initial input from source fields\n const initialValues = this.mapping.sourceFields\n .map(f => this.getValueByPath(this.sampleData, f.path))\n .map(v => String(v ?? ''));\n const initialInput = initialValues.join(', ');\n\n // For the first step, use the source fields from sample data\n for (let i = 0; i < this.steps.length; i++) {\n const step = this.steps[i];\n\n if (i === 0) {\n // First step: input is from source fields\n this.stepInputs.push(initialInput);\n // Check condition before applying transformation\n if (this.transformationService.isConditionMet(initialInput, step)) {\n currentValue = this.transformationService.applyTransformation(\n this.sampleData,\n this.mapping.sourceFields,\n step\n );\n } else {\n currentValue = initialInput; // Pass through if condition not met\n }\n } else {\n // Subsequent steps: input is previous output\n this.stepInputs.push(this.stepPreviews[i - 1]);\n // Check condition before applying transformation\n if (this.transformationService.isConditionMet(currentValue, step)) {\n currentValue = this.transformationService.applyTransformationToValue(\n currentValue,\n step\n );\n }\n // If condition not met, currentValue passes through unchanged\n }\n\n this.stepPreviews.push(String(currentValue ?? ''));\n }\n\n this.finalPreview = this.stepPreviews[this.stepPreviews.length - 1] || '';\n }\n\n private getValueByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, part) => {\n if (acc && typeof acc === 'object') {\n return (acc as Record<string, unknown>)[part];\n }\n return undefined;\n }, obj);\n }\n\n onConfigChange(): void {\n this.updatePreview();\n }\n\n onSave(): void {\n // Filter out 'direct' transformations if they're not the only one\n const cleanedSteps = this.steps.length === 1\n ? this.steps\n : this.steps.filter(s => s.type !== 'direct');\n\n // If all filtered out, keep at least one direct\n const finalSteps = cleanedSteps.length > 0 ? cleanedSteps : [{ type: 'direct' as TransformationType }];\n\n this.save.emit(finalSteps);\n }\n\n onDelete(): void {\n this.delete.emit();\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n getSourceFieldNames(): string {\n return this.mapping.sourceFields.map((f) => f.name).join(', ');\n }\n\n getPopoverStyle(): Record<string, string> {\n return {\n left: `${this.position.x}px`,\n top: `${this.position.y}px`,\n };\n }\n\n getStepTypeLabel(type: TransformationType): string {\n const t = this.availableTransformations.find(t => t.type === type);\n return t?.label || type;\n }\n\n // Condition methods\n hasCondition(step: TransformationConfig): boolean {\n return step.condition?.enabled === true;\n }\n\n toggleCondition(step: TransformationConfig, enabled: boolean): void {\n if (enabled) {\n if (!step.condition) {\n step.condition = {\n enabled: true,\n root: this.createEmptyConditionGroup(),\n };\n } else {\n step.condition.enabled = true;\n }\n } else {\n if (step.condition) {\n step.condition.enabled = false;\n }\n }\n }\n\n onConditionChange(step: TransformationConfig, group: FilterGroup): void {\n if (step.condition) {\n step.condition.root = group;\n }\n }\n\n private createEmptyConditionGroup(): FilterGroup {\n return {\n id: `cond-${Date.now()}`,\n type: 'group',\n logic: 'and',\n children: [],\n };\n }\n\n getConditionSummary(step: TransformationConfig): string {\n if (!step.condition?.enabled || !step.condition.root) return '';\n return this.summarizeConditionGroup(step.condition.root);\n }\n\n private summarizeConditionGroup(group: FilterGroup): string {\n if (group.children.length === 0) return '';\n\n const parts = group.children.map(child => {\n if (child.type === 'condition') {\n const opLabel = this.getOperatorLabel(child.operator);\n if (['isEmpty', 'isNotEmpty', 'isTrue', 'isFalse'].includes(child.operator)) {\n return opLabel;\n }\n return `${opLabel} \"${child.value}\"`;\n } else {\n return `(${this.summarizeConditionGroup(child)})`;\n }\n });\n\n return parts.join(` ${group.logic.toUpperCase()} `);\n }\n\n private getOperatorLabel(operator: string): string {\n const labels: Record<string, string> = {\n equals: '=',\n notEquals: '!=',\n contains: 'contains',\n notContains: 'not contain',\n startsWith: 'starts with',\n endsWith: 'ends with',\n isEmpty: 'is empty',\n isNotEmpty: 'is not empty',\n greaterThan: '>',\n lessThan: '<',\n greaterThanOrEqual: '>=',\n lessThanOrEqual: '<=',\n isTrue: 'is true',\n isFalse: 'is false',\n };\n return labels[operator] || operator;\n }\n}\n","<div class=\"transformation-popover\" [ngStyle]=\"getPopoverStyle()\">\r\n <div class=\"popover-arrow\"></div>\r\n\r\n <div class=\"popover-header\">\r\n <span class=\"popover-title\">Transformation</span>\r\n <button mat-icon-button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"popover-content\">\r\n <!-- Source/Target Info -->\r\n <div class=\"mapping-info\">\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">Source:</span>\r\n <span class=\"info-value\">{{ getSourceFieldNames() }}</span>\r\n </div>\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">Target:</span>\r\n <span class=\"info-value\">{{ mapping.targetField.name }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Single Step Mode (default, clean UI) -->\r\n @if (!isMultiStep) {\r\n <ng-container *ngTemplateOutlet=\"stepConfig; context: { step: steps[0], index: 0, showHeader: false }\"></ng-container>\r\n\r\n <!-- Preview Section -->\r\n <div class=\"preview-section\">\r\n <span class=\"preview-label\">Preview:</span>\r\n <div class=\"preview-value\">{{ stepPreviews[0] || '(empty)' }}</div>\r\n </div>\r\n }\r\n\r\n <!-- Multi-Step Mode -->\r\n @if (isMultiStep) {\r\n <div class=\"steps-container\" cdkDropList (cdkDropListDropped)=\"onStepDrop($event)\">\r\n @for (step of steps; track $index; let i = $index) {\r\n <div class=\"step-card\" [class.expanded]=\"isStepExpanded(i)\" cdkDrag>\r\n <!-- Collapsed View -->\r\n @if (!isStepExpanded(i)) {\r\n <div class=\"step-collapsed\" (click)=\"toggleStep(i)\">\r\n <mat-icon class=\"drag-handle\" cdkDragHandle (click)=\"$event.stopPropagation()\">drag_indicator</mat-icon>\r\n <div class=\"step-collapsed-header\">\r\n <div class=\"step-title-row\">\r\n <span class=\"step-number\">Step {{ i + 1 }}: {{ getStepTypeLabel(step.type) }}</span>\r\n @if (hasCondition(step)) {\r\n <span class=\"condition-badge\" matTooltip=\"{{ getConditionSummary(step) }}\">\r\n <mat-icon>filter_alt</mat-icon>\r\n if\r\n </span>\r\n }\r\n </div>\r\n <div class=\"step-collapsed-actions\">\r\n <button\r\n mat-icon-button\r\n class=\"expand-btn\"\r\n (click)=\"toggleStep(i); $event.stopPropagation()\"\r\n matTooltip=\"Edit step\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"remove-step-btn\"\r\n (click)=\"removeStep(i); $event.stopPropagation()\"\r\n matTooltip=\"Remove step\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"step-collapsed-preview\">\r\n <span class=\"step-input\">\"{{ (stepInputs[i] || '') | slice:0:20 }}{{ (stepInputs[i] || '').length > 20 ? '...' : '' }}\"</span>\r\n <mat-icon class=\"arrow-icon\">arrow_forward</mat-icon>\r\n <span class=\"step-output\">\"{{ (stepPreviews[i] || '') | slice:0:20 }}{{ (stepPreviews[i] || '').length > 20 ? '...' : '' }}\"</span>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Expanded View -->\r\n @if (isStepExpanded(i)) {\r\n <div class=\"step-expanded\">\r\n <mat-icon class=\"drag-handle\" cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"step-header\">\r\n <span class=\"step-number\">Step {{ i + 1 }}</span>\r\n <div class=\"step-header-actions\">\r\n <button\r\n mat-icon-button\r\n class=\"collapse-btn\"\r\n (click)=\"toggleStep(i)\"\r\n matTooltip=\"Collapse\"\r\n >\r\n <mat-icon>expand_less</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"remove-step-btn\"\r\n (click)=\"removeStep(i)\"\r\n matTooltip=\"Remove step\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-content\">\r\n <ng-container *ngTemplateOutlet=\"stepConfig; context: { step: step, index: i, showHeader: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Step Preview -->\r\n <div class=\"step-preview\">\r\n <mat-icon class=\"preview-arrow\">arrow_downward</mat-icon>\r\n <span class=\"step-preview-value\">{{ stepPreviews[i] || '(empty)' }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Final Preview -->\r\n <div class=\"preview-section final-preview\">\r\n <span class=\"preview-label\">Final Result:</span>\r\n <div class=\"preview-value\">{{ finalPreview || '(empty)' }}</div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Add Step Button - Always visible -->\r\n <div class=\"add-step-section\">\r\n <button mat-stroked-button class=\"add-step-btn\" (click)=\"addStep()\">\r\n <mat-icon>add</mat-icon>\r\n @if (isMultiStep) {\r\n Add Step\r\n } @else {\r\n Add Transformation Step\r\n }\r\n </button>\r\n </div>\r\n\r\n <div class=\"popover-actions\">\r\n <button mat-button color=\"warn\" (click)=\"onDelete()\" matTooltip=\"Remove this mapping\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n <div class=\"action-spacer\"></div>\r\n <button mat-button (click)=\"onClose()\">Cancel</button>\r\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\">Apply</button>\r\n </div>\r\n</div>\r\n\r\n<!-- Backdrop -->\r\n<div class=\"popover-backdrop\" (click)=\"onClose()\"></div>\r\n\r\n<!-- Step Configuration Template -->\r\n<ng-template #stepConfig let-step=\"step\" let-index=\"index\" let-showHeader=\"showHeader\">\r\n <!-- Transformation Type -->\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Transformation Type</mat-label>\r\n <mat-select [(ngModel)]=\"step.type\" (selectionChange)=\"onStepTypeChange(index)\">\r\n @for (t of availableTransformations; track t.type) {\r\n <mat-option [value]=\"t.type\">{{ t.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Type-specific options -->\r\n @switch (step.type) {\r\n @case ('concat') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Separator</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.separator\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n placeholder=\" \"\r\n />\r\n <mat-hint>Join values with this (default: space)</mat-hint>\r\n </mat-form-field>\r\n <div class=\"or-divider\">or use template for custom format</div>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Template</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.template\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n [placeholder]=\"'{0} - {1}'\"\r\n />\r\n <mat-hint>Overrides separator if set</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('substring') {\r\n <div class=\"config-section config-row\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Start Index</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [(ngModel)]=\"step.startIndex\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n min=\"0\"\r\n />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>End Index</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [(ngModel)]=\"step.endIndex\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('replace') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Search For</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.searchValue\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Replace With</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.replaceValue\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('dateFormat') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Output Format</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.outputFormat\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n placeholder=\"YYYY-MM-DD\"\r\n />\r\n <mat-hint>YYYY, MM, DD, HH, mm, ss</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('numberFormat') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Decimal Places</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [(ngModel)]=\"step.decimalPlaces\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n min=\"0\"\r\n />\r\n </mat-form-field>\r\n <div class=\"config-row\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Prefix</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.prefix\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n placeholder=\"$\"\r\n />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Suffix</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.suffix\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n }\r\n\r\n @case ('mask') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Pattern</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.pattern\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n placeholder=\"(###) ###-####\"\r\n />\r\n <mat-hint># = character from input</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('template') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Template Expression</mat-label>\r\n <textarea\r\n matInput\r\n [(ngModel)]=\"step.template\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n rows=\"3\"\r\n [placeholder]=\"'Hello {0}, your ID is {1}'\"\r\n ></textarea>\r\n @if (index === 0) {\r\n <mat-hint>Use {{ '{' }}0{{ '}' }}, {{ '{' }}1{{ '}' }}, etc. for source fields</mat-hint>\r\n } @else {\r\n <mat-hint>Use {{ '{' }}0{{ '}' }} for the value from previous step</mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Condition Section -->\r\n <div class=\"condition-section\">\r\n <mat-checkbox\r\n [checked]=\"hasCondition(step)\"\r\n (change)=\"toggleCondition(step, $event.checked)\"\r\n class=\"condition-checkbox\"\r\n >\r\n Apply conditionally\r\n </mat-checkbox>\r\n\r\n @if (hasCondition(step)) {\r\n <div class=\"condition-content\">\r\n <condition-builder\r\n [condition]=\"step.condition?.root || null\"\r\n [compact]=\"true\"\r\n (conditionChange)=\"onConditionChange(step, $event)\"\r\n ></condition-builder>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n","import { Component, Input, Output, EventEmitter, computed, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport {\n ArrayMapping,\n ArrayFilterConfig,\n FilterCondition,\n FilterGroup,\n FilterItem,\n FilterOperator,\n SchemaField,\n} from '../../models/schema.model';\n\ninterface OperatorOption {\n value: FilterOperator;\n label: string;\n needsValue: boolean;\n}\n\n@Component({\n selector: 'array-filter-modal',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatSelectModule,\n MatInputModule,\n MatFormFieldModule,\n MatRadioModule,\n MatSlideToggleModule,\n MatTooltipModule,\n MatDividerModule,\n ],\n templateUrl: './array-filter-modal.component.html',\n styleUrl: './array-filter-modal.component.scss',\n})\nexport class ArrayFilterModalComponent implements OnInit {\n @Input({ required: true }) arrayMapping!: ArrayMapping;\n @Output() save = new EventEmitter<ArrayFilterConfig | undefined>();\n @Output() close = new EventEmitter<void>();\n\n filterEnabled = signal(false);\n rootGroup = signal<FilterGroup>(this.createEmptyGroup());\n\n // Available fields from the source array's children\n availableFields = computed(() => {\n const fields: { path: string; name: string; type: string }[] = [];\n this.collectFields(this.arrayMapping.sourceArray.children || [], '', fields);\n return fields;\n });\n\n // Operators by type\n stringOperators: OperatorOption[] = [\n { value: 'equals', label: 'equals', needsValue: true },\n { value: 'notEquals', label: 'not equals', needsValue: true },\n { value: 'contains', label: 'contains', needsValue: true },\n { value: 'notContains', label: 'does not contain', needsValue: true },\n { value: 'startsWith', label: 'starts with', needsValue: true },\n { value: 'endsWith', label: 'ends with', needsValue: true },\n { value: 'isEmpty', label: 'is empty', needsValue: false },\n { value: 'isNotEmpty', label: 'is not empty', needsValue: false },\n ];\n\n numberOperators: OperatorOption[] = [\n { value: 'equals', label: 'equals', needsValue: true },\n { value: 'notEquals', label: 'not equals', needsValue: true },\n { value: 'greaterThan', label: 'greater than', needsValue: true },\n { value: 'lessThan', label: 'less than', needsValue: true },\n { value: 'greaterThanOrEqual', label: 'greater or equal', needsValue: true },\n { value: 'lessThanOrEqual', label: 'less or equal', needsValue: true },\n ];\n\n booleanOperators: OperatorOption[] = [\n { value: 'isTrue', label: 'is true', needsValue: false },\n { value: 'isFalse', label: 'is false', needsValue: false },\n ];\n\n ngOnInit(): void {\n // Initialize from existing filter config\n if (this.arrayMapping.filter?.enabled && this.arrayMapping.filter.root) {\n this.filterEnabled.set(true);\n this.rootGroup.set(this.cloneGroup(this.arrayMapping.filter.root));\n }\n }\n\n private createEmptyGroup(): FilterGroup {\n return {\n id: this.generateId(),\n type: 'group',\n logic: 'and',\n children: [],\n };\n }\n\n private generateId(): string {\n return `filter-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cloneGroup(group: FilterGroup): FilterGroup {\n return {\n ...group,\n children: group.children.map((child) =>\n child.type === 'group' ? this.cloneGroup(child) : { ...child }\n ),\n };\n }\n\n private collectFields(\n fields: SchemaField[],\n prefix: string,\n result: { path: string; name: string; type: string }[]\n ): void {\n for (const field of fields) {\n const path = prefix ? `${prefix}.${field.name}` : field.name;\n if (field.type !== 'object' && field.type !== 'array') {\n result.push({ path, name: field.name, type: field.type });\n }\n if (field.children) {\n this.collectFields(field.children, path, result);\n }\n }\n }\n\n getOperatorsForField(fieldPath: string): OperatorOption[] {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n if (!field) return this.stringOperators;\n\n switch (field.type) {\n case 'number':\n return this.numberOperators;\n case 'boolean':\n return this.booleanOperators;\n default:\n return this.stringOperators;\n }\n }\n\n getFieldType(fieldPath: string): string {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n return field?.type || 'string';\n }\n\n operatorNeedsValue(operator: FilterOperator): boolean {\n const allOperators = [...this.stringOperators, ...this.numberOperators, ...this.booleanOperators];\n const op = allOperators.find((o) => o.value === operator);\n return op?.needsValue ?? true;\n }\n\n isCondition(item: FilterItem): item is FilterCondition {\n return item.type === 'condition';\n }\n\n isGroup(item: FilterItem): item is FilterGroup {\n return item.type === 'group';\n }\n\n addCondition(group: FilterGroup): void {\n const fields = this.availableFields();\n const firstField = fields[0];\n const newCondition: FilterCondition = {\n id: this.generateId(),\n type: 'condition',\n field: firstField?.path || '',\n fieldName: firstField?.name || '',\n operator: 'equals',\n value: '',\n valueType: (firstField?.type as 'string' | 'number' | 'boolean') || 'string',\n };\n group.children = [...group.children, newCondition];\n this.triggerUpdate();\n }\n\n addGroup(parentGroup: FilterGroup): void {\n const newGroup: FilterGroup = {\n id: this.generateId(),\n type: 'group',\n logic: parentGroup.logic === 'and' ? 'or' : 'and', // Default to opposite logic\n children: [],\n };\n parentGroup.children = [...parentGroup.children, newGroup];\n this.triggerUpdate();\n }\n\n removeItem(parentGroup: FilterGroup, itemId: string): void {\n parentGroup.children = parentGroup.children.filter((c) => c.id !== itemId);\n this.triggerUpdate();\n }\n\n onFieldChange(condition: FilterCondition, fieldPath: string): void {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n if (field) {\n condition.field = fieldPath;\n condition.fieldName = field.name;\n condition.valueType = field.type as 'string' | 'number' | 'boolean';\n // Reset operator to first valid option for new type\n const operators = this.getOperatorsForField(fieldPath);\n condition.operator = operators[0].value;\n condition.value = '';\n }\n this.triggerUpdate();\n }\n\n onOperatorChange(condition: FilterCondition, operator: FilterOperator): void {\n condition.operator = operator;\n if (!this.operatorNeedsValue(operator)) {\n condition.value = '';\n }\n this.triggerUpdate();\n }\n\n onValueChange(condition: FilterCondition, value: string | boolean): void {\n if (condition.valueType === 'number') {\n condition.value = parseFloat(value as string) || 0;\n } else {\n condition.value = value;\n }\n this.triggerUpdate();\n }\n\n onLogicChange(group: FilterGroup, logic: 'and' | 'or'): void {\n group.logic = logic;\n this.triggerUpdate();\n }\n\n private triggerUpdate(): void {\n // Trigger signal update by creating a new reference\n this.rootGroup.set(this.cloneGroup(this.rootGroup()));\n }\n\n hasConditions(group: FilterGroup): boolean {\n return group.children.length > 0;\n }\n\n countConditions(group: FilterGroup): number {\n let count = 0;\n for (const child of group.children) {\n if (child.type === 'condition') {\n count++;\n } else {\n count += this.countConditions(child);\n }\n }\n return count;\n }\n\n onSave(): void {\n if (!this.filterEnabled()) {\n this.save.emit(undefined);\n } else {\n this.save.emit({\n enabled: true,\n root: this.rootGroup(),\n });\n }\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n onBackdropClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).classList.contains('modal-backdrop')) {\n this.onClose();\n }\n }\n}\n","<div class=\"modal-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"filter-modal\">\n <div class=\"modal-header\">\n <div class=\"header-title\">\n <mat-icon>filter_list</mat-icon>\n <span>Array Filter</span>\n </div>\n <span class=\"array-path\">{{ arrayMapping.sourceArray.name }}[] &rarr; {{ arrayMapping.targetArray.name }}[]</span>\n <button mat-icon-button class=\"close-btn\" (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"modal-body\">\n <!-- Filter mode selection -->\n <div class=\"filter-mode\">\n <mat-radio-group [value]=\"filterEnabled()\" (change)=\"filterEnabled.set($event.value)\">\n <mat-radio-button [value]=\"false\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>select_all</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">No filter</span>\n <span class=\"mode-desc\">Map all records from source to target</span>\n </div>\n </div>\n </mat-radio-button>\n <mat-radio-button [value]=\"true\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>filter_alt</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">Filter records</span>\n <span class=\"mode-desc\">Only map records matching conditions</span>\n </div>\n </div>\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <!-- Conditions builder (only when filter enabled) -->\n @if (filterEnabled()) {\n <mat-divider></mat-divider>\n\n <div class=\"conditions-section\">\n <!-- Root group -->\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: rootGroup(), isRoot: true }\"></ng-container>\n </div>\n }\n </div>\n\n <div class=\"modal-footer\">\n <button mat-button (click)=\"onClose()\">Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\">\n Apply\n </button>\n </div>\n </div>\n</div>\n\n<!-- Recursive group template -->\n<ng-template #groupTemplate let-group=\"group\" let-isRoot=\"isRoot\" let-parentGroup=\"parentGroup\">\n <div class=\"filter-group\" [class.root-group]=\"isRoot\" [class.nested-group]=\"!isRoot\">\n <!-- Group header with logic toggle -->\n <div class=\"group-header\">\n <div class=\"logic-toggle\">\n <span class=\"logic-label\">Match</span>\n <mat-radio-group [value]=\"group.logic\" (change)=\"onLogicChange(group, $event.value)\">\n <mat-radio-button value=\"and\">ALL (AND)</mat-radio-button>\n <mat-radio-button value=\"or\">ANY (OR)</mat-radio-button>\n </mat-radio-group>\n </div>\n @if (!isRoot) {\n <button mat-icon-button class=\"remove-group-btn\" matTooltip=\"Remove group\" (click)=\"removeItem(parentGroup, group.id)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n\n <!-- Group children -->\n <div class=\"group-children\">\n @for (item of group.children; track item.id; let i = $index) {\n <!-- Logic connector between items -->\n @if (i > 0) {\n <div class=\"logic-connector\">\n <span class=\"logic-badge\" [class.and]=\"group.logic === 'and'\" [class.or]=\"group.logic === 'or'\">\n {{ group.logic | uppercase }}\n </span>\n </div>\n }\n\n @if (isCondition(item)) {\n <!-- Condition row -->\n <div class=\"condition-row\">\n <div class=\"condition-inputs\">\n <!-- Field selector -->\n <mat-form-field appearance=\"outline\" class=\"field-select\">\n <mat-label>Field</mat-label>\n <mat-select [value]=\"item.field\" (selectionChange)=\"onFieldChange(item, $event.value)\">\n @for (field of availableFields(); track field.path) {\n <mat-option [value]=\"field.path\">\n {{ field.name }}\n <span class=\"field-type\">({{ field.type }})</span>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <!-- Operator selector -->\n <mat-form-field appearance=\"outline\" class=\"operator-select\">\n <mat-label>Operator</mat-label>\n <mat-select [value]=\"item.operator\" (selectionChange)=\"onOperatorChange(item, $event.value)\">\n @for (op of getOperatorsForField(item.field); track op.value) {\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <!-- Value input (only if operator needs value) -->\n @if (operatorNeedsValue(item.operator)) {\n @if (item.valueType === 'boolean') {\n <mat-slide-toggle\n [checked]=\"item.value === true\"\n (change)=\"onValueChange(item, $event.checked)\"\n class=\"bool-toggle\"\n >\n {{ item.value ? 'true' : 'false' }}\n </mat-slide-toggle>\n } @else if (item.valueType === 'number') {\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Value</mat-label>\n <input\n matInput\n type=\"number\"\n [value]=\"item.value\"\n (input)=\"onValueChange(item, $any($event.target).value)\"\n />\n </mat-form-field>\n } @else {\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Value</mat-label>\n <input\n matInput\n type=\"text\"\n [value]=\"item.value\"\n (input)=\"onValueChange(item, $any($event.target).value)\"\n />\n </mat-form-field>\n }\n }\n\n <!-- Remove condition button -->\n <button mat-icon-button class=\"remove-btn\" matTooltip=\"Remove condition\" (click)=\"removeItem(group, item.id)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n } @else if (isGroup(item)) {\n <!-- Nested group -->\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: item, isRoot: false, parentGroup: group }\"></ng-container>\n }\n }\n\n <!-- Empty state -->\n @if (group.children.length === 0) {\n <div class=\"empty-group\">\n <mat-icon>info_outline</mat-icon>\n <span>No conditions. Add a condition or group.</span>\n </div>\n }\n </div>\n\n <!-- Group actions -->\n <div class=\"group-actions\">\n <button mat-stroked-button class=\"add-condition-btn\" (click)=\"addCondition(group)\">\n <mat-icon>add</mat-icon>\n Add Condition\n </button>\n <button mat-stroked-button class=\"add-group-btn\" (click)=\"addGroup(group)\">\n <mat-icon>folder_open</mat-icon>\n Add Group\n </button>\n </div>\n </div>\n</ng-template>\n","import { Component, Input, Output, EventEmitter, computed, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport {\n ArrayToObjectMapping,\n ArraySelectorConfig,\n ArraySelectionMode,\n FilterCondition,\n FilterGroup,\n FilterItem,\n FilterOperator,\n SchemaField,\n} from '../../models/schema.model';\n\ninterface OperatorOption {\n value: FilterOperator;\n label: string;\n needsValue: boolean;\n}\n\n@Component({\n selector: 'array-selector-modal',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatSelectModule,\n MatInputModule,\n MatFormFieldModule,\n MatRadioModule,\n MatSlideToggleModule,\n MatTooltipModule,\n MatDividerModule,\n ],\n templateUrl: './array-selector-modal.component.html',\n styleUrl: './array-selector-modal.component.scss',\n})\nexport class ArraySelectorModalComponent implements OnInit {\n @Input({ required: true }) mapping!: ArrayToObjectMapping;\n @Output() save = new EventEmitter<ArraySelectorConfig>();\n @Output() close = new EventEmitter<void>();\n\n selectionMode = signal<ArraySelectionMode>('first');\n conditionGroup = signal<FilterGroup>(this.createEmptyGroup());\n\n // Available fields from the source array's children\n availableFields = computed(() => {\n const fields: { path: string; name: string; type: string }[] = [];\n this.collectFields(this.mapping.sourceArray.children || [], '', fields);\n return fields;\n });\n\n // Operators by type\n stringOperators: OperatorOption[] = [\n { value: 'equals', label: 'equals', needsValue: true },\n { value: 'notEquals', label: 'not equals', needsValue: true },\n { value: 'contains', label: 'contains', needsValue: true },\n { value: 'notContains', label: 'does not contain', needsValue: true },\n { value: 'startsWith', label: 'starts with', needsValue: true },\n { value: 'endsWith', label: 'ends with', needsValue: true },\n { value: 'isEmpty', label: 'is empty', needsValue: false },\n { value: 'isNotEmpty', label: 'is not empty', needsValue: false },\n ];\n\n numberOperators: OperatorOption[] = [\n { value: 'equals', label: 'equals', needsValue: true },\n { value: 'notEquals', label: 'not equals', needsValue: true },\n { value: 'greaterThan', label: 'greater than', needsValue: true },\n { value: 'lessThan', label: 'less than', needsValue: true },\n { value: 'greaterThanOrEqual', label: 'greater or equal', needsValue: true },\n { value: 'lessThanOrEqual', label: 'less or equal', needsValue: true },\n ];\n\n booleanOperators: OperatorOption[] = [\n { value: 'isTrue', label: 'is true', needsValue: false },\n { value: 'isFalse', label: 'is false', needsValue: false },\n ];\n\n ngOnInit(): void {\n // Initialize from existing selector config\n if (this.mapping.selector) {\n this.selectionMode.set(this.mapping.selector.mode);\n if (this.mapping.selector.condition) {\n this.conditionGroup.set(this.cloneGroup(this.mapping.selector.condition));\n }\n }\n }\n\n private createEmptyGroup(): FilterGroup {\n return {\n id: this.generateId(),\n type: 'group',\n logic: 'and',\n children: [],\n };\n }\n\n private generateId(): string {\n return `filter-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cloneGroup(group: FilterGroup): FilterGroup {\n return {\n ...group,\n children: group.children.map((child) =>\n child.type === 'group' ? this.cloneGroup(child) : { ...child }\n ),\n };\n }\n\n private collectFields(\n fields: SchemaField[],\n prefix: string,\n result: { path: string; name: string; type: string }[]\n ): void {\n for (const field of fields) {\n const path = prefix ? `${prefix}.${field.name}` : field.name;\n if (field.type !== 'object' && field.type !== 'array') {\n result.push({ path, name: field.name, type: field.type });\n }\n if (field.children) {\n this.collectFields(field.children, path, result);\n }\n }\n }\n\n getOperatorsForField(fieldPath: string): OperatorOption[] {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n if (!field) return this.stringOperators;\n\n switch (field.type) {\n case 'number':\n return this.numberOperators;\n case 'boolean':\n return this.booleanOperators;\n default:\n return this.stringOperators;\n }\n }\n\n operatorNeedsValue(operator: FilterOperator): boolean {\n const allOperators = [...this.stringOperators, ...this.numberOperators, ...this.booleanOperators];\n const op = allOperators.find((o) => o.value === operator);\n return op?.needsValue ?? true;\n }\n\n isCondition(item: FilterItem): item is FilterCondition {\n return item.type === 'condition';\n }\n\n isGroup(item: FilterItem): item is FilterGroup {\n return item.type === 'group';\n }\n\n addCondition(group: FilterGroup): void {\n const fields = this.availableFields();\n const firstField = fields[0];\n const newCondition: FilterCondition = {\n id: this.generateId(),\n type: 'condition',\n field: firstField?.path || '',\n fieldName: firstField?.name || '',\n operator: 'equals',\n value: '',\n valueType: (firstField?.type as 'string' | 'number' | 'boolean') || 'string',\n };\n group.children = [...group.children, newCondition];\n this.triggerUpdate();\n }\n\n addGroup(parentGroup: FilterGroup): void {\n const newGroup: FilterGroup = {\n id: this.generateId(),\n type: 'group',\n logic: parentGroup.logic === 'and' ? 'or' : 'and',\n children: [],\n };\n parentGroup.children = [...parentGroup.children, newGroup];\n this.triggerUpdate();\n }\n\n removeItem(parentGroup: FilterGroup, itemId: string): void {\n parentGroup.children = parentGroup.children.filter((c) => c.id !== itemId);\n this.triggerUpdate();\n }\n\n onFieldChange(condition: FilterCondition, fieldPath: string): void {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n if (field) {\n condition.field = fieldPath;\n condition.fieldName = field.name;\n condition.valueType = field.type as 'string' | 'number' | 'boolean';\n const operators = this.getOperatorsForField(fieldPath);\n condition.operator = operators[0].value;\n condition.value = '';\n }\n this.triggerUpdate();\n }\n\n onOperatorChange(condition: FilterCondition, operator: FilterOperator): void {\n condition.operator = operator;\n if (!this.operatorNeedsValue(operator)) {\n condition.value = '';\n }\n this.triggerUpdate();\n }\n\n onValueChange(condition: FilterCondition, value: string | boolean): void {\n if (condition.valueType === 'number') {\n condition.value = parseFloat(value as string) || 0;\n } else {\n condition.value = value;\n }\n this.triggerUpdate();\n }\n\n onLogicChange(group: FilterGroup, logic: 'and' | 'or'): void {\n group.logic = logic;\n this.triggerUpdate();\n }\n\n private triggerUpdate(): void {\n this.conditionGroup.set(this.cloneGroup(this.conditionGroup()));\n }\n\n onSave(): void {\n const config: ArraySelectorConfig = {\n mode: this.selectionMode(),\n };\n\n if (this.selectionMode() === 'condition') {\n config.condition = this.conditionGroup();\n }\n\n this.save.emit(config);\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n onBackdropClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).classList.contains('modal-backdrop')) {\n this.onClose();\n }\n }\n}\n","<div class=\"modal-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"selector-modal\">\n <div class=\"modal-header\">\n <div class=\"header-title\">\n <mat-icon>swap_horiz</mat-icon>\n <span>Array to Object</span>\n </div>\n <span class=\"mapping-path\">{{ mapping.sourceArray.name }}[] &rarr; {{ mapping.targetObject.name }}</span>\n <button mat-icon-button class=\"close-btn\" (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"modal-body\">\n <p class=\"description\">\n Select which item from the array should be mapped to the target object.\n </p>\n\n <!-- Selection mode -->\n <div class=\"selection-mode\">\n <mat-radio-group [value]=\"selectionMode()\" (change)=\"selectionMode.set($event.value)\">\n <mat-radio-button value=\"first\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>first_page</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">First item</span>\n <span class=\"mode-desc\">Use the first item in the array</span>\n </div>\n </div>\n </mat-radio-button>\n\n <mat-radio-button value=\"last\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>last_page</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">Last item</span>\n <span class=\"mode-desc\">Use the last item in the array</span>\n </div>\n </div>\n </mat-radio-button>\n\n <mat-radio-button value=\"condition\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>filter_alt</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">First matching condition</span>\n <span class=\"mode-desc\">Use the first item that matches the condition</span>\n </div>\n </div>\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <!-- Condition builder (only when condition mode selected) -->\n @if (selectionMode() === 'condition') {\n <mat-divider></mat-divider>\n\n <div class=\"conditions-section\">\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: conditionGroup(), isRoot: true }\"></ng-container>\n </div>\n }\n </div>\n\n <div class=\"modal-footer\">\n <button mat-button (click)=\"onClose()\">Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\">Apply</button>\n </div>\n </div>\n</div>\n\n<!-- Recursive group template -->\n<ng-template #groupTemplate let-group=\"group\" let-isRoot=\"isRoot\" let-parentGroup=\"parentGroup\">\n <div class=\"filter-group\" [class.root-group]=\"isRoot\" [class.nested-group]=\"!isRoot\">\n <div class=\"group-header\">\n <div class=\"logic-toggle\">\n <span class=\"logic-label\">Match</span>\n <mat-radio-group [value]=\"group.logic\" (change)=\"onLogicChange(group, $event.value)\">\n <mat-radio-button value=\"and\">ALL (AND)</mat-radio-button>\n <mat-radio-button value=\"or\">ANY (OR)</mat-radio-button>\n </mat-radio-group>\n </div>\n @if (!isRoot) {\n <button mat-icon-button class=\"remove-group-btn\" matTooltip=\"Remove group\" (click)=\"removeItem(parentGroup, group.id)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n\n <div class=\"group-children\">\n @for (item of group.children; track item.id; let i = $index) {\n @if (i > 0) {\n <div class=\"logic-connector\">\n <span class=\"logic-badge\" [class.and]=\"group.logic === 'and'\" [class.or]=\"group.logic === 'or'\">\n {{ group.logic | uppercase }}\n </span>\n </div>\n }\n\n @if (isCondition(item)) {\n <div class=\"condition-row\">\n <div class=\"condition-inputs\">\n <mat-form-field appearance=\"outline\" class=\"field-select\">\n <mat-label>Field</mat-label>\n <mat-select [value]=\"item.field\" (selectionChange)=\"onFieldChange(item, $event.value)\">\n @for (field of availableFields(); track field.path) {\n <mat-option [value]=\"field.path\">\n {{ field.name }}\n <span class=\"field-type\">({{ field.type }})</span>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"operator-select\">\n <mat-label>Operator</mat-label>\n <mat-select [value]=\"item.operator\" (selectionChange)=\"onOperatorChange(item, $event.value)\">\n @for (op of getOperatorsForField(item.field); track op.value) {\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n @if (operatorNeedsValue(item.operator)) {\n @if (item.valueType === 'boolean') {\n <mat-slide-toggle\n [checked]=\"item.value === true\"\n (change)=\"onValueChange(item, $event.checked)\"\n class=\"bool-toggle\"\n >\n {{ item.value ? 'true' : 'false' }}\n </mat-slide-toggle>\n } @else if (item.valueType === 'number') {\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Value</mat-label>\n <input matInput type=\"number\" [value]=\"item.value\" (input)=\"onValueChange(item, $any($event.target).value)\" />\n </mat-form-field>\n } @else {\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Value</mat-label>\n <input matInput type=\"text\" [value]=\"item.value\" (input)=\"onValueChange(item, $any($event.target).value)\" />\n </mat-form-field>\n }\n }\n\n <button mat-icon-button class=\"remove-btn\" matTooltip=\"Remove condition\" (click)=\"removeItem(group, item.id)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n } @else if (isGroup(item)) {\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: item, isRoot: false, parentGroup: group }\"></ng-container>\n }\n }\n\n @if (group.children.length === 0) {\n <div class=\"empty-group\">\n <mat-icon>info_outline</mat-icon>\n <span>No conditions. Add a condition to filter.</span>\n </div>\n }\n </div>\n\n <div class=\"group-actions\">\n <button mat-stroked-button class=\"add-condition-btn\" (click)=\"addCondition(group)\">\n <mat-icon>add</mat-icon>\n Add Condition\n </button>\n <button mat-stroked-button class=\"add-group-btn\" (click)=\"addGroup(group)\">\n <mat-icon>folder_open</mat-icon>\n Add Group\n </button>\n </div>\n </div>\n</ng-template>\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { SchemaField, DefaultValue } from '../../models/schema.model';\n\n@Component({\n selector: 'default-value-popover',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatInputModule,\n MatFormFieldModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatSelectModule,\n MatSlideToggleModule,\n ],\n templateUrl: './default-value-popover.component.html',\n styleUrl: './default-value-popover.component.scss',\n})\nexport class DefaultValuePopoverComponent implements OnInit {\n @Input() field!: SchemaField;\n @Input() existingValue?: DefaultValue;\n @Input() position!: { x: number; y: number };\n\n @Output() save = new EventEmitter<string | number | boolean | Date | null>();\n @Output() delete = new EventEmitter<void>();\n @Output() close = new EventEmitter<void>();\n\n stringValue = '';\n numberValue: number | null = null;\n booleanValue = false;\n dateValue: Date | null = null;\n\n ngOnInit(): void {\n if (this.existingValue) {\n switch (this.fieldType) {\n case 'string':\n this.stringValue = this.existingValue.value as string || '';\n break;\n case 'number':\n this.numberValue = this.existingValue.value as number;\n break;\n case 'boolean':\n this.booleanValue = this.existingValue.value as boolean;\n break;\n case 'date':\n this.dateValue = this.existingValue.value ? new Date(this.existingValue.value as string) : null;\n break;\n }\n }\n }\n\n get fieldType(): string {\n if (this.field.type === 'date' || this.field.name.toLowerCase().includes('date')) {\n return 'date';\n }\n return this.field.type;\n }\n\n onSave(): void {\n let value: string | number | boolean | Date | null;\n\n switch (this.fieldType) {\n case 'number':\n value = this.numberValue;\n break;\n case 'boolean':\n value = this.booleanValue;\n break;\n case 'date':\n value = this.dateValue;\n break;\n default:\n value = this.stringValue || null;\n }\n\n this.save.emit(value);\n }\n\n onDelete(): void {\n this.delete.emit();\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n onBackdropClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).classList.contains('popover-backdrop')) {\n this.onClose();\n }\n }\n}\n","<div class=\"popover-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"popover-container\">\n <div class=\"popover-header\">\n <div class=\"header-title\">\n <mat-icon>edit</mat-icon>\n <span>Default Value</span>\n </div>\n <button mat-icon-button (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"popover-content\">\n <div class=\"field-info\">\n <span class=\"field-name\">{{ field.name }}</span>\n <span class=\"field-type\">{{ fieldType }}</span>\n </div>\n\n <!-- String input -->\n @if (fieldType === 'string') {\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Default Value</mat-label>\n <input matInput [(ngModel)]=\"stringValue\" placeholder=\"Enter default value\">\n </mat-form-field>\n }\n\n <!-- Number input -->\n @if (fieldType === 'number') {\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Default Value</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"numberValue\" placeholder=\"Enter number\">\n </mat-form-field>\n }\n\n <!-- Boolean input -->\n @if (fieldType === 'boolean') {\n <div class=\"boolean-input\">\n <mat-slide-toggle [(ngModel)]=\"booleanValue\">\n {{ booleanValue ? 'True' : 'False' }}\n </mat-slide-toggle>\n </div>\n }\n\n <!-- Date input -->\n @if (fieldType === 'date') {\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Default Date</mat-label>\n <input matInput [matDatepicker]=\"picker\" [(ngModel)]=\"dateValue\">\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n }\n </div>\n\n <div class=\"popover-actions\">\n @if (existingValue) {\n <button mat-button color=\"warn\" (click)=\"onDelete()\">\n <mat-icon>delete</mat-icon>\n Remove\n </button>\n }\n <span class=\"spacer\"></span>\n <button mat-button (click)=\"onClose()\">Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n HostListener,\n inject,\n signal,\n computed,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n SchemaField,\n SchemaDefinition,\n FieldMapping,\n TransformationConfig,\n ArrayMapping,\n ArrayFilterConfig,\n ArrayToObjectMapping,\n ArraySelectorConfig,\n DefaultValue,\n} from '../../models/schema.model';\nimport { JsonSchema } from '../../models/json-schema.model';\nimport { MappingService } from '../../services/mapping.service';\nimport { SvgConnectorService, Point } from '../../services/svg-connector.service';\nimport { TransformationService } from '../../services/transformation.service';\nimport { SchemaParserService, SchemaDocument } from '../../services/schema-parser.service';\nimport { SchemaTreeComponent, FieldPositionEvent } from '../schema-tree/schema-tree.component';\nimport { TransformationPopoverComponent } from '../transformation-popover/transformation-popover.component';\nimport { ArrayFilterModalComponent } from '../array-filter-modal/array-filter-modal.component';\nimport { ArraySelectorModalComponent } from '../array-selector-modal/array-selector-modal.component';\nimport { DefaultValuePopoverComponent } from '../default-value-popover/default-value-popover.component';\n\ninterface VisualConnection {\n id: string;\n mappingId: string;\n paths: string[];\n sourcePoints: Point[];\n midPoint: Point;\n targetPoint: Point;\n hasTransformation: boolean;\n isSelected: boolean;\n isArrayMapping: boolean;\n isArrayToObjectMapping: boolean;\n hasFilter: boolean;\n isBeingDragged: boolean;\n}\n\n@Component({\n selector: 'data-mapper',\n standalone: true,\n imports: [\n CommonModule,\n MatIconModule,\n MatButtonModule,\n MatTooltipModule,\n SchemaTreeComponent,\n TransformationPopoverComponent,\n ArrayFilterModalComponent,\n ArraySelectorModalComponent,\n DefaultValuePopoverComponent,\n ],\n templateUrl: './data-mapper.component.html',\n styleUrl: './data-mapper.component.scss',\n})\nexport class DataMapperComponent implements AfterViewInit, OnDestroy {\n @Input() set sourceSchema(value: JsonSchema | SchemaDocument) {\n if (value) {\n this._sourceSchemaInput.set(value);\n }\n }\n @Input() set targetSchema(value: JsonSchema | SchemaDocument) {\n if (value) {\n this._targetSchemaInput.set(value);\n }\n }\n @Input() set sourceSchemaRef(value: string | null | undefined) {\n this.mappingService.setSourceSchemaRef(value ?? null);\n }\n @Input() set targetSchemaRef(value: string | null | undefined) {\n this.mappingService.setTargetSchemaRef(value ?? null);\n }\n @Input() sampleData: Record<string, unknown> = {};\n\n @Output() mappingsChange = new EventEmitter<FieldMapping[]>();\n\n @ViewChild('svgContainer') svgContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('svgElement') svgElement!: ElementRef<SVGSVGElement>;\n\n private mappingService = inject(MappingService);\n private svgConnectorService = inject(SvgConnectorService);\n private transformationService = inject(TransformationService);\n private schemaParserService = inject(SchemaParserService);\n\n // Internal signals for schema inputs\n private _sourceSchemaInput = signal<JsonSchema | SchemaDocument | null>(null);\n private _targetSchemaInput = signal<JsonSchema | SchemaDocument | null>(null);\n\n // Converted schemas for the tree component\n readonly sourceSchemaForTree = computed(() => {\n const schema = this._sourceSchemaInput();\n if (!schema) return { name: '', fields: [] };\n return this.schemaParserService.parseSchema(schema as SchemaDocument, schema.title || 'Source');\n });\n\n readonly targetSchemaForTree = computed(() => {\n const schema = this._targetSchemaInput();\n if (!schema) return { name: '', fields: [] };\n return this.schemaParserService.parseSchema(schema as SchemaDocument, schema.title || 'Target');\n });\n\n // Field positions from both trees\n private sourcePositions = new Map<string, DOMRect>();\n private targetPositions = new Map<string, DOMRect>();\n\n // Visual state\n connections = signal<VisualConnection[]>([]);\n dragPath = signal<string | null>(null);\n selectedMappingId = signal<string | null>(null);\n popoverPosition = signal<{ x: number; y: number } | null>(null);\n\n // Array filter modal state\n showArrayFilterModal = signal(false);\n selectedArrayMapping = signal<ArrayMapping | null>(null);\n\n // Array selector modal state (for array-to-object)\n showArraySelectorModal = signal(false);\n selectedArrayToObjectMapping = signal<ArrayToObjectMapping | null>(null);\n\n // Default value popover state\n showDefaultValuePopover = signal(false);\n selectedDefaultValueField = signal<SchemaField | null>(null);\n defaultValuePopoverPosition = signal<{ x: number; y: number } | null>(null);\n\n // Computed values\n readonly mappings = computed(() => this.mappingService.allMappings());\n readonly arrayMappings = computed(() => this.mappingService.allArrayMappings());\n readonly defaultValues = computed(() => this.mappingService.allDefaultValues());\n readonly selectedMapping = computed(() => this.mappingService.selectedMapping());\n readonly showPopover = computed(() => this.selectedMappingId() !== null && this.popoverPosition() !== null && !this.showArrayFilterModal());\n\n private isDragging = false;\n private dragSourceField: SchemaField | null = null;\n private dragStartPoint: Point | null = null;\n private resizeObserver!: ResizeObserver;\n\n // Endpoint drag state\n private isEndpointDragging = false;\n private endpointDragMappingId: string | null = null;\n private endpointDragType: 'source' | 'target' | null = null;\n private endpointDragSourceIndex: number | null = null;\n private endpointDragAnchorPoint: Point | null = null;\n\n ngAfterViewInit(): void {\n this.setupResizeObserver();\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n private setupResizeObserver(): void {\n this.resizeObserver = new ResizeObserver(() => {\n this.updateConnections();\n });\n\n if (this.svgContainer?.nativeElement) {\n this.resizeObserver.observe(this.svgContainer.nativeElement);\n }\n }\n\n onSourcePositionsChanged(positions: Map<string, DOMRect>): void {\n this.sourcePositions = positions;\n this.updateConnections();\n }\n\n onTargetPositionsChanged(positions: Map<string, DOMRect>): void {\n this.targetPositions = positions;\n this.updateConnections();\n }\n\n onFieldDragStart(event: FieldPositionEvent): void {\n if (!this.svgContainer?.nativeElement) return;\n\n const containerRect = this.svgContainer.nativeElement.getBoundingClientRect();\n const startPoint = this.svgConnectorService.calculateConnectionPoint(\n event.rect,\n 'source',\n containerRect\n );\n\n this.isDragging = true;\n this.dragSourceField = event.field;\n this.dragStartPoint = startPoint;\n\n document.body.style.cursor = 'grabbing';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.svgContainer?.nativeElement) return;\n\n const containerRect = this.svgContainer.nativeElement.getBoundingClientRect();\n const currentPoint: Point = {\n x: event.clientX - containerRect.left,\n y: event.clientY - containerRect.top,\n };\n\n // Handle new connection dragging\n if (this.isDragging && this.dragStartPoint) {\n const path = this.svgConnectorService.createDragPath(this.dragStartPoint, currentPoint);\n this.dragPath.set(path);\n return;\n }\n\n // Handle endpoint dragging\n if (this.isEndpointDragging && this.endpointDragAnchorPoint) {\n // Show drag path from anchor to cursor\n const path = this.endpointDragType === 'source'\n ? this.svgConnectorService.createDragPath(currentPoint, this.endpointDragAnchorPoint)\n : this.svgConnectorService.createDragPath(this.endpointDragAnchorPoint, currentPoint);\n this.dragPath.set(path);\n }\n }\n\n @HostListener('document:mouseup', ['$event'])\n onMouseUp(event: MouseEvent): void {\n if (this.isDragging) {\n this.dragPath.set(null);\n this.isDragging = false;\n this.dragSourceField = null;\n this.dragStartPoint = null;\n document.body.style.cursor = '';\n }\n\n if (this.isEndpointDragging) {\n this.cancelEndpointDrag();\n }\n }\n\n onEndpointDragStart(\n connection: VisualConnection,\n endpointType: 'source' | 'target',\n sourceIndex: number,\n event: MouseEvent\n ): void {\n event.stopPropagation();\n event.preventDefault();\n\n if (!this.svgContainer?.nativeElement) return;\n\n this.isEndpointDragging = true;\n this.endpointDragMappingId = connection.mappingId;\n this.endpointDragType = endpointType;\n this.endpointDragSourceIndex = sourceIndex;\n\n // Set anchor point (the point that stays fixed)\n if (endpointType === 'source') {\n // Moving source, anchor is the target\n this.endpointDragAnchorPoint = connection.targetPoint;\n } else {\n // Moving target, anchor is the first source (or merge point for multi-source)\n this.endpointDragAnchorPoint = connection.sourcePoints[0];\n }\n\n // Update MappingService drag state so schema-tree can detect endpoint dragging\n this.mappingService.startEndpointDrag(\n connection.mappingId,\n endpointType,\n endpointType === 'source' ? connection.sourcePoints[sourceIndex] : connection.targetPoint,\n sourceIndex\n );\n\n document.body.style.cursor = 'grabbing';\n this.updateConnections(); // Update to show connection as being dragged\n }\n\n private cancelEndpointDrag(): void {\n this.dragPath.set(null);\n this.isEndpointDragging = false;\n this.endpointDragMappingId = null;\n this.endpointDragType = null;\n this.endpointDragSourceIndex = null;\n this.endpointDragAnchorPoint = null;\n document.body.style.cursor = '';\n this.mappingService.endDrag(); // Reset MappingService drag state\n this.updateConnections(); // Update to restore connection visibility\n }\n\n onFieldDrop(event: FieldPositionEvent): void {\n // Handle endpoint drag completion (drop on target field)\n if (this.isEndpointDragging && this.endpointDragMappingId && this.endpointDragType === 'target') {\n this.mappingService.changeTargetField(this.endpointDragMappingId, event.field);\n this.mappingsChange.emit(this.mappingService.allMappings());\n this.updateConnections();\n this.cancelEndpointDrag();\n return;\n }\n\n if (!this.dragSourceField) return;\n\n // Create mapping\n const mapping = this.mappingService.createMapping(\n [this.dragSourceField],\n event.field\n );\n\n this.mappingsChange.emit(this.mappingService.allMappings());\n this.updateConnections();\n\n // Reset drag state\n this.isDragging = false;\n this.dragSourceField = null;\n this.dragStartPoint = null;\n this.dragPath.set(null);\n document.body.style.cursor = '';\n }\n\n onSourceFieldDrop(event: FieldPositionEvent): void {\n // Handle endpoint drag completion (drop on source field)\n if (this.isEndpointDragging && this.endpointDragMappingId && this.endpointDragType === 'source') {\n this.mappingService.changeSourceField(\n this.endpointDragMappingId,\n event.field,\n this.endpointDragSourceIndex ?? undefined\n );\n this.mappingsChange.emit(this.mappingService.allMappings());\n this.updateConnections();\n this.cancelEndpointDrag();\n }\n }\n\n onConnectionClick(connection: VisualConnection, event: MouseEvent): void {\n event.stopPropagation();\n\n this.selectedMappingId.set(connection.mappingId);\n this.mappingService.selectMapping(connection.mappingId);\n\n // Position popover at click location\n this.popoverPosition.set({\n x: event.clientX,\n y: event.clientY,\n });\n\n this.updateConnections();\n }\n\n onTransformationNodeClick(connection: VisualConnection, event: MouseEvent): void {\n event.stopPropagation();\n\n // If it's an array mapping, show the filter modal\n if (connection.isArrayMapping) {\n const arrayMapping = this.mappingService.getArrayMapping(connection.mappingId);\n if (arrayMapping) {\n this.selectedArrayMapping.set(arrayMapping);\n this.showArrayFilterModal.set(true);\n return;\n }\n }\n\n // If it's an array-to-object mapping, show the selector modal\n if (connection.isArrayToObjectMapping) {\n const arrayToObjectMapping = this.mappingService.getArrayToObjectMapping(connection.mappingId);\n if (arrayToObjectMapping) {\n this.selectedArrayToObjectMapping.set(arrayToObjectMapping);\n this.showArraySelectorModal.set(true);\n return;\n }\n }\n\n this.onConnectionClick(connection, event);\n }\n\n onArrayFilterSave(filter: ArrayFilterConfig | undefined): void {\n const arrayMapping = this.selectedArrayMapping();\n if (arrayMapping) {\n this.mappingService.updateArrayFilter(arrayMapping.id, filter);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closeArrayFilterModal();\n this.updateConnections();\n }\n\n closeArrayFilterModal(): void {\n this.showArrayFilterModal.set(false);\n this.selectedArrayMapping.set(null);\n }\n\n onArraySelectorSave(selector: ArraySelectorConfig): void {\n const mapping = this.selectedArrayToObjectMapping();\n if (mapping) {\n this.mappingService.updateArrayToObjectSelector(mapping.id, selector);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closeArraySelectorModal();\n this.updateConnections();\n }\n\n closeArraySelectorModal(): void {\n this.showArraySelectorModal.set(false);\n this.selectedArrayToObjectMapping.set(null);\n }\n\n // Default value methods\n onDefaultValueClick(event: FieldPositionEvent): void {\n this.selectedDefaultValueField.set(event.field);\n this.defaultValuePopoverPosition.set({\n x: event.rect.right,\n y: event.rect.top + event.rect.height / 2,\n });\n this.showDefaultValuePopover.set(true);\n }\n\n onDefaultValueSave(value: string | number | boolean | Date | null): void {\n const field = this.selectedDefaultValueField();\n if (field) {\n this.mappingService.setDefaultValue(field, value);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closeDefaultValuePopover();\n }\n\n onDefaultValueDelete(): void {\n const field = this.selectedDefaultValueField();\n if (field) {\n this.mappingService.removeDefaultValue(field.id);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closeDefaultValuePopover();\n }\n\n closeDefaultValuePopover(): void {\n this.showDefaultValuePopover.set(false);\n this.selectedDefaultValueField.set(null);\n this.defaultValuePopoverPosition.set(null);\n }\n\n getExistingDefaultValue(fieldId: string): DefaultValue | undefined {\n return this.mappingService.getDefaultValue(fieldId);\n }\n\n onPopoverSave(transformations: TransformationConfig[]): void {\n const mappingId = this.selectedMappingId();\n if (mappingId) {\n this.mappingService.updateTransformations(mappingId, transformations);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closePopover();\n this.updateConnections();\n }\n\n onPopoverDelete(): void {\n const mappingId = this.selectedMappingId();\n if (mappingId) {\n this.mappingService.removeMapping(mappingId);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closePopover();\n this.updateConnections();\n }\n\n closePopover(): void {\n this.selectedMappingId.set(null);\n this.popoverPosition.set(null);\n this.mappingService.selectMapping(null);\n this.updateConnections();\n }\n\n private updateConnections(): void {\n if (!this.svgContainer?.nativeElement) return;\n\n const containerRect = this.svgContainer.nativeElement.getBoundingClientRect();\n const mappings = this.mappingService.allMappings();\n const selectedId = this.selectedMappingId();\n\n const newConnections: VisualConnection[] = [];\n\n for (const mapping of mappings) {\n const targetRect = this.targetPositions.get(mapping.targetField.id);\n if (!targetRect) continue;\n\n const targetPoint = this.svgConnectorService.calculateConnectionPoint(\n targetRect,\n 'target',\n containerRect\n );\n\n const sourcePoints: Point[] = [];\n for (const sourceField of mapping.sourceFields) {\n const sourceRect = this.sourcePositions.get(sourceField.id);\n if (sourceRect) {\n sourcePoints.push(\n this.svgConnectorService.calculateConnectionPoint(\n sourceRect,\n 'source',\n containerRect\n )\n );\n }\n }\n\n if (sourcePoints.length === 0) continue;\n\n let paths: string[];\n let midPoint: Point;\n\n if (sourcePoints.length === 1) {\n paths = [this.svgConnectorService.createBezierPath(sourcePoints[0], targetPoint)];\n midPoint = this.svgConnectorService.getMidPoint(sourcePoints[0], targetPoint);\n } else {\n const result = this.svgConnectorService.createMultiSourcePath(sourcePoints, targetPoint);\n paths = result.paths;\n midPoint = result.mergePoint;\n }\n\n // Check if this array mapping has a filter\n let hasFilter = false;\n if (mapping.isArrayMapping) {\n const arrayMapping = this.mappingService.getArrayMapping(mapping.id);\n hasFilter = arrayMapping?.filter?.enabled === true && (arrayMapping?.filter?.root?.children?.length ?? 0) > 0;\n }\n\n newConnections.push({\n id: `conn-${mapping.id}`,\n mappingId: mapping.id,\n paths,\n sourcePoints,\n midPoint,\n targetPoint,\n hasTransformation: mapping.transformations.length > 1 || mapping.transformations[0]?.type !== 'direct',\n isSelected: mapping.id === selectedId,\n isArrayMapping: mapping.isArrayMapping || false,\n isArrayToObjectMapping: mapping.isArrayToObjectMapping || false,\n hasFilter,\n isBeingDragged: mapping.id === this.endpointDragMappingId,\n });\n }\n\n this.connections.set(newConnections);\n }\n\n getTransformationIcon(mappingId: string): string {\n const mapping = this.mappings().find((m) => m.id === mappingId);\n if (!mapping) return 'settings';\n\n // Show filter icon for array mappings with filter, otherwise loop icon\n if (mapping.isArrayMapping) {\n const arrayMapping = this.mappingService.getArrayMapping(mappingId);\n if (arrayMapping?.filter?.enabled && (arrayMapping?.filter?.root?.children?.length ?? 0) > 0) {\n return 'filter_alt';\n }\n return 'loop';\n }\n\n // Show appropriate icon for array-to-object mappings\n if (mapping.isArrayToObjectMapping) {\n const atoMapping = this.mappingService.getArrayToObjectMapping(mappingId);\n if (atoMapping?.selector.mode === 'first') return 'first_page';\n if (atoMapping?.selector.mode === 'last') return 'last_page';\n if (atoMapping?.selector.mode === 'condition') return 'filter_alt';\n return 'swap_horiz';\n }\n\n const icons: Record<string, string> = {\n direct: 'arrow_forward',\n concat: 'merge',\n substring: 'content_cut',\n replace: 'find_replace',\n uppercase: 'text_fields',\n lowercase: 'text_fields',\n dateFormat: 'calendar_today',\n extractYear: 'event',\n extractMonth: 'event',\n extractDay: 'event',\n extractHour: 'schedule',\n extractMinute: 'schedule',\n extractSecond: 'schedule',\n numberFormat: 'pin',\n template: 'code',\n custom: 'functions',\n };\n\n // For multiple transformations, show a pipeline icon\n if (mapping.transformations.length > 1) {\n return 'linear_scale';\n }\n return icons[mapping.transformations[0]?.type] || 'settings';\n }\n\n clearAllMappings(): void {\n this.mappingService.clearAllMappings();\n this.mappingsChange.emit([]);\n this.updateConnections();\n }\n\n exportMappings(): string {\n return this.mappingService.exportMappings();\n }\n\n importMappings(json: string): void {\n this.mappingService.importMappings(json);\n this.mappingsChange.emit(this.mappingService.allMappings());\n this.updateConnections();\n }\n\n trackByConnectionId(index: number, connection: VisualConnection): string {\n return connection.id;\n }\n}\n","<div class=\"data-mapper\">\n <!-- Header Toolbar -->\n <div class=\"mapper-toolbar\">\n <div class=\"toolbar-title\">\n <mat-icon>account_tree</mat-icon>\n <span>Data Mapper</span>\n </div>\n <div class=\"toolbar-actions\">\n <span class=\"mapping-count\">{{ mappings().length }} mapping(s)</span>\n <button\n mat-icon-button\n matTooltip=\"Clear all mappings\"\n (click)=\"clearAllMappings()\"\n [disabled]=\"mappings().length === 0\"\n >\n <mat-icon>delete_sweep</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Main Mapper Area -->\n <div class=\"mapper-container\" #svgContainer>\n <!-- Source Schema Panel -->\n <div class=\"schema-panel source-panel\">\n <schema-tree\n [schema]=\"sourceSchemaForTree()\"\n [side]=\"'source'\"\n [mappings]=\"mappings()\"\n (fieldDragStart)=\"onFieldDragStart($event)\"\n (fieldPositionsChanged)=\"onSourcePositionsChanged($event)\"\n (sourceDrop)=\"onSourceFieldDrop($event)\"\n ></schema-tree>\n </div>\n\n <!-- SVG Connection Layer -->\n <svg class=\"connection-layer\" #svgElement>\n <!-- Existing connections -->\n @for (connection of connections(); track trackByConnectionId($index, connection)) {\n <g class=\"connection-group\" [class.selected]=\"connection.isSelected\" [class.array-mapping]=\"connection.isArrayMapping\" [class.array-to-object-mapping]=\"connection.isArrayToObjectMapping\" [class.being-dragged]=\"connection.isBeingDragged\">\n <!-- Connection paths -->\n @for (path of connection.paths; track $index) {\n <!-- Shadow path for glow effect -->\n <path\n [attr.d]=\"path\"\n fill=\"none\"\n [attr.stroke]=\"connection.isArrayToObjectMapping ? '#8b5cf6' : (connection.isArrayMapping ? '#f59e0b' : (connection.isSelected ? '#8b5cf6' : '#6366f1'))\"\n stroke-width=\"6\"\n stroke-opacity=\"0.2\"\n stroke-linecap=\"round\"\n />\n <!-- Main connection path -->\n <path\n [attr.d]=\"path\"\n class=\"connection-path\"\n [class.selected]=\"connection.isSelected\"\n [class.array-path]=\"connection.isArrayMapping\"\n [class.array-to-object-path]=\"connection.isArrayToObjectMapping\"\n [attr.stroke]=\"connection.isArrayToObjectMapping ? '#8b5cf6' : (connection.isArrayMapping ? '#f59e0b' : (connection.isSelected ? '#8b5cf6' : '#6366f1'))\"\n fill=\"none\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"connection.isArrayMapping || connection.isArrayToObjectMapping ? '8,4' : 'none'\"\n (click)=\"onConnectionClick(connection, $event)\"\n />\n <!-- Invisible wider path for easier clicking -->\n <path\n [attr.d]=\"path\"\n class=\"connection-hitbox\"\n fill=\"none\"\n stroke=\"transparent\"\n stroke-width=\"20\"\n (click)=\"onConnectionClick(connection, $event)\"\n />\n }\n\n <!-- Transformation node -->\n <g\n class=\"transformation-node\"\n [class.has-transformation]=\"connection.hasTransformation\"\n [class.is-array-mapping]=\"connection.isArrayMapping\"\n [class.is-array-to-object-mapping]=\"connection.isArrayToObjectMapping\"\n [attr.transform]=\"'translate(' + connection.midPoint.x + ',' + connection.midPoint.y + ')'\"\n (click)=\"onTransformationNodeClick(connection, $event)\"\n >\n <circle r=\"14\" class=\"node-bg\" [attr.fill]=\"connection.isArrayToObjectMapping ? '#8b5cf6' : (connection.isArrayMapping ? '#f59e0b' : '')\" [attr.stroke]=\"connection.isArrayToObjectMapping ? '#8b5cf6' : (connection.isArrayMapping ? '#f59e0b' : '')\" />\n <text\n class=\"node-icon\"\n text-anchor=\"middle\"\n dominant-baseline=\"central\"\n font-family=\"Material Icons\"\n font-size=\"16\"\n [attr.fill]=\"connection.isArrayMapping || connection.isArrayToObjectMapping ? 'white' : ''\"\n >\n {{ getTransformationIcon(connection.mappingId) }}\n </text>\n </g>\n\n <!-- Source endpoint circles (draggable) -->\n @for (sourcePoint of connection.sourcePoints; track $index) {\n <circle\n class=\"endpoint-handle source-endpoint\"\n [attr.cx]=\"sourcePoint.x\"\n [attr.cy]=\"sourcePoint.y\"\n r=\"6\"\n [class.selected]=\"connection.isSelected\"\n (mousedown)=\"onEndpointDragStart(connection, 'source', $index, $event)\"\n />\n }\n\n <!-- Target endpoint circle (draggable) -->\n <circle\n class=\"endpoint-handle target-endpoint\"\n [attr.cx]=\"connection.targetPoint.x\"\n [attr.cy]=\"connection.targetPoint.y\"\n r=\"6\"\n [class.selected]=\"connection.isSelected\"\n (mousedown)=\"onEndpointDragStart(connection, 'target', 0, $event)\"\n />\n </g>\n }\n\n <!-- Drag preview path -->\n @if (dragPath()) {\n <path\n [attr.d]=\"dragPath()\"\n class=\"drag-path\"\n fill=\"none\"\n stroke=\"#6366f1\"\n stroke-width=\"2.5\"\n stroke-dasharray=\"8,4\"\n stroke-linecap=\"round\"\n />\n }\n </svg>\n\n <!-- Target Schema Panel -->\n <div class=\"schema-panel target-panel\">\n <schema-tree\n [schema]=\"targetSchemaForTree()\"\n [side]=\"'target'\"\n [mappings]=\"mappings()\"\n [defaultValues]=\"defaultValues()\"\n (fieldDrop)=\"onFieldDrop($event)\"\n (fieldPositionsChanged)=\"onTargetPositionsChanged($event)\"\n (fieldDefaultValueClick)=\"onDefaultValueClick($event)\"\n ></schema-tree>\n </div>\n </div>\n\n <!-- Instructions -->\n @if (mappings().length === 0) {\n <div class=\"empty-state\">\n <mat-icon>drag_indicator</mat-icon>\n <p>Drag fields from the source schema to the target schema to create mappings</p>\n </div>\n }\n</div>\n\n<!-- Transformation Popover -->\n@if (showPopover() && selectedMapping()) {\n <transformation-popover\n [mapping]=\"selectedMapping()!\"\n [position]=\"popoverPosition()!\"\n [sampleData]=\"sampleData\"\n (save)=\"onPopoverSave($event)\"\n (delete)=\"onPopoverDelete()\"\n (close)=\"closePopover()\"\n ></transformation-popover>\n}\n\n<!-- Array Filter Modal -->\n@if (showArrayFilterModal() && selectedArrayMapping()) {\n <array-filter-modal\n [arrayMapping]=\"selectedArrayMapping()!\"\n (save)=\"onArrayFilterSave($event)\"\n (close)=\"closeArrayFilterModal()\"\n ></array-filter-modal>\n}\n\n<!-- Array Selector Modal (for array-to-object) -->\n@if (showArraySelectorModal() && selectedArrayToObjectMapping()) {\n <array-selector-modal\n [mapping]=\"selectedArrayToObjectMapping()!\"\n (save)=\"onArraySelectorSave($event)\"\n (close)=\"closeArraySelectorModal()\"\n ></array-selector-modal>\n}\n\n<!-- Default Value Popover -->\n@if (showDefaultValuePopover() && selectedDefaultValueField()) {\n <default-value-popover\n [field]=\"selectedDefaultValueField()!\"\n [existingValue]=\"getExistingDefaultValue(selectedDefaultValueField()!.id)\"\n [position]=\"defaultValuePopoverPosition()!\"\n (save)=\"onDefaultValueSave($event)\"\n (delete)=\"onDefaultValueDelete()\"\n (close)=\"closeDefaultValuePopover()\"\n ></default-value-popover>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n ApplicationRef,\n inject,\n signal,\n OnInit,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\n\n// Display type options for form rendering\ntype DisplayType = 'textbox' | 'dropdown' | 'textarea' | 'richtext' | 'datepicker' | 'datetimepicker' | 'timepicker' | 'stepper' | 'checkbox' | 'toggle';\n\n// Internal representation for UI editing\nexport interface EditorField {\n id: string;\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date' | 'time' | 'object' | 'array';\n format?: string;\n displayType?: DisplayType;\n label?: string;\n required?: boolean;\n defaultValue?: string | number | boolean;\n allowedValues?: string[];\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n minimum?: number;\n maximum?: number;\n children?: EditorField[];\n expanded?: boolean;\n isEditingValues?: boolean;\n isEditingDefault?: boolean;\n isEditingValidators?: boolean;\n}\n\n@Component({\n selector: 'field-item',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatSelectModule,\n MatTooltipModule,\n MatMenuModule,\n DragDropModule,\n FieldItemComponent,\n ],\n templateUrl: './field-item.component.html',\n styleUrls: ['./field-item.component.scss'],\n})\nexport class FieldItemComponent implements OnInit, OnChanges {\n cdr = inject(ChangeDetectorRef);\n appRef = inject(ApplicationRef);\n\n // Local expanded state to bypass change detection issues - using signal for better reactivity\n localExpanded = signal(false);\n\n @Input() field!: EditorField;\n @Input() parentList!: EditorField[];\n @Input() level = 0;\n @Input() showDisplayType = false;\n\n @Output() fieldChange = new EventEmitter<void>();\n @Output() delete = new EventEmitter<EditorField>();\n @Output() duplicate = new EventEmitter<EditorField>();\n\n fieldTypes: Array<{ value: string; label: string; icon: string }> = [\n { value: 'string', label: 'String', icon: 'text_fields' },\n { value: 'number', label: 'Number', icon: 'pin' },\n { value: 'boolean', label: 'Boolean', icon: 'toggle_on' },\n { value: 'date', label: 'Date', icon: 'calendar_today' },\n { value: 'time', label: 'Time', icon: 'schedule' },\n { value: 'object', label: 'Object', icon: 'data_object' },\n { value: 'array', label: 'Array', icon: 'data_array' },\n ];\n\n stringDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n { value: 'dropdown', label: 'Dropdown', icon: 'arrow_drop_down_circle' },\n { value: 'textarea', label: 'Textarea', icon: 'notes' },\n { value: 'richtext', label: 'Rich Text', icon: 'format_color_text' },\n ];\n\n dateDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'datepicker', label: 'Date Picker', icon: 'calendar_today' },\n { value: 'datetimepicker', label: 'DateTime Picker', icon: 'schedule' },\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n ];\n\n timeDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'timepicker', label: 'Time Picker', icon: 'schedule' },\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n ];\n\n numberDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n { value: 'stepper', label: 'Stepper', icon: 'unfold_more' },\n ];\n\n booleanDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'checkbox', label: 'Checkbox', icon: 'check_box' },\n { value: 'toggle', label: 'Toggle', icon: 'toggle_on' },\n ];\n\n stringFormats: Array<{ value: string; label: string }> = [\n { value: '', label: '(none)' },\n { value: 'email', label: 'Email' },\n { value: 'uri', label: 'URI (URL)' },\n { value: 'uuid', label: 'UUID' },\n ];\n\n getDisplayTypes(fieldType: string): Array<{ value: DisplayType; label: string; icon: string }> {\n if (fieldType === 'date') return this.dateDisplayTypes;\n if (fieldType === 'time') return this.timeDisplayTypes;\n if (fieldType === 'number') return this.numberDisplayTypes;\n if (fieldType === 'boolean') return this.booleanDisplayTypes;\n return this.stringDisplayTypes;\n }\n\n getTypeIcon(type: string): string {\n return this.fieldTypes.find(t => t.value === type)?.icon || 'help_outline';\n }\n\n ngOnInit(): void {\n // Initialize localExpanded from field.expanded if it exists\n if (this.field?.expanded !== undefined) {\n this.localExpanded.set(this.field.expanded);\n }\n // Initialize children array for object/array types if needed\n if ((this.field?.type === 'object' || this.field?.type === 'array') && !this.field.children) {\n this.field.children = [];\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // When field input changes, sync localExpanded with field.expanded\n // But PRESERVE localExpanded if field.expanded is false/undefined and we have a true value\n if (changes['field']) {\n if (this.field) {\n // If field.expanded is explicitly true, use it (we just set it)\n if (this.field.expanded === true) {\n this.localExpanded.set(true);\n }\n // If field.expanded is explicitly false, use it (user collapsed)\n else if (this.field.expanded === false) {\n this.localExpanded.set(false);\n }\n // If field.expanded is undefined, preserve current localExpanded state\n // This happens when parent updates and field object is new but doesn't have expanded set yet\n else {\n // Preserve current localExpanded, and sync field.expanded to match\n if (this.field.expanded !== this.localExpanded()) {\n this.field.expanded = this.localExpanded();\n }\n }\n \n // Initialize children array for object/array types if needed\n if ((this.field.type === 'object' || this.field.type === 'array') && !this.field.children) {\n this.field.children = [];\n }\n }\n }\n }\n\n private generateId(): string {\n return `field-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n toggleExpand(): void {\n this.handleExpandClick();\n }\n\n handleExpandClick(event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n \n // Ensure children array exists\n if (!this.field.children) {\n this.field.children = [];\n }\n \n // Toggle local expanded state (using signal)\n const newExpandedState = !this.localExpanded();\n this.localExpanded.set(newExpandedState);\n // Sync to field.expanded (mutation persists because field object reference stays the same)\n this.field.expanded = newExpandedState;\n \n // Force immediate change detection - this should trigger template re-render\n this.cdr.markForCheck();\n this.cdr.detectChanges();\n \n // Don't emit fieldChange - expand/collapse is local UI state only\n // We only emit when actual field data changes (name, type, children, etc.)\n }\n\n onFieldNameChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const sanitized = input.value.replace(/[^a-zA-Z0-9_$]/g, '');\n this.field.name = sanitized;\n if (input.value !== sanitized) {\n input.value = sanitized;\n }\n }\n\n onFieldNameBlur(): void {\n if (!this.field.name.trim()) {\n this.field.name = 'unnamed';\n }\n this.fieldChange.emit();\n }\n\n onFieldTypeChange(type: string): void {\n this.field.type = type as EditorField['type'];\n if ((type === 'object' || type === 'array') && !this.field.children) {\n this.field.children = [];\n }\n if (type === 'string') this.field.displayType = 'textbox';\n else if (type === 'number') this.field.displayType = 'textbox';\n else if (type === 'boolean') this.field.displayType = 'checkbox';\n else if (type === 'date') this.field.displayType = 'datepicker';\n else if (type === 'time') this.field.displayType = 'timepicker';\n else this.field.displayType = undefined;\n this.fieldChange.emit();\n }\n\n onDisplayTypeChange(displayType: string): void {\n this.field.displayType = displayType as DisplayType;\n this.fieldChange.emit();\n }\n\n toggleRequired(): void {\n this.field.required = !this.field.required;\n this.fieldChange.emit();\n }\n\n onLabelChange(label: string): void {\n this.field.label = label;\n }\n\n onLabelBlur(): void {\n this.fieldChange.emit();\n }\n\n addChildField(): void {\n if (!this.field.children) {\n this.field.children = [];\n }\n const newField: EditorField = {\n id: this.generateId(),\n name: '',\n type: 'string',\n displayType: 'textbox',\n };\n this.field.children.push(newField);\n this.localExpanded.set(true);\n this.field.expanded = true;\n this.cdr.detectChanges();\n this.fieldChange.emit();\n }\n\n deleteField(): void {\n this.delete.emit(this.field);\n }\n\n duplicateField(): void {\n this.duplicate.emit(this.field);\n }\n\n onChildFieldChange(): void {\n console.log('onChildFieldChange called on parent');\n this.cdr.detectChanges();\n this.fieldChange.emit();\n }\n\n onChildDelete(child: EditorField): void {\n if (this.field.children) {\n const index = this.field.children.indexOf(child);\n if (index > -1) {\n this.field.children.splice(index, 1);\n this.cdr.detectChanges();\n this.fieldChange.emit();\n }\n }\n }\n\n onChildDuplicate(child: EditorField): void {\n if (this.field.children) {\n const index = this.field.children.indexOf(child);\n if (index > -1) {\n const clone: EditorField = {\n ...child,\n id: this.generateId(),\n name: child.name + '_copy',\n children: child.children ? this.cloneFields(child.children) : undefined,\n };\n this.field.children.splice(index + 1, 0, clone);\n this.cdr.detectChanges();\n this.fieldChange.emit();\n }\n }\n }\n\n private cloneFields(fields: EditorField[]): EditorField[] {\n return fields.map(f => ({\n ...f,\n id: this.generateId(),\n children: f.children ? this.cloneFields(f.children) : undefined,\n }));\n }\n\n onFieldDrop(event: CdkDragDrop<EditorField[]>): void {\n if (event.previousIndex !== event.currentIndex && this.field.children) {\n moveItemInArray(this.field.children, event.previousIndex, event.currentIndex);\n this.fieldChange.emit();\n }\n }\n\n canIndent(): boolean {\n const index = this.parentList.indexOf(this.field);\n if (index <= 0) return false;\n const prevSibling = this.parentList[index - 1];\n return prevSibling.type === 'object' || prevSibling.type === 'array';\n }\n\n indentField(): void {\n const index = this.parentList.indexOf(this.field);\n if (index <= 0) return;\n const prevSibling = this.parentList[index - 1];\n if (prevSibling.type !== 'object' && prevSibling.type !== 'array') return;\n\n this.parentList.splice(index, 1);\n if (!prevSibling.children) prevSibling.children = [];\n prevSibling.children.push(this.field);\n prevSibling.expanded = true;\n this.fieldChange.emit();\n }\n\n toggleValuesEditor(): void {\n this.field.isEditingValues = !this.field.isEditingValues;\n if (this.field.isEditingValues) {\n this.field.isEditingDefault = false;\n this.field.isEditingValidators = false;\n if (!this.field.allowedValues) this.field.allowedValues = [];\n }\n this.fieldChange.emit();\n }\n\n addAllowedValue(input: HTMLInputElement | Event): void {\n let inputEl: HTMLInputElement | null = null;\n if (input instanceof HTMLInputElement) {\n inputEl = input;\n } else {\n const target = input.target as HTMLElement;\n const header = target.closest('.values-header');\n inputEl = header?.querySelector('.value-input') as HTMLInputElement;\n }\n if (!inputEl) return;\n\n const value = inputEl.value.trim();\n if (value && !this.field.allowedValues?.includes(value)) {\n if (!this.field.allowedValues) this.field.allowedValues = [];\n this.field.allowedValues.push(value);\n inputEl.value = '';\n this.fieldChange.emit();\n }\n }\n\n removeAllowedValue(index: number): void {\n if (this.field.allowedValues) {\n this.field.allowedValues.splice(index, 1);\n if (this.field.allowedValues.length === 0) this.field.allowedValues = undefined;\n this.fieldChange.emit();\n }\n }\n\n onAllowedValueKeydown(event: KeyboardEvent, input: HTMLInputElement): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.addAllowedValue(input);\n }\n }\n\n toggleDefaultEditor(): void {\n this.field.isEditingDefault = !this.field.isEditingDefault;\n if (this.field.isEditingDefault) {\n this.field.isEditingValues = false;\n this.field.isEditingValidators = false;\n }\n this.fieldChange.emit();\n }\n\n onDefaultValueChange(value: string): void {\n if (value === '') {\n this.field.defaultValue = undefined;\n } else if (this.field.type === 'number') {\n const num = parseFloat(value);\n this.field.defaultValue = isNaN(num) ? undefined : num;\n } else if (this.field.type === 'boolean') {\n this.field.defaultValue = value === 'true';\n } else {\n this.field.defaultValue = value;\n }\n this.fieldChange.emit();\n }\n\n clearDefaultValue(): void {\n this.field.defaultValue = undefined;\n this.field.isEditingDefault = false;\n this.fieldChange.emit();\n }\n\n onDefaultValueKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === 'Escape') {\n this.field.isEditingDefault = false;\n this.fieldChange.emit();\n }\n }\n\n toggleValidatorsEditor(): void {\n this.field.isEditingValidators = !this.field.isEditingValidators;\n if (this.field.isEditingValidators) {\n this.field.isEditingValues = false;\n this.field.isEditingDefault = false;\n }\n this.fieldChange.emit();\n }\n\n hasValidators(): boolean {\n if (this.field.type === 'string') {\n return !!(this.field.minLength || this.field.maxLength || this.field.pattern || this.field.format);\n }\n if (this.field.type === 'number') {\n return this.field.minimum !== undefined || this.field.maximum !== undefined;\n }\n return false;\n }\n\n onFormatChange(format: string): void {\n this.field.format = format || undefined;\n if (format) this.field.pattern = undefined;\n this.fieldChange.emit();\n }\n\n onMinLengthChange(value: string): void {\n this.field.minLength = value ? parseInt(value, 10) : undefined;\n this.fieldChange.emit();\n }\n\n onMaxLengthChange(value: string): void {\n this.field.maxLength = value ? parseInt(value, 10) : undefined;\n this.fieldChange.emit();\n }\n\n onPatternChange(value: string): void {\n this.field.pattern = value || undefined;\n this.fieldChange.emit();\n }\n\n onMinimumChange(value: string): void {\n this.field.minimum = value ? parseFloat(value) : undefined;\n this.fieldChange.emit();\n }\n\n onMaximumChange(value: string): void {\n this.field.maximum = value ? parseFloat(value) : undefined;\n this.fieldChange.emit();\n }\n\n canAddChildToArray(): boolean {\n return this.field.type === 'array' && (!this.field.children || this.field.children.length === 0);\n }\n\n getEmptyMessage(): string {\n return this.field.type === 'array' ? 'No item schema defined' : 'No child fields';\n }\n\n getAddButtonLabel(): string {\n return this.field.type === 'array' ? 'Define item schema' : 'Add field';\n }\n\n shouldShowNestedFields(): boolean {\n return (this.field.type === 'object' || this.field.type === 'array') && this.localExpanded();\n }\n}\n","<div class=\"field-wrapper\">\n <div\n class=\"field-item\"\n [class.is-complex]=\"field.type === 'object' || field.type === 'array'\"\n >\n <!-- Expand/Collapse - outside field-left to avoid drag interference -->\n @if (field.type === 'object' || field.type === 'array') {\n <button\n mat-icon-button\n type=\"button\"\n class=\"expand-btn\"\n (click)=\"handleExpandClick()\"\n [matTooltip]=\"localExpanded() ? 'Collapse' : 'Expand'\"\n >\n <mat-icon>{{ localExpanded() ? 'expand_more' : 'chevron_right' }}</mat-icon>\n </button>\n } @else {\n <span class=\"expand-placeholder\"></span>\n }\n\n <!-- Left section: field controls -->\n <div class=\"field-left\">\n <!-- Drag Handle -->\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag to reorder\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n\n <!-- Type Icon -->\n <mat-icon class=\"type-icon\" [matTooltip]=\"field.type\">{{ getTypeIcon(field.type) }}</mat-icon>\n\n <!-- Field Name -->\n <input\n class=\"field-name-input\"\n [value]=\"field.name\"\n (input)=\"onFieldNameChange($event)\"\n (blur)=\"onFieldNameBlur()\"\n placeholder=\"Field name\"\n matTooltip=\"Property name in JSON Schema\"\n />\n @if (field.type === 'array') {\n <span class=\"array-indicator\">[]</span>\n }\n\n <!-- Required Toggle -->\n <button\n class=\"required-btn\"\n [class.is-required]=\"field.required\"\n (click)=\"toggleRequired()\"\n [matTooltip]=\"field.required ? 'Required (click to make optional)' : 'Optional (click to make required)'\"\n >\n <mat-icon>{{ field.required ? 'star' : 'star_border' }}</mat-icon>\n </button>\n </div>\n\n <!-- Middle section: label (flexible) -->\n <input\n class=\"label-input\"\n [value]=\"field.label || ''\"\n (input)=\"onLabelChange($any($event.target).value)\"\n (blur)=\"onLabelBlur()\"\n placeholder=\"Label...\"\n matTooltip=\"Display label (stored as title)\"\n />\n\n <!-- Right section: type and actions -->\n <div class=\"field-right\">\n <!-- Type Selector -->\n <mat-form-field appearance=\"outline\" class=\"type-selector\" matTooltip=\"Data type\">\n <mat-select [value]=\"field.type\" (selectionChange)=\"onFieldTypeChange($event.value)\" panelClass=\"schema-editor-select-panel\">\n @for (type of fieldTypes; track type.value) {\n <mat-option [value]=\"type.value\">\n <mat-icon>{{ type.icon }}</mat-icon>\n {{ type.label }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <!-- Display Type Selector -->\n @if (showDisplayType) {\n @if (field.type === 'string' || field.type === 'number' || field.type === 'boolean' || field.type === 'date' || field.type === 'time') {\n <mat-form-field appearance=\"outline\" class=\"display-type-selector\" matTooltip=\"Display Type\">\n <mat-select [value]=\"field.displayType\" (selectionChange)=\"onDisplayTypeChange($event.value)\" panelClass=\"schema-editor-select-panel\">\n @for (dt of getDisplayTypes(field.type); track dt.value) {\n <mat-option [value]=\"dt.value\">\n <mat-icon>{{ dt.icon }}</mat-icon>\n {{ dt.label }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n } @else {\n <div class=\"display-type-placeholder\"></div>\n }\n }\n\n <!-- Actions -->\n <div class=\"field-actions\">\n @if (field.type === 'object' || canAddChildToArray()) {\n <button\n mat-icon-button\n (click)=\"addChildField()\"\n [matTooltip]=\"field.type === 'array' ? 'Define item schema' : 'Add child field'\"\n >\n <mat-icon>add_circle_outline</mat-icon>\n </button>\n }\n @if (field.type === 'string' || field.type === 'number') {\n <button\n mat-icon-button\n (click)=\"toggleValuesEditor()\"\n [matTooltip]=\"field.allowedValues?.length ? 'Edit allowed values (' + field.allowedValues!.length + ')' : 'Add allowed values'\"\n [class.has-values]=\"field.allowedValues?.length\"\n >\n <mat-icon>list</mat-icon>\n </button>\n }\n @if (field.type !== 'object' && field.type !== 'array') {\n <button\n mat-icon-button\n (click)=\"toggleDefaultEditor()\"\n [matTooltip]=\"field.defaultValue !== undefined ? 'Default: ' + field.defaultValue : 'Set default value'\"\n [class.has-default]=\"field.defaultValue !== undefined\"\n >\n <mat-icon>{{ field.defaultValue !== undefined ? 'label' : 'label_outline' }}</mat-icon>\n </button>\n }\n @if (field.type === 'string' || field.type === 'number') {\n <button\n mat-icon-button\n (click)=\"toggleValidatorsEditor()\"\n [matTooltip]=\"hasValidators() ? 'Edit validators' : 'Add validators'\"\n [class.has-validators]=\"hasValidators()\"\n >\n <mat-icon>rule</mat-icon>\n </button>\n }\n <button mat-icon-button [matMenuTriggerFor]=\"fieldMenu\" matTooltip=\"More options\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #fieldMenu=\"matMenu\">\n <button mat-menu-item (click)=\"duplicateField()\">\n <mat-icon>content_copy</mat-icon>\n <span>Duplicate</span>\n </button>\n <button mat-menu-item (click)=\"deleteField()\" class=\"delete-action\">\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </mat-menu>\n </div>\n </div>\n </div>\n\n <!-- Allowed Values Editor -->\n @if (field.isEditingValues && (field.type === 'string' || field.type === 'number')) {\n <div class=\"allowed-values-editor\">\n <div class=\"values-header\">\n <span class=\"values-label\">Allowed values:</span>\n <input\n #valueInput\n class=\"value-input\"\n type=\"text\"\n placeholder=\"Type value and press Enter\"\n (keydown)=\"onAllowedValueKeydown($event, valueInput)\"\n />\n <button class=\"add-value-btn\" (click)=\"addAllowedValue($event)\" matTooltip=\"Add value\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n @if (field.allowedValues && field.allowedValues.length > 0) {\n <div class=\"values-list\">\n @for (value of field.allowedValues; track value; let vi = $index) {\n <span class=\"value-chip\">\n {{ value }}\n <button class=\"remove-value-btn\" (click)=\"removeAllowedValue(vi)\" matTooltip=\"Remove\">\n <mat-icon>close</mat-icon>\n </button>\n </span>\n }\n </div>\n } @else {\n <div class=\"no-values\">No values defined yet</div>\n }\n </div>\n }\n\n <!-- Default Value Editor -->\n @if (field.isEditingDefault && field.type !== 'object' && field.type !== 'array') {\n <div class=\"default-value-editor\">\n <div class=\"default-header\">\n <span class=\"default-label\">Default value:</span>\n @if (field.type === 'boolean') {\n <select\n class=\"default-select\"\n [value]=\"field.defaultValue?.toString() || ''\"\n (change)=\"onDefaultValueChange($any($event.target).value)\"\n >\n <option value=\"\">No default</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n } @else {\n <input\n class=\"default-input\"\n [type]=\"field.type === 'number' ? 'number' : 'text'\"\n [value]=\"field.defaultValue ?? ''\"\n (input)=\"onDefaultValueChange($any($event.target).value)\"\n (keydown)=\"onDefaultValueKeydown($event)\"\n placeholder=\"Enter default value\"\n />\n }\n @if (field.defaultValue !== undefined) {\n <button class=\"clear-default-btn\" (click)=\"clearDefaultValue()\" matTooltip=\"Clear default\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Validators Editor -->\n @if (field.isEditingValidators && (field.type === 'string' || field.type === 'number')) {\n <div class=\"validators-editor\">\n <div class=\"validators-header\">\n <span class=\"validators-label\">Validators:</span>\n </div>\n @if (field.type === 'string') {\n <div class=\"validators-row\">\n <div class=\"validator-field\">\n <label>Format</label>\n <select\n class=\"validator-select\"\n [value]=\"field.format || ''\"\n (change)=\"onFormatChange($any($event.target).value)\"\n >\n @for (fmt of stringFormats; track fmt.value) {\n <option [value]=\"fmt.value\">{{ fmt.label }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"validators-row\">\n <div class=\"validator-field\">\n <label>Min Length</label>\n <input\n type=\"number\"\n class=\"validator-input\"\n [value]=\"field.minLength ?? ''\"\n (input)=\"onMinLengthChange($any($event.target).value)\"\n placeholder=\"0\"\n min=\"0\"\n />\n </div>\n <div class=\"validator-field\">\n <label>Max Length</label>\n <input\n type=\"number\"\n class=\"validator-input\"\n [value]=\"field.maxLength ?? ''\"\n (input)=\"onMaxLengthChange($any($event.target).value)\"\n placeholder=\"∞\"\n min=\"0\"\n />\n </div>\n @if (!field.format) {\n <div class=\"validator-field pattern-field\">\n <label>Pattern (regex)</label>\n <input\n type=\"text\"\n class=\"validator-input\"\n [value]=\"field.pattern ?? ''\"\n (input)=\"onPatternChange($any($event.target).value)\"\n placeholder=\"^[a-z]+$\"\n />\n </div>\n }\n </div>\n }\n @if (field.type === 'number') {\n <div class=\"validators-row\">\n <div class=\"validator-field\">\n <label>Minimum</label>\n <input\n type=\"number\"\n class=\"validator-input\"\n [value]=\"field.minimum ?? ''\"\n (input)=\"onMinimumChange($any($event.target).value)\"\n placeholder=\"-∞\"\n />\n </div>\n <div class=\"validator-field\">\n <label>Maximum</label>\n <input\n type=\"number\"\n class=\"validator-input\"\n [value]=\"field.maximum ?? ''\"\n (input)=\"onMaximumChange($any($event.target).value)\"\n placeholder=\"∞\"\n />\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Nested Children -->\n @if ((field.type === 'object' || field.type === 'array') && (localExpanded() || field.expanded)) {\n <div\n class=\"nested-fields\"\n cdkDropList\n [cdkDropListData]=\"field.children || []\"\n (cdkDropListDropped)=\"onFieldDrop($event)\"\n >\n @if (field.children && field.children.length > 0) {\n @for (child of field.children; track child.id) {\n <field-item\n cdkDrag\n [field]=\"child\"\n [parentList]=\"field.children\"\n [level]=\"level + 1\"\n [showDisplayType]=\"showDisplayType\"\n (fieldChange)=\"onChildFieldChange()\"\n (delete)=\"onChildDelete($event)\"\n (duplicate)=\"onChildDuplicate($event)\"\n >\n <!-- Drag Placeholder -->\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <!-- Drag Preview -->\n <div *cdkDragPreview class=\"drag-preview\">\n <mat-icon>{{ getTypeIcon(child.type) }}</mat-icon>\n {{ child.name || 'unnamed' }}\n </div>\n </field-item>\n }\n } @else {\n <div class=\"empty-nested\">\n <span>{{ getEmptyMessage() }}</span>\n <button mat-button (click)=\"addChildField()\" color=\"primary\">\n <mat-icon>add</mat-icon>\n {{ getAddButtonLabel() }}\n </button>\n </div>\n }\n </div>\n }\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n inject,\n ApplicationRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { JsonSchema } from '../../models/json-schema.model';\nimport { FieldItemComponent, EditorField } from './field-item/field-item.component';\n\n// Display type options for form rendering\ntype DisplayType = 'textbox' | 'dropdown' | 'textarea' | 'richtext' | 'datepicker' | 'datetimepicker' | 'timepicker' | 'stepper' | 'checkbox' | 'toggle';\n\n@Component({\n selector: 'schema-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatInputModule,\n MatFormFieldModule,\n MatSelectModule,\n MatTooltipModule,\n MatMenuModule,\n MatButtonToggleModule,\n DragDropModule,\n FieldItemComponent,\n ],\n templateUrl: './schema-editor.component.html',\n styleUrl: './schema-editor.component.scss',\n})\nexport class SchemaEditorComponent {\n private appRef = inject(ApplicationRef);\n\n @Input() set schema(value: JsonSchema | null) {\n if (value) {\n // Don't overwrite fields if we have uncommitted changes (fields with editors open or empty names)\n const hasUncommittedChanges = this.fields().some(f =>\n f.isEditingDefault || f.isEditingValues || f.isEditingValidators || !f.name\n ) || this.hasUncommittedChildFields(this.fields());\n\n this.schemaName.set(value.title || 'New Schema');\n\n if (!hasUncommittedChanges) {\n this.fields.set(this.jsonSchemaToEditorFields(value));\n }\n }\n }\n\n private hasUncommittedChildFields(fields: EditorField[]): boolean {\n for (const field of fields) {\n if (field.children) {\n if (field.children.some(c => c.isEditingDefault || c.isEditingValues || c.isEditingValidators || !c.name)) {\n return true;\n }\n if (this.hasUncommittedChildFields(field.children)) {\n return true;\n }\n }\n }\n return false;\n }\n\n @Input() showJsonToggle = true;\n @Input() showSchemaName = true;\n @Input() showDisplayType = false;\n\n @Output() schemaChange = new EventEmitter<JsonSchema>();\n @Output() save = new EventEmitter<JsonSchema>();\n\n schemaName = signal('New Schema');\n fields = signal<EditorField[]>([]);\n\n // View mode: 'visual' or 'json'\n viewMode = signal<'visual' | 'json'>('visual');\n jsonText = signal<string>('');\n jsonError = signal<string | null>(null);\n\n fieldTypes: Array<{ value: string; label: string; icon: string }> = [\n { value: 'string', label: 'String', icon: 'text_fields' },\n { value: 'number', label: 'Number', icon: 'pin' },\n { value: 'boolean', label: 'Boolean', icon: 'toggle_on' },\n { value: 'date', label: 'Date', icon: 'calendar_today' },\n { value: 'time', label: 'Time', icon: 'schedule' },\n { value: 'object', label: 'Object', icon: 'data_object' },\n { value: 'array', label: 'Array', icon: 'data_array' },\n ];\n\n stringDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n { value: 'dropdown', label: 'Dropdown', icon: 'arrow_drop_down_circle' },\n { value: 'textarea', label: 'Textarea', icon: 'notes' },\n { value: 'richtext', label: 'Rich Text', icon: 'format_color_text' },\n ];\n\n dateDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'datepicker', label: 'Date Picker', icon: 'calendar_today' },\n { value: 'datetimepicker', label: 'DateTime Picker', icon: 'schedule' },\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n ];\n\n timeDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'timepicker', label: 'Time Picker', icon: 'schedule' },\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n ];\n\n numberDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n { value: 'stepper', label: 'Stepper', icon: 'unfold_more' },\n ];\n\n booleanDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'checkbox', label: 'Checkbox', icon: 'check_box' },\n { value: 'toggle', label: 'Toggle', icon: 'toggle_on' },\n ];\n\n stringFormats: Array<{ value: string; label: string }> = [\n { value: '', label: '(none)' },\n { value: 'email', label: 'Email' },\n { value: 'uri', label: 'URI (URL)' },\n { value: 'uuid', label: 'UUID' },\n ];\n\n getDisplayTypes(fieldType: string): Array<{ value: DisplayType; label: string; icon: string }> {\n if (fieldType === 'date') return this.dateDisplayTypes;\n if (fieldType === 'time') return this.timeDisplayTypes;\n if (fieldType === 'number') return this.numberDisplayTypes;\n if (fieldType === 'boolean') return this.booleanDisplayTypes;\n return this.stringDisplayTypes;\n }\n\n private generateId(): string {\n return `field-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cloneFields(fields: EditorField[]): EditorField[] {\n return fields.map(f => ({\n ...f,\n children: f.children ? this.cloneFields(f.children) : undefined,\n }));\n }\n\n getTypeIcon(type: string): string {\n return this.fieldTypes.find(t => t.value === type)?.icon || 'help_outline';\n }\n\n // Add a new field at the root level\n addField(): void {\n const newField: EditorField = {\n id: this.generateId(),\n name: '',\n type: 'string',\n displayType: 'textbox',\n expanded: false,\n };\n this.fields.update(fields => [...fields, newField]);\n }\n\n // Add a child field to an object or array\n addChildField(parent: EditorField): void {\n if (!parent.children) {\n parent.children = [];\n }\n const newField: EditorField = {\n id: this.generateId(),\n name: '',\n type: 'string',\n displayType: 'textbox',\n };\n parent.children.push(newField);\n parent.expanded = true;\n this.fields.update(fields => [...fields]);\n }\n\n // Handle field change from FieldItemComponent\n onFieldChange(): void {\n console.log('schema-editor onFieldChange called');\n this.fields().forEach(f => {\n if (f.type === 'object' || f.type === 'array') {\n console.log(` field \"${f.name}\" expanded:${f.expanded} children:${f.children?.length}`);\n }\n });\n this.fields.update(fields => [...fields]);\n this.appRef.tick();\n this.emitChange();\n }\n\n // Handle field delete from FieldItemComponent\n onFieldDelete(field: EditorField): void {\n const index = this.fields().indexOf(field);\n if (index > -1) {\n this.fields.update(fields => {\n const newFields = [...fields];\n newFields.splice(index, 1);\n return newFields;\n });\n this.emitChange();\n }\n }\n\n // Handle field duplicate from FieldItemComponent\n onFieldDuplicate(field: EditorField): void {\n const index = this.fields().indexOf(field);\n if (index > -1) {\n const clone: EditorField = {\n ...field,\n id: this.generateId(),\n name: field.name + '_copy',\n children: field.children ? this.cloneFields(field.children) : undefined,\n };\n this.fields.update(fields => {\n const newFields = [...fields];\n newFields.splice(index + 1, 0, clone);\n return newFields;\n });\n this.emitChange();\n }\n }\n\n // Delete a field\n deleteField(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index > -1) {\n parentList.splice(index, 1);\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Duplicate a field\n duplicateField(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index > -1) {\n const clone: EditorField = {\n ...field,\n id: this.generateId(),\n name: field.name + '_copy',\n children: field.children ? this.cloneFields(field.children) : undefined,\n };\n parentList.splice(index + 1, 0, clone);\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Toggle field expansion\n toggleExpand(field: EditorField): void {\n field.expanded = !field.expanded;\n this.fields.update(fields => [...fields]);\n }\n\n // Handle field name input - only allow valid property name characters\n onFieldNameChange(field: EditorField, event: Event): void {\n const input = event.target as HTMLInputElement;\n // Remove invalid characters: only allow letters, numbers, underscores, and dollar signs\n // Property names should start with letter, underscore, or dollar sign\n const sanitized = input.value.replace(/[^a-zA-Z0-9_$]/g, '');\n field.name = sanitized;\n // Update input value if it was sanitized\n if (input.value !== sanitized) {\n input.value = sanitized;\n }\n }\n\n // Handle field name blur - ensure name is valid and emit change\n onFieldNameBlur(field: EditorField): void {\n if (!field.name.trim()) {\n field.name = 'unnamed';\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Handle field type change\n onFieldTypeChange(field: EditorField, type: string): void {\n field.type = type as EditorField['type'];\n // Initialize children array for object/array types\n if ((type === 'object' || type === 'array') && !field.children) {\n field.children = [];\n }\n // Set default display type based on field type\n if (type === 'string') {\n field.displayType = 'textbox';\n } else if (type === 'number') {\n field.displayType = 'textbox';\n } else if (type === 'boolean') {\n field.displayType = 'checkbox';\n } else if (type === 'date') {\n field.displayType = 'datepicker';\n } else if (type === 'time') {\n field.displayType = 'timepicker';\n } else {\n field.displayType = undefined;\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Handle display type change\n onDisplayTypeChange(field: EditorField, displayType: string): void {\n field.displayType = displayType as DisplayType;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Toggle required status\n toggleRequired(field: EditorField): void {\n field.required = !field.required;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update field label (only update the field, don't trigger re-render)\n onLabelChange(field: EditorField, label: string): void {\n field.label = label;\n }\n\n // Emit change when label input loses focus\n onLabelBlur(): void {\n this.emitChange();\n }\n\n // Toggle allowed values editor\n toggleValuesEditor(field: EditorField): void {\n field.isEditingValues = !field.isEditingValues;\n if (field.isEditingValues) {\n // Close other editors\n field.isEditingDefault = false;\n field.isEditingValidators = false;\n if (!field.allowedValues) {\n field.allowedValues = [];\n }\n }\n this.fields.update(fields => [...fields]);\n }\n\n // Add allowed value\n addAllowedValue(field: EditorField, input: HTMLInputElement | Event): void {\n // Handle both direct input reference and event from button click\n let inputEl: HTMLInputElement | null = null;\n\n if (input instanceof HTMLInputElement) {\n inputEl = input;\n } else {\n // Find the input by traversing up to .values-header and then querying for .value-input\n const target = input.target as HTMLElement;\n const header = target.closest('.values-header');\n inputEl = header?.querySelector('.value-input') as HTMLInputElement;\n }\n\n if (!inputEl) return;\n\n const value = inputEl.value.trim();\n if (value && !field.allowedValues?.includes(value)) {\n if (!field.allowedValues) {\n field.allowedValues = [];\n }\n field.allowedValues.push(value);\n inputEl.value = '';\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Remove allowed value\n removeAllowedValue(field: EditorField, index: number): void {\n if (field.allowedValues) {\n field.allowedValues.splice(index, 1);\n if (field.allowedValues.length === 0) {\n field.allowedValues = undefined;\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Handle Enter key in allowed value input\n onAllowedValueKeydown(event: KeyboardEvent, field: EditorField, input: HTMLInputElement): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.addAllowedValue(field, input);\n }\n }\n\n // Toggle default value editor\n toggleDefaultEditor(field: EditorField): void {\n field.isEditingDefault = !field.isEditingDefault;\n if (field.isEditingDefault) {\n // Close other editors\n field.isEditingValues = false;\n field.isEditingValidators = false;\n }\n this.fields.update(fields => [...fields]);\n }\n\n // Update default value\n onDefaultValueChange(field: EditorField, value: string): void {\n if (value === '') {\n field.defaultValue = undefined;\n } else if (field.type === 'number') {\n const num = parseFloat(value);\n field.defaultValue = isNaN(num) ? undefined : num;\n } else if (field.type === 'boolean') {\n field.defaultValue = value === 'true';\n } else {\n field.defaultValue = value;\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Clear default value\n clearDefaultValue(field: EditorField): void {\n field.defaultValue = undefined;\n field.isEditingDefault = false;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Handle Enter key in default value input\n onDefaultValueKeydown(event: KeyboardEvent, field: EditorField): void {\n if (event.key === 'Enter' || event.key === 'Escape') {\n field.isEditingDefault = false;\n this.fields.update(fields => [...fields]);\n }\n }\n\n // Toggle validators editor\n toggleValidatorsEditor(field: EditorField): void {\n field.isEditingValidators = !field.isEditingValidators;\n if (field.isEditingValidators) {\n // Close other editors\n field.isEditingValues = false;\n field.isEditingDefault = false;\n }\n this.fields.update(fields => [...fields]);\n }\n\n // Check if field has any validators set\n hasValidators(field: EditorField): boolean {\n if (field.type === 'string') {\n return !!(field.minLength || field.maxLength || field.pattern || field.format);\n }\n if (field.type === 'number') {\n return field.minimum !== undefined || field.maximum !== undefined;\n }\n return false;\n }\n\n // Update string format\n onFormatChange(field: EditorField, format: string): void {\n field.format = format || undefined;\n // Clear pattern when format is set (they're mutually exclusive)\n if (format) {\n field.pattern = undefined;\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update minLength\n onMinLengthChange(field: EditorField, value: string): void {\n field.minLength = value ? parseInt(value, 10) : undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update maxLength\n onMaxLengthChange(field: EditorField, value: string): void {\n field.maxLength = value ? parseInt(value, 10) : undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update pattern\n onPatternChange(field: EditorField, value: string): void {\n field.pattern = value || undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update minimum\n onMinimumChange(field: EditorField, value: string): void {\n field.minimum = value ? parseFloat(value) : undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update maximum\n onMaximumChange(field: EditorField, value: string): void {\n field.maximum = value ? parseFloat(value) : undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Move field up in list\n moveFieldUp(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index > 0) {\n [parentList[index - 1], parentList[index]] = [parentList[index], parentList[index - 1]];\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Move field down in list\n moveFieldDown(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index < parentList.length - 1) {\n [parentList[index], parentList[index + 1]] = [parentList[index + 1], parentList[index]];\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Handle drag and drop reorder\n onFieldDrop(event: CdkDragDrop<EditorField[]>): void {\n if (event.previousIndex !== event.currentIndex) {\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n this.fields.update(fields => [...fields]);\n // Don't emit change here - it causes parent to reset expanded state\n // Order change will be captured on next edit or save\n }\n }\n\n // Check if field can be indented (previous sibling must be object/array)\n canIndent(field: EditorField, parentList: EditorField[]): boolean {\n const index = parentList.indexOf(field);\n if (index <= 0) return false;\n const prevSibling = parentList[index - 1];\n return prevSibling.type === 'object' || prevSibling.type === 'array';\n }\n\n // Indent field - move into previous sibling's children\n indentField(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index <= 0) return;\n\n const prevSibling = parentList[index - 1];\n if (prevSibling.type !== 'object' && prevSibling.type !== 'array') return;\n\n // Remove from current list\n parentList.splice(index, 1);\n\n // Add to previous sibling's children\n if (!prevSibling.children) {\n prevSibling.children = [];\n }\n prevSibling.children.push(field);\n\n // Always expand the target (keep open if already open, open if closed)\n prevSibling.expanded = true;\n\n this.fields.update(fields => [...fields]);\n // Don't emit change here - it causes parent to reset expanded state\n // Structure change will be captured on next edit or save\n }\n\n // Outdent field - move out of parent to grandparent level\n outdentField(field: EditorField, parentList: EditorField[], level: number): void {\n if (level === 0) return;\n\n // Find the parent object/array that contains this list\n const parent = this.findParentOfList(this.fields(), parentList);\n if (!parent) return;\n\n // Find the grandparent list\n const grandparentList = this.findParentList(this.fields(), parent);\n if (!grandparentList) return;\n\n // Remove from current list\n const index = parentList.indexOf(field);\n parentList.splice(index, 1);\n\n // Add to grandparent list after the parent\n const parentIndex = grandparentList.indexOf(parent);\n grandparentList.splice(parentIndex + 1, 0, field);\n\n this.fields.update(fields => [...fields]);\n // Don't emit change here - it causes parent to reset expanded state\n // Structure change will be captured on next edit or save\n }\n\n // Find the parent field that contains a given list\n private findParentOfList(searchIn: EditorField[], targetList: EditorField[]): EditorField | null {\n for (const field of searchIn) {\n if (field.children === targetList) {\n return field;\n }\n if (field.children) {\n const found = this.findParentOfList(field.children, targetList);\n if (found) return found;\n }\n }\n return null;\n }\n\n // Find the list that contains a given field\n private findParentList(searchIn: EditorField[], targetField: EditorField): EditorField[] | null {\n if (searchIn.includes(targetField)) {\n return searchIn;\n }\n for (const field of searchIn) {\n if (field.children) {\n const found = this.findParentList(field.children, targetField);\n if (found) return found;\n }\n }\n return null;\n }\n\n // Update schema name - only allow valid characters\n onSchemaNameChange(name: string, input?: HTMLInputElement): void {\n const sanitized = name.replace(/[^a-zA-Z0-9_$]/g, '');\n this.schemaName.set(sanitized);\n if (input && input.value !== sanitized) {\n input.value = sanitized;\n }\n this.emitChange();\n }\n\n // Emit change event\n private emitChange(): void {\n this.schemaChange.emit(this.toJsonSchema() as JsonSchema);\n }\n\n // Save the schema\n onSave(): void {\n this.save.emit(this.toJsonSchema() as JsonSchema);\n }\n\n // Convert JSON Schema to internal EditorField format\n private jsonSchemaToEditorFields(schema: JsonSchema, requiredFields: string[] = []): EditorField[] {\n const fields: EditorField[] = [];\n\n if (schema.type === 'object' && schema.properties) {\n const required = schema.required || requiredFields;\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n fields.push(this.jsonSchemaPropertyToEditorField(name, propSchema, required.includes(name)));\n }\n }\n\n return fields;\n }\n\n private jsonSchemaPropertyToEditorField(name: string, schema: JsonSchema, isRequired: boolean): EditorField {\n const fieldType = this.jsonSchemaTypeToEditorType(schema);\n // Set displayType for string, number, boolean, date, and time fields\n let displayType: DisplayType | undefined;\n if (fieldType === 'string') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'textbox';\n } else if (fieldType === 'number') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'textbox';\n } else if (fieldType === 'boolean') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'checkbox';\n } else if (fieldType === 'date') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'datepicker';\n } else if (fieldType === 'time') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'timepicker';\n }\n\n // Preserve format for string types and date types\n let format: string | undefined;\n if (fieldType === 'string' && schema.format) {\n format = schema.format;\n } else if (fieldType === 'date' && schema.format) {\n format = schema.format; // Preserve 'date' vs 'date-time'\n }\n\n const field: EditorField = {\n id: this.generateId(),\n name,\n type: fieldType,\n format,\n displayType,\n label: schema.title,\n required: isRequired,\n allowedValues: schema.enum as string[] | undefined,\n defaultValue: schema.default as string | number | boolean | undefined,\n // Validators\n minLength: schema.minLength,\n maxLength: schema.maxLength,\n pattern: schema.pattern,\n minimum: schema.minimum,\n maximum: schema.maximum,\n expanded: false,\n };\n\n if (schema.type === 'object' && schema.properties) {\n field.children = this.jsonSchemaToEditorFields(schema, schema.required);\n } else if (schema.type === 'array' && schema.items) {\n if (schema.items.type === 'object' && schema.items.properties) {\n field.children = this.jsonSchemaToEditorFields(schema.items, schema.items.required);\n }\n }\n\n return field;\n }\n\n private jsonSchemaTypeToEditorType(schema: JsonSchema): EditorField['type'] {\n if (schema.format === 'date' || schema.format === 'date-time') {\n return 'date';\n }\n if (schema.format === 'time') {\n return 'time';\n }\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n switch (type) {\n case 'string': return 'string';\n case 'number':\n case 'integer': return 'number';\n case 'boolean': return 'boolean';\n case 'object': return 'object';\n case 'array': return 'array';\n default: return 'string';\n }\n }\n\n // Convert to internal JSON format\n toJson(): string {\n return JSON.stringify(\n {\n name: this.schemaName(),\n fields: this.stripEditingState(this.fields()),\n },\n null,\n 2\n );\n }\n\n // Convert to valid JSON Schema format\n toJsonSchema(): object {\n const required: string[] = [];\n const properties: Record<string, object> = {};\n\n for (const field of this.fields()) {\n if (field.required && field.name) {\n required.push(field.name);\n }\n if (field.name) {\n properties[field.name] = this.fieldToJsonSchema(field);\n }\n }\n\n const schema: Record<string, unknown> = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n type: 'object',\n title: this.schemaName(),\n properties,\n };\n\n if (required.length > 0) {\n schema['required'] = required;\n }\n\n return schema;\n }\n\n private fieldToJsonSchema(field: EditorField): object {\n const schema: Record<string, unknown> = {};\n\n // Map type\n if (field.type === 'date') {\n schema['type'] = 'string';\n schema['format'] = field.format || 'date-time'; // Use preserved format or default\n } else if (field.type === 'time') {\n schema['type'] = 'string';\n schema['format'] = 'time';\n } else if (field.type === 'array') {\n schema['type'] = 'array';\n if (field.children && field.children.length > 0) {\n // If array has children, treat first child as item schema\n const itemProperties: Record<string, object> = {};\n const itemRequired: string[] = [];\n for (const child of field.children) {\n if (child.name) {\n itemProperties[child.name] = this.fieldToJsonSchema(child);\n if (child.required) {\n itemRequired.push(child.name);\n }\n }\n }\n const items: Record<string, unknown> = {\n type: 'object',\n properties: itemProperties,\n };\n if (itemRequired.length > 0) {\n items['required'] = itemRequired;\n }\n schema['items'] = items;\n }\n } else if (field.type === 'object') {\n schema['type'] = 'object';\n if (field.children && field.children.length > 0) {\n const childProperties: Record<string, object> = {};\n const childRequired: string[] = [];\n for (const child of field.children) {\n if (child.name) {\n childProperties[child.name] = this.fieldToJsonSchema(child);\n if (child.required) {\n childRequired.push(child.name);\n }\n }\n }\n schema['properties'] = childProperties;\n if (childRequired.length > 0) {\n schema['required'] = childRequired;\n }\n }\n } else {\n schema['type'] = field.type;\n // Preserve format for string types (email, uri, uuid, etc.)\n if (field.type === 'string' && field.format) {\n schema['format'] = field.format;\n }\n }\n\n // Add label as title\n if (field.label) {\n schema['title'] = field.label;\n }\n\n // Add enum for allowed values\n if (field.allowedValues && field.allowedValues.length > 0) {\n schema['enum'] = field.allowedValues;\n }\n\n // Add default value\n if (field.defaultValue !== undefined) {\n schema['default'] = field.defaultValue;\n }\n\n // Add validators\n if (field.minLength !== undefined) {\n schema['minLength'] = field.minLength;\n }\n if (field.maxLength !== undefined) {\n schema['maxLength'] = field.maxLength;\n }\n if (field.pattern) {\n schema['pattern'] = field.pattern;\n }\n if (field.minimum !== undefined) {\n schema['minimum'] = field.minimum;\n }\n if (field.maximum !== undefined) {\n schema['maximum'] = field.maximum;\n }\n\n // Add display type (custom extension)\n if (field.displayType) {\n schema['x-display-type'] = field.displayType;\n }\n\n return schema;\n }\n\n private stripEditingState(fields: EditorField[]): EditorField[] {\n return fields.map(f => {\n const { isEditingValues, isEditingDefault, isEditingValidators, ...rest } = f;\n return {\n ...rest,\n children: f.children ? this.stripEditingState(f.children) : undefined,\n };\n });\n }\n\n // Track by function for ngFor\n trackByFieldId(index: number, field: EditorField): string {\n return field.id;\n }\n\n // --- JSON View Methods ---\n\n setViewMode(mode: 'visual' | 'json'): void {\n if (mode === 'json') {\n // Sync JSON text from current schema state\n this.jsonText.set(JSON.stringify(this.toJsonSchema(), null, 2));\n this.jsonError.set(null);\n }\n this.viewMode.set(mode);\n }\n\n onJsonTextChange(text: string): void {\n this.jsonText.set(text);\n try {\n JSON.parse(text);\n this.jsonError.set(null);\n } catch (e) {\n this.jsonError.set((e as Error).message);\n }\n }\n\n applyJsonChanges(): void {\n try {\n const parsed = JSON.parse(this.jsonText()) as JsonSchema;\n // Update internal state from JSON\n this.schemaName.set(parsed.title || 'New Schema');\n this.fields.set(this.jsonSchemaToEditorFields(parsed));\n this.jsonError.set(null);\n this.emitChange();\n } catch (e) {\n this.jsonError.set((e as Error).message);\n }\n }\n\n formatJson(): void {\n try {\n const parsed = JSON.parse(this.jsonText());\n this.jsonText.set(JSON.stringify(parsed, null, 2));\n this.jsonError.set(null);\n } catch (e) {\n this.jsonError.set((e as Error).message);\n }\n }\n\n copyJson(): void {\n const text = this.jsonText();\n navigator.clipboard.writeText(text).catch(err => {\n console.error('Failed to copy JSON to clipboard:', err);\n });\n }\n}\n","<div class=\"schema-editor\">\n <!-- Schema Header -->\n <div class=\"editor-header\">\n @if (showSchemaName) {\n <div class=\"schema-name-section\">\n <mat-form-field appearance=\"outline\" class=\"schema-name-field\">\n <mat-label>Schema Name</mat-label>\n <input\n #schemaNameInput\n matInput\n [value]=\"schemaName()\"\n (input)=\"onSchemaNameChange($any($event.target).value, schemaNameInput)\"\n placeholder=\"Enter schema name\"\n />\n </mat-form-field>\n </div>\n }\n\n @if (showJsonToggle) {\n <mat-button-toggle-group [value]=\"viewMode()\" (change)=\"setViewMode($event.value)\" class=\"view-toggle\">\n <mat-button-toggle value=\"visual\">Visual</mat-button-toggle>\n <mat-button-toggle value=\"json\">JSON</mat-button-toggle>\n </mat-button-toggle-group>\n }\n\n <div class=\"header-actions\">\n @if (viewMode() === 'visual') {\n <button mat-flat-button color=\"primary\" (click)=\"addField()\">\n <mat-icon>add</mat-icon>\n Add Field\n </button>\n } @else {\n <button mat-stroked-button (click)=\"copyJson()\" matTooltip=\"Copy JSON to clipboard\">\n <mat-icon>content_copy</mat-icon>\n Copy\n </button>\n <button mat-stroked-button (click)=\"formatJson()\">\n <mat-icon>auto_fix_high</mat-icon>\n Format\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"applyJsonChanges()\" [disabled]=\"jsonError()\">\n <mat-icon>check</mat-icon>\n Apply\n </button>\n }\n </div>\n </div>\n\n <!-- JSON View -->\n @if (viewMode() === 'json') {\n <div class=\"json-view\">\n @if (jsonError()) {\n <div class=\"json-error\">\n <mat-icon>error</mat-icon>\n {{ jsonError() }}\n </div>\n }\n <textarea\n class=\"json-textarea\"\n [value]=\"jsonText()\"\n (input)=\"onJsonTextChange($any($event.target).value)\"\n spellcheck=\"false\"\n ></textarea>\n </div>\n }\n\n <!-- Fields List (Visual View) -->\n <div class=\"fields-container\" [class.hidden]=\"viewMode() === 'json'\">\n @if (fields().length === 0) {\n <div class=\"empty-state\">\n <mat-icon>schema</mat-icon>\n <p>No fields yet. Click \"Add Field\" to get started.</p>\n </div>\n } @else {\n <div\n class=\"fields-list\"\n cdkDropList\n [cdkDropListData]=\"fields()\"\n (cdkDropListDropped)=\"onFieldDrop($event)\"\n >\n @for (field of fields(); track field.id) {\n <field-item\n cdkDrag\n [field]=\"field\"\n [parentList]=\"fields()\"\n [level]=\"0\"\n [showDisplayType]=\"showDisplayType\"\n (fieldChange)=\"onFieldChange()\"\n (delete)=\"onFieldDelete($event)\"\n (duplicate)=\"onFieldDuplicate($event)\"\n >\n <!-- Drag Placeholder -->\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <!-- Drag Preview -->\n <div *cdkDragPreview class=\"drag-preview\">\n <mat-icon>{{ getTypeIcon(field.type) }}</mat-icon>\n {{ field.name || 'unnamed' }}\n </div>\n </field-item>\n }\n </div>\n }\n </div>\n</div>\n","/*\r\n * Public API Surface of ngx-data-mapper\r\n */\r\n\r\n// Models\r\nexport * from './lib/models/schema.model';\r\nexport * from './lib/models/json-schema.model';\r\n\r\n// Services\r\nexport * from './lib/services/mapping.service';\r\nexport * from './lib/services/transformation.service';\r\nexport * from './lib/services/svg-connector.service';\r\nexport * from './lib/services/schema-parser.service';\r\n\r\n// Components\r\nexport * from './lib/components/data-mapper/data-mapper.component';\r\nexport * from './lib/components/schema-editor/schema-editor.component';\r\nexport * from './lib/components/schema-tree/schema-tree.component';\r\nexport * from './lib/components/transformation-popover/transformation-popover.component';\r\nexport * from './lib/components/array-filter-modal/array-filter-modal.component';\r\nexport * from './lib/components/array-selector-modal/array-selector-modal.component';\r\nexport * from './lib/components/default-value-popover/default-value-popover.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i6","i2","i4","i5","i9","i7","i8","i1"],"mappings":"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"}
1
+ {"version":3,"file":"expeed-ngx-data-mapper.mjs","sources":["../../../projects/ngx-data-mapper/src/lib/models/json-schema.model.ts","../../../projects/ngx-data-mapper/src/lib/services/mapping.service.ts","../../../projects/ngx-data-mapper/src/lib/services/transformation.service.ts","../../../projects/ngx-data-mapper/src/lib/services/svg-connector.service.ts","../../../projects/ngx-data-mapper/src/lib/services/schema-parser.service.ts","../../../projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.ts","../../../projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.html","../../../projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.ts","../../../projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.html","../../../projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.ts","../../../projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.html","../../../projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.ts","../../../projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.html","../../../projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.ts","../../../projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.html","../../../projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.ts","../../../projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.html","../../../projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.ts","../../../projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.html","../../../projects/ngx-data-mapper/src/lib/components/schema-editor/field-item/field-item.component.ts","../../../projects/ngx-data-mapper/src/lib/components/schema-editor/field-item/field-item.component.html","../../../projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.ts","../../../projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.html","../../../projects/ngx-data-mapper/src/public-api.ts","../../../projects/ngx-data-mapper/src/expeed-ngx-data-mapper.ts"],"sourcesContent":["/**\r\n * Standard JSON Schema (draft-07) TypeScript interfaces\r\n */\r\n\r\nexport interface JsonSchema {\r\n $schema?: string;\r\n $id?: string;\r\n title?: string;\r\n description?: string;\r\n type?: JsonSchemaType | JsonSchemaType[];\r\n properties?: Record<string, JsonSchema>;\r\n items?: JsonSchema;\r\n required?: string[];\r\n enum?: (string | number | boolean | null)[];\r\n const?: unknown;\r\n default?: unknown;\r\n\r\n // String validations\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: string;\r\n format?: string;\r\n\r\n // Number validations\r\n minimum?: number;\r\n maximum?: number;\r\n exclusiveMinimum?: number;\r\n exclusiveMaximum?: number;\r\n multipleOf?: number;\r\n\r\n // Array validations\r\n minItems?: number;\r\n maxItems?: number;\r\n uniqueItems?: boolean;\r\n\r\n // Object validations\r\n minProperties?: number;\r\n maxProperties?: number;\r\n additionalProperties?: boolean | JsonSchema;\r\n\r\n // Combining schemas\r\n allOf?: JsonSchema[];\r\n anyOf?: JsonSchema[];\r\n oneOf?: JsonSchema[];\r\n not?: JsonSchema;\r\n\r\n // References\r\n $ref?: string;\r\n definitions?: Record<string, JsonSchema>;\r\n}\r\n\r\nexport type JsonSchemaType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'null';\r\n\r\n/**\r\n * Helper type for working with JSON schemas in the UI\r\n */\r\nexport interface JsonSchemaField {\r\n name: string;\r\n path: string;\r\n schema: JsonSchema;\r\n children?: JsonSchemaField[];\r\n expanded?: boolean;\r\n}\r\n\r\n/**\r\n * Convert JSON Schema to flat field list for UI rendering\r\n */\r\nexport function schemaToFields(schema: JsonSchema, parentPath: string = ''): JsonSchemaField[] {\r\n const fields: JsonSchemaField[] = [];\r\n\r\n if (schema.type === 'object' && schema.properties) {\r\n for (const [name, propSchema] of Object.entries(schema.properties)) {\r\n const path = parentPath ? `${parentPath}.${name}` : name;\r\n const field: JsonSchemaField = {\r\n name,\r\n path,\r\n schema: propSchema,\r\n expanded: false,\r\n };\r\n\r\n if (propSchema.type === 'object' && propSchema.properties) {\r\n field.children = schemaToFields(propSchema, path);\r\n } else if (propSchema.type === 'array' && propSchema.items) {\r\n field.children = schemaToFields(propSchema.items, `${path}[]`);\r\n }\r\n\r\n fields.push(field);\r\n }\r\n }\r\n\r\n return fields;\r\n}\r\n\r\n/**\r\n * Get the simple type for display purposes\r\n */\r\nexport function getSchemaType(schema: JsonSchema): string {\r\n if (Array.isArray(schema.type)) {\r\n return schema.type.filter(t => t !== 'null').join(' | ');\r\n }\r\n if (schema.type === 'integer') {\r\n return 'number';\r\n }\r\n if (schema.format === 'date' || schema.format === 'date-time') {\r\n return 'date';\r\n }\r\n return schema.type || 'any';\r\n}\r\n\r\n/**\r\n * Create an empty JSON Schema for a new schema definition\r\n */\r\nexport function createEmptySchema(title: string = 'New Schema'): JsonSchema {\r\n return {\r\n $schema: 'http://json-schema.org/draft-07/schema#',\r\n title,\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n}\r\n\r\n/**\r\n * Add a property to a schema\r\n */\r\nexport function addProperty(\r\n schema: JsonSchema,\r\n name: string,\r\n type: JsonSchemaType,\r\n options?: { description?: string; required?: boolean }\r\n): JsonSchema {\r\n const newSchema = { ...schema };\r\n newSchema.properties = { ...newSchema.properties };\r\n\r\n const propSchema: JsonSchema = { type };\r\n if (options?.description) {\r\n propSchema.description = options.description;\r\n }\r\n\r\n if (type === 'object') {\r\n propSchema.properties = {};\r\n } else if (type === 'array') {\r\n propSchema.items = { type: 'string' };\r\n }\r\n\r\n newSchema.properties[name] = propSchema;\r\n\r\n if (options?.required) {\r\n newSchema.required = [...(newSchema.required || []), name];\r\n }\r\n\r\n return newSchema;\r\n}\r\n\r\n/**\r\n * Remove a property from a schema\r\n */\r\nexport function removeProperty(schema: JsonSchema, name: string): JsonSchema {\r\n const newSchema = { ...schema };\r\n newSchema.properties = { ...newSchema.properties };\r\n delete newSchema.properties[name];\r\n newSchema.required = (newSchema.required || []).filter(r => r !== name);\r\n return newSchema;\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\nimport {\n FieldMapping,\n ArrayMapping,\n ArrayToObjectMapping,\n ArraySelectorConfig,\n SchemaField,\n TransformationConfig,\n Connection,\n DragState,\n ArrayFilterConfig,\n DefaultValue,\n} from '../models/schema.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MappingService {\n private mappings = signal<FieldMapping[]>([]);\n private arrayMappings = signal<ArrayMapping[]>([]);\n private arrayToObjectMappings = signal<ArrayToObjectMapping[]>([]);\n private defaultValues = signal<DefaultValue[]>([]);\n private selectedMappingId = signal<string | null>(null);\n private _sourceSchemaRef = signal<string | null>(null);\n private _targetSchemaRef = signal<string | null>(null);\n private dragState = signal<DragState>({\n isDragging: false,\n sourceField: null,\n startPoint: null,\n currentPoint: null,\n dragMode: 'new',\n });\n\n readonly allMappings = computed(() => this.mappings());\n readonly allArrayMappings = computed(() => this.arrayMappings());\n readonly allArrayToObjectMappings = computed(() => this.arrayToObjectMappings());\n readonly allDefaultValues = computed(() => this.defaultValues());\n readonly sourceSchemaRef = computed(() => this._sourceSchemaRef());\n readonly targetSchemaRef = computed(() => this._targetSchemaRef());\n readonly selectedMapping = computed(() => {\n const id = this.selectedMappingId();\n return this.mappings().find((m) => m.id === id) || null;\n });\n readonly currentDragState = computed(() => this.dragState());\n\n private generateId(): string {\n return `mapping-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n startDrag(field: SchemaField, startPoint: { x: number; y: number }): void {\n this.dragState.set({\n isDragging: true,\n sourceField: field,\n startPoint,\n currentPoint: startPoint,\n dragMode: 'new',\n });\n }\n\n startEndpointDrag(\n mappingId: string,\n endpointType: 'source' | 'target',\n startPoint: { x: number; y: number },\n sourceFieldIndex?: number\n ): void {\n const mapping = this.mappings().find(m => m.id === mappingId);\n if (!mapping) return;\n\n // For source endpoint, we show the line from target back to cursor\n // For target endpoint, we show the line from source(s) to cursor\n const dragMode = endpointType === 'source' ? 'move-source' : 'move-target';\n\n this.dragState.set({\n isDragging: true,\n sourceField: endpointType === 'source'\n ? mapping.sourceFields[sourceFieldIndex ?? 0]\n : mapping.targetField,\n startPoint,\n currentPoint: startPoint,\n dragMode,\n mappingId,\n sourceFieldIndex,\n });\n }\n\n updateDragPosition(currentPoint: { x: number; y: number }): void {\n this.dragState.update((state) => ({\n ...state,\n currentPoint,\n }));\n }\n\n endDrag(): void {\n this.dragState.set({\n isDragging: false,\n sourceField: null,\n startPoint: null,\n currentPoint: null,\n dragMode: 'new',\n });\n }\n\n changeSourceField(mappingId: string, newSourceField: SchemaField, sourceFieldIndex?: number): void {\n const mapping = this.mappings().find(m => m.id === mappingId);\n if (!mapping) return;\n\n // Don't allow if new source is the same as target\n if (newSourceField.id === mapping.targetField.id) return;\n\n // Don't allow if source already exists in the mapping\n if (mapping.sourceFields.some(sf => sf.id === newSourceField.id)) return;\n\n if (sourceFieldIndex !== undefined && mapping.sourceFields.length > 1) {\n // Replace specific source field in multi-source mapping\n const newSourceFields = [...mapping.sourceFields];\n newSourceFields[sourceFieldIndex] = newSourceField;\n this.mappings.update(mappings =>\n mappings.map(m => m.id === mappingId ? { ...m, sourceFields: newSourceFields } : m)\n );\n } else {\n // Single source mapping - replace the source field\n this.mappings.update(mappings =>\n mappings.map(m => m.id === mappingId ? { ...m, sourceFields: [newSourceField] } : m)\n );\n }\n }\n\n changeTargetField(mappingId: string, newTargetField: SchemaField): void {\n const mapping = this.mappings().find(m => m.id === mappingId);\n if (!mapping) return;\n\n // Don't allow if new target is same as any source\n if (mapping.sourceFields.some(sf => sf.id === newTargetField.id)) return;\n\n // Check if another mapping already targets this field\n const existingMapping = this.mappings().find(\n m => m.targetField.id === newTargetField.id && m.id !== mappingId\n );\n\n if (existingMapping) {\n // Merge into existing mapping (add sources)\n const mergedSources = [\n ...existingMapping.sourceFields,\n ...mapping.sourceFields.filter(\n sf => !existingMapping.sourceFields.some(esf => esf.id === sf.id)\n ),\n ];\n\n this.mappings.update(mappings =>\n mappings\n .filter(m => m.id !== mappingId) // Remove old mapping\n .map(m => m.id === existingMapping.id\n ? {\n ...m,\n sourceFields: mergedSources,\n transformations: mergedSources.length > 1\n ? [{ type: 'concat' as const, separator: ' ' }]\n : m.transformations,\n }\n : m\n )\n );\n } else {\n // Simply update the target field\n this.mappings.update(mappings =>\n mappings.map(m => m.id === mappingId ? { ...m, targetField: newTargetField } : m)\n );\n }\n }\n\n createMapping(\n sourceFields: SchemaField[],\n targetField: SchemaField,\n transformation?: TransformationConfig\n ): FieldMapping {\n // Check if this is an array-to-array mapping\n const sourceField = sourceFields[0];\n if (sourceField.type === 'array' && targetField.type === 'array') {\n return this.createArrayMapping(sourceField, targetField);\n }\n\n // Check if this is an array-to-object mapping\n if (sourceField.type === 'array' && targetField.type === 'object') {\n return this.createArrayToObjectMapping(sourceField, targetField);\n }\n\n // Check if fields are within arrays and need array context\n const arrayMappingId = this.findOrCreateArrayContext(sourceField, targetField);\n\n // Check if fields need array-to-object context\n const arrayToObjectMappingId = this.findOrCreateArrayToObjectContext(sourceField, targetField);\n\n const existingMapping = this.mappings().find(\n (m) => m.targetField.id === targetField.id\n );\n\n if (existingMapping) {\n // Add source fields to existing mapping (for concat scenarios)\n const updatedMapping: FieldMapping = {\n ...existingMapping,\n sourceFields: [\n ...existingMapping.sourceFields,\n ...sourceFields.filter(\n (sf) => !existingMapping.sourceFields.some((esf) => esf.id === sf.id)\n ),\n ],\n transformations:\n existingMapping.sourceFields.length + sourceFields.length > 1\n ? [{ type: 'concat', separator: ' ', ...transformation }]\n : transformation ? [transformation] : [{ type: 'direct' }],\n };\n\n this.mappings.update((mappings) =>\n mappings.map((m) => (m.id === existingMapping.id ? updatedMapping : m))\n );\n\n return updatedMapping;\n }\n\n const newMapping: FieldMapping = {\n id: this.generateId(),\n sourceFields,\n targetField,\n transformations: transformation ? [transformation] : [{ type: 'direct' }],\n isArrayMapping: false, // Only true for array-to-array connections\n arrayMappingId, // Links to parent array mapping if within array context\n isArrayToObjectMapping: false,\n arrayToObjectMappingId, // Links to parent array-to-object mapping if applicable\n };\n\n this.mappings.update((mappings) => [...mappings, newMapping]);\n\n // If this is part of an array mapping, add to itemMappings\n if (arrayMappingId) {\n this.arrayMappings.update((ams) =>\n ams.map((am) =>\n am.id === arrayMappingId\n ? { ...am, itemMappings: [...am.itemMappings, newMapping] }\n : am\n )\n );\n }\n\n // If this is part of an array-to-object mapping, add to itemMappings\n if (arrayToObjectMappingId) {\n this.arrayToObjectMappings.update((ams) =>\n ams.map((am) =>\n am.id === arrayToObjectMappingId\n ? { ...am, itemMappings: [...am.itemMappings, newMapping] }\n : am\n )\n );\n }\n\n return newMapping;\n }\n\n private createArrayMapping(\n sourceArray: SchemaField,\n targetArray: SchemaField\n ): FieldMapping {\n // Check if array mapping already exists\n const existingArrayMapping = this.arrayMappings().find(\n (am) => am.sourceArray.id === sourceArray.id && am.targetArray.id === targetArray.id\n );\n\n if (existingArrayMapping) {\n // Return a dummy field mapping representing the array mapping\n const existing = this.mappings().find(m => m.id === existingArrayMapping.id);\n if (existing) return existing;\n }\n\n const arrayMapping: ArrayMapping = {\n id: this.generateId(),\n sourceArray,\n targetArray,\n itemMappings: [],\n };\n\n this.arrayMappings.update((ams) => [...ams, arrayMapping]);\n\n // Also create a field mapping to visualize the array connection\n const fieldMapping: FieldMapping = {\n id: arrayMapping.id,\n sourceFields: [sourceArray],\n targetField: targetArray,\n transformations: [{ type: 'direct' }],\n isArrayMapping: true,\n };\n\n this.mappings.update((mappings) => [...mappings, fieldMapping]);\n\n return fieldMapping;\n }\n\n private createArrayToObjectMapping(\n sourceArray: SchemaField,\n targetObject: SchemaField\n ): FieldMapping {\n // Check if array-to-object mapping already exists\n const existingMapping = this.arrayToObjectMappings().find(\n (am) => am.sourceArray.id === sourceArray.id && am.targetObject.id === targetObject.id\n );\n\n if (existingMapping) {\n const existing = this.mappings().find(m => m.id === existingMapping.id);\n if (existing) return existing;\n }\n\n const arrayToObjectMapping: ArrayToObjectMapping = {\n id: this.generateId(),\n sourceArray,\n targetObject,\n selector: { mode: 'first' }, // Default to first item\n itemMappings: [],\n };\n\n this.arrayToObjectMappings.update((ams) => [...ams, arrayToObjectMapping]);\n\n // Create a field mapping to visualize the connection\n const fieldMapping: FieldMapping = {\n id: arrayToObjectMapping.id,\n sourceFields: [sourceArray],\n targetField: targetObject,\n transformations: [{ type: 'direct' }],\n isArrayToObjectMapping: true,\n };\n\n this.mappings.update((mappings) => [...mappings, fieldMapping]);\n\n return fieldMapping;\n }\n\n private findOrCreateArrayContext(\n sourceField: SchemaField,\n targetField: SchemaField\n ): string | undefined {\n // If both fields are array items, check if an array mapping exists\n if (sourceField.isArrayItem && targetField.isArrayItem) {\n const existingArrayMapping = this.arrayMappings().find(\n (am) =>\n am.sourceArray.path === sourceField.parentArrayPath &&\n am.targetArray.path === targetField.parentArrayPath\n );\n\n if (existingArrayMapping) {\n return existingArrayMapping.id;\n }\n }\n\n return undefined;\n }\n\n private findOrCreateArrayToObjectContext(\n sourceField: SchemaField,\n targetField: SchemaField\n ): string | undefined {\n // If source is array item and target is within an object (not array item)\n if (sourceField.isArrayItem && !targetField.isArrayItem && targetField.path.includes('.')) {\n // Find the parent object path\n const targetParts = targetField.path.split('.');\n const parentObjectPath = targetParts.slice(0, -1).join('.');\n\n const existingMapping = this.arrayToObjectMappings().find(\n (am) =>\n am.sourceArray.path === sourceField.parentArrayPath &&\n am.targetObject.path === parentObjectPath\n );\n\n if (existingMapping) {\n return existingMapping.id;\n }\n }\n\n return undefined;\n }\n\n getArrayMapping(id: string): ArrayMapping | undefined {\n return this.arrayMappings().find((am) => am.id === id);\n }\n\n getArrayMappingForField(field: SchemaField): ArrayMapping | undefined {\n if (!field.parentArrayPath) return undefined;\n return this.arrayMappings().find(\n (am) =>\n am.sourceArray.path === field.parentArrayPath ||\n am.targetArray.path === field.parentArrayPath\n );\n }\n\n removeArrayMapping(arrayMappingId: string): void {\n // Remove the array mapping\n this.arrayMappings.update((ams) => ams.filter((am) => am.id !== arrayMappingId));\n\n // Remove all field mappings associated with this array mapping\n this.mappings.update((mappings) =>\n mappings.filter((m) => m.arrayMappingId !== arrayMappingId && m.id !== arrayMappingId)\n );\n }\n\n updateArrayFilter(arrayMappingId: string, filter: ArrayFilterConfig | undefined): void {\n this.arrayMappings.update((ams) =>\n ams.map((am) =>\n am.id === arrayMappingId ? { ...am, filter } : am\n )\n );\n }\n\n getArrayToObjectMapping(id: string): ArrayToObjectMapping | undefined {\n return this.arrayToObjectMappings().find((am) => am.id === id);\n }\n\n updateArrayToObjectSelector(mappingId: string, selector: ArraySelectorConfig): void {\n this.arrayToObjectMappings.update((ams) =>\n ams.map((am) =>\n am.id === mappingId ? { ...am, selector } : am\n )\n );\n }\n\n removeArrayToObjectMapping(mappingId: string): void {\n // Remove the array-to-object mapping\n this.arrayToObjectMappings.update((ams) => ams.filter((am) => am.id !== mappingId));\n\n // Remove all field mappings associated with this mapping\n this.mappings.update((mappings) =>\n mappings.filter((m) => m.arrayToObjectMappingId !== mappingId && m.id !== mappingId)\n );\n }\n\n updateMapping(\n mappingId: string,\n updates: Partial<FieldMapping>\n ): void {\n this.mappings.update((mappings) =>\n mappings.map((m) => (m.id === mappingId ? { ...m, ...updates } : m))\n );\n }\n\n updateTransformations(\n mappingId: string,\n transformations: TransformationConfig[]\n ): void {\n this.mappings.update((mappings) =>\n mappings.map((m) =>\n m.id === mappingId ? { ...m, transformations } : m\n )\n );\n }\n\n removeMapping(mappingId: string): void {\n this.mappings.update((mappings) =>\n mappings.filter((m) => m.id !== mappingId)\n );\n if (this.selectedMappingId() === mappingId) {\n this.selectedMappingId.set(null);\n }\n }\n\n removeSourceFromMapping(mappingId: string, sourceFieldId: string): void {\n const mapping = this.mappings().find((m) => m.id === mappingId);\n if (!mapping) return;\n\n if (mapping.sourceFields.length <= 1) {\n this.removeMapping(mappingId);\n } else {\n this.mappings.update((mappings) =>\n mappings.map((m) =>\n m.id === mappingId\n ? {\n ...m,\n sourceFields: m.sourceFields.filter(\n (sf) => sf.id !== sourceFieldId\n ),\n transformations:\n m.sourceFields.length - 1 === 1\n ? [{ type: 'direct' }]\n : m.transformations,\n }\n : m\n )\n );\n }\n }\n\n selectMapping(mappingId: string | null): void {\n this.selectedMappingId.set(mappingId);\n }\n\n getMappingForTarget(targetFieldId: string): FieldMapping | undefined {\n return this.mappings().find((m) => m.targetField.id === targetFieldId);\n }\n\n getMappingsForSource(sourceFieldId: string): FieldMapping[] {\n return this.mappings().filter((m) =>\n m.sourceFields.some((sf) => sf.id === sourceFieldId)\n );\n }\n\n clearAllMappings(): void {\n this.mappings.set([]);\n this.arrayMappings.set([]);\n this.arrayToObjectMappings.set([]);\n this.defaultValues.set([]);\n this.selectedMappingId.set(null);\n this._sourceSchemaRef.set(null);\n this._targetSchemaRef.set(null);\n }\n\n setSourceSchemaRef(ref: string | null): void {\n this._sourceSchemaRef.set(ref);\n }\n\n setTargetSchemaRef(ref: string | null): void {\n this._targetSchemaRef.set(ref);\n }\n\n // Default value methods\n setDefaultValue(targetField: SchemaField, value: string | number | boolean | Date | null): DefaultValue {\n const existingDefault = this.defaultValues().find(d => d.targetField.id === targetField.id);\n\n if (existingDefault) {\n const updated: DefaultValue = { ...existingDefault, value };\n this.defaultValues.update(dv => dv.map(d => d.id === existingDefault.id ? updated : d));\n return updated;\n }\n\n const newDefault: DefaultValue = {\n id: this.generateId(),\n targetField,\n value,\n };\n\n this.defaultValues.update(dv => [...dv, newDefault]);\n return newDefault;\n }\n\n getDefaultValue(targetFieldId: string): DefaultValue | undefined {\n return this.defaultValues().find(d => d.targetField.id === targetFieldId);\n }\n\n removeDefaultValue(targetFieldId: string): void {\n this.defaultValues.update(dv => dv.filter(d => d.targetField.id !== targetFieldId));\n }\n\n hasDefaultValue(targetFieldId: string): boolean {\n return this.defaultValues().some(d => d.targetField.id === targetFieldId);\n }\n\n exportMappings(name?: string, description?: string): string {\n const exportData: Record<string, unknown> = {\n version: '1.0',\n name: name || 'Mapping Configuration',\n description: description || '',\n mappings: this.mappings(),\n arrayMappings: this.arrayMappings(),\n arrayToObjectMappings: this.arrayToObjectMappings(),\n defaultValues: this.defaultValues(),\n };\n\n // Include schema refs if set\n if (this._sourceSchemaRef()) {\n exportData['sourceSchemaRef'] = this._sourceSchemaRef();\n }\n if (this._targetSchemaRef()) {\n exportData['targetSchemaRef'] = this._targetSchemaRef();\n }\n\n return JSON.stringify(exportData, null, 2);\n }\n\n /**\n * Export mappings as a MappingDocument object (not stringified)\n */\n exportMappingsAsObject(name?: string, description?: string): object {\n const exportData: Record<string, unknown> = {\n version: '1.0',\n name: name || 'Mapping Configuration',\n description: description || '',\n mappings: this.mappings(),\n arrayMappings: this.arrayMappings(),\n arrayToObjectMappings: this.arrayToObjectMappings(),\n defaultValues: this.defaultValues(),\n };\n\n // Include schema refs if set\n if (this._sourceSchemaRef()) {\n exportData['sourceSchemaRef'] = this._sourceSchemaRef();\n }\n if (this._targetSchemaRef()) {\n exportData['targetSchemaRef'] = this._targetSchemaRef();\n }\n\n return exportData;\n }\n\n importMappings(json: string): void {\n try {\n const data = JSON.parse(json);\n if (data.mappings) {\n this.mappings.set(data.mappings as FieldMapping[]);\n this.arrayMappings.set(data.arrayMappings as ArrayMapping[] || []);\n this.arrayToObjectMappings.set(data.arrayToObjectMappings as ArrayToObjectMapping[] || []);\n this.defaultValues.set(data.defaultValues as DefaultValue[] || []);\n this._sourceSchemaRef.set(data.sourceSchemaRef || null);\n this._targetSchemaRef.set(data.targetSchemaRef || null);\n } else {\n // Legacy format\n this.mappings.set(data as FieldMapping[]);\n }\n } catch (e) {\n console.error('Failed to import mappings:', e);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n TransformationConfig,\n TransformationType,\n SchemaField,\n FilterGroup,\n FilterCondition,\n FilterItem,\n FilterOperator,\n} from '../models/schema.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TransformationService {\n applyTransformation(\n sourceValues: Record<string, unknown>,\n sourceFields: SchemaField[],\n config: TransformationConfig\n ): string {\n const values = sourceFields.map((f) => this.getValueByPath(sourceValues, f.path));\n\n switch (config.type) {\n case 'direct':\n return String(values[0] ?? '');\n\n case 'concat':\n if (config.template) {\n return this.applyTemplate(config.template, sourceFields, sourceValues);\n }\n return values.join(config.separator ?? ' ');\n\n case 'substring':\n const str = String(values[0] ?? '');\n return str.substring(\n config.startIndex ?? 0,\n config.endIndex ?? str.length\n );\n\n case 'replace':\n return String(values[0] ?? '').replace(\n new RegExp(config.searchValue ?? '', 'g'),\n config.replaceValue ?? ''\n );\n\n case 'uppercase':\n return String(values[0] ?? '').toUpperCase();\n\n case 'lowercase':\n return String(values[0] ?? '').toLowerCase();\n\n case 'trim':\n return String(values[0] ?? '').trim();\n\n case 'mask':\n return this.applyMask(String(values[0] ?? ''), config.pattern ?? '');\n\n case 'dateFormat':\n return this.formatDate(\n values[0],\n config.inputFormat,\n config.outputFormat\n );\n\n case 'extractYear':\n return this.extractDatePart(values[0], 'year');\n\n case 'extractMonth':\n return this.extractDatePart(values[0], 'month');\n\n case 'extractDay':\n return this.extractDatePart(values[0], 'day');\n\n case 'extractHour':\n return this.extractDatePart(values[0], 'hour');\n\n case 'extractMinute':\n return this.extractDatePart(values[0], 'minute');\n\n case 'extractSecond':\n return this.extractDatePart(values[0], 'second');\n\n case 'numberFormat':\n return this.formatNumber(\n values[0],\n config.decimalPlaces,\n config.prefix,\n config.suffix\n );\n\n case 'template':\n return this.applyTemplate(\n config.template ?? '',\n sourceFields,\n sourceValues\n );\n\n default:\n return String(values[0] ?? '');\n }\n }\n\n /**\n * Apply a transformation to a single value (for chained transformations)\n */\n applyTransformationToValue(\n value: unknown,\n config: TransformationConfig\n ): string {\n const str = String(value ?? '');\n\n switch (config.type) {\n case 'direct':\n return str;\n\n case 'concat':\n // For single value, just return it (concat needs multiple values)\n return str;\n\n case 'substring':\n return str.substring(\n config.startIndex ?? 0,\n config.endIndex ?? str.length\n );\n\n case 'replace':\n return str.replace(\n new RegExp(config.searchValue ?? '', 'g'),\n config.replaceValue ?? ''\n );\n\n case 'uppercase':\n return str.toUpperCase();\n\n case 'lowercase':\n return str.toLowerCase();\n\n case 'trim':\n return str.trim();\n\n case 'mask':\n return this.applyMask(str, config.pattern ?? '');\n\n case 'dateFormat':\n return this.formatDate(value, config.inputFormat, config.outputFormat);\n\n case 'extractYear':\n return this.extractDatePart(value, 'year');\n\n case 'extractMonth':\n return this.extractDatePart(value, 'month');\n\n case 'extractDay':\n return this.extractDatePart(value, 'day');\n\n case 'extractHour':\n return this.extractDatePart(value, 'hour');\n\n case 'extractMinute':\n return this.extractDatePart(value, 'minute');\n\n case 'extractSecond':\n return this.extractDatePart(value, 'second');\n\n case 'numberFormat':\n return this.formatNumber(\n value,\n config.decimalPlaces,\n config.prefix,\n config.suffix\n );\n\n case 'template':\n // For single value, replace {0} with the value\n return (config.template ?? '').replace(/\\{0\\}/g, str);\n\n default:\n return str;\n }\n }\n\n /**\n * Apply multiple transformations in sequence, respecting conditions\n */\n applyTransformations(\n sourceValues: Record<string, unknown>,\n sourceFields: SchemaField[],\n transformations: TransformationConfig[]\n ): string {\n if (transformations.length === 0) {\n return '';\n }\n\n // Get initial value for first transformation\n const initialValues = sourceFields.map((f) => this.getValueByPath(sourceValues, f.path));\n const initialValue = initialValues.length === 1 ? initialValues[0] : initialValues.join(' ');\n\n // Apply first transformation using source fields (check condition first)\n let result: string;\n if (this.isConditionMet(initialValue, transformations[0])) {\n result = this.applyTransformation(sourceValues, sourceFields, transformations[0]);\n } else {\n result = String(initialValue ?? '');\n }\n\n // Apply subsequent transformations to the result\n for (let i = 1; i < transformations.length; i++) {\n if (this.isConditionMet(result, transformations[i])) {\n result = this.applyTransformationToValue(result, transformations[i]);\n }\n // If condition not met, result passes through unchanged\n }\n\n return result;\n }\n\n private getValueByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, part) => {\n if (acc && typeof acc === 'object') {\n return (acc as Record<string, unknown>)[part];\n }\n return undefined;\n }, obj);\n }\n\n private applyTemplate(\n template: string,\n sourceFields: SchemaField[],\n sourceValues: Record<string, unknown>\n ): string {\n let result = template;\n // Replace positional placeholders {0}, {1}, etc.\n sourceFields.forEach((field, index) => {\n const value = this.getValueByPath(sourceValues, field.path);\n result = result.replace(\n new RegExp(`\\\\{${index}\\\\}`, 'g'),\n String(value ?? '')\n );\n });\n return result;\n }\n\n private formatDate(\n value: unknown,\n inputFormat?: string,\n outputFormat?: string\n ): string {\n if (!value) return '';\n try {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n // Simple format implementation\n const format = outputFormat ?? 'YYYY-MM-DD';\n return format\n .replace('YYYY', date.getFullYear().toString())\n .replace('MM', (date.getMonth() + 1).toString().padStart(2, '0'))\n .replace('DD', date.getDate().toString().padStart(2, '0'))\n .replace('HH', date.getHours().toString().padStart(2, '0'))\n .replace('mm', date.getMinutes().toString().padStart(2, '0'))\n .replace('ss', date.getSeconds().toString().padStart(2, '0'));\n } catch {\n return String(value);\n }\n }\n\n private extractDatePart(\n value: unknown,\n part: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'\n ): string {\n if (!value) return '';\n try {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n switch (part) {\n case 'year':\n return date.getFullYear().toString();\n case 'month':\n return (date.getMonth() + 1).toString().padStart(2, '0');\n case 'day':\n return date.getDate().toString().padStart(2, '0');\n case 'hour':\n return date.getHours().toString().padStart(2, '0');\n case 'minute':\n return date.getMinutes().toString().padStart(2, '0');\n case 'second':\n return date.getSeconds().toString().padStart(2, '0');\n default:\n return String(value);\n }\n } catch {\n return String(value);\n }\n }\n\n private formatNumber(\n value: unknown,\n decimalPlaces?: number,\n prefix?: string,\n suffix?: string\n ): string {\n if (value === null || value === undefined) return '';\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n let formatted = decimalPlaces !== undefined\n ? num.toFixed(decimalPlaces)\n : num.toString();\n\n return `${prefix ?? ''}${formatted}${suffix ?? ''}`;\n }\n\n private applyMask(input: string, pattern: string): string {\n if (!pattern) return input;\n\n let result = '';\n let inputIndex = 0;\n\n for (let i = 0; i < pattern.length; i++) {\n const patternChar = pattern.charAt(i);\n if (patternChar === '#') {\n if (inputIndex < input.length) {\n result += input.charAt(inputIndex);\n inputIndex++;\n }\n } else {\n result += patternChar;\n }\n }\n\n return result;\n }\n\n getTransformationLabel(type: TransformationType): string {\n const labels: Record<TransformationType, string> = {\n direct: 'Direct Mapping',\n concat: 'Concatenate',\n substring: 'Substring',\n replace: 'Find & Replace',\n uppercase: 'Uppercase',\n lowercase: 'Lowercase',\n trim: 'Trim',\n mask: 'Mask',\n dateFormat: 'Date Format',\n extractYear: 'Extract Year',\n extractMonth: 'Extract Month',\n extractDay: 'Extract Day',\n extractHour: 'Extract Hour',\n extractMinute: 'Extract Minute',\n extractSecond: 'Extract Second',\n numberFormat: 'Number Format',\n template: 'Template',\n };\n return labels[type];\n }\n\n getAvailableTransformations(): { type: TransformationType; label: string; category?: string }[] {\n return [\n { type: 'direct', label: 'Direct Mapping' },\n { type: 'concat', label: 'Concatenate', category: 'String' },\n { type: 'substring', label: 'Substring', category: 'String' },\n { type: 'replace', label: 'Find & Replace', category: 'String' },\n { type: 'uppercase', label: 'Uppercase', category: 'String' },\n { type: 'lowercase', label: 'Lowercase', category: 'String' },\n { type: 'trim', label: 'Trim', category: 'String' },\n { type: 'mask', label: 'Mask', category: 'String' },\n { type: 'template', label: 'Template', category: 'String' },\n { type: 'dateFormat', label: 'Format Date', category: 'Date' },\n { type: 'extractYear', label: 'Extract Year', category: 'Date' },\n { type: 'extractMonth', label: 'Extract Month', category: 'Date' },\n { type: 'extractDay', label: 'Extract Day', category: 'Date' },\n { type: 'extractHour', label: 'Extract Hour', category: 'Date' },\n { type: 'extractMinute', label: 'Extract Minute', category: 'Date' },\n { type: 'extractSecond', label: 'Extract Second', category: 'Date' },\n { type: 'numberFormat', label: 'Number Format', category: 'Number' },\n ];\n }\n\n // Condition evaluation methods\n evaluateCondition(value: unknown, condition: FilterGroup): boolean {\n return this.evaluateGroup(value, condition);\n }\n\n private evaluateGroup(value: unknown, group: FilterGroup): boolean {\n if (group.children.length === 0) {\n return true; // Empty group is always true\n }\n\n if (group.logic === 'and') {\n return group.children.every(child => this.evaluateItem(value, child));\n } else {\n return group.children.some(child => this.evaluateItem(value, child));\n }\n }\n\n private evaluateItem(value: unknown, item: FilterItem): boolean {\n if (item.type === 'group') {\n return this.evaluateGroup(value, item);\n } else {\n return this.evaluateConditionItem(value, item);\n }\n }\n\n private evaluateConditionItem(value: unknown, condition: FilterCondition): boolean {\n const strValue = String(value ?? '');\n const numValue = Number(value);\n const condValue = condition.value;\n\n switch (condition.operator) {\n case 'equals':\n return strValue === String(condValue);\n case 'notEquals':\n return strValue !== String(condValue);\n case 'contains':\n return strValue.includes(String(condValue));\n case 'notContains':\n return !strValue.includes(String(condValue));\n case 'startsWith':\n return strValue.startsWith(String(condValue));\n case 'endsWith':\n return strValue.endsWith(String(condValue));\n case 'isEmpty':\n return strValue === '' || value === null || value === undefined;\n case 'isNotEmpty':\n return strValue !== '' && value !== null && value !== undefined;\n case 'greaterThan':\n return !isNaN(numValue) && numValue > Number(condValue);\n case 'lessThan':\n return !isNaN(numValue) && numValue < Number(condValue);\n case 'greaterThanOrEqual':\n return !isNaN(numValue) && numValue >= Number(condValue);\n case 'lessThanOrEqual':\n return !isNaN(numValue) && numValue <= Number(condValue);\n case 'isTrue':\n return value === true || strValue.toLowerCase() === 'true';\n case 'isFalse':\n return value === false || strValue.toLowerCase() === 'false';\n default:\n return true;\n }\n }\n\n /**\n * Check if a transformation's condition is met\n */\n isConditionMet(value: unknown, config: TransformationConfig): boolean {\n if (!config.condition?.enabled || !config.condition.root) {\n return true; // No condition means always apply\n }\n return this.evaluateCondition(value, config.condition.root);\n }\n}\n","import { Injectable } from '@angular/core';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface ConnectionPath {\n id: string;\n mappingId: string;\n path: string;\n sourcePoints: Point[];\n targetPoint: Point;\n midPoint: Point;\n isSelected: boolean;\n hasTransformation: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SvgConnectorService {\n createBezierPath(start: Point, end: Point): string {\n const dx = end.x - start.x;\n const controlPointOffset = Math.min(Math.abs(dx) * 0.5, 150);\n\n const cp1x = start.x + controlPointOffset;\n const cp1y = start.y;\n const cp2x = end.x - controlPointOffset;\n const cp2y = end.y;\n\n return `M ${start.x} ${start.y} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${end.x} ${end.y}`;\n }\n\n createMultiSourcePath(sources: Point[], target: Point): { paths: string[]; mergePoint: Point } {\n const mergeX = target.x - 80;\n const mergeY = target.y;\n const mergePoint = { x: mergeX, y: mergeY };\n\n const paths = sources.map((source) => {\n // Path from source to merge point\n const dx1 = mergeX - source.x;\n const cp1Offset = Math.min(Math.abs(dx1) * 0.4, 100);\n\n return `M ${source.x} ${source.y} C ${source.x + cp1Offset} ${source.y}, ${mergeX - cp1Offset} ${mergeY}, ${mergeX} ${mergeY}`;\n });\n\n // Add path from merge point to target\n const finalPath = `M ${mergeX} ${mergeY} L ${target.x} ${target.y}`;\n paths.push(finalPath);\n\n return { paths, mergePoint };\n }\n\n getMidPoint(start: Point, end: Point): Point {\n return {\n x: (start.x + end.x) / 2,\n y: (start.y + end.y) / 2,\n };\n }\n\n getMultiSourceMidPoint(sources: Point[], target: Point): Point {\n const mergeX = target.x - 80;\n return {\n x: mergeX,\n y: target.y,\n };\n }\n\n calculateConnectionPoint(\n rect: DOMRect,\n side: 'source' | 'target',\n containerRect: DOMRect\n ): Point {\n const relativeY = rect.top - containerRect.top + rect.height / 2;\n // Offset to position endpoint circles outside the schema panels\n const endpointOffset = 8;\n\n if (side === 'source') {\n return {\n x: rect.right - containerRect.left + endpointOffset,\n y: relativeY,\n };\n } else {\n return {\n x: rect.left - containerRect.left - endpointOffset,\n y: relativeY,\n };\n }\n }\n\n isPointNearPath(\n point: Point,\n pathStart: Point,\n pathEnd: Point,\n threshold: number = 10\n ): boolean {\n // Simplified hit detection using distance to line segment\n const A = point.x - pathStart.x;\n const B = point.y - pathStart.y;\n const C = pathEnd.x - pathStart.x;\n const D = pathEnd.y - pathStart.y;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n let param = -1;\n\n if (lenSq !== 0) {\n param = dot / lenSq;\n }\n\n let xx: number, yy: number;\n\n if (param < 0) {\n xx = pathStart.x;\n yy = pathStart.y;\n } else if (param > 1) {\n xx = pathEnd.x;\n yy = pathEnd.y;\n } else {\n xx = pathStart.x + param * C;\n yy = pathStart.y + param * D;\n }\n\n const dx = point.x - xx;\n const dy = point.y - yy;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n return distance <= threshold;\n }\n\n createDragPath(start: Point, end: Point): string {\n return this.createBezierPath(start, end);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SchemaField, SchemaDefinition } from '../models/schema.model';\nimport { JsonSchema } from '../models/json-schema.model';\n\n// Extended schema document with filtering options\nexport interface SchemaDocument extends JsonSchema {\n $ref?: string;\n $defs?: Record<string, JsonSchema>; // Alternative to definitions\n exclude?: string[];\n include?: string[];\n}\n\nexport interface ModelRegistry {\n [modelName: string]: JsonSchema;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SchemaParserService {\n private modelRegistry: ModelRegistry = {};\n private idCounter = 0;\n\n registerModels(models: ModelRegistry): void {\n this.modelRegistry = { ...this.modelRegistry, ...models };\n }\n\n clearRegistry(): void {\n this.modelRegistry = {};\n }\n\n parseSchema(\n schemaJson: string | SchemaDocument,\n schemaName: string = 'Schema'\n ): SchemaDefinition {\n const schema: SchemaDocument =\n typeof schemaJson === 'string' ? JSON.parse(schemaJson) : schemaJson;\n\n this.idCounter = 0;\n\n // Extract definitions from the schema document itself\n const localDefs = schema.$defs || schema.definitions || {};\n const combinedRegistry = { ...this.modelRegistry, ...localDefs };\n\n let resolvedSchema: JsonSchema;\n\n if (schema.$ref) {\n // Resolve the reference\n resolvedSchema = this.resolveRef(schema.$ref, combinedRegistry);\n } else if (schema.properties) {\n // Direct schema with properties\n resolvedSchema = schema as JsonSchema;\n } else {\n throw new Error('Schema must have either $ref or properties');\n }\n\n // Build fields from the resolved schema\n let fields = this.buildFields(resolvedSchema, combinedRegistry, '');\n\n // Apply exclude filter\n if (schema.exclude && schema.exclude.length > 0) {\n fields = this.applyExclude(fields, schema.exclude);\n }\n\n // Apply include filter (only if specified)\n if (schema.include && schema.include.length > 0) {\n fields = this.applyInclude(fields, schema.include);\n }\n\n return {\n name: schema.title || schemaName,\n fields,\n };\n }\n\n private resolveRef(\n ref: string,\n registry: Record<string, JsonSchema>\n ): JsonSchema {\n // Handle different ref formats:\n // #model, #/definitions/model, #/$defs/model, model\n let modelName: string;\n\n if (ref.startsWith('#/$defs/')) {\n modelName = ref.substring(8);\n } else if (ref.startsWith('#/definitions/')) {\n modelName = ref.substring(14);\n } else if (ref.startsWith('#')) {\n modelName = ref.substring(1);\n } else {\n modelName = ref;\n }\n\n const resolved = registry[modelName];\n if (!resolved) {\n throw new Error(`Cannot resolve reference: ${ref}. Model \"${modelName}\" not found in registry.`);\n }\n\n // If the resolved schema also has a $ref, resolve it recursively\n if (resolved.$ref) {\n return this.resolveRef(resolved.$ref, registry);\n }\n\n return resolved;\n }\n\n private buildFields(\n schema: JsonSchema,\n registry: Record<string, JsonSchema>,\n parentPath: string,\n arrayContext?: { isArrayItem: boolean; parentArrayPath: string }\n ): SchemaField[] {\n const fields: SchemaField[] = [];\n\n if (!schema.properties) {\n return fields;\n }\n\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n const path = parentPath ? `${parentPath}.${name}` : name;\n const field = this.buildField(name, propSchema, registry, path, arrayContext);\n fields.push(field);\n }\n\n return fields;\n }\n\n private buildField(\n name: string,\n schema: JsonSchema,\n registry: Record<string, JsonSchema>,\n path: string,\n arrayContext?: { isArrayItem: boolean; parentArrayPath: string }\n ): SchemaField {\n // Resolve $ref if present\n let resolvedSchema = schema;\n if (schema.$ref) {\n resolvedSchema = { ...this.resolveRef(schema.$ref, registry), ...schema };\n delete resolvedSchema.$ref;\n }\n\n const fieldType = this.mapType(resolvedSchema);\n const field: SchemaField = {\n id: `field-${++this.idCounter}-${name}`,\n name,\n type: fieldType,\n path,\n description: resolvedSchema.description,\n isArrayItem: arrayContext?.isArrayItem,\n parentArrayPath: arrayContext?.parentArrayPath,\n };\n\n // Handle nested objects\n if (fieldType === 'object' && resolvedSchema.properties) {\n field.children = this.buildFields(resolvedSchema, registry, path, arrayContext);\n field.expanded = true;\n }\n\n // Handle arrays with object items\n if (fieldType === 'array' && resolvedSchema.items) {\n let itemSchema = resolvedSchema.items;\n if (itemSchema.$ref) {\n itemSchema = this.resolveRef(itemSchema.$ref, registry);\n }\n if (itemSchema.properties) {\n // Mark children as array items with reference to parent array\n field.children = this.buildFields(itemSchema, registry, `${path}[]`, {\n isArrayItem: true,\n parentArrayPath: path,\n });\n field.expanded = true;\n }\n }\n\n return field;\n }\n\n private mapType(\n schema: JsonSchema\n ): 'string' | 'number' | 'boolean' | 'object' | 'array' | 'date' {\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n const format = schema.format;\n\n // Check format first for date types\n if (format === 'date' || format === 'date-time' || format === 'time') {\n return 'date';\n }\n\n switch (type) {\n case 'string':\n return 'string';\n case 'number':\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'object':\n return 'object';\n case 'array':\n return 'array';\n default:\n // If type is not specified but has properties, it's an object\n if (schema.properties) {\n return 'object';\n }\n return 'string';\n }\n }\n\n private applyExclude(fields: SchemaField[], exclude: string[]): SchemaField[] {\n return fields\n .filter((field) => !exclude.includes(field.name) && !exclude.includes(field.path))\n .map((field) => {\n if (field.children) {\n // Filter nested fields by checking both full path and relative name\n const filteredChildren = this.applyExclude(field.children, exclude);\n return { ...field, children: filteredChildren };\n }\n return field;\n });\n }\n\n private applyInclude(fields: SchemaField[], include: string[]): SchemaField[] {\n return fields\n .filter((field) => {\n // Include if field name or path matches\n if (include.includes(field.name) || include.includes(field.path)) {\n return true;\n }\n // Include if any child path matches\n if (field.children) {\n return this.hasIncludedChild(field.children, include);\n }\n return false;\n })\n .map((field) => {\n if (field.children) {\n // Keep parent but filter children\n const filteredChildren = this.applyInclude(field.children, include);\n return { ...field, children: filteredChildren.length > 0 ? filteredChildren : field.children };\n }\n return field;\n });\n }\n\n private hasIncludedChild(fields: SchemaField[], include: string[]): boolean {\n return fields.some((field) => {\n if (include.includes(field.name) || include.includes(field.path)) {\n return true;\n }\n if (field.children) {\n return this.hasIncludedChild(field.children, include);\n }\n return false;\n });\n }\n\n // Utility method to create a schema document from model name\n createSchemaFromRef(\n modelRef: string,\n options?: { exclude?: string[]; include?: string[]; title?: string }\n ): SchemaDocument {\n return {\n $ref: modelRef,\n title: options?.title,\n exclude: options?.exclude,\n include: options?.include,\n };\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n ViewChildren,\n QueryList,\n AfterViewInit,\n OnDestroy,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SchemaField, FieldMapping, DefaultValue } from '../../models/schema.model';\nimport { MappingService } from '../../services/mapping.service';\n\nexport interface FieldPositionEvent {\n field: SchemaField;\n element: HTMLElement;\n rect: DOMRect;\n}\n\n@Component({\n selector: 'schema-tree',\n standalone: true,\n imports: [CommonModule, MatIconModule, MatTooltipModule],\n templateUrl: './schema-tree.component.html',\n styleUrl: './schema-tree.component.scss',\n})\nexport class SchemaTreeComponent implements AfterViewInit, OnDestroy {\n @Input() schema!: { name: string; fields: SchemaField[] };\n @Input() side: 'source' | 'target' = 'source';\n @Input() mappings: FieldMapping[] = [];\n @Input() defaultValues: DefaultValue[] = [];\n @Input() showSchemaName: boolean = true;\n\n @Output() fieldDragStart = new EventEmitter<FieldPositionEvent>();\n @Output() fieldDragEnd = new EventEmitter<void>();\n @Output() fieldDrop = new EventEmitter<FieldPositionEvent>();\n @Output() sourceDrop = new EventEmitter<FieldPositionEvent>(); // For endpoint dragging - drop on source field\n @Output() fieldPositionsChanged = new EventEmitter<Map<string, DOMRect>>();\n @Output() fieldDefaultValueClick = new EventEmitter<FieldPositionEvent>();\n\n @ViewChild('schemaFields') schemaFieldsContainer!: ElementRef<HTMLDivElement>;\n @ViewChildren('fieldItem') fieldItems!: QueryList<ElementRef>;\n\n private mappingService = inject(MappingService);\n private resizeObserver!: ResizeObserver;\n private scrollHandler = () => this.onScroll();\n\n ngAfterViewInit(): void {\n this.emitFieldPositions();\n\n this.resizeObserver = new ResizeObserver(() => {\n this.emitFieldPositions();\n });\n\n this.fieldItems.changes.subscribe(() => {\n this.emitFieldPositions();\n });\n\n // Add scroll listener to update connector positions\n if (this.schemaFieldsContainer?.nativeElement) {\n this.schemaFieldsContainer.nativeElement.addEventListener('scroll', this.scrollHandler, { passive: true });\n }\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.schemaFieldsContainer?.nativeElement) {\n this.schemaFieldsContainer.nativeElement.removeEventListener('scroll', this.scrollHandler);\n }\n }\n\n onScroll(): void {\n this.emitFieldPositions();\n }\n\n emitFieldPositions(): void {\n setTimeout(() => {\n const positions = new Map<string, DOMRect>();\n this.fieldItems.forEach((item) => {\n const fieldId = item.nativeElement.getAttribute('data-field-id');\n if (fieldId) {\n positions.set(fieldId, item.nativeElement.getBoundingClientRect());\n }\n });\n this.fieldPositionsChanged.emit(positions);\n });\n }\n\n toggleExpand(field: SchemaField, event: Event): void {\n event.stopPropagation();\n field.expanded = !field.expanded;\n setTimeout(() => this.emitFieldPositions(), 50);\n }\n\n onDragStart(event: MouseEvent, field: SchemaField): void {\n if (this.side !== 'source') return;\n\n // Don't start new drag if endpoint dragging is in progress\n const dragState = this.mappingService.currentDragState();\n if (dragState.isDragging) return;\n\n const element = event.currentTarget as HTMLElement;\n const rect = element.getBoundingClientRect();\n\n this.fieldDragStart.emit({ field, element, rect });\n }\n\n isEndpointDragMode(): boolean {\n const dragState = this.mappingService.currentDragState();\n return dragState.isDragging && (dragState.dragMode === 'move-source' || dragState.dragMode === 'move-target');\n }\n\n isSourceEndpointDragging(): boolean {\n const dragState = this.mappingService.currentDragState();\n return dragState.isDragging && dragState.dragMode === 'move-source';\n }\n\n isTargetEndpointDragging(): boolean {\n const dragState = this.mappingService.currentDragState();\n return dragState.isDragging && dragState.dragMode === 'move-target';\n }\n\n onDragOver(event: DragEvent): void {\n if (this.side === 'target') {\n event.preventDefault();\n }\n }\n\n onDrop(event: MouseEvent, field: SchemaField): void {\n const element = event.currentTarget as HTMLElement;\n const rect = element.getBoundingClientRect();\n\n // Check if endpoint dragging is in progress (via MappingService drag state)\n const dragState = this.mappingService.currentDragState();\n\n // Handle source drop during endpoint dragging (moving source endpoint)\n if (this.side === 'source' && dragState.isDragging && dragState.dragMode === 'move-source') {\n this.sourceDrop.emit({ field, element, rect });\n return;\n }\n\n // Handle target drop (either endpoint dragging or new mapping)\n if (this.side === 'target') {\n this.fieldDrop.emit({ field, element, rect });\n }\n }\n\n getTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n string: 'text_fields',\n number: 'pin',\n boolean: 'toggle_on',\n object: 'data_object',\n array: 'data_array',\n date: 'calendar_today',\n };\n return icons[type] || 'help_outline';\n }\n\n isFieldMapped(field: SchemaField): boolean {\n if (this.side === 'source') {\n return this.mappings.some((m) =>\n m.sourceFields.some((sf) => sf.id === field.id)\n );\n } else {\n return this.mappings.some((m) => m.targetField.id === field.id);\n }\n }\n\n getFieldMappingCount(field: SchemaField): number {\n if (this.side === 'source') {\n return this.mappings.filter((m) =>\n m.sourceFields.some((sf) => sf.id === field.id)\n ).length;\n } else {\n const mapping = this.mappings.find((m) => m.targetField.id === field.id);\n return mapping ? mapping.sourceFields.length : 0;\n }\n }\n\n hasDefaultValue(field: SchemaField): boolean {\n return this.defaultValues.some(d => d.targetField.id === field.id);\n }\n\n getDefaultValueDisplay(field: SchemaField): string {\n const defaultValue = this.defaultValues.find(d => d.targetField.id === field.id);\n if (!defaultValue || defaultValue.value === null) return '';\n\n if (defaultValue.targetField.type === 'date' && defaultValue.value) {\n return new Date(defaultValue.value as string).toLocaleDateString();\n }\n return String(defaultValue.value);\n }\n\n onFieldClick(event: MouseEvent, field: SchemaField): void {\n // Only handle clicks on target fields that are leaf nodes (no children) or have specific types\n if (this.side !== 'target') return;\n if (field.type === 'object' || field.type === 'array') return;\n\n // Don't trigger if the field is already mapped (unless it has a default value)\n if (this.isFieldMapped(field) && !this.hasDefaultValue(field)) return;\n\n // Allow clicking on unmapped fields OR fields with default values (to edit them)\n if (!this.isFieldMapped(field) || this.hasDefaultValue(field)) {\n event.stopPropagation();\n\n const element = event.currentTarget as HTMLElement;\n const rect = element.getBoundingClientRect();\n\n this.fieldDefaultValueClick.emit({ field, element, rect });\n }\n }\n\n trackByFieldId(index: number, field: SchemaField): string {\n return field.id;\n }\n}\n","<div class=\"schema-tree\" [class.source]=\"side === 'source'\" [class.target]=\"side === 'target'\">\n <div class=\"schema-header\">\n @if (showSchemaName) {\n <span class=\"schema-title\">{{ schema.name }}</span>\n }\n <span class=\"schema-badge\">{{ side === 'source' ? 'Source' : 'Target' }}</span>\n </div>\n\n <div class=\"schema-fields\" #schemaFields>\n <ng-container *ngTemplateOutlet=\"fieldList; context: { fields: schema.fields, level: 0 }\"></ng-container>\n </div>\n</div>\n\n<ng-template #fieldList let-fields=\"fields\" let-level=\"level\">\n @for (field of fields; track trackByFieldId($index, field)) {\n <div\n #fieldItem\n class=\"field-item\"\n [class.mapped]=\"isFieldMapped(field)\"\n [class.has-default]=\"hasDefaultValue(field)\"\n [class.has-children]=\"field.children && field.children.length > 0\"\n [class.expanded]=\"field.expanded\"\n [class.is-array]=\"field.type === 'array'\"\n [class.draggable]=\"side === 'source' && ((!field.children || field.children.length === 0) || field.type === 'array') && !isEndpointDragMode()\"\n [class.droppable]=\"(side === 'target' && ((!field.children || field.children.length === 0) || field.type === 'array' || field.type === 'object')) || (side === 'source' && isSourceEndpointDragging() && ((!field.children || field.children.length === 0) || field.type === 'array'))\"\n [class.endpoint-drop-target]=\"(side === 'source' && isSourceEndpointDragging()) || (side === 'target' && isTargetEndpointDragging())\"\n [class.clickable]=\"side === 'target' && (!isFieldMapped(field) || hasDefaultValue(field)) && field.type !== 'object' && field.type !== 'array'\"\n [style.padding-left.px]=\"16 + level * 20\"\n [attr.data-field-id]=\"field.id\"\n (mousedown)=\"onDragStart($event, field)\"\n (mouseup)=\"onDrop($event, field)\"\n (click)=\"onFieldClick($event, field)\"\n >\n <!-- Expand/Collapse button for nested objects -->\n @if (field.children && field.children.length > 0) {\n <button class=\"expand-btn\" (click)=\"toggleExpand(field, $event)\">\n <mat-icon>{{ field.expanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n </button>\n } @else {\n <span class=\"expand-placeholder\"></span>\n }\n\n <!-- Field type icon -->\n <mat-icon class=\"type-icon\" [matTooltip]=\"field.type\">{{ getTypeIcon(field.type) }}</mat-icon>\n\n <!-- Field name with array indicator -->\n <span class=\"field-name\">{{ field.name }}@if (field.type === 'array') {<span class=\"array-indicator\">[]</span>}</span>\n\n <!-- Mapping indicator -->\n @if (isFieldMapped(field)) {\n <span class=\"mapping-indicator\" [matTooltip]=\"getFieldMappingCount(field) + ' mapping(s)'\">\n <mat-icon>{{ field.type === 'array' ? 'loop' : 'link' }}</mat-icon>\n @if (getFieldMappingCount(field) > 1) {\n <span class=\"mapping-count\">{{ getFieldMappingCount(field) }}</span>\n }\n </span>\n }\n\n <!-- Default value indicator -->\n @if (hasDefaultValue(field)) {\n <span class=\"default-indicator\" [matTooltip]=\"'Default: ' + getDefaultValueDisplay(field)\">\n <mat-icon>edit</mat-icon>\n <span class=\"default-value\">{{ getDefaultValueDisplay(field) }}</span>\n </span>\n }\n\n <!-- Connection point - show for leaf nodes, arrays, and objects (on target for array-to-object) -->\n @if ((!field.children || field.children.length === 0) || field.type === 'array' || (side === 'target' && field.type === 'object')) {\n <div class=\"connection-point\" [class.source]=\"side === 'source'\" [class.target]=\"side === 'target'\" [class.array-point]=\"field.type === 'array'\" [class.object-point]=\"field.type === 'object'\">\n <span class=\"point-dot\"></span>\n </div>\n }\n </div>\n\n <!-- Nested children -->\n @if (field.children && field.children.length > 0 && field.expanded) {\n <div class=\"nested-fields\">\n <ng-container *ngTemplateOutlet=\"fieldList; context: { fields: field.children, level: level + 1 }\"></ng-container>\n </div>\n }\n }\n</ng-template>\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n FilterCondition,\r\n FilterGroup,\r\n FilterItem,\r\n FilterOperator,\r\n} from '../../models/schema.model';\r\n\r\ninterface OperatorOption {\r\n value: FilterOperator;\r\n label: string;\r\n needsValue: boolean;\r\n}\r\n\r\nexport interface ConditionField {\r\n path: string;\r\n name: string;\r\n type: 'string' | 'number' | 'boolean';\r\n}\r\n\r\n@Component({\r\n selector: 'condition-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n MatFormFieldModule,\r\n MatRadioModule,\r\n MatSlideToggleModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './condition-builder.component.html',\r\n styleUrl: './condition-builder.component.scss',\r\n})\r\nexport class ConditionBuilderComponent implements OnInit {\r\n // Available fields for conditions (optional - if not provided, uses 'value' as the only field)\r\n @Input() fields: ConditionField[] = [];\r\n\r\n // The condition group to edit\r\n @Input() condition: FilterGroup | null = null;\r\n\r\n // Whether to show a compact/inline version\r\n @Input() compact = false;\r\n\r\n // Emits when condition changes\r\n @Output() conditionChange = new EventEmitter<FilterGroup>();\r\n\r\n rootGroup!: FilterGroup;\r\n\r\n // Default field for transformation conditions (the input value)\r\n private defaultField: ConditionField = { path: 'value', name: 'Input value', type: 'string' };\r\n\r\n // Operators by type\r\n stringOperators: OperatorOption[] = [\r\n { value: 'equals', label: 'equals', needsValue: true },\r\n { value: 'notEquals', label: 'not equals', needsValue: true },\r\n { value: 'contains', label: 'contains', needsValue: true },\r\n { value: 'notContains', label: 'not contain', needsValue: true },\r\n { value: 'startsWith', label: 'starts with', needsValue: true },\r\n { value: 'endsWith', label: 'ends with', needsValue: true },\r\n { value: 'isEmpty', label: 'is empty', needsValue: false },\r\n { value: 'isNotEmpty', label: 'is not empty', needsValue: false },\r\n ];\r\n\r\n numberOperators: OperatorOption[] = [\r\n { value: 'equals', label: 'equals', needsValue: true },\r\n { value: 'notEquals', label: 'not equals', needsValue: true },\r\n { value: 'greaterThan', label: '>', needsValue: true },\r\n { value: 'lessThan', label: '<', needsValue: true },\r\n { value: 'greaterThanOrEqual', label: '>=', needsValue: true },\r\n { value: 'lessThanOrEqual', label: '<=', needsValue: true },\r\n ];\r\n\r\n booleanOperators: OperatorOption[] = [\r\n { value: 'isTrue', label: 'is true', needsValue: false },\r\n { value: 'isFalse', label: 'is false', needsValue: false },\r\n ];\r\n\r\n ngOnInit(): void {\r\n if (this.condition) {\r\n this.rootGroup = this.cloneGroup(this.condition);\r\n } else {\r\n this.rootGroup = this.createEmptyGroup();\r\n }\r\n }\r\n\r\n get availableFields(): ConditionField[] {\r\n return this.fields.length > 0 ? this.fields : [this.defaultField];\r\n }\r\n\r\n get showFieldSelector(): boolean {\r\n return this.fields.length > 1;\r\n }\r\n\r\n private createEmptyGroup(): FilterGroup {\r\n return {\r\n id: this.generateId(),\r\n type: 'group',\r\n logic: 'and',\r\n children: [],\r\n };\r\n }\r\n\r\n private generateId(): string {\r\n return `cond-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private cloneGroup(group: FilterGroup): FilterGroup {\r\n return {\r\n ...group,\r\n children: group.children.map((child) =>\r\n child.type === 'group' ? this.cloneGroup(child) : { ...child }\r\n ),\r\n };\r\n }\r\n\r\n getOperatorsForField(fieldPath: string): OperatorOption[] {\r\n const field = this.availableFields.find((f) => f.path === fieldPath);\r\n if (!field) return this.stringOperators;\r\n\r\n switch (field.type) {\r\n case 'number':\r\n return this.numberOperators;\r\n case 'boolean':\r\n return this.booleanOperators;\r\n default:\r\n return this.stringOperators;\r\n }\r\n }\r\n\r\n operatorNeedsValue(operator: FilterOperator): boolean {\r\n const allOperators = [...this.stringOperators, ...this.numberOperators, ...this.booleanOperators];\r\n const op = allOperators.find((o) => o.value === operator);\r\n return op?.needsValue ?? true;\r\n }\r\n\r\n isCondition(item: FilterItem): item is FilterCondition {\r\n return item.type === 'condition';\r\n }\r\n\r\n isGroup(item: FilterItem): item is FilterGroup {\r\n return item.type === 'group';\r\n }\r\n\r\n addCondition(group: FilterGroup): void {\r\n const firstField = this.availableFields[0];\r\n const newCondition: FilterCondition = {\r\n id: this.generateId(),\r\n type: 'condition',\r\n field: firstField.path,\r\n fieldName: firstField.name,\r\n operator: 'isNotEmpty',\r\n value: '',\r\n valueType: firstField.type,\r\n };\r\n group.children = [...group.children, newCondition];\r\n this.emitChange();\r\n }\r\n\r\n addGroup(parentGroup: FilterGroup): void {\r\n const newGroup: FilterGroup = {\r\n id: this.generateId(),\r\n type: 'group',\r\n logic: parentGroup.logic === 'and' ? 'or' : 'and',\r\n children: [],\r\n };\r\n parentGroup.children = [...parentGroup.children, newGroup];\r\n this.emitChange();\r\n }\r\n\r\n removeItem(parentGroup: FilterGroup, itemId: string): void {\r\n parentGroup.children = parentGroup.children.filter((c) => c.id !== itemId);\r\n this.emitChange();\r\n }\r\n\r\n onFieldChange(condition: FilterCondition, fieldPath: string): void {\r\n const field = this.availableFields.find((f) => f.path === fieldPath);\r\n if (field) {\r\n condition.field = fieldPath;\r\n condition.fieldName = field.name;\r\n condition.valueType = field.type;\r\n const operators = this.getOperatorsForField(fieldPath);\r\n condition.operator = operators[0].value;\r\n condition.value = '';\r\n }\r\n this.emitChange();\r\n }\r\n\r\n onOperatorChange(condition: FilterCondition, operator: FilterOperator): void {\r\n condition.operator = operator;\r\n if (!this.operatorNeedsValue(operator)) {\r\n condition.value = '';\r\n }\r\n this.emitChange();\r\n }\r\n\r\n onValueChange(condition: FilterCondition, value: string | boolean): void {\r\n if (condition.valueType === 'number') {\r\n condition.value = parseFloat(value as string) || 0;\r\n } else {\r\n condition.value = value;\r\n }\r\n this.emitChange();\r\n }\r\n\r\n onLogicChange(group: FilterGroup, logic: 'and' | 'or'): void {\r\n group.logic = logic;\r\n this.emitChange();\r\n }\r\n\r\n private emitChange(): void {\r\n this.rootGroup = this.cloneGroup(this.rootGroup);\r\n this.conditionChange.emit(this.rootGroup);\r\n }\r\n\r\n getConditionSummary(): string {\r\n return this.summarizeGroup(this.rootGroup);\r\n }\r\n\r\n private summarizeGroup(group: FilterGroup): string {\r\n if (group.children.length === 0) return '';\r\n\r\n const parts = group.children.map(child => {\r\n if (child.type === 'condition') {\r\n return this.summarizeCondition(child);\r\n } else {\r\n return `(${this.summarizeGroup(child)})`;\r\n }\r\n });\r\n\r\n return parts.join(` ${group.logic.toUpperCase()} `);\r\n }\r\n\r\n private summarizeCondition(cond: FilterCondition): string {\r\n const opLabel = this.getOperatorLabel(cond.operator);\r\n if (this.operatorNeedsValue(cond.operator)) {\r\n return `${opLabel} \"${cond.value}\"`;\r\n }\r\n return opLabel;\r\n }\r\n\r\n private getOperatorLabel(operator: FilterOperator): string {\r\n const allOperators = [...this.stringOperators, ...this.numberOperators, ...this.booleanOperators];\r\n const op = allOperators.find((o) => o.value === operator);\r\n return op?.label || operator;\r\n }\r\n}\r\n","<div class=\"condition-builder\" [class.compact]=\"compact\">\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: rootGroup, isRoot: true }\"></ng-container>\r\n</div>\r\n\r\n<!-- Recursive group template -->\r\n<ng-template #groupTemplate let-group=\"group\" let-isRoot=\"isRoot\" let-parentGroup=\"parentGroup\">\r\n <div class=\"filter-group\" [class.root-group]=\"isRoot\" [class.nested-group]=\"!isRoot\">\r\n <!-- Group header with logic toggle (only show if multiple children or nested) -->\r\n @if (group.children.length > 1 || !isRoot) {\r\n <div class=\"group-header\">\r\n <div class=\"logic-toggle\">\r\n <button\r\n type=\"button\"\r\n class=\"logic-btn\"\r\n [class.active]=\"group.logic === 'and'\"\r\n (click)=\"onLogicChange(group, 'and')\"\r\n >\r\n AND\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"logic-btn\"\r\n [class.active]=\"group.logic === 'or'\"\r\n (click)=\"onLogicChange(group, 'or')\"\r\n >\r\n OR\r\n </button>\r\n </div>\r\n @if (!isRoot) {\r\n <button mat-icon-button class=\"remove-group-btn\" matTooltip=\"Remove group\" (click)=\"removeItem(parentGroup, group.id)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Group children -->\r\n <div class=\"group-children\">\r\n @for (item of group.children; track item.id; let i = $index) {\r\n <!-- Logic connector between items -->\r\n @if (i > 0) {\r\n <div class=\"logic-connector\">\r\n <span class=\"logic-badge\" [class.and]=\"group.logic === 'and'\" [class.or]=\"group.logic === 'or'\">\r\n {{ group.logic | uppercase }}\r\n </span>\r\n </div>\r\n }\r\n\r\n @if (isCondition(item)) {\r\n <!-- Condition row -->\r\n <div class=\"condition-row\">\r\n <!-- Field selector (only if multiple fields) -->\r\n @if (showFieldSelector) {\r\n <mat-form-field appearance=\"outline\" class=\"field-select\">\r\n <mat-select [value]=\"item.field\" (selectionChange)=\"onFieldChange(item, $event.value)\">\r\n @for (field of availableFields; track field.path) {\r\n <mat-option [value]=\"field.path\">{{ field.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- Operator selector -->\r\n <mat-form-field appearance=\"outline\" class=\"operator-select\">\r\n <mat-select [value]=\"item.operator\" (selectionChange)=\"onOperatorChange(item, $event.value)\">\r\n @for (op of getOperatorsForField(item.field); track op.value) {\r\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Value input (only if operator needs value) -->\r\n @if (operatorNeedsValue(item.operator)) {\r\n @if (item.valueType === 'boolean') {\r\n <mat-slide-toggle\r\n [checked]=\"item.value === true\"\r\n (change)=\"onValueChange(item, $event.checked)\"\r\n class=\"bool-toggle\"\r\n >\r\n </mat-slide-toggle>\r\n } @else if (item.valueType === 'number') {\r\n <mat-form-field appearance=\"outline\" class=\"value-input\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [value]=\"item.value\"\r\n (input)=\"onValueChange(item, $any($event.target).value)\"\r\n placeholder=\"value\"\r\n />\r\n </mat-form-field>\r\n } @else {\r\n <mat-form-field appearance=\"outline\" class=\"value-input\">\r\n <input\r\n matInput\r\n type=\"text\"\r\n [value]=\"item.value\"\r\n (input)=\"onValueChange(item, $any($event.target).value)\"\r\n placeholder=\"value\"\r\n />\r\n </mat-form-field>\r\n }\r\n }\r\n\r\n <!-- Remove condition button -->\r\n <button mat-icon-button class=\"remove-btn\" matTooltip=\"Remove\" (click)=\"removeItem(group, item.id)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n } @else if (isGroup(item)) {\r\n <!-- Nested group -->\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: item, isRoot: false, parentGroup: group }\"></ng-container>\r\n }\r\n }\r\n\r\n <!-- Empty state -->\r\n @if (group.children.length === 0) {\r\n <div class=\"empty-group\">\r\n <span>No conditions defined</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Group actions -->\r\n <div class=\"group-actions\">\r\n <button type=\"button\" class=\"add-btn\" (click)=\"addCondition(group)\">\r\n <mat-icon>add</mat-icon>\r\n @if (!compact) {\r\n <span>Add condition</span>\r\n }\r\n </button>\r\n @if (!compact && group.children.length > 0) {\r\n <button type=\"button\" class=\"add-btn add-group-btn\" (click)=\"addGroup(group)\">\r\n <mat-icon>folder_open</mat-icon>\r\n <span>Add group</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport {\n FieldMapping,\n FilterGroup,\n TransformationConfig,\n TransformationType,\n} from '../../models/schema.model';\nimport { ConditionBuilderComponent } from '../condition-builder/condition-builder.component';\nimport { TransformationService } from '../../services/transformation.service';\n\n@Component({\n selector: 'transformation-popover',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatIconModule,\n MatButtonModule,\n MatSelectModule,\n MatInputModule,\n MatFormFieldModule,\n MatTooltipModule,\n MatCheckboxModule,\n DragDropModule,\n ConditionBuilderComponent,\n ],\n templateUrl: './transformation-popover.component.html',\n styleUrl: './transformation-popover.component.scss',\n})\nexport class TransformationPopoverComponent implements OnInit, OnChanges {\n @Input() mapping!: FieldMapping;\n @Input() position: { x: number; y: number } = { x: 0, y: 0 };\n @Input() sampleData: Record<string, unknown> = {};\n\n @Output() save = new EventEmitter<TransformationConfig[]>();\n @Output() delete = new EventEmitter<void>();\n @Output() close = new EventEmitter<void>();\n\n private transformationService = inject(TransformationService);\n\n // Array of transformation steps\n steps: TransformationConfig[] = [];\n\n // Preview results for each step\n stepPreviews: string[] = [];\n // Input values for each step (to show input → output)\n stepInputs: string[] = [];\n finalPreview: string = '';\n\n // Track which step is expanded (-1 means none, used in single-step mode)\n expandedStepIndex: number = -1;\n\n availableTransformations = this.transformationService.getAvailableTransformations();\n\n ngOnInit(): void {\n this.initFromMapping();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['mapping'] || changes['sampleData']) {\n this.initFromMapping();\n }\n }\n\n private initFromMapping(): void {\n if (this.mapping) {\n // Copy transformations array, with fallback for empty/undefined\n if (this.mapping.transformations && this.mapping.transformations.length > 0) {\n this.steps = this.mapping.transformations.map(t => ({ ...t }));\n } else {\n // Fallback to a single direct transformation\n this.steps = [{ type: 'direct' }];\n }\n this.updatePreview();\n }\n }\n\n // Check if we're in multi-step mode (more than one step)\n get isMultiStep(): boolean {\n return this.steps.length > 1;\n }\n\n onStepTypeChange(index: number): void {\n const step = this.steps[index];\n\n // Set defaults based on type\n switch (step.type) {\n case 'concat':\n step.separator = step.separator ?? ' ';\n step.template = step.template ?? this.getDefaultTemplate();\n break;\n case 'substring':\n step.startIndex = step.startIndex ?? 0;\n step.endIndex = step.endIndex ?? 10;\n break;\n case 'replace':\n step.searchValue = step.searchValue ?? '';\n step.replaceValue = step.replaceValue ?? '';\n break;\n case 'dateFormat':\n step.outputFormat = step.outputFormat ?? 'YYYY-MM-DD';\n break;\n case 'numberFormat':\n step.decimalPlaces = step.decimalPlaces ?? 2;\n break;\n case 'mask':\n step.pattern = step.pattern ?? '(###) ###-####';\n break;\n }\n\n this.updatePreview();\n }\n\n private getDefaultTemplate(): string {\n return this.mapping.sourceFields.map((_, i) => `{${i}}`).join(' ');\n }\n\n addStep(): void {\n this.steps.push({ type: 'direct' });\n // Expand the newly added step\n this.expandedStepIndex = this.steps.length - 1;\n this.updatePreview();\n }\n\n removeStep(index: number): void {\n if (this.steps.length > 1) {\n this.steps.splice(index, 1);\n // Collapse after deletion\n this.expandedStepIndex = -1;\n this.updatePreview();\n }\n }\n\n onStepDrop(event: CdkDragDrop<TransformationConfig[]>): void {\n if (event.previousIndex !== event.currentIndex) {\n moveItemInArray(this.steps, event.previousIndex, event.currentIndex);\n // Move expanded index with the step\n if (this.expandedStepIndex === event.previousIndex) {\n this.expandedStepIndex = event.currentIndex;\n } else if (\n this.expandedStepIndex > event.previousIndex &&\n this.expandedStepIndex <= event.currentIndex\n ) {\n this.expandedStepIndex--;\n } else if (\n this.expandedStepIndex < event.previousIndex &&\n this.expandedStepIndex >= event.currentIndex\n ) {\n this.expandedStepIndex++;\n }\n this.updatePreview();\n }\n }\n\n toggleStep(index: number): void {\n if (this.expandedStepIndex === index) {\n this.expandedStepIndex = -1; // Collapse\n } else {\n this.expandedStepIndex = index; // Expand\n }\n }\n\n isStepExpanded(index: number): boolean {\n return this.expandedStepIndex === index;\n }\n\n updatePreview(): void {\n if (!this.mapping || !this.sampleData) {\n this.stepPreviews = [];\n this.stepInputs = [];\n this.finalPreview = '';\n return;\n }\n\n this.stepPreviews = [];\n this.stepInputs = [];\n let currentValue: unknown = null;\n\n // Get initial input from source fields\n const initialValues = this.mapping.sourceFields\n .map(f => this.getValueByPath(this.sampleData, f.path))\n .map(v => String(v ?? ''));\n const initialInput = initialValues.join(', ');\n\n // For the first step, use the source fields from sample data\n for (let i = 0; i < this.steps.length; i++) {\n const step = this.steps[i];\n\n if (i === 0) {\n // First step: input is from source fields\n this.stepInputs.push(initialInput);\n // Check condition before applying transformation\n if (this.transformationService.isConditionMet(initialInput, step)) {\n currentValue = this.transformationService.applyTransformation(\n this.sampleData,\n this.mapping.sourceFields,\n step\n );\n } else {\n currentValue = initialInput; // Pass through if condition not met\n }\n } else {\n // Subsequent steps: input is previous output\n this.stepInputs.push(this.stepPreviews[i - 1]);\n // Check condition before applying transformation\n if (this.transformationService.isConditionMet(currentValue, step)) {\n currentValue = this.transformationService.applyTransformationToValue(\n currentValue,\n step\n );\n }\n // If condition not met, currentValue passes through unchanged\n }\n\n this.stepPreviews.push(String(currentValue ?? ''));\n }\n\n this.finalPreview = this.stepPreviews[this.stepPreviews.length - 1] || '';\n }\n\n private getValueByPath(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((acc: unknown, part) => {\n if (acc && typeof acc === 'object') {\n return (acc as Record<string, unknown>)[part];\n }\n return undefined;\n }, obj);\n }\n\n onConfigChange(): void {\n this.updatePreview();\n }\n\n onSave(): void {\n // Filter out 'direct' transformations if they're not the only one\n const cleanedSteps = this.steps.length === 1\n ? this.steps\n : this.steps.filter(s => s.type !== 'direct');\n\n // If all filtered out, keep at least one direct\n const finalSteps = cleanedSteps.length > 0 ? cleanedSteps : [{ type: 'direct' as TransformationType }];\n\n this.save.emit(finalSteps);\n }\n\n onDelete(): void {\n this.delete.emit();\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n getSourceFieldNames(): string {\n return this.mapping.sourceFields.map((f) => f.name).join(', ');\n }\n\n getPopoverStyle(): Record<string, string> {\n return {\n left: `${this.position.x}px`,\n top: `${this.position.y}px`,\n };\n }\n\n getStepTypeLabel(type: TransformationType): string {\n const t = this.availableTransformations.find(t => t.type === type);\n return t?.label || type;\n }\n\n // Condition methods\n hasCondition(step: TransformationConfig): boolean {\n return step.condition?.enabled === true;\n }\n\n toggleCondition(step: TransformationConfig, enabled: boolean): void {\n if (enabled) {\n if (!step.condition) {\n step.condition = {\n enabled: true,\n root: this.createEmptyConditionGroup(),\n };\n } else {\n step.condition.enabled = true;\n }\n } else {\n if (step.condition) {\n step.condition.enabled = false;\n }\n }\n }\n\n onConditionChange(step: TransformationConfig, group: FilterGroup): void {\n if (step.condition) {\n step.condition.root = group;\n }\n }\n\n private createEmptyConditionGroup(): FilterGroup {\n return {\n id: `cond-${Date.now()}`,\n type: 'group',\n logic: 'and',\n children: [],\n };\n }\n\n getConditionSummary(step: TransformationConfig): string {\n if (!step.condition?.enabled || !step.condition.root) return '';\n return this.summarizeConditionGroup(step.condition.root);\n }\n\n private summarizeConditionGroup(group: FilterGroup): string {\n if (group.children.length === 0) return '';\n\n const parts = group.children.map(child => {\n if (child.type === 'condition') {\n const opLabel = this.getOperatorLabel(child.operator);\n if (['isEmpty', 'isNotEmpty', 'isTrue', 'isFalse'].includes(child.operator)) {\n return opLabel;\n }\n return `${opLabel} \"${child.value}\"`;\n } else {\n return `(${this.summarizeConditionGroup(child)})`;\n }\n });\n\n return parts.join(` ${group.logic.toUpperCase()} `);\n }\n\n private getOperatorLabel(operator: string): string {\n const labels: Record<string, string> = {\n equals: '=',\n notEquals: '!=',\n contains: 'contains',\n notContains: 'not contain',\n startsWith: 'starts with',\n endsWith: 'ends with',\n isEmpty: 'is empty',\n isNotEmpty: 'is not empty',\n greaterThan: '>',\n lessThan: '<',\n greaterThanOrEqual: '>=',\n lessThanOrEqual: '<=',\n isTrue: 'is true',\n isFalse: 'is false',\n };\n return labels[operator] || operator;\n }\n}\n","<div class=\"transformation-popover\" [ngStyle]=\"getPopoverStyle()\">\r\n <div class=\"popover-arrow\"></div>\r\n\r\n <div class=\"popover-header\">\r\n <span class=\"popover-title\">Transformation</span>\r\n <button mat-icon-button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"popover-content\">\r\n <!-- Source/Target Info -->\r\n <div class=\"mapping-info\">\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">Source:</span>\r\n <span class=\"info-value\">{{ getSourceFieldNames() }}</span>\r\n </div>\r\n <div class=\"info-row\">\r\n <span class=\"info-label\">Target:</span>\r\n <span class=\"info-value\">{{ mapping.targetField.name }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Single Step Mode (default, clean UI) -->\r\n @if (!isMultiStep) {\r\n <ng-container *ngTemplateOutlet=\"stepConfig; context: { step: steps[0], index: 0, showHeader: false }\"></ng-container>\r\n\r\n <!-- Preview Section -->\r\n <div class=\"preview-section\">\r\n <span class=\"preview-label\">Preview:</span>\r\n <div class=\"preview-value\">{{ stepPreviews[0] || '(empty)' }}</div>\r\n </div>\r\n }\r\n\r\n <!-- Multi-Step Mode -->\r\n @if (isMultiStep) {\r\n <div class=\"steps-container\" cdkDropList (cdkDropListDropped)=\"onStepDrop($event)\">\r\n @for (step of steps; track $index; let i = $index) {\r\n <div class=\"step-card\" [class.expanded]=\"isStepExpanded(i)\" cdkDrag>\r\n <!-- Collapsed View -->\r\n @if (!isStepExpanded(i)) {\r\n <div class=\"step-collapsed\" (click)=\"toggleStep(i)\">\r\n <mat-icon class=\"drag-handle\" cdkDragHandle (click)=\"$event.stopPropagation()\">drag_indicator</mat-icon>\r\n <div class=\"step-collapsed-header\">\r\n <div class=\"step-title-row\">\r\n <span class=\"step-number\">Step {{ i + 1 }}: {{ getStepTypeLabel(step.type) }}</span>\r\n @if (hasCondition(step)) {\r\n <span class=\"condition-badge\" matTooltip=\"{{ getConditionSummary(step) }}\">\r\n <mat-icon>filter_alt</mat-icon>\r\n if\r\n </span>\r\n }\r\n </div>\r\n <div class=\"step-collapsed-actions\">\r\n <button\r\n mat-icon-button\r\n class=\"expand-btn\"\r\n (click)=\"toggleStep(i); $event.stopPropagation()\"\r\n matTooltip=\"Edit step\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"remove-step-btn\"\r\n (click)=\"removeStep(i); $event.stopPropagation()\"\r\n matTooltip=\"Remove step\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"step-collapsed-preview\">\r\n <span class=\"step-input\">\"{{ (stepInputs[i] || '') | slice:0:20 }}{{ (stepInputs[i] || '').length > 20 ? '...' : '' }}\"</span>\r\n <mat-icon class=\"arrow-icon\">arrow_forward</mat-icon>\r\n <span class=\"step-output\">\"{{ (stepPreviews[i] || '') | slice:0:20 }}{{ (stepPreviews[i] || '').length > 20 ? '...' : '' }}\"</span>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Expanded View -->\r\n @if (isStepExpanded(i)) {\r\n <div class=\"step-expanded\">\r\n <mat-icon class=\"drag-handle\" cdkDragHandle>drag_indicator</mat-icon>\r\n <div class=\"step-header\">\r\n <span class=\"step-number\">Step {{ i + 1 }}</span>\r\n <div class=\"step-header-actions\">\r\n <button\r\n mat-icon-button\r\n class=\"collapse-btn\"\r\n (click)=\"toggleStep(i)\"\r\n matTooltip=\"Collapse\"\r\n >\r\n <mat-icon>expand_less</mat-icon>\r\n </button>\r\n <button\r\n mat-icon-button\r\n class=\"remove-step-btn\"\r\n (click)=\"removeStep(i)\"\r\n matTooltip=\"Remove step\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"step-content\">\r\n <ng-container *ngTemplateOutlet=\"stepConfig; context: { step: step, index: i, showHeader: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Step Preview -->\r\n <div class=\"step-preview\">\r\n <mat-icon class=\"preview-arrow\">arrow_downward</mat-icon>\r\n <span class=\"step-preview-value\">{{ stepPreviews[i] || '(empty)' }}</span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Final Preview -->\r\n <div class=\"preview-section final-preview\">\r\n <span class=\"preview-label\">Final Result:</span>\r\n <div class=\"preview-value\">{{ finalPreview || '(empty)' }}</div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Add Step Button - Always visible -->\r\n <div class=\"add-step-section\">\r\n <button mat-stroked-button class=\"add-step-btn\" (click)=\"addStep()\">\r\n <mat-icon>add</mat-icon>\r\n @if (isMultiStep) {\r\n Add Step\r\n } @else {\r\n Add Transformation Step\r\n }\r\n </button>\r\n </div>\r\n\r\n <div class=\"popover-actions\">\r\n <button mat-button color=\"warn\" (click)=\"onDelete()\" matTooltip=\"Remove this mapping\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n <div class=\"action-spacer\"></div>\r\n <button mat-button (click)=\"onClose()\">Cancel</button>\r\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\">Apply</button>\r\n </div>\r\n</div>\r\n\r\n<!-- Backdrop -->\r\n<div class=\"popover-backdrop\" (click)=\"onClose()\"></div>\r\n\r\n<!-- Step Configuration Template -->\r\n<ng-template #stepConfig let-step=\"step\" let-index=\"index\" let-showHeader=\"showHeader\">\r\n <!-- Transformation Type -->\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Transformation Type</mat-label>\r\n <mat-select [(ngModel)]=\"step.type\" (selectionChange)=\"onStepTypeChange(index)\">\r\n @for (t of availableTransformations; track t.type) {\r\n <mat-option [value]=\"t.type\">{{ t.label }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!-- Type-specific options -->\r\n @switch (step.type) {\r\n @case ('concat') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Separator</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.separator\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n placeholder=\" \"\r\n />\r\n <mat-hint>Join values with this (default: space)</mat-hint>\r\n </mat-form-field>\r\n <div class=\"or-divider\">or use template for custom format</div>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Template</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.template\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n [placeholder]=\"'{0} - {1}'\"\r\n />\r\n <mat-hint>Overrides separator if set</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('substring') {\r\n <div class=\"config-section config-row\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Start Index</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [(ngModel)]=\"step.startIndex\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n min=\"0\"\r\n />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>End Index</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [(ngModel)]=\"step.endIndex\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('replace') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Search For</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.searchValue\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Replace With</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.replaceValue\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('dateFormat') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Output Format</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.outputFormat\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n placeholder=\"YYYY-MM-DD\"\r\n />\r\n <mat-hint>YYYY, MM, DD, HH, mm, ss</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('numberFormat') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Decimal Places</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [(ngModel)]=\"step.decimalPlaces\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n min=\"0\"\r\n />\r\n </mat-form-field>\r\n <div class=\"config-row\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Prefix</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.prefix\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n placeholder=\"$\"\r\n />\r\n </mat-form-field>\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Suffix</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.suffix\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n }\r\n\r\n @case ('mask') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Pattern</mat-label>\r\n <input\r\n matInput\r\n [(ngModel)]=\"step.pattern\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n placeholder=\"(###) ###-####\"\r\n />\r\n <mat-hint># = character from input</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n }\r\n\r\n @case ('template') {\r\n <div class=\"config-section\">\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <mat-label>Template Expression</mat-label>\r\n <textarea\r\n matInput\r\n [(ngModel)]=\"step.template\"\r\n (ngModelChange)=\"onConfigChange()\"\r\n rows=\"3\"\r\n [placeholder]=\"'Hello {0}, your ID is {1}'\"\r\n ></textarea>\r\n @if (index === 0) {\r\n <mat-hint>Use {{ '{' }}0{{ '}' }}, {{ '{' }}1{{ '}' }}, etc. for source fields</mat-hint>\r\n } @else {\r\n <mat-hint>Use {{ '{' }}0{{ '}' }} for the value from previous step</mat-hint>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Condition Section -->\r\n <div class=\"condition-section\">\r\n <mat-checkbox\r\n [checked]=\"hasCondition(step)\"\r\n (change)=\"toggleCondition(step, $event.checked)\"\r\n class=\"condition-checkbox\"\r\n >\r\n Apply conditionally\r\n </mat-checkbox>\r\n\r\n @if (hasCondition(step)) {\r\n <div class=\"condition-content\">\r\n <condition-builder\r\n [condition]=\"step.condition?.root || null\"\r\n [compact]=\"true\"\r\n (conditionChange)=\"onConditionChange(step, $event)\"\r\n ></condition-builder>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n","import { Component, Input, Output, EventEmitter, computed, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport {\n ArrayMapping,\n ArrayFilterConfig,\n FilterCondition,\n FilterGroup,\n FilterItem,\n FilterOperator,\n SchemaField,\n} from '../../models/schema.model';\n\ninterface OperatorOption {\n value: FilterOperator;\n label: string;\n needsValue: boolean;\n}\n\n@Component({\n selector: 'array-filter-modal',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatSelectModule,\n MatInputModule,\n MatFormFieldModule,\n MatRadioModule,\n MatSlideToggleModule,\n MatTooltipModule,\n MatDividerModule,\n ],\n templateUrl: './array-filter-modal.component.html',\n styleUrl: './array-filter-modal.component.scss',\n})\nexport class ArrayFilterModalComponent implements OnInit {\n @Input({ required: true }) arrayMapping!: ArrayMapping;\n @Output() save = new EventEmitter<ArrayFilterConfig | undefined>();\n @Output() close = new EventEmitter<void>();\n\n filterEnabled = signal(false);\n rootGroup = signal<FilterGroup>(this.createEmptyGroup());\n\n // Available fields from the source array's children\n availableFields = computed(() => {\n const fields: { path: string; name: string; type: string }[] = [];\n this.collectFields(this.arrayMapping.sourceArray.children || [], '', fields);\n return fields;\n });\n\n // Operators by type\n stringOperators: OperatorOption[] = [\n { value: 'equals', label: 'equals', needsValue: true },\n { value: 'notEquals', label: 'not equals', needsValue: true },\n { value: 'contains', label: 'contains', needsValue: true },\n { value: 'notContains', label: 'does not contain', needsValue: true },\n { value: 'startsWith', label: 'starts with', needsValue: true },\n { value: 'endsWith', label: 'ends with', needsValue: true },\n { value: 'isEmpty', label: 'is empty', needsValue: false },\n { value: 'isNotEmpty', label: 'is not empty', needsValue: false },\n ];\n\n numberOperators: OperatorOption[] = [\n { value: 'equals', label: 'equals', needsValue: true },\n { value: 'notEquals', label: 'not equals', needsValue: true },\n { value: 'greaterThan', label: 'greater than', needsValue: true },\n { value: 'lessThan', label: 'less than', needsValue: true },\n { value: 'greaterThanOrEqual', label: 'greater or equal', needsValue: true },\n { value: 'lessThanOrEqual', label: 'less or equal', needsValue: true },\n ];\n\n booleanOperators: OperatorOption[] = [\n { value: 'isTrue', label: 'is true', needsValue: false },\n { value: 'isFalse', label: 'is false', needsValue: false },\n ];\n\n ngOnInit(): void {\n // Initialize from existing filter config\n if (this.arrayMapping.filter?.enabled && this.arrayMapping.filter.root) {\n this.filterEnabled.set(true);\n this.rootGroup.set(this.cloneGroup(this.arrayMapping.filter.root));\n }\n }\n\n private createEmptyGroup(): FilterGroup {\n return {\n id: this.generateId(),\n type: 'group',\n logic: 'and',\n children: [],\n };\n }\n\n private generateId(): string {\n return `filter-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cloneGroup(group: FilterGroup): FilterGroup {\n return {\n ...group,\n children: group.children.map((child) =>\n child.type === 'group' ? this.cloneGroup(child) : { ...child }\n ),\n };\n }\n\n private collectFields(\n fields: SchemaField[],\n prefix: string,\n result: { path: string; name: string; type: string }[]\n ): void {\n for (const field of fields) {\n const path = prefix ? `${prefix}.${field.name}` : field.name;\n if (field.type !== 'object' && field.type !== 'array') {\n result.push({ path, name: field.name, type: field.type });\n }\n if (field.children) {\n this.collectFields(field.children, path, result);\n }\n }\n }\n\n getOperatorsForField(fieldPath: string): OperatorOption[] {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n if (!field) return this.stringOperators;\n\n switch (field.type) {\n case 'number':\n return this.numberOperators;\n case 'boolean':\n return this.booleanOperators;\n default:\n return this.stringOperators;\n }\n }\n\n getFieldType(fieldPath: string): string {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n return field?.type || 'string';\n }\n\n operatorNeedsValue(operator: FilterOperator): boolean {\n const allOperators = [...this.stringOperators, ...this.numberOperators, ...this.booleanOperators];\n const op = allOperators.find((o) => o.value === operator);\n return op?.needsValue ?? true;\n }\n\n isCondition(item: FilterItem): item is FilterCondition {\n return item.type === 'condition';\n }\n\n isGroup(item: FilterItem): item is FilterGroup {\n return item.type === 'group';\n }\n\n addCondition(group: FilterGroup): void {\n const fields = this.availableFields();\n const firstField = fields[0];\n const newCondition: FilterCondition = {\n id: this.generateId(),\n type: 'condition',\n field: firstField?.path || '',\n fieldName: firstField?.name || '',\n operator: 'equals',\n value: '',\n valueType: (firstField?.type as 'string' | 'number' | 'boolean') || 'string',\n };\n group.children = [...group.children, newCondition];\n this.triggerUpdate();\n }\n\n addGroup(parentGroup: FilterGroup): void {\n const newGroup: FilterGroup = {\n id: this.generateId(),\n type: 'group',\n logic: parentGroup.logic === 'and' ? 'or' : 'and', // Default to opposite logic\n children: [],\n };\n parentGroup.children = [...parentGroup.children, newGroup];\n this.triggerUpdate();\n }\n\n removeItem(parentGroup: FilterGroup, itemId: string): void {\n parentGroup.children = parentGroup.children.filter((c) => c.id !== itemId);\n this.triggerUpdate();\n }\n\n onFieldChange(condition: FilterCondition, fieldPath: string): void {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n if (field) {\n condition.field = fieldPath;\n condition.fieldName = field.name;\n condition.valueType = field.type as 'string' | 'number' | 'boolean';\n // Reset operator to first valid option for new type\n const operators = this.getOperatorsForField(fieldPath);\n condition.operator = operators[0].value;\n condition.value = '';\n }\n this.triggerUpdate();\n }\n\n onOperatorChange(condition: FilterCondition, operator: FilterOperator): void {\n condition.operator = operator;\n if (!this.operatorNeedsValue(operator)) {\n condition.value = '';\n }\n this.triggerUpdate();\n }\n\n onValueChange(condition: FilterCondition, value: string | boolean): void {\n if (condition.valueType === 'number') {\n condition.value = parseFloat(value as string) || 0;\n } else {\n condition.value = value;\n }\n this.triggerUpdate();\n }\n\n onLogicChange(group: FilterGroup, logic: 'and' | 'or'): void {\n group.logic = logic;\n this.triggerUpdate();\n }\n\n private triggerUpdate(): void {\n // Trigger signal update by creating a new reference\n this.rootGroup.set(this.cloneGroup(this.rootGroup()));\n }\n\n hasConditions(group: FilterGroup): boolean {\n return group.children.length > 0;\n }\n\n countConditions(group: FilterGroup): number {\n let count = 0;\n for (const child of group.children) {\n if (child.type === 'condition') {\n count++;\n } else {\n count += this.countConditions(child);\n }\n }\n return count;\n }\n\n onSave(): void {\n if (!this.filterEnabled()) {\n this.save.emit(undefined);\n } else {\n this.save.emit({\n enabled: true,\n root: this.rootGroup(),\n });\n }\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n onBackdropClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).classList.contains('modal-backdrop')) {\n this.onClose();\n }\n }\n}\n","<div class=\"modal-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"filter-modal\">\n <div class=\"modal-header\">\n <div class=\"header-title\">\n <mat-icon>filter_list</mat-icon>\n <span>Array Filter</span>\n </div>\n <span class=\"array-path\">{{ arrayMapping.sourceArray.name }}[] &rarr; {{ arrayMapping.targetArray.name }}[]</span>\n <button mat-icon-button class=\"close-btn\" (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"modal-body\">\n <!-- Filter mode selection -->\n <div class=\"filter-mode\">\n <mat-radio-group [value]=\"filterEnabled()\" (change)=\"filterEnabled.set($event.value)\">\n <mat-radio-button [value]=\"false\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>select_all</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">No filter</span>\n <span class=\"mode-desc\">Map all records from source to target</span>\n </div>\n </div>\n </mat-radio-button>\n <mat-radio-button [value]=\"true\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>filter_alt</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">Filter records</span>\n <span class=\"mode-desc\">Only map records matching conditions</span>\n </div>\n </div>\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <!-- Conditions builder (only when filter enabled) -->\n @if (filterEnabled()) {\n <mat-divider></mat-divider>\n\n <div class=\"conditions-section\">\n <!-- Root group -->\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: rootGroup(), isRoot: true }\"></ng-container>\n </div>\n }\n </div>\n\n <div class=\"modal-footer\">\n <button mat-button (click)=\"onClose()\">Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\">\n Apply\n </button>\n </div>\n </div>\n</div>\n\n<!-- Recursive group template -->\n<ng-template #groupTemplate let-group=\"group\" let-isRoot=\"isRoot\" let-parentGroup=\"parentGroup\">\n <div class=\"filter-group\" [class.root-group]=\"isRoot\" [class.nested-group]=\"!isRoot\">\n <!-- Group header with logic toggle -->\n <div class=\"group-header\">\n <div class=\"logic-toggle\">\n <span class=\"logic-label\">Match</span>\n <mat-radio-group [value]=\"group.logic\" (change)=\"onLogicChange(group, $event.value)\">\n <mat-radio-button value=\"and\">ALL (AND)</mat-radio-button>\n <mat-radio-button value=\"or\">ANY (OR)</mat-radio-button>\n </mat-radio-group>\n </div>\n @if (!isRoot) {\n <button mat-icon-button class=\"remove-group-btn\" matTooltip=\"Remove group\" (click)=\"removeItem(parentGroup, group.id)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n\n <!-- Group children -->\n <div class=\"group-children\">\n @for (item of group.children; track item.id; let i = $index) {\n <!-- Logic connector between items -->\n @if (i > 0) {\n <div class=\"logic-connector\">\n <span class=\"logic-badge\" [class.and]=\"group.logic === 'and'\" [class.or]=\"group.logic === 'or'\">\n {{ group.logic | uppercase }}\n </span>\n </div>\n }\n\n @if (isCondition(item)) {\n <!-- Condition row -->\n <div class=\"condition-row\">\n <div class=\"condition-inputs\">\n <!-- Field selector -->\n <mat-form-field appearance=\"outline\" class=\"field-select\">\n <mat-label>Field</mat-label>\n <mat-select [value]=\"item.field\" (selectionChange)=\"onFieldChange(item, $event.value)\">\n @for (field of availableFields(); track field.path) {\n <mat-option [value]=\"field.path\">\n {{ field.name }}\n <span class=\"field-type\">({{ field.type }})</span>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <!-- Operator selector -->\n <mat-form-field appearance=\"outline\" class=\"operator-select\">\n <mat-label>Operator</mat-label>\n <mat-select [value]=\"item.operator\" (selectionChange)=\"onOperatorChange(item, $event.value)\">\n @for (op of getOperatorsForField(item.field); track op.value) {\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <!-- Value input (only if operator needs value) -->\n @if (operatorNeedsValue(item.operator)) {\n @if (item.valueType === 'boolean') {\n <mat-slide-toggle\n [checked]=\"item.value === true\"\n (change)=\"onValueChange(item, $event.checked)\"\n class=\"bool-toggle\"\n >\n {{ item.value ? 'true' : 'false' }}\n </mat-slide-toggle>\n } @else if (item.valueType === 'number') {\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Value</mat-label>\n <input\n matInput\n type=\"number\"\n [value]=\"item.value\"\n (input)=\"onValueChange(item, $any($event.target).value)\"\n />\n </mat-form-field>\n } @else {\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Value</mat-label>\n <input\n matInput\n type=\"text\"\n [value]=\"item.value\"\n (input)=\"onValueChange(item, $any($event.target).value)\"\n />\n </mat-form-field>\n }\n }\n\n <!-- Remove condition button -->\n <button mat-icon-button class=\"remove-btn\" matTooltip=\"Remove condition\" (click)=\"removeItem(group, item.id)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n } @else if (isGroup(item)) {\n <!-- Nested group -->\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: item, isRoot: false, parentGroup: group }\"></ng-container>\n }\n }\n\n <!-- Empty state -->\n @if (group.children.length === 0) {\n <div class=\"empty-group\">\n <mat-icon>info_outline</mat-icon>\n <span>No conditions. Add a condition or group.</span>\n </div>\n }\n </div>\n\n <!-- Group actions -->\n <div class=\"group-actions\">\n <button mat-stroked-button class=\"add-condition-btn\" (click)=\"addCondition(group)\">\n <mat-icon>add</mat-icon>\n Add Condition\n </button>\n <button mat-stroked-button class=\"add-group-btn\" (click)=\"addGroup(group)\">\n <mat-icon>folder_open</mat-icon>\n Add Group\n </button>\n </div>\n </div>\n</ng-template>\n","import { Component, Input, Output, EventEmitter, computed, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport {\n ArrayToObjectMapping,\n ArraySelectorConfig,\n ArraySelectionMode,\n FilterCondition,\n FilterGroup,\n FilterItem,\n FilterOperator,\n SchemaField,\n} from '../../models/schema.model';\n\ninterface OperatorOption {\n value: FilterOperator;\n label: string;\n needsValue: boolean;\n}\n\n@Component({\n selector: 'array-selector-modal',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatSelectModule,\n MatInputModule,\n MatFormFieldModule,\n MatRadioModule,\n MatSlideToggleModule,\n MatTooltipModule,\n MatDividerModule,\n ],\n templateUrl: './array-selector-modal.component.html',\n styleUrl: './array-selector-modal.component.scss',\n})\nexport class ArraySelectorModalComponent implements OnInit {\n @Input({ required: true }) mapping!: ArrayToObjectMapping;\n @Output() save = new EventEmitter<ArraySelectorConfig>();\n @Output() close = new EventEmitter<void>();\n\n selectionMode = signal<ArraySelectionMode>('first');\n conditionGroup = signal<FilterGroup>(this.createEmptyGroup());\n\n // Available fields from the source array's children\n availableFields = computed(() => {\n const fields: { path: string; name: string; type: string }[] = [];\n this.collectFields(this.mapping.sourceArray.children || [], '', fields);\n return fields;\n });\n\n // Operators by type\n stringOperators: OperatorOption[] = [\n { value: 'equals', label: 'equals', needsValue: true },\n { value: 'notEquals', label: 'not equals', needsValue: true },\n { value: 'contains', label: 'contains', needsValue: true },\n { value: 'notContains', label: 'does not contain', needsValue: true },\n { value: 'startsWith', label: 'starts with', needsValue: true },\n { value: 'endsWith', label: 'ends with', needsValue: true },\n { value: 'isEmpty', label: 'is empty', needsValue: false },\n { value: 'isNotEmpty', label: 'is not empty', needsValue: false },\n ];\n\n numberOperators: OperatorOption[] = [\n { value: 'equals', label: 'equals', needsValue: true },\n { value: 'notEquals', label: 'not equals', needsValue: true },\n { value: 'greaterThan', label: 'greater than', needsValue: true },\n { value: 'lessThan', label: 'less than', needsValue: true },\n { value: 'greaterThanOrEqual', label: 'greater or equal', needsValue: true },\n { value: 'lessThanOrEqual', label: 'less or equal', needsValue: true },\n ];\n\n booleanOperators: OperatorOption[] = [\n { value: 'isTrue', label: 'is true', needsValue: false },\n { value: 'isFalse', label: 'is false', needsValue: false },\n ];\n\n ngOnInit(): void {\n // Initialize from existing selector config\n if (this.mapping.selector) {\n this.selectionMode.set(this.mapping.selector.mode);\n if (this.mapping.selector.condition) {\n this.conditionGroup.set(this.cloneGroup(this.mapping.selector.condition));\n }\n }\n }\n\n private createEmptyGroup(): FilterGroup {\n return {\n id: this.generateId(),\n type: 'group',\n logic: 'and',\n children: [],\n };\n }\n\n private generateId(): string {\n return `filter-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cloneGroup(group: FilterGroup): FilterGroup {\n return {\n ...group,\n children: group.children.map((child) =>\n child.type === 'group' ? this.cloneGroup(child) : { ...child }\n ),\n };\n }\n\n private collectFields(\n fields: SchemaField[],\n prefix: string,\n result: { path: string; name: string; type: string }[]\n ): void {\n for (const field of fields) {\n const path = prefix ? `${prefix}.${field.name}` : field.name;\n if (field.type !== 'object' && field.type !== 'array') {\n result.push({ path, name: field.name, type: field.type });\n }\n if (field.children) {\n this.collectFields(field.children, path, result);\n }\n }\n }\n\n getOperatorsForField(fieldPath: string): OperatorOption[] {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n if (!field) return this.stringOperators;\n\n switch (field.type) {\n case 'number':\n return this.numberOperators;\n case 'boolean':\n return this.booleanOperators;\n default:\n return this.stringOperators;\n }\n }\n\n operatorNeedsValue(operator: FilterOperator): boolean {\n const allOperators = [...this.stringOperators, ...this.numberOperators, ...this.booleanOperators];\n const op = allOperators.find((o) => o.value === operator);\n return op?.needsValue ?? true;\n }\n\n isCondition(item: FilterItem): item is FilterCondition {\n return item.type === 'condition';\n }\n\n isGroup(item: FilterItem): item is FilterGroup {\n return item.type === 'group';\n }\n\n addCondition(group: FilterGroup): void {\n const fields = this.availableFields();\n const firstField = fields[0];\n const newCondition: FilterCondition = {\n id: this.generateId(),\n type: 'condition',\n field: firstField?.path || '',\n fieldName: firstField?.name || '',\n operator: 'equals',\n value: '',\n valueType: (firstField?.type as 'string' | 'number' | 'boolean') || 'string',\n };\n group.children = [...group.children, newCondition];\n this.triggerUpdate();\n }\n\n addGroup(parentGroup: FilterGroup): void {\n const newGroup: FilterGroup = {\n id: this.generateId(),\n type: 'group',\n logic: parentGroup.logic === 'and' ? 'or' : 'and',\n children: [],\n };\n parentGroup.children = [...parentGroup.children, newGroup];\n this.triggerUpdate();\n }\n\n removeItem(parentGroup: FilterGroup, itemId: string): void {\n parentGroup.children = parentGroup.children.filter((c) => c.id !== itemId);\n this.triggerUpdate();\n }\n\n onFieldChange(condition: FilterCondition, fieldPath: string): void {\n const field = this.availableFields().find((f) => f.path === fieldPath);\n if (field) {\n condition.field = fieldPath;\n condition.fieldName = field.name;\n condition.valueType = field.type as 'string' | 'number' | 'boolean';\n const operators = this.getOperatorsForField(fieldPath);\n condition.operator = operators[0].value;\n condition.value = '';\n }\n this.triggerUpdate();\n }\n\n onOperatorChange(condition: FilterCondition, operator: FilterOperator): void {\n condition.operator = operator;\n if (!this.operatorNeedsValue(operator)) {\n condition.value = '';\n }\n this.triggerUpdate();\n }\n\n onValueChange(condition: FilterCondition, value: string | boolean): void {\n if (condition.valueType === 'number') {\n condition.value = parseFloat(value as string) || 0;\n } else {\n condition.value = value;\n }\n this.triggerUpdate();\n }\n\n onLogicChange(group: FilterGroup, logic: 'and' | 'or'): void {\n group.logic = logic;\n this.triggerUpdate();\n }\n\n private triggerUpdate(): void {\n this.conditionGroup.set(this.cloneGroup(this.conditionGroup()));\n }\n\n onSave(): void {\n const config: ArraySelectorConfig = {\n mode: this.selectionMode(),\n };\n\n if (this.selectionMode() === 'condition') {\n config.condition = this.conditionGroup();\n }\n\n this.save.emit(config);\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n onBackdropClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).classList.contains('modal-backdrop')) {\n this.onClose();\n }\n }\n}\n","<div class=\"modal-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"selector-modal\">\n <div class=\"modal-header\">\n <div class=\"header-title\">\n <mat-icon>swap_horiz</mat-icon>\n <span>Array to Object</span>\n </div>\n <span class=\"mapping-path\">{{ mapping.sourceArray.name }}[] &rarr; {{ mapping.targetObject.name }}</span>\n <button mat-icon-button class=\"close-btn\" (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"modal-body\">\n <p class=\"description\">\n Select which item from the array should be mapped to the target object.\n </p>\n\n <!-- Selection mode -->\n <div class=\"selection-mode\">\n <mat-radio-group [value]=\"selectionMode()\" (change)=\"selectionMode.set($event.value)\">\n <mat-radio-button value=\"first\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>first_page</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">First item</span>\n <span class=\"mode-desc\">Use the first item in the array</span>\n </div>\n </div>\n </mat-radio-button>\n\n <mat-radio-button value=\"last\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>last_page</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">Last item</span>\n <span class=\"mode-desc\">Use the last item in the array</span>\n </div>\n </div>\n </mat-radio-button>\n\n <mat-radio-button value=\"condition\" class=\"mode-option\">\n <div class=\"mode-content\">\n <mat-icon>filter_alt</mat-icon>\n <div class=\"mode-text\">\n <span class=\"mode-label\">First matching condition</span>\n <span class=\"mode-desc\">Use the first item that matches the condition</span>\n </div>\n </div>\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\n <!-- Condition builder (only when condition mode selected) -->\n @if (selectionMode() === 'condition') {\n <mat-divider></mat-divider>\n\n <div class=\"conditions-section\">\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: conditionGroup(), isRoot: true }\"></ng-container>\n </div>\n }\n </div>\n\n <div class=\"modal-footer\">\n <button mat-button (click)=\"onClose()\">Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\">Apply</button>\n </div>\n </div>\n</div>\n\n<!-- Recursive group template -->\n<ng-template #groupTemplate let-group=\"group\" let-isRoot=\"isRoot\" let-parentGroup=\"parentGroup\">\n <div class=\"filter-group\" [class.root-group]=\"isRoot\" [class.nested-group]=\"!isRoot\">\n <div class=\"group-header\">\n <div class=\"logic-toggle\">\n <span class=\"logic-label\">Match</span>\n <mat-radio-group [value]=\"group.logic\" (change)=\"onLogicChange(group, $event.value)\">\n <mat-radio-button value=\"and\">ALL (AND)</mat-radio-button>\n <mat-radio-button value=\"or\">ANY (OR)</mat-radio-button>\n </mat-radio-group>\n </div>\n @if (!isRoot) {\n <button mat-icon-button class=\"remove-group-btn\" matTooltip=\"Remove group\" (click)=\"removeItem(parentGroup, group.id)\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n\n <div class=\"group-children\">\n @for (item of group.children; track item.id; let i = $index) {\n @if (i > 0) {\n <div class=\"logic-connector\">\n <span class=\"logic-badge\" [class.and]=\"group.logic === 'and'\" [class.or]=\"group.logic === 'or'\">\n {{ group.logic | uppercase }}\n </span>\n </div>\n }\n\n @if (isCondition(item)) {\n <div class=\"condition-row\">\n <div class=\"condition-inputs\">\n <mat-form-field appearance=\"outline\" class=\"field-select\">\n <mat-label>Field</mat-label>\n <mat-select [value]=\"item.field\" (selectionChange)=\"onFieldChange(item, $event.value)\">\n @for (field of availableFields(); track field.path) {\n <mat-option [value]=\"field.path\">\n {{ field.name }}\n <span class=\"field-type\">({{ field.type }})</span>\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"operator-select\">\n <mat-label>Operator</mat-label>\n <mat-select [value]=\"item.operator\" (selectionChange)=\"onOperatorChange(item, $event.value)\">\n @for (op of getOperatorsForField(item.field); track op.value) {\n <mat-option [value]=\"op.value\">{{ op.label }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n @if (operatorNeedsValue(item.operator)) {\n @if (item.valueType === 'boolean') {\n <mat-slide-toggle\n [checked]=\"item.value === true\"\n (change)=\"onValueChange(item, $event.checked)\"\n class=\"bool-toggle\"\n >\n {{ item.value ? 'true' : 'false' }}\n </mat-slide-toggle>\n } @else if (item.valueType === 'number') {\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Value</mat-label>\n <input matInput type=\"number\" [value]=\"item.value\" (input)=\"onValueChange(item, $any($event.target).value)\" />\n </mat-form-field>\n } @else {\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Value</mat-label>\n <input matInput type=\"text\" [value]=\"item.value\" (input)=\"onValueChange(item, $any($event.target).value)\" />\n </mat-form-field>\n }\n }\n\n <button mat-icon-button class=\"remove-btn\" matTooltip=\"Remove condition\" (click)=\"removeItem(group, item.id)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n } @else if (isGroup(item)) {\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { group: item, isRoot: false, parentGroup: group }\"></ng-container>\n }\n }\n\n @if (group.children.length === 0) {\n <div class=\"empty-group\">\n <mat-icon>info_outline</mat-icon>\n <span>No conditions. Add a condition to filter.</span>\n </div>\n }\n </div>\n\n <div class=\"group-actions\">\n <button mat-stroked-button class=\"add-condition-btn\" (click)=\"addCondition(group)\">\n <mat-icon>add</mat-icon>\n Add Condition\n </button>\n <button mat-stroked-button class=\"add-group-btn\" (click)=\"addGroup(group)\">\n <mat-icon>folder_open</mat-icon>\n Add Group\n </button>\n </div>\n </div>\n</ng-template>\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { SchemaField, DefaultValue } from '../../models/schema.model';\n\n@Component({\n selector: 'default-value-popover',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatInputModule,\n MatFormFieldModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatSelectModule,\n MatSlideToggleModule,\n ],\n templateUrl: './default-value-popover.component.html',\n styleUrl: './default-value-popover.component.scss',\n})\nexport class DefaultValuePopoverComponent implements OnInit {\n @Input() field!: SchemaField;\n @Input() existingValue?: DefaultValue;\n @Input() position!: { x: number; y: number };\n\n @Output() save = new EventEmitter<string | number | boolean | Date | null>();\n @Output() delete = new EventEmitter<void>();\n @Output() close = new EventEmitter<void>();\n\n stringValue = '';\n numberValue: number | null = null;\n booleanValue = false;\n dateValue: Date | null = null;\n\n ngOnInit(): void {\n if (this.existingValue) {\n switch (this.fieldType) {\n case 'string':\n this.stringValue = this.existingValue.value as string || '';\n break;\n case 'number':\n this.numberValue = this.existingValue.value as number;\n break;\n case 'boolean':\n this.booleanValue = this.existingValue.value as boolean;\n break;\n case 'date':\n this.dateValue = this.existingValue.value ? new Date(this.existingValue.value as string) : null;\n break;\n }\n }\n }\n\n get fieldType(): string {\n if (this.field.type === 'date' || this.field.name.toLowerCase().includes('date')) {\n return 'date';\n }\n return this.field.type;\n }\n\n onSave(): void {\n let value: string | number | boolean | Date | null;\n\n switch (this.fieldType) {\n case 'number':\n value = this.numberValue;\n break;\n case 'boolean':\n value = this.booleanValue;\n break;\n case 'date':\n value = this.dateValue;\n break;\n default:\n value = this.stringValue || null;\n }\n\n this.save.emit(value);\n }\n\n onDelete(): void {\n this.delete.emit();\n }\n\n onClose(): void {\n this.close.emit();\n }\n\n onBackdropClick(event: MouseEvent): void {\n if ((event.target as HTMLElement).classList.contains('popover-backdrop')) {\n this.onClose();\n }\n }\n}\n","<div class=\"popover-backdrop\" (click)=\"onBackdropClick($event)\">\n <div class=\"popover-container\">\n <div class=\"popover-header\">\n <div class=\"header-title\">\n <mat-icon>edit</mat-icon>\n <span>Default Value</span>\n </div>\n <button mat-icon-button (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"popover-content\">\n <div class=\"field-info\">\n <span class=\"field-name\">{{ field.name }}</span>\n <span class=\"field-type\">{{ fieldType }}</span>\n </div>\n\n <!-- String input -->\n @if (fieldType === 'string') {\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Default Value</mat-label>\n <input matInput [(ngModel)]=\"stringValue\" placeholder=\"Enter default value\">\n </mat-form-field>\n }\n\n <!-- Number input -->\n @if (fieldType === 'number') {\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Default Value</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"numberValue\" placeholder=\"Enter number\">\n </mat-form-field>\n }\n\n <!-- Boolean input -->\n @if (fieldType === 'boolean') {\n <div class=\"boolean-input\">\n <mat-slide-toggle [(ngModel)]=\"booleanValue\">\n {{ booleanValue ? 'True' : 'False' }}\n </mat-slide-toggle>\n </div>\n }\n\n <!-- Date input -->\n @if (fieldType === 'date') {\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Default Date</mat-label>\n <input matInput [matDatepicker]=\"picker\" [(ngModel)]=\"dateValue\">\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n </mat-form-field>\n }\n </div>\n\n <div class=\"popover-actions\">\n @if (existingValue) {\n <button mat-button color=\"warn\" (click)=\"onDelete()\">\n <mat-icon>delete</mat-icon>\n Remove\n </button>\n }\n <span class=\"spacer\"></span>\n <button mat-button (click)=\"onClose()\">Cancel</button>\n <button mat-flat-button color=\"primary\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n HostListener,\n inject,\n signal,\n computed,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n SchemaField,\n SchemaDefinition,\n FieldMapping,\n TransformationConfig,\n ArrayMapping,\n ArrayFilterConfig,\n ArrayToObjectMapping,\n ArraySelectorConfig,\n DefaultValue,\n} from '../../models/schema.model';\nimport { JsonSchema } from '../../models/json-schema.model';\nimport { MappingService } from '../../services/mapping.service';\nimport { SvgConnectorService, Point } from '../../services/svg-connector.service';\nimport { TransformationService } from '../../services/transformation.service';\nimport { SchemaParserService, SchemaDocument } from '../../services/schema-parser.service';\nimport { SchemaTreeComponent, FieldPositionEvent } from '../schema-tree/schema-tree.component';\nimport { TransformationPopoverComponent } from '../transformation-popover/transformation-popover.component';\nimport { ArrayFilterModalComponent } from '../array-filter-modal/array-filter-modal.component';\nimport { ArraySelectorModalComponent } from '../array-selector-modal/array-selector-modal.component';\nimport { DefaultValuePopoverComponent } from '../default-value-popover/default-value-popover.component';\n\ninterface VisualConnection {\n id: string;\n mappingId: string;\n paths: string[];\n sourcePoints: Point[];\n midPoint: Point;\n targetPoint: Point;\n hasTransformation: boolean;\n isSelected: boolean;\n isArrayMapping: boolean;\n isArrayToObjectMapping: boolean;\n hasFilter: boolean;\n isBeingDragged: boolean;\n}\n\n@Component({\n selector: 'data-mapper',\n standalone: true,\n imports: [\n CommonModule,\n MatIconModule,\n MatButtonModule,\n MatTooltipModule,\n SchemaTreeComponent,\n TransformationPopoverComponent,\n ArrayFilterModalComponent,\n ArraySelectorModalComponent,\n DefaultValuePopoverComponent,\n ],\n templateUrl: './data-mapper.component.html',\n styleUrl: './data-mapper.component.scss',\n})\nexport class DataMapperComponent implements AfterViewInit, OnDestroy {\n @Input() set sourceSchema(value: JsonSchema | SchemaDocument) {\n if (value) {\n this._sourceSchemaInput.set(value);\n }\n }\n @Input() set targetSchema(value: JsonSchema | SchemaDocument) {\n if (value) {\n this._targetSchemaInput.set(value);\n }\n }\n @Input() set sourceSchemaRef(value: string | null | undefined) {\n this.mappingService.setSourceSchemaRef(value ?? null);\n }\n @Input() set targetSchemaRef(value: string | null | undefined) {\n this.mappingService.setTargetSchemaRef(value ?? null);\n }\n @Input() sampleData: Record<string, unknown> = {};\n\n @Output() mappingsChange = new EventEmitter<FieldMapping[]>();\n\n @ViewChild('svgContainer') svgContainer!: ElementRef<HTMLDivElement>;\n @ViewChild('svgElement') svgElement!: ElementRef<SVGSVGElement>;\n\n private mappingService = inject(MappingService);\n private svgConnectorService = inject(SvgConnectorService);\n private transformationService = inject(TransformationService);\n private schemaParserService = inject(SchemaParserService);\n\n // Internal signals for schema inputs\n private _sourceSchemaInput = signal<JsonSchema | SchemaDocument | null>(null);\n private _targetSchemaInput = signal<JsonSchema | SchemaDocument | null>(null);\n\n // Converted schemas for the tree component\n readonly sourceSchemaForTree = computed(() => {\n const schema = this._sourceSchemaInput();\n if (!schema) return { name: '', fields: [] };\n return this.schemaParserService.parseSchema(schema as SchemaDocument, schema.title || 'Source');\n });\n\n readonly targetSchemaForTree = computed(() => {\n const schema = this._targetSchemaInput();\n if (!schema) return { name: '', fields: [] };\n return this.schemaParserService.parseSchema(schema as SchemaDocument, schema.title || 'Target');\n });\n\n // Field positions from both trees\n private sourcePositions = new Map<string, DOMRect>();\n private targetPositions = new Map<string, DOMRect>();\n\n // Visual state\n connections = signal<VisualConnection[]>([]);\n dragPath = signal<string | null>(null);\n selectedMappingId = signal<string | null>(null);\n popoverPosition = signal<{ x: number; y: number } | null>(null);\n\n // Array filter modal state\n showArrayFilterModal = signal(false);\n selectedArrayMapping = signal<ArrayMapping | null>(null);\n\n // Array selector modal state (for array-to-object)\n showArraySelectorModal = signal(false);\n selectedArrayToObjectMapping = signal<ArrayToObjectMapping | null>(null);\n\n // Default value popover state\n showDefaultValuePopover = signal(false);\n selectedDefaultValueField = signal<SchemaField | null>(null);\n defaultValuePopoverPosition = signal<{ x: number; y: number } | null>(null);\n\n // Computed values\n readonly mappings = computed(() => this.mappingService.allMappings());\n readonly arrayMappings = computed(() => this.mappingService.allArrayMappings());\n readonly defaultValues = computed(() => this.mappingService.allDefaultValues());\n readonly selectedMapping = computed(() => this.mappingService.selectedMapping());\n readonly showPopover = computed(() => this.selectedMappingId() !== null && this.popoverPosition() !== null && !this.showArrayFilterModal());\n\n private isDragging = false;\n private dragSourceField: SchemaField | null = null;\n private dragStartPoint: Point | null = null;\n private resizeObserver!: ResizeObserver;\n\n // Endpoint drag state\n private isEndpointDragging = false;\n private endpointDragMappingId: string | null = null;\n private endpointDragType: 'source' | 'target' | null = null;\n private endpointDragSourceIndex: number | null = null;\n private endpointDragAnchorPoint: Point | null = null;\n\n ngAfterViewInit(): void {\n this.setupResizeObserver();\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n private setupResizeObserver(): void {\n this.resizeObserver = new ResizeObserver(() => {\n this.updateConnections();\n });\n\n if (this.svgContainer?.nativeElement) {\n this.resizeObserver.observe(this.svgContainer.nativeElement);\n }\n }\n\n onSourcePositionsChanged(positions: Map<string, DOMRect>): void {\n this.sourcePositions = positions;\n this.updateConnections();\n }\n\n onTargetPositionsChanged(positions: Map<string, DOMRect>): void {\n this.targetPositions = positions;\n this.updateConnections();\n }\n\n onFieldDragStart(event: FieldPositionEvent): void {\n if (!this.svgContainer?.nativeElement) return;\n\n const containerRect = this.svgContainer.nativeElement.getBoundingClientRect();\n const startPoint = this.svgConnectorService.calculateConnectionPoint(\n event.rect,\n 'source',\n containerRect\n );\n\n this.isDragging = true;\n this.dragSourceField = event.field;\n this.dragStartPoint = startPoint;\n\n document.body.style.cursor = 'grabbing';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.svgContainer?.nativeElement) return;\n\n const containerRect = this.svgContainer.nativeElement.getBoundingClientRect();\n const currentPoint: Point = {\n x: event.clientX - containerRect.left,\n y: event.clientY - containerRect.top,\n };\n\n // Handle new connection dragging\n if (this.isDragging && this.dragStartPoint) {\n const path = this.svgConnectorService.createDragPath(this.dragStartPoint, currentPoint);\n this.dragPath.set(path);\n return;\n }\n\n // Handle endpoint dragging\n if (this.isEndpointDragging && this.endpointDragAnchorPoint) {\n // Show drag path from anchor to cursor\n const path = this.endpointDragType === 'source'\n ? this.svgConnectorService.createDragPath(currentPoint, this.endpointDragAnchorPoint)\n : this.svgConnectorService.createDragPath(this.endpointDragAnchorPoint, currentPoint);\n this.dragPath.set(path);\n }\n }\n\n @HostListener('document:mouseup', ['$event'])\n onMouseUp(event: MouseEvent): void {\n if (this.isDragging) {\n this.dragPath.set(null);\n this.isDragging = false;\n this.dragSourceField = null;\n this.dragStartPoint = null;\n document.body.style.cursor = '';\n }\n\n if (this.isEndpointDragging) {\n this.cancelEndpointDrag();\n }\n }\n\n onEndpointDragStart(\n connection: VisualConnection,\n endpointType: 'source' | 'target',\n sourceIndex: number,\n event: MouseEvent\n ): void {\n event.stopPropagation();\n event.preventDefault();\n\n if (!this.svgContainer?.nativeElement) return;\n\n this.isEndpointDragging = true;\n this.endpointDragMappingId = connection.mappingId;\n this.endpointDragType = endpointType;\n this.endpointDragSourceIndex = sourceIndex;\n\n // Set anchor point (the point that stays fixed)\n if (endpointType === 'source') {\n // Moving source, anchor is the target\n this.endpointDragAnchorPoint = connection.targetPoint;\n } else {\n // Moving target, anchor is the first source (or merge point for multi-source)\n this.endpointDragAnchorPoint = connection.sourcePoints[0];\n }\n\n // Update MappingService drag state so schema-tree can detect endpoint dragging\n this.mappingService.startEndpointDrag(\n connection.mappingId,\n endpointType,\n endpointType === 'source' ? connection.sourcePoints[sourceIndex] : connection.targetPoint,\n sourceIndex\n );\n\n document.body.style.cursor = 'grabbing';\n this.updateConnections(); // Update to show connection as being dragged\n }\n\n private cancelEndpointDrag(): void {\n this.dragPath.set(null);\n this.isEndpointDragging = false;\n this.endpointDragMappingId = null;\n this.endpointDragType = null;\n this.endpointDragSourceIndex = null;\n this.endpointDragAnchorPoint = null;\n document.body.style.cursor = '';\n this.mappingService.endDrag(); // Reset MappingService drag state\n this.updateConnections(); // Update to restore connection visibility\n }\n\n onFieldDrop(event: FieldPositionEvent): void {\n // Handle endpoint drag completion (drop on target field)\n if (this.isEndpointDragging && this.endpointDragMappingId && this.endpointDragType === 'target') {\n this.mappingService.changeTargetField(this.endpointDragMappingId, event.field);\n this.mappingsChange.emit(this.mappingService.allMappings());\n this.updateConnections();\n this.cancelEndpointDrag();\n return;\n }\n\n if (!this.dragSourceField) return;\n\n // Create mapping\n const mapping = this.mappingService.createMapping(\n [this.dragSourceField],\n event.field\n );\n\n this.mappingsChange.emit(this.mappingService.allMappings());\n this.updateConnections();\n\n // Reset drag state\n this.isDragging = false;\n this.dragSourceField = null;\n this.dragStartPoint = null;\n this.dragPath.set(null);\n document.body.style.cursor = '';\n }\n\n onSourceFieldDrop(event: FieldPositionEvent): void {\n // Handle endpoint drag completion (drop on source field)\n if (this.isEndpointDragging && this.endpointDragMappingId && this.endpointDragType === 'source') {\n this.mappingService.changeSourceField(\n this.endpointDragMappingId,\n event.field,\n this.endpointDragSourceIndex ?? undefined\n );\n this.mappingsChange.emit(this.mappingService.allMappings());\n this.updateConnections();\n this.cancelEndpointDrag();\n }\n }\n\n onConnectionClick(connection: VisualConnection, event: MouseEvent): void {\n event.stopPropagation();\n\n this.selectedMappingId.set(connection.mappingId);\n this.mappingService.selectMapping(connection.mappingId);\n\n // Position popover at click location\n this.popoverPosition.set({\n x: event.clientX,\n y: event.clientY,\n });\n\n this.updateConnections();\n }\n\n onTransformationNodeClick(connection: VisualConnection, event: MouseEvent): void {\n event.stopPropagation();\n\n // If it's an array mapping, show the filter modal\n if (connection.isArrayMapping) {\n const arrayMapping = this.mappingService.getArrayMapping(connection.mappingId);\n if (arrayMapping) {\n this.selectedArrayMapping.set(arrayMapping);\n this.showArrayFilterModal.set(true);\n return;\n }\n }\n\n // If it's an array-to-object mapping, show the selector modal\n if (connection.isArrayToObjectMapping) {\n const arrayToObjectMapping = this.mappingService.getArrayToObjectMapping(connection.mappingId);\n if (arrayToObjectMapping) {\n this.selectedArrayToObjectMapping.set(arrayToObjectMapping);\n this.showArraySelectorModal.set(true);\n return;\n }\n }\n\n this.onConnectionClick(connection, event);\n }\n\n onArrayFilterSave(filter: ArrayFilterConfig | undefined): void {\n const arrayMapping = this.selectedArrayMapping();\n if (arrayMapping) {\n this.mappingService.updateArrayFilter(arrayMapping.id, filter);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closeArrayFilterModal();\n this.updateConnections();\n }\n\n closeArrayFilterModal(): void {\n this.showArrayFilterModal.set(false);\n this.selectedArrayMapping.set(null);\n }\n\n onArraySelectorSave(selector: ArraySelectorConfig): void {\n const mapping = this.selectedArrayToObjectMapping();\n if (mapping) {\n this.mappingService.updateArrayToObjectSelector(mapping.id, selector);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closeArraySelectorModal();\n this.updateConnections();\n }\n\n closeArraySelectorModal(): void {\n this.showArraySelectorModal.set(false);\n this.selectedArrayToObjectMapping.set(null);\n }\n\n // Default value methods\n onDefaultValueClick(event: FieldPositionEvent): void {\n this.selectedDefaultValueField.set(event.field);\n this.defaultValuePopoverPosition.set({\n x: event.rect.right,\n y: event.rect.top + event.rect.height / 2,\n });\n this.showDefaultValuePopover.set(true);\n }\n\n onDefaultValueSave(value: string | number | boolean | Date | null): void {\n const field = this.selectedDefaultValueField();\n if (field) {\n this.mappingService.setDefaultValue(field, value);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closeDefaultValuePopover();\n }\n\n onDefaultValueDelete(): void {\n const field = this.selectedDefaultValueField();\n if (field) {\n this.mappingService.removeDefaultValue(field.id);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closeDefaultValuePopover();\n }\n\n closeDefaultValuePopover(): void {\n this.showDefaultValuePopover.set(false);\n this.selectedDefaultValueField.set(null);\n this.defaultValuePopoverPosition.set(null);\n }\n\n getExistingDefaultValue(fieldId: string): DefaultValue | undefined {\n return this.mappingService.getDefaultValue(fieldId);\n }\n\n onPopoverSave(transformations: TransformationConfig[]): void {\n const mappingId = this.selectedMappingId();\n if (mappingId) {\n this.mappingService.updateTransformations(mappingId, transformations);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closePopover();\n this.updateConnections();\n }\n\n onPopoverDelete(): void {\n const mappingId = this.selectedMappingId();\n if (mappingId) {\n this.mappingService.removeMapping(mappingId);\n this.mappingsChange.emit(this.mappingService.allMappings());\n }\n this.closePopover();\n this.updateConnections();\n }\n\n closePopover(): void {\n this.selectedMappingId.set(null);\n this.popoverPosition.set(null);\n this.mappingService.selectMapping(null);\n this.updateConnections();\n }\n\n private updateConnections(): void {\n if (!this.svgContainer?.nativeElement) return;\n\n const containerRect = this.svgContainer.nativeElement.getBoundingClientRect();\n const mappings = this.mappingService.allMappings();\n const selectedId = this.selectedMappingId();\n\n const newConnections: VisualConnection[] = [];\n\n for (const mapping of mappings) {\n const targetRect = this.targetPositions.get(mapping.targetField.id);\n if (!targetRect) continue;\n\n const targetPoint = this.svgConnectorService.calculateConnectionPoint(\n targetRect,\n 'target',\n containerRect\n );\n\n const sourcePoints: Point[] = [];\n for (const sourceField of mapping.sourceFields) {\n const sourceRect = this.sourcePositions.get(sourceField.id);\n if (sourceRect) {\n sourcePoints.push(\n this.svgConnectorService.calculateConnectionPoint(\n sourceRect,\n 'source',\n containerRect\n )\n );\n }\n }\n\n if (sourcePoints.length === 0) continue;\n\n let paths: string[];\n let midPoint: Point;\n\n if (sourcePoints.length === 1) {\n paths = [this.svgConnectorService.createBezierPath(sourcePoints[0], targetPoint)];\n midPoint = this.svgConnectorService.getMidPoint(sourcePoints[0], targetPoint);\n } else {\n const result = this.svgConnectorService.createMultiSourcePath(sourcePoints, targetPoint);\n paths = result.paths;\n midPoint = result.mergePoint;\n }\n\n // Check if this array mapping has a filter\n let hasFilter = false;\n if (mapping.isArrayMapping) {\n const arrayMapping = this.mappingService.getArrayMapping(mapping.id);\n hasFilter = arrayMapping?.filter?.enabled === true && (arrayMapping?.filter?.root?.children?.length ?? 0) > 0;\n }\n\n newConnections.push({\n id: `conn-${mapping.id}`,\n mappingId: mapping.id,\n paths,\n sourcePoints,\n midPoint,\n targetPoint,\n hasTransformation: mapping.transformations.length > 1 || mapping.transformations[0]?.type !== 'direct',\n isSelected: mapping.id === selectedId,\n isArrayMapping: mapping.isArrayMapping || false,\n isArrayToObjectMapping: mapping.isArrayToObjectMapping || false,\n hasFilter,\n isBeingDragged: mapping.id === this.endpointDragMappingId,\n });\n }\n\n this.connections.set(newConnections);\n }\n\n getTransformationIcon(mappingId: string): string {\n const mapping = this.mappings().find((m) => m.id === mappingId);\n if (!mapping) return 'settings';\n\n // Show filter icon for array mappings with filter, otherwise loop icon\n if (mapping.isArrayMapping) {\n const arrayMapping = this.mappingService.getArrayMapping(mappingId);\n if (arrayMapping?.filter?.enabled && (arrayMapping?.filter?.root?.children?.length ?? 0) > 0) {\n return 'filter_alt';\n }\n return 'loop';\n }\n\n // Show appropriate icon for array-to-object mappings\n if (mapping.isArrayToObjectMapping) {\n const atoMapping = this.mappingService.getArrayToObjectMapping(mappingId);\n if (atoMapping?.selector.mode === 'first') return 'first_page';\n if (atoMapping?.selector.mode === 'last') return 'last_page';\n if (atoMapping?.selector.mode === 'condition') return 'filter_alt';\n return 'swap_horiz';\n }\n\n const icons: Record<string, string> = {\n direct: 'arrow_forward',\n concat: 'merge',\n substring: 'content_cut',\n replace: 'find_replace',\n uppercase: 'text_fields',\n lowercase: 'text_fields',\n dateFormat: 'calendar_today',\n extractYear: 'event',\n extractMonth: 'event',\n extractDay: 'event',\n extractHour: 'schedule',\n extractMinute: 'schedule',\n extractSecond: 'schedule',\n numberFormat: 'pin',\n template: 'code',\n custom: 'functions',\n };\n\n // For multiple transformations, show a pipeline icon\n if (mapping.transformations.length > 1) {\n return 'linear_scale';\n }\n return icons[mapping.transformations[0]?.type] || 'settings';\n }\n\n clearAllMappings(): void {\n this.mappingService.clearAllMappings();\n this.mappingsChange.emit([]);\n this.updateConnections();\n }\n\n exportMappings(): string {\n return this.mappingService.exportMappings();\n }\n\n importMappings(json: string): void {\n this.mappingService.importMappings(json);\n this.mappingsChange.emit(this.mappingService.allMappings());\n this.updateConnections();\n }\n\n trackByConnectionId(index: number, connection: VisualConnection): string {\n return connection.id;\n }\n}\n","<div class=\"data-mapper\">\n <!-- Header Toolbar -->\n <div class=\"mapper-toolbar\">\n <div class=\"toolbar-title\">\n <mat-icon>account_tree</mat-icon>\n <span>Data Mapper</span>\n </div>\n <div class=\"toolbar-actions\">\n <span class=\"mapping-count\">{{ mappings().length }} mapping(s)</span>\n <button\n mat-icon-button\n matTooltip=\"Clear all mappings\"\n (click)=\"clearAllMappings()\"\n [disabled]=\"mappings().length === 0\"\n >\n <mat-icon>delete_sweep</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Main Mapper Area -->\n <div class=\"mapper-container\" #svgContainer>\n <!-- Source Schema Panel -->\n <div class=\"schema-panel source-panel\">\n <schema-tree\n [schema]=\"sourceSchemaForTree()\"\n [side]=\"'source'\"\n [mappings]=\"mappings()\"\n (fieldDragStart)=\"onFieldDragStart($event)\"\n (fieldPositionsChanged)=\"onSourcePositionsChanged($event)\"\n (sourceDrop)=\"onSourceFieldDrop($event)\"\n ></schema-tree>\n </div>\n\n <!-- SVG Connection Layer -->\n <svg class=\"connection-layer\" #svgElement>\n <!-- Existing connections -->\n @for (connection of connections(); track trackByConnectionId($index, connection)) {\n <g class=\"connection-group\" [class.selected]=\"connection.isSelected\" [class.array-mapping]=\"connection.isArrayMapping\" [class.array-to-object-mapping]=\"connection.isArrayToObjectMapping\" [class.being-dragged]=\"connection.isBeingDragged\">\n <!-- Connection paths -->\n @for (path of connection.paths; track $index) {\n <!-- Shadow path for glow effect -->\n <path\n [attr.d]=\"path\"\n fill=\"none\"\n [attr.stroke]=\"connection.isArrayToObjectMapping ? '#8b5cf6' : (connection.isArrayMapping ? '#f59e0b' : (connection.isSelected ? '#8b5cf6' : '#6366f1'))\"\n stroke-width=\"6\"\n stroke-opacity=\"0.2\"\n stroke-linecap=\"round\"\n />\n <!-- Main connection path -->\n <path\n [attr.d]=\"path\"\n class=\"connection-path\"\n [class.selected]=\"connection.isSelected\"\n [class.array-path]=\"connection.isArrayMapping\"\n [class.array-to-object-path]=\"connection.isArrayToObjectMapping\"\n [attr.stroke]=\"connection.isArrayToObjectMapping ? '#8b5cf6' : (connection.isArrayMapping ? '#f59e0b' : (connection.isSelected ? '#8b5cf6' : '#6366f1'))\"\n fill=\"none\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"connection.isArrayMapping || connection.isArrayToObjectMapping ? '8,4' : 'none'\"\n (click)=\"onConnectionClick(connection, $event)\"\n />\n <!-- Invisible wider path for easier clicking -->\n <path\n [attr.d]=\"path\"\n class=\"connection-hitbox\"\n fill=\"none\"\n stroke=\"transparent\"\n stroke-width=\"20\"\n (click)=\"onConnectionClick(connection, $event)\"\n />\n }\n\n <!-- Transformation node -->\n <g\n class=\"transformation-node\"\n [class.has-transformation]=\"connection.hasTransformation\"\n [class.is-array-mapping]=\"connection.isArrayMapping\"\n [class.is-array-to-object-mapping]=\"connection.isArrayToObjectMapping\"\n [attr.transform]=\"'translate(' + connection.midPoint.x + ',' + connection.midPoint.y + ')'\"\n (click)=\"onTransformationNodeClick(connection, $event)\"\n >\n <circle r=\"14\" class=\"node-bg\" [attr.fill]=\"connection.isArrayToObjectMapping ? '#8b5cf6' : (connection.isArrayMapping ? '#f59e0b' : '')\" [attr.stroke]=\"connection.isArrayToObjectMapping ? '#8b5cf6' : (connection.isArrayMapping ? '#f59e0b' : '')\" />\n <text\n class=\"node-icon\"\n text-anchor=\"middle\"\n dominant-baseline=\"central\"\n font-family=\"Material Icons\"\n font-size=\"16\"\n [attr.fill]=\"connection.isArrayMapping || connection.isArrayToObjectMapping ? 'white' : ''\"\n >\n {{ getTransformationIcon(connection.mappingId) }}\n </text>\n </g>\n\n <!-- Source endpoint circles (draggable) -->\n @for (sourcePoint of connection.sourcePoints; track $index) {\n <circle\n class=\"endpoint-handle source-endpoint\"\n [attr.cx]=\"sourcePoint.x\"\n [attr.cy]=\"sourcePoint.y\"\n r=\"6\"\n [class.selected]=\"connection.isSelected\"\n (mousedown)=\"onEndpointDragStart(connection, 'source', $index, $event)\"\n />\n }\n\n <!-- Target endpoint circle (draggable) -->\n <circle\n class=\"endpoint-handle target-endpoint\"\n [attr.cx]=\"connection.targetPoint.x\"\n [attr.cy]=\"connection.targetPoint.y\"\n r=\"6\"\n [class.selected]=\"connection.isSelected\"\n (mousedown)=\"onEndpointDragStart(connection, 'target', 0, $event)\"\n />\n </g>\n }\n\n <!-- Drag preview path -->\n @if (dragPath()) {\n <path\n [attr.d]=\"dragPath()\"\n class=\"drag-path\"\n fill=\"none\"\n stroke=\"#6366f1\"\n stroke-width=\"2.5\"\n stroke-dasharray=\"8,4\"\n stroke-linecap=\"round\"\n />\n }\n </svg>\n\n <!-- Target Schema Panel -->\n <div class=\"schema-panel target-panel\">\n <schema-tree\n [schema]=\"targetSchemaForTree()\"\n [side]=\"'target'\"\n [mappings]=\"mappings()\"\n [defaultValues]=\"defaultValues()\"\n (fieldDrop)=\"onFieldDrop($event)\"\n (fieldPositionsChanged)=\"onTargetPositionsChanged($event)\"\n (fieldDefaultValueClick)=\"onDefaultValueClick($event)\"\n ></schema-tree>\n </div>\n </div>\n\n <!-- Instructions -->\n @if (mappings().length === 0) {\n <div class=\"empty-state\">\n <mat-icon>drag_indicator</mat-icon>\n <p>Drag fields from the source schema to the target schema to create mappings</p>\n </div>\n }\n</div>\n\n<!-- Transformation Popover -->\n@if (showPopover() && selectedMapping()) {\n <transformation-popover\n [mapping]=\"selectedMapping()!\"\n [position]=\"popoverPosition()!\"\n [sampleData]=\"sampleData\"\n (save)=\"onPopoverSave($event)\"\n (delete)=\"onPopoverDelete()\"\n (close)=\"closePopover()\"\n ></transformation-popover>\n}\n\n<!-- Array Filter Modal -->\n@if (showArrayFilterModal() && selectedArrayMapping()) {\n <array-filter-modal\n [arrayMapping]=\"selectedArrayMapping()!\"\n (save)=\"onArrayFilterSave($event)\"\n (close)=\"closeArrayFilterModal()\"\n ></array-filter-modal>\n}\n\n<!-- Array Selector Modal (for array-to-object) -->\n@if (showArraySelectorModal() && selectedArrayToObjectMapping()) {\n <array-selector-modal\n [mapping]=\"selectedArrayToObjectMapping()!\"\n (save)=\"onArraySelectorSave($event)\"\n (close)=\"closeArraySelectorModal()\"\n ></array-selector-modal>\n}\n\n<!-- Default Value Popover -->\n@if (showDefaultValuePopover() && selectedDefaultValueField()) {\n <default-value-popover\n [field]=\"selectedDefaultValueField()!\"\n [existingValue]=\"getExistingDefaultValue(selectedDefaultValueField()!.id)\"\n [position]=\"defaultValuePopoverPosition()!\"\n (save)=\"onDefaultValueSave($event)\"\n (delete)=\"onDefaultValueDelete()\"\n (close)=\"closeDefaultValuePopover()\"\n ></default-value-popover>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n ApplicationRef,\n inject,\n signal,\n OnInit,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\n\n// Display type options for form rendering\ntype DisplayType = 'textbox' | 'dropdown' | 'textarea' | 'richtext' | 'datepicker' | 'datetimepicker' | 'timepicker' | 'stepper' | 'checkbox' | 'toggle';\n\n// Internal representation for UI editing\nexport interface EditorField {\n id: string;\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date' | 'time' | 'object' | 'array';\n format?: string;\n displayType?: DisplayType;\n label?: string;\n required?: boolean;\n defaultValue?: string | number | boolean;\n allowedValues?: string[];\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n minimum?: number;\n maximum?: number;\n children?: EditorField[];\n expanded?: boolean;\n isEditingValues?: boolean;\n isEditingDefault?: boolean;\n isEditingValidators?: boolean;\n}\n\n@Component({\n selector: 'field-item',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatSelectModule,\n MatTooltipModule,\n MatMenuModule,\n DragDropModule,\n FieldItemComponent,\n ],\n templateUrl: './field-item.component.html',\n styleUrls: ['./field-item.component.scss'],\n})\nexport class FieldItemComponent implements OnInit, OnChanges {\n cdr = inject(ChangeDetectorRef);\n appRef = inject(ApplicationRef);\n\n // Local expanded state to bypass change detection issues - using signal for better reactivity\n localExpanded = signal(false);\n\n @Input() field!: EditorField;\n @Input() parentList!: EditorField[];\n @Input() level = 0;\n @Input() showDisplayType = false;\n\n @Output() fieldChange = new EventEmitter<void>();\n @Output() delete = new EventEmitter<EditorField>();\n @Output() duplicate = new EventEmitter<EditorField>();\n @Output() outdent = new EventEmitter<EditorField>();\n\n fieldTypes: Array<{ value: string; label: string; icon: string }> = [\n { value: 'string', label: 'String', icon: 'text_fields' },\n { value: 'number', label: 'Number', icon: 'pin' },\n { value: 'boolean', label: 'Boolean', icon: 'toggle_on' },\n { value: 'date', label: 'Date', icon: 'calendar_today' },\n { value: 'time', label: 'Time', icon: 'schedule' },\n { value: 'object', label: 'Object', icon: 'data_object' },\n { value: 'array', label: 'Array', icon: 'data_array' },\n ];\n\n stringDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n { value: 'dropdown', label: 'Dropdown', icon: 'arrow_drop_down_circle' },\n { value: 'textarea', label: 'Textarea', icon: 'notes' },\n { value: 'richtext', label: 'Rich Text', icon: 'format_color_text' },\n ];\n\n dateDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'datepicker', label: 'Date Picker', icon: 'calendar_today' },\n { value: 'datetimepicker', label: 'DateTime Picker', icon: 'schedule' },\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n ];\n\n timeDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'timepicker', label: 'Time Picker', icon: 'schedule' },\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n ];\n\n numberDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n { value: 'stepper', label: 'Stepper', icon: 'unfold_more' },\n ];\n\n booleanDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'checkbox', label: 'Checkbox', icon: 'check_box' },\n { value: 'toggle', label: 'Toggle', icon: 'toggle_on' },\n ];\n\n stringFormats: Array<{ value: string; label: string }> = [\n { value: '', label: '(none)' },\n { value: 'email', label: 'Email' },\n { value: 'uri', label: 'URI (URL)' },\n { value: 'uuid', label: 'UUID' },\n ];\n\n getDisplayTypes(fieldType: string): Array<{ value: DisplayType; label: string; icon: string }> {\n if (fieldType === 'date') return this.dateDisplayTypes;\n if (fieldType === 'time') return this.timeDisplayTypes;\n if (fieldType === 'number') return this.numberDisplayTypes;\n if (fieldType === 'boolean') return this.booleanDisplayTypes;\n return this.stringDisplayTypes;\n }\n\n getTypeIcon(type: string): string {\n return this.fieldTypes.find(t => t.value === type)?.icon || 'help_outline';\n }\n\n ngOnInit(): void {\n // Initialize localExpanded from field.expanded if it exists\n if (this.field?.expanded !== undefined) {\n this.localExpanded.set(this.field.expanded);\n }\n // Initialize children array for object/array types if needed\n if ((this.field?.type === 'object' || this.field?.type === 'array') && !this.field.children) {\n this.field.children = [];\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // When field input changes, sync localExpanded with field.expanded\n // But PRESERVE localExpanded if field.expanded is false/undefined and we have a true value\n if (changes['field']) {\n if (this.field) {\n // If field.expanded is explicitly true, use it (we just set it)\n if (this.field.expanded === true) {\n this.localExpanded.set(true);\n }\n // If field.expanded is explicitly false, use it (user collapsed)\n else if (this.field.expanded === false) {\n this.localExpanded.set(false);\n }\n // If field.expanded is undefined, preserve current localExpanded state\n // This happens when parent updates and field object is new but doesn't have expanded set yet\n else {\n // Preserve current localExpanded, and sync field.expanded to match\n if (this.field.expanded !== this.localExpanded()) {\n this.field.expanded = this.localExpanded();\n }\n }\n \n // Initialize children array for object/array types if needed\n if ((this.field.type === 'object' || this.field.type === 'array') && !this.field.children) {\n this.field.children = [];\n }\n }\n }\n }\n\n private generateId(): string {\n return `field-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n toggleExpand(): void {\n this.handleExpandClick();\n }\n\n handleExpandClick(event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n \n // Ensure children array exists\n if (!this.field.children) {\n this.field.children = [];\n }\n \n // Toggle local expanded state (using signal)\n const newExpandedState = !this.localExpanded();\n this.localExpanded.set(newExpandedState);\n // Sync to field.expanded (mutation persists because field object reference stays the same)\n this.field.expanded = newExpandedState;\n \n // Force immediate change detection - this should trigger template re-render\n this.cdr.markForCheck();\n this.cdr.detectChanges();\n \n // Don't emit fieldChange - expand/collapse is local UI state only\n // We only emit when actual field data changes (name, type, children, etc.)\n }\n\n onFieldNameChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const sanitized = input.value.replace(/[^a-zA-Z0-9_$]/g, '');\n this.field.name = sanitized;\n if (input.value !== sanitized) {\n input.value = sanitized;\n }\n }\n\n onFieldNameBlur(): void {\n if (!this.field.name.trim()) {\n this.field.name = 'unnamed';\n }\n this.fieldChange.emit();\n }\n\n onFieldTypeChange(type: string): void {\n this.field.type = type as EditorField['type'];\n if ((type === 'object' || type === 'array') && !this.field.children) {\n this.field.children = [];\n }\n if (type === 'string') this.field.displayType = 'textbox';\n else if (type === 'number') this.field.displayType = 'textbox';\n else if (type === 'boolean') this.field.displayType = 'checkbox';\n else if (type === 'date') this.field.displayType = 'datepicker';\n else if (type === 'time') this.field.displayType = 'timepicker';\n else this.field.displayType = undefined;\n this.fieldChange.emit();\n }\n\n onDisplayTypeChange(displayType: string): void {\n this.field.displayType = displayType as DisplayType;\n this.fieldChange.emit();\n }\n\n toggleRequired(): void {\n this.field.required = !this.field.required;\n this.fieldChange.emit();\n }\n\n onLabelChange(label: string): void {\n this.field.label = label;\n }\n\n onLabelBlur(): void {\n this.fieldChange.emit();\n }\n\n addChildField(): void {\n if (!this.field.children) {\n this.field.children = [];\n }\n const newField: EditorField = {\n id: this.generateId(),\n name: '',\n type: 'string',\n displayType: 'textbox',\n };\n this.field.children.push(newField);\n this.localExpanded.set(true);\n this.field.expanded = true;\n this.cdr.detectChanges();\n this.fieldChange.emit();\n }\n\n deleteField(): void {\n this.delete.emit(this.field);\n }\n\n duplicateField(): void {\n this.duplicate.emit(this.field);\n }\n\n onChildFieldChange(): void {\n // Just propagate the change up - don't force detectChanges as it can reset expanded state\n this.fieldChange.emit();\n }\n\n onChildDelete(child: EditorField): void {\n if (this.field.children) {\n const index = this.field.children.indexOf(child);\n if (index > -1) {\n this.field.children.splice(index, 1);\n this.cdr.detectChanges();\n this.fieldChange.emit();\n }\n }\n }\n\n onChildDuplicate(child: EditorField): void {\n if (this.field.children) {\n const index = this.field.children.indexOf(child);\n if (index > -1) {\n const clone: EditorField = {\n ...child,\n id: this.generateId(),\n name: child.name + '_copy',\n children: child.children ? this.cloneFields(child.children) : undefined,\n };\n this.field.children.splice(index + 1, 0, clone);\n this.cdr.detectChanges();\n this.fieldChange.emit();\n }\n }\n }\n\n private cloneFields(fields: EditorField[]): EditorField[] {\n return fields.map(f => ({\n ...f,\n id: this.generateId(),\n children: f.children ? this.cloneFields(f.children) : undefined,\n }));\n }\n\n onFieldDrop(event: CdkDragDrop<EditorField[]>): void {\n if (event.previousIndex !== event.currentIndex && this.field.children) {\n moveItemInArray(this.field.children, event.previousIndex, event.currentIndex);\n // Don't emit fieldChange for reorder - array is mutated in place\n // and emitting causes parent re-render which resets expanded state\n }\n }\n\n canIndent(): boolean {\n const index = this.parentList.indexOf(this.field);\n if (index <= 0) return false;\n const prevSibling = this.parentList[index - 1];\n return prevSibling.type === 'object' || prevSibling.type === 'array';\n }\n\n indentField(): void {\n const index = this.parentList.indexOf(this.field);\n if (index <= 0) return;\n const prevSibling = this.parentList[index - 1];\n if (prevSibling.type !== 'object' && prevSibling.type !== 'array') return;\n\n this.parentList.splice(index, 1);\n if (!prevSibling.children) prevSibling.children = [];\n prevSibling.children.push(this.field);\n prevSibling.expanded = true;\n // Don't emit fieldChange - arrays are mutated in place\n }\n\n canOutdent(): boolean {\n return this.level > 0;\n }\n\n outdentField(): void {\n if (this.level <= 0) return;\n this.outdent.emit(this.field);\n }\n\n onChildOutdent(child: EditorField): void {\n if (!this.field.children) return;\n const childIndex = this.field.children.indexOf(child);\n if (childIndex === -1) return;\n\n // Remove child from this field's children\n this.field.children.splice(childIndex, 1);\n\n // Add to parent list after this field\n const myIndex = this.parentList.indexOf(this.field);\n this.parentList.splice(myIndex + 1, 0, child);\n\n // Don't emit fieldChange - arrays are mutated in place\n }\n\n toggleValuesEditor(): void {\n this.field.isEditingValues = !this.field.isEditingValues;\n if (this.field.isEditingValues) {\n this.field.isEditingDefault = false;\n this.field.isEditingValidators = false;\n if (!this.field.allowedValues) this.field.allowedValues = [];\n }\n this.fieldChange.emit();\n }\n\n addAllowedValue(input: HTMLInputElement | Event): void {\n let inputEl: HTMLInputElement | null = null;\n if (input instanceof HTMLInputElement) {\n inputEl = input;\n } else {\n const target = input.target as HTMLElement;\n const header = target.closest('.values-header');\n inputEl = header?.querySelector('.value-input') as HTMLInputElement;\n }\n if (!inputEl) return;\n\n const value = inputEl.value.trim();\n if (value && !this.field.allowedValues?.includes(value)) {\n if (!this.field.allowedValues) this.field.allowedValues = [];\n this.field.allowedValues.push(value);\n inputEl.value = '';\n this.fieldChange.emit();\n }\n }\n\n removeAllowedValue(index: number): void {\n if (this.field.allowedValues) {\n this.field.allowedValues.splice(index, 1);\n if (this.field.allowedValues.length === 0) this.field.allowedValues = undefined;\n this.fieldChange.emit();\n }\n }\n\n onAllowedValueKeydown(event: KeyboardEvent, input: HTMLInputElement): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.addAllowedValue(input);\n }\n }\n\n toggleDefaultEditor(): void {\n this.field.isEditingDefault = !this.field.isEditingDefault;\n if (this.field.isEditingDefault) {\n this.field.isEditingValues = false;\n this.field.isEditingValidators = false;\n }\n this.fieldChange.emit();\n }\n\n onDefaultValueChange(value: string): void {\n if (value === '') {\n this.field.defaultValue = undefined;\n } else if (this.field.type === 'number') {\n const num = parseFloat(value);\n this.field.defaultValue = isNaN(num) ? undefined : num;\n } else if (this.field.type === 'boolean') {\n this.field.defaultValue = value === 'true';\n } else {\n this.field.defaultValue = value;\n }\n this.fieldChange.emit();\n }\n\n clearDefaultValue(): void {\n this.field.defaultValue = undefined;\n this.field.isEditingDefault = false;\n this.fieldChange.emit();\n }\n\n onDefaultValueKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === 'Escape') {\n this.field.isEditingDefault = false;\n this.fieldChange.emit();\n }\n }\n\n toggleValidatorsEditor(): void {\n this.field.isEditingValidators = !this.field.isEditingValidators;\n if (this.field.isEditingValidators) {\n this.field.isEditingValues = false;\n this.field.isEditingDefault = false;\n }\n this.fieldChange.emit();\n }\n\n hasValidators(): boolean {\n if (this.field.type === 'string') {\n return !!(this.field.minLength || this.field.maxLength || this.field.pattern || this.field.format);\n }\n if (this.field.type === 'number') {\n return this.field.minimum !== undefined || this.field.maximum !== undefined;\n }\n return false;\n }\n\n onFormatChange(format: string): void {\n this.field.format = format || undefined;\n if (format) this.field.pattern = undefined;\n this.fieldChange.emit();\n }\n\n onMinLengthChange(value: string): void {\n this.field.minLength = value ? parseInt(value, 10) : undefined;\n this.fieldChange.emit();\n }\n\n onMaxLengthChange(value: string): void {\n this.field.maxLength = value ? parseInt(value, 10) : undefined;\n this.fieldChange.emit();\n }\n\n onPatternChange(value: string): void {\n this.field.pattern = value || undefined;\n this.fieldChange.emit();\n }\n\n onMinimumChange(value: string): void {\n this.field.minimum = value ? parseFloat(value) : undefined;\n this.fieldChange.emit();\n }\n\n onMaximumChange(value: string): void {\n this.field.maximum = value ? parseFloat(value) : undefined;\n this.fieldChange.emit();\n }\n\n canAddChildToArray(): boolean {\n return this.field.type === 'array' && (!this.field.children || this.field.children.length === 0);\n }\n\n getEmptyMessage(): string {\n return this.field.type === 'array' ? 'No item schema defined' : 'No child fields';\n }\n\n getAddButtonLabel(): string {\n return this.field.type === 'array' ? 'Define item schema' : 'Add field';\n }\n\n shouldShowNestedFields(): boolean {\n return (this.field.type === 'object' || this.field.type === 'array') && this.localExpanded();\n }\n}\n","<div class=\"field-wrapper\">\n <div\n class=\"field-item\"\n [class.is-complex]=\"field.type === 'object' || field.type === 'array'\"\n >\n <!-- Left section: field controls -->\n <div class=\"field-left\">\n <!-- Drag Handle (leftmost) -->\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag to reorder\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n\n <!-- Indent/Outdent Button (show one or the other) -->\n <div class=\"indent-buttons\">\n @if (level > 0) {\n <button\n class=\"indent-btn\"\n (click)=\"outdentField()\"\n matTooltip=\"Outdent (move to parent level)\"\n >\n <mat-icon>format_indent_decrease</mat-icon>\n </button>\n } @else {\n <button\n class=\"indent-btn\"\n [disabled]=\"!canIndent()\"\n (click)=\"indentField()\"\n matTooltip=\"Indent (make child of previous sibling)\"\n >\n <mat-icon>format_indent_increase</mat-icon>\n </button>\n }\n </div>\n\n <!-- Expand/Collapse -->\n @if (field.type === 'object' || field.type === 'array') {\n <button\n mat-icon-button\n type=\"button\"\n class=\"expand-btn\"\n (click)=\"handleExpandClick()\"\n [matTooltip]=\"localExpanded() ? 'Collapse' : 'Expand'\"\n >\n <mat-icon>{{ localExpanded() ? 'expand_more' : 'chevron_right' }}</mat-icon>\n </button>\n } @else {\n <span class=\"expand-placeholder\"></span>\n }\n\n <!-- Type Icon -->\n <mat-icon class=\"type-icon\" [matTooltip]=\"field.type\">{{ getTypeIcon(field.type) }}</mat-icon>\n\n <!-- Field Name -->\n <input\n class=\"field-name-input\"\n [value]=\"field.name\"\n (input)=\"onFieldNameChange($event)\"\n (blur)=\"onFieldNameBlur()\"\n placeholder=\"Field name\"\n matTooltip=\"Property name in JSON Schema\"\n />\n @if (field.type === 'array') {\n <span class=\"array-indicator\">[]</span>\n }\n\n <!-- Required Toggle -->\n <button\n class=\"required-btn\"\n [class.is-required]=\"field.required\"\n (click)=\"toggleRequired()\"\n [matTooltip]=\"field.required ? 'Required (click to make optional)' : 'Optional (click to make required)'\"\n >\n <mat-icon>{{ field.required ? 'star' : 'star_border' }}</mat-icon>\n </button>\n </div>\n\n <!-- Middle section: label (flexible) -->\n <input\n class=\"label-input\"\n [value]=\"field.label || ''\"\n (input)=\"onLabelChange($any($event.target).value)\"\n (blur)=\"onLabelBlur()\"\n placeholder=\"Label...\"\n matTooltip=\"Display label (stored as title)\"\n />\n\n <!-- Right section: type and actions -->\n <div class=\"field-right\">\n <!-- Type Selector -->\n <mat-form-field appearance=\"outline\" class=\"type-selector\" matTooltip=\"Data type\">\n <mat-select [value]=\"field.type\" (selectionChange)=\"onFieldTypeChange($event.value)\" panelClass=\"schema-editor-select-panel\">\n @for (type of fieldTypes; track type.value) {\n <mat-option [value]=\"type.value\">\n <mat-icon>{{ type.icon }}</mat-icon>\n {{ type.label }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n\n <!-- Display Type Selector -->\n @if (showDisplayType) {\n @if (field.type === 'string' || field.type === 'number' || field.type === 'boolean' || field.type === 'date' || field.type === 'time') {\n <mat-form-field appearance=\"outline\" class=\"display-type-selector\" matTooltip=\"Display Type\">\n <mat-select [value]=\"field.displayType\" (selectionChange)=\"onDisplayTypeChange($event.value)\" panelClass=\"schema-editor-select-panel\">\n @for (dt of getDisplayTypes(field.type); track dt.value) {\n <mat-option [value]=\"dt.value\">\n <mat-icon>{{ dt.icon }}</mat-icon>\n {{ dt.label }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n } @else {\n <div class=\"display-type-placeholder\"></div>\n }\n }\n\n <!-- Actions -->\n <div class=\"field-actions\">\n @if (field.type === 'object' || canAddChildToArray()) {\n <button\n mat-icon-button\n (click)=\"addChildField()\"\n [matTooltip]=\"field.type === 'array' ? 'Define item schema' : 'Add child field'\"\n >\n <mat-icon>add_circle_outline</mat-icon>\n </button>\n }\n @if (field.type === 'string' || field.type === 'number') {\n <button\n mat-icon-button\n (click)=\"toggleValuesEditor()\"\n [matTooltip]=\"field.allowedValues?.length ? 'Edit allowed values (' + field.allowedValues!.length + ')' : 'Add allowed values'\"\n [class.has-values]=\"field.allowedValues?.length\"\n >\n <mat-icon>list</mat-icon>\n </button>\n }\n @if (field.type !== 'object' && field.type !== 'array') {\n <button\n mat-icon-button\n (click)=\"toggleDefaultEditor()\"\n [matTooltip]=\"field.defaultValue !== undefined ? 'Default: ' + field.defaultValue : 'Set default value'\"\n [class.has-default]=\"field.defaultValue !== undefined\"\n >\n <mat-icon>{{ field.defaultValue !== undefined ? 'label' : 'label_outline' }}</mat-icon>\n </button>\n }\n @if (field.type === 'string' || field.type === 'number') {\n <button\n mat-icon-button\n (click)=\"toggleValidatorsEditor()\"\n [matTooltip]=\"hasValidators() ? 'Edit validators' : 'Add validators'\"\n [class.has-validators]=\"hasValidators()\"\n >\n <mat-icon>rule</mat-icon>\n </button>\n }\n <button mat-icon-button [matMenuTriggerFor]=\"fieldMenu\" matTooltip=\"More options\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #fieldMenu=\"matMenu\">\n <button mat-menu-item (click)=\"duplicateField()\">\n <mat-icon>content_copy</mat-icon>\n <span>Duplicate</span>\n </button>\n <button mat-menu-item (click)=\"deleteField()\" class=\"delete-action\">\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </mat-menu>\n </div>\n </div>\n </div>\n\n <!-- Allowed Values Editor -->\n @if (field.isEditingValues && (field.type === 'string' || field.type === 'number')) {\n <div class=\"allowed-values-editor\">\n <div class=\"values-header\">\n <span class=\"values-label\">Allowed values:</span>\n <input\n #valueInput\n class=\"value-input\"\n type=\"text\"\n placeholder=\"Type value and press Enter\"\n (keydown)=\"onAllowedValueKeydown($event, valueInput)\"\n />\n <button class=\"add-value-btn\" (click)=\"addAllowedValue($event)\" matTooltip=\"Add value\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n @if (field.allowedValues && field.allowedValues.length > 0) {\n <div class=\"values-list\">\n @for (value of field.allowedValues; track value; let vi = $index) {\n <span class=\"value-chip\">\n {{ value }}\n <button class=\"remove-value-btn\" (click)=\"removeAllowedValue(vi)\" matTooltip=\"Remove\">\n <mat-icon>close</mat-icon>\n </button>\n </span>\n }\n </div>\n } @else {\n <div class=\"no-values\">No values defined yet</div>\n }\n </div>\n }\n\n <!-- Default Value Editor -->\n @if (field.isEditingDefault && field.type !== 'object' && field.type !== 'array') {\n <div class=\"default-value-editor\">\n <div class=\"default-header\">\n <span class=\"default-label\">Default value:</span>\n @if (field.type === 'boolean') {\n <select\n class=\"default-select\"\n [value]=\"field.defaultValue?.toString() || ''\"\n (change)=\"onDefaultValueChange($any($event.target).value)\"\n >\n <option value=\"\">No default</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n } @else {\n <input\n class=\"default-input\"\n [type]=\"field.type === 'number' ? 'number' : 'text'\"\n [value]=\"field.defaultValue ?? ''\"\n (input)=\"onDefaultValueChange($any($event.target).value)\"\n (keydown)=\"onDefaultValueKeydown($event)\"\n placeholder=\"Enter default value\"\n />\n }\n @if (field.defaultValue !== undefined) {\n <button class=\"clear-default-btn\" (click)=\"clearDefaultValue()\" matTooltip=\"Clear default\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Validators Editor -->\n @if (field.isEditingValidators && (field.type === 'string' || field.type === 'number')) {\n <div class=\"validators-editor\">\n <div class=\"validators-header\">\n <span class=\"validators-label\">Validators:</span>\n </div>\n @if (field.type === 'string') {\n <div class=\"validators-row\">\n <div class=\"validator-field\">\n <label>Format</label>\n <select\n class=\"validator-select\"\n [value]=\"field.format || ''\"\n (change)=\"onFormatChange($any($event.target).value)\"\n >\n @for (fmt of stringFormats; track fmt.value) {\n <option [value]=\"fmt.value\">{{ fmt.label }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"validators-row\">\n <div class=\"validator-field\">\n <label>Min Length</label>\n <input\n type=\"number\"\n class=\"validator-input\"\n [value]=\"field.minLength ?? ''\"\n (input)=\"onMinLengthChange($any($event.target).value)\"\n placeholder=\"0\"\n min=\"0\"\n />\n </div>\n <div class=\"validator-field\">\n <label>Max Length</label>\n <input\n type=\"number\"\n class=\"validator-input\"\n [value]=\"field.maxLength ?? ''\"\n (input)=\"onMaxLengthChange($any($event.target).value)\"\n placeholder=\"∞\"\n min=\"0\"\n />\n </div>\n @if (!field.format) {\n <div class=\"validator-field pattern-field\">\n <label>Pattern (regex)</label>\n <input\n type=\"text\"\n class=\"validator-input\"\n [value]=\"field.pattern ?? ''\"\n (input)=\"onPatternChange($any($event.target).value)\"\n placeholder=\"^[a-z]+$\"\n />\n </div>\n }\n </div>\n }\n @if (field.type === 'number') {\n <div class=\"validators-row\">\n <div class=\"validator-field\">\n <label>Minimum</label>\n <input\n type=\"number\"\n class=\"validator-input\"\n [value]=\"field.minimum ?? ''\"\n (input)=\"onMinimumChange($any($event.target).value)\"\n placeholder=\"-∞\"\n />\n </div>\n <div class=\"validator-field\">\n <label>Maximum</label>\n <input\n type=\"number\"\n class=\"validator-input\"\n [value]=\"field.maximum ?? ''\"\n (input)=\"onMaximumChange($any($event.target).value)\"\n placeholder=\"∞\"\n />\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Nested Children -->\n @if ((field.type === 'object' || field.type === 'array') && (localExpanded() || field.expanded)) {\n <div\n class=\"nested-fields\"\n cdkDropList\n [cdkDropListData]=\"field.children || []\"\n (cdkDropListDropped)=\"onFieldDrop($event)\"\n >\n @if (field.children && field.children.length > 0) {\n @for (child of field.children; track child.id) {\n <field-item\n cdkDrag\n [field]=\"child\"\n [parentList]=\"field.children\"\n [level]=\"level + 1\"\n [showDisplayType]=\"showDisplayType\"\n (fieldChange)=\"onChildFieldChange()\"\n (delete)=\"onChildDelete($event)\"\n (duplicate)=\"onChildDuplicate($event)\"\n (outdent)=\"onChildOutdent($event)\"\n >\n <!-- Drag Placeholder -->\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <!-- Drag Preview -->\n <div *cdkDragPreview class=\"drag-preview\">\n <mat-icon>{{ getTypeIcon(child.type) }}</mat-icon>\n {{ child.name || 'unnamed' }}\n </div>\n </field-item>\n }\n } @else {\n <div class=\"empty-nested\">\n <span>{{ getEmptyMessage() }}</span>\n <button mat-button (click)=\"addChildField()\" color=\"primary\">\n <mat-icon>add</mat-icon>\n {{ getAddButtonLabel() }}\n </button>\n </div>\n }\n </div>\n }\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n inject,\n ApplicationRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { JsonSchema } from '../../models/json-schema.model';\nimport { FieldItemComponent, EditorField } from './field-item/field-item.component';\n\n// Display type options for form rendering\ntype DisplayType = 'textbox' | 'dropdown' | 'textarea' | 'richtext' | 'datepicker' | 'datetimepicker' | 'timepicker' | 'stepper' | 'checkbox' | 'toggle';\n\n@Component({\n selector: 'schema-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatIconModule,\n MatInputModule,\n MatFormFieldModule,\n MatSelectModule,\n MatTooltipModule,\n MatMenuModule,\n MatButtonToggleModule,\n DragDropModule,\n FieldItemComponent,\n ],\n templateUrl: './schema-editor.component.html',\n styleUrl: './schema-editor.component.scss',\n})\nexport class SchemaEditorComponent {\n private appRef = inject(ApplicationRef);\n\n @Input() set schema(value: JsonSchema | null) {\n if (value) {\n // Don't overwrite fields if we have uncommitted changes (fields with editors open or empty names)\n const hasUncommittedChanges = this.fields().some(f =>\n f.isEditingDefault || f.isEditingValues || f.isEditingValidators || !f.name\n ) || this.hasUncommittedChildFields(this.fields());\n\n this.schemaName.set(value.title || 'New Schema');\n\n if (!hasUncommittedChanges) {\n this.fields.set(this.jsonSchemaToEditorFields(value));\n }\n }\n }\n\n private hasUncommittedChildFields(fields: EditorField[]): boolean {\n for (const field of fields) {\n if (field.children) {\n if (field.children.some(c => c.isEditingDefault || c.isEditingValues || c.isEditingValidators || !c.name)) {\n return true;\n }\n if (this.hasUncommittedChildFields(field.children)) {\n return true;\n }\n }\n }\n return false;\n }\n\n @Input() showJsonToggle = true;\n @Input() showSchemaName = true;\n @Input() showDisplayType = false;\n\n @Output() schemaChange = new EventEmitter<JsonSchema>();\n @Output() save = new EventEmitter<JsonSchema>();\n\n schemaName = signal('New Schema');\n fields = signal<EditorField[]>([]);\n\n // View mode: 'visual' or 'json'\n viewMode = signal<'visual' | 'json'>('visual');\n jsonText = signal<string>('');\n jsonError = signal<string | null>(null);\n\n fieldTypes: Array<{ value: string; label: string; icon: string }> = [\n { value: 'string', label: 'String', icon: 'text_fields' },\n { value: 'number', label: 'Number', icon: 'pin' },\n { value: 'boolean', label: 'Boolean', icon: 'toggle_on' },\n { value: 'date', label: 'Date', icon: 'calendar_today' },\n { value: 'time', label: 'Time', icon: 'schedule' },\n { value: 'object', label: 'Object', icon: 'data_object' },\n { value: 'array', label: 'Array', icon: 'data_array' },\n ];\n\n stringDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n { value: 'dropdown', label: 'Dropdown', icon: 'arrow_drop_down_circle' },\n { value: 'textarea', label: 'Textarea', icon: 'notes' },\n { value: 'richtext', label: 'Rich Text', icon: 'format_color_text' },\n ];\n\n dateDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'datepicker', label: 'Date Picker', icon: 'calendar_today' },\n { value: 'datetimepicker', label: 'DateTime Picker', icon: 'schedule' },\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n ];\n\n timeDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'timepicker', label: 'Time Picker', icon: 'schedule' },\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n ];\n\n numberDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'textbox', label: 'Textbox', icon: 'edit' },\n { value: 'stepper', label: 'Stepper', icon: 'unfold_more' },\n ];\n\n booleanDisplayTypes: Array<{ value: DisplayType; label: string; icon: string }> = [\n { value: 'checkbox', label: 'Checkbox', icon: 'check_box' },\n { value: 'toggle', label: 'Toggle', icon: 'toggle_on' },\n ];\n\n stringFormats: Array<{ value: string; label: string }> = [\n { value: '', label: '(none)' },\n { value: 'email', label: 'Email' },\n { value: 'uri', label: 'URI (URL)' },\n { value: 'uuid', label: 'UUID' },\n ];\n\n getDisplayTypes(fieldType: string): Array<{ value: DisplayType; label: string; icon: string }> {\n if (fieldType === 'date') return this.dateDisplayTypes;\n if (fieldType === 'time') return this.timeDisplayTypes;\n if (fieldType === 'number') return this.numberDisplayTypes;\n if (fieldType === 'boolean') return this.booleanDisplayTypes;\n return this.stringDisplayTypes;\n }\n\n private generateId(): string {\n return `field-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cloneFields(fields: EditorField[]): EditorField[] {\n return fields.map(f => ({\n ...f,\n children: f.children ? this.cloneFields(f.children) : undefined,\n }));\n }\n\n getTypeIcon(type: string): string {\n return this.fieldTypes.find(t => t.value === type)?.icon || 'help_outline';\n }\n\n // Add a new field at the root level\n addField(): void {\n const newField: EditorField = {\n id: this.generateId(),\n name: '',\n type: 'string',\n displayType: 'textbox',\n expanded: false,\n };\n this.fields.update(fields => [...fields, newField]);\n }\n\n // Add a child field to an object or array\n addChildField(parent: EditorField): void {\n if (!parent.children) {\n parent.children = [];\n }\n const newField: EditorField = {\n id: this.generateId(),\n name: '',\n type: 'string',\n displayType: 'textbox',\n };\n parent.children.push(newField);\n parent.expanded = true;\n this.fields.update(fields => [...fields]);\n }\n\n // Handle field change from FieldItemComponent\n onFieldChange(): void {\n // Just emit the change - field objects are mutated in place\n // Don't recreate array or force tick as it causes expanded state to reset\n this.emitChange();\n }\n\n // Handle field delete from FieldItemComponent\n onFieldDelete(field: EditorField): void {\n const index = this.fields().indexOf(field);\n if (index > -1) {\n this.fields.update(fields => {\n const newFields = [...fields];\n newFields.splice(index, 1);\n return newFields;\n });\n this.emitChange();\n }\n }\n\n // Handle field duplicate from FieldItemComponent\n onFieldDuplicate(field: EditorField): void {\n const index = this.fields().indexOf(field);\n if (index > -1) {\n const clone: EditorField = {\n ...field,\n id: this.generateId(),\n name: field.name + '_copy',\n children: field.children ? this.cloneFields(field.children) : undefined,\n };\n this.fields.update(fields => {\n const newFields = [...fields];\n newFields.splice(index + 1, 0, clone);\n return newFields;\n });\n this.emitChange();\n }\n }\n\n // Delete a field\n deleteField(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index > -1) {\n parentList.splice(index, 1);\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Duplicate a field\n duplicateField(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index > -1) {\n const clone: EditorField = {\n ...field,\n id: this.generateId(),\n name: field.name + '_copy',\n children: field.children ? this.cloneFields(field.children) : undefined,\n };\n parentList.splice(index + 1, 0, clone);\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Toggle field expansion\n toggleExpand(field: EditorField): void {\n field.expanded = !field.expanded;\n this.fields.update(fields => [...fields]);\n }\n\n // Handle field name input - only allow valid property name characters\n onFieldNameChange(field: EditorField, event: Event): void {\n const input = event.target as HTMLInputElement;\n // Remove invalid characters: only allow letters, numbers, underscores, and dollar signs\n // Property names should start with letter, underscore, or dollar sign\n const sanitized = input.value.replace(/[^a-zA-Z0-9_$]/g, '');\n field.name = sanitized;\n // Update input value if it was sanitized\n if (input.value !== sanitized) {\n input.value = sanitized;\n }\n }\n\n // Handle field name blur - ensure name is valid and emit change\n onFieldNameBlur(field: EditorField): void {\n if (!field.name.trim()) {\n field.name = 'unnamed';\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Handle field type change\n onFieldTypeChange(field: EditorField, type: string): void {\n field.type = type as EditorField['type'];\n // Initialize children array for object/array types\n if ((type === 'object' || type === 'array') && !field.children) {\n field.children = [];\n }\n // Set default display type based on field type\n if (type === 'string') {\n field.displayType = 'textbox';\n } else if (type === 'number') {\n field.displayType = 'textbox';\n } else if (type === 'boolean') {\n field.displayType = 'checkbox';\n } else if (type === 'date') {\n field.displayType = 'datepicker';\n } else if (type === 'time') {\n field.displayType = 'timepicker';\n } else {\n field.displayType = undefined;\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Handle display type change\n onDisplayTypeChange(field: EditorField, displayType: string): void {\n field.displayType = displayType as DisplayType;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Toggle required status\n toggleRequired(field: EditorField): void {\n field.required = !field.required;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update field label (only update the field, don't trigger re-render)\n onLabelChange(field: EditorField, label: string): void {\n field.label = label;\n }\n\n // Emit change when label input loses focus\n onLabelBlur(): void {\n this.emitChange();\n }\n\n // Toggle allowed values editor\n toggleValuesEditor(field: EditorField): void {\n field.isEditingValues = !field.isEditingValues;\n if (field.isEditingValues) {\n // Close other editors\n field.isEditingDefault = false;\n field.isEditingValidators = false;\n if (!field.allowedValues) {\n field.allowedValues = [];\n }\n }\n this.fields.update(fields => [...fields]);\n }\n\n // Add allowed value\n addAllowedValue(field: EditorField, input: HTMLInputElement | Event): void {\n // Handle both direct input reference and event from button click\n let inputEl: HTMLInputElement | null = null;\n\n if (input instanceof HTMLInputElement) {\n inputEl = input;\n } else {\n // Find the input by traversing up to .values-header and then querying for .value-input\n const target = input.target as HTMLElement;\n const header = target.closest('.values-header');\n inputEl = header?.querySelector('.value-input') as HTMLInputElement;\n }\n\n if (!inputEl) return;\n\n const value = inputEl.value.trim();\n if (value && !field.allowedValues?.includes(value)) {\n if (!field.allowedValues) {\n field.allowedValues = [];\n }\n field.allowedValues.push(value);\n inputEl.value = '';\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Remove allowed value\n removeAllowedValue(field: EditorField, index: number): void {\n if (field.allowedValues) {\n field.allowedValues.splice(index, 1);\n if (field.allowedValues.length === 0) {\n field.allowedValues = undefined;\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Handle Enter key in allowed value input\n onAllowedValueKeydown(event: KeyboardEvent, field: EditorField, input: HTMLInputElement): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.addAllowedValue(field, input);\n }\n }\n\n // Toggle default value editor\n toggleDefaultEditor(field: EditorField): void {\n field.isEditingDefault = !field.isEditingDefault;\n if (field.isEditingDefault) {\n // Close other editors\n field.isEditingValues = false;\n field.isEditingValidators = false;\n }\n this.fields.update(fields => [...fields]);\n }\n\n // Update default value\n onDefaultValueChange(field: EditorField, value: string): void {\n if (value === '') {\n field.defaultValue = undefined;\n } else if (field.type === 'number') {\n const num = parseFloat(value);\n field.defaultValue = isNaN(num) ? undefined : num;\n } else if (field.type === 'boolean') {\n field.defaultValue = value === 'true';\n } else {\n field.defaultValue = value;\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Clear default value\n clearDefaultValue(field: EditorField): void {\n field.defaultValue = undefined;\n field.isEditingDefault = false;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Handle Enter key in default value input\n onDefaultValueKeydown(event: KeyboardEvent, field: EditorField): void {\n if (event.key === 'Enter' || event.key === 'Escape') {\n field.isEditingDefault = false;\n this.fields.update(fields => [...fields]);\n }\n }\n\n // Toggle validators editor\n toggleValidatorsEditor(field: EditorField): void {\n field.isEditingValidators = !field.isEditingValidators;\n if (field.isEditingValidators) {\n // Close other editors\n field.isEditingValues = false;\n field.isEditingDefault = false;\n }\n this.fields.update(fields => [...fields]);\n }\n\n // Check if field has any validators set\n hasValidators(field: EditorField): boolean {\n if (field.type === 'string') {\n return !!(field.minLength || field.maxLength || field.pattern || field.format);\n }\n if (field.type === 'number') {\n return field.minimum !== undefined || field.maximum !== undefined;\n }\n return false;\n }\n\n // Update string format\n onFormatChange(field: EditorField, format: string): void {\n field.format = format || undefined;\n // Clear pattern when format is set (they're mutually exclusive)\n if (format) {\n field.pattern = undefined;\n }\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update minLength\n onMinLengthChange(field: EditorField, value: string): void {\n field.minLength = value ? parseInt(value, 10) : undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update maxLength\n onMaxLengthChange(field: EditorField, value: string): void {\n field.maxLength = value ? parseInt(value, 10) : undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update pattern\n onPatternChange(field: EditorField, value: string): void {\n field.pattern = value || undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update minimum\n onMinimumChange(field: EditorField, value: string): void {\n field.minimum = value ? parseFloat(value) : undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Update maximum\n onMaximumChange(field: EditorField, value: string): void {\n field.maximum = value ? parseFloat(value) : undefined;\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n\n // Move field up in list\n moveFieldUp(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index > 0) {\n [parentList[index - 1], parentList[index]] = [parentList[index], parentList[index - 1]];\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Move field down in list\n moveFieldDown(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index < parentList.length - 1) {\n [parentList[index], parentList[index + 1]] = [parentList[index + 1], parentList[index]];\n this.fields.update(fields => [...fields]);\n this.emitChange();\n }\n }\n\n // Handle drag and drop reorder\n onFieldDrop(event: CdkDragDrop<EditorField[]>): void {\n if (event.previousIndex !== event.currentIndex) {\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n this.fields.update(fields => [...fields]);\n // Don't emit change here - it causes parent to reset expanded state\n // Order change will be captured on next edit or save\n }\n }\n\n // Check if field can be indented (previous sibling must be object/array)\n canIndent(field: EditorField, parentList: EditorField[]): boolean {\n const index = parentList.indexOf(field);\n if (index <= 0) return false;\n const prevSibling = parentList[index - 1];\n return prevSibling.type === 'object' || prevSibling.type === 'array';\n }\n\n // Indent field - move into previous sibling's children\n indentField(field: EditorField, parentList: EditorField[]): void {\n const index = parentList.indexOf(field);\n if (index <= 0) return;\n\n const prevSibling = parentList[index - 1];\n if (prevSibling.type !== 'object' && prevSibling.type !== 'array') return;\n\n // Remove from current list\n parentList.splice(index, 1);\n\n // Add to previous sibling's children\n if (!prevSibling.children) {\n prevSibling.children = [];\n }\n prevSibling.children.push(field);\n\n // Always expand the target (keep open if already open, open if closed)\n prevSibling.expanded = true;\n\n this.fields.update(fields => [...fields]);\n // Don't emit change here - it causes parent to reset expanded state\n // Structure change will be captured on next edit or save\n }\n\n // Outdent field - move out of parent to grandparent level\n outdentField(field: EditorField, parentList: EditorField[], level: number): void {\n if (level === 0) return;\n\n // Find the parent object/array that contains this list\n const parent = this.findParentOfList(this.fields(), parentList);\n if (!parent) return;\n\n // Find the grandparent list\n const grandparentList = this.findParentList(this.fields(), parent);\n if (!grandparentList) return;\n\n // Remove from current list\n const index = parentList.indexOf(field);\n parentList.splice(index, 1);\n\n // Add to grandparent list after the parent\n const parentIndex = grandparentList.indexOf(parent);\n grandparentList.splice(parentIndex + 1, 0, field);\n\n this.fields.update(fields => [...fields]);\n // Don't emit change here - it causes parent to reset expanded state\n // Structure change will be captured on next edit or save\n }\n\n // Find the parent field that contains a given list\n private findParentOfList(searchIn: EditorField[], targetList: EditorField[]): EditorField | null {\n for (const field of searchIn) {\n if (field.children === targetList) {\n return field;\n }\n if (field.children) {\n const found = this.findParentOfList(field.children, targetList);\n if (found) return found;\n }\n }\n return null;\n }\n\n // Find the list that contains a given field\n private findParentList(searchIn: EditorField[], targetField: EditorField): EditorField[] | null {\n if (searchIn.includes(targetField)) {\n return searchIn;\n }\n for (const field of searchIn) {\n if (field.children) {\n const found = this.findParentList(field.children, targetField);\n if (found) return found;\n }\n }\n return null;\n }\n\n // Update schema name - only allow valid characters\n onSchemaNameChange(name: string, input?: HTMLInputElement): void {\n const sanitized = name.replace(/[^a-zA-Z0-9_$]/g, '');\n this.schemaName.set(sanitized);\n if (input && input.value !== sanitized) {\n input.value = sanitized;\n }\n this.emitChange();\n }\n\n // Emit change event\n private emitChange(): void {\n this.schemaChange.emit(this.toJsonSchema() as JsonSchema);\n }\n\n // Save the schema\n onSave(): void {\n this.save.emit(this.toJsonSchema() as JsonSchema);\n }\n\n // Convert JSON Schema to internal EditorField format\n private jsonSchemaToEditorFields(schema: JsonSchema, requiredFields: string[] = []): EditorField[] {\n const fields: EditorField[] = [];\n\n if (schema.type === 'object' && schema.properties) {\n const required = schema.required || requiredFields;\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n fields.push(this.jsonSchemaPropertyToEditorField(name, propSchema, required.includes(name)));\n }\n }\n\n return fields;\n }\n\n private jsonSchemaPropertyToEditorField(name: string, schema: JsonSchema, isRequired: boolean): EditorField {\n const fieldType = this.jsonSchemaTypeToEditorType(schema);\n // Set displayType for string, number, boolean, date, and time fields\n let displayType: DisplayType | undefined;\n if (fieldType === 'string') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'textbox';\n } else if (fieldType === 'number') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'textbox';\n } else if (fieldType === 'boolean') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'checkbox';\n } else if (fieldType === 'date') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'datepicker';\n } else if (fieldType === 'time') {\n displayType = ((schema as Record<string, unknown>)['x-display-type'] as DisplayType | undefined) || 'timepicker';\n }\n\n // Preserve format for string types and date types\n let format: string | undefined;\n if (fieldType === 'string' && schema.format) {\n format = schema.format;\n } else if (fieldType === 'date' && schema.format) {\n format = schema.format; // Preserve 'date' vs 'date-time'\n }\n\n const field: EditorField = {\n id: this.generateId(),\n name,\n type: fieldType,\n format,\n displayType,\n label: schema.title,\n required: isRequired,\n allowedValues: schema.enum as string[] | undefined,\n defaultValue: schema.default as string | number | boolean | undefined,\n // Validators\n minLength: schema.minLength,\n maxLength: schema.maxLength,\n pattern: schema.pattern,\n minimum: schema.minimum,\n maximum: schema.maximum,\n expanded: false,\n };\n\n if (schema.type === 'object' && schema.properties) {\n field.children = this.jsonSchemaToEditorFields(schema, schema.required);\n } else if (schema.type === 'array' && schema.items) {\n if (schema.items.type === 'object' && schema.items.properties) {\n field.children = this.jsonSchemaToEditorFields(schema.items, schema.items.required);\n }\n }\n\n return field;\n }\n\n private jsonSchemaTypeToEditorType(schema: JsonSchema): EditorField['type'] {\n if (schema.format === 'date' || schema.format === 'date-time') {\n return 'date';\n }\n if (schema.format === 'time') {\n return 'time';\n }\n const type = Array.isArray(schema.type) ? schema.type[0] : schema.type;\n switch (type) {\n case 'string': return 'string';\n case 'number':\n case 'integer': return 'number';\n case 'boolean': return 'boolean';\n case 'object': return 'object';\n case 'array': return 'array';\n default: return 'string';\n }\n }\n\n // Convert to internal JSON format\n toJson(): string {\n return JSON.stringify(\n {\n name: this.schemaName(),\n fields: this.stripEditingState(this.fields()),\n },\n null,\n 2\n );\n }\n\n // Convert to valid JSON Schema format\n toJsonSchema(): object {\n const required: string[] = [];\n const properties: Record<string, object> = {};\n\n for (const field of this.fields()) {\n if (field.required && field.name) {\n required.push(field.name);\n }\n if (field.name) {\n properties[field.name] = this.fieldToJsonSchema(field);\n }\n }\n\n const schema: Record<string, unknown> = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n type: 'object',\n title: this.schemaName(),\n properties,\n };\n\n if (required.length > 0) {\n schema['required'] = required;\n }\n\n return schema;\n }\n\n private fieldToJsonSchema(field: EditorField): object {\n const schema: Record<string, unknown> = {};\n\n // Map type\n if (field.type === 'date') {\n schema['type'] = 'string';\n schema['format'] = field.format || 'date-time'; // Use preserved format or default\n } else if (field.type === 'time') {\n schema['type'] = 'string';\n schema['format'] = 'time';\n } else if (field.type === 'array') {\n schema['type'] = 'array';\n if (field.children && field.children.length > 0) {\n // If array has children, treat first child as item schema\n const itemProperties: Record<string, object> = {};\n const itemRequired: string[] = [];\n for (const child of field.children) {\n if (child.name) {\n itemProperties[child.name] = this.fieldToJsonSchema(child);\n if (child.required) {\n itemRequired.push(child.name);\n }\n }\n }\n const items: Record<string, unknown> = {\n type: 'object',\n properties: itemProperties,\n };\n if (itemRequired.length > 0) {\n items['required'] = itemRequired;\n }\n schema['items'] = items;\n }\n } else if (field.type === 'object') {\n schema['type'] = 'object';\n if (field.children && field.children.length > 0) {\n const childProperties: Record<string, object> = {};\n const childRequired: string[] = [];\n for (const child of field.children) {\n if (child.name) {\n childProperties[child.name] = this.fieldToJsonSchema(child);\n if (child.required) {\n childRequired.push(child.name);\n }\n }\n }\n schema['properties'] = childProperties;\n if (childRequired.length > 0) {\n schema['required'] = childRequired;\n }\n }\n } else {\n schema['type'] = field.type;\n // Preserve format for string types (email, uri, uuid, etc.)\n if (field.type === 'string' && field.format) {\n schema['format'] = field.format;\n }\n }\n\n // Add label as title\n if (field.label) {\n schema['title'] = field.label;\n }\n\n // Add enum for allowed values\n if (field.allowedValues && field.allowedValues.length > 0) {\n schema['enum'] = field.allowedValues;\n }\n\n // Add default value\n if (field.defaultValue !== undefined) {\n schema['default'] = field.defaultValue;\n }\n\n // Add validators\n if (field.minLength !== undefined) {\n schema['minLength'] = field.minLength;\n }\n if (field.maxLength !== undefined) {\n schema['maxLength'] = field.maxLength;\n }\n if (field.pattern) {\n schema['pattern'] = field.pattern;\n }\n if (field.minimum !== undefined) {\n schema['minimum'] = field.minimum;\n }\n if (field.maximum !== undefined) {\n schema['maximum'] = field.maximum;\n }\n\n // Add display type (custom extension)\n if (field.displayType) {\n schema['x-display-type'] = field.displayType;\n }\n\n return schema;\n }\n\n private stripEditingState(fields: EditorField[]): EditorField[] {\n return fields.map(f => {\n const { isEditingValues, isEditingDefault, isEditingValidators, ...rest } = f;\n return {\n ...rest,\n children: f.children ? this.stripEditingState(f.children) : undefined,\n };\n });\n }\n\n // Track by function for ngFor\n trackByFieldId(index: number, field: EditorField): string {\n return field.id;\n }\n\n // --- JSON View Methods ---\n\n setViewMode(mode: 'visual' | 'json'): void {\n if (mode === 'json') {\n // Sync JSON text from current schema state\n this.jsonText.set(JSON.stringify(this.toJsonSchema(), null, 2));\n this.jsonError.set(null);\n }\n this.viewMode.set(mode);\n }\n\n onJsonTextChange(text: string): void {\n this.jsonText.set(text);\n try {\n JSON.parse(text);\n this.jsonError.set(null);\n } catch (e) {\n this.jsonError.set((e as Error).message);\n }\n }\n\n applyJsonChanges(): void {\n try {\n const parsed = JSON.parse(this.jsonText()) as JsonSchema;\n // Update internal state from JSON\n this.schemaName.set(parsed.title || 'New Schema');\n this.fields.set(this.jsonSchemaToEditorFields(parsed));\n this.jsonError.set(null);\n this.emitChange();\n } catch (e) {\n this.jsonError.set((e as Error).message);\n }\n }\n\n formatJson(): void {\n try {\n const parsed = JSON.parse(this.jsonText());\n this.jsonText.set(JSON.stringify(parsed, null, 2));\n this.jsonError.set(null);\n } catch (e) {\n this.jsonError.set((e as Error).message);\n }\n }\n\n copyJson(): void {\n const text = this.jsonText();\n navigator.clipboard.writeText(text).catch(err => {\n console.error('Failed to copy JSON to clipboard:', err);\n });\n }\n}\n","<div class=\"schema-editor\">\n <!-- Schema Header -->\n <div class=\"editor-header\">\n @if (showSchemaName) {\n <div class=\"schema-name-section\">\n <mat-form-field appearance=\"outline\" class=\"schema-name-field\">\n <mat-label>Schema Name</mat-label>\n <input\n #schemaNameInput\n matInput\n [value]=\"schemaName()\"\n (input)=\"onSchemaNameChange($any($event.target).value, schemaNameInput)\"\n placeholder=\"Enter schema name\"\n />\n </mat-form-field>\n </div>\n }\n\n @if (showJsonToggle) {\n <mat-button-toggle-group [value]=\"viewMode()\" (change)=\"setViewMode($event.value)\" class=\"view-toggle\">\n <mat-button-toggle value=\"visual\">Visual</mat-button-toggle>\n <mat-button-toggle value=\"json\">JSON</mat-button-toggle>\n </mat-button-toggle-group>\n }\n\n <div class=\"header-actions\">\n @if (viewMode() === 'visual') {\n <button mat-flat-button color=\"primary\" (click)=\"addField()\">\n <mat-icon>add</mat-icon>\n Add Field\n </button>\n } @else {\n <button mat-stroked-button (click)=\"copyJson()\" matTooltip=\"Copy JSON to clipboard\">\n <mat-icon>content_copy</mat-icon>\n Copy\n </button>\n <button mat-stroked-button (click)=\"formatJson()\">\n <mat-icon>auto_fix_high</mat-icon>\n Format\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"applyJsonChanges()\" [disabled]=\"jsonError()\">\n <mat-icon>check</mat-icon>\n Apply\n </button>\n }\n </div>\n </div>\n\n <!-- JSON View -->\n @if (viewMode() === 'json') {\n <div class=\"json-view\">\n @if (jsonError()) {\n <div class=\"json-error\">\n <mat-icon>error</mat-icon>\n {{ jsonError() }}\n </div>\n }\n <textarea\n class=\"json-textarea\"\n [value]=\"jsonText()\"\n (input)=\"onJsonTextChange($any($event.target).value)\"\n spellcheck=\"false\"\n ></textarea>\n </div>\n }\n\n <!-- Fields List (Visual View) -->\n <div class=\"fields-container\" [class.hidden]=\"viewMode() === 'json'\">\n @if (fields().length === 0) {\n <div class=\"empty-state\">\n <mat-icon>schema</mat-icon>\n <p>No fields yet. Click \"Add Field\" to get started.</p>\n </div>\n } @else {\n <div\n class=\"fields-list\"\n cdkDropList\n [cdkDropListData]=\"fields()\"\n (cdkDropListDropped)=\"onFieldDrop($event)\"\n >\n @for (field of fields(); track field.id) {\n <field-item\n cdkDrag\n [field]=\"field\"\n [parentList]=\"fields()\"\n [level]=\"0\"\n [showDisplayType]=\"showDisplayType\"\n (fieldChange)=\"onFieldChange()\"\n (delete)=\"onFieldDelete($event)\"\n (duplicate)=\"onFieldDuplicate($event)\"\n >\n <!-- Drag Placeholder -->\n <div class=\"drag-placeholder\" *cdkDragPlaceholder></div>\n <!-- Drag Preview -->\n <div *cdkDragPreview class=\"drag-preview\">\n <mat-icon>{{ getTypeIcon(field.type) }}</mat-icon>\n {{ field.name || 'unnamed' }}\n </div>\n </field-item>\n }\n </div>\n }\n </div>\n</div>\n","/*\r\n * Public API Surface of ngx-data-mapper\r\n */\r\n\r\n// Models\r\nexport * from './lib/models/schema.model';\r\nexport * from './lib/models/json-schema.model';\r\n\r\n// Services\r\nexport * from './lib/services/mapping.service';\r\nexport * from './lib/services/transformation.service';\r\nexport * from './lib/services/svg-connector.service';\r\nexport * from './lib/services/schema-parser.service';\r\n\r\n// Components\r\nexport * from './lib/components/data-mapper/data-mapper.component';\r\nexport * from './lib/components/schema-editor/schema-editor.component';\r\nexport * from './lib/components/schema-tree/schema-tree.component';\r\nexport * from './lib/components/transformation-popover/transformation-popover.component';\r\nexport * from './lib/components/array-filter-modal/array-filter-modal.component';\r\nexport * from './lib/components/array-selector-modal/array-selector-modal.component';\r\nexport * from './lib/components/default-value-popover/default-value-popover.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3","i6","i2","i4","i5","i9","i7","i8","i1"],"mappings":"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"}