s:tableSuggestAjax - s:outputText 'forValue' attribute works only with html SELECT tags ----------------------------------------------------------------------------------------
Key: TOMAHAWK-1394
URL: https://issues.apache.org/jira/browse/TOMAHAWK-1394
Project: MyFaces Tomahawk
Issue Type: Improvement
Components: AJAX Form Components
Affects Versions: 1.1.8
Environment: Tomahawk 1.1.8, Tomahawk Sandbox 1.1.9 SNAPSHOT
Reporter: Berinde Razvan
I've used the tableSuggestAjax tag.
I wanted to place an inputHidden tag in order to input the id from my Accounts
and not their names in order to search the database faster.
In the Sandbox Tag Library Documentation for the s:outputText tag I found the
following explanation for the forValue attribute: "Specify the id of the dom
element where the value should be put in. This value is also included in the
suggested table, but only in a hidden span element following the span for the
label in one row."
The forValue attribute only works with html SELECT tags. Another problem is the
fact that you cannot have both "for" and "forValue" attributes in the same
outputText tag, but this is not critical.
You can see my code, the source of the problem and a fix for the problem.
Code Snippet:
<t:inputHidden id="accountId" value="#{Bean.suggestedAccountId}" />
<s:tableSuggestAjax
var="account"
id="accountName"
startRequest="2"
value="#{Bean.suggestedAccountName}"
betweenKeyUp="500"
charset="utf-8"
suggestedItemsMethod="#{Bean.suggestValues}"
maxSuggestedItems="10">
<t:column>
<f:facet name="header">
<s:outputText value="Account" />
</f:facet>
<s:outputText
for="accountName"
label="#{account.name}" />
</t:column>
<t:column>
<f:facet name="header">
<s:outputText value="Description" />
</f:facet>
<s:outputText
label="#{account.description}"
forValue="accountId"
value ="#{account.id}" />
</t:column>
</s:tableSuggestAjax>
I wanted to set the account ID in the inputHidden field;
It won't work this way because of the
org\apache\myfaces\custom\dojoextensions\resource\widget\TableSuggest.js.
In this JavaScript the following code only works with select tags and not input
tags.
Mainly the second if "else if (column.forValue) " won't work only with select
tags.
dojo.lang.forEach(tgt.suggestData, function(column) {
if (column.forText) {
if (column.forText ===
this.textInputNode.id) {
this.setAllValues(column.label,
column.label);
if
(this.textInputNode.onchange) {
this.textInputNode.onchange();
}
}
else {
var element =
dojo.byId(column.forText);
if (element) {
if (element.tagName ===
"INPUT") {
element.value =
column.label;
if
(element.onchange)
{
element.onchange();
}
}
else {
element.innerHTML = column.label;
}
}
}
}
else if (column.forValue) {
var element =
dojo.byId(column.forValue);
for (i = 0; i < element.options.length;
i++)
{
if (element.options[i].value ==
column.value) {
element.options[i].selected = true;
}
}
}
}, this);
I have created a fix for this situation that will also work with input tags.
Here is the fix:
dojo.lang.forEach(tgt.suggestData, function(column) {
if (column.forText) {
if (column.forText ===
this.textInputNode.id) {
this.setAllValues(column.label,
column.label);
if
(this.textInputNode.onchange) {
this.textInputNode.onchange();
}
}
else {
var element =
dojo.byId(column.forText);
if (element) {
if (element.tagName ===
"INPUT") {
element.value =
column.label;
if
(element.onchange)
{
element.onchange();
}
}
else {
element.innerHTML = column.label;
}
}
}
}
else if (column.forValue) {
var element =
dojo.byId(column.forValue);
if (element.tagName === "SELECT") {
for (i = 0; i <
element.options.length; i++)
{
if
(element.options[i].value == column.value) {
element.options[i].selected = true;
}
}
}
else if (element.tagName === "INPUT") {
element.value = column.value;
if (element.onchange)
{
element.onchange();
}
}
else {
element.innerHTML =
column.value;
}
}
}, this);
The code is tested and works. Can you please include it in one of your releases.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
