@praxisui/visual-builder 3.0.0-beta.8 → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
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/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/services/export-integration.service.ts","../../../projects/praxis-visual-builder/src/lib/components/export-dialog.component.ts","../../../projects/praxis-visual-builder/src/lib/components/property-effect-editor.component.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/i18n/visual-builder.en.ts","../../../projects/praxis-visual-builder/src/lib/i18n/visual-builder.pt.ts","../../../projects/praxis-visual-builder/src/lib/i18n/visual-builder.i18n.ts","../../../projects/praxis-visual-builder/src/lib/components/target-selector.component.ts","../../../projects/praxis-visual-builder/src/lib/services/dsl/dsl-visual-import.service.ts","../../../projects/praxis-visual-builder/src/lib/components/rule-definition.component.ts","../../../projects/praxis-visual-builder/src/lib/components/rule-list.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/context/context-management.service.ts","../../../projects/praxis-visual-builder/src/lib/services/rule-conversion.service.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/components/round-trip-tester.component.ts","../../../projects/praxis-visual-builder/src/lib/components/dsl-linter.component.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 | 'notIn'\n | 'matches'\n | 'notMatches'\n | 'isNull'\n | 'isNotNull'\n | 'isEmpty'\n | 'isNotEmpty';\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 // Property modification rule (não gera DSL)\n PROPERTY_RULE = 'propertyRule',\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 | 'propertyRule'\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 | PropertyRuleConfig\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 PropertyRuleConfig {\n type: 'propertyRule';\n targetType: 'field' | 'section' | 'action' | 'row' | 'column';\n /** Target IDs without prefix (namespace is defined by targetType) */\n targets: string[];\n /** Properties applied when condition is true */\n properties?: Record<string, any>;\n /** Properties applied when condition is false */\n propertiesWhenFalse?: Record<string, any>;\n /** Optional condition node or inline DSL string */\n condition?: RuleNode | string;\n /** Optional reference to a condition node inside the graph */\n conditionNodeId?: string;\n /** Metadata for UI/description */\n metadata?: SpecificationMetadata;\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 currentDSL?: string;\n currentJSON?: any;\n validationErrors?: ValidationError[];\n mode?: 'visual' | 'dsl' | 'json';\n isDirty?: boolean;\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 /** Optional map of available targets by type (fields, sections, actions) */\n targetSchemas?: {\n fields?: Record<string, unknown>;\n sections?: Record<string, unknown>;\n actions?: Record<string, unknown>;\n rows?: Record<string, unknown>;\n columns?: Record<string, unknown>;\n };\n\n /** Optional property schema per targetType for typed property editing */\n targetPropertySchemas?: Record<\n 'field' | 'section' | 'action' | 'row' | 'column',\n Array<{\n name: string;\n type: 'string' | 'boolean' | 'object' | 'enum' | 'number';\n label?: string;\n description?: string;\n enumValues?: Array<{ value: string; label?: string }>;\n }>\n >;\n\n /** Backward-compatible property schema key */\n propertySchema?: 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","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 * Backwards-compatible alias for register()\n */\n registerNode(node: RuleNode): void {\n this.register(node);\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\n // STRICT MODE: Ensure children are only IDs (strings)\n // This prevents the \"Unknown\" block issue by failing early if data is malformed\n const validIds = node.children.filter(child => {\n if (typeof child !== 'string') {\n throw new Error(`[Registry] Invalid child reference in node ${node.id}: expected string ID, got object. This indicates a data model violation.`);\n }\n return true;\n }) as string[];\n\n return this.resolveMultiple(validIds);\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 const { operator, negate } = this.mapOperator(config.operator);\n const requiresValue = this.operatorRequiresValue(operator);\n const impliedValue = this.getImpliedValue(config.operator);\n\n if (requiresValue && config.value === undefined && impliedValue === undefined) {\n throw new Error(`Field condition node ${node.id} is missing value`);\n }\n\n const rawValue = config.value !== undefined ? config.value : impliedValue;\n const value = requiresValue\n ? this.convertValue(rawValue, config.valueType)\n : this.defaultValueForOperator(operator);\n\n // Create field specification\n const fieldKey = config.fieldName as keyof T;\n\n const baseSpec = config.metadata\n ? SpecificationFactory.fieldWithMetadata(fieldKey, operator, value, config.metadata)\n : SpecificationFactory.field(fieldKey, operator, value);\n\n return negate ? SpecificationFactory.not(baseSpec) : baseSpec;\n }\n\n private mapOperator(operatorString: string): { operator: ComparisonOperator; negate: boolean } {\n // Normalize: remove underscores/spaces and lowercase\n const norm = (operatorString || '').replace(/[_\\s]/g, '').toLowerCase();\n const negated = norm === '!~'; // explicit negation handled via operator below\n switch (norm) {\n case 'eq':\n case 'equals':\n case '==':\n case '=':\n case 'istrue': // treat as equals true\n case 'isfalse': // equals false\n return { operator: ComparisonOperator.EQUALS, negate: false };\n\n case 'neq':\n case 'notequals':\n case '!=':\n case '<>':\n return { operator: ComparisonOperator.NOT_EQUALS, negate: false };\n\n case 'lt':\n case 'lessthan':\n case '<':\n return { operator: ComparisonOperator.LESS_THAN, negate: false };\n\n case 'lte':\n case 'lessthanorequal':\n case '<=':\n return { operator: ComparisonOperator.LESS_THAN_OR_EQUAL, negate: false };\n\n case 'gt':\n case 'greaterthan':\n case '>':\n return { operator: ComparisonOperator.GREATER_THAN, negate: false };\n\n case 'gte':\n case 'greaterthanorequal':\n case '>=':\n return { operator: ComparisonOperator.GREATER_THAN_OR_EQUAL, negate: false };\n\n case 'contains':\n return { operator: ComparisonOperator.CONTAINS, negate: false };\n\n case 'startswith':\n return { operator: ComparisonOperator.STARTS_WITH, negate: false };\n\n case 'endswith':\n return { operator: ComparisonOperator.ENDS_WITH, negate: false };\n\n case 'in':\n return { operator: ComparisonOperator.IN, negate: false };\n\n case 'notin':\n return { operator: ComparisonOperator.NOT_IN, negate: false };\n\n case 'matches':\n case '~':\n return { operator: ComparisonOperator.MATCHES, negate: false };\n case '!~':\n case 'notmatches':\n return { operator: ComparisonOperator.NOT_MATCHES, negate: false };\n\n case 'isnull':\n return { operator: ComparisonOperator.IS_NULL, negate: false };\n\n case 'isnotnull':\n return { operator: ComparisonOperator.IS_NOT_NULL, negate: false };\n\n case 'isempty':\n return { operator: ComparisonOperator.IS_EMPTY, negate: false };\n\n case 'isnotempty':\n return { operator: ComparisonOperator.IS_NOT_EMPTY, negate: false };\n\n default:\n throw new Error(`Unsupported operator: ${operatorString}`);\n }\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 private operatorRequiresValue(operator: ComparisonOperator): boolean {\n switch (operator) {\n case ComparisonOperator.IS_NULL:\n case ComparisonOperator.IS_NOT_NULL:\n case ComparisonOperator.IS_EMPTY:\n case ComparisonOperator.IS_NOT_EMPTY:\n return false;\n default:\n return true;\n }\n }\n\n private defaultValueForOperator(operator: ComparisonOperator): any {\n switch (operator) {\n case ComparisonOperator.IS_NULL:\n case ComparisonOperator.IS_NOT_NULL:\n case ComparisonOperator.IS_EMPTY:\n case ComparisonOperator.IS_NOT_EMPTY:\n return null;\n default:\n return undefined;\n }\n }\n\n private getImpliedValue(operatorString: string): any {\n const norm = (operatorString || '').replace(/[_\\s]/g, '').toLowerCase();\n switch (norm) {\n case 'istrue':\n return true;\n case 'isfalse':\n return false;\n default:\n return undefined;\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, 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 as RuleContextualConfig,\n} from '../models/rule-builder.model';\n// export type { ContextualConfig };\nimport { DslContextVariable as ContextVariable } from '../models/context-variable.model';\nimport { RuleNodeRegistryService } from './rule-node-registry.service';\nimport { ConverterFactoryService } from './converters/converter-factory.service';\nimport {\n DslParsingService,\n DslParsingConfig,\n DslParsingResult,\n normalizeDsl\n} from '@praxisui/ai';\nimport {\n ContextManagementService,\n ContextualConfig,\n} from './context/context-management.service';\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 // Ensure registry knows about the full subtree before conversion\n this.registerSubtree(node);\n\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(`Não foi possível converter a regra em especificação: ${error}`);\n }\n }\n\n private registerSubtree(node: RuleNode): void {\n // If registry already has nodes (e.g., set by RuleBuilderService), keep it.\n if (this.nodeRegistry.size() > 0) {\n return;\n }\n\n const stack: RuleNode[] = [node];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) continue;\n this.nodeRegistry.register(current);\n (current.children || []).forEach((child: any) => {\n if (child && typeof child === 'object' && 'id' in child) {\n stack.push(child as RuleNode);\n }\n });\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 if (!spec) {\n throw new Error('Specification is undefined');\n }\n // Safety check for objects that might not be full Specification instances\n if (typeof spec.toJSON !== 'function') {\n console.warn('Specification object does not have toJSON method:', spec);\n // If it looks like a JSON spec (has type), try to use it directly\n if ((spec as any).type) {\n return this.jsonToRuleNode(spec as any);\n }\n throw new Error('Specification object does not have toJSON method');\n }\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\n\n // Parse the expression\n const normalized = normalizeDsl(expression);\n const specification = this.dslParser.parse(normalized);\n const parseTime = performance.now() - startTime;\n\n if (!specification) {\n issues.push({\n type: 'SyntaxError' as any,\n severity: 'error' as any,\n message: 'Parser returned no specification',\n position: { start: 0, end: expression.length, line: 1, column: 1 },\n });\n\n return {\n success: false,\n issues,\n metrics: {\n parseTime,\n complexity: this.calculateComplexity(expression),\n },\n };\n }\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: ValidationIssue) => {\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 const op = String(config.operator);\n const operator = this.convertToComparisonOperator(op);\n const requiresValue = this.comparisonExpectsValue(operator);\n const impliedValue = this.getImpliedValueForOperator(op);\n\n // After normalization, require either an explicit value or impliedValue\n if (requiresValue && 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 baseValue = config.value !== undefined ? config.value : impliedValue;\n const value = requiresValue\n ? this.convertValue(baseValue, config.valueType)\n : this.defaultValueForOperator(operator);\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?.leftField ||\n !fieldConfig?.rightField ||\n !fieldConfig?.operator\n ) {\n throw new Error(\n 'Field-to-field specification requires leftField, rightField, and operator',\n );\n }\n\n const fieldA = fieldConfig.leftField as keyof T;\n const fieldB = fieldConfig.rightField 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 undefined,\n node.metadata,\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: ValidationIssue) => issue.severity === 'error')\n .map((issue: ValidationIssue) => 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 const normalized = (operator || '').toLowerCase().replace(/[\\s_]/g, '');\n\n switch (normalized) {\n case 'istrue':\n return ComparisonOperator.EQUALS;\n case 'isfalse':\n return ComparisonOperator.EQUALS;\n case 'equals':\n case '==':\n case '=':\n case 'eq':\n return ComparisonOperator.EQUALS;\n\n case 'notequals':\n case '!=':\n case '<>':\n case 'neq':\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_IN;\n\n case 'matches':\n case '~':\n return ComparisonOperator.MATCHES;\n case '!~':\n case 'notmatches':\n return ComparisonOperator.NOT_MATCHES;\n\n case 'isnull':\n return ComparisonOperator.IS_NULL;\n\n case 'isnotnull':\n return ComparisonOperator.IS_NOT_NULL;\n\n case 'isempty':\n return ComparisonOperator.IS_EMPTY;\n case 'isnotempty':\n return ComparisonOperator.IS_NOT_EMPTY;\n\n default:\n throw new Error(`Operador de comparação não suportado: ${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 comparisonExpectsValue(\n operator: ComparisonOperator | string,\n ): boolean {\n switch (operator) {\n case (ComparisonOperator as any).IS_NULL:\n case (ComparisonOperator as any).IS_NOT_NULL:\n case (ComparisonOperator as any).IS_EMPTY:\n case (ComparisonOperator as any).IS_NOT_EMPTY:\n case 'isNull':\n case 'isNotNull':\n case 'isEmpty':\n case 'isNotEmpty':\n return false;\n case '!~':\n default:\n return true;\n }\n }\n\n private defaultValueForOperator(operator: ComparisonOperator): any {\n return this.comparisonExpectsValue(operator) ? undefined : null;\n }\n\n private getImpliedValueForOperator(operator: string): any {\n const normalized = (operator || '').toLowerCase();\n switch (normalized) {\n case 'istrue':\n return true;\n case 'isfalse':\n return false;\n default:\n return undefined;\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 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 const child = json.spec;\n if (child?.type === 'field' && child.operator === ComparisonOperator.MATCHES) {\n baseNode.type = RuleNodeType.FIELD_CONDITION;\n baseNode.config = {\n type: 'fieldCondition',\n field: child.field,\n fieldName: child.field,\n operator: '!~',\n value: child.value,\n valueType: this.inferValueType(child.value),\n metadata: child.metadata,\n } as FieldConditionConfig;\n baseNode.children = [];\n break;\n }\n\n if (child?.type === 'fieldToField' && child.operator === ComparisonOperator.MATCHES) {\n baseNode.type = RuleNodeType.FIELD_TO_FIELD;\n baseNode.config = {\n type: 'fieldToField',\n leftField: child.fieldA,\n rightField: child.fieldB,\n operator: '!~',\n leftTransforms: child.transformA ? [child.transformA] : [],\n rightTransforms: child.transformB ? [child.transformB] : [],\n metadata: child.metadata,\n } as FieldToFieldConfig;\n baseNode.children = [];\n break;\n }\n\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\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 this.nodeRegistry.register(baseNode);\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): string {\n if (typeof operator === 'string') {\n if (operator === '!~') {\n return '!~';\n }\n return operator;\n }\n\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 case (ComparisonOperator as any).NOT_IN:\n return 'not in';\n case (ComparisonOperator as any).MATCHES:\n return 'matches';\n case (ComparisonOperator as any).IS_NULL:\n return 'is null';\n case (ComparisonOperator as any).IS_NOT_NULL:\n return 'is not null';\n case (ComparisonOperator as any).IS_EMPTY:\n return 'is empty';\n case (ComparisonOperator as any).IS_NOT_EMPTY:\n return 'is not empty';\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 const opLabel = this.mapComparisonOperator(json.operator);\n const valuePart = this.comparisonExpectsValue(json.operator)\n ? ` ${json.value}`\n : '';\n return `${json.field} ${opLabel}${valuePart}`;\n }\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 const opLabel = this.mapComparisonOperator(json.operator);\n const valuePart = this.comparisonExpectsValue(json.operator)\n ? ` ${json.fieldB}`\n : '';\n return `${json.fieldA} ${opLabel}${valuePart}`;\n }\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 keywordPatterns = [\n /\\bnot\\s+in\\b/gi,\n /\\bis\\s+null\\b/gi,\n /\\bis\\s+not\\s+null\\b/gi,\n /\\bis\\s+empty\\b/gi,\n /\\bis\\s+not\\s+empty\\b/gi,\n ];\n const functions = [\n 'contains',\n 'startsWith',\n 'endsWith',\n 'matches',\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 for (const pattern of keywordPatterns) {\n const matches = expression.match(pattern);\n if (matches) {\n complexity += matches.length;\n }\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';\nimport { RuleNodeRegistryService } from './rule-node-registry.service';\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 relatedNodes?: RuleNode[];\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RoundTripValidatorService {\n private dslParser = new DslParser();\n\n constructor(\n private specificationBridge: SpecificationBridgeService,\n private nodeRegistry: RuleNodeRegistryService\n ) { }\n\n /**\n * Validates complete round-trip conversion: Visual → DSL → Visual\n */\n validateRoundTrip(visualRule: RuleNode, relatedNodes: RuleNode[] = []): RoundTripValidationResult {\n const startTime = performance.now();\n\n // Register related nodes if provided\n if (relatedNodes.length > 0) {\n this.nodeRegistry.registerAll(relatedNodes);\n }\n\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, testCase.relatedNodes);\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: ['test-2-1', 'test-2-2']\n },\n relatedNodes: [\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 ],\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 {\n RULE_PROPERTY_SCHEMA,\n type FormLayoutRule,\n type RulePropertyDefinition,\n type FormRuleTargetType,\n} from '@praxisui/core';\nimport { SpecificationBridgeService } from './specification-bridge.service';\nimport { RoundTripValidatorService } from './round-trip-validator.service';\nimport { RuleNodeRegistryService } from './rule-node-registry.service';\nimport { DslParsingService, normalizeDsl } from '@praxisui/ai';\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 private nodeRegistry: RuleNodeRegistryService,\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 // Salva estado inicial para habilitar undo/redo desde a primeira ação\n this.saveSnapshot('Estado inicial');\n }\n\n /**\n * Get current state\n */\n getCurrentState(): RuleBuilderState {\n return this._state.value;\n }\n\n /**\n * Initial empty builder state\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 /**\n * Add a high-level property rule (bridge method)\n */\n addPropertyRule(rule: FormLayoutRule): string {\n // Convert FormLayoutRule to RuleNode config\n const config: any = {\n type: 'propertyRule',\n targetType: rule.targetType || 'field',\n targets: rule.targets || [],\n properties: rule.effect?.properties || {},\n propertiesWhenFalse: rule.effect?.propertiesWhenFalse,\n condition: rule.effect?.condition,\n };\n\n // If condition is complex (not string), we might need to handle it differently later\n // For now, we assume it's either string or null as per current editor capability\n\n return this.addNode({\n type: RuleNodeType.PROPERTY_RULE,\n label: rule.name,\n config\n });\n }\n\n /**\n * Update a high-level property rule (bridge method)\n */\n updatePropertyRule(id: string, rule: Partial<FormLayoutRule>): void {\n const currentState = this.getCurrentState();\n const node = currentState.nodes[id];\n if (!node) return;\n\n const currentConfig = node.config as any || {};\n\n const newConfig: any = {\n ...currentConfig,\n type: 'propertyRule',\n };\n\n if (rule.targetType !== undefined) newConfig.targetType = rule.targetType;\n if (rule.targets !== undefined) newConfig.targets = rule.targets;\n if (rule.effect?.properties !== undefined) newConfig.properties = rule.effect.properties;\n if (rule.effect?.propertiesWhenFalse !== undefined) newConfig.propertiesWhenFalse = rule.effect.propertiesWhenFalse;\n if (rule.effect?.condition !== undefined) newConfig.condition = rule.effect.condition;\n\n this.updateNode(id, {\n label: rule.name || node.label,\n config: newConfig\n });\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 const now = new Date();\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: this.withRuleTimestamps(node.metadata, now),\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(`Regra adicionada (${newNode.label || newNode.type})`);\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 baseUpdatedNode = {\n ...existingNode,\n ...updates,\n id: nodeId, // Ensure ID doesn't change\n };\n\n if (JSON.stringify(existingNode) === JSON.stringify(baseUpdatedNode)) {\n return;\n }\n\n const now = new Date();\n const updatedNode = {\n ...baseUpdatedNode,\n metadata: this.withRuleTimestamps(\n (updates.metadata ?? existingNode.metadata) as RuleNode['metadata'],\n now,\n existingNode.metadata,\n ),\n };\n\n this.updateState({\n ...currentState,\n nodes: {\n ...currentState.nodes,\n [nodeId]: updatedNode,\n },\n isDirty: true,\n });\n\n this.saveSnapshot(`Regra atualizada (${updatedNode.label || updatedNode.type})`);\n this.validateRules();\n }\n\n /**\n * Remove a rule node (and its descendants)\n */\n removeNode(nodeId: string): void {\n const currentState = this.getCurrentState();\n if (!currentState.nodes[nodeId]) {\n return;\n }\n\n const updatedNodes = { ...currentState.nodes };\n\n const deleteRecursive = (id: string): void => {\n const node = updatedNodes[id];\n if (!node) return;\n (node.children || []).forEach(deleteRecursive);\n delete updatedNodes[id];\n };\n\n deleteRecursive(nodeId);\n\n // Clean parent references\n Object.keys(updatedNodes).forEach((id) => {\n const node = updatedNodes[id];\n if (node.children) {\n updatedNodes[id] = {\n ...node,\n children: node.children.filter((childId) => updatedNodes[childId]),\n };\n }\n });\n\n const updatedRootNodes = currentState.rootNodes.filter(\n (id) => id !== nodeId && !!updatedNodes[id],\n );\n\n this.updateState({\n ...currentState,\n nodes: updatedNodes,\n rootNodes: updatedRootNodes,\n selectedNodeId:\n currentState.selectedNodeId === nodeId ? undefined : currentState.selectedNodeId,\n isDirty: true,\n });\n\n this.saveSnapshot(`Regra removida (${nodeId})`);\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 * Undo last change\n */\n undo(): void {\n const currentState = this.getCurrentState();\n if ((currentState.historyPosition || 0) <= 0) return;\n\n const snapshot = currentState.history[currentState.historyPosition - 1];\n if (!snapshot) return;\n\n this.updateState({\n ...currentState,\n ...snapshot.state,\n history: currentState.history,\n historyPosition: currentState.historyPosition - 1,\n isDirty: true,\n });\n this.validateRules();\n }\n\n /**\n * Redo previously undone change\n */\n redo(): void {\n const currentState = this.getCurrentState();\n if (\n !currentState.history ||\n currentState.historyPosition >= currentState.history.length - 1\n ) {\n return;\n }\n\n const snapshot = currentState.history[currentState.historyPosition + 1];\n if (!snapshot) return;\n\n this.updateState({\n ...currentState,\n ...snapshot.state,\n history: currentState.history,\n historyPosition: currentState.historyPosition + 1,\n isDirty: true,\n });\n this.validateRules();\n }\n\n /**\n * Clear all rules\n */\n clear(): void {\n this.updateState({\n ...this.getInitialState(),\n isDirty: false,\n });\n this.saveSnapshot('Todas as regras foram limpas');\n }\n\n /**\n * Import rules from supported formats\n */\n import(content: string, options: ImportOptions): void {\n const format = options?.format || 'json';\n const merge = options?.merge;\n\n if (format === 'dsl') {\n const trimmed = (content || '').trim();\n if (!trimmed) return;\n let parsed: any;\n\n // ...\n\n try {\n const normalized = normalizeDsl(trimmed);\n parsed = this.dslParser.parse(normalized);\n } catch (e) {\n throw e;\n }\n const node = this.specificationBridge.specificationToRuleNode(parsed);\n if (!node) {\n throw new Error('DSL inválida');\n }\n this.applyBuilderState({ [node.id]: node }, [node.id], merge, 'dsl');\n return;\n }\n\n if (format === 'json' || format === 'form-config') {\n let parsed: any;\n try {\n parsed = typeof content === 'string' ? JSON.parse(content) : content;\n } catch (e) {\n throw new Error(`Importação falhou: JSON inválido (${(e as any)?.message || e})`);\n }\n\n if (!parsed || (typeof parsed === 'object' && !Object.keys(parsed).length)) {\n return;\n }\n\n // Direct builder state (top-level)\n if (this.isBuilderState(parsed)) {\n this.applyBuilderState(parsed.nodes, parsed.rootNodes, merge, format);\n return;\n }\n\n // Nested builder state fallback\n if (parsed.builderState && this.isBuilderState(parsed.builderState)) {\n this.applyBuilderState(\n parsed.builderState.nodes,\n parsed.builderState.rootNodes,\n merge,\n format,\n );\n return;\n }\n\n // Form rules payload\n const formRules = this.extractFormRules(parsed);\n if (formRules) {\n const normalized = this.validateFormRulesPayload(formRules);\n if (normalized.length) {\n const state = this.formRulesToBuilderState(normalized);\n this.applyBuilderState(state.nodes, state.rootNodes, merge, format);\n return;\n }\n\n if (parsed.builderState && this.isBuilderState(parsed.builderState)) {\n this.applyBuilderState(\n parsed.builderState.nodes,\n parsed.builderState.rootNodes,\n merge,\n format,\n );\n return;\n }\n }\n }\n\n throw new Error(`Formato de importação não suportado ou inválido: ${format}`);\n }\n\n /**\n * Export rules to JSON payload\n */\n export(options: ExportOptions): string {\n const format = options?.format || 'json';\n const state = this.getCurrentState();\n\n if (format === 'json') {\n const formRules = this.exportFormRulesFromState(state);\n const payload: any = {\n formRules,\n builderState: {\n nodes: state.nodes,\n rootNodes: state.rootNodes,\n },\n };\n\n if (this.containsPropertyRule()) {\n payload.warning =\n 'Exportação de propertyRule é experimental e pode exigir revisão manual.';\n }\n\n return JSON.stringify(payload, null, options?.prettyPrint ? 2 : undefined);\n }\n\n throw new Error(`Formato de exportação não suportado: ${format}`);\n }\n\n /**\n * Convert current builder state to Specification (best-effort)\n */\n toSpecification(): Specification<any> | null {\n const state = this.getCurrentState();\n if (!state.rootNodes.length) return null;\n const rootId = state.rootNodes[0];\n const rootNode = this.buildRuleNodeTree(rootId);\n if (!rootNode) return null;\n try {\n return this.specificationBridge.ruleNodeToSpecification(rootNode);\n } catch (e) {\n console.warn('[RuleBuilderService] toSpecification failed', e);\n return null;\n }\n }\n\n private updateState(newState: RuleBuilderState): void {\n const currentDSL = this.buildDslFromState(newState);\n const nextState = {\n ...newState,\n currentDSL,\n };\n this._state.next(nextState);\n this._stateChanged.next();\n }\n\n /**\n * Validate current rules (lightweight placeholder)\n */\n validateRules(): void {\n this._validationErrors.next([]);\n }\n\n /**\n * Replace builder state with a parsed DSL graph without reinitializing the service.\n */\n loadFromParsedDsl(\n nodes: Record<string, RuleNode>,\n rootNodes: string[],\n description: string = 'DSL import',\n ): void {\n const base = this.getInitialState();\n const nextState: RuleBuilderState = {\n ...base,\n nodes: { ...nodes },\n rootNodes: [...rootNodes],\n isDirty: true,\n };\n\n this.updateState(nextState);\n this.saveSnapshot(description);\n this.validateRules();\n }\n\n /**\n * Update builder state with a parsed DSL graph while preserving history.\n */\n updateFromParsedDsl(\n nodes: Record<string, RuleNode>,\n rootNodes: string[],\n description: string = 'DSL update',\n ): void {\n const currentState = this.getCurrentState();\n const nextState: RuleBuilderState = {\n ...currentState,\n nodes: { ...nodes },\n rootNodes: [...rootNodes],\n isDirty: true,\n };\n\n this.updateState(nextState);\n this.saveSnapshot(description);\n this.validateRules();\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 currentDSL: currentState.currentDSL,\n currentJSON: currentState.currentJSON,\n validationErrors: [...(currentState.validationErrors || [])],\n mode: currentState.mode,\n isDirty: currentState.isDirty,\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]: 'Condição de campo',\n [RuleNodeType.PROPERTY_RULE]: 'Propriedade',\n [RuleNodeType.AND_GROUP]: 'Grupo E',\n [RuleNodeType.OR_GROUP]: 'Grupo OU',\n [RuleNodeType.NOT_GROUP]: 'Grupo NÃO',\n [RuleNodeType.XOR_GROUP]: 'Grupo XOR',\n [RuleNodeType.IMPLIES_GROUP]: 'Implica',\n [RuleNodeType.REQUIRED_IF]: 'Obrigatório se',\n [RuleNodeType.VISIBLE_IF]: 'Visível se',\n [RuleNodeType.DISABLED_IF]: 'Desabilitado se',\n [RuleNodeType.READONLY_IF]: 'Somente leitura se',\n [RuleNodeType.FOR_EACH]: 'Para cada item',\n [RuleNodeType.UNIQUE_BY]: 'Único por campo',\n [RuleNodeType.MIN_LENGTH]: 'Mínimo de itens',\n [RuleNodeType.MAX_LENGTH]: 'Máximo de itens',\n [RuleNodeType.IF_DEFINED]: 'Se definido',\n [RuleNodeType.IF_NOT_NULL]: 'Se não for nulo',\n [RuleNodeType.IF_EXISTS]: 'Se existir',\n [RuleNodeType.WITH_DEFAULT]: 'Com valor padrão',\n [RuleNodeType.FUNCTION_CALL]: 'Chamada de função',\n [RuleNodeType.FIELD_TO_FIELD]: 'Campo para campo',\n [RuleNodeType.CONTEXTUAL]: 'Contextual',\n [RuleNodeType.AT_LEAST]: 'Pelo menos',\n [RuleNodeType.EXACTLY]: 'Exatamente',\n [RuleNodeType.EXPRESSION]: 'Expressão',\n [RuleNodeType.CONTEXTUAL_TEMPLATE]: 'Template contextual',\n [RuleNodeType.CUSTOM]: 'Personalizado',\n };\n\n return labels[type] || type;\n }\n\n private withRuleTimestamps(\n metadata: RuleNode['metadata'],\n now: Date,\n previousMetadata?: RuleNode['metadata'],\n ): RuleNode['metadata'] {\n const previousRecord = (previousMetadata || {}) as Record<string, unknown>;\n const currentRecord = (metadata || {}) as Record<string, unknown>;\n\n return {\n ...previousRecord,\n ...currentRecord,\n createdAt: currentRecord['createdAt'] || previousRecord['createdAt'] || now,\n updatedAt: now,\n } as RuleNode['metadata'];\n }\n\n private isPropertyRuleNode(node: RuleNode | null | undefined): boolean {\n if (!node) return false;\n const nodeType = (node.config as any)?.type || node.type;\n return nodeType === 'propertyRule' || nodeType === RuleNodeType.PROPERTY_RULE;\n }\n\n private containsPropertyRule(): boolean {\n const currentState = this.getCurrentState();\n return currentState.rootNodes.some((id) => {\n const node = this.buildRuleNodeTree(id);\n return this.isPropertyRuleNode(node || undefined);\n });\n }\n\n /**\n * Constrói um array de FormLayoutRule a partir do estado atual do builder,\n * focando em nós propertyRule ou nós com propriedades/targets definidos.\n */\n private exportFormRulesFromState(state: RuleBuilderState): FormLayoutRule[] {\n const rules: FormLayoutRule[] = [];\n const nodes = state.nodes || {};\n const warnings: string[] = [];\n for (const rootId of state.rootNodes || []) {\n const node = nodes[rootId];\n const rule = this.toFormLayoutRule(node, nodes, warnings);\n if (rule) {\n rules.push(rule);\n }\n }\n if (warnings.length) {\n console.warn('[RuleBuilderService] Algumas propriedades foram removidas ou ajustadas durante a exportação de formRules:', warnings);\n }\n return rules;\n }\n\n private toFormLayoutRule(\n node: RuleNode | undefined,\n all: Record<string, RuleNode>,\n warnings: string[],\n ): FormLayoutRule | null {\n if (!node) return null;\n const cfg: any = node.config || {};\n const targetsRaw: string[] = Array.isArray(cfg.targets) ? cfg.targets : cfg.targetField ? [cfg.targetField] : [];\n if (!targetsRaw.length) return null;\n const { targets, targetType } = this.normalizeTargets(targetsRaw, cfg.targetType);\n const id = cfg.ruleId || node.id;\n const name = node.label || node.id;\n const properties = this.sanitizeRuleProperties(\n targetType as NonNullable<FormLayoutRule['targetType']>,\n cfg.properties,\n warnings,\n `rule:${id}.properties`,\n false,\n );\n const propertiesWhenFalse = this.sanitizeRuleProperties(\n targetType as NonNullable<FormLayoutRule['targetType']>,\n cfg.propertiesWhenFalse,\n warnings,\n `rule:${id}.propertiesWhenFalse`,\n false,\n );\n const condition =\n typeof cfg.condition === 'string'\n ? cfg.condition\n : cfg.conditionNodeId\n ? this.buildDslFromCondition(all[cfg.conditionNodeId], all)\n : null;\n return {\n id,\n name,\n targetType,\n targets,\n effect: {\n condition,\n properties,\n propertiesWhenFalse,\n },\n };\n }\n\n private normalizeTargets(\n rawTargets: string[],\n explicit?: FormRuleTargetType | string,\n ): { targets: string[]; targetType: FormRuleTargetType } {\n const detected: FormRuleTargetType =\n rawTargets.some((t) => t.startsWith('section:')) ? 'section'\n : rawTargets.some((t) => t.startsWith('action:')) ? 'action'\n : rawTargets.some((t) => t.startsWith('row:')) ? 'row'\n : rawTargets.some((t) => t.startsWith('column:')) ? 'column'\n : (explicit as FormRuleTargetType) || 'field';\n const targets = rawTargets.map((t) =>\n t.startsWith('section:') ? t.slice('section:'.length)\n : t.startsWith('action:') ? t.slice('action:'.length)\n : t.startsWith('row:') ? t.slice('row:'.length)\n : t.startsWith('column:') ? t.slice('column:'.length)\n : t,\n );\n return { targets, targetType: detected };\n }\n\n private buildDslFromCondition(node: RuleNode | undefined, all: Record<string, RuleNode>): string | null {\n if (!node) return null;\n if (typeof (node as any) === 'string') return node as any;\n if (node.type === 'fieldCondition') {\n const cfg = (node.config as any) || {};\n const op = cfg.operator;\n if (!cfg.fieldName || !op) return null;\n const value = cfg.value !== undefined ? JSON.stringify(cfg.value) : '';\n if (value === '') return null;\n return `${cfg.fieldName} ${op} ${value}`;\n }\n if (node.type === 'andGroup' || node.type === 'orGroup') {\n const op = node.type === 'andGroup' ? 'and' : 'or';\n const parts = (node.children || [])\n .map((id: string) => this.buildDslFromCondition(all[id], all))\n .filter((p: string | null | undefined): p is string => !!p);\n if (!parts.length) return null;\n return parts.length > 1 ? `(${parts.join(` ${op} `)})` : parts[0];\n }\n return null;\n }\n\n private buildDslFromState(state: RuleBuilderState): string | undefined {\n if (!state?.rootNodes?.length) return undefined;\n const parts = state.rootNodes\n .map((id) => this.buildDslFromCondition(state.nodes[id], state.nodes))\n .filter((p): p is string => !!p);\n if (!parts.length) return undefined;\n if (parts.length === 1) return parts[0];\n return `(${parts.join(' and ')})`;\n }\n\n private applyBuilderState(\n nodes: Record<string, RuleNode>,\n rootNodes: string[],\n merge: boolean | undefined,\n source: string,\n ): void {\n const base = merge ? this.getCurrentState() : this.getInitialState();\n const nextState: RuleBuilderState = {\n ...base,\n nodes: merge ? { ...base.nodes, ...nodes } : { ...nodes },\n rootNodes: merge ? [...base.rootNodes, ...rootNodes] : [...rootNodes],\n isDirty: true,\n };\n\n this.updateState(nextState);\n this.saveSnapshot('Regras importadas');\n this.validateRules();\n }\n\n private extractFormRules(json: any): any[] | null {\n if (Array.isArray(json) && json.some((item) => this.isFormRuleCandidate(item))) {\n return json;\n }\n if (json && Array.isArray((json as any).formRules)) {\n const formRules = (json as any).formRules;\n return formRules.some((item: any) => this.isFormRuleCandidate(item))\n ? formRules\n : formRules.length === 0\n ? formRules\n : null;\n }\n return null;\n }\n\n private isFormRuleCandidate(value: any): boolean {\n if (!value || typeof value !== 'object') return false;\n const effect = (value as any).effect;\n const hasTargets =\n Array.isArray((value as any).targets) || Array.isArray((value as any).targetFields);\n const hasEffectProps =\n effect &&\n typeof effect === 'object' &&\n (effect.properties !== undefined || effect.propertiesWhenFalse !== undefined);\n return (\n (typeof (value as any).targetType === 'string' || hasTargets) &&\n hasEffectProps\n );\n }\n\n private validateFormRulesPayload(formRules: any[]): FormLayoutRule[] {\n const errors: string[] = [];\n const normalized: FormLayoutRule[] = [];\n const allowedTargets = new Set<NonNullable<FormLayoutRule['targetType']>>([\n 'field',\n 'section',\n 'action',\n 'row',\n 'column',\n ]);\n\n formRules.forEach((rawRule, index) => {\n const id = (rawRule && ((rawRule as any).id || (rawRule as any).name)) || `#${index + 1}`;\n const ruleErrorsStart = errors.length;\n if (!rawRule || typeof rawRule !== 'object') {\n errors.push(`Regra ${id}: valor inválido (esperado objeto)`);\n return;\n }\n\n const rawTargets =\n Array.isArray((rawRule as any).targets) && (rawRule as any).targets.length\n ? (rawRule as any).targets\n : Array.isArray((rawRule as any).targetFields)\n ? (rawRule as any).targetFields\n : [];\n const { targets, targetType } = this.normalizeTargets(\n rawTargets,\n (rawRule as any).targetType,\n );\n if (!targets.length) {\n errors.push(`Regra ${id}: targets obrigatórios ausentes`);\n return;\n }\n if (!allowedTargets.has(targetType as any)) {\n errors.push(`Regra ${id}: targetType inválido \"${(rawRule as any).targetType || targetType}\"`);\n return;\n }\n\n const effect = (rawRule as any).effect;\n if (!effect || typeof effect !== 'object') {\n errors.push(`Regra ${id}: effect ausente ou inválido`);\n return;\n }\n\n const condition =\n effect.condition === null || typeof effect.condition === 'string'\n ? effect.condition\n : undefined;\n if (effect.condition !== undefined && condition === undefined) {\n errors.push(`Regra ${id}: condition deve ser string ou null`);\n }\n\n const properties = this.sanitizeRuleProperties(\n targetType as NonNullable<FormLayoutRule['targetType']>,\n effect.properties,\n errors,\n `regra ${id} (properties)`,\n true,\n );\n const propertiesWhenFalse = this.sanitizeRuleProperties(\n targetType as NonNullable<FormLayoutRule['targetType']>,\n effect.propertiesWhenFalse,\n errors,\n `regra ${id} (propertiesWhenFalse)`,\n true,\n );\n\n if (\n Object.keys(properties).length === 0 &&\n Object.keys(propertiesWhenFalse).length === 0\n ) {\n errors.push(`Regra ${id}: nenhuma propriedade válida encontrada`);\n }\n\n if (errors.length === ruleErrorsStart) {\n normalized.push({\n id: (rawRule as any).id || id,\n name: (rawRule as any).name || (rawRule as any).label || id,\n description: (rawRule as any).description,\n targetType: targetType as NonNullable<FormLayoutRule['targetType']>,\n targets,\n effect: {\n condition: condition ?? null,\n properties,\n propertiesWhenFalse,\n },\n });\n }\n });\n\n if (errors.length) {\n throw new Error(`FormRules inválidos: ${errors.join('; ')}`);\n }\n return normalized;\n }\n\n private sanitizeRuleProperties(\n targetType: NonNullable<FormLayoutRule['targetType']>,\n props: Record<string, any> | undefined,\n collector: string[] | undefined,\n context: string,\n strict: boolean,\n ): Record<string, any> {\n if (!props || typeof props !== 'object') {\n return {};\n }\n const defs = RULE_PROPERTY_SCHEMA[targetType] || [];\n const defMap = new Map<string, RulePropertyDefinition>();\n defs.forEach((d) => defMap.set(d.name, d));\n\n return Object.entries(props).reduce<Record<string, any>>((acc, [name, value]) => {\n const def = defMap.get(name);\n if (!def) {\n if (strict || collector) {\n collector?.push(`${context}: propriedade \"${name}\" não é permitida para ${targetType}`);\n }\n return acc;\n }\n\n const coerced = this.coerceRulePropertyValue(def, value);\n if (coerced.ok) {\n acc[name] = coerced.value;\n } else if (strict || collector) {\n collector?.push(\n `${context}: valor inválido para \"${name}\" (esperado ${def.type}, recebido ${typeof value})`,\n );\n }\n return acc;\n }, {});\n }\n\n private coerceRulePropertyValue(\n def: RulePropertyDefinition,\n value: any,\n ): { ok: boolean; value?: any } {\n if (value === null) {\n // null mantém semântica de remover override\n return { ok: true, value: null };\n }\n\n switch (def.type) {\n case 'boolean':\n if (typeof value === 'boolean') return { ok: true, value };\n if (value === 'true') return { ok: true, value: true };\n if (value === 'false') return { ok: true, value: false };\n return { ok: false };\n case 'number':\n if (typeof value === 'number' && !Number.isNaN(value)) return { ok: true, value };\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) return { ok: true, value: parsed };\n }\n return { ok: false };\n case 'enum': {\n const accepted = def.enumValues?.map((e) => e.value) || [];\n return accepted.includes(value) ? { ok: true, value } : { ok: false };\n }\n case 'string':\n return typeof value === 'string' ? { ok: true, value } : { ok: false };\n case 'object':\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n return { ok: true, value: this.sanitizeStructuredValue(def.name, value) };\n }\n return { ok: false };\n default:\n return { ok: false };\n }\n }\n\n private sanitizeStructuredValue(\n name: string,\n value: Record<string, any>,\n ): Record<string, any> {\n if (name === 'options') {\n const normalizeItems = (items: any[]): any[] =>\n items\n .map((opt) => {\n if (!opt || typeof opt !== 'object') return null;\n const label = (opt as any).label ?? (opt as any).text;\n const val = (opt as any).value;\n if (label === undefined || val === undefined) return null;\n const sanitized: any = { label, value: val };\n if ((opt as any).disabled !== undefined) sanitized.disabled = !!(opt as any).disabled;\n return sanitized;\n })\n .filter(Boolean) as any[];\n\n if (Array.isArray(value)) {\n return normalizeItems(value) as any;\n }\n if (Array.isArray((value as any).items)) {\n return { items: normalizeItems((value as any).items) } as any;\n }\n return {};\n }\n if (name === 'validators') {\n const allowed: Record<string, any> = {};\n Object.entries(value || {}).forEach(([k, v]) => {\n if (\n typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean' ||\n v === null\n ) {\n allowed[k] = v;\n }\n });\n return allowed;\n }\n if (name === 'style') {\n const allowed: Record<string, any> = {};\n Object.entries(value || {}).forEach(([k, v]) => {\n if (typeof v === 'string' || typeof v === 'number') {\n allowed[k] = v;\n }\n });\n return allowed;\n }\n return value;\n }\n\n private formRulesToBuilderState(formRules: FormLayoutRule[]): RuleBuilderState {\n const base = this.getInitialState();\n const nodes: Record<string, RuleNode> = {};\n const rootNodes: string[] = [];\n\n formRules.forEach((rule) => {\n const targets = rule.targets && rule.targets.length ? rule.targets : [rule.id || uuidv4()];\n const condition = rule.effect?.condition;\n\n targets.forEach((target, index) => {\n const conditionNode =\n typeof condition === 'string' && condition.trim().length\n ? this.parseSimpleCondition(condition)\n : undefined;\n\n const inferredType = this.inferRuleTypeFromFormRule(rule);\n const rootId =\n targets.length > 1\n ? `${rule.id || uuidv4()}-${index}`\n : rule.id || uuidv4();\n const config: any = {\n type: inferredType,\n validatorType: inferredType,\n targetField:\n inferredType === 'propertyRule'\n ? undefined\n : this.prefixTarget(rule.targetType || 'field', target),\n targets: [...targets],\n targetType: rule.targetType || 'field',\n logicOperator: 'and',\n properties: rule.effect?.properties,\n propertiesWhenFalse: rule.effect?.propertiesWhenFalse,\n ruleId: rule.id || rootId,\n condition: typeof condition === 'string' ? condition : undefined,\n };\n if (conditionNode) {\n config.conditionNodeId = conditionNode.id;\n config.conditions = [conditionNode.config as any];\n }\n\n const rootNode: RuleNode = {\n id: rootId,\n type:\n inferredType === 'propertyRule'\n ? RuleNodeType.PROPERTY_RULE\n : (inferredType as any),\n label: rule.name || rule.id || rootId,\n metadata: rule.description ? { description: rule.description } : undefined,\n config,\n };\n nodes[rootId] = rootNode;\n rootNodes.push(rootId);\n if (conditionNode) {\n nodes[conditionNode.id] = conditionNode;\n }\n });\n });\n\n return {\n ...base,\n nodes,\n rootNodes,\n isDirty: true,\n };\n }\n\n private inferRuleTypeFromFormRule(rule: FormLayoutRule): string {\n const props = rule.effect?.properties || {};\n const propsFalse = rule.effect?.propertiesWhenFalse || {};\n const hasNonToggleProps = Object.keys({ ...props, ...propsFalse }).some(\n (k) => !['visible', 'required', 'disabled', 'readonly'].includes(k),\n );\n const targetType = (rule.targetType || 'field') as string;\n\n if (targetType && targetType !== 'field') {\n return 'propertyRule';\n }\n if (hasNonToggleProps) {\n return 'propertyRule';\n }\n if (props.visible !== undefined || propsFalse.visible !== undefined) {\n return 'visibleIf';\n }\n if (props.required !== undefined || propsFalse.required !== undefined) {\n return 'requiredIf';\n }\n if (props.disabled !== undefined || propsFalse.disabled !== undefined) {\n return 'disabledIf';\n }\n if (props.readonly !== undefined || propsFalse.readonly !== undefined) {\n return 'readonlyIf';\n }\n if (targetType === 'action') {\n if (\n props.label !== undefined ||\n props.icon !== undefined ||\n props.className !== undefined ||\n props.style !== undefined\n ) {\n return 'custom';\n }\n if (props.disabled !== undefined || propsFalse.disabled !== undefined) {\n return 'disabledIf';\n }\n }\n if (targetType === 'section') {\n if (\n props.collapsible !== undefined ||\n props.collapsed !== undefined ||\n props.title !== undefined ||\n props.icon !== undefined ||\n props.className !== undefined ||\n props.style !== undefined\n ) {\n return 'custom';\n }\n }\n return 'custom';\n }\n\n private parseSimpleCondition(condition: string): RuleNode | undefined {\n const trimmed = condition.trim();\n const match = trimmed.match(\n /^(.+?)\\s+(eq|equals|==|=|neq|notequals|!=|<>|lt|lessthan|<|lte|lessthanorequal|<=|gt|greaterthan|>|gte|greaterthanorequal|>=|contains|startswith|endswith|in)\\s+(.+)$/iu,\n );\n if (!match) {\n return undefined;\n }\n const [, fieldNameRaw, operatorRaw, valueRaw] = match;\n const fieldName = fieldNameRaw.trim();\n if (!fieldName) {\n return undefined;\n }\n const operator = this.normalizeOperator(operatorRaw);\n if (!operator) {\n return undefined;\n }\n const normalizedValueRaw = valueRaw.trim();\n let value: any = normalizedValueRaw;\n try {\n value = JSON.parse(normalizedValueRaw);\n } catch {\n value = normalizedValueRaw.replace(/^['\"]|['\"]$/g, '');\n }\n const nodeId = uuidv4();\n const config: any = {\n type: 'fieldCondition',\n fieldName,\n operator,\n value,\n };\n return {\n id: nodeId,\n type: RuleNodeType.FIELD_CONDITION,\n config,\n };\n }\n\n private normalizeOperator(operator: string | undefined): string | undefined {\n if (!operator) {\n return undefined;\n }\n const normalized = operator.toLowerCase().replace(/[_\\s]/g, '');\n\n switch (normalized) {\n case 'eq':\n case 'equals':\n case '==':\n case '=':\n return 'eq';\n\n case 'neq':\n case 'notequals':\n case '!=':\n case '<>':\n return 'neq';\n\n case 'lt':\n case 'lessthan':\n case '<':\n return 'lt';\n\n case 'lte':\n case 'lessthanorequal':\n case '<=':\n return 'lte';\n\n case 'gt':\n case 'greaterthan':\n case '>':\n return 'gt';\n\n case 'gte':\n case 'greaterthanorequal':\n case '>=':\n return 'gte';\n\n case 'contains':\n return 'contains';\n\n case 'startswith':\n return 'startsWith';\n\n case 'endswith':\n return 'endsWith';\n\n case 'in':\n return 'in';\n\n default:\n return operator;\n }\n }\n\n private prefixTarget(targetType: FormLayoutRule['targetType'], value: string): string {\n if (targetType === 'section') return `section:${value}`;\n if (targetType === 'action') return `action:${value}`;\n if (targetType === 'row') return `row:${value}`;\n if (targetType === 'column') return `column:${value}`;\n return value;\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 // Create a copy of the node for the flat structure\n // IMPORTANT: The children array in the flat structure must contain ONLY strings (IDs)\n // to match the RuleNode interface and avoid \"Unknown\" blocks in the UI\n const flatNode: RuleNode = {\n ...node,\n children: [], // Will be populated with IDs below\n };\n\n // Recursively flatten children if they exist\n if (node.children && node.children.length > 0) {\n const childIds: string[] = [];\n\n // Process each child\n (node.children as any[]).forEach((child: any) => {\n if (typeof child === 'string') {\n // It's already an ID\n childIds.push(child);\n // Note: If it's just an ID, we assume the node exists elsewhere or will be added\n } else if (child && typeof child === 'object' && child.id) {\n // It's a RuleNode object - flatten it recursively\n child.parentId = node.id;\n flattenNode(child);\n childIds.push(child.id);\n }\n });\n\n flatNode.children = childIds;\n }\n\n // Store the node in the flat structure\n nodes[node.id] = flatNode;\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 { 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 // Fallback to the formRules payload exported by the builder (covers property rules)\n const payload = this.ruleBuilderService.export({\n format: 'json',\n prettyPrint: options.prettyPrint,\n });\n return payload;\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';\nimport { ExportOptions } from '../models/rule-builder.model';\n\nexport interface ExportDialogData {\n title?: string;\n allowMultipleFormats?: boolean;\n preselectedFormat?: string;\n showIntegrationTab?: boolean;\n showSharingTab?: boolean;\n onExport?: (options: ExportOptions) => void;\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Will be auto-generated if not specified'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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: 80vh;\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: auto;\n max-height: calc(80vh - 120px);\n }\n\n .tab-content {\n padding: 16px 0;\n min-height: 0;\n max-height: calc(80vh - 180px);\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(--md-sys-color-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(--md-sys-color-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 { border-color: var(--md-sys-color-primary); background: var(--md-sys-color-primary-container); }\n\n .format-description {\n font-size: 13px;\n color: var(--md-sys-color-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 { color: var(--md-sys-color-tertiary); }\n\n .error-icon { color: var(--md-sys-color-error); }\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 { color: var(--md-sys-color-error); }\n\n .error-item { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); padding: 8px; border-radius: 4px; margin-bottom: 4px; }\n\n .system-info {\n margin-top: 16px;\n }\n\n .info-card { background: var(--md-sys-color-surface-variant); }\n\n .system-details {\n margin-bottom: 16px;\n }\n\n .integration-result {\n margin-bottom: 16px;\n }\n\n .success-card { border-left: 4px solid var(--md-sys-color-tertiary); }\n\n .error-card { border-left: 4px solid var(--md-sys-color-error); }\n\n .sharing-form {\n max-width: 400px;\n }\n\n .share-card { margin-top: 16px; border-left: 4px solid var(--md-sys-color-primary); }\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: var(--pdx-dialog-actions-padding, 12px 24px 16px);\n position: sticky;\n bottom: 0;\n background: var(--md-sys-color-surface);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n z-index: 2;\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 .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\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 const primaryFormat = formats[0] as ExportOptions['format'];\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 this.data?.onExport?.({\n format: primaryFormat,\n includeMetadata: formValue.includeMetadata,\n prettyPrint: formValue.prettyPrint,\n includeComments: formValue.includeComments,\n config: {\n batchFormats: this.enableBatchExport ? formats : undefined,\n },\n });\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 OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms';\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 { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport {\n type RulePropertyDefinition,\n type RulePropertyType,\n} from '@praxisui/core';\n\nexport interface PropertyEffectConfig {\n properties: Record<string, any>;\n propertiesWhenFalse?: Record<string, any>;\n}\n\ninterface PropertyEntry {\n property: string;\n type: RulePropertyType;\n value?: any;\n valueWhenFalse?: any;\n jsonValue?: string;\n jsonValueWhenFalse?: string;\n error?: string;\n errorWhenFalse?: string;\n}\n\n@Component({\n selector: 'praxis-property-effect-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatButtonToggleModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"property-effect-editor\">\n <div class=\"header\">\n <div class=\"title\">Propriedades (whitelist)</div>\n <button\n mat-stroked-button\n color=\"primary\"\n (click)=\"addEntry()\"\n [disabled]=\"!canAddEntry()\"\n >\n <mat-icon>add</mat-icon>\n Adicionar propriedade\n </button>\n </div>\n\n <div class=\"empty\" *ngIf=\"entries.length === 0\">\n Nenhuma propriedade selecionada. Adicione uma para configurar o efeito.\n </div>\n\n <div class=\"property-card\" *ngFor=\"let entry of entries; let i = index\">\n <div class=\"property-row\">\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Propriedade</mat-label>\n <mat-select\n [(ngModel)]=\"entry.property\"\n (selectionChange)=\"onPropertyChange(entry)\"\n (opened)=\"onOpenDropdown(i)\"\n (closed)=\"onCloseDropdown()\"\n >\n <div class=\"select-search-container\">\n <mat-form-field appearance=\"outline\" class=\"w-100 search-input-field\" density=\"compact\" subscriptSizing=\"dynamic\">\n <mat-icon matPrefix>search</mat-icon>\n <input #searchInput matInput [formControl]=\"searchControl\" placeholder=\"Filtrar...\" \n (keydown.space)=\"$event.stopPropagation()\" \n (keydown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n autocomplete=\"off\">\n <button *ngIf=\"searchControl.value\" matSuffix mat-icon-button aria-label=\"Limpar\" (click)=\"clearSearch($event)\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <mat-option\n *ngFor=\"let prop of getFilteredOptions(entry, i)\"\n [value]=\"prop.name\"\n >\n <div class=\"option-content\">\n <span class=\"option-label\">{{ prop.label || prop.name }}</span>\n <span class=\"option-id\" *ngIf=\"prop.label && prop.name !== prop.label\">#{{ prop.name }}</span>\n </div>\n </mat-option>\n\n <mat-option *ngIf=\"!getFilteredOptions(entry, i).length\" disabled class=\"no-results\">\n Nenhuma propriedade encontrada.\n </mat-option>\n </mat-select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n *ngIf=\"getDefinition(entry.property)?.description\"\n [matTooltip]=\"getDefinition(entry.property)?.description\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"removeEntry(i)\"\n [disabled]=\"entries.length === 1 && !canAddEntry()\"\n matTooltip=\"Remover propriedade\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n\n <div class=\"value-columns\" *ngIf=\"entry.property\">\n <div class=\"value-block\">\n <div class=\"value-label\">\n Valor quando verdadeiro\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"clearValue(entry, 'true')\"\n matTooltip=\"Limpar (usa padrão / null)\"\n >\n <mat-icon>backspace</mat-icon>\n </button>\n </div>\n <ng-container [ngSwitch]=\"entry.type\">\n <mat-button-toggle-group\n *ngSwitchCase=\"'boolean'\"\n [(ngModel)]=\"entry.value\"\n (ngModelChange)=\"emitChange()\"\n aria-label=\"Valor booleano\"\n >\n <mat-button-toggle [value]=\"true\">Verdadeiro</mat-button-toggle>\n <mat-button-toggle [value]=\"false\">Falso</mat-button-toggle>\n <mat-button-toggle [value]=\"null\">Padrão (null)</mat-button-toggle>\n </mat-button-toggle-group>\n\n <mat-form-field\n appearance=\"outline\"\n class=\"w-100\"\n *ngSwitchCase=\"'number'\"\n >\n <mat-label>Valor numérico</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"entry.value\"\n (ngModelChange)=\"emitChange()\"\n />\n </mat-form-field>\n\n <mat-form-field\n appearance=\"outline\"\n class=\"w-100\"\n *ngSwitchCase=\"'enum'\"\n >\n <mat-label>Selecione</mat-label>\n <mat-select\n [(ngModel)]=\"entry.value\"\n (selectionChange)=\"emitChange()\"\n >\n <mat-option [value]=\"null\">Padrão (null)</mat-option>\n <mat-option\n *ngFor=\"let opt of getEnumValues(entry.property)\"\n [value]=\"opt.value\"\n >\n {{ opt.label || opt.value }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field\n appearance=\"outline\"\n class=\"w-100\"\n *ngSwitchCase=\"'string'\"\n >\n <mat-label>Texto</mat-label>\n <input\n matInput\n [(ngModel)]=\"entry.value\"\n (ngModelChange)=\"emitChange()\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"w-100\" *ngSwitchDefault>\n <mat-label>JSON</mat-label>\n <textarea\n matInput\n rows=\"4\"\n [(ngModel)]=\"entry.jsonValue\"\n (ngModelChange)=\"emitChange()\"\n placeholder='Ex.: {\"color\":\"red\"}'\n ></textarea>\n <mat-error *ngIf=\"entry.error\">{{ entry.error }}</mat-error>\n </mat-form-field>\n </ng-container>\n </div>\n\n <div class=\"value-block\">\n <div class=\"value-label\">\n Valor quando falso (opcional)\n <button\n mat-icon-button\n type=\"button\"\n (click)=\"clearValue(entry, 'false')\"\n matTooltip=\"Limpar (usa padrão / null)\"\n >\n <mat-icon>backspace</mat-icon>\n </button>\n </div>\n <ng-container [ngSwitch]=\"entry.type\">\n <mat-button-toggle-group\n *ngSwitchCase=\"'boolean'\"\n [(ngModel)]=\"entry.valueWhenFalse\"\n (ngModelChange)=\"emitChange()\"\n aria-label=\"Valor booleano (falso)\"\n >\n <mat-button-toggle [value]=\"true\">Verdadeiro</mat-button-toggle>\n <mat-button-toggle [value]=\"false\">Falso</mat-button-toggle>\n <mat-button-toggle [value]=\"null\">Padrão (null)</mat-button-toggle>\n </mat-button-toggle-group>\n\n <mat-form-field\n appearance=\"outline\"\n class=\"w-100\"\n *ngSwitchCase=\"'number'\"\n >\n <mat-label>Valor numérico</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"entry.valueWhenFalse\"\n (ngModelChange)=\"emitChange()\"\n />\n </mat-form-field>\n\n <mat-form-field\n appearance=\"outline\"\n class=\"w-100\"\n *ngSwitchCase=\"'enum'\"\n >\n <mat-label>Selecione</mat-label>\n <mat-select\n [(ngModel)]=\"entry.valueWhenFalse\"\n (selectionChange)=\"emitChange()\"\n >\n <mat-option [value]=\"null\">Padrão (null)</mat-option>\n <mat-option\n *ngFor=\"let opt of getEnumValues(entry.property)\"\n [value]=\"opt.value\"\n >\n {{ opt.label || opt.value }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field\n appearance=\"outline\"\n class=\"w-100\"\n *ngSwitchCase=\"'string'\"\n >\n <mat-label>Texto</mat-label>\n <input\n matInput\n [(ngModel)]=\"entry.valueWhenFalse\"\n (ngModelChange)=\"emitChange()\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"w-100\" *ngSwitchDefault>\n <mat-label>JSON</mat-label>\n <textarea\n matInput\n rows=\"4\"\n [(ngModel)]=\"entry.jsonValueWhenFalse\"\n (ngModelChange)=\"emitChange()\"\n placeholder='Ex.: {\"color\":null}'\n ></textarea>\n <mat-error *ngIf=\"entry.errorWhenFalse\">\n {{ entry.errorWhenFalse }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"preview\" *ngIf=\"entries.length\">\n <div class=\"preview-title\">Preview</div>\n <div class=\"preview-panels\">\n <div class=\"preview-pane\">\n <div class=\"pane-label\">Quando verdadeiro</div>\n <pre>{{ preview.properties | json }}</pre>\n </div>\n <div class=\"preview-pane\">\n <div class=\"pane-label\">Quando falso</div>\n <pre>{{ preview.propertiesWhenFalse | json }}</pre>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .property-effect-editor {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n .title {\n font-weight: 600;\n }\n .property-card {\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px;\n padding: 12px;\n background: var(--md-sys-color-surface);\n }\n .property-row {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n .field {\n flex: 1;\n }\n .value-columns {\n display: grid;\n gap: 12px;\n grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n margin-top: 12px;\n }\n .value-block {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 8px;\n border: 1px dashed var(--md-sys-color-outline-variant);\n border-radius: 8px;\n background: var(--md-sys-color-surface-container-low);\n }\n .value-label {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n font-size: 12px;\n font-weight: 600;\n color: var(--md-sys-color-on-surface-variant);\n }\n .preview {\n border-top: 1px solid var(--md-sys-color-outline-variant);\n padding-top: 8px;\n }\n .preview-title {\n font-size: 14px;\n font-weight: 600;\n margin-bottom: 8px;\n }\n .preview-panels {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 8px;\n }\n .preview-pane {\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 6px;\n padding: 8px;\n background: var(--md-sys-color-surface-container);\n }\n .pane-label {\n font-size: 12px;\n color: var(--md-sys-color-on-surface-variant);\n margin-bottom: 4px;\n }\n pre {\n margin: 0;\n background: transparent;\n font-size: 12px;\n line-height: 1.4;\n }\n .empty {\n color: var(--md-sys-color-on-surface-variant);\n font-size: 13px;\n padding: 8px;\n border: 1px dashed var(--md-sys-color-outline-variant);\n border-radius: 6px;\n }\n .w-100 {\n width: 100%;\n }\n \n /* Search in Select Styles */\n .select-search-container {\n position: sticky;\n top: 0;\n z-index: 1;\n background: var(--md-sys-color-surface-container-lowest, #fff);\n padding: 8px 16px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,0.12));\n }\n \n .search-input-field {\n width: 100%;\n }\n \n .search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper {\n display: none;\n }\n \n .option-content {\n display: flex;\n flex-direction: column;\n line-height: 1.2;\n padding: 4px 0;\n }\n \n .option-label {\n font-weight: 500;\n }\n \n .option-id {\n font-size: 11px;\n opacity: 0.6;\n }\n \n .no-results {\n font-style: italic;\n font-size: 13px;\n text-align: center;\n }\n .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\n `,\n ],\n})\nexport class PropertyEffectEditorComponent implements OnInit, OnChanges {\n @Input() properties: RulePropertyDefinition[] = [];\n @Input() initialConfig: PropertyEffectConfig | null = null;\n @Output() configChanged = new EventEmitter<PropertyEffectConfig>();\n\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n entries: PropertyEntry[] = [];\n searchControl = new FormControl('', { nonNullable: true });\n activeRowIndex: number = -1;\n private lastAppliedConfigSignature: string | null = null;\n\n ngOnInit(): void {\n this.applyConfig(this.initialConfig);\n }\n\n onOpenDropdown(index: number): void {\n this.activeRowIndex = index;\n this.searchControl.setValue('');\n this.focusSearchInput();\n }\n\n onCloseDropdown(): void {\n this.activeRowIndex = -1;\n this.searchControl.setValue('');\n }\n\n getFilteredOptions(entry: PropertyEntry, index: number): RulePropertyDefinition[] {\n const available = this.availableProps(entry.property);\n \n if (index !== this.activeRowIndex) {\n return available;\n }\n\n const search = this.searchControl.value.toLowerCase();\n if (!search) {\n return available;\n }\n\n return available.filter(p => \n p.label?.toLowerCase().includes(search) || \n p.name.toLowerCase().includes(search)\n );\n }\n\n focusSearchInput(): void {\n setTimeout(() => this.searchInput?.nativeElement.focus(), 100);\n }\n\n clearSearch(event: Event): void {\n event.stopPropagation();\n this.searchControl.setValue('');\n this.searchInput?.nativeElement.focus();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['initialConfig'] && !changes['initialConfig'].firstChange) {\n this.applyConfig(changes['initialConfig'].currentValue);\n }\n\n if (changes['properties'] && !changes['properties'].firstChange) {\n // Re-apply current values to respect new schema/whitelist\n this.applyConfig(this.buildConfigFromEntries());\n }\n }\n\n addEntry(): void {\n const available = this.availableProps();\n if (!available.length) return;\n const next = available[0];\n this.entries.push(this.createEntry(next));\n this.emitChange();\n }\n\n removeEntry(index: number): void {\n this.entries.splice(index, 1);\n this.emitChange();\n }\n\n clearValue(entry: PropertyEntry, branch: 'true' | 'false'): void {\n if (branch === 'true') {\n entry.value = null;\n entry.jsonValue = entry.type === 'object' ? '' : entry.value;\n entry.error = undefined;\n } else {\n entry.valueWhenFalse = null;\n entry.jsonValueWhenFalse = entry.type === 'object' ? '' : entry.valueWhenFalse;\n entry.errorWhenFalse = undefined;\n }\n this.emitChange();\n }\n\n onPropertyChange(entry: PropertyEntry): void {\n const def = this.getDefinition(entry.property);\n if (!def) {\n entry.type = 'string';\n entry.value = undefined;\n entry.valueWhenFalse = undefined;\n entry.jsonValue = '';\n entry.jsonValueWhenFalse = '';\n } else {\n entry.type = def.type;\n entry.value = def.type === 'boolean' ? true : undefined;\n entry.valueWhenFalse = undefined;\n entry.jsonValue = def.type === 'object' ? '' : undefined;\n entry.jsonValueWhenFalse = def.type === 'object' ? '' : undefined;\n }\n entry.error = undefined;\n entry.errorWhenFalse = undefined;\n this.emitChange();\n }\n\n availableProps(current?: string): RulePropertyDefinition[] {\n const used = new Set(this.entries.map((e) => e.property).filter((p) => p && p !== current));\n return this.properties.filter((p) => !used.has(p.name));\n }\n\n canAddEntry(): boolean {\n return this.availableProps().length > 0;\n }\n\n getDefinition(name?: string): RulePropertyDefinition | undefined {\n return this.properties.find((p) => p.name === name);\n }\n\n getEnumValues(name?: string): Array<{ value: string; label?: string }> {\n return this.getDefinition(name)?.enumValues || [];\n }\n\n get preview(): PropertyEffectConfig {\n return this.buildConfigFromEntries();\n }\n\n emitChange(): void {\n const config = this.buildConfigFromEntries();\n const nextSignature = this.signature(config);\n if (nextSignature === this.lastAppliedConfigSignature) {\n return;\n }\n this.configChanged.emit(config);\n this.lastAppliedConfigSignature = nextSignature;\n }\n\n private applyConfig(config: PropertyEffectConfig | null | undefined): void {\n const incomingSignature = this.signature(config);\n const currentSignature = this.signature(this.buildConfigFromEntries());\n if (incomingSignature === currentSignature) {\n return;\n }\n\n const props = config?.properties || {};\n const propsFalse = config?.propertiesWhenFalse || {};\n const keys = Array.from(new Set([...Object.keys(props), ...Object.keys(propsFalse)]));\n const entries: PropertyEntry[] = [];\n\n // If there are no properties coming in but the user already has entries, keep the current selection.\n if (!keys.length && this.entries.length) {\n return;\n }\n\n keys.forEach((name) => {\n const def = this.getDefinition(name);\n if (!def) return;\n const entry: PropertyEntry = this.createEntry(def);\n entry.property = name;\n entry.value = def.type === 'object' ? undefined : props[name];\n entry.valueWhenFalse = def.type === 'object' ? undefined : propsFalse[name];\n entry.jsonValue = def.type === 'object' ? this.stringifyValue(props[name]) : undefined;\n entry.jsonValueWhenFalse =\n def.type === 'object' ? this.stringifyValue(propsFalse[name]) : undefined;\n entries.push(entry);\n });\n\n if (!entries.length && this.properties.length) {\n entries.push(this.createEntry(this.properties[0]));\n this.entries = entries;\n this.emitChange();\n } else {\n this.entries = entries;\n }\n this.lastAppliedConfigSignature = incomingSignature;\n }\n\n private createEntry(def: RulePropertyDefinition): PropertyEntry {\n return {\n property: def.name,\n type: def.type,\n value: def.type === 'boolean' ? true : undefined,\n valueWhenFalse: undefined,\n jsonValue: def.type === 'object' ? '' : undefined,\n jsonValueWhenFalse: def.type === 'object' ? '' : undefined,\n };\n }\n\n private buildConfigFromEntries(): PropertyEffectConfig {\n const properties: Record<string, any> = {};\n const propertiesWhenFalse: Record<string, any> = {};\n\n this.entries.forEach((entry) => {\n const def = this.getDefinition(entry.property);\n if (!def) return;\n\n const normalizedTrue = this.normalizeValue(entry, 'true');\n entry.error = normalizedTrue.error;\n if (normalizedTrue.ok && normalizedTrue.value !== undefined) {\n properties[entry.property] = normalizedTrue.value;\n }\n\n const normalizedFalse = this.normalizeValue(entry, 'false');\n entry.errorWhenFalse = normalizedFalse.error;\n if (normalizedFalse.ok && normalizedFalse.value !== undefined) {\n propertiesWhenFalse[entry.property] = normalizedFalse.value;\n }\n });\n\n return {\n properties,\n propertiesWhenFalse:\n Object.keys(propertiesWhenFalse).length > 0 ? propertiesWhenFalse : undefined,\n };\n }\n\n private normalizeValue(\n entry: PropertyEntry,\n branch: 'true' | 'false',\n ): { ok: boolean; value?: any; error?: string } {\n const type = entry.type;\n const raw =\n type === 'object'\n ? branch === 'true'\n ? entry.jsonValue\n : entry.jsonValueWhenFalse\n : branch === 'true'\n ? entry.value\n : entry.valueWhenFalse;\n\n if (raw === undefined || raw === '') {\n return { ok: true, value: undefined };\n }\n\n if (raw === null) {\n return { ok: true, value: null };\n }\n\n switch (type) {\n case 'boolean':\n return { ok: typeof raw === 'boolean', value: typeof raw === 'boolean' ? raw : undefined, error: typeof raw === 'boolean' ? undefined : 'Valor inválido' };\n case 'number': {\n const num = typeof raw === 'number' ? raw : Number(raw);\n if (Number.isNaN(num)) return { ok: false, error: 'Informe um número' };\n return { ok: true, value: num };\n }\n case 'enum': {\n const def = this.getDefinition(entry.property);\n const allowed = def?.enumValues?.map((e) => e.value) || [];\n if (allowed.length && !allowed.includes(raw as any)) {\n return { ok: false, error: 'Valor fora das opções' };\n }\n return { ok: true, value: raw };\n }\n case 'string':\n return { ok: true, value: String(raw) };\n default: {\n const parsedResult = this.parseObject(raw, entry.property);\n if (!parsedResult.ok) {\n return { ok: false, error: parsedResult.error || 'JSON inválido' };\n }\n return { ok: true, value: parsedResult.value };\n }\n }\n }\n\n private parseObject(raw: unknown, propertyName: string): { ok: boolean; value?: any; error?: string } {\n let value: any = raw;\n if (typeof raw === 'string') {\n try {\n value = JSON.parse(raw);\n } catch {\n return { ok: false, error: 'JSON inválido' };\n }\n }\n if (propertyName === 'options') {\n if (Array.isArray(value)) {\n return { ok: true, value: { items: value } };\n }\n if (value && typeof value === 'object' && Array.isArray(value.items)) {\n return { ok: true, value };\n }\n }\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return { ok: false, error: 'Informe um objeto' };\n }\n return { ok: true, value };\n }\n\n private stringifyValue(value: any): string {\n if (value === undefined) return '';\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return '';\n }\n }\n\n private signature(config: PropertyEffectConfig | null | undefined): string {\n try {\n return JSON.stringify(config || {});\n } catch {\n return '';\n }\n }\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 /** Logical origin to help context-sensitive filtering (form field, section, row, column, table column, etc.) */\n origin?: 'field' | 'section' | 'action' | 'row' | 'column' | 'tableField' | 'tableColumn';\n \n /** Field data type */\n type: FieldType | string;\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<string, string[]> = {\n [FieldType.STRING]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'notMatches', 'isEmpty', 'isNotEmpty', 'isNull', 'isNotNull', 'in', 'notIn'],\n [FieldType.NUMBER]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'in', 'notIn', 'between', 'isNull', 'isNotNull'],\n [FieldType.INTEGER]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'in', 'notIn', 'between', 'isNull', 'isNotNull'],\n [FieldType.BOOLEAN]: ['equals', 'notEquals', 'isTrue', 'isFalse', 'isNull', 'isNotNull'],\n [FieldType.DATE]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull', 'isEmpty', 'isNotEmpty'],\n [FieldType.DATETIME]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull', 'isEmpty', 'isNotEmpty'],\n [FieldType.TIME]: ['equals', 'notEquals', 'greaterThan', 'greaterThanOrEqual', 'lessThan', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull'],\n [FieldType.EMAIL]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'notMatches', 'isEmpty', 'isNotEmpty', 'isNull', 'isNotNull'],\n [FieldType.URL]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'matches', 'notMatches', 'isEmpty', 'isNotEmpty', 'isNull', 'isNotNull'],\n [FieldType.PHONE]: ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'matches', 'notMatches', 'isEmpty', 'isNotEmpty', 'isNull', 'isNotNull'],\n [FieldType.ARRAY]: ['isEmpty', 'isNotEmpty', 'minLength', 'maxLength', 'contains', 'notContains', 'isNull', 'isNotNull'],\n [FieldType.OBJECT]: ['isNull', 'isNotNull', 'isEmpty', 'isNotEmpty', 'hasProperty', 'notHasProperty'],\n [FieldType.ENUM]: ['equals', 'notEquals', 'in', 'notIn', 'isNull', 'isNotNull'],\n [FieldType.UUID]: ['equals', 'notEquals', 'matches', 'notMatches', 'isEmpty', 'isNotEmpty', 'isNull', 'isNotNull'],\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: 'igual a',\n notEquals: 'diferente de',\n greaterThan: 'maior que',\n greaterThanOrEqual: 'maior ou igual a',\n lessThan: 'menor que',\n lessThanOrEqual: 'menor ou igual a',\n contains: 'contém',\n notContains: 'não contém',\n startsWith: 'começa com',\n endsWith: 'termina com',\n matches: 'corresponde ao padrão',\n notMatches: 'não corresponde ao padrão',\n isEmpty: 'está vazio',\n isNotEmpty: 'não está vazio',\n isNull: 'é nulo',\n isNotNull: 'não é nulo',\n isTrue: 'é verdadeiro',\n isFalse: 'é falso',\n in: 'está em',\n notIn: 'não está em',\n between: 'entre',\n minLength: 'tamanho mínimo',\n maxLength: 'tamanho máximo',\n hasProperty: 'possui propriedade',\n notHasProperty: 'não possui propriedade'\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}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n ViewChild,\n ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ReactiveFormsModule,\n FormBuilder,\n FormGroup,\n FormControl,\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 compact-grid\">\n <div class=\"condition-row\">\n <!-- Campo -->\n <mat-form-field appearance=\"outline\" class=\"compact-field\">\n <mat-label>Campo</mat-label>\n <mat-select\n formControlName=\"fieldName\"\n (selectionChange)=\"onFieldChanged($event)\"\n (opened)=\"focusSearchInput()\"\n >\n <mat-select-trigger>\n {{ selectedField?.label || conditionForm.get('fieldName')?.value }}\n </mat-select-trigger>\n\n <div class=\"select-search-container\">\n <mat-form-field appearance=\"outline\" class=\"w-100 search-input-field\" density=\"compact\" subscriptSizing=\"dynamic\">\n <mat-icon matPrefix>search</mat-icon>\n <input #searchInput matInput [formControl]=\"searchControl\" placeholder=\"Filtrar campos...\" \n (keydown.space)=\"$event.stopPropagation()\" \n (keydown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n autocomplete=\"off\">\n <button *ngIf=\"searchControl.value\" matSuffix mat-icon-button aria-label=\"Limpar\" (click)=\"clearSearch($event)\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <mat-optgroup\n *ngFor=\"let category of filteredFieldCategories\"\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 <div class=\"field-info\">\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-name\" *ngIf=\"field.name !== field.label\">#{{ field.name }}</span>\n </div>\n <span class=\"field-type\">{{ field.type }}</span>\n </div>\n </mat-option>\n </mat-optgroup>\n\n <mat-option *ngIf=\"!filteredFieldCategories.length\" disabled class=\"no-results\">\n Nenhum campo encontrado.\n </mat-option>\n </mat-select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n *ngIf=\"selectedField?.description\"\n [matTooltip]=\"selectedField?.description\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <!-- Operador -->\n <mat-form-field appearance=\"outline\" class=\"compact-field\" *ngIf=\"selectedField\">\n <mat-label>Operador</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\n <!-- Valor / Tipo -->\n <div class=\"value-inline\" *ngIf=\"selectedField && selectedOperator && needsValue()\">\n <mat-form-field appearance=\"outline\" class=\"value-type-select compact-field\">\n <mat-label>Valor/Tipo</mat-label>\n <mat-select\n formControlName=\"valueType\"\n (selectionChange)=\"onValueTypeChanged($event)\"\n >\n <mat-option value=\"literal\">Valor digitado</mat-option>\n <mat-option value=\"field\">Outro campo</mat-option>\n <mat-option value=\"context\">Variável de contexto</mat-option>\n <mat-option value=\"function\">Chamada de função</mat-option>\n </mat-select>\n </mat-form-field>\n\n <ng-container [ngSwitch]=\"valueType\">\n <!-- Literal Value Input -->\n <ng-container *ngSwitchCase=\"'literal'\">\n <mat-form-field\n *ngIf=\"isStringField() || isNumberField()\"\n appearance=\"outline\"\n class=\"compact-field value-field\"\n >\n <mat-label>Valor</mat-label>\n <input\n matInput\n [type]=\"isNumberField() ? 'number' : 'text'\"\n formControlName=\"value\"\n [placeholder]=\"getValuePlaceholder()\"\n />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"getValueHint()\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <div *ngIf=\"isBooleanField()\" class=\"boolean-inline\">\n <mat-checkbox formControlName=\"value\">\n {{ getBooleanLabel() }}\n </mat-checkbox>\n </div>\n\n <mat-form-field\n *ngIf=\"isDateField()\"\n appearance=\"outline\"\n class=\"compact-field value-field\"\n >\n <mat-label>Data</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 <mat-form-field\n *ngIf=\"isEnumField()\"\n appearance=\"outline\"\n class=\"compact-field value-field\"\n >\n <mat-label>Valor</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 <mat-form-field *ngIf=\"isArrayOperator()\" appearance=\"outline\" class=\"compact-field value-field\">\n <mat-label>Valores (vírgula)</mat-label>\n <input\n matInput\n formControlName=\"value\"\n placeholder=\"valor1, valor2, valor3\"\n />\n </mat-form-field>\n </ng-container>\n\n <!-- Field Reference Input -->\n <mat-form-field\n *ngSwitchCase=\"'field'\"\n appearance=\"outline\"\n class=\"compact-field value-field\"\n >\n <mat-label>Comparar com</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 *ngSwitchCase=\"'context'\"\n appearance=\"outline\"\n class=\"compact-field value-field\"\n >\n <mat-label>Variável</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-form-field>\n\n <!-- Function Call Input -->\n <mat-form-field\n *ngSwitchCase=\"'function'\"\n appearance=\"outline\"\n class=\"compact-field value-field\"\n >\n <mat-label>Função</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 </ng-container>\n </div>\n\n <!-- Ações -->\n <div class=\"actions-col\">\n <button mat-icon-button type=\"button\" aria-label=\"Duplicar\" matTooltip=\"Duplicar (placeholder)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n <button mat-icon-button type=\"button\" aria-label=\"Excluir\" matTooltip=\"Excluir (placeholder)\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"no-fields-hint\" *ngIf=\"!hasFieldOptions()\">\n <mat-icon>info</mat-icon>\n <span>Nenhum campo disponível para este contexto. Selecione outro alvo ou configure campos.</span>\n </div>\n\n <!-- Validation Messages -->\n <div class=\"error-row\" *ngIf=\"hasValidationErrors()\">\n <mat-icon>error</mat-icon>\n <span>{{ getValidationErrors().join(' · ') }}</span>\n </div>\n\n <!-- Preview -->\n <div class=\"condition-preview\" *ngIf=\"isValid()\">\n <div class=\"preview-label\">Pré-visualização:</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: 8px;\n min-width: 300px;\n background: var(--md-sys-color-surface-container-low);\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px;\n padding: 8px 10px;\n overflow: visible;\n }\n\n .condition-row-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-bottom: 4px;\n }\n\n .condition-title {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: var(--md-sys-color-on-surface);\n }\n\n .compact-grid {\n gap: 12px;\n }\n\n .condition-row {\n display: grid;\n grid-template-columns: minmax(180px, 2fr) minmax(140px, 1.5fr) minmax(220px, 3fr) auto;\n gap: 12px 4px;\n align-items: center;\n }\n\n .compact-field {\n width: 100%;\n }\n\n .value-inline {\n display: grid;\n grid-template-columns: 1.2fr 2fr;\n gap: 8px;\n align-items: center;\n }\n\n .value-field {\n width: 100%;\n }\n\n .actions-col {\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: center;\n justify-content: center;\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(--md-sys-color-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(--md-sys-color-on-surface-variant);\n background: var(--md-sys-color-surface-container);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n /* Search in Select Styles */\n .select-search-container {\n position: sticky;\n top: 0;\n z-index: 1;\n background: var(--md-sys-color-surface-container-lowest, #fff);\n padding: 8px 16px;\n border-bottom: 1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,0.12));\n }\n \n .search-input-field {\n width: 100%;\n }\n \n .search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper {\n display: none;\n }\n \n .no-results {\n font-style: italic;\n font-size: 13px;\n text-align: center;\n }\n\n .field-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n line-height: 1.2;\n overflow: hidden;\n }\n\n .field-name {\n font-size: 10px;\n opacity: 0.6;\n }\n\n .variable-name {\n font-family: monospace;\n font-weight: 500;\n color: var(--md-sys-color-secondary);\n }\n\n .variable-type {\n font-size: 11px;\n color: var(--md-sys-color-on-surface-variant);\n background: var(--md-sys-color-surface-container);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .function-name {\n font-weight: 500;\n color: var(--md-sys-color-tertiary);\n }\n\n .function-desc {\n font-size: 12px;\n color: var(--md-sys-color-on-surface-variant);\n font-style: italic;\n }\n\n .boolean-inline {\n display: flex;\n align-items: center;\n padding: 4px 0;\n }\n\n .condition-preview {\n background: var(--md-sys-color-surface-container);\n border-radius: 8px;\n padding: 8px 12px;\n border-left: 4px solid var(--md-sys-color-primary);\n margin-top: 2px;\n }\n\n .preview-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--md-sys-color-on-surface-variant);\n margin-bottom: 2px;\n }\n\n .preview-text {\n font-family: monospace;\n font-size: 14px;\n color: var(--md-sys-color-on-surface);\n background: var(--md-sys-color-surface);\n padding: 6px 8px;\n border-radius: 4px;\n border: 1px solid var(--md-sys-color-outline-variant);\n }\n\n .error-row {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n border: 1px solid var(--md-sys-color-error);\n border-radius: 8px;\n padding: 4px 10px;\n font-size: 12px;\n min-height: 32px;\n }\n\n @media (max-width: 1024px) {\n .condition-row {\n grid-template-columns: repeat(2, minmax(180px, 1fr));\n }\n\n .value-inline {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 768px) {\n .condition-row {\n grid-template-columns: 1fr;\n }\n }\n\n .no-fields-hint {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--md-sys-color-on-surface-variant);\n padding: 8px 0;\n }\n\n /* Ensure the select overlay scrollbar is visible on dark themes */\n :host ::ng-deep .mat-mdc-select-panel {\n scrollbar-width: thin;\n scrollbar-color: var(--md-sys-color-on-surface-variant) transparent;\n }\n\n :host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar {\n width: 8px;\n }\n\n :host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-thumb {\n background-color: var(--md-sys-color-on-surface-variant);\n border-radius: 8px;\n }\n\n :host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-track {\n background-color: transparent;\n }\n .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\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 @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n private destroy$ = new Subject<void>();\n\n conditionForm: FormGroup;\n searchControl = new FormControl('', { nonNullable: true });\n fieldCategories: { name: string; fields: FieldSchema[] }[] = [];\n filteredFieldCategories: { 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 focusSearchInput(): void {\n setTimeout(() => this.searchInput?.nativeElement.focus(), 100);\n }\n\n clearSearch(event: Event): void {\n event.stopPropagation();\n this.searchControl.setValue('');\n this.searchInput?.nativeElement.focus();\n }\n\n ngOnInit(): void {\n this.setupFieldCategories();\n this.setupFormSubscriptions();\n this.loadInitialConfig();\n\n this.searchControl.valueChanges\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.filterCategories();\n });\n }\n\n filterCategories(): void {\n const search = this.searchControl.value.toLowerCase();\n if (!search) {\n this.filteredFieldCategories = this.fieldCategories;\n return;\n }\n\n this.filteredFieldCategories = this.fieldCategories.map(category => ({\n ...category,\n fields: category.fields.filter(field => \n (field.label && field.label.toLowerCase().includes(search)) || \n field.name.toLowerCase().includes(search)\n )\n })).filter(category => category.fields.length > 0);\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 this.filterCategories();\n }\n\n private loadInitialConfig(): void {\n if (!this.config) return;\n\n const normalizedOperator = this.normalizeOperatorForForm(\n this.config.operator,\n );\n const normalizedFieldName = this.normalizeFieldName(\n this.config.fieldName,\n );\n const resolvedField =\n this.resolveFieldSchema(normalizedFieldName) || null;\n const formFieldName = resolvedField?.name || normalizedFieldName;\n\n this.conditionForm.patchValue({\n fieldName: formFieldName || '',\n operator: normalizedOperator || '',\n value:\n this.config.value !== undefined ? this.config.value : '',\n valueType: this.config.valueType || 'literal',\n compareToField: this.config.compareToField || '',\n contextVariable: this.config.contextVariable || '',\n });\n\n if (formFieldName) {\n this.onFieldChanged(formFieldName);\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 === undefined || value === null) {\n return null;\n }\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 private normalizeFieldName(fieldName?: string | null): string {\n if (!fieldName) return '';\n const trimmed = fieldName.trim();\n const [base] = trimmed.split('|');\n return base || trimmed;\n }\n\n private resolveFieldSchema(fieldName: string): FieldSchema | null {\n if (!fieldName) return null;\n const direct = this.fieldSchemas[fieldName];\n if (direct) {\n return direct;\n }\n\n const lower = fieldName.toLowerCase();\n const match = Object.values(this.fieldSchemas).find(\n (field) => field.name?.toLowerCase() === lower,\n );\n return match || null;\n }\n\n private normalizeOperatorForForm(operator?: string | null): string | null {\n if (!operator) {\n return null;\n }\n const normalized = operator.toString().replace(/[_\\s]/g, '').toLowerCase();\n switch (normalized) {\n case 'eq':\n case 'equals':\n case '==':\n case '=':\n return 'equals';\n case 'neq':\n case 'notequals':\n case '!=':\n case '<>':\n return 'notEquals';\n case 'gt':\n case 'greaterthan':\n case '>':\n return 'greaterThan';\n case 'gte':\n case 'greaterthanorequal':\n case '>=':\n return 'greaterThanOrEqual';\n case 'lt':\n case 'lessthan':\n case '<':\n return 'lessThan';\n case 'lte':\n case 'lessthanorequal':\n case '<=':\n return 'lessThanOrEqual';\n default:\n return operator;\n }\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 'Informe um valor';\n\n switch (this.selectedField.type) {\n case FieldType.STRING:\n case FieldType.EMAIL:\n case FieldType.URL:\n return 'Digite um texto';\n case FieldType.NUMBER:\n case FieldType.INTEGER:\n return 'Digite um número';\n case FieldType.PHONE:\n return '+1234567890';\n default:\n return 'Informe um valor';\n }\n }\n\n getValueHint(): string {\n if (!this.selectedField || !this.selectedOperator) return '';\n\n if (this.selectedOperator === 'matches') {\n return 'Use um padrão de expressão regular (ex.: ^[A-Z]{3}$)';\n }\n\n if (this.selectedField.format) {\n if (this.selectedField.format.minimum !== undefined) {\n return `Mínimo: ${this.selectedField.format.minimum}`;\n }\n }\n\n return '';\n }\n\n getBooleanLabel(): string {\n return this.selectedOperator === 'isTrue' ? 'Verdadeiro' : 'Valor';\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 'Preencha o campo e o operador para ver o resumo';\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) return 'null';\n if (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 rawFieldName = typeof event === 'string' ? event : event.value;\n const normalizedFieldName = this.normalizeFieldName(rawFieldName);\n const resolvedField = this.resolveFieldSchema(normalizedFieldName);\n\n if (resolvedField && resolvedField.name !== rawFieldName) {\n this.conditionForm.patchValue(\n { fieldName: resolvedField.name },\n { emitEvent: false },\n );\n } else if (!resolvedField && normalizedFieldName !== rawFieldName) {\n this.conditionForm.patchValue(\n { fieldName: normalizedFieldName },\n { emitEvent: false },\n );\n }\n\n this.selectedField = resolvedField;\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('Escolha o campo a avaliar');\n }\n\n if (!this.conditionForm.get('operator')?.value) {\n errors.push('Selecione um operador');\n }\n\n if (this.needsValue()) {\n const valueType = this.conditionForm.get('valueType')?.value;\n const valueControl = this.conditionForm.get('value');\n const valueProvided =\n valueControl && valueControl.value !== undefined && valueControl.value !== '';\n\n switch (valueType) {\n case 'literal':\n if (!valueProvided) {\n errors.push('Informe o valor esperado');\n }\n break;\n case 'field':\n if (!this.conditionForm.get('compareToField')?.value) {\n errors.push('Selecione o campo para comparar');\n }\n break;\n case 'context':\n if (!this.conditionForm.get('contextVariable')?.value) {\n errors.push('Escolha a variável de contexto');\n }\n break;\n case 'function':\n if (!this.conditionForm.get('functionName')?.value) {\n errors.push('Informe a função que será usada');\n }\n break;\n }\n }\n\n return errors;\n }\n\n isValid(): boolean {\n return this.conditionForm.valid && !this.hasValidationErrors();\n }\n\n hasFieldOptions(): boolean {\n return this.filteredFieldCategories.some((category) => category.fields.length > 0);\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>Tipo de validador</mat-label>\n <mat-select\n formControlName=\"validatorType\"\n (selectionChange)=\"onValidatorTypeChanged($event)\"\n >\n <mat-select-trigger>\n <div class=\"validator-trigger\" *ngIf=\"validatorTypeLabels[validatorType]\">\n <mat-icon class=\"trigger-icon\">{{ validatorTypeLabels[validatorType].icon }}</mat-icon>\n <span class=\"trigger-label\">{{ validatorTypeLabels[validatorType].label }}</span>\n </div>\n </mat-select-trigger>\n <mat-option value=\"requiredIf\">\n <div class=\"validator-option\">\n <mat-icon>star</mat-icon>\n <span>Obrigatório se</span>\n <small>Campo obrigatório quando a condição for atendida</small>\n </div>\n </mat-option>\n <mat-option value=\"visibleIf\">\n <div class=\"validator-option\">\n <mat-icon>visibility</mat-icon>\n <span>Visível se</span>\n <small>Campo aparece quando a condição for atendida</small>\n </div>\n </mat-option>\n <mat-option value=\"disabledIf\">\n <div class=\"validator-option\">\n <mat-icon>block</mat-icon>\n <span>Desabilitado se</span>\n <small>Campo fica desabilitado quando a condição for atendida</small>\n </div>\n </mat-option>\n <mat-option value=\"readonlyIf\">\n <div class=\"validator-option\">\n <mat-icon>lock</mat-icon>\n <span>Somente leitura se</span>\n <small>Campo fica somente leitura quando a condição for atendida</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>Campo alvo</mat-label>\n <mat-icon matPrefix>flag</mat-icon>\n <mat-select\n formControlName=\"targetField\"\n (selectionChange)=\"onTargetFieldChanged($event)\"\n >\n <mat-select-trigger>\n {{ getFieldLabel(validatorForm.get('targetField')?.value) }}\n </mat-select-trigger>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Escolha o campo que será afetado por esta regra'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 Configuração da condição\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 Condição simples\n </mat-button-toggle>\n <mat-button-toggle value=\"advanced\">\n <mat-icon>account_tree</mat-icon>\n Lógica avançada\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>Operador lógico</mat-label>\n <mat-select formControlName=\"logicOperator\">\n <mat-option value=\"and\"\n >E (AND) - todas as condições precisam ser verdadeiras</mat-option\n >\n <mat-option value=\"or\"\n >OU (OR) - qualquer condição pode ser verdadeira</mat-option\n >\n <mat-option value=\"not\"\n >NÃO (NOT) - a condição precisa ser falsa</mat-option\n >\n <mat-option value=\"xor\"\n >XOR - apenas uma condição pode ser verdadeira</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 Adicionar condição\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 Configurações de validação\n </h4>\n\n <div class=\"validation-settings\">\n <mat-form-field appearance=\"outline\" class=\"error-message-input\">\n <mat-label>Mensagem de erro personalizada</mat-label>\n <input\n matInput\n formControlName=\"errorMessage\"\n placeholder=\"Este campo é obrigatório\"\n />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Substitui a mensagem padrão exibida ao usuário'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <div class=\"validation-options\">\n <mat-checkbox formControlName=\"validateOnChange\">\n Validar ao alterar o campo\n </mat-checkbox>\n\n <mat-checkbox formControlName=\"validateOnBlur\">\n Validar ao sair do campo\n </mat-checkbox>\n\n <mat-checkbox formControlName=\"showErrorImmediately\">\n Exibir erro assim que a condição for atendida\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 Configurações de comportamento da interface\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>Animação ao ocultar/exibir</mat-label>\n <mat-select formControlName=\"animation\">\n <mat-option value=\"none\">Sem animação</mat-option>\n <mat-option value=\"fade\">Transição suave (fade)</mat-option>\n <mat-option value=\"slide\">Deslizante (vertical)</mat-option>\n <mat-option value=\"scale\">Crescer/encolher</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-checkbox formControlName=\"hideLabel\">\n Ocultar rótulo do campo quando escondido\n </mat-checkbox>\n\n <mat-checkbox formControlName=\"preserveSpace\">\n Preservar espaço ao esconder\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>Aparência quando desabilitado</mat-label>\n <mat-select formControlName=\"disabledStyle\">\n <mat-option value=\"default\">Padrão (cinza)</mat-option>\n <mat-option value=\"faded\">Esmaecido</mat-option>\n <mat-option value=\"hidden\">Ocultar totalmente</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-checkbox formControlName=\"clearOnDisable\">\n Limpar valor ao desabilitar\n </mat-checkbox>\n\n <mat-checkbox formControlName=\"showDisabledMessage\">\n Mostrar mensagem quando desabilitado\n </mat-checkbox>\n\n <mat-form-field\n *ngIf=\"showDisabledMessage\"\n appearance=\"outline\"\n class=\"disabled-message-input\"\n >\n <mat-label>Mensagem ao desabilitar</mat-label>\n <input\n matInput\n formControlName=\"disabledMessage\"\n placeholder=\"Este campo está desabilitado no momento\"\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>Aparência em modo somente leitura</mat-label>\n <mat-select formControlName=\"readonlyStyle\">\n <mat-option value=\"default\">Padrão (não editável)</mat-option>\n <mat-option value=\"display\">Mostrar apenas o valor</mat-option>\n <mat-option value=\"bordered\">Valor com borda</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-checkbox formControlName=\"showReadonlyIndicator\">\n Mostrar ícone indicando somente leitura\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 Pré-visualização\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>Lógica:</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 width: 100%;\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(--md-sys-color-primary);\n}\n\n.validator-trigger {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.trigger-icon {\n font-size: 18px;\n}\n\n.trigger-label {\n font-weight: 600;\n}\n\n.validator-option small {\n color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-on-surface-variant);\n background: var(--md-sys-color-surface-variant);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .form-section {\n border: 1px solid var(--md-sys-color-outline);\n border-radius: 8px;\n padding: 16px;\n background: var(--md-sys-color-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(--md-sys-color-on-surface);\n }\n\n .condition-mode-selector {\n margin-bottom: 16px;\n }\n\n .simple-condition {\n background: var(--md-sys-color-surface);\n border-radius: 8px;\n padding: 16px;\n }\n\n .advanced-condition {\n background: var(--md-sys-color-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(--md-sys-color-outline);\n border-radius: 8px;\n padding: 12px;\n background: var(--md-sys-color-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(--md-sys-color-primary);\n color: var(--md-sys-color-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(--md-sys-color-primary-container);\n border-color: var(--md-sys-color-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(--md-sys-color-surface);\n padding: 12px;\n border-radius: 4px;\n border: 1px solid var(--md-sys-color-outline);\n }\n\n .preview-logic {\n font-size: 12px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .validation-messages {\n background: var(--md-sys-color-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(--md-sys-color-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 .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\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 validatorTypeLabels: Record<string, { label: string; icon: string }> = {\n requiredIf: { label: 'Obrigatório se', icon: 'star' },\n visibleIf: { label: 'Visível se', icon: 'visibility' },\n disabledIf: { label: 'Desabilitado se', icon: 'block' },\n readonlyIf: { label: 'Somente leitura se', icon: 'lock' },\n };\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 this.validatorForm\n .get('conditionMode')\n ?.valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe((mode: 'simple' | 'advanced') => {\n this.conditionMode = mode;\n if (mode === 'advanced' && this.advancedConditions.length < 2) {\n const currentSimple = this.getSimpleConditionConfig();\n this.advancedConditions = [\n currentSimple,\n this.createEmptyCondition(),\n ];\n this.validatorForm.patchValue(\n { advancedConditions: this.advancedConditions },\n { emitEvent: false },\n );\n }\n this.emitConfigChange();\n });\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 || 'Outros';\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 // Evita propagar configurações incompletas que quebram a geração de especificação\n if (this.conditionMode === 'simple') {\n const simple = this.getSimpleConditionConfig();\n if (this.isConditionIncomplete(simple)) {\n return;\n }\n } else {\n if (this.advancedConditions.some((c) => this.isConditionIncomplete(c))) {\n return;\n }\n }\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 getFieldLabel(fieldName: string): string {\n if (!fieldName) {\n return 'Selecione um campo';\n }\n const schema = this.fieldSchemas[fieldName];\n if (schema?.label) {\n return schema.label;\n }\n\n for (const category of this.fieldCategories) {\n const found = category.fields?.find((f: FieldSchema) => f.name === fieldName);\n if (found?.label) {\n return found.label;\n }\n }\n\n // Heurística: alguns valores podem vir com sufixo do tipo (ex.: \"campoIdstring\")\n const knownTypes = ['string', 'number', 'integer', 'boolean', 'date', 'datetime', 'time', 'email', 'url', 'phone', 'array', 'object', 'enum', 'uuid', 'json'];\n for (const type of knownTypes) {\n if (fieldName.endsWith(type)) {\n const trimmed = fieldName.slice(0, -type.length);\n const candidate = this.fieldSchemas[trimmed] || this.findFieldByNameFragment(trimmed);\n if (candidate?.label) {\n return candidate.label;\n }\n }\n }\n\n const fuzzy = this.findFieldByNameFragment(fieldName);\n if (fuzzy?.label) {\n return fuzzy.label;\n }\n\n return fieldName;\n }\n\n private findFieldByNameFragment(fragment: string): FieldSchema | undefined {\n const entries = Object.entries(this.fieldSchemas);\n const exact = entries.find(([name]) => fragment === name)?.[1];\n if (exact) return exact;\n\n const startsWith = entries.find(([name]) => fragment.startsWith(name))?.[1];\n if (startsWith) return startsWith;\n\n return entries.find(([name]) => name.startsWith(fragment))?.[1];\n }\n\n getPreviewText(): string {\n const formValue = this.validatorForm.value;\n\n if (!formValue.validatorType || !formValue.targetField) {\n return 'Complete as informações da regra para ver o resumo';\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 = 'ficará obrigatório';\n break;\n case 'visibleIf':\n actionText = 'ficará visível';\n break;\n case 'disabledIf':\n actionText = 'ficará desabilitado';\n break;\n case 'readonlyIf':\n actionText = 'ficará somente leitura';\n break;\n }\n\n const operatorLabel = formValue.logicOperator?.toUpperCase() || 'AND';\n const conditionText =\n this.conditionMode === 'simple'\n ? 'quando a condição for atendida'\n : `quando as condições (${operatorLabel}) forem atendidas`;\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} com ${conditionCount} condição${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 // Sincroniza o formulário e notifica consumidores\n this.validatorForm.patchValue({ conditionMode: mode }, { emitEvent: true });\n if (mode === 'advanced' && this.advancedConditions.length < 2) {\n const currentSimple = this.getSimpleConditionConfig();\n this.advancedConditions = [currentSimple, this.createEmptyCondition()];\n this.validatorForm.patchValue(\n { advancedConditions: this.advancedConditions },\n { emitEvent: false },\n );\n }\n this.emitConfigChange();\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 this.validatorForm.patchValue(\n { advancedConditions: this.advancedConditions },\n { emitEvent: false },\n );\n this.emitConfigChange();\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('Escolha o tipo de validador');\n }\n\n if (!this.validatorForm.get('targetField')?.value) {\n errors.push('Informe o campo que será avaliado');\n }\n\n if (this.advancedConditions.length === 0) {\n errors.push('Adicione pelo menos uma condição');\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 isConditionIncomplete(condition: any): boolean {\n return !condition || !condition.fieldName || !condition.operator;\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Select the array/collection field this validator applies to'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Variable name to reference each item (e.g., \\\\'item\\\\', \\\\'record\\\\')'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Variable name to reference item index (optional)'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Path to the field within each item'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Minimum number of items required'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Maximum number of items allowed'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Number of items to validate at once'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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(--md-sys-color-primary);\n }\n\n .validator-option small {\n color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-on-surface-variant);\n background: var(--md-sys-color-surface-container);\n padding: 2px 6px;\n border-radius: 4px;\n }\n\n .form-section {\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px;\n padding: 16px;\n background: var(--md-sys-color-surface-container);\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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-surface);\n border-radius: 8px;\n padding: 16px;\n }\n\n .validation-rule-item,\n .unique-field-item {\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px;\n padding: 12px;\n margin-bottom: 12px;\n background: var(--md-sys-color-surface-container);\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(--md-sys-color-primary);\n color: var(--md-sys-color-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(--md-sys-color-secondary-container);\n border-color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-primary-container);\n border-color: var(--md-sys-color-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(--md-sys-color-surface);\n padding: 12px;\n border-radius: 4px;\n border: 1px solid var(--md-sys-color-outline-variant);\n }\n\n .preview-details {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .validation-messages {\n background: var(--md-sys-color-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(--md-sys-color-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 .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\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}\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>Editar</span>\n </button>\n\n <button mat-menu-item (click)=\"duplicateNode()\">\n <mat-icon>content_copy</mat-icon>\n <span>Duplicar</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>Adicionar Filho</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>Excluir</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 [nodes]=\"nodes\"\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: 8px;\n }\n\n .rule-node {\n min-width: 300px;\n border: 1px solid var(--md-sys-color-outline-variant);\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n border-radius: 8px;\n }\n\n .rule-node:hover { border-color: var(--md-sys-color-primary); box-shadow: 0 4px 8px var(--vb-shadow-low-color); }\n\n .rule-node.selected { border-color: var(--md-sys-color-primary); background: var(--md-sys-color-primary-container); box-shadow: 0 4px 12px var(--vb-shadow-medium-color); }\n\n .rule-node-container.has-errors .rule-node { border-color: var(--md-sys-color-error); }\n\n .node-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n border-bottom: 1px solid var(--md-sys-color-outline);\n background: var(--md-sys-color-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 { color: var(--md-sys-color-primary); }\n .type-icon.boolean-group { color: var(--md-sys-color-secondary); }\n .type-icon.conditional-validator { color: var(--md-sys-color-tertiary); }\n .type-icon.collection-validation { color: var(--md-sys-color-error); }\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(--md-sys-color-error);\n font-size: 18px;\n }\n\n .node-content {\n padding: 12px;\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(--md-sys-color-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(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n\n .tag-chip {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n\n .metadata-message {\n font-size: 12px;\n color: var(--md-sys-color-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(--md-sys-color-error);\n background: var(--md-sys-color-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(--md-sys-color-on-error-container);\n }\n\n .validation-error.warning {\n color: var(--md-sys-color-secondary);\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(--md-sys-color-outline);\n margin-left: 10px;\n }\n\n .children-list {\n padding-left: 12px;\n border-left: 2px solid var(--md-sys-color-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(--md-sys-color-outline);\n }\n\n .connector-operator {\n background: var(--md-sys-color-secondary);\n color: var(--md-sys-color-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(--md-sys-color-outline);\n border-radius: 8px;\n background: var(--md-sys-color-surface-variant);\n }\n\n .add-child-button {\n color: var(--md-sys-color-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(--md-sys-color-error);\n }\n `,\n ],\n})\nexport class RuleNodeComponent {\n @Input() node: RuleNode | null = null;\n @Input() nodes: Record<string, RuleNode> = {};\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.PROPERTY_RULE]: 'tune',\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: 'Condição de Campo',\n },\n { type: RuleNodeType.AND_GROUP, icon: 'join_inner', label: 'Grupo E' },\n { type: RuleNodeType.OR_GROUP, icon: 'join_full', label: 'Grupo OU' },\n { type: RuleNodeType.REQUIRED_IF, icon: 'star', label: 'Obrigatório Se' },\n ];\n }\n\n trackByChildId(index: number, childId: string): string {\n return childId;\n }\n\n getChildNode(childId: string): RuleNode | null {\n return this.nodes[childId] || 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>Nenhuma regra criada ainda</h3>\n <p>Arraste um campo da lista lateral ou clique no botão abaixo para criar a primeira regra.</p>\n\n <button mat-raised-button\n color=\"primary\"\n (click)=\"addFirstRule()\">\n <mat-icon>add</mat-icon>\n Criar primeira regra\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 [nodes]=\"state?.nodes || {}\"\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\">E</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>Solte aqui para criar uma nova regra com este campo</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 type=\"button\"\n aria-label=\"Abrir menu para adicionar regra\"\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 filteredAddMenuOptions\"\n mat-mini-fab\n [color]=\"option.color\"\n type=\"button\"\n [attr.aria-label]=\"option.label\"\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 /* Inherit md-sys tokens from global theme */\n :host {\n display: block;\n height: 100%;\n }\n\n .rule-canvas {\n position: relative;\n height: 100%;\n width: 100%;\n background: var(--md-sys-color-surface);\n border: none;\n border-radius: 0;\n padding: 8px 10px;\n transition: all 0.3s ease;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n gap: 6px;\n }\n\n .rule-canvas.drag-over {\n border: 1px solid var(--md-sys-color-primary);\n background: var(--md-sys-color-primary-container);\n }\n\n .empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\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(--md-sys-color-on-surface-variant);\n margin-bottom: 16px;\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--md-sys-color-on-surface);\n font-weight: 500;\n }\n\n .empty-state p {\n margin: 0 0 24px 0;\n color: var(--md-sys-color-on-surface-variant);\n line-height: 1.4;\n }\n\n .rule-tree {\n display: flex;\n flex-direction: column;\n gap: 10px;\n flex: 1;\n }\n\n .root-rule-container {\n position: relative;\n padding-bottom: 8px;\n }\n\n .root-connector {\n position: absolute;\n left: 12px;\n top: 100%;\n height: 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n pointer-events: none;\n }\n\n .connector-line {\n width: 2px;\n height: 16px;\n background: var(--md-sys-color-outline);\n }\n\n .connector-operator {\n background: var(--md-sys-color-primary);\n color: var(--md-sys-color-on-primary);\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n margin-top: -8px;\n pointer-events: all;\n }\n\n .drop-zone-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--md-sys-color-primary-container);\n border: 3px dashed var(--md-sys-color-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(--md-sys-color-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: absolute;\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() conditionOnly = false;\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: 'Condição de Campo', color: 'primary' },\n { type: RuleNodeType.AND_GROUP, icon: 'join_inner', label: 'Grupo E', color: 'accent' },\n { type: RuleNodeType.OR_GROUP, icon: 'join_full', label: 'Grupo OU', color: 'warn' },\n { type: RuleNodeType.NOT_GROUP, icon: 'block', label: 'NÃO', color: 'warn' },\n { type: RuleNodeType.XOR_GROUP, icon: 'sync_alt', label: 'XOR', color: 'primary' },\n // Legacy validators (kept for compatibility but hidden in condition-only mode)\n { type: RuleNodeType.REQUIRED_IF, icon: 'star', label: 'Obrigatório Se', color: 'primary' },\n { type: RuleNodeType.VISIBLE_IF, icon: 'visibility', label: 'Visível Se', color: 'accent' },\n { type: RuleNodeType.DISABLED_IF, icon: 'block', label: 'Desabilitado Se', color: 'warn' },\n { type: RuleNodeType.READONLY_IF, icon: 'lock', label: 'Somente Leitura Se', color: 'warn' },\n { type: RuleNodeType.FOR_EACH, icon: 'repeat', label: 'Para Cada', color: 'accent' }\n ];\n\n get isEmpty(): boolean {\n return !this.state?.rootNodes || this.state.rootNodes.length === 0;\n }\n\n get filteredAddMenuOptions(): typeof this.addMenuOptions {\n if (!this.conditionOnly) {\n // Filter out legacy validators if we are in full mode but moving towards property rules\n // For now, return all except pure property rule if it was here\n return this.addMenuOptions;\n }\n return this.addMenuOptions.filter((opt) => this.isAllowedConditionType(opt.type));\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 if (this.conditionOnly && !this.isAllowedConditionType(childType)) {\n return;\n }\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 if (this.conditionOnly && !this.isAllowedConditionType(ruleType)) {\n return;\n }\n this.addRule(ruleType);\n return;\n }\n\n const targetData = event.dataTransfer?.getData('target');\n if (targetData) {\n // Dropping a target (section, action, etc) implies creating a Property Rule\n // This is NOT allowed in condition-only mode (pure logic)\n if (this.conditionOnly) {\n return;\n }\n const parsed = JSON.parse(targetData) as { targetType?: string; targetId?: string };\n if (parsed?.targetType && parsed?.targetId) {\n this.nodeAdded.emit({\n type: RuleNodeType.PROPERTY_RULE,\n config: {\n type: 'propertyRule',\n targetType: parsed.targetType as any,\n targets: [parsed.targetId],\n },\n });\n }\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 if (this.conditionOnly && !this.isAllowedConditionType(type)) {\n return;\n }\n this.nodeAdded.emit({ type });\n this.showAddMenu = false;\n }\n\n private isAllowedConditionType(type: RuleNodeType): boolean {\n return [\n RuleNodeType.FIELD_CONDITION,\n RuleNodeType.AND_GROUP,\n RuleNodeType.OR_GROUP,\n RuleNodeType.NOT_GROUP,\n RuleNodeType.XOR_GROUP,\n RuleNodeType.IMPLIES_GROUP,\n RuleNodeType.EXPRESSION,\n ].includes(type);\n }\n}\n","import type { PraxisI18nDictionary } from '@praxisui/core';\n\nexport const PRAXIS_VISUAL_BUILDER_EN_US: PraxisI18nDictionary = {\n 'praxis.visualBuilder.expression.title': 'Expression editor (DSL)',\n 'praxis.visualBuilder.expression.tooltip.format': 'Format expression',\n 'praxis.visualBuilder.expression.tooltip.validate': 'Validate expression',\n 'praxis.visualBuilder.expression.tooltip.help': 'Help and examples',\n 'praxis.visualBuilder.expression.label.rules': 'Rules (DSL)',\n 'praxis.visualBuilder.expression.validationTitle': 'Validation results',\n 'praxis.visualBuilder.expression.validationIssues':\n 'Items to fix:',\n 'praxis.visualBuilder.expression.lineColumn':\n 'Line {{line}}, Column {{column}}',\n 'praxis.visualBuilder.expression.suggestion': 'Suggestion:',\n 'praxis.visualBuilder.expression.performance': 'Performance:',\n 'praxis.visualBuilder.expression.parseTime': 'Parse time:',\n 'praxis.visualBuilder.expression.complexity': 'Complexity:',\n 'praxis.visualBuilder.expression.generatedSpec':\n 'Generated specification:',\n 'praxis.visualBuilder.expression.quickReference': 'Quick reference',\n 'praxis.visualBuilder.expression.tab.operators': 'Operators',\n 'praxis.visualBuilder.expression.tab.functions': 'Functions',\n 'praxis.visualBuilder.expression.tab.variables': 'Variables',\n 'praxis.visualBuilder.expression.variablesScope':\n 'Variables ({{scope}})',\n 'praxis.visualBuilder.expression.menu.toggleReference':\n 'Show/hide quick reference',\n 'praxis.visualBuilder.expression.menu.examples': 'View examples',\n 'praxis.visualBuilder.expression.menu.docs': 'Documentation',\n 'praxis.visualBuilder.expression.placeholder':\n 'Type the rule text (e.g.: ${age} > 18 && status == \"active\")',\n 'praxis.visualBuilder.expression.group.logical': 'Logical operators',\n 'praxis.visualBuilder.expression.group.comparison':\n 'Comparison operators',\n 'praxis.visualBuilder.expression.op.and': 'Logical AND',\n 'praxis.visualBuilder.expression.op.or': 'Logical OR',\n 'praxis.visualBuilder.expression.op.not': 'Logical NOT',\n 'praxis.visualBuilder.expression.op.xor': 'Exclusive OR',\n 'praxis.visualBuilder.expression.op.implies':\n 'Implies (if... then...)',\n 'praxis.visualBuilder.expression.op.eq': 'Equal to',\n 'praxis.visualBuilder.expression.op.neq': 'Not equal to',\n 'praxis.visualBuilder.expression.op.lt': 'Less than',\n 'praxis.visualBuilder.expression.op.lte': 'Less than or equal',\n 'praxis.visualBuilder.expression.op.gt': 'Greater than',\n 'praxis.visualBuilder.expression.op.gte': 'Greater than or equal',\n 'praxis.visualBuilder.expression.op.in': 'Contains the value',\n 'praxis.visualBuilder.expression.group.textFunctions':\n 'Text functions',\n 'praxis.visualBuilder.expression.group.listFunctions':\n 'List functions',\n 'praxis.visualBuilder.expression.group.conditionalFunctions':\n 'Conditional functions',\n 'praxis.visualBuilder.expression.fn.contains':\n 'Checks whether the field contains the value',\n 'praxis.visualBuilder.expression.fn.startsWith':\n 'Checks whether the field starts with the prefix',\n 'praxis.visualBuilder.expression.fn.endsWith':\n 'Checks whether the field ends with the suffix',\n 'praxis.visualBuilder.expression.fn.forEach':\n 'All items must follow the rule',\n 'praxis.visualBuilder.expression.fn.uniqueBy':\n 'Items must be unique by field',\n 'praxis.visualBuilder.expression.fn.minLength':\n 'Minimum list length',\n 'praxis.visualBuilder.expression.fn.maxLength':\n 'Maximum list length',\n 'praxis.visualBuilder.expression.fn.requiredIf':\n 'Field required when the condition is true',\n 'praxis.visualBuilder.expression.fn.visibleIf':\n 'Field visible when the condition is true',\n 'praxis.visualBuilder.expression.fn.disabledIf':\n 'Field disabled when the condition is true',\n 'praxis.visualBuilder.expression.fn.readonlyIf':\n 'Field read-only when the condition is true',\n 'praxis.visualBuilder.expression.error.parse':\n 'Error parsing expression',\n 'praxis.visualBuilder.expression.error.validation':\n 'Validation error',\n 'praxis.visualBuilder.expression.hint.startTyping':\n 'Start typing to see suggestions...',\n 'praxis.visualBuilder.expression.hint.valid':\n 'Valid expression (complexity {{complexity}})',\n 'praxis.visualBuilder.expression.hint.fixItems':\n '{{count}} item(s) to fix',\n 'praxis.visualBuilder.expression.hint.validating': 'Validating...',\n 'praxis.visualBuilder.expression.summary.valid':\n 'Valid expression and ready to use',\n 'praxis.visualBuilder.expression.summary.issues':\n '{{errors}} error(s), {{warnings}} warning(s)',\n 'praxis.visualBuilder.ruleList.eyebrow': 'Rules',\n 'praxis.visualBuilder.ruleList.title': 'Rules',\n 'praxis.visualBuilder.ruleList.subtitle':\n 'Visibility, style, and behavior in a single flow.',\n 'praxis.visualBuilder.ruleList.headerCaption': 'active',\n 'praxis.visualBuilder.ruleList.searchPlaceholder': 'Search rules...',\n 'praxis.visualBuilder.ruleList.clearSearch': 'Clear search',\n 'praxis.visualBuilder.ruleList.addRuleAria': 'Add rule',\n 'praxis.visualBuilder.ruleList.addRule': 'New rule',\n 'praxis.visualBuilder.ruleList.aiButton': 'AI',\n 'praxis.visualBuilder.ruleList.listAria': 'Rule list',\n 'praxis.visualBuilder.ruleList.status.ready': 'Ready',\n 'praxis.visualBuilder.ruleList.status.valid': 'Valid',\n 'praxis.visualBuilder.ruleList.status.incomplete': 'Incomplete',\n 'praxis.visualBuilder.ruleList.status.draft': 'Draft',\n 'praxis.visualBuilder.ruleList.status.error': 'Has error',\n 'praxis.visualBuilder.ruleList.summary.validLabel': 'Valid',\n 'praxis.visualBuilder.ruleList.summary.incompleteLabel': 'Pending',\n 'praxis.visualBuilder.ruleList.summary.errorLabel': 'Has error',\n 'praxis.visualBuilder.ruleList.filter.all': 'All',\n 'praxis.visualBuilder.ruleList.remove': 'Remove rule',\n 'praxis.visualBuilder.ruleList.duplicate': 'Duplicate rule',\n 'praxis.visualBuilder.ruleList.empty': 'No rules defined.',\n 'praxis.visualBuilder.ruleList.emptyHint': 'Click + to create one.',\n 'praxis.visualBuilder.ruleList.noResults': 'No rules found.',\n 'praxis.visualBuilder.ruleList.condition.with': 'Conditional',\n 'praxis.visualBuilder.ruleList.condition.without': 'Always',\n 'praxis.visualBuilder.ruleList.condition.visualOrDsl': 'Configured expression',\n 'praxis.visualBuilder.ruleList.targetType.fieldPlural': 'fields',\n 'praxis.visualBuilder.ruleList.targetType.sectionPlural': 'sections',\n 'praxis.visualBuilder.ruleList.targetType.rowPlural': 'rows',\n 'praxis.visualBuilder.ruleList.targetType.columnPlural': 'columns',\n 'praxis.visualBuilder.ruleList.targetType.actionPlural': 'actions',\n 'praxis.visualBuilder.ruleList.target.none': 'No target',\n 'praxis.visualBuilder.ruleList.summary.when': 'When',\n 'praxis.visualBuilder.ruleList.summary.always':\n 'Runs always.',\n 'praxis.visualBuilder.ruleList.summary.draft':\n 'Start by choosing a target and defining the main effect.',\n 'praxis.visualBuilder.ruleList.summary.error':\n 'This rule needs adjustment before publication.',\n 'praxis.visualBuilder.ruleList.insight.target': 'Main target',\n 'praxis.visualBuilder.ruleList.insight.condition': 'Condition',\n 'praxis.visualBuilder.ruleList.insight.effect': 'Effect',\n 'praxis.visualBuilder.ruleList.effect.pending': 'No effect',\n 'praxis.visualBuilder.ruleList.effect.whenFalse': 'when false',\n 'praxis.visualBuilder.ruleList.effect.visibleOn': 'show',\n 'praxis.visualBuilder.ruleList.effect.visibleOff': 'hide',\n 'praxis.visualBuilder.ruleList.effect.requiredOn': 'make required',\n 'praxis.visualBuilder.ruleList.effect.requiredOff': 'make optional',\n 'praxis.visualBuilder.ruleList.effect.disabledOn': 'disable',\n 'praxis.visualBuilder.ruleList.effect.disabledOff': 'enable',\n 'praxis.visualBuilder.ruleList.effect.set': 'set',\n 'praxis.visualBuilder.ruleList.time.now': 'Just now',\n 'praxis.visualBuilder.ruleList.time.minute': 'min ago',\n 'praxis.visualBuilder.ruleList.time.minutes': 'min ago',\n 'praxis.visualBuilder.ruleList.time.hour': 'h ago',\n 'praxis.visualBuilder.ruleList.time.hours': 'h ago',\n 'praxis.visualBuilder.ruleList.time.day': 'day ago',\n 'praxis.visualBuilder.ruleList.time.days': 'days ago',\n 'praxis.visualBuilder.target.title': 'Targets',\n 'praxis.visualBuilder.target.subtitle': 'Where to apply the rule',\n 'praxis.visualBuilder.target.description':\n 'Choose one target type and select the items affected by the rule.',\n 'praxis.visualBuilder.target.heroTitle':\n 'Select the rule targets',\n 'praxis.visualBuilder.target.heroDescription':\n 'Define where this rule applies: fields, sections, rows, columns, or form actions.',\n 'praxis.visualBuilder.target.heroHint':\n 'Choose a target type and select the specific form elements.',\n 'praxis.visualBuilder.target.selectTitle': 'Select targets',\n 'praxis.visualBuilder.target.searchPlaceholder':\n 'Filter by label or internal ID...',\n 'praxis.visualBuilder.target.searchClear': 'Clear search',\n 'praxis.visualBuilder.target.noResults': 'No targets found.',\n 'praxis.visualBuilder.target.selectedLabel': 'Selected targets',\n 'praxis.visualBuilder.target.selectedSummary': 'selected',\n 'praxis.visualBuilder.target.stats.available': 'available',\n 'praxis.visualBuilder.target.stats.selected': 'selected',\n 'praxis.visualBuilder.target.group.availableSingular': 'available',\n 'praxis.visualBuilder.target.group.availablePlural': 'available',\n 'praxis.visualBuilder.target.group.fields': 'Fields',\n 'praxis.visualBuilder.target.meta.internalId': 'Internal ID',\n 'praxis.visualBuilder.target.meta.scope': 'from the form',\n 'praxis.visualBuilder.target.type.field.label': 'Field',\n 'praxis.visualBuilder.target.type.field.labelPlural': 'Fields',\n 'praxis.visualBuilder.target.type.field.description':\n 'Specific fields.',\n 'praxis.visualBuilder.target.type.section.label': 'Section',\n 'praxis.visualBuilder.target.type.section.labelPlural': 'Sections',\n 'praxis.visualBuilder.target.type.section.description':\n 'Entire section.',\n 'praxis.visualBuilder.target.type.row.label': 'Row',\n 'praxis.visualBuilder.target.type.row.labelPlural': 'Rows',\n 'praxis.visualBuilder.target.type.row.description':\n 'Layout row.',\n 'praxis.visualBuilder.target.type.column.label': 'Column',\n 'praxis.visualBuilder.target.type.column.labelPlural': 'Columns',\n 'praxis.visualBuilder.target.type.column.description':\n 'Layout column.',\n 'praxis.visualBuilder.target.type.action.label': 'Action',\n 'praxis.visualBuilder.target.type.action.labelPlural': 'Actions',\n 'praxis.visualBuilder.target.type.action.description':\n 'Action buttons.',\n 'praxis.visualBuilder.target.type.allPlural': 'Targets',\n 'praxis.visualBuilder.ruleDefinition.step1.title': 'Targets',\n 'praxis.visualBuilder.ruleDefinition.step1.subtitle': 'Where to apply',\n 'praxis.visualBuilder.ruleDefinition.step1.question':\n 'Choose where this rule should take effect.',\n 'praxis.visualBuilder.ruleDefinition.step2.title': 'Condition',\n 'praxis.visualBuilder.ruleDefinition.step2.subtitle': 'When to run',\n 'praxis.visualBuilder.ruleDefinition.step2.question':\n 'When should this rule be applied?',\n 'praxis.visualBuilder.ruleDefinition.step3.title': 'Effects',\n 'praxis.visualBuilder.ruleDefinition.step3.subtitle': 'What to do',\n 'praxis.visualBuilder.ruleDefinition.step3.question':\n 'What should happen when the condition is met?',\n 'praxis.visualBuilder.ruleDefinition.step4.title': 'Review',\n 'praxis.visualBuilder.ruleDefinition.step4.subtitle': 'Confirm rule',\n 'praxis.visualBuilder.ruleDefinition.step4.question':\n 'Review and confirm the rule',\n 'praxis.visualBuilder.ruleDefinition.action.next': 'Next',\n 'praxis.visualBuilder.ruleDefinition.action.previous': 'Previous',\n 'praxis.visualBuilder.ruleDefinition.action.cancel': 'Cancel',\n 'praxis.visualBuilder.ruleDefinition.action.reset': 'Reset',\n 'praxis.visualBuilder.ruleDefinition.action.save': 'Save rule',\n 'praxis.visualBuilder.ruleDefinition.conditionMode.always': 'Always',\n 'praxis.visualBuilder.ruleDefinition.conditionMode.visual': 'Visual',\n 'praxis.visualBuilder.ruleDefinition.conditionMode.dsl': 'DSL',\n 'praxis.visualBuilder.ruleDefinition.conditionWarning.tooltip':\n 'Change the target or adjust the condition fields for this context.',\n 'praxis.visualBuilder.ruleDefinition.conditionWarning.prefix':\n 'Fields outside the current context',\n 'praxis.visualBuilder.ruleDefinition.conditionWarning.suffix':\n 'They will be ignored until you choose compatible fields.',\n 'praxis.visualBuilder.ruleDefinition.dsl.label': 'DSL expression',\n 'praxis.visualBuilder.ruleDefinition.dsl.placeholder':\n \"Ex: status == 'active' and age >= 18\",\n 'praxis.visualBuilder.ruleDefinition.condition.alwaysHint':\n 'This rule will always run.',\n 'praxis.visualBuilder.ruleDefinition.review.targets':\n 'Selected targets',\n 'praxis.visualBuilder.ruleDefinition.review.heroTitle':\n 'Rule summary',\n 'praxis.visualBuilder.ruleDefinition.review.noTargets':\n 'No targets selected.',\n 'praxis.visualBuilder.ruleDefinition.review.condition': 'Condition',\n 'praxis.visualBuilder.ruleDefinition.review.mode': 'Mode',\n 'praxis.visualBuilder.ruleDefinition.review.alwaysMode':\n 'Always (no DSL expression)',\n 'praxis.visualBuilder.ruleDefinition.review.effects': 'Effects',\n 'praxis.visualBuilder.ruleDefinition.review.whenFalse': 'When false',\n 'praxis.visualBuilder.ruleDefinition.review.whenFalseNone':\n 'No additional action',\n 'praxis.visualBuilder.ruleDefinition.review.technical':\n 'Technical details',\n 'praxis.visualBuilder.ruleDefinition.review.conditionDsl':\n 'Condition DSL',\n 'praxis.visualBuilder.ruleDefinition.review.summary.always':\n 'whenever the form is in this context',\n 'praxis.visualBuilder.ruleDefinition.review.summary.conditional':\n 'when the configured condition is satisfied',\n 'praxis.visualBuilder.ruleDefinition.review.json': 'Rule JSON',\n 'praxis.visualBuilder.ruleDefinition.review.effects.noneEditorial':\n 'No main effect defined',\n 'praxis.visualBuilder.ruleDefinition.conditionDescription.always': 'Always',\n 'praxis.visualBuilder.ruleDefinition.conditionDescription.visual': 'Visual',\n 'praxis.visualBuilder.ruleDefinition.conditionDescription.dsl':\n 'Manual DSL',\n 'praxis.visualBuilder.ruleDefinition.effects.none': 'No effects',\n 'praxis.visualBuilder.ruleDefinition.effects.trueCount':\n 'true effect(s)',\n 'praxis.visualBuilder.ruleDefinition.effects.falseCount':\n 'false effect(s)',\n 'praxis.visualBuilder.ruleDefinition.targetType.fieldPlural': 'Fields',\n 'praxis.visualBuilder.ruleDefinition.targetType.sectionPlural': 'Sections',\n 'praxis.visualBuilder.ruleDefinition.targetType.rowPlural': 'Rows',\n 'praxis.visualBuilder.ruleDefinition.targetType.columnPlural': 'Columns',\n 'praxis.visualBuilder.ruleDefinition.targetType.actionPlural': 'Actions',\n 'praxis.visualBuilder.ruleDefinition.effect.visibleOn':\n 'Show the selected elements',\n 'praxis.visualBuilder.ruleDefinition.effect.visibleOff':\n 'Hide the selected elements',\n 'praxis.visualBuilder.ruleDefinition.effect.requiredOn':\n 'Make the fields required',\n 'praxis.visualBuilder.ruleDefinition.effect.requiredOff':\n 'Make the fields optional',\n 'praxis.visualBuilder.ruleDefinition.effect.disabledOn':\n 'Disable the selected elements',\n 'praxis.visualBuilder.ruleDefinition.effect.disabledOff':\n 'Enable the selected elements',\n 'praxis.visualBuilder.ruleDefinition.effect.set': 'Apply',\n 'praxis.visualBuilder.ruleEditor.title': 'Rule editor',\n 'praxis.visualBuilder.ruleEditor.shell.brand': 'Form Builder',\n 'praxis.visualBuilder.ruleEditor.shell.breadcrumb': 'Rule editor',\n 'praxis.visualBuilder.ruleEditor.shell.nav.layout': 'Layout',\n 'praxis.visualBuilder.ruleEditor.shell.nav.rules': 'Rules',\n 'praxis.visualBuilder.ruleEditor.shell.nav.docs': 'Documentation',\n 'praxis.visualBuilder.ruleEditor.shell.unsaved': 'Unsaved changes',\n 'praxis.visualBuilder.ruleEditor.toolbar.collapseList':\n 'Collapse side panel',\n 'praxis.visualBuilder.ruleEditor.toolbar.expandList':\n 'Expand side panel',\n 'praxis.visualBuilder.ruleEditor.toolbar.aiTooltip':\n 'Describe your rule and AI will draft it for you',\n 'praxis.visualBuilder.ruleEditor.toolbar.newRule': 'New rule',\n 'praxis.visualBuilder.ruleEditor.toolbar.aiButton': 'Create with AI',\n 'praxis.visualBuilder.ruleEditor.toolbar.undo': 'Undo',\n 'praxis.visualBuilder.ruleEditor.toolbar.redo': 'Redo',\n 'praxis.visualBuilder.ruleEditor.toolbar.exportTooltip': 'Export rules',\n 'praxis.visualBuilder.ruleEditor.toolbar.export': 'Export',\n 'praxis.visualBuilder.ruleEditor.toolbar.importTooltip': 'Import rules',\n 'praxis.visualBuilder.ruleEditor.toolbar.import': 'Import',\n 'praxis.visualBuilder.ruleEditor.toolbar.advanced': 'More options',\n 'praxis.visualBuilder.ruleEditor.toolbar.devOptions':\n 'Developer options',\n 'praxis.visualBuilder.ruleEditor.hero.eyebrow': 'Visual builder',\n 'praxis.visualBuilder.ruleEditor.hero.title':\n 'Build rules with visual clarity',\n 'praxis.visualBuilder.ruleEditor.hero.subtitle':\n 'Combine targets, conditions, and effects in a guided experience for business and technical users.',\n 'praxis.visualBuilder.ruleEditor.hero.progress': 'Progress',\n 'praxis.visualBuilder.ruleEditor.hero.progressOf': 'of',\n 'praxis.visualBuilder.ruleEditor.hero.progressEmpty': '0 of 0',\n 'praxis.visualBuilder.ruleEditor.hero.health': 'Health',\n 'praxis.visualBuilder.ruleEditor.hero.healthReady': 'Ready',\n 'praxis.visualBuilder.ruleEditor.hero.healthError': 'Review',\n 'praxis.visualBuilder.ruleEditor.hero.healthProgress': 'In progress',\n 'praxis.visualBuilder.ruleEditor.hero.healthIdle': 'Blank',\n 'praxis.visualBuilder.ruleEditor.hero.selectedFallback':\n 'Rule being edited',\n 'praxis.visualBuilder.ruleEditor.hero.targetCount': 'target(s)',\n 'praxis.visualBuilder.ruleEditor.hero.conditional': 'conditional',\n 'praxis.visualBuilder.ruleEditor.hero.always': 'always on',\n 'praxis.visualBuilder.ruleEditor.hero.effectCount': 'effect(s)',\n 'praxis.visualBuilder.ruleEditor.debug.show': 'Show debug panel',\n 'praxis.visualBuilder.ruleEditor.debug.hide': 'Hide debug panel',\n 'praxis.visualBuilder.ruleEditor.debug.clearAll': 'Clear all',\n 'praxis.visualBuilder.ruleEditor.debug.title': 'Debug state',\n 'praxis.visualBuilder.ruleEditor.unsupported.title':\n 'Unsupported rule type',\n 'praxis.visualBuilder.ruleEditor.unsupported.body':\n 'This node uses a legacy format. Remove it and recreate it as a property rule.',\n 'praxis.visualBuilder.ruleEditor.empty.title':\n 'Select a rule or create a new one',\n 'praxis.visualBuilder.ruleEditor.empty.body':\n 'Build visual rules with target, condition, and effect in a guided flow.',\n 'praxis.visualBuilder.ruleEditor.empty.cta': 'Create rule',\n 'praxis.visualBuilder.ruleEditor.status.rules': 'Rules',\n 'praxis.visualBuilder.ruleEditor.status.unsaved': 'Unsaved',\n 'praxis.visualBuilder.ruleEditor.status.errors': 'error(s)',\n 'praxis.visualBuilder.ruleEditor.status.valid': 'Valid',\n 'praxis.visualBuilder.ruleEditor.confirm.clearAll':\n 'Are you sure you want to delete all rules?',\n 'praxis.visualBuilder.ruleEditor.confirm.removeRule':\n 'Remove this rule?',\n 'praxis.visualBuilder.ruleEditor.action.close': 'Close',\n 'praxis.visualBuilder.ruleEditor.actionLabel.show': 'Show',\n 'praxis.visualBuilder.ruleEditor.actionLabel.hide': 'Hide',\n 'praxis.visualBuilder.ruleEditor.actionLabel.require': 'Require',\n 'praxis.visualBuilder.ruleEditor.actionLabel.optional':\n 'Make optional',\n 'praxis.visualBuilder.ruleEditor.actionLabel.disable': 'Disable',\n 'praxis.visualBuilder.ruleEditor.actionLabel.enable': 'Enable',\n 'praxis.visualBuilder.ruleEditor.actionLabel.set': 'Set',\n 'praxis.visualBuilder.ruleEditor.label.ruleFor': 'Rule for',\n 'praxis.visualBuilder.ruleEditor.label.targets': 'target(s)',\n 'praxis.visualBuilder.ruleEditor.label.newWithoutTargets':\n 'New rule without targets',\n 'praxis.visualBuilder.ruleEditor.label.withCondition': 'with condition',\n 'praxis.visualBuilder.ruleEditor.validation.found':\n 'validation error(s) found',\n 'praxis.visualBuilder.ruleEditor.validation.view': 'View',\n 'praxis.visualBuilder.ruleEditor.newRule': 'New rule',\n 'praxis.visualBuilder.ruleEditor.duplicateCopy': 'copy',\n 'praxis.visualBuilder.ruleEditor.import.success': 'Import completed',\n 'praxis.visualBuilder.ruleEditor.import.failure':\n 'Failed to import rules',\n 'praxis.visualBuilder.ruleEditor.ai.applyError': 'Error applying rule',\n 'praxis.visualBuilder.ruleEditor.ai.generatedDescription':\n 'Rule generated by AI. Review before finishing.',\n 'praxis.visualBuilder.ruleEditor.ai.created':\n 'Rule created successfully.',\n 'praxis.visualBuilder.ruleEditor.ai.internalError':\n 'Internal error creating rule',\n};\n","import type { PraxisI18nDictionary } from '@praxisui/core';\n\nexport const PRAXIS_VISUAL_BUILDER_PT_BR: PraxisI18nDictionary = {\n 'praxis.visualBuilder.expression.title': 'Editor de expressoes (DSL)',\n 'praxis.visualBuilder.expression.tooltip.format': 'Formatar expressao',\n 'praxis.visualBuilder.expression.tooltip.validate': 'Validar expressao',\n 'praxis.visualBuilder.expression.tooltip.help': 'Ajuda e exemplos',\n 'praxis.visualBuilder.expression.label.rules': 'Regras (DSL)',\n 'praxis.visualBuilder.expression.validationTitle':\n 'Resultados da validacao',\n 'praxis.visualBuilder.expression.validationIssues':\n 'Pontos a corrigir:',\n 'praxis.visualBuilder.expression.lineColumn':\n 'Linha {{line}}, Coluna {{column}}',\n 'praxis.visualBuilder.expression.suggestion': 'Sugestao:',\n 'praxis.visualBuilder.expression.performance': 'Desempenho:',\n 'praxis.visualBuilder.expression.parseTime': 'Tempo de analise:',\n 'praxis.visualBuilder.expression.complexity': 'Complexidade:',\n 'praxis.visualBuilder.expression.generatedSpec':\n 'Especificacao gerada:',\n 'praxis.visualBuilder.expression.quickReference':\n 'Referencia rapida',\n 'praxis.visualBuilder.expression.tab.operators': 'Operadores',\n 'praxis.visualBuilder.expression.tab.functions': 'Funcoes',\n 'praxis.visualBuilder.expression.tab.variables': 'Variaveis',\n 'praxis.visualBuilder.expression.variablesScope':\n 'Variaveis ({{scope}})',\n 'praxis.visualBuilder.expression.menu.toggleReference':\n 'Mostrar/ocultar referencia rapida',\n 'praxis.visualBuilder.expression.menu.examples': 'Ver exemplos',\n 'praxis.visualBuilder.expression.menu.docs': 'Documentacao',\n 'praxis.visualBuilder.expression.placeholder':\n 'Digite o texto das regras (ex.: ${idade} > 18 && status == \"ativo\")',\n 'praxis.visualBuilder.expression.group.logical':\n 'Operadores logicos',\n 'praxis.visualBuilder.expression.group.comparison':\n 'Operadores de comparacao',\n 'praxis.visualBuilder.expression.op.and': 'E (AND) logico',\n 'praxis.visualBuilder.expression.op.or': 'OU (OR) logico',\n 'praxis.visualBuilder.expression.op.not': 'NAO (NOT) logico',\n 'praxis.visualBuilder.expression.op.xor': 'OU exclusivo',\n 'praxis.visualBuilder.expression.op.implies':\n 'Implica (se... entao...)',\n 'praxis.visualBuilder.expression.op.eq': 'Igual a',\n 'praxis.visualBuilder.expression.op.neq': 'Diferente de',\n 'praxis.visualBuilder.expression.op.lt': 'Menor que',\n 'praxis.visualBuilder.expression.op.lte': 'Menor ou igual',\n 'praxis.visualBuilder.expression.op.gt': 'Maior que',\n 'praxis.visualBuilder.expression.op.gte': 'Maior ou igual',\n 'praxis.visualBuilder.expression.op.in': 'Contem o valor',\n 'praxis.visualBuilder.expression.group.textFunctions':\n 'Funcoes de texto',\n 'praxis.visualBuilder.expression.group.listFunctions':\n 'Funcoes para listas',\n 'praxis.visualBuilder.expression.group.conditionalFunctions':\n 'Funcoes condicionais',\n 'praxis.visualBuilder.expression.fn.contains':\n 'Verifica se o campo contem o valor',\n 'praxis.visualBuilder.expression.fn.startsWith':\n 'Verifica se o campo comeca com o prefixo',\n 'praxis.visualBuilder.expression.fn.endsWith':\n 'Verifica se o campo termina com o sufixo',\n 'praxis.visualBuilder.expression.fn.forEach':\n 'Todos os itens devem seguir a regra',\n 'praxis.visualBuilder.expression.fn.uniqueBy':\n 'Itens devem ser unicos pelo campo',\n 'praxis.visualBuilder.expression.fn.minLength':\n 'Tamanho minimo da lista',\n 'praxis.visualBuilder.expression.fn.maxLength':\n 'Tamanho maximo da lista',\n 'praxis.visualBuilder.expression.fn.requiredIf':\n 'Campo obrigatorio quando a condicao e verdadeira',\n 'praxis.visualBuilder.expression.fn.visibleIf':\n 'Campo visivel quando a condicao e verdadeira',\n 'praxis.visualBuilder.expression.fn.disabledIf':\n 'Campo desabilitado quando a condicao e verdadeira',\n 'praxis.visualBuilder.expression.fn.readonlyIf':\n 'Campo somente leitura quando a condicao e verdadeira',\n 'praxis.visualBuilder.expression.error.parse':\n 'Erro ao interpretar a expressao',\n 'praxis.visualBuilder.expression.error.validation':\n 'Erro de validacao',\n 'praxis.visualBuilder.expression.hint.startTyping':\n 'Comece a digitar para ver sugestoes...',\n 'praxis.visualBuilder.expression.hint.valid':\n 'Expressao valida (complexidade {{complexity}})',\n 'praxis.visualBuilder.expression.hint.fixItems':\n '{{count}} ponto(s) para corrigir',\n 'praxis.visualBuilder.expression.hint.validating': 'Validando...',\n 'praxis.visualBuilder.expression.summary.valid':\n 'Expressao valida e pronta para uso',\n 'praxis.visualBuilder.expression.summary.issues':\n '{{errors}} erro(s), {{warnings}} aviso(s)',\n 'praxis.visualBuilder.ruleList.eyebrow': 'Regras',\n 'praxis.visualBuilder.ruleList.title': 'Regras',\n 'praxis.visualBuilder.ruleList.subtitle':\n 'Visibilidade, estilo e comportamento em um fluxo unico.',\n 'praxis.visualBuilder.ruleList.headerCaption': 'ativas',\n 'praxis.visualBuilder.ruleList.searchPlaceholder': 'Buscar regras...',\n 'praxis.visualBuilder.ruleList.clearSearch': 'Limpar busca',\n 'praxis.visualBuilder.ruleList.addRuleAria': 'Adicionar regra',\n 'praxis.visualBuilder.ruleList.addRule': 'Nova regra',\n 'praxis.visualBuilder.ruleList.aiButton': 'IA',\n 'praxis.visualBuilder.ruleList.listAria': 'Lista de regras',\n 'praxis.visualBuilder.ruleList.status.ready': 'Pronta',\n 'praxis.visualBuilder.ruleList.status.valid': 'Valida',\n 'praxis.visualBuilder.ruleList.status.incomplete': 'Incompleta',\n 'praxis.visualBuilder.ruleList.status.draft': 'Rascunho',\n 'praxis.visualBuilder.ruleList.status.error': 'Com erro',\n 'praxis.visualBuilder.ruleList.summary.validLabel': 'Validas',\n 'praxis.visualBuilder.ruleList.summary.incompleteLabel': 'Pendentes',\n 'praxis.visualBuilder.ruleList.summary.errorLabel': 'Com erro',\n 'praxis.visualBuilder.ruleList.filter.all': 'Todas',\n 'praxis.visualBuilder.ruleList.remove': 'Remover regra',\n 'praxis.visualBuilder.ruleList.duplicate': 'Duplicar regra',\n 'praxis.visualBuilder.ruleList.empty': 'Nenhuma regra definida.',\n 'praxis.visualBuilder.ruleList.emptyHint': 'Clique em + para criar.',\n 'praxis.visualBuilder.ruleList.noResults': 'Nenhuma regra encontrada.',\n 'praxis.visualBuilder.ruleList.condition.with': 'Condicional',\n 'praxis.visualBuilder.ruleList.condition.without': 'Sempre',\n 'praxis.visualBuilder.ruleList.condition.visualOrDsl': 'Expressao configurada',\n 'praxis.visualBuilder.ruleList.targetType.fieldPlural': 'campos',\n 'praxis.visualBuilder.ruleList.targetType.sectionPlural': 'secoes',\n 'praxis.visualBuilder.ruleList.targetType.rowPlural': 'linhas',\n 'praxis.visualBuilder.ruleList.targetType.columnPlural': 'colunas',\n 'praxis.visualBuilder.ruleList.targetType.actionPlural': 'acoes',\n 'praxis.visualBuilder.ruleList.target.none': 'Nenhum alvo',\n 'praxis.visualBuilder.ruleList.summary.when': 'Quando',\n 'praxis.visualBuilder.ruleList.summary.always':\n 'Executa sempre.',\n 'praxis.visualBuilder.ruleList.summary.draft':\n 'Comece escolhendo um alvo e definindo o efeito principal.',\n 'praxis.visualBuilder.ruleList.summary.error':\n 'A regra precisa de ajuste antes de ser publicada.',\n 'praxis.visualBuilder.ruleList.insight.target': 'Alvo principal',\n 'praxis.visualBuilder.ruleList.insight.condition': 'Condicao',\n 'praxis.visualBuilder.ruleList.insight.effect': 'Efeito',\n 'praxis.visualBuilder.ruleList.effect.pending': 'Sem efeito',\n 'praxis.visualBuilder.ruleList.effect.whenFalse': 'quando falso',\n 'praxis.visualBuilder.ruleList.effect.visibleOn': 'mostrar',\n 'praxis.visualBuilder.ruleList.effect.visibleOff': 'ocultar',\n 'praxis.visualBuilder.ruleList.effect.requiredOn': 'tornar obrigatorio',\n 'praxis.visualBuilder.ruleList.effect.requiredOff': 'tornar opcional',\n 'praxis.visualBuilder.ruleList.effect.disabledOn': 'desabilitar',\n 'praxis.visualBuilder.ruleList.effect.disabledOff': 'habilitar',\n 'praxis.visualBuilder.ruleList.effect.set': 'definir',\n 'praxis.visualBuilder.ruleList.time.now': 'Agora',\n 'praxis.visualBuilder.ruleList.time.minute': 'min atras',\n 'praxis.visualBuilder.ruleList.time.minutes': 'min atras',\n 'praxis.visualBuilder.ruleList.time.hour': 'h atras',\n 'praxis.visualBuilder.ruleList.time.hours': 'h atras',\n 'praxis.visualBuilder.ruleList.time.day': 'dia atras',\n 'praxis.visualBuilder.ruleList.time.days': 'dias atras',\n 'praxis.visualBuilder.target.title': 'Alvos',\n 'praxis.visualBuilder.target.subtitle': 'Onde aplicar a regra',\n 'praxis.visualBuilder.target.description':\n 'Escolha um tipo de alvo e selecione os itens que a regra vai afetar.',\n 'praxis.visualBuilder.target.heroTitle':\n 'Selecione os alvos da regra',\n 'praxis.visualBuilder.target.heroDescription':\n 'Defina onde esta regra sera aplicada: campos, secoes, linhas, colunas ou acoes do formulario.',\n 'praxis.visualBuilder.target.heroHint':\n 'Escolha um tipo de alvo e selecione os elementos especificos do formulario.',\n 'praxis.visualBuilder.target.selectTitle': 'Selecionar alvos',\n 'praxis.visualBuilder.target.searchPlaceholder':\n 'Filtrar por rotulo ou ID interno...',\n 'praxis.visualBuilder.target.searchClear': 'Limpar busca',\n 'praxis.visualBuilder.target.noResults': 'Nenhum alvo encontrado.',\n 'praxis.visualBuilder.target.selectedLabel': 'Alvos selecionados',\n 'praxis.visualBuilder.target.selectedSummary': 'selecionados',\n 'praxis.visualBuilder.target.stats.available': 'disponiveis',\n 'praxis.visualBuilder.target.stats.selected': 'selecionados',\n 'praxis.visualBuilder.target.group.availableSingular': 'disponivel',\n 'praxis.visualBuilder.target.group.availablePlural': 'disponiveis',\n 'praxis.visualBuilder.target.group.fields': 'Campos',\n 'praxis.visualBuilder.target.meta.internalId': 'ID interno',\n 'praxis.visualBuilder.target.meta.scope': 'do formulario',\n 'praxis.visualBuilder.target.type.field.label': 'Campo',\n 'praxis.visualBuilder.target.type.field.labelPlural': 'Campos',\n 'praxis.visualBuilder.target.type.field.description':\n 'Campos especificos.',\n 'praxis.visualBuilder.target.type.section.label': 'Secao',\n 'praxis.visualBuilder.target.type.section.labelPlural': 'Secoes',\n 'praxis.visualBuilder.target.type.section.description':\n 'Secao inteira.',\n 'praxis.visualBuilder.target.type.row.label': 'Linha',\n 'praxis.visualBuilder.target.type.row.labelPlural': 'Linhas',\n 'praxis.visualBuilder.target.type.row.description':\n 'Linha do layout.',\n 'praxis.visualBuilder.target.type.column.label': 'Coluna',\n 'praxis.visualBuilder.target.type.column.labelPlural': 'Colunas',\n 'praxis.visualBuilder.target.type.column.description':\n 'Coluna do layout.',\n 'praxis.visualBuilder.target.type.action.label': 'Acao',\n 'praxis.visualBuilder.target.type.action.labelPlural': 'Acoes',\n 'praxis.visualBuilder.target.type.action.description':\n 'Botoes de acao.',\n 'praxis.visualBuilder.target.type.allPlural': 'Alvos',\n 'praxis.visualBuilder.ruleDefinition.step1.title': 'Alvos',\n 'praxis.visualBuilder.ruleDefinition.step1.subtitle': 'Onde aplicar',\n 'praxis.visualBuilder.ruleDefinition.step1.question':\n 'Escolha onde essa regra entra em acao.',\n 'praxis.visualBuilder.ruleDefinition.step2.title': 'Condicao',\n 'praxis.visualBuilder.ruleDefinition.step2.subtitle': 'Quando executar',\n 'praxis.visualBuilder.ruleDefinition.step2.question':\n 'Quando a regra deve ser aplicada?',\n 'praxis.visualBuilder.ruleDefinition.step3.title': 'Efeitos',\n 'praxis.visualBuilder.ruleDefinition.step3.subtitle': 'O que fazer',\n 'praxis.visualBuilder.ruleDefinition.step3.question':\n 'O que deve acontecer quando a condicao for satisfeita?',\n 'praxis.visualBuilder.ruleDefinition.step4.title': 'Revisao',\n 'praxis.visualBuilder.ruleDefinition.step4.subtitle': 'Confirmar regra',\n 'praxis.visualBuilder.ruleDefinition.step4.question':\n 'Revise e confirme a regra',\n 'praxis.visualBuilder.ruleDefinition.action.next': 'Proximo',\n 'praxis.visualBuilder.ruleDefinition.action.previous': 'Anterior',\n 'praxis.visualBuilder.ruleDefinition.action.cancel': 'Cancelar',\n 'praxis.visualBuilder.ruleDefinition.action.reset': 'Resetar',\n 'praxis.visualBuilder.ruleDefinition.action.save': 'Salvar regra',\n 'praxis.visualBuilder.ruleDefinition.conditionMode.always': 'Sempre',\n 'praxis.visualBuilder.ruleDefinition.conditionMode.visual': 'Visual',\n 'praxis.visualBuilder.ruleDefinition.conditionMode.dsl': 'DSL',\n 'praxis.visualBuilder.ruleDefinition.conditionWarning.tooltip':\n 'Altere o alvo ou ajuste os campos da condicao para este contexto.',\n 'praxis.visualBuilder.ruleDefinition.conditionWarning.prefix':\n 'Campos fora do contexto atual',\n 'praxis.visualBuilder.ruleDefinition.conditionWarning.suffix':\n 'Eles serao ignorados ate voce escolher campos compativeis.',\n 'praxis.visualBuilder.ruleDefinition.dsl.label': 'Expressao DSL',\n 'praxis.visualBuilder.ruleDefinition.dsl.placeholder':\n \"Ex: status == 'ativo' and idade >= 18\",\n 'praxis.visualBuilder.ruleDefinition.condition.alwaysHint':\n 'A regra sera aplicada sempre.',\n 'praxis.visualBuilder.ruleDefinition.review.targets':\n 'Alvos selecionados',\n 'praxis.visualBuilder.ruleDefinition.review.heroTitle':\n 'Resumo da regra',\n 'praxis.visualBuilder.ruleDefinition.review.noTargets':\n 'Nenhum alvo selecionado.',\n 'praxis.visualBuilder.ruleDefinition.review.condition': 'Condicao',\n 'praxis.visualBuilder.ruleDefinition.review.mode': 'Modo',\n 'praxis.visualBuilder.ruleDefinition.review.alwaysMode':\n 'Sempre (sem expressao DSL)',\n 'praxis.visualBuilder.ruleDefinition.review.effects': 'Efeitos',\n 'praxis.visualBuilder.ruleDefinition.review.whenFalse': 'Quando falso',\n 'praxis.visualBuilder.ruleDefinition.review.whenFalseNone':\n 'Sem acao adicional',\n 'praxis.visualBuilder.ruleDefinition.review.technical':\n 'Detalhes tecnicos',\n 'praxis.visualBuilder.ruleDefinition.review.conditionDsl':\n 'DSL da condicao',\n 'praxis.visualBuilder.ruleDefinition.review.summary.always':\n 'sempre que o formulario estiver neste contexto',\n 'praxis.visualBuilder.ruleDefinition.review.summary.conditional':\n 'quando a condicao configurada for satisfeita',\n 'praxis.visualBuilder.ruleDefinition.review.json': 'JSON da regra',\n 'praxis.visualBuilder.ruleDefinition.review.effects.noneEditorial':\n 'Nenhum efeito principal definido',\n 'praxis.visualBuilder.ruleDefinition.conditionDescription.always': 'Sempre',\n 'praxis.visualBuilder.ruleDefinition.conditionDescription.visual': 'Visual',\n 'praxis.visualBuilder.ruleDefinition.conditionDescription.dsl':\n 'DSL manual',\n 'praxis.visualBuilder.ruleDefinition.effects.none': 'Nenhum efeito',\n 'praxis.visualBuilder.ruleDefinition.effects.trueCount':\n 'efeito(s) verdadeiro',\n 'praxis.visualBuilder.ruleDefinition.effects.falseCount':\n 'efeito(s) falso',\n 'praxis.visualBuilder.ruleDefinition.targetType.fieldPlural': 'Campos',\n 'praxis.visualBuilder.ruleDefinition.targetType.sectionPlural': 'Secoes',\n 'praxis.visualBuilder.ruleDefinition.targetType.rowPlural': 'Linhas',\n 'praxis.visualBuilder.ruleDefinition.targetType.columnPlural': 'Colunas',\n 'praxis.visualBuilder.ruleDefinition.targetType.actionPlural': 'Acoes',\n 'praxis.visualBuilder.ruleDefinition.effect.visibleOn':\n 'Mostrar os elementos selecionados',\n 'praxis.visualBuilder.ruleDefinition.effect.visibleOff':\n 'Ocultar os elementos selecionados',\n 'praxis.visualBuilder.ruleDefinition.effect.requiredOn':\n 'Tornar os campos obrigatorios',\n 'praxis.visualBuilder.ruleDefinition.effect.requiredOff':\n 'Tornar os campos opcionais',\n 'praxis.visualBuilder.ruleDefinition.effect.disabledOn':\n 'Desabilitar os elementos selecionados',\n 'praxis.visualBuilder.ruleDefinition.effect.disabledOff':\n 'Habilitar os elementos selecionados',\n 'praxis.visualBuilder.ruleDefinition.effect.set': 'Aplicar',\n 'praxis.visualBuilder.ruleEditor.title': 'Editor de regras',\n 'praxis.visualBuilder.ruleEditor.shell.brand': 'Form Builder',\n 'praxis.visualBuilder.ruleEditor.shell.breadcrumb': 'Editor de regras',\n 'praxis.visualBuilder.ruleEditor.shell.nav.layout': 'Layout',\n 'praxis.visualBuilder.ruleEditor.shell.nav.rules': 'Regras',\n 'praxis.visualBuilder.ruleEditor.shell.nav.docs': 'Documentacao',\n 'praxis.visualBuilder.ruleEditor.shell.unsaved': 'Alteracoes nao salvas',\n 'praxis.visualBuilder.ruleEditor.toolbar.collapseList':\n 'Recolher painel lateral',\n 'praxis.visualBuilder.ruleEditor.toolbar.expandList':\n 'Expandir painel lateral',\n 'praxis.visualBuilder.ruleEditor.toolbar.aiTooltip':\n 'Descreva sua regra e a IA monta o rascunho para voce',\n 'praxis.visualBuilder.ruleEditor.toolbar.newRule': 'Nova regra',\n 'praxis.visualBuilder.ruleEditor.toolbar.aiButton': 'Criar com IA',\n 'praxis.visualBuilder.ruleEditor.toolbar.undo': 'Desfazer',\n 'praxis.visualBuilder.ruleEditor.toolbar.redo': 'Refazer',\n 'praxis.visualBuilder.ruleEditor.toolbar.exportTooltip':\n 'Exportar regras',\n 'praxis.visualBuilder.ruleEditor.toolbar.export': 'Exportar',\n 'praxis.visualBuilder.ruleEditor.toolbar.importTooltip':\n 'Importar regras',\n 'praxis.visualBuilder.ruleEditor.toolbar.import': 'Importar',\n 'praxis.visualBuilder.ruleEditor.toolbar.advanced': 'Mais opcoes',\n 'praxis.visualBuilder.ruleEditor.toolbar.devOptions':\n 'Opcoes de desenvolvedor',\n 'praxis.visualBuilder.ruleEditor.hero.eyebrow': 'Builder visual',\n 'praxis.visualBuilder.ruleEditor.hero.title':\n 'Construa regras com clareza visual',\n 'praxis.visualBuilder.ruleEditor.hero.subtitle':\n 'Combine alvos, condicoes e efeitos em uma experiencia guiada para usuarios de negocio e usuarios tecnicos.',\n 'praxis.visualBuilder.ruleEditor.hero.progress': 'Progresso',\n 'praxis.visualBuilder.ruleEditor.hero.progressOf': 'de',\n 'praxis.visualBuilder.ruleEditor.hero.progressEmpty': '0 de 0',\n 'praxis.visualBuilder.ruleEditor.hero.health': 'Estado',\n 'praxis.visualBuilder.ruleEditor.hero.healthReady': 'Pronto',\n 'praxis.visualBuilder.ruleEditor.hero.healthError': 'Revisar',\n 'praxis.visualBuilder.ruleEditor.hero.healthProgress': 'Em progresso',\n 'praxis.visualBuilder.ruleEditor.hero.healthIdle': 'Em branco',\n 'praxis.visualBuilder.ruleEditor.hero.selectedFallback':\n 'Regra em edicao',\n 'praxis.visualBuilder.ruleEditor.hero.targetCount': 'alvo(s)',\n 'praxis.visualBuilder.ruleEditor.hero.conditional': 'condicional',\n 'praxis.visualBuilder.ruleEditor.hero.always': 'sempre ativa',\n 'praxis.visualBuilder.ruleEditor.hero.effectCount': 'efeito(s)',\n 'praxis.visualBuilder.ruleEditor.debug.show': 'Mostrar painel de debug',\n 'praxis.visualBuilder.ruleEditor.debug.hide': 'Ocultar painel de debug',\n 'praxis.visualBuilder.ruleEditor.debug.clearAll': 'Limpar tudo',\n 'praxis.visualBuilder.ruleEditor.debug.title': 'Estado de debug',\n 'praxis.visualBuilder.ruleEditor.unsupported.title':\n 'Tipo de regra nao suportado',\n 'praxis.visualBuilder.ruleEditor.unsupported.body':\n 'Este no usa um formato legado. Remova e recrie como regra de propriedade.',\n 'praxis.visualBuilder.ruleEditor.empty.title':\n 'Selecione uma regra ou crie uma nova',\n 'praxis.visualBuilder.ruleEditor.empty.body':\n 'Monte regras visuais com alvo, condicao e efeito em uma trilha guiada.',\n 'praxis.visualBuilder.ruleEditor.empty.cta': 'Criar regra',\n 'praxis.visualBuilder.ruleEditor.status.rules': 'Regras',\n 'praxis.visualBuilder.ruleEditor.status.unsaved': 'Nao salvo',\n 'praxis.visualBuilder.ruleEditor.status.errors': 'erro(s)',\n 'praxis.visualBuilder.ruleEditor.status.valid': 'Valido',\n 'praxis.visualBuilder.ruleEditor.confirm.clearAll':\n 'Tem certeza que deseja apagar todas as regras?',\n 'praxis.visualBuilder.ruleEditor.confirm.removeRule':\n 'Remover esta regra?',\n 'praxis.visualBuilder.ruleEditor.action.close': 'Fechar',\n 'praxis.visualBuilder.ruleEditor.actionLabel.show': 'Mostrar',\n 'praxis.visualBuilder.ruleEditor.actionLabel.hide': 'Ocultar',\n 'praxis.visualBuilder.ruleEditor.actionLabel.require':\n 'Tornar obrigatorio',\n 'praxis.visualBuilder.ruleEditor.actionLabel.optional':\n 'Tornar opcional',\n 'praxis.visualBuilder.ruleEditor.actionLabel.disable': 'Desabilitar',\n 'praxis.visualBuilder.ruleEditor.actionLabel.enable': 'Habilitar',\n 'praxis.visualBuilder.ruleEditor.actionLabel.set': 'Definir',\n 'praxis.visualBuilder.ruleEditor.label.ruleFor': 'Regra para',\n 'praxis.visualBuilder.ruleEditor.label.targets': 'alvo(s)',\n 'praxis.visualBuilder.ruleEditor.label.newWithoutTargets':\n 'Nova regra sem alvos',\n 'praxis.visualBuilder.ruleEditor.label.withCondition': 'com condicao',\n 'praxis.visualBuilder.ruleEditor.validation.found':\n 'erro(s) de validacao encontrado(s)',\n 'praxis.visualBuilder.ruleEditor.validation.view': 'Ver',\n 'praxis.visualBuilder.ruleEditor.newRule': 'Nova regra',\n 'praxis.visualBuilder.ruleEditor.duplicateCopy': 'copia',\n 'praxis.visualBuilder.ruleEditor.import.success': 'Importacao concluida',\n 'praxis.visualBuilder.ruleEditor.import.failure':\n 'Falha ao importar regras',\n 'praxis.visualBuilder.ruleEditor.ai.applyError': 'Erro ao aplicar regra',\n 'praxis.visualBuilder.ruleEditor.ai.generatedDescription':\n 'Regra gerada por IA. Revise antes de finalizar.',\n 'praxis.visualBuilder.ruleEditor.ai.created':\n 'Regra criada com sucesso.',\n 'praxis.visualBuilder.ruleEditor.ai.internalError':\n 'Erro interno ao criar regra',\n};\n","import {\n PraxisI18nService,\n providePraxisI18n,\n type PraxisI18nConfig,\n type PraxisI18nDictionary,\n} from '@praxisui/core';\nimport { PRAXIS_VISUAL_BUILDER_EN_US } from './visual-builder.en';\nimport { PRAXIS_VISUAL_BUILDER_PT_BR } from './visual-builder.pt';\n\nexport interface PraxisVisualBuilderI18nOptions {\n locale?: string;\n fallbackLocale?: string;\n dictionaries?: Record<string, PraxisI18nDictionary>;\n}\n\nexport function createPraxisVisualBuilderI18nConfig(\n options: PraxisVisualBuilderI18nOptions = {},\n): Partial<PraxisI18nConfig> {\n const dictionaries: Record<string, PraxisI18nDictionary> = {\n 'pt-BR': {\n ...PRAXIS_VISUAL_BUILDER_PT_BR,\n ...(options.dictionaries?.['pt-BR'] ?? {}),\n },\n 'en-US': {\n ...PRAXIS_VISUAL_BUILDER_EN_US,\n ...(options.dictionaries?.['en-US'] ?? {}),\n },\n };\n\n for (const [locale, dictionary] of Object.entries(options.dictionaries ?? {})) {\n if (locale === 'pt-BR' || locale === 'en-US') continue;\n dictionaries[locale] = { ...(dictionaries[locale] ?? {}), ...dictionary };\n }\n\n return {\n locale: options.locale,\n fallbackLocale: options.fallbackLocale ?? 'pt-BR',\n dictionaries,\n };\n}\n\nexport function providePraxisVisualBuilderI18n(\n options: PraxisVisualBuilderI18nOptions = {},\n) {\n return providePraxisI18n(\n createPraxisVisualBuilderI18nConfig(options) as PraxisI18nConfig,\n );\n}\n\nexport function resolvePraxisVisualBuilderText(\n i18n: PraxisI18nService,\n key: string,\n fallback: string,\n): string {\n const namespacedKey = key.startsWith('praxis.visualBuilder.')\n ? key\n : `praxis.visualBuilder.${key}`;\n return i18n.t(namespacedKey, undefined, fallback) || fallback;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PraxisI18nService } from '@praxisui/core';\nimport { FieldSchema } from '../models/field-schema.model';\nimport { RuleBuilderConfig } from '../models/rule-builder.model';\nimport {\n providePraxisVisualBuilderI18n,\n resolvePraxisVisualBuilderText,\n} from '../i18n/visual-builder.i18n';\n\nexport type TargetType = 'field' | 'section' | 'action' | 'row' | 'column';\n\ninterface TargetCard {\n label: string;\n value: string;\n subtitle?: string;\n meta?: string;\n type: TargetType;\n}\n\n@Component({\n selector: 'praxis-target-selector',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n MatFormFieldModule,\n MatSelectModule,\n MatChipsModule,\n MatIconModule,\n MatButtonModule,\n MatInputModule,\n MatButtonToggleModule,\n MatCheckboxModule,\n MatTooltipModule,\n MatExpansionModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [providePraxisVisualBuilderI18n()],\n template: `\n <div class=\"target-selector-container\">\n <div class=\"section-header\">\n <div class=\"hero-icon\">\n <mat-icon>my_location</mat-icon>\n </div>\n <div class=\"section-title\">{{ t('target.heroTitle', 'Selecione os alvos da regra') }}</div>\n <div class=\"section-description\">\n {{ t('target.heroDescription', 'Defina onde esta regra sera aplicada: campos, secoes, linhas, colunas ou acoes do formulario.') }}\n </div>\n <div class=\"hero-pill\">\n <mat-icon>ads_click</mat-icon>\n <span>{{ t('target.heroHint', 'Escolha um tipo de alvo e selecione os elementos especificos do formulario.') }}</span>\n </div>\n </div>\n\n <div class=\"target-type-selector\">\n <mat-button-toggle-group\n [value]=\"targetTypeControl.value\"\n (change)=\"onTypeToggle($event.value)\"\n class=\"type-toggle-group\"\n >\n <mat-button-toggle\n *ngFor=\"let option of targetTypeOptions\"\n [value]=\"option.id\"\n class=\"type-toggle\"\n >\n <mat-icon>{{ option.icon }}</mat-icon>\n <div class=\"type-text\">\n <div class=\"type-label\">{{ option.label }}</div>\n <div class=\"type-desc\">{{ option.description }}</div>\n </div>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <div class=\"target-list-selector\">\n <div class=\"list-header\">\n <div class=\"list-title\">{{ t('target.selectTitle', 'Selecionar alvos') }}</div>\n <div class=\"list-stats\">{{ getListStatsText() }}</div>\n <div class=\"list-search\">\n <mat-form-field\n appearance=\"outline\"\n class=\"w-100 search-input-field\"\n density=\"compact\"\n subscriptSizing=\"dynamic\"\n >\n <mat-icon matPrefix>search</mat-icon>\n <input\n #searchInput\n matInput\n [formControl]=\"searchControl\"\n [placeholder]=\"t('target.searchPlaceholder', 'Filtrar por rotulo ou ID interno...')\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n autocomplete=\"off\"\n />\n <button\n *ngIf=\"searchControl.value\"\n matSuffix\n mat-icon-button\n [attr.aria-label]=\"t('target.searchClear', 'Limpar busca')\"\n (click)=\"clearSearch($event)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"target-groups\" *ngIf=\"filteredTargetGroups.length; else noResults\">\n <mat-accordion class=\"target-accordion\" multi=\"false\">\n <mat-expansion-panel *ngFor=\"let group of filteredTargetGroups\" [expanded]=\"true\">\n <mat-expansion-panel-header>\n <mat-panel-title>{{ getGroupHeader(group.name, group.targets.length) }}</mat-panel-title>\n <mat-panel-description></mat-panel-description>\n </mat-expansion-panel-header>\n <div class=\"card-list\">\n <div\n class=\"target-card\"\n *ngFor=\"let target of group.targets\"\n [class.selected]=\"isSelected(target.value)\"\n (click)=\"toggleTarget(target.value)\"\n [matTooltip]=\"target.meta\"\n >\n <mat-checkbox\n [checked]=\"isSelected(target.value)\"\n (click)=\"$event.stopPropagation(); toggleTarget(target.value)\"\n ></mat-checkbox>\n <mat-icon class=\"card-icon\">{{ getTypeIcon(target.type) }}</mat-icon>\n <div class=\"card-content\">\n <div class=\"card-title\">{{ target.label }}</div>\n <div class=\"card-subtitle\">{{ target.subtitle }}</div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n </div>\n\n <ng-template #noResults>\n <div class=\"no-results\">{{ t('target.noResults', 'Nenhum alvo encontrado.') }}</div>\n </ng-template>\n </div>\n\n <div class=\"selected-wrapper\" *ngIf=\"targetsControl.value?.length\">\n <div class=\"selected-label\">{{ t('target.selectedLabel', 'Alvos selecionados') }}</div>\n <div class=\"selected-targets-chips\">\n <mat-chip-set *ngIf=\"targetsControl.value.length <= maxInlineChips\">\n <mat-chip *ngFor=\"let target of targetsControl.value\" (removed)=\"removeTarget(target)\">\n <mat-icon class=\"chip-icon\">{{ getTypeIcon(targetTypeControl.value) }}</mat-icon>\n {{ getChipLabel(target) }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n </mat-chip-set>\n\n <div\n class=\"selected-summary\"\n *ngIf=\"targetsControl.value.length > maxInlineChips\"\n [matTooltip]=\"getSelectedTooltip()\"\n >\n <mat-icon>{{ getTypeIcon(targetTypeControl.value) }}</mat-icon>\n {{ getSelectedSummaryText() }}\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .target-selector-container {\n --_pvb-target-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));\n --_pvb-target-surface: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));\n --_pvb-target-surface-strong: var(--md-sys-color-surface-container, var(--md-sys-color-surface));\n --_pvb-target-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));\n --_pvb-target-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .section-header {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 10px;\n padding: 12px 0 8px 0;\n }\n\n .hero-icon {\n width: 74px;\n height: 74px;\n border-radius: 20px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid color-mix(in srgb, var(--_pvb-target-accent) 24%, transparent);\n background:\n radial-gradient(circle at 30% 30%, color-mix(in srgb, var(--_pvb-target-accent) 22%, transparent) 0%, transparent 55%),\n color-mix(in srgb, var(--_pvb-target-surface) 98%, black 2%);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 6%, transparent),\n 0 18px 34px color-mix(in srgb, var(--_pvb-target-accent) 12%, transparent);\n }\n\n .hero-icon mat-icon {\n color: var(--_pvb-target-accent);\n font-size: 30px;\n width: 30px;\n height: 30px;\n }\n\n .section-title {\n font-weight: 600;\n font-size: 18px;\n color: var(--md-sys-color-on-surface);\n }\n\n .section-description {\n max-width: 680px;\n font-size: 14px;\n color: var(--_pvb-target-text-soft);\n line-height: 1.5;\n }\n\n .hero-pill {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n min-height: 34px;\n padding: 0 16px;\n border-radius: 999px;\n border: 1px solid color-mix(in srgb, var(--_pvb-target-border) 72%, transparent);\n background: color-mix(in srgb, var(--_pvb-target-surface-strong) 96%, black 4%);\n font-size: 12px;\n color: var(--_pvb-target-text-soft);\n box-shadow: inset 0 1px 0 color-mix(in srgb, white 5%, transparent);\n }\n\n .type-toggle-group {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(136px, 1fr));\n gap: 12px;\n }\n\n .type-toggle {\n min-height: 88px;\n height: 100%;\n text-align: left;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 14px 16px;\n line-height: 1.3;\n border: 1px solid color-mix(in srgb, var(--_pvb-target-border) 72%, transparent);\n box-sizing: border-box;\n border-radius: 16px;\n background: color-mix(in srgb, var(--_pvb-target-surface) 92%, black 8%);\n transition:\n border-color 0.22s ease,\n background 0.22s ease,\n transform 0.22s ease,\n box-shadow 0.22s ease;\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 5%, transparent),\n 0 12px 26px color-mix(in srgb, black 12%, transparent);\n }\n\n .type-toggle:hover {\n transform: translateY(-1px);\n border-color: color-mix(in srgb, var(--_pvb-target-accent) 36%, transparent);\n }\n\n .type-toggle.mat-button-toggle-checked {\n border-color: color-mix(in srgb, var(--_pvb-target-accent) 54%, transparent);\n background: color-mix(in srgb, var(--_pvb-target-accent) 12%, var(--_pvb-target-surface) 88%);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 7%, transparent),\n 0 18px 34px color-mix(in srgb, var(--_pvb-target-accent) 14%, transparent);\n }\n\n .type-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-width: 100%;\n }\n\n .type-label {\n font-weight: 600;\n }\n\n .type-desc {\n font-size: 12px;\n color: var(--_pvb-target-text-soft);\n line-height: 1.35;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .target-list-selector {\n margin-top: 8px;\n border-top: 1px solid color-mix(in srgb, var(--_pvb-target-border) 52%, transparent);\n padding-top: 14px;\n }\n\n .w-100 {\n width: 100%;\n }\n\n .list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin: 12px 0;\n flex-wrap: wrap;\n }\n\n .list-title {\n font-weight: 600;\n }\n\n .list-stats {\n font-size: 13px;\n color: var(--_pvb-target-text-soft);\n white-space: nowrap;\n }\n\n .search-input-field {\n width: 260px;\n align-self: center;\n display: flex;\n align-items: center;\n }\n\n .search-input-field ::ng-deep .mat-mdc-text-field-wrapper {\n border-radius: 14px;\n background: color-mix(in srgb, var(--_pvb-target-surface-strong) 94%, black 6%);\n }\n\n .search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper {\n display: none;\n }\n\n .target-groups {\n display: flex;\n flex-direction: column;\n gap: 12px;\n max-height: 340px;\n overflow: auto;\n padding-right: 4px;\n }\n\n .card-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .target-card {\n display: flex;\n gap: 12px;\n padding: 12px 16px;\n border: 1px solid color-mix(in srgb, var(--_pvb-target-border) 78%, transparent);\n border-radius: 14px;\n cursor: pointer;\n transition:\n border-color 0.22s ease,\n background 0.22s ease,\n transform 0.22s ease,\n box-shadow 0.22s ease;\n align-items: center;\n background: color-mix(in srgb, var(--_pvb-target-surface) 96%, black 4%);\n min-height: 72px;\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 4%, transparent),\n 0 10px 22px color-mix(in srgb, black 10%, transparent);\n }\n\n .target-card:hover {\n border-color: color-mix(in srgb, var(--_pvb-target-accent) 40%, transparent);\n transform: translateY(-1px);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 5%, transparent),\n 0 16px 28px color-mix(in srgb, var(--_pvb-target-accent) 10%, transparent);\n }\n\n .target-card.selected {\n border-color: color-mix(in srgb, var(--_pvb-target-accent) 64%, transparent);\n background: color-mix(in srgb, var(--_pvb-target-accent) 12%, var(--_pvb-target-surface) 88%);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 6%, transparent),\n 0 18px 30px color-mix(in srgb, var(--_pvb-target-accent) 12%, transparent);\n }\n\n .card-icon {\n color: var(--_pvb-target-accent);\n filter: drop-shadow(0 0 10px color-mix(in srgb, var(--_pvb-target-accent) 16%, transparent));\n }\n\n .card-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .card-title {\n font-weight: 600;\n }\n\n .card-subtitle {\n font-size: 13px;\n color: var(--_pvb-target-text-soft);\n }\n\n .card-meta {\n font-size: 12px;\n color: var(--_pvb-target-text-soft);\n }\n\n .selected-wrapper {\n background: color-mix(in srgb, var(--_pvb-target-surface) 96%, black 4%);\n border: 1px solid color-mix(in srgb, var(--_pvb-target-border) 78%, transparent);\n border-radius: 14px;\n padding: 12px 14px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 12px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, white 5%, transparent);\n }\n\n .selected-label {\n font-weight: 600;\n font-size: 13px;\n color: var(--md-sys-color-on-surface);\n }\n\n .selected-targets-chips {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n padding-top: 2px;\n }\n\n .chip-icon {\n margin-right: 4px;\n }\n\n .selected-summary {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n border: 1px dashed color-mix(in srgb, var(--_pvb-target-border) 82%, transparent);\n border-radius: 16px;\n font-size: 13px;\n color: var(--md-sys-color-on-surface);\n }\n\n .no-results {\n font-style: italic;\n font-size: 13px;\n text-align: center;\n padding: 12px 0;\n color: var(--_pvb-target-text-soft);\n }\n\n .target-accordion .mat-expansion-panel-header {\n padding-top: 8px;\n padding-bottom: 8px;\n }\n\n .target-accordion .mat-expansion-panel-body {\n padding-top: 4px;\n }\n `,\n ],\n})\nexport class TargetSelectorComponent implements OnInit, OnChanges {\n @Input() fieldSchemas: Record<string, FieldSchema> = {};\n @Input() targetSchemas: RuleBuilderConfig['targetSchemas'] | null = null;\n @Input() initialType: TargetType = 'field';\n @Input() initialSelection: string[] = [];\n\n @Output() selectionChanged = new EventEmitter<{\n type: TargetType;\n targets: string[];\n }>();\n\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n searchControl = new FormControl('', { nonNullable: true });\n targetTypeControl = new FormControl<TargetType>('field', { nonNullable: true });\n targetsControl = new FormControl<string[]>([], { nonNullable: true });\n\n targetGroups: { name: string; targets: TargetCard[] }[] = [];\n filteredTargetGroups: { name: string; targets: TargetCard[] }[] = [];\n maxInlineChips = 3;\n totalAvailable = 0;\n\n constructor(@Optional() private readonly i18n?: PraxisI18nService) {}\n\n get targetTypeOptions(): Array<{\n id: TargetType;\n label: string;\n description: string;\n icon: string;\n }> {\n return [\n {\n id: 'field',\n label: this.t('target.type.field.label', 'Campo'),\n description: this.t(\n 'target.type.field.description',\n 'Campos especificos.',\n ),\n icon: 'text_fields',\n },\n {\n id: 'section',\n label: this.t('target.type.section.label', 'Secao'),\n description: this.t(\n 'target.type.section.description',\n 'Secao inteira.',\n ),\n icon: 'view_agenda',\n },\n {\n id: 'row',\n label: this.t('target.type.row.label', 'Linha'),\n description: this.t(\n 'target.type.row.description',\n 'Linha do layout.',\n ),\n icon: 'view_stream',\n },\n {\n id: 'column',\n label: this.t('target.type.column.label', 'Coluna'),\n description: this.t(\n 'target.type.column.description',\n 'Coluna do layout.',\n ),\n icon: 'view_column',\n },\n {\n id: 'action',\n label: this.t('target.type.action.label', 'Acao'),\n description: this.t(\n 'target.type.action.description',\n 'Botoes de acao.',\n ),\n icon: 'smart_button',\n },\n ];\n }\n\n ngOnInit(): void {\n this.targetTypeControl.setValue(this.initialType);\n this.targetsControl.setValue(this.initialSelection);\n this.updateTargetOptions();\n\n this.searchControl.valueChanges.subscribe(() => {\n this.filterOptions();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['initialType'] && !changes['initialType'].firstChange) {\n this.targetTypeControl.setValue(this.initialType);\n }\n if (changes['initialSelection'] && !changes['initialSelection'].firstChange) {\n this.targetsControl.setValue(this.initialSelection);\n }\n if (changes['fieldSchemas'] || changes['targetSchemas'] || changes['initialType']) {\n this.updateTargetOptions();\n }\n }\n\n filterOptions(): void {\n const search = this.searchControl.value.toLowerCase();\n if (!search) {\n this.filteredTargetGroups = this.targetGroups;\n return;\n }\n\n this.filteredTargetGroups = this.targetGroups\n .map((group) => ({\n ...group,\n targets: group.targets.filter(\n (target) =>\n target.label.toLowerCase().includes(search) ||\n target.value.toLowerCase().includes(search),\n ),\n }))\n .filter((group) => group.targets.length > 0);\n }\n\n focusSearchInput(): void {\n setTimeout(() => this.searchInput?.nativeElement.focus(), 100);\n }\n\n clearSearch(event: Event): void {\n event.stopPropagation();\n this.searchControl.setValue('');\n this.searchInput?.nativeElement.focus();\n }\n\n onTypeToggle(type: TargetType): void {\n this.targetTypeControl.setValue(type);\n this.targetsControl.setValue([]);\n this.updateTargetOptions();\n this.emitChange();\n }\n\n onTargetsChange(): void {\n this.emitChange();\n }\n\n removeTarget(target: string): void {\n this.targetsControl.setValue(this.targetsControl.value.filter((value) => value !== target));\n this.emitChange();\n }\n\n emitChange(): void {\n this.selectionChanged.emit({\n type: this.targetTypeControl.value,\n targets: this.targetsControl.value,\n });\n }\n\n updateTargetOptions(): void {\n const type = this.targetTypeControl.value;\n this.targetGroups = [];\n\n if (type === 'field') {\n const record =\n (this.targetSchemas?.fields as Record<string, FieldSchema>) ||\n this.fieldSchemas ||\n {};\n const categories: Record<string, TargetCard[]> = {};\n\n Object.entries(record).forEach(([key, field]) => {\n const category = field.uiConfig?.category || this.t('target.group.fields', 'Campos');\n categories[category] ||= [];\n categories[category].push(this.toTargetCard(key, field, type));\n });\n\n this.targetGroups = Object.keys(categories)\n .sort()\n .map((category) => ({\n name: category,\n targets: categories[category].sort((a, b) => a.label.localeCompare(b.label)),\n }));\n } else {\n const record = this.getRecordForType(type);\n const targets = Object.entries(record).map(([key, schema]) =>\n this.toTargetCard(key, schema, type),\n );\n\n this.targetGroups = [\n {\n name: this.getTypeLabelPlural(type),\n targets: targets.sort((a, b) => a.label.localeCompare(b.label)),\n },\n ];\n }\n\n this.pruneSelection();\n this.filterOptions();\n this.totalAvailable = this.targetGroups.reduce(\n (sum, group) => sum + group.targets.length,\n 0,\n );\n }\n\n getTargetLabel(value: string): string {\n for (const group of this.targetGroups) {\n const found = group.targets.find((target) => target.value === value);\n if (found) return found.label;\n }\n return value;\n }\n\n toggleTarget(value: string): void {\n const current = new Set(this.targetsControl.value);\n if (current.has(value)) {\n current.delete(value);\n } else {\n current.add(value);\n }\n this.targetsControl.setValue(Array.from(current));\n this.emitChange();\n }\n\n isSelected(value: string): boolean {\n return this.targetsControl.value.includes(value);\n }\n\n getChipLabel(value: string): string {\n return `${this.getTypeLabel(this.targetTypeControl.value)} · ${this.getTargetLabel(value)}`;\n }\n\n getSelectedTooltip(): string {\n return this.targetsControl.value.map((value) => this.getChipLabel(value)).join('\\n');\n }\n\n getTypeLabel(type: TargetType): string {\n return this.targetTypeOptions.find((option) => option.id === type)?.label || type;\n }\n\n getTypeLabelPlural(type: TargetType): string {\n switch (type) {\n case 'field':\n return this.t('target.type.field.labelPlural', 'Campos');\n case 'section':\n return this.t('target.type.section.labelPlural', 'Secoes');\n case 'row':\n return this.t('target.type.row.labelPlural', 'Linhas');\n case 'column':\n return this.t('target.type.column.labelPlural', 'Colunas');\n case 'action':\n return this.t('target.type.action.labelPlural', 'Acoes');\n default:\n return this.t('target.type.allPlural', 'Alvos');\n }\n }\n\n getTypeIcon(type: TargetType): string {\n return this.targetTypeOptions.find((option) => option.id === type)?.icon || 'adjust';\n }\n\n getListStatsText(): string {\n return `${this.totalAvailable} ${this.t('target.stats.available', 'disponiveis')} / ${this.targetsControl.value.length} ${this.t('target.stats.selected', 'selecionados')}`;\n }\n\n getGroupHeader(groupName: string, count: number): string {\n const suffix =\n count === 1\n ? this.t('target.group.availableSingular', 'disponivel')\n : this.t('target.group.availablePlural', 'disponiveis');\n return `${groupName} · ${count} ${suffix}`;\n }\n\n getSelectedSummaryText(): string {\n return `${this.targetsControl.value.length} ${this.getTypeLabelPlural(this.targetTypeControl.value)} ${this.t('target.selectedSummary', 'selecionados')}`;\n }\n\n private getRecordForType(type: TargetType): Record<string, FieldSchema> {\n if (!this.targetSchemas) return {};\n switch (type) {\n case 'section':\n return (this.targetSchemas.sections as Record<string, FieldSchema>) || {};\n case 'action':\n return (this.targetSchemas.actions as Record<string, FieldSchema>) || {};\n case 'row':\n return (this.targetSchemas.rows as Record<string, FieldSchema>) || {};\n case 'column':\n return (this.targetSchemas.columns as Record<string, FieldSchema>) || {};\n default:\n return {};\n }\n }\n\n private pruneSelection(): void {\n const availableValues = new Set(\n this.targetGroups.flatMap((group) => group.targets.map((target) => target.value)),\n );\n const filtered = this.targetsControl.value.filter((value) =>\n availableValues.has(value),\n );\n if (filtered.length !== this.targetsControl.value.length) {\n this.targetsControl.setValue(filtered);\n }\n }\n\n private toTargetCard(\n key: string,\n schema: FieldSchema,\n type: TargetType,\n ): TargetCard {\n const rawLabel = schema?.label || schema?.name || key;\n const cleanLabel = this.stripPrefix(rawLabel);\n return {\n label: cleanLabel,\n value: key,\n subtitle: this.buildSubtitle(type),\n meta: `${this.t('target.meta.internalId', 'ID interno')}: ${key}`,\n type,\n };\n }\n\n private stripPrefix(label: string): string {\n return label.replace(/^\\[[^\\]]+\\]\\s*/, '').trim();\n }\n\n private buildSubtitle(type: TargetType): string {\n return `${this.getTypeLabel(type)} ${this.t('target.meta.scope', 'do formulario')}`;\n }\n\n t(key: string, fallback: string): string {\n return this.i18n\n ? resolvePraxisVisualBuilderText(this.i18n, key, fallback)\n : fallback;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n ValidationIssue,\n ValidationIssueType,\n ValidationSeverity,\n} from '@praxisui/specification';\n\nimport {\n DslParsingConfig,\n DslParsingService,\n} from '@praxisui/ai';\nimport { SpecificationBridgeService } from '../specification-bridge.service';\nimport { RuleNode } from '../../models/rule-builder.model';\n\nexport interface ParsedDslState {\n success: boolean;\n issues: ValidationIssue[];\n nodes?: Record<string, RuleNode>;\n rootNodes?: string[];\n specification?: any;\n}\n\n/**\n * Helper service to parse DSL into a RuleNode graph without mutating the builder state.\n * Uses DslParsingService for validation/parse and SpecificationBridgeService for conversion.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DslVisualImportService {\n constructor(\n private readonly dslParsing: DslParsingService,\n private readonly bridge: SpecificationBridgeService,\n ) {}\n\n parseToRuleState(\n dslExpression: string,\n config?: DslParsingConfig,\n ): ParsedDslState {\n const result = this.dslParsing.parseDsl(dslExpression, config);\n const issues = result.issues || [];\n\n if (!result.success || !result.specification) {\n return { success: false, issues };\n }\n\n try {\n const rootNode = this.bridge.specificationToRuleNode(result.specification);\n const flattened = this.flattenTree(rootNode);\n\n return {\n success: true,\n issues,\n nodes: flattened.nodes,\n rootNodes: flattened.rootNodes,\n specification: result.specification,\n };\n } catch (error) {\n return {\n success: false,\n issues: [\n ...issues,\n {\n type: ValidationIssueType.SYNTAX_ERROR,\n severity: ValidationSeverity.ERROR,\n message: `Failed to convert DSL to visual graph: ${\n error instanceof Error ? error.message : error\n }`,\n position: { start: 0, end: dslExpression.length, line: 1, column: 1 },\n },\n ],\n };\n }\n }\n\n private flattenTree(\n root: RuleNode,\n ): { nodes: Record<string, RuleNode>; rootNodes: string[] } {\n const nodes: Record<string, RuleNode> = {};\n const stack: RuleNode[] = [root];\n\n while (stack.length) {\n const current = stack.pop() as RuleNode;\n const childIds: string[] = [];\n\n (current.children || []).forEach((child: any) => {\n if (child && typeof child === 'object' && 'id' in child) {\n const childNode = child as RuleNode;\n stack.push(childNode);\n childIds.push(childNode.id);\n } else if (typeof child === 'string') {\n childIds.push(child);\n }\n });\n\n nodes[current.id] = {\n ...current,\n children: childIds,\n };\n }\n\n return { nodes, rootNodes: [root.id] };\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Subject, takeUntil } from 'rxjs';\nimport {\n RULE_PROPERTY_SCHEMA,\n type RulePropertyDefinition,\n type RulePropertySchema,\n PraxisI18nService,\n} from '@praxisui/core';\nimport { DslParsingConfig } from '@praxisui/ai';\nimport { FieldSchema } from '../models/field-schema.model';\nimport {\n RuleBuilderConfig,\n RuleBuilderState,\n RuleNode,\n RuleNodeConfig,\n RuleNodeType,\n} from '../models/rule-builder.model';\nimport { PropertyEffectEditorComponent, PropertyEffectConfig } from './property-effect-editor.component';\nimport { RuleCanvasComponent } from './rule-canvas.component';\nimport { TargetSelectorComponent, TargetType } from './target-selector.component';\nimport { DslVisualImportService } from '../services/dsl/dsl-visual-import.service';\nimport { RuleBuilderService } from '../services/rule-builder.service';\nimport {\n providePraxisVisualBuilderI18n,\n resolvePraxisVisualBuilderText,\n} from '../i18n/visual-builder.i18n';\n\ntype RuleNodeConfigExtended = RuleNodeConfig & {\n targetType?: TargetType;\n properties?: Record<string, any>;\n propertiesWhenFalse?: Record<string, any>;\n targets?: string[];\n condition?: RuleNode | string | null;\n};\n\n@Component({\n selector: 'praxis-rule-definition',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatCardModule,\n MatButtonModule,\n MatIconModule,\n MatExpansionModule,\n MatButtonToggleModule,\n MatFormFieldModule,\n MatInputModule,\n MatTooltipModule,\n MatStepperModule,\n TargetSelectorComponent,\n PropertyEffectEditorComponent,\n RuleCanvasComponent,\n ],\n providers: [RuleBuilderService, providePraxisVisualBuilderI18n()],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"rule-definition-container\">\n <div class=\"wizard-progress\" [class.mobile]=\"isMobile\" role=\"tablist\" [attr.aria-label]=\"t('ruleDefinition.progress.aria', 'Progresso da regra')\">\n <ng-container *ngFor=\"let step of getStepDefinitions(); let last = last\">\n <button\n type=\"button\"\n class=\"progress-step\"\n [class.is-current]=\"getStepVisualState(step.index) === 'current'\"\n [class.is-complete]=\"getStepVisualState(step.index) === 'complete'\"\n [class.is-pending]=\"getStepVisualState(step.index) === 'pending'\"\n [disabled]=\"!canSelectStep(step.index)\"\n (click)=\"goToStep(step.index)\"\n >\n <span class=\"progress-step-icon\">\n <mat-icon *ngIf=\"getStepVisualState(step.index) === 'complete'\">check</mat-icon>\n <mat-icon *ngIf=\"getStepVisualState(step.index) !== 'complete'\">{{ step.icon }}</mat-icon>\n </span>\n <span class=\"progress-step-copy\">\n <span class=\"progress-step-title\">{{ step.title }}</span>\n <span class=\"progress-step-subtitle\">{{ step.subtitle }}</span>\n </span>\n </button>\n\n <span *ngIf=\"!last\" class=\"progress-connector\" [class.active]=\"isConnectorActive(step.index)\"></span>\n </ng-container>\n </div>\n\n <mat-stepper\n class=\"rule-stepper\"\n [linear]=\"true\"\n [orientation]=\"isMobile ? 'vertical' : 'horizontal'\"\n [selectedIndex]=\"selectedStepIndex\"\n (selectionChange)=\"selectedStepIndex = $event.selectedIndex\"\n >\n <ng-template matStepperIcon=\"target\"><mat-icon>my_location</mat-icon></ng-template>\n <ng-template matStepperIcon=\"condition\"><mat-icon>rule</mat-icon></ng-template>\n <ng-template matStepperIcon=\"effects\"><mat-icon>bolt</mat-icon></ng-template>\n <ng-template matStepperIcon=\"review\"><mat-icon>fact_check</mat-icon></ng-template>\n\n <mat-step\n [completed]=\"isStep1Valid()\"\n [editable]=\"false\"\n [state]=\"isStep1Valid() ? 'done' : 'target'\"\n >\n <ng-template matStepLabel>\n <mat-icon>my_location</mat-icon>\n <span class=\"step-label-stack\">\n <span class=\"step-label-main\">{{ t('ruleDefinition.step1.title', 'Alvos') }}</span>\n <span class=\"step-label-sub\">{{ t('ruleDefinition.step1.subtitle', 'Onde aplicar') }}</span>\n </span>\n </ng-template>\n\n <div class=\"panel-content\">\n <praxis-target-selector\n [fieldSchemas]=\"fieldSchemas\"\n [targetSchemas]=\"targetSchemas\"\n [initialType]=\"selectedTargetType\"\n [initialSelection]=\"selectedTargets\"\n (selectionChanged)=\"onTargetsChanged($event)\"\n ></praxis-target-selector>\n </div>\n </mat-step>\n\n <mat-step\n [completed]=\"isStep2Valid()\"\n [editable]=\"false\"\n [state]=\"isStep2Valid() ? 'done' : 'condition'\"\n >\n <ng-template matStepLabel>\n <mat-icon>rule</mat-icon>\n <span class=\"step-label-stack\">\n <span class=\"step-label-main\">{{ t('ruleDefinition.step2.title', 'Condicao') }}</span>\n <span class=\"step-label-sub\">{{ t('ruleDefinition.step2.subtitle', 'Quando executar') }}</span>\n </span>\n </ng-template>\n\n <div class=\"panel-content condition-panel\">\n <div class=\"step-question condition-title\">\n {{ t('ruleDefinition.step2.question', 'Quando a regra deve ser aplicada?') }}\n </div>\n\n <div class=\"mode-selector\">\n <mat-button-toggle-group\n [value]=\"conditionMode\"\n (change)=\"setConditionMode($event.value)\"\n appearance=\"legacy\"\n class=\"small-toggles\"\n >\n <mat-button-toggle value=\"always\">{{ t('ruleDefinition.conditionMode.always', 'Sempre') }}</mat-button-toggle>\n <mat-button-toggle value=\"visual\">{{ t('ruleDefinition.conditionMode.visual', 'Visual') }}</mat-button-toggle>\n <mat-button-toggle value=\"dsl\">{{ t('ruleDefinition.conditionMode.dsl', 'DSL') }}</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <div\n class=\"condition-warning\"\n *ngIf=\"invalidConditionFields.length\"\n [matTooltip]=\"t('ruleDefinition.conditionWarning.tooltip', 'Altere o alvo ou ajuste os campos da condicao para este contexto.')\"\n >\n <mat-icon color=\"warn\">warning</mat-icon>\n <span>{{ getInvalidConditionWarningText() }}</span>\n </div>\n\n <div [ngSwitch]=\"conditionMode\" class=\"condition-editor\">\n <div *ngSwitchCase=\"'visual'\" class=\"visual-editor-box rule-canvas-wrapper\">\n <praxis-rule-canvas\n [state]=\"conditionState\"\n [fieldSchemas]=\"conditionFieldSchemas\"\n [conditionOnly]=\"true\"\n (nodeSelected)=\"selectNode($event)\"\n (nodeAdded)=\"onNodeAdded($event)\"\n (nodeUpdated)=\"onNodeUpdated($event)\"\n (nodeRemoved)=\"removeNode($event)\"\n ></praxis-rule-canvas>\n </div>\n\n <div *ngSwitchCase=\"'dsl'\" class=\"dsl-editor-box\">\n <mat-form-field appearance=\"outline\" class=\"w-100\">\n <mat-label>{{ t('ruleDefinition.dsl.label', 'Expressao DSL') }}</mat-label>\n <textarea\n matInput\n rows=\"4\"\n [(ngModel)]=\"dslDraft\"\n (blur)=\"onDslBlur()\"\n [placeholder]=\"getDslPlaceholder()\"\n ></textarea>\n </mat-form-field>\n </div>\n\n <div *ngSwitchDefault class=\"always-hint\">\n {{ t('ruleDefinition.condition.alwaysHint', 'A regra sera aplicada sempre.') }}\n </div>\n </div>\n </div>\n\n </mat-step>\n\n <mat-step\n [completed]=\"isStep3Valid()\"\n [editable]=\"false\"\n [state]=\"isStep3Valid() ? 'done' : 'effects'\"\n >\n <ng-template matStepLabel>\n <mat-icon>bolt</mat-icon>\n <span class=\"step-label-stack\">\n <span class=\"step-label-main\">{{ t('ruleDefinition.step3.title', 'Efeitos') }}</span>\n <span class=\"step-label-sub\">{{ t('ruleDefinition.step3.subtitle', 'O que fazer') }}</span>\n </span>\n </ng-template>\n\n <div class=\"panel-content\">\n <div class=\"step-question\">\n {{ t('ruleDefinition.step3.question', 'O que deve acontecer quando a condicao for satisfeita?') }}\n </div>\n <praxis-property-effect-editor\n [properties]=\"availableProperties\"\n [initialConfig]=\"propertyConfig\"\n (configChanged)=\"onEffectsChanged($event)\"\n ></praxis-property-effect-editor>\n </div>\n\n </mat-step>\n\n <mat-step\n [editable]=\"false\"\n [completed]=\"isStep4Valid()\"\n [state]=\"isStep4Valid() ? 'done' : 'review'\"\n >\n <ng-template matStepLabel>\n <mat-icon>fact_check</mat-icon>\n <span class=\"step-label-stack\">\n <span class=\"step-label-main\">{{ t('ruleDefinition.step4.title', 'Revisao') }}</span>\n <span class=\"step-label-sub\">{{ t('ruleDefinition.step4.subtitle', 'Confirmar regra') }}</span>\n </span>\n </ng-template>\n\n <div class=\"panel-content\">\n <div class=\"step-question\">{{ t('ruleDefinition.step4.question', 'Revise e confirme a regra') }}</div>\n\n <div class=\"review-hero\">\n <div class=\"review-hero-title\">\n {{ t('ruleDefinition.review.heroTitle', 'Resumo da regra') }}\n </div>\n <div class=\"review-hero-body\">{{ getEditorialSummary() }}</div>\n </div>\n\n <div class=\"review-grid\">\n <div class=\"review-block highlight\">\n <div class=\"review-title\">{{ t('ruleDefinition.review.targets', 'Alvos selecionados') }}</div>\n <div *ngIf=\"selectedTargets.length; else noTargets\">\n <div class=\"pill\" *ngFor=\"let target of selectedTargets\">\n {{ getTargetTypeLabel(selectedTargetType) }} · {{ formatTargetName(target) }}\n </div>\n </div>\n <ng-template #noTargets>\n <div class=\"muted\">{{ t('ruleDefinition.review.noTargets', 'Nenhum alvo selecionado.') }}</div>\n </ng-template>\n </div>\n\n <div class=\"review-block\">\n <div class=\"review-title\">{{ t('ruleDefinition.review.condition', 'Condicao') }}</div>\n <div class=\"review-kicker\">{{ getConditionDescription() }}</div>\n <div *ngIf=\"getConditionDsl(); else alwaysDsl\" class=\"review-body\">\n {{ getConditionDsl() }}\n </div>\n <ng-template #alwaysDsl>\n <div class=\"review-body\">{{ t('ruleDefinition.review.alwaysMode', 'Sempre (sem expressao DSL)') }}</div>\n </ng-template>\n </div>\n\n <div class=\"review-block\">\n <div class=\"review-title\">{{ t('ruleDefinition.review.effects', 'Efeitos') }}</div>\n <div class=\"review-kicker\">{{ getEffectsDescription() }}</div>\n <div class=\"review-body\">{{ getEffectsEditorialSummary() }}</div>\n <div\n *ngIf=\"propertyConfig?.propertiesWhenFalse && (propertyConfig?.propertiesWhenFalse | json) !== '{}'\"\n class=\"muted\"\n >\n {{ t('ruleDefinition.review.whenFalse', 'Quando falso') }}: {{ getEffectsWhenFalseSummary() }}\n </div>\n </div>\n </div>\n\n <details class=\"technical-details\">\n <summary>{{ t('ruleDefinition.review.technical', 'Detalhes tecnicos') }}</summary>\n\n <div class=\"review-block compact\">\n <div class=\"review-title\">{{ t('ruleDefinition.review.conditionDsl', 'DSL da condicao') }}</div>\n <div *ngIf=\"getConditionDsl(); else noDsl\" class=\"code-block\">\n {{ getConditionDsl() }}\n </div>\n <ng-template #noDsl>\n <div class=\"muted\">{{ t('ruleDefinition.review.alwaysMode', 'Sempre (sem expressao DSL)') }}</div>\n </ng-template>\n </div>\n\n <div class=\"review-block compact\">\n <div class=\"review-title\">{{ t('ruleDefinition.review.json', 'JSON da regra') }}</div>\n <div class=\"code-block\">\n {{ getRuleConfigForSummary() | json }}\n </div>\n </div>\n </details>\n </div>\n\n </mat-step>\n </mat-stepper>\n\n <div class=\"step-footer\">\n <div class=\"footer-actions-left\">\n <button mat-stroked-button type=\"button\" (click)=\"cancelEditing()\">\n {{ t('ruleDefinition.action.cancel', 'Cancelar') }}\n </button>\n <button mat-button type=\"button\" (click)=\"resetEditing()\">\n {{ t('ruleDefinition.action.reset', 'Resetar') }}\n </button>\n </div>\n\n <div class=\"footer-actions-right\">\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"goPrevious()\"\n [disabled]=\"selectedStepIndex === 0\"\n >\n {{ t('ruleDefinition.action.previous', 'Anterior') }}\n </button>\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"goNext()\"\n [disabled]=\"!canAdvance()\"\n >\n {{ selectedStepIndex === 3 ? t('ruleDefinition.action.save', 'Salvar regra') : t('ruleDefinition.action.next', 'Proximo') }}\n </button>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .rule-definition-container {\n --_pvb-definition-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));\n --_pvb-definition-surface: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));\n --_pvb-definition-surface-strong: var(--md-sys-color-surface-container, var(--md-sys-color-surface));\n --_pvb-definition-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));\n --_pvb-definition-success: var(--md-sys-color-tertiary, #2dcc8f);\n --_pvb-definition-shadow: color-mix(in srgb, var(--_pvb-definition-accent) 18%, transparent);\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 6px 16px 12px;\n overflow-y: auto;\n height: 100%;\n min-height: 0;\n flex: 1;\n box-sizing: border-box;\n background:\n radial-gradient(circle at top center, color-mix(in srgb, var(--_pvb-definition-accent) 8%, transparent) 0%, transparent 34%),\n var(--_pvb-definition-surface);\n }\n\n .rule-canvas-wrapper {\n width: 100%;\n min-height: 0;\n margin: 0;\n }\n\n .rule-stepper {\n background: transparent;\n flex: 1;\n }\n\n .wizard-progress {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n align-items: center;\n gap: 10px;\n padding: 6px 0 14px;\n }\n\n .wizard-progress.mobile {\n grid-template-columns: 1fr;\n }\n\n .progress-step {\n display: flex;\n align-items: center;\n gap: 12px;\n min-height: 62px;\n padding: 10px 12px;\n border-radius: 18px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--md-sys-color-on-surface-variant);\n text-align: left;\n transition:\n background 0.22s ease,\n border-color 0.22s ease,\n box-shadow 0.22s ease,\n color 0.22s ease,\n transform 0.22s ease;\n }\n\n .progress-step:disabled {\n cursor: default;\n opacity: 1;\n }\n\n .progress-step:not(:disabled) {\n cursor: pointer;\n }\n\n .progress-step:not(:disabled):hover {\n transform: translateY(-1px);\n background: color-mix(in srgb, var(--_pvb-definition-surface-strong) 82%, transparent);\n border-color: color-mix(in srgb, var(--_pvb-definition-border) 72%, transparent);\n }\n\n .progress-step.is-current {\n background: color-mix(in srgb, var(--_pvb-definition-surface-strong) 90%, black 10%);\n border-color: color-mix(in srgb, var(--_pvb-definition-accent) 34%, transparent);\n box-shadow:\n 0 0 0 1px color-mix(in srgb, var(--_pvb-definition-accent) 12%, transparent),\n 0 16px 36px color-mix(in srgb, var(--_pvb-definition-shadow) 28%, transparent);\n color: var(--md-sys-color-on-surface);\n }\n\n .progress-step.is-complete {\n color: var(--md-sys-color-on-surface);\n }\n\n .progress-step.is-pending {\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .progress-step-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 36px;\n height: 36px;\n border-radius: 14px;\n border: 1px solid color-mix(in srgb, var(--_pvb-definition-border) 52%, transparent);\n background: color-mix(in srgb, var(--_pvb-definition-surface-strong) 94%, black 6%);\n box-shadow: inset 0 1px 0 color-mix(in srgb, white 6%, transparent);\n }\n\n .progress-step.is-current .progress-step-icon {\n background: color-mix(in srgb, var(--_pvb-definition-accent) 14%, transparent);\n border-color: color-mix(in srgb, var(--_pvb-definition-accent) 42%, transparent);\n color: var(--_pvb-definition-accent);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 8%, transparent),\n 0 0 18px color-mix(in srgb, var(--_pvb-definition-accent) 18%, transparent);\n }\n\n .progress-step.is-complete .progress-step-icon {\n background: color-mix(in srgb, var(--_pvb-definition-success) 16%, transparent);\n border-color: color-mix(in srgb, var(--_pvb-definition-success) 46%, transparent);\n color: var(--_pvb-definition-success);\n box-shadow: 0 0 18px color-mix(in srgb, var(--_pvb-definition-success) 18%, transparent);\n }\n\n .progress-step-copy {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n }\n\n .progress-step-title {\n font-size: 14px;\n font-weight: 600;\n color: inherit;\n }\n\n .progress-step-subtitle {\n font-size: 11px;\n line-height: 1.2;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .progress-connector {\n height: 1px;\n background: color-mix(in srgb, var(--_pvb-definition-border) 44%, transparent);\n margin: 0 -2px;\n position: relative;\n overflow: hidden;\n }\n\n .progress-connector.active {\n background: color-mix(in srgb, var(--_pvb-definition-success) 54%, transparent);\n }\n\n .progress-connector.active::after {\n content: '';\n position: absolute;\n inset: -1px auto -1px -20%;\n width: 36%;\n background: linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--_pvb-definition-success) 54%, white 16%) 50%, transparent 100%);\n animation: pvbProgressPulse 2.6s ease-in-out infinite;\n }\n\n .panel-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 0;\n }\n\n .mode-selector {\n margin-bottom: 12px;\n display: flex;\n justify-content: flex-start;\n }\n\n .small-toggles ::ng-deep .mat-button-toggle-label-content {\n line-height: 32px !important;\n padding: 0 12px !important;\n font-size: 13px;\n }\n\n .step-question {\n font-weight: 600;\n font-size: 16px;\n color: var(--md-sys-color-on-surface);\n margin-top: 8px;\n margin-bottom: 8px;\n }\n\n .step-label-stack {\n display: inline-flex;\n flex-direction: column;\n gap: 2px;\n line-height: 1.1;\n }\n\n .step-label-main {\n font-size: 14px;\n font-weight: 600;\n }\n\n .step-label-sub {\n font-size: 11px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .step-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 16px;\n padding-left: 0;\n }\n\n .step-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n padding: 14px 0 0;\n margin-top: 8px;\n border-top: 1px solid color-mix(in srgb, var(--_pvb-definition-border) 52%, transparent);\n position: sticky;\n bottom: 0;\n z-index: 2;\n background:\n linear-gradient(\n 180deg,\n color-mix(in srgb, var(--_pvb-definition-surface) 2%, transparent) 0%,\n color-mix(in srgb, var(--_pvb-definition-surface) 96%, black 4%) 36%\n );\n backdrop-filter: blur(10px);\n }\n\n .footer-actions-left,\n .footer-actions-right {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .step-footer button[mat-stroked-button],\n .step-footer button[mat-button],\n .step-footer button[mat-flat-button] {\n min-height: 40px;\n border-radius: 12px;\n }\n\n .step-footer button[mat-flat-button] {\n min-width: 108px;\n box-shadow: 0 10px 24px color-mix(in srgb, var(--_pvb-definition-accent) 22%, transparent);\n }\n\n .step-footer button[mat-flat-button]:not([disabled]) {\n animation: pvbPrimaryGlow 2.8s ease-in-out infinite;\n }\n\n .condition-warning {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px;\n margin-bottom: 12px;\n border: 1px solid var(--md-sys-color-error);\n border-radius: 10px;\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n font-size: 13px;\n }\n\n .visual-editor-box {\n height: auto;\n min-height: 0;\n border: 1px solid var(--_pvb-definition-border);\n border-radius: 12px;\n overflow: visible;\n box-shadow: none;\n }\n\n .w-100 {\n width: 100%;\n }\n\n .always-hint {\n font-size: 13px;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .review-block {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 14px;\n border-radius: 14px;\n border: 1px solid color-mix(in srgb, var(--_pvb-definition-border) 72%, transparent);\n background: color-mix(in srgb, var(--_pvb-definition-surface-strong) 96%, black 4%);\n box-shadow: inset 0 1px 0 color-mix(in srgb, white 4%, transparent);\n }\n\n .review-title {\n font-weight: 600;\n }\n\n .review-hero {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px 18px;\n border-radius: 18px;\n border: 1px solid color-mix(in srgb, var(--_pvb-definition-accent) 22%, transparent);\n background:\n linear-gradient(\n 135deg,\n color-mix(in srgb, var(--_pvb-definition-accent) 12%, var(--_pvb-definition-surface-strong) 88%) 0%,\n color-mix(in srgb, var(--_pvb-definition-surface-strong) 96%, black 4%) 100%\n );\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 6%, transparent),\n 0 18px 42px color-mix(in srgb, var(--_pvb-definition-shadow) 14%, transparent);\n }\n\n .review-hero-title {\n font-size: 12px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .review-hero-body {\n font-size: 16px;\n line-height: 1.5;\n font-weight: 500;\n }\n\n .review-grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 12px;\n }\n\n .review-block.highlight {\n grid-column: span 3;\n }\n\n .review-kicker {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .review-body {\n font-size: 14px;\n line-height: 1.5;\n }\n\n .code-block {\n font-family: 'Roboto Mono', monospace;\n font-size: 12px;\n padding: 8px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--_pvb-definition-surface-strong) 96%, black 4%);\n border: 1px solid var(--_pvb-definition-border);\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .muted {\n color: var(--md-sys-color-on-surface-variant);\n font-size: 13px;\n }\n\n .pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n border-radius: 14px;\n background: color-mix(in srgb, var(--_pvb-definition-accent) 10%, transparent);\n border: 1px solid color-mix(in srgb, var(--_pvb-definition-border) 78%, transparent);\n font-size: 13px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, white 5%, transparent);\n }\n\n .technical-details {\n border: 1px solid color-mix(in srgb, var(--_pvb-definition-border) 72%, transparent);\n border-radius: 14px;\n padding: 12px 14px;\n background: color-mix(in srgb, var(--_pvb-definition-surface-strong) 96%, black 4%);\n }\n\n .technical-details summary {\n cursor: pointer;\n font-weight: 600;\n }\n\n .technical-details[open] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .review-block.compact {\n padding: 0;\n border: 0;\n background: transparent;\n }\n\n .condition-panel {\n width: 100%;\n margin-left: 0;\n }\n\n .condition-editor {\n border: 1px solid var(--_pvb-definition-border);\n border-radius: 12px;\n padding: 10px;\n box-shadow: none;\n background: color-mix(in srgb, var(--_pvb-definition-surface-strong) 96%, black 4%);\n width: 100%;\n min-height: unset;\n overflow: visible;\n }\n\n .dsl-editor-box ::ng-deep .mat-mdc-form-field-flex {\n border-radius: 8px;\n }\n\n ::ng-deep .mat-horizontal-stepper-header-container {\n display: none;\n }\n\n ::ng-deep .mat-horizontal-content-container {\n padding: 2px 0 0 0;\n }\n\n @media (max-width: 768px) {\n .review-grid {\n grid-template-columns: 1fr;\n }\n\n .review-block.highlight {\n grid-column: span 1;\n }\n\n .step-footer {\n flex-direction: column;\n align-items: stretch;\n }\n\n .footer-actions-left,\n .footer-actions-right {\n width: 100%;\n justify-content: space-between;\n }\n\n .progress-connector {\n display: none;\n }\n }\n\n @keyframes pvbPrimaryGlow {\n 0%,\n 100% {\n box-shadow: 0 10px 24px color-mix(in srgb, var(--_pvb-definition-accent) 22%, transparent);\n }\n 50% {\n box-shadow:\n 0 14px 30px color-mix(in srgb, var(--_pvb-definition-accent) 28%, transparent),\n 0 0 0 1px color-mix(in srgb, var(--_pvb-definition-accent) 16%, transparent);\n }\n }\n\n @keyframes pvbProgressPulse {\n 0% {\n transform: translateX(0%);\n opacity: 0;\n }\n 18% {\n opacity: 1;\n }\n 100% {\n transform: translateX(340%);\n opacity: 0;\n }\n }\n `,\n ],\n})\nexport class RuleDefinitionComponent implements OnChanges, OnDestroy {\n private readonly i18n = inject(PraxisI18nService);\n\n @Input() ruleNode!: RuleNode;\n @Input() fieldSchemas: Record<string, FieldSchema> = {};\n @Input() targetSchemas: RuleBuilderConfig['targetSchemas'];\n @Input() propertySchema: RulePropertySchema = RULE_PROPERTY_SCHEMA;\n\n @Output() ruleChanged = new EventEmitter<RuleNodeConfigExtended>();\n\n selectedTargetType: TargetType = 'field';\n selectedTargets: string[] = [];\n conditionMode: 'always' | 'visual' | 'dsl' = 'always';\n dslDraft = '';\n conditionState: RuleBuilderState | null = null;\n conditionFieldSchemas: Record<string, FieldSchema> = {};\n propertyConfig: PropertyEffectConfig | null = null;\n availableProperties: RulePropertyDefinition[] = [];\n invalidConditionFields: string[] = [];\n isMobile = false;\n selectedStepIndex = 0;\n\n private destroy$ = new Subject<void>();\n private isInitializing = false;\n private lastEmittedConfig = '';\n\n constructor(\n private readonly ruleBuilderService: RuleBuilderService,\n private readonly dslVisualImport: DslVisualImportService,\n breakpointObserver: BreakpointObserver,\n ) {\n this.ruleBuilderService.state$\n .pipe(takeUntil(this.destroy$))\n .subscribe((state) => {\n this.conditionState = state;\n if (this.conditionMode === 'visual' && !this.isInitializing) {\n this.emitChange();\n }\n this.updateConditionWarnings();\n });\n\n breakpointObserver\n .observe([Breakpoints.XSmall, Breakpoints.Small])\n .pipe(takeUntil(this.destroy$))\n .subscribe((result) => {\n this.isMobile = result.matches;\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['ruleNode'] && this.ruleNode) {\n const prev = changes['ruleNode'].previousValue;\n const curr = changes['ruleNode'].currentValue;\n if (!prev || prev.id !== curr.id) {\n this.initializeFromNode();\n }\n }\n if (changes['propertySchema'] || changes['targetSchemas'] || changes['fieldSchemas']) {\n this.syncConditionFieldSchemas();\n this.updateAvailableProperties();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onTargetsChanged(event: { type: TargetType; targets: string[] }): void {\n this.selectedTargetType = event.type;\n this.selectedTargets = event.targets;\n this.syncConditionFieldSchemas();\n this.updateAvailableProperties();\n this.updateConditionWarnings();\n this.emitChange();\n }\n\n setConditionMode(mode: 'always' | 'visual' | 'dsl'): void {\n this.conditionMode = mode;\n if (mode === 'always') {\n this.dslDraft = '';\n } else if (mode === 'visual' && this.dslDraft.trim()) {\n const parsed = this.dslVisualImport.parseToRuleState(\n this.dslDraft,\n this.buildParsingConfig(),\n );\n if (parsed.success && parsed.nodes && parsed.rootNodes?.length) {\n this.ruleBuilderService.updateFromParsedDsl(\n parsed.nodes,\n parsed.rootNodes,\n 'DSL to visual',\n );\n } else {\n this.conditionMode = 'dsl';\n }\n }\n this.emitChange();\n }\n\n onDslBlur(): void {\n this.emitChange();\n }\n\n onEffectsChanged(config: PropertyEffectConfig): void {\n this.propertyConfig = config;\n this.emitChange();\n }\n\n updateAvailableProperties(): void {\n this.availableProperties = this.propertySchema[this.selectedTargetType] || [];\n }\n\n getConditionDescription(): string {\n if (this.conditionMode === 'always') {\n return this.t('ruleDefinition.conditionDescription.always', 'Sempre');\n }\n if (this.conditionMode === 'visual') {\n return this.t('ruleDefinition.conditionDescription.visual', 'Visual');\n }\n return this.t('ruleDefinition.conditionDescription.dsl', 'DSL manual');\n }\n\n getEffectsDescription(): string {\n const props = Object.keys(this.propertyConfig?.properties || {}).length;\n const propsFalse = Object.keys(this.propertyConfig?.propertiesWhenFalse || {}).length;\n if (props === 0 && propsFalse === 0) {\n return this.t('ruleDefinition.effects.none', 'Nenhum efeito');\n }\n return `${props} ${this.t('ruleDefinition.effects.trueCount', 'efeito(s) verdadeiro')} · ${propsFalse} ${this.t('ruleDefinition.effects.falseCount', 'efeito(s) falso')}`;\n }\n\n getEditorialSummary(): string {\n const targetCount = this.selectedTargets.length;\n const targetLabel = this.getTargetTypeLabel(this.selectedTargetType).toLowerCase();\n const conditionText =\n this.conditionMode === 'always'\n ? this.t('ruleDefinition.review.summary.always', 'sempre que o formulario estiver neste contexto')\n : this.t('ruleDefinition.review.summary.conditional', 'quando a condicao configurada for satisfeita');\n const effectText = this.getEffectsEditorialSummary();\n\n return `${effectText} em ${targetCount} ${targetLabel}, ${conditionText}.`;\n }\n\n getEffectsEditorialSummary(): string {\n const properties = Object.entries(this.propertyConfig?.properties || {});\n if (!properties.length) {\n return this.t('ruleDefinition.review.effects.noneEditorial', 'Nenhum efeito principal definido');\n }\n\n const [name, value] = properties[0];\n return this.describeProperty(name, value);\n }\n\n getEffectsWhenFalseSummary(): string {\n const properties = Object.entries(this.propertyConfig?.propertiesWhenFalse || {});\n if (!properties.length) {\n return this.t('ruleDefinition.review.whenFalseNone', 'Sem acao adicional');\n }\n\n const [name, value] = properties[0];\n return this.describeProperty(name, value);\n }\n\n getInvalidConditionWarningText(): string {\n return `${this.t('ruleDefinition.conditionWarning.prefix', 'Campos fora do contexto atual')}: ${this.invalidConditionFields.join(', ')}. ${this.t('ruleDefinition.conditionWarning.suffix', 'Eles serao ignorados ate voce escolher campos compativeis.')}`;\n }\n\n emitChange(): void {\n if (this.isInitializing) {\n return;\n }\n\n const disallowed = this.updateConditionWarnings();\n const output = this.buildRuleConfig(disallowed.length > 0);\n const snapshot = JSON.stringify(output);\n\n if (\n snapshot === this.lastEmittedConfig ||\n snapshot === this.snapshotConfigFromInput(this.ruleNode?.config as RuleNodeConfigExtended)\n ) {\n return;\n }\n\n this.lastEmittedConfig = snapshot;\n this.ruleChanged.emit(output);\n }\n\n selectNode(nodeId: string): void {\n this.ruleBuilderService.selectNode(nodeId);\n }\n\n onNodeAdded(event: any): void {\n this.ruleBuilderService.addNode(event, event.parentId);\n }\n\n onNodeUpdated(event: any): void {\n this.ruleBuilderService.updateNode(event.nodeId, event.updates);\n }\n\n removeNode(nodeId: string): void {\n this.ruleBuilderService.removeNode(nodeId);\n }\n\n isStep1Valid(): boolean {\n return this.selectedTargets.length > 0;\n }\n\n isStep2Valid(): boolean {\n if (!this.isStep1Valid()) return false;\n if (this.conditionMode === 'always') return true;\n if (this.conditionMode === 'visual') {\n return !this.invalidConditionFields.length && !!this.conditionState?.currentDSL?.trim();\n }\n if (this.conditionMode === 'dsl') {\n return !!this.dslDraft.trim();\n }\n return false;\n }\n\n isStep3Valid(): boolean {\n if (!this.isStep2Valid()) return false;\n const hasTrue = Object.keys(this.propertyConfig?.properties || {}).length > 0;\n const hasFalse = Object.keys(this.propertyConfig?.propertiesWhenFalse || {}).length > 0;\n return hasTrue || hasFalse;\n }\n\n isStep4Valid(): boolean {\n return this.isStep3Valid();\n }\n\n getStepDefinitions(): Array<{\n index: number;\n icon: string;\n title: string;\n subtitle: string;\n }> {\n return [\n {\n index: 0,\n icon: 'my_location',\n title: this.t('ruleDefinition.step1.title', 'Alvos'),\n subtitle: this.t('ruleDefinition.step1.subtitle', 'Onde aplicar'),\n },\n {\n index: 1,\n icon: 'rule',\n title: this.t('ruleDefinition.step2.title', 'Condicao'),\n subtitle: this.t('ruleDefinition.step2.subtitle', 'Quando executar'),\n },\n {\n index: 2,\n icon: 'bolt',\n title: this.t('ruleDefinition.step3.title', 'Efeitos'),\n subtitle: this.t('ruleDefinition.step3.subtitle', 'O que fazer'),\n },\n {\n index: 3,\n icon: 'fact_check',\n title: this.t('ruleDefinition.step4.title', 'Revisao'),\n subtitle: this.t('ruleDefinition.step4.subtitle', 'Confirmar regra'),\n },\n ];\n }\n\n getStepVisualState(index: number): 'complete' | 'current' | 'pending' {\n if (index < this.selectedStepIndex) {\n return 'complete';\n }\n if (index === this.selectedStepIndex) {\n return 'current';\n }\n return 'pending';\n }\n\n isConnectorActive(index: number): boolean {\n return index < this.selectedStepIndex;\n }\n\n canSelectStep(index: number): boolean {\n return index <= this.getMaxSelectableStep();\n }\n\n goToStep(index: number): void {\n if (!this.canSelectStep(index)) {\n return;\n }\n this.selectedStepIndex = index;\n }\n\n canAdvance(): boolean {\n switch (this.selectedStepIndex) {\n case 0:\n return this.isStep1Valid();\n case 1:\n return this.isStep2Valid();\n case 2:\n return this.isStep3Valid();\n case 3:\n return this.isStep4Valid();\n default:\n return false;\n }\n }\n\n goPrevious(): void {\n this.selectedStepIndex = Math.max(0, this.selectedStepIndex - 1);\n }\n\n goNext(): void {\n if (this.selectedStepIndex === 3) {\n if (this.isStep4Valid()) {\n this.emitChange();\n }\n return;\n }\n\n if (this.canAdvance()) {\n this.selectedStepIndex = Math.min(3, this.selectedStepIndex + 1);\n }\n }\n\n private getMaxSelectableStep(): number {\n if (!this.isStep1Valid()) {\n return 0;\n }\n if (!this.isStep2Valid()) {\n return 1;\n }\n if (!this.isStep3Valid()) {\n return 2;\n }\n return 3;\n }\n\n cancelEditing(): void {\n this.initializeFromNode();\n this.selectedStepIndex = 0;\n }\n\n resetEditing(): void {\n this.lastEmittedConfig = '';\n this.selectedTargetType = 'field';\n this.selectedTargets = [];\n this.conditionMode = 'always';\n this.dslDraft = '';\n this.propertyConfig = { properties: {}, propertiesWhenFalse: {} };\n this.updateAvailableProperties();\n this.syncConditionFieldSchemas();\n this.invalidConditionFields = [];\n this.selectedStepIndex = 0;\n }\n\n getRuleConfigForSummary(): RuleNodeConfigExtended {\n return this.buildRuleConfig(this.invalidConditionFields.length > 0);\n }\n\n getConditionDsl(): string | null {\n if (this.conditionMode === 'visual') {\n return this.invalidConditionFields.length\n ? null\n : this.conditionState?.currentDSL || null;\n }\n if (this.conditionMode === 'dsl') {\n return this.dslDraft.trim() || null;\n }\n return null;\n }\n\n t(key: string, fallback: string): string {\n return resolvePraxisVisualBuilderText(this.i18n, key, fallback);\n }\n\n getDslPlaceholder(): string {\n return this.t(\n 'ruleDefinition.dsl.placeholder',\n \"Ex: status == 'ativo' and idade >= 18\",\n );\n }\n\n getTargetTypeLabel(type: TargetType): string {\n switch (type) {\n case 'section':\n return this.t('ruleDefinition.targetType.sectionPlural', 'Secoes');\n case 'action':\n return this.t('ruleDefinition.targetType.actionPlural', 'Acoes');\n case 'row':\n return this.t('ruleDefinition.targetType.rowPlural', 'Linhas');\n case 'column':\n return this.t('ruleDefinition.targetType.columnPlural', 'Colunas');\n default:\n return this.t('ruleDefinition.targetType.fieldPlural', 'Campos');\n }\n }\n\n formatTargetName(target: string): string {\n return target\n .replace(/^section:/, '')\n .replace(/^action:/, '')\n .replace(/^row:/, '')\n .replace(/^column:/, '');\n }\n\n private initializeFromNode(): void {\n this.isInitializing = true;\n this.lastEmittedConfig = '';\n this.selectedStepIndex = 0;\n const config = (this.ruleNode.config as RuleNodeConfigExtended) || {};\n\n this.selectedTargets = config.targets || [];\n this.selectedTargetType = config.targetType || this.inferTargetType(this.selectedTargets);\n this.propertyConfig = {\n properties: config.properties || {},\n propertiesWhenFalse: config.propertiesWhenFalse,\n };\n\n this.syncConditionFieldSchemas();\n this.ruleBuilderService.initialize({ fieldSchemas: this.conditionFieldSchemas });\n\n if (!config.condition || (typeof config.condition === 'string' && !config.condition.trim())) {\n this.conditionMode = 'always';\n this.dslDraft = '';\n } else if (typeof config.condition === 'string') {\n const parsed = this.dslVisualImport.parseToRuleState(\n config.condition,\n this.buildParsingConfig(),\n );\n if (parsed.success && parsed.nodes && parsed.rootNodes?.length) {\n this.ruleBuilderService.loadFromParsedDsl(\n parsed.nodes,\n parsed.rootNodes,\n 'DSL condition import',\n );\n this.conditionMode = 'visual';\n } else {\n this.conditionMode = 'dsl';\n this.dslDraft = config.condition;\n }\n }\n\n this.updateAvailableProperties();\n this.lastEmittedConfig = this.snapshotConfigFromInput(config);\n this.isInitializing = false;\n }\n\n private inferTargetType(targets: string[]): TargetType {\n if (targets.some((target) => target.startsWith('section:'))) return 'section';\n if (targets.some((target) => target.startsWith('action:'))) return 'action';\n if (targets.some((target) => target.startsWith('row:'))) return 'row';\n if (targets.some((target) => target.startsWith('column:'))) return 'column';\n return 'field';\n }\n\n private buildParsingConfig(): DslParsingConfig {\n return {\n knownFields: Object.keys(this.conditionFieldSchemas || {}),\n enablePerformanceWarnings: false,\n };\n }\n\n private buildRuleConfig(skipVisualCondition = false): RuleNodeConfigExtended {\n let condition: string | null = null;\n if (this.conditionMode === 'visual') {\n condition = skipVisualCondition ? null : this.conditionState?.currentDSL || null;\n } else if (this.conditionMode === 'dsl') {\n condition = this.dslDraft.trim() || null;\n }\n\n return {\n type: 'propertyRule',\n targetType: this.selectedTargetType,\n targets: this.selectedTargets,\n condition: condition || undefined,\n properties: this.propertyConfig?.properties || {},\n propertiesWhenFalse: this.propertyConfig?.propertiesWhenFalse || {},\n };\n }\n\n private syncConditionFieldSchemas(): void {\n this.conditionFieldSchemas = this.computeConditionFieldSchemas();\n }\n\n private computeConditionFieldSchemas(): Record<string, FieldSchema> {\n const byType = this.targetSchemas;\n if (this.selectedTargetType === 'column' && byType?.columns && Object.keys(byType.columns).length) {\n return byType.columns as Record<string, FieldSchema>;\n }\n if (this.selectedTargetType === 'row' && byType?.rows && Object.keys(byType.rows).length) {\n return byType.rows as Record<string, FieldSchema>;\n }\n return (byType?.fields as Record<string, FieldSchema>) || this.fieldSchemas || {};\n }\n\n private updateConditionWarnings(): string[] {\n const allowedSchemas = this.computeConditionFieldSchemas();\n const allowedKeys = new Set(\n Object.values(allowedSchemas || {}).map((schema) =>\n this.normalizeFieldKey(schema?.name || ''),\n ),\n );\n const currentState = this.ruleBuilderService.getCurrentState();\n const invalid = new Set<string>();\n\n Object.values(currentState.nodes || {}).forEach((node) => {\n const cfg: any = node?.config || {};\n const type = node?.type || cfg?.type;\n const fieldName = cfg?.fieldName || cfg?.field;\n if (\n (type === RuleNodeType.FIELD_CONDITION || cfg?.type === 'fieldCondition') &&\n fieldName\n ) {\n const normalized = this.normalizeFieldKey(fieldName);\n if (!allowedKeys.has(normalized)) {\n invalid.add(fieldName);\n }\n }\n });\n\n if (this.conditionMode === 'dsl' && this.dslDraft) {\n const tokens = this.dslDraft.match(/(?:row|column):[\\w-]+/gi) || [];\n tokens.forEach((token) => {\n const normalized = this.normalizeFieldKey(token);\n if (!allowedKeys.has(normalized)) {\n invalid.add(token);\n }\n });\n }\n\n this.invalidConditionFields = Array.from(invalid);\n return this.invalidConditionFields;\n }\n\n private normalizeFieldKey(value: string): string {\n return (value || '').split('|')[0].trim().toLowerCase();\n }\n\n private snapshotConfigFromInput(config?: RuleNodeConfigExtended | null): string {\n if (!config) return '';\n try {\n const normalized: RuleNodeConfigExtended = {\n type: 'propertyRule',\n targetType: config.targetType || this.selectedTargetType,\n targets: Array.isArray(config.targets) ? config.targets : [],\n condition: config.condition || undefined,\n properties: config.properties || {},\n propertiesWhenFalse: config.propertiesWhenFalse || {},\n };\n return JSON.stringify(normalized);\n } catch {\n return '';\n }\n }\n\n private describeProperty(name: string, value: unknown): string {\n if (name === 'visible') {\n return value\n ? this.t('ruleDefinition.effect.visibleOn', 'Mostrar os elementos selecionados')\n : this.t('ruleDefinition.effect.visibleOff', 'Ocultar os elementos selecionados');\n }\n if (name === 'required') {\n return value\n ? this.t('ruleDefinition.effect.requiredOn', 'Tornar os campos obrigatorios')\n : this.t('ruleDefinition.effect.requiredOff', 'Tornar os campos opcionais');\n }\n if (name === 'disabled') {\n return value\n ? this.t('ruleDefinition.effect.disabledOn', 'Desabilitar os elementos selecionados')\n : this.t('ruleDefinition.effect.disabledOff', 'Habilitar os elementos selecionados');\n }\n return `${this.t('ruleDefinition.effect.set', 'Aplicar')} ${name}`;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Optional,\n Output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { PraxisI18nService } from '@praxisui/core';\nimport {\n providePraxisVisualBuilderI18n,\n resolvePraxisVisualBuilderText,\n} from '../i18n/visual-builder.i18n';\nimport {\n type RuleNode,\n type ValidationError,\n} from '../models/rule-builder.model';\n\ntype RuleListItem = string | RuleNode;\ntype RuleCardStatus = 'draft' | 'incomplete' | 'error' | 'valid';\ntype StatusFilter = 'all' | RuleCardStatus;\n\n@Component({\n selector: 'praxis-rule-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatButtonModule,\n MatChipsModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatListModule,\n MatTooltipModule,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [providePraxisVisualBuilderI18n()],\n host: { class: 'rule-list-panel' },\n template: `\n <div class=\"panel-header\">\n <div class=\"panel-heading\">\n <div class=\"eyebrow\">{{ t('ruleList.eyebrow', 'Regras') }}</div>\n <h3>{{ t('ruleList.title', 'Regras') }}</h3>\n </div>\n\n <div class=\"header-badge-stack\">\n <div class=\"header-badge\">{{ rules?.length || 0 }}</div>\n </div>\n </div>\n\n <div class=\"search-box\">\n <mat-form-field appearance=\"outline\" class=\"w-100\" density=\"compact\">\n <mat-icon matPrefix>search</mat-icon>\n <input\n matInput\n [(ngModel)]=\"searchTerm\"\n [placeholder]=\"t('ruleList.searchPlaceholder', 'Buscar regras...')\"\n />\n <button\n *ngIf=\"searchTerm\"\n matSuffix\n mat-icon-button\n [attr.aria-label]=\"t('ruleList.clearSearch', 'Limpar busca')\"\n (click)=\"searchTerm = ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div class=\"filter-row\">\n <button\n mat-stroked-button\n class=\"filter-chip\"\n [class.active]=\"statusFilter === 'all'\"\n (click)=\"statusFilter = 'all'\"\n >\n {{ t('ruleList.filter.all', 'Todas') }}\n </button>\n <button\n mat-stroked-button\n class=\"filter-chip\"\n [class.active]=\"statusFilter === 'valid'\"\n (click)=\"statusFilter = 'valid'\"\n >\n {{ t('ruleList.status.valid', 'Valida') }}\n </button>\n <button\n mat-stroked-button\n class=\"filter-chip\"\n [class.active]=\"statusFilter === 'incomplete'\"\n (click)=\"statusFilter = 'incomplete'\"\n >\n {{ t('ruleList.status.incomplete', 'Incompleta') }}\n </button>\n <button\n mat-stroked-button\n class=\"filter-chip\"\n [class.active]=\"statusFilter === 'draft'\"\n (click)=\"statusFilter = 'draft'\"\n >\n {{ t('ruleList.status.draft', 'Rascunho') }}\n </button>\n <button\n mat-stroked-button\n class=\"filter-chip\"\n [class.active]=\"statusFilter === 'error'\"\n (click)=\"statusFilter = 'error'\"\n >\n {{ t('ruleList.status.error', 'Com erro') }}\n </button>\n </div>\n\n <div class=\"panel-actions\">\n <button\n mat-flat-button\n color=\"primary\"\n class=\"new-rule-button\"\n (click)=\"onAddRule()\"\n [attr.aria-label]=\"t('ruleList.addRuleAria', 'Adicionar regra')\"\n >\n <mat-icon>add</mat-icon>\n {{ t('ruleList.addRule', 'Nova regra') }}\n </button>\n\n <button\n mat-stroked-button\n class=\"ai-rule-button\"\n (click)=\"onAiRequest()\"\n [attr.aria-label]=\"t('ruleList.aiButton', 'IA')\"\n >\n <mat-icon>auto_awesome</mat-icon>\n {{ t('ruleList.aiButton', 'IA') }}\n </button>\n </div>\n\n <div class=\"list-content\">\n <mat-list role=\"listbox\" [attr.aria-label]=\"t('ruleList.listAria', 'Lista de regras')\">\n <mat-list-item\n *ngFor=\"let item of filteredRules; trackBy: trackById\"\n class=\"rule-list-item\"\n [class.selected]=\"isSelected(item)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(item)\"\n (click)=\"onSelect(item)\"\n (keydown.enter)=\"onKeySelect(item, $event)\"\n (keydown.space)=\"onKeySelect(item, $event)\"\n tabindex=\"0\"\n >\n <div class=\"rule-card\" [class.has-error]=\"getStatus(item) === 'error'\" [matTooltip]=\"getTooltip(item)\">\n <div class=\"rule-card-top\">\n <div class=\"rule-card-title-group\">\n <div class=\"rule-title-line\">\n <span class=\"rule-name\">{{ getLabel(item) }}</span>\n <span class=\"rule-status\" [ngClass]=\"getStatus(item)\">\n <span class=\"status-dot\"></span>\n {{ getStatusLabel(item) }}\n </span>\n </div>\n\n <div class=\"rule-card-meta\">\n <span class=\"meta-pill\">{{ getPrimaryTargetLabel(item) }}</span>\n <span class=\"meta-pill subtle\">{{ getConditionPill(item) }}</span>\n <span class=\"meta-pill subtle\">{{ getPrimaryEffectLabel(item) }}</span>\n </div>\n </div>\n\n <div class=\"card-actions\">\n <button\n mat-icon-button\n class=\"card-action\"\n (click)=\"onDuplicate(item, $event)\"\n [matTooltip]=\"t('ruleList.duplicate', 'Duplicar regra')\"\n [attr.aria-label]=\"t('ruleList.duplicate', 'Duplicar regra')\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n\n <button\n mat-icon-button\n color=\"warn\"\n class=\"card-action\"\n (click)=\"onDelete(item, $event)\"\n [matTooltip]=\"t('ruleList.remove', 'Remover regra')\"\n [attr.aria-label]=\"t('ruleList.remove', 'Remover regra')\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"rule-summary\">{{ getSummary(item) }}</div>\n\n <div class=\"rule-tags\" *ngIf=\"getTargetPreview(item).length\">\n <span class=\"tag\" *ngFor=\"let tag of getTargetPreview(item)\">{{ tag }}</span>\n </div>\n\n <div class=\"rule-card-footer\" *ngIf=\"getRelativeTime(item) as relativeTime\">\n <span class=\"rule-time\">{{ relativeTime }}</span>\n </div>\n </div>\n </mat-list-item>\n </mat-list>\n\n <div *ngIf=\"!rules?.length\" class=\"empty-list\">\n {{ t('ruleList.empty', 'Nenhuma regra definida.') }}<br />\n {{ t('ruleList.emptyHint', 'Clique em + para criar.') }}\n </div>\n\n <div *ngIf=\"rules?.length && !filteredRules.length\" class=\"empty-list\">\n {{ t('ruleList.noResults', 'Nenhuma regra encontrada.') }}\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n --_pvb-list-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));\n --_pvb-list-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));\n --_pvb-list-surface-strong: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));\n --_pvb-list-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));\n --_pvb-list-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));\n --_pvb-list-success: var(--md-sys-color-primary, var(--_pvb-list-accent));\n --_pvb-list-warning: var(--md-sys-color-tertiary, #ffb347);\n --_pvb-list-error: var(--md-sys-color-error, #ff5f5f);\n display: flex;\n flex-direction: column;\n border-right: 1px solid var(--md-sys-color-outline-variant);\n background:\n radial-gradient(circle at top left, color-mix(in srgb, var(--_pvb-list-accent) 14%, transparent) 0%, transparent 34%),\n linear-gradient(\n 180deg,\n color-mix(in srgb, var(--_pvb-list-surface-strong) 94%, black 6%) 0%,\n color-mix(in srgb, var(--_pvb-list-surface) 96%, black 4%) 100%\n );\n overflow: hidden;\n min-width: 0;\n color: var(--md-sys-color-on-surface);\n }\n\n .panel-header {\n padding: 18px 18px 12px 18px;\n display: flex;\n justify-content: space-between;\n gap: 12px;\n align-items: flex-start;\n background: color-mix(in srgb, var(--_pvb-list-surface-strong) 84%, transparent);\n }\n\n .panel-heading {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .eyebrow {\n font-size: 11px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n color: var(--_pvb-list-accent);\n }\n\n .panel-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n }\n\n .header-badge-stack {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .header-badge {\n min-width: 34px;\n height: 34px;\n padding: 0 10px;\n border-radius: 999px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--_pvb-list-surface-strong) 92%, transparent);\n border: 1px solid color-mix(in srgb, var(--_pvb-list-accent) 22%, transparent);\n color: color-mix(in srgb, var(--_pvb-list-accent) 72%, var(--md-sys-color-on-surface) 28%);\n font-size: 13px;\n font-weight: 700;\n }\n\n .search-box {\n padding: 0 18px 0 18px;\n }\n\n .w-100,\n .search-box mat-form-field {\n width: 100%;\n }\n\n .search-box ::ng-deep .mat-mdc-text-field-wrapper {\n background: color-mix(in srgb, var(--_pvb-list-surface-strong) 96%, black 4%);\n border-radius: 14px;\n }\n\n .search-box ::ng-deep .mat-mdc-form-field-subscript-wrapper {\n display: none;\n }\n\n .filter-row {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 10px 18px 0 18px;\n }\n\n .filter-chip {\n min-height: 30px;\n border-radius: 999px !important;\n font-size: 12px;\n color: var(--_pvb-list-text-soft);\n border-color: color-mix(in srgb, var(--_pvb-list-border) 74%, transparent) !important;\n }\n\n .filter-chip.active {\n color: var(--_pvb-list-accent);\n background: color-mix(in srgb, var(--_pvb-list-accent) 10%, transparent);\n border-color: color-mix(in srgb, var(--_pvb-list-accent) 30%, transparent) !important;\n }\n\n .panel-actions {\n padding: 12px 18px 14px 18px;\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 8px;\n }\n\n .new-rule-button {\n min-height: 42px;\n border-radius: 12px;\n background:\n linear-gradient(\n 135deg,\n color-mix(in srgb, var(--_pvb-list-accent) 30%, transparent) 0%,\n color-mix(in srgb, var(--_pvb-list-accent) 16%, transparent) 100%\n ) !important;\n border: 1px solid color-mix(in srgb, var(--_pvb-list-accent) 44%, transparent);\n color: var(--_pvb-list-accent) !important;\n font-weight: 700;\n }\n\n .ai-rule-button {\n min-width: 52px;\n min-height: 42px;\n border-radius: 12px !important;\n border-color: color-mix(in srgb, var(--_pvb-list-accent) 28%, transparent) !important;\n color: var(--_pvb-list-accent) !important;\n padding: 0 12px !important;\n }\n\n .list-content {\n flex: 1;\n overflow-y: auto;\n padding: 0 10px 14px 10px;\n }\n\n mat-list {\n padding: 0;\n }\n\n .rule-list-item {\n padding: 0;\n margin-bottom: 10px;\n cursor: pointer;\n height: auto !important;\n min-height: 0;\n }\n\n ::ng-deep .rule-list-item .mdc-list-item__content {\n width: 100%;\n padding: 0 !important;\n }\n\n .rule-card {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 14px;\n border-radius: 14px;\n border: 1px solid color-mix(in srgb, var(--_pvb-list-border) 68%, transparent);\n background: color-mix(in srgb, var(--_pvb-list-surface-strong) 96%, black 4%);\n transition:\n border-color 0.22s ease,\n transform 0.22s ease,\n box-shadow 0.22s ease,\n background 0.22s ease;\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 5%, transparent),\n 0 10px 24px color-mix(in srgb, black 18%, transparent);\n }\n\n .rule-card.has-error {\n border-color: color-mix(in srgb, var(--_pvb-list-error) 30%, transparent);\n }\n\n .rule-list-item:hover .rule-card {\n transform: translateY(-1px);\n border-color: color-mix(in srgb, var(--_pvb-list-accent) 34%, transparent);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, white 6%, transparent),\n 0 16px 30px color-mix(in srgb, var(--_pvb-list-accent) 12%, transparent);\n }\n\n .rule-list-item.selected .rule-card {\n border-color: color-mix(in srgb, var(--_pvb-list-accent) 68%, transparent);\n box-shadow:\n 0 0 0 1px color-mix(in srgb, var(--_pvb-list-accent) 14%, transparent),\n 0 16px 34px color-mix(in srgb, var(--_pvb-list-accent) 14%, transparent);\n background:\n linear-gradient(\n 180deg,\n color-mix(in srgb, var(--_pvb-list-accent) 10%, var(--_pvb-list-surface-strong) 90%) 0%,\n color-mix(in srgb, var(--_pvb-list-surface-strong) 96%, black 4%) 100%\n );\n }\n\n .rule-card-top {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n }\n\n .rule-card-title-group {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n flex: 1;\n }\n\n .rule-title-line {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 10px;\n align-items: start;\n }\n\n .rule-status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n width: fit-content;\n }\n\n .rule-status.valid {\n color: var(--_pvb-list-success);\n }\n\n .rule-status.incomplete {\n color: var(--_pvb-list-warning);\n }\n\n .rule-status.draft {\n color: var(--_pvb-list-text-soft);\n }\n\n .rule-status.error {\n color: var(--_pvb-list-error);\n }\n\n .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: currentColor;\n }\n\n .card-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .card-action {\n opacity: 0.72;\n width: 30px;\n height: 30px;\n transition: transform 0.18s ease, opacity 0.18s ease, color 0.18s ease;\n }\n\n .card-action:hover {\n transform: translateY(-1px) scale(1.02);\n opacity: 1;\n }\n\n .rule-card-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .meta-pill {\n display: inline-flex;\n align-items: center;\n min-height: 24px;\n padding: 0 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--_pvb-list-accent) 14%, transparent);\n color: color-mix(in srgb, var(--_pvb-list-accent) 82%, var(--md-sys-color-on-surface) 18%);\n font-size: 12px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, white 6%, transparent);\n }\n\n .meta-pill.subtle {\n background: color-mix(in srgb, var(--_pvb-list-border) 16%, transparent);\n color: var(--_pvb-list-text-soft);\n }\n\n .rule-summary {\n font-size: 12px;\n line-height: 1.45;\n color: var(--_pvb-list-text-soft);\n }\n\n .rule-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .rule-card-footer {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n min-height: 18px;\n }\n\n .rule-time {\n font-size: 12px;\n color: var(--_pvb-list-text-soft);\n letter-spacing: 0.01em;\n }\n\n .tag {\n display: inline-flex;\n align-items: center;\n min-height: 20px;\n padding: 0 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--_pvb-list-accent) 12%, transparent);\n color: var(--_pvb-list-accent);\n font-size: 11px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, white 5%, transparent);\n }\n\n .rule-name {\n font-weight: 600;\n font-size: 15px;\n line-height: 1.2;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n white-space: normal;\n }\n\n .empty-list {\n padding: 28px 18px;\n text-align: center;\n color: var(--_pvb-list-text-soft);\n font-size: 13px;\n line-height: 1.5;\n }\n `,\n ],\n})\nexport class RuleListComponent {\n @Input() rules: RuleListItem[] = [];\n @Input() selectedRuleId = '';\n @Input() nodeMap: Record<string, RuleNode> = {};\n @Input() validationErrors: ValidationError[] = [];\n\n @Output() ruleSelected = new EventEmitter<string>();\n @Output() ruleDeleted = new EventEmitter<string>();\n @Output() ruleDuplicated = new EventEmitter<string>();\n @Output() ruleAdded = new EventEmitter<void>();\n @Output() aiRequested = new EventEmitter<void>();\n\n searchTerm = '';\n statusFilter: StatusFilter = 'all';\n\n constructor(@Optional() private readonly i18n?: PraxisI18nService) {}\n\n get filteredRules(): RuleListItem[] {\n const term = this.searchTerm.trim().toLowerCase();\n return this.rules.filter((item) => {\n const statusMatches =\n this.statusFilter === 'all' || this.getStatus(item) === this.statusFilter;\n\n if (!statusMatches) {\n return false;\n }\n\n if (!term) {\n return true;\n }\n\n const blob = [\n this.getLabel(item),\n this.getSummary(item),\n this.getConditionDetail(item),\n this.getEffectDetail(item),\n this.getMainTargetName(item),\n ...this.getTargetPreview(item),\n ]\n .join(' ')\n .toLowerCase();\n\n return blob.includes(term);\n });\n }\n\n trackById = (_index: number, item: RuleListItem): string => this.getItemId(item);\n\n isSelected(item: RuleListItem): boolean {\n return this.getItemId(item) === this.selectedRuleId;\n }\n\n getLabel(item: RuleListItem): string {\n const node = this.getNode(item);\n if (node) {\n return node.label || node.id;\n }\n return this.getItemId(item);\n }\n\n getTooltip(item: RuleListItem): string {\n return [\n this.getLabel(item),\n this.getSummary(item),\n `${this.t('ruleList.insight.target', 'Alvo principal')}: ${this.getMainTargetName(item)}`,\n `${this.t('ruleList.insight.effect', 'Efeito')}: ${this.getEffectDetail(item)}`,\n ].join('\\n');\n }\n\n getStatus(item: RuleListItem): RuleCardStatus {\n const node = this.getNode(item);\n const config: any = node?.config || {};\n const targets = Array.isArray(config.targets) ? config.targets : [];\n const props = Object.keys(config.properties || {});\n const propsWhenFalse = Object.keys(config.propertiesWhenFalse || {});\n const hasTargets = targets.length > 0;\n const hasEffects = props.length > 0 || propsWhenFalse.length > 0;\n const hasCondition = typeof config.condition === 'string' && !!config.condition.trim();\n const nodeErrors = this.validationErrors.filter((error) => error.nodeId === node?.id);\n const hasError = nodeErrors.some((error) => error.severity === 'error');\n\n if (hasError) {\n return 'error';\n }\n if (!hasTargets && !hasEffects && !hasCondition) {\n return 'draft';\n }\n if (!hasTargets || !hasEffects) {\n return 'incomplete';\n }\n return 'valid';\n }\n\n getStatusLabel(item: RuleListItem): string {\n switch (this.getStatus(item)) {\n case 'error':\n return this.t('ruleList.status.error', 'Com erro');\n case 'draft':\n return this.t('ruleList.status.draft', 'Rascunho');\n case 'incomplete':\n return this.t('ruleList.status.incomplete', 'Incompleta');\n default:\n return this.t('ruleList.status.valid', 'Valida');\n }\n }\n\n countRulesByStatus(status: RuleCardStatus): number {\n return this.rules.filter((item) => this.getStatus(item) === status).length;\n }\n\n getConditionPill(item: RuleListItem): string {\n const node = this.getNode(item);\n const condition = node?.config && (node.config as any).condition;\n return typeof condition === 'string' && condition.trim()\n ? this.t('ruleList.condition.with', 'Condicional')\n : this.t('ruleList.condition.without', 'Sempre');\n }\n\n getConditionDetail(item: RuleListItem): string {\n const node = this.getNode(item);\n const condition = node?.config && (node.config as any).condition;\n return typeof condition === 'string' && condition.trim()\n ? this.t('ruleList.condition.visualOrDsl', 'Expressao configurada')\n : this.t('ruleList.condition.without', 'Sempre');\n }\n\n getPrimaryTargetLabel(item: RuleListItem): string {\n const node = this.getNode(item);\n const config: any = node?.config || {};\n const targets = Array.isArray(config.targets) ? config.targets : [];\n const typeLabel = this.getTargetTypeLabel(config.targetType || 'field');\n return `${targets.length} ${typeLabel}`;\n }\n\n getMainTargetName(item: RuleListItem): string {\n const node = this.getNode(item);\n const config: any = node?.config || {};\n const targets = Array.isArray(config.targets) ? config.targets : [];\n if (!targets.length) {\n return this.t('ruleList.target.none', 'Nenhum alvo');\n }\n return this.stripTargetPrefix(targets[0]);\n }\n\n getPrimaryEffectLabel(item: RuleListItem): string {\n const config: any = this.getNode(item)?.config || {};\n const propNames = Object.keys(config.properties || {});\n return propNames.length\n ? this.describeProperty(propNames[0], (config.properties || {})[propNames[0]])\n : this.t('ruleList.effect.pending', 'Sem efeito');\n }\n\n getEffectDetail(item: RuleListItem): string {\n const config: any = this.getNode(item)?.config || {};\n const props = config.properties || {};\n const propsWhenFalse = config.propertiesWhenFalse || {};\n const entries = Object.entries(props);\n const falseEntries = Object.entries(propsWhenFalse);\n\n if (!entries.length && !falseEntries.length) {\n return this.t('ruleList.effect.pending', 'Sem efeito');\n }\n\n const main = entries[0] as [string, unknown] | undefined;\n const fallback = falseEntries[0] as [string, unknown] | undefined;\n const mainText = main\n ? this.describeProperty(main[0], main[1])\n : this.t('ruleList.effect.pending', 'Sem efeito');\n\n if (!fallback) {\n return mainText;\n }\n\n return `${mainText} / ${this.t('ruleList.effect.whenFalse', 'quando falso')}: ${this.describeProperty(fallback[0], fallback[1])}`;\n }\n\n getSummary(item: RuleListItem): string {\n const node = this.getNode(item);\n const config: any = node?.config || {};\n const status = this.getStatus(item);\n\n if (status === 'draft') {\n return this.t(\n 'ruleList.summary.draft',\n 'Comece escolhendo um alvo e definindo o efeito principal.',\n );\n }\n\n if (status === 'error') {\n return this.t(\n 'ruleList.summary.error',\n 'A regra precisa de ajuste antes de ser publicada.',\n );\n }\n\n const mainTarget = this.getMainTargetName(item);\n const effect = this.getEffectDetail(item);\n const condition = config.condition;\n\n if (typeof condition === 'string' && condition.trim()) {\n return `${this.t('ruleList.summary.when', 'Quando')} ${condition.trim()}, ${effect.toLowerCase()} em ${mainTarget}.`;\n }\n\n return `${effect} em ${mainTarget}.`;\n }\n\n getRelativeTime(item: RuleListItem): string | null {\n const node = this.getNode(item) as (RuleNode & { metadata?: Record<string, unknown> }) | undefined;\n const rawTimestamp =\n node?.metadata?.['updatedAt'] ??\n node?.metadata?.['createdAt'] ??\n node?.metadata?.['modifiedAt'] ??\n node?.metadata?.['lastModified'];\n const date = this.parseTimestamp(rawTimestamp);\n\n if (!date) {\n return null;\n }\n\n const diffMs = Date.now() - date.getTime();\n const minute = 60_000;\n const hour = 60 * minute;\n const day = 24 * hour;\n\n if (diffMs < minute) {\n return this.t('ruleList.time.now', 'Agora');\n }\n\n if (diffMs < hour) {\n const minutes = Math.max(1, Math.floor(diffMs / minute));\n return `${minutes} ${this.t(\n minutes === 1 ? 'ruleList.time.minute' : 'ruleList.time.minutes',\n 'min atras',\n )}`;\n }\n\n if (diffMs < day) {\n const hours = Math.max(1, Math.floor(diffMs / hour));\n return `${hours} ${this.t(\n hours === 1 ? 'ruleList.time.hour' : 'ruleList.time.hours',\n 'h atras',\n )}`;\n }\n\n const days = Math.max(1, Math.floor(diffMs / day));\n return `${days} ${this.t(\n days === 1 ? 'ruleList.time.day' : 'ruleList.time.days',\n days === 1 ? 'dia atras' : 'dias atras',\n )}`;\n }\n\n getTargetPreview(item: RuleListItem): string[] {\n const node = this.getNode(item);\n const config: any = node?.config || {};\n const targets = Array.isArray(config.targets) ? config.targets : [];\n return targets.slice(0, 3).map((target: string) => this.stripTargetPrefix(target));\n }\n\n t(key: string, fallback: string): string {\n return this.i18n\n ? resolvePraxisVisualBuilderText(this.i18n, key, fallback)\n : fallback;\n }\n\n onSelect(item: RuleListItem): void {\n this.ruleSelected.emit(this.getItemId(item));\n }\n\n onDelete(item: RuleListItem, event: MouseEvent): void {\n event.stopPropagation();\n this.ruleDeleted.emit(this.getItemId(item));\n }\n\n onDuplicate(item: RuleListItem, event: MouseEvent): void {\n event.stopPropagation();\n this.ruleDuplicated.emit(this.getItemId(item));\n }\n\n onKeySelect(item: RuleListItem, event: Event): void {\n event.preventDefault?.();\n this.onSelect(item);\n }\n\n onAddRule(): void {\n this.ruleAdded.emit();\n }\n\n onAiRequest(): void {\n this.aiRequested.emit();\n }\n\n private getNode(item: RuleListItem): RuleNode | undefined {\n return typeof item === 'string' ? this.nodeMap[item] : item;\n }\n\n private getItemId(item: RuleListItem): string {\n return typeof item === 'string' ? item : item.id;\n }\n\n private getTargetTypeLabel(targetType: string): string {\n switch (targetType) {\n case 'section':\n return this.t('ruleList.targetType.sectionPlural', 'secoes');\n case 'action':\n return this.t('ruleList.targetType.actionPlural', 'acoes');\n case 'row':\n return this.t('ruleList.targetType.rowPlural', 'linhas');\n case 'column':\n return this.t('ruleList.targetType.columnPlural', 'colunas');\n default:\n return this.t('ruleList.targetType.fieldPlural', 'campos');\n }\n }\n\n private describeProperty(name: string, value: unknown): string {\n if (name === 'visible') {\n return value\n ? this.t('ruleList.effect.visibleOn', 'mostrar')\n : this.t('ruleList.effect.visibleOff', 'ocultar');\n }\n if (name === 'required') {\n return value\n ? this.t('ruleList.effect.requiredOn', 'tornar obrigatorio')\n : this.t('ruleList.effect.requiredOff', 'tornar opcional');\n }\n if (name === 'disabled') {\n return value\n ? this.t('ruleList.effect.disabledOn', 'desabilitar')\n : this.t('ruleList.effect.disabledOff', 'habilitar');\n }\n return `${this.t('ruleList.effect.set', 'definir')} ${name}`;\n }\n\n private stripTargetPrefix(value: string): string {\n if (!value) return value;\n if (value.startsWith('section:')) return value.slice('section:'.length);\n if (value.startsWith('action:')) return value.slice('action:'.length);\n if (value.startsWith('row:')) return value.slice('row:'.length);\n if (value.startsWith('column:')) return value.slice('column:'.length);\n return value;\n }\n\n private parseTimestamp(rawTimestamp: unknown): Date | null {\n if (rawTimestamp instanceof Date) {\n return Number.isNaN(rawTimestamp.getTime()) ? null : rawTimestamp;\n }\n\n if (typeof rawTimestamp === 'number' || typeof rawTimestamp === 'string') {\n const parsed = new Date(rawTimestamp);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n }\n\n return null;\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): string[] {\n return FIELD_TYPE_OPERATORS[fieldType] || [];\n }\n\n /**\n * Get operator labels for a field type\n */\n getOperatorLabels(fieldType: FieldType | string): 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 || 'Outros';\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 | string): boolean {\n if (value === null || value === undefined) {\n return true; // Let required validation handle this\n }\n\n const normalized = type as FieldType;\n\n switch (normalized) {\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): string[] {\n const errors: string[] = [];\n\n if (format.minimum !== undefined) {\n if (type === FieldType.STRING || type === FieldType.ARRAY || type === 'string' || type === '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 || type === 'number' || type === '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 || type === 'string' || type === '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 || type === 'number' || type === '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}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatListModule } from '@angular/material/list';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Subject, takeUntil } from 'rxjs';\nimport {\n RULE_PROPERTY_SCHEMA,\n type RulePropertySchema,\n PraxisI18nService,\n} from '@praxisui/core';\nimport {\n AiResponseValidatorService,\n AiRuleResponse,\n AiRuleWizardDialogComponent,\n AiValidationResult,\n} from '@praxisui/ai';\nimport { FieldSchema } from '../models/field-schema.model';\nimport {\n ExportOptions,\n ImportOptions,\n RuleBuilderConfig,\n RuleBuilderState,\n RuleNode,\n RuleNodeConfig,\n RuleNodeType,\n ValidationError,\n} from '../models/rule-builder.model';\nimport { FieldSchemaService } from '../services/field-schema.service';\nimport { RuleBuilderService } from '../services/rule-builder.service';\nimport { ExportDialogComponent } from './export-dialog.component';\nimport { RuleDefinitionComponent } from './rule-definition.component';\nimport { RuleListComponent } from './rule-list.component';\nimport {\n providePraxisVisualBuilderI18n,\n resolvePraxisVisualBuilderText,\n} from '../i18n/visual-builder.i18n';\n\ntype TargetType = 'field' | 'section' | 'action' | 'row' | 'column';\ntype RuleNodeConfigExtended = RuleNodeConfig & {\n targetType?: TargetType;\n properties?: Record<string, any>;\n propertiesWhenFalse?: Record<string, any>;\n targets?: string[];\n condition?: RuleNode | string | null;\n};\n\n@Component({\n selector: 'praxis-rule-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatCardModule,\n MatButtonModule,\n MatIconModule,\n MatToolbarModule,\n MatSidenavModule,\n MatListModule,\n MatDividerModule,\n MatSnackBarModule,\n MatTooltipModule,\n MatDialogModule,\n MatBadgeModule,\n MatMenuModule,\n RuleListComponent,\n RuleDefinitionComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [providePraxisVisualBuilderI18n()],\n template: `\n <div class=\"rule-editor-container\" [class.embedded]=\"embedded\">\n <div *ngIf=\"shouldShowShellChrome()\" class=\"builder-shell-header\">\n <div class=\"shell-brand\">\n <button\n mat-icon-button\n class=\"shell-menu\"\n (click)=\"toggleListPanel()\"\n [matTooltip]=\"isListPanelOpen ? t('ruleEditor.toolbar.collapseList', 'Recolher painel lateral') : t('ruleEditor.toolbar.expandList', 'Expandir painel lateral')\"\n >\n <mat-icon>{{ isListPanelOpen ? 'menu_open' : 'menu' }}</mat-icon>\n </button>\n\n <div class=\"brand-mark\">\n <mat-icon>rule</mat-icon>\n </div>\n\n <div class=\"brand-copy\">\n <div class=\"brand-title\">{{ t('ruleEditor.shell.brand', 'Form Builder') }}</div>\n <div class=\"brand-breadcrumb\">\n {{ t('ruleEditor.shell.breadcrumb', 'Editor de regras') }}\n </div>\n </div>\n </div>\n\n <div class=\"shell-nav\">\n <button class=\"nav-pill\" type=\"button\">{{ t('ruleEditor.shell.nav.layout', 'Layout') }}</button>\n <button class=\"nav-pill active\" type=\"button\">{{ t('ruleEditor.shell.nav.rules', 'Regras') }}</button>\n <button class=\"nav-pill\" type=\"button\">{{ t('ruleEditor.shell.nav.docs', 'Documentacao') }}</button>\n </div>\n\n <div class=\"shell-status\">\n <div class=\"unsaved-indicator\" *ngIf=\"currentState?.isDirty\">\n <span class=\"unsaved-dot\"></span>\n <span>{{ t('ruleEditor.shell.unsaved', 'Alteracoes nao salvas') }}</span>\n </div>\n\n <button mat-icon-button [disabled]=\"!canUndo\" (click)=\"undo()\" [matTooltip]=\"t('ruleEditor.toolbar.undo', 'Desfazer')\">\n <mat-icon>undo</mat-icon>\n </button>\n\n <button mat-icon-button [disabled]=\"!canRedo\" (click)=\"redo()\" [matTooltip]=\"t('ruleEditor.toolbar.redo', 'Refazer')\">\n <mat-icon>redo</mat-icon>\n </button>\n\n <button\n mat-icon-button\n [matMenuTriggerFor]=\"devMenu\"\n [matTooltip]=\"t('ruleEditor.toolbar.advanced', 'Mais opcoes')\"\n >\n <mat-icon>more_horiz</mat-icon>\n </button>\n </div>\n </div>\n\n <mat-menu #devMenu=\"matMenu\">\n <button mat-menu-item (click)=\"openExportDialog()\">\n <mat-icon>download</mat-icon>\n <span>{{ t('ruleEditor.toolbar.export', 'Exportar') }}</span>\n </button>\n <button mat-menu-item (click)=\"importRules()\">\n <mat-icon>upload</mat-icon>\n <span>{{ t('ruleEditor.toolbar.import', 'Importar') }}</span>\n </button>\n <button mat-menu-item (click)=\"showDebugPanel = !showDebugPanel\">\n <mat-icon>{{ showDebugPanel ? 'visibility_off' : 'visibility' }}</mat-icon>\n <span>\n {{\n showDebugPanel\n ? t('ruleEditor.debug.hide', 'Ocultar painel de debug')\n : t('ruleEditor.debug.show', 'Mostrar painel de debug')\n }}\n </span>\n </button>\n <button mat-menu-item (click)=\"clearRules()\">\n <mat-icon>delete_forever</mat-icon>\n <span>{{ t('ruleEditor.debug.clearAll', 'Limpar tudo') }}</span>\n </button>\n </mat-menu>\n\n <div class=\"editor-content-grid\" [class.list-closed]=\"!isListPanelOpen\">\n <praxis-rule-list\n [hidden]=\"!isListPanelOpen\"\n class=\"rule-list-panel\"\n [rules]=\"currentState?.rootNodes || []\"\n [nodeMap]=\"currentState?.nodes || {}\"\n [validationErrors]=\"validationErrors\"\n [selectedRuleId]=\"currentState?.selectedNodeId || ''\"\n (ruleSelected)=\"selectNode($event)\"\n (ruleDeleted)=\"removeNode($event)\"\n (ruleDuplicated)=\"duplicateNode($event)\"\n (ruleAdded)=\"addPropertyRule()\"\n (aiRequested)=\"openAiWizard()\"\n ></praxis-rule-list>\n\n <div class=\"rule-definition-panel\">\n <ng-container *ngIf=\"selectedNode; else noSelection\">\n <praxis-rule-definition\n *ngIf=\"isPropertyRule(selectedNode)\"\n [ruleNode]=\"selectedNode\"\n [fieldSchemas]=\"fieldSchemas\"\n [targetSchemas]=\"targetSchemas\"\n [propertySchema]=\"propertySchemaMap\"\n (ruleChanged)=\"onRuleUpdated($event)\"\n ></praxis-rule-definition>\n\n <div *ngIf=\"!isPropertyRule(selectedNode)\" class=\"unsupported-node\">\n <mat-icon>warning</mat-icon>\n <h3>{{ t('ruleEditor.unsupported.title', 'Tipo de regra nao suportado') }}</h3>\n <p>\n {{ t('ruleEditor.unsupported.body', 'Este no usa um formato legado. Remova e recrie como regra de propriedade.') }}\n </p>\n </div>\n </ng-container>\n\n <ng-template #noSelection>\n <div class=\"empty-state\">\n <mat-icon>rule</mat-icon>\n <h3>{{ t('ruleEditor.empty.title', 'Selecione uma regra ou crie uma nova') }}</h3>\n <p>{{ t('ruleEditor.empty.body', 'Monte regras visuais com alvo, condicao e efeito em uma trilha guiada.') }}</p>\n <button mat-raised-button color=\"primary\" (click)=\"addPropertyRule()\">\n <mat-icon>add</mat-icon>\n {{ t('ruleEditor.empty.cta', 'Criar regra') }}\n </button>\n </div>\n </ng-template>\n </div>\n </div>\n\n <div *ngIf=\"shouldShowStatusBar()\" class=\"status-bar\">\n <div class=\"status-left\">\n <span class=\"node-count\">{{ t('ruleEditor.status.rules', 'Regras') }}: {{ getRuleCount() }}</span>\n <span *ngIf=\"currentState?.isDirty\" class=\"dirty-indicator\">\n • {{ t('ruleEditor.status.unsaved', 'Nao salvo') }}\n </span>\n </div>\n\n <div class=\"status-center\">\n <div *ngIf=\"validationErrors.length > 0\" class=\"validation-status error\">\n <mat-icon [matBadge]=\"validationErrors.length\" matBadgeColor=\"warn\">error</mat-icon>\n {{ validationErrors.length }} {{ t('ruleEditor.status.errors', 'erro(s)') }}\n </div>\n <div *ngIf=\"validationErrors.length === 0\" class=\"validation-status success\">\n <mat-icon>check_circle</mat-icon>\n {{ t('ruleEditor.status.valid', 'Valido') }}\n </div>\n </div>\n </div>\n\n <div *ngIf=\"showDebugPanel\" class=\"debug-panel\">\n <div class=\"debug-header\">\n <h3>{{ t('ruleEditor.debug.title', 'Estado de debug') }}</h3>\n <button mat-icon-button (click)=\"showDebugPanel = false\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n <div class=\"debug-content\">\n <pre>{{ currentState | json }}</pre>\n </div>\n </div>\n\n <input\n #fileInput\n type=\"file\"\n style=\"display: none\"\n accept=\".json,.dsl,.txt\"\n (change)=\"onFileSelected($event)\"\n />\n </div>\n `,\n styles: [\n `\n .rule-editor-container {\n --_pvb-editor-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));\n --_pvb-editor-accent-soft: color-mix(in srgb, var(--_pvb-editor-accent) 16%, transparent);\n --_pvb-editor-surface: var(--md-sys-color-surface, var(--sicoob-background-primary));\n --_pvb-editor-surface-low: var(--md-sys-color-surface-container-low, var(--sicoob-background-secondary));\n --_pvb-editor-surface-strong: var(--md-sys-color-surface-container, var(--sicoob-background-tertiary));\n --_pvb-editor-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));\n --_pvb-editor-text: var(--md-sys-color-on-surface, var(--sicoob-text-default));\n --_pvb-editor-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));\n display: flex;\n flex-direction: column;\n height: 100%;\n background:\n radial-gradient(circle at top center, color-mix(in srgb, var(--_pvb-editor-accent) 12%, transparent) 0%, transparent 32%),\n linear-gradient(\n 180deg,\n color-mix(in srgb, var(--_pvb-editor-surface-low) 96%, black 4%) 0%,\n color-mix(in srgb, var(--_pvb-editor-surface) 98%, black 2%) 100%\n );\n overflow: hidden;\n position: relative;\n color: var(--_pvb-editor-text);\n }\n\n .rule-editor-container.embedded {\n height: 100%;\n }\n\n .builder-shell-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n min-height: 54px;\n padding: 0 18px;\n border-bottom: 1px solid color-mix(in srgb, var(--_pvb-editor-border) 68%, transparent);\n background: color-mix(in srgb, var(--_pvb-editor-surface-strong) 94%, black 6%);\n flex-shrink: 0;\n }\n\n .shell-brand {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n }\n\n .shell-menu {\n margin-right: 2px;\n }\n\n .brand-mark {\n width: 32px;\n height: 32px;\n border-radius: 10px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--_pvb-editor-accent) 16%, transparent);\n border: 1px solid color-mix(in srgb, var(--_pvb-editor-accent) 24%, transparent);\n }\n\n .brand-mark mat-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n width: 18px;\n height: 18px;\n color: var(--_pvb-editor-accent);\n }\n\n .brand-copy {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n }\n\n .brand-title {\n font-size: 14px;\n font-weight: 700;\n }\n\n .brand-breadcrumb {\n font-size: 12px;\n color: var(--_pvb-editor-text-soft);\n }\n\n .shell-nav {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n padding: 4px;\n border-radius: 14px;\n background: color-mix(in srgb, var(--_pvb-editor-surface-low) 94%, black 6%);\n border: 1px solid color-mix(in srgb, var(--_pvb-editor-border) 56%, transparent);\n }\n\n .nav-pill {\n min-width: 96px;\n height: 34px;\n border: 0;\n border-radius: 10px;\n background: transparent;\n color: var(--_pvb-editor-text-soft);\n font: inherit;\n font-size: 13px;\n cursor: default;\n }\n\n .nav-pill.active {\n color: var(--_pvb-editor-text);\n background: color-mix(in srgb, var(--_pvb-editor-accent) 16%, transparent);\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--_pvb-editor-accent) 34%, transparent);\n }\n\n .shell-status {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .unsaved-indicator {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--_pvb-editor-text);\n margin-right: 6px;\n }\n\n .unsaved-dot {\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: #f0b429;\n box-shadow: 0 0 12px rgba(240, 180, 41, 0.45);\n }\n\n .builder-shell-header button[mat-icon-button] {\n width: 36px;\n height: 36px;\n line-height: 36px;\n padding: 8px;\n }\n\n .builder-shell-header button[mat-icon-button] mat-icon {\n font-size: 20px;\n width: 20px;\n height: 20px;\n line-height: 20px;\n }\n\n .editor-content-grid {\n display: grid;\n grid-template-columns: 360px 1fr;\n flex: 1;\n overflow: hidden;\n min-height: 0;\n transition: grid-template-columns 0.2s ease;\n }\n\n .editor-content-grid.list-closed {\n grid-template-columns: 0 1fr;\n }\n\n .rule-list-panel {\n border-right: 1px solid color-mix(in srgb, var(--_pvb-editor-border) 74%, transparent);\n background: color-mix(in srgb, var(--_pvb-editor-surface-low) 94%, black 6%);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .rule-definition-panel {\n background:\n radial-gradient(circle at 50% 0%, color-mix(in srgb, var(--_pvb-editor-accent) 8%, transparent) 0%, transparent 26%),\n transparent;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n position: relative;\n min-height: 0;\n flex: 1;\n }\n\n .empty-state,\n .unsupported-node {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: var(--_pvb-editor-text-soft);\n gap: 16px;\n text-align: center;\n padding: 32px;\n }\n\n .empty-state mat-icon,\n .unsupported-node mat-icon {\n font-size: 64px;\n width: 64px;\n height: 64px;\n opacity: 0.9;\n color: var(--_pvb-editor-accent);\n }\n\n .status-bar {\n height: 32px;\n background: color-mix(in srgb, var(--_pvb-editor-surface-strong) 92%, black 8%);\n border-top: 1px solid color-mix(in srgb, var(--_pvb-editor-border) 74%, transparent);\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n font-size: 12px;\n color: var(--_pvb-editor-text-soft);\n flex-shrink: 0;\n }\n\n .status-left,\n .status-center {\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 }\n\n .validation-status.error {\n color: var(--md-sys-color-error);\n }\n\n .validation-status.success {\n color: var(--md-sys-color-tertiary);\n }\n\n .validation-status mat-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n\n .debug-panel {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 400px;\n background: var(--_pvb-editor-surface);\n border-left: 1px solid var(--_pvb-editor-border);\n box-shadow: -2px 0 8px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n }\n\n .debug-header {\n padding: 8px 16px;\n border-bottom: 1px solid var(--_pvb-editor-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--_pvb-editor-surface-strong);\n }\n\n .debug-content {\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-family: monospace;\n font-size: 12px;\n }\n\n @media (max-width: 1180px) {\n .builder-shell-header {\n flex-wrap: wrap;\n justify-content: flex-start;\n padding: 10px 14px;\n }\n\n .shell-nav {\n order: 3;\n width: 100%;\n justify-content: center;\n }\n\n .shell-status {\n margin-left: auto;\n }\n }\n\n `,\n ],\n})\nexport class RuleEditorComponent\n implements OnInit, OnDestroy, OnChanges, AfterViewInit\n{\n @Input() embedded = false;\n @Input() config: RuleBuilderConfig | null = null;\n @Input() initialRules: any = null;\n @Output() stateChanged = new EventEmitter<RuleBuilderState>();\n @Output() save = new EventEmitter<RuleBuilderState>();\n @Output() rulesChanged = new EventEmitter<RuleBuilderState>();\n @Output() exportRequested = new EventEmitter<ExportOptions>();\n @Output() importRequested = new EventEmitter<ImportOptions>();\n\n @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n private destroy$ = new Subject<void>();\n\n currentState: RuleBuilderState | null = null;\n fieldSchemas: Record<string, FieldSchema> = {};\n showDebugPanel = false;\n validationErrors: ValidationError[] = [];\n isListPanelOpen = true;\n selectedNode: RuleNode | null = null;\n propertySchemaMap: RulePropertySchema = RULE_PROPERTY_SCHEMA;\n targetSchemas?: RuleBuilderConfig['targetSchemas'];\n private lastErrorCount = 0;\n\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 readonly ruleBuilderService: RuleBuilderService,\n private readonly fieldSchemaService: FieldSchemaService,\n private readonly aiResponseValidator: AiResponseValidatorService,\n private readonly snackBar: MatSnackBar,\n private readonly dialog: MatDialog,\n private readonly cdr: ChangeDetectorRef,\n @Optional() private readonly i18n?: PraxisI18nService,\n ) {}\n\n ngOnInit(): void {\n this.setupSubscriptions();\n this.ruleBuilderService.initialize({\n fieldSchemas: (this.config?.fieldSchemas as Record<string, FieldSchema>) || {},\n targetSchemas: this.config?.targetSchemas,\n });\n\n if (this.initialRules) {\n const content =\n typeof this.initialRules === 'string'\n ? this.initialRules\n : JSON.stringify(this.initialRules);\n this.ruleBuilderService.import(content, { format: 'json' });\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config'] && this.config) {\n if (this.config.fieldSchemas) {\n this.fieldSchemaService.setFieldSchemas(\n this.config.fieldSchemas as Record<string, FieldSchema>,\n );\n }\n this.targetSchemas = this.config.targetSchemas;\n const schemaFromConfig =\n (this.config.targetPropertySchemas as RulePropertySchema | undefined) ||\n (this.config.propertySchema as RulePropertySchema | undefined);\n this.propertySchemaMap = schemaFromConfig || RULE_PROPERTY_SCHEMA;\n }\n }\n\n ngAfterViewInit(): void {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n undo(): void {\n this.ruleBuilderService.undo();\n }\n\n redo(): void {\n this.ruleBuilderService.redo();\n }\n\n clearRules(): void {\n if (confirm(this.t('ruleEditor.confirm.clearAll', 'Tem certeza que deseja apagar todas as regras?'))) {\n this.ruleBuilderService.clear();\n }\n }\n\n toggleListPanel(): void {\n this.isListPanelOpen = !this.isListPanelOpen;\n }\n\n shouldShowShellChrome(): boolean {\n return !this.embedded;\n }\n\n shouldShowStatusBar(): boolean {\n return !this.embedded;\n }\n\n openAiWizard(): void {\n const dialogRef = this.dialog.open(AiRuleWizardDialogComponent, {\n width: '600px',\n data: {\n fieldSchemas: this.fieldSchemas,\n targetSchemas: this.targetSchemas,\n propertySchema: this.propertySchemaMap,\n },\n });\n\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n this.createRuleFromAI(result);\n }\n });\n }\n\n async createRuleFromAI(aiResponse: AiRuleResponse): Promise<void> {\n const validation = await this.validateAiResponse(aiResponse);\n\n if (!validation.valid) {\n this.snackBar.open(\n `${this.t('ruleEditor.ai.applyError', 'Erro ao aplicar regra')}: ${validation.errors[0]?.message}`,\n this.t('ruleEditor.action.close', 'Fechar'),\n { duration: 5000 },\n );\n return;\n }\n\n const finalResponse = validation.correctedResponse || aiResponse;\n\n try {\n const draftNodeId = this.ruleBuilderService.addNode({\n type: RuleNodeType.PROPERTY_RULE,\n label: `IA · ${finalResponse.ruleName}`,\n config: {\n type: 'propertyRule',\n targetType: finalResponse.targetType,\n targets: finalResponse.targetIds,\n condition: finalResponse.conditionDsl || undefined,\n properties: finalResponse.effects.properties,\n propertiesWhenFalse: finalResponse.effects.propertiesWhenFalse,\n },\n metadata: {\n description: this.t(\n 'ruleEditor.ai.generatedDescription',\n 'Regra gerada por IA. Revise antes de finalizar.',\n ),\n },\n });\n\n this.ruleBuilderService.selectNode(draftNodeId);\n this.snackBar.open(\n this.t('ruleEditor.ai.created', 'Regra criada com sucesso.'),\n 'OK',\n { duration: 3000 },\n );\n } catch (error: any) {\n this.snackBar.open(\n `${this.t('ruleEditor.ai.internalError', 'Erro interno ao criar regra')}: ${error?.message || error}`,\n this.t('ruleEditor.action.close', 'Fechar'),\n { duration: 5000 },\n );\n }\n }\n\n addPropertyRule(): void {\n const newNodeId = this.ruleBuilderService.addNode({\n type: RuleNodeType.PROPERTY_RULE,\n label: this.t('ruleEditor.newRule', 'Nova regra'),\n config: {\n type: 'propertyRule',\n targetType: 'field',\n targets: [],\n properties: {},\n },\n });\n this.ruleBuilderService.selectNode(newNodeId);\n }\n\n selectNode(nodeId: string): void {\n this.ruleBuilderService.selectNode(nodeId);\n }\n\n duplicateNode(nodeId: string): void {\n const node = this.currentState?.nodes?.[nodeId];\n if (!node) {\n return;\n }\n\n const duplicatedId = this.ruleBuilderService.addNode({\n type: node.type,\n label: `${node.label || this.t('ruleEditor.newRule', 'Nova regra')} (${this.t('ruleEditor.duplicateCopy', 'copia')})`,\n config: JSON.parse(JSON.stringify(node.config || {})),\n metadata: node.metadata ? JSON.parse(JSON.stringify(node.metadata)) : undefined,\n });\n\n this.ruleBuilderService.selectNode(duplicatedId);\n }\n\n onRuleUpdated(config: RuleNodeConfigExtended): void {\n if (!this.selectedNode) return;\n\n const nextConfig = this.normalizeRuleConfig(config);\n const existingConfig = this.normalizeRuleConfig(\n (this.selectedNode.config as RuleNodeConfigExtended) || {},\n );\n const nextLabel = this.buildPropertyRuleLabel(nextConfig);\n const prevLabel = this.selectedNode.label || this.selectedNode.id;\n\n const sameConfig =\n JSON.stringify(existingConfig || {}) === JSON.stringify(nextConfig || {});\n const sameLabel = nextLabel === prevLabel;\n\n if (sameConfig && sameLabel) {\n return;\n }\n\n this.ruleBuilderService.updateNode(this.selectedNode.id, {\n config: nextConfig,\n label: nextLabel,\n });\n }\n\n removeNode(nodeId: string): void {\n if (confirm(this.t('ruleEditor.confirm.removeRule', 'Remover esta regra?'))) {\n this.ruleBuilderService.removeNode(nodeId);\n }\n }\n\n isPropertyRule(node: RuleNode | null): boolean {\n return node?.type === RuleNodeType.PROPERTY_RULE;\n }\n\n openExportDialog(): void {\n this.dialog.open(ExportDialogComponent, {\n width: '600px',\n data: {\n dsl: this.currentState?.currentDSL,\n json: this.currentState?.currentJSON,\n onExport: (options: ExportOptions) => this.exportRequested.emit(options),\n },\n });\n }\n\n importRules(): void {\n this.fileInput.nativeElement.click();\n }\n\n onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n const file = input.files[0];\n const reader = new FileReader();\n reader.onload = (loadEvent) => {\n const content = loadEvent.target?.result as string;\n const options: ImportOptions = {\n format: 'json',\n merge: false,\n };\n try {\n this.ruleBuilderService.import(content, options);\n this.importRequested.emit(options);\n this.snackBar.open(\n this.t('ruleEditor.import.success', 'Importacao concluida'),\n 'OK',\n { duration: 2500 },\n );\n } catch (error: any) {\n const msg =\n error?.message ||\n this.t('ruleEditor.import.failure', 'Falha ao importar regras');\n this.snackBar.open(msg, this.t('ruleEditor.action.close', 'Fechar'), {\n duration: 4500,\n });\n }\n input.value = '';\n };\n reader.readAsText(file);\n }\n }\n\n getRuleCount(): number {\n return this.currentState?.rootNodes?.length || 0;\n }\n\n t(key: string, fallback: string): string {\n return this.i18n\n ? resolvePraxisVisualBuilderText(this.i18n, key, fallback)\n : fallback;\n }\n\n private setupSubscriptions(): void {\n this.ruleBuilderService.state$\n .pipe(takeUntil(this.destroy$))\n .subscribe((state) => {\n this.currentState = state;\n this.selectedNode = state.selectedNodeId\n ? state.nodes[state.selectedNodeId]\n : null;\n\n this.stateChanged.emit(state);\n this.rulesChanged.emit(state);\n this.cdr.markForCheck();\n });\n\n this.ruleBuilderService.validationErrors$\n .pipe(takeUntil(this.destroy$))\n .subscribe((errors) => {\n this.validationErrors = errors;\n if (errors.length > this.lastErrorCount && errors.length > 0) {\n this.snackBar.open(\n `${errors.length} ${this.t('ruleEditor.validation.found', 'erro(s) de validacao encontrado(s)')}`,\n this.t('ruleEditor.validation.view', 'Ver'),\n { duration: 5000 },\n );\n }\n this.lastErrorCount = errors.length;\n this.cdr.markForCheck();\n });\n\n this.fieldSchemaService.fieldSchemas$\n .pipe(takeUntil(this.destroy$))\n .subscribe((schemas) => {\n this.fieldSchemas = schemas;\n this.cdr.markForCheck();\n });\n }\n\n private validateAiResponse(response: AiRuleResponse): AiValidationResult {\n return this.aiResponseValidator.validate(response, {\n fieldSchemas: this.fieldSchemas,\n targetSchemas: this.targetSchemas,\n propertySchema: this.propertySchemaMap,\n });\n }\n\n private buildPropertyRuleLabel(config: RuleNodeConfigExtended): string {\n const normalized = this.normalizeRuleConfig(config);\n const targets = normalized.targets || [];\n const props = Object.entries(normalized.properties || {});\n\n const mainProp = props[0];\n if (!mainProp) {\n return targets.length\n ? `${this.t('ruleEditor.label.ruleFor', 'Regra para')} ${targets.length} ${this.t('ruleEditor.label.targets', 'alvo(s)')}`\n : this.t('ruleEditor.label.newWithoutTargets', 'Nova regra sem alvos');\n }\n\n const [propName, propValue] = mainProp;\n let action = '';\n\n if (propName === 'visible') {\n action = propValue\n ? this.t('ruleEditor.actionLabel.show', 'Mostrar')\n : this.t('ruleEditor.actionLabel.hide', 'Ocultar');\n } else if (propName === 'required') {\n action = propValue\n ? this.t('ruleEditor.actionLabel.require', 'Tornar obrigatorio')\n : this.t('ruleEditor.actionLabel.optional', 'Tornar opcional');\n } else if (propName === 'disabled') {\n action = propValue\n ? this.t('ruleEditor.actionLabel.disable', 'Desabilitar')\n : this.t('ruleEditor.actionLabel.enable', 'Habilitar');\n } else {\n action = `${this.t('ruleEditor.actionLabel.set', 'Definir')} ${propName}`;\n }\n\n const targetNames = targets\n .map((target) => this.stripTargetPrefix(target))\n .slice(0, 2)\n .join(', ');\n\n const suffix = targets.length > 2 ? ` (+${targets.length - 2})` : '';\n const conditionSummary = config.condition\n ? ` (${this.t('ruleEditor.label.withCondition', 'com condicao')})`\n : '';\n\n return `${action} ${targetNames}${suffix}${conditionSummary}`;\n }\n\n private stripTargetPrefix(value: string): string {\n if (!value) return value;\n if (value.startsWith('section:')) return value.slice('section:'.length);\n if (value.startsWith('action:')) return value.slice('action:'.length);\n if (value.startsWith('row:')) return value.slice('row:'.length);\n if (value.startsWith('column:')) return value.slice('column:'.length);\n return value;\n }\n\n private normalizeRuleConfig(config: RuleNodeConfigExtended): RuleNodeConfigExtended {\n return {\n type: 'propertyRule',\n targetType: config.targetType || 'field',\n targets: Array.isArray(config.targets) ? config.targets : [],\n properties: config.properties || {},\n propertiesWhenFalse: config.propertiesWhenFalse || {},\n condition: config.condition || undefined,\n };\n }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { RuleEditorComponent } from './components/rule-editor.component';\nimport { RuleBuilderConfig, ExportOptions, ImportOptions, RuleBuilderState } 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\">\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: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n \n .praxis-visual-builder {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: inherit;\n }\n\n praxis-rule-editor {\n flex: 1;\n min-height: 0;\n }\n `]\n})\nexport class PraxisVisualBuilder {\n @Input() config: RuleBuilderConfig | null = null;\n @Input() initialRules: any = null;\n\n @Output() rulesChanged = new EventEmitter<RuleBuilderState>();\n @Output() exportRequested = new EventEmitter<ExportOptions>();\n @Output() importRequested = new EventEmitter<ImportOptions>();\n\n onRulesChanged(rules: RuleBuilderState): void {\n this.rulesChanged.emit(rules);\n }\n\n onExportRequested(options: any): void {\n this.exportRequested.emit(options as ExportOptions);\n }\n\n onImportRequested(options: any): void {\n this.importRequested.emit(options as ImportOptions);\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 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};\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 '@praxisui/ai';\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, 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 ? 'Há alterações não salvas' : 'Tudo salvo'\"\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=\"Informações básicas\">\n <div class=\"tab-content\">\n <!-- Code -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Código da regra</mat-label>\n <input matInput \n formControlName=\"code\"\n placeholder=\"REGRA_001\">\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Identificador único desta regra'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <!-- Message -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Mensagem</mat-label>\n <textarea matInput \n formControlName=\"message\"\n rows=\"3\"\n placeholder=\"Texto que será mostrado ao usuário\">\n </textarea>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Mensagem exibida quando a regra for acionada'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <!-- Tag -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Tag/Categoria</mat-label>\n <input matInput \n formControlName=\"tag\"\n [matAutocomplete]=\"tagAutocomplete\"\n placeholder=\"ex.: validacao, negocio, interface\">\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Categoria para organizar regras semelhantes'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <!-- Description -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Descrição</mat-label>\n <textarea matInput \n formControlName=\"description\"\n rows=\"3\"\n placeholder=\"Explique o objetivo e quando aplicar esta regra\">\n </textarea>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Texto interno para documentação'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <!-- Priority -->\n <mat-form-field appearance=\"outline\" class=\"full-width\">\n <mat-label>Prioridade</mat-label>\n <mat-select formControlName=\"priority\">\n <mat-select-trigger>\n {{ getPriorityLabel(metadataForm.get('priority')?.value) }}\n </mat-select-trigger>\n <mat-option value=\"low\">\n <div class=\"priority-option\">\n <mat-icon>low_priority</mat-icon>\n <span>Baixa</span>\n <small>Regra opcional</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>Média</span>\n <small>Validação padrão</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>Alta</span>\n <small>Validação importante</small>\n </div>\n </mat-option>\n <mat-option value=\"critical\">\n <div class=\"priority-option\">\n <mat-icon>error</mat-icon>\n <span>Crítica</span>\n <small>Impede a continuidade</small>\n </div>\n </mat-option>\n </mat-select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Define a prioridade e a experiência para o usuário'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n </div>\n </mat-tab>\n\n <!-- UI Configuration Tab -->\n <mat-tab label=\"Configurações de interface\">\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 Ícone e visual\n </mat-panel-title>\n <mat-panel-description>\n Ajuste a aparência na tela\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>Ícone</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>Tema de cor</mat-label>\n <mat-select formControlName=\"color\">\n <mat-option value=\"primary\">Primária</mat-option>\n <mat-option value=\"accent\">Destaque</mat-option>\n <mat-option value=\"warn\">Alerta</mat-option>\n <mat-option value=\"success\">Sucesso</mat-option>\n <mat-option value=\"info\">Informação</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>Tamanho</mat-label>\n <mat-select formControlName=\"size\">\n <mat-option value=\"small\">Pequeno</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"large\">Grande</mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"toggle-options\">\n <mat-slide-toggle formControlName=\"showIcon\">\n Mostrar ícone\n </mat-slide-toggle>\n \n <mat-slide-toggle formControlName=\"showLabel\">\n Mostrar rótulo\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 Exibição\n </mat-panel-title>\n <mat-panel-description>\n Controle onde e como exibir\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>Posição</mat-label>\n <mat-select formControlName=\"position\">\n <mat-option value=\"top\">Topo</mat-option>\n <mat-option value=\"bottom\">Parte inferior</mat-option>\n <mat-option value=\"left\">Esquerda</mat-option>\n <mat-option value=\"right\">Direita</mat-option>\n <mat-option value=\"inline\">Em linha</mat-option>\n <mat-option value=\"floating\">Flutuante</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"alignment-select\">\n <mat-label>Alinhamento</mat-label>\n <mat-select formControlName=\"alignment\">\n <mat-option value=\"start\">Início</mat-option>\n <mat-option value=\"center\">Centro</mat-option>\n <mat-option value=\"end\">Fim</mat-option>\n <mat-option value=\"stretch\">Expandido</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div class=\"display-options\">\n <mat-slide-toggle formControlName=\"hidden\">\n Ocultar por padrão\n </mat-slide-toggle>\n \n <mat-slide-toggle formControlName=\"disabled\">\n Desabilitar por padrão\n </mat-slide-toggle>\n \n <mat-slide-toggle formControlName=\"readonly\">\n Somente leitura por padrão\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 Animação e efeitos\n </mat-panel-title>\n <mat-panel-description>\n Configure transições e animações\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>Tipo de animação</mat-label>\n <mat-select formControlName=\"animation\">\n <mat-option value=\"none\">Nenhuma</mat-option>\n <mat-option value=\"fade\">Fade</mat-option>\n <mat-option value=\"slide\">Deslizar</mat-option>\n <mat-option value=\"scale\">Expandir/contrair</mat-option>\n <mat-option value=\"bounce\">Salto</mat-option>\n <mat-option value=\"flip\">Giro</mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"duration-input\">\n <mat-label>Duração (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 Animar ao alterar o valor\n </mat-slide-toggle>\n \n <mat-slide-toggle formControlName=\"animateOnValidation\">\n Animar ao validar\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=\"Avançado\">\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 Propriedades personalizadas\n </mat-panel-title>\n <mat-panel-description>\n Adicione metadados extras\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>Chave da propriedade</mat-label>\n <input matInput \n formControlName=\"key\"\n placeholder=\"propriedadePersonalizada\">\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"property-value\">\n <mat-label>Valor da propriedade</mat-label>\n <input matInput \n formControlName=\"value\"\n placeholder=\"valor\">\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"property-type\">\n <mat-label>Tipo</mat-label>\n <mat-select formControlName=\"type\">\n <mat-option value=\"string\">Texto</mat-option>\n <mat-option value=\"number\">Número</mat-option>\n <mat-option value=\"boolean\">Booleano</mat-option>\n <mat-option value=\"object\">Objeto</mat-option>\n <mat-option value=\"array\">Lista</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 Adicionar propriedade\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 Metadados condicionais\n </mat-panel-title>\n <mat-panel-description>\n Aplique metadados com base em uma condição\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 Ativar metadados condicionais\n </mat-slide-toggle>\n\n <div *ngIf=\"enableConditionalMetadata\" class=\"conditional-rules\">\n <mat-form-field appearance=\"outline\" class=\"condition-input\">\n <mat-label>Expressão condicional</mat-label>\n <input matInput \n formControlName=\"conditionExpression\"\n placeholder=\"campo.valor === 'exemplo'\">\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Expressão que define quando aplicar estes metadados'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"fallback-input\">\n <mat-label>Metadados padrão</mat-label>\n <textarea matInput \n formControlName=\"fallbackMetadata\"\n rows=\"3\"\n placeholder=\"Metadados aplicados quando a condição não for atendida\">\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 Documentação e anotações\n </mat-panel-title>\n <mat-panel-description>\n Notas internas e links de apoio\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>Anotações internas</mat-label>\n <textarea matInput \n formControlName=\"internalNotes\"\n rows=\"4\"\n placeholder=\"Observações internas para a equipe\">\n </textarea>\n </mat-form-field>\n\n <div class=\"documentation-links\">\n <h5>Links de documentação</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>Título</mat-label>\n <input matInput \n [formControlName]=\"i\"\n placeholder=\"Título da documentação\">\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 Adicionar 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 Pré-visualização dos metadados\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>Nenhuma regra selecionada</h3>\n <p>Escolha uma regra no construtor ou na lista lateral para editar seus metadados.</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(--md-sys-color-surface-container);\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\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(--md-sys-color-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(--md-sys-color-on-surface);\n }\n\n .node-subtitle {\n margin: 0;\n font-size: 12px;\n color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-outline-variant);\n border-radius: 8px;\n padding: 12px;\n background: var(--md-sys-color-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(--md-sys-color-primary);\n color: var(--md-sys-color-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(--md-sys-color-surface);\n border-radius: 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\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(--md-sys-color-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(--md-sys-color-outline-variant);\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(--md-sys-color-primary-container);\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n font-size: 14px;\n font-weight: 500;\n }\n\n .preview-content {\n padding: 16px;\n background: var(--md-sys-color-surface);\n }\n\n .preview-json {\n font-family: 'Courier New', monospace;\n font-size: 12px;\n color: var(--md-sys-color-on-surface);\n margin: 0;\n white-space: pre-wrap;\n background: var(--md-sys-color-surface-container);\n padding: 12px;\n border-radius: 4px;\n border: 1px solid var(--md-sys-color-outline-variant);\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(--md-sys-color-on-surface-variant);\n margin-bottom: 16px;\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--md-sys-color-on-surface);\n font-weight: 500;\n }\n\n .empty-state p {\n margin: 0;\n color: var(--md-sys-color-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 .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\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 private lastSelectedNodeId: string | null = null;\n\n metadataForm: FormGroup;\n activeTabIndex = 0;\n hasUnsavedChanges = false;\n\n // Autocomplete data\n availableTags = ['validação', 'interface', 'negócio', 'segurança', 'desempenho', 'acessibilidade'];\n filteredTags!: Observable<string[]>;\n\n availableIcons = [\n { value: 'rule', label: 'Regra' },\n { value: 'star', label: 'Destaque' },\n { value: 'warning', label: 'Aviso' },\n { value: 'error', label: 'Erro' },\n { value: 'info', label: 'Informação' },\n { value: 'check_circle', label: 'Confirmado' },\n { value: 'cancel', label: 'Cancelar' },\n { value: 'help', label: 'Ajuda' },\n { value: 'settings', label: 'Configurações' },\n { value: 'visibility', label: 'Visibilidade' },\n { value: 'lock', label: 'Bloqueio' },\n { value: 'security', label: 'Segurança' }\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 const currentId = this.selectedNode?.id || null;\n if (currentId === this.lastSelectedNodeId) {\n return;\n }\n this.lastSelectedNodeId = currentId;\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 const normalizedPriority = this.normalizePriority(metadata.priority);\n \n this.metadataForm.patchValue({\n code: metadata.code || '',\n message: metadata.message || '',\n tag: metadata.tag || '',\n description: metadata.description || '',\n priority: normalizedPriority,\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 normalizedPriority = this.normalizePriority(formValue.priority);\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: normalizedPriority || 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 private normalizePriority(priority: string | null | undefined): string {\n const raw = (priority || '').toString();\n if (!raw) return 'medium';\n\n const base = raw.split('|')[0]?.trim().toLowerCase() || '';\n const compact = base.replace(/[\\s_-]/g, '');\n\n switch (compact) {\n case 'low':\n case 'baixa':\n return 'low';\n case 'medium':\n case 'media':\n case 'média':\n return 'medium';\n case 'high':\n case 'alta':\n case 'alto':\n return 'high';\n case 'critical':\n case 'critica':\n case 'crítica':\n case 'critico':\n case 'crítico':\n return 'critical';\n default:\n return 'medium';\n }\n }\n\n getPriorityLabel(priority: string | null | undefined): string {\n const normalized = this.normalizePriority(priority);\n const labels: Record<string, string> = {\n low: 'Baixa',\n medium: 'Média',\n high: 'Alta',\n critical: 'Crítica',\n };\n return labels[normalized] || 'Selecione';\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 || 'Regra sem nome';\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 const normalizedPriority = this.normalizePriority(formValue.priority);\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: normalizedPriority || 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, AfterViewInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\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';\n\nimport { DslParser, DslValidator, DslExporter } from '@praxisui/specification';\n\n@Component({\n selector: 'praxis-dsl-viewer',\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatToolbarModule,\n MatMenuModule,\n MatDividerModule,\n MatSnackBarModule\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"dsl-viewer-container\" [ngClass]=\"themeClass\">\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()\" [disabled]=\"!getEditorValue()\">\n <mat-icon>content_copy</mat-icon>\n <span>Copy to Clipboard</span>\n </button>\n \n <button mat-menu-item (click)=\"downloadDsl()\" [disabled]=\"!getEditorValue()\">\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 <div class=\"dsl-editor-surface\">\n <div\n #syntaxOverlay\n class=\"syntax-overlay\"\n [innerHTML]=\"highlightedDsl\"\n aria-hidden=\"true\"\n ></div>\n <textarea\n #editorTextarea\n class=\"dsl-textarea\"\n [readOnly]=\"!editable\"\n [attr.spellcheck]=\"false\"\n (input)=\"onEditorInput($event)\"\n (scroll)=\"syncScroll()\"\n (keyup)=\"updateCursorPosition()\"\n (click)=\"updateCursorPosition()\"\n ></textarea>\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 --dsl-surface: #0f172a;\n --dsl-surface-alt: #111827;\n --dsl-border: #1f2937;\n --dsl-text: #e2e8f0;\n --dsl-muted: #94a3b8;\n --dsl-token-keyword: #c084fc;\n --dsl-token-operator: #22d3ee;\n --dsl-token-string: #34d399;\n --dsl-token-number: #f472b6;\n --dsl-token-function: #60a5fa;\n --dsl-token-variable: #fbbf24;\n --dsl-token-field: #cbd5e1;\n --dsl-token-regex: #a5b4fc;\n --dsl-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);\n }\n\n .dsl-viewer-container.dsl-theme-light {\n --dsl-surface: #f8fafc;\n --dsl-surface-alt: #f1f5f9;\n --dsl-border: #e2e8f0;\n --dsl-text: #0f172a;\n --dsl-muted: #475569;\n --dsl-token-keyword: #7c3aed;\n --dsl-token-operator: #0ea5e9;\n --dsl-token-string: #059669;\n --dsl-token-number: #db2777;\n --dsl-token-function: #2563eb;\n --dsl-token-variable: #d97706;\n --dsl-token-field: #0f172a;\n --dsl-token-regex: #4338ca;\n --dsl-shadow: 0 6px 18px rgba(15, 23, 42, 0.15);\n }\n\n .dsl-viewer-container.dsl-theme-contrast {\n --dsl-surface: #0b0b0b;\n --dsl-surface-alt: #111;\n --dsl-border: #3f3f46;\n --dsl-text: #f8fafc;\n --dsl-muted: #e5e7eb;\n --dsl-token-keyword: #ffb7ff;\n --dsl-token-operator: #79e0ff;\n --dsl-token-string: #9af0b2;\n --dsl-token-number: #ff8abf;\n --dsl-token-function: #9fc5ff;\n --dsl-token-variable: #ffd166;\n --dsl-token-field: #ffffff;\n --dsl-token-regex: #b2b5ff;\n --dsl-shadow: 0 10px 28px rgba(0, 0, 0, 0.6);\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 .toolbar-actions .mat-mdc-icon-button {\n color: var(--md-sys-color-on-primary);\n }\n\n .toolbar-actions .mat-mdc-icon-button:hover {\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n\n .toolbar-actions .mat-mdc-icon-button:disabled {\n color: var(--md-sys-color-on-surface);\n opacity: 0.38;\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(--md-sys-color-tertiary-container);\n color: var(--md-sys-color-on-tertiary-container);\n }\n\n .validation-status.invalid {\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n }\n\n .validation-status.warning {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-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 .dsl-editor-surface {\n position: relative;\n height: 100%;\n border-radius: 8px;\n background: var(--dsl-surface);\n border: 1px solid var(--dsl-border);\n overflow: hidden;\n font-family: 'Courier New', monospace;\n box-shadow: var(--dsl-shadow);\n }\n\n .syntax-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n white-space: pre-wrap;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.4;\n padding: 16px;\n color: var(--dsl-text);\n background: transparent;\n overflow: auto;\n z-index: 1;\n }\n\n .syntax-keyword { color: var(--dsl-token-keyword); }\n .syntax-operator { color: var(--dsl-token-operator); }\n .syntax-string { color: var(--dsl-token-string); }\n .syntax-number { color: var(--dsl-token-number); }\n .syntax-function { color: var(--dsl-token-function); }\n .syntax-variable { color: var(--dsl-token-variable); }\n .syntax-field { color: var(--dsl-token-field); }\n\n .dsl-textarea {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n border: none;\n resize: none;\n outline: none;\n padding: 16px;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.4;\n background: transparent;\n color: transparent;\n caret-color: var(--md-sys-color-on-surface);\n tab-size: 2;\n overflow: auto;\n z-index: 2;\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(--md-sys-color-surface-container);\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n color: var(--md-sys-color-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(--dsl-surface-alt);\n border-top: 1px solid var(--dsl-border);\n font-size: 12px;\n color: var(--dsl-muted);\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(--md-sys-color-primary);\n font-weight: bold;\n font-size: 16px;\n }\n\n .error-panel {\n background: var(--dsl-surface);\n border-top: 1px solid var(--dsl-border);\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(--dsl-surface-alt);\n border-bottom: 1px solid var(--dsl-border);\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(--md-sys-color-surface-container);\n }\n\n .error-item.severity-error {\n border-left: 3px solid var(--md-sys-color-error);\n }\n\n .error-item.severity-warning {\n border-left: 3px solid var(--md-sys-color-secondary);\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(--md-sys-color-error);\n }\n\n .error-item.severity-warning mat-icon {\n color: var(--md-sys-color-secondary);\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(--md-sys-color-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, AfterViewInit {\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('editorTextarea', { static: false }) editorTextarea?: ElementRef<HTMLTextAreaElement>;\n @ViewChild('syntaxOverlay', { static: false }) syntaxOverlay?: ElementRef<HTMLDivElement>;\n\n private originalDsl: string = '';\n private parser = new DslParser();\n private validator = new DslValidator();\n\n // Component state\n hasChanges = false;\n showErrors = false;\n syntaxErrors: any[] = [];\n warnings: any[] = [];\n cursorPosition: {line: number; column: number} | null = null;\n currentDsl = '';\n\n // Editor settings\n showLineNumbers = true;\n wordWrap = false;\n showMinimap = true;\n highlightedDsl = '';\n\n constructor(private snackBar: MatSnackBar) {}\n\n ngOnInit(): void {\n this.originalDsl = this.dsl || '';\n this.currentDsl = this.originalDsl;\n this.updateSyntaxHighlighting(this.currentDsl);\n }\n\n ngAfterViewInit(): void {\n this.setEditorValue(this.currentDsl);\n this.updateEditorOptions();\n this.validateSyntax();\n this.updateCursorPosition();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['dsl'] && !this.hasChanges) {\n this.originalDsl = this.dsl || '';\n this.currentDsl = this.originalDsl;\n this.setEditorValue(this.currentDsl);\n this.validateSyntax();\n this.updateSyntaxHighlighting(this.currentDsl);\n }\n \n if (changes['editable']) {\n this.updateEditorOptions();\n }\n }\n\n ngOnDestroy(): void {}\n\n get themeClass(): string {\n const normalized = (this.theme || '').toLowerCase();\n if (normalized === 'light') return 'dsl-theme-light';\n if (normalized === 'contrast' || normalized === 'high-contrast') {\n return 'dsl-theme-contrast';\n }\n return 'dsl-theme-dark';\n }\n\n private setEditorValue(value: string): void {\n this.currentDsl = value || '';\n if (this.editorTextarea?.nativeElement) {\n this.editorTextarea.nativeElement.value = this.currentDsl;\n this.syncScroll();\n }\n this.updateSyntaxHighlighting(this.currentDsl);\n this.hasChanges = false;\n }\n\n getEditorValue(): string {\n return this.editorTextarea?.nativeElement.value ?? this.currentDsl ?? '';\n }\n\n onEditorInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n this.currentDsl = target.value;\n this.hasChanges = this.currentDsl !== this.originalDsl;\n this.updateSyntaxHighlighting(this.currentDsl);\n this.validateSyntaxDebounced();\n this.updateCursorPosition();\n }\n\n private updateEditorOptions(): void {\n if (!this.editorTextarea?.nativeElement) return;\n this.editorTextarea.nativeElement.readOnly = !this.editable;\n this.editorTextarea.nativeElement.style.whiteSpace = this.wordWrap ? 'pre-wrap' : 'pre';\n }\n\n syncScroll(): void {\n if (!this.syntaxOverlay?.nativeElement || !this.editorTextarea?.nativeElement) return;\n this.syntaxOverlay.nativeElement.scrollTop = this.editorTextarea.nativeElement.scrollTop;\n this.syntaxOverlay.nativeElement.scrollLeft = this.editorTextarea.nativeElement.scrollLeft;\n }\n\n updateCursorPosition(): void {\n if (!this.editorTextarea?.nativeElement) return;\n const textarea = this.editorTextarea.nativeElement;\n const caretIndex = textarea.selectionStart || 0;\n const textUntilCaret = textarea.value.slice(0, caretIndex);\n const lines = textUntilCaret.split('\\n');\n const line = lines.length;\n const column = (lines.pop()?.length || 0) + 1;\n this.cursorPosition = { line, column };\n }\n\n private validateSyntaxDebounced = this.debounce(() => {\n this.validateSyntax();\n }, 300);\n\n private debounce(func: Function, wait: number): Function {\n let timeout: any;\n return (...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 value = this.getEditorValue();\n const lines = value ? value.split('\\n').length : 0;\n const chars = value ? value.length : 0;\n return `${lines} lines, ${chars} characters`;\n }\n\n // Action methods\n formatCode(): void {\n if (!this.editable) return;\n \n try {\n const currentValue = this.getEditorValue();\n const formatted = this.formatDslCode(currentValue);\n this.setEditorValue(formatted);\n this.hasChanges = formatted !== this.originalDsl;\n this.validateSyntax();\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 const currentValue = this.getEditorValue();\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) return;\n \n const currentValue = this.getEditorValue();\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) return;\n \n this.setEditorValue(this.originalDsl);\n this.hasChanges = false;\n this.snackBar.open('Changes discarded', 'Close', { duration: 2000 });\n }\n\n copyToClipboard(): void {\n const content = this.getEditorValue();\n if (!content) return;\n\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 const value = this.getEditorValue();\n if (!value) return;\n \n const blob = new Blob([value], { 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.editorTextarea?.nativeElement) return;\n const textarea = this.editorTextarea.nativeElement;\n const lines = textarea.value.split('\\n');\n const targetLine = Math.min(error.line ?? 1, lines.length);\n const targetColumn = Math.max((error.column ?? 1) - 1, 0);\n\n let index = 0;\n for (let i = 0; i < targetLine - 1; i++) {\n index += lines[i].length + 1; // +1 for newline\n }\n index += targetColumn;\n\n textarea.focus();\n textarea.setSelectionRange(index, index);\n this.updateCursorPosition();\n }\n\n // DSL-specific methods\n private formatDslCode(code: string): string {\n const trimmed = (code || '').trim();\n if (!trimmed) return '';\n\n const spec = this.parser.parse(trimmed);\n const exporter = new DslExporter({\n prettyPrint: true,\n indentSize: 2,\n maxLineLength: 80,\n useParentheses: 'auto'\n });\n\n return exporter.export(spec);\n }\n\n private validateDslSyntax(code: string): {errors: any[]; warnings: any[]} {\n if (!code.trim()) {\n return { errors: [], warnings: [] };\n }\n\n let issues: any[] = [];\n try {\n issues = this.validator.validate(code);\n } catch (err: any) {\n issues = [{\n severity: 'error',\n message: err?.message || 'Erro ao validar DSL'\n }];\n }\n\n const errors = issues.filter((issue: any) => {\n const severity = String(issue.severity || '').toLowerCase();\n return severity === 'error';\n });\n const warnings = issues.filter((issue: any) => {\n const severity = String(issue.severity || '').toLowerCase();\n return severity && severity !== 'error';\n });\n\n try {\n this.parser.parse(code);\n } catch (err: any) {\n errors.push({\n line: 1,\n column: 1,\n message: err?.message || 'Erro ao interpretar DSL',\n severity: 'error'\n });\n }\n\n return { errors, warnings };\n }\n\n private updateSyntaxHighlighting(expression: string): void {\n if (!expression) {\n this.highlightedDsl = '';\n return;\n }\n\n const escaped = expression\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n\n // Single-pass token highlighting to avoid re-processing injected span tags\n const tokenRegex =\n /\\$\\{[^}]+\\}|\"(?:[^\"\\\\]|\\\\.)*\"|&amp;&amp;|\\|\\||!~|~|==|!=|&lt;=|&gt;=|<=|>=|&lt;|&gt;|!|\\b\\d+\\.?\\d*\\b|\\b[a-zA-Z_][a-zA-Z0-9_]*\\b/g;\n\n const highlighted = escaped.replace(\n tokenRegex,\n (token: string, offset: number, full: string) => {\n if (/^\"(?:[^\"\\\\]|\\\\.)*\"$/.test(token)) {\n return `<span class=\"syntax-string\">${token}</span>`;\n }\n\n if (/^\\$\\{[^}]+\\}$/.test(token)) {\n return `<span class=\"syntax-variable\">${token}</span>`;\n }\n\n if (/^(and|or|not|xor|implies|true|false|null)$/i.test(token)) {\n return `<span class=\"syntax-keyword\">${token}</span>`;\n }\n\n if (/^(?:&amp;&amp;|\\|\\||!~|~|==|!=|&lt;=|&gt;=|<=|>=|&lt;|&gt;|!)$/.test(token)) {\n return `<span class=\"syntax-operator\">${token}</span>`;\n }\n\n if (/^\\d/.test(token)) {\n return `<span class=\"syntax-number\">${token}</span>`;\n }\n\n if (/^\\s*\\(/.test(full.slice(offset + token.length))) {\n return `<span class=\"syntax-function\">${token}</span>`;\n }\n\n return `<span class=\"syntax-field\">${token}</span>`;\n },\n );\n\n this.highlightedDsl = highlighted;\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.has-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-panel\">\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 min-width: 0;\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 .toolbar-actions .mat-mdc-icon-button {\n color: var(--md-sys-color-on-primary);\n }\n\n .toolbar-actions .mat-mdc-icon-button:hover {\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n\n .toolbar-actions .mat-mdc-icon-button:disabled {\n color: var(--md-sys-color-on-surface);\n opacity: 0.38;\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(--md-sys-color-tertiary-container);\n color: var(--md-sys-color-on-tertiary-container);\n }\n\n .validation-status.invalid {\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-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 min-width: 0;\n }\n\n .json-editor {\n position: relative;\n height: 100%;\n display: flex;\n min-width: 0;\n width: 100%;\n }\n\n .json-textarea {\n flex: 1;\n width: 100%;\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(--md-sys-color-surface, #f5f7fb);\n color: var(--md-sys-color-on-surface, #0f172a);\n caret-color: var(--md-sys-color-on-surface, #0f172a);\n white-space: pre;\n overflow-wrap: normal;\n overflow: auto;\n box-sizing: border-box;\n }\n\n .json-textarea.has-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(--md-sys-color-surface-container, #e7edf7);\n color: var(--md-sys-color-on-surface, #0f172a);\n }\n\n .line-numbers-panel {\n position: absolute;\n left: 0;\n top: 0;\n width: 50px;\n height: 100%;\n background: var(--md-sys-color-surface-container);\n border-right: 1px solid var(--md-sys-color-outline-variant);\n padding: 16px 8px;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n color: var(--md-sys-color-on-surface-variant);\n text-align: right;\n overflow: hidden;\n user-select: none;\n }\n\n .line-numbers-panel .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(--md-sys-color-surface-container);\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n color: var(--md-sys-color-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(--md-sys-color-surface-container);\n border-top: 1px solid var(--md-sys-color-outline-variant);\n font-size: 12px;\n color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-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.syncWordWrapWithMode();\n this.updateJsonContent();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['json']) {\n this.updateJsonContent();\n }\n\n if (changes['editable']) {\n this.syncWordWrapWithMode();\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 private syncWordWrapWithMode(): void {\n // In read-only mode, enable wrap by default to avoid horizontal scrolling on long lines.\n if (!this.editable) {\n this.wordWrap = true;\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';\nimport { RuleNodeRegistryService } from '../services/rule-node-registry.service';\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 vb-surface-card\">\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 vb-surface-card\">\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(--md-sys-color-primary);\n }\n\n .test-description {\n margin: 0 0 12px 0;\n color: var(--md-sys-color-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(--md-sys-color-primary-container);\n color: var(--md-sys-color-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(--md-sys-color-on-surface-variant);\n }\n\n .no-rule-message {\n color: var(--md-sys-color-error);\n font-style: italic;\n font-size: 13px;\n }\n\n .test-cases-list {\n margin-top: 12px;\n border: 1px solid var(--md-sys-color-outline-variant);\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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-surface-container);\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(--md-sys-color-tertiary);\n }\n\n .result-status.failure {\n color: var(--md-sys-color-error);\n }\n\n .result-timing {\n font-family: monospace;\n font-size: 14px;\n color: var(--md-sys-color-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(--md-sys-color-outline-variant);\n }\n\n .stage-item.stage-success {\n border-left-color: var(--md-sys-color-tertiary);\n background: var(--md-sys-color-tertiary-container);\n }\n\n .stage-item.stage-error {\n border-left-color: var(--md-sys-color-error);\n background: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-tertiary-container);\n color: var(--md-sys-color-on-tertiary-container);\n }\n\n .integrity-check.check-failed {\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-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(--md-sys-color-error);\n }\n\n .warning-title { color: var(--md-sys-color-secondary); }\n\n .issue-item {\n padding: 12px;\n border-radius: 4px;\n margin-bottom: 8px;\n }\n\n .error-item {\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n border-left: 4px solid var(--md-sys-color-error);\n }\n\n .warning-item { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); border-left: 4px solid var(--md-sys-color-secondary); }\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(--md-sys-color-surface-container);\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(--md-sys-color-surface);\n }\n\n .stat-item.passed {\n border-left: 4px solid var(--md-sys-color-tertiary);\n }\n\n .stat-item.failed {\n border-left: 4px solid var(--md-sys-color-error);\n }\n\n .stat-label {\n display: block;\n font-size: 12px;\n color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-tertiary);\n }\n\n .rate-value.good { color: var(--md-sys-color-secondary); }\n\n .rate-value.poor {\n color: var(--md-sys-color-error);\n }\n\n .test-result-panel {\n margin-bottom: 8px;\n }\n\n .success-icon {\n color: var(--md-sys-color-tertiary);\n }\n\n .error-icon {\n color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-tertiary);\n }\n\n .summary-item.failure {\n color: var(--md-sys-color-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 private nodeRegistry: RuleNodeRegistryService,\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 // Ensure registry is populated for ID-based children\n this.nodeRegistry.clear();\n this.nodeRegistry.registerAll(Object.values(state.nodes));\n\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.nodeRegistry.clear();\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,\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 {\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 host: {\n class: 'dsl-linter-host praxis-visual-builder',\n },\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 Linter de DSL\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=\"Erros\"\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=\"Alertas\"\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=\"Informações e dicas\"\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=\"Executar análise\"\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=\"Habilitar/desabilitar análise automática\"\n >\n <mat-icon>auto_fix_high</mat-icon>\n </button>\n\n <button\n mat-icon-button\n (click)=\"openLinterSettings()\"\n matTooltip=\"Configurações do linter\"\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=\"Problemas\">\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>Filtrar por severidade</mat-label>\n <mat-select\n [value]=\"selectedSeverities\"\n (selectionChange)=\"onSeverityFilterChange($event)\"\n panelClass=\"dsl-linter-select-panel\"\n multiple\n >\n <mat-option value=\"error\">\n <mat-icon class=\"severity-icon error\">error</mat-icon>\n Erros\n </mat-option>\n <mat-option value=\"warning\">\n <mat-icon class=\"severity-icon warning\">warning</mat-icon>\n Alertas\n </mat-option>\n <mat-option value=\"info\">\n <mat-icon class=\"severity-icon info\">info</mat-icon>\n Informações\n </mat-option>\n <mat-option value=\"hint\">\n <mat-icon class=\"severity-icon hint\">lightbulb</mat-icon>\n Dicas\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"filter-field\">\n <mat-label>Filtrar por categoria</mat-label>\n <mat-select\n [value]=\"selectedCategories\"\n (selectionChange)=\"onCategoryFilterChange($event)\"\n panelClass=\"dsl-linter-select-panel\"\n multiple\n >\n <mat-option value=\"syntax\">Sintaxe</mat-option>\n <mat-option value=\"semantic\">Semântica</mat-option>\n <mat-option value=\"style\">Estilo</mat-option>\n <mat-option value=\"performance\">Desempenho</mat-option>\n <mat-option value=\"best-practice\">Boas práticas</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 translateCategory(error.category)\n }}</mat-chip>\n <span class=\"location\"\n >Linha {{ 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>Código:</strong> {{ error.code }}\n </div>\n <div class=\"info-row\">\n <strong>Local:</strong> Linha {{ error.line }}, Coluna\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>Sugestão:</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 Ir para o local\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>Nenhum problema encontrado</h3>\n <p *ngIf=\"allErrors.length === 0\">\n Sua DSL está limpa! Nenhum problema detectado.\n </p>\n <p *ngIf=\"allErrors.length > 0\">\n Todos os problemas estão filtrados. Ajuste os filtros para ver\n itens ocultos.\n </p>\n </div>\n </div>\n </mat-tab>\n\n <!-- Analytics Tab -->\n <mat-tab label=\"Métricas\">\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>Qualidade do código</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <div class=\"metric-item\">\n <span class=\"metric-label\">Pontuação de complexidade:</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\">Manutenibilidade:</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\">Última análise:</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\">Duração:</span>\n <span class=\"metric-value\">{{ stats.lintDuration }}ms</span>\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>Distribuição de problemas</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>Problemas mais comuns</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 }} ocorrências\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=\"Regras\">\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 {{ translateCategory(category.name) }} ({{ category.rules.length }})\n </mat-panel-title>\n <mat-panel-description>\n {{ category.enabledCount }}/{{\n category.rules.length\n }}\n ativos\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 {{ translateSeverity(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 Configurar\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 --mat-select-enabled-trigger-text-color: var(--md-sys-color-on-surface);\n --mat-form-field-select-option-text-color: var(--md-sys-color-on-surface);\n --mat-select-panel-background-color: var(--md-sys-color-surface);\n --mat-option-label-text-color: var(--md-sys-color-on-surface);\n --mat-option-selected-state-label-text-color: var(--md-sys-color-primary);\n --mat-option-focus-state-label-text-color: var(--md-sys-color-on-surface);\n }\n\n .linter-toolbar {\n background: var(--md-sys-color-surface-container);\n color: var(--md-sys-color-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(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n }\n\n .warning-chip {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n\n .info-chip {\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n\n .success-chip {\n background: var(--md-sys-color-tertiary-container);\n color: var(--md-sys-color-on-tertiary-container);\n }\n\n .neutral-chip {\n background: var(--md-sys-color-surface-container);\n color: var(--md-sys-color-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(--md-sys-color-error);\n }\n\n .severity-icon.warning {\n color: var(--md-sys-color-secondary);\n }\n\n .severity-icon.info {\n color: var(--md-sys-color-primary);\n }\n\n .severity-icon.hint {\n color: var(--md-sys-color-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(--md-sys-color-error);\n }\n\n .issue-panel.severity-warning {\n border-left-color: var(--md-sys-color-secondary);\n }\n\n .issue-panel.severity-info {\n border-left-color: var(--md-sys-color-primary);\n }\n\n .issue-panel.severity-hint {\n border-left-color: var(--md-sys-color-primary);\n }\n\n .error-message {\n font-weight: 500;\n margin-left: 8px;\n }\n\n .category-chip {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-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(--md-sys-color-outline-variant);\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(--md-sys-color-surface-container);\n color: var(--md-sys-color-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(--md-sys-color-on-surface-variant);\n }\n\n .no-issues-icon {\n font-size: 64px;\n width: 64px;\n height: 64px;\n color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-tertiary);\n }\n\n .metric-value.good {\n color: var(--md-sys-color-primary);\n }\n\n .metric-value.fair {\n color: var(--md-sys-color-secondary);\n }\n\n .metric-value.poor {\n color: var(--md-sys-color-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(--md-sys-color-on-surface-variant);\n }\n\n .bar-container {\n position: relative;\n height: 24px;\n background: var(--md-sys-color-surface-container);\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(--md-sys-color-error);\n }\n\n .bar-fill.bar-warning {\n background: var(--md-sys-color-secondary);\n }\n\n .bar-fill.bar-info {\n background: var(--md-sys-color-primary);\n }\n\n .bar-fill.bar-hint {\n background: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-surface-container);\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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n }\n\n .severity-chip.warning {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n\n .severity-chip.info {\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n\n .severity-chip.hint {\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-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: 'Ponto e vírgula ausente',\n description: 'Instruções devem terminar com ponto e vírgula',\n category: 'syntax',\n severity: 'error',\n enabled: true,\n configurable: false,\n },\n {\n id: 'syntax-002',\n name: 'Parênteses sem par',\n description: 'Parênteses de abertura precisam do fechamento correspondente',\n category: 'syntax',\n severity: 'error',\n enabled: true,\n configurable: false,\n },\n {\n id: 'syntax-003',\n name: 'Referência de campo inválida',\n description: 'Referências de campo devem ser válidas e formatadas corretamente',\n category: 'syntax',\n severity: 'error',\n enabled: true,\n configurable: false,\n },\n\n // Semantic Rules\n {\n id: 'semantic-001',\n name: 'Campo não definido',\n description: 'Campos referenciados devem estar presentes no schema',\n category: 'semantic',\n severity: 'error',\n enabled: true,\n configurable: false,\n },\n {\n id: 'semantic-002',\n name: 'Tipo incompatível',\n description: 'Operações devem ser compatíveis com os tipos dos campos',\n category: 'semantic',\n severity: 'warning',\n enabled: true,\n configurable: true,\n },\n {\n id: 'semantic-003',\n name: 'Código inalcançável',\n description: 'Trecho que nunca será executado',\n category: 'semantic',\n severity: 'warning',\n enabled: true,\n configurable: false,\n },\n\n // Style Rules\n {\n id: 'style-001',\n name: 'Indentação inconsistente',\n description: 'Use a mesma indentação em toda a DSL',\n category: 'style',\n severity: 'info',\n enabled: true,\n configurable: true,\n },\n {\n id: 'style-002',\n name: 'Linha muito longa',\n description: 'As linhas não devem exceder o comprimento máximo',\n category: 'style',\n severity: 'info',\n enabled: false,\n configurable: true,\n config: { maxLength: 120 },\n },\n {\n id: 'style-003',\n name: 'Espaço em branco no fim',\n description: 'Remova espaços em branco ao final das linhas',\n category: 'style',\n severity: 'hint',\n enabled: true,\n configurable: false,\n },\n\n // Performance Rules\n {\n id: 'performance-001',\n name: 'Expressão complexa',\n description: 'A complexidade da expressão ultrapassa o recomendado',\n category: 'performance',\n severity: 'warning',\n enabled: true,\n configurable: true,\n config: { maxComplexity: 10 },\n },\n {\n id: 'performance-002',\n name: 'Condição redundante',\n description: 'Condição pode ser simplificada ou está redundante',\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: 'Número mágico',\n description: 'Prefira constantes nomeadas em vez de números soltos',\n category: 'best-practice',\n severity: 'hint',\n enabled: true,\n configurable: true,\n },\n {\n id: 'best-practice-002',\n name: 'Aninhamento profundo',\n description: 'Evite aninhamento profundo para melhorar a legibilidade',\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: 'Documentação ausente',\n description: 'Regras complexas devem incluir comentários de documentação',\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('Falha ao executar o linter:', 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: 'Parênteses sem fechamento na expressão',\n category: 'syntax',\n suggestion:\n 'Garanta que todo parêntese de abertura tenha o fechamento correspondente',\n quickFix: {\n title: 'Adicionar parêntese faltante',\n description: 'Adiciona automaticamente o parêntese de fechamento',\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: 'Sintaxe de referência de campo inválida',\n category: 'syntax',\n suggestion:\n 'Referências de campo devem conter nomes válidos sem espaços',\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: `Campo não definido: ${fieldName}`,\n category: 'semantic',\n suggestion:\n 'Garanta que o campo esteja definido no schema ou corrija o nome',\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: 'Espaço em branco no fim da linha',\n category: 'style',\n suggestion: 'Remova o espaço em branco ao final',\n quickFix: {\n title: 'Remover espaço em branco final',\n description: 'Remove automaticamente espaços e tabs ao final da linha',\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: `Linha excede o comprimento máximo de ${maxLength} caracteres`,\n category: 'style',\n suggestion: 'Quebre linhas longas para melhorar a legibilidade',\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: `Complexidade da expressão (${operators}) excede o limite (${maxComplexity})`,\n category: 'performance',\n suggestion:\n 'Considere dividir expressões complexas em partes menores e mais legíveis',\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: `Prefira usar uma constante nomeada em vez do número: ${number}`,\n category: 'best-practice',\n suggestion: 'Defina constantes com nomes claros para valores numéricos',\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 translateSeverity(severity: string): string {\n const labels: Record<string, string> = {\n error: 'Erro',\n warning: 'Alerta',\n info: 'Informação',\n hint: 'Dica',\n };\n return labels[severity] || severity;\n }\n\n translateCategory(category: string): string {\n const labels: Record<string, string> = {\n syntax: 'Sintaxe',\n semantic: 'Semântica',\n style: 'Estilo',\n performance: 'Desempenho',\n 'best-practice': 'Boas práticas',\n };\n return labels[category] || category;\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: 'Erros', severity: 'error', count: this.stats.totalErrors },\n {\n name: 'Alertas',\n severity: 'warning',\n count: this.stats.totalWarnings,\n },\n { name: 'Informações', severity: 'info', count: this.stats.totalInfos },\n { name: 'Dicas', 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 = rule.category;\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 void rule;\n }\n\n openLinterSettings(): void {\n // Placeholder until settings UI is implemented.\n }\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Tags help organize and find templates. Press Enter to add.'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Field names that must exist for the template to work correctly'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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 <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"'Semantic version (major.minor.patch)'\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\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(--md-sys-color-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(--md-sys-color-on-surface-variant);\n }\n\n .rules-preview {\n background: var(--md-sys-color-surface-container);\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(--md-sys-color-on-surface);\n }\n\n .node-count {\n font-weight: 400;\n color: var(--md-sys-color-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(--md-sys-color-primary);\n background: var(--md-sys-color-primary-container);\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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-outline-variant);\n }\n\n .dialog-actions {\n padding: var(--pdx-dialog-actions-padding, 12px 24px 16px);\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 .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\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}\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 || 'desconhecida')\n \"\n >\n {{ data.template.metadata?.complexity || 'desconhecida' }}\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>Descrição do template</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>Dados do template</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\">Versão:</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\">Quantidade de uso:</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\">Criado em:</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\">Atualizado em:</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\">Autor:</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\">Nós:</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>Estrutura das regras</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 'Nó sem nome'\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>Campos obrigatórios no formulário</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 Esses campos precisam existir no esquema do formulário para o template\n funcionar corretamente.\n </p>\n </div>\n\n <!-- Example Usage -->\n <div class=\"example-usage\" *ngIf=\"data.template.example\">\n <mat-divider></mat-divider>\n <h3>Exemplo de uso</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()\">Fechar</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 Exportar\n </button>\n\n <button mat-flat-button color=\"primary\" (click)=\"applyTemplate()\">\n <mat-icon [praxisIcon]=\"'play_arrow'\"></mat-icon>\n Aplicar 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(--md-sys-color-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(--md-sys-color-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 { background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); }\n\n .complexity-medium { background: var(--md-sys-color-secondary-container); color: var(--md-sys-color-on-secondary-container); }\n\n .complexity-complex { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); }\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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-primary);\n }\n\n .metadata-item .label {\n font-weight: 500;\n color: var(--md-sys-color-on-surface);\n }\n\n .metadata-item .value {\n color: var(--md-sys-color-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(--md-sys-color-outline);\n background: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-surface);\n border-radius: 4px;\n border: 1px solid var(--md-sys-color-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(--md-sys-color-on-surface-variant);\n font-style: italic;\n }\n\n .example-content {\n background: var(--md-sys-color-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: var(--pdx-dialog-actions-padding, 12px 24px 16px);\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 'Regra de validação de campo';\n case 'andGroup':\n return 'Todas as condições precisam ser verdadeiras';\n case 'orGroup':\n return 'Pelo menos uma condição precisa ser verdadeira';\n case 'notGroup':\n return 'A condição precisa ser falsa';\n case 'requiredIf':\n return 'Campo obrigatório quando a condição for atendida';\n case 'visibleIf':\n return 'Campo visível quando a condição for atendida';\n case 'disabledIf':\n return 'Campo desabilitado quando a condição for atendida';\n case 'readonlyIf':\n return 'Campo somente leitura quando a condição for atendida';\n case 'forEach':\n return 'Aplica a validação em cada item da lista';\n case 'uniqueBy':\n return 'Garante itens únicos pelos campos indicados';\n case 'minLength':\n return 'A lista precisa ter quantidade mínima de itens';\n case 'maxLength':\n return 'A lista não pode ultrapassar o máximo de itens';\n default:\n return node.label || 'Regra personalizada';\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 'Configuração inválida';\n }\n }\n\n formatDate(date?: Date | string): string {\n if (!date) {\n return 'Desconhecido';\n }\n\n try {\n return new Intl.DateTimeFormat('pt-BR', {\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 'Data inválida';\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 { --vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,0.08)); --vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,0.18)); --vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,0.32)); }\n .template-gallery {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--md-sys-color-background);\n }\n\n .gallery-header {\n background: var(--md-sys-color-surface);\n border-bottom: 1px solid var(--md-sys-color-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(--md-sys-color-on-surface);\n }\n\n .gallery-subtitle {\n margin: 4px 0 0 32px;\n color: var(--md-sys-color-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(--md-sys-color-outline);\n }\n\n .stat-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--md-sys-color-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(--md-sys-color-surface-variant);\n border-bottom: 1px solid var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-outline);\n }\n\n .filters-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--md-sys-color-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(--md-sys-color-on-surface);\n }\n\n .template-count {\n font-size: 14px;\n font-weight: 400;\n color: var(--md-sys-color-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(--md-sys-color-primary-container);\n color: var(--md-sys-color-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(--md-sys-color-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 { background: var(--md-sys-color-surface-variant); color: var(--md-sys-color-on-surface-variant); }\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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-surface-variant);\n color: var(--md-sys-color-on-surface-variant);\n }\n\n .complexity-simple {\n background: var(--md-sys-color-tertiary-container);\n color: var(--md-sys-color-on-tertiary-container);\n }\n\n .complexity-medium {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n\n .complexity-complex {\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n }\n\n .usage-count {\n font-size: 11px;\n color: var(--md-sys-color-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(--md-sys-color-outline);\n border-radius: 4px;\n background: var(--md-sys-color-surface);\n }\n\n .compact-content {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .compact-icon {\n color: var(--md-sys-color-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(--md-sys-color-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(--md-sys-color-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(--md-sys-color-outline);\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--md-sys-color-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 { 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';\nexport * from './lib/components/rule-list.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.RuleNodeRegistryService","i1.FieldConditionConverter","i2.BooleanGroupConverter","i3.CardinalityConverter","i2.ConverterFactoryService","i1.SpecificationBridgeService","i2.RuleNodeRegistryService","uuidv4","i2.RoundTripValidatorService","i3.RuleNodeRegistryService","i1.RuleBuilderService","i2.SpecificationBridgeService","i2","i3.ExportIntegrationService","i5","i9","i10","i11","i14","i15","i16","i18","i1","i4","i8","i3","i6","i7","i12","i13","ValidationSeverity","takeUntil","i2.DslVisualImportService","i2.FieldSchemaService","i2.ExportIntegrationService","i1.ConverterFactoryService","i3.ContextManagementService","i1.RoundTripValidatorService","i2.RuleBuilderService","i4.RuleNodeRegistryService","debounceTime","distinctUntilChanged","i3.RuleTemplateService","i4.SpecificationBridgeService","i1.RuleTemplateService"],"mappings":"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"}