Well this is my component, which does exactly that. However i haven't manage
to implement dynamic client side validation(required true/false). have a go
and let me know if you improve it. It's based on the chenillekit datepicker
component.

the java file without package:

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.apache.tapestry5.Binding;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.FieldValidationSupport;
import org.apache.tapestry5.FieldValidator;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.OptionModel;
import org.apache.tapestry5.SelectModel;
import org.apache.tapestry5.ValidationException;
import org.apache.tapestry5.ValidationTracker;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.corelib.base.AbstractField;
import org.apache.tapestry5.internal.OptionModelImpl;
import org.apache.tapestry5.internal.SelectModelImpl;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.ComponentDefaultProvider;
import org.apache.tapestry5.services.Request;

/**
 * @author  mailto:shomb...@depot120.dpd.de S.Homburg 
 * @version $Id: DateSelector.java 471 2009-05-09 09:28:38Z homburgs $
 */
//@Import(library = {
//              "context:js/datepick.js"})
public class DateSelector extends AbstractField
{
        @Parameter(required = true, defaultPrefix =
BindingConstants.PROP,autoconnect = true)
        private Date value;
        
        @SuppressWarnings("unused")
        @Parameter(defaultPrefix = BindingConstants.PROP, value = "false")
        private boolean longMonth;

        /**
         * The object that will perform input validation (which occurs after
translation). The validate binding prefix is
         * generally used to provide this object in a declarative fashion.
         */
        @Parameter(defaultPrefix = BindingConstants.VALIDATE)
        private FieldValidator validate;

        @Inject
        private Locale locale;

        @Inject
        private ComponentDefaultProvider defaultProvider;

        @Inject
        private ComponentResources resources;

        @Inject
        private Request request;


        @Inject
        private Messages messages;

        @Property
        private Integer day;

        @Property
        private Integer month;

        @Property
        private Integer year;

        @Environmental
        private ValidationTracker validationTracker;

        @Inject
        private FieldValidationSupport fieldValidationSupport;

        private Calendar calendar = Calendar.getInstance(locale);

        /**
         * Computes a default value for the "validate" parameter using {@link
org.apache.tapestry5.services.FieldValidatorDefaultSource}.
         */
        final Binding defaultValidate()
        {
                return defaultProvider.defaultValidatorBinding("value", 
resources);
        }

        /**
         * Tapestry render phase method.
         * Initialize temporary instance variables here.
         */
        void setupRender()
        {
                if (value != null){
                        calendar.setTime(value);
                        day=calendar.get(Calendar.DAY_OF_MONTH);
                        month=calendar.get(Calendar.MONTH);
                        year=calendar.get(Calendar.YEAR);
                }
        }

        /**
         * Tapestry render phase method.
         * Start a tag here, end it in afterRender
         */
        void beginRender(MarkupWriter writer)
        {

        }

        /**
         * Tapestry render phase method. End a tag here.
         */
        void afterRender(MarkupWriter writer)
        {

        }

        /**
         * Method implemented by subclasses to actually do the work of 
processing
the submission of the form. The element's
         * elementName property will already have been set. This method is only
invoked if the field is <strong>not {@link
         * #isDisabled() disabled}</strong>.
         *
         * @param elementName the name of the element (used to find the correct
parameter in the request)
         */
        @Override
        protected void processSubmission(String elementName)
        {
                
                Date translated = null;
                try
                {
                        day = Integer.parseInt(request.getParameter("days"));
                        month = 
Integer.parseInt(request.getParameter("months"));
                        year = Integer.parseInt(request.getParameter("years"));
                        calendar.set(year, month, day);
                        calendar.setLenient(false);
                        translated = calendar.getTime();
                        fieldValidationSupport.validate(translated, resources, 
validate);
                }
                catch(NumberFormatException ex){
                        value=null;
                        if(validate.isRequired() && value == null){
                                validationTracker.recordError(this, 
messages.get("date-not-null"));
                        }
                }
                catch (IllegalArgumentException ex)
                {
                        if (ex.getMessage().equals("MONTH")){
                                validationTracker.recordError(this, 
messages.get("incorrect-date"));
                        }
                        value=null;
                        if(validate.isRequired() && value == null){
                                validationTracker.recordError(this, 
messages.get("date-not-null"));
                        }
                }
                catch (ValidationException ex)
                {
                        //                      if(ex.getMessage().contains(""))
                        validationTracker.recordError(this, 
ex.getLocalizedMessage());
                        value=null;
                }
                value = translated;
        }

        @Override
        public boolean isRequired()
        {
                return validate.isRequired();
        }

        public FieldValidator getValidate(){
                return validate;
        }

        public SelectModel getdayModel(){

                List<OptionModel> optionModels = new ArrayList<OptionModel>();
                SelectModel res = new SelectModelImpl(null, optionModels);
                for (int day = 1; day < 32; day++)
                {
                        OptionModel temp = new OptionModelImpl(new 
Integer(day).toString(),day);
                        optionModels.add(temp);
                }
                return res;
        }

        public SelectModel getMonthModel(){

                List<OptionModel> optionModels = new ArrayList<OptionModel>();
                SelectModel res = new SelectModelImpl(null, optionModels);
                for (int month = 0; month < 12; month++)
                {
                        OptionModel temp = new OptionModelImpl(new
Integer(month+1).toString(),month);
                        optionModels.add(temp);
                }
                return res;
        }

        public SelectModel getYearModel(){

                List<OptionModel> optionModels = new ArrayList<OptionModel>();
                SelectModel res = new SelectModelImpl(null, optionModels);
                for (int year = Calendar.getInstance().get(Calendar.YEAR)-18; 
year >=
Calendar.getInstance().get(Calendar.YEAR)-100; year--)
                {
                        OptionModel temp = new OptionModelImpl(new
Integer(year).toString(),year);
                        optionModels.add(temp);
                }

                return res;
        }

        public String getId(){
                return super.getClientId();
        }
}

and the tml file is 

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;
&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
<html xmlns="http://www.w3.org/1999/xhtml";
        xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd";
        xmlns:p="tapestry:parameter">
<t:select t:id="days" model="dayModel" value="day" blankOption="ALWAYS"
        blankLabel="Day" validate="required" />
<t:select t:id="months" model="monthModel" value="month"
        blankOption="ALWAYS" blankLabel="Month" validate="required" />
<t:select t:id="years" model="yearModel" value="year"
        blankOption="ALWAYS" blankLabel="Year" validate="required" />
</html>

properties as well

incorrect-date=Invalid date. Please fill in all the input fields correctly
for the date.
date-not-null=Date is required.

Good Luck


-----
Do not confuse motion for action.
--
View this message in context: 
http://tapestry.1045711.n5.nabble.com/Date-Field-with-day-month-year-and-datepicker-component-tp4618810p4630542.html
Sent from the Tapestry - User mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to