Appeler une action dans la balise <Template></Template>

Bonjour.
Je suis entrain de développer un module axelor. Depuis un bout de temps je tente en vain de
d’associer une action à un bouton en utilisant l’attribut ui-action-clik.
voici ce que je fais:

<template><![CDATA[
<button type="button" class="btn btn-danger" ui-action-click="action.cloturer.session" /> Cloturer la session </button>
]]>
</template>

Mais à chaque fois malgrés que l’action “action.cloturer.session” existe j’ai l’erreur:

java.lang.NullPointerException
at com.axelor.meta.schema.actions.ActionView.evaluate(ActionView.java:190)
at com.axelor.meta.schema.actions.ActionView.wrap(ActionView.java:233)
at com.axelor.meta.schema.actions.ActionGroup.evaluate(ActionGroup.java:220)
at com.axelor.meta.schema.actions.ActionGroup.wrap(ActionGroup.java:365)
at com.axelor.meta.ActionHandler.execute(ActionHandler.java:374)
at com.axelor.web.service.ActionService.execute(ActionService.java:96)
at com.axelor.rpc.RequestFilter.invoke(RequestFilter.java:59)
at com.axelor.rpc.ResponseInterceptor.invoke(ResponseInterceptor.java:63)
at sun.reflect.GeneratedMethodAccessor587.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:296)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:250)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:237)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:89)
at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:44)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at com.axelor.auth.AuthFilter.doFilterInternal(AuthFilter.java:81)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.guice.web.SimpleFilterChain.doFilter(SimpleFilterChain.java:41)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.axelor.app.internal.AppFilter.doFilter(AppFilter.java:94)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.google.inject.persist.PersistFilter.doFilter(PersistFilter.java:91)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.axelor.web.servlet.CorsFilter.doFilter(CorsFilter.java:136)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:119)
at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133)
at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130)
at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
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:748)

Merci de m’aider

Bonjour,

Le moyen le plus simple de générer un bouton en associant une action est :

<button name="cloturerSession" title="Cloturer la session" onClick="action.cloturer.session"/>

Après si c’est dans une vue kanban comme c’est peut-être votre cas :

<toolbar>
    <button name="cloturerSession" title="Cloturer la session" onClick="action.cloturer.session"/>
</toolbar>

Cordialement.

Bonjour.
Merci. Mais c’est plus tôt dans une vue Custom que j’utilise le bouton.

 <custom name="session-current" title="Session" css="report-box">
    <dataset type="jpql"><![CDATA[
      select s as currentSession from Session s where s.fg_ferme= false
    ]]></dataset>

     <template>
       <![CDATA[
     	<div>
    		<h3>Session du {{first.currentSession.date_session|date:'dd/MM/yyyy'}} en cours<h3>
    		<button type="button" colSpan="4" class="btn btn-danger" ui-action-click="action.cloturer.session">Cloturer session</button>
    	</div>
  ]]></template>
</custom>

Malheureusement la balise <toolbar></toolbar> n’est pas autorisée. Elle ne peut être utilisé.
La solution que vous me proposez ne marche pas pour mon cas même si je remplace ui-action-click par onClick.
Merci

Bonjour,

D’après la documentation technique : “The custom view allows to show arbitrary data using custom templates. This view is generally useful to create readonly reports.”

http://docs.axelor.com/adk/latest/dev_guide/views/custom.html

Je demanderai confirmation en interne mais il semble que le readonly pour les custom views implique qu’on ne puisse pas déclencher d’actions.

Vous pouvez essayer d’obtenir le même résultat en créant une vue “form” sur sa classe “Session”.

Bonjour.
Ah Ok! Je n’avais pas fait attention
Grand merci!