You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Julian Sinai (JIRA)" <ji...@apache.org> on 2010/03/10 19:41:27 UTC
[jira] Created: (WICKET-2772) Generate wicketpath attribute for
RadioChoice
Generate wicketpath attribute for RadioChoice
---------------------------------------------
Key: WICKET-2772
URL: https://issues.apache.org/jira/browse/WICKET-2772
Project: Wicket
Issue Type: Bug
Components: wicket
Affects Versions: 1.4.7
Reporter: Julian Sinai
Priority: Minor
Fix For: 1.4.7
Wicket has a convenient feature to make using Selenium IDE easy to use. By adding getDebugSettings().setOutputComponentPath(true) to your application, the wicketpath attribute is emitted.
Unfortunately, that does not hold for the radios inside a RadioChoice because they are not proper Components.
Also unfortunately, RadioChoice.onComponentTagBody() is final.
The result is that you either have to write additional xpath selectors, or clone RadioChoice and extend AjaxFormChoiceComponentUpdatingBehavior.
The following code, added to RadioChoice.onComponentTagBody(), solves the problem. It is similar to the same code in Component, but appends a bit more to the path for the input tags:
if (getApplication().getDebugSettings().isOutputComponentPath())
{
String path = getPageRelativePath();
path = path.replace("_", "__");
path = path.replace(":", "_");
buffer.append(" wicketpath=\"")
.append(path)
.append("_input_")
.append(index)
.append("\"");
}
The full code for RadioChoice.onComponentTagBody() is as follows:
@Override
protected final void onComponentTagBody(final MarkupStream markupStream,
final ComponentTag openTag)
{
// Iterate through choices
final List<? extends T> choices = getChoices();
// Buffer to hold generated body
final AppendingStringBuffer buffer = new AppendingStringBuffer((choices.size() + 1) * 70);
// The selected value
final String selected = getValue();
// Loop through choices
for (int index = 0; index < choices.size(); index++)
{
// Get next choice
final T choice = choices.get(index);
Object displayValue = getChoiceRenderer().getDisplayValue(choice);
Class<?> objectClass = (displayValue == null ? null : displayValue.getClass());
// Get label for choice
String label = "";
if (objectClass != null && objectClass != String.class)
{
final IConverter converter = getConverter(objectClass);
label = converter.convertToString(displayValue, getLocale());
}
else if (displayValue != null)
{
label = displayValue.toString();
}
// If there is a display value for the choice, then we know that the
// choice is automatic in some way. If label is /null/ then we know
// that the choice is a manually created radio tag at some random
// location in the page markup!
if (label != null)
{
// Append option suffix
buffer.append(getPrefix());
String id = getChoiceRenderer().getIdValue(choice, index);
final String idAttr = getMarkupId() + "-" + id;
boolean enabled = isEnabledInHierarchy() && !isDisabled(choice, index, selected);
// Add radio tag
buffer.append("<input name=\"")
.append(getInputName())
.append("\"")
.append(" type=\"radio\"")
.append((isSelected(choice, index, selected) ? " checked=\"checked\"" : ""))
.append((enabled ? "" : " disabled=\"disabled\""))
.append(" value=\"")
.append(id)
.append("\" id=\"")
.append(idAttr)
.append("\"");
// Should a roundtrip be made (have onSelectionChanged called)
// when the option is clicked?
if (wantOnSelectionChangedNotifications())
{
CharSequence url = urlFor(IOnChangeListener.INTERFACE);
Form<?> form = findParent(Form.class);
if (form != null)
{
RequestContext rc = RequestContext.get();
if (rc.isPortletRequest())
{
// restore url back to real wicket path as its going to be interpreted
// by the form itself
url = ((PortletRequestContext)rc).getLastEncodedPath();
}
buffer.append(" onclick=\"").append(form.getJsForInterfaceUrl(url)).append(
";\"");
}
else
{
// TODO: following doesn't work with portlets, should be posted to a dynamic
// hidden form
// with an ActionURL or something
// NOTE: do not encode the url as that would give
// invalid JavaScript
buffer.append(" onclick=\"window.location.href='")
.append(url)
.append(
(url.toString().indexOf('?') > -1 ? "&" : "?") + getInputName())
.append("=")
.append(id)
.append("';\"");
}
}
// ADDED BY JULIAN TO OUTPUT THE WICKET:PATH ATTRIBUTE TO EASE SELENIUM TESTING.
if (getApplication().getDebugSettings().isOutputComponentPath())
{
String path = getPageRelativePath();
path = path.replace("_", "__");
path = path.replace(":", "_");
buffer.append(" wicketpath=\"")
.append(path)
.append("_input_")
.append(index)
.append("\"");
}
buffer.append("/>");
// Add label for radio button
String display = label;
if (localizeDisplayValues())
{
display = getLocalizer().getString(label, this, label);
}
final CharSequence escaped;
if (getEscapeModelStrings())
{
escaped = Strings.escapeMarkup(display, false, true);
}
else
{
escaped = display;
}
buffer.append("<label for=\"").append(idAttr).append("\">").append(escaped).append(
"</label>");
// Append option suffix
buffer.append(getSuffix());
}
}
// Replace body
replaceComponentTagBody(markupStream, openTag, buffer);
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Resolved: (WICKET-2772) Generate wicketpath attribute for
RadioChoice
Posted by "Juergen Donnerstag (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2772?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Juergen Donnerstag resolved WICKET-2772.
----------------------------------------
Resolution: Fixed
Fix Version/s: (was: 1.4.7)
1.5-M1
1.4.8
Assignee: Juergen Donnerstag
thanks
> Generate wicketpath attribute for RadioChoice
> ---------------------------------------------
>
> Key: WICKET-2772
> URL: https://issues.apache.org/jira/browse/WICKET-2772
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 1.4.7
> Reporter: Julian Sinai
> Assignee: Juergen Donnerstag
> Priority: Minor
> Fix For: 1.4.8, 1.5-M1
>
>
> Wicket has a convenient feature to make using Selenium IDE easy to use. By adding getDebugSettings().setOutputComponentPath(true) to your application, the wicketpath attribute is emitted.
> Unfortunately, that does not hold for the radios inside a RadioChoice because they are not proper Components.
> Also unfortunately, RadioChoice.onComponentTagBody() is final.
> The result is that you either have to write additional xpath selectors, or clone RadioChoice and extend AjaxFormChoiceComponentUpdatingBehavior.
> The following code, added to RadioChoice.onComponentTagBody(), solves the problem. It is similar to the same code in Component, but appends a bit more to the path for the input tags:
> if (getApplication().getDebugSettings().isOutputComponentPath())
> {
> String path = getPageRelativePath();
> path = path.replace("_", "__");
> path = path.replace(":", "_");
> buffer.append(" wicketpath=\"")
> .append(path)
> .append("_input_")
> .append(index)
> .append("\"");
> }
> The full code for RadioChoice.onComponentTagBody() is as follows:
> @Override
> protected final void onComponentTagBody(final MarkupStream markupStream,
> final ComponentTag openTag)
> {
> // Iterate through choices
> final List<? extends T> choices = getChoices();
> // Buffer to hold generated body
> final AppendingStringBuffer buffer = new AppendingStringBuffer((choices.size() + 1) * 70);
> // The selected value
> final String selected = getValue();
> // Loop through choices
> for (int index = 0; index < choices.size(); index++)
> {
> // Get next choice
> final T choice = choices.get(index);
> Object displayValue = getChoiceRenderer().getDisplayValue(choice);
> Class<?> objectClass = (displayValue == null ? null : displayValue.getClass());
> // Get label for choice
> String label = "";
> if (objectClass != null && objectClass != String.class)
> {
> final IConverter converter = getConverter(objectClass);
> label = converter.convertToString(displayValue, getLocale());
> }
> else if (displayValue != null)
> {
> label = displayValue.toString();
> }
> // If there is a display value for the choice, then we know that the
> // choice is automatic in some way. If label is /null/ then we know
> // that the choice is a manually created radio tag at some random
> // location in the page markup!
> if (label != null)
> {
> // Append option suffix
> buffer.append(getPrefix());
> String id = getChoiceRenderer().getIdValue(choice, index);
> final String idAttr = getMarkupId() + "-" + id;
> boolean enabled = isEnabledInHierarchy() && !isDisabled(choice, index, selected);
> // Add radio tag
> buffer.append("<input name=\"")
> .append(getInputName())
> .append("\"")
> .append(" type=\"radio\"")
> .append((isSelected(choice, index, selected) ? " checked=\"checked\"" : ""))
> .append((enabled ? "" : " disabled=\"disabled\""))
> .append(" value=\"")
> .append(id)
> .append("\" id=\"")
> .append(idAttr)
> .append("\"");
> // Should a roundtrip be made (have onSelectionChanged called)
> // when the option is clicked?
> if (wantOnSelectionChangedNotifications())
> {
> CharSequence url = urlFor(IOnChangeListener.INTERFACE);
> Form<?> form = findParent(Form.class);
> if (form != null)
> {
> RequestContext rc = RequestContext.get();
> if (rc.isPortletRequest())
> {
> // restore url back to real wicket path as its going to be interpreted
> // by the form itself
> url = ((PortletRequestContext)rc).getLastEncodedPath();
> }
> buffer.append(" onclick=\"").append(form.getJsForInterfaceUrl(url)).append(
> ";\"");
> }
> else
> {
> // TODO: following doesn't work with portlets, should be posted to a dynamic
> // hidden form
> // with an ActionURL or something
> // NOTE: do not encode the url as that would give
> // invalid JavaScript
> buffer.append(" onclick=\"window.location.href='")
> .append(url)
> .append(
> (url.toString().indexOf('?') > -1 ? "&" : "?") + getInputName())
> .append("=")
> .append(id)
> .append("';\"");
> }
> }
> // ADDED BY JULIAN TO OUTPUT THE WICKET:PATH ATTRIBUTE TO EASE SELENIUM TESTING.
> if (getApplication().getDebugSettings().isOutputComponentPath())
> {
> String path = getPageRelativePath();
> path = path.replace("_", "__");
> path = path.replace(":", "_");
> buffer.append(" wicketpath=\"")
> .append(path)
> .append("_input_")
> .append(index)
> .append("\"");
> }
> buffer.append("/>");
> // Add label for radio button
> String display = label;
> if (localizeDisplayValues())
> {
> display = getLocalizer().getString(label, this, label);
> }
> final CharSequence escaped;
> if (getEscapeModelStrings())
> {
> escaped = Strings.escapeMarkup(display, false, true);
> }
> else
> {
> escaped = display;
> }
> buffer.append("<label for=\"").append(idAttr).append("\">").append(escaped).append(
> "</label>");
> // Append option suffix
> buffer.append(getSuffix());
> }
> }
> // Replace body
> replaceComponentTagBody(markupStream, openTag, buffer);
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
[jira] Commented: (WICKET-2772) Generate wicketpath attribute for
RadioChoice
Posted by "Hudson (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2772?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12924304#action_12924304 ]
Hudson commented on WICKET-2772:
--------------------------------
Integrated in Apache Wicket 1.5.x #449 (See [https://hudson.apache.org/hudson/job/Apache%20Wicket%201.5.x/449/])
WICKET-2776 Enhancing RadioChoice input items with individual title and css class attributes
Merge from 1.4.x:
and WICKET-2772
Issue: WICKET-2776
Files Changed
MODIFY /wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
ASF #922649 Sat Mar 13 13:50:47 EST 2010 jdonnerstag added additional attributes to allow for index dependent attributes
Issue: WICKET-2776
Files Changed
MODIFY /wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
> Generate wicketpath attribute for RadioChoice
> ---------------------------------------------
>
> Key: WICKET-2772
> URL: https://issues.apache.org/jira/browse/WICKET-2772
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 1.4.7
> Reporter: Julian Sinai
> Assignee: Juergen Donnerstag
> Priority: Minor
> Fix For: 1.4.8, 1.5-M1
>
>
> Wicket has a convenient feature to make using Selenium IDE easy to use. By adding getDebugSettings().setOutputComponentPath(true) to your application, the wicketpath attribute is emitted.
> Unfortunately, that does not hold for the radios inside a RadioChoice because they are not proper Components.
> Also unfortunately, RadioChoice.onComponentTagBody() is final.
> The result is that you either have to write additional xpath selectors, or clone RadioChoice and extend AjaxFormChoiceComponentUpdatingBehavior.
> The following code, added to RadioChoice.onComponentTagBody(), solves the problem. It is similar to the same code in Component, but appends a bit more to the path for the input tags:
> if (getApplication().getDebugSettings().isOutputComponentPath())
> {
> String path = getPageRelativePath();
> path = path.replace("_", "__");
> path = path.replace(":", "_");
> buffer.append(" wicketpath=\"")
> .append(path)
> .append("_input_")
> .append(index)
> .append("\"");
> }
> The full code for RadioChoice.onComponentTagBody() is as follows:
> @Override
> protected final void onComponentTagBody(final MarkupStream markupStream,
> final ComponentTag openTag)
> {
> // Iterate through choices
> final List<? extends T> choices = getChoices();
> // Buffer to hold generated body
> final AppendingStringBuffer buffer = new AppendingStringBuffer((choices.size() + 1) * 70);
> // The selected value
> final String selected = getValue();
> // Loop through choices
> for (int index = 0; index < choices.size(); index++)
> {
> // Get next choice
> final T choice = choices.get(index);
> Object displayValue = getChoiceRenderer().getDisplayValue(choice);
> Class<?> objectClass = (displayValue == null ? null : displayValue.getClass());
> // Get label for choice
> String label = "";
> if (objectClass != null && objectClass != String.class)
> {
> final IConverter converter = getConverter(objectClass);
> label = converter.convertToString(displayValue, getLocale());
> }
> else if (displayValue != null)
> {
> label = displayValue.toString();
> }
> // If there is a display value for the choice, then we know that the
> // choice is automatic in some way. If label is /null/ then we know
> // that the choice is a manually created radio tag at some random
> // location in the page markup!
> if (label != null)
> {
> // Append option suffix
> buffer.append(getPrefix());
> String id = getChoiceRenderer().getIdValue(choice, index);
> final String idAttr = getMarkupId() + "-" + id;
> boolean enabled = isEnabledInHierarchy() && !isDisabled(choice, index, selected);
> // Add radio tag
> buffer.append("<input name=\"")
> .append(getInputName())
> .append("\"")
> .append(" type=\"radio\"")
> .append((isSelected(choice, index, selected) ? " checked=\"checked\"" : ""))
> .append((enabled ? "" : " disabled=\"disabled\""))
> .append(" value=\"")
> .append(id)
> .append("\" id=\"")
> .append(idAttr)
> .append("\"");
> // Should a roundtrip be made (have onSelectionChanged called)
> // when the option is clicked?
> if (wantOnSelectionChangedNotifications())
> {
> CharSequence url = urlFor(IOnChangeListener.INTERFACE);
> Form<?> form = findParent(Form.class);
> if (form != null)
> {
> RequestContext rc = RequestContext.get();
> if (rc.isPortletRequest())
> {
> // restore url back to real wicket path as its going to be interpreted
> // by the form itself
> url = ((PortletRequestContext)rc).getLastEncodedPath();
> }
> buffer.append(" onclick=\"").append(form.getJsForInterfaceUrl(url)).append(
> ";\"");
> }
> else
> {
> // TODO: following doesn't work with portlets, should be posted to a dynamic
> // hidden form
> // with an ActionURL or something
> // NOTE: do not encode the url as that would give
> // invalid JavaScript
> buffer.append(" onclick=\"window.location.href='")
> .append(url)
> .append(
> (url.toString().indexOf('?') > -1 ? "&" : "?") + getInputName())
> .append("=")
> .append(id)
> .append("';\"");
> }
> }
> // ADDED BY JULIAN TO OUTPUT THE WICKET:PATH ATTRIBUTE TO EASE SELENIUM TESTING.
> if (getApplication().getDebugSettings().isOutputComponentPath())
> {
> String path = getPageRelativePath();
> path = path.replace("_", "__");
> path = path.replace(":", "_");
> buffer.append(" wicketpath=\"")
> .append(path)
> .append("_input_")
> .append(index)
> .append("\"");
> }
> buffer.append("/>");
> // Add label for radio button
> String display = label;
> if (localizeDisplayValues())
> {
> display = getLocalizer().getString(label, this, label);
> }
> final CharSequence escaped;
> if (getEscapeModelStrings())
> {
> escaped = Strings.escapeMarkup(display, false, true);
> }
> else
> {
> escaped = display;
> }
> buffer.append("<label for=\"").append(idAttr).append("\">").append(escaped).append(
> "</label>");
> // Append option suffix
> buffer.append(getSuffix());
> }
> }
> // Replace body
> replaceComponentTagBody(markupStream, openTag, buffer);
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.