We can fix this by keeping track of the operator for each rule.
const [ruleOperators, setRuleOperators] = useState({});
We can do that by using afterUpdateRuleOperator.queryBuilder
$('#builder').on('afterUpdateRuleOperator.queryBuilder', (e, rule) => {
setRuleOperators(prev => ({
...prev,
[rule.id]: rule.operator,
}));
});
Then update the rule with previous operator immediately after changing the field using afterUpdateRuleFilter.queryBuilder
$('#builder').on('afterUpdateRuleFilter.queryBuilder', (e, rule) => {
const prevOp = ruleOperators[rule.id];
if (prevOp) {
rule.operator = prevOp;
$('#builder').queryBuilder('trigger', 'afterUpdateRuleOperator', rule);
}
});