There is no client side date validator in the default themes.
I added a basic one in the xhtml theme for use with the
datetimepicker; it has a hardcoded date format though (dd/MM/yyyy).
To add it, open your xhtml theme's form-close-validate.ftl file, and
as the last option add the following lines:
<#elseif validator.validatorType = "date">
if (continueValidation && field.value != null &&
field.value != "" && field.value.replace(/^\s+|\s+$/g,"").length != 0)
{
var datePicker = dojo.widget.byId(field.parentNode.id);
var value = datePicker.getDate();
<#if validator.min?exists>
var minValue =
dojo.date.parse("${validator.min?date}", {datePattern: 'dd/MM/yyyy'});
<#else>
var minValue = null;
</#if>
<#if validator.max?exists>
var maxValue =
dojo.date.parse("${validator.max?date}", {datePattern:
'dd/MM/yyyy'});;
<#else>
var maxValue = null;
</#if>
if ((minValue != null && value < minValue) ||
(maxValue != null && value > maxValue)) {
addError(field, error);
errors = true;
<#if validator.shortCircuit>continueValidation =
false;</#if>
}
}
</#if>
2008/9/11 Kawczynski, David <[EMAIL PROTECTED]>:
> I am using the datetimepicker on a form with client-side validation
> enabled.
> Form submissions with a blank datetime field should result in validation
>
> being run against that field. This is not the case -- this field is
> only
> validated on the server. No other form field uses the dojo, and they
> are all
> validated on the client-sided correctly. What do I have to do so the
> datetimepicker field receives client-sided validation like the other
> fields?
> (I'm using struts 2.1.2 with xwork 2.1.1)
>
> Thanks in advance,
> -dave
>
>
>
> =======================================================================
> =======================================================================
> ==THE struts.xml:
>
> <!DOCTYPE struts PUBLIC
> "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
> "http://struts.apache.org/dtds/struts-2.0.dtd">
>
> <struts>
> <include file="struts-default.xml"/>
> <constant name="struts.action.extension" value="action" />
> <constant name="struts.devMode" value="true" />
> <constant name="struts.multipart.maxSize" value="2097152" />
> <constant name="struts.configuration.xml.reload" value="true" />
>
> <package name="siterequest"
> namespace="/admin/siterequest"
> extends="struts-default">
> <default-interceptor-ref name="defaultStack"/>
> <action name="save"
> method="save"
> class="siterequest.SiteRequestAction">
> <result>/admin/siterequest/request_form_thanks.jsp</result>
> <result name="input">/admin/siterequest/request_form.jsp</result>
> <result
> name="failure">/admin/siterequest/request_form.jsp</result>
> </action>
> </package>
>
> </struts>
>
>
>
> =======================================================================
> =======================================================================
> ==THE SiteRequestAction-save-validation.xml:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
> 1.0.2//EN"
>
> "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
> <validators>
> <field name="siteRequest.isid">
> <field-validator type="requiredstring">
> <param name="trim">true</param>
> <message>"Submitter ISID" is required</message>
> </field-validator>
> <field-validator type="stringlength">
> <param name="maxLength">8</param>
> <message>"Submitter ISID" must be 8 characters or less</message>
> </field-validator>
> </field>
> <field name="siteRequest.businessArea">
> <field-validator type="requiredstring">
> <param name="trim">true</param>
> <message>"Business Area" is required</message>
> </field-validator>
> </field>
> <field name="siteRequest.projectTitle">
> <field-validator type="requiredstring">
> <param name="trim">true</param>
> <message>"Project Title" is required</message>
> </field-validator>
> <field-validator type="stringlength">
> <param name="maxLength">200</param>
> <message>"Project Title" must be 200 characters or less</message>
> </field-validator>
> </field>
> <field name="siteRequest.description">
> <field-validator type="requiredstring">
> <param name="trim">true</param>
> <message>"Description" is required</message>
> </field-validator>
> <field-validator type="stringlength">
> <param name="maxLength">2000</param>
> <message>"Description" must be 2000 characters or less</message>
> </field-validator>
> </field>
> <field name="siteRequest.siteName">
> <field-validator type="requiredstring">
> <param name="trim">true</param>
> <message>"Site Name" is required</message>
> </field-validator>
> <field-validator type="stringlength">
> <param name="maxLength">200</param>
> <message>"Site Name" must be 200 characters or less</message>
> </field-validator>
> </field>
> <field name="siteRequest.issueType">
> <field-validator type="requiredstring">
> <param name="trim">true</param>
> <message>"Issue Type" is required</message>
> </field-validator>
> </field>
> <field name="siteRequest.releaseDate">
> <field-validator type="required">
> <message>"Desired Release Date" is required.</message>
> </field-validator>
> <field-validator type="date">
> <param name="min">08/01/2008</param>
> <param name="max">01/01/2030</param>
> <message>Invalid "Desired Release Date"</message>
> </field-validator>
> </field>
> </validators>
>
>
>
> =======================================================================
> =======================================================================
> ==THE jsp page:
>
> <%@ taglib prefix="s" uri="/struts-tags" %>
> <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
> <html>
> <head>
> <title>Change Request Submission Form</title>
> <sx:head/>
> <s:head/>
> <link rel="stylesheet" href="/admin/css/site-request.css"
> type="text/css" />
> </head>
> <body>
> <div id="content">
> <h1>Change Request Submission Form</h1>
>
> <p>Please complete the form below to submit a request to the
> Global
> Solutions Delivery group. You will receive a response within 2
> business
> days.</p>
>
> <p>Items marked with an asterisk (<span class="required">*</span>)
> are
> required.</p>
>
> <s:form action="save"
> namespace="/admin/siterequest"
> name="requestform"
> method="post"
> enctype="multipart/form-data"
> theme="xhtml"
> validate="true">
> <table>
> <s:textfield name="siteRequest.isid"
> label="Submitter ISID"
> maxlength="8"
> required="true" />
> <s:select name="siteRequest.businessArea"
> label="Business Area"
> list="businessAreaList"
> required="true"/>
> <s:textfield name="siteRequest.projectTitle"
> label="Project Title"
> maxlength="200"
> required="true" />
> <s:textarea name="siteRequest.description"
> label="Description"
> cols="34"
> rows="5"
> required="true" />
> <s:textfield name="siteRequest.siteName"
> label="Site Name"
> maxlength="200"
> required="true" />
> <s:select name="siteRequest.issueType"
> label="Issue Type"
> list="issueTypeList"
> required="true" />
> <sx:datetimepicker name="siteRequest.releaseDate"
> label="Desired Release Date"
> displayFormat="MM/dd/yyyy"
> required="true" />
> <s:file name="siteRequest.upload"
> label="Attachment"
> required="false" />
> <s:submit cssStyle="width:80px; align:left;"/>
> </table>
> </s:form>
> </div>
>
> </body>
> </html>
>
>
>
> =======================================================================
> =======================================================================
> ==THE action class:
>
> package siterequest;
> import java.util.Map;
> import org.apache.log4j.Logger;
> import org.apache.struts2.interceptor.SessionAware;
> import com.opensymphony.xwork2.ActionSupport;
> import com.opensymphony.xwork2.Preparable;
>
> public class SiteRequestAction extends ActionSupport
> implements Preparable, SessionAware {
>
> /**
> * Performs all functionality required when saving a [EMAIL PROTECTED]
> SiteRequest}.
> *
> * @return
> * a String indicating "success" or "failure". If "failure",
> * this action's [EMAIL PROTECTED] #exception} property will be
> populated.
> */
> public String save() {
> try {
> this.siteRequestFacade.save(this.siteRequest);
> return "success";
> }
> catch (Throwable exception) {
> logger.error("Unable to save SiteRequest: ", exception);
> setException(exception);
> return "failure";
> }
> }
>
> public void prepare() throws Exception {
> this.siteRequestFacade = new SiteRequestFacade();
> this.siteRequest = new SiteRequest();
> this.siteRequestList = new ArrayList<SiteRequest>();
> }
>
> public void setSession(Map session) {
> this.session = session;
> }
>
> public SiteRequest getSiteRequest() {
> return siteRequest;
> }
>
> public void setSiteRequest(SiteRequest siteRequest) {
> this.siteRequest = siteRequest;
> }
>
> private Map session;
> private SiteRequest siteRequest;
> private SiteRequestFacade siteRequestFacade;
> private Throwable exception;
> private Logger logger = Logger.getLogger(this.getClass());
> }
>
>
>
> =======================================================================
> =======================================================================
> ==THE action form class:
>
> package siterequest;
> import java.io.File;
> import java.io.FileInputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.sql.Blob;
> import java.sql.SQLException;
> import java.util.Date;
> import org.hibernate.Hibernate;
>
> public class SiteRequest implements java.io.Serializable {
>
> private static final long serialVersionUID = 1L;
> private Long siteRequestId;
> private String isid;
> private String businessArea;
> private String projectTitle;
> private String description;
> private String siteName;
> private String issueType;
> private Date releaseDate;
> private String creator;
> private Date creationDate;
> private String updater;
> private Date updateDate;
> private File upload;
> private String uploadFileName;
> private String uploadContentType;
> private Blob attachment;
>
>
> public SiteRequest() {
> }
>
> public String getBusinessArea() {
> return businessArea;
> }
>
> public void setBusinessArea(String businessArea) {
> this.businessArea = businessArea;
> }
>
> public Date getCreationDate() {
> return creationDate;
> }
>
> public void setCreationDate(Date creationDate) {
> this.creationDate = creationDate;
> }
>
> public String getCreator() {
> return creator;
> }
>
> public void setCreator(String creator) {
> this.creator = creator;
> }
>
> public String getDescription() {
> return description;
> }
>
> public void setDescription(String description) {
> this.description = description;
> }
>
> public String getIsid() {
> return isid;
> }
>
> public void setIsid(String isid) {
> this.isid = isid;
> }
>
> public String getIssueType() {
> return issueType;
> }
>
> public void setIssueType(String issueType) {
> this.issueType = issueType;
> }
>
> public String getProjectTitle() {
> return projectTitle;
> }
>
> public void setProjectTitle(String projectTitle) {
> this.projectTitle = projectTitle;
> }
>
> public Date getReleaseDate() {
> return releaseDate;
> }
>
> public void setReleaseDate(Date releaseDate) {
> this.releaseDate = releaseDate;
> }
>
> public String getSiteName() {
> return siteName;
> }
>
> public void setSiteName(String siteName) {
> this.siteName = siteName;
> }
>
> public Long getSiteRequestId() {
> return siteRequestId;
> }
>
> public void setSiteRequestId(Long siteRequestId) {
> this.siteRequestId = siteRequestId;
> }
>
> public Date getUpdateDate() {
> return updateDate;
> }
>
> public void setUpdateDate(Date updateDate) {
> this.updateDate = updateDate;
> }
>
> public String getUpdater() {
> return updater;
> }
>
> public void setUpdater(String updater) {
> this.updater = updater;
> }
>
> public File getUpload() {
> return upload;
> }
>
> public void setUpload(File upload) {
> this.upload = upload;
> }
>
> public String getUploadContentType() {
> return uploadContentType;
> }
>
> public void setUploadContentType(String uploadContentType) {
> this.uploadContentType = uploadContentType;
> }
>
> public String getUploadFileName() {
> return uploadFileName;
> }
>
> public void setUploadFileName(String uploadFileName) {
> this.uploadFileName = uploadFileName;
> }
>
> public Blob getAttachment() {
> try {
> if(this.attachment != null) {
> return this.attachment;
> }
> else {
> if(this.upload != null) {
> return Hibernate.createBlob(new FileInputStream(this.upload));
> }
> else return null;
> }
> }
> catch (IOException ioException) {
> ioException.printStackTrace();
> return null;
> }
> }
>
> public void setAttachment(Blob attachment) {
> this.attachment = attachment;
> }
>
> public InputStream getAttachmentStream() throws SQLException {
> return (this.attachment==null ? null :
> this.attachment.getBinaryStream());
> }
>
> public void setAttachmentStream(InputStream attachmentStream) throws
> IOException {
> this.attachment = Hibernate.createBlob(attachmentStream);
> }
> }
> Notice: This e-mail message, together with any attachments, contains
> information of Merck & Co., Inc. (One Merck Drive, Whitehouse Station,
> New Jersey, USA 08889), and/or its affiliates (which may be known
> outside the United States as Merck Frosst, Merck Sharp & Dohme or
> MSD and in Japan, as Banyu - direct contact information for affiliates is
> available at http://www.merck.com/contact/contacts.html) that may be
> confidential, proprietary copyrighted and/or legally privileged. It is
> intended solely for the use of the individual or entity named on this
> message. If you are not the intended recipient, and have received this
> message in error, please notify us immediately by reply e-mail and
> then delete it from your system.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]