evaluateFieldDependencies static method

FieldDependencyResult evaluateFieldDependencies({
  1. required FormFieldModel field,
  2. required Map<String, dynamic> formData,
  3. required List<NestedContext> contexts,
})

Implementation

static FieldDependencyResult evaluateFieldDependencies({
  required FormFieldModel field,
  required Map<String, dynamic> formData,
  required List<NestedContext> contexts,
}) {
  final resultMap = <FieldDependencyRuleType, bool>{
    FieldDependencyRuleType.visibleIf: true,
    FieldDependencyRuleType.disabledIf: false,
  };

  // If field has no dependencies, return defaults
  if (field.dependencies == null || field.dependencies!.isEmpty) {
    return FieldDependencyResult(result: resultMap);
  }

  // Handle visibleIf dependencies
  final visibleIfDependencies = field.dependencies!
      .whereType<FieldDependencyRule>()
      .where((dep) => dep.type == FieldDependencyRuleType.visibleIf)
      .toList();

  if (visibleIfDependencies.isNotEmpty) {
    // All visibleIf dependencies must be satisfied for field to be visible
    var allVisibleIfConditionsMet = true;

    for (final dependency in visibleIfDependencies) {
      final resolvedFieldPath = _resolveTemplatedFieldPath(
        dependency.field,
        contexts,
      );

      final dependencyValue = getNestedFormValue(formData, resolvedFieldPath);

      final conditionMet = _evaluateCondition(
        dependencyValue,
        dependency.operator,
        dependency.compareValue,
      );

      if (!conditionMet) {
        allVisibleIfConditionsMet = false;
        break; // If any dependency fails, field is not visible
      }
    }

    resultMap[FieldDependencyRuleType.visibleIf] = allVisibleIfConditionsMet;
  }

  // Handle disabledIf dependencies
  final disabledIfDependencies = field.dependencies!
      .whereType<FieldDependencyRule>()
      .where((dep) => dep.type == FieldDependencyRuleType.disabledIf)
      .toList();

  if (disabledIfDependencies.isNotEmpty) {
    // If ANY disabledIf dependency is met, the field should be disabled
    var anyDisabledIfConditionMet = false;

    for (final dependency in disabledIfDependencies) {
      final resolvedFieldPath = _resolveTemplatedFieldPath(
        dependency.field,
        contexts,
      );

      final dependencyValue = getNestedFormValue(formData, resolvedFieldPath);

      final conditionMet = _evaluateCondition(
        dependencyValue,
        dependency.operator,
        dependency.compareValue,
      );

      if (conditionMet) {
        anyDisabledIfConditionMet = true;
        break; // If any dependency is met, field should be disabled
      }
    }

    resultMap[FieldDependencyRuleType.disabledIf] = anyDisabledIfConditionMet;
  }

  return FieldDependencyResult(result: resultMap);
}