evaluateCondition function
Evaluates an element's page and data visibility rules.
Supported data expressions are path == value, path != value, a plain
path (present and non-empty), empty(path), and notEmpty(path).
Implementation
bool evaluateCondition(String expression, Map<String, dynamic> data) {
final expr = expression.trim();
if (expr.isEmpty) return true;
bool empty(dynamic value) =>
value == null ||
(value is String && value.trim().isEmpty) ||
(value is Iterable && value.isEmpty) ||
(value is Map && value.isEmpty);
final function = RegExp(
r'^(empty|notEmpty)\s*\(\s*([\w.]+)\s*\)$',
).firstMatch(expr);
if (function != null) {
final isEmpty = empty(resolvePath(function.group(2)!, data));
return function.group(1) == 'empty' ? isEmpty : !isEmpty;
}
final comparison = RegExp(
r'^([\w.]+)\s*(==|!=)\s*(.+)$',
).firstMatch(expr);
if (comparison != null) {
final actual = resolvePath(comparison.group(1)!, data);
var expected = comparison.group(3)!.trim();
if ((expected.startsWith('"') && expected.endsWith('"')) ||
(expected.startsWith("'") && expected.endsWith("'"))) {
expected = expected.substring(1, expected.length - 1);
}
final equal = actual?.toString() == expected;
return comparison.group(2) == '==' ? equal : !equal;
}
final resolved = resolvePath(expr, data);
if (resolved is bool) return resolved;
return !empty(resolved);
}