rich:calendar fired action after manual input clean
nejedly.pe Mar 5, 2012 4:08 AMI have a problem. I need to fired action automatically after 1.5s. This is no problem, it's handled by
<a4j:queue name="delayQueue" requestDelay="1500" ignoreDupResponses="true"/>
But I need to fired after manual clean of rich:calendar automatically not after blur event.
I have rich:calendar in component like this
<ui:composition> <rich:calendar id="#{id}" value="#{value}" boundaryDatesMode="select" rendered="#{rendered}" required="#{required}" label="#{label}" oninputkeyup="javascript:checkCalendarStartSearch(this.value,this.id,event)" converter="com.x.y.convertors.DateConvertor" locale="#{userBean.locale}" onclean="jQuery('##{id}').val('')" datePattern="#{userBean.dateCalendarPattern}" todayControlMode="select" enableManualInput="true"> <a4j:ajax disabled="#{bean == null}" listener="#{bean.goToFirstPage}" status="ajaxStatus" render="@form " event="change"/> <a4j:ajax disabled="#{bean == null}" listener="#{bean.goToFirstPage}" status="ajaxStatus" render="@form " event="inputchange"/> <a4j:jsFunction action="#{bean.goToFirstPage}" name="#{id}InputDate" render="@form" status="ajaxStatus"> <a4j:param converter="com.x.y.convertors.DateConvertor" assignTo="#{value}" name="value"/> <a4j:attachQueue name="delayQueue"/> </a4j:jsFunction> </rich:calendar> </ui:composition>
Because i also need filter oninputkeyup event to not allowed fired action after Shift and cursor push, so a i allowed only 1-9 and delete and backspace key on checkCalendarStartSearch
function checkCalendarStartSearch(value, functionName, evn) { //Key codes var ALF_0 = 48; var ALF_9 = 57; var NUM_0 = 96; var NUM_9 = 105; var BACK_SPACE = 8; var DELETE = 46; if (!((evn.keyCode >= ALF_0 && evn.keyCode <= ALF_9) || (evn.keyCode >= NUM_0 && evn.keyCode <= NUM_9) || evn.keyCode == BACK_SPACE || evn.keyCode == DELETE)) { return; } var isVal = is_date(value); if (isVal) { var namespaces = functionName.split(":"); var func = namespaces.pop(); window[func](value); } }
NOTE: i don't need to allowed keys like dash(-) dot(.) etc. 'cause it's not last character at inputted date.
My convertor
@FacesConverter("com.x.y.convertors.DateConvertor") public class DateConvertor implements Converter { private static final String LOCALE_DATE_WITHOUT_DOTS = "datePatternWithoutDots"; private static final Logger logger = Logger.getLogger(DateConvertor.class); public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) { SimpleDateFormat sdf; String pattern; if (s != null && (s.contains(".") || s.contains("-"))) { pattern = (String) uiComponent.getAttributes().get("datePattern"); if (pattern == null) { //calendars on list must have Date, pattern = facesContext.getApplication().evaluateExpressionGet(facesContext, s.contains(":") ? "#{userBean.datePattern}" : "#{userBean.dateCalendarPattern}", String.class); } } else { pattern = ResourceBundleUtil.getDefaultResourceBundle().getString(LOCALE_DATE_WITHOUT_DOTS); } if (s != null && s.contains(":") && !pattern.contains(":")) { pattern += " hh:mm"; } try { sdf = new SimpleDateFormat(pattern); return sdf.parse(s); } catch (ParseException e) { logger.error("Cannot convert String to Date .", e); return null; } } public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) { try { String datePattern = (String) uiComponent.getAttributes().get("datePattern"); if (datePattern == null) { datePattern = facesContext.getApplication().evaluateExpressionGet(facesContext, "#{userBean.datePattern}", String.class); } Locale locale = facesContext.getApplication().evaluateExpressionGet(facesContext, "#{userBean.locale}", Locale.class); return new SimpleDateFormat(datePattern, locale).format((Date) o); } catch (Exception e) { return null; } } }
Problem start when user delete date in manual input. Action is fired after 1.5s automatically without onblur action, but at rich:calendar stay old value. For example I have "10.10.2010" I want to delete in manual input so i select it and delete (For example with backspace key) it. So result shout be "". But old value is always returned to rich:calendar.
Do you have any solution? Walk around ? Any tips ?