Uploaded image for project: 'RichFaces'
  1. RichFaces
  2. RF-13108

rich:calendar nested a4j:ajax event not firing

    Details

    • Workaround:
      Workaround Exists
    • Workaround Description:
      Hide

      revert from a4j:ajax to f:ajax.. frustrating as it is... this one works. i'm afraid there are some undocumented features here.

      <h:outputLabel for="startTimeOverride" value="Start Time Override:" rendered="#{inlineSecuritiesBean.siteAdmin}"/>
      <rich:calendar value="#{screeningBean.screening.beginTime}"   
                     id="startTimeOverride"
                     popup="true" datePattern="dd/M/yy hh:mm a" required="true" 
                     showApplyButton="true" cellWidth="24px" cellHeight="22px" style="width:200px"
                     rendered="#{inlineSecuritiesBean.siteAdmin}" >
           <f:ajax event="change" execute="@this" render="@form"/>			             			             
               <f:validateRequired />
               <f:validator validatorId="dateRangeBeforeValidator" />	
      </rich:calendar>
      <rich:message for="startTimeOverride" 
                    rendered="#{inlineSecuritiesBean.siteAdmin}"
                    style="width:300px;text-align:left;display:block;line-height:15px;" 
                    ajaxRendered="true" />
      
      <h:outputLabel for="endTimeOverride" value="End Time Override:" rendered="#{inlineSecuritiesBean.siteAdmin and screeningBean.screening.status== 2}" />
      <rich:calendar value="#{screeningBean.screening.endTime}" id="endTimeOverride"
                     popup="true" datePattern="dd/M/yy hh:mm a"
                     showApplyButton="true" cellWidth="24px" cellHeight="22px" style="width:200px"
                     rendered="#{inlineSecuritiesBean.siteAdmin and screeningBean.screening.status== 2}">
          <a4j:ajax event="change" execute="@this"  bypassUpdates="#{true}" render="startTimeOverride"/>			             			             
          <f:validateRequired />
          <f:validator validatorId="dateRangeAfterValidator" />	
          <rich:validator /> 
      </rich:calendar>
      <rich:message  for="endTimeOverride" 
                     rendered="#{inlineSecuritiesBean.siteAdmin and screeningBean.screening.status== 2}"
                     style="width:300px;text-align:left;display:block;line-height:15px;" 
                     ajaxRendered="true" />
      
      Show
      revert from a4j:ajax to f:ajax.. frustrating as it is... this one works. i'm afraid there are some undocumented features here. <h:outputLabel for= "startTimeOverride" value= "Start Time Override:" rendered= "#{inlineSecuritiesBean.siteAdmin}" /> <rich:calendar value= "#{screeningBean.screening.beginTime}" id= "startTimeOverride" popup= "true" datePattern= "dd/M/yy hh:mm a" required= "true" showApplyButton= "true" cellWidth= "24px" cellHeight= "22px" style= "width:200px" rendered= "#{inlineSecuritiesBean.siteAdmin}" > <f:ajax event= "change" execute= "@this" render= "@form" /> <f:validateRequired /> <f:validator validatorId= "dateRangeBeforeValidator" /> </rich:calendar> <rich:message for= "startTimeOverride" rendered= "#{inlineSecuritiesBean.siteAdmin}" style= "width:300px;text-align:left;display:block;line-height:15px;" ajaxRendered= "true" /> <h:outputLabel for= "endTimeOverride" value= "End Time Override:" rendered= "#{inlineSecuritiesBean.siteAdmin and screeningBean.screening.status== 2}" /> <rich:calendar value= "#{screeningBean.screening.endTime}" id= "endTimeOverride" popup= "true" datePattern= "dd/M/yy hh:mm a" showApplyButton= "true" cellWidth= "24px" cellHeight= "22px" style= "width:200px" rendered= "#{inlineSecuritiesBean.siteAdmin and screeningBean.screening.status== 2}" > <a4j:ajax event= "change" execute= "@this" bypassUpdates= "#{true}" render= "startTimeOverride" /> <f:validateRequired /> <f:validator validatorId= "dateRangeAfterValidator" /> <rich:validator /> </rich:calendar> <rich:message for= "endTimeOverride" rendered= "#{inlineSecuritiesBean.siteAdmin and screeningBean.screening.status== 2}" style= "width:300px;text-align:left;display:block;line-height:15px;" ajaxRendered= "true" />

      Description

      nested a4j:ajax change event isn't functioning as expected. On "change" event, the expect result is that the value is moved into the target Date field of the backing bean. When using a4j:ajax, this does not happen.

      After speaking with ppitonak he believe that the order of the ajax with relation to the validators was import. however after closer inspection, the value wasn't making back to the bean even when the event was fired even with the order reversed.

      Logically the first date should be submitted to the backing bean on change even and made available for validation in the second dates validator. works with f:ajax.. doesnt work with a4j:ajax.

      Request URL:http://oasis.monarchnc.org:10001/oasis/screening/edit.xhtml?cid=2
      Request Method:POST
      Status Code:200 OK
      Request Headersview source
      Accept:*/*
      Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
      Accept-Encoding:gzip,deflate,sdch
      Accept-Language:en-US,en;q=0.8
      Connection:keep-alive
      Content-Length:870
      Content-type:application/x-www-form-urlencoded;charset=UTF-8
      Cookie:JSESSIONID="gOuCLop-DL7U6D3fbNhptHmw.slave:server-three"; csfcfc=11Xfn_12Xfn; __utma=69432588.533798156.1374674467.1374674467.1374674467.1; __utmz=69432588.1374674467.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); org.monarchnc.commandcenter.location=1; org.monarchnc.commandcenter.security=NDNlZGQ3ZDU3NjIxYzI4YjM4YzZlOTM0YzQ3ZjAxYWQ_
      Faces-Request:partial/ajax
      Host:oasis.monarchnc.org:10001
      Origin:http://oasis.monarchnc.org:10001
      Referer:http://oasis.monarchnc.org:10001/oasis/screening/edit.xhtml?cid=2&id=143&dsRid=197&windowId=-9720
      User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
      Query String Parametersview sourceview URL encoded
      cid:2
      Form Dataview sourceview URL encoded
      create:create
      create:medrecordnumber:
      create:patientName:Ritchard Trickle
      create:patientPhone:
      create:patientEmail:
      create:startTimeOverrideInputDate:30/7/13 04:24 PM
      create:startTimeOverrideInputCurrentDate:07/2013
      create:endTimeOverrideInputDate:01/8/13 05:58 PM
      create:endTimeOverrideInputCurrentDate:08/2013
      create:screeningBeanScreeningProviderValue:
      create:screeningBeanScreeningProviderInput:dennis, nathan
      javax.faces.ViewState:-4869776129569305131:8783263118910249789
      javax.faces.source:create:startTimeOverride
      javax.faces.partial.event:change
      javax.faces.partial.execute:create:startTimeOverride @component
      javax.faces.partial.render:@component
      javax.faces.behavior.event:change
      org.richfaces.ajax.component:create:startTimeOverride
      rfExt:null
      AJAX:EVENTS_COUNT:1
      javax.faces.partial.ajax:true
      Response Headersview source
      Cache-Control:no-cache
      Connection:close
      Content-Type:text/xml;charset=UTF-8
      Date:Thu, 01 Aug 2013 15:59:07 GMT
      Server:Apache-Coyote/1.1
      Transfer-Encoding:chunked
      X-Powered-By:JSF/2.0
      
      <?xml version='1.0' encoding='UTF-8' ?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <ui:composition xmlns="http://www.w3.org/1999/xhtml"
      	xmlns:h="http://java.sun.com/jsf/html"
      	xmlns:f="http://java.sun.com/jsf/core"
      	xmlns:ui="http://java.sun.com/jsf/facelets"
      	xmlns:c="http://java.sun.com/jsp/jstl/core"	
      	xmlns:a4j="http://richfaces.org/a4j"
      	xmlns:rich="http://richfaces.org/rich"	
      	template="/resources/scaffold/pageTemplate.xhtml">
      
      	<f:metadata>
      		<f:viewParam name="id" value="#{screeningBean.id}"/>
      	</f:metadata>
      
      	<ui:define name="main">
      		<h:form id="create">
      			
      	<h:panelGrid columnClasses="label,component,required" columns="3">
      		<h:outputLabel for="startTimeOverride" value="Start Time Override:"/>
      		<rich:calendar value="#{screeningBean.screening.beginTime}" id="startTimeOverride"
                          popup="true" datePattern="dd/M/yy hh:mm a" required="true" 
                          showApplyButton="true"  >
                          <f:validateRequired />
                          <a4j:ajax event="change"  bypassUpdates="#{true}"/>			             			             
                      </rich:calendar>
       		<rich:message for="startTimeOverride" ajaxRendered="true" />
                      <h:outputLabel for="endTimeOverride" value="End Time Override:" />
      		<rich:calendar value="#{screeningBean.screening.endTime}" id="endTimeOverride"
                          popup="true" datePattern="dd/M/yy hh:mm a"
                          showApplyButton="true" >
                          <f:validateRequired />
      		    <f:validator validatorId="dateRangeValidator" />	
      		    <rich:validator /> 
      		    <a4j:ajax event="change"  bypassUpdates="#{true}"/>			             			             
                      </rich:calendar>
                      <rich:message for="endTimeOverride" ajaxRendered="true" />
      	</h:panelGrid>
      	<div class="buttons">
      		<a4j:commandButton value="Complete" 
      			action="#{screeningBean.updateScreening(2)}" 
      			execute="@form"
      			onclick="this.disabled=true; var that = this; setTimeout(function() that.disabled=false;},500);"  
      			styleClass="btn btn-primary btn-primary-a4j"  />
      	</div>
      	</h:form>
      </ui:define>
      
      </ui:composition>
      
      
      
      
      DateRangeValidator.java
      
      /**************************************************************
       * Copyright (c) 2012 - 2013, Monarch, All rights reserved.
       * 
       * @author Nathan Dennis
       * 
       */
      package org.monarchnc.view.validators;
      
      
      import java.text.DateFormat;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      
      import javax.faces.application.FacesMessage;
      import javax.faces.component.UIComponent;
      import javax.faces.component.UIInput;
      import javax.faces.context.FacesContext;
      import javax.faces.validator.FacesValidator;
      import javax.faces.validator.Validator;
      import javax.faces.validator.ValidatorException;
      import javax.persistence.EntityManager;
      
      import org.apache.deltaspike.core.api.provider.BeanProvider;
      import org.monarchnc.view.ScreeningBean;
      
      
      // TODO: Auto-generated Javadoc
      /**
       * The Class DateRangeValidator.
       */
      @FacesValidator("dateRangeValidator")
      public class DateRangeValidator implements Validator {
      	
          
          /* (non-Javadoc)
           * @see javax.faces.validator.Validator#validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)f
           */
          public void validate(final FacesContext ctx, final UIComponent component, final Object value) throws ValidatorException {
                        
          		ScreeningBean screeningBean = BeanProvider.getContextualReference(screeningBean.class, false);
      
       			
              		Date date =(Date) value; 
              		if(screeningBean.getScreening().getBeginTime() != null && date != null)
              		if(!date.after(screeningBean.getScreening().getBeginTime())){
              			throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,"End Date must be after Start Date!!.\n","End Date must be after Start Date!!\n"));
              			
              		}
          	
          
          }
      
      }
      
      ScreeningBean.java
      
      @Named
      @Transactional
      @ConversationScoped
      public class ScreeningBean implements Serializable{
      
      	Screening screening = new Screening();
      
      	public Class<? extends ViewConfig> claim(){
      		 if (this.conversation.isTransient())
      	      {
      	         this.conversation.begin();
      	      }...
               }
      	public Screening getScreening() {
      		return screening;
      	}
      
      
      	public void setScreening(Screening screening) {
      		this.screening = screening;
      	}
      }
      

        Gliffy Diagrams

          Attachments

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                nathandennis nathan dennis
              • Votes:
                0 Vote for this issue
                Watchers:
                4 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: