You're not out of line at all - this list is the place to discuss
enhancement requests and requests which come with a patch attached are more
welcome than those without :-)

Having said that, I'm against this change. If the user disables javascript
in their browser then the cancel button no longer works. Even with your
enhanced patch to turn on/off the additional behaviour  by setting a new
javascript attribute to true/false, the fact remains that the cancel button
would stop working with javascript disabled. I bet we would have questions
every week titled "Cancel Button Doesn't Work" on the user list and it will
get boring typing the same "Did you set the javascript='true' attribute etc
etc."

You might say that the same arguments is true for the existing javascript in
the CancelTag  (i.e. onclick="bCancel=true") but I wouldn't agree with that.
Although that javascript would also not work with javascript disabled, the
fact is that it interacts with the javascript rendered by the validator
framework - that javascript IMO is an optional extra because with javascript
disabled the validator framework's server side validation would still work
and the system would not be *broken*.

Another point about the issue you are trying to resolve is that its a
browser/html isssue and nothing to do with how Struts works. If we put in
this patch to implement some custom javascript behaviour then what about the
next person who wants their own funky bit of javascript in Struts to
implement their custom behaviour?

If you look at the CancelTag it doesn't actually do much "Struts" wise - you
could easily do what it does directly in html (including the behaviour you
want), it just saves keystrokes. Maybe Jakarta Taglibs would be a better
place for this tag and the behaviour that you want - they have an "input"
tags component.

http://jakarta.apache.org/taglibs/doc/input-doc/intro.html

When Struts was *born* there wasn't much else around - but now many of the
Struts tags can be replaced with JSTL and the current view (which I agree
with) seems to be that the tags should be split into *core* Struts tags -
tags which implement behaviour specific to Struts and the rest which will be
kept on as "legacy" tags. The idea being that we should only continue to
develop *core* tags. IMO the cancel tag falls into the later category -
others may differ though.

Niall

----- Original Message ----- 
From: "Marcus Breese" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, June 22, 2004 7:22 PM
Subject: PATCH: html:cancel tag. Made a javascript version for submitting


> I'm submitting this again here because my Bugzilla patch hasn't gone
> anywhere, so I don't know if anyone likes this idea or not.
> Basically, if the cancel button is after the submit button on a form,
> and the user hits 'enter' to submit the form, the the cancel button is
> the one that is activated, causing the form to be cancelled.  So, I
> added a "javascript" property to the cancel button, that when true
> causes the javascript button to be rendered as a combination html
> button and a hidden text field that are linked through a javascript
> onclick event.  It is completely backwards compatible and doesn't
> break any current pages (that I know of).
>
> If I'm completely out of line sending this here, I appologize...
>
> Bugzilla link: http://issues.apache.org/bugzilla/show_bug.cgi?id=25860
>
> PATCH
> ====================
>
> Index: doc/userGuide/struts-html.xml
> ===================================================================
> RCS file: /home/cvspublic/jakarta-struts/doc/userGuide/struts-html.xml,v
> retrieving revision 1.67
> diff -u -r1.67 struts-html.xml
> --- doc/userGuide/struts-html.xml 2 Jan 2004 11:55:38 -0000 1.67
> +++ doc/userGuide/struts-html.xml 3 Jan 2004 00:44:06 -0000
> @@ -410,6 +410,16 @@
>            disabled.
>            </info>
>          </attribute>
> +        <attribute>
> +          <name>javascript</name>
> +          <required>false</required>
> +          <rtexprvalue>true</rtexprvalue>
> +          <info>
> +          Set to <code>true</code> if this input field should be
> +          rendered using a javascript button/hidden field combination
> +          as opposed to a submit button.
> +          </info>
> +        </attribute>
>
>          <attribute>
>              <name>onblur</name>
> Index: src/share/org/apache/struts/taglib/html/CancelTag.java
> ===================================================================
> RCS file:
/home/cvspublic/jakarta-struts/src/share/org/apache/struts/taglib/html/Cance
lTag.java,v
> retrieving revision 1.13
> diff -u -r1.13 CancelTag.java
> --- src/share/org/apache/struts/taglib/html/CancelTag.java 31 Jul 2003
> 00:19:04 -0000 1.13
> +++ src/share/org/apache/struts/taglib/html/CancelTag.java 3 Jan 2004
> 00:44:06 -0000
> @@ -106,6 +106,12 @@
>       */
>      protected String value = null;
>
> + /**
> + * Should this be rendered using javascript ?
> + */
> +
> + protected String javascript = null;
> +
>
>      // ------------------------------------------------------------- 
Properties
>
> @@ -144,6 +150,35 @@
>      }
>
>
> +
> + /**
> + * return the javascript value
> + */
> + public String getJavascript() {
> + return javascript;
> + }
> +
> + /**
> + * @param javascript
> + */
> + public void setJavascript(String javascript) {
> + this.javascript = javascript;
> + }
> +
> + /**
> + *
> + * Return a boolean for if this should be rendered using javascript
> + */
> +
> + public boolean renderJavascript() {
> + if (javascript!=null && javascript.toUpperCase().equals("TRUE")) {
> + return true;
> + }
> + return false;
> + }
> +
> +
> +
>      // --------------------------------------------------------- Public
Methods
>
>
> @@ -192,10 +227,14 @@
>
>          // Generate an HTML element
>          StringBuffer results = new StringBuffer();
> -        results.append("<input type=\"submit\"");
> -        results.append(" name=\"");
> -        results.append(property);
> -        results.append("\"");
> + if (renderJavascript()) {
> + results.append("<input type=\"button\"");
> + } else {
> + results.append("<input type=\"submit\"");
> + results.append(" name=\"");
> + results.append(property);
> + results.append("\"");
> + }
>          if (accesskey != null) {
>              results.append(" accesskey=\"");
>              results.append(accesskey);
> @@ -212,12 +251,33 @@
>          results.append(prepareEventHandlers());
>          results.append(prepareStyles());
>
> -        // if no onclick event was provided, put in the cancel script
> -        if(results.toString().indexOf("onclick=")==-1){
> -          results.append(" onclick=\"bCancel=true;\"");
> -        }
> -
> -        results.append(getElementClose());
> + if (renderJavascript()) {
> + String insertStr = "
> document.getElementById('"+property+"').value='Cancel'; ";
> + insertStr += "
> document.getElementById('"+property+"').name='"+property+"'; ";
> + insertStr += " this.form.submit(); ";
> +
> + // if no onclick event was provided, put in the cancel script
> + if(results.toString().indexOf("onclick=")==-1){
> +   results.append(" onclick=\"bCancel=true; ");
> +   results.append(insertStr);
> + } else {
> + int onclickPos = results.toString().indexOf("onclick=\"");
> + int nextQuotePos= results.toString().indexOf("\"",onclickPos+10);
> + results.insert(nextQuotePos,insertStr);
> + }
> +
> + results.append(getElementClose());
> +
> + results.append("<input type=\"hidden\" id=\""+property+"\"
value=\"\">");
> + } else {
> + // if no onclick event was provided, put in the cancel script
> +
> + if(results.toString().indexOf("onclick=")==-1){
> + results.append(" onclick=\"bCancel=true;\" ");
> + }
> + results.append(getElementClose());
> +
> + }
>
>          // Render this element to our writer
>          TagUtils.getInstance().write(pageContext, results.toString());
> @@ -233,12 +293,14 @@
>       */
>      public void release() {
>
> - super.release();
> - property = Constants.CANCEL_PROPERTY;
> + super.release();
> + property = Constants.CANCEL_PROPERTY;
>          text = null;
> - value = null;
> + value = null;
> + javascript=null;
>
>      }
>
>
>  }
> +
>
> ---------------------------------------------------------------------
> 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]

Reply via email to