Коллеги, добрый день! Есть ли в платформе возможность использовать стандартный экранный фильтр для CollectionContainer, в который данные приходят не из БД, а из сервиса? (сервис затягивает данные из сторонней интеграции)
P.S. решил эту задачу при помощи переопределения метода применения фильтра, сценариев Groovy и объекта Scripting, но может есть более правильный путь?
filter.setBeforeFilterAppliedHandler(new Filter.BeforeFilterAppliedHandler() {
/**
* Custom filter executor based on groovy
*/
@Override
public boolean beforeFilterApplied() {
eventsCollection.getMutableItems().clear();
for(var event: eventsList) {
boolean isShowed = true;
for (var abstractCondition : ((WebFilter) filter).getDelegate().getConditionsTree().getRoots()) {
Binding binding = new Binding();
binding.setVariable(abstractCondition.getName(), event.getValue(abstractCondition.getName()));
binding.setVariable("val", abstractCondition.getParam().getValue());
if(! (Boolean) scripting.evaluateGroovy(buildGroovy(abstractCondition, "val"), binding)) {
isShowed = false;
break;
}
}
if(isShowed) {
eventsCollection.getMutableItems().add(event);
}
}
return false;
}
private String buildGroovy(AbstractCondition abstractCondition, String nameValue) {
if(abstractCondition.getOperator().equals(Op.CONTAINS) ||
abstractCondition.getOperator().equals(Op.STARTS_WITH) ||
abstractCondition.getOperator().equals(Op.DOES_NOT_CONTAIN) ||
abstractCondition.getOperator().equals(Op.ENDS_WITH)) {
return "return "+abstractCondition.getName() + "." +
abstractCondition.getOperator().forGroovy() + "(" +
nameValue + ");";
} else {
return "return "+abstractCondition.getName() + " " +
abstractCondition.getOperator().forGroovy() + " " +
nameValue + ";";
}
}
});