Konstantin, thanks a lot for support.
My main objective is (similarly to what you’ve provided in example) to apply a quick filter by adding a simple component to ButtonsPanel (in my case a checkbox). Using the generic filter is not desirable as the filtered table is a nested one, filter parameters are very basic and full-blown filter would be an overkill.
After further research and “inspiration” from sample-timesheets app I reckon declarative approach might be a viable option. The only issue I have with it is that by default CUBA doesn’t create queries for datasources & I would prefer not meddling with it in the view file, but rather sort out the filter in controller. If I understand correctly declarative approach requires building the query & the filter with parameters in view file (and adding
<filter>
only without
<query>
to view would not work).
In your example though the query for Customer was included nonetheless.
That said, somehow, I was unable to implement your solution in my project correctly and would appreciate if you could help me resolve the error.
I have a many-to-many relationship Customer - CustomerStrategy - Strategy*. In customer-edit screen I would like to filter the strategies that are valid on any given date (for simplicity current date activated by checkbox) using *validFrom and validTo properties in Strategy.
My
dsContext
in
Customer-edit.xml
:
<dsContext>
<datasource id="customerDs"
class="com.company.segapp.entity.Customer"
view="customer-view-default">
<query><![CDATA[select c from segapp$Customer c]]></query>
<collectionDatasource id="strategiesDs"
property="strategies"/>
<query>
<![CDATA[select cs from segapp$CustomerStrategy cs where cs.customer = :ds$customerDs]]>
</query>
</datasource>
</dsContext>
My
CustomerEdit
controller:
activeOnlyCheckbox.addValueChangeListener(event -> {
if (Boolean.TRUE.equals(event.getValue())) {
Date today = new Date();
LogicalCondition andCondition = new LogicalCondition("", LogicalOp.AND);
andCondition.getConditions().add(new Clause("", "cs.strategy.validFrom <= :(?i)custom$today", null, null, null));
andCondition.getConditions().add(new Clause("", "cs.strategy.validTo >= :(?i)custom$today", null, null, null));
QueryFilter queryFilter = new QueryFilter(andCondition);
strategiesDs.setQueryFilter(queryFilter);
strategiesDs.refresh(ParamsMap.of("today", today));
} else {
strategiesDs.setQueryFilter(null);
strategiesDs.refresh();
}
});
As a result I get a UnsupportedOperationException:
java.lang.UnsupportedOperationException
at com.haulmont.cuba.gui.data.impl.CollectionPropertyDatasourceImpl.setQueryFilter(CollectionPropertyDatasourceImpl.java:678)
at com.company.segapp.web.customer.CustomerEdit.lambda$init$0(CustomerEdit.java:44)
at com.haulmont.bali.events.EventRouter.fireEvent(EventRouter.java:45)
at com.haulmont.cuba.web.gui.components.WebAbstractField.lambda$attachListener$6f56ebaa$1(WebAbstractField.java:278)
at sun.reflect.GeneratedMethodAccessor126.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1037)
at com.vaadin.ui.AbstractField.fireValueChange(AbstractField.java:1181)
at com.vaadin.ui.AbstractField.setValue(AbstractField.java:580)
at com.vaadin.ui.AbstractField.setValue(AbstractField.java:474)
at com.vaadin.ui.AbstractField.setValue(AbstractField.java:454)
at com.vaadin.ui.CheckBox$1.setChecked(CheckBox.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:119)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:442)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:414)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
at com.haulmont.cuba.web.sys.CubaVaadinServletService$CubaUidlRequestHandler.lambda$synchronizedHandleRequest$0(CubaVaadinServletService.java:314)
at com.haulmont.cuba.web.sys.CubaVaadinServletService.withUserSession(CubaVaadinServletService.java:196)
at com.haulmont.cuba.web.sys.CubaVaadinServletService$CubaUidlRequestHandler.synchronizedHandleRequest(CubaVaadinServletService.java:314)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1422)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:384)
at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:276)
at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:185)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at com.haulmont.cuba.web.sys.CubaHttpFilter.handleNotFiltered(CubaHttpFilter.java:108)
at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:95)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1437)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)