From 7d8771d9703002b17d3956a30d9a59e60dfffa11 Mon Sep 17 00:00:00 2001 From: Musachy Barroso Date: Fri, 20 Apr 2007 00:47:12 +0000 Subject: [PATCH] WW-1867 onchange is not getting called when value changes in datetimepicker git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@530595 13f79535-47bb-0310-9956-ffa450edef68 --- .../dojo/components/DateTimePicker.java | 54 ++- .../dojo/views/jsp/ui/DateTimePickerTag.java | 6 + .../dojo/struts/widget/StrutsDatePicker.js | 24 ++ .../dojo/struts/widget/StrutsTimePicker.js | 51 ++- .../apache/struts2/static/dojo/struts_dojo.js | 403 ++++++++++-------- .../dojo/struts_dojo.js.uncompressed.js | 75 +++- .../template/ajax/datetimepicker.ftl | 5 +- .../views/jsp/ui/DateTimePickerTagTest.java | 2 + .../views/jsp/ui/DateTimePickerTagTest-1.txt | 2 + 9 files changed, 407 insertions(+), 215 deletions(-) diff --git a/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/DateTimePicker.java b/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/DateTimePicker.java index 437aa75b9..836f919bb 100644 --- a/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/DateTimePicker.java +++ b/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/DateTimePicker.java @@ -20,9 +20,12 @@ */ package org.apache.struts2.dojo.components; +import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -151,6 +154,7 @@ public class DateTimePicker extends UIBean { protected String dayWidth; protected String language; protected String templateCssPath; + protected String valueNotifyTopics; public DateTimePicker(ValueStack stack, HttpServletRequest request, HttpServletResponse response) { super(stack, request, response); @@ -198,6 +202,8 @@ public class DateTimePicker extends UIBean { addParameter("type", "date"); if(templateCssPath != null) addParameter("templateCssPath", findString(templateCssPath)); + if(valueNotifyTopics != null) + addParameter("valueNotifyTopics", findString(valueNotifyTopics)); // format the value to RFC 3399 if(parameters.containsKey("value")) { @@ -307,6 +313,11 @@ public class DateTimePicker extends UIBean { super.setValue(arg0); } + @StrutsTagAttribute(description="Comma delimmited list of topics that will published when a value is selected") + public void setValueNotifyTopics(String valueNotifyTopics) { + this.valueNotifyTopics = valueNotifyTopics; + } + private String format(Object obj) { if(obj == null) return null; @@ -319,21 +330,36 @@ public class DateTimePicker extends UIBean { if(dateStr.equalsIgnoreCase("today")) return RFC3339_FORMAT.format(new Date()); - try { - Date date = null; - if(this.displayFormat != null) { - SimpleDateFormat format = new SimpleDateFormat( - (String) getParameters().get("displayFormat")); - date = format.parse(dateStr); - return RFC3339_FORMAT.format(date); - } else { - // last resource to assume already in correct/default format - return dateStr; - } - } catch (ParseException e) { - LOG.error("Could not parse date", e); - return dateStr; + + Date date = null; + //formats used to parse the date + List formats = new ArrayList(); + if (this.displayFormat != null) { + SimpleDateFormat displayFormat = new SimpleDateFormat( + (String) getParameters().get("displayFormat")); + formats.add(displayFormat); } + formats.add(RFC3339_FORMAT); + formats.add(SimpleDateFormat.getTimeInstance(DateFormat.SHORT)); + formats.add(SimpleDateFormat.getDateInstance(DateFormat.SHORT)); + formats.add(SimpleDateFormat.getDateInstance(DateFormat.MEDIUM)); + formats.add(SimpleDateFormat.getDateInstance(DateFormat.FULL)); + formats.add(SimpleDateFormat.getDateInstance(DateFormat.LONG)); + + for (DateFormat format : formats) { + try { + date = format.parse(dateStr); + if (date != null) + return RFC3339_FORMAT.format(date); + } catch (Exception e) { + //keep going + } + } + + // last resource, assume already in correct/default format + if (LOG.isDebugEnabled()) + LOG.debug("Unable to parse date " + dateStr); + return dateStr; } } diff --git a/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTag.java b/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTag.java index 742c7bc1d..40b7b208a 100644 --- a/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTag.java +++ b/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTag.java @@ -52,6 +52,7 @@ public class DateTimePickerTag extends AbstractUITag { protected String toggleDuration; protected String type; protected String templateCssPath; + protected String valueNotifyTopics; public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) { return new DateTimePicker(stack, req, res); @@ -76,6 +77,7 @@ public class DateTimePickerTag extends AbstractUITag { dateTimePicker.setToggleDuration(toggleDuration); dateTimePicker.setType(type); dateTimePicker.setTemplateCssPath(templateCssPath); + dateTimePicker.setValueNotifyTopics(valueNotifyTopics); } public void setAdjustWeeks(String adjustWeeks) { @@ -137,4 +139,8 @@ public class DateTimePickerTag extends AbstractUITag { public void setTemplateCssPath(String templateCssPath) { this.templateCssPath = templateCssPath; } + + public void setValueNotifyTopics(String valueNotifyTopics) { + this.valueNotifyTopics = valueNotifyTopics; + } } diff --git a/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/StrutsDatePicker.js b/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/StrutsDatePicker.js index 323faf2e9..314f2a638 100644 --- a/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/StrutsDatePicker.js +++ b/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/StrutsDatePicker.js @@ -6,6 +6,9 @@ dojo.widget.defineWidget( dojo.widget.DropdownDatePicker, { widgetType : "StrutsDatePicker", + valueNotifyTopics : "", + valueNotifyTopicsArray : null, + postCreate: function() { struts.widget.StrutsDatePicker.superclass.postCreate.apply(this, arguments); @@ -18,5 +21,26 @@ dojo.widget.defineWidget( if(this.extraArgs.style) { dojo.html.setStyleText(this.inputNode, this.extraArgs.style); } + + //value topics + if(!dojo.string.isBlank(this.valueNotifyTopics)) { + this.valueNotifyTopicsArray = this.valueNotifyTopics.split(","); + } }, + + _updateText : function() { + struts.widget.StrutsDatePicker.superclass._updateText.apply(this, arguments); + if(this.valueNotifyTopicsArray != null) { + for(var i = 0; i < this.valueNotifyTopicsArray.length; i++) { + var topic = this.valueNotifyTopicsArray[i]; + if(!dojo.string.isBlank(topic)) { + try { + dojo.event.topic.publish(topic, this.inputNode.value); + } catch(ex) { + dojo.debug(ex); + } + } + } + } + } }); \ No newline at end of file diff --git a/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/StrutsTimePicker.js b/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/StrutsTimePicker.js index 0f5d3d735..d37d303dd 100644 --- a/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/StrutsTimePicker.js +++ b/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/StrutsTimePicker.js @@ -13,13 +13,12 @@ dojo.widget.defineWidget( inputName: "", name: "", + valueNotifyTopics : "", + valueNotifyTopicsArray : null, + postCreate: function() { struts.widget.StrutsTimePicker.superclass.postCreate.apply(this, arguments); - if(this.value.toLowerCase() == "today") { - this.value = dojo.date.toRfc3339(new Date()); - } - this.inputNode.name = this.name; //set cssClass @@ -33,14 +32,46 @@ dojo.widget.defineWidget( } this.valueNode.name = this.inputName; + + //value topics + if(!dojo.string.isBlank(this.valueNotifyTopics)) { + this.valueNotifyTopicsArray = this.valueNotifyTopics.split(","); + } }, - onSetTime: function() { - struts.widget.StrutsTimePicker.superclass.onSetTime.apply(this, arguments); - if(this.timePicker.selectedTime.anyTime){ - this.valueNode.value = ""; - } else { - this.valueNode.value = dojo.date.toRfc3339(this.timePicker.time); + _syncValueNode:function () { + var time = this.timePicker.time; + var value; + switch (this.saveFormat.toLowerCase()) { + case "rfc": + case "iso": + case "": + //originally, Dojo only saves the time part + value = dojo.date.toRfc3339(time); + break; + case "posix": + case "unix": + value = Number(time); + break; + default: + value = dojo.date.format(time, {datePattern:this.saveFormat, selector:"timeOnly", locale:this.lang}); + } + this.valueNode.value = value; + }, + + _updateText : function() { + struts.widget.StrutsTimePicker.superclass._updateText.apply(this, arguments); + if(this.valueNotifyTopicsArray != null) { + for(var i = 0; i < this.valueNotifyTopicsArray.length; i++) { + var topic = this.valueNotifyTopicsArray[i]; + if(!dojo.string.isBlank(topic)) { + try { + dojo.event.topic.publish(topic, this.inputNode.value); + } catch(ex) { + dojo.debug(ex); + } + } + } } } }); \ No newline at end of file diff --git a/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js b/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js index 6c7640d2f..277a4986b 100644 --- a/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js +++ b/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js @@ -16682,11 +16682,8 @@ this.timePicker.destroy(_dea); dojo.widget.DropdownTimePicker.superclass.destroy.apply(this,arguments); }}); dojo.provide("struts.widget.StrutsTimePicker"); -dojo.widget.defineWidget("struts.widget.StrutsTimePicker",dojo.widget.DropdownTimePicker,{widgetType:"StrutsTimePicker",inputName:"",name:"",postCreate:function(){ +dojo.widget.defineWidget("struts.widget.StrutsTimePicker",dojo.widget.DropdownTimePicker,{widgetType:"StrutsTimePicker",inputName:"",name:"",valueNotifyTopics:"",valueNotifyTopicsArray:null,postCreate:function(){ struts.widget.StrutsTimePicker.superclass.postCreate.apply(this,arguments); -if(this.value.toLowerCase()=="today"){ -this.value=dojo.date.toRfc3339(new Date()); -} this.inputNode.name=this.name; if(this.extraArgs["class"]){ dojo.html.setClass(this.inputNode,this.extraArgs["class"]); @@ -16695,12 +16692,40 @@ if(this.extraArgs.style){ dojo.html.setStyleText(this.inputNode,this.extraArgs.style); } this.valueNode.name=this.inputName; -},onSetTime:function(){ -struts.widget.StrutsTimePicker.superclass.onSetTime.apply(this,arguments); -if(this.timePicker.selectedTime.anyTime){ -this.valueNode.value=""; -}else{ -this.valueNode.value=dojo.date.toRfc3339(this.timePicker.time); +if(!dojo.string.isBlank(this.valueNotifyTopics)){ +this.valueNotifyTopicsArray=this.valueNotifyTopics.split(","); +} +},_syncValueNode:function(){ +var time=this.timePicker.time; +var _dec; +switch(this.saveFormat.toLowerCase()){ +case "rfc": +case "iso": +case "": +_dec=dojo.date.toRfc3339(time); +break; +case "posix": +case "unix": +_dec=Number(time); +break; +default: +_dec=dojo.date.format(time,{datePattern:this.saveFormat,selector:"timeOnly",locale:this.lang}); +} +this.valueNode.value=_dec; +},_updateText:function(){ +struts.widget.StrutsTimePicker.superclass._updateText.apply(this,arguments); +if(this.valueNotifyTopicsArray!=null){ +for(var i=0;i0){ for(var i=0;ithis.endDate){ -_df3=new Date((_df3this.endDate){ +_df7=new Date((_df7days){ +if(dojo.date.diff(_dfa,this.endDate,dojo.date.dateParts.DAY)>days){ this._preInitUI(this.startDate,true,false); -_df6=new Date(this.firstDay); +_dfa=new Date(this.firstDay); } -this.curMonth=new Date(_df6); -this.curMonth.setDate(_df6.getDate()+6); +this.curMonth=new Date(_dfa); +this.curMonth.setDate(_dfa.getDate()+6); this.curMonth.setDate(1); -var _df9=(_df6.getMonth()==this.curMonth.getMonth())?"current":"previous"; +var _dfd=(_dfa.getMonth()==this.curMonth.getMonth())?"current":"previous"; } -if(_df5){ +if(_df9){ this._initUI(days); } },_initUI:function(days){ @@ -16813,72 +16838,72 @@ dojo.dom.removeChildren(this.calendarDatesContainerNode); for(var i=0;ithis.endDate){ -_e06=_e08=_e0a=false; +if(_e0a&&d2>this.endDate){ +_e0a=_e0c=_e0e=false; } -if(_e07&&add(d,DAY,-1)this.endDate){ -_e08=_e0a=false; +if(_e0c&&add(d2,DAY,1)>this.endDate){ +_e0c=_e0e=false; } -if(_e09&&add(d2,YEAR,-1)this.endDate){ -_e0a=false; +if(_e0e&&add(d,YEAR,1)>this.endDate){ +_e0e=false; } } -function enableControl(node,_e0d){ -dojo.html.setVisibility(node,_e0d?"":"hidden"); +function enableControl(node,_e11){ +dojo.html.setVisibility(node,_e11?"":"hidden"); } -enableControl(this.decreaseWeekNode,_e05); -enableControl(this.increaseWeekNode,_e06); -enableControl(this.decreaseMonthNode,_e07); -enableControl(this.increaseMonthNode,_e08); -enableControl(this.previousYearLabelNode,_e09); -enableControl(this.nextYearLabelNode,_e0a); +enableControl(this.decreaseWeekNode,_e09); +enableControl(this.increaseWeekNode,_e0a); +enableControl(this.decreaseMonthNode,_e0b); +enableControl(this.increaseMonthNode,_e0c); +enableControl(this.previousYearLabelNode,_e0d); +enableControl(this.nextYearLabelNode,_e0e); },_incrementWeek:function(evt){ var d=new Date(this.firstDay); switch(evt.target){ case this.increaseWeekNode.getElementsByTagName("img").item(0): case this.increaseWeekNode: -var _e10=dojo.date.add(d,dojo.date.dateParts.WEEK,1); -if(_e10this.startDate){ +if(_e17>this.startDate){ d=dojo.date.add(d,dojo.date.dateParts.MONTH,-1); }else{ -var _e15=true; +var _e19=true; } break; } -if(_e15){ +if(_e19){ d=new Date(this.startDate); }else{ -if(_e14){ +if(_e18){ d=new Date(this.endDate); } } this._preInitUI(d,false,true); },_incrementYear:function(evt){ var year=this.curMonth.getFullYear(); -var _e18=new Date(this.firstDay); +var _e1c=new Date(this.firstDay); switch(evt.target){ case this.nextYearLabelNode: -_e18=dojo.date.add(_e18,dojo.date.dateParts.YEAR,1); -if(_e18this.startDate){ +_e1c=dojo.date.add(_e1c,dojo.date.dateParts.YEAR,-1); +if(_e1c>this.startDate){ year--; }else{ -var _e1a=true; +var _e1e=true; } break; } var d; -if(_e1a){ +if(_e1e){ d=new Date(this.startDate); }else{ -if(_e19){ +if(_e1d){ d=new Date(this.endDate); }else{ d=new Date(year,this.curMonth.getMonth(),1); @@ -16967,8 +16992,8 @@ evt.stopPropagation(); if(!this.staticDisplay){ this._incrementYear(evt); } -},_setMonthLabel:function(_e1f){ -this.monthLabelNode.innerHTML=dojo.date.getNames("months","wide","standAlone",this.lang)[_e1f]; +},_setMonthLabel:function(_e23){ +this.monthLabelNode.innerHTML=dojo.date.getNames("months","wide","standAlone",this.lang)[_e23]; },_setYearLabels:function(year){ var y=year-1; var that=this; @@ -16978,64 +17003,64 @@ that[n+"YearLabelNode"].innerHTML=dojo.date.format(new Date(y++,0),{formatLength f("previous"); f("current"); f("next"); -},_getDateClassName:function(date,_e25){ -var _e26=this.classNames[_e25]; +},_getDateClassName:function(date,_e29){ +var _e2a=this.classNames[_e29]; if((!this.selectedIsUsed&&this.value)&&(Number(date)==Number(this.value))){ -_e26=this.classNames.selectedDate+" "+_e26; +_e2a=this.classNames.selectedDate+" "+_e2a; this.selectedIsUsed=true; } if((!this.currentIsUsed)&&(Number(date)==Number(this.today))){ -_e26=_e26+" "+this.classNames.currentDate; +_e2a=_e2a+" "+this.classNames.currentDate; this.currentIsUsed=true; } -return _e26; +return _e2a; },onClick:function(evt){ dojo.event.browser.stopEvent(evt); },_handleUiClick:function(evt){ -var _e29=evt.target; -if(_e29.nodeType!=dojo.dom.ELEMENT_NODE){ -_e29=_e29.parentNode; +var _e2d=evt.target; +if(_e2d.nodeType!=dojo.dom.ELEMENT_NODE){ +_e2d=_e2d.parentNode; } dojo.event.browser.stopEvent(evt); this.selectedIsUsed=this.todayIsUsed=false; -if(dojo.html.hasClass(_e29,this.classNames["disabledPrevious"])||dojo.html.hasClass(_e29,this.classNames["disabledCurrent"])||dojo.html.hasClass(_e29,this.classNames["disabledNext"])){ +if(dojo.html.hasClass(_e2d,this.classNames["disabledPrevious"])||dojo.html.hasClass(_e2d,this.classNames["disabledCurrent"])||dojo.html.hasClass(_e2d,this.classNames["disabledNext"])){ return; } -this.clickedNode=_e29; -this.setDate(new Date(Number(dojo.html.getAttribute(_e29,"djDateValue")))); +this.clickedNode=_e2d; +this.setDate(new Date(Number(dojo.html.getAttribute(_e2d,"djDateValue")))); },onValueChanged:function(date){ -},_isDisabledDate:function(_e2b){ -if(_e2bthis.endDate){ +},_isDisabledDate:function(_e2f){ +if(_e2fthis.endDate){ return true; } -return this.isDisabledDate(_e2b,this.lang); -},isDisabledDate:function(_e2c,_e2d){ +return this.isDisabledDate(_e2f,this.lang); +},isDisabledDate:function(_e30,_e31){ return false; -},_initFirstDay:function(_e2e,adj){ -var d=new Date(_e2e); +},_initFirstDay:function(_e32,adj){ +var d=new Date(_e32); if(!adj){ d.setDate(1); } d.setDate(d.getDate()-this._getAdjustedDay(d,this.weekStartsOn)); d.setHours(0,0,0,0); return d; -},_getAdjustedDay:function(_e31){ +},_getAdjustedDay:function(_e35){ var days=[0,1,2,3,4,5,6]; if(this.weekStartsOn>0){ for(var i=0;i containerToggleDuration="${parameters.toggleDuration?string?html}"<#rt/> - <#if parameters.templateCssPath?exists> + <#if parameters.templateCssPath?if_exists != ""> templateCssPath="<@s.url value='${parameters.templateCssPath}' encode="false" includeParams='none'/>" + <#if parameters.valueNotifyTopics?if_exists != ""> + valueNotifyTopics="${parameters.valueNotifyTopics?html}"<#rt/> + saveFormat="rfc"<#rt/> <#include "/${parameters.templateDir}/simple/scripting-events.ftl" /> > diff --git a/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTagTest.java b/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTagTest.java index 0c32f6592..880496321 100644 --- a/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTagTest.java +++ b/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTagTest.java @@ -39,6 +39,8 @@ public class DateTimePickerTagTest extends AbstractUITagTest { tag.setName("h"); tag.setLanguage("i"); tag.setTemplateCssPath("j"); + tag.setValueNotifyTopics("k"); + tag.setValue("l"); tag.doStartTag(); tag.doEndTag(); diff --git a/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTagTest-1.txt b/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTagTest-1.txt index 9c2b6b472..c2495aaad 100644 --- a/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTagTest-1.txt +++ b/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/DateTimePickerTagTest-1.txt @@ -1,5 +1,6 @@