Whoops...got confused. This solves a different problem. But I *do* have
a link in my table which updates other data on the screen. Here's THAT
code (sorry for the confusion):

<display:column headerClass="data" class="data_right" title="&nbsp;">
        <div id="${GradeTestAction.FIELD_EXAM_STUDENT_LINK}${row.id}">
                <c:choose>
                        <c:when test="${empty matches[row.id]}">
                                <c:set var="url"
value="Public?app.active=ajax&app.template=ajaxForwarder&Ajax.action=mat
chStudentToExamScan&Ajax.scanId=${row.id}&Ajax.studentId=-1"/>
                                <a
href="javascript:getStudentInfoForMatch('${url}');">Match</a>
                        </c:when>
                        <c:otherwise>
                                <c:set var="url"
value="Public?app.active=ajax&app.template=ajaxForwarder&Ajax.action=mat
chStudentToExamScan&Ajax.scanId=${row.id}&Ajax.studentId=${matches[row.i
d].id}"/>
                                <a
href="javascript:getStudentInfoForUnmatch('${url}');">Unmatch</a>
                        </c:otherwise>
                </c:choose>
        </div>
</display:column>

Here are the two javascript functions referenced above. They rewrite the
DOM for the page based on selected values. The basic trick is to use
discreet DIV tags for each field you want to change, named with unique
values (I use the primary keys for the referenced object in the table).
Then use javascript to find those fields, and rewrite the DOM with the
new data.....

/*
 * Get select box options by calling a Pluglet action
 */
function getStudentInfoForMatch(url) {
        makeHttpRequest(url, 'setStudentInfoForMatch', null, returnXML);
}

function setStudentInfoForMatch(textToUse) {
        if (textToUse == '803') {
                return;
        }
        // split the document
        var returnElements = textToUse.split("||");
    
        // add the name text to the document
        var nameField = document.getElementById('name_' +
returnElements[0]);
        nameField.innerHTML = "";
        
nameField.appendChild(document.createTextNode(returnElements[1]));
        
        // add the hidden input field to the document
        var inputField = document.createElement("input");
        inputField.type = "hidden";
        inputField.name = "studentId_" +  + returnElements[0];
        inputField.value = returnElements[2];
        nameField.appendChild(inputField);

        var url =
"Public?app.active=ajax&app.template=ajaxForwarder&Ajax.action=matchStud
entToExamScan&Ajax.scanId=" +   returnElements[0] + "&Ajax.studentId=" +
returnElements[2];

        // create new Unmatch link
        var newLink = document.createElement("a");
        newLink.href = "javascript:getStudentInfoForUnmatch(\'" + url +
"\');";
        newLink.appendChild(document.createTextNode("Unmatch"));

        var matchField = document.getElementById('link_' +
returnElements[0]);
        matchField.innerHTML = "";
        matchField.appendChild(newLink);

        // remove selected name from all select boxes
        var selects = document.getElementsByTagName('select');
        for (var i=0; i<selects.length; i++) {
                for (var j=selects[i].options.length-1; j>=0; j--) {
                        if (selects[i].options[j].value ==
returnElements[2]) {
                                selects[i].remove(j);
                        }
                }
        }
}

/*
 * Get select box options by calling a Pluglet action
 */
function getStudentInfoForUnmatch(url) {
    makeHttpRequest(url, 'setStudentInfoForUnmatch', null, returnXML);
}

function setStudentInfoForUnmatch(textToUse) {
        if (textToUse == '803') {
                return;
        }
        // split the returned text
        var returnElements = textToUse.split("||");
    
        // add removed person to all select boxes
        var selects = document.getElementsByTagName('select');
        var firstSelect = selects[0];
        for (var i=0; i<selects.length; i++) {
                var selLength = selects[i].length;
                selects[i].options[selLength] = new
Option(returnElements[1], returnElements[2]);
        }

        // add new select box for this row
        var newSelect = document.createElement("select");
        for (var j=0; j<firstSelect.options.length; j++) {
                var text = firstSelect.options[j].text;
                var value = firstSelect.options[j].value;
                var selLength = newSelect.length;
                newSelect.options[selLength] = new Option(text, value);
        }
        newSelect.id = "examStudent_" + returnElements[0];
        newSelect.name = "examStudent_" + returnElements[0];
        newSelect.setAttribute("onchange", "studentChanged(this);");
        
        // add select box to page
        var nameField = document.getElementById('name_' +
returnElements[0]);
        nameField.innerHTML = "";
        nameField.appendChild(newSelect);
        
        var url =
"Public?app.active=ajax&app.template=ajaxForwarder&Ajax.action=matchStud
entToExamScan&Ajax.scanId=" +   returnElements[0] +
"&Ajax.studentId=-1";

        // create new Unmatch link
        var newLink = document.createElement("a");
        newLink.href = "javascript:getStudentInfoForMatch(\'" + url +
"\');";
        newLink.appendChild(document.createTextNode("Match"));

        // create new Match link
        var matchField = document.getElementById('link_' +
returnElements[0]);
        matchField.innerHTML = "";
        matchField.appendChild(newLink);
}

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Paul
Cooper
Sent: Tuesday, November 20, 2007 12:18 PM
To: displaytag-user@lists.sourceforge.net
Subject: Re: [displaytag-user] Using Link on Column to populate
fields(plural!) in parent screen

I have "ajaxish" javascript code working by row in a displaytag table.
Here's my code, though it has some proprietary tag code in it too. But
it should help:

<display:column headerClass="data" class="data_left" title="Student
Name">
        <div id="name_${row.id}">
                <c:choose>
                        <c:when test="${empty matches[row.id]}">
                                <premis:comboBox 
                                        name="examStudent_${row.id}" 
                                        items="${missingExam}"
        
onchange="studentChanged(this);"/>
                        </c:when>
                        <c:otherwise>
                                <input 
                                        type="hidden" 
                                        name="student_${row.id}"
        
value="${(matches[row.id]).id}"/>
        
${(matches[row.id]).person.name.formatted}
                        </c:otherwise>
                </c:choose>
        </div>
</display:column>

The magic here is that each row has a combobox called "examStudent_XXX"
where XXX is the id of the record, the onchange event calls a javascript
function "studentChanged" that takes the value of the selected combobox
row.

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of
tstronge
Sent: Tuesday, November 20, 2007 9:45 AM
To: displaytag-user@lists.sourceforge.net
Subject: Re: [displaytag-user] Using Link on Column to populate fields
(plural!) in parent screen


I got a bit carried away with enthusiasm ;-(

What I got it to work yesterday only had one row in the table (the
single
thus last row in the table!).  However, on trying it with multiple rows
in
the table I realised that I cannot get at the correct row object.

My 

tstronge wrote:
> 
>         String fieldValue = evaluate(listObjFieldName,
> ctxt.getAttribute("tableRow")).toString();
> 

doesn't work because ctxt.getAttribute("tableRow") gives me the item in
the
last row of the table and not the item that's being selected by the user
clicking on the link.

So I'm back to square 1
- I can't use a TableDecorator as I don't know the column name up front
to
write a getSomeColumnName() method in the table decorator
- I can't use a ColumnDecorator as I can't access values other than the
column in question

Any help really appreciated on this as I am losing hairs by the hour!!

My latest (failed!) attempt has


>   public Object decorate(Object columnValue, PageContext ctxt,
> MediaTypeEnum mt) throws DecoratorException {
>     String returnAssignmentsStr = "";
> 
>     String[] returnValueAssignmentPairs = (String[])
> ctxt.getAttribute("returnValueAssignmentPairs");
> 
>     for (int i = 0; i < returnValueAssignmentPairs.length; i++) {
>       String parentObjFieldName =
> returnValueAssignmentPairs[i].split("=")[0];
>       String listObjFieldName =
> returnValueAssignmentPairs[i].split("=")[1];
> 
>       String fieldValue = evaluate(listObjFieldName,
> ctxt.getAttribute("selection")).toString();
> 
>       returnAssignmentsStr = returnAssignmentsStr + parentObjFieldName
+
> "=" + fieldValue;
>       if (i < returnValueAssignmentPairs.length - 1) {
>         returnAssignmentsStr += ";";
>       }
>     }
> 
>     return "&lt;a href=\"#\" class=\"DATA-LINK\"
> onclick=\"javascript:populate_parent('" + returnAssignmentsStr +
> "')\"&gt;"
>         + columnValue.toString() + "&lt;/a&gt;";
>   }
> 

in the ColumnDecorator and 



>       <display:column media="html" 
>       property="${columnName}"
>                               .... blah ....
>
decorator="com.XXXX.XXXX.XX.web.decorator.ReturnValueLinkColumnDecorator
"
> >
>      </display:column>
> 
in the JSP
-- 
View this message in context:
http://www.nabble.com/Using-Link-on-Column-to-populate-fields-%28plural%
21%29-in-parent-screen-tf4811614.html#a13858332
Sent from the DisplayTag - General mailing list archive at Nabble.com.


------------------------------------------------------------------------
-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
displaytag-user mailing list
displaytag-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/displaytag-user

------------------------------------------------------------------------
-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
displaytag-user mailing list
displaytag-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/displaytag-user

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
displaytag-user mailing list
displaytag-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/displaytag-user

Reply via email to