tr:table to provide the ability to partially render rows
--------------------------------------------------------
Key: TRINIDAD-699
URL: https://issues.apache.org/jira/browse/TRINIDAD-699
Project: MyFaces Trinidad
Issue Type: Wish
Components: Components
Affects Versions: 1.0.2-core
Reporter: Andrew Robinson
Priority: Minor
It doesn't appear to me that tr:table allows for partial rendering of its rows.
With DHTML functionality integrated with the client Trinidad AJAX code and the
design of the CollectionModel, it should be possible to do.
This could be very beneficial for add a new row, delete selected rows type of
functionality. This is in a way a "diff-ing" algorithm.
Architecture could be something like this:
During rendering, the table can save the rendered row keys into a property to
be saved into the component state using
org.apache.myfaces.trinidad.model.RowKeySet
During a partial rendering, check to see if it is possible to write a diff:
1) the table has been included in the list of partial targets
2) no parent component of the table has been included in the list of partial
targets (a full rendering would be needed for this)
3) no component value changes have been to the table (this is probably the hard
part of this - but should be able to be done using the FacesBean)
Inside the rendering, if the above are true:
Loop through each data model row (still needs to be done to render any
components that have changed inside the columns), calling encode
If the row key is new, send the row down (encode)
Remember each row rendered
At the end of rendering, gather the information and send instructions to the
client:
for each new row key, send down the row key that was rendered directly after
that row.
for each row key that wasn't rendered this time, send a ID to the client that
it should be deleted.
In the client, loop through all the IDs to delete, and use:
var element = document.getElementById('[rowID]');
if (element) { element.parentNode.removeChild(element); }
for each new row (you will need access to the AJAX DOM object):
var tbody = // code should be able to get this, knowing the clientID of the
data table
var newElement = TODO // get from AJAX API;
var beforeElement = document.getElementById('[afterRowId]');
if (beforeElement) {
tbody.insertBefore(newElement, beforeElement);
} else {
tbody.appendChild(newElement);
}
This isn't required, but could be a nice performance enhancement, especially
for large tables. Having the API in the AJAX layer to do this would be great
for all complex iteration controls (tables, tree, treetables, etc). I have not
seen a component library do this yet, but I think it would be very useful.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.