I completely agree with your statements regarding a javascript requirement. My only issue is a strict user interface issue. Meaning that the current implementation goes against user interface guidelines, specifically that "enter" should submit a form, not cancel it.
Perhaps the entire thing could be wrapped in a <noscript> tag to display the default (non-javascript behaviour) in the case that the user has javascript turned off. Would something like that be more acceptable? I haven't followed the JSTL vs Struts tag debate for a long time, so I'm not quite sure how they integrate, but then again, there's always something new to learn... : ) Thanks... On Tue, 22 Jun 2004 22:03:03 +0100, Niall Pemberton <[EMAIL PROTECTED]> wrote: > > 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] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]