@praxisui/visual-builder 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"praxisui-visual-builder.mjs","sources":["../../../projects/praxis-visual-builder/src/lib/models/rule-builder.model.ts","../../../projects/praxis-visual-builder/src/lib/models/field-schema.model.ts","../../../projects/praxis-visual-builder/src/lib/components/field-condition-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/components/conditional-validator-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/components/collection-validator-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/components/rule-node.component.ts","../../../projects/praxis-visual-builder/src/lib/components/rule-canvas.component.ts","../../../projects/praxis-visual-builder/src/lib/components/metadata-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/components/dsl-viewer.component.ts","../../../projects/praxis-visual-builder/src/lib/components/json-viewer.component.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-node-registry.service.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/conversion-context.interface.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/rule-converter.interface.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/field-condition.converter.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/boolean-group.converter.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/cardinality.converter.ts","../../../projects/praxis-visual-builder/src/lib/services/converters/converter-factory.service.ts","../../../projects/praxis-visual-builder/src/lib/services/specification-bridge.service.ts","../../../projects/praxis-visual-builder/src/lib/services/round-trip-validator.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-builder.service.ts","../../../projects/praxis-visual-builder/src/lib/components/round-trip-tester.component.ts","../../../projects/praxis-visual-builder/src/lib/services/export-integration.service.ts","../../../projects/praxis-visual-builder/src/lib/components/export-dialog.component.ts","../../../projects/praxis-visual-builder/src/lib/components/dsl-linter.component.ts","../../../projects/praxis-visual-builder/src/lib/services/field-schema.service.ts","../../../projects/praxis-visual-builder/src/lib/components/rule-editor.component.ts","../../../projects/praxis-visual-builder/src/lib/praxis-visual-builder.ts","../../../projects/praxis-visual-builder/src/lib/models/array-field-schema.model.ts","../../../projects/praxis-visual-builder/src/lib/services/webhook-integration.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-template.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-validation.service.ts","../../../projects/praxis-visual-builder/src/lib/errors/visual-builder-errors.ts","../../../projects/praxis-visual-builder/src/lib/services/dsl/dsl-parsing.service.ts","../../../projects/praxis-visual-builder/src/lib/services/context/context-management.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-conversion.service.ts","../../../projects/praxis-visual-builder/src/lib/components/visual-rule-builder.component.ts","../../../projects/praxis-visual-builder/src/lib/components/template-editor-dialog.component.ts","../../../projects/praxis-visual-builder/src/lib/components/template-preview-dialog.component.ts","../../../projects/praxis-visual-builder/src/lib/components/template-gallery.component.ts","../../../projects/praxis-visual-builder/src/public-api.ts","../../../projects/praxis-visual-builder/src/praxisui-visual-builder.ts"],"sourcesContent":["/**\n * Models for the Visual Rule Builder\n */\n\nimport {\n ContextProvider,\n type FunctionRegistry,\n} from '@praxisui/specification';\nimport { type SpecificationMetadata } from '@praxisui/specification-core';\nexport type { SpecificationMetadata };\n\n/**\n * Value types for rule configuration\n */\nexport type ValueType = 'literal' | 'field' | 'context' | 'function';\n\n/**\n * Valid comparison operators (aligned with @praxisui/specification)\n */\nexport type ValidComparisonOperator =\n | 'eq'\n | 'neq'\n | 'lt'\n | 'lte'\n | 'gt'\n | 'gte'\n | 'contains'\n | 'startsWith'\n | 'endsWith'\n | 'in';\n\nexport interface RuleNode {\n /** Unique identifier for this rule node */\n id: string;\n\n /** Type of rule node */\n type: RuleNodeType | RuleNodeTypeString;\n\n /** Human-readable label for this rule */\n label?: string;\n\n /** Rule metadata */\n metadata?: SpecificationMetadata;\n\n /** Whether this node is currently selected */\n selected?: boolean;\n\n /** Whether this node is expanded (for groups) */\n expanded?: boolean;\n\n /** Parent node ID */\n parentId?: string;\n\n /** Child node IDs (for groups) */\n children?: string[];\n\n /** Rule-specific configuration */\n config?: RuleNodeConfig;\n}\n\nexport enum RuleNodeType {\n // Basic field comparisons\n FIELD_CONDITION = 'fieldCondition',\n\n // Boolean compositions\n AND_GROUP = 'andGroup',\n OR_GROUP = 'orGroup',\n NOT_GROUP = 'notGroup',\n XOR_GROUP = 'xorGroup',\n IMPLIES_GROUP = 'impliesGroup',\n\n // Conditional validators (Phase 1 Implementation)\n REQUIRED_IF = 'requiredIf',\n VISIBLE_IF = 'visibleIf',\n DISABLED_IF = 'disabledIf',\n READONLY_IF = 'readonlyIf',\n\n // Collection validations\n FOR_EACH = 'forEach',\n UNIQUE_BY = 'uniqueBy',\n MIN_LENGTH = 'minLength',\n MAX_LENGTH = 'maxLength',\n\n // Optional field handling\n IF_DEFINED = 'ifDefined',\n IF_NOT_NULL = 'ifNotNull',\n IF_EXISTS = 'ifExists',\n WITH_DEFAULT = 'withDefault',\n\n // Advanced types\n FUNCTION_CALL = 'functionCall',\n FIELD_TO_FIELD = 'fieldToField',\n CONTEXTUAL = 'contextual',\n AT_LEAST = 'atLeast',\n EXACTLY = 'exactly',\n\n // Phase 4: Expression and Contextual Support\n EXPRESSION = 'expression',\n CONTEXTUAL_TEMPLATE = 'contextualTemplate',\n\n // Custom/extensible\n CUSTOM = 'custom',\n}\n\n/**\n * String literal type for rule node types (for flexibility)\n */\nexport type RuleNodeTypeString =\n | 'fieldCondition'\n | 'andGroup'\n | 'orGroup'\n | 'notGroup'\n | 'xorGroup'\n | 'impliesGroup'\n | 'requiredIf'\n | 'visibleIf'\n | 'disabledIf'\n | 'readonlyIf'\n | 'forEach'\n | 'uniqueBy'\n | 'minLength'\n | 'maxLength'\n | 'ifDefined'\n | 'ifNotNull'\n | 'ifExists'\n | 'withDefault'\n | 'functionCall'\n | 'fieldToField'\n | 'contextual'\n | 'atLeast'\n | 'exactly'\n | 'expression'\n | 'contextualTemplate'\n | 'custom';\n\nexport type RuleNodeConfig =\n | FieldConditionConfig\n | BooleanGroupConfig\n | ConditionalValidatorConfig\n | CollectionValidationConfig\n | CollectionValidatorConfig\n | OptionalFieldConfig\n | FunctionCallConfig\n | FieldToFieldConfig\n | ContextualConfig\n | CardinalityConfig\n | ExpressionConfig\n | ContextualTemplateConfig\n | CustomConfig;\n\nexport interface FieldConditionConfig {\n type: 'fieldCondition';\n /** Primary field name */\n fieldName: string;\n /** Comparison operator aligned with @praxisui/specification */\n operator: ValidComparisonOperator | string;\n /** Comparison value */\n value: unknown;\n /** Type of value for proper handling */\n valueType?: ValueType;\n /** Field to compare against (for field-to-field comparisons) */\n compareToField?: string;\n /** Context variable to use as value */\n contextVariable?: string;\n /** Optional metadata for error messages and UI hints */\n metadata?: SpecificationMetadata;\n /** Legacy field alias for backward compatibility */\n field?: string;\n}\n\nexport interface BooleanGroupConfig {\n type: 'booleanGroup' | 'andGroup' | 'orGroup' | 'notGroup' | 'xorGroup' | 'impliesGroup';\n /** Boolean operator type */\n operator: 'and' | 'or' | 'not' | 'xor' | 'implies';\n /** Minimum required true conditions (for atLeast scenarios) */\n minimumRequired?: number;\n /** Exact required true conditions (for exactly scenarios) */\n exactRequired?: number;\n /** Optional metadata for group validation */\n metadata?: SpecificationMetadata;\n}\n\nexport interface ConditionalValidatorConfig {\n type: 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf';\n /** Specific validator type (mirrors type for backward compatibility) */\n validatorType: 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf';\n /** Target field to apply conditional logic */\n targetField: string;\n /** Optional single condition (legacy support) */\n condition?: RuleNode;\n /** Multiple conditions for advanced mode */\n conditions?: RuleNode[];\n /** Reference to condition rule node ID (for backward compatibility) */\n conditionNodeId?: string;\n /** Whether to invert the condition result */\n inverse?: boolean;\n /** Logic operator to combine multiple conditions */\n logicOperator?: 'and' | 'or';\n /** Custom error message */\n errorMessage?: string;\n /** Validate on value change */\n validateOnChange?: boolean;\n /** Validate on blur */\n validateOnBlur?: boolean;\n /** Show error immediately */\n showErrorImmediately?: boolean;\n /** Animation type */\n animation?: string;\n /** Hide field label */\n hideLabel?: boolean;\n /** Preserve space when hidden */\n preserveSpace?: boolean;\n /** Style when disabled */\n disabledStyle?: string;\n /** Clear value when disabled */\n clearOnDisable?: boolean;\n /** Show disabled message */\n showDisabledMessage?: boolean;\n /** Custom disabled message */\n disabledMessage?: string;\n /** Readonly style */\n readonlyStyle?: string;\n /** Show readonly indicator */\n showReadonlyIndicator?: boolean;\n /** Metadata aligned with @praxisui/specification */\n metadata?: SpecificationMetadata;\n}\n\nexport interface CollectionValidationConfig {\n type: 'collectionValidation';\n /** Type of collection validation */\n validationType: 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength';\n /** Array field to validate */\n arrayField: string;\n /** Reference to rule node ID for forEach validation */\n itemCondition?: string;\n /** Property name for uniqueBy validation */\n uniqueKey?: string;\n /** Length value for min/max length validation */\n lengthValue?: number;\n /** Optional metadata for validation */\n metadata?: SpecificationMetadata;\n}\n\n/**\n * Enhanced collection validator configuration (Phase 2 Implementation)\n * Aligned with @praxisui/specification collection validation patterns\n */\nexport interface CollectionValidatorConfig {\n type: 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength';\n /** Target collection field name */\n targetCollection: string;\n\n // For Each specific\n /** Variable name for current item in forEach */\n itemVariable?: string;\n /** Variable name for current index in forEach */\n indexVariable?: string;\n /** Validation rules applied to each item */\n itemValidationRules?: {\n ruleType: string;\n fieldPath: string;\n errorMessage?: string;\n }[];\n\n // Unique By specific\n /** Fields to check uniqueness by */\n uniqueByFields?: string[];\n /** Case-sensitive uniqueness check */\n caseSensitive?: boolean;\n /** Ignore empty values in uniqueness check */\n ignoreEmpty?: boolean;\n /** Custom error message for duplicates */\n duplicateErrorMessage?: string;\n\n // Length specific\n /** Minimum number of items */\n minItems?: number;\n /** Maximum number of items */\n maxItems?: number;\n /** Custom error message for length validation */\n lengthErrorMessage?: string;\n /** Show current item count in UI */\n showItemCount?: boolean;\n /** Prevent adding items beyond maxItems */\n preventExcess?: boolean;\n\n // Advanced options\n /** Validate when items are added */\n validateOnAdd?: boolean;\n /** Validate when items are removed */\n validateOnRemove?: boolean;\n /** Validate when items are changed */\n validateOnChange?: boolean;\n /** Validate on form submit */\n validateOnSubmit?: boolean;\n /** Error display strategy */\n errorStrategy?: 'summary' | 'inline' | 'both';\n /** Stop validation on first error */\n stopOnFirstError?: boolean;\n /** Highlight items with errors */\n highlightErrorItems?: boolean;\n /** Batch size for large collections */\n batchSize?: number;\n /** Debounce validation for performance */\n debounceValidation?: boolean;\n /** Debounce delay in milliseconds */\n debounceDelay?: number;\n /** Optional metadata for validation messages */\n metadata?: SpecificationMetadata;\n}\n\nexport interface FunctionCallConfig {\n type: 'functionCall';\n /** Name of the function to call */\n functionName: string;\n /** Function parameters with type information */\n parameters: FunctionParameter[];\n /** Optional metadata for validation */\n metadata?: SpecificationMetadata;\n}\n\nexport interface FunctionParameter {\n /** Parameter name */\n name: string;\n /** Parameter value */\n value: unknown;\n /** Type of parameter value */\n valueType: ValueType;\n /** Field name if valueType is 'field' */\n fieldName?: string;\n /** Context variable name if valueType is 'context' */\n contextVariable?: string;\n}\n\nexport interface FieldToFieldConfig {\n type: 'fieldToField';\n /** Left side field name */\n leftField: string;\n /** Comparison operator */\n operator: ValidComparisonOperator | string;\n /** Right side field name */\n rightField: string;\n /** Transform functions applied to left field */\n leftTransforms?: string[];\n /** Transform functions applied to right field */\n rightTransforms?: string[];\n /** Optional metadata for validation */\n metadata?: SpecificationMetadata;\n}\n\nexport interface ContextualConfig {\n type: 'contextual';\n /** Template string with context placeholders */\n template: string;\n /** Available context variables */\n contextVariables: Record<string, unknown>;\n /** Optional context provider for dynamic values */\n contextProvider?: ContextProvider;\n /** Strict validation of context tokens */\n strictContextValidation?: boolean;\n /** Optional metadata */\n metadata?: SpecificationMetadata;\n}\n\nexport interface CardinalityConfig {\n type: 'cardinality';\n /** Type of cardinality check */\n cardinalityType: 'atLeast' | 'exactly';\n /** Required count of true conditions */\n count: number;\n /** References to rule node IDs to evaluate */\n conditions: string[];\n /** Optional metadata for validation */\n metadata?: SpecificationMetadata;\n}\n\nexport interface CustomConfig {\n type: 'custom';\n /** Custom configuration type identifier */\n customType: string;\n /** Custom properties specific to the type */\n properties: Record<string, unknown>;\n /** Optional metadata for validation */\n metadata?: SpecificationMetadata;\n}\n\n/**\n * Validator types for conditional validation\n */\nexport enum ConditionalValidatorType {\n REQUIRED_IF = 'requiredIf',\n VISIBLE_IF = 'visibleIf',\n DISABLED_IF = 'disabledIf',\n READONLY_IF = 'readonlyIf',\n}\n\n/**\n * Preview data for conditional validator simulation\n */\nexport interface ConditionalValidatorPreview {\n targetField: string;\n currentValue: unknown;\n conditionResult: boolean;\n validatorType: ConditionalValidatorType;\n resultingState: {\n isRequired?: boolean;\n isVisible?: boolean;\n isDisabled?: boolean;\n isReadonly?: boolean;\n };\n example: string;\n}\n\n/**\n * Rule building session state\n */\nexport interface RuleBuilderState {\n /** All rule nodes in the current session */\n nodes: Record<string, RuleNode>;\n\n /** Root node IDs (top-level rules) */\n rootNodes: string[];\n\n /** Currently selected node ID */\n selectedNodeId?: string;\n\n /** Current DSL representation */\n currentDSL?: string;\n\n /** Current JSON representation */\n currentJSON?: unknown;\n\n /** Validation errors */\n validationErrors: ValidationError[];\n\n /** Build mode */\n mode: 'visual' | 'dsl' | 'json';\n\n /** Whether the rule is dirty (has unsaved changes) */\n isDirty: boolean;\n\n /** Undo/redo history */\n history: RuleBuilderSnapshot[];\n\n /** Current history position */\n historyPosition: number;\n}\n\nexport interface ValidationError {\n /** Error ID */\n id: string;\n\n /** Error message */\n message: string;\n\n /** Error severity */\n severity: 'error' | 'warning' | 'info';\n\n /** Associated node ID */\n nodeId?: string;\n\n /** Error code for programmatic handling */\n code?: string;\n\n /** Suggested fix */\n suggestion?: string;\n}\n\nexport interface RuleBuilderSnapshot {\n /** Timestamp of this snapshot */\n timestamp: number;\n\n /** Description of the change */\n description: string;\n\n /** Complete state at this point */\n state: {\n nodes: Record<string, RuleNode>;\n rootNodes: string[];\n selectedNodeId?: string;\n };\n}\n\n/**\n * Rule template for common scenarios\n */\nexport interface RuleTemplate {\n /** Template ID */\n id: string;\n\n /** Template name */\n name: string;\n\n /** Template description */\n description: string;\n\n /** Template category */\n category: string;\n\n /** Template tags for search */\n tags: string[];\n\n /** Rule nodes that make up this template */\n nodes: RuleNode[];\n\n /** Root node IDs */\n rootNodes: string[];\n\n /** Required field schemas for this template */\n requiredFields?: string[];\n\n /** Example usage */\n example?: string;\n\n /** Template preview image/icon */\n icon?: string;\n\n /** Template metadata */\n metadata?: TemplateMetadata;\n}\n\n/**\n * Template metadata for tracking and management\n */\nexport interface TemplateMetadata {\n /** Creation date */\n createdAt?: Date;\n\n /** Last update date */\n updatedAt?: Date;\n\n /** Last used date */\n lastUsed?: Date;\n\n /** Import date (if imported) */\n importedAt?: Date;\n\n /** Template version */\n version?: string;\n\n /** Usage count */\n usageCount?: number;\n\n /** Template complexity */\n complexity?: 'simple' | 'medium' | 'complex';\n\n /** Original template ID (for imports/copies) */\n originalId?: string;\n\n /** Author information */\n author?: {\n name?: string;\n email?: string;\n organization?: string;\n };\n\n /** Template size metrics */\n metrics?: {\n nodeCount?: number;\n maxDepth?: number;\n fieldCount?: number;\n };\n}\n\n/**\n * Export options for rules\n */\nexport interface ExportOptions {\n /** Export format */\n format: 'json' | 'dsl' | 'typescript' | 'form-config';\n\n /** Include metadata in export */\n includeMetadata?: boolean;\n\n /** Pretty print JSON/DSL */\n prettyPrint?: boolean;\n\n /** Include comments in DSL */\n includeComments?: boolean;\n\n /** Metadata position in DSL */\n metadataPosition?: 'before' | 'after' | 'inline';\n\n /** TypeScript interface name (for TS export) */\n interfaceName?: string;\n\n /** Additional export configuration */\n config?: Record<string, unknown>;\n}\n\n/**\n * Import options for rules\n */\nexport interface ImportOptions {\n /** Source format */\n format: 'json' | 'dsl' | 'form-config';\n\n /** Whether to merge with existing rules */\n merge?: boolean;\n\n /** Whether to preserve existing metadata */\n preserveMetadata?: boolean;\n\n /** Field schema mapping for validation */\n fieldSchemas?: Record<string, unknown>;\n}\n\n/**\n * Rule builder configuration\n */\nexport interface RuleBuilderConfig {\n /** Available field schemas */\n fieldSchemas: Record<string, unknown>;\n\n /** Context variables */\n contextVariables?: unknown[];\n\n /** Custom functions */\n customFunctions?: unknown[];\n\n /** Available rule templates */\n templates?: RuleTemplate[];\n\n /** UI configuration */\n ui?: {\n /** Theme */\n theme?: 'light' | 'dark' | 'auto';\n\n /** Show advanced features */\n showAdvanced?: boolean;\n\n /** Enable drag and drop */\n enableDragDrop?: boolean;\n\n /** Show DSL preview */\n showDSLPreview?: boolean;\n\n /** Show validation errors inline */\n showInlineErrors?: boolean;\n\n /** Auto-save interval (ms) */\n autoSaveInterval?: number;\n };\n\n /** Validation configuration */\n validation?: {\n /** Enable real-time validation */\n realTime?: boolean;\n\n /** Validation strictness */\n strictness?: 'strict' | 'normal' | 'loose';\n\n /** Custom validation rules */\n customRules?: unknown[];\n };\n\n /** Export/import configuration */\n exportImport?: {\n /** Default export format */\n defaultExportFormat?: 'json' | 'dsl' | 'typescript';\n\n /** Supported formats */\n supportedFormats?: string[];\n\n /** Include metadata by default */\n includeMetadataByDefault?: boolean;\n };\n}\n\n// ===== Enhanced Configuration Interfaces =====\n\n/**\n * Configuration for optional field handling\n */\nexport interface OptionalFieldConfig {\n type: 'optionalField';\n /** Type of optional field validation */\n validationType: 'ifDefined' | 'ifNotNull' | 'ifExists' | 'withDefault';\n /** Target field name */\n fieldName: string;\n /** Default value when field is undefined/null */\n defaultValue?: unknown;\n /** Reference to condition rule node ID */\n conditionNodeId?: string;\n /** Optional metadata for validation */\n metadata?: SpecificationMetadata;\n}\n\n// ===== Phase 4: Expression and Contextual Configuration Interfaces =====\n\n/**\n * Configuration for expression specifications (aligned with @praxisui/specification)\n */\nexport interface ExpressionConfig {\n type: 'expression';\n\n /** DSL expression string */\n expression: string;\n\n /** Function registry for validation */\n functionRegistry?: FunctionRegistry<unknown>;\n\n /** Context provider for variable resolution */\n contextProvider?: ContextProvider;\n\n /** Known field names for validation */\n knownFields?: string[];\n\n /** Enable performance warnings */\n enablePerformanceWarnings?: boolean;\n\n /** Maximum expression complexity */\n maxComplexity?: number;\n\n /** Metadata aligned with @praxisui/specification */\n metadata?: SpecificationMetadata;\n}\n\n/**\n * Configuration for contextual template specifications (aligned with @praxisui/specification)\n */\nexport interface ContextualTemplateConfig {\n type: 'contextualTemplate';\n\n /** Template string with context tokens */\n template: string;\n\n /** Available context variables */\n contextVariables?: Record<string, unknown>;\n\n /** Context provider instance */\n contextProvider?: ContextProvider;\n\n /** Enable strict validation of context tokens */\n strictContextValidation?: boolean;\n\n /** Metadata aligned with @praxisui/specification */\n metadata?: SpecificationMetadata;\n}\n","/**\n * Field schema model for dynamic field configuration in the Visual Builder\n */\n\nexport interface FieldSchema {\n /** Unique field identifier */\n name: string;\n \n /** Human-readable field label */\n label: string;\n \n /** Field data type */\n type: FieldType;\n \n /** Optional description or help text */\n description?: string;\n \n /** Whether this field is required */\n required?: boolean;\n \n /** Allowed values for enum/select fields */\n allowedValues?: FieldOption[];\n \n /** Format constraints for the field */\n format?: FieldFormat;\n \n /** UI configuration for field display */\n uiConfig?: FieldUIConfig;\n \n /** Nested fields for object types */\n properties?: Record<string, FieldSchema>;\n \n /** Item schema for array types */\n items?: FieldSchema;\n}\n\nexport interface FieldOption {\n /** Option value */\n value: any;\n \n /** Option display label */\n label: string;\n \n /** Optional description */\n description?: string;\n \n /** Whether this option is disabled */\n disabled?: boolean;\n}\n\nexport interface FieldFormat {\n /** Minimum value (for numbers) or length (for strings/arrays) */\n minimum?: number;\n \n /** Maximum value (for numbers) or length (for strings/arrays) */\n maximum?: number;\n \n /** Regular expression pattern for string validation */\n pattern?: string;\n \n /** Date format for date fields */\n dateFormat?: string;\n \n /** Number format options */\n numberFormat?: {\n decimals?: number;\n currency?: string;\n percentage?: boolean;\n };\n}\n\nexport interface FieldUIConfig {\n /** Icon to display with the field */\n icon?: string;\n \n /** Color theme for the field */\n color?: string;\n \n /** Field category for grouping */\n category?: string;\n \n /** Field priority for sorting */\n priority?: number;\n \n /** Whether to show this field in simple mode */\n showInSimpleMode?: boolean;\n \n /** Custom CSS classes */\n cssClass?: string;\n}\n\nexport enum FieldType {\n STRING = 'string',\n NUMBER = 'number',\n INTEGER = 'integer',\n BOOLEAN = 'boolean',\n DATE = 'date',\n DATETIME = 'datetime',\n TIME = 'time',\n EMAIL = 'email',\n URL = 'url',\n PHONE = 'phone',\n ARRAY = 'array',\n OBJECT = 'object',\n ENUM = 'enum',\n UUID = 'uuid',\n JSON = 'json'\n}\n\n/**\n * Available comparison operators for each field type\n */\nexport const FIELD_TYPE_OPERATORS: Record<FieldType, string[]> = {\n [FieldType.STRING]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'isEmpty', 'isNotEmpty', 'in', 'notIn'],\n [FieldType.NUMBER]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'in', 'notIn', 'between'],\n [FieldType.INTEGER]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'in', 'notIn', 'between'],\n [FieldType.BOOLEAN]: ['equals', 'notEquals', 'isTrue', 'isFalse'],\n [FieldType.DATE]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull'],\n [FieldType.DATETIME]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull'],\n [FieldType.TIME]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between'],\n [FieldType.EMAIL]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'isEmpty', 'isNotEmpty'],\n [FieldType.URL]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'isEmpty', 'isNotEmpty'],\n [FieldType.PHONE]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'matches', 'isEmpty', 'isNotEmpty'],\n [FieldType.ARRAY]: ['isEmpty', 'isNotEmpty', 'minLength', 'maxLength', 'contains', 'notContains'],\n [FieldType.OBJECT]: ['isNull', 'isNotNull', 'hasProperty', 'notHasProperty'],\n [FieldType.ENUM]: ['equals', 'notEquals', 'in', 'notIn'],\n [FieldType.UUID]: ['equals', 'notEquals', 'matches', 'isEmpty', 'isNotEmpty'],\n [FieldType.JSON]: ['isNull', 'isNotNull', 'isEmpty', 'isNotEmpty', 'hasProperty', 'notHasProperty']\n};\n\n/**\n * Operator display labels for UI\n */\nexport const OPERATOR_LABELS: Record<string, string> = {\n equals: 'equals',\n notEquals: 'not equals',\n greaterThan: 'greater than',\n greaterThanOrEqual: 'greater than or equal',\n lessThan: 'less than',\n lessThanOrEqual: 'less than or equal',\n contains: 'contains',\n notContains: 'does not contain',\n startsWith: 'starts with',\n endsWith: 'ends with',\n matches: 'matches pattern',\n isEmpty: 'is empty',\n isNotEmpty: 'is not empty',\n isNull: 'is null',\n isNotNull: 'is not null',\n isTrue: 'is true',\n isFalse: 'is false',\n in: 'is in',\n notIn: 'is not in',\n between: 'is between',\n minLength: 'minimum length',\n maxLength: 'maximum length',\n hasProperty: 'has property',\n notHasProperty: 'does not have property'\n};\n\n/**\n * Context for field schema interpretation\n */\nexport interface FieldSchemaContext {\n /** Available context variables (e.g., ${user.role}, ${now}) */\n contextVariables?: ContextVariable[];\n \n /** Available custom functions */\n customFunctions?: CustomFunction[];\n \n /** Global configuration */\n config?: {\n /** Whether to show advanced features */\n showAdvanced?: boolean;\n \n /** Default locale for formatting */\n locale?: string;\n \n /** Theme configuration */\n theme?: 'light' | 'dark' | 'auto';\n };\n}\n\nexport interface ContextVariable {\n /** Variable name (without ${} wrapper) */\n name: string;\n \n /** Display label */\n label: string;\n \n /** Variable type */\n type: FieldType;\n \n /** Example value for preview */\n example?: any;\n \n /** Description */\n description?: string;\n}\n\nexport interface CustomFunction {\n /** Function name */\n name: string;\n \n /** Display label */\n label: string;\n \n /** Function description */\n description?: string;\n \n /** Expected parameter types */\n parameters: {\n name: string;\n type: FieldType;\n required?: boolean;\n description?: string;\n }[];\n \n /** Return type */\n returnType: FieldType;\n \n /** Example usage */\n example?: string;\n}","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n Validators,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\nimport { FieldConditionConfig } from '../models/rule-builder.model';\nimport {\n FieldSchema,\n FieldType,\n FIELD_TYPE_OPERATORS,\n OPERATOR_LABELS,\n} from '../models/field-schema.model';\n\n@Component({\n selector: 'praxis-field-condition-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatCheckboxModule,\n MatDatepickerModule,\n MatNativeDateModule,\n MatChipsModule,\n MatAutocompleteModule,\n MatTooltipModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <form [formGroup]=\"conditionForm\" class=\"field-condition-form\">\n <!-- Field Selection -->\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"field-select\">\n <mat-label>Field</mat-label>\n <mat-select\n formControlName=\"fieldName\"\n (selectionChange)=\"onFieldChanged($event)\"\n >\n <mat-optgroup\n *ngFor=\"let category of fieldCategories\"\n [label]=\"category.name\"\n >\n <mat-option\n *ngFor=\"let field of category.fields\"\n [value]=\"field.name\"\n >\n <div class=\"field-option\">\n <mat-icon class=\"field-icon\">{{\n getFieldIcon(field.type)\n }}</mat-icon>\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-type\">{{ field.type }}</span>\n </div>\n </mat-option>\n </mat-optgroup>\n </mat-select>\n <mat-hint *ngIf=\"selectedField?.description\">\n {{ selectedField?.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <!-- Operator Selection -->\n <div class=\"form-row\" *ngIf=\"selectedField\">\n <mat-form-field appearance=\"outline\" class=\"operator-select\">\n <mat-label>Operator</mat-label>\n <mat-select\n formControlName=\"operator\"\n (selectionChange)=\"onOperatorChanged($event)\"\n >\n <mat-option *ngFor=\"let op of availableOperators\" [value]=\"op\">\n {{ getOperatorLabel(op) }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Value Input -->\n <div\n class=\"form-row\"\n *ngIf=\"selectedField && selectedOperator && needsValue()\"\n >\n <div class=\"value-input-container\">\n <!-- Value Type Selector -->\n <mat-form-field appearance=\"outline\" class=\"value-type-select\">\n <mat-label>Value Type</mat-label>\n <mat-select\n formControlName=\"valueType\"\n (selectionChange)=\"onValueTypeChanged($event)\"\n >\n <mat-option value=\"literal\">Literal Value</mat-option>\n <mat-option value=\"field\">Field Reference</mat-option>\n <mat-option value=\"context\">Context Variable</mat-option>\n <mat-option value=\"function\">Function Call</mat-option>\n </mat-select>\n </mat-form-field>\n\n <!-- Literal Value Input -->\n <div *ngIf=\"valueType === 'literal'\" class=\"literal-value-input\">\n <!-- String Input -->\n <mat-form-field\n *ngIf=\"isStringField()\"\n appearance=\"outline\"\n class=\"value-input\"\n >\n <mat-label>Value</mat-label>\n <input\n matInput\n formControlName=\"value\"\n [placeholder]=\"getValuePlaceholder()\"\n />\n <mat-hint>{{ getValueHint() }}</mat-hint>\n </mat-form-field>\n\n <!-- Number Input -->\n <mat-form-field\n *ngIf=\"isNumberField()\"\n appearance=\"outline\"\n class=\"value-input\"\n >\n <mat-label>Value</mat-label>\n <input\n matInput\n type=\"number\"\n formControlName=\"value\"\n [placeholder]=\"getValuePlaceholder()\"\n />\n <mat-hint>{{ getValueHint() }}</mat-hint>\n </mat-form-field>\n\n <!-- Boolean Input -->\n <div *ngIf=\"isBooleanField()\" class=\"boolean-input\">\n <mat-checkbox formControlName=\"value\">\n {{ getBooleanLabel() }}\n </mat-checkbox>\n </div>\n\n <!-- Date Input -->\n <mat-form-field\n *ngIf=\"isDateField()\"\n appearance=\"outline\"\n class=\"value-input\"\n >\n <mat-label>Date</mat-label>\n <input\n matInput\n [matDatepicker]=\"datePicker\"\n formControlName=\"value\"\n />\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"datePicker\"\n ></mat-datepicker-toggle>\n <mat-datepicker #datePicker></mat-datepicker>\n </mat-form-field>\n\n <!-- Enum/Select Input -->\n <mat-form-field\n *ngIf=\"isEnumField()\"\n appearance=\"outline\"\n class=\"value-input\"\n >\n <mat-label>Value</mat-label>\n <mat-select formControlName=\"value\">\n <mat-option\n *ngFor=\"let option of selectedField.allowedValues\"\n [value]=\"option.value\"\n >\n {{ option.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <!-- Array Input (for 'in' operators) -->\n <div *ngIf=\"isArrayOperator()\" class=\"array-input\">\n <mat-form-field appearance=\"outline\" class=\"value-input\">\n <mat-label>Values (comma separated)</mat-label>\n <input\n matInput\n formControlName=\"value\"\n placeholder=\"value1, value2, value3\"\n />\n <mat-hint>Enter multiple values separated by commas</mat-hint>\n </mat-form-field>\n </div>\n </div>\n\n <!-- Field Reference Input -->\n <mat-form-field\n *ngIf=\"valueType === 'field'\"\n appearance=\"outline\"\n class=\"value-input\"\n >\n <mat-label>Compare to Field</mat-label>\n <mat-select formControlName=\"compareToField\">\n <mat-option\n *ngFor=\"let field of getCompatibleFields()\"\n [value]=\"field.name\"\n >\n <div class=\"field-option\">\n <mat-icon class=\"field-icon\">{{\n getFieldIcon(field.type)\n }}</mat-icon>\n <span class=\"field-label\">{{ field.label }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <!-- Context Variable Input -->\n <mat-form-field\n *ngIf=\"valueType === 'context'\"\n appearance=\"outline\"\n class=\"value-input\"\n >\n <mat-label>Context Variable</mat-label>\n <mat-select formControlName=\"contextVariable\">\n <mat-option\n *ngFor=\"let variable of contextVariables\"\n [value]=\"variable.name\"\n >\n <div class=\"context-option\">\n <span class=\"variable-name\">\\${{ variable.name }}</span>\n <span class=\"variable-type\">{{ variable.type }}</span>\n </div>\n </mat-option>\n </mat-select>\n <mat-hint>Select a dynamic context variable</mat-hint>\n </mat-form-field>\n\n <!-- Function Call Input -->\n <div *ngIf=\"valueType === 'function'\" class=\"function-input\">\n <mat-form-field appearance=\"outline\" class=\"function-select\">\n <mat-label>Function</mat-label>\n <mat-select formControlName=\"functionName\">\n <mat-option\n *ngFor=\"let func of customFunctions\"\n [value]=\"func.name\"\n >\n <div class=\"function-option\">\n <span class=\"function-name\">{{ func.label }}</span>\n <span class=\"function-desc\">{{ func.description }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n <!-- Function parameters would be added here -->\n </div>\n </div>\n </div>\n\n <!-- Validation Messages -->\n <div class=\"validation-messages\" *ngIf=\"hasValidationErrors()\">\n <div\n *ngFor=\"let error of getValidationErrors()\"\n class=\"validation-error\"\n >\n <mat-icon>error</mat-icon>\n <span>{{ error }}</span>\n </div>\n </div>\n\n <!-- Preview -->\n <div class=\"condition-preview\" *ngIf=\"isValid()\">\n <div class=\"preview-label\">Preview:</div>\n <div class=\"preview-text\">{{ getPreviewText() }}</div>\n </div>\n </form>\n `,\n styles: [\n `\n .field-condition-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n min-width: 300px;\n }\n\n .form-row {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n }\n\n .field-select,\n .operator-select,\n .value-type-select {\n flex: 1;\n min-width: 150px;\n }\n\n .value-input-container {\n display: flex;\n flex-direction: column;\n gap: 12px;\n flex: 2;\n }\n\n .value-input {\n width: 100%;\n }\n\n .field-option,\n .context-option,\n .function-option {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n }\n\n .field-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n color: var(--mdc-theme-primary);\n }\n\n .field-label {\n flex: 1;\n font-weight: 500;\n }\n\n .field-type {\n font-size: 11px;\n color: var(--mdc-theme-on-surface-variant);\n background: var(--mdc-theme-surface-variant);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .variable-name {\n font-family: monospace;\n font-weight: 500;\n color: var(--mdc-theme-secondary);\n }\n\n .variable-type {\n font-size: 11px;\n color: var(--mdc-theme-on-surface-variant);\n background: var(--mdc-theme-surface-variant);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .function-name {\n font-weight: 500;\n color: var(--mdc-theme-tertiary);\n }\n\n .function-desc {\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n font-style: italic;\n }\n\n .boolean-input {\n display: flex;\n align-items: center;\n padding: 12px 0;\n }\n\n .array-input {\n width: 100%;\n }\n\n .function-input {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .function-select {\n width: 100%;\n }\n\n .validation-messages {\n background: var(--mdc-theme-error-container);\n border-radius: 4px;\n padding: 8px 12px;\n }\n\n .validation-error {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mdc-theme-on-error-container);\n font-size: 12px;\n margin-bottom: 4px;\n }\n\n .validation-error:last-child {\n margin-bottom: 0;\n }\n\n .validation-error mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n .condition-preview {\n background: var(--mdc-theme-surface-variant);\n border-radius: 8px;\n padding: 12px;\n border-left: 4px solid var(--mdc-theme-primary);\n }\n\n .preview-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface-variant);\n margin-bottom: 4px;\n }\n\n .preview-text {\n font-family: monospace;\n font-size: 14px;\n color: var(--mdc-theme-on-surface);\n background: var(--mdc-theme-surface);\n padding: 8px;\n border-radius: 4px;\n border: 1px solid var(--mdc-theme-outline);\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .form-row {\n flex-direction: column;\n }\n\n .field-select,\n .operator-select,\n .value-type-select {\n width: 100%;\n }\n }\n `,\n ],\n})\nexport class FieldConditionEditorComponent implements OnInit, OnChanges {\n @Input() config: FieldConditionConfig | null = null;\n @Input() fieldSchemas: Record<string, FieldSchema> = {};\n\n @Output() configChanged = new EventEmitter<FieldConditionConfig>();\n\n private destroy$ = new Subject<void>();\n\n conditionForm: FormGroup;\n fieldCategories: { name: string; fields: FieldSchema[] }[] = [];\n contextVariables: any[] = [];\n customFunctions: any[] = [];\n\n selectedField: FieldSchema | null = null;\n selectedOperator: string | null = null;\n valueType: string = 'literal';\n availableOperators: string[] = [];\n\n constructor(private fb: FormBuilder) {\n this.conditionForm = this.createForm();\n }\n\n ngOnInit(): void {\n this.setupFieldCategories();\n this.setupFormSubscriptions();\n this.loadInitialConfig();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadInitialConfig();\n }\n\n if (changes['fieldSchemas'] && !changes['fieldSchemas'].firstChange) {\n this.setupFieldCategories();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private createForm(): FormGroup {\n return this.fb.group({\n fieldName: ['', Validators.required],\n operator: ['', Validators.required],\n value: [''],\n valueType: ['literal'],\n compareToField: [''],\n contextVariable: [''],\n functionName: [''],\n });\n }\n\n private setupFormSubscriptions(): void {\n this.conditionForm.valueChanges\n .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe(() => {\n this.emitConfigChange();\n });\n }\n\n private setupFieldCategories(): void {\n const fieldsByCategory: Record<string, FieldSchema[]> = {};\n\n Object.values(this.fieldSchemas).forEach((field) => {\n const category = field.uiConfig?.category || 'Other';\n if (!fieldsByCategory[category]) {\n fieldsByCategory[category] = [];\n }\n fieldsByCategory[category].push(field);\n });\n\n this.fieldCategories = Object.entries(fieldsByCategory)\n .map(([name, fields]) => ({\n name,\n fields: fields.sort((a, b) => a.label.localeCompare(b.label)),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n private loadInitialConfig(): void {\n if (!this.config) return;\n\n this.conditionForm.patchValue({\n fieldName: this.config.fieldName || '',\n operator: this.config.operator || '',\n value: this.config.value || '',\n valueType: this.config.valueType || 'literal',\n compareToField: this.config.compareToField || '',\n contextVariable: this.config.contextVariable || '',\n });\n\n if (this.config.fieldName) {\n this.onFieldChanged(this.config.fieldName);\n }\n const opCtrl = this.conditionForm.get('operator');\n if (opCtrl) {\n this.selectedOperator = opCtrl.value;\n }\n }\n\n private emitConfigChange(): void {\n if (!this.conditionForm.valid) return;\n\n const formValue = this.conditionForm.value;\n const config: FieldConditionConfig = {\n type: 'fieldCondition',\n fieldName: formValue.fieldName,\n operator: formValue.operator,\n value: this.processValue(formValue.value),\n valueType: formValue.valueType,\n compareToField: formValue.compareToField,\n contextVariable: formValue.contextVariable,\n };\n\n this.configChanged.emit(config);\n }\n\n private processValue(value: any): any {\n if (!value) return null;\n\n // Handle array operators (in, notIn)\n if (this.isArrayOperator() && typeof value === 'string') {\n return value\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n }\n\n // Handle number conversion\n if (this.isNumberField() && typeof value === 'string') {\n const num = parseFloat(value);\n return isNaN(num) ? null : num;\n }\n\n return value;\n }\n\n // Template methods\n getFieldIcon(type: string): string {\n const icons: Record<string, string> = {\n string: 'text_fields',\n number: 'pin',\n integer: 'pin',\n boolean: 'toggle_on',\n date: 'event',\n datetime: 'schedule',\n time: 'access_time',\n email: 'email',\n url: 'link',\n phone: 'phone',\n array: 'list',\n object: 'data_object',\n enum: 'list',\n uuid: 'fingerprint',\n json: 'data_object',\n };\n\n return icons[type] || 'text_fields';\n }\n\n getOperatorLabel(operator: string): string {\n return OPERATOR_LABELS[operator] || operator;\n }\n\n getValuePlaceholder(): string {\n if (!this.selectedField) return 'Enter value';\n\n switch (this.selectedField.type) {\n case FieldType.STRING:\n case FieldType.EMAIL:\n case FieldType.URL:\n return 'Enter text value';\n case FieldType.NUMBER:\n case FieldType.INTEGER:\n return 'Enter number';\n case FieldType.PHONE:\n return '+1234567890';\n default:\n return 'Enter value';\n }\n }\n\n getValueHint(): string {\n if (!this.selectedField || !this.selectedOperator) return '';\n\n if (this.selectedOperator === 'matches') {\n return 'Enter a regular expression pattern';\n }\n\n if (this.selectedField.format) {\n if (this.selectedField.format.minimum !== undefined) {\n return `Minimum: ${this.selectedField.format.minimum}`;\n }\n }\n\n return '';\n }\n\n getBooleanLabel(): string {\n return this.selectedOperator === 'isTrue' ? 'True' : 'Value';\n }\n\n getCompatibleFields(): FieldSchema[] {\n if (!this.selectedField) return [];\n\n return Object.values(this.fieldSchemas).filter(\n (field) =>\n field.type === this.selectedField?.type &&\n field.name !== this.selectedField?.name,\n );\n }\n\n getPreviewText(): string {\n const formValue = this.conditionForm.value;\n\n if (!formValue.fieldName || !formValue.operator) {\n return 'Incomplete condition';\n }\n\n let valueText = '';\n\n if (this.needsValue()) {\n switch (formValue.valueType) {\n case 'literal':\n valueText = this.formatValueForPreview(formValue.value);\n break;\n case 'field':\n valueText = formValue.compareToField || '<field>';\n break;\n case 'context':\n valueText = `\\$${formValue.contextVariable || '<variable>'}`;\n break;\n case 'function':\n valueText = `${formValue.functionName || '<function>'}()`;\n break;\n }\n }\n\n const operatorText = this.getOperatorLabel(formValue.operator);\n\n if (valueText) {\n return `${formValue.fieldName} ${operatorText} ${valueText}`;\n } else {\n return `${formValue.fieldName} ${operatorText}`;\n }\n }\n\n private formatValueForPreview(value: any): string {\n if (value === null || value === undefined) return '<value>';\n if (Array.isArray(value)) return `[${value.join(', ')}]`;\n if (typeof value === 'string') return `\"${value}\"`;\n return String(value);\n }\n\n // Type checking methods\n isStringField(): boolean {\n return (\n this.selectedField?.type === FieldType.STRING ||\n this.selectedField?.type === FieldType.EMAIL ||\n this.selectedField?.type === FieldType.URL ||\n this.selectedField?.type === FieldType.PHONE ||\n this.selectedField?.type === FieldType.UUID\n );\n }\n\n isNumberField(): boolean {\n return (\n this.selectedField?.type === FieldType.NUMBER ||\n this.selectedField?.type === FieldType.INTEGER\n );\n }\n\n isBooleanField(): boolean {\n return this.selectedField?.type === FieldType.BOOLEAN;\n }\n\n isDateField(): boolean {\n return (\n this.selectedField?.type === FieldType.DATE ||\n this.selectedField?.type === FieldType.DATETIME ||\n this.selectedField?.type === FieldType.TIME\n );\n }\n\n isEnumField(): boolean {\n return (\n this.selectedField?.type === FieldType.ENUM ||\n (this.selectedField?.allowedValues?.length ?? 0) > 0\n );\n }\n\n isArrayOperator(): boolean {\n return this.selectedOperator === 'in' || this.selectedOperator === 'notIn';\n }\n\n needsValue(): boolean {\n const noValueOperators = [\n 'isEmpty',\n 'isNotEmpty',\n 'isNull',\n 'isNotNull',\n 'isTrue',\n 'isFalse',\n ];\n return this.selectedOperator\n ? !noValueOperators.includes(this.selectedOperator)\n : true;\n }\n\n // Event handlers\n onFieldChanged(event: string | MatSelectChange): void {\n const fieldName = typeof event === 'string' ? event : event.value;\n this.selectedField = this.fieldSchemas[fieldName] || null;\n\n if (this.selectedField) {\n this.availableOperators =\n FIELD_TYPE_OPERATORS[this.selectedField.type] || [];\n\n // Reset operator if not compatible\n const currentOperator = this.conditionForm.get('operator')?.value;\n if (\n currentOperator &&\n !this.availableOperators.includes(currentOperator)\n ) {\n this.conditionForm.patchValue({ operator: '', value: '' });\n this.selectedOperator = null;\n }\n } else {\n this.availableOperators = [];\n }\n }\n\n onOperatorChanged(event: MatSelectChange): void {\n this.selectedOperator = event.value;\n\n // Reset value when operator changes\n this.conditionForm.patchValue({ value: '' });\n }\n\n onValueTypeChanged(event: MatSelectChange): void {\n this.valueType = event.value;\n\n // Reset related fields\n this.conditionForm.patchValue({\n value: '',\n compareToField: '',\n contextVariable: '',\n functionName: '',\n });\n }\n\n // Validation methods\n hasValidationErrors(): boolean {\n return this.getValidationErrors().length > 0;\n }\n\n getValidationErrors(): string[] {\n const errors: string[] = [];\n\n if (!this.conditionForm.get('fieldName')?.value) {\n errors.push('Field is required');\n }\n\n if (!this.conditionForm.get('operator')?.value) {\n errors.push('Operator is required');\n }\n\n if (this.needsValue()) {\n const valueType = this.conditionForm.get('valueType')?.value;\n\n switch (valueType) {\n case 'literal':\n if (!this.conditionForm.get('value')?.value) {\n errors.push('Value is required');\n }\n break;\n case 'field':\n if (!this.conditionForm.get('compareToField')?.value) {\n errors.push('Comparison field is required');\n }\n break;\n case 'context':\n if (!this.conditionForm.get('contextVariable')?.value) {\n errors.push('Context variable is required');\n }\n break;\n case 'function':\n if (!this.conditionForm.get('functionName')?.value) {\n errors.push('Function is required');\n }\n break;\n }\n }\n\n return errors;\n }\n\n isValid(): boolean {\n return this.conditionForm.valid && !this.hasValidationErrors();\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n Validators,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport {\n MatButtonToggleModule,\n MatButtonToggleChange,\n} from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDividerModule } from '@angular/material/divider';\n\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\nimport {\n ConditionalValidatorConfig,\n ConditionalValidatorType,\n ConditionalValidatorPreview,\n RuleNode,\n RuleNodeType,\n} from '../models/rule-builder.model';\nimport { FieldSchema } from '../models/field-schema.model';\nimport { FieldConditionEditorComponent } from './field-condition-editor.component';\n\n@Component({\n selector: 'praxis-conditional-validator-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatButtonModule,\n MatButtonToggleModule,\n MatIconModule,\n MatCheckboxModule,\n MatChipsModule,\n MatTooltipModule,\n MatTabsModule,\n MatDividerModule,\n FieldConditionEditorComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <form [formGroup]=\"validatorForm\" class=\"conditional-validator-form\">\n <!-- Validator Type Selection -->\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"validator-type-select\">\n <mat-label>Validator Type</mat-label>\n <mat-select\n formControlName=\"validatorType\"\n (selectionChange)=\"onValidatorTypeChanged($event)\"\n >\n <mat-option value=\"requiredIf\">\n <div class=\"validator-option\">\n <mat-icon>star</mat-icon>\n <span>Required If</span>\n <small>Field is required when condition is met</small>\n </div>\n </mat-option>\n <mat-option value=\"visibleIf\">\n <div class=\"validator-option\">\n <mat-icon>visibility</mat-icon>\n <span>Visible If</span>\n <small>Field is visible when condition is met</small>\n </div>\n </mat-option>\n <mat-option value=\"disabledIf\">\n <div class=\"validator-option\">\n <mat-icon>block</mat-icon>\n <span>Disabled If</span>\n <small>Field is disabled when condition is met</small>\n </div>\n </mat-option>\n <mat-option value=\"readonlyIf\">\n <div class=\"validator-option\">\n <mat-icon>lock</mat-icon>\n <span>Readonly If</span>\n <small>Field is readonly when condition is met</small>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Target Field Selection -->\n <div class=\"form-row\" *ngIf=\"validatorType\">\n <mat-form-field appearance=\"outline\" class=\"target-field-select\">\n <mat-label>Target Field</mat-label>\n <mat-select\n formControlName=\"targetField\"\n (selectionChange)=\"onTargetFieldChanged($event)\"\n >\n <mat-optgroup\n *ngFor=\"let category of fieldCategories\"\n [label]=\"category.name\"\n >\n <mat-option\n *ngFor=\"let field of category.fields\"\n [value]=\"field.name\"\n >\n <div class=\"field-option\">\n <mat-icon class=\"field-icon\">{{\n getFieldIcon(field.type)\n }}</mat-icon>\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-type\">{{ field.type }}</span>\n </div>\n </mat-option>\n </mat-optgroup>\n </mat-select>\n <mat-hint>Select the field this validator applies to</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- Condition Configuration -->\n <div class=\"form-section\" *ngIf=\"validatorType && targetField\">\n <h4 class=\"section-title\">\n <mat-icon>settings</mat-icon>\n Condition Configuration\n </h4>\n\n <div class=\"condition-mode-selector\">\n <mat-button-toggle-group\n formControlName=\"conditionMode\"\n (change)=\"onConditionModeChanged($event)\"\n >\n <mat-button-toggle value=\"simple\">\n <mat-icon>compare_arrows</mat-icon>\n Simple Condition\n </mat-button-toggle>\n <mat-button-toggle value=\"advanced\">\n <mat-icon>account_tree</mat-icon>\n Advanced Logic\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <!-- Simple Condition -->\n <div *ngIf=\"conditionMode === 'simple'\" class=\"simple-condition\">\n <praxis-field-condition-editor\n [config]=\"getSimpleConditionConfig()\"\n [fieldSchemas]=\"fieldSchemas\"\n (configChanged)=\"onSimpleConditionChanged($event)\"\n >\n </praxis-field-condition-editor>\n </div>\n\n <!-- Advanced Logic -->\n <div *ngIf=\"conditionMode === 'advanced'\" class=\"advanced-condition\">\n <div class=\"logic-builder\">\n <mat-form-field appearance=\"outline\" class=\"logic-operator\">\n <mat-label>Logic Operator</mat-label>\n <mat-select formControlName=\"logicOperator\">\n <mat-option value=\"and\"\n >AND - All conditions must be true</mat-option\n >\n <mat-option value=\"or\"\n >OR - Any condition can be true</mat-option\n >\n <mat-option value=\"not\"\n >NOT - Condition must be false</mat-option\n >\n <mat-option value=\"xor\"\n >XOR - Only one condition can be true</mat-option\n >\n </mat-select>\n </mat-form-field>\n\n <div class=\"conditions-list\">\n <div\n *ngFor=\"\n let condition of advancedConditions;\n let i = index;\n trackBy: trackByIndex\n \"\n class=\"condition-item\"\n >\n <div class=\"condition-header\">\n <span class=\"condition-number\">{{ i + 1 }}</span>\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"removeCondition(i)\"\n [disabled]=\"advancedConditions.length <= 1\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <praxis-field-condition-editor\n [config]=\"condition\"\n [fieldSchemas]=\"fieldSchemas\"\n (configChanged)=\"updateAdvancedCondition(i, $event)\"\n >\n </praxis-field-condition-editor>\n </div>\n\n <button\n mat-stroked-button\n color=\"primary\"\n (click)=\"addCondition()\"\n class=\"add-condition-button\"\n >\n <mat-icon>add</mat-icon>\n Add Condition\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Validation Settings -->\n <div class=\"form-section\" *ngIf=\"validatorType === 'requiredIf'\">\n <h4 class=\"section-title\">\n <mat-icon>tune</mat-icon>\n Validation Settings\n </h4>\n\n <div class=\"validation-settings\">\n <mat-form-field appearance=\"outline\" class=\"error-message-input\">\n <mat-label>Custom Error Message</mat-label>\n <input\n matInput\n formControlName=\"errorMessage\"\n placeholder=\"This field is required\"\n />\n <mat-hint>Override the default validation message</mat-hint>\n </mat-form-field>\n\n <div class=\"validation-options\">\n <mat-checkbox formControlName=\"validateOnChange\">\n Validate on field change\n </mat-checkbox>\n\n <mat-checkbox formControlName=\"validateOnBlur\">\n Validate on field blur\n </mat-checkbox>\n\n <mat-checkbox formControlName=\"showErrorImmediately\">\n Show error immediately when condition is met\n </mat-checkbox>\n </div>\n </div>\n </div>\n\n <!-- UI Behavior Settings -->\n <div\n class=\"form-section\"\n *ngIf=\"validatorType && validatorType !== 'requiredIf'\"\n >\n <h4 class=\"section-title\">\n <mat-icon>visibility</mat-icon>\n UI Behavior Settings\n </h4>\n\n <div class=\"ui-settings\">\n <div\n *ngIf=\"validatorType === 'visibleIf'\"\n class=\"visibility-settings\"\n >\n <mat-form-field appearance=\"outline\" class=\"animation-select\">\n <mat-label>Hide/Show Animation</mat-label>\n <mat-select formControlName=\"animation\">\n <mat-option value=\"none\">No animation</mat-option>\n <mat-option value=\"fade\">Fade in/out</mat-option>\n <mat-option value=\"slide\">Slide up/down</mat-option>\n <mat-option value=\"scale\">Scale in/out</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-checkbox formControlName=\"hideLabel\">\n Hide field label when hidden\n </mat-checkbox>\n\n <mat-checkbox formControlName=\"preserveSpace\">\n Preserve space when hidden\n </mat-checkbox>\n </div>\n\n <div *ngIf=\"validatorType === 'disabledIf'\" class=\"disabled-settings\">\n <mat-form-field appearance=\"outline\" class=\"disabled-style-select\">\n <mat-label>Disabled Style</mat-label>\n <mat-select formControlName=\"disabledStyle\">\n <mat-option value=\"default\">Default (grayed out)</mat-option>\n <mat-option value=\"faded\">Faded appearance</mat-option>\n <mat-option value=\"hidden\">Hide completely</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-checkbox formControlName=\"clearOnDisable\">\n Clear field value when disabled\n </mat-checkbox>\n\n <mat-checkbox formControlName=\"showDisabledMessage\">\n Show custom disabled message\n </mat-checkbox>\n\n <mat-form-field\n *ngIf=\"showDisabledMessage\"\n appearance=\"outline\"\n class=\"disabled-message-input\"\n >\n <mat-label>Disabled Message</mat-label>\n <input\n matInput\n formControlName=\"disabledMessage\"\n placeholder=\"This field is currently disabled\"\n />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"validatorType === 'readonlyIf'\" class=\"readonly-settings\">\n <mat-form-field appearance=\"outline\" class=\"readonly-style-select\">\n <mat-label>Readonly Style</mat-label>\n <mat-select formControlName=\"readonlyStyle\">\n <mat-option value=\"default\">Default (non-editable)</mat-option>\n <mat-option value=\"display\">Display value only</mat-option>\n <mat-option value=\"bordered\">Bordered display</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-checkbox formControlName=\"showReadonlyIndicator\">\n Show readonly indicator icon\n </mat-checkbox>\n </div>\n </div>\n </div>\n\n <!-- Preview Section -->\n <div class=\"form-section preview-section\" *ngIf=\"isValid()\">\n <h4 class=\"section-title\">\n <mat-icon>preview</mat-icon>\n Preview\n </h4>\n\n <div class=\"preview-content\">\n <div class=\"preview-text\">{{ getPreviewText() }}</div>\n\n <div class=\"preview-logic\" *ngIf=\"conditionMode === 'advanced'\">\n <strong>Logic:</strong> {{ getLogicPreview() }}\n </div>\n </div>\n </div>\n\n <!-- Validation Messages -->\n <div class=\"validation-messages\" *ngIf=\"hasValidationErrors()\">\n <div\n *ngFor=\"let error of getValidationErrors()\"\n class=\"validation-error\"\n >\n <mat-icon>error</mat-icon>\n <span>{{ error }}</span>\n </div>\n </div>\n </form>\n `,\n styles: [\n `\n .conditional-validator-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 800px;\n }\n\n .form-row {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n }\n\n .validator-type-select,\n .target-field-select {\n flex: 1;\n min-width: 200px;\n }\n\n .validator-option {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .validator-option mat-icon {\n align-self: flex-start;\n color: var(--mdc-theme-primary);\n }\n\n .validator-option small {\n color: var(--mdc-theme-on-surface-variant);\n font-size: 11px;\n }\n\n .field-option {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n }\n\n .field-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n color: var(--mdc-theme-primary);\n }\n\n .field-label {\n flex: 1;\n font-weight: 500;\n }\n\n .field-type {\n font-size: 11px;\n color: var(--mdc-theme-on-surface-variant);\n background: var(--mdc-theme-surface-variant);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .form-section {\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 8px;\n padding: 16px;\n background: var(--mdc-theme-surface-variant);\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .condition-mode-selector {\n margin-bottom: 16px;\n }\n\n .simple-condition {\n background: var(--mdc-theme-surface);\n border-radius: 8px;\n padding: 16px;\n }\n\n .advanced-condition {\n background: var(--mdc-theme-surface);\n border-radius: 8px;\n padding: 16px;\n }\n\n .logic-operator {\n width: 100%;\n margin-bottom: 16px;\n }\n\n .conditions-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .condition-item {\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 8px;\n padding: 12px;\n background: var(--mdc-theme-surface-variant);\n }\n\n .condition-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .condition-number {\n background: var(--mdc-theme-primary);\n color: var(--mdc-theme-on-primary);\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n }\n\n .add-condition-button {\n align-self: flex-start;\n }\n\n .validation-settings,\n .ui-settings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .validation-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .error-message-input,\n .animation-select,\n .disabled-style-select,\n .readonly-style-select,\n .disabled-message-input {\n width: 100%;\n }\n\n .preview-section {\n background: var(--mdc-theme-primary-container);\n border-color: var(--mdc-theme-primary);\n }\n\n .preview-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .preview-text {\n font-family: monospace;\n font-size: 14px;\n background: var(--mdc-theme-surface);\n padding: 12px;\n border-radius: 4px;\n border: 1px solid var(--mdc-theme-outline);\n }\n\n .preview-logic {\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .validation-messages {\n background: var(--mdc-theme-error-container);\n border-radius: 4px;\n padding: 8px 12px;\n }\n\n .validation-error {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mdc-theme-on-error-container);\n font-size: 12px;\n margin-bottom: 4px;\n }\n\n .validation-error:last-child {\n margin-bottom: 0;\n }\n\n .validation-error mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .form-row {\n flex-direction: column;\n }\n\n .validator-type-select,\n .target-field-select {\n width: 100%;\n }\n }\n `,\n ],\n})\nexport class ConditionalValidatorEditorComponent implements OnInit, OnChanges {\n @Input() config: ConditionalValidatorConfig | null = null;\n @Input() fieldSchemas: Record<string, FieldSchema> = {};\n\n @Output() configChanged = new EventEmitter<ConditionalValidatorConfig>();\n\n private destroy$ = new Subject<void>();\n\n validatorForm: FormGroup;\n fieldCategories: { name: string; fields: FieldSchema[] }[] = [];\n advancedConditions: any[] = [];\n\n validatorType: string = '';\n targetField: string = '';\n conditionMode: string = 'simple';\n\n get showDisabledMessage(): boolean {\n return this.validatorForm.get('showDisabledMessage')?.value || false;\n }\n\n constructor(private fb: FormBuilder) {\n this.validatorForm = this.createForm();\n }\n\n ngOnInit(): void {\n this.setupFieldCategories();\n this.setupFormSubscriptions();\n this.loadInitialConfig();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadInitialConfig();\n }\n\n if (changes['fieldSchemas'] && !changes['fieldSchemas'].firstChange) {\n this.setupFieldCategories();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private createForm(): FormGroup {\n return this.fb.group({\n validatorType: ['', Validators.required],\n targetField: ['', Validators.required],\n conditionMode: ['simple'],\n logicOperator: ['and'],\n errorMessage: [''],\n validateOnChange: [true],\n validateOnBlur: [true],\n showErrorImmediately: [false],\n animation: ['fade'],\n hideLabel: [false],\n preserveSpace: [false],\n disabledStyle: ['default'],\n clearOnDisable: [false],\n showDisabledMessage: [false],\n disabledMessage: [''],\n readonlyStyle: ['default'],\n showReadonlyIndicator: [true],\n });\n }\n\n private setupFormSubscriptions(): void {\n this.validatorForm.valueChanges\n .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe(() => {\n this.emitConfigChange();\n });\n }\n\n private setupFieldCategories(): void {\n const fieldsByCategory: Record<string, FieldSchema[]> = {};\n\n Object.values(this.fieldSchemas).forEach((field) => {\n const category = field.uiConfig?.category || 'Other';\n if (!fieldsByCategory[category]) {\n fieldsByCategory[category] = [];\n }\n fieldsByCategory[category].push(field);\n });\n\n this.fieldCategories = Object.entries(fieldsByCategory)\n .map(([name, fields]) => ({\n name,\n fields: fields.sort((a, b) => a.label.localeCompare(b.label)),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n private loadInitialConfig(): void {\n if (!this.config) return;\n\n this.validatorType = this.mapRuleTypeToValidatorType(this.config.type);\n this.targetField = this.config.targetField || '';\n this.conditionMode =\n this.config.conditions && this.config.conditions.length > 1\n ? 'advanced'\n : 'simple';\n\n this.validatorForm.patchValue({\n validatorType: this.validatorType,\n targetField: this.targetField,\n conditionMode: this.conditionMode,\n logicOperator: this.config.logicOperator || 'and',\n errorMessage: this.config.errorMessage || '',\n validateOnChange: this.config.validateOnChange !== false,\n validateOnBlur: this.config.validateOnBlur !== false,\n showErrorImmediately: this.config.showErrorImmediately || false,\n animation: this.config.animation || 'fade',\n hideLabel: this.config.hideLabel || false,\n preserveSpace: this.config.preserveSpace || false,\n disabledStyle: this.config.disabledStyle || 'default',\n clearOnDisable: this.config.clearOnDisable || false,\n showDisabledMessage: this.config.showDisabledMessage || false,\n disabledMessage: this.config.disabledMessage || '',\n readonlyStyle: this.config.readonlyStyle || 'default',\n showReadonlyIndicator: this.config.showReadonlyIndicator !== false,\n });\n\n if (this.config.conditions && this.config.conditions.length > 0) {\n this.advancedConditions = [...this.config.conditions];\n } else {\n this.advancedConditions = [this.createEmptyCondition()];\n }\n }\n\n private emitConfigChange(): void {\n if (!this.validatorForm.valid) return;\n\n const formValue = this.validatorForm.value;\n const config: ConditionalValidatorConfig = {\n type: this.mapValidatorTypeToRuleType(formValue.validatorType),\n validatorType: this.mapValidatorTypeToRuleType(formValue.validatorType),\n targetField: formValue.targetField,\n conditions:\n this.conditionMode === 'simple'\n ? [this.getSimpleConditionConfig()]\n : this.advancedConditions,\n logicOperator: formValue.logicOperator,\n errorMessage: formValue.errorMessage || undefined,\n validateOnChange: formValue.validateOnChange,\n validateOnBlur: formValue.validateOnBlur,\n showErrorImmediately: formValue.showErrorImmediately,\n animation: formValue.animation || undefined,\n hideLabel: formValue.hideLabel || undefined,\n preserveSpace: formValue.preserveSpace || undefined,\n disabledStyle: formValue.disabledStyle || undefined,\n clearOnDisable: formValue.clearOnDisable || undefined,\n showDisabledMessage: formValue.showDisabledMessage || undefined,\n disabledMessage: formValue.disabledMessage || undefined,\n readonlyStyle: formValue.readonlyStyle || undefined,\n showReadonlyIndicator: formValue.showReadonlyIndicator,\n };\n\n this.configChanged.emit(config);\n }\n\n // Template methods\n getFieldIcon(type: string): string {\n const icons: Record<string, string> = {\n string: 'text_fields',\n number: 'pin',\n integer: 'pin',\n boolean: 'toggle_on',\n date: 'event',\n datetime: 'schedule',\n time: 'access_time',\n email: 'email',\n url: 'link',\n phone: 'phone',\n array: 'list',\n object: 'data_object',\n enum: 'list',\n uuid: 'fingerprint',\n json: 'data_object',\n };\n\n return icons[type] || 'text_fields';\n }\n\n trackByIndex(index: number): number {\n return index;\n }\n\n getSimpleConditionConfig(): any {\n return this.advancedConditions[0] || this.createEmptyCondition();\n }\n\n getPreviewText(): string {\n const formValue = this.validatorForm.value;\n\n if (!formValue.validatorType || !formValue.targetField) {\n return 'Incomplete validator configuration';\n }\n\n const targetFieldSchema = this.fieldSchemas[formValue.targetField];\n const targetFieldLabel = targetFieldSchema?.label || formValue.targetField;\n\n let actionText = '';\n switch (formValue.validatorType) {\n case 'requiredIf':\n actionText = 'is required';\n break;\n case 'visibleIf':\n actionText = 'is visible';\n break;\n case 'disabledIf':\n actionText = 'is disabled';\n break;\n case 'readonlyIf':\n actionText = 'is readonly';\n break;\n }\n\n const conditionText =\n this.conditionMode === 'simple'\n ? 'when condition is met'\n : `when ${formValue.logicOperator.toUpperCase()} conditions are met`;\n\n return `${targetFieldLabel} ${actionText} ${conditionText}`;\n }\n\n getLogicPreview(): string {\n const formValue = this.validatorForm.value;\n const operator = formValue.logicOperator?.toUpperCase() || 'AND';\n const conditionCount = this.advancedConditions.length;\n\n return `${operator} logic with ${conditionCount} condition${conditionCount !== 1 ? 's' : ''}`;\n }\n\n // Event handlers\n onValidatorTypeChanged(event: MatSelectChange): void {\n this.validatorType = event.value;\n }\n\n onTargetFieldChanged(event: MatSelectChange): void {\n this.targetField = event.value;\n }\n\n onConditionModeChanged(event: MatButtonToggleChange): void {\n const mode = event.value as 'simple' | 'advanced';\n this.conditionMode = mode;\n\n if (mode === 'simple' && this.advancedConditions.length === 0) {\n this.advancedConditions = [this.createEmptyCondition()];\n }\n }\n\n onSimpleConditionChanged(condition: any): void {\n this.advancedConditions[0] = condition;\n this.emitConfigChange();\n }\n\n updateAdvancedCondition(index: number, condition: any): void {\n this.advancedConditions[index] = condition;\n this.emitConfigChange();\n }\n\n addCondition(): void {\n this.advancedConditions.push(this.createEmptyCondition());\n }\n\n removeCondition(index: number): void {\n if (this.advancedConditions.length > 1) {\n this.advancedConditions.splice(index, 1);\n this.emitConfigChange();\n }\n }\n\n // Validation methods\n hasValidationErrors(): boolean {\n return this.getValidationErrors().length > 0;\n }\n\n getValidationErrors(): string[] {\n const errors: string[] = [];\n\n if (!this.validatorForm.get('validatorType')?.value) {\n errors.push('Validator type is required');\n }\n\n if (!this.validatorForm.get('targetField')?.value) {\n errors.push('Target field is required');\n }\n\n if (this.advancedConditions.length === 0) {\n errors.push('At least one condition is required');\n }\n\n return errors;\n }\n\n isValid(): boolean {\n return this.validatorForm.valid && !this.hasValidationErrors();\n }\n\n // Helper methods\n private createEmptyCondition(): any {\n return {\n type: 'fieldCondition',\n fieldName: '',\n operator: 'equals',\n value: null,\n };\n }\n\n private mapRuleTypeToValidatorType(ruleType: string): string {\n const mapping: Record<string, string> = {\n 'requiredIf': 'requiredIf',\n 'visibleIf': 'visibleIf',\n 'disabledIf': 'disabledIf',\n 'readonlyIf': 'readonlyIf',\n };\n\n return mapping[ruleType] || 'requiredIf';\n }\n\n private mapValidatorTypeToRuleType(validatorType: string): 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf' {\n const mapping: Record<string, 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf'> = {\n 'requiredIf': 'requiredIf',\n 'visibleIf': 'visibleIf',\n 'disabledIf': 'disabledIf',\n 'readonlyIf': 'readonlyIf',\n };\n\n return mapping[validatorType] || 'requiredIf';\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormArray } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSliderModule } from '@angular/material/slider';\n\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\nimport { CollectionValidatorConfig, RuleNodeType } from '../models/rule-builder.model';\nimport { FieldSchema, FieldType } from '../models/field-schema.model';\nimport { FieldConditionEditorComponent } from './field-condition-editor.component';\n\n@Component({\n selector: 'praxis-collection-validator-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatCheckboxModule,\n MatChipsModule,\n MatTooltipModule,\n MatTabsModule,\n MatDividerModule,\n MatSliderModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <form [formGroup]=\"collectionForm\" class=\"collection-validator-form\">\n <!-- Validator Type Selection -->\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"validator-type-select\">\n <mat-label>Collection Validator Type</mat-label>\n <mat-select formControlName=\"validatorType\"\n (selectionChange)=\"onValidatorTypeChanged($event)\">\n <mat-option value=\"forEach\">\n <div class=\"validator-option\">\n <mat-icon>repeat</mat-icon>\n <span>For Each</span>\n <small>Apply validation to each item in collection</small>\n </div>\n </mat-option>\n <mat-option value=\"uniqueBy\">\n <div class=\"validator-option\">\n <mat-icon>fingerprint</mat-icon>\n <span>Unique By</span>\n <small>Ensure items are unique by specified field(s)</small>\n </div>\n </mat-option>\n <mat-option value=\"minLength\">\n <div class=\"validator-option\">\n <mat-icon>height</mat-icon>\n <span>Minimum Length</span>\n <small>Collection must have minimum number of items</small>\n </div>\n </mat-option>\n <mat-option value=\"maxLength\">\n <div class=\"validator-option\">\n <mat-icon>height</mat-icon>\n <span>Maximum Length</span>\n <small>Collection must not exceed maximum number of items</small>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Target Collection Selection -->\n <div class=\"form-row\" *ngIf=\"validatorType\">\n <mat-form-field appearance=\"outline\" class=\"target-collection-select\">\n <mat-label>Target Collection</mat-label>\n <mat-select formControlName=\"targetCollection\"\n (selectionChange)=\"onTargetCollectionChanged($event)\">\n <mat-optgroup *ngFor=\"let category of collectionFieldCategories\" [label]=\"category.name\">\n <mat-option *ngFor=\"let field of category.fields\" \n [value]=\"field.name\">\n <div class=\"field-option\">\n <mat-icon class=\"field-icon\">{{ getFieldIcon(field.type) }}</mat-icon>\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-type\">{{ field.type }}</span>\n </div>\n </mat-option>\n </mat-optgroup>\n </mat-select>\n <mat-hint>Select the array/collection field this validator applies to</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- For Each Configuration -->\n <div class=\"form-section\" *ngIf=\"validatorType === 'forEach' && targetCollection\">\n <h4 class=\"section-title\">\n <mat-icon>repeat</mat-icon>\n For Each Item Validation\n </h4>\n \n <div class=\"foreach-config\">\n <div class=\"item-schema-info\">\n <mat-form-field appearance=\"outline\" class=\"item-variable-input\">\n <mat-label>Item Variable Name</mat-label>\n <input matInput \n formControlName=\"itemVariable\"\n placeholder=\"item\">\n <mat-hint>Variable name to reference each item (e.g., 'item', 'record')</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"index-variable-input\">\n <mat-label>Index Variable Name</mat-label>\n <input matInput \n formControlName=\"indexVariable\"\n placeholder=\"index\">\n <mat-hint>Variable name to reference item index (optional)</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"validation-rules\">\n <h5>Item Validation Rules</h5>\n \n <div formArrayName=\"itemValidationRules\">\n <div *ngFor=\"let rule of itemValidationRules.controls; let i = index\"\n class=\"validation-rule-item\"\n [formGroupName]=\"i\">\n \n <div class=\"rule-header\">\n <span class=\"rule-number\">{{ i + 1 }}</span>\n <button mat-icon-button \n color=\"warn\"\n (click)=\"removeItemValidationRule(i)\"\n [disabled]=\"itemValidationRules.length <= 1\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <div class=\"rule-config\">\n <mat-form-field appearance=\"outline\" class=\"rule-type-select\">\n <mat-label>Rule Type</mat-label>\n <mat-select formControlName=\"ruleType\">\n <mat-option value=\"required\">Required Field</mat-option>\n <mat-option value=\"condition\">Custom Condition</mat-option>\n <mat-option value=\"format\">Format Validation</mat-option>\n <mat-option value=\"cross-item\">Cross-Item Validation</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"field-path-input\">\n <mat-label>Field Path</mat-label>\n <input matInput \n formControlName=\"fieldPath\"\n placeholder=\"item.propertyName\">\n <mat-hint>Path to the field within each item</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"rule-message-input\">\n <mat-label>Error Message</mat-label>\n <input matInput \n formControlName=\"errorMessage\"\n placeholder=\"Custom validation message\">\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <button mat-stroked-button \n color=\"primary\"\n (click)=\"addItemValidationRule()\"\n class=\"add-rule-button\">\n <mat-icon>add</mat-icon>\n Add Validation Rule\n </button>\n </div>\n </div>\n </div>\n\n <!-- Unique By Configuration -->\n <div class=\"form-section\" *ngIf=\"validatorType === 'uniqueBy' && targetCollection\">\n <h4 class=\"section-title\">\n <mat-icon>fingerprint</mat-icon>\n Uniqueness Configuration\n </h4>\n \n <div class=\"unique-config\">\n <div class=\"unique-fields\">\n <h5>Unique By Fields</h5>\n \n <div formArrayName=\"uniqueByFields\">\n <div *ngFor=\"let field of uniqueByFields.controls; let i = index\"\n class=\"unique-field-item\">\n \n <mat-form-field appearance=\"outline\" class=\"field-path-input\">\n <mat-label>Field Path {{ i + 1 }}</mat-label>\n <input matInput \n [formControlName]=\"i\"\n placeholder=\"item.propertyName\">\n </mat-form-field>\n\n <button mat-icon-button \n color=\"warn\"\n (click)=\"removeUniqueField(i)\"\n [disabled]=\"uniqueByFields.length <= 1\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n <button mat-stroked-button \n color=\"primary\"\n (click)=\"addUniqueField()\"\n class=\"add-field-button\">\n <mat-icon>add</mat-icon>\n Add Field\n </button>\n </div>\n\n <div class=\"unique-options\">\n <mat-checkbox formControlName=\"caseSensitive\">\n Case-sensitive comparison\n </mat-checkbox>\n \n <mat-checkbox formControlName=\"ignoreEmpty\">\n Ignore empty values\n </mat-checkbox>\n \n <mat-form-field appearance=\"outline\" class=\"unique-error-message\">\n <mat-label>Duplicate Error Message</mat-label>\n <input matInput \n formControlName=\"duplicateErrorMessage\"\n placeholder=\"Duplicate items are not allowed\">\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- Length Configuration -->\n <div class=\"form-section\" *ngIf=\"(validatorType === 'minLength' || validatorType === 'maxLength') && targetCollection\">\n <h4 class=\"section-title\">\n <mat-icon>height</mat-icon>\n Length Constraints\n </h4>\n \n <div class=\"length-config\">\n <div class=\"length-inputs\">\n <mat-form-field *ngIf=\"validatorType === 'minLength'\" appearance=\"outline\" class=\"length-input\">\n <mat-label>Minimum Items</mat-label>\n <input matInput \n type=\"number\"\n formControlName=\"minItems\"\n min=\"0\"\n placeholder=\"0\">\n <mat-hint>Minimum number of items required</mat-hint>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"validatorType === 'maxLength'\" appearance=\"outline\" class=\"length-input\">\n <mat-label>Maximum Items</mat-label>\n <input matInput \n type=\"number\"\n formControlName=\"maxItems\"\n min=\"1\"\n placeholder=\"100\">\n <mat-hint>Maximum number of items allowed</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"length-slider\" *ngIf=\"validatorType === 'minLength'\">\n <label>Minimum Items: {{ minItems }}</label>\n <mat-slider \n [min]=\"0\" \n [max]=\"100\" \n [step]=\"1\">\n <input matSliderThumb formControlName=\"minItems\">\n </mat-slider>\n </div>\n\n <div class=\"length-slider\" *ngIf=\"validatorType === 'maxLength'\">\n <label>Maximum Items: {{ maxItems }}</label>\n <mat-slider \n [min]=\"1\" \n [max]=\"1000\" \n [step]=\"1\">\n <input matSliderThumb formControlName=\"maxItems\">\n </mat-slider>\n </div>\n\n <div class=\"length-options\">\n <mat-form-field appearance=\"outline\" class=\"length-error-message\">\n <mat-label>Length Error Message</mat-label>\n <input matInput \n formControlName=\"lengthErrorMessage\"\n [placeholder]=\"getLengthErrorPlaceholder()\">\n </mat-form-field>\n\n <mat-checkbox formControlName=\"showItemCount\">\n Show current item count to user\n </mat-checkbox>\n \n <mat-checkbox formControlName=\"preventExcess\">\n Prevent adding items beyond limit\n </mat-checkbox>\n </div>\n </div>\n </div>\n\n <!-- Advanced Options -->\n <div class=\"form-section advanced-options\" *ngIf=\"validatorType && targetCollection\">\n <h4 class=\"section-title\">\n <mat-icon>tune</mat-icon>\n Advanced Options\n </h4>\n \n <div class=\"advanced-config\">\n <div class=\"validation-timing\">\n <h5>Validation Timing</h5>\n \n <mat-checkbox formControlName=\"validateOnAdd\">\n Validate when items are added\n </mat-checkbox>\n \n <mat-checkbox formControlName=\"validateOnRemove\">\n Validate when items are removed\n </mat-checkbox>\n \n <mat-checkbox formControlName=\"validateOnChange\">\n Validate when items are modified\n </mat-checkbox>\n \n <mat-checkbox formControlName=\"validateOnSubmit\">\n Validate on form submission\n </mat-checkbox>\n </div>\n\n <div class=\"error-handling\">\n <h5>Error Handling</h5>\n \n <mat-form-field appearance=\"outline\" class=\"error-strategy-select\">\n <mat-label>Error Display Strategy</mat-label>\n <mat-select formControlName=\"errorStrategy\">\n <mat-option value=\"summary\">Show summary at collection level</mat-option>\n <mat-option value=\"inline\">Show errors inline with items</mat-option>\n <mat-option value=\"both\">Show both summary and inline errors</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-checkbox formControlName=\"stopOnFirstError\">\n Stop validation on first error\n </mat-checkbox>\n \n <mat-checkbox formControlName=\"highlightErrorItems\">\n Highlight items with errors\n </mat-checkbox>\n </div>\n\n <div class=\"performance-options\">\n <h5>Performance</h5>\n \n <mat-form-field appearance=\"outline\" class=\"batch-size-input\">\n <mat-label>Validation Batch Size</mat-label>\n <input matInput \n type=\"number\"\n formControlName=\"batchSize\"\n min=\"1\"\n max=\"1000\"\n placeholder=\"50\">\n <mat-hint>Number of items to validate at once</mat-hint>\n </mat-form-field>\n\n <mat-checkbox formControlName=\"debounceValidation\">\n Debounce validation (reduce frequency)\n </mat-checkbox>\n \n <mat-form-field *ngIf=\"debounceValidation\" appearance=\"outline\" class=\"debounce-delay-input\">\n <mat-label>Debounce Delay (ms)</mat-label>\n <input matInput \n type=\"number\"\n formControlName=\"debounceDelay\"\n min=\"100\"\n max=\"5000\"\n placeholder=\"300\">\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- Preview Section -->\n <div class=\"form-section preview-section\" *ngIf=\"isValid()\">\n <h4 class=\"section-title\">\n <mat-icon>preview</mat-icon>\n Preview\n </h4>\n \n <div class=\"preview-content\">\n <div class=\"preview-text\">{{ getPreviewText() }}</div>\n \n <div class=\"preview-details\">\n <div *ngIf=\"validatorType === 'forEach'\" class=\"foreach-preview\">\n <strong>Rules:</strong> {{ getForEachRulesPreview() }}\n </div>\n \n <div *ngIf=\"validatorType === 'uniqueBy'\" class=\"unique-preview\">\n <strong>Unique Fields:</strong> {{ getUniqueFieldsPreview() }}\n </div>\n \n <div *ngIf=\"validatorType === 'minLength' || validatorType === 'maxLength'\" class=\"length-preview\">\n <strong>Constraints:</strong> {{ getLengthConstraintsPreview() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Validation Messages -->\n <div class=\"validation-messages\" *ngIf=\"hasValidationErrors()\">\n <div *ngFor=\"let error of getValidationErrors()\" \n class=\"validation-error\">\n <mat-icon>error</mat-icon>\n <span>{{ error }}</span>\n </div>\n </div>\n </form>\n `,\n styles: [`\n .collection-validator-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n max-width: 900px;\n }\n\n .form-row {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n }\n\n .validator-type-select,\n .target-collection-select {\n flex: 1;\n min-width: 250px;\n }\n\n .validator-option {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .validator-option mat-icon {\n align-self: flex-start;\n color: var(--mdc-theme-primary);\n }\n\n .validator-option small {\n color: var(--mdc-theme-on-surface-variant);\n font-size: 11px;\n }\n\n .field-option {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n }\n\n .field-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n color: var(--mdc-theme-primary);\n }\n\n .field-label {\n flex: 1;\n font-weight: 500;\n }\n\n .field-type {\n font-size: 11px;\n color: var(--mdc-theme-on-surface-variant);\n background: var(--mdc-theme-surface-variant);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .form-section {\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 8px;\n padding: 16px;\n background: var(--mdc-theme-surface-variant);\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .section-title h5 {\n margin: 16px 0 8px 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mdc-theme-primary);\n }\n\n .foreach-config,\n .unique-config,\n .length-config {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .item-schema-info {\n display: flex;\n gap: 12px;\n }\n\n .item-variable-input,\n .index-variable-input {\n flex: 1;\n }\n\n .validation-rules {\n background: var(--mdc-theme-surface);\n border-radius: 8px;\n padding: 16px;\n }\n\n .validation-rule-item,\n .unique-field-item {\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 8px;\n padding: 12px;\n margin-bottom: 12px;\n background: var(--mdc-theme-surface-variant);\n }\n\n .rule-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .rule-number {\n background: var(--mdc-theme-primary);\n color: var(--mdc-theme-on-primary);\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n }\n\n .rule-config {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .unique-field-item {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .field-path-input {\n flex: 1;\n }\n\n .length-inputs {\n display: flex;\n gap: 12px;\n }\n\n .length-input {\n flex: 1;\n }\n\n .length-slider {\n margin: 16px 0;\n }\n\n .length-slider label {\n display: block;\n margin-bottom: 8px;\n font-size: 13px;\n font-weight: 500;\n }\n\n .length-options,\n .unique-options {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .advanced-options {\n background: var(--mdc-theme-secondary-container);\n border-color: var(--mdc-theme-secondary);\n }\n\n .advanced-config {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 16px;\n }\n\n .validation-timing,\n .error-handling,\n .performance-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .validation-timing h5,\n .error-handling h5,\n .performance-options h5 {\n margin: 0 0 8px 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--mdc-theme-secondary);\n text-transform: uppercase;\n }\n\n .add-rule-button,\n .add-field-button {\n align-self: flex-start;\n }\n\n .preview-section {\n background: var(--mdc-theme-primary-container);\n border-color: var(--mdc-theme-primary);\n }\n\n .preview-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .preview-text {\n font-family: monospace;\n font-size: 14px;\n background: var(--mdc-theme-surface);\n padding: 12px;\n border-radius: 4px;\n border: 1px solid var(--mdc-theme-outline);\n }\n\n .preview-details {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .validation-messages {\n background: var(--mdc-theme-error-container);\n border-radius: 4px;\n padding: 8px 12px;\n }\n\n .validation-error {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mdc-theme-on-error-container);\n font-size: 12px;\n margin-bottom: 4px;\n }\n\n .validation-error:last-child {\n margin-bottom: 0;\n }\n\n .validation-error mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n /* Responsive adjustments */\n @media (max-width: 1024px) {\n .advanced-config {\n grid-template-columns: 1fr 1fr;\n }\n }\n\n @media (max-width: 768px) {\n .form-row {\n flex-direction: column;\n }\n \n .validator-type-select,\n .target-collection-select {\n width: 100%;\n }\n \n .item-schema-info {\n flex-direction: column;\n }\n \n .length-inputs {\n flex-direction: column;\n }\n \n .advanced-config {\n grid-template-columns: 1fr;\n }\n }\n `]\n})\nexport class CollectionValidatorEditorComponent implements OnInit, OnChanges {\n @Input() config: CollectionValidatorConfig | null = null;\n @Input() fieldSchemas: Record<string, FieldSchema> = {};\n \n @Output() configChanged = new EventEmitter<CollectionValidatorConfig>();\n\n private destroy$ = new Subject<void>();\n\n collectionForm: FormGroup;\n collectionFieldCategories: { name: string; fields: FieldSchema[] }[] = [];\n\n validatorType: string = '';\n targetCollection: string = '';\n\n get itemValidationRules(): FormArray {\n return this.collectionForm.get('itemValidationRules') as FormArray;\n }\n\n get uniqueByFields(): FormArray {\n return this.collectionForm.get('uniqueByFields') as FormArray;\n }\n\n get minItems(): number {\n return this.collectionForm.get('minItems')?.value || 0;\n }\n\n get maxItems(): number {\n return this.collectionForm.get('maxItems')?.value || 100;\n }\n\n get debounceValidation(): boolean {\n return this.collectionForm.get('debounceValidation')?.value || false;\n }\n\n constructor(private fb: FormBuilder) {\n this.collectionForm = this.createForm();\n }\n\n ngOnInit(): void {\n this.setupFieldCategories();\n this.setupFormSubscriptions();\n this.loadInitialConfig();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && !changes['config'].firstChange) {\n this.loadInitialConfig();\n }\n \n if (changes['fieldSchemas'] && !changes['fieldSchemas'].firstChange) {\n this.setupFieldCategories();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private createForm(): FormGroup {\n return this.fb.group({\n validatorType: ['', Validators.required],\n targetCollection: ['', Validators.required],\n \n // For Each\n itemVariable: ['item'],\n indexVariable: ['index'],\n itemValidationRules: this.fb.array([]),\n \n // Unique By\n uniqueByFields: this.fb.array([]),\n caseSensitive: [true],\n ignoreEmpty: [true],\n duplicateErrorMessage: [''],\n \n // Length\n minItems: [0, [Validators.min(0)]],\n maxItems: [100, [Validators.min(1)]],\n lengthErrorMessage: [''],\n showItemCount: [true],\n preventExcess: [true],\n \n // Advanced\n validateOnAdd: [true],\n validateOnRemove: [true],\n validateOnChange: [true],\n validateOnSubmit: [true],\n errorStrategy: ['both'],\n stopOnFirstError: [false],\n highlightErrorItems: [true],\n batchSize: [50, [Validators.min(1), Validators.max(1000)]],\n debounceValidation: [true],\n debounceDelay: [300, [Validators.min(100), Validators.max(5000)]]\n });\n }\n\n private setupFormSubscriptions(): void {\n this.collectionForm.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.emitConfigChange();\n });\n }\n\n private setupFieldCategories(): void {\n const collectionFields = Object.values(this.fieldSchemas)\n .filter(field => field.type === FieldType.ARRAY || field.type === FieldType.OBJECT);\n\n const fieldsByCategory: Record<string, FieldSchema[]> = {};\n \n collectionFields.forEach(field => {\n const category = field.uiConfig?.category || 'Collections';\n if (!fieldsByCategory[category]) {\n fieldsByCategory[category] = [];\n }\n fieldsByCategory[category].push(field);\n });\n\n this.collectionFieldCategories = Object.entries(fieldsByCategory)\n .map(([name, fields]) => ({\n name,\n fields: fields.sort((a, b) => a.label.localeCompare(b.label))\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n }\n\n private loadInitialConfig(): void {\n if (!this.config) return;\n\n this.validatorType = this.mapRuleTypeToValidatorType(this.config.type);\n this.targetCollection = this.config.targetCollection || '';\n\n // Load form values\n this.collectionForm.patchValue({\n validatorType: this.validatorType,\n targetCollection: this.targetCollection,\n itemVariable: this.config.itemVariable || 'item',\n indexVariable: this.config.indexVariable || 'index',\n caseSensitive: this.config.caseSensitive !== false,\n ignoreEmpty: this.config.ignoreEmpty !== false,\n duplicateErrorMessage: this.config.duplicateErrorMessage || '',\n minItems: this.config.minItems || 0,\n maxItems: this.config.maxItems || 100,\n lengthErrorMessage: this.config.lengthErrorMessage || '',\n showItemCount: this.config.showItemCount !== false,\n preventExcess: this.config.preventExcess !== false,\n validateOnAdd: this.config.validateOnAdd !== false,\n validateOnRemove: this.config.validateOnRemove !== false,\n validateOnChange: this.config.validateOnChange !== false,\n validateOnSubmit: this.config.validateOnSubmit !== false,\n errorStrategy: this.config.errorStrategy || 'both',\n stopOnFirstError: this.config.stopOnFirstError || false,\n highlightErrorItems: this.config.highlightErrorItems !== false,\n batchSize: this.config.batchSize || 50,\n debounceValidation: this.config.debounceValidation !== false,\n debounceDelay: this.config.debounceDelay || 300\n });\n\n // Load arrays\n this.loadItemValidationRules(this.config.itemValidationRules || []);\n this.loadUniqueByFields(this.config.uniqueByFields || []);\n }\n\n private loadItemValidationRules(rules: any[]): void {\n this.itemValidationRules.clear();\n rules.forEach(rule => {\n this.itemValidationRules.push(this.fb.group({\n ruleType: [rule.ruleType || 'required'],\n fieldPath: [rule.fieldPath || ''],\n errorMessage: [rule.errorMessage || '']\n }));\n });\n \n if (this.itemValidationRules.length === 0) {\n this.addItemValidationRule();\n }\n }\n\n private loadUniqueByFields(fields: string[]): void {\n this.uniqueByFields.clear();\n fields.forEach(field => {\n this.uniqueByFields.push(this.fb.control(field));\n });\n \n if (this.uniqueByFields.length === 0) {\n this.addUniqueField();\n }\n }\n\n private emitConfigChange(): void {\n if (!this.collectionForm.valid) return;\n\n const formValue = this.collectionForm.value;\n const config: CollectionValidatorConfig = {\n type: this.mapValidatorTypeToRuleType(formValue.validatorType),\n targetCollection: formValue.targetCollection,\n itemVariable: formValue.itemVariable || undefined,\n indexVariable: formValue.indexVariable || undefined,\n itemValidationRules: this.getItemValidationRulesValue(),\n uniqueByFields: this.getUniqueByFieldsValue(),\n caseSensitive: formValue.caseSensitive,\n ignoreEmpty: formValue.ignoreEmpty,\n duplicateErrorMessage: formValue.duplicateErrorMessage || undefined,\n minItems: formValue.minItems || undefined,\n maxItems: formValue.maxItems || undefined,\n lengthErrorMessage: formValue.lengthErrorMessage || undefined,\n showItemCount: formValue.showItemCount,\n preventExcess: formValue.preventExcess,\n validateOnAdd: formValue.validateOnAdd,\n validateOnRemove: formValue.validateOnRemove,\n validateOnChange: formValue.validateOnChange,\n validateOnSubmit: formValue.validateOnSubmit,\n errorStrategy: formValue.errorStrategy,\n stopOnFirstError: formValue.stopOnFirstError,\n highlightErrorItems: formValue.highlightErrorItems,\n batchSize: formValue.batchSize,\n debounceValidation: formValue.debounceValidation,\n debounceDelay: formValue.debounceDelay\n };\n\n this.configChanged.emit(config);\n }\n\n private getItemValidationRulesValue(): any[] {\n return this.itemValidationRules.controls.map(control => control.value);\n }\n\n private getUniqueByFieldsValue(): string[] {\n return this.uniqueByFields.controls.map(control => control.value).filter(Boolean);\n }\n\n // Template methods\n getFieldIcon(type: string): string {\n const icons: Record<string, string> = {\n 'array': 'list',\n 'object': 'data_object',\n 'string': 'text_fields',\n 'number': 'pin',\n 'boolean': 'toggle_on'\n };\n \n return icons[type] || 'list';\n }\n\n getLengthErrorPlaceholder(): string {\n if (this.validatorType === 'minLength') {\n return 'At least {min} items are required';\n } else if (this.validatorType === 'maxLength') {\n return 'Maximum {max} items allowed';\n }\n return 'Invalid length';\n }\n\n getPreviewText(): string {\n const formValue = this.collectionForm.value;\n \n if (!formValue.validatorType || !formValue.targetCollection) {\n return 'Incomplete collection validator configuration';\n }\n\n const targetSchema = this.fieldSchemas[formValue.targetCollection];\n const targetLabel = targetSchema?.label || formValue.targetCollection;\n \n switch (formValue.validatorType) {\n case 'forEach':\n return `Validate each item in ${targetLabel} using ${this.itemValidationRules.length} rule(s)`;\n case 'uniqueBy':\n const uniqueFields = this.getUniqueByFieldsValue();\n return `Ensure items in ${targetLabel} are unique by: ${uniqueFields.join(', ')}`;\n case 'minLength':\n return `${targetLabel} must have at least ${formValue.minItems} item(s)`;\n case 'maxLength':\n return `${targetLabel} must have at most ${formValue.maxItems} item(s)`;\n default:\n return 'Collection validation rule';\n }\n }\n\n getForEachRulesPreview(): string {\n const rules = this.getItemValidationRulesValue();\n return rules.map(rule => `${rule.ruleType} on ${rule.fieldPath}`).join(', ');\n }\n\n getUniqueFieldsPreview(): string {\n const fields = this.getUniqueByFieldsValue();\n return fields.length > 0 ? fields.join(', ') : 'None specified';\n }\n\n getLengthConstraintsPreview(): string {\n const formValue = this.collectionForm.value;\n if (this.validatorType === 'minLength') {\n return `Minimum: ${formValue.minItems} items`;\n } else if (this.validatorType === 'maxLength') {\n return `Maximum: ${formValue.maxItems} items`;\n }\n return '';\n }\n\n // Event handlers\n onValidatorTypeChanged(event: MatSelectChange): void {\n const type = event.value as 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength';\n this.validatorType = type;\n \n // Initialize arrays based on type\n if (type === 'forEach' && this.itemValidationRules.length === 0) {\n this.addItemValidationRule();\n } else if (type === 'uniqueBy' && this.uniqueByFields.length === 0) {\n this.addUniqueField();\n }\n }\n\n onTargetCollectionChanged(event: MatSelectChange): void {\n this.targetCollection = event.value;\n }\n\n addItemValidationRule(): void {\n const rule = this.fb.group({\n ruleType: ['required'],\n fieldPath: [''],\n errorMessage: ['']\n });\n this.itemValidationRules.push(rule);\n }\n\n removeItemValidationRule(index: number): void {\n if (this.itemValidationRules.length > 1) {\n this.itemValidationRules.removeAt(index);\n }\n }\n\n addUniqueField(): void {\n this.uniqueByFields.push(this.fb.control(''));\n }\n\n removeUniqueField(index: number): void {\n if (this.uniqueByFields.length > 1) {\n this.uniqueByFields.removeAt(index);\n }\n }\n\n // Validation methods\n hasValidationErrors(): boolean {\n return this.getValidationErrors().length > 0;\n }\n\n getValidationErrors(): string[] {\n const errors: string[] = [];\n \n if (!this.collectionForm.get('validatorType')?.value) {\n errors.push('Validator type is required');\n }\n \n if (!this.collectionForm.get('targetCollection')?.value) {\n errors.push('Target collection is required');\n }\n \n if (this.validatorType === 'forEach' && this.itemValidationRules.length === 0) {\n errors.push('At least one validation rule is required for forEach');\n }\n \n if (this.validatorType === 'uniqueBy' && this.getUniqueByFieldsValue().length === 0) {\n errors.push('At least one unique field is required');\n }\n \n return errors;\n }\n\n isValid(): boolean {\n return this.collectionForm.valid && !this.hasValidationErrors();\n }\n\n // Helper methods\n private mapRuleTypeToValidatorType(ruleType: string): string {\n const mapping: Record<string, string> = {\n 'forEach': 'forEach',\n 'uniqueBy': 'uniqueBy',\n 'minLength': 'minLength',\n 'maxLength': 'maxLength'\n };\n \n return mapping[ruleType] || 'forEach';\n }\n\n private mapValidatorTypeToRuleType(validatorType: string): 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength' {\n const mapping: Record<string, 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength'> = {\n 'forEach': 'forEach',\n 'uniqueBy': 'uniqueBy',\n 'minLength': 'minLength',\n 'maxLength': 'maxLength'\n };\n \n return mapping[validatorType] || 'forEach';\n }\n}","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\n\nimport {\n RuleNode,\n RuleNodeType,\n RuleNodeTypeString,\n RuleNodeConfig,\n FieldConditionConfig,\n BooleanGroupConfig,\n ConditionalValidatorConfig,\n CollectionValidatorConfig,\n ValidationError,\n} from '../models/rule-builder.model';\nimport {\n FieldSchema,\n FIELD_TYPE_OPERATORS,\n OPERATOR_LABELS,\n} from '../models/field-schema.model';\nimport { FieldConditionEditorComponent } from './field-condition-editor.component';\nimport { ConditionalValidatorEditorComponent } from './conditional-validator-editor.component';\nimport { CollectionValidatorEditorComponent } from './collection-validator-editor.component';\n\n@Component({\n selector: 'praxis-rule-node',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCardModule,\n MatButtonModule,\n MatIconModule,\n MatSelectModule,\n MatInputModule,\n MatFormFieldModule,\n MatMenuModule,\n MatTooltipModule,\n MatChipsModule,\n MatBadgeModule,\n MatDividerModule,\n DragDropModule,\n FieldConditionEditorComponent,\n ConditionalValidatorEditorComponent,\n CollectionValidatorEditorComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"rule-node-container\"\n [class.selected]=\"isSelected\"\n [class.has-errors]=\"hasValidationErrors\"\n [class]=\"'level-' + level\"\n >\n <!-- Main Rule Node -->\n <mat-card\n class=\"rule-node\"\n [class.selected]=\"isSelected\"\n (click)=\"selectNode()\"\n >\n <!-- Node Header -->\n <div class=\"node-header\">\n <div class=\"node-type\">\n <mat-icon class=\"type-icon\" [class]=\"getNodeTypeClass()\">\n {{ getNodeIcon() }}\n </mat-icon>\n <span class=\"type-label\">{{ getNodeLabel() }}</span>\n </div>\n\n <div class=\"node-actions\">\n <!-- Validation Errors Badge -->\n <mat-icon\n *ngIf=\"hasValidationErrors\"\n class=\"error-badge\"\n [matBadge]=\"validationErrors.length\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"small\"\n matTooltip=\"Has validation errors\"\n >\n error\n </mat-icon>\n\n <!-- Node Menu -->\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"nodeMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n\n <mat-menu #nodeMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editNode()\">\n <mat-icon>edit</mat-icon>\n <span>Edit</span>\n </button>\n\n <button mat-menu-item (click)=\"duplicateNode()\">\n <mat-icon>content_copy</mat-icon>\n <span>Duplicate</span>\n </button>\n\n <mat-divider></mat-divider>\n\n <button\n mat-menu-item\n *ngIf=\"canHaveChildren()\"\n [matMenuTriggerFor]=\"addChildMenu\"\n >\n <mat-icon>add</mat-icon>\n <span>Add Child</span>\n </button>\n\n <mat-divider></mat-divider>\n\n <button\n mat-menu-item\n (click)=\"deleteNode()\"\n class=\"delete-action\"\n >\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </mat-menu>\n\n <mat-menu #addChildMenu=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let option of getChildOptions()\"\n (click)=\"addChild(option.type)\"\n >\n <mat-icon>{{ option.icon }}</mat-icon>\n <span>{{ option.label }}</span>\n </button>\n </mat-menu>\n </div>\n </div>\n\n <!-- Node Content -->\n <div class=\"node-content\">\n <!-- Field Condition Content -->\n <div *ngIf=\"isFieldCondition()\" class=\"field-condition-content\">\n <praxis-field-condition-editor\n [config]=\"getFieldConditionConfig()\"\n [fieldSchemas]=\"fieldSchemas\"\n (configChanged)=\"onFieldConditionChanged($event)\"\n >\n </praxis-field-condition-editor>\n </div>\n\n <!-- Boolean Group Content -->\n <div *ngIf=\"isBooleanGroup()\" class=\"boolean-group-content\">\n <div class=\"group-operator\">\n <mat-form-field appearance=\"outline\" class=\"operator-select\">\n <mat-select\n [value]=\"getBooleanOperator()\"\n (selectionChange)=\"onBooleanOperatorChanged($event)\"\n >\n <mat-option value=\"and\">AND</mat-option>\n <mat-option value=\"or\">OR</mat-option>\n <mat-option value=\"not\">NOT</mat-option>\n <mat-option value=\"xor\">XOR</mat-option>\n <mat-option value=\"implies\">IMPLIES</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n\n <!-- Conditional Validator Content -->\n <div\n *ngIf=\"isConditionalValidator()\"\n class=\"conditional-validator-content\"\n >\n <praxis-conditional-validator-editor\n [config]=\"getConditionalValidatorConfig()\"\n [fieldSchemas]=\"fieldSchemas\"\n (configChanged)=\"onConditionalValidatorChanged($event)\"\n >\n </praxis-conditional-validator-editor>\n </div>\n\n <!-- Collection Validation Content -->\n <div\n *ngIf=\"isCollectionValidation()\"\n class=\"collection-validation-content\"\n >\n <praxis-collection-validator-editor\n [config]=\"getCollectionValidationConfig()\"\n [fieldSchemas]=\"fieldSchemas\"\n (configChanged)=\"onCollectionValidationChanged($event)\"\n >\n </praxis-collection-validator-editor>\n </div>\n\n <!-- Metadata Preview -->\n <div *ngIf=\"node?.metadata\" class=\"metadata-preview\">\n <mat-chip-set class=\"metadata-chips\">\n <mat-chip\n *ngIf=\"node!.metadata?.code\"\n class=\"metadata-chip code-chip\"\n >\n {{ node!.metadata!.code }}\n </mat-chip>\n\n <mat-chip\n *ngIf=\"node!.metadata?.tag\"\n class=\"metadata-chip tag-chip\"\n >\n {{ node!.metadata!.tag }}\n </mat-chip>\n </mat-chip-set>\n\n <div\n *ngIf=\"node!.metadata?.message\"\n class=\"metadata-message\"\n [title]=\"node!.metadata?.message\"\n >\n {{ node!.metadata!.message }}\n </div>\n </div>\n </div>\n\n <!-- Validation Errors -->\n <div *ngIf=\"hasValidationErrors\" class=\"validation-errors\">\n <div\n *ngFor=\"let error of validationErrors\"\n class=\"validation-error\"\n [class]=\"error.severity\"\n >\n <mat-icon class=\"error-icon\">{{\n getErrorIcon(error.severity)\n }}</mat-icon>\n <span class=\"error-message\">{{ error.message }}</span>\n </div>\n </div>\n </mat-card>\n\n <!-- Children Container -->\n <div *ngIf=\"hasChildren()\" class=\"children-container\">\n <div class=\"children-connector\">\n <div class=\"connector-line\"></div>\n </div>\n\n <div\n class=\"children-list\"\n cdkDropList\n [cdkDropListData]=\"node?.children || []\"\n (cdkDropListDropped)=\"onChildDrop($event)\"\n >\n <div\n *ngFor=\"let childId of node?.children; trackBy: trackByChildId\"\n class=\"child-wrapper\"\n cdkDrag\n >\n <praxis-rule-node\n [node]=\"getChildNode(childId)\"\n [fieldSchemas]=\"fieldSchemas\"\n [level]=\"level + 1\"\n [isSelected]=\"isChildSelected(childId)\"\n [validationErrors]=\"getChildValidationErrors(childId)\"\n (nodeClicked)=\"onChildClicked(childId)\"\n (nodeUpdated)=\"onChildUpdated($event)\"\n (nodeDeleted)=\"onChildDeleted(childId)\"\n (childAdded)=\"onChildAdded($event)\"\n (childMoved)=\"onChildMoved($event)\"\n >\n </praxis-rule-node>\n\n <!-- Child Connector -->\n <div *ngIf=\"!isLastChild(childId)\" class=\"child-connector\">\n <div class=\"connector-line\"></div>\n <div class=\"connector-operator\">\n {{ getBooleanOperator().toUpperCase() }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Add Child Button -->\n <div *ngIf=\"canHaveChildren()\" class=\"add-child-area\">\n <button\n mat-icon-button\n color=\"primary\"\n (click)=\"showAddChildMenu()\"\n class=\"add-child-button\"\n >\n <mat-icon>add_circle</mat-icon>\n </button>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n --vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,0.08));\n --vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,0.18));\n --vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,0.32));\n }\n .rule-node-container {\n position: relative;\n margin-bottom: 16px;\n }\n\n .rule-node {\n min-width: 300px;\n border: 2px solid transparent;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n }\n\n .rule-node:hover { border-color: var(--mdc-theme-primary); box-shadow: 0 4px 8px var(--vb-shadow-low-color); }\n\n .rule-node.selected { border-color: var(--mdc-theme-primary); background: var(--mdc-theme-primary-container); box-shadow: 0 4px 12px var(--vb-shadow-medium-color); }\n\n .rule-node-container.has-errors .rule-node {\n border-color: var(--mdc-theme-error);\n }\n\n .node-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mdc-theme-outline);\n background: var(--mdc-theme-surface-variant);\n }\n\n .node-type {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .type-icon {\n font-size: 20px;\n width: 20px;\n height: 20px;\n }\n\n .type-icon.field-condition {\n color: var(--mdc-theme-primary);\n }\n .type-icon.boolean-group {\n color: var(--mdc-theme-secondary);\n }\n .type-icon.conditional-validator {\n color: var(--mdc-theme-tertiary);\n }\n .type-icon.collection-validation {\n color: var(--mdc-theme-error);\n }\n\n .type-label {\n font-weight: 500;\n font-size: 14px;\n }\n\n .node-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .error-badge {\n color: var(--mdc-theme-error);\n font-size: 18px;\n }\n\n .node-content {\n padding: 16px;\n }\n\n .field-condition-content,\n .boolean-group-content,\n .conditional-validator-content,\n .collection-validation-content {\n min-height: 60px;\n }\n\n .group-operator {\n display: flex;\n justify-content: center;\n }\n\n .operator-select {\n width: 120px;\n }\n\n .metadata-preview {\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--mdc-theme-outline);\n }\n\n .metadata-chips {\n margin-bottom: 8px;\n }\n\n .metadata-chip {\n font-size: 11px;\n height: 20px;\n }\n\n .code-chip {\n background: var(--mdc-theme-primary-container);\n color: var(--mdc-theme-on-primary-container);\n }\n\n .tag-chip {\n background: var(--mdc-theme-secondary-container);\n color: var(--mdc-theme-on-secondary-container);\n }\n\n .metadata-message {\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n font-style: italic;\n max-width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .validation-errors {\n border-top: 1px solid var(--mdc-theme-error);\n background: var(--mdc-theme-error-container);\n padding: 8px 12px;\n }\n\n .validation-error {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 4px;\n font-size: 12px;\n }\n\n .validation-error:last-child {\n margin-bottom: 0;\n }\n\n .validation-error.error {\n color: var(--mdc-theme-on-error-container);\n }\n\n .validation-error.warning {\n color: var(--mdc-theme-warning);\n }\n\n .error-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n .children-container {\n margin-left: 24px;\n position: relative;\n }\n\n .children-connector {\n position: absolute;\n left: -12px;\n top: 0;\n width: 12px;\n height: 24px;\n }\n\n .connector-line {\n width: 2px;\n height: 100%;\n background: var(--mdc-theme-outline);\n margin-left: 10px;\n }\n\n .children-list {\n padding-left: 12px;\n border-left: 2px solid var(--mdc-theme-outline);\n }\n\n .child-wrapper {\n position: relative;\n }\n\n .child-connector {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: 8px 0;\n }\n\n .child-connector .connector-line {\n width: 2px;\n height: 12px;\n background: var(--mdc-theme-outline);\n }\n\n .connector-operator {\n background: var(--mdc-theme-secondary);\n color: var(--mdc-theme-on-secondary);\n padding: 2px 6px;\n border-radius: 8px;\n font-size: 10px;\n font-weight: 600;\n margin-top: -1px;\n }\n\n .add-child-area {\n display: flex;\n justify-content: center;\n margin-top: 16px;\n padding: 8px;\n border: 1px dashed var(--mdc-theme-outline);\n border-radius: 8px;\n background: var(--mdc-theme-surface-variant);\n }\n\n .add-child-button {\n color: var(--mdc-theme-primary);\n }\n\n /* Level-based indentation */\n .level-1 {\n margin-left: 20px;\n }\n .level-2 {\n margin-left: 40px;\n }\n .level-3 {\n margin-left: 60px;\n }\n\n /* Drag and drop styles */\n .cdk-drag-preview {\n box-sizing: border-box;\n border-radius: 4px;\n box-shadow:\n 0 5px 5px -3px rgba(0, 0, 0, 0.2),\n 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0 3px 14px 2px rgba(0, 0, 0, 0.12);\n }\n\n .cdk-drag-placeholder {\n opacity: 0;\n }\n\n .cdk-drag-animating {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n }\n\n .children-list.cdk-drop-list-dragging\n .child-wrapper:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n }\n\n /* Menu styles */\n .delete-action {\n color: var(--mdc-theme-error);\n }\n `,\n ],\n})\nexport class RuleNodeComponent {\n @Input() node: RuleNode | null = null;\n @Input() fieldSchemas: Record<string, FieldSchema> = {};\n @Input() level: number = 0;\n @Input() isSelected: boolean = false;\n @Input() validationErrors: ValidationError[] = [];\n\n @Output() nodeClicked = new EventEmitter<void>();\n @Output() nodeUpdated = new EventEmitter<{\n nodeId: string;\n updates: Partial<RuleNode>;\n }>();\n @Output() nodeDeleted = new EventEmitter<void>();\n @Output() childAdded = new EventEmitter<RuleNodeType>();\n @Output() childMoved = new EventEmitter<CdkDragDrop<string[]>>();\n\n get hasValidationErrors(): boolean {\n return this.validationErrors && this.validationErrors.length > 0;\n }\n\n constructor(private fb: FormBuilder) {}\n\n // Template methods\n selectNode(): void {\n this.nodeClicked.emit();\n }\n\n getNodeIcon(): string {\n if (!this.node) return 'help';\n\n const icons: Record<RuleNodeType, string> = {\n [RuleNodeType.FIELD_CONDITION]: 'compare_arrows',\n [RuleNodeType.AND_GROUP]: 'join_inner',\n [RuleNodeType.OR_GROUP]: 'join_full',\n [RuleNodeType.NOT_GROUP]: 'block',\n [RuleNodeType.XOR_GROUP]: 'join_left',\n [RuleNodeType.IMPLIES_GROUP]: 'arrow_forward',\n [RuleNodeType.REQUIRED_IF]: 'star',\n [RuleNodeType.VISIBLE_IF]: 'visibility',\n [RuleNodeType.DISABLED_IF]: 'block',\n [RuleNodeType.READONLY_IF]: 'lock',\n [RuleNodeType.FOR_EACH]: 'repeat',\n [RuleNodeType.UNIQUE_BY]: 'fingerprint',\n [RuleNodeType.MIN_LENGTH]: 'height',\n [RuleNodeType.MAX_LENGTH]: 'height',\n [RuleNodeType.IF_DEFINED]: 'help',\n [RuleNodeType.IF_NOT_NULL]: 'help_outline',\n [RuleNodeType.IF_EXISTS]: 'search',\n [RuleNodeType.WITH_DEFAULT]: 'settings_backup_restore',\n [RuleNodeType.FUNCTION_CALL]: 'functions',\n [RuleNodeType.FIELD_TO_FIELD]: 'compare_arrows',\n [RuleNodeType.CONTEXTUAL]: 'dynamic_form',\n [RuleNodeType.AT_LEAST]: 'filter_list',\n [RuleNodeType.EXACTLY]: 'looks_one',\n [RuleNodeType.EXPRESSION]: 'code',\n [RuleNodeType.CONTEXTUAL_TEMPLATE]: 'view_module',\n [RuleNodeType.CUSTOM]: 'extension',\n };\n\n return icons[this.node.type] || 'help';\n }\n\n getNodeLabel(): string {\n if (!this.node) return 'Unknown';\n return this.node.label || this.formatNodeType(this.node.type);\n }\n\n getNodeTypeClass(): string {\n if (!this.node) return '';\n\n if (this.isFieldCondition()) return 'field-condition';\n if (this.isBooleanGroup()) return 'boolean-group';\n if (this.isConditionalValidator()) return 'conditional-validator';\n if (this.isCollectionValidation()) return 'collection-validation';\n\n return '';\n }\n\n getErrorIcon(severity: string): string {\n const icons: Record<string, string> = {\n error: 'error',\n warning: 'warning',\n info: 'info',\n };\n return icons[severity] || 'info';\n }\n\n // Node type checks\n isFieldCondition(): boolean {\n return this.node?.type === RuleNodeType.FIELD_CONDITION;\n }\n\n isBooleanGroup(): boolean {\n return [\n RuleNodeType.AND_GROUP,\n RuleNodeType.OR_GROUP,\n RuleNodeType.NOT_GROUP,\n RuleNodeType.XOR_GROUP,\n RuleNodeType.IMPLIES_GROUP,\n ].includes(this.node?.type as RuleNodeType);\n }\n\n isConditionalValidator(): boolean {\n return [\n RuleNodeType.REQUIRED_IF,\n RuleNodeType.VISIBLE_IF,\n RuleNodeType.DISABLED_IF,\n RuleNodeType.READONLY_IF,\n ].includes(this.node?.type as RuleNodeType);\n }\n\n isCollectionValidation(): boolean {\n return [\n RuleNodeType.FOR_EACH,\n RuleNodeType.UNIQUE_BY,\n RuleNodeType.MIN_LENGTH,\n RuleNodeType.MAX_LENGTH,\n ].includes(this.node?.type as RuleNodeType);\n }\n\n // Configuration getters\n getFieldConditionConfig(): FieldConditionConfig | null {\n if (!this.isFieldCondition()) return null;\n return (this.node?.config as FieldConditionConfig) || null;\n }\n\n getBooleanGroupConfig(): BooleanGroupConfig | null {\n if (!this.isBooleanGroup()) return null;\n return (this.node?.config as BooleanGroupConfig) || null;\n }\n\n getConditionalValidatorConfig(): ConditionalValidatorConfig | null {\n if (!this.isConditionalValidator()) return null;\n return (this.node?.config as ConditionalValidatorConfig) || null;\n }\n\n getCollectionValidationConfig(): CollectionValidatorConfig | null {\n if (!this.isCollectionValidation()) return null;\n return (this.node?.config as CollectionValidatorConfig) || null;\n }\n\n getBooleanOperator(): string {\n const config = this.getBooleanGroupConfig();\n return config?.operator || 'and';\n }\n\n // Children management\n hasChildren(): boolean {\n return !!(this.node?.children && this.node.children.length > 0);\n }\n\n canHaveChildren(): boolean {\n return this.isBooleanGroup() || this.isConditionalValidator();\n }\n\n getChildOptions(): { type: RuleNodeType; icon: string; label: string }[] {\n return [\n {\n type: RuleNodeType.FIELD_CONDITION,\n icon: 'compare_arrows',\n label: 'Field Condition',\n },\n { type: RuleNodeType.AND_GROUP, icon: 'join_inner', label: 'AND Group' },\n { type: RuleNodeType.OR_GROUP, icon: 'join_full', label: 'OR Group' },\n { type: RuleNodeType.REQUIRED_IF, icon: 'star', label: 'Required If' },\n ];\n }\n\n trackByChildId(index: number, childId: string): string {\n return childId;\n }\n\n getChildNode(childId: string): RuleNode | null {\n // This would typically come from a service or parent component\n return null;\n }\n\n isChildSelected(childId: string): boolean {\n // This would typically come from a service or parent component\n return false;\n }\n\n getChildValidationErrors(childId: string): ValidationError[] {\n // This would typically come from a service or parent component\n return [];\n }\n\n isLastChild(childId: string): boolean {\n if (!this.node?.children) return true;\n return this.node.children[this.node.children.length - 1] === childId;\n }\n\n // Event handlers\n editNode(): void {\n // Open edit dialog or emit edit event\n }\n\n duplicateNode(): void {\n // Duplicate the current node\n }\n\n deleteNode(): void {\n this.nodeDeleted.emit();\n }\n\n addChild(type: RuleNodeType): void {\n this.childAdded.emit(type);\n }\n\n showAddChildMenu(): void {\n // Show add child menu\n }\n\n onBooleanOperatorChanged(event: MatSelectChange): void {\n if (!this.node) return;\n\n const operator = event.value as 'and' | 'or' | 'not' | 'xor' | 'implies';\n const config: BooleanGroupConfig = {\n ...this.getBooleanGroupConfig(),\n type: 'booleanGroup',\n operator,\n };\n\n this.nodeUpdated.emit({\n nodeId: this.node.id,\n updates: { config },\n });\n }\n\n onFieldConditionChanged(config: FieldConditionConfig): void {\n if (!this.node) return;\n\n this.nodeUpdated.emit({\n nodeId: this.node.id,\n updates: { config },\n });\n }\n\n onConditionalValidatorChanged(config: ConditionalValidatorConfig): void {\n if (!this.node) return;\n\n this.nodeUpdated.emit({\n nodeId: this.node.id,\n updates: { config },\n });\n }\n\n onCollectionValidationChanged(config: CollectionValidatorConfig): void {\n if (!this.node) return;\n\n this.nodeUpdated.emit({\n nodeId: this.node.id,\n updates: { config },\n });\n }\n\n onChildClicked(childId: string): void {\n // Bubble up child selection\n }\n\n onChildUpdated(event: { nodeId: string; updates: Partial<RuleNode> }): void {\n // Bubble up child updates\n }\n\n onChildDeleted(childId: string): void {\n // Handle child deletion\n }\n\n onChildAdded(event: RuleNodeType): void {\n // Handle child addition\n }\n\n onChildMoved(event: CdkDragDrop<string[]>): void {\n this.childMoved.emit(event);\n }\n\n onChildDrop(event: CdkDragDrop<string[]>): void {\n if (event.previousIndex !== event.currentIndex) {\n this.childMoved.emit(event);\n }\n }\n\n // Helper methods\n private formatNodeType(type: RuleNodeType | RuleNodeTypeString): string {\n return type\n .split(/(?=[A-Z])/)\n .join(' ')\n .toLowerCase()\n .replace(/^\\w/, (c: string) => c.toUpperCase());\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\n\nimport { Subject, takeUntil } from 'rxjs';\n\nimport {\n RuleBuilderState,\n RuleNode,\n RuleNodeType,\n RuleNodeConfig\n} from '../models/rule-builder.model';\nimport { FieldSchema } from '../models/field-schema.model';\nimport { RuleNodeComponent } from './rule-node.component';\n\n@Component({\n selector: 'praxis-rule-canvas',\n standalone: true,\n imports: [\n CommonModule,\n MatCardModule,\n MatButtonModule,\n MatIconModule,\n MatMenuModule,\n MatTooltipModule,\n DragDropModule,\n RuleNodeComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rule-canvas\"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragleave)=\"onDragLeave($event)\">\n\n <!-- Empty State -->\n <div *ngIf=\"isEmpty\" class=\"empty-state\">\n <div class=\"empty-state-content\">\n <mat-icon class=\"empty-icon\">rule</mat-icon>\n <h3>Start Building Rules</h3>\n <p>Drag fields from the sidebar or click the button below to create your first rule</p>\n\n <button mat-raised-button\n color=\"primary\"\n (click)=\"addFirstRule()\">\n <mat-icon>add</mat-icon>\n Add First Rule\n </button>\n </div>\n </div>\n\n <!-- Rule Tree -->\n <div *ngIf=\"!isEmpty\" class=\"rule-tree\">\n <div *ngFor=\"let nodeId of state?.rootNodes; trackBy: trackByNodeId\"\n class=\"root-rule-container\">\n <praxis-rule-node\n [node]=\"getNode(nodeId)\"\n [fieldSchemas]=\"fieldSchemas\"\n [level]=\"0\"\n [isSelected]=\"isNodeSelected(nodeId)\"\n [validationErrors]=\"getNodeValidationErrors(nodeId)\"\n (nodeClicked)=\"selectNode(nodeId)\"\n (nodeUpdated)=\"updateNode($event)\"\n (nodeDeleted)=\"deleteNode(nodeId)\"\n (childAdded)=\"addChildNode(nodeId, $event)\"\n (childMoved)=\"moveChildNode($event)\">\n </praxis-rule-node>\n\n <!-- Connector for multiple root rules -->\n <div *ngIf=\"!isLastRootNode(nodeId)\" class=\"root-connector\">\n <div class=\"connector-line\"></div>\n <div class=\"connector-operator\">AND</div>\n </div>\n </div>\n </div>\n\n <!-- Drop Zone Overlay -->\n <div *ngIf=\"isDragOver\" class=\"drop-zone-overlay\">\n <div class=\"drop-zone-content\">\n <mat-icon>add_circle</mat-icon>\n <span>Drop here to create a new rule</span>\n </div>\n </div>\n\n <!-- Floating Add Menu -->\n <div class=\"floating-add-menu\"\n [class.expanded]=\"showAddMenu\">\n <button mat-fab\n color=\"primary\"\n (click)=\"toggleAddMenu()\"\n class=\"main-add-button\">\n <mat-icon>{{ showAddMenu ? 'close' : 'add' }}</mat-icon>\n </button>\n\n <div *ngIf=\"showAddMenu\" class=\"add-menu-options\">\n <button *ngFor=\"let option of addMenuOptions\"\n mat-mini-fab\n [color]=\"option.color\"\n (click)=\"addRule(option.type)\"\n [matTooltip]=\"option.label\"\n class=\"add-option-button\">\n <mat-icon>{{ option.icon }}</mat-icon>\n </button>\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host {\n --mdc-theme-background: var(--md-sys-color-background, var(--sicoob-bg-high));\n --mdc-theme-surface: var(--md-sys-color-surface, var(--sicoob-bg-elev-1));\n --mdc-theme-surface-variant: var(--md-sys-color-surface-container, var(--sicoob-bg-elev-2));\n --mdc-theme-outline: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));\n --mdc-theme-on-surface: var(--md-sys-color-on-surface, var(--sicoob-text-high));\n --mdc-theme-on-surface-variant: var(--md-sys-color-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n --mdc-theme-primary: var(--md-sys-color-primary, var(--sicoob-primary-default));\n --mdc-theme-on-primary: var(--md-sys-color-on-primary, #fff);\n --mdc-theme-primary-container: var(--md-sys-color-primary-container, color-mix(in srgb, var(--mdc-theme-primary), transparent 85%));\n --mdc-theme-primary-rgb: 0, 150, 136; /* fallback if rgb var missing */\n }\n .rule-canvas {\n position: relative;\n min-height: 500px;\n width: 100%;\n background: var(--mdc-theme-surface);\n border: 2px dashed var(--mdc-theme-outline);\n border-radius: 12px;\n padding: 24px;\n transition: all 0.3s ease;\n }\n\n .rule-canvas.drag-over {\n border-color: var(--mdc-theme-primary);\n background: var(--mdc-theme-primary-container);\n border-style: solid;\n }\n\n .empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 400px;\n text-align: center;\n }\n\n .empty-state-content {\n max-width: 400px;\n }\n\n .empty-icon {\n font-size: 64px;\n width: 64px;\n height: 64px;\n color: var(--mdc-theme-on-surface-variant);\n margin-bottom: 16px;\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--mdc-theme-on-surface);\n font-weight: 500;\n }\n\n .empty-state p {\n margin: 0 0 24px 0;\n color: var(--mdc-theme-on-surface-variant);\n line-height: 1.4;\n }\n\n .rule-tree {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .root-rule-container {\n position: relative;\n }\n\n .root-connector {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: 8px 0;\n }\n\n .connector-line {\n width: 2px;\n height: 16px;\n background: var(--mdc-theme-outline);\n }\n\n .connector-operator {\n background: var(--mdc-theme-primary);\n color: var(--mdc-theme-on-primary);\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n margin-top: -1px;\n }\n\n .drop-zone-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(var(--mdc-theme-primary-rgb), 0.1);\n border: 3px dashed var(--mdc-theme-primary);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: pulse 1s infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n }\n\n .drop-zone-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n color: var(--mdc-theme-primary);\n font-weight: 500;\n }\n\n .drop-zone-content mat-icon {\n font-size: 48px;\n width: 48px;\n height: 48px;\n }\n\n .floating-add-menu {\n position: fixed;\n bottom: 24px;\n right: 24px;\n z-index: 1000;\n }\n\n .main-add-button {\n transition: transform 0.3s ease;\n }\n\n .floating-add-menu.expanded .main-add-button {\n transform: rotate(45deg);\n }\n\n .add-menu-options {\n position: absolute;\n bottom: 64px;\n right: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n animation: slideUp 0.3s ease;\n }\n\n @keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .add-option-button {\n animation: fadeIn 0.3s ease;\n animation-fill-mode: both;\n }\n\n .add-option-button:nth-child(1) { animation-delay: 0.1s; }\n .add-option-button:nth-child(2) { animation-delay: 0.15s; }\n .add-option-button:nth-child(3) { animation-delay: 0.2s; }\n .add-option-button:nth-child(4) { animation-delay: 0.25s; }\n .add-option-button:nth-child(5) { animation-delay: 0.3s; }\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n transform: scale(0.5);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .rule-canvas {\n padding: 16px;\n }\n\n .floating-add-menu {\n bottom: 16px;\n right: 16px;\n }\n }\n `]\n})\nexport class RuleCanvasComponent implements OnInit, OnDestroy {\n @Input() state: RuleBuilderState | null = null;\n @Input() fieldSchemas: Record<string, FieldSchema> = {};\n\n @Output() nodeSelected = new EventEmitter<string>();\n @Output() nodeAdded = new EventEmitter<{ type: RuleNodeType; parentId?: string; config?: RuleNodeConfig }>();\n @Output() nodeUpdated = new EventEmitter<{ nodeId: string; updates: Partial<RuleNode> }>();\n @Output() nodeRemoved = new EventEmitter<string>();\n\n private destroy$ = new Subject<void>();\n\n isDragOver = false;\n showAddMenu = false;\n\n addMenuOptions = [\n { type: RuleNodeType.FIELD_CONDITION, icon: 'compare_arrows', label: 'Field Condition', color: 'primary' },\n { type: RuleNodeType.AND_GROUP, icon: 'join_inner', label: 'AND Group', color: 'accent' },\n { type: RuleNodeType.OR_GROUP, icon: 'join_full', label: 'OR Group', color: 'warn' },\n { type: RuleNodeType.REQUIRED_IF, icon: 'star', label: 'Required If', color: 'primary' },\n { type: RuleNodeType.VISIBLE_IF, icon: 'visibility', label: 'Visible If', color: 'accent' },\n { type: RuleNodeType.FOR_EACH, icon: 'repeat', label: 'For Each', color: 'accent' }\n ];\n\n get isEmpty(): boolean {\n return !this.state?.rootNodes || this.state.rootNodes.length === 0;\n }\n\n constructor() {}\n\n ngOnInit(): void {\n // Setup any initialization logic\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Template methods\n trackByNodeId(index: number, nodeId: string): string {\n return nodeId;\n }\n\n getNode(nodeId: string): RuleNode | null {\n return this.state?.nodes[nodeId] || null;\n }\n\n isNodeSelected(nodeId: string): boolean {\n return this.state?.selectedNodeId === nodeId;\n }\n\n isLastRootNode(nodeId: string): boolean {\n if (!this.state?.rootNodes) return true;\n return this.state.rootNodes[this.state.rootNodes.length - 1] === nodeId;\n }\n\n getNodeValidationErrors(nodeId: string): any[] {\n // Return validation errors for this specific node\n return [];\n }\n\n // Event handlers\n selectNode(nodeId: string): void {\n this.nodeSelected.emit(nodeId);\n }\n\n updateNode(event: { nodeId: string; updates: Partial<RuleNode> }): void {\n this.nodeUpdated.emit(event);\n }\n\n deleteNode(nodeId: string): void {\n this.nodeRemoved.emit(nodeId);\n }\n\n addChildNode(parentId: string, childType: RuleNodeType): void {\n this.nodeAdded.emit({\n type: childType,\n parentId\n });\n this.showAddMenu = false;\n }\n\n moveChildNode(event: any): void {\n // Handle child node movement\n }\n\n // Drag and drop handlers\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragEnter(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(event: DragEvent): void {\n // Only hide if leaving the canvas completely\n if (!event.currentTarget || !event.relatedTarget) {\n this.isDragOver = false;\n return;\n }\n\n const canvas = event.currentTarget as Element;\n const related = event.relatedTarget as Element;\n\n if (!canvas.contains(related)) {\n this.isDragOver = false;\n }\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n\n try {\n const fieldData = event.dataTransfer?.getData('field');\n if (fieldData) {\n const field = JSON.parse(fieldData) as FieldSchema;\n this.createFieldConditionFromDrop(field);\n return;\n }\n\n const ruleData = event.dataTransfer?.getData('rule');\n if (ruleData) {\n const ruleType = ruleData as RuleNodeType;\n this.addRule(ruleType);\n return;\n }\n } catch (error) {\n console.error('Failed to handle drop:', error);\n }\n }\n\n private createFieldConditionFromDrop(field: FieldSchema): void {\n const config: RuleNodeConfig = {\n type: 'fieldCondition',\n fieldName: field.name,\n operator: 'equals',\n value: null\n };\n\n this.nodeAdded.emit({\n type: RuleNodeType.FIELD_CONDITION,\n config\n });\n }\n\n // Add menu handlers\n toggleAddMenu(): void {\n this.showAddMenu = !this.showAddMenu;\n }\n\n addFirstRule(): void {\n this.addRule(RuleNodeType.FIELD_CONDITION);\n }\n\n addRule(type: RuleNodeType): void {\n this.nodeAdded.emit({ type });\n this.showAddMenu = false;\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, FormArray } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\n\nimport { debounceTime, distinctUntilChanged, takeUntil, startWith, map } from 'rxjs/operators';\nimport { Subject, Observable } from 'rxjs';\n\nimport { RuleNode, SpecificationMetadata } from '../models/rule-builder.model';\n\n@Component({\n selector: 'praxis-metadata-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n MatCheckboxModule,\n MatChipsModule,\n MatTooltipModule,\n MatTabsModule,\n MatDividerModule,\n MatExpansionModule,\n MatSlideToggleModule,\n MatAutocompleteModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"metadata-editor-container\" *ngIf=\"selectedNode\">\n <!-- Header -->\n <div class=\"editor-header\">\n <div class=\"node-info\">\n <mat-icon class=\"node-icon\" [praxisIcon]=\"getNodeIcon()\"></mat-icon>\n <div class=\"node-details\">\n <h3 class=\"node-title\">{{ getNodeTitle() }}</h3>\n <p class=\"node-subtitle\">{{ getNodeSubtitle() }}</p>\n </div>\n </div>\n \n <div class=\"header-actions\">\n <button mat-icon-button \n [color]=\"hasUnsavedChanges ? 'warn' : 'primary'\"\n [matTooltip]=\"hasUnsavedChanges ? 'You have unsaved changes' : 'All changes saved'\"\n [disabled]=\"!hasUnsavedChanges\">\n <mat-icon [praxisIcon]=\"hasUnsavedChanges ? 'edit' : 'check_circle'\"></mat-icon>\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"metadataForm\" class=\"metadata-form\">\n <!-- Basic Metadata Tab -->\n <mat-tab-group [(selectedIndex)]=\"activeTabIndex\">\n <mat-tab label=\"Basic Info\">\n <div class=\"tab-content\">\n <!-- Code -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Rule Code</mat-label>\n <input matInput \n formControlName=\"code\"\n placeholder=\"RULE_001\">\n <mat-hint>Unique identifier for this rule</mat-hint>\n </mat-form-field>\n\n <!-- Message -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Message</mat-label>\n <textarea matInput \n formControlName=\"message\"\n rows=\"3\"\n placeholder=\"Validation or information message\">\n </textarea>\n <mat-hint>Message shown to users when this rule is triggered</mat-hint>\n </mat-form-field>\n\n <!-- Tag -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Tag</mat-label>\n <input matInput \n formControlName=\"tag\"\n [matAutocomplete]=\"tagAutocomplete\"\n placeholder=\"validation, ui, business\">\n <mat-autocomplete #tagAutocomplete=\"matAutocomplete\">\n <mat-option *ngFor=\"let tag of filteredTags | async\" [value]=\"tag\">\n {{ tag }}\n </mat-option>\n </mat-autocomplete>\n <mat-hint>Categorization tag for grouping related rules</mat-hint>\n </mat-form-field>\n\n <!-- Description -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Description</mat-label>\n <textarea matInput \n formControlName=\"description\"\n rows=\"3\"\n placeholder=\"Detailed description of this rule's purpose and behavior\">\n </textarea>\n <mat-hint>Internal documentation for developers</mat-hint>\n </mat-form-field>\n\n <!-- Priority -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Priority</mat-label>\n <mat-select formControlName=\"priority\">\n <mat-option value=\"low\">\n <div class=\"priority-option\">\n <mat-icon>low_priority</mat-icon>\n <span>Low Priority</span>\n <small>Optional validation</small>\n </div>\n </mat-option>\n <mat-option value=\"medium\">\n <div class=\"priority-option\">\n <mat-icon>priority_high</mat-icon>\n <span>Medium Priority</span>\n <small>Standard validation</small>\n </div>\n </mat-option>\n <mat-option value=\"high\">\n <div class=\"priority-option\">\n <mat-icon>report_problem</mat-icon>\n <span>High Priority</span>\n <small>Critical validation</small>\n </div>\n </mat-option>\n <mat-option value=\"critical\">\n <div class=\"priority-option\">\n <mat-icon>error</mat-icon>\n <span>Critical Priority</span>\n <small>Blocking validation</small>\n </div>\n </mat-option>\n </mat-select>\n <mat-hint>Determines validation order and user experience</mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n\n <!-- UI Configuration Tab -->\n <mat-tab label=\"UI Config\">\n <div class=\"tab-content\">\n <div formGroupName=\"uiConfig\">\n <!-- Icon Configuration -->\n <mat-expansion-panel class=\"config-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>palette</mat-icon>\n Icon & Visual\n </mat-panel-title>\n <mat-panel-description>\n Configure visual appearance\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"panel-content\">\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"icon-select\">\n <mat-label>Icon</mat-label>\n <mat-select formControlName=\"icon\">\n <mat-option *ngFor=\"let icon of availableIcons\" [value]=\"icon.value\">\n <div class=\"icon-option\">\n <mat-icon>{{ icon.value }}</mat-icon>\n <span>{{ icon.label }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"color-select\">\n <mat-label>Color Theme</mat-label>\n <mat-select formControlName=\"color\">\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warning</mat-option>\n <mat-option value=\"success\">Success</mat-option>\n <mat-option value=\"info\">Info</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"size-select\">\n <mat-label>Size</mat-label>\n <mat-select formControlName=\"size\">\n <mat-option value=\"small\">Small</mat-option>\n <mat-option value=\"medium\">Medium</mat-option>\n <mat-option value=\"large\">Large</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"toggle-options\">\n <mat-slide-toggle formControlName=\"showIcon\">\n Show Icon\n </mat-slide-toggle>\n \n <mat-slide-toggle formControlName=\"showLabel\">\n Show Label\n </mat-slide-toggle>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Display Configuration -->\n <mat-expansion-panel class=\"config-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>visibility</mat-icon>\n Display Settings\n </mat-panel-title>\n <mat-panel-description>\n Control when and how to display\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"panel-content\">\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"position-select\">\n <mat-label>Position</mat-label>\n <mat-select formControlName=\"position\">\n <mat-option value=\"top\">Top</mat-option>\n <mat-option value=\"bottom\">Bottom</mat-option>\n <mat-option value=\"left\">Left</mat-option>\n <mat-option value=\"right\">Right</mat-option>\n <mat-option value=\"inline\">Inline</mat-option>\n <mat-option value=\"floating\">Floating</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"alignment-select\">\n <mat-label>Alignment</mat-label>\n <mat-select formControlName=\"alignment\">\n <mat-option value=\"start\">Start</mat-option>\n <mat-option value=\"center\">Center</mat-option>\n <mat-option value=\"end\">End</mat-option>\n <mat-option value=\"stretch\">Stretch</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"display-options\">\n <mat-slide-toggle formControlName=\"hidden\">\n Hidden by Default\n </mat-slide-toggle>\n \n <mat-slide-toggle formControlName=\"disabled\">\n Disabled by Default\n </mat-slide-toggle>\n \n <mat-slide-toggle formControlName=\"readonly\">\n Readonly by Default\n </mat-slide-toggle>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Animation Configuration -->\n <mat-expansion-panel class=\"config-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>animation</mat-icon>\n Animation & Effects\n </mat-panel-title>\n <mat-panel-description>\n Configure transitions and animations\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"panel-content\">\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"animation-select\">\n <mat-label>Animation Type</mat-label>\n <mat-select formControlName=\"animation\">\n <mat-option value=\"none\">None</mat-option>\n <mat-option value=\"fade\">Fade</mat-option>\n <mat-option value=\"slide\">Slide</mat-option>\n <mat-option value=\"scale\">Scale</mat-option>\n <mat-option value=\"bounce\">Bounce</mat-option>\n <mat-option value=\"flip\">Flip</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"duration-input\">\n <mat-label>Duration (ms)</mat-label>\n <input matInput \n type=\"number\"\n formControlName=\"animationDuration\"\n min=\"0\"\n max=\"5000\"\n placeholder=\"300\">\n </mat-form-field>\n </div>\n\n <div class=\"animation-options\">\n <mat-slide-toggle formControlName=\"animateOnChange\">\n Animate on Value Change\n </mat-slide-toggle>\n \n <mat-slide-toggle formControlName=\"animateOnValidation\">\n Animate on Validation\n </mat-slide-toggle>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n </div>\n </mat-tab>\n\n <!-- Advanced Tab -->\n <mat-tab label=\"Advanced\">\n <div class=\"tab-content\">\n <!-- Custom Properties -->\n <mat-expansion-panel class=\"config-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>settings</mat-icon>\n Custom Properties\n </mat-panel-title>\n <mat-panel-description>\n Add custom metadata properties\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"panel-content\">\n <div class=\"custom-properties\">\n <div formArrayName=\"customProperties\">\n <div *ngFor=\"let prop of customProperties.controls; let i = index\"\n class=\"custom-property-item\"\n [formGroupName]=\"i\">\n \n <div class=\"property-header\">\n <span class=\"property-number\">{{ i + 1 }}</span>\n <button mat-icon-button \n color=\"warn\"\n (click)=\"removeCustomProperty(i)\"\n [disabled]=\"customProperties.length <= 0\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <div class=\"property-form\">\n <mat-form-field appearance=\"outline\" class=\"property-key\">\n <mat-label>Property Key</mat-label>\n <input matInput \n formControlName=\"key\"\n placeholder=\"customProperty\">\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"property-value\">\n <mat-label>Property Value</mat-label>\n <input matInput \n formControlName=\"value\"\n placeholder=\"value\">\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"property-type\">\n <mat-label>Type</mat-label>\n <mat-select formControlName=\"type\">\n <mat-option value=\"string\">String</mat-option>\n <mat-option value=\"number\">Number</mat-option>\n <mat-option value=\"boolean\">Boolean</mat-option>\n <mat-option value=\"object\">Object</mat-option>\n <mat-option value=\"array\">Array</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <button mat-stroked-button \n color=\"primary\"\n (click)=\"addCustomProperty()\"\n class=\"add-property-button\">\n <mat-icon>add</mat-icon>\n Add Custom Property\n </button>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Conditions -->\n <mat-expansion-panel class=\"config-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>rule</mat-icon>\n Conditional Metadata\n </mat-panel-title>\n <mat-panel-description>\n Apply metadata based on conditions\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"panel-content\">\n <div class=\"conditional-config\">\n <mat-slide-toggle formControlName=\"enableConditionalMetadata\">\n Enable Conditional Metadata\n </mat-slide-toggle>\n\n <div *ngIf=\"enableConditionalMetadata\" class=\"conditional-rules\">\n <mat-form-field appearance=\"outline\" class=\"condition-input\">\n <mat-label>Condition Expression</mat-label>\n <input matInput \n formControlName=\"conditionExpression\"\n placeholder=\"field.value === 'specific_value'\">\n <mat-hint>JavaScript expression that determines when this metadata applies</mat-hint>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"fallback-input\">\n <mat-label>Fallback Metadata</mat-label>\n <textarea matInput \n formControlName=\"fallbackMetadata\"\n rows=\"3\"\n placeholder=\"Default metadata when condition is not met\">\n </textarea>\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Documentation -->\n <mat-expansion-panel class=\"config-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>description</mat-icon>\n Documentation & Notes\n </mat-panel-title>\n <mat-panel-description>\n Internal documentation and comments\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"panel-content\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Internal Notes</mat-label>\n <textarea matInput \n formControlName=\"internalNotes\"\n rows=\"4\"\n placeholder=\"Internal notes for developers and documentation\">\n </textarea>\n </mat-form-field>\n\n <div class=\"documentation-links\">\n <h5>Documentation Links</h5>\n <div formArrayName=\"documentationLinks\">\n <div *ngFor=\"let link of documentationLinks.controls; let i = index\"\n class=\"doc-link-item\">\n \n <mat-form-field appearance=\"outline\" class=\"link-title\">\n <mat-label>Title</mat-label>\n <input matInput \n [formControlName]=\"i\"\n placeholder=\"Documentation title\">\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"link-url\">\n <mat-label>URL</mat-label>\n <input matInput \n [formControlName]=\"i\"\n placeholder=\"https://docs.example.com\">\n </mat-form-field>\n\n <button mat-icon-button \n color=\"warn\"\n (click)=\"removeDocumentationLink(i)\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n <button mat-stroked-button \n color=\"primary\"\n (click)=\"addDocumentationLink()\"\n class=\"add-link-button\">\n <mat-icon>add</mat-icon>\n Add Documentation Link\n </button>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <!-- Preview Section -->\n <div class=\"preview-section\">\n <h4 class=\"preview-title\">\n <mat-icon>preview</mat-icon>\n Metadata Preview\n </h4>\n \n <div class=\"preview-content\">\n <pre class=\"preview-json\">{{ getMetadataPreview() }}</pre>\n </div>\n </div>\n </form>\n </div>\n\n <!-- Empty State -->\n <div class=\"empty-state\" *ngIf=\"!selectedNode\">\n <div class=\"empty-state-content\">\n <mat-icon class=\"empty-icon\">rule</mat-icon>\n <h3>No Rule Selected</h3>\n <p>Select a rule from the canvas or sidebar to edit its metadata</p>\n </div>\n </div>\n `,\n styles: [`\n .metadata-editor-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n background: var(--mdc-theme-surface-variant);\n border-bottom: 1px solid var(--mdc-theme-outline);\n }\n\n .node-info {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .node-icon {\n font-size: 24px;\n width: 24px;\n height: 24px;\n color: var(--mdc-theme-primary);\n }\n\n .node-details {\n display: flex;\n flex-direction: column;\n }\n\n .node-title {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .node-subtitle {\n margin: 0;\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .header-actions {\n display: flex;\n gap: 8px;\n }\n\n .metadata-form {\n flex: 1;\n overflow: auto;\n padding: 16px;\n }\n\n .tab-content {\n padding: 16px 0;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .full-width {\n width: 100%;\n }\n\n .form-row {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n }\n\n .form-row > * {\n flex: 1;\n }\n\n .config-panel {\n margin-bottom: 16px;\n }\n\n .panel-content {\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .priority-option,\n .icon-option {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .priority-option small,\n .icon-option small {\n color: var(--mdc-theme-on-surface-variant);\n font-size: 11px;\n }\n\n .toggle-options,\n .display-options,\n .animation-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .custom-properties {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .custom-property-item {\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 8px;\n padding: 12px;\n background: var(--mdc-theme-surface);\n }\n\n .property-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .property-number {\n background: var(--mdc-theme-primary);\n color: var(--mdc-theme-on-primary);\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n }\n\n .property-form {\n display: flex;\n gap: 8px;\n }\n\n .property-key,\n .property-value {\n flex: 2;\n }\n\n .property-type {\n flex: 1;\n }\n\n .conditional-config {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .conditional-rules {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n background: var(--mdc-theme-surface);\n border-radius: 8px;\n border: 1px solid var(--mdc-theme-outline);\n }\n\n .documentation-links {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .documentation-links h5 {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mdc-theme-primary);\n }\n\n .doc-link-item {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n\n .link-title,\n .link-url {\n flex: 1;\n }\n\n .add-property-button,\n .add-link-button {\n align-self: flex-start;\n }\n\n .preview-section {\n margin-top: 24px;\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .preview-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n padding: 12px 16px;\n background: var(--mdc-theme-primary-container);\n border-bottom: 1px solid var(--mdc-theme-outline);\n font-size: 14px;\n font-weight: 500;\n }\n\n .preview-content {\n padding: 16px;\n background: var(--mdc-theme-surface);\n }\n\n .preview-json {\n font-family: 'Courier New', monospace;\n font-size: 12px;\n color: var(--mdc-theme-on-surface);\n margin: 0;\n white-space: pre-wrap;\n background: var(--mdc-theme-surface-variant);\n padding: 12px;\n border-radius: 4px;\n border: 1px solid var(--mdc-theme-outline);\n max-height: 200px;\n overflow-y: auto;\n }\n\n .empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n }\n\n .empty-state-content {\n max-width: 300px;\n }\n\n .empty-icon {\n font-size: 64px;\n width: 64px;\n height: 64px;\n color: var(--mdc-theme-on-surface-variant);\n margin-bottom: 16px;\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--mdc-theme-on-surface);\n font-weight: 500;\n }\n\n .empty-state p {\n margin: 0;\n color: var(--mdc-theme-on-surface-variant);\n line-height: 1.4;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .form-row {\n flex-direction: column;\n }\n \n .property-form {\n flex-direction: column;\n }\n \n .doc-link-item {\n flex-direction: column;\n align-items: stretch;\n }\n }\n `]\n})\nexport class MetadataEditorComponent implements OnInit, OnChanges {\n @Input() selectedNode: RuleNode | null = null;\n \n @Output() metadataUpdated = new EventEmitter<SpecificationMetadata>();\n\n private destroy$ = new Subject<void>();\n\n metadataForm: FormGroup;\n activeTabIndex = 0;\n hasUnsavedChanges = false;\n\n // Autocomplete data\n availableTags = ['validation', 'ui', 'business', 'security', 'performance', 'accessibility'];\n filteredTags!: Observable<string[]>;\n\n availableIcons = [\n { value: 'rule', label: 'Rule' },\n { value: 'star', label: 'Star' },\n { value: 'warning', label: 'Warning' },\n { value: 'error', label: 'Error' },\n { value: 'info', label: 'Info' },\n { value: 'check_circle', label: 'Check' },\n { value: 'cancel', label: 'Cancel' },\n { value: 'help', label: 'Help' },\n { value: 'settings', label: 'Settings' },\n { value: 'visibility', label: 'Visibility' },\n { value: 'lock', label: 'Lock' },\n { value: 'security', label: 'Security' }\n ];\n\n get customProperties(): FormArray {\n return this.metadataForm.get('customProperties') as FormArray;\n }\n\n get documentationLinks(): FormArray {\n return this.metadataForm.get('documentationLinks') as FormArray;\n }\n\n get enableConditionalMetadata(): boolean {\n return this.metadataForm.get('enableConditionalMetadata')?.value || false;\n }\n\n constructor(private fb: FormBuilder) {\n this.metadataForm = this.createForm();\n this.setupTagAutocomplete();\n }\n\n ngOnInit(): void {\n this.setupFormSubscriptions();\n this.loadMetadata();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['selectedNode']) {\n this.loadMetadata();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private createForm(): FormGroup {\n return this.fb.group({\n code: [''],\n message: [''],\n tag: [''],\n description: [''],\n priority: ['medium'],\n uiConfig: this.fb.group({\n icon: ['rule'],\n color: ['primary'],\n size: ['medium'],\n showIcon: [true],\n showLabel: [true],\n position: ['top'],\n alignment: ['start'],\n hidden: [false],\n disabled: [false],\n readonly: [false],\n animation: ['fade'],\n animationDuration: [300],\n animateOnChange: [false],\n animateOnValidation: [true]\n }),\n customProperties: this.fb.array([]),\n enableConditionalMetadata: [false],\n conditionExpression: [''],\n fallbackMetadata: [''],\n internalNotes: [''],\n documentationLinks: this.fb.array([])\n });\n }\n\n private setupFormSubscriptions(): void {\n this.metadataForm.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.hasUnsavedChanges = true;\n this.emitMetadataUpdate();\n });\n }\n\n private setupTagAutocomplete(): void {\n const tagControl = this.metadataForm.get('tag');\n if (tagControl) {\n this.filteredTags = tagControl.valueChanges.pipe(\n startWith(''),\n map(value => this.filterTags(value || ''))\n );\n } else {\n this.filteredTags = new Observable(observer => observer.next(this.availableTags));\n }\n }\n\n private filterTags(value: string): string[] {\n const filterValue = value.toLowerCase();\n return this.availableTags.filter(tag => \n tag.toLowerCase().includes(filterValue)\n );\n }\n\n private loadMetadata(): void {\n if (!this.selectedNode?.metadata) {\n this.resetForm();\n return;\n }\n\n const metadata = this.selectedNode.metadata;\n \n this.metadataForm.patchValue({\n code: metadata.code || '',\n message: metadata.message || '',\n tag: metadata.tag || '',\n description: metadata.description || '',\n priority: metadata.priority || 'medium',\n uiConfig: {\n icon: metadata.uiConfig?.icon || 'rule',\n color: metadata.uiConfig?.color || 'primary',\n size: metadata.uiConfig?.size || 'medium',\n showIcon: metadata.uiConfig?.showIcon !== false,\n showLabel: metadata.uiConfig?.showLabel !== false,\n position: metadata.uiConfig?.position || 'top',\n alignment: metadata.uiConfig?.alignment || 'start',\n hidden: metadata.uiConfig?.hidden || false,\n disabled: metadata.uiConfig?.disabled || false,\n readonly: metadata.uiConfig?.readonly || false,\n animation: metadata.uiConfig?.animation || 'fade',\n animationDuration: metadata.uiConfig?.animationDuration || 300,\n animateOnChange: metadata.uiConfig?.animateOnChange || false,\n animateOnValidation: metadata.uiConfig?.animateOnValidation !== false\n },\n enableConditionalMetadata: !!metadata.conditionExpression,\n conditionExpression: metadata.conditionExpression || '',\n fallbackMetadata: metadata.fallbackMetadata || '',\n internalNotes: metadata.internalNotes || ''\n });\n\n // Load custom properties\n this.loadCustomProperties(metadata.customProperties || {});\n \n // Load documentation links\n this.loadDocumentationLinks(metadata.documentationLinks || []);\n\n this.hasUnsavedChanges = false;\n }\n\n private resetForm(): void {\n this.metadataForm.reset();\n this.customProperties.clear();\n this.documentationLinks.clear();\n this.hasUnsavedChanges = false;\n }\n\n private loadCustomProperties(properties: Record<string, any>): void {\n this.customProperties.clear();\n \n Object.entries(properties).forEach(([key, value]) => {\n this.customProperties.push(this.fb.group({\n key: [key],\n value: [value],\n type: [this.inferType(value)]\n }));\n });\n }\n\n private loadDocumentationLinks(links: any[]): void {\n this.documentationLinks.clear();\n \n links.forEach(link => {\n this.documentationLinks.push(this.fb.group({\n title: [link.title || ''],\n url: [link.url || '']\n }));\n });\n }\n\n private emitMetadataUpdate(): void {\n if (!this.selectedNode) return;\n\n const formValue = this.metadataForm.value;\n const metadata: SpecificationMetadata = {\n code: formValue.code || undefined,\n message: formValue.message || undefined,\n tag: formValue.tag || undefined,\n description: formValue.description || undefined,\n priority: formValue.priority || undefined,\n uiConfig: this.cleanUiConfig(formValue.uiConfig),\n customProperties: this.getCustomPropertiesValue(),\n conditionExpression: formValue.enableConditionalMetadata ? formValue.conditionExpression : undefined,\n fallbackMetadata: formValue.enableConditionalMetadata ? formValue.fallbackMetadata : undefined,\n internalNotes: formValue.internalNotes || undefined,\n documentationLinks: this.getDocumentationLinksValue()\n };\n\n // Remove undefined values\n Object.keys(metadata).forEach(key => {\n if (metadata[key as keyof SpecificationMetadata] === undefined) {\n delete metadata[key as keyof SpecificationMetadata];\n }\n });\n\n this.metadataUpdated.emit(metadata);\n }\n\n private cleanUiConfig(uiConfig: any): any {\n const cleaned: any = {};\n \n Object.entries(uiConfig).forEach(([key, value]) => {\n if (value !== null && value !== undefined && value !== '') {\n cleaned[key] = value;\n }\n });\n\n return Object.keys(cleaned).length > 0 ? cleaned : undefined;\n }\n\n private getCustomPropertiesValue(): Record<string, any> | undefined {\n const properties: Record<string, any> = {};\n \n this.customProperties.controls.forEach(control => {\n const prop = control.value;\n if (prop.key && prop.value) {\n properties[prop.key] = this.convertValueByType(prop.value, prop.type);\n }\n });\n\n return Object.keys(properties).length > 0 ? properties : undefined;\n }\n\n private getDocumentationLinksValue(): any[] | undefined {\n const links = this.documentationLinks.controls\n .map(control => control.value)\n .filter(link => link.title && link.url);\n\n return links.length > 0 ? links : undefined;\n }\n\n private inferType(value: any): string {\n if (typeof value === 'boolean') return 'boolean';\n if (typeof value === 'number') return 'number';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'object' && value !== null) return 'object';\n return 'string';\n }\n\n private convertValueByType(value: any, type: string): any {\n switch (type) {\n case 'number':\n return Number(value);\n case 'boolean':\n return value === 'true' || value === true;\n case 'array':\n try {\n return Array.isArray(value) ? value : JSON.parse(value);\n } catch {\n return [value];\n }\n case 'object':\n try {\n return typeof value === 'object' ? value : JSON.parse(value);\n } catch {\n return { value };\n }\n default:\n return String(value);\n }\n }\n\n // Template methods\n getNodeIcon(): string {\n return this.selectedNode?.type ? this.getNodeTypeIcon(this.selectedNode.type) : 'rule';\n }\n\n getNodeTitle(): string {\n return this.selectedNode?.label || this.selectedNode?.type || 'Unknown Rule';\n }\n\n getNodeSubtitle(): string {\n return this.selectedNode?.metadata?.description || this.selectedNode?.id || '';\n }\n\n getNodeTypeIcon(type: string): string {\n const icons: Record<string, string> = {\n 'fieldCondition': 'compare_arrows',\n 'andGroup': 'join_inner',\n 'orGroup': 'join_full',\n 'requiredIf': 'star',\n 'visibleIf': 'visibility',\n 'disabledIf': 'block',\n 'readonlyIf': 'lock'\n };\n \n return icons[type] || 'rule';\n }\n\n getMetadataPreview(): string {\n const formValue = this.metadataForm.value;\n \n const metadata: any = {\n code: formValue.code || undefined,\n message: formValue.message || undefined,\n tag: formValue.tag || undefined,\n description: formValue.description || undefined,\n priority: formValue.priority || undefined,\n uiConfig: this.cleanUiConfig(formValue.uiConfig),\n customProperties: this.getCustomPropertiesValue()\n };\n\n // Remove undefined values for cleaner preview\n Object.keys(metadata).forEach(key => {\n if (metadata[key] === undefined) {\n delete metadata[key];\n }\n });\n\n return JSON.stringify(metadata, null, 2);\n }\n\n // Event handlers\n addCustomProperty(): void {\n this.customProperties.push(this.fb.group({\n key: [''],\n value: [''],\n type: ['string']\n }));\n }\n\n removeCustomProperty(index: number): void {\n this.customProperties.removeAt(index);\n }\n\n addDocumentationLink(): void {\n this.documentationLinks.push(this.fb.group({\n title: [''],\n url: ['']\n }));\n }\n\n removeDocumentationLink(index: number): void {\n this.documentationLinks.removeAt(index);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy, ViewChild, ElementRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatChipsModule } from '@angular/material/chips';\n\nimport { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\n\n@Component({\n selector: 'praxis-dsl-viewer',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatToolbarModule,\n MatMenuModule,\n MatDividerModule,\n MatSnackBarModule,\n MatProgressBarModule,\n MatChipsModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"dsl-viewer-container\">\n <!-- Toolbar -->\n <mat-toolbar class=\"dsl-toolbar\" color=\"primary\">\n <span class=\"toolbar-title\">\n <mat-icon>code</mat-icon>\n DSL Editor\n </span>\n \n <span class=\"toolbar-spacer\"></span>\n \n <div class=\"toolbar-actions\">\n <!-- Validation Status -->\n <div class=\"validation-status\" [class]=\"getValidationStatusClass()\">\n <mat-icon>{{ getValidationIcon() }}</mat-icon>\n <span>{{ getValidationText() }}</span>\n </div>\n \n <mat-divider vertical></mat-divider>\n \n <!-- Editor Actions -->\n <button mat-icon-button \n [disabled]=\"!editable\"\n (click)=\"formatCode()\"\n matTooltip=\"Format Code\">\n <mat-icon>auto_fix_high</mat-icon>\n </button>\n \n <button mat-icon-button \n [disabled]=\"!editable\"\n (click)=\"validateSyntax()\"\n matTooltip=\"Validate Syntax\">\n <mat-icon>check_circle</mat-icon>\n </button>\n \n <button mat-icon-button \n [disabled]=\"!editable || !hasChanges\"\n (click)=\"applyChanges()\"\n matTooltip=\"Apply Changes\">\n <mat-icon>save</mat-icon>\n </button>\n \n <button mat-icon-button \n [disabled]=\"!editable || !hasChanges\"\n (click)=\"discardChanges()\"\n matTooltip=\"Discard Changes\">\n <mat-icon>undo</mat-icon>\n </button>\n \n <!-- More Actions Menu -->\n <button mat-icon-button [matMenuTriggerFor]=\"moreMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n \n <mat-menu #moreMenu=\"matMenu\">\n <button mat-menu-item (click)=\"copyToClipboard()\">\n <mat-icon>content_copy</mat-icon>\n <span>Copy to Clipboard</span>\n </button>\n \n <button mat-menu-item (click)=\"downloadDsl()\" [disabled]=\"!dsl\">\n <mat-icon>download</mat-icon>\n <span>Download DSL</span>\n </button>\n \n <mat-divider></mat-divider>\n \n <button mat-menu-item (click)=\"toggleLineNumbers()\">\n <mat-icon>format_list_numbered</mat-icon>\n <span>{{ showLineNumbers ? 'Hide' : 'Show' }} Line Numbers</span>\n </button>\n \n <button mat-menu-item (click)=\"toggleWordWrap()\">\n <mat-icon>wrap_text</mat-icon>\n <span>{{ wordWrap ? 'Disable' : 'Enable' }} Word Wrap</span>\n </button>\n \n <button mat-menu-item (click)=\"toggleMinimap()\">\n <mat-icon>map</mat-icon>\n <span>{{ showMinimap ? 'Hide' : 'Show' }} Minimap</span>\n </button>\n </mat-menu>\n </div>\n </mat-toolbar>\n\n <!-- Editor Container -->\n <div class=\"editor-container\" [class.readonly]=\"!editable\">\n <!-- Monaco Editor Placeholder -->\n <div #editorContainer \n class=\"monaco-editor-container\"\n [class.loading]=\"isLoading\">\n </div>\n \n <!-- Loading Overlay -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n <span class=\"loading-text\">Loading editor...</span>\n </div>\n \n <!-- Readonly Overlay -->\n <div *ngIf=\"!editable\" class=\"readonly-overlay\">\n <div class=\"readonly-message\">\n <mat-icon>visibility</mat-icon>\n <span>Read-only mode</span>\n </div>\n </div>\n </div>\n\n <!-- Status Bar -->\n <div class=\"status-bar\">\n <div class=\"status-left\">\n <span class=\"editor-info\">{{ getEditorInfo() }}</span>\n <span *ngIf=\"cursorPosition\" class=\"cursor-position\">\n Line {{ cursorPosition.line }}, Column {{ cursorPosition.column }}\n </span>\n </div>\n \n <div class=\"status-center\">\n <!-- Syntax Errors -->\n <div *ngIf=\"syntaxErrors.length > 0\" class=\"syntax-errors\">\n <mat-icon color=\"warn\">error</mat-icon>\n <span>{{ syntaxErrors.length }} error(s)</span>\n <button mat-button \n size=\"small\" \n color=\"warn\"\n (click)=\"showErrorDetails()\">\n Details\n </button>\n </div>\n \n <!-- Warnings -->\n <div *ngIf=\"warnings.length > 0\" class=\"warnings\">\n <mat-icon color=\"accent\">warning</mat-icon>\n <span>{{ warnings.length }} warning(s)</span>\n </div>\n </div>\n \n <div class=\"status-right\">\n <span class=\"language-mode\">DSL</span>\n <span *ngIf=\"hasChanges\" class=\"unsaved-indicator\">•</span>\n </div>\n </div>\n\n <!-- Error Panel -->\n <div *ngIf=\"showErrors && (syntaxErrors.length > 0 || warnings.length > 0)\" \n class=\"error-panel\">\n <div class=\"error-panel-header\">\n <h4>Issues</h4>\n <button mat-icon-button (click)=\"hideErrorDetails()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n \n <div class=\"error-list\">\n <!-- Syntax Errors -->\n <div *ngFor=\"let error of syntaxErrors\" \n class=\"error-item severity-error\"\n (click)=\"goToError(error)\">\n <mat-icon>error</mat-icon>\n <div class=\"error-content\">\n <div class=\"error-message\">{{ error.message }}</div>\n <div class=\"error-location\">Line {{ error.line }}, Column {{ error.column }}</div>\n </div>\n </div>\n \n <!-- Warnings -->\n <div *ngFor=\"let warning of warnings\" \n class=\"error-item severity-warning\"\n (click)=\"goToError(warning)\">\n <mat-icon>warning</mat-icon>\n <div class=\"error-content\">\n <div class=\"error-message\">{{ warning.message }}</div>\n <div class=\"error-location\">Line {{ warning.line }}, Column {{ warning.column }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .dsl-viewer-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .dsl-toolbar {\n flex-shrink: 0;\n padding: 0 16px;\n }\n\n .toolbar-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n }\n\n .toolbar-spacer {\n flex: 1;\n }\n\n .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .validation-status {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n }\n\n .validation-status.valid {\n background: var(--mdc-theme-success-container);\n color: var(--mdc-theme-on-success-container);\n }\n\n .validation-status.invalid {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n }\n\n .validation-status.warning {\n background: var(--mdc-theme-warning-container);\n color: var(--mdc-theme-on-warning-container);\n }\n\n .validation-status mat-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n\n .editor-container {\n flex: 1;\n position: relative;\n overflow: hidden;\n }\n\n .monaco-editor-container {\n width: 100%;\n height: 100%;\n position: relative;\n }\n\n .monaco-editor-container.loading {\n opacity: 0.5;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mdc-theme-surface);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n z-index: 1000;\n }\n\n .loading-text {\n color: var(--mdc-theme-on-surface-variant);\n font-size: 14px;\n }\n\n .readonly-overlay {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 100;\n }\n\n .readonly-message {\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--mdc-theme-surface-variant);\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n box-shadow: 0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,0.1));\n }\n\n .readonly-message mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n .status-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 16px;\n background: var(--mdc-theme-surface-variant);\n border-top: 1px solid var(--mdc-theme-outline);\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n flex-shrink: 0;\n }\n\n .status-left,\n .status-center,\n .status-right {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .cursor-position {\n font-family: monospace;\n }\n\n .syntax-errors,\n .warnings {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .syntax-errors mat-icon,\n .warnings mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n .language-mode {\n font-family: monospace;\n font-weight: 600;\n }\n\n .unsaved-indicator {\n color: var(--mdc-theme-primary);\n font-weight: bold;\n font-size: 16px;\n }\n\n .error-panel {\n background: var(--mdc-theme-surface);\n border-top: 1px solid var(--mdc-theme-outline);\n max-height: 200px;\n overflow-y: auto;\n flex-shrink: 0;\n }\n\n .error-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: var(--mdc-theme-surface-variant);\n border-bottom: 1px solid var(--mdc-theme-outline);\n }\n\n .error-panel-header h4 {\n margin: 0;\n font-size: 14px;\n font-weight: 500;\n }\n\n .error-list {\n padding: 8px;\n }\n\n .error-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px;\n border-radius: 4px;\n margin-bottom: 4px;\n cursor: pointer;\n transition: background 0.2s ease;\n }\n\n .error-item:hover {\n background: var(--mdc-theme-surface-variant);\n }\n\n .error-item.severity-error {\n border-left: 3px solid var(--mdc-theme-error);\n }\n\n .error-item.severity-warning {\n border-left: 3px solid var(--mdc-theme-warning);\n }\n\n .error-item mat-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n margin-top: 2px;\n }\n\n .error-item.severity-error mat-icon {\n color: var(--mdc-theme-error);\n }\n\n .error-item.severity-warning mat-icon {\n color: var(--mdc-theme-warning);\n }\n\n .error-content {\n flex: 1;\n }\n\n .error-message {\n font-weight: 500;\n margin-bottom: 2px;\n }\n\n .error-location {\n font-size: 11px;\n color: var(--mdc-theme-on-surface-variant);\n font-family: monospace;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .toolbar-actions {\n gap: 4px;\n }\n \n .status-bar {\n flex-direction: column;\n gap: 4px;\n align-items: stretch;\n }\n \n .status-left,\n .status-center,\n .status-right {\n justify-content: center;\n }\n }\n `]\n})\nexport class DslViewerComponent implements OnInit, OnChanges {\n @Input() dsl: string = '';\n @Input() editable: boolean = true;\n @Input() language: string = 'dsl';\n @Input() theme: string = 'vs';\n \n @Output() dslChanged = new EventEmitter<string>();\n @Output() validationChanged = new EventEmitter<{valid: boolean; errors: any[]; warnings: any[]}>();\n\n @ViewChild('editorContainer', { static: true }) editorContainer!: ElementRef;\n\n private destroy$ = new Subject<void>();\n private monacoEditor: any = null;\n private originalDsl: string = '';\n\n // Component state\n isLoading = true;\n hasChanges = false;\n showErrors = false;\n syntaxErrors: any[] = [];\n warnings: any[] = [];\n cursorPosition: {line: number; column: number} | null = null;\n \n // Editor settings\n showLineNumbers = true;\n wordWrap = false;\n showMinimap = true;\n\n constructor(private snackBar: MatSnackBar) {}\n\n ngOnInit(): void {\n this.initializeMonacoEditor();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['dsl'] && this.monacoEditor) {\n this.updateEditorContent();\n }\n \n if (changes['editable'] && this.monacoEditor) {\n this.updateEditorOptions();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n \n if (this.monacoEditor) {\n this.monacoEditor.dispose();\n }\n }\n\n private async initializeMonacoEditor(): Promise<void> {\n try {\n this.isLoading = true;\n \n // In a real implementation, you would load Monaco Editor here\n // For now, we'll simulate the loading and create a simple textarea fallback\n await this.loadMonacoEditor();\n \n this.createEditor();\n this.setupEditorEvents();\n this.updateEditorContent();\n this.updateEditorOptions();\n \n this.isLoading = false;\n } catch (error) {\n console.error('Failed to initialize Monaco Editor:', error);\n this.createFallbackEditor();\n this.isLoading = false;\n }\n }\n\n private async loadMonacoEditor(): Promise<void> {\n // Simulate loading Monaco Editor\n return new Promise(resolve => setTimeout(resolve, 1000));\n }\n\n private createEditor(): void {\n // In a real implementation, this would create a Monaco Editor instance\n // For now, we'll create a simple textarea fallback\n this.createFallbackEditor();\n }\n\n private createFallbackEditor(): void {\n const textarea = document.createElement('textarea');\n textarea.className = 'fallback-editor';\n textarea.style.width = '100%';\n textarea.style.height = '100%';\n textarea.style.border = 'none';\n textarea.style.outline = 'none';\n textarea.style.resize = 'none';\n textarea.style.fontFamily = 'monospace';\n textarea.style.fontSize = '14px';\n textarea.style.padding = '16px';\n textarea.style.background = 'var(--mdc-theme-surface)';\n textarea.style.color = 'var(--mdc-theme-on-surface)';\n \n this.editorContainer.nativeElement.appendChild(textarea);\n \n // Mock Monaco Editor interface\n this.monacoEditor = {\n setValue: (value: string) => {\n textarea.value = value;\n },\n getValue: () => textarea.value,\n updateOptions: (options: any) => {\n textarea.readOnly = !this.editable;\n },\n onDidChangeModelContent: (callback: Function) => {\n textarea.addEventListener('input', () => {\n this.onContentChanged();\n callback();\n });\n },\n onDidChangeCursorPosition: (callback: Function) => {\n textarea.addEventListener('click', () => {\n this.updateCursorPosition();\n callback();\n });\n textarea.addEventListener('keyup', () => {\n this.updateCursorPosition();\n callback();\n });\n },\n setPosition: (position: any) => {\n // Mock cursor positioning\n },\n focus: () => textarea.focus(),\n dispose: () => {\n if (textarea.parentNode) {\n textarea.parentNode.removeChild(textarea);\n }\n }\n };\n }\n\n private setupEditorEvents(): void {\n if (!this.monacoEditor) return;\n\n // Content change events\n this.monacoEditor.onDidChangeModelContent(() => {\n this.onContentChanged();\n });\n\n // Cursor position events\n this.monacoEditor.onDidChangeCursorPosition(() => {\n this.updateCursorPosition();\n });\n }\n\n private updateEditorContent(): void {\n if (!this.monacoEditor) return;\n \n this.originalDsl = this.dsl || '';\n this.monacoEditor.setValue(this.originalDsl);\n this.hasChanges = false;\n this.validateSyntax();\n }\n\n private updateEditorOptions(): void {\n if (!this.monacoEditor) return;\n \n this.monacoEditor.updateOptions({\n readOnly: !this.editable,\n lineNumbers: this.showLineNumbers ? 'on' : 'off',\n wordWrap: this.wordWrap ? 'on' : 'off',\n minimap: { enabled: this.showMinimap }\n });\n }\n\n private onContentChanged(): void {\n if (!this.monacoEditor) return;\n \n const currentValue = this.monacoEditor.getValue();\n this.hasChanges = currentValue !== this.originalDsl;\n \n // Debounced validation\n this.validateSyntaxDebounced();\n }\n\n private updateCursorPosition(): void {\n // Mock cursor position for fallback editor\n this.cursorPosition = { line: 1, column: 1 };\n }\n\n private validateSyntaxDebounced = this.debounce(() => {\n this.validateSyntax();\n }, 500);\n\n private debounce(func: Function, wait: number): Function {\n let timeout: any;\n return function(this: any, ...args: any[]) {\n clearTimeout(timeout);\n timeout = setTimeout(() => func.apply(this, args), wait);\n };\n }\n\n // Template methods\n getValidationStatusClass(): string {\n if (this.syntaxErrors.length > 0) return 'invalid';\n if (this.warnings.length > 0) return 'warning';\n return 'valid';\n }\n\n getValidationIcon(): string {\n if (this.syntaxErrors.length > 0) return 'error';\n if (this.warnings.length > 0) return 'warning';\n return 'check_circle';\n }\n\n getValidationText(): string {\n if (this.syntaxErrors.length > 0) return 'Invalid';\n if (this.warnings.length > 0) return 'Warnings';\n return 'Valid';\n }\n\n getEditorInfo(): string {\n const lines = this.dsl ? this.dsl.split('\\n').length : 0;\n const chars = this.dsl ? this.dsl.length : 0;\n return `${lines} lines, ${chars} characters`;\n }\n\n // Action methods\n formatCode(): void {\n if (!this.editable || !this.monacoEditor) return;\n \n try {\n const currentValue = this.monacoEditor.getValue();\n const formatted = this.formatDslCode(currentValue);\n this.monacoEditor.setValue(formatted);\n this.snackBar.open('Code formatted', 'Close', { duration: 2000 });\n } catch (error) {\n this.snackBar.open('Failed to format code', 'Close', { duration: 3000 });\n }\n }\n\n validateSyntax(): void {\n if (!this.monacoEditor) return;\n \n const currentValue = this.monacoEditor.getValue();\n const validation = this.validateDslSyntax(currentValue);\n \n this.syntaxErrors = validation.errors;\n this.warnings = validation.warnings;\n \n this.validationChanged.emit({\n valid: this.syntaxErrors.length === 0,\n errors: this.syntaxErrors,\n warnings: this.warnings\n });\n }\n\n applyChanges(): void {\n if (!this.hasChanges || !this.monacoEditor) return;\n \n const currentValue = this.monacoEditor.getValue();\n this.originalDsl = currentValue;\n this.hasChanges = false;\n \n this.dslChanged.emit(currentValue);\n this.snackBar.open('Changes applied', 'Close', { duration: 2000 });\n }\n\n discardChanges(): void {\n if (!this.hasChanges || !this.monacoEditor) return;\n \n this.monacoEditor.setValue(this.originalDsl);\n this.hasChanges = false;\n this.snackBar.open('Changes discarded', 'Close', { duration: 2000 });\n }\n\n copyToClipboard(): void {\n if (!this.monacoEditor) return;\n \n const content = this.monacoEditor.getValue();\n navigator.clipboard.writeText(content).then(() => {\n this.snackBar.open('Copied to clipboard', 'Close', { duration: 2000 });\n }).catch(() => {\n this.snackBar.open('Failed to copy to clipboard', 'Close', { duration: 3000 });\n });\n }\n\n downloadDsl(): void {\n if (!this.dsl) return;\n \n const blob = new Blob([this.dsl], { type: 'text/plain' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'specification.dsl';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }\n\n toggleLineNumbers(): void {\n this.showLineNumbers = !this.showLineNumbers;\n this.updateEditorOptions();\n }\n\n toggleWordWrap(): void {\n this.wordWrap = !this.wordWrap;\n this.updateEditorOptions();\n }\n\n toggleMinimap(): void {\n this.showMinimap = !this.showMinimap;\n this.updateEditorOptions();\n }\n\n showErrorDetails(): void {\n this.showErrors = true;\n }\n\n hideErrorDetails(): void {\n this.showErrors = false;\n }\n\n goToError(error: any): void {\n if (!this.monacoEditor) return;\n \n this.monacoEditor.setPosition({\n lineNumber: error.line,\n column: error.column\n });\n this.monacoEditor.focus();\n }\n\n // DSL-specific methods\n private formatDslCode(code: string): string {\n // Simple DSL formatting - in a real implementation, this would use a proper parser\n return code\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .map(line => {\n // Add proper indentation based on nesting level\n const depth = this.calculateIndentationDepth(line);\n return ' '.repeat(depth) + line;\n })\n .join('\\n');\n }\n\n private calculateIndentationDepth(line: string): number {\n // Mock indentation calculation\n if (line.includes('{')) return 1;\n if (line.includes('}')) return 0;\n return 0;\n }\n\n private validateDslSyntax(code: string): {errors: any[]; warnings: any[]} {\n const errors: any[] = [];\n const warnings: any[] = [];\n \n // Simple DSL validation - in a real implementation, this would use a proper parser\n const lines = code.split('\\n');\n \n lines.forEach((line, index) => {\n const lineNumber = index + 1;\n \n // Check for basic syntax errors\n if (line.trim() && !line.trim().endsWith(';') && !line.includes('{') && !line.includes('}')) {\n warnings.push({\n line: lineNumber,\n column: line.length,\n message: 'Line should end with semicolon',\n severity: 'warning'\n });\n }\n \n // Check for unmatched braces\n const openBraces = (line.match(/\\{/g) || []).length;\n const closeBraces = (line.match(/\\}/g) || []).length;\n \n if (openBraces !== closeBraces) {\n errors.push({\n line: lineNumber,\n column: 1,\n message: 'Unmatched braces',\n severity: 'error'\n });\n }\n });\n \n return { errors, warnings };\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'praxis-json-viewer',\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n MatTooltipModule,\n MatToolbarModule,\n MatMenuModule,\n MatDividerModule,\n MatSnackBarModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"json-viewer-container\">\n <!-- Toolbar -->\n <mat-toolbar class=\"json-toolbar\" color=\"primary\">\n <span class=\"toolbar-title\">\n <mat-icon [praxisIcon]=\"'data_object'\"></mat-icon>\n JSON Viewer\n </span>\n \n <span class=\"toolbar-spacer\"></span>\n \n <div class=\"toolbar-actions\">\n <!-- Validation Status -->\n <div class=\"validation-status\" [class]=\"getValidationStatusClass()\">\n <mat-icon [praxisIcon]=\"getValidationIcon()\"></mat-icon>\n <span>{{ getValidationText() }}</span>\n </div>\n \n <mat-divider vertical></mat-divider>\n \n <!-- Actions -->\n <button mat-icon-button \n [disabled]=\"!editable\"\n (click)=\"formatJson()\"\n matTooltip=\"Format JSON\">\n <mat-icon [praxisIcon]=\"'auto_fix_high'\"></mat-icon>\n </button>\n \n <button mat-icon-button \n [disabled]=\"!editable\"\n (click)=\"validateJson()\"\n matTooltip=\"Validate JSON\">\n <mat-icon [praxisIcon]=\"'check_circle'\"></mat-icon>\n </button>\n \n <button mat-icon-button \n [disabled]=\"!editable || !hasChanges\"\n (click)=\"applyChanges()\"\n matTooltip=\"Apply Changes\">\n <mat-icon [praxisIcon]=\"'save'\"></mat-icon>\n </button>\n \n <button mat-icon-button \n [disabled]=\"!editable || !hasChanges\"\n (click)=\"discardChanges()\"\n matTooltip=\"Discard Changes\">\n <mat-icon [praxisIcon]=\"'undo'\"></mat-icon>\n </button>\n \n <!-- More Actions Menu -->\n <button mat-icon-button [matMenuTriggerFor]=\"moreMenu\">\n <mat-icon [praxisIcon]=\"'more_vert'\"></mat-icon>\n </button>\n \n <mat-menu #moreMenu=\"matMenu\">\n <button mat-menu-item (click)=\"copyToClipboard()\">\n <mat-icon [praxisIcon]=\"'content_copy'\"></mat-icon>\n <span>Copy to Clipboard</span>\n </button>\n \n <button mat-menu-item (click)=\"downloadJson()\" [disabled]=\"!json\">\n <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n <span>Download JSON</span>\n </button>\n \n <mat-divider></mat-divider>\n \n <button mat-menu-item (click)=\"toggleLineNumbers()\">\n <mat-icon [praxisIcon]=\"'format_list_numbered'\"></mat-icon>\n <span>{{ showLineNumbers ? 'Hide' : 'Show' }} Line Numbers</span>\n </button>\n \n <button mat-menu-item (click)=\"toggleWordWrap()\">\n <mat-icon [praxisIcon]=\"'wrap_text'\"></mat-icon>\n <span>{{ wordWrap ? 'Disable' : 'Enable' }} Word Wrap</span>\n </button>\n </mat-menu>\n </div>\n </mat-toolbar>\n\n <!-- Editor Container -->\n <div class=\"editor-container\" [class.readonly]=\"!editable\">\n <div class=\"json-editor\">\n <textarea \n #jsonTextarea\n class=\"json-textarea\"\n [value]=\"formattedJson\"\n [readonly]=\"!editable\"\n (input)=\"onJsonInput($event)\"\n [class.line-numbers]=\"showLineNumbers\"\n [class.word-wrap]=\"wordWrap\"\n placeholder=\"Enter JSON here...\">\n </textarea>\n \n <!-- Line Numbers -->\n <div *ngIf=\"showLineNumbers\" class=\"line-numbers\">\n <div *ngFor=\"let lineNum of getLineNumbers()\" class=\"line-number\">\n {{ lineNum }}\n </div>\n </div>\n </div>\n \n <!-- Readonly Overlay -->\n <div *ngIf=\"!editable\" class=\"readonly-overlay\">\n <div class=\"readonly-message\">\n <mat-icon [praxisIcon]=\"'visibility'\"></mat-icon>\n <span>Read-only mode</span>\n </div>\n </div>\n </div>\n\n <!-- Status Bar -->\n <div class=\"status-bar\">\n <div class=\"status-left\">\n <span class=\"editor-info\">{{ getEditorInfo() }}</span>\n </div>\n \n <div class=\"status-center\">\n <!-- Validation Errors -->\n <div *ngIf=\"validationError\" class=\"validation-error\">\n <mat-icon color=\"warn\">error</mat-icon>\n <span>{{ validationError }}</span>\n </div>\n </div>\n \n <div class=\"status-right\">\n <span class=\"language-mode\">JSON</span>\n <span *ngIf=\"hasChanges\" class=\"unsaved-indicator\">•</span>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .json-viewer-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .json-toolbar {\n flex-shrink: 0;\n padding: 0 16px;\n }\n\n .toolbar-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n }\n\n .toolbar-spacer {\n flex: 1;\n }\n\n .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .validation-status {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n }\n\n .validation-status.valid {\n background: var(--mdc-theme-success-container);\n color: var(--mdc-theme-on-success-container);\n }\n\n .validation-status.invalid {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n }\n\n .validation-status mat-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n\n .editor-container {\n flex: 1;\n position: relative;\n overflow: hidden;\n }\n\n .json-editor {\n position: relative;\n height: 100%;\n display: flex;\n }\n\n .json-textarea {\n flex: 1;\n border: none;\n outline: none;\n resize: none;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n padding: 16px;\n background: var(--mdc-theme-surface);\n color: var(--mdc-theme-on-surface);\n white-space: pre;\n overflow-wrap: normal;\n overflow: auto;\n }\n\n .json-textarea.line-numbers {\n padding-left: 60px;\n }\n\n .json-textarea.word-wrap {\n white-space: pre-wrap;\n overflow-wrap: break-word;\n }\n\n .json-textarea:read-only {\n background: var(--mdc-theme-surface-variant);\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .line-numbers {\n position: absolute;\n left: 0;\n top: 0;\n width: 50px;\n height: 100%;\n background: var(--mdc-theme-surface-variant);\n border-right: 1px solid var(--mdc-theme-outline);\n padding: 16px 8px;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n color: var(--mdc-theme-on-surface-variant);\n text-align: right;\n overflow: hidden;\n user-select: none;\n }\n\n .line-number {\n height: 21px; /* Match line height */\n }\n\n .readonly-overlay {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 100;\n }\n\n .readonly-message {\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--mdc-theme-surface-variant);\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n box-shadow: 0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,0.1));\n }\n\n .readonly-message mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n .status-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 16px;\n background: var(--mdc-theme-surface-variant);\n border-top: 1px solid var(--mdc-theme-outline);\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n flex-shrink: 0;\n }\n\n .status-left,\n .status-center,\n .status-right {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .validation-error {\n display: flex;\n align-items: center;\n gap: 4px;\n color: var(--mdc-theme-error);\n }\n\n .validation-error mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n .language-mode {\n font-family: monospace;\n font-weight: 600;\n }\n\n .unsaved-indicator {\n color: var(--mdc-theme-primary);\n font-weight: bold;\n font-size: 16px;\n }\n `]\n})\nexport class JsonViewerComponent implements OnInit, OnChanges {\n @Input() json: any = null;\n @Input() editable: boolean = true;\n \n @Output() jsonChanged = new EventEmitter<any>();\n\n // Component state\n formattedJson: string = '';\n originalJson: string = '';\n hasChanges = false;\n validationError: string = '';\n \n // Editor settings\n showLineNumbers = true;\n wordWrap = false;\n\n constructor(private snackBar: MatSnackBar) {}\n\n ngOnInit(): void {\n this.updateJsonContent();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['json']) {\n this.updateJsonContent();\n }\n }\n\n private updateJsonContent(): void {\n try {\n if (this.json !== null && this.json !== undefined) {\n this.formattedJson = typeof this.json === 'string' \n ? this.json \n : JSON.stringify(this.json, null, 2);\n } else {\n this.formattedJson = '';\n }\n \n this.originalJson = this.formattedJson;\n this.hasChanges = false;\n this.validationError = '';\n } catch (error) {\n this.validationError = 'Invalid JSON format';\n this.formattedJson = '';\n }\n }\n\n onJsonInput(event: any): void {\n this.formattedJson = event.target.value;\n this.hasChanges = this.formattedJson !== this.originalJson;\n this.validateJson();\n }\n\n getValidationStatusClass(): string {\n return this.validationError ? 'invalid' : 'valid';\n }\n\n getValidationIcon(): string {\n return this.validationError ? 'error' : 'check_circle';\n }\n\n getValidationText(): string {\n return this.validationError ? 'Invalid' : 'Valid';\n }\n\n getEditorInfo(): string {\n const lines = this.formattedJson ? this.formattedJson.split('\\n').length : 0;\n const chars = this.formattedJson ? this.formattedJson.length : 0;\n return `${lines} lines, ${chars} characters`;\n }\n\n getLineNumbers(): number[] {\n const lineCount = this.formattedJson ? this.formattedJson.split('\\n').length : 1;\n return Array.from({ length: lineCount }, (_, i) => i + 1);\n }\n\n formatJson(): void {\n if (!this.editable) return;\n \n try {\n const parsed = JSON.parse(this.formattedJson);\n this.formattedJson = JSON.stringify(parsed, null, 2);\n this.validationError = '';\n this.snackBar.open('JSON formatted', 'Close', { duration: 2000 });\n } catch (error) {\n this.snackBar.open('Invalid JSON format', 'Close', { duration: 3000 });\n }\n }\n\n validateJson(): void {\n try {\n if (this.formattedJson.trim()) {\n JSON.parse(this.formattedJson);\n }\n this.validationError = '';\n } catch (error) {\n this.validationError = 'Invalid JSON syntax';\n }\n }\n\n applyChanges(): void {\n if (!this.hasChanges || this.validationError) return;\n \n try {\n const parsed = this.formattedJson.trim() ? JSON.parse(this.formattedJson) : null;\n this.originalJson = this.formattedJson;\n this.hasChanges = false;\n \n this.jsonChanged.emit(parsed);\n this.snackBar.open('Changes applied', 'Close', { duration: 2000 });\n } catch (error) {\n this.snackBar.open('Invalid JSON format', 'Close', { duration: 3000 });\n }\n }\n\n discardChanges(): void {\n if (!this.hasChanges) return;\n \n this.formattedJson = this.originalJson;\n this.hasChanges = false;\n this.validateJson();\n this.snackBar.open('Changes discarded', 'Close', { duration: 2000 });\n }\n\n copyToClipboard(): void {\n navigator.clipboard.writeText(this.formattedJson).then(() => {\n this.snackBar.open('Copied to clipboard', 'Close', { duration: 2000 });\n }).catch(() => {\n this.snackBar.open('Failed to copy to clipboard', 'Close', { duration: 3000 });\n });\n }\n\n downloadJson(): void {\n if (!this.formattedJson) return;\n \n const blob = new Blob([this.formattedJson], { type: 'application/json' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'specification.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }\n\n toggleLineNumbers(): void {\n this.showLineNumbers = !this.showLineNumbers;\n }\n\n toggleWordWrap(): void {\n this.wordWrap = !this.wordWrap;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RuleNode } from '../models/rule-builder.model';\nimport {\n RegistryError,\n createError,\n globalErrorHandler,\n} from '../errors/visual-builder-errors';\n\n/**\n * Registry service for managing RuleNode instances and their relationships.\n * Solves the core problem of resolving string IDs to actual RuleNode objects.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class RuleNodeRegistryService {\n private nodes = new Map<string, RuleNode>();\n private nodesSubject = new BehaviorSubject<Map<string, RuleNode>>(new Map());\n\n /**\n * Observable stream of all registered nodes\n */\n nodes$ = this.nodesSubject.asObservable();\n\n /**\n * Register a node in the registry\n */\n register(node: RuleNode): void {\n this.nodes.set(node.id, node);\n this.notifyChange();\n }\n\n /**\n * Register multiple nodes at once\n */\n registerAll(nodes: RuleNode[]): void {\n nodes.forEach((node) => this.nodes.set(node.id, node));\n this.notifyChange();\n }\n\n /**\n * Unregister a node from the registry\n */\n unregister(nodeId: string): boolean {\n const result = this.nodes.delete(nodeId);\n if (result) {\n this.notifyChange();\n }\n return result;\n }\n\n /**\n * Resolve a node by its ID\n */\n resolve(nodeId: string): RuleNode | null {\n return this.nodes.get(nodeId) || null;\n }\n\n /**\n * Retrieve a node synchronously by its ID.\n *\n * Provided for backwards compatibility with code that expected a\n * synchronous `getNode` API. Internally this simply delegates to\n * {@link resolve}.\n */\n getNode(nodeId: string): RuleNode | null {\n return this.resolve(nodeId);\n }\n\n /**\n * Resolve multiple nodes by their IDs\n */\n resolveMultiple(nodeIds: string[]): RuleNode[] {\n return nodeIds\n .map((id) => this.resolve(id))\n .filter((node) => node !== null) as RuleNode[];\n }\n\n /**\n * Resolve children nodes for a given node\n */\n resolveChildren(node: RuleNode): RuleNode[] {\n if (!node.children || node.children.length === 0) {\n return [];\n }\n return this.resolveMultiple(node.children);\n }\n\n /**\n * Get all nodes that have the specified parent ID\n */\n getChildrenOf(parentId: string): RuleNode[] {\n return Array.from(this.nodes.values()).filter(\n (node) => node.parentId === parentId,\n );\n }\n\n /**\n * Get the parent node of a given node\n */\n getParent(node: RuleNode): RuleNode | null {\n if (!node.parentId) {\n return null;\n }\n return this.resolve(node.parentId);\n }\n\n /**\n * Get all root nodes (nodes without parents)\n */\n getRootNodes(): RuleNode[] {\n return Array.from(this.nodes.values()).filter((node) => !node.parentId);\n }\n\n /**\n * Check if a node exists in the registry\n */\n exists(nodeId: string): boolean {\n return this.nodes.has(nodeId);\n }\n\n /**\n * Get all registered node IDs\n */\n getAllIds(): string[] {\n return Array.from(this.nodes.keys());\n }\n\n /**\n * Get all registered nodes\n */\n getAllNodes(): RuleNode[] {\n return Array.from(this.nodes.values());\n }\n\n /**\n * Clear all nodes from the registry\n */\n clear(): void {\n this.nodes.clear();\n this.notifyChange();\n }\n\n /**\n * Get the size of the registry\n */\n size(): number {\n return this.nodes.size;\n }\n\n /**\n * Remove orphaned nodes (nodes without parents and not referenced by others)\n */\n cleanupOrphanedNodes(): string[] {\n const orphanedIds: string[] = [];\n const referencedIds = new Set<string>();\n\n // Collect all referenced node IDs\n for (const node of this.nodes.values()) {\n if (node.children) {\n node.children.forEach((childId) => referencedIds.add(childId));\n }\n }\n\n // Find orphaned nodes (no parent and not referenced as children)\n for (const [id, node] of this.nodes.entries()) {\n const hasParent = node.parentId && this.nodes.has(node.parentId);\n const isReferenced = referencedIds.has(id);\n\n if (!hasParent && !isReferenced) {\n // Check if it's a root node (has children but no parent)\n const hasChildren = node.children && node.children.length > 0;\n\n if (!hasChildren) {\n orphanedIds.push(id);\n }\n }\n }\n\n // Remove orphaned nodes\n for (const id of orphanedIds) {\n this.unregister(id);\n }\n\n return orphanedIds;\n }\n\n /**\n * Detect circular references in the registry\n */\n detectCircularReferences(): CircularReference[] {\n const circularRefs: CircularReference[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const detectCycle = (nodeId: string, path: string[]): void => {\n if (visiting.has(nodeId)) {\n // Found a cycle\n const cycleStart = path.indexOf(nodeId);\n const cycle = path.slice(cycleStart).concat(nodeId);\n\n circularRefs.push({\n cycle,\n affectedNodes: cycle.slice(0, -1), // Remove duplicate last node\n });\n return;\n }\n\n if (visited.has(nodeId)) {\n return;\n }\n\n const node = this.nodes.get(nodeId);\n if (!node) return;\n\n visiting.add(nodeId);\n path.push(nodeId);\n\n // Check children\n if (node.children) {\n for (const childId of node.children) {\n detectCycle(childId, [...path]);\n }\n }\n\n visiting.delete(nodeId);\n visited.add(nodeId);\n };\n\n // Check all nodes\n for (const nodeId of this.nodes.keys()) {\n if (!visited.has(nodeId)) {\n detectCycle(nodeId, []);\n }\n }\n\n return circularRefs;\n }\n\n /**\n * Get memory usage statistics\n */\n getMemoryStats(): MemoryStats {\n let totalSize = 0;\n let configSize = 0;\n let childrenSize = 0;\n let metadataSize = 0;\n\n for (const node of this.nodes.values()) {\n // Estimate node size\n const nodeStr = JSON.stringify(node);\n totalSize += nodeStr.length * 2; // Rough estimate (2 bytes per char)\n\n // Break down by components\n if (node.config) {\n configSize += JSON.stringify(node.config).length * 2;\n }\n\n if (node.children) {\n childrenSize += JSON.stringify(node.children).length * 2;\n }\n\n if (node.metadata) {\n metadataSize += JSON.stringify(node.metadata).length * 2;\n }\n }\n\n return {\n totalNodes: this.nodes.size,\n estimatedSizeBytes: totalSize,\n breakdown: {\n config: configSize,\n children: childrenSize,\n metadata: metadataSize,\n other: totalSize - configSize - childrenSize - metadataSize,\n },\n };\n }\n\n /**\n * Validate registry integrity\n */\n validateIntegrity(): RegistryIntegrityResult {\n const issues: string[] = [];\n const warnings: string[] = [];\n\n // Check for broken references\n for (const [id, node] of this.nodes.entries()) {\n // Check parent reference\n if (node.parentId) {\n const parent = this.nodes.get(node.parentId);\n if (!parent) {\n issues.push(\n `Node ${id} references non-existent parent ${node.parentId}`,\n );\n } else if (!parent.children?.includes(id)) {\n warnings.push(\n `Node ${id} references parent ${node.parentId}, but parent doesn't reference back`,\n );\n }\n }\n\n // Check children references\n if (node.children) {\n for (const childId of node.children) {\n const child = this.nodes.get(childId);\n if (!child) {\n issues.push(`Node ${id} references non-existent child ${childId}`);\n } else if (child.parentId !== id) {\n warnings.push(\n `Node ${id} references child ${childId}, but child doesn't reference back`,\n );\n }\n }\n }\n }\n\n // Check for circular references\n const circularRefs = this.detectCircularReferences();\n if (circularRefs.length > 0) {\n issues.push(`Found ${circularRefs.length} circular reference(s)`);\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n warnings,\n circularReferences: circularRefs,\n memoryStats: this.getMemoryStats(),\n };\n }\n\n /**\n * Perform automatic cleanup operations\n */\n performCleanup(): CleanupResult {\n const result: CleanupResult = {\n orphanedNodesRemoved: [],\n circularReferencesDetected: [],\n memoryFreed: 0,\n };\n\n const initialSize = this.getMemoryStats().estimatedSizeBytes;\n\n // Remove orphaned nodes\n result.orphanedNodesRemoved = this.cleanupOrphanedNodes();\n\n // Detect (but don't automatically fix) circular references\n result.circularReferencesDetected = this.detectCircularReferences();\n\n const finalSize = this.getMemoryStats().estimatedSizeBytes;\n result.memoryFreed = initialSize - finalSize;\n\n if (result.orphanedNodesRemoved.length > 0 || result.memoryFreed > 0) {\n this.notifyChange();\n }\n\n return result;\n }\n\n /**\n * Build a tree structure starting from root nodes\n */\n buildTree(): RuleNodeTree[] {\n const rootNodes = this.getRootNodes();\n return rootNodes.map((root) => this.buildNodeTree(root));\n }\n\n /**\n * Build tree structure for a specific node\n */\n buildNodeTree(node: RuleNode): RuleNodeTree {\n const children = this.resolveChildren(node);\n return {\n node,\n children: children.map((child) => this.buildNodeTree(child)),\n };\n }\n\n /**\n * Find nodes by a predicate function\n */\n findNodes(predicate: (node: RuleNode) => boolean): RuleNode[] {\n return Array.from(this.nodes.values()).filter(predicate);\n }\n\n /**\n * Find nodes by type\n */\n findNodesByType(type: string): RuleNode[] {\n return this.findNodes((node) => node.type === type);\n }\n\n /**\n * Validate the graph structure integrity (legacy method for backward compatibility)\n */\n validateGraphIntegrity(): RegistryValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n for (const node of this.nodes.values()) {\n // Check if parent exists\n if (node.parentId && !this.exists(node.parentId)) {\n errors.push(\n `Node ${node.id} references non-existent parent ${node.parentId}`,\n );\n }\n\n // Check if children exist\n if (node.children) {\n for (const childId of node.children) {\n if (!this.exists(childId)) {\n errors.push(\n `Node ${node.id} references non-existent child ${childId}`,\n );\n }\n }\n }\n\n // Check for circular references\n if (this.hasCircularReference(node)) {\n errors.push(`Circular reference detected in node ${node.id}`);\n }\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Check if a node has circular references\n */\n private hasCircularReference(\n node: RuleNode,\n visited: Set<string> = new Set(),\n ): boolean {\n if (visited.has(node.id)) {\n return true;\n }\n\n visited.add(node.id);\n\n if (node.children) {\n for (const childId of node.children) {\n const child = this.resolve(childId);\n if (child && this.hasCircularReference(child, new Set(visited))) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Get observable for a specific node\n */\n getNode$(nodeId: string): Observable<RuleNode | null> {\n return this.nodes$.pipe(map((nodes) => nodes.get(nodeId) || null));\n }\n\n /**\n * Get observable for children of a node\n */\n getChildren$(nodeId: string): Observable<RuleNode[]> {\n return this.nodes$.pipe(\n map(() => {\n const node = this.resolve(nodeId);\n return node ? this.resolveChildren(node) : [];\n }),\n );\n }\n\n private notifyChange(): void {\n this.nodesSubject.next(new Map(this.nodes));\n }\n}\n\n/**\n * Tree structure for representing node hierarchies\n */\nexport interface RuleNodeTree {\n node: RuleNode;\n children: RuleNodeTree[];\n}\n\n/**\n * Result of registry integrity validation\n */\nexport interface RegistryValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Circular reference information\n */\nexport interface CircularReference {\n cycle: string[];\n affectedNodes: string[];\n}\n\n/**\n * Memory usage statistics\n */\nexport interface MemoryStats {\n totalNodes: number;\n estimatedSizeBytes: number;\n breakdown: {\n config: number;\n children: number;\n metadata: number;\n other: number;\n };\n}\n\n/**\n * Registry integrity validation result\n */\nexport interface RegistryIntegrityResult {\n isValid: boolean;\n issues: string[];\n warnings: string[];\n circularReferences: CircularReference[];\n memoryStats: MemoryStats;\n}\n\n/**\n * Cleanup operation result\n */\nexport interface CleanupResult {\n orphanedNodesRemoved: string[];\n circularReferencesDetected: CircularReference[];\n memoryFreed: number;\n}\n","import { Specification } from '@praxisui/specification-core';\nimport { RuleNode } from '../../models/rule-builder.model';\n\n/**\n * Context interface for rule conversion operations\n * Eliminates circular dependencies between converters and factory\n */\nexport interface ConversionContext {\n /**\n * Convert a child node to a specification\n * This method is provided by the factory to avoid circular dependencies\n */\n convertChild<T extends object = any>(node: RuleNode): Specification<T>;\n\n /**\n * Convert multiple child nodes to specifications\n */\n convertChildren<T extends object = any>(nodes: RuleNode[]): Specification<T>[];\n\n /**\n * Check if a node type is supported\n */\n isSupported(nodeType: string): boolean;\n\n /**\n * Validate that a node can be converted\n */\n validateNode(node: RuleNode): { isValid: boolean; errors: string[] };\n}\n\n/**\n * Context provider that implements the conversion context\n * Used by the factory to provide conversion capabilities to converters\n */\nexport class ConverterContextProvider implements ConversionContext {\n constructor(\n private convertFn: <T extends object = any>(node: RuleNode) => Specification<T>,\n private isSupportedFn: (nodeType: string) => boolean,\n private validateFn: (node: RuleNode) => { isValid: boolean; errors: string[] }\n ) {}\n\n convertChild<T extends object = any>(node: RuleNode): Specification<T> {\n return this.convertFn<T>(node);\n }\n\n convertChildren<T extends object = any>(nodes: RuleNode[]): Specification<T>[] {\n return nodes.map(node => this.convertChild<T>(node));\n }\n\n isSupported(nodeType: string): boolean {\n return this.isSupportedFn(nodeType);\n }\n\n validateNode(node: RuleNode): { isValid: boolean; errors: string[] } {\n return this.validateFn(node);\n }\n}\n","import { Specification } from '@praxisui/specification-core';\nimport { RuleNode } from '../../models/rule-builder.model';\nimport { ConversionContext } from './conversion-context.interface';\n\n/**\n * Interface for rule converters that transform RuleNodes to Specifications\n */\nexport interface RuleConverter {\n /**\n * Convert a RuleNode to a Specification\n * @param node The node to convert\n * @param context Context providing access to child conversion capabilities\n */\n convert<T extends object = any>(node: RuleNode, context?: ConversionContext): Specification<T>;\n\n /**\n * Check if this converter can handle the given node type\n */\n canConvert(nodeType: string): boolean;\n\n /**\n * Get the supported node types\n */\n getSupportedTypes(): string[];\n\n /**\n * Set the conversion context (called by factory during initialization)\n */\n setContext?(context: ConversionContext): void;\n}\n\n/**\n * Base abstract class for rule converters\n */\nexport abstract class BaseRuleConverter implements RuleConverter {\n protected abstract supportedTypes: string[];\n protected context?: ConversionContext;\n\n abstract convert<T extends object = any>(node: RuleNode, context?: ConversionContext): Specification<T>;\n\n /**\n * Set the conversion context\n */\n setContext(context: ConversionContext): void {\n this.context = context;\n }\n\n canConvert(nodeType: string): boolean {\n return this.supportedTypes.includes(nodeType);\n }\n\n getSupportedTypes(): string[] {\n return [...this.supportedTypes];\n }\n\n protected validateNode(node: RuleNode, expectedType?: string): void {\n if (!node) {\n throw new Error('Node cannot be null or undefined');\n }\n\n if (!node.config) {\n throw new Error(`Node ${node.id} is missing configuration`);\n }\n\n if (expectedType && node.config.type !== expectedType) {\n throw new Error(`Expected node type ${expectedType}, but got ${node.config.type}`);\n }\n\n if (!this.canConvert(node.config.type)) {\n throw new Error(`Converter cannot handle node type: ${node.config.type}`);\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { SpecificationFactory, ComparisonOperator } from '@praxisui/specification';\nimport { BaseRuleConverter } from './rule-converter.interface';\nimport { RuleNode, FieldConditionConfig } from '../../models/rule-builder.model';\nimport { ConversionContext } from './conversion-context.interface';\n\n/**\n * Converter for field condition rules to field specifications\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class FieldConditionConverter extends BaseRuleConverter {\n protected supportedTypes = ['fieldCondition'];\n\n convert<T extends object>(node: RuleNode, context?: ConversionContext): Specification<T> {\n this.validateNode(node, 'fieldCondition');\n\n const config = node.config as FieldConditionConfig;\n\n // Validate required properties\n if (!config.fieldName) {\n throw new Error(`Field condition node ${node.id} is missing fieldName`);\n }\n\n if (!config.operator) {\n throw new Error(`Field condition node ${node.id} is missing operator`);\n }\n\n if (config.value === undefined) {\n throw new Error(`Field condition node ${node.id} is missing value`);\n }\n\n // Convert operator string to ComparisonOperator enum\n const operator = this.mapOperator(config.operator);\n\n // Convert value based on valueType\n const value = this.convertValue(config.value, config.valueType);\n\n // Create field specification\n const fieldKey = config.fieldName as keyof T;\n\n if (config.metadata) {\n return SpecificationFactory.fieldWithMetadata(fieldKey, operator, value, config.metadata);\n } else {\n return SpecificationFactory.field(fieldKey, operator, value);\n }\n }\n\n private mapOperator(operatorString: string): ComparisonOperator {\n const operatorMap: Record<string, ComparisonOperator> = {\n 'eq': ComparisonOperator.EQUALS,\n 'equals': ComparisonOperator.EQUALS,\n 'neq': ComparisonOperator.NOT_EQUALS,\n 'not_equals': ComparisonOperator.NOT_EQUALS,\n 'lt': ComparisonOperator.LESS_THAN,\n 'less_than': ComparisonOperator.LESS_THAN,\n 'lte': ComparisonOperator.LESS_THAN_OR_EQUAL,\n 'less_than_or_equal': ComparisonOperator.LESS_THAN_OR_EQUAL,\n 'gt': ComparisonOperator.GREATER_THAN,\n 'greater_than': ComparisonOperator.GREATER_THAN,\n 'gte': ComparisonOperator.GREATER_THAN_OR_EQUAL,\n 'greater_than_or_equal': ComparisonOperator.GREATER_THAN_OR_EQUAL,\n 'contains': ComparisonOperator.CONTAINS,\n 'startsWith': ComparisonOperator.STARTS_WITH,\n 'starts_with': ComparisonOperator.STARTS_WITH,\n 'endsWith': ComparisonOperator.ENDS_WITH,\n 'ends_with': ComparisonOperator.ENDS_WITH,\n 'in': ComparisonOperator.IN\n };\n\n const operator = operatorMap[operatorString.toLowerCase()];\n if (!operator) {\n throw new Error(`Unsupported operator: ${operatorString}`);\n }\n\n return operator;\n }\n\n private convertValue(value: any, valueType?: string): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n switch (valueType) {\n case 'literal':\n return value;\n\n case 'field':\n // Field references should be handled differently in context\n return value;\n\n case 'context':\n // Context variables should be resolved by context provider\n return value;\n\n case 'function':\n // Function calls should be handled by function registry\n return value;\n\n default:\n // Try to infer type and convert if needed\n return this.inferAndConvertValue(value);\n }\n }\n\n private inferAndConvertValue(value: any): any {\n if (typeof value === 'string') {\n // Try to parse as number\n const numValue = Number(value);\n if (!isNaN(numValue) && isFinite(numValue)) {\n return numValue;\n }\n\n // Try to parse as boolean\n if (value.toLowerCase() === 'true') return true;\n if (value.toLowerCase() === 'false') return false;\n\n // Try to parse as date\n const dateValue = new Date(value);\n if (!isNaN(dateValue.getTime()) && value.match(/^\\d{4}-\\d{2}-\\d{2}/)) {\n return dateValue;\n }\n }\n\n return value;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { SpecificationFactory } from '@praxisui/specification';\nimport { BaseRuleConverter } from './rule-converter.interface';\nimport { RuleNode, BooleanGroupConfig } from '../../models/rule-builder.model';\nimport { RuleNodeRegistryService } from '../rule-node-registry.service';\nimport { ConversionContext } from './conversion-context.interface';\n\n/**\n * Converter for boolean group rules (AND, OR, NOT, XOR, IMPLIES)\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class BooleanGroupConverter extends BaseRuleConverter {\n protected supportedTypes = ['booleanGroup', 'andGroup', 'orGroup', 'notGroup', 'xorGroup', 'impliesGroup'];\n\n constructor(\n private nodeRegistry: RuleNodeRegistryService\n ) {\n super();\n }\n\n convert<T extends object>(node: RuleNode, context?: ConversionContext): Specification<T> {\n this.validateNode(node);\n\n const config = node.config as BooleanGroupConfig;\n\n if (!config.operator) {\n throw new Error(`Boolean group node ${node.id} is missing operator`);\n }\n\n // Resolve child nodes\n const childNodes = this.nodeRegistry.resolveChildren(node);\n\n if (config.operator !== 'not' && childNodes.length === 0) {\n throw new Error(`Boolean group node ${node.id} requires at least one child`);\n }\n\n if (config.operator === 'not' && childNodes.length !== 1) {\n throw new Error(`NOT operation requires exactly one child, but got ${childNodes.length}`);\n }\n\n // Convert children to specifications using context\n const conversionContext = context || this.context;\n if (!conversionContext) {\n throw new Error('Conversion context is required for boolean group conversion');\n }\n\n const childSpecs = conversionContext.convertChildren<T>(childNodes);\n\n // Apply boolean operator\n switch (config.operator.toLowerCase()) {\n case 'and':\n return SpecificationFactory.and(...childSpecs);\n\n case 'or':\n return SpecificationFactory.or(...childSpecs);\n\n case 'not':\n return SpecificationFactory.not(childSpecs[0]);\n\n case 'xor':\n return SpecificationFactory.xor(...childSpecs);\n\n case 'implies':\n if (childSpecs.length !== 2) {\n throw new Error(`IMPLIES operation requires exactly 2 children, but got ${childSpecs.length}`);\n }\n return SpecificationFactory.implies(childSpecs[0], childSpecs[1]);\n\n default:\n throw new Error(`Unsupported boolean operator: ${config.operator}`);\n }\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { SpecificationFactory } from '@praxisui/specification';\nimport { BaseRuleConverter } from './rule-converter.interface';\nimport { RuleNode, CardinalityConfig } from '../../models/rule-builder.model';\nimport { RuleNodeRegistryService } from '../rule-node-registry.service';\nimport { ConversionContext } from './conversion-context.interface';\n\n/**\n * Converter for cardinality rules (atLeast, exactly)\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CardinalityConverter extends BaseRuleConverter {\n protected supportedTypes = ['cardinality', 'atLeast', 'exactly'];\n\n constructor(\n private nodeRegistry: RuleNodeRegistryService\n ) {\n super();\n }\n\n convert<T extends object>(node: RuleNode, context?: ConversionContext): Specification<T> {\n this.validateNode(node);\n\n const config = node.config as CardinalityConfig;\n\n if (!config.cardinalityType) {\n throw new Error(`Cardinality node ${node.id} is missing cardinalityType`);\n }\n\n if (typeof config.count !== 'number' || config.count < 0) {\n throw new Error(`Cardinality node ${node.id} has invalid count: ${config.count}`);\n }\n\n // Resolve child nodes\n const childNodes = this.nodeRegistry.resolveChildren(node);\n\n if (childNodes.length === 0) {\n throw new Error(`Cardinality node ${node.id} requires at least one child`);\n }\n\n if (config.count > childNodes.length) {\n throw new Error(`Cardinality count (${config.count}) cannot be greater than number of children (${childNodes.length})`);\n }\n\n // Convert children to specifications using context\n const conversionContext = context || this.context;\n if (!conversionContext) {\n throw new Error('Conversion context is required for cardinality conversion');\n }\n\n const childSpecs = conversionContext.convertChildren<T>(childNodes);\n\n // Apply cardinality operator\n switch (config.cardinalityType) {\n case 'atLeast':\n return SpecificationFactory.atLeast(config.count, childSpecs);\n\n case 'exactly':\n return SpecificationFactory.exactly(config.count, childSpecs);\n\n default:\n throw new Error(`Unsupported cardinality type: ${config.cardinalityType}`);\n }\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { RuleConverter } from './rule-converter.interface';\nimport { RuleNode } from '../../models/rule-builder.model';\nimport { FieldConditionConverter } from './field-condition.converter';\nimport { BooleanGroupConverter } from './boolean-group.converter';\nimport { CardinalityConverter } from './cardinality.converter';\nimport { ConversionContext, ConverterContextProvider } from './conversion-context.interface';\n\n/**\n * Factory service for converting RuleNodes to Specifications\n * Uses Strategy pattern to delegate to appropriate converters\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ConverterFactoryService {\n private converters = new Map<string, RuleConverter>();\n private context!: ConversionContext;\n\n constructor(\n private fieldConditionConverter: FieldConditionConverter,\n private booleanGroupConverter: BooleanGroupConverter,\n private cardinalityConverter: CardinalityConverter\n ) {\n this.initializeContext();\n this.initializeConverters();\n }\n\n /**\n * Convert a RuleNode to a Specification\n */\n convert<T extends object = any>(node: RuleNode): Specification<T> {\n if (!node) {\n throw new Error('Node cannot be null or undefined');\n }\n\n if (!node.config || !node.config.type) {\n throw new Error(`Node ${node.id} is missing configuration or type`);\n }\n\n const converter = this.getConverter(node.config.type);\n if (!converter) {\n throw new Error(`No converter found for node type: ${node.config.type}`);\n }\n\n try {\n return converter.convert<T>(node, this.context);\n } catch (error) {\n throw new Error(`Failed to convert node ${node.id}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get converter for a specific node type\n */\n getConverter(nodeType: string): RuleConverter | undefined {\n for (const [, converter] of this.converters) {\n if (converter.canConvert(nodeType)) {\n return converter;\n }\n }\n return undefined;\n }\n\n /**\n * Register a new converter\n */\n registerConverter(name: string, converter: RuleConverter): void {\n this.converters.set(name, converter);\n }\n\n /**\n * Unregister a converter\n */\n unregisterConverter(name: string): boolean {\n return this.converters.delete(name);\n }\n\n /**\n * Get all supported node types\n */\n getSupportedTypes(): string[] {\n const types = new Set<string>();\n for (const converter of this.converters.values()) {\n converter.getSupportedTypes().forEach(type => types.add(type));\n }\n return Array.from(types);\n }\n\n /**\n * Check if a node type is supported\n */\n isSupported(nodeType: string): boolean {\n return this.getSupportedTypes().includes(nodeType);\n }\n\n private initializeContext(): void {\n // Create conversion context that provides access to this factory's convert method\n this.context = new ConverterContextProvider(\n <T extends object = any>(node: RuleNode) => this.convertInternal<T>(node),\n (nodeType: string) => this.isSupported(nodeType),\n (node: RuleNode) => this.validateNode(node)\n );\n }\n\n /**\n * Internal convert method that bypasses context to avoid recursion\n */\n private convertInternal<T extends object = any>(node: RuleNode): Specification<T> {\n if (!node) {\n throw new Error('Node cannot be null or undefined');\n }\n\n if (!node.config || !node.config.type) {\n throw new Error(`Node ${node.id} is missing configuration or type`);\n }\n\n const converter = this.getConverter(node.config.type);\n if (!converter) {\n throw new Error(`No converter found for node type: ${node.config.type}`);\n }\n\n try {\n // Call converter without context to avoid recursion\n return converter.convert<T>(node);\n } catch (error) {\n throw new Error(`Failed to convert node ${node.id}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n private initializeConverters(): void {\n // Register core converters\n this.registerConverter('fieldCondition', this.fieldConditionConverter);\n this.registerConverter('booleanGroup', this.booleanGroupConverter);\n this.registerConverter('cardinality', this.cardinalityConverter);\n\n // Set context in converters that need it\n this.booleanGroupConverter.setContext(this.context);\n this.cardinalityConverter.setContext(this.context);\n this.fieldConditionConverter.setContext(this.context);\n }\n\n /**\n * Convert multiple nodes to specifications\n */\n convertMultiple<T extends object = any>(nodes: RuleNode[]): Specification<T>[] {\n return nodes.map(node => this.convert<T>(node));\n }\n\n /**\n * Validate that a node can be converted\n */\n validateNode(node: RuleNode): { isValid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!node) {\n errors.push('Node cannot be null or undefined');\n return { isValid: false, errors };\n }\n\n if (!node.config) {\n errors.push(`Node ${node.id} is missing configuration`);\n } else if (!node.config.type) {\n errors.push(`Node ${node.id} is missing type in configuration`);\n } else if (!this.isSupported(node.config.type)) {\n errors.push(`Node type ${node.config.type} is not supported`);\n }\n\n return {\n isValid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Get statistics about converter usage\n */\n getStatistics(): ConverterStatistics {\n const supportedTypes = this.getSupportedTypes();\n const converterCount = this.converters.size;\n\n return {\n converterCount,\n supportedTypeCount: supportedTypes.length,\n supportedTypes,\n converterNames: Array.from(this.converters.keys())\n };\n }\n}\n\n/**\n * Statistics about the converter factory\n */\nexport interface ConverterStatistics {\n converterCount: number;\n supportedTypeCount: number;\n supportedTypes: string[];\n converterNames: string[];\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { type SpecificationMetadata, Specification as _SpecForTypeOnly } from '@praxisui/specification-core';\nimport { ComparisonOperator } from '@praxisui/specification';\nimport { SpecificationFactory } from '@praxisui/specification';\nimport { DslExporter, ExportOptions } from '@praxisui/specification';\nimport {\n DslParser,\n DslValidator,\n ValidationIssue,\n} from '@praxisui/specification';\nimport { ContextualSpecification } from '@praxisui/specification';\nimport { ContextProvider } from '@praxisui/specification';\nimport { FunctionRegistry } from '@praxisui/specification';\nimport {\n RuleNode,\n RuleNodeType,\n ValueType,\n CardinalityConfig,\n FunctionParameter,\n ConditionalValidatorConfig,\n CollectionValidatorConfig,\n FieldConditionConfig,\n BooleanGroupConfig,\n FunctionCallConfig,\n FieldToFieldConfig,\n ContextualConfig,\n} from '../models/rule-builder.model';\nimport { DslContextVariable as ContextVariable } from '../models/context-variable.model';\nimport { RuleNodeRegistryService } from './rule-node-registry.service';\nimport { ConverterFactoryService } from './converters/converter-factory.service';\n\n/**\n * Configuration for parsing DSL expressions\n */\nexport interface DslParsingConfig {\n /** Available function registry */\n functionRegistry?: FunctionRegistry<any>;\n /** Context provider for variable resolution */\n contextProvider?: ContextProvider;\n /** Known field names for validation */\n knownFields?: string[];\n /** Enable performance warnings */\n enablePerformanceWarnings?: boolean;\n /** Maximum expression complexity */\n maxComplexity?: number;\n}\n\n/**\n * Result of parsing a DSL expression\n */\nexport interface DslParsingResult<T extends object = any> {\n /** Whether parsing was successful */\n success: boolean;\n /** Parsed specification (if successful) */\n specification?: Specification<T>;\n /** Validation issues found */\n issues: ValidationIssue[];\n /** Performance metrics */\n metrics?: {\n parseTime: number;\n complexity: number;\n };\n}\n\n/**\n * Configuration for contextual specification support\n */\nexport interface SpecificationContextualConfig {\n /** Context variables available for token resolution */\n contextVariables?: ContextVariable[];\n /** Context provider instance */\n contextProvider?: ContextProvider;\n /** Enable strict validation of context tokens */\n strictContextValidation?: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SpecificationBridgeService {\n private dslExporter: DslExporter;\n private dslParser: DslParser<any>;\n private dslValidator: DslValidator;\n private contextProvider?: ContextProvider;\n\n constructor(\n private nodeRegistry: RuleNodeRegistryService,\n private converterFactory: ConverterFactoryService,\n ) {\n this.dslExporter = new DslExporter({\n prettyPrint: true,\n indentSize: 2,\n maxLineLength: 80,\n useParentheses: 'auto',\n includeMetadata: true,\n metadataPosition: 'before',\n });\n\n this.dslParser = new DslParser();\n this.dslValidator = new DslValidator();\n }\n\n /**\n * Converts a RuleNode tree to a Specification instance\n */\n ruleNodeToSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n try {\n // Use the config type for converter lookup (more reliable than node.type)\n const nodeType = node.config?.type || node.type;\n\n // Check if we have a converter for this node type\n if (this.converterFactory.isSupported(nodeType)) {\n return this.converterFactory.convert<T>(node);\n }\n\n // Fall back to legacy methods for unsupported types\n switch (nodeType) {\n case 'functionCall':\n return this.createFunctionSpecification<T>(node);\n\n case 'fieldToField':\n return this.createFieldToFieldSpecification<T>(node);\n\n // Phase 1: Conditional Validators\n case 'requiredIf':\n case 'visibleIf':\n case 'disabledIf':\n case 'readonlyIf':\n return this.createConditionalValidatorSpecification<T>(node);\n\n // Phase 2: Collection Validators\n case 'forEach':\n case 'uniqueBy':\n case 'minLength':\n case 'maxLength':\n return this.createCollectionValidatorSpecification<T>(node);\n\n // Phase 4: Expression and Contextual Support\n case 'expression':\n return this.createExpressionSpecification<T>(node);\n\n case 'contextual':\n return this.createContextualSpecificationFromNode<T>(node);\n\n default:\n throw new Error(`Unsupported rule node type: ${nodeType}`);\n }\n } catch (error) {\n throw new Error(`Failed to convert rule node to specification: ${error}`);\n }\n }\n\n /**\n * Converts a Specification instance to a RuleNode tree\n */\n specificationToRuleNode<T extends object = any>(\n spec: Specification<T>,\n ): RuleNode {\n const specJson = spec.toJSON();\n return this.jsonToRuleNode(specJson);\n }\n\n /**\n * Exports a RuleNode tree to DSL format\n */\n exportToDsl<T extends object = any>(\n node: RuleNode,\n options?: Partial<ExportOptions>,\n ): string {\n if (options) {\n this.dslExporter = new DslExporter(options);\n }\n\n const specification = this.ruleNodeToSpecification<T>(node);\n return this.dslExporter.export(specification);\n }\n\n /**\n * Exports a RuleNode tree to DSL format with metadata\n */\n exportToDslWithMetadata<T extends object = any>(node: RuleNode): string {\n const specification = this.ruleNodeToSpecification<T>(node);\n return this.dslExporter.exportWithMetadata(specification);\n }\n\n /**\n * Validates that a RuleNode can be successfully round-tripped\n */\n validateRoundTrip<T extends object = any>(\n node: RuleNode,\n ): {\n success: boolean;\n errors: string[];\n warnings: string[];\n } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n // Convert to specification\n const specification = this.ruleNodeToSpecification<T>(node);\n\n // Export to DSL and re-parse\n const dsl = this.exportToDsl<T>(node);\n\n // Convert back to rule node via specification\n const reconstructedNode = this.specificationToRuleNode(specification);\n\n // Deep validation\n const deepValidation = this.deepValidateRoundTrip(\n node,\n reconstructedNode,\n );\n errors.push(...deepValidation.errors);\n warnings.push(...deepValidation.warnings);\n\n // DSL round-trip validation\n try {\n const dslValidation = this.validateDslRoundTrip(dsl, node);\n warnings.push(...dslValidation.warnings);\n } catch (dslError) {\n warnings.push(`DSL round-trip validation failed: ${dslError}`);\n }\n\n return {\n success: errors.length === 0,\n errors,\n warnings,\n };\n } catch (error) {\n errors.push(`Round-trip validation failed: ${error}`);\n return {\n success: false,\n errors,\n warnings,\n };\n }\n }\n\n /**\n * Performs deep validation between original and reconstructed nodes\n */\n private deepValidateRoundTrip(\n original: RuleNode,\n reconstructed: RuleNode,\n ): {\n errors: string[];\n warnings: string[];\n } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Type validation\n if (original.type !== reconstructed.type) {\n errors.push(\n `Node type mismatch: ${original.type} vs ${reconstructed.type}`,\n );\n }\n\n // Label validation\n if (original.label !== reconstructed.label) {\n warnings.push(\n `Label changed: \"${original.label}\" vs \"${reconstructed.label}\"`,\n );\n }\n\n // Config validation\n if (original.config && reconstructed.config) {\n const configComparison = this.compareConfigs(\n original.config,\n reconstructed.config,\n );\n errors.push(...configComparison.errors);\n warnings.push(...configComparison.warnings);\n } else if (original.config !== reconstructed.config) {\n warnings.push('Configuration presence mismatch');\n }\n\n // Metadata validation\n if (original.metadata && reconstructed.metadata) {\n if (original.metadata.code !== reconstructed.metadata.code) {\n warnings.push('Metadata code changed during round-trip');\n }\n if (original.metadata.message !== reconstructed.metadata.message) {\n warnings.push('Metadata message changed during round-trip');\n }\n if (\n original.metadata['severity'] !== reconstructed.metadata['severity']\n ) {\n warnings.push('Metadata severity changed during round-trip');\n }\n } else if (!!original.metadata !== !!reconstructed.metadata) {\n warnings.push('Metadata presence changed during round-trip');\n }\n\n // Children validation\n const originalChildCount = original.children?.length || 0;\n const reconstructedChildCount = reconstructed.children?.length || 0;\n\n if (originalChildCount !== reconstructedChildCount) {\n errors.push(\n `Child count mismatch: ${originalChildCount} vs ${reconstructedChildCount}`,\n );\n } else if (original.children && reconstructed.children) {\n // Recursively validate children\n for (let i = 0; i < original.children.length; i++) {\n const originalChild = original.children[i];\n const reconstructedChild = reconstructed.children[i];\n\n if (\n typeof originalChild === 'object' &&\n typeof reconstructedChild === 'object'\n ) {\n const childValidation = this.deepValidateRoundTrip(\n originalChild as RuleNode,\n reconstructedChild as RuleNode,\n );\n errors.push(...childValidation.errors.map((e) => `Child ${i}: ${e}`));\n warnings.push(\n ...childValidation.warnings.map((w) => `Child ${i}: ${w}`),\n );\n }\n }\n }\n\n return { errors, warnings };\n }\n\n /**\n * Compares two configuration objects\n */\n private compareConfigs(\n config1: any,\n config2: any,\n ): {\n errors: string[];\n warnings: string[];\n } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n const config1Json = JSON.stringify(config1, Object.keys(config1).sort());\n const config2Json = JSON.stringify(config2, Object.keys(config2).sort());\n\n if (config1Json !== config2Json) {\n warnings.push('Configuration values changed during round-trip');\n }\n } catch (error) {\n warnings.push(`Failed to compare configurations: ${error}`);\n }\n\n return { errors, warnings };\n }\n\n /**\n * Validates DSL round-trip conversion\n */\n private validateDslRoundTrip(\n dsl: string,\n originalNode: RuleNode,\n ): {\n warnings: string[];\n } {\n const warnings: string[] = [];\n\n // Basic DSL validation\n if (!dsl || dsl.trim().length === 0) {\n warnings.push('DSL export resulted in empty string');\n return { warnings };\n }\n\n // Check for expected keywords based on node type\n const expectedKeywords = this.getExpectedDslKeywords(originalNode);\n for (const keyword of expectedKeywords) {\n if (!dsl.includes(keyword)) {\n warnings.push(`Expected DSL keyword '${keyword}' not found in output`);\n }\n }\n\n return { warnings };\n }\n\n // ===== Phase 4: Expression and Contextual Specification Support =====\n\n /**\n * Parses a DSL expression string into a Specification\n */\n parseDslExpression<T extends object = any>(\n expression: string,\n config?: DslParsingConfig,\n ): DslParsingResult<T> {\n const startTime = performance.now();\n const issues: ValidationIssue[] = [];\n\n try {\n // Configure parser and validator\n if (config?.functionRegistry) {\n this.dslParser = new DslParser<T>(config.functionRegistry);\n }\n\n if (\n config?.knownFields ||\n config?.enablePerformanceWarnings !== undefined ||\n config?.maxComplexity\n ) {\n this.dslValidator = new DslValidator({\n knownFields: config?.knownFields || [],\n enablePerformanceWarnings: config?.enablePerformanceWarnings ?? true,\n maxComplexity: config?.maxComplexity || 50,\n functionRegistry: config?.functionRegistry,\n });\n }\n\n // Validate the expression first\n const validationIssues = this.dslValidator.validate(expression);\n issues.push(...validationIssues);\n\n // Check for errors that would prevent parsing\n const hasErrors = validationIssues.some(\n (issue: ValidationIssue) => issue.severity === 'error',\n );\n if (hasErrors) {\n return {\n success: false,\n issues,\n metrics: {\n parseTime: performance.now() - startTime,\n complexity: this.calculateComplexity(expression),\n },\n };\n }\n\n // Parse the expression\n const specification = this.dslParser.parse(expression);\n const parseTime = performance.now() - startTime;\n\n return {\n success: true,\n specification,\n issues,\n metrics: {\n parseTime,\n complexity: this.calculateComplexity(expression),\n },\n };\n } catch (error) {\n issues.push({\n type: 'SyntaxError' as any,\n severity: 'error' as any,\n message: `Parse error: ${error}`,\n position: { start: 0, end: expression.length, line: 1, column: 1 },\n });\n\n return {\n success: false,\n issues,\n metrics: {\n parseTime: performance.now() - startTime,\n complexity: this.calculateComplexity(expression),\n },\n };\n }\n }\n\n /**\n * Creates a ContextualSpecification with token resolution\n */\n createContextualSpecification<T extends object = any>(\n template: string,\n config?: SpecificationContextualConfig,\n ): ContextualSpecification<T> {\n const contextProvider =\n config?.contextProvider ||\n this.createContextProviderFromVariables(config?.contextVariables || []);\n\n if (config?.strictContextValidation) {\n this.validateContextTokens(template, config.contextVariables || []);\n }\n\n return SpecificationFactory.contextual<T>(template, contextProvider);\n }\n\n /**\n * Resolves context tokens in a template using provided variables\n */\n resolveContextTokens(\n template: string,\n contextVariables: ContextVariable[],\n ): string {\n const contextProvider =\n this.createContextProviderFromVariables(contextVariables);\n const contextualSpec = new ContextualSpecification(\n template,\n contextProvider,\n );\n\n // Create a dummy object to resolve tokens against\n const dummyObj = {};\n return contextualSpec.resolveTokens(template, dummyObj);\n }\n\n /**\n * Extracts all context tokens from a template\n */\n extractContextTokens(template: string): string[] {\n const contextualSpec = new ContextualSpecification(template);\n return contextualSpec.getTokens();\n }\n\n /**\n * Validates that all context tokens in a template have corresponding variables\n */\n validateContextTokens(\n template: string,\n contextVariables: ContextVariable[],\n ): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const tokens = this.extractContextTokens(template);\n const variableNames = contextVariables.map((v) => v.name);\n\n for (const token of tokens) {\n if (!variableNames.includes(token)) {\n issues.push({\n type: 'InvalidFieldReference' as any,\n severity: 'warning' as any,\n message: `Unknown context variable: ${token}`,\n position: this.findTokenPosition(template, token),\n suggestion: this.suggestSimilarVariable(token, variableNames),\n help: `Available variables: ${variableNames.join(', ')}`,\n });\n }\n }\n\n return issues;\n }\n\n /**\n * Converts a DSL expression to a ContextualSpecification\n */\n dslToContextualSpecification<T extends object = any>(\n dslExpression: string,\n config?: SpecificationContextualConfig,\n ): ContextualSpecification<T> {\n // Validate that the DSL contains context tokens\n const tokens = this.extractContextTokens(dslExpression);\n if (tokens.length === 0) {\n throw new Error(\n 'DSL expression does not contain context tokens (${...})',\n );\n }\n\n return this.createContextualSpecification<T>(dslExpression, config);\n }\n\n /**\n * Converts a ContextualSpecification back to DSL template\n */\n contextualSpecificationToDsl<T extends object = any>(\n spec: ContextualSpecification<T>,\n ): string {\n return spec.toDSL();\n }\n\n /**\n * Performs round-trip validation for expression specifications\n */\n validateExpressionRoundTrip<T extends object = any>(\n originalExpression: string,\n config?: DslParsingConfig,\n ): {\n success: boolean;\n errors: string[];\n warnings: string[];\n reconstructedExpression?: string;\n } {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n try {\n // Parse the original expression\n const parseResult = this.parseDslExpression<T>(\n originalExpression,\n config,\n );\n\n if (!parseResult.success || !parseResult.specification) {\n errors.push('Failed to parse original expression');\n parseResult.issues.forEach((issue) => {\n if (issue.severity === 'error') {\n errors.push(issue.message);\n } else {\n warnings.push(issue.message);\n }\n });\n\n return { success: false, errors, warnings };\n }\n\n // Export back to DSL\n const reconstructedExpression = parseResult.specification.toDSL();\n\n // Parse the reconstructed expression\n const reconstructedParseResult = this.parseDslExpression<T>(\n reconstructedExpression,\n config,\n );\n\n if (!reconstructedParseResult.success) {\n errors.push('Failed to parse reconstructed expression');\n return { success: false, errors, warnings, reconstructedExpression };\n }\n\n // Compare the specifications\n const originalJson = JSON.stringify(parseResult.specification.toJSON());\n const reconstructedJson = JSON.stringify(\n reconstructedParseResult.specification!.toJSON(),\n );\n\n if (originalJson !== reconstructedJson) {\n warnings.push('Specification structure changed during round-trip');\n }\n\n return {\n success: errors.length === 0,\n errors,\n warnings,\n reconstructedExpression,\n };\n } catch (error) {\n errors.push(`Round-trip validation failed: ${error}`);\n return { success: false, errors, warnings };\n }\n }\n\n /**\n * Updates the context provider for contextual specifications\n */\n updateContextProvider(contextProvider: ContextProvider): void {\n this.contextProvider = contextProvider;\n }\n\n /**\n * Gets the current context provider\n */\n getContextProvider(): ContextProvider | undefined {\n return this.contextProvider;\n }\n\n /**\n * Gets expected DSL keywords for a given node type\n */\n private getExpectedDslKeywords(node: RuleNode): string[] {\n const keywords: string[] = [];\n\n switch (node.type) {\n case 'fieldCondition':\n const config = node.config as any;\n const fieldName = config?.field || config?.fieldName;\n if (fieldName) {\n keywords.push(fieldName as string);\n }\n if (config?.operator) {\n keywords.push(config.operator as string);\n }\n break;\n\n case 'andGroup':\n case 'orGroup':\n case 'notGroup':\n const boolConfig = node.config as any;\n if (boolConfig?.operator) {\n keywords.push((boolConfig.operator as string).toUpperCase());\n }\n break;\n\n case 'functionCall':\n const funcConfig = node.config as any;\n if (funcConfig?.functionName) {\n keywords.push(funcConfig.functionName as string);\n }\n break;\n }\n\n return keywords;\n }\n\n private createFieldSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n const config = node.config as any;\n const fieldName = config?.field || config?.fieldName;\n\n if (!fieldName || !config?.operator) {\n throw new Error('Field specification requires field and operator');\n }\n\n // Handle unary operators commonly produced by the visual builder\n // by coercing them to EQUALS with an implied value\n let op = String(config.operator);\n let impliedValue: any = undefined;\n switch (op.toLowerCase()) {\n case 'istrue':\n impliedValue = true;\n op = 'equals';\n break;\n case 'isfalse':\n impliedValue = false;\n op = 'equals';\n break;\n case 'isempty':\n impliedValue = '';\n op = 'equals';\n break;\n case 'isnotempty':\n impliedValue = '';\n op = 'notequals';\n break;\n }\n\n // After normalization, require either an explicit value or impliedValue\n if (config.value === undefined && impliedValue === undefined) {\n throw new Error('Field specification requires a value for the operator');\n }\n\n const field = fieldName as keyof T;\n const operator = this.convertToComparisonOperator(op);\n const baseValue = impliedValue !== undefined ? impliedValue : config.value;\n const value = this.convertValue(baseValue, config.valueType);\n\n let spec: Specification<T>;\n if (node.metadata) {\n spec = SpecificationFactory.fieldWithMetadata<T>(\n field,\n operator,\n value,\n node.metadata,\n );\n } else {\n spec = SpecificationFactory.field<T>(field, operator, value);\n }\n\n return spec;\n }\n\n private createBooleanGroupSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n if (!node.children || node.children.length === 0) {\n throw new Error('Boolean group requires children');\n }\n\n // Resolve children nodes using the registry\n const childNodes = this.nodeRegistry.resolveChildren(node);\n const childSpecs = childNodes.map((child) =>\n this.ruleNodeToSpecification<T>(child),\n );\n const booleanConfig = node.config as any;\n const operator = booleanConfig?.operator || 'and';\n\n switch (operator.toLowerCase()) {\n case 'and':\n return SpecificationFactory.and<T>(...childSpecs);\n\n case 'or':\n return SpecificationFactory.or<T>(...childSpecs);\n\n case 'not':\n if (childSpecs.length !== 1) {\n throw new Error('NOT operator requires exactly one child');\n }\n return SpecificationFactory.not<T>(childSpecs[0]);\n\n case 'xor':\n return SpecificationFactory.xor<T>(...childSpecs);\n\n case 'implies':\n if (childSpecs.length !== 2) {\n throw new Error('IMPLIES operator requires exactly two children');\n }\n return SpecificationFactory.implies<T>(childSpecs[0], childSpecs[1]);\n\n default:\n throw new Error(`Unsupported boolean operator: ${operator}`);\n }\n }\n\n private createFunctionSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n const functionConfig = node.config as any;\n if (!functionConfig?.functionName) {\n throw new Error('Function specification requires functionName');\n }\n\n const functionName = functionConfig.functionName;\n const parameters = functionConfig.parameters || [];\n\n // Convert parameters to function arguments\n const args = parameters.map((param: FunctionParameter) => {\n return this.convertValue(param.value, param.valueType);\n });\n\n return SpecificationFactory.func<T>(functionName, args);\n }\n\n private createFieldToFieldSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n const fieldConfig = node.config as any;\n if (\n !fieldConfig?.fieldA ||\n !fieldConfig?.fieldB ||\n !fieldConfig?.operator\n ) {\n throw new Error(\n 'Field-to-field specification requires fieldA, fieldB, and operator',\n );\n }\n\n const fieldA = fieldConfig.fieldA as keyof T;\n const fieldB = fieldConfig.fieldB as keyof T;\n const operator = this.convertToComparisonOperator(fieldConfig.operator);\n const transformA = fieldConfig.transformA;\n const transformB = fieldConfig.transformB;\n\n return SpecificationFactory.fieldToField<T>(\n fieldA,\n operator,\n fieldB,\n transformA,\n transformB,\n );\n }\n\n private createCardinalitySpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n if (!node.children || node.children.length === 0 || !node.config) {\n throw new Error('Cardinality specification requires children and config');\n }\n\n // Resolve children nodes using the registry\n const childNodes = this.nodeRegistry.resolveChildren(node);\n const childSpecs = childNodes.map((child) =>\n this.ruleNodeToSpecification<T>(child),\n );\n const config = node.config as CardinalityConfig;\n\n switch (config.cardinalityType) {\n case 'atLeast':\n return SpecificationFactory.atLeast<T>(config.count, childSpecs);\n\n case 'exactly':\n return SpecificationFactory.exactly<T>(config.count, childSpecs);\n\n default:\n throw new Error(\n `Unsupported cardinality type: ${config.cardinalityType}`,\n );\n }\n }\n\n /**\n * Creates conditional validator specifications (Phase 1 implementation)\n */\n private createConditionalValidatorSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n if (!node.config || !['requiredIf', 'visibleIf', 'disabledIf', 'readonlyIf'].includes(node.config.type)) {\n throw new Error(\n 'Conditional validator specification requires conditional validator config',\n );\n }\n\n const config = node.config as ConditionalValidatorConfig;\n\n if (!config.targetField) {\n throw new Error('Conditional validator requires targetField');\n }\n\n // Aceita tanto 'condition' única quanto 'conditions' (lista)\n let conditionSpec: Specification<T> | null = null;\n\n // Helper para transformar uma condição simples em Specification\n const toSpecFromCondition = (c: any): Specification<T> => {\n // Se já vier como RuleNode, converte via bridge\n if (c && typeof c === 'object' && 'type' in c && 'id' in c) {\n return this.ruleNodeToSpecification<T>(c as RuleNode);\n }\n // Se for um config simples de fieldCondition, embrulha em RuleNode temporário\n if (c && typeof c === 'object' && c.type === 'fieldCondition') {\n const tempNode: RuleNode = {\n id: this.generateNodeId(),\n type: 'fieldCondition' as any,\n config: c,\n } as any;\n return this.createFieldSpecification<T>(tempNode);\n }\n // Caso não reconhecido\n throw new Error('Unsupported condition format');\n };\n\n if ((config as any).condition) {\n try {\n conditionSpec = toSpecFromCondition((config as any).condition);\n } catch {\n conditionSpec = null;\n }\n } else if (config.conditions && config.conditions.length > 0) {\n const specs = config.conditions.map((c: any) => toSpecFromCondition(c));\n const op = (config.logicOperator || 'and').toLowerCase();\n switch (op) {\n case 'and':\n conditionSpec = SpecificationFactory.and<T>(...specs);\n break;\n case 'or':\n conditionSpec = SpecificationFactory.or<T>(...specs);\n break;\n case 'not':\n conditionSpec = specs.length === 1 ? SpecificationFactory.not<T>(specs[0]) : SpecificationFactory.and<T>(...specs);\n break;\n case 'xor':\n conditionSpec = SpecificationFactory.xor<T>(...specs);\n break;\n default:\n conditionSpec = SpecificationFactory.and<T>(...specs);\n }\n }\n\n // Aplicar inversão, se solicitado\n const finalConditionSpec = config.inverse && conditionSpec\n ? SpecificationFactory.not<T>(conditionSpec)\n : conditionSpec;\n\n const targetField = config.targetField as keyof T;\n const metadata = config.metadata;\n\n // Placeholder genérico até haver suporte nativo no @praxisui/specification\n let spec: Specification<T>;\n switch (config.validatorType) {\n case 'requiredIf':\n spec = SpecificationFactory.field<T>(\n targetField,\n ComparisonOperator.EQUALS,\n true,\n );\n break;\n\n case 'visibleIf':\n spec = SpecificationFactory.field<T>(\n targetField,\n ComparisonOperator.EQUALS,\n true,\n );\n break;\n\n case 'disabledIf':\n spec = SpecificationFactory.field<T>(\n targetField,\n ComparisonOperator.EQUALS,\n true,\n );\n break;\n\n case 'readonlyIf':\n spec = SpecificationFactory.field<T>(\n targetField,\n ComparisonOperator.EQUALS,\n true,\n );\n break;\n\n default:\n throw new Error(\n `Unsupported conditional validator type: ${config.validatorType}`,\n );\n }\n\n return spec;\n }\n\n /**\n * Creates collection validator specifications (Phase 2 implementation)\n */\n private createCollectionValidatorSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n if (!node.config || !('type' in node.config)) {\n throw new Error('Collection validator specification requires config');\n }\n\n const config = node.config as CollectionValidatorConfig;\n\n if (!config.targetCollection) {\n throw new Error('Collection validator requires targetCollection');\n }\n\n const targetField = config.targetCollection as keyof T;\n\n // Create the appropriate collection validator specification\n // Note: Using placeholder implementations until @praxisui/specification adds native support\n let spec: Specification<T>;\n\n switch (node.type) {\n case 'forEach':\n // ForEach implementation placeholder\n // Would iterate through array items and apply validation rules\n if (\n !config.itemValidationRules ||\n config.itemValidationRules.length === 0\n ) {\n throw new Error(\n 'ForEach validator requires at least one validation rule',\n );\n }\n\n // Create a placeholder that checks array exists\n spec = SpecificationFactory.field<T>(\n targetField,\n ComparisonOperator.NOT_EQUALS,\n null,\n );\n break;\n\n case 'uniqueBy':\n // UniqueBy implementation placeholder\n // Would check uniqueness based on specified fields\n if (!config.uniqueByFields || config.uniqueByFields.length === 0) {\n throw new Error('UniqueBy validator requires at least one field');\n }\n\n // Create a placeholder that checks array exists\n spec = SpecificationFactory.field<T>(\n targetField,\n ComparisonOperator.NOT_EQUALS,\n null,\n );\n break;\n\n case 'minLength':\n // MinLength implementation placeholder\n // Would check array has minimum number of items\n if (config.minItems === undefined) {\n throw new Error('MinLength validator requires minItems value');\n }\n\n // Create a placeholder that checks array exists\n spec = SpecificationFactory.field<T>(\n targetField,\n ComparisonOperator.NOT_EQUALS,\n null,\n );\n break;\n\n case 'maxLength':\n // MaxLength implementation placeholder\n // Would check array doesn't exceed maximum items\n if (config.maxItems === undefined) {\n throw new Error('MaxLength validator requires maxItems value');\n }\n\n // Create a placeholder that checks array exists\n spec = SpecificationFactory.field<T>(\n targetField,\n ComparisonOperator.NOT_EQUALS,\n null,\n );\n break;\n\n default:\n throw new Error(`Unsupported collection validator type: ${node.type}`);\n }\n\n return spec;\n }\n\n /**\n * Creates expression specification from DSL (Phase 4 implementation)\n */\n private createExpressionSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n if (!node.config || !('expression' in node.config)) {\n throw new Error('Expression specification requires expression in config');\n }\n\n const config = node.config as any;\n const expression = config.expression as string;\n\n if (!expression || expression.trim().length === 0) {\n throw new Error('Expression specification requires non-empty expression');\n }\n\n // Parse the DSL expression using the bridge service\n const parseConfig: DslParsingConfig = {\n functionRegistry: config.functionRegistry,\n contextProvider: config.contextProvider,\n knownFields: config.knownFields || [],\n enablePerformanceWarnings: config.enablePerformanceWarnings ?? true,\n maxComplexity: config.maxComplexity || 50,\n };\n\n const parseResult = this.parseDslExpression<T>(expression, parseConfig);\n\n if (!parseResult.success || !parseResult.specification) {\n const errorMessages = parseResult.issues\n .filter((issue) => issue.severity === 'error')\n .map((issue) => issue.message)\n .join('; ');\n\n throw new Error(\n `Failed to parse DSL expression: ${errorMessages || 'Unknown parsing error'}`,\n );\n }\n\n return parseResult.specification;\n }\n\n /**\n * Creates contextual specification (Phase 4 implementation)\n */\n private createContextualSpecificationFromNode<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n if (!node.config || !('template' in node.config)) {\n throw new Error('Contextual specification requires template in config');\n }\n\n const config = node.config as any;\n const template = config.template as string;\n\n if (!template || template.trim().length === 0) {\n throw new Error('Contextual specification requires non-empty template');\n }\n\n // Validate that the template contains context tokens\n const tokens = this.extractContextTokens(template);\n if (tokens.length === 0) {\n throw new Error(\n 'Contextual specification template must contain at least one context token (${...})',\n );\n }\n\n const contextualConfig: SpecificationContextualConfig = {\n contextVariables: config.contextVariables || [],\n contextProvider: config.contextProvider,\n strictContextValidation: config.strictContextValidation ?? false,\n };\n\n return this.createContextualSpecification<T>(template, contextualConfig);\n }\n\n private convertToComparisonOperator(operator: string): ComparisonOperator {\n switch (operator.toLowerCase()) {\n case 'istrue':\n return ComparisonOperator.EQUALS;\n case 'isfalse':\n return ComparisonOperator.EQUALS;\n case 'equals':\n case '==':\n case '=':\n return ComparisonOperator.EQUALS;\n\n case 'notequals':\n case '!=':\n case '<>':\n return ComparisonOperator.NOT_EQUALS;\n\n case 'greaterthan':\n case '>':\n return ComparisonOperator.GREATER_THAN;\n\n case 'greaterthanorequal':\n case '>=':\n return ComparisonOperator.GREATER_THAN_OR_EQUAL;\n\n case 'lessthan':\n case '<':\n return ComparisonOperator.LESS_THAN;\n\n case 'lessthanorequal':\n case '<=':\n return ComparisonOperator.LESS_THAN_OR_EQUAL;\n\n case 'contains':\n return ComparisonOperator.CONTAINS;\n\n case 'startswith':\n return ComparisonOperator.STARTS_WITH;\n\n case 'endswith':\n return ComparisonOperator.ENDS_WITH;\n\n case 'in':\n return ComparisonOperator.IN;\n\n case 'notin':\n return ComparisonOperator.NOT_EQUALS; // Using NOT_EQUALS as fallback for NOT_IN\n\n case 'isnull':\n return ComparisonOperator.EQUALS; // Using EQUALS for IS_NULL check\n\n case 'isnotnull':\n return ComparisonOperator.NOT_EQUALS; // Using NOT_EQUALS for IS_NOT_NULL check\n\n case 'isempty':\n return ComparisonOperator.EQUALS;\n case 'isnotempty':\n return ComparisonOperator.NOT_EQUALS;\n\n default:\n throw new Error(`Unsupported comparison operator: ${operator}`);\n }\n }\n\n private convertValue(value: any, valueType?: ValueType): any {\n if (!valueType) {\n return value;\n }\n\n switch (valueType) {\n case 'literal':\n return value;\n\n case 'field':\n return `@${value}`; // Field reference prefix\n\n case 'context':\n return `$${value}`; // Context reference prefix\n\n case 'function':\n return value; // Function calls are handled separately\n\n default:\n return value;\n }\n }\n\n private jsonToRuleNode(json: any): RuleNode {\n const baseNode: RuleNode = {\n id: this.generateNodeId(),\n type: this.mapSpecificationTypeToNodeType(json.type),\n label: this.generateNodeLabel(json),\n config: undefined,\n metadata: json.metadata,\n children: [],\n };\n\n switch (json.type) {\n case 'field':\n baseNode.config = {\n type: 'fieldCondition',\n field: json.field,\n fieldName: json.field,\n operator: this.mapComparisonOperator(json.operator),\n value: json.value,\n valueType: this.inferValueType(json.value),\n } as FieldConditionConfig;\n break;\n\n case 'and':\n case 'or':\n case 'xor':\n baseNode.config = {\n type: 'booleanGroup',\n operator: json.type,\n } as BooleanGroupConfig;\n const childNodes = json.specs.map((spec: any) =>\n this.jsonToRuleNode(spec),\n );\n baseNode.children = childNodes.map((child: RuleNode) => child.id);\n break;\n\n case 'not':\n baseNode.config = {\n type: 'booleanGroup',\n operator: 'not',\n } as BooleanGroupConfig;\n const childNode = this.jsonToRuleNode(json.spec);\n baseNode.children = [childNode.id];\n break;\n\n case 'implies':\n baseNode.config = {\n type: 'booleanGroup',\n operator: 'implies',\n } as BooleanGroupConfig;\n const antecedent = this.jsonToRuleNode(json.antecedent);\n const consequent = this.jsonToRuleNode(json.consequent);\n baseNode.children = [antecedent.id, consequent.id];\n break;\n\n case 'function':\n baseNode.config = {\n type: 'functionCall',\n functionName: json.name,\n parameters: json.args.map((arg: any, index: number) => ({\n name: `param${index}`,\n value: arg,\n valueType: this.inferValueType(arg),\n })),\n } as FunctionCallConfig;\n break;\n\n case 'fieldToField':\n baseNode.config = {\n type: 'fieldToField',\n leftField: json.fieldA,\n rightField: json.fieldB,\n operator: this.mapComparisonOperator(json.operator),\n leftTransforms: json.transformA ? [json.transformA] : [],\n rightTransforms: json.transformB ? [json.transformB] : [],\n } as FieldToFieldConfig;\n break;\n\n case 'atLeast':\n baseNode.config = {\n type: 'cardinality',\n cardinalityType: 'atLeast',\n count: json.minimum || json.count,\n conditions: [],\n };\n baseNode.children = json.specs.map((spec: any) =>\n this.jsonToRuleNode(spec),\n );\n break;\n\n case 'exactly':\n baseNode.config = {\n type: 'cardinality',\n cardinalityType: 'exactly',\n count: json.exact || json.count,\n conditions: [],\n };\n baseNode.children = json.specs.map((spec: any) =>\n this.jsonToRuleNode(spec),\n );\n break;\n\n // Phase 1: Conditional Validators\n case 'requiredIf':\n case 'visibleIf':\n case 'disabledIf':\n case 'readonlyIf':\n baseNode.config = {\n type: json.type as 'requiredIf' | 'visibleIf' | 'disabledIf' | 'readonlyIf',\n validatorType: json.type,\n targetField: json.targetField,\n condition: this.jsonToRuleNode(json.condition),\n inverse: json.inverse || false,\n };\n break;\n\n // Phase 2: Collection Validators\n case 'forEach':\n baseNode.config = {\n type: 'forEach',\n targetCollection: json.targetCollection,\n itemVariable: json.itemVariable || 'item',\n indexVariable: json.indexVariable || 'index',\n itemValidationRules: json.itemValidationRules || [],\n };\n break;\n\n case 'uniqueBy':\n baseNode.config = {\n type: 'uniqueBy',\n targetCollection: json.targetCollection,\n uniqueByFields: json.uniqueByFields || [],\n caseSensitive: json.caseSensitive !== false,\n ignoreEmpty: json.ignoreEmpty !== false,\n duplicateErrorMessage: json.duplicateErrorMessage,\n };\n break;\n\n case 'minLength':\n baseNode.config = {\n type: 'minLength',\n targetCollection: json.targetCollection,\n minItems: json.minItems,\n lengthErrorMessage: json.lengthErrorMessage,\n showItemCount: json.showItemCount !== false,\n };\n break;\n\n case 'maxLength':\n baseNode.config = {\n type: 'maxLength',\n targetCollection: json.targetCollection,\n maxItems: json.maxItems,\n lengthErrorMessage: json.lengthErrorMessage,\n preventExcess: json.preventExcess !== false,\n };\n break;\n\n // Phase 4: Expression and Contextual Specifications\n case 'expression':\n baseNode.config = {\n type: 'expression',\n expression: json.expression || json.dsl || '',\n functionRegistry: json.functionRegistry,\n contextProvider: json.contextProvider,\n knownFields: json.knownFields || [],\n enablePerformanceWarnings: json.enablePerformanceWarnings ?? true,\n maxComplexity: json.maxComplexity || 50,\n };\n break;\n\n case 'contextual':\n baseNode.config = {\n type: 'contextual',\n template: json.template,\n contextVariables: json.contextVariables || [],\n contextProvider: json.contextProvider,\n strictContextValidation: json.strictContextValidation ?? false,\n };\n break;\n }\n\n return baseNode;\n }\n\n private mapSpecificationTypeToNodeType(specType: string): RuleNodeType {\n switch (specType) {\n case 'field':\n return RuleNodeType.FIELD_CONDITION;\n case 'and':\n return RuleNodeType.AND_GROUP;\n case 'or':\n return RuleNodeType.OR_GROUP;\n case 'not':\n return RuleNodeType.NOT_GROUP;\n case 'xor':\n return RuleNodeType.XOR_GROUP;\n case 'implies':\n return RuleNodeType.IMPLIES_GROUP;\n case 'function':\n return RuleNodeType.FUNCTION_CALL;\n case 'fieldToField':\n return RuleNodeType.FIELD_TO_FIELD;\n case 'atLeast':\n return RuleNodeType.AT_LEAST;\n case 'exactly':\n return RuleNodeType.EXACTLY;\n // Phase 1: Conditional Validators\n case 'requiredIf':\n return RuleNodeType.REQUIRED_IF;\n case 'visibleIf':\n return RuleNodeType.VISIBLE_IF;\n case 'disabledIf':\n return RuleNodeType.DISABLED_IF;\n case 'readonlyIf':\n return RuleNodeType.READONLY_IF;\n // Phase 2: Collection Validators\n case 'forEach':\n return RuleNodeType.FOR_EACH;\n case 'uniqueBy':\n return RuleNodeType.UNIQUE_BY;\n case 'minLength':\n return RuleNodeType.MIN_LENGTH;\n case 'maxLength':\n return RuleNodeType.MAX_LENGTH;\n // Phase 4: Expression and Contextual Specifications\n case 'expression':\n return RuleNodeType.EXPRESSION;\n case 'contextual':\n return RuleNodeType.CONTEXTUAL;\n default:\n return RuleNodeType.FIELD_CONDITION; // fallback\n }\n }\n\n private mapComparisonOperator(operator: ComparisonOperator): string {\n switch (operator) {\n case ComparisonOperator.EQUALS:\n return 'equals';\n case ComparisonOperator.NOT_EQUALS:\n return 'notEquals';\n case ComparisonOperator.GREATER_THAN:\n return 'greaterThan';\n case ComparisonOperator.GREATER_THAN_OR_EQUAL:\n return 'greaterThanOrEqual';\n case ComparisonOperator.LESS_THAN:\n return 'lessThan';\n case ComparisonOperator.LESS_THAN_OR_EQUAL:\n return 'lessThanOrEqual';\n case ComparisonOperator.CONTAINS:\n return 'contains';\n case ComparisonOperator.STARTS_WITH:\n return 'startsWith';\n case ComparisonOperator.ENDS_WITH:\n return 'endsWith';\n case ComparisonOperator.IN:\n return 'in';\n // Note: NOT_IN, IS_NULL, IS_NOT_NULL are not available in @praxisui/specification ComparisonOperator enum\n // These would need to be handled as custom functions or additional operators\n default:\n return 'equals';\n }\n }\n\n private inferValueType(value: any): ValueType {\n if (typeof value === 'string') {\n if (value.startsWith('@')) {\n return 'field';\n }\n if (value.startsWith('$')) {\n return 'context';\n }\n }\n return 'literal';\n }\n\n private generateNodeId(): string {\n return `node_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private generateNodeLabel(json: any): string {\n switch (json.type) {\n case 'field':\n return `${json.field} ${this.mapComparisonOperator(json.operator)} ${json.value}`;\n case 'and':\n return 'AND Group';\n case 'or':\n return 'OR Group';\n case 'not':\n return 'NOT';\n case 'xor':\n return 'XOR Group';\n case 'implies':\n return 'IMPLIES';\n case 'function':\n return `${json.name}()`;\n case 'fieldToField':\n return `${json.fieldA} ${this.mapComparisonOperator(json.operator)} ${json.fieldB}`;\n case 'atLeast':\n return `At Least ${json.minimum}`;\n case 'exactly':\n return `Exactly ${json.exact}`;\n // Phase 1: Conditional Validators\n case 'requiredIf':\n return `Required If: ${json.targetField}`;\n case 'visibleIf':\n return `Visible If: ${json.targetField}`;\n case 'disabledIf':\n return `Disabled If: ${json.targetField}`;\n case 'readonlyIf':\n return `Readonly If: ${json.targetField}`;\n // Phase 2: Collection Validators\n case 'forEach':\n return `For Each: ${json.targetCollection}`;\n case 'uniqueBy':\n const uniqueFields = json.uniqueByFields\n ? json.uniqueByFields.join(', ')\n : '';\n return `Unique By: ${uniqueFields}`;\n case 'minLength':\n return `Min Length: ${json.minItems} items`;\n case 'maxLength':\n return `Max Length: ${json.maxItems} items`;\n // Phase 4: Expression and Contextual\n case 'expression':\n return `Expression: ${json.expression || 'DSL'}`;\n case 'contextual':\n return `Contextual: ${json.template || 'Template'}`;\n default:\n return 'Rule';\n }\n }\n\n // ===== Phase 4: Helper Methods =====\n\n /**\n * Creates a context provider from context variables\n */\n private createContextProviderFromVariables(\n variables: ContextVariable[],\n ): ContextProvider {\n const variableMap = new Map<string, any>();\n\n for (const variable of variables) {\n let value: any = variable.example;\n\n // Convert example to appropriate type\n if (value !== undefined && value !== null) {\n switch (variable.type) {\n case 'number':\n value = typeof value === 'string' ? parseFloat(value) : value;\n break;\n case 'boolean':\n value =\n typeof value === 'string'\n ? value.toLowerCase() === 'true'\n : Boolean(value);\n break;\n case 'date':\n value = typeof value === 'string' ? new Date(value) : value;\n break;\n case 'object':\n case 'array':\n value = typeof value === 'string' ? JSON.parse(value) : value;\n break;\n case 'string':\n default:\n value = String(value);\n break;\n }\n }\n\n variableMap.set(variable.name, value);\n }\n\n // Create a context provider implementation aligned with @praxisui/specification ContextProvider interface\n return {\n hasValue: (path: string) => variableMap.has(path),\n getValue: (path: string) => variableMap.get(path),\n };\n }\n\n /**\n * Calculates complexity of a DSL expression\n */\n private calculateComplexity(expression: string): number {\n // Simple complexity calculation based on operators and function calls\n const operators = ['&&', '||', '!', '==', '!=', '>', '<', '>=', '<=', 'in'];\n const functions = [\n 'contains',\n 'startsWith',\n 'endsWith',\n 'atLeast',\n 'exactly',\n ];\n\n let complexity = 1; // Base complexity\n\n // Count operators\n for (const operator of operators) {\n const matches = expression.split(operator).length - 1;\n complexity += matches;\n }\n\n // Count function calls\n for (const func of functions) {\n const regex = new RegExp(`\\\\b${func}\\\\s*\\\\(`, 'g');\n const matches = expression.match(regex);\n if (matches) {\n complexity += matches.length * 2; // Functions are more complex\n }\n }\n\n // Count parentheses nesting\n let depth = 0;\n let maxDepth = 0;\n for (const char of expression) {\n if (char === '(') {\n depth++;\n maxDepth = Math.max(maxDepth, depth);\n } else if (char === ')') {\n depth--;\n }\n }\n complexity += maxDepth;\n\n return complexity;\n }\n\n /**\n * Finds the position of a token in a template\n */\n private findTokenPosition(\n template: string,\n token: string,\n ): { start: number; end: number; line: number; column: number } {\n const tokenPattern = `\\${${token}}`;\n const index = template.indexOf(tokenPattern);\n\n if (index === -1) {\n return { start: 0, end: 0, line: 1, column: 1 };\n }\n\n // Calculate line and column\n let line = 1;\n let column = 1;\n\n for (let i = 0; i < index; i++) {\n if (template[i] === '\\n') {\n line++;\n column = 1;\n } else {\n column++;\n }\n }\n\n return {\n start: index,\n end: index + tokenPattern.length,\n line,\n column,\n };\n }\n\n /**\n * Suggests similar variable names using Levenshtein distance\n */\n private suggestSimilarVariable(\n target: string,\n availableVariables: string[],\n ): string | undefined {\n if (availableVariables.length === 0) return undefined;\n\n const similarities = availableVariables.map((variable) => ({\n variable,\n distance: this.levenshteinDistance(\n target.toLowerCase(),\n variable.toLowerCase(),\n ),\n }));\n\n similarities.sort((a, b) => a.distance - b.distance);\n\n // Only suggest if the distance is reasonable\n if (similarities[0].distance <= Math.max(2, target.length * 0.4)) {\n return `Did you mean \"${similarities[0].variable}\"?`;\n }\n\n return undefined;\n }\n\n /**\n * Calculates Levenshtein distance between two strings\n */\n private levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j] + 1,\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n }\n\n // ==============================================\n // Phase 1: Value Expressions (safe-ish shim)\n // ==============================================\n /**\n * Parses a value expression. Phase 1 shim: accepts strings starting with '=' or { expr } objects.\n * Returns success when the shape is acceptable; full DSL parsing will be integrated in Phase 2.\n */\n parseDslExpressionValue(\n expression: string | { expr: string } | null | undefined,\n _config?: DslParsingConfig,\n ): { success: boolean; issues: string[] } {\n const issues: string[] = [];\n if (expression == null) return { success: false, issues: ['Empty expression'] };\n const raw = typeof expression === 'object' ? expression.expr : String(expression);\n if (typeof raw !== 'string' || !raw.trim()) return { success: false, issues: ['Empty expression'] };\n // Accept shorthand starting with '=' or plain literal values ('icon'|'image'|'badge'|'text'/'none')\n const short = raw.trim();\n if (short.startsWith('=')) return { success: true, issues };\n const allowed = new Set(['icon', 'image', 'badge', 'text', 'none']);\n if (allowed.has(short)) return { success: true, issues };\n return { success: false, issues: ['Unsupported value expression format'] };\n }\n\n /**\n * Evaluates a value expression with a row context. Phase 1 shim: executes simple '=' expressions in a sandboxed Function.\n * In Phase 2, this will use the real DSL evaluator from @praxisui/specification.\n */\n evaluateValue(\n expression: string | { expr: string },\n ctx: { row: any },\n ): any {\n const raw = typeof expression === 'object' ? expression.expr : String(expression);\n if (!raw || !raw.trim()) return null;\n const short = raw.trim();\n if (!short.startsWith('=')) {\n // literal fallback\n return short;\n }\n try {\n const body = short.slice(1); // strip '='\n // eslint-disable-next-line no-new-func\n const fn = new Function('row', `\"use strict\"; return (${body});`);\n return fn(ctx?.row);\n } catch {\n return null;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SpecificationBridgeService } from './specification-bridge.service';\nimport { DslParser, SpecificationFactory } from '@praxisui/specification';\nimport { RuleNode, ValidationError } from '../models/rule-builder.model';\n\nexport interface RoundTripValidationResult {\n success: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n stages: {\n visualToSpecification: { success: boolean; error?: string };\n specificationToDsl: { success: boolean; error?: string; dsl?: string };\n dslToSpecification: { success: boolean; error?: string };\n specificationToVisual: { success: boolean; error?: string };\n };\n dataIntegrity: {\n nodeCountMatch: boolean;\n structureMatch: boolean;\n metadataPreserved: boolean;\n logicPreserved: boolean;\n };\n performance: {\n totalTime: number;\n stageTimings: Record<string, number>;\n };\n}\n\nexport interface RoundTripTestCase {\n id: string;\n name: string;\n description: string;\n visualRule: RuleNode;\n expectedDsl?: string;\n expectedValidation?: {\n shouldSucceed: boolean;\n expectedErrors?: string[];\n expectedWarnings?: string[];\n };\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RoundTripValidatorService {\n private dslParser = new DslParser();\n\n constructor(\n private specificationBridge: SpecificationBridgeService\n ) {}\n\n /**\n * Validates complete round-trip conversion: Visual → DSL → Visual\n */\n validateRoundTrip(visualRule: RuleNode): RoundTripValidationResult {\n const startTime = performance.now();\n const result: RoundTripValidationResult = {\n success: false,\n errors: [],\n warnings: [],\n stages: {\n visualToSpecification: { success: false },\n specificationToDsl: { success: false },\n dslToSpecification: { success: false },\n specificationToVisual: { success: false }\n },\n dataIntegrity: {\n nodeCountMatch: false,\n structureMatch: false,\n metadataPreserved: false,\n logicPreserved: false\n },\n performance: {\n totalTime: 0,\n stageTimings: {}\n }\n };\n\n try {\n // Stage 1: Visual → Specification\n const stage1Start = performance.now();\n let specification;\n try {\n specification = this.specificationBridge.ruleNodeToSpecification(visualRule);\n result.stages.visualToSpecification.success = true;\n } catch (error) {\n result.stages.visualToSpecification.error = `Failed to convert visual to specification: ${error}`;\n result.errors.push({\n id: this.generateErrorId(),\n message: result.stages.visualToSpecification.error,\n severity: 'error',\n code: 'VISUAL_TO_SPEC_ERROR'\n });\n }\n result.performance.stageTimings['visualToSpecification'] = performance.now() - stage1Start;\n\n if (!specification) {\n result.performance.totalTime = performance.now() - startTime;\n return result;\n }\n\n // Stage 2: Specification → DSL\n const stage2Start = performance.now();\n let dsl: string;\n try {\n dsl = this.specificationBridge.exportToDsl(visualRule);\n result.stages.specificationToDsl.success = true;\n result.stages.specificationToDsl.dsl = dsl;\n } catch (error) {\n result.stages.specificationToDsl.error = `Failed to convert specification to DSL: ${error}`;\n result.errors.push({\n id: this.generateErrorId(),\n message: result.stages.specificationToDsl.error,\n severity: 'error',\n code: 'SPEC_TO_DSL_ERROR'\n });\n result.performance.totalTime = performance.now() - startTime;\n return result;\n }\n result.performance.stageTimings['specificationToDsl'] = performance.now() - stage2Start;\n\n // Stage 3: DSL → Specification\n const stage3Start = performance.now();\n let parsedSpecification;\n try {\n parsedSpecification = this.dslParser.parse(dsl);\n result.stages.dslToSpecification.success = true;\n } catch (error) {\n result.stages.dslToSpecification.error = `Failed to parse DSL back to specification: ${error}`;\n result.errors.push({\n id: this.generateErrorId(),\n message: result.stages.dslToSpecification.error,\n severity: 'error',\n code: 'DSL_TO_SPEC_ERROR'\n });\n result.performance.totalTime = performance.now() - startTime;\n return result;\n }\n result.performance.stageTimings['dslToSpecification'] = performance.now() - stage3Start;\n\n // Stage 4: Specification → Visual\n const stage4Start = performance.now();\n let reconstructedVisual: RuleNode;\n try {\n reconstructedVisual = this.specificationBridge.specificationToRuleNode(parsedSpecification);\n result.stages.specificationToVisual.success = true;\n } catch (error) {\n result.stages.specificationToVisual.error = `Failed to convert specification back to visual: ${error}`;\n result.errors.push({\n id: this.generateErrorId(),\n message: result.stages.specificationToVisual.error,\n severity: 'error',\n code: 'SPEC_TO_VISUAL_ERROR'\n });\n result.performance.totalTime = performance.now() - startTime;\n return result;\n }\n result.performance.stageTimings['specificationToVisual'] = performance.now() - stage4Start;\n\n // Data Integrity Validation\n const integrityStart = performance.now();\n result.dataIntegrity = this.validateDataIntegrity(visualRule, reconstructedVisual, result);\n result.performance.stageTimings['dataIntegrityValidation'] = performance.now() - integrityStart;\n\n // Overall success determination\n result.success = Object.values(result.stages).every(stage => stage.success) && \n result.errors.length === 0;\n\n result.performance.totalTime = performance.now() - startTime;\n return result;\n\n } catch (error) {\n result.errors.push({\n id: this.generateErrorId(),\n message: `Unexpected error during round-trip validation: ${error}`,\n severity: 'error',\n code: 'ROUND_TRIP_UNEXPECTED_ERROR'\n });\n result.performance.totalTime = performance.now() - startTime;\n return result;\n }\n }\n\n /**\n * Validates data integrity between original and reconstructed visual rules\n */\n private validateDataIntegrity(\n original: RuleNode, \n reconstructed: RuleNode, \n result: RoundTripValidationResult\n ): RoundTripValidationResult['dataIntegrity'] {\n const integrity = {\n nodeCountMatch: false,\n structureMatch: false,\n metadataPreserved: false,\n logicPreserved: false\n };\n\n // Count nodes\n const originalNodeCount = this.countNodes(original);\n const reconstructedNodeCount = this.countNodes(reconstructed);\n integrity.nodeCountMatch = originalNodeCount === reconstructedNodeCount;\n\n if (!integrity.nodeCountMatch) {\n result.warnings.push({\n id: this.generateErrorId(),\n message: `Node count mismatch: original=${originalNodeCount}, reconstructed=${reconstructedNodeCount}`,\n severity: 'warning',\n code: 'NODE_COUNT_MISMATCH'\n });\n }\n\n // Validate structure\n integrity.structureMatch = this.validateStructureMatch(original, reconstructed, result);\n\n // Validate metadata preservation\n integrity.metadataPreserved = this.validateMetadataPreservation(original, reconstructed, result);\n\n // Validate logic preservation\n integrity.logicPreserved = this.validateLogicPreservation(original, reconstructed, result);\n\n return integrity;\n }\n\n /**\n * Validates that the logical structure is preserved\n */\n private validateStructureMatch(\n original: RuleNode, \n reconstructed: RuleNode, \n result: RoundTripValidationResult\n ): boolean {\n // Basic type and structure validation\n if (original.type !== reconstructed.type) {\n result.warnings.push({\n id: this.generateErrorId(),\n message: `Node type mismatch: original=${original.type}, reconstructed=${reconstructed.type}`,\n severity: 'warning',\n code: 'NODE_TYPE_MISMATCH'\n });\n return false;\n }\n\n // Validate children structure\n const originalChildCount = original.children?.length || 0;\n const reconstructedChildCount = reconstructed.children?.length || 0;\n\n if (originalChildCount !== reconstructedChildCount) {\n result.warnings.push({\n id: this.generateErrorId(),\n message: `Child count mismatch: original=${originalChildCount}, reconstructed=${reconstructedChildCount}`,\n severity: 'warning',\n code: 'CHILD_COUNT_MISMATCH'\n });\n return false;\n }\n\n // Recursively validate children\n if (original.children && reconstructed.children) {\n for (let i = 0; i < original.children.length; i++) {\n const originalChild = Array.isArray(original.children[i]) ? original.children[i] : original.children[i];\n const reconstructedChild = Array.isArray(reconstructed.children[i]) ? reconstructed.children[i] : reconstructed.children[i];\n \n if (typeof originalChild === 'object' && typeof reconstructedChild === 'object') {\n if (!this.validateStructureMatch(originalChild as RuleNode, reconstructedChild as RuleNode, result)) {\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n /**\n * Validates that metadata is preserved through the round-trip\n */\n private validateMetadataPreservation(\n original: RuleNode, \n reconstructed: RuleNode, \n result: RoundTripValidationResult\n ): boolean {\n const originalMeta = original.metadata;\n const reconstructedMeta = reconstructed.metadata;\n\n // Both null/undefined\n if (!originalMeta && !reconstructedMeta) {\n return true;\n }\n\n // One null, one not\n if (!originalMeta || !reconstructedMeta) {\n result.warnings.push({\n id: this.generateErrorId(),\n message: `Metadata presence mismatch: original=${!!originalMeta}, reconstructed=${!!reconstructedMeta}`,\n severity: 'warning',\n code: 'METADATA_PRESENCE_MISMATCH'\n });\n return false;\n }\n\n // Compare metadata fields\n const metadataMatches = originalMeta.code === reconstructedMeta.code &&\n originalMeta.message === reconstructedMeta.message &&\n originalMeta['severity'] === reconstructedMeta['severity'];\n\n if (!metadataMatches) {\n result.warnings.push({\n id: this.generateErrorId(),\n message: 'Metadata values changed during round-trip',\n severity: 'warning',\n code: 'METADATA_VALUES_CHANGED'\n });\n return false;\n }\n\n // Recursively check children metadata\n if (original.children && reconstructed.children) {\n for (let i = 0; i < original.children.length; i++) {\n const originalChild = original.children[i];\n const reconstructedChild = reconstructed.children[i];\n \n if (typeof originalChild === 'object' && typeof reconstructedChild === 'object') {\n if (!this.validateMetadataPreservation(originalChild as RuleNode, reconstructedChild as RuleNode, result)) {\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n /**\n * Validates that the logical meaning is preserved\n */\n private validateLogicPreservation(\n original: RuleNode, \n reconstructed: RuleNode, \n result: RoundTripValidationResult\n ): boolean {\n // Compare configuration objects for logical equivalence\n const originalConfig = original.config;\n const reconstructedConfig = reconstructed.config;\n\n if (!originalConfig && !reconstructedConfig) {\n return true;\n }\n\n if (!originalConfig || !reconstructedConfig) {\n result.warnings.push({\n id: this.generateErrorId(),\n message: `Configuration presence mismatch: original=${!!originalConfig}, reconstructed=${!!reconstructedConfig}`,\n severity: 'warning',\n code: 'CONFIG_PRESENCE_MISMATCH'\n });\n return false;\n }\n\n // Deep comparison of configuration\n try {\n const originalConfigJson = JSON.stringify(originalConfig, null, 2);\n const reconstructedConfigJson = JSON.stringify(reconstructedConfig, null, 2);\n\n if (originalConfigJson !== reconstructedConfigJson) {\n result.warnings.push({\n id: this.generateErrorId(),\n message: 'Configuration values changed during round-trip',\n severity: 'warning',\n code: 'CONFIG_VALUES_CHANGED'\n });\n return false;\n }\n } catch (error) {\n result.warnings.push({\n id: this.generateErrorId(),\n message: `Failed to compare configurations: ${error}`,\n severity: 'warning',\n code: 'CONFIG_COMPARISON_ERROR'\n });\n return false;\n }\n\n return true;\n }\n\n /**\n * Counts total number of nodes in a rule tree\n */\n private countNodes(node: RuleNode): number {\n let count = 1;\n if (node.children) {\n for (const child of node.children) {\n if (typeof child === 'object') {\n count += this.countNodes(child as RuleNode);\n }\n }\n }\n return count;\n }\n\n /**\n * Runs a comprehensive test suite for round-trip validation\n */\n runTestSuite(testCases: RoundTripTestCase[]): {\n totalTests: number;\n passed: number;\n failed: number;\n results: Array<{ testCase: RoundTripTestCase; result: RoundTripValidationResult }>;\n } {\n const results: Array<{ testCase: RoundTripTestCase; result: RoundTripValidationResult }> = [];\n let passed = 0;\n let failed = 0;\n\n for (const testCase of testCases) {\n const result = this.validateRoundTrip(testCase.visualRule);\n \n // Apply expected validation if provided\n if (testCase.expectedValidation) {\n const meetsExpectations = this.validateExpectations(result, testCase.expectedValidation);\n if (meetsExpectations) {\n passed++;\n } else {\n failed++;\n result.errors.push({\n id: this.generateErrorId(),\n message: 'Test case did not meet expected validation criteria',\n severity: 'error',\n code: 'TEST_EXPECTATIONS_NOT_MET'\n });\n }\n } else {\n if (result.success) {\n passed++;\n } else {\n failed++;\n }\n }\n\n results.push({ testCase, result });\n }\n\n return {\n totalTests: testCases.length,\n passed,\n failed,\n results\n };\n }\n\n /**\n * Validates test expectations against results\n */\n private validateExpectations(\n result: RoundTripValidationResult, \n expectations: RoundTripTestCase['expectedValidation']\n ): boolean {\n if (!expectations) return result.success;\n\n // Check if success matches expectation\n if (result.success !== expectations.shouldSucceed) {\n return false;\n }\n\n // Check expected errors\n if (expectations.expectedErrors) {\n const errorMessages = result.errors.map(e => e.message);\n for (const expectedError of expectations.expectedErrors) {\n if (!errorMessages.some(msg => msg.includes(expectedError))) {\n return false;\n }\n }\n }\n\n // Check expected warnings\n if (expectations.expectedWarnings) {\n const warningMessages = result.warnings.map(w => w.message);\n for (const expectedWarning of expectations.expectedWarnings) {\n if (!warningMessages.some(msg => msg.includes(expectedWarning))) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Creates default test cases for common rule patterns\n */\n createDefaultTestCases(): RoundTripTestCase[] {\n return [\n {\n id: 'simple-field-condition',\n name: 'Simple Field Condition',\n description: 'Tests a basic field equals condition',\n visualRule: {\n id: 'test-1',\n type: 'fieldCondition',\n label: 'Name equals \"Test\"',\n config: {\n type: 'fieldCondition',\n fieldName: 'name',\n operator: 'equals',\n value: 'Test',\n valueType: 'literal'\n } as any\n },\n expectedValidation: {\n shouldSucceed: true\n }\n },\n {\n id: 'and-group',\n name: 'AND Group',\n description: 'Tests an AND group with multiple conditions',\n visualRule: {\n id: 'test-2',\n type: 'andGroup',\n label: 'AND Group',\n config: {\n type: 'booleanGroup',\n operator: 'and'\n } as any,\n children: [\n {\n id: 'test-2-1',\n type: 'fieldCondition',\n label: 'Age > 18',\n config: {\n type: 'fieldCondition',\n fieldName: 'age',\n operator: 'greaterThan',\n value: 18,\n valueType: 'literal'\n } as any\n },\n {\n id: 'test-2-2',\n type: 'fieldCondition',\n label: 'Active = true',\n config: {\n type: 'fieldCondition',\n fieldName: 'active',\n operator: 'equals',\n value: true,\n valueType: 'literal'\n } as any\n }\n ] as any\n },\n expectedValidation: {\n shouldSucceed: true\n }\n },\n {\n id: 'function-condition',\n name: 'Function Condition',\n description: 'Tests a function call condition',\n visualRule: {\n id: 'test-3',\n type: 'functionCall',\n label: 'contains(name, \"test\")',\n config: {\n type: 'functionCall',\n functionName: 'contains',\n parameters: [\n { name: 'field', value: 'name', valueType: 'field' },\n { name: 'value', value: 'test', valueType: 'literal' }\n ]\n } as any\n },\n expectedValidation: {\n shouldSucceed: true\n }\n }\n ];\n }\n\n private generateErrorId(): string {\n return `error_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n RuleBuilderState,\n RuleNode,\n RuleNodeType,\n ValidationError,\n RuleBuilderSnapshot,\n ExportOptions,\n ImportOptions,\n RuleBuilderConfig,\n} from '../models/rule-builder.model';\n\nimport {\n SpecificationFactory,\n DslExporter,\n DslValidator,\n DslParser,\n ValidationIssue,\n} from '@praxisui/specification';\nimport { Specification } from '@praxisui/specification-core';\nimport { SpecificationBridgeService } from './specification-bridge.service';\nimport { RoundTripValidatorService } from './round-trip-validator.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RuleBuilderService {\n private readonly _state = new BehaviorSubject<RuleBuilderState>(\n this.getInitialState(),\n );\n private readonly _validationErrors = new BehaviorSubject<ValidationError[]>(\n [],\n );\n private readonly _nodeSelected = new Subject<string>();\n private readonly _stateChanged = new Subject<void>();\n\n private config: RuleBuilderConfig | null = null;\n private dslExporter = new DslExporter();\n private dslValidator = new DslValidator();\n private dslParser = new DslParser();\n\n public readonly state$ = this._state.asObservable();\n public readonly validationErrors$ = this._validationErrors.asObservable();\n public readonly nodeSelected$ = this._nodeSelected.asObservable();\n public readonly stateChanged$ = this._stateChanged.asObservable();\n\n constructor(\n private specificationBridge: SpecificationBridgeService,\n private roundTripValidator: RoundTripValidatorService,\n ) {\n // Auto-save functionality\n this.state$.subscribe((state) => {\n if (state.isDirty && this.config?.ui?.autoSaveInterval) {\n // Implement auto-save logic here\n }\n });\n }\n\n /**\n * Initialize the rule builder with configuration\n */\n initialize(config: RuleBuilderConfig): void {\n this.config = config;\n this.dslValidator = new DslValidator({\n knownFields: Object.keys(config.fieldSchemas || {}),\n knownFunctions:\n config.customFunctions?.map((f) => (f as any)?.name).filter(Boolean) ||\n [],\n enablePerformanceWarnings: true,\n });\n\n // Reset state\n this.updateState({\n ...this.getInitialState(),\n isDirty: false,\n });\n }\n\n /**\n * Get current state\n */\n getCurrentState(): RuleBuilderState {\n return this._state.value;\n }\n\n /**\n * Add a new rule node\n */\n addNode(node: Partial<RuleNode>, parentId?: string): string {\n const nodeId = node.id || uuidv4();\n const currentState = this.getCurrentState();\n\n const newNode: RuleNode = {\n id: nodeId,\n type: node.type || RuleNodeType.FIELD_CONDITION,\n label:\n node.label ||\n this.generateNodeLabel(\n (node.type as RuleNodeType) || RuleNodeType.FIELD_CONDITION,\n ),\n metadata: node.metadata,\n selected: false,\n expanded: true,\n parentId,\n children: [],\n config: node.config,\n };\n\n const updatedNodes = {\n ...currentState.nodes,\n [nodeId]: newNode,\n };\n\n let updatedRootNodes = [...currentState.rootNodes];\n\n if (parentId) {\n // Add to parent's children\n const parent = updatedNodes[parentId];\n if (parent) {\n updatedNodes[parentId] = {\n ...parent,\n children: [...(parent.children || []), nodeId],\n };\n }\n } else {\n // Add as root node\n updatedRootNodes.push(nodeId);\n }\n\n this.updateState({\n ...currentState,\n nodes: updatedNodes,\n rootNodes: updatedRootNodes,\n isDirty: true,\n });\n\n this.saveSnapshot(`Added ${newNode.label || newNode.type} node`);\n this.validateRules();\n\n return nodeId;\n }\n\n /**\n * Update an existing rule node\n */\n updateNode(nodeId: string, updates: Partial<RuleNode>): void {\n const currentState = this.getCurrentState();\n const existingNode = currentState.nodes[nodeId];\n\n if (!existingNode) {\n return;\n }\n\n const updatedNode = {\n ...existingNode,\n ...updates,\n id: nodeId, // Ensure ID doesn't change\n };\n\n this.updateState({\n ...currentState,\n nodes: {\n ...currentState.nodes,\n [nodeId]: updatedNode,\n },\n isDirty: true,\n });\n\n this.saveSnapshot(`Updated ${updatedNode.label || updatedNode.type} node`);\n this.validateRules();\n }\n\n /**\n * Remove a rule node\n */\n removeNode(nodeId: string): void {\n const currentState = this.getCurrentState();\n const node = currentState.nodes[nodeId];\n\n if (!node) {\n return;\n }\n\n const updatedNodes = { ...currentState.nodes };\n const updatedRootNodes = [...currentState.rootNodes];\n\n // Remove from parent's children or root nodes\n if (node.parentId) {\n const parent = updatedNodes[node.parentId];\n if (parent) {\n updatedNodes[node.parentId] = {\n ...parent,\n children: (parent.children || []).filter((id) => id !== nodeId),\n };\n }\n } else {\n const rootIndex = updatedRootNodes.indexOf(nodeId);\n if (rootIndex >= 0) {\n updatedRootNodes.splice(rootIndex, 1);\n }\n }\n\n // Recursively remove children\n const removeNodeRecursive = (id: string) => {\n const nodeToRemove = updatedNodes[id];\n if (nodeToRemove?.children) {\n nodeToRemove.children.forEach(removeNodeRecursive);\n }\n delete updatedNodes[id];\n };\n\n removeNodeRecursive(nodeId);\n\n this.updateState({\n ...currentState,\n nodes: updatedNodes,\n rootNodes: updatedRootNodes,\n selectedNodeId:\n currentState.selectedNodeId === nodeId\n ? undefined\n : currentState.selectedNodeId,\n isDirty: true,\n });\n\n this.saveSnapshot(`Removed ${node.label || node.type} node`);\n this.validateRules();\n }\n\n /**\n * Select a rule node\n */\n selectNode(nodeId?: string): void {\n const currentState = this.getCurrentState();\n\n // Update selection\n const updatedNodes = Object.keys(currentState.nodes).reduce(\n (acc, id) => {\n acc[id] = {\n ...currentState.nodes[id],\n selected: id === nodeId,\n };\n return acc;\n },\n {} as Record<string, RuleNode>,\n );\n\n this.updateState({\n ...currentState,\n nodes: updatedNodes,\n selectedNodeId: nodeId,\n });\n\n if (nodeId) {\n this._nodeSelected.next(nodeId);\n }\n }\n\n /**\n * Move a node to a new parent\n */\n moveNode(nodeId: string, newParentId?: string, index?: number): void {\n const currentState = this.getCurrentState();\n const node = currentState.nodes[nodeId];\n\n if (!node || node.parentId === newParentId) {\n return;\n }\n\n const updatedNodes = { ...currentState.nodes };\n let updatedRootNodes = [...currentState.rootNodes];\n\n // Remove from current parent\n if (node.parentId) {\n const currentParent = updatedNodes[node.parentId];\n if (currentParent) {\n updatedNodes[node.parentId] = {\n ...currentParent,\n children: (currentParent.children || []).filter(\n (id) => id !== nodeId,\n ),\n };\n }\n } else {\n updatedRootNodes = updatedRootNodes.filter((id) => id !== nodeId);\n }\n\n // Add to new parent\n updatedNodes[nodeId] = {\n ...node,\n parentId: newParentId,\n };\n\n if (newParentId) {\n const newParent = updatedNodes[newParentId];\n if (newParent) {\n const children = [...(newParent.children || [])];\n if (typeof index === 'number') {\n children.splice(index, 0, nodeId);\n } else {\n children.push(nodeId);\n }\n\n updatedNodes[newParentId] = {\n ...newParent,\n children,\n };\n }\n } else {\n if (typeof index === 'number') {\n updatedRootNodes.splice(index, 0, nodeId);\n } else {\n updatedRootNodes.push(nodeId);\n }\n }\n\n this.updateState({\n ...currentState,\n nodes: updatedNodes,\n rootNodes: updatedRootNodes,\n isDirty: true,\n });\n\n this.saveSnapshot(`Moved ${node.label || node.type} node`);\n }\n\n /**\n * Convert current rules to Specification\n */\n toSpecification(): Specification<any> | null {\n const currentState = this.getCurrentState();\n\n if (currentState.rootNodes.length === 0) {\n return null;\n }\n\n // If single root node, convert directly\n if (currentState.rootNodes.length === 1) {\n const rootNode = this.buildRuleNodeTree(currentState.rootNodes[0]);\n return rootNode\n ? this.specificationBridge.ruleNodeToSpecification(rootNode)\n : null;\n }\n\n // Multiple root nodes - combine with AND\n const specifications = currentState.rootNodes\n .map((nodeId) => {\n const rootNode = this.buildRuleNodeTree(nodeId);\n return rootNode\n ? this.specificationBridge.ruleNodeToSpecification(rootNode)\n : null;\n })\n .filter((spec) => spec !== null) as Specification<any>[];\n\n if (specifications.length === 0) {\n return null;\n }\n\n if (specifications.length === 1) {\n return specifications[0];\n }\n\n return SpecificationFactory.and(...specifications);\n }\n\n /**\n * Export current rules\n */\n export(options: ExportOptions): string {\n const currentState = this.getCurrentState();\n\n if (currentState.rootNodes.length === 0) {\n return '';\n }\n\n switch (options.format) {\n case 'json':\n const specification = this.toSpecification();\n if (!specification) return '';\n const json = specification.toJSON();\n return options.prettyPrint\n ? JSON.stringify(json, null, 2)\n : JSON.stringify(json);\n\n case 'dsl':\n if (currentState.rootNodes.length === 1) {\n const rootNode = this.buildRuleNodeTree(currentState.rootNodes[0]);\n if (!rootNode) return '';\n return this.specificationBridge.exportToDsl(rootNode, {\n includeMetadata: options.includeMetadata,\n metadataPosition: options.metadataPosition || 'before',\n prettyPrint: options.prettyPrint || false,\n });\n } else {\n // Multiple root nodes - export each and combine\n const dslParts = currentState.rootNodes\n .map((nodeId) => {\n const rootNode = this.buildRuleNodeTree(nodeId);\n return rootNode\n ? this.specificationBridge.exportToDsl(rootNode)\n : '';\n })\n .filter((dsl) => dsl.length > 0);\n\n return dslParts.length > 1\n ? dslParts.join(' AND ')\n : dslParts[0] || '';\n }\n\n case 'typescript':\n const spec = this.toSpecification();\n return spec ? this.exportToTypeScript(spec, options) : '';\n\n case 'form-config':\n const formSpec = this.toSpecification();\n return formSpec ? this.exportToFormConfig(formSpec, options) : '';\n\n default:\n throw new Error(`Unsupported export format: ${options.format}`);\n }\n }\n\n /**\n * Import rules from external source.\n *\n * Empty strings or structures with no data are ignored to preserve the\n * current state. When parsing JSON, the specification type must be\n * present otherwise an error is thrown, ensuring business rules are\n * explicit and valid.\n *\n * @throws Error when the specification type is missing or the format is\n * unsupported.\n */\n import(content: string, options: ImportOptions): void {\n try {\n let specification: Specification<any> | null = null;\n\n switch (options.format) {\n case 'json': {\n if (!content || content.trim().length === 0) {\n return;\n }\n const json = JSON.parse(content);\n if (\n json == null ||\n (Array.isArray(json) && json.length === 0) ||\n (typeof json === 'object' &&\n !Array.isArray(json) &&\n Object.keys(json).length === 0)\n ) {\n return;\n }\n\n // Se for o estado do builder (nodes/rootNodes), aplica diretamente\n if (this.isBuilderState(json)) {\n const state = this.getInitialState();\n this.updateState({\n ...state,\n nodes: json.nodes,\n rootNodes: json.rootNodes,\n isDirty: true,\n });\n this.saveSnapshot('Imported rules');\n this.validateRules();\n return;\n }\n\n // Se for um array de especificações, combina com AND\n if (Array.isArray(json)) {\n const specs = json\n .map((item) => this.normalizeSpecJson(item))\n .filter((j): j is any => !!j)\n .map((j) => SpecificationFactory.fromJSON(j));\n\n if (specs.length === 0) return;\n specification = specs.length === 1 ? specs[0] : SpecificationFactory.and(...specs);\n break;\n }\n\n // Objeto único: tenta normalizar ou usar dsl embutido\n if (typeof json === 'object' && json) {\n if (typeof (json as any).dsl === 'string' && (json as any).dsl.trim()) {\n specification = this.dslParser.parse((json as any).dsl);\n break;\n }\n\n const normalized = this.normalizeSpecJson(json);\n if (!normalized) {\n throw new Error('Missing specification type');\n }\n specification = SpecificationFactory.fromJSON(normalized);\n break;\n }\n\n // Tipo inesperado\n throw new Error('Unsupported JSON structure for import');\n }\n\n case 'dsl':\n if (!content || content.trim().length === 0) {\n return;\n }\n specification = this.dslParser.parse(content);\n break;\n\n default:\n throw new Error(`Unsupported import format: ${options.format}`);\n }\n\n if (specification) {\n const ruleNode =\n this.specificationBridge.specificationToRuleNode(specification);\n const ruleNodes = this.flattenRuleNodeTree(ruleNode);\n\n if (options.merge) {\n // Merge with existing rules\n const currentState = this.getCurrentState();\n const mergedNodes = { ...currentState.nodes, ...ruleNodes.nodes };\n const mergedRootNodes = [\n ...currentState.rootNodes,\n ...ruleNodes.rootNodes,\n ];\n\n this.updateState({\n ...currentState,\n nodes: mergedNodes,\n rootNodes: mergedRootNodes,\n isDirty: true,\n });\n } else {\n // Replace all rules\n this.updateState({\n ...this.getInitialState(),\n nodes: ruleNodes.nodes,\n rootNodes: ruleNodes.rootNodes,\n isDirty: true,\n });\n }\n\n this.saveSnapshot('Imported rules');\n this.validateRules();\n }\n } catch (error) {\n console.error('Failed to import rules:', error);\n throw error;\n }\n }\n\n /**\n * Undo last action\n */\n undo(): void {\n const currentState = this.getCurrentState();\n\n if (currentState.historyPosition > 0) {\n const snapshot = currentState.history[currentState.historyPosition - 1];\n\n this.updateState({\n ...currentState,\n ...snapshot.state,\n historyPosition: currentState.historyPosition - 1,\n isDirty: true,\n });\n }\n }\n\n /**\n * Redo last undone action\n */\n redo(): void {\n const currentState = this.getCurrentState();\n\n if (currentState.historyPosition < currentState.history.length - 1) {\n const snapshot = currentState.history[currentState.historyPosition + 1];\n\n this.updateState({\n ...currentState,\n ...snapshot.state,\n historyPosition: currentState.historyPosition + 1,\n isDirty: true,\n });\n }\n }\n\n /**\n * Clear all rules\n */\n clear(): void {\n this.updateState({\n ...this.getInitialState(),\n isDirty: false,\n });\n\n this.saveSnapshot('Cleared all rules');\n }\n\n /**\n * Validate current rules\n */\n validateRules(): void {\n const currentState = this.getCurrentState();\n const errors: ValidationError[] = [];\n\n // Validate each node\n Object.values(currentState.nodes).forEach((node) => {\n const nodeErrors = this.validateNode(node);\n errors.push(...nodeErrors);\n });\n\n // Validate overall structure\n const structureErrors = this.validateStructure(currentState);\n errors.push(...structureErrors);\n\n // Update DSL and validate\n try {\n const specification = this.toSpecification();\n if (specification) {\n const dsl = specification.toDSL();\n const dslErrors = this.dslValidator.validate(dsl);\n\n errors.push(\n ...dslErrors.map((issue: ValidationIssue) => ({\n id: uuidv4(),\n message: issue.message,\n severity: issue.severity as 'error' | 'warning' | 'info',\n code: issue.type,\n })),\n );\n\n this.updateState({\n ...currentState,\n currentDSL: dsl,\n currentJSON: specification.toJSON(),\n });\n }\n } catch (error) {\n errors.push({\n id: uuidv4(),\n message: `Failed to generate specification: ${error}`,\n severity: 'error',\n code: 'SPECIFICATION_GENERATION_ERROR',\n });\n }\n\n // Perform round-trip validation for root nodes (if enabled)\n if (this.config?.validation?.realTime) {\n const roundTripErrors = this.validateRoundTrip(currentState);\n errors.push(...roundTripErrors);\n }\n\n this._validationErrors.next(errors);\n }\n\n /**\n * Validates round-trip conversion for all root nodes\n */\n private validateRoundTrip(state: RuleBuilderState): ValidationError[] {\n const errors: ValidationError[] = [];\n\n for (const rootNodeId of state.rootNodes) {\n try {\n const rootNode = this.buildRuleNodeTree(rootNodeId);\n if (rootNode) {\n const result = this.roundTripValidator.validateRoundTrip(rootNode);\n\n if (!result.success) {\n // Add round-trip specific errors\n errors.push(\n ...result.errors.map((error) => ({\n ...error,\n nodeId: rootNodeId,\n code: `ROUND_TRIP_${error.code}`,\n })),\n );\n }\n\n // Add round-trip warnings as info-level validation errors\n errors.push(\n ...result.warnings.map((warning) => ({\n ...warning,\n severity: 'info' as const,\n nodeId: rootNodeId,\n code: `ROUND_TRIP_${warning.code}`,\n })),\n );\n }\n } catch (error) {\n errors.push({\n id: uuidv4(),\n message: `Round-trip validation failed for node ${rootNodeId}: ${error}`,\n severity: 'warning',\n code: 'ROUND_TRIP_VALIDATION_ERROR',\n nodeId: rootNodeId,\n });\n }\n }\n\n return errors;\n }\n\n /**\n * Runs comprehensive round-trip validation for current state\n */\n runRoundTripValidation(): {\n success: boolean;\n results: Array<{\n nodeId: string;\n result: any; // RoundTripValidationResult\n }>;\n summary: {\n totalNodes: number;\n successfulNodes: number;\n failedNodes: number;\n totalErrors: number;\n totalWarnings: number;\n };\n } {\n const currentState = this.getCurrentState();\n const results: Array<{ nodeId: string; result: any }> = [];\n let totalErrors = 0;\n let totalWarnings = 0;\n let successfulNodes = 0;\n let failedNodes = 0;\n\n for (const rootNodeId of currentState.rootNodes) {\n try {\n const rootNode = this.buildRuleNodeTree(rootNodeId);\n if (rootNode) {\n const result = this.roundTripValidator.validateRoundTrip(rootNode);\n results.push({ nodeId: rootNodeId, result });\n\n if (result.success) {\n successfulNodes++;\n } else {\n failedNodes++;\n }\n\n totalErrors += result.errors.length;\n totalWarnings += result.warnings.length;\n }\n } catch (error) {\n failedNodes++;\n totalErrors++;\n results.push({\n nodeId: rootNodeId,\n result: {\n success: false,\n errors: [{ message: `Validation failed: ${error}` }],\n warnings: [],\n },\n });\n }\n }\n\n return {\n success: failedNodes === 0,\n results,\n summary: {\n totalNodes: currentState.rootNodes.length,\n successfulNodes,\n failedNodes,\n totalErrors,\n totalWarnings,\n },\n };\n }\n\n // Private methods\n\n private getInitialState(): RuleBuilderState {\n return {\n nodes: {},\n rootNodes: [],\n selectedNodeId: undefined,\n currentDSL: undefined,\n currentJSON: undefined,\n validationErrors: [],\n mode: 'visual',\n isDirty: false,\n history: [],\n historyPosition: -1,\n };\n }\n\n private updateState(newState: RuleBuilderState): void {\n this._state.next(newState);\n this._stateChanged.next();\n }\n\n private saveSnapshot(description: string): void {\n const currentState = this.getCurrentState();\n\n const snapshot: RuleBuilderSnapshot = {\n timestamp: Date.now(),\n description,\n state: {\n nodes: { ...currentState.nodes },\n rootNodes: [...currentState.rootNodes],\n selectedNodeId: currentState.selectedNodeId,\n },\n };\n\n const newHistory = currentState.history.slice(\n 0,\n currentState.historyPosition + 1,\n );\n newHistory.push(snapshot);\n\n // Limit history size\n const maxHistorySize = 50;\n if (newHistory.length > maxHistorySize) {\n newHistory.shift();\n }\n\n this.updateState({\n ...currentState,\n history: newHistory,\n historyPosition: newHistory.length - 1,\n });\n }\n\n private generateNodeLabel(type: RuleNodeType): string {\n const labels: Record<RuleNodeType, string> = {\n [RuleNodeType.FIELD_CONDITION]: 'Field Condition',\n [RuleNodeType.AND_GROUP]: 'AND Group',\n [RuleNodeType.OR_GROUP]: 'OR Group',\n [RuleNodeType.NOT_GROUP]: 'NOT Group',\n [RuleNodeType.XOR_GROUP]: 'XOR Group',\n [RuleNodeType.IMPLIES_GROUP]: 'IMPLIES Group',\n [RuleNodeType.REQUIRED_IF]: 'Required If',\n [RuleNodeType.VISIBLE_IF]: 'Visible If',\n [RuleNodeType.DISABLED_IF]: 'Disabled If',\n [RuleNodeType.READONLY_IF]: 'Readonly If',\n [RuleNodeType.FOR_EACH]: 'For Each',\n [RuleNodeType.UNIQUE_BY]: 'Unique By',\n [RuleNodeType.MIN_LENGTH]: 'Min Length',\n [RuleNodeType.MAX_LENGTH]: 'Max Length',\n [RuleNodeType.IF_DEFINED]: 'If Defined',\n [RuleNodeType.IF_NOT_NULL]: 'If Not Null',\n [RuleNodeType.IF_EXISTS]: 'If Exists',\n [RuleNodeType.WITH_DEFAULT]: 'With Default',\n [RuleNodeType.FUNCTION_CALL]: 'Function Call',\n [RuleNodeType.FIELD_TO_FIELD]: 'Field to Field',\n [RuleNodeType.CONTEXTUAL]: 'Contextual',\n [RuleNodeType.AT_LEAST]: 'At Least',\n [RuleNodeType.EXACTLY]: 'Exactly',\n [RuleNodeType.EXPRESSION]: 'Expression',\n [RuleNodeType.CONTEXTUAL_TEMPLATE]: 'Contextual Template',\n [RuleNodeType.CUSTOM]: 'Custom',\n };\n\n return labels[type] || type;\n }\n\n private buildRuleNodeTree(nodeId: string): RuleNode | null {\n const currentState = this.getCurrentState();\n const node = currentState.nodes[nodeId];\n\n if (!node) {\n return null;\n }\n\n return {\n ...node,\n children: node.children || [],\n };\n }\n\n private flattenRuleNodeTree(rootNode: RuleNode): {\n nodes: Record<string, RuleNode>;\n rootNodes: string[];\n } {\n const nodes: Record<string, RuleNode> = {};\n const rootNodes: string[] = [rootNode.id];\n\n const flattenNode = (node: RuleNode): void => {\n // Store the node in the flat structure\n nodes[node.id] = {\n ...node,\n children: node.children || [],\n };\n\n // Recursively flatten children if they exist and are RuleNode objects (not just IDs)\n if (node.children && node.children.length > 0) {\n // Check if children are RuleNode objects or string IDs\n const firstChild = node.children[0] as any;\n if (\n typeof firstChild === 'object' &&\n firstChild &&\n 'id' in firstChild\n ) {\n // Children are RuleNode objects, need to flatten them\n (node.children as any[]).forEach((child: any) => {\n if (child && typeof child === 'object' && child.id) {\n child.parentId = node.id;\n flattenNode(child);\n }\n });\n }\n }\n };\n\n flattenNode(rootNode);\n return { nodes, rootNodes };\n }\n\n private validateNode(node: RuleNode): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Node-specific validation logic\n switch (node.type) {\n case RuleNodeType.FIELD_CONDITION:\n // Validate field condition\n break;\n // Add more cases...\n }\n\n return errors;\n }\n\n private validateStructure(state: RuleBuilderState): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Check for orphaned nodes\n // Check for circular references\n // Check for invalid parent-child relationships\n\n return errors;\n }\n\n private exportToTypeScript(\n specification: Specification<any>,\n options: ExportOptions,\n ): string {\n // Implementation for TypeScript export\n return `// TypeScript export not yet implemented`;\n }\n\n private exportToFormConfig(\n specification: Specification<any>,\n options: ExportOptions,\n ): string {\n // Implementation for form config export\n return `// Form config export not yet implemented`;\n }\n\n private normalizeSpecJson(input: any): any | null {\n if (!input || typeof input !== 'object') return null;\n if ((input as any).type) return input;\n\n // Inferência básica de tipos de especificação comuns\n // Campo simples: { field, operator, value }\n if ((input as any).field && (input as any).operator !== undefined) {\n return { type: 'field', ...input };\n }\n\n // Grupo booleano: { operator: 'and' | 'or' | 'xor', specs: [...] }\n if (\n Array.isArray((input as any).specs) &&\n typeof (input as any).operator === 'string'\n ) {\n return { type: (input as any).operator, ...input };\n }\n\n // NOT: { spec: {...} }\n if ((input as any).spec && !(input as any).specs) {\n return { type: 'not', ...input };\n }\n\n // IMPLIES: { antecedent, consequent }\n if ((input as any).antecedent && (input as any).consequent) {\n return { type: 'implies', ...input };\n }\n\n // fieldToField: { fieldA, fieldB, operator }\n if ((input as any).fieldA && (input as any).fieldB && (input as any).operator) {\n return { type: 'fieldToField', ...input };\n }\n\n // Cardinalidade: { minimum, specs } => atLeast; { exact, specs } => exactly\n if (Array.isArray((input as any).specs)) {\n if ((input as any).minimum != null) return { type: 'atLeast', ...input };\n if ((input as any).exact != null) return { type: 'exactly', ...input };\n }\n\n return null;\n }\n\n private isBuilderState(json: any): json is { nodes: Record<string, RuleNode>; rootNodes: string[] } {\n return (\n json &&\n typeof json === 'object' &&\n !Array.isArray(json) &&\n typeof (json as any).nodes === 'object' &&\n Array.isArray((json as any).rootNodes)\n );\n }\n}\n","import {\n Component,\n OnInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSelectModule } from '@angular/material/select';\n\nimport {\n RoundTripValidatorService,\n RoundTripValidationResult,\n RoundTripTestCase,\n} from '../services/round-trip-validator.service';\nimport { RuleBuilderService } from '../services/rule-builder.service';\nimport { RuleNode, RuleNodeType } from '../models/rule-builder.model';\n\n@Component({\n selector: 'praxis-round-trip-tester',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCardModule,\n MatButtonModule,\n MatIconModule,\n MatTabsModule,\n MatToolbarModule,\n MatProgressBarModule,\n MatSnackBarModule,\n MatExpansionModule,\n MatChipsModule,\n MatBadgeModule,\n MatTooltipModule,\n MatDividerModule,\n MatSelectModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"round-trip-tester-container\">\n <!-- Header -->\n <mat-toolbar color=\"primary\">\n <span class=\"toolbar-title\">\n <mat-icon>sync_alt</mat-icon>\n Round-Trip Validation Tester\n </span>\n\n <span class=\"toolbar-spacer\"></span>\n\n <div class=\"toolbar-actions\">\n <button\n mat-button\n (click)=\"runCurrentRuleTest()\"\n [disabled]=\"isRunning || !hasCurrentRule\"\n matTooltip=\"Test current rule from builder\"\n >\n <mat-icon>play_arrow</mat-icon>\n Test Current Rule\n </button>\n\n <button\n mat-button\n (click)=\"runTestSuite()\"\n [disabled]=\"isRunning\"\n matTooltip=\"Run full test suite\"\n >\n <mat-icon>playlist_play</mat-icon>\n Run Test Suite\n </button>\n\n <button\n mat-button\n (click)=\"clearResults()\"\n [disabled]=\"isRunning\"\n matTooltip=\"Clear all results\"\n >\n <mat-icon>clear</mat-icon>\n Clear\n </button>\n </div>\n </mat-toolbar>\n\n <!-- Main Content -->\n <div class=\"tester-content\">\n <div class=\"tester-grid\">\n <!-- Test Selection Panel -->\n <mat-card class=\"test-selection-panel\">\n <mat-card-header>\n <mat-card-title>Test Selection</mat-card-title>\n <mat-card-subtitle>Choose what to test</mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"test-options\">\n <!-- Current Rule Test -->\n <div class=\"test-option\">\n <h4>Current Rule</h4>\n <p class=\"test-description\">\n Test the rule currently loaded in the visual builder\n </p>\n <div class=\"current-rule-info\" *ngIf=\"hasCurrentRule\">\n <span class=\"rule-type\">{{ getCurrentRuleType() }}</span>\n <span class=\"rule-label\">{{ getCurrentRuleLabel() }}</span>\n </div>\n <div class=\"no-rule-info\" *ngIf=\"!hasCurrentRule\">\n <span class=\"no-rule-message\"\n >No rule loaded in builder</span\n >\n </div>\n </div>\n\n <mat-divider></mat-divider>\n\n <!-- Test Suite -->\n <div class=\"test-option\">\n <h4>Test Suite</h4>\n <p class=\"test-description\">\n Run predefined test cases covering common scenarios\n </p>\n <div class=\"test-suite-info\">\n <span class=\"test-count\"\n >{{ defaultTestCases.length }} test cases</span\n >\n <button\n mat-button\n size=\"small\"\n (click)=\"showTestCases = !showTestCases\"\n >\n {{ showTestCases ? 'Hide' : 'Show' }} Details\n </button>\n </div>\n\n <!-- Test Cases List -->\n <div *ngIf=\"showTestCases\" class=\"test-cases-list\">\n <div\n *ngFor=\"let testCase of defaultTestCases\"\n class=\"test-case-item\"\n >\n <div class=\"test-case-header\">\n <span class=\"test-case-name\">{{ testCase.name }}</span>\n <mat-chip\n [color]=\"getTestCaseColor(testCase)\"\n size=\"small\"\n >\n {{ testCase.visualRule.type }}\n </mat-chip>\n </div>\n <p class=\"test-case-description\">\n {{ testCase.description }}\n </p>\n </div>\n </div>\n </div>\n </div>\n </mat-card-content>\n </mat-card>\n\n <!-- Results Panel -->\n <mat-card class=\"results-panel\">\n <mat-card-header>\n <mat-card-title>\n Test Results\n <mat-icon *ngIf=\"isRunning\" class=\"running-icon\"\n >hourglass_empty</mat-icon\n >\n </mat-card-title>\n <mat-card-subtitle *ngIf=\"lastTestResult\">\n {{ getResultSummary() }}\n </mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <!-- Progress Bar -->\n <mat-progress-bar\n *ngIf=\"isRunning\"\n mode=\"indeterminate\"\n class=\"progress-bar\"\n >\n </mat-progress-bar>\n\n <!-- No Results Message -->\n <div\n *ngIf=\"!lastTestResult && !testSuiteResults && !isRunning\"\n class=\"no-results\"\n >\n <mat-icon>science</mat-icon>\n <h3>No Tests Run</h3>\n <p>Run a test to see validation results here</p>\n </div>\n\n <!-- Single Test Result -->\n <div\n *ngIf=\"lastTestResult && !testSuiteResults\"\n class=\"single-test-result\"\n >\n <div class=\"result-header\">\n <div\n class=\"result-status\"\n [class]=\"getStatusClass(lastTestResult)\"\n >\n <mat-icon>{{ getStatusIcon(lastTestResult) }}</mat-icon>\n <span>{{\n lastTestResult.success ? 'PASSED' : 'FAILED'\n }}</span>\n </div>\n <div class=\"result-timing\">\n {{ lastTestResult.performance.totalTime.toFixed(2) }}ms\n </div>\n </div>\n\n <!-- Stage Results -->\n <mat-expansion-panel class=\"stages-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>Conversion Stages</mat-panel-title>\n <mat-panel-description>\n Step-by-step validation results\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"stages-list\">\n <div\n *ngFor=\"let stage of getStages(lastTestResult)\"\n class=\"stage-item\"\n [class]=\"stage.success ? 'stage-success' : 'stage-error'\"\n >\n <div class=\"stage-header\">\n <mat-icon>{{\n stage.success ? 'check_circle' : 'error'\n }}</mat-icon>\n <span class=\"stage-name\">{{ stage.name }}</span>\n <span class=\"stage-timing\"\n >{{ stage.timing?.toFixed(2) }}ms</span\n >\n </div>\n <div *ngIf=\"stage.error\" class=\"stage-error-message\">\n {{ stage.error }}\n </div>\n <div *ngIf=\"stage.dsl\" class=\"stage-dsl-output\">\n <strong>Generated DSL:</strong>\n <pre>{{ stage.dsl }}</pre>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Data Integrity Results -->\n <mat-expansion-panel class=\"integrity-panel\">\n <mat-expansion-panel-header>\n <mat-panel-title>Data Integrity</mat-panel-title>\n <mat-panel-description>\n Validation of data preservation\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"integrity-checks\">\n <div\n *ngFor=\"let check of getIntegrityChecks(lastTestResult)\"\n class=\"integrity-check\"\n [class]=\"check.passed ? 'check-passed' : 'check-failed'\"\n >\n <mat-icon>{{\n check.passed ? 'check' : 'close'\n }}</mat-icon>\n <span>{{ check.name }}</span>\n </div>\n </div>\n </mat-expansion-panel>\n\n <!-- Errors and Warnings -->\n <div\n *ngIf=\"\n lastTestResult.errors.length > 0 ||\n lastTestResult.warnings.length > 0\n \"\n class=\"issues-section\"\n >\n <!-- Errors -->\n <div\n *ngIf=\"lastTestResult.errors.length > 0\"\n class=\"errors-section\"\n >\n <h4 class=\"section-title error-title\">\n <mat-icon>error</mat-icon>\n Errors ({{ lastTestResult.errors.length }})\n </h4>\n <div\n *ngFor=\"let error of lastTestResult.errors\"\n class=\"issue-item error-item\"\n >\n <div class=\"issue-header\">\n <span class=\"issue-code\">{{ error.code }}</span>\n <span class=\"issue-severity\">{{ error.severity }}</span>\n </div>\n <div class=\"issue-message\">{{ error.message }}</div>\n </div>\n </div>\n\n <!-- Warnings -->\n <div\n *ngIf=\"lastTestResult.warnings.length > 0\"\n class=\"warnings-section\"\n >\n <h4 class=\"section-title warning-title\">\n <mat-icon>warning</mat-icon>\n Warnings ({{ lastTestResult.warnings.length }})\n </h4>\n <div\n *ngFor=\"let warning of lastTestResult.warnings\"\n class=\"issue-item warning-item\"\n >\n <div class=\"issue-header\">\n <span class=\"issue-code\">{{ warning.code }}</span>\n <span class=\"issue-severity\">{{\n warning.severity\n }}</span>\n </div>\n <div class=\"issue-message\">{{ warning.message }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Test Suite Results -->\n <div *ngIf=\"testSuiteResults\" class=\"test-suite-results\">\n <div class=\"suite-summary\">\n <div class=\"summary-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Total Tests</span>\n <span class=\"stat-value\">{{\n testSuiteResults.totalTests\n }}</span>\n </div>\n <div class=\"stat-item passed\">\n <span class=\"stat-label\">Passed</span>\n <span class=\"stat-value\">{{\n testSuiteResults.passed\n }}</span>\n </div>\n <div class=\"stat-item failed\">\n <span class=\"stat-label\">Failed</span>\n <span class=\"stat-value\">{{\n testSuiteResults.failed\n }}</span>\n </div>\n </div>\n\n <div class=\"success-rate\">\n <span class=\"rate-label\">Success Rate:</span>\n <span class=\"rate-value\" [class]=\"getSuccessRateClass()\">\n {{ getSuccessRate() }}%\n </span>\n </div>\n </div>\n\n <!-- Individual Test Results -->\n <mat-expansion-panel\n *ngFor=\"let result of testSuiteResults.results; let i = index\"\n class=\"test-result-panel\"\n >\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon\n [class]=\"\n result.result.success ? 'success-icon' : 'error-icon'\n \"\n >\n {{ result.result.success ? 'check_circle' : 'error' }}\n </mat-icon>\n {{ result.testCase.name }}\n </mat-panel-title>\n <mat-panel-description>\n {{ result.testCase.description }}\n <span class=\"test-timing\"\n >{{\n result.result.performance.totalTime.toFixed(2)\n }}ms</span\n >\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"test-details\">\n <!-- Test Case Info -->\n <div class=\"test-case-info\">\n <h5>Test Case</h5>\n <div class=\"test-case-details\">\n <span class=\"detail-item\">\n <strong>Type:</strong>\n {{ result.testCase.visualRule.type }}\n </span>\n <span class=\"detail-item\">\n <strong>ID:</strong> {{ result.testCase.id }}\n </span>\n </div>\n </div>\n\n <!-- Quick Result Summary -->\n <div class=\"quick-summary\">\n <h5>Result Summary</h5>\n <div class=\"summary-items\">\n <span\n class=\"summary-item\"\n [class]=\"\n result.result.success ? 'success' : 'failure'\n \"\n >\n <mat-icon>{{\n result.result.success ? 'check' : 'close'\n }}</mat-icon>\n {{ result.result.success ? 'Success' : 'Failed' }}\n </span>\n <span class=\"summary-item\">\n <mat-icon>error</mat-icon>\n {{ result.result.errors.length }} errors\n </span>\n <span class=\"summary-item\">\n <mat-icon>warning</mat-icon>\n {{ result.result.warnings.length }} warnings\n </span>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n </mat-card-content>\n </mat-card>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .round-trip-tester-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .toolbar-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n }\n\n .toolbar-spacer {\n flex: 1;\n }\n\n .toolbar-actions {\n display: flex;\n gap: 8px;\n }\n\n .tester-content {\n flex: 1;\n padding: 16px;\n overflow: auto;\n }\n\n .tester-grid {\n display: grid;\n grid-template-columns: 1fr 2fr;\n gap: 16px;\n height: 100%;\n }\n\n .test-selection-panel,\n .results-panel {\n height: fit-content;\n max-height: 100%;\n overflow: auto;\n }\n\n .test-options {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .test-option h4 {\n margin: 0 0 8px 0;\n color: var(--mdc-theme-primary);\n }\n\n .test-description {\n margin: 0 0 12px 0;\n color: var(--mdc-theme-on-surface-variant);\n font-size: 14px;\n }\n\n .current-rule-info,\n .test-suite-info {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .rule-type,\n .test-count {\n background: var(--mdc-theme-primary-container);\n color: var(--mdc-theme-on-primary-container);\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n }\n\n .rule-label {\n font-size: 13px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .no-rule-message {\n color: var(--mdc-theme-error);\n font-style: italic;\n font-size: 13px;\n }\n\n .test-cases-list {\n margin-top: 12px;\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 4px;\n padding: 8px;\n }\n\n .test-case-item {\n margin-bottom: 12px;\n padding-bottom: 12px;\n border-bottom: 1px solid var(--mdc-theme-outline-variant);\n }\n\n .test-case-item:last-child {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: none;\n }\n\n .test-case-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 4px;\n }\n\n .test-case-name {\n font-weight: 500;\n font-size: 14px;\n }\n\n .test-case-description {\n margin: 0;\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .progress-bar {\n margin-bottom: 16px;\n }\n\n .running-icon {\n animation: spin 2s linear infinite;\n margin-left: 8px;\n }\n\n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n\n .no-results {\n text-align: center;\n padding: 40px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .no-results mat-icon {\n font-size: 48px;\n width: 48px;\n height: 48px;\n margin-bottom: 16px;\n }\n\n .no-results h3 {\n margin: 0 0 8px 0;\n }\n\n .single-test-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .result-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n border-radius: 8px;\n background: var(--mdc-theme-surface-variant);\n }\n\n .result-status {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n }\n\n .result-status.success {\n color: var(--mdc-theme-tertiary);\n }\n\n .result-status.failure {\n color: var(--mdc-theme-error);\n }\n\n .result-timing {\n font-family: monospace;\n font-size: 14px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .stages-list,\n .integrity-checks {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .stage-item {\n padding: 12px;\n border-radius: 4px;\n border-left: 4px solid var(--mdc-theme-outline);\n }\n\n .stage-item.stage-success {\n border-left-color: var(--mdc-theme-tertiary);\n background: var(--mdc-theme-tertiary-container);\n }\n\n .stage-item.stage-error {\n border-left-color: var(--mdc-theme-error);\n background: var(--mdc-theme-error-container);\n }\n\n .stage-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .stage-name {\n flex: 1;\n font-weight: 500;\n }\n\n .stage-timing {\n font-family: monospace;\n font-size: 12px;\n }\n\n .stage-error-message {\n color: var(--mdc-theme-error);\n font-size: 13px;\n margin-top: 4px;\n }\n\n .stage-dsl-output {\n margin-top: 8px;\n }\n\n .stage-dsl-output pre {\n background: var(--mdc-theme-surface);\n padding: 8px;\n border-radius: 4px;\n font-size: 12px;\n margin: 4px 0 0 0;\n overflow-x: auto;\n }\n\n .integrity-check {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 4px;\n }\n\n .integrity-check.check-passed {\n background: var(--mdc-theme-tertiary-container);\n color: var(--mdc-theme-on-tertiary-container);\n }\n\n .integrity-check.check-failed {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n }\n\n .issues-section {\n margin-top: 16px;\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 12px 0;\n font-size: 16px;\n }\n\n .error-title {\n color: var(--mdc-theme-error);\n }\n\n .warning-title {\n color: var(--mdc-theme-warning);\n }\n\n .issue-item {\n padding: 12px;\n border-radius: 4px;\n margin-bottom: 8px;\n }\n\n .error-item {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n border-left: 4px solid var(--mdc-theme-error);\n }\n\n .warning-item {\n background: var(--mdc-theme-warning-container);\n color: var(--mdc-theme-on-warning-container);\n border-left: 4px solid var(--mdc-theme-warning);\n }\n\n .issue-header {\n display: flex;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .issue-code {\n font-family: monospace;\n font-size: 12px;\n background: rgba(0, 0, 0, 0.1);\n padding: 2px 6px;\n border-radius: 3px;\n }\n\n .issue-severity {\n font-size: 11px;\n text-transform: uppercase;\n font-weight: 600;\n }\n\n .issue-message {\n font-size: 14px;\n }\n\n .test-suite-results {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .suite-summary {\n background: var(--mdc-theme-surface-variant);\n padding: 16px;\n border-radius: 8px;\n }\n\n .summary-stats {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .stat-item {\n text-align: center;\n padding: 12px;\n border-radius: 4px;\n background: var(--mdc-theme-surface);\n }\n\n .stat-item.passed {\n border-left: 4px solid var(--mdc-theme-tertiary);\n }\n\n .stat-item.failed {\n border-left: 4px solid var(--mdc-theme-error);\n }\n\n .stat-label {\n display: block;\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n margin-bottom: 4px;\n }\n\n .stat-value {\n display: block;\n font-size: 20px;\n font-weight: 600;\n }\n\n .success-rate {\n text-align: center;\n }\n\n .rate-label {\n font-size: 14px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .rate-value {\n font-size: 18px;\n font-weight: 600;\n margin-left: 8px;\n }\n\n .rate-value.excellent {\n color: var(--mdc-theme-tertiary);\n }\n\n .rate-value.good {\n color: var(--mdc-theme-warning);\n }\n\n .rate-value.poor {\n color: var(--mdc-theme-error);\n }\n\n .test-result-panel {\n margin-bottom: 8px;\n }\n\n .success-icon {\n color: var(--mdc-theme-tertiary);\n }\n\n .error-icon {\n color: var(--mdc-theme-error);\n }\n\n .test-timing {\n margin-left: auto;\n font-family: monospace;\n font-size: 12px;\n }\n\n .test-details {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n }\n\n .test-case-info h5,\n .quick-summary h5 {\n margin: 0 0 8px 0;\n color: var(--mdc-theme-primary);\n }\n\n .test-case-details {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .detail-item {\n font-size: 13px;\n }\n\n .summary-items {\n display: flex;\n gap: 16px;\n flex-wrap: wrap;\n }\n\n .summary-item {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n }\n\n .summary-item.success {\n color: var(--mdc-theme-tertiary);\n }\n\n .summary-item.failure {\n color: var(--mdc-theme-error);\n }\n\n /* Responsive adjustments */\n @media (max-width: 1024px) {\n .tester-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .test-selection-panel {\n order: 2;\n }\n\n .results-panel {\n order: 1;\n }\n }\n `,\n ],\n})\nexport class RoundTripTesterComponent implements OnInit {\n isRunning = false;\n showTestCases = false;\n lastTestResult: RoundTripValidationResult | null = null;\n testSuiteResults: any = null;\n defaultTestCases: RoundTripTestCase[] = [];\n hasCurrentRule = false;\n\n constructor(\n private roundTripValidator: RoundTripValidatorService,\n private ruleBuilderService: RuleBuilderService,\n private snackBar: MatSnackBar,\n private cdr: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n this.loadDefaultTestCases();\n this.checkCurrentRule();\n }\n\n private loadDefaultTestCases(): void {\n this.defaultTestCases = this.roundTripValidator.createDefaultTestCases();\n }\n\n private checkCurrentRule(): void {\n const state = this.ruleBuilderService.getCurrentState();\n this.hasCurrentRule = state.rootNodes.length > 0;\n }\n\n runCurrentRuleTest(): void {\n if (!this.hasCurrentRule) {\n this.snackBar.open('No rule loaded in builder', 'Close', {\n duration: 3000,\n });\n return;\n }\n\n this.isRunning = true;\n this.testSuiteResults = null;\n this.cdr.detectChanges();\n\n setTimeout(() => {\n try {\n const state = this.ruleBuilderService.getCurrentState();\n if (state.rootNodes.length > 0) {\n // Get the first root node for testing\n const rootNodeId = state.rootNodes[0];\n const rootNode = state.nodes[rootNodeId];\n\n if (rootNode) {\n // Build the complete rule tree\n const completeRule = this.buildCompleteRuleTree(\n rootNode,\n state.nodes,\n );\n this.lastTestResult =\n this.roundTripValidator.validateRoundTrip(completeRule);\n\n const message = this.lastTestResult.success\n ? 'Round-trip test passed!'\n : 'Round-trip test failed';\n const duration = this.lastTestResult.success ? 2000 : 4000;\n\n this.snackBar.open(message, 'Close', { duration });\n }\n }\n } catch (error) {\n this.snackBar.open(`Test failed: ${error}`, 'Close', {\n duration: 4000,\n });\n } finally {\n this.isRunning = false;\n this.cdr.detectChanges();\n }\n }, 100);\n }\n\n runTestSuite(): void {\n this.isRunning = true;\n this.lastTestResult = null;\n this.cdr.detectChanges();\n\n setTimeout(() => {\n try {\n this.testSuiteResults = this.roundTripValidator.runTestSuite(\n this.defaultTestCases,\n );\n\n const message = `Test suite completed: ${this.testSuiteResults.passed}/${this.testSuiteResults.totalTests} passed`;\n this.snackBar.open(message, 'Close', { duration: 3000 });\n } catch (error) {\n this.snackBar.open(`Test suite failed: ${error}`, 'Close', {\n duration: 4000,\n });\n } finally {\n this.isRunning = false;\n this.cdr.detectChanges();\n }\n }, 100);\n }\n\n clearResults(): void {\n this.lastTestResult = null;\n this.testSuiteResults = null;\n this.cdr.detectChanges();\n }\n\n private buildCompleteRuleTree(\n node: RuleNode,\n allNodes: Record<string, RuleNode>,\n ): RuleNode {\n return {\n ...node,\n children: node.children?.map((childId) => {\n if (typeof childId === 'string') {\n const childNode = allNodes[childId];\n if (childNode) {\n // Recursively build child tree but only return the ID for the children array\n this.buildCompleteRuleTree(childNode, allNodes);\n }\n return childId;\n }\n return childId;\n }),\n };\n }\n\n getCurrentRuleType(): string {\n const state = this.ruleBuilderService.getCurrentState();\n if (state.rootNodes.length > 0) {\n const rootNode = state.nodes[state.rootNodes[0]];\n if (!rootNode) return 'Unknown';\n\n // rootNode.type is always a string (RuleNodeType | RuleNodeTypeString)\n return String(rootNode.type);\n }\n return 'None';\n }\n\n getCurrentRuleLabel(): string {\n const state = this.ruleBuilderService.getCurrentState();\n if (state.rootNodes.length > 0) {\n const rootNode = state.nodes[state.rootNodes[0]];\n return rootNode?.label || 'Untitled Rule';\n }\n return '';\n }\n\n getTestCaseColor(testCase: RoundTripTestCase): 'primary' | 'accent' | 'warn' {\n const ruleType = testCase.visualRule.type;\n\n // Handle field conditions\n if (ruleType === 'fieldCondition') {\n return 'primary';\n }\n\n // Handle boolean groups\n if (ruleType === 'andGroup') {\n return 'accent';\n }\n if (ruleType === 'orGroup') {\n return 'accent';\n }\n if (ruleType === 'notGroup') {\n return 'accent';\n }\n if (ruleType === 'xorGroup') {\n return 'accent';\n }\n if (ruleType === 'impliesGroup') {\n return 'accent';\n }\n\n // Handle function calls\n if (ruleType === 'functionCall') {\n return 'warn';\n }\n\n return 'primary';\n }\n\n getResultSummary(): string {\n if (this.lastTestResult) {\n const timing = this.lastTestResult.performance.totalTime.toFixed(2);\n return `Single test • ${timing}ms • ${this.lastTestResult.success ? 'Passed' : 'Failed'}`;\n }\n if (this.testSuiteResults) {\n return `Test suite • ${this.testSuiteResults.passed}/${this.testSuiteResults.totalTests} passed`;\n }\n return '';\n }\n\n getStatusClass(result: RoundTripValidationResult): string {\n return result.success ? 'success' : 'failure';\n }\n\n getStatusIcon(result: RoundTripValidationResult): string {\n return result.success ? 'check_circle' : 'error';\n }\n\n getStages(result: RoundTripValidationResult): any[] {\n return [\n {\n name: 'Visual → Specification',\n success: result.stages.visualToSpecification.success,\n error: result.stages.visualToSpecification.error,\n timing: result.performance.stageTimings.visualToSpecification,\n },\n {\n name: 'Specification → DSL',\n success: result.stages.specificationToDsl.success,\n error: result.stages.specificationToDsl.error,\n dsl: result.stages.specificationToDsl.dsl,\n timing: result.performance.stageTimings.specificationToDsl,\n },\n {\n name: 'DSL → Specification',\n success: result.stages.dslToSpecification.success,\n error: result.stages.dslToSpecification.error,\n timing: result.performance.stageTimings.dslToSpecification,\n },\n {\n name: 'Specification → Visual',\n success: result.stages.specificationToVisual.success,\n error: result.stages.specificationToVisual.error,\n timing: result.performance.stageTimings.specificationToVisual,\n },\n ];\n }\n\n getIntegrityChecks(result: RoundTripValidationResult): any[] {\n return [\n {\n name: 'Node Count Match',\n passed: result.dataIntegrity.nodeCountMatch,\n },\n {\n name: 'Structure Match',\n passed: result.dataIntegrity.structureMatch,\n },\n {\n name: 'Metadata Preserved',\n passed: result.dataIntegrity.metadataPreserved,\n },\n {\n name: 'Logic Preserved',\n passed: result.dataIntegrity.logicPreserved,\n },\n ];\n }\n\n getSuccessRate(): number {\n if (!this.testSuiteResults) return 0;\n return Math.round(\n (this.testSuiteResults.passed / this.testSuiteResults.totalTests) * 100,\n );\n }\n\n getSuccessRateClass(): string {\n const rate = this.getSuccessRate();\n if (rate >= 90) return 'excellent';\n if (rate >= 70) return 'good';\n return 'poor';\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, from, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { RuleBuilderService } from './rule-builder.service';\nimport { SpecificationBridgeService } from './specification-bridge.service';\nimport {\n RuleNode,\n RuleBuilderState,\n ExportOptions,\n FieldConditionConfig,\n} from '../models/rule-builder.model';\n\ninterface CompleteRuleNode extends Omit<RuleNode, 'children'> {\n children?: CompleteRuleNode[];\n}\n\nexport interface ExportFormat {\n id: string;\n name: string;\n description: string;\n fileExtension: string;\n mimeType: string;\n supportsMetadata: boolean;\n supportsComments: boolean;\n}\n\nexport interface ExportResult {\n success: boolean;\n content: string;\n format: ExportFormat;\n filename: string;\n size: number;\n metadata?: {\n rulesCount: number;\n complexity: 'low' | 'medium' | 'high';\n exportedAt: string;\n version: string;\n };\n errors?: string[];\n warnings?: string[];\n}\n\nexport interface IntegrationEndpoint {\n id: string;\n name: string;\n description: string;\n url?: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH';\n headers?: Record<string, string>;\n authentication?: {\n type: 'none' | 'basic' | 'bearer' | 'apikey';\n credentials?: any;\n };\n supportedFormats: string[];\n responseFormat?: 'json' | 'xml' | 'text';\n}\n\nexport interface IntegrationResult {\n success: boolean;\n endpoint: IntegrationEndpoint;\n response?: any;\n statusCode?: number;\n error?: string;\n timestamp: string;\n}\n\nexport interface ExternalSystemConfig {\n id: string;\n name: string;\n type: 'rest-api' | 'webhook' | 'file-system' | 'database' | 'cloud-storage';\n config: any;\n endpoints: IntegrationEndpoint[];\n enabled: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ExportIntegrationService {\n private readonly SUPPORTED_FORMATS: ExportFormat[] = [\n {\n id: 'json',\n name: 'JSON',\n description:\n 'JavaScript Object Notation - Standard data interchange format',\n fileExtension: 'json',\n mimeType: 'application/json',\n supportsMetadata: true,\n supportsComments: false,\n },\n {\n id: 'json-schema',\n name: 'JSON Schema',\n description: 'JSON Schema for validation and documentation',\n fileExtension: 'schema.json',\n mimeType: 'application/schema+json',\n supportsMetadata: true,\n supportsComments: true,\n },\n {\n id: 'dsl',\n name: 'Domain Specific Language',\n description: 'Human-readable rule specification language',\n fileExtension: 'dsl',\n mimeType: 'text/plain',\n supportsMetadata: true,\n supportsComments: true,\n },\n {\n id: 'yaml',\n name: 'YAML',\n description:\n \"YAML Ain't Markup Language - Human-readable data serialization\",\n fileExtension: 'yaml',\n mimeType: 'application/x-yaml',\n supportsMetadata: true,\n supportsComments: true,\n },\n {\n id: 'xml',\n name: 'XML',\n description: 'Extensible Markup Language',\n fileExtension: 'xml',\n mimeType: 'application/xml',\n supportsMetadata: true,\n supportsComments: true,\n },\n {\n id: 'typescript',\n name: 'TypeScript',\n description: 'TypeScript interface definitions',\n fileExtension: 'ts',\n mimeType: 'text/typescript',\n supportsMetadata: true,\n supportsComments: true,\n },\n {\n id: 'openapi',\n name: 'OpenAPI Specification',\n description: 'OpenAPI 3.0 specification with validation rules',\n fileExtension: 'openapi.json',\n mimeType: 'application/vnd.oai.openapi+json',\n supportsMetadata: true,\n supportsComments: false,\n },\n {\n id: 'csv',\n name: 'CSV',\n description: 'Comma-separated values for tabular rule data',\n fileExtension: 'csv',\n mimeType: 'text/csv',\n supportsMetadata: false,\n supportsComments: false,\n },\n ];\n\n private externalSystems: ExternalSystemConfig[] = [];\n\n constructor(\n private ruleBuilderService: RuleBuilderService,\n private specificationBridge: SpecificationBridgeService,\n ) {}\n\n /**\n * Gets all supported export formats\n */\n getSupportedFormats(): ExportFormat[] {\n return [...this.SUPPORTED_FORMATS];\n }\n\n /**\n * Gets a specific export format by ID\n */\n getFormat(formatId: string): ExportFormat | null {\n return this.SUPPORTED_FORMATS.find((f) => f.id === formatId) || null;\n }\n\n /**\n * Exports current rules in the specified format\n */\n exportRules(options: {\n format: string;\n includeMetadata?: boolean;\n prettyPrint?: boolean;\n includeComments?: boolean;\n customFilename?: string;\n downloadFile?: boolean;\n }): Observable<ExportResult> {\n return from(this.performExport(options));\n }\n\n /**\n * Exports rules to multiple formats simultaneously\n */\n exportToMultipleFormats(\n formats: string[],\n options: any = {},\n ): Observable<ExportResult[]> {\n const exportPromises = formats.map((format) =>\n this.performExport({ ...options, format }),\n );\n\n return from(Promise.all(exportPromises));\n }\n\n /**\n * Integrates with external system\n */\n integrateWithSystem(\n systemId: string,\n endpointId: string,\n exportFormat: string,\n options: any = {},\n ): Observable<IntegrationResult> {\n return from(\n this.performIntegration(systemId, endpointId, exportFormat, options),\n );\n }\n\n /**\n * Registers a new external system configuration\n */\n registerExternalSystem(config: ExternalSystemConfig): void {\n const existingIndex = this.externalSystems.findIndex(\n (s) => s.id === config.id,\n );\n if (existingIndex >= 0) {\n this.externalSystems[existingIndex] = config;\n } else {\n this.externalSystems.push(config);\n }\n }\n\n /**\n * Gets all registered external systems\n */\n getExternalSystems(): ExternalSystemConfig[] {\n return [...this.externalSystems];\n }\n\n /**\n * Tests connectivity to an external system\n */\n testSystemConnectivity(\n systemId: string,\n ): Observable<{ success: boolean; message: string }> {\n return from(this.performConnectivityTest(systemId));\n }\n\n /**\n * Creates a shareable link for rules\n */\n createShareableLink(options: {\n format: string;\n expiration?: Date;\n accessLevel?: 'public' | 'protected' | 'private';\n password?: string;\n }): Observable<{ url: string; token: string; expiresAt?: Date }> {\n return from(this.generateShareableLink(options));\n }\n\n /**\n * Imports rules from external source\n */\n importFromExternal(source: {\n type: 'url' | 'file' | 'system';\n location: string;\n format: string;\n authentication?: any;\n }): Observable<{ success: boolean; imported: any; errors?: string[] }> {\n return from(this.performExternalImport(source));\n }\n\n /**\n * Private implementation methods\n */\n private async performExport(options: any): Promise<ExportResult> {\n try {\n const format = this.getFormat(options.format);\n if (!format) {\n throw new Error(`Unsupported export format: ${options.format}`);\n }\n\n const state = this.ruleBuilderService.getCurrentState();\n const content = await this.generateContent(format, state, options);\n const filename = options.customFilename || this.generateFilename(format);\n\n const result: ExportResult = {\n success: true,\n content,\n format,\n filename,\n size: new Blob([content]).size,\n metadata: this.generateExportMetadata(state) ?? undefined,\n };\n\n if (options.downloadFile) {\n this.downloadFile(content, filename, format.mimeType);\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n content: '',\n format: this.getFormat(options.format)!,\n filename: '',\n size: 0,\n errors: [String(error)],\n };\n }\n }\n\n private async generateContent(\n format: ExportFormat,\n state: RuleBuilderState,\n options: any,\n ): Promise<string> {\n switch (format.id) {\n case 'json':\n return this.generateJson(state, options);\n\n case 'json-schema':\n return this.generateJsonSchema(state, options);\n\n case 'dsl':\n return this.generateDsl(state, options);\n\n case 'yaml':\n return this.generateYaml(state, options);\n\n case 'xml':\n return this.generateXml(state, options);\n\n case 'typescript':\n return this.generateTypeScript(state, options);\n\n case 'openapi':\n return this.generateOpenApi(state, options);\n\n case 'csv':\n return this.generateCsv(state, options);\n\n default:\n throw new Error(\n `Content generation not implemented for format: ${format.id}`,\n );\n }\n }\n\n private generateJson(state: RuleBuilderState, options: any): string {\n const specification = this.ruleBuilderService.toSpecification();\n if (!specification) {\n return '{}';\n }\n\n const jsonData = {\n version: '1.0',\n exportedAt: new Date().toISOString(),\n metadata: options.includeMetadata\n ? this.generateExportMetadata(state)\n : undefined,\n specification: specification.toJSON(),\n visualRules: options.includeVisualRules\n ? {\n nodes: state.nodes,\n rootNodes: state.rootNodes,\n }\n : undefined,\n };\n\n return options.prettyPrint\n ? JSON.stringify(jsonData, null, 2)\n : JSON.stringify(jsonData);\n }\n\n private generateJsonSchema(state: RuleBuilderState, options: any): string {\n const schema = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n $id: 'https://praxis-platform.org/schemas/rules',\n title: 'Praxis Rules Schema',\n description: 'Schema for Praxis rule specifications',\n type: 'object',\n properties: this.generateSchemaProperties(state),\n required: this.generateSchemaRequired(state),\n additionalProperties: false,\n };\n\n return options.prettyPrint\n ? JSON.stringify(schema, null, 2)\n : JSON.stringify(schema);\n }\n\n private generateDsl(state: RuleBuilderState, options: any): string {\n const parts: string[] = [];\n\n if (options.includeComments) {\n parts.push('# Praxis Rules DSL Export');\n parts.push(`# Generated at: ${new Date().toISOString()}`);\n parts.push(`# Rules count: ${Object.keys(state.nodes).length}`);\n parts.push('');\n }\n\n for (const rootNodeId of state.rootNodes) {\n const rootNode = this.buildCompleteRuleNode(rootNodeId, state.nodes);\n if (rootNode) {\n try {\n const flatNode = this.flattenCompleteRuleNode(rootNode);\n const dsl = this.specificationBridge.exportToDsl(flatNode, {\n includeMetadata: options.includeMetadata,\n prettyPrint: options.prettyPrint,\n });\n parts.push(dsl);\n parts.push('');\n } catch (error) {\n if (options.includeComments) {\n parts.push(`# Error exporting rule ${rootNodeId}: ${error}`);\n }\n }\n }\n }\n\n return parts.join('\\n');\n }\n\n private generateYaml(state: RuleBuilderState, options: any): string {\n const data = {\n version: '1.0',\n exportedAt: new Date().toISOString(),\n metadata: options.includeMetadata\n ? this.generateExportMetadata(state)\n : undefined,\n rules: state.rootNodes\n .map((nodeId) => {\n const node = this.buildCompleteRuleNode(nodeId, state.nodes);\n return this.convertNodeToYamlObject(node);\n })\n .filter(Boolean),\n };\n\n // Simple YAML generation (in production, use a proper YAML library)\n return this.objectToYaml(data, 0);\n }\n\n private generateXml(state: RuleBuilderState, options: any): string {\n const lines = ['<?xml version=\"1.0\" encoding=\"UTF-8\"?>'];\n\n if (options.includeComments) {\n lines.push('<!-- Praxis Rules XML Export -->');\n lines.push(`<!-- Generated at: ${new Date().toISOString()} -->`);\n }\n\n lines.push('<praxis-rules version=\"1.0\">');\n\n if (options.includeMetadata) {\n const metadata = this.generateExportMetadata(state);\n if (metadata) {\n lines.push(' <metadata>');\n lines.push(` <rulesCount>${metadata.rulesCount ?? 0}</rulesCount>`);\n lines.push(\n ` <complexity>${metadata.complexity ?? 'unknown'}</complexity>`,\n );\n lines.push(` <exportedAt>${metadata.exportedAt ?? ''}</exportedAt>`);\n lines.push(` <version>${metadata.version ?? ''}</version>`);\n lines.push(' </metadata>');\n }\n }\n\n lines.push(' <rules>');\n for (const rootNodeId of state.rootNodes) {\n const node = this.buildCompleteRuleNode(rootNodeId, state.nodes);\n if (node) {\n lines.push(this.nodeToXml(node, 4));\n }\n }\n lines.push(' </rules>');\n lines.push('</praxis-rules>');\n\n return lines.join('\\n');\n }\n\n private generateTypeScript(state: RuleBuilderState, options: any): string {\n const lines: string[] = [];\n\n if (options.includeComments) {\n lines.push('/**');\n lines.push(' * Praxis Rules TypeScript Export');\n lines.push(` * Generated at: ${new Date().toISOString()}`);\n lines.push(` * Rules count: ${Object.keys(state.nodes).length}`);\n lines.push(' */');\n lines.push('');\n }\n\n lines.push('export interface PraxisRules {');\n lines.push(' version: string;');\n lines.push(' rules: Rule[];');\n if (options.includeMetadata) {\n lines.push(' metadata?: RuleMetadata;');\n }\n lines.push('}');\n lines.push('');\n\n lines.push('export interface Rule {');\n lines.push(' id: string;');\n lines.push(' type: RuleType;');\n lines.push(' label?: string;');\n lines.push(' config: RuleConfig;');\n lines.push(' children?: Rule[];');\n lines.push(' metadata?: ValidationMetadata;');\n lines.push('}');\n lines.push('');\n\n lines.push('export type RuleType =');\n const uniqueTypes = new Set(\n Object.values(state.nodes).map((node) => node.type),\n );\n const typeArray = Array.from(uniqueTypes).map((type) => ` | '${type}'`);\n lines.push(typeArray.join('\\n'));\n lines.push(';');\n\n return lines.join('\\n');\n }\n\n private generateOpenApi(state: RuleBuilderState, options: any): string {\n const spec = {\n openapi: '3.0.3',\n info: {\n title: 'Praxis Rules API',\n description: 'API specification with embedded rule validations',\n version: '1.0.0',\n },\n paths: {},\n components: {\n schemas: this.generateOpenApiSchemas(state),\n },\n };\n\n return options.prettyPrint\n ? JSON.stringify(spec, null, 2)\n : JSON.stringify(spec);\n }\n\n private generateCsv(state: RuleBuilderState, options: any): string {\n const headers = [\n 'ID',\n 'Type',\n 'Label',\n 'Field',\n 'Operator',\n 'Value',\n 'Parent ID',\n ];\n const rows: string[][] = [headers];\n\n const processNode = (node: CompleteRuleNode, parentId?: string) => {\n let field = '';\n let operator = '';\n let value = '';\n\n if (\n node.type === 'fieldCondition' &&\n node.config &&\n 'fieldName' in node.config\n ) {\n const cfg = node.config as FieldConditionConfig;\n field = cfg.fieldName || cfg.field || '';\n operator = String(cfg.operator ?? '');\n value = cfg.value !== undefined ? String(cfg.value) : '';\n }\n\n const row = [\n node.id,\n node.type,\n node.label || '',\n field,\n operator,\n value,\n parentId || '',\n ];\n rows.push(row);\n\n node.children?.forEach((child) => {\n processNode(child, node.id);\n });\n };\n\n for (const rootNodeId of state.rootNodes) {\n const node = this.buildCompleteRuleNode(rootNodeId, state.nodes);\n if (node) {\n processNode(node);\n }\n }\n\n return rows\n .map((row) =>\n row.map((cell) => `\"${cell.replace(/\"/g, '\"\"')}\"`).join(','),\n )\n .join('\\n');\n }\n\n private async performIntegration(\n systemId: string,\n endpointId: string,\n exportFormat: string,\n options: any,\n ): Promise<IntegrationResult> {\n try {\n const system = this.externalSystems.find((s) => s.id === systemId);\n if (!system) {\n throw new Error(`External system not found: ${systemId}`);\n }\n\n const endpoint = system.endpoints.find((e) => e.id === endpointId);\n if (!endpoint) {\n throw new Error(`Endpoint not found: ${endpointId}`);\n }\n\n const exportResult = await this.performExport({\n format: exportFormat,\n ...options,\n });\n if (!exportResult.success) {\n throw new Error(`Export failed: ${exportResult.errors?.join(', ')}`);\n }\n\n const response = await this.sendToEndpoint(\n endpoint,\n exportResult.content,\n exportFormat,\n );\n\n return {\n success: true,\n endpoint,\n response,\n statusCode: response.status,\n timestamp: new Date().toISOString(),\n };\n } catch (error) {\n return {\n success: false,\n endpoint: {} as IntegrationEndpoint,\n error: String(error),\n timestamp: new Date().toISOString(),\n };\n }\n }\n\n private async sendToEndpoint(\n endpoint: IntegrationEndpoint,\n content: string,\n format: string,\n ): Promise<any> {\n if (!endpoint.url) {\n throw new Error('Endpoint URL is required');\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': this.getFormat(format)?.mimeType || 'application/json',\n ...endpoint.headers,\n };\n\n // Add authentication headers if configured\n if (endpoint.authentication) {\n switch (endpoint.authentication.type) {\n case 'bearer':\n headers['Authorization'] =\n `Bearer ${endpoint.authentication.credentials.token}`;\n break;\n case 'basic':\n const encoded = btoa(\n `${endpoint.authentication.credentials.username}:${endpoint.authentication.credentials.password}`,\n );\n headers['Authorization'] = `Basic ${encoded}`;\n break;\n case 'apikey':\n headers[endpoint.authentication.credentials.headerName] =\n endpoint.authentication.credentials.apiKey;\n break;\n }\n }\n\n const response = await fetch(endpoint.url, {\n method: endpoint.method,\n headers,\n body: endpoint.method !== 'GET' ? content : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return {\n status: response.status,\n data: await response.text(),\n };\n }\n\n private async performConnectivityTest(\n systemId: string,\n ): Promise<{ success: boolean; message: string }> {\n try {\n const system = this.externalSystems.find((s) => s.id === systemId);\n if (!system) {\n return { success: false, message: `System not found: ${systemId}` };\n }\n\n // Test first available endpoint\n if (system.endpoints.length === 0) {\n return { success: false, message: 'No endpoints configured' };\n }\n\n const endpoint = system.endpoints[0];\n if (!endpoint.url) {\n return { success: false, message: 'No URL configured for endpoint' };\n }\n\n const response = await fetch(endpoint.url, { method: 'HEAD' });\n return {\n success: response.ok,\n message: response.ok\n ? 'Connection successful'\n : `HTTP ${response.status}`,\n };\n } catch (error) {\n return { success: false, message: String(error) };\n }\n }\n\n private async generateShareableLink(\n options: any,\n ): Promise<{ url: string; token: string; expiresAt?: Date }> {\n // Mock implementation - in production, this would integrate with a sharing service\n const token = this.generateToken();\n const baseUrl = window.location.origin;\n const url = `${baseUrl}/shared/${token}`;\n\n return {\n url,\n token,\n expiresAt: options.expiration,\n };\n }\n\n private async performExternalImport(\n source: any,\n ): Promise<{ success: boolean; imported: any; errors?: string[] }> {\n try {\n let content: string;\n\n switch (source.type) {\n case 'url':\n const response = await fetch(source.location);\n content = await response.text();\n break;\n\n case 'file':\n // Would be handled by file input in the UI\n content = source.location;\n break;\n\n default:\n throw new Error(`Unsupported import source type: ${source.type}`);\n }\n\n this.ruleBuilderService.import(content, { format: source.format });\n\n return {\n success: true,\n imported: { contentLength: content.length, format: source.format },\n };\n } catch (error) {\n return {\n success: false,\n imported: null,\n errors: [String(error)],\n };\n }\n }\n\n // Utility methods\n\n private buildCompleteRuleNode(\n nodeId: string,\n allNodes: Record<string, RuleNode>,\n ): CompleteRuleNode | null {\n const node = allNodes[nodeId];\n if (!node) return null;\n\n const childNodes = node.children\n ?.map((childId) => this.buildCompleteRuleNode(childId, allNodes))\n .filter((c): c is CompleteRuleNode => !!c);\n\n return {\n ...node,\n children: childNodes && childNodes.length > 0 ? childNodes : undefined,\n };\n }\n\n private flattenCompleteRuleNode(completeNode: CompleteRuleNode): RuleNode {\n return {\n ...completeNode,\n children: completeNode.children?.map(child => child.id),\n };\n }\n\n private generateExportMetadata(state: RuleBuilderState | undefined): {\n rulesCount: number;\n complexity: 'low' | 'medium' | 'high';\n exportedAt: string;\n version: string;\n } | null {\n if (!state || !state.nodes) {\n return null;\n }\n\n const rulesCount = Object.keys(state.nodes).length;\n const complexity =\n rulesCount > 20 ? 'high' : rulesCount > 10 ? 'medium' : 'low';\n\n return {\n rulesCount,\n complexity: complexity as 'low' | 'medium' | 'high',\n exportedAt: new Date().toISOString(),\n version: '1.0.0',\n };\n }\n\n private generateFilename(format: ExportFormat): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n return `praxis-rules-${timestamp}.${format.fileExtension}`;\n }\n\n private downloadFile(\n content: string,\n filename: string,\n mimeType: string,\n ): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n\n private generateToken(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(16)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n // Additional helper methods for specific format generation...\n private generateSchemaProperties(state: RuleBuilderState): any {\n // Implementation for JSON Schema properties\n return {};\n }\n\n private generateSchemaRequired(state: RuleBuilderState): string[] {\n // Implementation for JSON Schema required fields\n return [];\n }\n\n private convertNodeToYamlObject(node: CompleteRuleNode | null): any {\n if (!node) return null;\n return {\n id: node.id,\n type: node.type,\n label: node.label,\n config: node.config,\n children: node.children\n ?.map((child) => this.convertNodeToYamlObject(child))\n .filter(Boolean),\n metadata: node.metadata,\n };\n }\n\n private objectToYaml(obj: any, indent: number): string {\n // Simple YAML serialization - use proper YAML library in production\n const spaces = ' '.repeat(indent);\n let result = '';\n\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n\n result += `${spaces}${key}:`;\n\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n result += '\\n';\n value.forEach((item) => {\n result += `${spaces} - `;\n if (typeof item === 'object') {\n result += '\\n' + this.objectToYaml(item, indent + 2);\n } else {\n result += `${item}\\n`;\n }\n });\n } else {\n result += '\\n' + this.objectToYaml(value, indent + 1);\n }\n } else {\n result += ` ${value}\\n`;\n }\n }\n\n return result;\n }\n\n private nodeToXml(node: CompleteRuleNode, indent: number): string {\n const spaces = ' '.repeat(indent);\n let xml = `${spaces}<rule id=\"${node.id}\" type=\"${node.type}\">`;\n\n if (node.label) {\n xml += `\\n${spaces} <label>${this.escapeXml(node.label)}</label>`;\n }\n\n if (node.config) {\n xml += `\\n${spaces} <config>${this.escapeXml(JSON.stringify(node.config))}</config>`;\n }\n\n if (node.children && node.children.length > 0) {\n xml += `\\n${spaces} <children>`;\n node.children.forEach((child) => {\n xml += '\\n' + this.nodeToXml(child, indent + 4);\n });\n xml += `\\n${spaces} </children>`;\n }\n\n xml += `\\n${spaces}</rule>`;\n return xml;\n }\n\n private escapeXml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n\n private generateOpenApiSchemas(state: RuleBuilderState): any {\n // Implementation for OpenAPI schema generation\n return {\n Rule: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n type: { type: 'string' },\n label: { type: 'string' },\n config: { type: 'object' },\n },\n },\n };\n }\n}\n","import {\n Component,\n Inject,\n OnInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n Validators,\n FormsModule,\n} from '@angular/forms';\nimport {\n MatDialogModule,\n MatDialogRef,\n MAT_DIALOG_DATA,\n} from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\n\nimport {\n ExportIntegrationService,\n ExportFormat,\n ExportResult,\n ExternalSystemConfig,\n IntegrationEndpoint,\n} from '../services/export-integration.service';\n\nexport interface ExportDialogData {\n title?: string;\n allowMultipleFormats?: boolean;\n preselectedFormat?: string;\n showIntegrationTab?: boolean;\n showSharingTab?: boolean;\n}\n\n@Component({\n selector: 'praxis-export-dialog',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n MatDialogModule,\n MatButtonModule,\n MatIconModule,\n MatTabsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatCheckboxModule,\n MatSlideToggleModule,\n MatProgressBarModule,\n MatSnackBarModule,\n MatListModule,\n MatDividerModule,\n MatCardModule,\n MatChipsModule,\n MatTooltipModule,\n MatExpansionModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"export-dialog\">\n <div mat-dialog-title class=\"dialog-header\">\n <mat-icon>download</mat-icon>\n <span>{{ data.title || 'Export Rules' }}</span>\n </div>\n\n <div mat-dialog-content class=\"dialog-content\">\n <mat-tab-group [(selectedIndex)]=\"activeTabIndex\">\n <!-- Export Tab -->\n <mat-tab label=\"Export\">\n <div class=\"tab-content\">\n <form [formGroup]=\"exportForm\" class=\"export-form\">\n <!-- Format Selection -->\n <div class=\"section\">\n <h3 class=\"section-title\">Export Format</h3>\n\n <div class=\"format-grid\">\n <mat-card\n *ngFor=\"let format of supportedFormats\"\n class=\"format-card\"\n [class.selected]=\"isFormatSelected(format.id)\"\n (click)=\"selectFormat(format.id)\"\n >\n <mat-card-header>\n <mat-card-title>{{ format.name }}</mat-card-title>\n <mat-card-subtitle>{{\n format.fileExtension\n }}</mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <p class=\"format-description\">\n {{ format.description }}\n </p>\n\n <div class=\"format-features\">\n <mat-chip\n *ngIf=\"format.supportsMetadata\"\n color=\"primary\"\n size=\"small\"\n >\n Metadata\n </mat-chip>\n <mat-chip\n *ngIf=\"format.supportsComments\"\n color=\"accent\"\n size=\"small\"\n >\n Comments\n </mat-chip>\n </div>\n </mat-card-content>\n </mat-card>\n </div>\n </div>\n\n <mat-divider></mat-divider>\n\n <!-- Export Options -->\n <div class=\"section\">\n <h3 class=\"section-title\">Options</h3>\n\n <div class=\"options-grid\">\n <mat-slide-toggle formControlName=\"includeMetadata\">\n Include Metadata\n </mat-slide-toggle>\n\n <mat-slide-toggle formControlName=\"prettyPrint\">\n Pretty Print\n </mat-slide-toggle>\n\n <mat-slide-toggle\n formControlName=\"includeComments\"\n [disabled]=\"!selectedFormat?.supportsComments\"\n >\n Include Comments\n </mat-slide-toggle>\n\n <mat-slide-toggle formControlName=\"includeVisualRules\">\n Include Visual Rules\n </mat-slide-toggle>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Custom Filename</mat-label>\n <input\n matInput\n formControlName=\"customFilename\"\n placeholder=\"Leave empty for auto-generated\"\n />\n <mat-hint>Will be auto-generated if not specified</mat-hint>\n </mat-form-field>\n </div>\n\n <mat-divider></mat-divider>\n\n <!-- Multiple Format Export -->\n <div class=\"section\" *ngIf=\"data.allowMultipleFormats\">\n <h3 class=\"section-title\">Batch Export</h3>\n\n <mat-slide-toggle\n [(ngModel)]=\"enableBatchExport\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n Export to Multiple Formats\n </mat-slide-toggle>\n\n <div *ngIf=\"enableBatchExport\" class=\"batch-formats\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Additional Formats</mat-label>\n <mat-select multiple formControlName=\"additionalFormats\">\n <mat-option\n *ngFor=\"let format of supportedFormats\"\n [value]=\"format.id\"\n [disabled]=\"format.id === selectedFormat?.id\"\n >\n {{ format.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </form>\n\n <!-- Export Results -->\n <div *ngIf=\"exportResults.length > 0\" class=\"export-results\">\n <h3 class=\"section-title\">Export Results</h3>\n\n <mat-expansion-panel\n *ngFor=\"let result of exportResults\"\n class=\"result-panel\"\n >\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon\n [class]=\"result.success ? 'success-icon' : 'error-icon'\"\n >\n {{ result.success ? 'check_circle' : 'error' }}\n </mat-icon>\n {{ result.format.name }}\n </mat-panel-title>\n <mat-panel-description>\n {{ result.filename }} ({{ formatFileSize(result.size) }})\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"result-details\">\n <div *ngIf=\"result.success\" class=\"success-details\">\n <div class=\"detail-row\">\n <strong>File Size:</strong>\n {{ formatFileSize(result.size) }}\n </div>\n <div class=\"detail-row\" *ngIf=\"result.metadata\">\n <strong>Rules Count:</strong>\n {{ result.metadata.rulesCount }}\n </div>\n <div class=\"detail-row\" *ngIf=\"result.metadata\">\n <strong>Complexity:</strong>\n {{ result.metadata.complexity }}\n </div>\n\n <div class=\"action-buttons\">\n <button mat-button (click)=\"downloadResult(result)\">\n <mat-icon>download</mat-icon>\n Download\n </button>\n <button mat-button (click)=\"previewResult(result)\">\n <mat-icon>preview</mat-icon>\n Preview\n </button>\n <button\n mat-button\n (click)=\"copyToClipboard(result.content)\"\n >\n <mat-icon>content_copy</mat-icon>\n Copy\n </button>\n </div>\n </div>\n\n <div *ngIf=\"!result.success\" class=\"error-details\">\n <div class=\"error-list\">\n <div\n *ngFor=\"let error of result.errors\"\n class=\"error-item\"\n >\n {{ error }}\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n </div>\n </mat-tab>\n\n <!-- Integration Tab -->\n <mat-tab label=\"Integration\" *ngIf=\"data.showIntegrationTab\">\n <div class=\"tab-content\">\n <form [formGroup]=\"integrationForm\" class=\"integration-form\">\n <!-- System Selection -->\n <div class=\"section\">\n <h3 class=\"section-title\">External System</h3>\n\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Select System</mat-label>\n <mat-select\n formControlName=\"systemId\"\n (selectionChange)=\"onSystemChange($event)\"\n >\n <mat-option\n *ngFor=\"let system of externalSystems\"\n [value]=\"system.id\"\n >\n {{ system.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <div *ngIf=\"selectedSystem\" class=\"system-info\">\n <mat-card class=\"info-card\">\n <mat-card-content>\n <div class=\"system-details\">\n <div class=\"detail-row\">\n <strong>Type:</strong> {{ selectedSystem.type }}\n </div>\n <div class=\"detail-row\">\n <strong>Status:</strong>\n <mat-chip\n [color]=\"\n selectedSystem.enabled ? 'primary' : 'warn'\n \"\n size=\"small\"\n >\n {{\n selectedSystem.enabled ? 'Enabled' : 'Disabled'\n }}\n </mat-chip>\n </div>\n <div class=\"detail-row\">\n <strong>Endpoints:</strong>\n {{ selectedSystem.endpoints.length }}\n </div>\n </div>\n\n <button\n mat-button\n color=\"primary\"\n (click)=\"testConnectivity()\"\n [disabled]=\"isTestingConnectivity\"\n >\n <mat-icon>wifi</mat-icon>\n {{\n isTestingConnectivity\n ? 'Testing...'\n : 'Test Connection'\n }}\n </button>\n </mat-card-content>\n </mat-card>\n </div>\n </div>\n\n <!-- Endpoint Selection -->\n <div class=\"section\" *ngIf=\"selectedSystem\">\n <h3 class=\"section-title\">Endpoint</h3>\n\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Select Endpoint</mat-label>\n <mat-select formControlName=\"endpointId\">\n <mat-option\n *ngFor=\"let endpoint of selectedSystem.endpoints\"\n [value]=\"endpoint.id\"\n >\n {{ endpoint.name }} ({{ endpoint.method }})\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Format for Integration -->\n <div class=\"section\">\n <h3 class=\"section-title\">Export Format for Integration</h3>\n\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Format</mat-label>\n <mat-select formControlName=\"integrationFormat\">\n <mat-option\n *ngFor=\"let format of supportedFormats\"\n [value]=\"format.id\"\n >\n {{ format.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </form>\n\n <!-- Integration Results -->\n <div\n *ngIf=\"integrationResults.length > 0\"\n class=\"integration-results\"\n >\n <h3 class=\"section-title\">Integration Results</h3>\n\n <div\n *ngFor=\"let result of integrationResults\"\n class=\"integration-result\"\n >\n <mat-card\n [class]=\"result.success ? 'success-card' : 'error-card'\"\n >\n <mat-card-header>\n <mat-card-title>\n <mat-icon>{{\n result.success ? 'check_circle' : 'error'\n }}</mat-icon>\n {{ result.endpoint.name }}\n </mat-card-title>\n <mat-card-subtitle>\n {{ result.timestamp | date: 'medium' }}\n </mat-card-subtitle>\n </mat-card-header>\n\n <mat-card-content>\n <div *ngIf=\"result.success\" class=\"success-content\">\n <div class=\"detail-row\">\n <strong>Status Code:</strong> {{ result.statusCode }}\n </div>\n <div class=\"detail-row\" *ngIf=\"result.response\">\n <strong>Response:</strong> {{ result.response.data }}\n </div>\n </div>\n\n <div *ngIf=\"!result.success\" class=\"error-content\">\n <div class=\"error-message\">{{ result.error }}</div>\n </div>\n </mat-card-content>\n </mat-card>\n </div>\n </div>\n </div>\n </mat-tab>\n\n <!-- Sharing Tab -->\n <mat-tab label=\"Sharing\" *ngIf=\"data.showSharingTab\">\n <div class=\"tab-content\">\n <form [formGroup]=\"sharingForm\" class=\"sharing-form\">\n <div class=\"section\">\n <h3 class=\"section-title\">Create Shareable Link</h3>\n\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Share Format</mat-label>\n <mat-select formControlName=\"shareFormat\">\n <mat-option\n *ngFor=\"let format of supportedFormats\"\n [value]=\"format.id\"\n >\n {{ format.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Access Level</mat-label>\n <mat-select formControlName=\"accessLevel\">\n <mat-option value=\"public\">Public</mat-option>\n <mat-option value=\"protected\">Protected</mat-option>\n <mat-option value=\"private\">Private</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Expiration Date</mat-label>\n <input\n matInput\n type=\"datetime-local\"\n formControlName=\"expirationDate\"\n />\n </mat-form-field>\n\n <mat-form-field\n appearance=\"outline\"\n class=\"full-width\"\n *ngIf=\"\n sharingForm.get('accessLevel')?.value === 'protected'\n \"\n >\n <mat-label>Password</mat-label>\n <input\n matInput\n type=\"password\"\n formControlName=\"password\"\n />\n </mat-form-field>\n </div>\n </form>\n\n <!-- Share Results -->\n <div *ngIf=\"shareResult\" class=\"share-result\">\n <mat-card class=\"share-card\">\n <mat-card-header>\n <mat-card-title>Shareable Link Created</mat-card-title>\n </mat-card-header>\n\n <mat-card-content>\n <div class=\"share-url\">\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Share URL</mat-label>\n <input matInput [value]=\"shareResult.url\" readonly />\n <button\n matSuffix\n mat-icon-button\n (click)=\"copyShareUrl()\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"share-details\">\n <div class=\"detail-row\">\n <strong>Token:</strong> {{ shareResult.token }}\n </div>\n <div class=\"detail-row\" *ngIf=\"shareResult.expiresAt\">\n <strong>Expires:</strong>\n {{ shareResult.expiresAt | date: 'medium' }}\n </div>\n </div>\n </mat-card-content>\n </mat-card>\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n\n <div mat-dialog-actions class=\"dialog-actions\">\n <button mat-button (click)=\"onCancel()\">Cancel</button>\n\n <div class=\"action-buttons\">\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!canExport()\"\n (click)=\"onExport()\"\n *ngIf=\"activeTabIndex === 0\"\n >\n <mat-icon>download</mat-icon>\n Export\n </button>\n\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!canIntegrate()\"\n (click)=\"onIntegrate()\"\n *ngIf=\"activeTabIndex === 1\"\n >\n <mat-icon>send</mat-icon>\n Integrate\n </button>\n\n <button\n mat-button\n color=\"primary\"\n [disabled]=\"!canShare()\"\n (click)=\"onCreateShare()\"\n *ngIf=\"activeTabIndex === 2\"\n >\n <mat-icon>share</mat-icon>\n Create Link\n </button>\n </div>\n </div>\n\n <!-- Progress Bar -->\n <mat-progress-bar\n *ngIf=\"isProcessing\"\n mode=\"indeterminate\"\n class=\"progress-bar\"\n >\n </mat-progress-bar>\n </div>\n `,\n styles: [\n `\n .export-dialog {\n width: 800px;\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n }\n\n .dialog-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n }\n\n .dialog-content {\n flex: 1;\n overflow: hidden;\n }\n\n .tab-content {\n padding: 16px 0;\n height: 60vh;\n overflow-y: auto;\n }\n\n .section {\n margin-bottom: 24px;\n }\n\n .section-title {\n margin: 0 0 16px 0;\n color: var(--mdc-theme-primary);\n font-size: 16px;\n font-weight: 500;\n }\n\n .format-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .format-card {\n cursor: pointer;\n transition: all 0.2s ease;\n border: 2px solid transparent;\n }\n\n .format-card:hover {\n border-color: var(--mdc-theme-primary-container);\n box-shadow: 0 4px 8px var(--vb-shadow-low-color, rgba(0,0,0,0.1));\n }\n\n .format-card.selected {\n border-color: var(--mdc-theme-primary);\n background: var(--mdc-theme-primary-container);\n }\n\n .format-description {\n font-size: 13px;\n color: var(--mdc-theme-on-surface-variant);\n margin: 8px 0;\n min-height: 40px;\n }\n\n .format-features {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n }\n\n .options-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .full-width {\n width: 100%;\n }\n\n .batch-formats {\n margin-top: 16px;\n }\n\n .export-results,\n .integration-results {\n margin-top: 24px;\n }\n\n .result-panel {\n margin-bottom: 8px;\n }\n\n .success-icon {\n color: var(--mdc-theme-tertiary);\n }\n\n .error-icon {\n color: var(--mdc-theme-error);\n }\n\n .result-details {\n padding: 16px 0;\n }\n\n .detail-row {\n margin-bottom: 8px;\n font-size: 14px;\n }\n\n .action-buttons {\n display: flex;\n gap: 8px;\n margin-top: 16px;\n }\n\n .error-details {\n color: var(--mdc-theme-error);\n }\n\n .error-item {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n padding: 8px;\n border-radius: 4px;\n margin-bottom: 4px;\n }\n\n .system-info {\n margin-top: 16px;\n }\n\n .info-card {\n background: var(--mdc-theme-surface-variant);\n }\n\n .system-details {\n margin-bottom: 16px;\n }\n\n .integration-result {\n margin-bottom: 16px;\n }\n\n .success-card {\n border-left: 4px solid var(--mdc-theme-tertiary);\n }\n\n .error-card {\n border-left: 4px solid var(--mdc-theme-error);\n }\n\n .sharing-form {\n max-width: 400px;\n }\n\n .share-card {\n margin-top: 16px;\n border-left: 4px solid var(--mdc-theme-primary);\n }\n\n .share-url {\n margin-bottom: 16px;\n }\n\n .dialog-actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n }\n\n .dialog-actions .action-buttons {\n display: flex;\n gap: 8px;\n }\n\n .progress-bar {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .export-dialog {\n width: 100vw;\n height: 100vh;\n max-width: none;\n max-height: none;\n }\n\n .format-grid {\n grid-template-columns: 1fr;\n }\n\n .options-grid {\n grid-template-columns: 1fr;\n }\n }\n `,\n ],\n})\nexport class ExportDialogComponent implements OnInit {\n exportForm: FormGroup;\n integrationForm: FormGroup;\n sharingForm: FormGroup;\n\n activeTabIndex = 0;\n isProcessing = false;\n enableBatchExport = false;\n isTestingConnectivity = false;\n\n supportedFormats: ExportFormat[] = [];\n selectedFormat: ExportFormat | null = null;\n externalSystems: ExternalSystemConfig[] = [];\n selectedSystem: ExternalSystemConfig | null = null;\n\n exportResults: ExportResult[] = [];\n integrationResults: any[] = [];\n shareResult: any = null;\n\n constructor(\n public dialogRef: MatDialogRef<ExportDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: ExportDialogData,\n private fb: FormBuilder,\n private exportService: ExportIntegrationService,\n private snackBar: MatSnackBar,\n private cdr: ChangeDetectorRef,\n ) {\n this.exportForm = this.createExportForm();\n this.integrationForm = this.createIntegrationForm();\n this.sharingForm = this.createSharingForm();\n }\n\n ngOnInit(): void {\n this.loadSupportedFormats();\n this.loadExternalSystems();\n\n if (this.data.preselectedFormat) {\n this.selectFormat(this.data.preselectedFormat);\n }\n }\n\n private createExportForm(): FormGroup {\n return this.fb.group({\n includeMetadata: [true],\n prettyPrint: [true],\n includeComments: [false],\n includeVisualRules: [false],\n customFilename: [''],\n additionalFormats: [[]],\n });\n }\n\n private createIntegrationForm(): FormGroup {\n return this.fb.group({\n systemId: ['', Validators.required],\n endpointId: ['', Validators.required],\n integrationFormat: ['json', Validators.required],\n });\n }\n\n private createSharingForm(): FormGroup {\n return this.fb.group({\n shareFormat: ['json', Validators.required],\n accessLevel: ['public', Validators.required],\n expirationDate: [''],\n password: [''],\n });\n }\n\n private loadSupportedFormats(): void {\n this.supportedFormats = this.exportService.getSupportedFormats();\n }\n\n private loadExternalSystems(): void {\n this.externalSystems = this.exportService.getExternalSystems();\n }\n\n selectFormat(formatId: string): void {\n this.selectedFormat = this.exportService.getFormat(formatId);\n\n // Update form controls based on format capabilities\n if (this.selectedFormat) {\n if (!this.selectedFormat.supportsComments) {\n this.exportForm.patchValue({ includeComments: false });\n }\n }\n }\n\n isFormatSelected(formatId: string): boolean {\n return this.selectedFormat?.id === formatId;\n }\n\n onSystemChange(event: MatSelectChange): void {\n const systemId = event.value;\n this.selectedSystem =\n this.externalSystems.find((s) => s.id === systemId) || null;\n this.integrationForm.patchValue({ endpointId: '' });\n }\n\n async testConnectivity(): Promise<void> {\n if (!this.selectedSystem) return;\n\n this.isTestingConnectivity = true;\n this.cdr.detectChanges();\n\n try {\n const result = await this.exportService\n .testSystemConnectivity(this.selectedSystem.id)\n .toPromise();\n const message = result?.success\n ? 'Connection successful!'\n : `Connection failed: ${result?.message}`;\n const duration = result?.success ? 2000 : 4000;\n\n this.snackBar.open(message, 'Close', { duration });\n } catch (error) {\n this.snackBar.open(`Connection test failed: ${error}`, 'Close', {\n duration: 4000,\n });\n } finally {\n this.isTestingConnectivity = false;\n this.cdr.detectChanges();\n }\n }\n\n async onExport(): Promise<void> {\n if (!this.canExport()) return;\n\n this.isProcessing = true;\n this.exportResults = [];\n this.cdr.detectChanges();\n\n try {\n const formValue = this.exportForm.value;\n const formats = this.enableBatchExport\n ? [this.selectedFormat!.id, ...formValue.additionalFormats]\n : [this.selectedFormat!.id];\n\n const results = await this.exportService\n .exportToMultipleFormats(formats, {\n includeMetadata: formValue.includeMetadata,\n prettyPrint: formValue.prettyPrint,\n includeComments: formValue.includeComments,\n includeVisualRules: formValue.includeVisualRules,\n customFilename: formValue.customFilename,\n downloadFile: true,\n })\n .toPromise();\n\n this.exportResults = results || [];\n\n const successCount = this.exportResults.filter((r) => r.success).length;\n this.snackBar.open(\n `Successfully exported ${successCount}/${this.exportResults.length} files`,\n 'Close',\n { duration: 3000 },\n );\n } catch (error) {\n this.snackBar.open(`Export failed: ${error}`, 'Close', {\n duration: 4000,\n });\n } finally {\n this.isProcessing = false;\n this.cdr.detectChanges();\n }\n }\n\n async onIntegrate(): Promise<void> {\n if (!this.canIntegrate()) return;\n\n this.isProcessing = true;\n this.cdr.detectChanges();\n\n try {\n const formValue = this.integrationForm.value;\n const result = await this.exportService\n .integrateWithSystem(\n formValue.systemId,\n formValue.endpointId,\n formValue.integrationFormat,\n )\n .toPromise();\n\n if (result) {\n this.integrationResults.push(result);\n const message = result.success\n ? 'Integration successful!'\n : `Integration failed: ${result.error}`;\n this.snackBar.open(message, 'Close', { duration: 3000 });\n }\n } catch (error) {\n this.snackBar.open(`Integration failed: ${error}`, 'Close', {\n duration: 4000,\n });\n } finally {\n this.isProcessing = false;\n this.cdr.detectChanges();\n }\n }\n\n async onCreateShare(): Promise<void> {\n if (!this.canShare()) return;\n\n this.isProcessing = true;\n this.cdr.detectChanges();\n\n try {\n const formValue = this.sharingForm.value;\n const options = {\n format: formValue.shareFormat,\n accessLevel: formValue.accessLevel,\n expiration: formValue.expirationDate\n ? new Date(formValue.expirationDate)\n : undefined,\n password: formValue.password,\n };\n\n const result = await this.exportService\n .createShareableLink(options)\n .toPromise();\n this.shareResult = result;\n\n this.snackBar.open('Shareable link created!', 'Close', {\n duration: 2000,\n });\n } catch (error) {\n this.snackBar.open(`Failed to create share link: ${error}`, 'Close', {\n duration: 4000,\n });\n } finally {\n this.isProcessing = false;\n this.cdr.detectChanges();\n }\n }\n\n canExport(): boolean {\n return !!this.selectedFormat && !this.isProcessing;\n }\n\n canIntegrate(): boolean {\n return this.integrationForm.valid && !this.isProcessing;\n }\n\n canShare(): boolean {\n return this.sharingForm.valid && !this.isProcessing;\n }\n\n downloadResult(result: ExportResult): void {\n const blob = new Blob([result.content], { type: result.format.mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = result.filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n\n previewResult(result: ExportResult): void {\n // Open preview dialog or new window\n const blob = new Blob([result.content], { type: result.format.mimeType });\n const url = URL.createObjectURL(blob);\n window.open(url, '_blank');\n }\n\n copyToClipboard(content: string): void {\n navigator.clipboard\n .writeText(content)\n .then(() => {\n this.snackBar.open('Copied to clipboard!', 'Close', { duration: 2000 });\n })\n .catch(() => {\n this.snackBar.open('Failed to copy to clipboard', 'Close', {\n duration: 3000,\n });\n });\n }\n\n copyShareUrl(): void {\n if (this.shareResult?.url) {\n this.copyToClipboard(this.shareResult.url);\n }\n }\n\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n onCancel(): void {\n this.dialogRef.close();\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelectModule, MatSelectChange } from '@angular/material/select';\nimport {\n MatSlideToggleModule,\n MatSlideToggleChange,\n} from '@angular/material/slide-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\n\nimport {\n Subject,\n takeUntil,\n debounceTime,\n distinctUntilChanged,\n BehaviorSubject,\n} from 'rxjs';\n\nimport { RuleBuilderService } from '../services/rule-builder.service';\nimport { SpecificationBridgeService } from '../services/specification-bridge.service';\n\nexport interface DslLintError {\n id: string;\n line: number;\n column: number;\n length: number;\n severity: 'error' | 'warning' | 'info' | 'hint';\n code: string;\n message: string;\n suggestion?: string;\n quickFix?: DslQuickFix;\n category: 'syntax' | 'semantic' | 'style' | 'performance' | 'best-practice';\n tags?: string[];\n}\n\nexport interface DslQuickFix {\n title: string;\n description: string;\n edits: DslEdit[];\n}\n\nexport interface DslEdit {\n range: {\n startLine: number;\n startColumn: number;\n endLine: number;\n endColumn: number;\n };\n newText: string;\n}\n\nexport interface DslLintStats {\n totalErrors: number;\n totalWarnings: number;\n totalInfos: number;\n totalHints: number;\n complexity: number;\n maintainabilityIndex: number;\n lastLintTime: Date;\n lintDuration: number;\n}\n\nexport interface DslLintRule {\n id: string;\n name: string;\n description: string;\n category: string;\n severity: 'error' | 'warning' | 'info' | 'hint';\n enabled: boolean;\n configurable: boolean;\n config?: any;\n}\n\n@Component({\n selector: 'praxis-dsl-linter',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCardModule,\n MatButtonModule,\n MatIconModule,\n MatToolbarModule,\n MatListModule,\n MatDividerModule,\n MatChipsModule,\n MatBadgeModule,\n MatTooltipModule,\n MatExpansionModule,\n MatProgressSpinnerModule,\n MatSelectModule,\n MatSlideToggleModule,\n MatTabsModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"dsl-linter-container\">\n <!-- Header Toolbar -->\n <mat-toolbar class=\"linter-toolbar\">\n <mat-toolbar-row>\n <span class=\"toolbar-title\">\n <mat-icon>rule</mat-icon>\n DSL Linter\n </span>\n\n <span class=\"toolbar-spacer\"></span>\n\n <!-- Stats Summary -->\n <div class=\"stats-summary\">\n <mat-chip\n [class]=\"stats.totalErrors > 0 ? 'error-chip' : 'success-chip'\"\n [matBadge]=\"stats.totalErrors\"\n [matBadgeHidden]=\"stats.totalErrors === 0\"\n matBadgeColor=\"warn\"\n matTooltip=\"Errors\"\n >\n <mat-icon>error</mat-icon>\n {{ stats.totalErrors }}\n </mat-chip>\n\n <mat-chip\n [class]=\"\n stats.totalWarnings > 0 ? 'warning-chip' : 'neutral-chip'\n \"\n [matBadge]=\"stats.totalWarnings\"\n [matBadgeHidden]=\"stats.totalWarnings === 0\"\n matBadgeColor=\"accent\"\n matTooltip=\"Warnings\"\n >\n <mat-icon>warning</mat-icon>\n {{ stats.totalWarnings }}\n </mat-chip>\n\n <mat-chip\n class=\"info-chip\"\n [matBadge]=\"stats.totalInfos + stats.totalHints\"\n [matBadgeHidden]=\"stats.totalInfos + stats.totalHints === 0\"\n matBadgeColor=\"primary\"\n matTooltip=\"Info & Hints\"\n >\n <mat-icon>info</mat-icon>\n {{ stats.totalInfos + stats.totalHints }}\n </mat-chip>\n </div>\n\n <!-- Action Buttons -->\n <button\n mat-icon-button\n (click)=\"runLinting()\"\n [disabled]=\"isLinting\"\n matTooltip=\"Run Lint Check\"\n >\n <mat-icon *ngIf=\"!isLinting\">refresh</mat-icon>\n <mat-progress-spinner\n *ngIf=\"isLinting\"\n diameter=\"20\"\n mode=\"indeterminate\"\n >\n </mat-progress-spinner>\n </button>\n\n <button\n mat-icon-button\n [color]=\"autoLint ? 'primary' : ''\"\n (click)=\"toggleAutoLint()\"\n matTooltip=\"Toggle Auto-Lint\"\n >\n <mat-icon>auto_fix_high</mat-icon>\n </button>\n\n <button\n mat-icon-button\n (click)=\"openLinterSettings()\"\n matTooltip=\"Linter Settings\"\n >\n <mat-icon>settings</mat-icon>\n </button>\n </mat-toolbar-row>\n </mat-toolbar>\n\n <!-- Main Content -->\n <div class=\"linter-content\">\n <mat-tab-group [(selectedIndex)]=\"activeTabIndex\">\n <!-- Issues Tab -->\n <mat-tab label=\"Issues\">\n <div class=\"tab-content\">\n <!-- Filter Controls -->\n <div class=\"filter-controls\">\n <mat-form-field appearance=\"outline\" class=\"filter-field\">\n <mat-label>Filter by Severity</mat-label>\n <mat-select\n [value]=\"selectedSeverities\"\n (selectionChange)=\"onSeverityFilterChange($event)\"\n multiple\n >\n <mat-option value=\"error\">\n <mat-icon class=\"severity-icon error\">error</mat-icon>\n Errors\n </mat-option>\n <mat-option value=\"warning\">\n <mat-icon class=\"severity-icon warning\">warning</mat-icon>\n Warnings\n </mat-option>\n <mat-option value=\"info\">\n <mat-icon class=\"severity-icon info\">info</mat-icon>\n Info\n </mat-option>\n <mat-option value=\"hint\">\n <mat-icon class=\"severity-icon hint\">lightbulb</mat-icon>\n Hints\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"filter-field\">\n <mat-label>Filter by Category</mat-label>\n <mat-select\n [value]=\"selectedCategories\"\n (selectionChange)=\"onCategoryFilterChange($event)\"\n multiple\n >\n <mat-option value=\"syntax\">Syntax</mat-option>\n <mat-option value=\"semantic\">Semantic</mat-option>\n <mat-option value=\"style\">Style</mat-option>\n <mat-option value=\"performance\">Performance</mat-option>\n <mat-option value=\"best-practice\">Best Practice</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Issues List -->\n <div class=\"issues-list\" *ngIf=\"filteredErrors.length > 0\">\n <mat-expansion-panel\n *ngFor=\"let error of filteredErrors; trackBy: trackByErrorId\"\n class=\"issue-panel\"\n [class]=\"'severity-' + error.severity\"\n >\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon [class]=\"'severity-icon ' + error.severity\">\n {{ getSeverityIcon(error.severity) }}\n </mat-icon>\n <span class=\"error-message\">{{ error.message }}</span>\n </mat-panel-title>\n <mat-panel-description>\n <mat-chip size=\"small\" class=\"category-chip\">{{\n error.category\n }}</mat-chip>\n <span class=\"location\"\n >Line {{ error.line }}:{{ error.column }}</span\n >\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"issue-details\">\n <div class=\"issue-info\">\n <div class=\"info-row\">\n <strong>Code:</strong> {{ error.code }}\n </div>\n <div class=\"info-row\">\n <strong>Location:</strong> Line {{ error.line }}, Column\n {{ error.column }}\n </div>\n <div\n class=\"info-row\"\n *ngIf=\"error.tags && error.tags.length > 0\"\n >\n <strong>Tags:</strong>\n <mat-chip\n *ngFor=\"let tag of error.tags\"\n size=\"small\"\n class=\"tag-chip\"\n >\n {{ tag }}\n </mat-chip>\n </div>\n <div class=\"info-row\" *ngIf=\"error.suggestion\">\n <strong>Suggestion:</strong> {{ error.suggestion }}\n </div>\n </div>\n\n <div class=\"issue-actions\">\n <button\n mat-button\n (click)=\"navigateToError(error)\"\n color=\"primary\"\n >\n <mat-icon>my_location</mat-icon>\n Go to Location\n </button>\n\n <button\n mat-button\n *ngIf=\"error.quickFix\"\n (click)=\"applyQuickFix(error)\"\n color=\"accent\"\n >\n <mat-icon>build</mat-icon>\n {{ error.quickFix.title }}\n </button>\n\n <button mat-button (click)=\"ignoreError(error)\">\n <mat-icon>visibility_off</mat-icon>\n Ignore\n </button>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n\n <!-- No Issues Message -->\n <div *ngIf=\"filteredErrors.length === 0\" class=\"no-issues\">\n <mat-icon class=\"no-issues-icon\">check_circle</mat-icon>\n <h3>No Issues Found</h3>\n <p *ngIf=\"allErrors.length === 0\">\n Your DSL is clean! No linting issues detected.\n </p>\n <p *ngIf=\"allErrors.length > 0\">\n All issues are filtered out. Adjust your filters to see hidden\n issues.\n </p>\n </div>\n </div>\n </mat-tab>\n\n <!-- Analytics Tab -->\n <mat-tab label=\"Analytics\">\n <div class=\"tab-content\">\n <div class=\"analytics-grid\">\n <!-- Quality Metrics -->\n <mat-card class=\"analytics-card\">\n <mat-card-header>\n <mat-card-title>Code Quality</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <div class=\"metric-item\">\n <span class=\"metric-label\">Complexity Score:</span>\n <span\n class=\"metric-value\"\n [class]=\"getComplexityClass(stats.complexity)\"\n >\n {{ stats.complexity }}/100\n </span>\n </div>\n <div class=\"metric-item\">\n <span class=\"metric-label\">Maintainability:</span>\n <span\n class=\"metric-value\"\n [class]=\"\n getMaintainabilityClass(stats.maintainabilityIndex)\n \"\n >\n {{ stats.maintainabilityIndex }}/100\n </span>\n </div>\n <div class=\"metric-item\">\n <span class=\"metric-label\">Last Lint:</span>\n <span class=\"metric-value\">{{\n stats.lastLintTime | date: 'medium'\n }}</span>\n </div>\n <div class=\"metric-item\">\n <span class=\"metric-label\">Duration:</span>\n <span class=\"metric-value\"\n >{{ stats.lintDuration }}ms</span\n >\n </div>\n </mat-card-content>\n </mat-card>\n\n <!-- Issue Distribution -->\n <mat-card class=\"analytics-card\">\n <mat-card-header>\n <mat-card-title>Issue Distribution</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <div class=\"distribution-chart\">\n <div\n class=\"chart-bar\"\n *ngFor=\"let category of getIssueDistribution()\"\n >\n <div class=\"bar-label\">{{ category.name }}</div>\n <div class=\"bar-container\">\n <div\n class=\"bar-fill\"\n [style.width.%]=\"category.percentage\"\n [class]=\"'bar-' + category.severity\"\n ></div>\n <span class=\"bar-value\">{{ category.count }}</span>\n </div>\n </div>\n </div>\n </mat-card-content>\n </mat-card>\n\n <!-- Rule Usage -->\n <mat-card class=\"analytics-card\">\n <mat-card-header>\n <mat-card-title>Most Common Issues</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <div class=\"common-issues\">\n <div\n *ngFor=\"let issue of getMostCommonIssues()\"\n class=\"common-issue-item\"\n >\n <div class=\"issue-code\">{{ issue.code }}</div>\n <div class=\"issue-count\">\n {{ issue.count }} occurrences\n </div>\n </div>\n </div>\n </mat-card-content>\n </mat-card>\n </div>\n </div>\n </mat-tab>\n\n <!-- Rules Tab -->\n <mat-tab label=\"Rules\">\n <div class=\"tab-content\">\n <!-- Rule Categories -->\n <div class=\"rules-content\">\n <mat-expansion-panel\n *ngFor=\"let category of getRuleCategories()\"\n class=\"rule-category-panel\"\n >\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{ category.name }} ({{ category.rules.length }})\n </mat-panel-title>\n <mat-panel-description>\n {{ category.enabledCount }}/{{\n category.rules.length\n }}\n enabled\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"category-rules\">\n <div *ngFor=\"let rule of category.rules\" class=\"rule-item\">\n <div class=\"rule-header\">\n <mat-slide-toggle\n [checked]=\"rule.enabled\"\n (change)=\"toggleRule(rule, $event)\"\n >\n </mat-slide-toggle>\n\n <div class=\"rule-info\">\n <div class=\"rule-name\">{{ rule.name }}</div>\n <div class=\"rule-description\">\n {{ rule.description }}\n </div>\n </div>\n\n <mat-chip\n size=\"small\"\n [class]=\"'severity-chip ' + rule.severity\"\n >\n {{ rule.severity }}\n </mat-chip>\n </div>\n\n <div *ngIf=\"rule.configurable\" class=\"rule-config\">\n <button\n mat-button\n size=\"small\"\n (click)=\"configureRule(rule)\"\n >\n <mat-icon>settings</mat-icon>\n Configure\n </button>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n </div>\n `,\n styles: [\n `\n .dsl-linter-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .linter-toolbar {\n background: var(--mdc-theme-surface-variant);\n color: var(--mdc-theme-on-surface-variant);\n flex-shrink: 0;\n }\n\n .toolbar-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n }\n\n .toolbar-spacer {\n flex: 1;\n }\n\n .stats-summary {\n display: flex;\n gap: 8px;\n margin-right: 16px;\n }\n\n .stats-summary mat-chip {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n }\n\n .error-chip {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n }\n\n .warning-chip {\n background: var(--mdc-theme-warning-container);\n color: var(--mdc-theme-on-warning-container);\n }\n\n .info-chip {\n background: var(--mdc-theme-info-container);\n color: var(--mdc-theme-on-info-container);\n }\n\n .success-chip {\n background: var(--mdc-theme-tertiary-container);\n color: var(--mdc-theme-on-tertiary-container);\n }\n\n .neutral-chip {\n background: var(--mdc-theme-surface-variant);\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .linter-content {\n flex: 1;\n min-height: 0;\n }\n\n .tab-content {\n padding: 16px;\n height: 100%;\n overflow-y: auto;\n }\n\n .filter-controls {\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n }\n\n .filter-field {\n min-width: 200px;\n }\n\n .severity-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n margin-right: 8px;\n }\n\n .severity-icon.error {\n color: var(--mdc-theme-error);\n }\n\n .severity-icon.warning {\n color: var(--mdc-theme-warning);\n }\n\n .severity-icon.info {\n color: var(--mdc-theme-info);\n }\n\n .severity-icon.hint {\n color: var(--mdc-theme-primary);\n }\n\n .issues-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .issue-panel {\n border-left: 4px solid transparent;\n }\n\n .issue-panel.severity-error {\n border-left-color: var(--mdc-theme-error);\n }\n\n .issue-panel.severity-warning {\n border-left-color: var(--mdc-theme-warning);\n }\n\n .issue-panel.severity-info {\n border-left-color: var(--mdc-theme-info);\n }\n\n .issue-panel.severity-hint {\n border-left-color: var(--mdc-theme-primary);\n }\n\n .error-message {\n font-weight: 500;\n margin-left: 8px;\n }\n\n .category-chip {\n background: var(--mdc-theme-secondary-container);\n color: var(--mdc-theme-on-secondary-container);\n margin-right: 8px;\n }\n\n .location {\n font-family: 'Courier New', monospace;\n font-size: 12px;\n opacity: 0.7;\n }\n\n .issue-details {\n padding: 16px 0;\n border-top: 1px solid var(--mdc-theme-outline);\n }\n\n .issue-info {\n margin-bottom: 16px;\n }\n\n .info-row {\n margin-bottom: 8px;\n font-size: 14px;\n }\n\n .tag-chip {\n background: var(--mdc-theme-surface-variant);\n color: var(--mdc-theme-on-surface-variant);\n margin-left: 4px;\n }\n\n .issue-actions {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .no-issues {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px;\n text-align: center;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .no-issues-icon {\n font-size: 64px;\n width: 64px;\n height: 64px;\n color: var(--mdc-theme-tertiary);\n margin-bottom: 16px;\n }\n\n .analytics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 16px;\n }\n\n .analytics-card {\n height: fit-content;\n }\n\n .metric-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid var(--mdc-theme-outline-variant);\n }\n\n .metric-item:last-child {\n border-bottom: none;\n }\n\n .metric-label {\n font-weight: 500;\n }\n\n .metric-value {\n font-weight: 600;\n }\n\n .metric-value.excellent {\n color: var(--mdc-theme-tertiary);\n }\n\n .metric-value.good {\n color: var(--mdc-theme-primary);\n }\n\n .metric-value.fair {\n color: var(--mdc-theme-warning);\n }\n\n .metric-value.poor {\n color: var(--mdc-theme-error);\n }\n\n .distribution-chart {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .chart-bar {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .bar-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .bar-container {\n position: relative;\n height: 24px;\n background: var(--mdc-theme-surface-variant);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .bar-fill {\n height: 100%;\n transition: width 0.3s ease;\n }\n\n .bar-fill.bar-error {\n background: var(--mdc-theme-error);\n }\n\n .bar-fill.bar-warning {\n background: var(--mdc-theme-warning);\n }\n\n .bar-fill.bar-info {\n background: var(--mdc-theme-info);\n }\n\n .bar-fill.bar-hint {\n background: var(--mdc-theme-primary);\n }\n\n .bar-value {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n font-size: 12px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .common-issues {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .common-issue-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background: var(--mdc-theme-surface-variant);\n border-radius: 4px;\n }\n\n .issue-code {\n font-family: 'Courier New', monospace;\n font-weight: 500;\n }\n\n .issue-count {\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .rules-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .rule-category-panel {\n border: 1px solid var(--mdc-theme-outline-variant);\n }\n\n .category-rules {\n padding: 16px;\n }\n\n .rule-item {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px;\n border: 1px solid var(--mdc-theme-outline-variant);\n border-radius: 4px;\n margin-bottom: 8px;\n }\n\n .rule-header {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .rule-info {\n flex: 1;\n }\n\n .rule-name {\n font-weight: 500;\n margin-bottom: 4px;\n }\n\n .rule-description {\n font-size: 13px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .severity-chip {\n font-size: 11px;\n min-height: 20px;\n }\n\n .severity-chip.error {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n }\n\n .severity-chip.warning {\n background: var(--mdc-theme-warning-container);\n color: var(--mdc-theme-on-warning-container);\n }\n\n .severity-chip.info {\n background: var(--mdc-theme-info-container);\n color: var(--mdc-theme-on-info-container);\n }\n\n .severity-chip.hint {\n background: var(--mdc-theme-primary-container);\n color: var(--mdc-theme-on-primary-container);\n }\n\n .rule-config {\n padding-left: 44px;\n }\n `,\n ],\n})\nexport class DslLinterComponent implements OnInit, OnDestroy {\n @Input() dsl: string = '';\n @Input() autoLint: boolean = true;\n @Input() lintDelay: number = 1000;\n\n @Output() errorSelected = new EventEmitter<DslLintError>();\n @Output() quickFixApplied = new EventEmitter<{\n error: DslLintError;\n fix: DslQuickFix;\n }>();\n @Output() ruleToggled = new EventEmitter<{\n rule: DslLintRule;\n enabled: boolean;\n }>();\n\n private destroy$ = new Subject<void>();\n private lintSubject = new BehaviorSubject<string>('');\n\n // Component state\n isLinting = false;\n activeTabIndex = 0;\n\n allErrors: DslLintError[] = [];\n filteredErrors: DslLintError[] = [];\n selectedSeverities: string[] = ['error', 'warning', 'info', 'hint'];\n selectedCategories: string[] = [\n 'syntax',\n 'semantic',\n 'style',\n 'performance',\n 'best-practice',\n ];\n\n stats: DslLintStats = {\n totalErrors: 0,\n totalWarnings: 0,\n totalInfos: 0,\n totalHints: 0,\n complexity: 0,\n maintainabilityIndex: 100,\n lastLintTime: new Date(),\n lintDuration: 0,\n };\n\n lintRules: DslLintRule[] = [\n // Syntax Rules\n {\n id: 'syntax-001',\n name: 'Missing Semicolon',\n description: 'Statements should end with semicolons',\n category: 'syntax',\n severity: 'error',\n enabled: true,\n configurable: false,\n },\n {\n id: 'syntax-002',\n name: 'Unmatched Parentheses',\n description: 'Opening parentheses must have matching closing parentheses',\n category: 'syntax',\n severity: 'error',\n enabled: true,\n configurable: false,\n },\n {\n id: 'syntax-003',\n name: 'Invalid Field Reference',\n description: 'Field references must be valid and properly formatted',\n category: 'syntax',\n severity: 'error',\n enabled: true,\n configurable: false,\n },\n\n // Semantic Rules\n {\n id: 'semantic-001',\n name: 'Undefined Field',\n description: 'Referenced fields must be defined in the schema',\n category: 'semantic',\n severity: 'error',\n enabled: true,\n configurable: false,\n },\n {\n id: 'semantic-002',\n name: 'Type Mismatch',\n description: 'Operations must be compatible with field types',\n category: 'semantic',\n severity: 'warning',\n enabled: true,\n configurable: true,\n },\n {\n id: 'semantic-003',\n name: 'Unreachable Code',\n description: 'Code that can never be executed',\n category: 'semantic',\n severity: 'warning',\n enabled: true,\n configurable: false,\n },\n\n // Style Rules\n {\n id: 'style-001',\n name: 'Inconsistent Indentation',\n description: 'Use consistent indentation throughout the DSL',\n category: 'style',\n severity: 'info',\n enabled: true,\n configurable: true,\n },\n {\n id: 'style-002',\n name: 'Long Line',\n description: 'Lines should not exceed maximum length',\n category: 'style',\n severity: 'info',\n enabled: false,\n configurable: true,\n config: { maxLength: 120 },\n },\n {\n id: 'style-003',\n name: 'Trailing Whitespace',\n description: 'Remove trailing whitespace from lines',\n category: 'style',\n severity: 'hint',\n enabled: true,\n configurable: false,\n },\n\n // Performance Rules\n {\n id: 'performance-001',\n name: 'Complex Expression',\n description: 'Expression complexity exceeds recommended threshold',\n category: 'performance',\n severity: 'warning',\n enabled: true,\n configurable: true,\n config: { maxComplexity: 10 },\n },\n {\n id: 'performance-002',\n name: 'Redundant Condition',\n description: 'Condition can be simplified or is redundant',\n category: 'performance',\n severity: 'info',\n enabled: true,\n configurable: false,\n },\n\n // Best Practice Rules\n {\n id: 'best-practice-001',\n name: 'Magic Number',\n description: 'Consider using named constants instead of magic numbers',\n category: 'best-practice',\n severity: 'hint',\n enabled: true,\n configurable: true,\n },\n {\n id: 'best-practice-002',\n name: 'Deep Nesting',\n description: 'Avoid deep nesting to improve readability',\n category: 'best-practice',\n severity: 'info',\n enabled: true,\n configurable: true,\n config: { maxDepth: 5 },\n },\n {\n id: 'best-practice-003',\n name: 'Missing Documentation',\n description: 'Complex rules should include documentation comments',\n category: 'best-practice',\n severity: 'hint',\n enabled: false,\n configurable: false,\n },\n ];\n\n constructor(\n private ruleBuilderService: RuleBuilderService,\n private specificationBridge: SpecificationBridgeService,\n private cdr: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.initializeLinting();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSubscriptions(): void {\n // Subscribe to DSL changes for auto-linting\n this.lintSubject\n .pipe(\n debounceTime(this.lintDelay),\n distinctUntilChanged(),\n takeUntil(this.destroy$),\n )\n .subscribe((dsl) => {\n if (this.autoLint && dsl) {\n this.performLinting(dsl);\n }\n });\n\n // Subscribe to rule builder state changes\n this.ruleBuilderService.state$\n .pipe(takeUntil(this.destroy$))\n .subscribe((state) => {\n if (state.currentDSL && state.currentDSL !== this.dsl) {\n this.dsl = state.currentDSL;\n this.triggerLinting();\n }\n });\n }\n\n private initializeLinting(): void {\n if (this.dsl) {\n this.triggerLinting();\n }\n }\n\n private triggerLinting(): void {\n this.lintSubject.next(this.dsl);\n }\n\n runLinting(): void {\n if (this.dsl) {\n this.performLinting(this.dsl);\n }\n }\n\n private async performLinting(dsl: string): Promise<void> {\n if (this.isLinting) return;\n\n this.isLinting = true;\n const startTime = performance.now();\n this.cdr.detectChanges();\n\n try {\n // Simulate linting process with actual DSL analysis\n const errors = await this.analyzeDsl(dsl);\n\n this.allErrors = errors;\n this.applyFilters();\n this.updateStats(errors, performance.now() - startTime);\n } catch (error) {\n console.error('Linting failed:', error);\n } finally {\n this.isLinting = false;\n this.cdr.detectChanges();\n }\n }\n\n private async analyzeDsl(dsl: string): Promise<DslLintError[]> {\n const errors: DslLintError[] = [];\n const lines = dsl.split('\\n');\n\n // Simulate comprehensive DSL analysis\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n const lineNumber = lineIndex + 1;\n\n // Check syntax rules\n errors.push(...this.checkSyntaxRules(line, lineNumber));\n\n // Check semantic rules\n errors.push(...this.checkSemanticRules(line, lineNumber, lines));\n\n // Check style rules\n errors.push(...this.checkStyleRules(line, lineNumber));\n\n // Check performance rules\n errors.push(...this.checkPerformanceRules(line, lineNumber));\n\n // Check best practice rules\n errors.push(...this.checkBestPracticeRules(line, lineNumber));\n }\n\n return errors.filter((error) => this.isRuleEnabled(error.code));\n }\n\n private checkSyntaxRules(line: string, lineNumber: number): DslLintError[] {\n const errors: DslLintError[] = [];\n\n // Check for unmatched parentheses\n const openParens = (line.match(/\\(/g) || []).length;\n const closeParens = (line.match(/\\)/g) || []).length;\n if (openParens !== closeParens) {\n errors.push({\n id: `syntax-${lineNumber}-1`,\n line: lineNumber,\n column: line.length,\n length: 1,\n severity: 'error',\n code: 'syntax-002',\n message: 'Unmatched parentheses in expression',\n category: 'syntax',\n suggestion:\n 'Ensure all opening parentheses have matching closing parentheses',\n quickFix: {\n title: 'Add missing parenthesis',\n description: 'Automatically add the missing closing parenthesis',\n edits: [\n {\n range: {\n startLine: lineNumber,\n startColumn: line.length,\n endLine: lineNumber,\n endColumn: line.length,\n },\n newText: ')',\n },\n ],\n },\n });\n }\n\n // Check for invalid field references\n const fieldRefPattern = /\\$\\{([^}]*)\\}/g;\n let match;\n while ((match = fieldRefPattern.exec(line)) !== null) {\n const fieldRef = match[1];\n if (!fieldRef || fieldRef.includes(' ')) {\n errors.push({\n id: `syntax-${lineNumber}-2`,\n line: lineNumber,\n column: match.index + 1,\n length: match[0].length,\n severity: 'error',\n code: 'syntax-003',\n message: 'Invalid field reference syntax',\n category: 'syntax',\n suggestion:\n 'Field references should contain valid field names without spaces',\n });\n }\n }\n\n return errors;\n }\n\n private checkSemanticRules(\n line: string,\n lineNumber: number,\n allLines: string[],\n ): DslLintError[] {\n const errors: DslLintError[] = [];\n\n // Check for undefined fields (simplified)\n const fieldRefPattern = /\\$\\{([^}]+)\\}/g;\n let match;\n while ((match = fieldRefPattern.exec(line)) !== null) {\n const fieldName = match[1];\n // This would normally check against actual field schema\n if (fieldName.startsWith('unknown_')) {\n errors.push({\n id: `semantic-${lineNumber}-1`,\n line: lineNumber,\n column: match.index + 1,\n length: match[0].length,\n severity: 'error',\n code: 'semantic-001',\n message: `Undefined field: ${fieldName}`,\n category: 'semantic',\n suggestion:\n 'Ensure the field is defined in your schema or fix the field name',\n });\n }\n }\n\n return errors;\n }\n\n private checkStyleRules(line: string, lineNumber: number): DslLintError[] {\n const errors: DslLintError[] = [];\n\n // Check trailing whitespace\n if (line.endsWith(' ') || line.endsWith('\\t')) {\n errors.push({\n id: `style-${lineNumber}-1`,\n line: lineNumber,\n column: line.trimEnd().length + 1,\n length: line.length - line.trimEnd().length,\n severity: 'hint',\n code: 'style-003',\n message: 'Trailing whitespace detected',\n category: 'style',\n suggestion: 'Remove trailing whitespace',\n quickFix: {\n title: 'Remove trailing whitespace',\n description: 'Automatically remove trailing spaces and tabs',\n edits: [\n {\n range: {\n startLine: lineNumber,\n startColumn: line.trimEnd().length + 1,\n endLine: lineNumber,\n endColumn: line.length + 1,\n },\n newText: '',\n },\n ],\n },\n });\n }\n\n // Check line length\n const maxLength = this.getRuleConfig('style-002')?.maxLength || 120;\n if (this.isRuleEnabled('style-002') && line.length > maxLength) {\n errors.push({\n id: `style-${lineNumber}-2`,\n line: lineNumber,\n column: maxLength + 1,\n length: line.length - maxLength,\n severity: 'info',\n code: 'style-002',\n message: `Line exceeds maximum length of ${maxLength} characters`,\n category: 'style',\n suggestion: 'Consider breaking long lines for better readability',\n });\n }\n\n return errors;\n }\n\n private checkPerformanceRules(\n line: string,\n lineNumber: number,\n ): DslLintError[] {\n const errors: DslLintError[] = [];\n\n // Check expression complexity (simplified)\n const operators = (line.match(/&&|\\|\\||==|!=|>=|<=|>|</g) || []).length;\n const maxComplexity =\n this.getRuleConfig('performance-001')?.maxComplexity || 10;\n\n if (operators > maxComplexity) {\n errors.push({\n id: `performance-${lineNumber}-1`,\n line: lineNumber,\n column: 1,\n length: line.length,\n severity: 'warning',\n code: 'performance-001',\n message: `Expression complexity (${operators}) exceeds threshold (${maxComplexity})`,\n category: 'performance',\n suggestion:\n 'Consider breaking complex expressions into smaller, more readable parts',\n });\n }\n\n return errors;\n }\n\n private checkBestPracticeRules(\n line: string,\n lineNumber: number,\n ): DslLintError[] {\n const errors: DslLintError[] = [];\n\n // Check for magic numbers\n const numberPattern = /\\b\\d+\\b/g;\n let match;\n while ((match = numberPattern.exec(line)) !== null) {\n const number = parseInt(match[0]);\n if (number > 10 && number !== 100 && number !== 1000) {\n errors.push({\n id: `best-practice-${lineNumber}-1`,\n line: lineNumber,\n column: match.index + 1,\n length: match[0].length,\n severity: 'hint',\n code: 'best-practice-001',\n message: `Consider using a named constant instead of magic number: ${number}`,\n category: 'best-practice',\n suggestion: 'Define meaningful constants for numeric values',\n });\n }\n }\n\n return errors;\n }\n\n private isRuleEnabled(ruleCode: string): boolean {\n const rule = this.lintRules.find((r) => r.id === ruleCode);\n return rule?.enabled ?? false;\n }\n\n private getRuleConfig(ruleCode: string): any {\n const rule = this.lintRules.find((r) => r.id === ruleCode);\n return rule?.config;\n }\n\n private updateStats(errors: DslLintError[], duration: number): void {\n this.stats = {\n totalErrors: errors.filter((e) => e.severity === 'error').length,\n totalWarnings: errors.filter((e) => e.severity === 'warning').length,\n totalInfos: errors.filter((e) => e.severity === 'info').length,\n totalHints: errors.filter((e) => e.severity === 'hint').length,\n complexity: this.calculateComplexity(errors),\n maintainabilityIndex: this.calculateMaintainabilityIndex(errors),\n lastLintTime: new Date(),\n lintDuration: Math.round(duration),\n };\n }\n\n private calculateComplexity(errors: DslLintError[]): number {\n const complexityFactors = {\n error: 10,\n warning: 5,\n info: 2,\n hint: 1,\n };\n\n const totalPenalty = errors.reduce((sum, error) => {\n return sum + (complexityFactors[error.severity] || 1);\n }, 0);\n\n return Math.min(100, Math.max(0, 100 - totalPenalty));\n }\n\n private calculateMaintainabilityIndex(errors: DslLintError[]): number {\n const criticalErrors = errors.filter((e) => e.severity === 'error').length;\n const warnings = errors.filter((e) => e.severity === 'warning').length;\n\n const penalty = criticalErrors * 15 + warnings * 5;\n return Math.min(100, Math.max(0, 100 - penalty));\n }\n\n toggleAutoLint(): void {\n this.autoLint = !this.autoLint;\n if (this.autoLint && this.dsl) {\n this.triggerLinting();\n }\n }\n\n onSeverityFilterChange(event: MatSelectChange): void {\n this.selectedSeverities = event.value as string[];\n this.applyFilters();\n }\n\n onCategoryFilterChange(event: MatSelectChange): void {\n this.selectedCategories = event.value as string[];\n this.applyFilters();\n }\n\n private applyFilters(): void {\n this.filteredErrors = this.allErrors.filter(\n (error) =>\n this.selectedSeverities.includes(error.severity) &&\n this.selectedCategories.includes(error.category),\n );\n this.cdr.detectChanges();\n }\n\n trackByErrorId(index: number, error: DslLintError): string {\n return error.id;\n }\n\n getSeverityIcon(severity: string): string {\n const icons: Record<string, string> = {\n error: 'error',\n warning: 'warning',\n info: 'info',\n hint: 'lightbulb',\n };\n return icons[severity] || 'help';\n }\n\n getComplexityClass(complexity: number): string {\n if (complexity >= 80) return 'excellent';\n if (complexity >= 60) return 'good';\n if (complexity >= 40) return 'fair';\n return 'poor';\n }\n\n getMaintainabilityClass(maintainability: number): string {\n if (maintainability >= 80) return 'excellent';\n if (maintainability >= 60) return 'good';\n if (maintainability >= 40) return 'fair';\n return 'poor';\n }\n\n getIssueDistribution(): any[] {\n const distribution = [\n { name: 'Errors', severity: 'error', count: this.stats.totalErrors },\n {\n name: 'Warnings',\n severity: 'warning',\n count: this.stats.totalWarnings,\n },\n { name: 'Info', severity: 'info', count: this.stats.totalInfos },\n { name: 'Hints', severity: 'hint', count: this.stats.totalHints },\n ];\n\n const total = distribution.reduce((sum, item) => sum + item.count, 0);\n\n return distribution.map((item) => ({\n ...item,\n percentage: total > 0 ? (item.count / total) * 100 : 0,\n }));\n }\n\n getMostCommonIssues(): any[] {\n const codeCount = new Map<string, number>();\n\n this.allErrors.forEach((error) => {\n codeCount.set(error.code, (codeCount.get(error.code) || 0) + 1);\n });\n\n return Array.from(codeCount.entries())\n .map(([code, count]) => ({ code, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 5);\n }\n\n getRuleCategories(): any[] {\n const categories = new Map<string, DslLintRule[]>();\n\n this.lintRules.forEach((rule) => {\n const categoryName =\n rule.category.charAt(0).toUpperCase() + rule.category.slice(1);\n if (!categories.has(categoryName)) {\n categories.set(categoryName, []);\n }\n categories.get(categoryName)!.push(rule);\n });\n\n return Array.from(categories.entries()).map(([name, rules]) => ({\n name,\n rules,\n enabledCount: rules.filter((rule) => rule.enabled).length,\n }));\n }\n\n navigateToError(error: DslLintError): void {\n this.errorSelected.emit(error);\n }\n\n applyQuickFix(error: DslLintError): void {\n if (error.quickFix) {\n this.quickFixApplied.emit({ error, fix: error.quickFix });\n // Remove the error after applying the fix\n this.allErrors = this.allErrors.filter((e) => e.id !== error.id);\n this.applyFilters();\n }\n }\n\n ignoreError(error: DslLintError): void {\n this.allErrors = this.allErrors.filter((e) => e.id !== error.id);\n this.applyFilters();\n }\n\n toggleRule(rule: DslLintRule, change: MatSlideToggleChange): void {\n const enabled = change.checked;\n rule.enabled = enabled;\n this.ruleToggled.emit({ rule, enabled });\n // Re-run linting to apply the rule change\n this.runLinting();\n }\n\n configureRule(rule: DslLintRule): void {\n // Open rule configuration dialog\n console.log('Configure rule:', rule);\n }\n\n openLinterSettings(): void {\n // Open linter settings dialog\n console.log('Open linter settings');\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { \n FieldSchema, \n FieldType, \n FIELD_TYPE_OPERATORS, \n OPERATOR_LABELS,\n FieldSchemaContext,\n ContextVariable,\n CustomFunction\n} from '../models/field-schema.model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FieldSchemaService {\n private readonly _fieldSchemas = new BehaviorSubject<Record<string, FieldSchema>>({});\n private readonly _context = new BehaviorSubject<FieldSchemaContext>({});\n\n public readonly fieldSchemas$ = this._fieldSchemas.asObservable();\n public readonly context$ = this._context.asObservable();\n\n constructor() {}\n\n /**\n * Set field schemas for the visual builder\n */\n setFieldSchemas(schemas: Record<string, FieldSchema>): void {\n this._fieldSchemas.next(schemas);\n }\n\n /**\n * Add a single field schema\n */\n addFieldSchema(name: string, schema: FieldSchema): void {\n const current = this._fieldSchemas.value;\n this._fieldSchemas.next({\n ...current,\n [name]: schema\n });\n }\n\n /**\n * Remove a field schema\n */\n removeFieldSchema(name: string): void {\n const current = this._fieldSchemas.value;\n const updated = { ...current };\n delete updated[name];\n this._fieldSchemas.next(updated);\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(name: string): FieldSchema | undefined {\n return this._fieldSchemas.value[name];\n }\n\n /**\n * Get all field schemas\n */\n getAllFieldSchemas(): Record<string, FieldSchema> {\n return this._fieldSchemas.value;\n }\n\n /**\n * Get field schemas as array with enhanced info\n */\n getFieldSchemasArray(): Observable<EnhancedFieldSchema[]> {\n return this.fieldSchemas$.pipe(\n map(schemas => \n Object.entries(schemas).map(([name, schema]) => ({\n ...schema,\n name,\n operators: this.getAvailableOperators(schema.type),\n operatorLabels: this.getOperatorLabels(schema.type)\n }))\n )\n );\n }\n\n /**\n * Set context for field schemas\n */\n setContext(context: FieldSchemaContext): void {\n this._context.next(context);\n }\n\n /**\n * Get available operators for a field type\n */\n getAvailableOperators(fieldType: FieldType): string[] {\n return FIELD_TYPE_OPERATORS[fieldType] || [];\n }\n\n /**\n * Get operator labels for a field type\n */\n getOperatorLabels(fieldType: FieldType): Record<string, string> {\n const operators = this.getAvailableOperators(fieldType);\n const labels: Record<string, string> = {};\n \n operators.forEach(op => {\n labels[op] = OPERATOR_LABELS[op] || op;\n });\n \n return labels;\n }\n\n /**\n * Validate field value against schema\n */\n validateFieldValue(fieldName: string, value: any): ValidationResult {\n const schema = this.getFieldSchema(fieldName);\n \n if (!schema) {\n return {\n valid: false,\n errors: [`Field '${fieldName}' not found in schema`]\n };\n }\n\n const errors: string[] = [];\n\n // Type validation\n if (!this.isValidType(value, schema.type)) {\n errors.push(`Value must be of type ${schema.type}`);\n }\n\n // Required validation\n if (schema.required && (value === null || value === undefined || value === '')) {\n errors.push('Field is required');\n }\n\n // Format validation\n if (value !== null && value !== undefined && schema.format) {\n const formatErrors = this.validateFormat(value, schema.format, schema.type);\n errors.push(...formatErrors);\n }\n\n // Enum validation\n if (schema.allowedValues && schema.allowedValues.length > 0) {\n const allowedValues = schema.allowedValues.map(opt => opt.value);\n if (!allowedValues.includes(value)) {\n errors.push(`Value must be one of: ${allowedValues.join(', ')}`);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Get field suggestions based on partial input\n */\n getFieldSuggestions(partial: string, category?: string): FieldSchema[] {\n const schemas = this.getAllFieldSchemas();\n const lowerPartial = partial.toLowerCase();\n \n return Object.values(schemas)\n .filter(schema => {\n const matchesName = schema.name.toLowerCase().includes(lowerPartial);\n const matchesLabel = schema.label.toLowerCase().includes(lowerPartial);\n const matchesCategory = !category || schema.uiConfig?.category === category;\n \n return (matchesName || matchesLabel) && matchesCategory;\n })\n .sort((a, b) => {\n // Prioritize exact matches, then starts with, then contains\n const aExact = a.name.toLowerCase() === lowerPartial;\n const bExact = b.name.toLowerCase() === lowerPartial;\n if (aExact && !bExact) return -1;\n if (!aExact && bExact) return 1;\n \n const aStarts = a.name.toLowerCase().startsWith(lowerPartial);\n const bStarts = b.name.toLowerCase().startsWith(lowerPartial);\n if (aStarts && !bStarts) return -1;\n if (!aStarts && bStarts) return 1;\n \n return a.label.localeCompare(b.label);\n });\n }\n\n /**\n * Create field schema from JSON Schema\n */\n createFromJsonSchema(jsonSchema: any): Record<string, FieldSchema> {\n const schemas: Record<string, FieldSchema> = {};\n \n if (jsonSchema.properties) {\n Object.entries(jsonSchema.properties).forEach(([name, prop]: [string, any]) => {\n schemas[name] = this.convertJsonSchemaProperty(name, prop, jsonSchema.required?.includes(name));\n });\n }\n \n return schemas;\n }\n\n /**\n * Create field schema from form metadata\n */\n createFromFormMetadata(formFields: any[]): Record<string, FieldSchema> {\n const schemas: Record<string, FieldSchema> = {};\n \n formFields.forEach(field => {\n schemas[field.name] = {\n name: field.name,\n label: field.label || field.name,\n type: this.mapFormFieldType(field.type),\n description: field.description,\n required: field.required,\n allowedValues: field.options?.map((opt: any) => ({\n value: opt.value,\n label: opt.label || opt.value\n })),\n format: this.extractFormatFromField(field),\n uiConfig: {\n icon: field.icon,\n category: field.category,\n priority: field.priority\n }\n };\n });\n \n return schemas;\n }\n\n /**\n * Get context variables\n */\n getContextVariables(): Observable<ContextVariable[]> {\n return this.context$.pipe(\n map(context => context.contextVariables || [])\n );\n }\n\n /**\n * Get custom functions\n */\n getCustomFunctions(): Observable<CustomFunction[]> {\n return this.context$.pipe(\n map(context => context.customFunctions || [])\n );\n }\n\n /**\n * Group field schemas by category\n */\n getFieldSchemasByCategory(): Observable<Record<string, FieldSchema[]>> {\n return this.getFieldSchemasArray().pipe(\n map(schemas => {\n const grouped: Record<string, FieldSchema[]> = {};\n \n schemas.forEach(schema => {\n const category = schema.uiConfig?.category || 'Other';\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(schema);\n });\n \n // Sort within each category\n Object.values(grouped).forEach(categorySchemas => {\n categorySchemas.sort((a, b) => {\n const aPriority = a.uiConfig?.priority || 0;\n const bPriority = b.uiConfig?.priority || 0;\n \n if (aPriority !== bPriority) {\n return bPriority - aPriority; // Higher priority first\n }\n \n return a.label.localeCompare(b.label);\n });\n });\n \n return grouped;\n })\n );\n }\n\n // Private helper methods\n\n private isValidType(value: any, type: FieldType): boolean {\n if (value === null || value === undefined) {\n return true; // Let required validation handle this\n }\n\n switch (type) {\n case FieldType.STRING:\n case FieldType.EMAIL:\n case FieldType.URL:\n case FieldType.PHONE:\n case FieldType.UUID:\n return typeof value === 'string';\n \n case FieldType.NUMBER:\n return typeof value === 'number' && !isNaN(value);\n \n case FieldType.INTEGER:\n return typeof value === 'number' && Number.isInteger(value);\n \n case FieldType.BOOLEAN:\n return typeof value === 'boolean';\n \n case FieldType.DATE:\n case FieldType.DATETIME:\n case FieldType.TIME:\n return value instanceof Date || (typeof value === 'string' && !isNaN(Date.parse(value)));\n \n case FieldType.ARRAY:\n return Array.isArray(value);\n \n case FieldType.OBJECT:\n case FieldType.JSON:\n return typeof value === 'object' && !Array.isArray(value);\n \n case FieldType.ENUM:\n return true; // Type depends on enum values\n \n default:\n return true;\n }\n }\n\n private validateFormat(value: any, format: any, type: FieldType): string[] {\n const errors: string[] = [];\n\n if (format.minimum !== undefined) {\n if (type === FieldType.STRING || type === FieldType.ARRAY) {\n if (value.length < format.minimum) {\n errors.push(`Minimum length is ${format.minimum}`);\n }\n } else if (type === FieldType.NUMBER || type === FieldType.INTEGER) {\n if (value < format.minimum) {\n errors.push(`Minimum value is ${format.minimum}`);\n }\n }\n }\n\n if (format.maximum !== undefined) {\n if (type === FieldType.STRING || type === FieldType.ARRAY) {\n if (value.length > format.maximum) {\n errors.push(`Maximum length is ${format.maximum}`);\n }\n } else if (type === FieldType.NUMBER || type === FieldType.INTEGER) {\n if (value > format.maximum) {\n errors.push(`Maximum value is ${format.maximum}`);\n }\n }\n }\n\n if (format.pattern && typeof value === 'string') {\n const regex = new RegExp(format.pattern);\n if (!regex.test(value)) {\n errors.push('Value does not match required pattern');\n }\n }\n\n return errors;\n }\n\n private convertJsonSchemaProperty(name: string, prop: any, required: boolean = false): FieldSchema {\n return {\n name,\n label: prop.title || name,\n type: this.mapJsonSchemaType(prop.type, prop.format),\n description: prop.description,\n required,\n allowedValues: prop.enum?.map((value: any) => ({\n value,\n label: value.toString()\n })),\n format: {\n minimum: prop.minimum || prop.minLength,\n maximum: prop.maximum || prop.maxLength,\n pattern: prop.pattern\n }\n };\n }\n\n private mapJsonSchemaType(type: string, format?: string): FieldType {\n if (format) {\n switch (format) {\n case 'email': return FieldType.EMAIL;\n case 'uri': return FieldType.URL;\n case 'date': return FieldType.DATE;\n case 'date-time': return FieldType.DATETIME;\n case 'time': return FieldType.TIME;\n case 'uuid': return FieldType.UUID;\n }\n }\n\n switch (type) {\n case 'string': return FieldType.STRING;\n case 'number': return FieldType.NUMBER;\n case 'integer': return FieldType.INTEGER;\n case 'boolean': return FieldType.BOOLEAN;\n case 'array': return FieldType.ARRAY;\n case 'object': return FieldType.OBJECT;\n default: return FieldType.STRING;\n }\n }\n\n private mapFormFieldType(type: string): FieldType {\n const typeMap: Record<string, FieldType> = {\n 'text': FieldType.STRING,\n 'email': FieldType.EMAIL,\n 'url': FieldType.URL,\n 'tel': FieldType.PHONE,\n 'number': FieldType.NUMBER,\n 'checkbox': FieldType.BOOLEAN,\n 'date': FieldType.DATE,\n 'datetime-local': FieldType.DATETIME,\n 'time': FieldType.TIME,\n 'select': FieldType.ENUM,\n 'textarea': FieldType.STRING\n };\n\n return typeMap[type] || FieldType.STRING;\n }\n\n private extractFormatFromField(field: any): any {\n const format: any = {};\n\n if (field.minLength !== undefined) format.minimum = field.minLength;\n if (field.maxLength !== undefined) format.maximum = field.maxLength;\n if (field.min !== undefined) format.minimum = field.min;\n if (field.max !== undefined) format.maximum = field.max;\n if (field.pattern) format.pattern = field.pattern;\n\n return Object.keys(format).length > 0 ? format : undefined;\n }\n}\n\n// Helper interfaces\nexport interface EnhancedFieldSchema extends FieldSchema {\n operators: string[];\n operatorLabels: Record<string, string>;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport {\n MatButtonToggleModule,\n MatButtonToggleChange,\n} from '@angular/material/button-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDialogModule, MatDialog } from '@angular/material/dialog';\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\n\nimport { Subject, takeUntil, combineLatest } from 'rxjs';\n\nimport { RuleBuilderService } from '../services/rule-builder.service';\nimport { FieldSchemaService } from '../services/field-schema.service';\nimport { RuleCanvasComponent } from './rule-canvas.component';\nimport { MetadataEditorComponent } from './metadata-editor.component';\nimport { DslViewerComponent } from './dsl-viewer.component';\nimport { JsonViewerComponent } from './json-viewer.component';\nimport { RoundTripTesterComponent } from './round-trip-tester.component';\nimport { ExportDialogComponent } from './export-dialog.component';\nimport { DslLinterComponent } from './dsl-linter.component';\nimport {\n RuleBuilderState,\n RuleNode,\n RuleNodeType,\n ValidationError,\n ExportOptions,\n ImportOptions,\n RuleBuilderConfig,\n RuleNodeConfig,\n} from '../models/rule-builder.model';\nimport {\n FieldSchema,\n CustomFunction,\n ContextVariable,\n} from '../models/field-schema.model';\n\n@Component({\n selector: 'praxis-rule-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCardModule,\n MatButtonModule,\n MatIconModule,\n MatTabsModule,\n MatToolbarModule,\n MatSidenavModule,\n MatListModule,\n MatDividerModule,\n MatProgressBarModule,\n MatSnackBarModule,\n MatButtonToggleModule,\n MatTooltipModule,\n MatDialogModule,\n DragDropModule,\n RuleCanvasComponent,\n MetadataEditorComponent,\n DslViewerComponent,\n JsonViewerComponent,\n RoundTripTesterComponent,\n DslLinterComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rule-editor-container\" [class.embedded]=\"embedded\">\n <!-- Header Toolbar -->\n <mat-toolbar class=\"rule-editor-toolbar\">\n <mat-toolbar-row>\n <span class=\"toolbar-title\">\n <mat-icon>rule</mat-icon>\n Visual Rule Builder\n </span>\n\n <span class=\"toolbar-spacer\"></span>\n\n <!-- Mode Selector -->\n <mat-button-toggle-group\n [value]=\"currentState?.mode\"\n (change)=\"onModeChange($event)\"\n >\n <mat-button-toggle value=\"visual\">\n <mat-icon>view_module</mat-icon>\n Visual\n </mat-button-toggle>\n <mat-button-toggle value=\"dsl\">\n <mat-icon>code</mat-icon>\n DSL\n </mat-button-toggle>\n <mat-button-toggle value=\"json\">\n <mat-icon>data_object</mat-icon>\n JSON\n </mat-button-toggle>\n </mat-button-toggle-group>\n\n <!-- Action Buttons -->\n <button\n mat-icon-button\n [disabled]=\"!canUndo\"\n (click)=\"undo()\"\n matTooltip=\"Undo\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <button\n mat-icon-button\n [disabled]=\"!canRedo\"\n (click)=\"redo()\"\n matTooltip=\"Redo\"\n >\n <mat-icon>redo</mat-icon>\n </button>\n\n <button\n mat-icon-button\n (click)=\"clearRules()\"\n matTooltip=\"Clear All Rules\"\n >\n <mat-icon>clear_all</mat-icon>\n </button>\n\n <button mat-button (click)=\"openExportDialog()\" color=\"primary\">\n <mat-icon>download</mat-icon>\n Export\n </button>\n\n <button mat-button (click)=\"importRules()\" color=\"accent\">\n <mat-icon>upload</mat-icon>\n Import\n </button>\n </mat-toolbar-row>\n </mat-toolbar>\n\n <!-- Main Content Area -->\n <div class=\"rule-editor-content\">\n <!-- Sidebar -->\n <mat-sidenav-container class=\"sidenav-container\">\n <mat-sidenav mode=\"side\" opened=\"true\" class=\"rule-editor-sidebar\">\n <!-- Rules List -->\n <div class=\"sidebar-section\">\n <h3 class=\"sidebar-title\">\n <mat-icon>list</mat-icon>\n Rules\n </h3>\n\n <div\n class=\"rules-list\"\n cdkDropList\n (cdkDropListDropped)=\"onRuleDrop($event)\"\n >\n <div\n *ngFor=\"\n let nodeId of currentState?.rootNodes;\n trackBy: trackByNodeId\n \"\n class=\"rule-item\"\n [class.selected]=\"isNodeSelected(nodeId)\"\n cdkDrag\n (click)=\"selectNode(nodeId)\"\n >\n <div class=\"rule-item-content\">\n <mat-icon class=\"rule-type-icon\">{{\n getNodeIcon(getNode(nodeId))\n }}</mat-icon>\n <span class=\"rule-label\">{{ getNodeLabel(nodeId) }}</span>\n\n <div class=\"rule-actions\">\n <button\n mat-icon-button\n size=\"small\"\n (click)=\"editNode(nodeId); $event.stopPropagation()\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n\n <button\n mat-icon-button\n size=\"small\"\n color=\"warn\"\n (click)=\"removeNode(nodeId); $event.stopPropagation()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Nested Rules -->\n <div *ngIf=\"hasChildren(nodeId)\" class=\"nested-rules\">\n <div\n *ngFor=\"let childId of getChildren(nodeId)\"\n class=\"nested-rule-item\"\n [class.selected]=\"isNodeSelected(childId)\"\n (click)=\"selectNode(childId); $event.stopPropagation()\"\n >\n <mat-icon class=\"rule-type-icon\">{{\n getNodeIcon(getNode(childId))\n }}</mat-icon>\n <span class=\"rule-label\">{{\n getNodeLabel(childId)\n }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Add Rule Button -->\n <button\n mat-fab\n color=\"primary\"\n class=\"add-rule-fab\"\n (click)=\"showAddRuleDialog()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </div>\n\n <mat-divider></mat-divider>\n\n <!-- Field Palette -->\n <div class=\"sidebar-section\">\n <h3 class=\"sidebar-title\">\n <mat-icon>view_list</mat-icon>\n Fields\n </h3>\n\n <div class=\"field-palette\">\n <div\n *ngFor=\"let category of fieldCategories\"\n class=\"field-category\"\n >\n <h4 class=\"category-title\">{{ category.name }}</h4>\n\n <div\n *ngFor=\"let field of category.fields\"\n class=\"field-item\"\n draggable=\"true\"\n (dragstart)=\"onFieldDragStart(field, $event)\"\n >\n <mat-icon class=\"field-icon\">{{\n getFieldIcon(field.type)\n }}</mat-icon>\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-type\">{{ field.type }}</span>\n </div>\n </div>\n </div>\n </div>\n </mat-sidenav>\n\n <!-- Main Editor Area -->\n <mat-sidenav-content class=\"editor-content\">\n <div class=\"editor-tabs\">\n <mat-tab-group [(selectedIndex)]=\"activeTabIndex\">\n <!-- Visual Builder Tab -->\n <mat-tab label=\"Visual Builder\">\n <div class=\"visual-builder\">\n <praxis-rule-canvas\n [state]=\"currentState\"\n [fieldSchemas]=\"fieldSchemas\"\n (nodeSelected)=\"selectNode($event)\"\n (nodeAdded)=\"onNodeAdded($event)\"\n (nodeUpdated)=\"onNodeUpdated($event)\"\n (nodeRemoved)=\"removeNode($event)\"\n >\n </praxis-rule-canvas>\n </div>\n </mat-tab>\n\n <!-- Metadata Editor Tab -->\n <mat-tab label=\"Metadata\">\n <div class=\"metadata-editor\">\n <praxis-metadata-editor\n [selectedNode]=\"selectedNode\"\n (metadataUpdated)=\"onMetadataUpdated($event)\"\n >\n </praxis-metadata-editor>\n </div>\n </mat-tab>\n\n <!-- DSL Viewer Tab -->\n <mat-tab label=\"DSL Preview\">\n <div class=\"dsl-viewer\">\n <praxis-dsl-viewer\n [dsl]=\"currentState?.currentDSL || ''\"\n [editable]=\"currentState?.mode === 'dsl'\"\n (dslChanged)=\"onDslChanged($event)\"\n >\n </praxis-dsl-viewer>\n </div>\n </mat-tab>\n\n <!-- JSON Viewer Tab -->\n <mat-tab label=\"JSON Preview\">\n <div class=\"json-viewer\">\n <praxis-json-viewer\n [json]=\"currentState?.currentJSON\"\n [editable]=\"currentState?.mode === 'json'\"\n (jsonChanged)=\"onJsonChanged($event)\"\n >\n </praxis-json-viewer>\n </div>\n </mat-tab>\n\n <!-- Round-Trip Tester Tab -->\n <mat-tab label=\"Round-Trip Validation\">\n <div class=\"round-trip-tester\">\n <praxis-round-trip-tester></praxis-round-trip-tester>\n </div>\n </mat-tab>\n\n <!-- DSL Linter Tab -->\n <mat-tab label=\"DSL Linter\">\n <div class=\"dsl-linter\">\n <praxis-dsl-linter\n [dsl]=\"currentState?.currentDSL || ''\"\n [autoLint]=\"true\"\n (errorSelected)=\"onLinterErrorSelected($event)\"\n (quickFixApplied)=\"onQuickFixApplied($event)\"\n (ruleToggled)=\"onLinterRuleToggled($event)\"\n >\n </praxis-dsl-linter>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n </mat-sidenav-content>\n </mat-sidenav-container>\n </div>\n\n <!-- Status Bar -->\n <div class=\"status-bar\">\n <div class=\"status-left\">\n <span class=\"node-count\">{{ getRuleCount() }} rules</span>\n <span *ngIf=\"currentState?.isDirty\" class=\"dirty-indicator\">•</span>\n </div>\n\n <div class=\"status-center\">\n <div\n *ngIf=\"validationErrors && validationErrors.length > 0\"\n class=\"validation-status error\"\n >\n <mat-icon>error</mat-icon>\n {{ validationErrors.length }} error(s)\n </div>\n <div\n *ngIf=\"validationErrors?.length === 0\"\n class=\"validation-status success\"\n >\n <mat-icon>check_circle</mat-icon>\n Valid\n </div>\n </div>\n\n <div class=\"status-right\">\n <span class=\"mode-indicator\">{{\n currentState?.mode?.toUpperCase()\n }}</span>\n </div>\n </div>\n\n <!-- Validation Errors Panel -->\n <div\n *ngIf=\"\n showValidationErrors &&\n validationErrors &&\n validationErrors.length > 0\n \"\n class=\"validation-panel\"\n >\n <div class=\"validation-header\">\n <h3>Validation Errors</h3>\n <button mat-icon-button (click)=\"hideValidationErrors()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"validation-list\">\n <div\n *ngFor=\"let error of validationErrors\"\n class=\"validation-error\"\n [class]=\"error.severity\"\n >\n <mat-icon>{{ getErrorIcon(error.severity) }}</mat-icon>\n <div class=\"error-content\">\n <div class=\"error-message\">{{ error.message }}</div>\n <div *ngIf=\"error.suggestion\" class=\"error-suggestion\">\n Suggestion: {{ error.suggestion }}\n </div>\n </div>\n <button\n *ngIf=\"error.nodeId\"\n mat-icon-button\n (click)=\"selectNode(error.nodeId)\"\n >\n <mat-icon>my_location</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n --mdc-theme-background: var(--md-sys-color-background, var(--sicoob-bg-high));\n --mdc-theme-surface: var(--md-sys-color-surface, var(--sicoob-bg-elev-1));\n --mdc-theme-surface-variant: var(--md-sys-color-surface-container, var(--sicoob-bg-elev-2));\n --mdc-theme-outline: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));\n --mdc-theme-on-surface: var(--md-sys-color-on-surface, var(--sicoob-text-high));\n --mdc-theme-on-surface-variant: var(--md-sys-color-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n --mdc-theme-primary: var(--md-sys-color-primary, var(--sicoob-primary-default));\n --mdc-theme-secondary: var(--md-sys-color-secondary, var(--sicoob-secondary-default, var(--mdc-theme-primary)));\n --mdc-theme-tertiary: var(--md-sys-color-tertiary, var(--sicoob-tertiary-default, var(--mdc-theme-primary)));\n --mdc-theme-error: var(--md-sys-color-error, var(--sicoob-error-default));\n --mdc-theme-error-container: var(--md-sys-color-error-container, color-mix(in srgb, var(--mdc-theme-error), transparent 85%));\n }\n .rule-editor-container {\n display: flex;\n flex-direction: column;\n height: 100vh;\n overflow: hidden;\n }\n\n .rule-editor-container.embedded {\n /* Em modo embutido, deixe o container crescer com o conteúdo */\n height: auto;\n overflow: visible;\n }\n\n .rule-editor-toolbar {\n background: var(--mdc-theme-primary);\n color: white;\n flex-shrink: 0;\n }\n\n .toolbar-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n }\n\n .toolbar-spacer {\n flex: 1;\n }\n\n .rule-editor-content {\n flex: 1;\n min-height: 0;\n }\n\n .sidenav-container {\n height: 100%;\n min-height: 0;\n }\n\n .rule-editor-sidebar {\n width: 300px;\n padding: 16px;\n background: var(--mdc-theme-surface);\n border-right: 1px solid var(--mdc-theme-outline);\n }\n\n .sidebar-section {\n margin-bottom: 24px;\n }\n\n .sidebar-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .rules-list {\n min-height: 200px;\n }\n\n .rule-item {\n margin-bottom: 8px;\n padding: 12px;\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s ease;\n }\n\n .rule-item:hover { border-color: var(--mdc-theme-primary); box-shadow: 0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,0.1)); }\n\n .rule-item.selected {\n border-color: var(--mdc-theme-primary);\n background: var(--mdc-theme-primary-container);\n }\n\n .rule-item-content {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .rule-type-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n color: var(--mdc-theme-primary);\n }\n\n .rule-label {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n }\n\n .rule-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n .rule-item:hover .rule-actions {\n opacity: 1;\n }\n\n .nested-rules {\n margin-top: 8px;\n margin-left: 24px;\n border-left: 2px solid var(--mdc-theme-outline);\n padding-left: 12px;\n }\n\n .nested-rule-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n }\n\n .nested-rule-item:hover {\n background: var(--mdc-theme-surface-variant);\n }\n\n .nested-rule-item.selected {\n background: var(--mdc-theme-primary-container);\n }\n\n .add-rule-fab {\n position: absolute;\n bottom: 16px;\n right: 16px;\n scale: 0.8;\n }\n\n .field-palette {\n max-height: 300px;\n overflow-y: auto;\n }\n\n .field-category {\n margin-bottom: 16px;\n }\n\n .category-title {\n font-size: 12px;\n font-weight: 600;\n color: var(--mdc-theme-primary);\n margin: 0 0 8px 0;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .field-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 4px;\n cursor: grab;\n font-size: 13px;\n transition: background 0.2s ease;\n }\n\n .field-item:hover {\n background: var(--mdc-theme-surface-variant);\n }\n\n .field-item:active {\n cursor: grabbing;\n }\n\n .field-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n color: var(--mdc-theme-secondary);\n }\n\n .field-label {\n flex: 1;\n font-weight: 500;\n }\n\n .field-type {\n font-size: 11px;\n color: var(--mdc-theme-on-surface-variant);\n background: var(--mdc-theme-surface-variant);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .editor-content {\n background: var(--mdc-theme-background);\n }\n\n .editor-tabs {\n height: 100%;\n }\n\n .visual-builder,\n .metadata-editor,\n .dsl-viewer,\n .json-viewer,\n .round-trip-tester,\n .dsl-linter {\n height: 100%;\n padding: 16px;\n box-sizing: border-box;\n }\n\n .round-trip-tester,\n .dsl-linter {\n padding: 0; /* Let the component handle its own padding */\n }\n\n .status-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: var(--mdc-theme-surface-variant);\n border-top: 1px solid var(--mdc-theme-outline);\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .status-left,\n .status-center,\n .status-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .dirty-indicator {\n color: var(--mdc-theme-primary);\n font-weight: bold;\n }\n\n .validation-status {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n }\n\n .validation-status.error {\n color: var(--mdc-theme-error);\n }\n\n .validation-status.success {\n color: var(--mdc-theme-tertiary);\n }\n\n .validation-status mat-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n\n .mode-indicator {\n font-weight: 600;\n color: var(--mdc-theme-primary);\n }\n\n .validation-panel {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n max-height: 200px;\n background: var(--mdc-theme-surface);\n border-top: 1px solid var(--mdc-theme-outline);\n box-shadow: 0 -2px 8px var(--vb-shadow-low-color, rgba(0,0,0,0.1));\n z-index: 1000;\n }\n\n .validation-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mdc-theme-outline);\n }\n\n .validation-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 500;\n }\n\n .validation-list {\n max-height: 150px;\n overflow-y: auto;\n padding: 8px;\n }\n\n .validation-error {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px;\n border-radius: 4px;\n margin-bottom: 4px;\n }\n\n .validation-error.error {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n }\n\n .validation-error.warning {\n background: var(--mdc-theme-warning-container);\n color: var(--mdc-theme-on-warning-container);\n }\n\n .validation-error.info {\n background: var(--mdc-theme-info-container);\n color: var(--mdc-theme-on-info-container);\n }\n\n .error-content {\n flex: 1;\n }\n\n .error-message {\n font-weight: 500;\n margin-bottom: 2px;\n }\n\n .error-suggestion {\n font-size: 12px;\n opacity: 0.8;\n }\n\n /* Drag and drop styles */\n .cdk-drag-preview {\n box-sizing: border-box;\n border-radius: 4px;\n box-shadow: 0 6px 16px var(--vb-shadow-medium-color, rgba(0,0,0,0.18));\n }\n\n .cdk-drag-placeholder {\n opacity: 0;\n }\n\n .cdk-drag-animating {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n }\n\n .cdk-drop-list-dragging .rule-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n }\n `,\n ],\n})\nexport class RuleEditorComponent implements OnInit, OnDestroy {\n @Input() config: RuleBuilderConfig | null = null;\n @Input() initialRules: any = null;\n @Input() embedded = false;\n\n @Output() rulesChanged = new EventEmitter<any>();\n @Output() exportRequested = new EventEmitter<ExportOptions>();\n @Output() importRequested = new EventEmitter<ImportOptions>();\n\n private destroy$ = new Subject<void>();\n\n // Component state\n currentState: RuleBuilderState | null = null;\n validationErrors: ValidationError[] = [];\n selectedNode: RuleNode | null = null;\n fieldSchemas: Record<string, FieldSchema> = {};\n fieldCategories: any[] = [];\n\n activeTabIndex = 0;\n showValidationErrors = false;\n\n // Computed properties\n get canUndo(): boolean {\n return (this.currentState?.historyPosition || 0) > 0;\n }\n\n get canRedo(): boolean {\n return (\n (this.currentState?.historyPosition || 0) <\n (this.currentState?.history.length || 0) - 1\n );\n }\n\n constructor(\n private ruleBuilderService: RuleBuilderService,\n private fieldSchemaService: FieldSchemaService,\n private snackBar: MatSnackBar,\n private fb: FormBuilder,\n private dialog: MatDialog,\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.initializeBuilder();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSubscriptions(): void {\n // Subscribe to rule builder state changes\n this.ruleBuilderService.state$\n .pipe(takeUntil(this.destroy$))\n .subscribe((state) => {\n this.currentState = state;\n this.updateSelectedNode();\n this.rulesChanged.emit(state);\n });\n\n // Subscribe to validation errors\n this.ruleBuilderService.validationErrors$\n .pipe(takeUntil(this.destroy$))\n .subscribe((errors) => {\n this.validationErrors = errors;\n this.showValidationErrors = errors.length > 0;\n });\n\n // Subscribe to node selection\n this.ruleBuilderService.nodeSelected$\n .pipe(takeUntil(this.destroy$))\n .subscribe((nodeId) => {\n this.updateSelectedNode();\n });\n\n // Subscribe to field schemas\n combineLatest([\n this.fieldSchemaService.fieldSchemas$,\n this.fieldSchemaService.getFieldSchemasByCategory(),\n ])\n .pipe(takeUntil(this.destroy$))\n .subscribe(([schemas, categories]) => {\n this.fieldSchemas = schemas;\n this.fieldCategories = Object.entries(categories).map(\n ([name, fields]) => ({\n name,\n fields,\n }),\n );\n });\n }\n\n private initializeBuilder(): void {\n if (this.config) {\n this.ruleBuilderService.initialize(this.config);\n this.fieldSchemaService.setFieldSchemas(\n this.config.fieldSchemas as Record<string, FieldSchema>,\n );\n\n if (this.config.contextVariables) {\n this.fieldSchemaService.setContext({\n contextVariables: this.config.contextVariables as ContextVariable[],\n customFunctions: this.config.customFunctions as CustomFunction[],\n });\n }\n }\n\n if (this.initialRules) {\n this.importInitialRules();\n }\n }\n\n private importInitialRules(): void {\n try {\n let content: string;\n let format: 'json' | 'dsl' = 'json';\n\n if (typeof this.initialRules === 'string') {\n content = this.initialRules;\n const trimmed = content.trim();\n // Heurística simples para detectar JSON vs DSL\n if (!(trimmed.startsWith('{') || trimmed.startsWith('['))) {\n format = 'dsl';\n }\n } else {\n content = JSON.stringify(this.initialRules);\n }\n\n this.ruleBuilderService.import(content, { format });\n } catch (error) {\n console.error('Failed to import initial rules:', error);\n this.snackBar.open('Failed to import initial rules', 'Close', {\n duration: 3000,\n });\n }\n }\n\n private updateSelectedNode(): void {\n if (this.currentState?.selectedNodeId) {\n this.selectedNode =\n this.currentState.nodes[this.currentState.selectedNodeId] || null;\n } else {\n this.selectedNode = null;\n }\n }\n\n // Template methods\n trackByNodeId(index: number, nodeId: string): string {\n return nodeId;\n }\n\n getNode(nodeId: string): RuleNode | null {\n return this.currentState?.nodes[nodeId] || null;\n }\n\n getNodeLabel(nodeId: string): string {\n const node = this.getNode(nodeId);\n return node?.label || node?.type || 'Unknown';\n }\n\n getNodeIcon(node: RuleNode | null): string {\n if (!node) return 'help';\n\n const icons: Record<RuleNodeType, string> = {\n [RuleNodeType.FIELD_CONDITION]: 'compare_arrows',\n [RuleNodeType.AND_GROUP]: 'join_inner',\n [RuleNodeType.OR_GROUP]: 'join_full',\n [RuleNodeType.NOT_GROUP]: 'block',\n [RuleNodeType.XOR_GROUP]: 'join_left',\n [RuleNodeType.IMPLIES_GROUP]: 'arrow_forward',\n // Phase 1: Conditional Validators (Enhanced Icons)\n [RuleNodeType.REQUIRED_IF]: 'star_border',\n [RuleNodeType.VISIBLE_IF]: 'visibility',\n [RuleNodeType.DISABLED_IF]: 'block',\n [RuleNodeType.READONLY_IF]: 'lock_outline',\n [RuleNodeType.FOR_EACH]: 'repeat',\n [RuleNodeType.UNIQUE_BY]: 'fingerprint',\n [RuleNodeType.MIN_LENGTH]: 'height',\n [RuleNodeType.MAX_LENGTH]: 'height',\n [RuleNodeType.IF_DEFINED]: 'help',\n [RuleNodeType.IF_NOT_NULL]: 'help_outline',\n [RuleNodeType.IF_EXISTS]: 'search',\n [RuleNodeType.WITH_DEFAULT]: 'settings_backup_restore',\n [RuleNodeType.FUNCTION_CALL]: 'functions',\n [RuleNodeType.FIELD_TO_FIELD]: 'compare_arrows',\n [RuleNodeType.CONTEXTUAL]: 'dynamic_form',\n [RuleNodeType.AT_LEAST]: 'filter_list',\n [RuleNodeType.EXACTLY]: 'looks_one',\n [RuleNodeType.EXPRESSION]: 'code',\n [RuleNodeType.CONTEXTUAL_TEMPLATE]: 'view_module',\n [RuleNodeType.CUSTOM]: 'extension',\n };\n\n return icons[node.type] || 'help';\n }\n\n getFieldIcon(type: string): string {\n const icons: Record<string, string> = {\n string: 'text_fields',\n number: 'pin',\n integer: 'pin',\n boolean: 'toggle_on',\n date: 'event',\n datetime: 'schedule',\n time: 'access_time',\n email: 'email',\n url: 'link',\n phone: 'phone',\n array: 'list',\n object: 'data_object',\n enum: 'list',\n uuid: 'fingerprint',\n json: 'data_object',\n };\n\n return icons[type] || 'text_fields';\n }\n\n isNodeSelected(nodeId: string): boolean {\n return this.currentState?.selectedNodeId === nodeId;\n }\n\n hasChildren(nodeId: string): boolean {\n const node = this.getNode(nodeId);\n return !!(node?.children && node.children.length > 0);\n }\n\n getChildren(nodeId: string): string[] {\n const node = this.getNode(nodeId);\n return node?.children || [];\n }\n\n getRuleCount(): number {\n return Object.keys(this.currentState?.nodes || {}).length;\n }\n\n getErrorIcon(severity: string): string {\n const icons: Record<string, string> = {\n error: 'error',\n warning: 'warning',\n info: 'info',\n };\n\n return icons[severity] || 'info';\n }\n\n // Event handlers\n onModeChange(event: MatButtonToggleChange): void {\n const mode = event.value as any;\n // Handle mode change\n }\n\n selectNode(nodeId?: string): void {\n this.ruleBuilderService.selectNode(nodeId);\n }\n\n editNode(nodeId: string): void {\n // Open edit dialog or navigate to metadata tab\n this.selectNode(nodeId);\n this.activeTabIndex = 1; // Metadata tab\n }\n\n removeNode(nodeId: string): void {\n this.ruleBuilderService.removeNode(nodeId);\n this.snackBar\n .open('Rule removed', 'Undo', { duration: 3000 })\n .onAction()\n .subscribe(() => {\n this.undo();\n });\n }\n\n onRuleDrop(event: CdkDragDrop<string[]>): void {\n if (event.previousIndex !== event.currentIndex) {\n // Handle rule reordering\n }\n }\n\n onFieldDragStart(field: FieldSchema, event: DragEvent): void {\n if (event.dataTransfer) {\n event.dataTransfer.setData('field', JSON.stringify(field));\n }\n }\n\n showAddRuleDialog(): void {\n // Open add rule dialog\n }\n\n onNodeAdded(event: {\n type: RuleNodeType;\n parentId?: string;\n config?: RuleNodeConfig;\n }): void {\n const nodeId = this.ruleBuilderService.addNode(\n { type: event.type, config: event.config },\n event.parentId,\n );\n this.ruleBuilderService.selectNode(nodeId);\n this.snackBar.open('Rule added', 'Close', { duration: 2000 });\n }\n\n onNodeUpdated(event: { nodeId: string; updates: Partial<RuleNode> }): void {\n this.ruleBuilderService.updateNode(event.nodeId, event.updates);\n }\n\n onMetadataUpdated(event: any): void {\n if (this.selectedNode) {\n this.ruleBuilderService.updateNode(this.selectedNode.id, {\n metadata: event,\n });\n }\n }\n\n onDslChanged(dsl: string): void {\n try {\n this.ruleBuilderService.import(dsl, { format: 'dsl', merge: false });\n this.snackBar.open('DSL imported successfully', 'Close', {\n duration: 2000,\n });\n } catch (error) {\n console.error('Failed to import DSL:', error);\n this.snackBar.open('Failed to import DSL: Invalid syntax', 'Close', {\n duration: 3000,\n });\n }\n }\n\n onJsonChanged(json: any): void {\n try {\n const jsonString = typeof json === 'string' ? json : JSON.stringify(json);\n this.ruleBuilderService.import(jsonString, {\n format: 'json',\n merge: false,\n });\n this.snackBar.open('JSON imported successfully', 'Close', {\n duration: 2000,\n });\n } catch (error) {\n console.error('Failed to import JSON:', error);\n this.snackBar.open('Failed to import JSON: Invalid format', 'Close', {\n duration: 3000,\n });\n }\n }\n\n undo(): void {\n this.ruleBuilderService.undo();\n }\n\n redo(): void {\n this.ruleBuilderService.redo();\n }\n\n clearRules(): void {\n this.ruleBuilderService.clear();\n this.snackBar.open('All rules cleared', 'Close', { duration: 2000 });\n }\n\n openExportDialog(): void {\n const dialogRef = this.dialog.open(ExportDialogComponent, {\n width: '800px',\n maxWidth: '90vw',\n data: {\n title: 'Export Rules',\n allowMultipleFormats: true,\n preselectedFormat: this.currentState?.mode === 'dsl' ? 'dsl' : 'json',\n showIntegrationTab: true,\n showSharingTab: true,\n },\n });\n\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n // Handle any post-export actions if needed\n this.snackBar.open('Export completed', 'Close', { duration: 2000 });\n }\n });\n }\n\n importRules(): void {\n // Create file input element\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json,.dsl,.txt';\n input.multiple = false;\n\n input.onchange = (event: any) => {\n const file = event.target.files[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const format =\n file.name.endsWith('.dsl') || file.name.endsWith('.txt')\n ? 'dsl'\n : 'json';\n\n this.ruleBuilderService.import(content, { format, merge: false });\n this.snackBar.open(`Rules imported from ${file.name}`, 'Close', {\n duration: 2000,\n });\n } catch (error) {\n console.error('Import failed:', error);\n this.snackBar.open(\n 'Failed to import rules: Invalid format',\n 'Close',\n { duration: 3000 },\n );\n }\n };\n\n reader.readAsText(file);\n };\n\n input.click();\n }\n\n hideValidationErrors(): void {\n this.showValidationErrors = false;\n }\n\n onLinterErrorSelected(error: any): void {\n // Navigate to the error location in DSL viewer\n this.activeTabIndex = 2; // DSL Preview tab\n // Additional logic to highlight the specific line/column could be added here\n console.log('Navigate to linter error:', error);\n }\n\n onQuickFixApplied(event: any): void {\n // Apply the quick fix to the DSL\n const { error, fix } = event;\n\n try {\n // Get current DSL\n let currentDsl = this.currentState?.currentDSL || '';\n\n // Apply edits from the quick fix\n if (fix.edits && fix.edits.length > 0) {\n const lines = currentDsl.split('\\n');\n\n // Apply edits in reverse order to maintain line/column positions\n fix.edits\n .sort((a: any, b: any) => b.range.startLine - a.range.startLine)\n .forEach((edit: any) => {\n const lineIndex = edit.range.startLine - 1;\n if (lineIndex >= 0 && lineIndex < lines.length) {\n const line = lines[lineIndex];\n const before = line.substring(0, edit.range.startColumn - 1);\n const after = line.substring(edit.range.endColumn - 1);\n lines[lineIndex] = before + edit.newText + after;\n }\n });\n\n const fixedDsl = lines.join('\\n');\n\n // Import the fixed DSL\n this.ruleBuilderService.import(fixedDsl, {\n format: 'dsl',\n merge: false,\n });\n this.snackBar.open(`Quick fix applied: ${fix.title}`, 'Close', {\n duration: 3000,\n });\n }\n } catch (error) {\n console.error('Failed to apply quick fix:', error);\n this.snackBar.open('Failed to apply quick fix', 'Close', {\n duration: 3000,\n });\n }\n }\n\n onLinterRuleToggled(event: any): void {\n const { rule, enabled } = event;\n console.log(`Linter rule ${rule.id} ${enabled ? 'enabled' : 'disabled'}`);\n\n // Save linter rule preferences (could be stored in local storage or user preferences)\n const preferences = JSON.parse(\n localStorage.getItem('dsl-linter-rules') || '{}',\n );\n preferences[rule.id] = enabled;\n localStorage.setItem('dsl-linter-rules', JSON.stringify(preferences));\n\n this.snackBar.open(\n `Rule \"${rule.name}\" ${enabled ? 'enabled' : 'disabled'}`,\n 'Close',\n { duration: 2000 },\n );\n }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { RuleEditorComponent } from './components/rule-editor.component';\nimport { RuleBuilderConfig, ExportOptions, ImportOptions } from './models/rule-builder.model';\n\n@Component({\n selector: 'praxis-visual-builder',\n standalone: true,\n imports: [RuleEditorComponent],\n template: `\n <div class=\"praxis-visual-builder mat-app-background\">\n <praxis-rule-editor\n [config]=\"config\"\n [initialRules]=\"initialRules\"\n [embedded]=\"true\"\n (rulesChanged)=\"onRulesChanged($event)\"\n (exportRequested)=\"onExportRequested($event)\"\n (importRequested)=\"onImportRequested($event)\">\n </praxis-rule-editor>\n </div>\n `,\n styleUrls: ['./styles/visual-builder-theme.scss'],\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: auto; /* permitir que o host cresça conforme o conteúdo quando embutido */\n }\n \n .praxis-visual-builder {\n width: 100%;\n height: auto; /* evitar prender a altura (causa corte do rodapé) */\n overflow: visible; /* permitir que menus e FABs não sejam cortados */\n }\n `]\n})\nexport class PraxisVisualBuilder {\n @Input() config: RuleBuilderConfig | null = null;\n @Input() initialRules: any = null;\n \n @Output() rulesChanged = new EventEmitter<any>();\n @Output() exportRequested = new EventEmitter<ExportOptions>();\n @Output() importRequested = new EventEmitter<ImportOptions>();\n\n onRulesChanged(rules: any): void {\n this.rulesChanged.emit(rules);\n }\n\n onExportRequested(options: ExportOptions): void {\n this.exportRequested.emit(options);\n }\n\n onImportRequested(options: ImportOptions): void {\n this.importRequested.emit(options);\n }\n}\n","/**\n * Array Field Schema Support for Collection Validators\n * Phase 2 Implementation\n */\n\nimport { FieldSchema, FieldType } from './field-schema.model';\nimport { CollectionValidatorConfig } from './rule-builder.model';\n\n/**\n * Extended field schema for array types\n */\nexport interface ArrayFieldSchema extends FieldSchema {\n type: FieldType.ARRAY;\n \n /** Schema for individual items in the array */\n itemSchema?: FieldSchema;\n \n /** Minimum number of items */\n minItems?: number;\n \n /** Maximum number of items */\n maxItems?: number;\n \n /** Whether items must be unique */\n uniqueItems?: boolean;\n \n /** Fields to check for uniqueness */\n uniqueBy?: string[];\n \n /** Default value for new items */\n defaultItem?: any;\n \n /** Whether to allow adding items */\n allowAdd?: boolean;\n \n /** Whether to allow removing items */\n allowRemove?: boolean;\n \n /** Whether to allow reordering items */\n allowReorder?: boolean;\n \n /** Custom validation rules for the array */\n arrayValidation?: {\n forEach?: {\n rules: any[];\n stopOnFirstError?: boolean;\n };\n uniqueBy?: {\n fields: string[];\n caseSensitive?: boolean;\n ignoreEmpty?: boolean;\n };\n length?: {\n min?: number;\n max?: number;\n errorMessage?: string;\n };\n };\n \n /** UI configuration specific to arrays */\n arrayUiConfig?: {\n /** How to display the array */\n displayMode?: 'table' | 'cards' | 'list' | 'accordion';\n \n /** Whether to show item count */\n showCount?: boolean;\n \n /** Custom add button text */\n addButtonText?: string;\n \n /** Custom remove button text */\n removeButtonText?: string;\n \n /** Whether to confirm before removing */\n confirmRemove?: boolean;\n \n /** Message to show when array is empty */\n emptyMessage?: string;\n \n /** Whether to collapse items by default */\n collapsedByDefault?: boolean;\n \n /** Maximum items to show before pagination */\n pageSize?: number;\n };\n}\n\n/**\n * Utility to check if a field schema is an array\n */\nexport function isArrayFieldSchema(schema: FieldSchema): schema is ArrayFieldSchema {\n return schema.type === FieldType.ARRAY;\n}\n\n/**\n * Utility to get nested field paths from an array schema\n */\nexport function getArrayItemFieldPaths(schema: ArrayFieldSchema, prefix: string = ''): string[] {\n const paths: string[] = [];\n \n if (!schema.itemSchema) {\n return paths;\n }\n \n const itemPrefix = prefix ? `${prefix}.` : '';\n \n if (schema.itemSchema.type === FieldType.OBJECT && 'properties' in schema.itemSchema) {\n // Handle object items\n const objectSchema = schema.itemSchema as any;\n Object.entries(objectSchema.properties || {}).forEach(([key, prop]: [string, any]) => {\n const fieldPath = `${itemPrefix}${key}`;\n paths.push(fieldPath);\n \n // Recursively handle nested arrays\n if (prop.type === FieldType.ARRAY) {\n paths.push(...getArrayItemFieldPaths(prop as ArrayFieldSchema, fieldPath));\n }\n });\n } else {\n // Handle primitive items\n paths.push(itemPrefix);\n }\n \n return paths;\n}\n\n/**\n * Array validation context for runtime validation\n */\nexport interface ArrayValidationContext {\n /** The array being validated */\n array: any[];\n \n /** Current item being validated (for forEach) */\n currentItem?: any;\n \n /** Current item index (for forEach) */\n currentIndex?: number;\n \n /** Parent context */\n parentContext?: any;\n \n /** Field schema */\n schema: ArrayFieldSchema;\n \n /** Accumulated errors */\n errors: ArrayValidationError[];\n}\n\n/**\n * Array validation error\n */\nexport interface ArrayValidationError {\n /** Error type */\n type: 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength' | 'other';\n \n /** Error message */\n message: string;\n \n /** Item index (if applicable) */\n itemIndex?: number;\n \n /** Field path within item (if applicable) */\n fieldPath?: string;\n \n /** Duplicate indices (for uniqueBy) */\n duplicateIndices?: number[];\n \n /** Expected value */\n expected?: any;\n \n /** Actual value */\n actual?: any;\n}\n\n/**\n * Array field analyzer for detecting array fields in schemas\n */\nexport class ArrayFieldAnalyzer {\n /**\n * Analyze a schema tree and find all array fields\n */\n static findArrayFields(schemas: Record<string, FieldSchema>): Record<string, ArrayFieldSchema> {\n const arrayFields: Record<string, ArrayFieldSchema> = {};\n \n Object.entries(schemas).forEach(([key, schema]) => {\n if (isArrayFieldSchema(schema)) {\n arrayFields[key] = schema;\n }\n \n // Check nested fields in objects\n if (schema.type === FieldType.OBJECT && 'properties' in schema) {\n const objectSchema = schema as any;\n const nestedArrays = this.findArrayFields(objectSchema.properties || {});\n \n Object.entries(nestedArrays).forEach(([nestedKey, nestedSchema]) => {\n arrayFields[`${key}.${nestedKey}`] = nestedSchema;\n });\n }\n });\n \n return arrayFields;\n }\n \n /**\n * Get validation rules for an array field\n */\n static getValidationRules(schema: ArrayFieldSchema): ArrayCollectionValidationRule[] {\n const rules: ArrayCollectionValidationRule[] = [];\n \n // Length constraints\n if (schema.minItems !== undefined) {\n rules.push({\n type: 'minLength',\n value: schema.minItems,\n message: `Must have at least ${schema.minItems} items`\n });\n }\n \n if (schema.maxItems !== undefined) {\n rules.push({\n type: 'maxLength',\n value: schema.maxItems,\n message: `Must have at most ${schema.maxItems} items`\n });\n }\n \n // Uniqueness constraints\n if (schema.uniqueItems || schema.uniqueBy) {\n rules.push({\n type: 'uniqueBy',\n fields: schema.uniqueBy || [],\n message: 'Items must be unique'\n });\n }\n \n // Custom validation rules\n if (schema.arrayValidation) {\n if (schema.arrayValidation.forEach) {\n rules.push({\n type: 'forEach',\n rules: schema.arrayValidation.forEach.rules,\n message: 'Each item must be valid'\n });\n }\n }\n \n return rules;\n }\n}\n\n/**\n * Array collection validation rule\n */\nexport interface ArrayCollectionValidationRule {\n type: 'forEach' | 'uniqueBy' | 'minLength' | 'maxLength';\n value?: any;\n fields?: string[];\n rules?: any[];\n message: string;\n}","import { Injectable } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject, interval } from 'rxjs';\nimport { filter, switchMap, catchError, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { RuleBuilderService } from './rule-builder.service';\nimport { ExportIntegrationService } from './export-integration.service';\n\nexport interface WebhookConfig {\n id: string;\n name: string;\n url: string;\n method: 'POST' | 'PUT' | 'PATCH';\n headers?: Record<string, string>;\n authentication?: {\n type: 'none' | 'basic' | 'bearer' | 'apikey';\n credentials: any;\n };\n format: string;\n events: WebhookEvent[];\n enabled: boolean;\n retryConfig?: {\n maxRetries: number;\n retryDelay: number;\n backoffMultiplier: number;\n };\n filtering?: {\n includeMetadata: boolean;\n minRuleCount?: number;\n maxRuleCount?: number;\n ruleTypes?: string[];\n };\n}\n\nexport interface WebhookEvent {\n type: 'rule-added' | 'rule-updated' | 'rule-deleted' | 'rules-imported' | 'rules-exported' | 'validation-changed';\n description: string;\n enabled: boolean;\n}\n\nexport interface WebhookDelivery {\n id: string;\n webhookId: string;\n event: string;\n url: string;\n payload: any;\n status: 'pending' | 'delivered' | 'failed' | 'retrying';\n attempts: number;\n lastAttempt?: Date;\n nextRetry?: Date;\n response?: {\n statusCode: number;\n headers: Record<string, string>;\n body: string;\n };\n error?: string;\n createdAt: Date;\n deliveredAt?: Date;\n}\n\nexport interface WebhookStats {\n totalDeliveries: number;\n successfulDeliveries: number;\n failedDeliveries: number;\n pendingDeliveries: number;\n successRate: number;\n lastDelivery?: Date;\n averageResponseTime?: number;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WebhookIntegrationService {\n private webhooks: WebhookConfig[] = [];\n private deliveries: WebhookDelivery[] = [];\n private deliveryQueue = new Subject<WebhookDelivery>();\n private statusUpdates = new BehaviorSubject<Record<string, WebhookStats>>({});\n\n private readonly SUPPORTED_EVENTS: WebhookEvent[] = [\n {\n type: 'rule-added',\n description: 'Triggered when a new rule is added',\n enabled: true\n },\n {\n type: 'rule-updated',\n description: 'Triggered when an existing rule is modified',\n enabled: true\n },\n {\n type: 'rule-deleted',\n description: 'Triggered when a rule is removed',\n enabled: true\n },\n {\n type: 'rules-imported',\n description: 'Triggered when rules are imported from external source',\n enabled: false\n },\n {\n type: 'rules-exported',\n description: 'Triggered when rules are exported',\n enabled: false\n },\n {\n type: 'validation-changed',\n description: 'Triggered when validation status changes',\n enabled: false\n }\n ];\n\n public readonly webhookStats$ = this.statusUpdates.asObservable();\n\n constructor(\n private ruleBuilderService: RuleBuilderService,\n private exportService: ExportIntegrationService\n ) {\n this.initializeWebhookProcessing();\n this.subscribeToRuleChanges();\n }\n\n /**\n * Registers a new webhook configuration\n */\n registerWebhook(config: WebhookConfig): void {\n const existingIndex = this.webhooks.findIndex(w => w.id === config.id);\n if (existingIndex >= 0) {\n this.webhooks[existingIndex] = config;\n } else {\n this.webhooks.push(config);\n }\n this.updateStats();\n }\n\n /**\n * Removes a webhook configuration\n */\n unregisterWebhook(webhookId: string): void {\n this.webhooks = this.webhooks.filter(w => w.id !== webhookId);\n this.updateStats();\n }\n\n /**\n * Gets all registered webhooks\n */\n getWebhooks(): WebhookConfig[] {\n return [...this.webhooks];\n }\n\n /**\n * Gets a specific webhook by ID\n */\n getWebhook(webhookId: string): WebhookConfig | null {\n return this.webhooks.find(w => w.id === webhookId) || null;\n }\n\n /**\n * Updates webhook configuration\n */\n updateWebhook(webhookId: string, updates: Partial<WebhookConfig>): void {\n const webhook = this.webhooks.find(w => w.id === webhookId);\n if (webhook) {\n Object.assign(webhook, updates);\n this.updateStats();\n }\n }\n\n /**\n * Enables or disables a webhook\n */\n toggleWebhook(webhookId: string, enabled: boolean): void {\n this.updateWebhook(webhookId, { enabled });\n }\n\n /**\n * Tests a webhook by sending a test payload\n */\n testWebhook(webhookId: string): Observable<WebhookDelivery> {\n const webhook = this.getWebhook(webhookId);\n if (!webhook) {\n throw new Error(`Webhook not found: ${webhookId}`);\n }\n\n const testDelivery: WebhookDelivery = {\n id: this.generateDeliveryId(),\n webhookId,\n event: 'test',\n url: webhook.url,\n payload: {\n event: 'test',\n timestamp: new Date().toISOString(),\n data: {\n message: 'This is a test webhook delivery',\n webhook: {\n id: webhook.id,\n name: webhook.name\n }\n }\n },\n status: 'pending',\n attempts: 0,\n createdAt: new Date()\n };\n\n return this.deliverWebhook(testDelivery);\n }\n\n /**\n * Gets delivery history for a webhook\n */\n getDeliveryHistory(webhookId: string, limit = 50): WebhookDelivery[] {\n return this.deliveries\n .filter(d => d.webhookId === webhookId)\n .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())\n .slice(0, limit);\n }\n\n /**\n * Gets overall delivery statistics\n */\n getDeliveryStats(webhookId?: string): WebhookStats {\n const relevantDeliveries = webhookId \n ? this.deliveries.filter(d => d.webhookId === webhookId)\n : this.deliveries;\n\n const totalDeliveries = relevantDeliveries.length;\n const successfulDeliveries = relevantDeliveries.filter(d => d.status === 'delivered').length;\n const failedDeliveries = relevantDeliveries.filter(d => d.status === 'failed').length;\n const pendingDeliveries = relevantDeliveries.filter(d => d.status === 'pending' || d.status === 'retrying').length;\n\n const successRate = totalDeliveries > 0 ? (successfulDeliveries / totalDeliveries) * 100 : 0;\n \n const lastDelivery = relevantDeliveries\n .filter(d => d.deliveredAt)\n .sort((a, b) => (b.deliveredAt?.getTime() || 0) - (a.deliveredAt?.getTime() || 0))[0]?.deliveredAt;\n\n return {\n totalDeliveries,\n successfulDeliveries,\n failedDeliveries,\n pendingDeliveries,\n successRate,\n lastDelivery\n };\n }\n\n /**\n * Retries failed deliveries\n */\n retryFailedDeliveries(webhookId?: string): void {\n const failedDeliveries = this.deliveries.filter(d => \n d.status === 'failed' && \n (!webhookId || d.webhookId === webhookId)\n );\n\n failedDeliveries.forEach(delivery => {\n delivery.status = 'pending';\n delivery.nextRetry = undefined;\n this.deliveryQueue.next(delivery);\n });\n }\n\n /**\n * Clears delivery history\n */\n clearDeliveryHistory(webhookId?: string): void {\n if (webhookId) {\n this.deliveries = this.deliveries.filter(d => d.webhookId !== webhookId);\n } else {\n this.deliveries = [];\n }\n this.updateStats();\n }\n\n /**\n * Gets supported webhook events\n */\n getSupportedEvents(): WebhookEvent[] {\n return [...this.SUPPORTED_EVENTS];\n }\n\n /**\n * Manually triggers a webhook for testing\n */\n triggerWebhook(webhookId: string, eventType: string, payload: any): Observable<WebhookDelivery> {\n const webhook = this.getWebhook(webhookId);\n if (!webhook) {\n throw new Error(`Webhook not found: ${webhookId}`);\n }\n\n const delivery: WebhookDelivery = {\n id: this.generateDeliveryId(),\n webhookId,\n event: eventType,\n url: webhook.url,\n payload: this.preparePayload(webhook, eventType, payload),\n status: 'pending',\n attempts: 0,\n createdAt: new Date()\n };\n\n return this.deliverWebhook(delivery);\n }\n\n /**\n * Private implementation methods\n */\n private initializeWebhookProcessing(): void {\n // Process delivery queue\n this.deliveryQueue.pipe(\n debounceTime(100), // Batch deliveries\n switchMap(delivery => this.deliverWebhook(delivery)),\n catchError((error, caught) => {\n console.error('Webhook delivery error:', error);\n return caught;\n })\n ).subscribe();\n\n // Retry failed deliveries periodically\n interval(60000).pipe( // Check every minute\n switchMap(() => this.processRetries())\n ).subscribe();\n }\n\n private subscribeToRuleChanges(): void {\n // Subscribe to rule builder state changes\n this.ruleBuilderService.stateChanged$.pipe(\n debounceTime(1000), // Debounce rapid changes\n distinctUntilChanged()\n ).subscribe(() => {\n this.handleRuleChange('rule-updated');\n });\n\n // Subscribe to validation errors\n this.ruleBuilderService.validationErrors$.pipe(\n debounceTime(500),\n distinctUntilChanged((prev, curr) => \n JSON.stringify(prev) === JSON.stringify(curr)\n )\n ).subscribe(errors => {\n this.handleValidationChange(errors);\n });\n }\n\n private handleRuleChange(eventType: string): void {\n const activeWebhooks = this.webhooks.filter(w => \n w.enabled && \n w.events.some(e => e.type === eventType && e.enabled)\n );\n\n for (const webhook of activeWebhooks) {\n if (this.shouldTriggerWebhook(webhook, eventType)) {\n const payload = this.generateEventPayload(eventType);\n this.queueDelivery(webhook, eventType, payload);\n }\n }\n }\n\n private handleValidationChange(errors: any[]): void {\n this.handleRuleChange('validation-changed');\n }\n\n private shouldTriggerWebhook(webhook: WebhookConfig, eventType: string): boolean {\n // Apply filtering rules\n if (webhook.filtering) {\n const state = this.ruleBuilderService.getCurrentState();\n const ruleCount = Object.keys(state.nodes).length;\n\n if (webhook.filtering.minRuleCount && ruleCount < webhook.filtering.minRuleCount) {\n return false;\n }\n\n if (webhook.filtering.maxRuleCount && ruleCount > webhook.filtering.maxRuleCount) {\n return false;\n }\n\n if (webhook.filtering.ruleTypes && webhook.filtering.ruleTypes.length > 0) {\n const hasMatchingType = Object.values(state.nodes).some(node => \n webhook.filtering!.ruleTypes!.includes(node.type)\n );\n if (!hasMatchingType) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private generateEventPayload(eventType: string): any {\n const state = this.ruleBuilderService.getCurrentState();\n \n return {\n event: eventType,\n timestamp: new Date().toISOString(),\n data: {\n rulesCount: Object.keys(state.nodes).length,\n rootNodes: state.rootNodes.length,\n isDirty: state.isDirty,\n mode: state.mode,\n validationErrors: state.validationErrors?.length || 0\n }\n };\n }\n\n private queueDelivery(webhook: WebhookConfig, eventType: string, payload: any): void {\n const delivery: WebhookDelivery = {\n id: this.generateDeliveryId(),\n webhookId: webhook.id,\n event: eventType,\n url: webhook.url,\n payload: this.preparePayload(webhook, eventType, payload),\n status: 'pending',\n attempts: 0,\n createdAt: new Date()\n };\n\n this.deliveries.push(delivery);\n this.deliveryQueue.next(delivery);\n }\n\n private preparePayload(webhook: WebhookConfig, eventType: string, data: any): any {\n const basePayload = {\n webhook: {\n id: webhook.id,\n name: webhook.name\n },\n event: eventType,\n timestamp: new Date().toISOString(),\n data\n };\n\n // Add rules data if requested\n if (webhook.filtering?.includeMetadata) {\n try {\n const exportResult = this.exportService.exportRules({\n format: webhook.format,\n includeMetadata: true,\n prettyPrint: false\n });\n\n // Note: This is simplified - in practice you'd want to handle the Observable properly\n basePayload.data.rules = JSON.parse('{}'); // Placeholder\n } catch (error) {\n console.warn('Failed to include rules in webhook payload:', error);\n }\n }\n\n return basePayload;\n }\n\n private deliverWebhook(delivery: WebhookDelivery): Observable<WebhookDelivery> {\n return new Observable(observer => {\n this.sendWebhookRequest(delivery).then(result => {\n const updatedDelivery = { ...delivery, ...result };\n this.updateDelivery(updatedDelivery);\n observer.next(updatedDelivery);\n observer.complete();\n }).catch(error => {\n const failedDelivery: WebhookDelivery = {\n ...delivery,\n status: 'failed',\n error: String(error),\n lastAttempt: new Date(),\n attempts: delivery.attempts + 1\n };\n\n // Schedule retry if configured\n const webhook = this.getWebhook(delivery.webhookId);\n if (webhook?.retryConfig && failedDelivery.attempts < webhook.retryConfig.maxRetries) {\n failedDelivery.status = 'retrying';\n failedDelivery.nextRetry = new Date(\n Date.now() + webhook.retryConfig.retryDelay * Math.pow(webhook.retryConfig.backoffMultiplier, failedDelivery.attempts - 1)\n );\n }\n\n this.updateDelivery(failedDelivery);\n observer.next(failedDelivery);\n observer.complete();\n });\n });\n }\n\n private async sendWebhookRequest(delivery: WebhookDelivery): Promise<Partial<WebhookDelivery>> {\n const webhook = this.getWebhook(delivery.webhookId);\n if (!webhook) {\n throw new Error(`Webhook configuration not found: ${delivery.webhookId}`);\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'Praxis-VisualBuilder-Webhook/1.0',\n ...webhook.headers\n };\n\n // Add authentication headers\n if (webhook.authentication) {\n switch (webhook.authentication.type) {\n case 'bearer':\n headers['Authorization'] = `Bearer ${webhook.authentication.credentials.token}`;\n break;\n case 'basic':\n const encoded = btoa(`${webhook.authentication.credentials.username}:${webhook.authentication.credentials.password}`);\n headers['Authorization'] = `Basic ${encoded}`;\n break;\n case 'apikey':\n headers[webhook.authentication.credentials.headerName] = webhook.authentication.credentials.apiKey;\n break;\n }\n }\n\n const startTime = Date.now();\n \n const response = await fetch(delivery.url, {\n method: webhook.method,\n headers,\n body: JSON.stringify(delivery.payload)\n });\n\n const responseTime = Date.now() - startTime;\n const responseBody = await response.text();\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return {\n status: 'delivered',\n attempts: delivery.attempts + 1,\n lastAttempt: new Date(),\n deliveredAt: new Date(),\n response: {\n statusCode: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n body: responseBody\n }\n };\n }\n\n private updateDelivery(delivery: WebhookDelivery): void {\n const index = this.deliveries.findIndex(d => d.id === delivery.id);\n if (index >= 0) {\n this.deliveries[index] = delivery;\n }\n this.updateStats();\n }\n\n private processRetries(): Observable<any> {\n const now = new Date();\n const retriesToProcess = this.deliveries.filter(d => \n d.status === 'retrying' && \n d.nextRetry && \n d.nextRetry <= now\n );\n\n retriesToProcess.forEach(delivery => {\n delivery.status = 'pending';\n delivery.nextRetry = undefined;\n this.deliveryQueue.next(delivery);\n });\n\n return new Observable(observer => observer.complete());\n }\n\n private updateStats(): void {\n const stats: Record<string, WebhookStats> = {};\n \n for (const webhook of this.webhooks) {\n stats[webhook.id] = this.getDeliveryStats(webhook.id);\n }\n\n this.statusUpdates.next(stats);\n }\n\n private generateDeliveryId(): string {\n return `delivery_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, of, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\nimport { \n RuleTemplate, \n RuleNode, \n RuleBuilderState,\n ExportOptions,\n ImportOptions \n} from '../models/rule-builder.model';\nimport { SpecificationBridgeService } from './specification-bridge.service';\n\n/**\n * Template category for organization\n */\nexport interface TemplateCategory {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n color?: string;\n templates: RuleTemplate[];\n}\n\n/**\n * Template search criteria\n */\nexport interface TemplateSearchCriteria {\n query?: string;\n category?: string;\n tags?: string[];\n nodeTypes?: string[];\n complexity?: 'simple' | 'medium' | 'complex';\n dateRange?: {\n from?: Date;\n to?: Date;\n };\n}\n\n/**\n * Template validation result\n */\nexport interface TemplateValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n missingFields?: string[];\n incompatibleFeatures?: string[];\n}\n\n/**\n * Template application result\n */\nexport interface TemplateApplicationResult {\n success: boolean;\n appliedNodes: RuleNode[];\n errors: string[];\n warnings: string[];\n modifiedNodeIds: string[];\n}\n\n/**\n * Template statistics\n */\nexport interface TemplateStats {\n totalTemplates: number;\n categoriesCount: number;\n mostUsedTemplate?: RuleTemplate;\n recentlyUsed: RuleTemplate[];\n popularTags: string[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RuleTemplateService {\n private readonly STORAGE_KEY = 'praxis-rule-templates';\n private readonly VERSION_KEY = 'praxis-template-version';\n private readonly CURRENT_VERSION = '1.0.0';\n\n private templatesSubject = new BehaviorSubject<RuleTemplate[]>([]);\n private categoriesSubject = new BehaviorSubject<TemplateCategory[]>([]);\n private recentlyUsedSubject = new BehaviorSubject<RuleTemplate[]>([]);\n\n templates$ = this.templatesSubject.asObservable();\n categories$ = this.categoriesSubject.asObservable();\n recentlyUsed$ = this.recentlyUsedSubject.asObservable();\n\n constructor(private bridgeService: SpecificationBridgeService) {\n this.loadTemplatesFromStorage();\n this.initializeDefaultTemplates();\n }\n\n /**\n * Get all templates\n */\n getTemplates(): Observable<RuleTemplate[]> {\n return this.templates$;\n }\n\n /**\n * Get templates by category\n */\n getTemplatesByCategory(categoryId: string): Observable<RuleTemplate[]> {\n return this.templates$.pipe(\n map(templates => templates.filter(t => t.category === categoryId))\n );\n }\n\n /**\n * Search templates\n */\n searchTemplates(criteria: TemplateSearchCriteria): Observable<RuleTemplate[]> {\n return this.templates$.pipe(\n map(templates => {\n let filtered = templates;\n\n // Text search\n if (criteria.query) {\n const query = criteria.query.toLowerCase();\n filtered = filtered.filter(t => \n t.name.toLowerCase().includes(query) ||\n t.description.toLowerCase().includes(query) ||\n t.tags.some(tag => tag.toLowerCase().includes(query))\n );\n }\n\n // Category filter\n if (criteria.category) {\n filtered = filtered.filter(t => t.category === criteria.category);\n }\n\n // Tags filter\n if (criteria.tags && criteria.tags.length > 0) {\n filtered = filtered.filter(t => \n criteria.tags!.some(tag => t.tags.includes(tag))\n );\n }\n\n // Node types filter\n if (criteria.nodeTypes && criteria.nodeTypes.length > 0) {\n filtered = filtered.filter(t => \n t.nodes.some(node => criteria.nodeTypes!.includes(node.type))\n );\n }\n\n // Complexity filter\n if (criteria.complexity) {\n filtered = filtered.filter(t => \n this.getTemplateComplexity(t) === criteria.complexity\n );\n }\n\n return filtered;\n })\n );\n }\n\n /**\n * Get template by ID\n */\n getTemplate(id: string): Observable<RuleTemplate | null> {\n return this.templates$.pipe(\n map(templates => templates.find(t => t.id === id) || null)\n );\n }\n\n /**\n * Create new template\n */\n createTemplate(\n name: string, \n description: string, \n category: string,\n nodes: RuleNode[],\n rootNodes: string[],\n tags: string[] = [],\n requiredFields: string[] = []\n ): Observable<RuleTemplate> {\n const template: RuleTemplate = {\n id: this.generateTemplateId(),\n name,\n description,\n category,\n tags,\n nodes,\n rootNodes,\n requiredFields,\n icon: this.getDefaultIconForCategory(category),\n metadata: {\n createdAt: new Date(),\n updatedAt: new Date(),\n version: '1.0.0',\n usageCount: 0,\n complexity: this.calculateComplexity(nodes)\n }\n };\n\n const templates = [...this.templatesSubject.value, template];\n this.templatesSubject.next(templates);\n this.saveTemplatesToStorage();\n this.updateCategories();\n\n return of(template);\n }\n\n /**\n * Update template\n */\n updateTemplate(id: string, updates: Partial<RuleTemplate>): Observable<RuleTemplate> {\n const templates = this.templatesSubject.value;\n const index = templates.findIndex(t => t.id === id);\n \n if (index === -1) {\n return throwError(() => new Error(`Template with id ${id} not found`));\n }\n\n const updatedTemplate = {\n ...templates[index],\n ...updates,\n metadata: {\n ...templates[index].metadata,\n updatedAt: new Date(),\n version: this.incrementVersion(templates[index].metadata?.version || '1.0.0')\n }\n };\n\n templates[index] = updatedTemplate;\n this.templatesSubject.next([...templates]);\n this.saveTemplatesToStorage();\n\n return of(updatedTemplate);\n }\n\n /**\n * Delete template\n */\n deleteTemplate(id: string): Observable<boolean> {\n const templates = this.templatesSubject.value;\n const filteredTemplates = templates.filter(t => t.id !== id);\n \n if (filteredTemplates.length === templates.length) {\n return throwError(() => new Error(`Template with id ${id} not found`));\n }\n\n this.templatesSubject.next(filteredTemplates);\n this.saveTemplatesToStorage();\n this.updateCategories();\n\n return of(true);\n }\n\n /**\n * Duplicate template\n */\n duplicateTemplate(id: string, newName?: string): Observable<RuleTemplate> {\n return this.getTemplate(id).pipe(\n map(template => {\n if (!template) {\n throw new Error(`Template with id ${id} not found`);\n }\n\n const duplicated: RuleTemplate = {\n ...template,\n id: this.generateTemplateId(),\n name: newName || `${template.name} (Copy)`,\n metadata: {\n ...template.metadata,\n createdAt: new Date(),\n updatedAt: new Date(),\n version: '1.0.0',\n usageCount: 0\n }\n };\n\n const templates = [...this.templatesSubject.value, duplicated];\n this.templatesSubject.next(templates);\n this.saveTemplatesToStorage();\n\n return duplicated;\n })\n );\n }\n\n /**\n * Apply template to current builder state\n */\n applyTemplate(templateId: string, targetBuilderState?: RuleBuilderState): Observable<TemplateApplicationResult> {\n return this.getTemplate(templateId).pipe(\n map(template => {\n if (!template) {\n throw new Error(`Template with id ${templateId} not found`);\n }\n\n try {\n // Clone template nodes with new IDs\n const appliedNodes = this.cloneTemplateNodes(template.nodes);\n const modifiedNodeIds = appliedNodes.map(n => n.id);\n\n // Track usage\n this.incrementTemplateUsage(templateId);\n this.addToRecentlyUsed(template);\n\n return {\n success: true,\n appliedNodes,\n errors: [],\n warnings: [],\n modifiedNodeIds\n };\n } catch (error) {\n return {\n success: false,\n appliedNodes: [],\n errors: [error instanceof Error ? error.message : 'Unknown error'],\n warnings: [],\n modifiedNodeIds: []\n };\n }\n }),\n catchError(error => of({\n success: false,\n appliedNodes: [],\n errors: [error.message],\n warnings: [],\n modifiedNodeIds: []\n }))\n );\n }\n\n /**\n * Validate template compatibility\n */\n validateTemplate(template: RuleTemplate, availableFields?: string[]): TemplateValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n const missingFields: string[] = [];\n\n // Check required structure\n if (!template.nodes || template.nodes.length === 0) {\n errors.push('Template must contain at least one rule node');\n }\n\n if (!template.rootNodes || template.rootNodes.length === 0) {\n errors.push('Template must specify root nodes');\n }\n\n // Check node references\n if (template.nodes && template.rootNodes) {\n const nodeIds = new Set(template.nodes.map(n => n.id));\n const invalidRootNodes = template.rootNodes.filter(id => !nodeIds.has(id));\n \n if (invalidRootNodes.length > 0) {\n errors.push(`Invalid root node references: ${invalidRootNodes.join(', ')}`);\n }\n }\n\n // Check field availability\n if (availableFields && template.requiredFields) {\n const missing = template.requiredFields.filter(field => !availableFields.includes(field));\n missingFields.push(...missing);\n \n if (missing.length > 0) {\n warnings.push(`Missing required fields: ${missing.join(', ')}`);\n }\n }\n\n // Check for complex features\n const complexFeatures = this.detectComplexFeatures(template);\n if (complexFeatures.length > 0) {\n warnings.push(`Template uses advanced features: ${complexFeatures.join(', ')}`);\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n missingFields,\n incompatibleFeatures: complexFeatures\n };\n }\n\n /**\n * Export template to JSON\n */\n exportTemplate(id: string, options?: ExportOptions): Observable<string> {\n return this.getTemplate(id).pipe(\n map(template => {\n if (!template) {\n throw new Error(`Template with id ${id} not found`);\n }\n\n const exportData = {\n template,\n exportedAt: new Date().toISOString(),\n exportedBy: 'praxis-visual-builder',\n version: this.CURRENT_VERSION,\n metadata: {\n includeMetadata: options?.includeMetadata !== false,\n format: options?.format || 'json'\n }\n };\n\n return options?.prettyPrint !== false \n ? JSON.stringify(exportData, null, 2)\n : JSON.stringify(exportData);\n })\n );\n }\n\n /**\n * Import template from JSON\n */\n importTemplate(jsonData: string, options?: ImportOptions): Observable<RuleTemplate> {\n try {\n const importData = JSON.parse(jsonData);\n \n if (!importData.template) {\n throw new Error('Invalid template format: missing template data');\n }\n\n const template = importData.template as RuleTemplate;\n \n // Validate template\n const validation = this.validateTemplate(template);\n if (!validation.isValid) {\n throw new Error(`Template validation failed: ${validation.errors.join(', ')}`);\n }\n\n // Generate new ID to avoid conflicts\n const importedTemplate: RuleTemplate = {\n ...template,\n id: this.generateTemplateId(),\n metadata: {\n ...template.metadata,\n importedAt: new Date(),\n originalId: template.id\n }\n };\n\n // Add to templates\n const templates = [...this.templatesSubject.value, importedTemplate];\n this.templatesSubject.next(templates);\n this.saveTemplatesToStorage();\n this.updateCategories();\n\n return of(importedTemplate);\n } catch (error) {\n return throwError(() => new Error(`Import failed: ${error instanceof Error ? error.message : 'Unknown error'}`));\n }\n }\n\n /**\n * Get template statistics\n */\n getTemplateStats(): Observable<TemplateStats> {\n return this.templates$.pipe(\n map(templates => {\n const categories = new Set(templates.map(t => t.category));\n const allTags = templates.flatMap(t => t.tags);\n const tagCounts = allTags.reduce((acc, tag) => {\n acc[tag] = (acc[tag] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n const popularTags = Object.entries(tagCounts)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 10)\n .map(([tag]) => tag);\n\n const mostUsed = templates\n .sort((a, b) => (b.metadata?.usageCount || 0) - (a.metadata?.usageCount || 0))[0];\n\n return {\n totalTemplates: templates.length,\n categoriesCount: categories.size,\n mostUsedTemplate: mostUsed,\n recentlyUsed: this.recentlyUsedSubject.value,\n popularTags\n };\n })\n );\n }\n\n /**\n * Get categories with template counts\n */\n getCategories(): Observable<TemplateCategory[]> {\n return this.categories$;\n }\n\n // Private methods\n\n private loadTemplatesFromStorage(): void {\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n if (stored) {\n const templates = JSON.parse(stored) as RuleTemplate[];\n this.templatesSubject.next(templates);\n this.updateCategories();\n }\n\n const recentlyUsed = localStorage.getItem(`${this.STORAGE_KEY}-recent`);\n if (recentlyUsed) {\n this.recentlyUsedSubject.next(JSON.parse(recentlyUsed));\n }\n } catch (error) {\n console.warn('Failed to load templates from storage:', error);\n }\n }\n\n private saveTemplatesToStorage(): void {\n try {\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(this.templatesSubject.value));\n localStorage.setItem(this.VERSION_KEY, this.CURRENT_VERSION);\n } catch (error) {\n console.warn('Failed to save templates to storage:', error);\n }\n }\n\n private updateCategories(): void {\n const templates = this.templatesSubject.value;\n const categoryMap = new Map<string, TemplateCategory>();\n\n templates.forEach(template => {\n if (!categoryMap.has(template.category)) {\n categoryMap.set(template.category, {\n id: template.category,\n name: this.getCategoryDisplayName(template.category),\n description: this.getCategoryDescription(template.category),\n icon: this.getDefaultIconForCategory(template.category),\n templates: []\n });\n }\n categoryMap.get(template.category)!.templates.push(template);\n });\n\n this.categoriesSubject.next(Array.from(categoryMap.values()));\n }\n\n private initializeDefaultTemplates(): void {\n if (this.templatesSubject.value.length === 0) {\n this.createDefaultTemplates();\n }\n }\n\n private createDefaultTemplates(): void {\n // Basic Field Validation Template\n this.createTemplate(\n 'Basic Field Validation',\n 'Simple field validation with required and format checks',\n 'validation',\n [\n {\n id: 'field_required',\n type: 'fieldCondition',\n label: 'Field is required',\n config: {\n type: 'fieldCondition',\n fieldName: '{{fieldName}}',\n operator: 'isNotEmpty',\n value: null,\n valueType: 'literal'\n }\n }\n ],\n ['field_required'],\n ['required', 'validation', 'basic'],\n ['{{fieldName}}']\n ).subscribe();\n\n // Email Validation Template\n this.createTemplate(\n 'Email Validation',\n 'Complete email field validation with format and required checks',\n 'validation',\n [\n {\n id: 'email_required',\n type: 'fieldCondition',\n label: 'Email is required',\n config: {\n type: 'fieldCondition',\n fieldName: 'email',\n operator: 'isNotEmpty',\n value: null,\n valueType: 'literal'\n }\n },\n {\n id: 'email_format',\n type: 'fieldCondition',\n label: 'Email format validation',\n config: {\n type: 'fieldCondition',\n fieldName: 'email',\n operator: 'matches',\n value: '^[\\\\w\\\\.-]+@[\\\\w\\\\.-]+\\\\.[a-zA-Z]{2,}$',\n valueType: 'literal'\n }\n },\n {\n id: 'email_and_group',\n type: 'andGroup',\n label: 'Email validation group',\n children: ['email_required', 'email_format'],\n config: {\n type: 'booleanGroup',\n operator: 'and'\n }\n }\n ],\n ['email_and_group'],\n ['email', 'validation', 'format', 'required'],\n ['email']\n ).subscribe();\n }\n\n private generateTemplateId(): string {\n return `template_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cloneTemplateNodes(nodes: RuleNode[]): RuleNode[] {\n const idMap = new Map<string, string>();\n \n // First pass: generate new IDs\n nodes.forEach(node => {\n idMap.set(node.id, this.generateNodeId());\n });\n\n // Second pass: clone nodes with new IDs\n return nodes.map(node => {\n const cloned: RuleNode = {\n ...node,\n id: idMap.get(node.id)!,\n children: node.children?.map(childId => idMap.get(childId) || childId)\n };\n\n // Replace template variables in config\n if (cloned.config) {\n cloned.config = this.replaceTemplateVariables(cloned.config);\n }\n\n return cloned;\n });\n }\n\n private generateNodeId(): string {\n return `node_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private replaceTemplateVariables(config: any): any {\n // Deep clone and replace variables like {{fieldName}}\n const configStr = JSON.stringify(config);\n // For now, return as-is. In real implementation, would replace template variables\n return JSON.parse(configStr);\n }\n\n private incrementTemplateUsage(templateId: string): void {\n const templates = this.templatesSubject.value;\n const template = templates.find(t => t.id === templateId);\n \n if (template) {\n template.metadata = {\n ...template.metadata,\n usageCount: (template.metadata?.usageCount || 0) + 1,\n lastUsed: new Date()\n };\n this.saveTemplatesToStorage();\n }\n }\n\n private addToRecentlyUsed(template: RuleTemplate): void {\n const recent = this.recentlyUsedSubject.value;\n const filtered = recent.filter(t => t.id !== template.id);\n const updated = [template, ...filtered].slice(0, 10);\n \n this.recentlyUsedSubject.next(updated);\n localStorage.setItem(`${this.STORAGE_KEY}-recent`, JSON.stringify(updated));\n }\n\n private getTemplateComplexity(template: RuleTemplate): 'simple' | 'medium' | 'complex' {\n return this.calculateComplexity(template.nodes);\n }\n\n private calculateComplexity(nodes: RuleNode[]): 'simple' | 'medium' | 'complex' {\n if (nodes.length <= 2) return 'simple';\n if (nodes.length <= 5) return 'medium';\n return 'complex';\n }\n\n private detectComplexFeatures(template: RuleTemplate): string[] {\n const features: string[] = [];\n \n template.nodes.forEach(node => {\n if (node.type.includes('Group')) {\n features.push('Boolean Logic');\n }\n if (node.type === 'functionCall') {\n features.push('Custom Functions');\n }\n if (node.type.includes('If')) {\n features.push('Conditional Validation');\n }\n if (['forEach', 'uniqueBy', 'minLength', 'maxLength'].includes(node.type)) {\n features.push('Collection Validation');\n }\n });\n\n return [...new Set(features)];\n }\n\n private getCategoryDisplayName(category: string): string {\n const names: Record<string, string> = {\n 'validation': 'Field Validation',\n 'business': 'Business Rules',\n 'collection': 'Collection Validation',\n 'conditional': 'Conditional Logic',\n 'workflow': 'Workflow Rules',\n 'security': 'Security Validation',\n 'custom': 'Custom Templates'\n };\n \n return names[category] || category.charAt(0).toUpperCase() + category.slice(1);\n }\n\n private getCategoryDescription(category: string): string {\n const descriptions: Record<string, string> = {\n 'validation': 'Templates for field validation and format checking',\n 'business': 'Templates for business logic and rules',\n 'collection': 'Templates for array and collection validation',\n 'conditional': 'Templates with conditional logic and branching',\n 'workflow': 'Templates for workflow and process validation',\n 'security': 'Templates for security and access control',\n 'custom': 'User-created custom templates'\n };\n \n return descriptions[category] || `Templates in ${category} category`;\n }\n\n private getDefaultIconForCategory(category: string): string {\n const icons: Record<string, string> = {\n 'validation': 'check_circle',\n 'business': 'business',\n 'collection': 'list',\n 'conditional': 'alt_route',\n 'workflow': 'workflow',\n 'security': 'security',\n 'custom': 'extension'\n };\n \n return icons[category] || 'folder';\n }\n\n private incrementVersion(version: string): string {\n const parts = version.split('.');\n const patch = parseInt(parts[2] || '0') + 1;\n return `${parts[0]}.${parts[1]}.${patch}`;\n }\n}","import { Injectable } from '@angular/core';\nimport { RuleNode, RuleNodeConfig } from '../models/rule-builder.model';\nimport { RuleNodeRegistryService } from './rule-node-registry.service';\n\n/**\n * Validation issue severity levels\n */\nexport enum ValidationSeverity {\n ERROR = 'error',\n WARNING = 'warning',\n INFO = 'info'\n}\n\n/**\n * Validation issue categories\n */\nexport enum ValidationCategory {\n STRUCTURE = 'structure',\n DEPENDENCY = 'dependency',\n BUSINESS_LOGIC = 'business_logic',\n PERFORMANCE = 'performance',\n SEMANTIC = 'semantic'\n}\n\n/**\n * Validation issue details\n */\nexport interface ValidationIssue {\n /** Unique identifier for this issue */\n id: string;\n /** Issue severity level */\n severity: ValidationSeverity;\n /** Issue category */\n category: ValidationCategory;\n /** Human-readable message */\n message: string;\n /** Affected node ID */\n nodeId: string;\n /** Suggested fix (optional) */\n suggestion?: string;\n /** Additional context data */\n context?: Record<string, any>;\n}\n\n/**\n * Validation result for a rule tree\n */\nexport interface RuleValidationResult {\n /** Whether validation passed */\n isValid: boolean;\n /** Total number of issues found */\n issueCount: number;\n /** Issues found during validation */\n issues: ValidationIssue[];\n /** Performance metrics */\n metrics: {\n validationTime: number;\n nodeCount: number;\n maxDepth: number;\n complexity: number;\n };\n}\n\n/**\n * Validation configuration options\n */\nexport interface ValidationConfig {\n /** Enable strict validation mode */\n strict?: boolean;\n /** Maximum allowed tree depth */\n maxDepth?: number;\n /** Maximum allowed complexity score */\n maxComplexity?: number;\n /** Enable performance warnings */\n enablePerformanceWarnings?: boolean;\n /** Custom validation rules */\n customRules?: ValidationRule[];\n}\n\n/**\n * Custom validation rule interface\n */\nexport interface ValidationRule {\n /** Rule identifier */\n id: string;\n /** Rule description */\n description: string;\n /** Validation function */\n validate: (node: RuleNode, context: ValidationContext) => ValidationIssue[];\n}\n\n/**\n * Validation context passed to validators\n */\nexport interface ValidationContext {\n /** Registry service for node resolution */\n registry: RuleNodeRegistryService;\n /** Current validation config */\n config: ValidationConfig;\n /** Visited nodes (for cycle detection) */\n visitedNodes: Set<string>;\n /** Current depth level */\n currentDepth: number;\n /** All nodes in the tree */\n allNodes: Map<string, RuleNode>;\n}\n\n/**\n * Centralized service for validating rule business logic and integrity\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RuleValidationService {\n private defaultConfig: ValidationConfig = {\n strict: false,\n maxDepth: 10,\n maxComplexity: 100,\n enablePerformanceWarnings: true,\n customRules: []\n };\n\n constructor(private nodeRegistry: RuleNodeRegistryService) {}\n\n /**\n * Validate a complete rule tree\n */\n validateRuleTree(rootNode: RuleNode, config?: Partial<ValidationConfig>): RuleValidationResult {\n const startTime = performance.now();\n const validationConfig = { ...this.defaultConfig, ...config };\n \n // Collect all nodes in the tree\n const allNodes = this.collectAllNodes(rootNode);\n \n const context: ValidationContext = {\n registry: this.nodeRegistry,\n config: validationConfig,\n visitedNodes: new Set(),\n currentDepth: 0,\n allNodes\n };\n\n const issues: ValidationIssue[] = [];\n\n // Run core validations\n issues.push(...this.validateStructure(rootNode, context));\n issues.push(...this.validateDependencies(rootNode, context));\n issues.push(...this.validateBusinessLogic(rootNode, context));\n issues.push(...this.validatePerformance(rootNode, context));\n\n // Run custom validation rules\n if (validationConfig.customRules) {\n for (const rule of validationConfig.customRules) {\n issues.push(...rule.validate(rootNode, context));\n }\n }\n\n const endTime = performance.now();\n const metrics = this.calculateMetrics(rootNode, allNodes, endTime - startTime);\n\n return {\n isValid: !issues.some(issue => issue.severity === ValidationSeverity.ERROR),\n issueCount: issues.length,\n issues,\n metrics\n };\n }\n\n /**\n * Validate a single node\n */\n validateNode(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Basic structure validation\n if (!node.id) {\n issues.push({\n id: `missing-id-${Date.now()}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.STRUCTURE,\n message: 'Node is missing required ID',\n nodeId: node.id || 'unknown'\n });\n }\n\n if (!node.config) {\n issues.push({\n id: `missing-config-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.STRUCTURE,\n message: 'Node is missing configuration',\n nodeId: node.id\n });\n return issues; // Cannot continue without config\n }\n\n if (!node.config.type) {\n issues.push({\n id: `missing-type-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.STRUCTURE,\n message: 'Node configuration is missing type',\n nodeId: node.id\n });\n }\n\n // Type-specific validation\n issues.push(...this.validateNodeByType(node, context));\n\n return issues;\n }\n\n private validateStructure(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n \n // Check for cycles\n if (context.visitedNodes.has(node.id)) {\n issues.push({\n id: `cycle-detected-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.STRUCTURE,\n message: `Circular dependency detected at node ${node.id}`,\n nodeId: node.id,\n suggestion: 'Remove circular references in the rule tree'\n });\n return issues;\n }\n\n context.visitedNodes.add(node.id);\n context.currentDepth++;\n\n // Check max depth\n if (context.currentDepth > context.config.maxDepth!) {\n issues.push({\n id: `max-depth-exceeded-${node.id}`,\n severity: ValidationSeverity.WARNING,\n category: ValidationCategory.PERFORMANCE,\n message: `Maximum tree depth (${context.config.maxDepth}) exceeded`,\n nodeId: node.id,\n suggestion: 'Consider flattening the rule structure'\n });\n }\n\n // Validate current node\n issues.push(...this.validateNode(node, context));\n\n // Recursively validate children\n if (node.children) {\n for (const childId of node.children) {\n const childNode = context.registry.getNode(childId);\n if (childNode) {\n issues.push(...this.validateStructure(childNode, { ...context }));\n } else {\n issues.push({\n id: `missing-child-${childId}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.DEPENDENCY,\n message: `Child node ${childId} not found in registry`,\n nodeId: node.id,\n suggestion: 'Remove reference to missing child or add the missing node'\n });\n }\n }\n }\n\n context.visitedNodes.delete(node.id);\n context.currentDepth--;\n\n return issues;\n }\n\n private validateDependencies(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Validate parent-child relationships\n if (node.children) {\n for (const childId of node.children) {\n const childNode = context.registry.getNode(childId);\n if (childNode && childNode.parentId !== node.id) {\n issues.push({\n id: `parent-mismatch-${childId}`,\n severity: ValidationSeverity.WARNING,\n category: ValidationCategory.DEPENDENCY,\n message: `Child node ${childId} does not reference correct parent`,\n nodeId: node.id,\n suggestion: 'Update parent reference in child node'\n });\n }\n }\n }\n\n // Validate orphaned nodes\n if (node.parentId) {\n const parentNode = context.registry.getNode(node.parentId);\n if (!parentNode) {\n issues.push({\n id: `orphaned-node-${node.id}`,\n severity: ValidationSeverity.WARNING,\n category: ValidationCategory.DEPENDENCY,\n message: `Node references non-existent parent ${node.parentId}`,\n nodeId: node.id,\n suggestion: 'Remove parent reference or add the missing parent node'\n });\n } else if (!parentNode.children?.includes(node.id)) {\n issues.push({\n id: `missing-child-ref-${node.id}`,\n severity: ValidationSeverity.WARNING,\n category: ValidationCategory.DEPENDENCY,\n message: `Parent node ${node.parentId} does not reference this child`,\n nodeId: node.id,\n suggestion: 'Add child reference in parent node'\n });\n }\n }\n\n return issues;\n }\n\n private validateBusinessLogic(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (!node.config) return issues;\n\n // Type-specific business logic validation\n switch (node.config.type) {\n case 'fieldCondition':\n issues.push(...this.validateFieldCondition(node, context));\n break;\n case 'booleanGroup':\n case 'andGroup':\n case 'orGroup':\n case 'notGroup':\n case 'xorGroup':\n case 'impliesGroup':\n issues.push(...this.validateBooleanGroup(node, context));\n break;\n case 'cardinality':\n issues.push(...this.validateCardinality(node, context));\n break;\n }\n\n return issues;\n }\n\n private validatePerformance(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (!context.config.enablePerformanceWarnings) return issues;\n\n // Check for excessive children\n if (node.children && node.children.length > 20) {\n issues.push({\n id: `too-many-children-${node.id}`,\n severity: ValidationSeverity.WARNING,\n category: ValidationCategory.PERFORMANCE,\n message: `Node has ${node.children.length} children, which may impact performance`,\n nodeId: node.id,\n suggestion: 'Consider grouping children or simplifying the rule structure'\n });\n }\n\n return issues;\n }\n\n private validateNodeByType(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (!node.config?.type) return issues;\n\n // Validate based on expected structure for each type\n const requiredChildren = this.getRequiredChildrenCount(node.config.type);\n const actualChildren = node.children?.length || 0;\n\n if (requiredChildren.min !== undefined && actualChildren < requiredChildren.min) {\n issues.push({\n id: `insufficient-children-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.BUSINESS_LOGIC,\n message: `${node.config.type} requires at least ${requiredChildren.min} children, but has ${actualChildren}`,\n nodeId: node.id,\n suggestion: `Add ${requiredChildren.min - actualChildren} more child nodes`\n });\n }\n\n if (requiredChildren.max !== undefined && actualChildren > requiredChildren.max) {\n issues.push({\n id: `too-many-children-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.BUSINESS_LOGIC,\n message: `${node.config.type} allows at most ${requiredChildren.max} children, but has ${actualChildren}`,\n nodeId: node.id,\n suggestion: `Remove ${actualChildren - requiredChildren.max} child nodes`\n });\n }\n\n return issues;\n }\n\n private validateFieldCondition(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const config = node.config as any;\n\n if (!config.fieldName) {\n issues.push({\n id: `missing-field-name-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.BUSINESS_LOGIC,\n message: 'Field condition is missing fieldName',\n nodeId: node.id,\n suggestion: 'Specify a field name for the condition'\n });\n }\n\n if (!config.operator) {\n issues.push({\n id: `missing-operator-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.BUSINESS_LOGIC,\n message: 'Field condition is missing operator',\n nodeId: node.id,\n suggestion: 'Specify a comparison operator'\n });\n }\n\n if (config.value === undefined) {\n issues.push({\n id: `missing-value-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.BUSINESS_LOGIC,\n message: 'Field condition is missing value',\n nodeId: node.id,\n suggestion: 'Specify a value for comparison'\n });\n }\n\n return issues;\n }\n\n private validateBooleanGroup(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const config = node.config as any;\n\n if (!config.operator) {\n issues.push({\n id: `missing-boolean-operator-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.BUSINESS_LOGIC,\n message: 'Boolean group is missing operator',\n nodeId: node.id,\n suggestion: 'Specify a boolean operator (and, or, not, etc.)'\n });\n }\n\n return issues;\n }\n\n private validateCardinality(node: RuleNode, context: ValidationContext): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n const config = node.config as any;\n\n if (!config.cardinalityType) {\n issues.push({\n id: `missing-cardinality-type-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.BUSINESS_LOGIC,\n message: 'Cardinality rule is missing cardinalityType',\n nodeId: node.id,\n suggestion: 'Specify cardinality type (atLeast, exactly, etc.)'\n });\n }\n\n if (typeof config.count !== 'number' || config.count < 0) {\n issues.push({\n id: `invalid-cardinality-count-${node.id}`,\n severity: ValidationSeverity.ERROR,\n category: ValidationCategory.BUSINESS_LOGIC,\n message: 'Cardinality rule has invalid count value',\n nodeId: node.id,\n suggestion: 'Specify a non-negative number for count'\n });\n }\n\n return issues;\n }\n\n private getRequiredChildrenCount(nodeType: string): { min?: number; max?: number } {\n switch (nodeType) {\n case 'notGroup':\n return { min: 1, max: 1 };\n case 'impliesGroup':\n return { min: 2, max: 2 };\n case 'andGroup':\n case 'orGroup':\n case 'xorGroup':\n return { min: 1 };\n case 'cardinality':\n case 'atLeast':\n case 'exactly':\n return { min: 1 };\n case 'fieldCondition':\n return { min: 0, max: 0 };\n default:\n return {};\n }\n }\n\n private collectAllNodes(rootNode: RuleNode): Map<string, RuleNode> {\n const nodes = new Map<string, RuleNode>();\n const visited = new Set<string>();\n\n const traverse = (node: RuleNode) => {\n if (visited.has(node.id)) return;\n visited.add(node.id);\n nodes.set(node.id, node);\n\n if (node.children) {\n for (const childId of node.children) {\n const childNode = this.nodeRegistry.getNode(childId);\n if (childNode) {\n traverse(childNode);\n }\n }\n }\n };\n\n traverse(rootNode);\n return nodes;\n }\n\n private calculateMetrics(rootNode: RuleNode, allNodes: Map<string, RuleNode>, validationTime: number) {\n let maxDepth = 0;\n let complexity = 0;\n\n const calculateDepth = (node: RuleNode, currentDepth: number): number => {\n maxDepth = Math.max(maxDepth, currentDepth);\n \n // Add to complexity based on node type\n complexity += this.getNodeComplexity(node);\n\n if (node.children) {\n for (const childId of node.children) {\n const childNode = this.nodeRegistry.getNode(childId);\n if (childNode) {\n calculateDepth(childNode, currentDepth + 1);\n }\n }\n }\n \n return maxDepth;\n };\n\n calculateDepth(rootNode, 1);\n\n return {\n validationTime,\n nodeCount: allNodes.size,\n maxDepth,\n complexity\n };\n }\n\n private getNodeComplexity(node: RuleNode): number {\n switch (node.config?.type) {\n case 'fieldCondition':\n return 1;\n case 'booleanGroup':\n // Check the operator for complexity\n const booleanConfig = node.config as any;\n switch (booleanConfig.operator) {\n case 'and':\n case 'or':\n return 2;\n case 'not':\n return 1;\n case 'xor':\n case 'implies':\n return 3;\n default:\n return 2;\n }\n case 'cardinality':\n return 4;\n default:\n return 1;\n }\n }\n}","/**\n * Typed error system for Visual Builder operations\n * Provides structured error handling with codes, categories, and context\n */\n\n/**\n * Error categories for classification\n */\nexport enum ErrorCategory {\n VALIDATION = 'validation',\n CONVERSION = 'conversion',\n REGISTRY = 'registry',\n DSL = 'dsl',\n CONTEXT = 'context',\n CONFIGURATION = 'configuration',\n NETWORK = 'network',\n INTERNAL = 'internal'\n}\n\n/**\n * Error severity levels\n */\nexport enum ErrorSeverity {\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n CRITICAL = 'critical'\n}\n\n/**\n * Base error class for all Visual Builder errors\n */\nexport abstract class VisualBuilderError extends Error {\n abstract readonly code: string;\n abstract readonly category: ErrorCategory;\n abstract readonly severity: ErrorSeverity;\n \n public readonly timestamp: Date;\n public readonly context: Record<string, any>;\n\n constructor(\n message: string,\n context: Record<string, any> = {},\n public override readonly cause?: Error\n ) {\n super(message);\n this.name = this.constructor.name;\n this.timestamp = new Date();\n this.context = context;\n \n // Maintain proper stack trace\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Get structured error information\n */\n toJSON(): ErrorInfo {\n return {\n code: this.code,\n category: this.category,\n severity: this.severity,\n message: this.message,\n timestamp: this.timestamp.toISOString(),\n context: this.context,\n stack: this.stack,\n cause: this.cause ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack\n } : undefined\n };\n }\n}\n\n/**\n * Validation-related errors\n */\nexport class ValidationError extends VisualBuilderError {\n readonly code = 'VALIDATION_ERROR';\n readonly category = ErrorCategory.VALIDATION;\n readonly severity = ErrorSeverity.HIGH;\n\n constructor(\n message: string,\n public readonly nodeId?: string,\n public readonly validationRules?: string[],\n context: Record<string, any> = {}\n ) {\n super(message, { nodeId, validationRules, ...context });\n }\n}\n\n/**\n * Conversion-related errors\n */\nexport class ConversionError extends VisualBuilderError {\n readonly code: string;\n readonly category = ErrorCategory.CONVERSION;\n readonly severity = ErrorSeverity.HIGH;\n\n constructor(\n code: string,\n message: string,\n public readonly nodeId?: string,\n context: Record<string, any> = {},\n cause?: Error\n ) {\n super(message, { nodeId, ...context }, cause);\n this.code = `CONVERSION_${code}`;\n }\n}\n\n/**\n * Registry-related errors\n */\nexport class RegistryError extends VisualBuilderError {\n readonly code: string;\n readonly category = ErrorCategory.REGISTRY;\n readonly severity = ErrorSeverity.MEDIUM;\n\n constructor(\n operation: string,\n message: string,\n public readonly nodeId?: string,\n context: Record<string, any> = {}\n ) {\n super(message, { operation, nodeId, ...context });\n this.code = `REGISTRY_${operation.toUpperCase()}`;\n }\n}\n\n/**\n * DSL parsing and processing errors\n */\nexport class DslError extends VisualBuilderError {\n readonly code: string;\n readonly category = ErrorCategory.DSL;\n readonly severity = ErrorSeverity.HIGH;\n\n constructor(\n type: 'PARSING' | 'VALIDATION' | 'EXPORT' | 'IMPORT',\n message: string,\n public readonly expression?: string,\n public readonly position?: { start: number; end: number },\n context: Record<string, any> = {}\n ) {\n super(message, { expression, position, ...context });\n this.code = `DSL_${type}`;\n }\n}\n\n/**\n * Context management errors\n */\nexport class ContextError extends VisualBuilderError {\n readonly code: string;\n readonly category = ErrorCategory.CONTEXT;\n readonly severity = ErrorSeverity.MEDIUM;\n\n constructor(\n operation: string,\n message: string,\n public readonly scopeId?: string,\n public readonly variablePath?: string,\n context: Record<string, any> = {}\n ) {\n super(message, { operation, scopeId, variablePath, ...context });\n this.code = `CONTEXT_${operation.toUpperCase()}`;\n }\n}\n\n/**\n * Configuration errors\n */\nexport class ConfigurationError extends VisualBuilderError {\n readonly code = 'CONFIGURATION_ERROR';\n readonly category = ErrorCategory.CONFIGURATION;\n readonly severity = ErrorSeverity.HIGH;\n\n constructor(\n message: string,\n public readonly configPath?: string,\n public readonly expectedType?: string,\n context: Record<string, any> = {}\n ) {\n super(message, { configPath, expectedType, ...context });\n }\n}\n\n/**\n * Internal system errors\n */\nexport class InternalError extends VisualBuilderError {\n readonly code = 'INTERNAL_ERROR';\n readonly category = ErrorCategory.INTERNAL;\n readonly severity = ErrorSeverity.CRITICAL;\n\n constructor(\n message: string,\n context: Record<string, any> = {},\n cause?: Error\n ) {\n super(message, context, cause);\n }\n}\n\n/**\n * Structured error information\n */\nexport interface ErrorInfo {\n code: string;\n category: ErrorCategory;\n severity: ErrorSeverity;\n message: string;\n timestamp: string;\n context: Record<string, any>;\n stack?: string;\n cause?: {\n name: string;\n message: string;\n stack?: string;\n };\n}\n\n/**\n * Error handler for collecting and processing errors\n */\nexport class ErrorHandler {\n private errors: VisualBuilderError[] = [];\n private maxErrors = 100;\n\n /**\n * Handle an error\n */\n handle(error: Error | VisualBuilderError): void {\n let visualBuilderError: VisualBuilderError;\n\n if (error instanceof VisualBuilderError) {\n visualBuilderError = error;\n } else {\n // Wrap generic errors\n visualBuilderError = new InternalError(\n error.message,\n { originalName: error.name },\n error\n );\n }\n\n this.errors.push(visualBuilderError);\n\n // Maintain max errors limit\n if (this.errors.length > this.maxErrors) {\n this.errors = this.errors.slice(-this.maxErrors);\n }\n\n // Log based on severity\n this.logError(visualBuilderError);\n }\n\n /**\n * Get all errors\n */\n getErrors(): VisualBuilderError[] {\n return [...this.errors];\n }\n\n /**\n * Get errors by category\n */\n getErrorsByCategory(category: ErrorCategory): VisualBuilderError[] {\n return this.errors.filter(error => error.category === category);\n }\n\n /**\n * Get errors by severity\n */\n getErrorsBySeverity(severity: ErrorSeverity): VisualBuilderError[] {\n return this.errors.filter(error => error.severity === severity);\n }\n\n /**\n * Clear all errors\n */\n clear(): void {\n this.errors = [];\n }\n\n /**\n * Get error statistics\n */\n getStatistics(): ErrorStatistics {\n const stats: ErrorStatistics = {\n total: this.errors.length,\n byCategory: {} as Record<ErrorCategory, number>,\n bySeverity: {} as Record<ErrorSeverity, number>,\n recent: this.errors.slice(-10)\n };\n\n // Count by category\n for (const category of Object.values(ErrorCategory)) {\n stats.byCategory[category] = this.errors.filter(e => e.category === category).length;\n }\n\n // Count by severity\n for (const severity of Object.values(ErrorSeverity)) {\n stats.bySeverity[severity] = this.errors.filter(e => e.severity === severity).length;\n }\n\n return stats;\n }\n\n private logError(error: VisualBuilderError): void {\n const errorInfo = error.toJSON();\n \n switch (error.severity) {\n case ErrorSeverity.CRITICAL:\n console.error('🔴 CRITICAL ERROR:', errorInfo);\n break;\n case ErrorSeverity.HIGH:\n console.error('🟠 HIGH SEVERITY:', errorInfo);\n break;\n case ErrorSeverity.MEDIUM:\n console.warn('🟡 MEDIUM SEVERITY:', errorInfo);\n break;\n case ErrorSeverity.LOW:\n console.log('🟢 LOW SEVERITY:', errorInfo);\n break;\n }\n }\n}\n\n/**\n * Error statistics interface\n */\nexport interface ErrorStatistics {\n total: number;\n byCategory: Record<ErrorCategory, number>;\n bySeverity: Record<ErrorSeverity, number>;\n recent: VisualBuilderError[];\n}\n\n/**\n * Global error handler instance\n */\nexport const globalErrorHandler = new ErrorHandler();\n\n/**\n * Utility function to create typed errors\n */\nexport const createError = {\n validation: (message: string, nodeId?: string, rules?: string[]) => \n new ValidationError(message, nodeId, rules),\n \n conversion: (code: string, message: string, nodeId?: string) => \n new ConversionError(code, message, nodeId),\n \n registry: (operation: string, message: string, nodeId?: string) => \n new RegistryError(operation, message, nodeId),\n \n dsl: (type: 'PARSING' | 'VALIDATION' | 'EXPORT' | 'IMPORT', message: string, expression?: string) => \n new DslError(type, message, expression),\n \n context: (operation: string, message: string, scopeId?: string, variablePath?: string) => \n new ContextError(operation, message, scopeId, variablePath),\n \n configuration: (message: string, configPath?: string, expectedType?: string) => \n new ConfigurationError(message, configPath, expectedType),\n \n internal: (message: string, cause?: Error) => \n new InternalError(message, {}, cause)\n};","import { Injectable } from '@angular/core';\nimport {\n DslParser,\n DslValidator,\n ValidationIssue,\n ValidationSeverity,\n ValidationIssueType,\n FunctionRegistry,\n} from '@praxisui/specification';\nimport { ContextProvider } from '@praxisui/specification';\n\n/**\n * Configuration for parsing DSL expressions\n */\nexport interface DslParsingConfig {\n /** Available function registry */\n functionRegistry?: FunctionRegistry<any>;\n /** Context provider for variable resolution */\n contextProvider?: ContextProvider;\n /** Known field names for validation */\n knownFields?: string[];\n /** Enable performance warnings */\n enablePerformanceWarnings?: boolean;\n /** Maximum expression complexity */\n maxComplexity?: number;\n}\n\n/**\n * Result of parsing a DSL expression\n */\nexport interface DslParsingResult<T extends object = any> {\n /** Whether parsing was successful */\n success: boolean;\n /** Parsed specification (if successful) */\n specification?: any; // Would be Specification<T> but avoiding circular import\n /** Validation issues found */\n issues: ValidationIssue[];\n /** Performance metrics */\n metrics?: {\n parseTime: number;\n complexity: number;\n };\n}\n\n/**\n * Dedicated service for DSL parsing and validation\n * Extracted from SpecificationBridgeService to follow SRP\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DslParsingService {\n constructor() {}\n\n /**\n * Parse a DSL expression into a specification\n */\n parseDsl<T extends object = any>(\n dslExpression: string,\n config?: DslParsingConfig,\n ): DslParsingResult<T> {\n const startTime = performance.now();\n const issues: ValidationIssue[] = [];\n\n try {\n const validator = new DslValidator({\n knownFields: config?.knownFields,\n functionRegistry: config?.functionRegistry,\n enablePerformanceWarnings: config?.enablePerformanceWarnings,\n maxComplexity: config?.maxComplexity,\n });\n const validationIssues = validator.validate(dslExpression);\n issues.push(...validationIssues);\n\n const criticalErrors = issues.filter(\n (issue) => issue.severity === ValidationSeverity.ERROR,\n );\n if (criticalErrors.length > 0) {\n return {\n success: false,\n issues,\n metrics: {\n parseTime: performance.now() - startTime,\n complexity: this.calculateComplexity(dslExpression),\n },\n };\n }\n\n const parser = new DslParser<any>(config?.functionRegistry);\n const specification = parser.parse(dslExpression);\n const endTime = performance.now();\n\n return {\n success: true,\n specification,\n issues,\n metrics: {\n parseTime: endTime - startTime,\n complexity: this.calculateComplexity(dslExpression),\n },\n };\n } catch (error) {\n issues.push({\n type: ValidationIssueType.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Failed to parse DSL: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n });\n\n return {\n success: false,\n issues,\n metrics: {\n parseTime: performance.now() - startTime,\n complexity: this.calculateComplexity(dslExpression),\n },\n };\n }\n }\n\n /**\n * Validate DSL syntax without parsing\n */\n validateDsl(\n dslExpression: string,\n config?: DslParsingConfig,\n ): ValidationIssue[] {\n try {\n const validator = new DslValidator({\n knownFields: config?.knownFields,\n functionRegistry: config?.functionRegistry,\n enablePerformanceWarnings: config?.enablePerformanceWarnings,\n maxComplexity: config?.maxComplexity,\n });\n return validator.validate(dslExpression);\n } catch (error) {\n return [\n {\n type: ValidationIssueType.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Validation failed: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n },\n ];\n }\n }\n\n /**\n * Get suggestions for DSL completion\n */\n getDslSuggestions(\n partialExpression: string,\n cursorPosition: number,\n config?: DslParsingConfig,\n ): string[] {\n try {\n // This would typically use a language service or parser\n const suggestions: string[] = [];\n\n // Add field suggestions\n if (config?.knownFields) {\n const currentToken = this.getCurrentToken(\n partialExpression,\n cursorPosition,\n );\n const matchingFields = config.knownFields.filter((field) =>\n field.toLowerCase().startsWith(currentToken.toLowerCase()),\n );\n suggestions.push(...matchingFields);\n }\n\n // Add operator suggestions\n const operators = [\n '==',\n '!=',\n '>',\n '<',\n '>=',\n '<=',\n 'contains',\n 'startsWith',\n 'endsWith',\n ];\n suggestions.push(...operators);\n\n // Add function suggestions\n if (config?.functionRegistry) {\n // Would get function names from registry\n suggestions.push('sum()', 'count()', 'avg()', 'max()', 'min()');\n }\n\n return suggestions;\n } catch (error) {\n console.warn('Failed to get DSL suggestions:', error);\n return [];\n }\n }\n\n /**\n * Format DSL expression for readability\n */\n formatDsl(dslExpression: string): string {\n try {\n // Simple formatting rules\n return dslExpression\n .replace(/\\s*&&\\s*/g, ' && ')\n .replace(/\\s*\\|\\|\\s*/g, ' || ')\n .replace(/\\s*==\\s*/g, ' == ')\n .replace(/\\s*!=\\s*/g, ' != ')\n .replace(/\\s*>=\\s*/g, ' >= ')\n .replace(/\\s*<=\\s*/g, ' <= ')\n .replace(/\\s*>\\s*/g, ' > ')\n .replace(/\\s*<\\s*/g, ' < ')\n .replace(/\\(\\s+/g, '(')\n .replace(/\\s+\\)/g, ')')\n .trim();\n } catch (error) {\n console.warn('Failed to format DSL:', error);\n return dslExpression;\n }\n }\n\n /**\n * Check if DSL expression is syntactically valid\n */\n isValidDsl(dslExpression: string, config?: DslParsingConfig): boolean {\n const issues = this.validateDsl(dslExpression, config);\n return !issues.some((issue) => issue.severity === 'error');\n }\n\n private calculateComplexity(dslExpression: string): number {\n // Simple complexity calculation based on operators and nesting\n let complexity = 1;\n\n // Count operators\n complexity += (dslExpression.match(/&&|\\|\\|/g) || []).length * 2;\n complexity += (dslExpression.match(/==|!=|>=|<=|>|</g) || []).length;\n\n // Count parentheses (nesting)\n complexity += (dslExpression.match(/\\(/g) || []).length;\n\n // Count function calls\n complexity += (dslExpression.match(/\\w+\\(/g) || []).length * 3;\n\n return complexity;\n }\n\n private getCurrentToken(expression: string, cursorPosition: number): string {\n // Extract the current word/token at cursor position\n const beforeCursor = expression.substring(0, cursorPosition);\n const afterCursor = expression.substring(cursorPosition);\n\n const beforeMatch = beforeCursor.match(/(\\w+)$/);\n const afterMatch = afterCursor.match(/^(\\w*)/);\n\n const before = beforeMatch ? beforeMatch[1] : '';\n const after = afterMatch ? afterMatch[1] : '';\n\n return before + after;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ContextProvider } from '@praxisui/specification';\n/**\n * Context variable definition used by the context management service\n * Renamed to avoid conflicts with other ContextVariable interfaces\n */\nexport interface ContextEntry {\n /** Full path identifier for the variable */\n path: string;\n /** Actual value of the variable */\n value: unknown;\n /** Optional type hint for validation */\n type?: string;\n}\n\n/**\n * Configuration for contextual specification support\n */\nexport interface ContextualConfig {\n /** Context variables available for token resolution */\n contextVariables?: ContextEntry[];\n /** Context provider instance */\n contextProvider?: ContextProvider;\n /** Enable strict validation of context tokens */\n strictContextValidation?: boolean;\n}\n\n/**\n * Context variable value with metadata\n */\nexport interface ContextValue {\n /** The actual value */\n value: any;\n /** Variable type */\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n /** Whether the value is computed */\n computed?: boolean;\n /** Last updated timestamp */\n lastUpdated?: Date;\n}\n\n/**\n * Context scope for variable resolution\n */\nexport interface ContextScope {\n /** Scope identifier */\n id: string;\n /** Scope name */\n name: string;\n /** Parent scope (for hierarchical contexts) */\n parentId?: string;\n /** Variables in this scope */\n variables: Map<string, ContextValue>;\n}\n\n/**\n * Dedicated service for context management and variable resolution\n * Extracted from SpecificationBridgeService to follow SRP\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ContextManagementService {\n private scopes = new Map<string, ContextScope>();\n private globalScope: ContextScope;\n\n constructor() {\n // Initialize global scope\n this.globalScope = {\n id: 'global',\n name: 'Global Context',\n variables: new Map(),\n };\n this.scopes.set('global', this.globalScope);\n }\n\n /**\n * Create a context provider from context variables\n */\n createContextProvider(contextVariables: ContextEntry[]): ContextProvider {\n const variableMap = new Map<string, any>();\n\n for (const variable of contextVariables) {\n variableMap.set(variable.path, variable.value);\n\n // Also add with dot notation if path contains dots\n if (variable.path.includes('.')) {\n const segments = variable.path.split('.');\n let current = variableMap;\n\n // Create nested structure\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i];\n if (!current.has(segment)) {\n current.set(segment, new Map());\n }\n current = current.get(segment);\n }\n\n current.set(segments[segments.length - 1], variable.value);\n }\n }\n\n return {\n hasValue: (path: string) => this.hasContextValue(path, variableMap),\n getValue: (path: string) => this.getContextValue(path, variableMap),\n };\n }\n\n /**\n * Create a new context scope\n */\n createScope(id: string, name: string, parentId?: string): ContextScope {\n if (this.scopes.has(id)) {\n throw new Error(`Context scope '${id}' already exists`);\n }\n\n if (parentId && !this.scopes.has(parentId)) {\n throw new Error(`Parent scope '${parentId}' does not exist`);\n }\n\n const scope: ContextScope = {\n id,\n name,\n parentId,\n variables: new Map(),\n };\n\n this.scopes.set(id, scope);\n return scope;\n }\n\n /**\n * Set a variable in a specific scope\n */\n setVariable(\n scopeId: string,\n name: string,\n value: any,\n type?: ContextValue['type'],\n ): void {\n const scope = this.scopes.get(scopeId);\n if (!scope) {\n throw new Error(`Context scope '${scopeId}' does not exist`);\n }\n\n const contextValue: ContextValue = {\n value,\n type: type || this.inferType(value),\n lastUpdated: new Date(),\n };\n\n scope.variables.set(name, contextValue);\n }\n\n /**\n * Get a variable value from a scope (with inheritance)\n */\n getVariable(scopeId: string, name: string): ContextValue | undefined {\n const scope = this.scopes.get(scopeId);\n if (!scope) {\n return undefined;\n }\n\n // Check current scope\n if (scope.variables.has(name)) {\n return scope.variables.get(name);\n }\n\n // Check parent scopes recursively\n if (scope.parentId) {\n return this.getVariable(scope.parentId, name);\n }\n\n return undefined;\n }\n\n /**\n * Get all variables in a scope (including inherited)\n */\n getAllVariables(scopeId: string): Map<string, ContextValue> {\n const allVariables = new Map<string, ContextValue>();\n\n // Collect variables from parent scopes first (so they can be overridden)\n this.collectVariablesRecursive(scopeId, allVariables);\n\n return allVariables;\n }\n\n /**\n * Validate context variables\n */\n validateContext(contextVariables: ContextEntry[]): {\n isValid: boolean;\n issues: string[];\n } {\n const issues: string[] = [];\n const paths = new Set<string>();\n\n for (const variable of contextVariables) {\n // Check for duplicate paths\n if (paths.has(variable.path)) {\n issues.push(`Duplicate context variable path: ${variable.path}`);\n }\n paths.add(variable.path);\n\n // Validate path format\n if (!this.isValidPath(variable.path)) {\n issues.push(`Invalid context variable path: ${variable.path}`);\n }\n\n // Validate value type consistency\n if (variable.type && typeof variable.value !== variable.type) {\n issues.push(\n `Type mismatch for ${variable.path}: expected ${variable.type}, got ${typeof variable.value}`,\n );\n }\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n };\n }\n\n /**\n * Create a scoped context provider\n */\n createScopedProvider(scopeId: string): ContextProvider {\n const variables = this.getAllVariables(scopeId);\n\n return {\n hasValue: (path: string) => variables.has(path),\n getValue: (path: string) => {\n const contextValue = variables.get(path);\n return contextValue ? contextValue.value : undefined;\n },\n };\n }\n\n /**\n * Merge multiple context providers\n */\n mergeProviders(...providers: ContextProvider[]): ContextProvider {\n return {\n hasValue: (path: string) =>\n providers.some((provider) => provider.hasValue(path)),\n getValue: (path: string) => {\n // Return from the first provider that has the value\n for (const provider of providers) {\n if (provider.hasValue(path)) {\n return provider.getValue(path);\n }\n }\n return undefined;\n },\n };\n }\n\n /**\n * Get context statistics\n */\n getContextStatistics(scopeId?: string): {\n scopeCount: number;\n variableCount: number;\n totalSize: number;\n scopes: { id: string; name: string; variableCount: number }[];\n } {\n const scopesToCheck = scopeId ? [scopeId] : Array.from(this.scopes.keys());\n let totalVariables = 0;\n let totalSize = 0;\n const scopeStats: { id: string; name: string; variableCount: number }[] =\n [];\n\n for (const id of scopesToCheck) {\n const scope = this.scopes.get(id);\n if (scope) {\n const variableCount = scope.variables.size;\n totalVariables += variableCount;\n\n // Estimate size\n for (const [, value] of scope.variables) {\n totalSize += this.estimateSize(value.value);\n }\n\n scopeStats.push({\n id: scope.id,\n name: scope.name,\n variableCount,\n });\n }\n }\n\n return {\n scopeCount: scopesToCheck.length,\n variableCount: totalVariables,\n totalSize,\n scopes: scopeStats,\n };\n }\n\n private hasContextValue(\n path: string,\n variableMap: Map<string, any>,\n ): boolean {\n // Check direct path\n if (variableMap.has(path)) {\n return true;\n }\n\n // Check dot notation path\n if (path.includes('.')) {\n const segments = path.split('.');\n let current: any = variableMap;\n\n for (const segment of segments) {\n if (current instanceof Map && current.has(segment)) {\n current = current.get(segment);\n } else {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n }\n\n private getContextValue(path: string, variableMap: Map<string, any>): any {\n // Check direct path\n if (variableMap.has(path)) {\n return variableMap.get(path);\n }\n\n // Check dot notation path\n if (path.includes('.')) {\n const segments = path.split('.');\n let current: any = variableMap;\n\n for (const segment of segments) {\n if (current instanceof Map && current.has(segment)) {\n current = current.get(segment);\n } else {\n return undefined;\n }\n }\n\n return current;\n }\n\n return undefined;\n }\n\n private collectVariablesRecursive(\n scopeId: string,\n variables: Map<string, ContextValue>,\n ): void {\n const scope = this.scopes.get(scopeId);\n if (!scope) return;\n\n // First collect from parent (so child can override)\n if (scope.parentId) {\n this.collectVariablesRecursive(scope.parentId, variables);\n }\n\n // Then add/override with current scope variables\n for (const [name, value] of scope.variables) {\n variables.set(name, value);\n }\n }\n\n private isValidPath(path: string): boolean {\n // Basic path validation\n return /^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(path);\n }\n\n private inferType(value: any): ContextValue['type'] {\n if (Array.isArray(value)) return 'array';\n if (value === null || value === undefined) return 'object';\n\n const type = typeof value;\n if (type === 'string' || type === 'number' || type === 'boolean') {\n return type;\n }\n\n return 'object';\n }\n\n private estimateSize(value: any): number {\n try {\n return JSON.stringify(value).length;\n } catch {\n return 0;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Specification } from '@praxisui/specification-core';\nimport { DslExporter, ExportOptions } from '@praxisui/specification';\nimport { RuleNode, RuleNodeType, RuleNodeTypeString } from '../models/rule-builder.model';\nimport { ConverterFactoryService } from './converters/converter-factory.service';\nimport {\n DslParsingService,\n DslParsingConfig,\n DslParsingResult,\n} from './dsl/dsl-parsing.service';\nimport {\n ContextManagementService,\n ContextualConfig,\n} from './context/context-management.service';\nimport {\n ConversionError,\n createError,\n globalErrorHandler,\n} from '../errors/visual-builder-errors';\n\n/**\n * Simplified service for core rule conversion operations\n * Replaces the God Service anti-pattern from SpecificationBridgeService\n * Focuses only on conversion between RuleNodes and Specifications\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class RuleConversionService {\n private dslExporter: DslExporter;\n\n constructor(\n private converterFactory: ConverterFactoryService,\n private dslParsingService: DslParsingService,\n private contextManagementService: ContextManagementService,\n ) {\n this.dslExporter = new DslExporter({\n prettyPrint: true,\n indentSize: 2,\n maxLineLength: 80,\n useParentheses: 'auto',\n includeMetadata: true,\n metadataPosition: 'before',\n });\n }\n\n /**\n * Convert a RuleNode tree to a Specification instance\n * Core conversion functionality with clean error handling\n */\n convertRuleToSpecification<T extends object = any>(\n node: RuleNode,\n ): Specification<T> {\n if (!node) {\n const error = createError.conversion(\n 'INVALID_INPUT',\n 'Node cannot be null or undefined',\n );\n globalErrorHandler.handle(error);\n throw error;\n }\n\n if (!node.config?.type) {\n const error = createError.conversion(\n 'MISSING_CONFIGURATION',\n `Node ${node.id} is missing configuration or type`,\n node.id,\n );\n globalErrorHandler.handle(error);\n throw error;\n }\n\n try {\n return this.converterFactory.convert<T>(node);\n } catch (error) {\n const conversionError = createError.conversion(\n 'CONVERSION_FAILED',\n `Failed to convert node ${node.id}`,\n node.id,\n );\n globalErrorHandler.handle(conversionError);\n throw conversionError;\n }\n }\n\n /**\n * Convert a Specification back to a RuleNode tree\n * Simplified reverse conversion\n */\n convertSpecificationToRule<T extends object = any>(\n spec: Specification<T>,\n ): RuleNode {\n if (!spec) {\n throw new ConversionError(\n 'INVALID_INPUT',\n 'Specification cannot be null or undefined',\n );\n }\n\n try {\n const specJson = spec.toJSON();\n return this.jsonToRuleNode(specJson);\n } catch (error) {\n throw new ConversionError(\n 'REVERSE_CONVERSION_FAILED',\n 'Failed to convert specification to rule node',\n undefined,\n {},\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Export a RuleNode tree to DSL format\n */\n exportRuleToDsl<T extends object = any>(\n node: RuleNode,\n options?: Partial<ExportOptions>,\n ): string {\n try {\n const specification = this.convertRuleToSpecification<T>(node);\n if (options) {\n // Create a new exporter with custom options\n const customExporter = new DslExporter(options);\n return customExporter.export(specification);\n }\n return this.dslExporter.export(specification);\n } catch (error) {\n throw new ConversionError(\n 'DSL_EXPORT_FAILED',\n `Failed to export rule to DSL`,\n undefined,\n {},\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Import a RuleNode tree from DSL format\n */\n importRuleFromDsl<T extends object = any>(\n dslExpression: string,\n config?: DslParsingConfig,\n ): DslParsingResult<T> {\n if (!dslExpression || dslExpression.trim().length === 0) {\n throw new ConversionError(\n 'INVALID_INPUT',\n 'DSL expression cannot be empty',\n );\n }\n\n try {\n return this.dslParsingService.parseDsl<T>(dslExpression, config);\n } catch (error) {\n throw new ConversionError(\n 'DSL_IMPORT_FAILED',\n 'Failed to import rule from DSL',\n undefined,\n {},\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Create a contextual specification from a RuleNode\n */\n createContextualSpecification<T extends object = any>(\n node: RuleNode,\n contextConfig: ContextualConfig,\n ): Specification<T> {\n try {\n const contextProvider =\n contextConfig.contextProvider ||\n (contextConfig.contextVariables\n ? this.contextManagementService.createContextProvider(\n contextConfig.contextVariables,\n )\n : undefined);\n\n if (!contextProvider) {\n throw new ConversionError(\n 'MISSING_CONTEXT',\n 'Context provider or context variables are required for contextual specification',\n );\n }\n\n // Convert the rule normally first\n const baseSpecification = this.convertRuleToSpecification<T>(node);\n\n // TODO: Wrap in contextual specification\n // This would require ContextualSpecification from @praxisui/specification\n return baseSpecification;\n } catch (error) {\n throw new ConversionError(\n 'CONTEXTUAL_CONVERSION_FAILED',\n 'Failed to create contextual specification',\n undefined,\n {},\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Validate that a rule can be converted\n */\n validateConversion(node: RuleNode): ConversionValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Basic validation\n if (!node) {\n errors.push('Node cannot be null or undefined');\n return { isValid: false, errors, warnings };\n }\n\n if (!node.id) {\n errors.push('Node is missing required ID');\n }\n\n if (!node.config) {\n errors.push(`Node ${node.id} is missing configuration`);\n return { isValid: false, errors, warnings };\n }\n\n if (!node.config.type) {\n errors.push(`Node ${node.id} is missing type in configuration`);\n }\n\n // Check if converter exists\n const factoryValidation = this.converterFactory.validateNode(node);\n if (!factoryValidation.isValid) {\n errors.push(...factoryValidation.errors);\n }\n\n // Warnings for potential issues\n if (node.children && node.children.length > 20) {\n warnings.push(\n `Node ${node.id} has many children (${node.children.length}) which may impact performance`,\n );\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Get conversion statistics\n */\n getConversionStatistics(): ConversionStatistics {\n const factoryStats = this.converterFactory.getStatistics();\n\n return {\n supportedNodeTypes: factoryStats.supportedTypes.length,\n registeredConverters: factoryStats.converterCount,\n availableNodeTypes: factoryStats.supportedTypes,\n converterNames: factoryStats.converterNames,\n };\n }\n\n private jsonToRuleNode(json: any): RuleNode {\n // Simplified JSON to RuleNode conversion\n // This would need to be implemented based on the actual JSON structure\n // from @praxisui/specification\n\n const children: string[] | undefined = Array.isArray(json.children)\n ? json.children.map((child: any) => String(child))\n : undefined;\n\n const config: Record<string, unknown> = {\n type: json.config?.type || json.type || 'fieldCondition',\n };\n\n if (json.config?.fieldName || json.config?.field) {\n config['fieldName'] = json.config.fieldName || json.config.field;\n }\n if (json.config?.operator !== undefined) {\n config['operator'] = json.config.operator;\n }\n if (json.config?.value !== undefined) {\n config['value'] = json.config.value;\n }\n\n return {\n id: String(json.id || `node-${Date.now()}`),\n type: (config['type'] as RuleNodeType | RuleNodeTypeString) || 'fieldCondition',\n config: config as any,\n children,\n };\n }\n}\n\n/**\n * Result of conversion validation\n */\nexport interface ConversionValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Statistics about conversion capabilities\n */\nexport interface ConversionStatistics {\n supportedNodeTypes: number;\n registeredConverters: number;\n availableNodeTypes: string[];\n converterNames: string[];\n}\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { RuleBuilderState, RuleNode } from '../models/rule-builder.model';\n\n/**\n * Placeholder Visual Rule Builder Component\n * \n * This is a placeholder component for the template integration example.\n * In a real implementation, this would be the main visual rule builder interface.\n */\n@Component({\n selector: 'praxis-visual-rule-builder',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"visual-rule-builder-placeholder\">\n <div class=\"placeholder-content\">\n <h3>Visual Rule Builder</h3>\n <p>This is a placeholder for the visual rule builder component.</p>\n <p>Current state has {{ nodeCount }} nodes.</p>\n \n <div class=\"builder-actions\">\n <button type=\"button\" (click)=\"addSampleNode()\">Add Sample Node</button>\n <button type=\"button\" (click)=\"clearNodes()\">Clear All</button>\n </div>\n\n <div class=\"state-display\" *ngIf=\"nodeCount > 0\">\n <h4>Current Nodes:</h4>\n <ul>\n <li *ngFor=\"let nodeId of builderState?.rootNodes\">\n Node: {{ nodeId }}\n </li>\n </ul>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .visual-rule-builder-placeholder {\n padding: 24px;\n border: 2px dashed #ccc;\n border-radius: 8px;\n background: #f9f9f9;\n text-align: center;\n min-height: 300px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .placeholder-content {\n max-width: 400px;\n }\n\n .placeholder-content h3 {\n margin: 0 0 16px 0;\n color: #666;\n }\n\n .placeholder-content p {\n margin: 8px 0;\n color: #888;\n }\n\n .builder-actions {\n margin: 20px 0;\n }\n\n .builder-actions button {\n margin: 0 8px;\n padding: 8px 16px;\n border: 1px solid #ccc;\n background: var(--md-sys-color-surface);\n border-radius: 4px;\n cursor: pointer;\n }\n\n .builder-actions button:hover {\n background: var(--md-sys-color-surface-variant);\n }\n\n .state-display {\n margin-top: 20px;\n text-align: left;\n background: var(--md-sys-color-surface);\n padding: 16px;\n border-radius: 4px;\n border: 1px solid #ddd;\n }\n\n .state-display h4 {\n margin: 0 0 8px 0;\n color: #333;\n }\n\n .state-display ul {\n margin: 0;\n padding-left: 20px;\n }\n\n .state-display li {\n color: #666;\n margin: 4px 0;\n }\n `]\n})\nexport class VisualRuleBuilderComponent {\n @Input() fieldSchemas: any[] = [];\n @Input() builderState: RuleBuilderState | null = null;\n \n @Output() stateChanged = new EventEmitter<RuleBuilderState>();\n @Output() selectionChanged = new EventEmitter<any[]>();\n\n get nodeCount(): number {\n return this.builderState ? Object.keys(this.builderState.nodes).length : 0;\n }\n\n addSampleNode(): void {\n if (!this.builderState) {\n this.builderState = {\n nodes: {},\n rootNodes: [],\n validationErrors: [],\n mode: 'visual',\n isDirty: false,\n history: [],\n historyPosition: 0\n };\n }\n\n const nodeId = `sample-node-${Date.now()}`;\n const sampleNode: RuleNode = {\n id: nodeId,\n type: 'fieldCondition',\n label: 'Sample Rule',\n config: {\n type: 'fieldCondition',\n fieldName: 'email',\n operator: 'neq',\n value: ''\n }\n };\n\n const newState: RuleBuilderState = {\n ...this.builderState,\n nodes: {\n ...this.builderState.nodes,\n [nodeId]: sampleNode\n },\n rootNodes: [...this.builderState.rootNodes, nodeId],\n isDirty: true\n };\n\n this.builderState = newState;\n this.stateChanged.emit(newState);\n this.selectionChanged.emit([sampleNode]);\n }\n\n clearNodes(): void {\n const newState: RuleBuilderState = {\n nodes: {},\n rootNodes: [],\n validationErrors: [],\n mode: 'visual',\n isDirty: false,\n history: [],\n historyPosition: 0\n };\n\n this.builderState = newState;\n this.stateChanged.emit(newState);\n this.selectionChanged.emit([]);\n }\n}\n","import { Component, Inject, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormArray } from '@angular/forms';\nimport { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport { MatChipInputEvent } from '@angular/material/chips';\n\nimport { RuleTemplate, RuleNode, TemplateMetadata } from '../models/rule-builder.model';\nimport { RuleTemplateService } from '../services/rule-template.service';\nimport { SpecificationBridgeService } from '../services/specification-bridge.service';\n\nexport interface TemplateEditorDialogData {\n mode: 'create' | 'edit';\n template?: RuleTemplate;\n selectedNodes?: RuleNode[];\n availableCategories?: string[];\n}\n\nexport interface TemplateEditorResult {\n action: 'save' | 'cancel';\n template?: RuleTemplate;\n}\n\n@Component({\n selector: 'praxis-template-editor-dialog',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatDialogModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatButtonModule,\n MatIconModule,\n MatChipsModule,\n MatTooltipModule,\n MatStepperModule,\n MatCheckboxModule,\n MatTabsModule,\n MatDividerModule,\n MatSnackBarModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"template-editor-dialog\">\n <div mat-dialog-title class=\"dialog-title\">\n <mat-icon>{{ data.mode === 'create' ? 'add' : 'edit' }}</mat-icon>\n <span>{{ data.mode === 'create' ? 'Create Template' : 'Edit Template' }}</span>\n </div>\n\n <div mat-dialog-content class=\"dialog-content\">\n <mat-horizontal-stepper #stepper linear>\n <!-- Step 1: Basic Information -->\n <mat-step [stepControl]=\"basicInfoForm\" label=\"Basic Information\">\n <form [formGroup]=\"basicInfoForm\" class=\"step-form\">\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"name-field\">\n <mat-label>Template Name</mat-label>\n <input matInput \n formControlName=\"name\"\n placeholder=\"Enter template name\"\n maxlength=\"100\">\n <mat-hint align=\"end\">{{ (basicInfoForm.get('name')?.value || '').length }}/100</mat-hint>\n <mat-error *ngIf=\"basicInfoForm.get('name')?.hasError('required')\">\n Template name is required\n </mat-error>\n <mat-error *ngIf=\"basicInfoForm.get('name')?.hasError('minlength')\">\n Name must be at least 3 characters\n </mat-error>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"category-field\">\n <mat-label>Category</mat-label>\n <mat-select formControlName=\"category\">\n <mat-option *ngFor=\"let category of availableCategories\" \n [value]=\"category.id\">\n <div class=\"category-option\">\n <mat-icon>{{ category.icon }}</mat-icon>\n <span>{{ category.name }}</span>\n </div>\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"basicInfoForm.get('category')?.hasError('required')\">\n Category is required\n </mat-error>\n </mat-form-field>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"description-field\">\n <mat-label>Description</mat-label>\n <textarea matInput \n formControlName=\"description\"\n placeholder=\"Describe what this template does and when to use it\"\n rows=\"3\"\n maxlength=\"500\"></textarea>\n <mat-hint align=\"end\">{{ (basicInfoForm.get('description')?.value || '').length }}/500</mat-hint>\n <mat-error *ngIf=\"basicInfoForm.get('description')?.hasError('required')\">\n Description is required\n </mat-error>\n </mat-form-field>\n\n <div class=\"tags-section\">\n <h4>Tags</h4>\n <mat-form-field appearance=\"outline\" class=\"tags-input\">\n <mat-label>Add tags</mat-label>\n <mat-chip-grid #chipList>\n <mat-chip-row *ngFor=\"let tag of tags\" \n [removable]=\"true\"\n (removed)=\"removeTag(tag)\">\n {{ tag }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip-row>\n <input placeholder=\"Type and press Enter\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addTag($event)\">\n </mat-chip-grid>\n <mat-hint>Tags help organize and find templates. Press Enter to add.</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"step-actions\">\n <button mat-flat-button \n color=\"primary\"\n matStepperNext\n [disabled]=\"!basicInfoForm.valid\">\n Next: Configure Rules\n </button>\n </div>\n </form>\n </mat-step>\n\n <!-- Step 2: Rule Configuration -->\n <mat-step [stepControl]=\"rulesForm\" label=\"Rule Configuration\">\n <form [formGroup]=\"rulesForm\" class=\"step-form\">\n <div class=\"rules-section\">\n <div class=\"section-header\">\n <h4>Template Rules</h4>\n <p class=\"section-description\">\n {{ data.mode === 'create' ? 'Selected nodes will be included in the template.' : 'Configure the rules included in this template.' }}\n </p>\n </div>\n\n <div class=\"rules-preview\">\n <div class=\"preview-header\">\n <mat-icon>rule</mat-icon>\n <span>Rule Structure Preview</span>\n <span class=\"node-count\">({{ nodeCount }} nodes)</span>\n </div>\n\n <div class=\"nodes-tree\">\n <div *ngFor=\"let node of previewNodes\" \n class=\"tree-node\"\n [class.root-node]=\"isRootNode(node)\">\n <div class=\"node-content\">\n <mat-icon class=\"node-icon\">{{ getNodeIcon(node) }}</mat-icon>\n <span class=\"node-label\">{{ node.label || node.type }}</span>\n <mat-chip class=\"node-type-chip\">{{ node.type }}</mat-chip>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"required-fields-section\">\n <h5>Required Fields</h5>\n <p class=\"field-description\">\n Specify which fields are required for this template to work properly.\n </p>\n \n <mat-form-field appearance=\"outline\" class=\"required-fields-input\">\n <mat-label>Required field names</mat-label>\n <mat-chip-grid #requiredFieldsList>\n <mat-chip-row *ngFor=\"let field of requiredFields\" \n [removable]=\"true\"\n (removed)=\"removeRequiredField(field)\">\n {{ field }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip-row>\n <input placeholder=\"Add field name\"\n [matChipInputFor]=\"requiredFieldsList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addRequiredField($event)\">\n </mat-chip-grid>\n <mat-hint>Field names that must exist for the template to work correctly</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"template-variables-section\">\n <h5>Template Variables</h5>\n <p class=\"field-description\">\n Variables like {{ '{{fieldName}}' }} will be replaced when the template is applied.\n </p>\n \n <div class=\"detected-variables\">\n <mat-chip-set>\n <mat-chip *ngFor=\"let variable of detectedVariables\" \n color=\"accent\">\n {{ variable }}\n </mat-chip>\n </mat-chip-set>\n <p *ngIf=\"detectedVariables.length === 0\" class=\"no-variables\">\n No template variables detected in this configuration.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"step-actions\">\n <button mat-button matStepperPrevious>\n Previous\n </button>\n <button mat-flat-button \n color=\"primary\"\n matStepperNext\n [disabled]=\"!rulesForm.valid\">\n Next: Advanced Options\n </button>\n </div>\n </form>\n </mat-step>\n\n <!-- Step 3: Advanced Options -->\n <mat-step [stepControl]=\"advancedForm\" label=\"Advanced Options\">\n <form [formGroup]=\"advancedForm\" class=\"step-form\">\n <div class=\"advanced-section\">\n <h4>Template Metadata</h4>\n \n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"icon-field\">\n <mat-label>Icon</mat-label>\n <mat-select formControlName=\"icon\">\n <mat-option *ngFor=\"let icon of availableIcons\" \n [value]=\"icon.value\">\n <div class=\"icon-option\">\n <mat-icon>{{ icon.value }}</mat-icon>\n <span>{{ icon.label }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"version-field\">\n <mat-label>Version</mat-label>\n <input matInput \n formControlName=\"version\"\n placeholder=\"1.0.0\">\n <mat-hint>Semantic version (major.minor.patch)</mat-hint>\n </mat-form-field>\n </div>\n\n <div class=\"author-section\">\n <h5>Author Information</h5>\n <div class=\"form-row\">\n <mat-form-field appearance=\"outline\" class=\"author-name\">\n <mat-label>Author Name</mat-label>\n <input matInput formControlName=\"authorName\">\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"author-email\">\n <mat-label>Author Email</mat-label>\n <input matInput \n type=\"email\"\n formControlName=\"authorEmail\">\n </mat-form-field>\n </div>\n\n <mat-form-field appearance=\"outline\" class=\"organization-field\">\n <mat-label>Organization</mat-label>\n <input matInput formControlName=\"organization\">\n </mat-form-field>\n </div>\n\n <div class=\"example-section\">\n <h5>Usage Example</h5>\n <mat-form-field appearance=\"outline\" class=\"example-field\">\n <mat-label>Example usage or code snippet</mat-label>\n <textarea matInput \n formControlName=\"example\"\n rows=\"4\"\n placeholder=\"Show how to use this template...\"></textarea>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"step-actions\">\n <button mat-button matStepperPrevious>\n Previous\n </button>\n <button mat-flat-button \n color=\"primary\"\n [disabled]=\"!canSave()\"\n (click)=\"saveTemplate()\">\n {{ data.mode === 'create' ? 'Create Template' : 'Save Changes' }}\n </button>\n </div>\n </form>\n </mat-step>\n </mat-horizontal-stepper>\n </div>\n\n <div mat-dialog-actions class=\"dialog-actions\">\n <button mat-button (click)=\"cancel()\">\n Cancel\n </button>\n \n <div class=\"actions-spacer\"></div>\n \n <button mat-button \n *ngIf=\"data.mode === 'edit'\"\n color=\"warn\"\n (click)=\"deleteTemplate()\">\n <mat-icon>delete</mat-icon>\n Delete\n </button>\n \n <button mat-button \n (click)=\"previewTemplate()\"\n [disabled]=\"!canPreview()\">\n <mat-icon>preview</mat-icon>\n Preview\n </button>\n </div>\n </div>\n `,\n styles: [`\n .template-editor-dialog {\n min-width: 600px;\n max-width: 800px;\n max-height: 90vh;\n }\n\n .dialog-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n padding: 24px 24px 0;\n font-size: 20px;\n font-weight: 500;\n }\n\n .dialog-content {\n padding: 16px 24px;\n max-height: calc(90vh - 120px);\n overflow-y: auto;\n }\n\n .step-form {\n padding: 16px 0;\n min-height: 400px;\n }\n\n .form-row {\n display: flex;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .name-field,\n .category-field {\n flex: 1;\n }\n\n .description-field,\n .tags-input,\n .required-fields-input,\n .example-field,\n .organization-field {\n width: 100%;\n }\n\n .icon-field,\n .version-field {\n flex: 1;\n }\n\n .author-name,\n .author-email {\n flex: 1;\n }\n\n .category-option,\n .icon-option {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .tags-section,\n .required-fields-section,\n .template-variables-section,\n .author-section,\n .example-section {\n margin-bottom: 24px;\n }\n\n .tags-section h4,\n .author-section h5,\n .example-section h5,\n .required-fields-section h5,\n .template-variables-section h5 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .section-header {\n margin-bottom: 16px;\n }\n\n .section-header h4 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 500;\n }\n\n .section-description,\n .field-description {\n margin: 0;\n font-size: 13px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .rules-preview {\n background: var(--mdc-theme-surface-variant);\n border-radius: 8px;\n padding: 16px;\n margin-bottom: 24px;\n }\n\n .preview-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .node-count {\n font-weight: 400;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .nodes-tree {\n max-height: 200px;\n overflow-y: auto;\n }\n\n .tree-node {\n padding: 8px 0;\n border-left: 2px solid transparent;\n padding-left: 16px;\n }\n\n .tree-node.root-node {\n border-left-color: var(--mdc-theme-primary);\n background: rgba(var(--mdc-theme-primary-rgb), 0.05);\n }\n\n .node-content {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .node-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n color: var(--mdc-theme-primary);\n }\n\n .node-label {\n flex: 1;\n font-size: 13px;\n }\n\n .node-type-chip {\n font-size: 10px;\n height: 18px;\n line-height: 18px;\n }\n\n .detected-variables {\n margin-top: 8px;\n }\n\n .no-variables {\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n font-style: italic;\n margin: 8px 0;\n }\n\n .step-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--mdc-theme-outline);\n }\n\n .dialog-actions {\n padding: 16px 24px;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .actions-spacer {\n flex: 1;\n }\n\n /* Stepper customization */\n ::ng-deep .mat-stepper-horizontal {\n margin-top: 8px;\n }\n\n ::ng-deep .mat-step-header {\n pointer-events: none;\n }\n\n ::ng-deep .mat-step-header.cdk-keyboard-focused,\n ::ng-deep .mat-step-header.cdk-program-focused,\n ::ng-deep .mat-step-header:hover {\n background-color: transparent;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .template-editor-dialog {\n min-width: 320px;\n max-width: 95vw;\n }\n \n .form-row {\n flex-direction: column;\n }\n \n .name-field,\n .category-field,\n .icon-field,\n .version-field,\n .author-name,\n .author-email {\n flex: none;\n width: 100%;\n }\n }\n `]\n})\nexport class TemplateEditorDialogComponent implements OnInit {\n basicInfoForm: FormGroup;\n rulesForm: FormGroup;\n advancedForm: FormGroup;\n\n tags: string[] = [];\n requiredFields: string[] = [];\n separatorKeysCodes: number[] = [ENTER, COMMA];\n\n availableCategories = [\n { id: 'validation', name: 'Field Validation', icon: 'check_circle' },\n { id: 'business', name: 'Business Rules', icon: 'business' },\n { id: 'collection', name: 'Collection Validation', icon: 'list' },\n { id: 'conditional', name: 'Conditional Logic', icon: 'alt_route' },\n { id: 'workflow', name: 'Workflow Rules', icon: 'workflow' },\n { id: 'security', name: 'Security Validation', icon: 'security' },\n { id: 'custom', name: 'Custom Templates', icon: 'extension' }\n ];\n\n availableIcons = [\n { value: 'rule', label: 'Rule' },\n { value: 'check_circle', label: 'Check Circle' },\n { value: 'business', label: 'Business' },\n { value: 'list', label: 'List' },\n { value: 'alt_route', label: 'Alt Route' },\n { value: 'workflow', label: 'Workflow' },\n { value: 'security', label: 'Security' },\n { value: 'extension', label: 'Extension' },\n { value: 'widgets', label: 'Widgets' },\n { value: 'settings', label: 'Settings' }\n ];\n\n previewNodes: RuleNode[] = [];\n detectedVariables: string[] = [];\n\n get nodeCount(): number {\n return this.previewNodes.length;\n }\n\n constructor(\n private dialogRef: MatDialogRef<TemplateEditorDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: TemplateEditorDialogData,\n private fb: FormBuilder,\n private templateService: RuleTemplateService,\n private bridgeService: SpecificationBridgeService,\n private snackBar: MatSnackBar\n ) {\n this.basicInfoForm = this.createBasicInfoForm();\n this.rulesForm = this.createRulesForm();\n this.advancedForm = this.createAdvancedForm();\n }\n\n ngOnInit(): void {\n this.loadTemplateData();\n this.setupPreviewNodes();\n this.detectTemplateVariables();\n }\n\n private createBasicInfoForm(): FormGroup {\n return this.fb.group({\n name: ['', [Validators.required, Validators.minLength(3)]],\n description: ['', Validators.required],\n category: ['', Validators.required]\n });\n }\n\n private createRulesForm(): FormGroup {\n return this.fb.group({\n // Form controls for rule configuration\n });\n }\n\n private createAdvancedForm(): FormGroup {\n return this.fb.group({\n icon: ['rule'],\n version: ['1.0.0'],\n authorName: [''],\n authorEmail: [''],\n organization: [''],\n example: ['']\n });\n }\n\n private loadTemplateData(): void {\n if (this.data.mode === 'edit' && this.data.template) {\n const template = this.data.template;\n \n this.basicInfoForm.patchValue({\n name: template.name,\n description: template.description,\n category: template.category\n });\n\n this.tags = [...template.tags];\n this.requiredFields = [...(template.requiredFields || [])];\n\n this.advancedForm.patchValue({\n icon: template.icon || 'rule',\n version: template.metadata?.version || '1.0.0',\n authorName: template.metadata?.author?.name || '',\n authorEmail: template.metadata?.author?.email || '',\n organization: template.metadata?.author?.organization || '',\n example: template.example || ''\n });\n\n this.previewNodes = template.nodes;\n }\n }\n\n private setupPreviewNodes(): void {\n if (this.data.mode === 'create' && this.data.selectedNodes) {\n this.previewNodes = this.data.selectedNodes;\n }\n }\n\n private detectTemplateVariables(): void {\n // Detect template variables like {{fieldName}} in node configurations\n const variables = new Set<string>();\n \n this.previewNodes.forEach(node => {\n const configStr = JSON.stringify(node.config);\n const matches = configStr.match(/\\{\\{([^}]+)\\}\\}/g);\n \n if (matches) {\n matches.forEach(match => {\n const variable = match.slice(2, -2).trim();\n variables.add(variable);\n });\n }\n });\n\n this.detectedVariables = Array.from(variables);\n }\n\n // Template methods\n addTag(event: MatChipInputEvent): void {\n const value = (event.value || '').trim();\n \n if (value && !this.tags.includes(value)) {\n this.tags.push(value);\n }\n\n event.chipInput!.clear();\n }\n\n removeTag(tag: string): void {\n const index = this.tags.indexOf(tag);\n if (index >= 0) {\n this.tags.splice(index, 1);\n }\n }\n\n addRequiredField(event: MatChipInputEvent): void {\n const value = (event.value || '').trim();\n \n if (value && !this.requiredFields.includes(value)) {\n this.requiredFields.push(value);\n }\n\n event.chipInput!.clear();\n }\n\n removeRequiredField(field: string): void {\n const index = this.requiredFields.indexOf(field);\n if (index >= 0) {\n this.requiredFields.splice(index, 1);\n }\n }\n\n isRootNode(node: RuleNode): boolean {\n if (this.data.mode === 'edit' && this.data.template) {\n return this.data.template.rootNodes.includes(node.id);\n }\n // For create mode, assume all selected nodes are potential root nodes\n return true;\n }\n\n getNodeIcon(node: RuleNode): string {\n const icons: Record<string, string> = {\n 'fieldCondition': 'compare_arrows',\n 'andGroup': 'join_inner',\n 'orGroup': 'join_full',\n 'notGroup': 'block',\n 'requiredIf': 'star_border',\n 'visibleIf': 'visibility',\n 'forEach': 'repeat',\n 'uniqueBy': 'fingerprint'\n };\n \n return icons[node.type] || 'rule';\n }\n\n canSave(): boolean {\n return this.basicInfoForm.valid && \n this.rulesForm.valid && \n this.advancedForm.valid &&\n this.previewNodes.length > 0;\n }\n\n canPreview(): boolean {\n return this.basicInfoForm.valid && this.previewNodes.length > 0;\n }\n\n saveTemplate(): void {\n if (!this.canSave()) {\n return;\n }\n\n const basicInfo = this.basicInfoForm.value;\n const advancedInfo = this.advancedForm.value;\n\n const templateData: Partial<RuleTemplate> = {\n name: basicInfo.name,\n description: basicInfo.description,\n category: basicInfo.category,\n tags: this.tags,\n nodes: this.previewNodes,\n rootNodes: this.previewNodes.map(n => n.id), // Simplified for demo\n requiredFields: this.requiredFields,\n icon: advancedInfo.icon,\n example: advancedInfo.example,\n metadata: {\n version: advancedInfo.version,\n author: {\n name: advancedInfo.authorName,\n email: advancedInfo.authorEmail,\n organization: advancedInfo.organization\n },\n complexity: this.calculateComplexity(),\n metrics: {\n nodeCount: this.previewNodes.length\n }\n }\n };\n\n if (this.data.mode === 'create') {\n this.templateService.createTemplate(\n templateData.name!,\n templateData.description!,\n templateData.category!,\n templateData.nodes!,\n templateData.rootNodes!,\n templateData.tags,\n templateData.requiredFields\n ).subscribe({\n next: (template) => {\n // Update with additional metadata\n this.templateService.updateTemplate(template.id, {\n icon: templateData.icon,\n example: templateData.example,\n metadata: templateData.metadata\n }).subscribe({\n next: (updatedTemplate) => {\n this.dialogRef.close({\n action: 'save',\n template: updatedTemplate\n } as TemplateEditorResult);\n }\n });\n },\n error: (error) => {\n this.snackBar.open(`Failed to create template: ${error.message}`, 'Close', {\n duration: 5000\n });\n }\n });\n } else if (this.data.template) {\n this.templateService.updateTemplate(this.data.template.id, templateData).subscribe({\n next: (template) => {\n this.dialogRef.close({\n action: 'save',\n template\n } as TemplateEditorResult);\n },\n error: (error) => {\n this.snackBar.open(`Failed to update template: ${error.message}`, 'Close', {\n duration: 5000\n });\n }\n });\n }\n }\n\n previewTemplate(): void {\n // Implementation would show template preview\n this.snackBar.open('Template preview would be shown here', 'Close', {\n duration: 3000\n });\n }\n\n deleteTemplate(): void {\n if (this.data.mode === 'edit' && this.data.template) {\n const confirmMessage = `Are you sure you want to delete the template \"${this.data.template.name}\"?`;\n \n if (confirm(confirmMessage)) {\n this.templateService.deleteTemplate(this.data.template.id).subscribe({\n next: () => {\n this.dialogRef.close({\n action: 'save',\n template: undefined\n } as TemplateEditorResult);\n },\n error: (error) => {\n this.snackBar.open(`Failed to delete template: ${error.message}`, 'Close', {\n duration: 5000\n });\n }\n });\n }\n }\n }\n\n cancel(): void {\n this.dialogRef.close({\n action: 'cancel'\n } as TemplateEditorResult);\n }\n\n private calculateComplexity(): 'simple' | 'medium' | 'complex' {\n const nodeCount = this.previewNodes.length;\n if (nodeCount <= 2) return 'simple';\n if (nodeCount <= 5) return 'medium';\n return 'complex';\n }\n}","import { Component, Inject, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n MatDialogModule,\n MatDialogRef,\n MAT_DIALOG_DATA,\n} from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { PraxisIconDirective } from '@praxisui/core';\n\nimport { RuleTemplate, RuleNode } from '../models/rule-builder.model';\n\nexport interface TemplatePreviewDialogData {\n template: RuleTemplate;\n}\n\n@Component({\n selector: 'praxis-template-preview-dialog',\n standalone: true,\n imports: [\n CommonModule,\n MatDialogModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n MatChipsModule,\n MatDividerModule,\n MatCardModule,\n MatExpansionModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"template-preview-dialog\">\n <div mat-dialog-title class=\"dialog-title\">\n <div class=\"title-content\">\n <mat-icon [praxisIcon]=\"data.template.icon || 'rule'\"></mat-icon>\n <div class=\"title-text\">\n <h2>{{ data.template.name }}</h2>\n <p class=\"template-category\">{{ data.template.category }}</p>\n </div>\n </div>\n <div class=\"title-actions\">\n <mat-chip\n class=\"complexity-chip\"\n [class]=\"\n 'complexity-' + (data.template.metadata?.complexity || 'unknown')\n \"\n >\n {{ data.template.metadata?.complexity || 'unknown' }}\n </mat-chip>\n </div>\n </div>\n\n <div mat-dialog-content class=\"dialog-content\">\n <!-- Template Description -->\n <div class=\"template-info\">\n <h3>Description</h3>\n <p class=\"template-description\">{{ data.template.description }}</p>\n\n <div class=\"template-tags\" *ngIf=\"data.template.tags.length > 0\">\n <h4>Tags</h4>\n <mat-chip-set>\n <mat-chip *ngFor=\"let tag of data.template.tags\" class=\"tag-chip\">\n {{ tag }}\n </mat-chip>\n </mat-chip-set>\n </div>\n </div>\n\n <mat-divider></mat-divider>\n\n <!-- Template Metadata -->\n <div class=\"template-metadata\">\n <h3>Template Information</h3>\n <div class=\"metadata-grid\">\n <div class=\"metadata-item\" *ngIf=\"data.template.metadata?.version\">\n <mat-icon [praxisIcon]=\"'info'\"></mat-icon>\n <span class=\"label\">Version:</span>\n <span class=\"value\">{{ data.template.metadata?.version }}</span>\n </div>\n <div\n class=\"metadata-item\"\n *ngIf=\"data.template.metadata?.usageCount\"\n >\n <mat-icon [praxisIcon]=\"'trending_up'\"></mat-icon>\n <span class=\"label\">Usage Count:</span>\n <span class=\"value\">{{\n data.template.metadata?.usageCount\n }}</span>\n </div>\n <div\n class=\"metadata-item\"\n *ngIf=\"data.template.metadata?.createdAt\"\n >\n <mat-icon [praxisIcon]=\"'schedule'\"></mat-icon>\n <span class=\"label\">Created:</span>\n <span class=\"value\">{{\n formatDate(data.template.metadata?.createdAt)\n }}</span>\n </div>\n <div\n class=\"metadata-item\"\n *ngIf=\"data.template.metadata?.updatedAt\"\n >\n <mat-icon [praxisIcon]=\"'update'\"></mat-icon>\n <span class=\"label\">Updated:</span>\n <span class=\"value\">{{\n formatDate(data.template.metadata?.updatedAt)\n }}</span>\n </div>\n <div\n class=\"metadata-item\"\n *ngIf=\"data.template.metadata?.author?.name\"\n >\n <mat-icon [praxisIcon]=\"'person'\"></mat-icon>\n <span class=\"label\">Author:</span>\n <span class=\"value\">{{\n data.template.metadata?.author?.name\n }}</span>\n </div>\n <div class=\"metadata-item\">\n <mat-icon [praxisIcon]=\"'account_tree'\"></mat-icon>\n <span class=\"label\">Nodes:</span>\n <span class=\"value\">{{ data.template.nodes.length }}</span>\n </div>\n </div>\n </div>\n\n <mat-divider></mat-divider>\n\n <!-- Rule Structure Preview -->\n <div class=\"rule-structure\">\n <h3>Rule Structure</h3>\n <div class=\"structure-container\">\n <mat-expansion-panel\n *ngFor=\"let rootNodeId of data.template.rootNodes; let i = index\"\n [expanded]=\"i === 0\"\n class=\"root-node-panel\"\n >\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon>{{\n getNodeIcon(getRootNode(rootNodeId))\n }}</mat-icon>\n <span>{{\n getRootNode(rootNodeId)?.label ||\n getRootNode(rootNodeId)?.type ||\n 'Unknown Node'\n }}</span>\n </mat-panel-title>\n <mat-panel-description>\n {{ getNodeDescription(getRootNode(rootNodeId)) }}\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div class=\"node-details\">\n <div class=\"node-tree\">\n <div\n class=\"tree-node\"\n *ngFor=\"let node of getNodeHierarchy(rootNodeId)\"\n [style.margin-left.px]=\"node.level * 20\"\n >\n <div class=\"node-content\">\n <mat-icon class=\"node-icon\">{{\n getNodeIcon(node.node)\n }}</mat-icon>\n <span class=\"node-label\">{{\n node.node.label || node.node.type\n }}</span>\n <mat-chip class=\"node-type-chip\" size=\"small\">{{\n node.node.type\n }}</mat-chip>\n </div>\n <div class=\"node-config\" *ngIf=\"node.node.config\">\n <pre class=\"config-preview\">{{\n formatConfig(node.node.config)\n }}</pre>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </div>\n </div>\n\n <!-- Required Fields -->\n <div\n class=\"required-fields\"\n *ngIf=\"\n data.template.requiredFields &&\n data.template.requiredFields.length > 0\n \"\n >\n <mat-divider></mat-divider>\n <h3>Required Fields</h3>\n <mat-chip-set>\n <mat-chip\n *ngFor=\"let field of data.template.requiredFields\"\n color=\"accent\"\n class=\"required-field-chip\"\n >\n {{ field }}\n </mat-chip>\n </mat-chip-set>\n <p class=\"fields-note\">\n These fields must be available in your form schema for the template\n to work correctly.\n </p>\n </div>\n\n <!-- Example Usage -->\n <div class=\"example-usage\" *ngIf=\"data.template.example\">\n <mat-divider></mat-divider>\n <h3>Example Usage</h3>\n <div class=\"example-content\">\n <pre class=\"example-code\">{{ data.template.example }}</pre>\n </div>\n </div>\n </div>\n\n <div mat-dialog-actions class=\"dialog-actions\">\n <button mat-button (click)=\"cancel()\">Close</button>\n\n <div class=\"actions-spacer\"></div>\n\n <button mat-stroked-button color=\"primary\" (click)=\"exportTemplate()\">\n <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n Export\n </button>\n\n <button mat-flat-button color=\"primary\" (click)=\"applyTemplate()\">\n <mat-icon [praxisIcon]=\"'play_arrow'\"></mat-icon>\n Apply Template\n </button>\n </div>\n </div>\n `,\n styles: [\n `\n .template-preview-dialog {\n min-width: 500px;\n max-width: 700px;\n }\n\n .dialog-title {\n padding: 24px 24px 0;\n margin: 0;\n }\n\n .title-content {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n }\n\n .title-content mat-icon {\n font-size: 32px;\n width: 32px;\n height: 32px;\n color: var(--mdc-theme-primary);\n }\n\n .title-text h2 {\n margin: 0;\n font-size: 24px;\n font-weight: 500;\n }\n\n .template-category {\n margin: 4px 0 0 0;\n font-size: 14px;\n color: var(--mdc-theme-on-surface-variant);\n text-transform: capitalize;\n }\n\n .title-actions {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 16px;\n }\n\n .complexity-chip {\n font-size: 11px;\n }\n\n .complexity-simple {\n background: var(--mdc-theme-tertiary-container);\n color: var(--mdc-theme-on-tertiary-container);\n }\n\n .complexity-medium {\n background: var(--mdc-theme-secondary-container);\n color: var(--mdc-theme-on-secondary-container);\n }\n\n .complexity-complex {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n }\n\n .dialog-content {\n padding: 16px 24px;\n max-height: 70vh;\n overflow-y: auto;\n }\n\n .template-info h3,\n .template-metadata h3,\n .rule-structure h3,\n .required-fields h3,\n .example-usage h3 {\n margin: 0 0 12px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mdc-theme-primary);\n }\n\n .template-description {\n margin: 0 0 16px 0;\n line-height: 1.5;\n }\n\n .template-tags h4 {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 500;\n }\n\n .tag-chip {\n margin-right: 4px;\n margin-bottom: 4px;\n }\n\n .metadata-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 16px;\n }\n\n .metadata-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n background: var(--mdc-theme-surface-variant);\n border-radius: 8px;\n }\n\n .metadata-item mat-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n color: var(--mdc-theme-primary);\n }\n\n .metadata-item .label {\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .metadata-item .value {\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .structure-container {\n margin-top: 8px;\n }\n\n .root-node-panel {\n margin-bottom: 8px;\n }\n\n .node-details {\n padding: 0 16px 16px;\n }\n\n .tree-node {\n margin-bottom: 8px;\n padding: 8px;\n border-left: 2px solid var(--mdc-theme-outline);\n background: var(--mdc-theme-surface-variant);\n border-radius: 4px;\n }\n\n .node-content {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .node-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n color: var(--mdc-theme-primary);\n }\n\n .node-label {\n flex: 1;\n font-weight: 500;\n }\n\n .node-type-chip {\n font-size: 10px;\n height: 20px;\n line-height: 20px;\n }\n\n .node-config {\n margin-top: 4px;\n }\n\n .config-preview {\n font-size: 11px;\n margin: 0;\n padding: 4px 8px;\n background: var(--mdc-theme-surface);\n border-radius: 4px;\n border: 1px solid var(--mdc-theme-outline);\n overflow-x: auto;\n }\n\n .required-field-chip {\n margin-right: 4px;\n margin-bottom: 4px;\n }\n\n .fields-note {\n margin: 12px 0 0 0;\n font-size: 13px;\n color: var(--mdc-theme-on-surface-variant);\n font-style: italic;\n }\n\n .example-content {\n background: var(--mdc-theme-surface-variant);\n border-radius: 8px;\n padding: 16px;\n }\n\n .example-code {\n margin: 0;\n font-family: 'Courier New', monospace;\n font-size: 12px;\n line-height: 1.4;\n overflow-x: auto;\n }\n\n .dialog-actions {\n padding: 16px 24px;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .actions-spacer {\n flex: 1;\n }\n\n mat-divider {\n margin: 16px 0;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .template-preview-dialog {\n min-width: 320px;\n max-width: 95vw;\n }\n\n .metadata-grid {\n grid-template-columns: 1fr;\n }\n\n .title-content {\n flex-direction: column;\n align-items: flex-start;\n }\n }\n `,\n ],\n})\nexport class TemplatePreviewDialogComponent {\n constructor(\n private dialogRef: MatDialogRef<TemplatePreviewDialogComponent>,\n @Inject(MAT_DIALOG_DATA) public data: TemplatePreviewDialogData,\n ) {}\n\n getRootNode(nodeId: string): RuleNode | undefined {\n return this.data.template.nodes.find((n) => n.id === nodeId);\n }\n\n getNodeHierarchy(rootNodeId: string): { node: RuleNode; level: number }[] {\n const result: { node: RuleNode; level: number }[] = [];\n const visited = new Set<string>();\n\n const traverse = (nodeId: string, level: number) => {\n if (visited.has(nodeId)) return;\n visited.add(nodeId);\n\n const node = this.data.template.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n result.push({ node, level });\n\n // Traverse children\n if (node.children) {\n node.children.forEach((childId) => {\n if (typeof childId === 'string') {\n traverse(childId, level + 1);\n }\n });\n }\n };\n\n traverse(rootNodeId, 0);\n return result;\n }\n\n getNodeIcon(node?: RuleNode): string {\n if (!node) return 'help';\n\n const icons: Record<string, string> = {\n fieldCondition: 'compare_arrows',\n andGroup: 'join_inner',\n orGroup: 'join_full',\n notGroup: 'block',\n requiredIf: 'star_border',\n visibleIf: 'visibility',\n disabledIf: 'disabled_by_default',\n readonlyIf: 'lock',\n forEach: 'repeat',\n uniqueBy: 'fingerprint',\n minLength: 'expand_less',\n maxLength: 'expand_more',\n functionCall: 'functions',\n fieldToField: 'compare',\n custom: 'extension',\n };\n\n return icons[node.type] || 'rule';\n }\n\n getNodeDescription(node?: RuleNode): string {\n if (!node) return '';\n\n switch (node.type) {\n case 'fieldCondition':\n return 'Field validation rule';\n case 'andGroup':\n return 'All conditions must be true';\n case 'orGroup':\n return 'At least one condition must be true';\n case 'notGroup':\n return 'Condition must be false';\n case 'requiredIf':\n return 'Field becomes required when condition is met';\n case 'visibleIf':\n return 'Field becomes visible when condition is met';\n case 'disabledIf':\n return 'Field becomes disabled when condition is met';\n case 'readonlyIf':\n return 'Field becomes readonly when condition is met';\n case 'forEach':\n return 'Apply validation to each array item';\n case 'uniqueBy':\n return 'Ensure array items are unique by specified fields';\n case 'minLength':\n return 'Array must have minimum number of items';\n case 'maxLength':\n return 'Array must not exceed maximum items';\n default:\n return node.label || 'Custom rule';\n }\n }\n\n formatConfig(config: any): string {\n try {\n // Create a simplified version for display\n const simplified = { ...config };\n\n // Remove verbose properties for cleaner display\n delete simplified.type;\n if (simplified.metadata) {\n delete simplified.metadata;\n }\n\n return JSON.stringify(simplified, null, 2);\n } catch {\n return 'Invalid configuration';\n }\n }\n\n formatDate(date?: Date | string): string {\n if (!date) {\n return 'Unknown';\n }\n\n try {\n return new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date(date));\n } catch {\n return 'Invalid date';\n }\n }\n\n applyTemplate(): void {\n this.dialogRef.close('apply');\n }\n\n exportTemplate(): void {\n this.dialogRef.close('export');\n }\n\n cancel(): void {\n this.dialogRef.close();\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n FormControl,\n FormsModule,\n} from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatDialogModule, MatDialog } from '@angular/material/dialog';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { PraxisIconDirective } from '@praxisui/core';\n\nimport { Subject, Observable, BehaviorSubject, combineLatest } from 'rxjs';\nimport {\n takeUntil,\n debounceTime,\n distinctUntilChanged,\n startWith,\n map,\n} from 'rxjs/operators';\n\nimport {\n RuleTemplate,\n TemplateMetadata,\n RuleNode,\n} from '../models/rule-builder.model';\nimport {\n RuleTemplateService,\n TemplateCategory,\n TemplateSearchCriteria,\n TemplateStats,\n} from '../services/rule-template.service';\nimport {\n TemplateEditorDialogComponent,\n TemplateEditorDialogData,\n TemplateEditorResult,\n} from './template-editor-dialog.component';\nimport { TemplatePreviewDialogComponent } from './template-preview-dialog.component';\n\n/**\n * Template display mode\n */\nexport type TemplateDisplayMode = 'grid' | 'list' | 'compact';\n\n/**\n * Template sort option\n */\nexport interface TemplateSortOption {\n field: keyof RuleTemplate | keyof TemplateMetadata;\n direction: 'asc' | 'desc';\n label: string;\n}\n\n@Component({\n selector: 'praxis-template-gallery',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n MatCardModule,\n MatButtonModule,\n MatIconModule,\n MatInputModule,\n MatSelectModule,\n MatChipsModule,\n MatTooltipModule,\n MatTabsModule,\n MatDialogModule,\n MatSnackBarModule,\n MatMenuModule,\n MatBadgeModule,\n MatProgressSpinnerModule,\n MatExpansionModule,\n MatDividerModule,\n MatSlideToggleModule,\n PraxisIconDirective,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"template-gallery\">\n <!-- Header Section -->\n <div class=\"gallery-header\">\n <div class=\"header-content\">\n <div class=\"title-section\">\n <h2 class=\"gallery-title\">\n <mat-icon [praxisIcon]=\"'widgets'\"></mat-icon>\n Rule Templates\n </h2>\n <p class=\"gallery-subtitle\">\n Reusable rule patterns for faster development\n </p>\n </div>\n\n <div class=\"header-actions\">\n <button\n mat-stroked-button\n color=\"primary\"\n (click)=\"showCreateTemplateDialog()\"\n matTooltip=\"Create new template\"\n >\n <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n Create Template\n </button>\n\n <button\n mat-stroked-button\n (click)=\"importTemplate()\"\n matTooltip=\"Import template from file\"\n >\n <mat-icon [praxisIcon]=\"'upload'\"></mat-icon>\n Import\n </button>\n\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"viewMenu\"\n matTooltip=\"View options\"\n >\n <mat-icon [praxisIcon]=\"'view_module'\"></mat-icon>\n </button>\n\n <mat-menu #viewMenu=\"matMenu\">\n <button mat-menu-item (click)=\"setDisplayMode('grid')\">\n <mat-icon [praxisIcon]=\"'view_module'\"></mat-icon>\n Grid View\n </button>\n <button mat-menu-item (click)=\"setDisplayMode('list')\">\n <mat-icon [praxisIcon]=\"'view_list'\"></mat-icon>\n List View\n </button>\n <button mat-menu-item (click)=\"setDisplayMode('compact')\">\n <mat-icon [praxisIcon]=\"'view_compact'\"></mat-icon>\n Compact View\n </button>\n </mat-menu>\n </div>\n </div>\n\n <!-- Statistics Bar -->\n <div class=\"stats-bar\" *ngIf=\"stats$ | async as stats\">\n <div class=\"stat-item\">\n <mat-icon [praxisIcon]=\"'widgets'\"></mat-icon>\n <span>{{ stats.totalTemplates }} Templates</span>\n </div>\n <div class=\"stat-item\">\n <mat-icon>folder</mat-icon>\n <span>{{ stats.categoriesCount }} Categories</span>\n </div>\n <div class=\"stat-item\" *ngIf=\"stats.mostUsedTemplate\">\n <mat-icon>trending_up</mat-icon>\n <span>Most Used: {{ stats.mostUsedTemplate.name }}</span>\n </div>\n </div>\n </div>\n\n <!-- Search and Filters -->\n <div class=\"search-section\">\n <form [formGroup]=\"searchForm\" class=\"search-form\">\n <div class=\"search-row\">\n <mat-form-field appearance=\"outline\" class=\"search-input\">\n <mat-label>Search templates...</mat-label>\n <input\n matInput\n formControlName=\"query\"\n placeholder=\"Name, description, or tags\"\n />\n <mat-icon matSuffix>search</mat-icon>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"category-select\">\n <mat-label>Category</mat-label>\n <mat-select formControlName=\"category\">\n <mat-option value=\"\">All Categories</mat-option>\n <mat-option\n *ngFor=\"let category of categories$ | async\"\n [value]=\"category.id\"\n >\n <div class=\"category-option\">\n <mat-icon>{{ category.icon }}</mat-icon>\n <span>{{ category.name }}</span>\n <span\n [matBadge]=\"category.templates.length || 0\"\n matBadgeColor=\"primary\"\n matBadgeSize=\"small\"\n ></span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"complexity-select\">\n <mat-label>Complexity</mat-label>\n <mat-select formControlName=\"complexity\">\n <mat-option value=\"\">Any Complexity</mat-option>\n <mat-option value=\"simple\">Simple</mat-option>\n <mat-option value=\"medium\">Medium</mat-option>\n <mat-option value=\"complex\">Complex</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"sort-select\">\n <mat-label>Sort by</mat-label>\n <mat-select formControlName=\"sortBy\">\n <mat-option value=\"name\">Name</mat-option>\n <mat-option value=\"usageCount\">Usage Count</mat-option>\n <mat-option value=\"createdAt\">Created Date</mat-option>\n <mat-option value=\"updatedAt\">Updated Date</mat-option>\n <mat-option value=\"complexity\">Complexity</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Tags Filter -->\n <div class=\"tags-section\" *ngIf=\"popularTags.length > 0\">\n <span class=\"tags-label\">Popular tags:</span>\n <mat-chip-listbox class=\"tags-list\">\n <mat-chip-option\n *ngFor=\"let tag of popularTags\"\n [selected]=\"selectedTags.has(tag)\"\n (click)=\"toggleTag(tag)\"\n >\n {{ tag }}\n </mat-chip-option>\n </mat-chip-listbox>\n </div>\n\n <!-- Active Filters -->\n <div class=\"active-filters\" *ngIf=\"hasActiveFilters()\">\n <span class=\"filters-label\">Active filters:</span>\n <mat-chip-set class=\"filter-chips\">\n <mat-chip\n *ngIf=\"searchForm.get('category')?.value\"\n (removed)=\"clearFilter('category')\"\n >\n Category:\n {{ getCategoryName(searchForm.get('category')?.value || '') }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n <mat-chip\n *ngIf=\"searchForm.get('complexity')?.value\"\n (removed)=\"clearFilter('complexity')\"\n >\n Complexity: {{ searchForm.get('complexity')?.value || '' }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n <mat-chip\n *ngFor=\"let tag of Array.from(selectedTags)\"\n (removed)=\"toggleTag(tag)\"\n >\n {{ tag }}\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-set>\n <button\n mat-button\n color=\"warn\"\n class=\"clear-all-button\"\n (click)=\"clearAllFilters()\"\n >\n Clear All\n </button>\n </div>\n </form>\n </div>\n\n <!-- Recently Used Section -->\n <div\n class=\"recently-used-section\"\n *ngIf=\"recentlyUsed$ | async as recentTemplates\"\n >\n <div *ngIf=\"recentTemplates.length > 0\">\n <h3 class=\"section-title\">\n <mat-icon>history</mat-icon>\n Recently Used\n </h3>\n <div class=\"recent-templates\">\n <div\n *ngFor=\"let template of recentTemplates.slice(0, 5)\"\n class=\"recent-template-item\"\n >\n <button\n mat-stroked-button\n class=\"recent-template-button\"\n (click)=\"applyTemplate(template)\"\n [matTooltip]=\"template.description\"\n >\n <mat-icon>{{ template.icon || 'rule' }}</mat-icon>\n <span>{{ template.name }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Templates Grid/List -->\n <div class=\"templates-section\">\n <div class=\"templates-header\">\n <h3 class=\"section-title\">\n <mat-icon>library_books</mat-icon>\n Templates\n <span class=\"template-count\"\n >({{ (filteredTemplates$ | async)?.length || 0 }})</span\n >\n </h3>\n\n <div class=\"view-toggle\">\n <mat-slide-toggle [(ngModel)]=\"showPreview\">\n Show Preview\n </mat-slide-toggle>\n </div>\n </div>\n\n <div\n class=\"templates-container\"\n [class.grid-view]=\"displayMode === 'grid'\"\n [class.list-view]=\"displayMode === 'list'\"\n [class.compact-view]=\"displayMode === 'compact'\"\n >\n <div\n *ngFor=\"\n let template of filteredTemplates$ | async;\n trackBy: trackByTemplateId\n \"\n class=\"template-card\"\n >\n <!-- Grid View Template Card -->\n <mat-card *ngIf=\"displayMode === 'grid'\" class=\"template-grid-card\">\n <mat-card-header>\n <div mat-card-avatar class=\"template-icon\">\n <mat-icon>{{ template.icon || 'rule' }}</mat-icon>\n </div>\n <mat-card-title>{{ template.name }}</mat-card-title>\n <mat-card-subtitle>{{ template.category }}</mat-card-subtitle>\n\n <div class=\"card-actions\">\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"templateMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n\n <mat-menu #templateMenu=\"matMenu\">\n <button mat-menu-item (click)=\"applyTemplate(template)\">\n <mat-icon>play_arrow</mat-icon>\n Apply Template\n </button>\n <button mat-menu-item (click)=\"previewTemplate(template)\">\n <mat-icon>preview</mat-icon>\n Preview\n </button>\n <button mat-menu-item (click)=\"editTemplate(template)\">\n <mat-icon>edit</mat-icon>\n Edit\n </button>\n <button mat-menu-item (click)=\"duplicateTemplate(template)\">\n <mat-icon>content_copy</mat-icon>\n Duplicate\n </button>\n <button mat-menu-item (click)=\"exportTemplate(template)\">\n <mat-icon>download</mat-icon>\n Export\n </button>\n <mat-divider></mat-divider>\n <button\n mat-menu-item\n color=\"warn\"\n (click)=\"deleteTemplate(template)\"\n >\n <mat-icon>delete</mat-icon>\n Delete\n </button>\n </mat-menu>\n </div>\n </mat-card-header>\n\n <mat-card-content>\n <p class=\"template-description\">{{ template.description }}</p>\n\n <div class=\"template-tags\">\n <mat-chip-set>\n <mat-chip\n *ngFor=\"let tag of template.tags.slice(0, 3)\"\n class=\"template-tag\"\n >\n {{ tag }}\n </mat-chip>\n <mat-chip\n *ngIf=\"template.tags.length > 3\"\n class=\"more-tags\"\n >\n +{{ template.tags.length - 3 }}\n </mat-chip>\n </mat-chip-set>\n </div>\n\n <div class=\"template-metadata\">\n <div class=\"metadata-item\">\n <mat-icon>complexity</mat-icon>\n <span>{{\n template.metadata?.complexity || 'unknown'\n }}</span>\n </div>\n <div\n class=\"metadata-item\"\n *ngIf=\"template.metadata?.usageCount\"\n >\n <mat-icon>trending_up</mat-icon>\n <span>{{ template.metadata?.usageCount }} uses</span>\n </div>\n <div class=\"metadata-item\">\n <mat-icon>schedule</mat-icon>\n <span>{{\n getRelativeDate(template.metadata?.updatedAt)\n }}</span>\n </div>\n </div>\n\n <!-- Template Preview -->\n <div class=\"template-preview\" *ngIf=\"showPreview\">\n <div class=\"preview-header\">\n <mat-icon>preview</mat-icon>\n <span>Structure Preview</span>\n </div>\n <div class=\"preview-content\">\n <div class=\"node-tree\">\n <div\n *ngFor=\"let nodeId of template.rootNodes\"\n class=\"root-node\"\n >\n {{ getNodeLabel(template, nodeId) }}\n </div>\n </div>\n </div>\n </div>\n </mat-card-content>\n\n <mat-card-actions align=\"end\">\n <button\n mat-button\n color=\"primary\"\n (click)=\"applyTemplate(template)\"\n >\n <mat-icon>play_arrow</mat-icon>\n Apply\n </button>\n <button mat-button (click)=\"previewTemplate(template)\">\n <mat-icon>preview</mat-icon>\n Preview\n </button>\n </mat-card-actions>\n </mat-card>\n\n <!-- List View Template Card -->\n <mat-card *ngIf=\"displayMode === 'list'\" class=\"template-list-card\">\n <div class=\"list-card-content\">\n <div class=\"template-info\">\n <div class=\"template-header\">\n <mat-icon class=\"template-icon\">{{\n template.icon || 'rule'\n }}</mat-icon>\n <div class=\"template-details\">\n <h4 class=\"template-name\">{{ template.name }}</h4>\n <p class=\"template-description\">\n {{ template.description }}\n </p>\n </div>\n </div>\n\n <div class=\"template-meta\">\n <span class=\"category-badge\">{{ template.category }}</span>\n <span\n class=\"complexity-badge\"\n [class]=\"\n 'complexity-' +\n (template.metadata?.complexity || 'unknown')\n \"\n >\n {{ template.metadata?.complexity || 'unknown' }}\n </span>\n <span\n class=\"usage-count\"\n *ngIf=\"template.metadata?.usageCount\"\n >\n {{ template.metadata?.usageCount }} uses\n </span>\n </div>\n </div>\n\n <div class=\"template-actions\">\n <button\n mat-flat-button\n color=\"primary\"\n (click)=\"applyTemplate(template)\"\n >\n Apply\n </button>\n <button\n mat-stroked-button\n (click)=\"previewTemplate(template)\"\n >\n Preview\n </button>\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"listTemplateMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n\n <mat-menu #listTemplateMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editTemplate(template)\">\n <mat-icon>edit</mat-icon>\n Edit\n </button>\n <button mat-menu-item (click)=\"duplicateTemplate(template)\">\n <mat-icon>content_copy</mat-icon>\n Duplicate\n </button>\n <button mat-menu-item (click)=\"exportTemplate(template)\">\n <mat-icon>download</mat-icon>\n Export\n </button>\n <button mat-menu-item (click)=\"deleteTemplate(template)\">\n <mat-icon>delete</mat-icon>\n Delete\n </button>\n </mat-menu>\n </div>\n </div>\n </mat-card>\n\n <!-- Compact View Template Card -->\n <div\n *ngIf=\"displayMode === 'compact'\"\n class=\"template-compact-card\"\n >\n <div class=\"compact-content\">\n <mat-icon class=\"compact-icon\">{{\n template.icon || 'rule'\n }}</mat-icon>\n <div class=\"compact-info\">\n <span class=\"compact-name\">{{ template.name }}</span>\n <span class=\"compact-category\">{{ template.category }}</span>\n </div>\n <div class=\"compact-actions\">\n <button\n mat-icon-button\n (click)=\"applyTemplate(template)\"\n matTooltip=\"Apply template\"\n >\n <mat-icon>play_arrow</mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"previewTemplate(template)\"\n matTooltip=\"Preview template\"\n >\n <mat-icon>preview</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Empty State -->\n <div\n *ngIf=\"(filteredTemplates$ | async)?.length === 0\"\n class=\"empty-state\"\n >\n <mat-icon class=\"empty-icon\">widgets</mat-icon>\n <h3>No templates found</h3>\n <p>Try adjusting your search criteria or create a new template.</p>\n <button mat-flat-button color=\"primary\" (click)=\"clearAllFilters()\">\n Clear Filters\n </button>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n /* Bridge MD tokens to Material/Sicoob when missing */\n --mdc-theme-background: var(--md-sys-color-background, var(--sicoob-bg-high));\n --mdc-theme-surface: var(--md-sys-color-surface, var(--sicoob-bg-elev-1));\n --mdc-theme-surface-variant: var(--md-sys-color-surface-container, var(--sicoob-bg-elev-2));\n --mdc-theme-primary: var(--md-sys-color-primary, var(--sicoob-primary-default));\n --mdc-theme-on-primary: var(--md-sys-color-on-primary, #ffffff);\n --mdc-theme-primary-container: var(--md-sys-color-primary-container, color-mix(in srgb, var(--mdc-theme-primary), transparent 85%));\n --mdc-theme-on-primary-container: var(--md-sys-color-on-primary-container, var(--mdc-theme-primary));\n --mdc-theme-secondary-container: var(--md-sys-color-secondary-container, color-mix(in srgb, var(--mdc-theme-primary), transparent 90%));\n --mdc-theme-on-secondary-container: var(--md-sys-color-on-secondary-container, var(--mdc-theme-on-surface));\n --mdc-theme-tertiary-container: var(--md-sys-color-tertiary-container, color-mix(in srgb, var(--mdc-theme-primary), transparent 88%));\n --mdc-theme-on-tertiary-container: var(--md-sys-color-on-tertiary-container, var(--mdc-theme-on-surface));\n --mdc-theme-outline: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));\n --mdc-theme-on-surface: var(--md-sys-color-on-surface, var(--sicoob-text-high));\n --mdc-theme-on-surface-variant: var(--md-sys-color-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n --mdc-theme-error: var(--md-sys-color-error, var(--sicoob-error-default));\n --mdc-theme-error-container: var(--md-sys-color-error-container, color-mix(in srgb, var(--mdc-theme-error), transparent 85%));\n --mdc-theme-warning-container: color-mix(in srgb, var(--mdc-theme-primary), transparent 80%);\n --mdc-theme-on-warning-container: var(--mdc-theme-on-surface);\n --mdc-theme-info-container: color-mix(in srgb, var(--mdc-theme-primary), transparent 85%);\n --mdc-theme-on-info-container: var(--mdc-theme-primary);\n /* Shadow colors bridged to host theme */\n --vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,0.08));\n --vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,0.18));\n --vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,0.32));\n }\n .template-gallery {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mdc-theme-background);\n }\n\n .gallery-header {\n background: var(--mdc-theme-surface);\n border-bottom: 1px solid var(--mdc-theme-outline);\n padding: 16px 24px;\n }\n\n .header-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .title-section {\n flex: 1;\n }\n\n .gallery-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 24px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .gallery-subtitle {\n margin: 4px 0 0 32px;\n color: var(--mdc-theme-on-surface-variant);\n font-size: 14px;\n }\n\n .header-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n\n .stats-bar {\n display: flex;\n gap: 24px;\n padding: 12px 0;\n border-top: 1px solid var(--mdc-theme-outline);\n }\n\n .stat-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .stat-item mat-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n\n .search-section {\n padding: 16px 24px;\n background: var(--mdc-theme-surface-variant);\n border-bottom: 1px solid var(--mdc-theme-outline);\n }\n\n .search-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .search-row {\n display: flex;\n gap: 16px;\n align-items: flex-start;\n }\n\n .search-input {\n flex: 2;\n min-width: 300px;\n }\n\n .category-select,\n .complexity-select,\n .sort-select {\n flex: 1;\n min-width: 150px;\n }\n\n .category-option {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n }\n\n .tags-section {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .tags-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .tags-list {\n flex: 1;\n }\n\n .active-filters {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n padding: 8px 0;\n border-top: 1px solid var(--mdc-theme-outline);\n }\n\n .filters-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .filter-chips {\n flex: 1;\n }\n\n .clear-all-button {\n font-size: 12px;\n }\n\n .recently-used-section {\n padding: 16px 24px;\n }\n\n .section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 16px;\n font-weight: 500;\n color: var(--mdc-theme-on-surface);\n }\n\n .template-count {\n font-size: 14px;\n font-weight: 400;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .recent-templates {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .recent-template-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n }\n\n .templates-section {\n flex: 1;\n padding: 0 24px 24px;\n overflow: auto;\n }\n\n .templates-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .view-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .templates-container {\n min-height: 200px;\n }\n\n /* Grid View */\n .templates-container.grid-view {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n }\n\n .template-grid-card {\n height: fit-content;\n transition:\n transform 0.2s ease,\n box-shadow 0.2s ease;\n }\n\n .template-grid-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px var(--vb-shadow-medium-color); }\n\n .template-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: var(--mdc-theme-primary-container);\n color: var(--mdc-theme-on-primary-container);\n }\n\n .card-actions {\n margin-left: auto;\n }\n\n .template-description {\n font-size: 14px;\n line-height: 1.4;\n margin: 0 0 12px 0;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .template-tags {\n margin-bottom: 12px;\n }\n\n .template-tag {\n font-size: 11px;\n height: 20px;\n line-height: 20px;\n }\n\n .more-tags {\n background: var(--mdc-theme-surface-variant);\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .template-metadata {\n display: flex;\n gap: 16px;\n flex-wrap: wrap;\n margin-bottom: 12px;\n }\n\n .metadata-item {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .metadata-item mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n .template-preview {\n margin-top: 12px;\n padding: 8px;\n background: var(--mdc-theme-surface-variant);\n border-radius: 4px;\n }\n\n .preview-header {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n font-weight: 500;\n margin-bottom: 8px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .preview-header mat-icon {\n font-size: 14px;\n width: 14px;\n height: 14px;\n }\n\n .node-tree {\n font-size: 11px;\n font-family: monospace;\n }\n\n .root-node {\n padding: 2px 0;\n color: var(--mdc-theme-on-surface);\n }\n\n /* List View */\n .templates-container.list-view {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .template-list-card {\n padding: 12px 16px;\n }\n\n .list-card-content {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n }\n\n .template-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .template-header {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .template-details {\n flex: 1;\n }\n\n .template-name {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n }\n\n .template-meta {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n\n .category-badge,\n .complexity-badge {\n font-size: 11px;\n padding: 2px 6px;\n border-radius: 12px;\n background: var(--mdc-theme-surface-variant);\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .complexity-simple {\n background: var(--mdc-theme-tertiary-container);\n color: var(--mdc-theme-on-tertiary-container);\n }\n\n .complexity-medium {\n background: var(--mdc-theme-secondary-container);\n color: var(--mdc-theme-on-secondary-container);\n }\n\n .complexity-complex {\n background: var(--mdc-theme-error-container);\n color: var(--mdc-theme-on-error-container);\n }\n\n .usage-count {\n font-size: 11px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .template-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n\n /* Compact View */\n .templates-container.compact-view {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .template-compact-card {\n padding: 8px 12px;\n border: 1px solid var(--mdc-theme-outline);\n border-radius: 4px;\n background: var(--mdc-theme-surface);\n }\n\n .compact-content {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .compact-icon {\n color: var(--mdc-theme-primary);\n }\n\n .compact-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .compact-name {\n font-size: 14px;\n font-weight: 500;\n }\n\n .compact-category {\n font-size: 12px;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .compact-actions {\n display: flex;\n gap: 4px;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n text-align: center;\n color: var(--mdc-theme-on-surface-variant);\n }\n\n .empty-icon {\n font-size: 64px;\n width: 64px;\n height: 64px;\n margin-bottom: 16px;\n color: var(--mdc-theme-outline);\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--mdc-theme-on-surface);\n }\n\n .empty-state p {\n margin: 0 0 16px 0;\n max-width: 400px;\n }\n\n /* Responsive adjustments */\n @media (max-width: 1024px) {\n .templates-container.grid-view {\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n }\n\n .search-row {\n flex-wrap: wrap;\n }\n\n .search-input {\n flex: 1 1 100%;\n }\n }\n\n @media (max-width: 768px) {\n .header-content {\n flex-direction: column;\n gap: 16px;\n align-items: flex-start;\n }\n\n .templates-container.grid-view {\n grid-template-columns: 1fr;\n }\n\n .stats-bar {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .gallery-subtitle {\n margin-left: 0;\n }\n }\n `,\n ],\n})\nexport class TemplateGalleryComponent implements OnInit, OnDestroy {\n @Input() availableFields: string[] = [];\n\n @Output() templateApplied = new EventEmitter<RuleTemplate>();\n @Output() templateCreated = new EventEmitter<RuleTemplate>();\n @Output() templateDeleted = new EventEmitter<string>();\n\n private destroy$ = new Subject<void>();\n\n searchForm: FormGroup;\n displayMode: TemplateDisplayMode = 'grid';\n showPreview = false;\n selectedTags = new Set<string>();\n popularTags: string[] = [];\n\n // Observables\n templates$!: Observable<RuleTemplate[]>;\n categories$!: Observable<TemplateCategory[]>;\n recentlyUsed$!: Observable<RuleTemplate[]>;\n stats$!: Observable<TemplateStats>;\n filteredTemplates$: Observable<RuleTemplate[]>;\n\n Array = Array; // For template usage\n\n constructor(\n private templateService: RuleTemplateService,\n private fb: FormBuilder,\n private dialog: MatDialog,\n private snackBar: MatSnackBar,\n ) {\n this.searchForm = this.createSearchForm();\n this.templates$ = this.templateService.getTemplates();\n this.categories$ = this.templateService.getCategories();\n this.recentlyUsed$ = this.templateService.recentlyUsed$;\n this.stats$ = this.templateService.getTemplateStats();\n this.filteredTemplates$ = this.createFilteredTemplatesStream();\n }\n\n ngOnInit(): void {\n this.setupFormSubscriptions();\n this.loadPopularTags();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private createSearchForm(): FormGroup {\n return this.fb.group({\n query: [''],\n category: [''],\n complexity: [''],\n sortBy: ['name'],\n });\n }\n\n private createFilteredTemplatesStream(): Observable<RuleTemplate[]> {\n return combineLatest([\n this.templates$,\n this.searchForm.valueChanges.pipe(\n startWith(this.searchForm.value),\n debounceTime(300),\n distinctUntilChanged(),\n ),\n ]).pipe(\n map(([templates, filters]) => {\n const criteria: TemplateSearchCriteria = {\n query: filters.query || undefined,\n category: filters.category || undefined,\n complexity: filters.complexity || undefined,\n tags:\n this.selectedTags.size > 0\n ? Array.from(this.selectedTags)\n : undefined,\n };\n\n // Apply filters\n let filtered = this.filterTemplates(templates, criteria);\n\n // Apply sorting\n filtered = this.sortTemplates(filtered, filters.sortBy);\n\n return filtered;\n }),\n );\n }\n\n private setupFormSubscriptions(): void {\n // Additional subscriptions can be added here\n }\n\n private loadPopularTags(): void {\n this.stats$.pipe(takeUntil(this.destroy$)).subscribe((stats) => {\n this.popularTags = stats.popularTags.slice(0, 10);\n });\n }\n\n private filterTemplates(\n templates: RuleTemplate[],\n criteria: TemplateSearchCriteria,\n ): RuleTemplate[] {\n let filtered = templates;\n\n if (criteria.query) {\n const query = criteria.query.toLowerCase();\n filtered = filtered.filter(\n (t) =>\n t.name.toLowerCase().includes(query) ||\n t.description.toLowerCase().includes(query) ||\n t.tags.some((tag) => tag.toLowerCase().includes(query)),\n );\n }\n\n if (criteria.category) {\n filtered = filtered.filter((t) => t.category === criteria.category);\n }\n\n if (criteria.complexity) {\n filtered = filtered.filter(\n (t) => t.metadata?.complexity === criteria.complexity,\n );\n }\n\n if (criteria.tags && criteria.tags.length > 0) {\n filtered = filtered.filter((t) =>\n criteria.tags!.some((tag) => t.tags.includes(tag)),\n );\n }\n\n return filtered;\n }\n\n private sortTemplates(\n templates: RuleTemplate[],\n sortBy: string,\n ): RuleTemplate[] {\n return [...templates].sort((a, b) => {\n switch (sortBy) {\n case 'name':\n return a.name.localeCompare(b.name);\n case 'usageCount':\n return (b.metadata?.usageCount || 0) - (a.metadata?.usageCount || 0);\n case 'createdAt':\n const aCreated = a.metadata?.createdAt || new Date(0);\n const bCreated = b.metadata?.createdAt || new Date(0);\n return bCreated.getTime() - aCreated.getTime();\n case 'updatedAt':\n const aUpdated = a.metadata?.updatedAt || new Date(0);\n const bUpdated = b.metadata?.updatedAt || new Date(0);\n return bUpdated.getTime() - aUpdated.getTime();\n case 'complexity':\n const complexityOrder = { simple: 0, medium: 1, complex: 2 };\n const aComplexity =\n complexityOrder[a.metadata?.complexity || 'simple'];\n const bComplexity =\n complexityOrder[b.metadata?.complexity || 'simple'];\n return aComplexity - bComplexity;\n default:\n return 0;\n }\n });\n }\n\n // Template methods\n trackByTemplateId(index: number, template: RuleTemplate): string {\n return template.id;\n }\n\n setDisplayMode(mode: TemplateDisplayMode): void {\n this.displayMode = mode;\n }\n\n toggleTag(tag: string): void {\n if (this.selectedTags.has(tag)) {\n this.selectedTags.delete(tag);\n } else {\n this.selectedTags.add(tag);\n }\n // Trigger filter update\n this.searchForm.updateValueAndValidity();\n }\n\n hasActiveFilters(): boolean {\n const values = this.searchForm.value;\n return !!(\n values?.category ||\n values?.complexity ||\n this.selectedTags.size > 0\n );\n }\n\n clearFilter(field: string): void {\n this.searchForm.patchValue({ [field]: '' });\n }\n\n clearAllFilters(): void {\n this.searchForm.reset();\n this.selectedTags.clear();\n }\n\n getCategoryName(categoryId: string): string {\n const categoryNames: Record<string, string> = {\n validation: 'Field Validation',\n business: 'Business Rules',\n collection: 'Collection Validation',\n conditional: 'Conditional Logic',\n workflow: 'Workflow Rules',\n security: 'Security Validation',\n custom: 'Custom Templates',\n };\n return (\n categoryNames[categoryId] ||\n categoryId.charAt(0).toUpperCase() + categoryId.slice(1)\n );\n }\n\n getRelativeDate(date?: Date | string): string {\n if (!date) {\n return 'Unknown';\n }\n\n const target = new Date(date);\n const now = new Date();\n const diff = now.getTime() - target.getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n getNodeLabel(template: RuleTemplate, nodeId: string): string {\n const node = template.nodes.find((n) => n.id === nodeId);\n return node?.label || node?.type || 'Unknown';\n }\n\n // Template actions\n showCreateTemplateDialog(selectedNodes?: RuleNode[]): void {\n const dialogData: TemplateEditorDialogData = {\n mode: 'create',\n selectedNodes: selectedNodes || [],\n availableCategories: [\n 'validation',\n 'business',\n 'collection',\n 'conditional',\n 'workflow',\n 'security',\n 'custom',\n ],\n };\n\n const dialogRef = this.dialog.open(TemplateEditorDialogComponent, {\n width: '800px',\n maxWidth: '90vw',\n maxHeight: '90vh',\n data: dialogData,\n disableClose: true,\n });\n\n dialogRef\n .afterClosed()\n .subscribe((result: TemplateEditorResult | undefined) => {\n if (result?.action === 'save' && result.template) {\n this.templateCreated.emit(result.template);\n this.snackBar.open(\n `Template \"${result.template.name}\" created successfully`,\n 'Close',\n {\n duration: 3000,\n },\n );\n }\n });\n }\n\n importTemplate(): void {\n // Create file input element\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json,.template.json';\n input.multiple = false;\n\n input.onchange = (event: any) => {\n const file = event.target?.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n this.templateService.importTemplate(content).subscribe({\n next: (template) => {\n this.templateCreated.emit(template);\n this.snackBar.open(\n `Template \"${template.name}\" imported successfully`,\n 'Close',\n {\n duration: 3000,\n },\n );\n },\n error: (error) => {\n this.snackBar.open(\n `Failed to import template: ${error.message}`,\n 'Close',\n {\n duration: 5000,\n },\n );\n },\n });\n } catch (error) {\n this.snackBar.open('Invalid template file format', 'Close', {\n duration: 5000,\n });\n }\n };\n reader.readAsText(file);\n };\n\n input.click();\n }\n\n applyTemplate(template: RuleTemplate): void {\n this.templateService.applyTemplate(template.id).subscribe({\n next: (result) => {\n if (result.success) {\n this.templateApplied.emit(template);\n this.snackBar.open(\n `Template \"${template.name}\" applied successfully`,\n 'Close',\n {\n duration: 3000,\n },\n );\n } else {\n this.snackBar.open(\n `Failed to apply template: ${result.errors.join(', ')}`,\n 'Close',\n {\n duration: 5000,\n },\n );\n }\n },\n error: (error) => {\n this.snackBar.open(\n `Error applying template: ${error.message}`,\n 'Close',\n {\n duration: 5000,\n },\n );\n },\n });\n }\n\n previewTemplate(template: RuleTemplate): void {\n // Create a simple preview dialog showing template structure\n const dialogRef = this.dialog.open(TemplatePreviewDialogComponent, {\n width: '600px',\n maxWidth: '90vw',\n data: { template },\n panelClass: 'template-preview-dialog',\n });\n\n // Handle actions from preview\n dialogRef.afterClosed().subscribe((action?: string) => {\n if (action === 'apply') {\n this.applyTemplate(template);\n } else if (action === 'export') {\n this.exportTemplate(template);\n }\n });\n }\n\n editTemplate(template: RuleTemplate): void {\n const dialogData: TemplateEditorDialogData = {\n mode: 'edit',\n template: template,\n availableCategories: [\n 'validation',\n 'business',\n 'collection',\n 'conditional',\n 'workflow',\n 'security',\n 'custom',\n ],\n };\n\n const dialogRef = this.dialog.open(TemplateEditorDialogComponent, {\n width: '800px',\n maxWidth: '90vw',\n maxHeight: '90vh',\n data: dialogData,\n disableClose: true,\n });\n\n dialogRef\n .afterClosed()\n .subscribe((result: TemplateEditorResult | undefined) => {\n if (result?.action === 'save' && result.template) {\n this.snackBar.open(\n `Template \"${result.template.name}\" updated successfully`,\n 'Close',\n {\n duration: 3000,\n },\n );\n }\n });\n }\n\n duplicateTemplate(template: RuleTemplate): void {\n this.templateService.duplicateTemplate(template.id).subscribe({\n next: (duplicated) => {\n this.snackBar.open(\n `Template duplicated as \"${duplicated.name}\"`,\n 'Close',\n {\n duration: 3000,\n },\n );\n },\n error: (error) => {\n this.snackBar.open(\n `Failed to duplicate template: ${error.message}`,\n 'Close',\n {\n duration: 5000,\n },\n );\n },\n });\n }\n\n exportTemplate(template: RuleTemplate): void {\n this.templateService\n .exportTemplate(template.id, { format: 'json', prettyPrint: true })\n .subscribe({\n next: (jsonData) => {\n this.downloadFile(\n jsonData,\n `${template.name}.template.json`,\n 'application/json',\n );\n this.snackBar.open('Template exported successfully', 'Close', {\n duration: 3000,\n });\n },\n error: (error) => {\n this.snackBar.open(\n `Failed to export template: ${error.message}`,\n 'Close',\n {\n duration: 5000,\n },\n );\n },\n });\n }\n\n deleteTemplate(template: RuleTemplate): void {\n if (\n confirm(\n `Are you sure you want to delete the template \"${template.name}\"?`,\n )\n ) {\n this.templateService.deleteTemplate(template.id).subscribe({\n next: () => {\n this.templateDeleted.emit(template.id);\n this.snackBar.open('Template deleted successfully', 'Close', {\n duration: 3000,\n });\n },\n error: (error) => {\n this.snackBar.open(\n `Failed to delete template: ${error.message}`,\n 'Close',\n {\n duration: 5000,\n },\n );\n },\n });\n }\n }\n\n private downloadFile(\n content: string,\n filename: string,\n contentType: string,\n ): void {\n const blob = new Blob([content], { type: contentType });\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n window.URL.revokeObjectURL(url);\n }\n}\n","/*\n * Public API Surface of praxis-visual-builder\n */\n\n// Main visual builder library\nexport * from './lib/praxis-visual-builder';\n\n// Core models\nexport * from './lib/models/field-schema.model';\nexport * from './lib/models/rule-builder.model';\nexport * from './lib/models/array-field-schema.model';\n\n// Services\nexport * from './lib/services/field-schema.service';\nexport * from './lib/services/rule-builder.service';\nexport { SpecificationBridgeService } from './lib/services/specification-bridge.service';\nexport type { SpecificationContextualConfig } from './lib/services/specification-bridge.service';\nexport * from './lib/services/round-trip-validator.service';\nexport * from './lib/services/export-integration.service';\nexport * from './lib/services/webhook-integration.service';\nexport * from './lib/services/rule-template.service';\nexport * from './lib/services/rule-validation.service';\nexport * from './lib/services/rule-node-registry.service';\nexport * from './lib/services/converters/converter-factory.service';\nexport * from './lib/services/rule-conversion.service';\nexport * from './lib/services/dsl/dsl-parsing.service';\nexport { ContextManagementService } from './lib/services/context/context-management.service';\nexport type {\n ContextScope,\n ContextEntry,\n ContextValue,\n} from './lib/services/context/context-management.service';\nexport {\n VisualBuilderError,\n ValidationError as VBValidationError,\n ConversionError,\n RegistryError,\n DslError,\n ContextError,\n ConfigurationError,\n InternalError,\n ErrorCategory,\n ErrorSeverity,\n ErrorHandler,\n globalErrorHandler,\n createError,\n} from './lib/errors/visual-builder-errors';\nexport type {\n ErrorInfo,\n ErrorStatistics,\n} from './lib/errors/visual-builder-errors';\n\n// Components\nexport * from './lib/components/rule-editor.component';\nexport * from './lib/components/rule-canvas.component';\nexport * from './lib/components/rule-node.component';\nexport * from './lib/components/field-condition-editor.component';\nexport * from './lib/components/conditional-validator-editor.component';\nexport * from './lib/components/collection-validator-editor.component';\nexport * from './lib/components/metadata-editor.component';\nexport * from './lib/components/dsl-viewer.component';\nexport * from './lib/components/json-viewer.component';\nexport * from './lib/components/round-trip-tester.component';\nexport * from './lib/components/export-dialog.component';\nexport * from './lib/components/dsl-linter.component';\nexport * from './lib/components/visual-rule-builder.component';\nexport * from './lib/components/template-gallery.component';\nexport * from './lib/components/template-editor-dialog.component';\nexport * from './lib/components/template-preview-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i6","i7","i8","i9","i3","i5","i12","i1","i2","i4","i1.RuleNodeRegistryService","i1.FieldConditionConverter","i2.BooleanGroupConverter","i3.CardinalityConverter","i2.ConverterFactoryService","i1.SpecificationBridgeService","uuidv4","i2.RoundTripValidatorService","i1.RoundTripValidatorService","i2.RuleBuilderService","i11","i13","i1.RuleBuilderService","i2.SpecificationBridgeService","i3.ExportIntegrationService","i10","i14","i15","i16","i17","debounceTime","distinctUntilChanged","takeUntil","i2.FieldSchemaService","i2.ExportIntegrationService","ValidationSeverity","i1.ConverterFactoryService","i2.DslParsingService","i3.ContextManagementService","i3.RuleTemplateService","i4.SpecificationBridgeService","i1.RuleTemplateService"],"mappings":"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"}