[jboss-user] [JBoss Seam] - Seam - sortable data table options

bsmithjj do-not-reply at jboss.com
Tue May 1 10:56:32 EDT 2007


I am having some issues setting up a simple Tomahawk datatable that is sortable and as an extra, I've added in the Ajax4jsf tags to try to make the sort requests function as Ajax requests.  The issue I am having is that the table renders fine on the initial display.  When I click a column header, the data-rows display goes blank and the server log says:


  | ...
  | 08:31:43,564 ERROR org.apache.myfaces.component.html.ext.SortableModel - java.lang.IllegalStateException: row not available
  | ...
  | 

This line is repeated 100 times - there are 100 rows in my data set.  If I simply click the same column header again, it will display correctly (with sorting).  If I then, click again, another blank data display with the same error messages, and so on...

My question is - does anyone know how to 'do' this correctly with Tomahawk and Ajax4Jsf?

Please - no suggestions like use Icefaces - until I can find instructions that tell me exactly what files to edit to integrate it into a Seam JSF app (Seam 1.2) I don't want to waste time.  Also, Richfaces doesn't even seem to support clickable sorting on a datatable.  That leaves just Tomahawk for this kind of functionality.

Here is my code.

The backing bean:

  | @Name("tableBacker")
  | @Scope(ScopeType.SESSION)
  | public class TableBacker {
  | 
  |     @Logger
  |     private Log log;
  | 
  |     @DataModel
  |     private List<DataRow> dataRows;
  | 
  |     @DataModelSelection
  |     private DataRow dataRow;
  | 
  |     @Factory("dataRows")
  |     public void getDataRows() {
  |         log.info("dataRows");
  |         if (dataRows == null) {
  |             generateDataRows();
  |         }
  |     }
  | 
  |     private final void generateDataRows() {
  |         log.info("generateDataRows()");
  |         dataRows = new ArrayList<DataRow>();
  |         Random random = new Random(System.currentTimeMillis());
  |         for (long i = 0; i < 100; i++) {
  |             //DataRow(long id, String name, Date rowDate, String description)
  |             final long randomTime = System.currentTimeMillis()
  |                 + random.nextInt(86400 * 10) * ((random.nextBoolean()) ? -1 : 1);
  |             final byte[] byteArray = new byte[
  |                 25 + random.nextInt(10) * ((random.nextBoolean()) ? -1 : 1)
  |                 ];
  |             dataRows.add(
  |                 new DataRow(
  |                     i,
  |                     "DataRow  #" + i,
  |                     new java.util.Date(randomTime),
  |                     new StringBuffer(String.valueOf(i)).append(" - ").append(byteArray).toString()
  |                 )
  |             );
  |         }
  |     }
  | }
  | 

The Facelets XHTML view:

  | <h:form>
  |   <a4j:outputPanel id="dataRowsPanel">
  |     The Data:
  |     <a4j:status>
  |        <f:facet name="start">
  |           <h:graphicImage value="./img/spinner.gif"/>
  |        </f:facet>
  |     </a4j:status>
  |     <br/>
  |     <t:dataTable id="dataRows" var="dataRow" value="#{dataRows}" rows="15"
  |                  sortColumn="#{id}" sortAscending="false"
  |                  preserveDataModel="true" preserveSort="true">
  |       <t:column defaultSorted="true" sortable="true">
  |         <f:facet name="header">
  |           <t:commandSortHeader columnName="id" arrow="true">
  |             <h:outputText value="Row ID"/>
  |             <a4j:support event="onclick" reRender="dataRowsPanel"/>
  |           </t:commandSortHeader>
  |         </f:facet>
  |         <h:outputText value="#{dataRow.id}"/>
  |       </t:column>
  |       <t:column sortable="true">
  |         <f:facet name="header">
  |           <t:commandSortHeader columnName="name" arrow="true">
  |             <h:outputText value="Row Data"/>
  |             <a4j:support event="onclick" reRender="dataRowsPanel"/>
  |           </t:commandSortHeader>
  |         </f:facet>
  |         <h:outputText value="#{dataRow.name}"/>
  |       </t:column>
  |       <t:column sortable="true">
  |         <f:facet name="header">
  |           <t:commandSortHeader columnName="rowDate" arrow="true">
  |             <h:outputText value="Row Date"/>
  |           </t:commandSortHeader>
  |         </f:facet>
  |         <h:outputText value="#{dataRow.rowDate}"/>
  |       </t:column>
  |       <t:column sortable="true">
  |         <f:facet name="header">
  |           <t:commandSortHeader columnName="rowDate" arrow="true">
  |             <h:outputText value="description"/>
  |           </t:commandSortHeader>
  |         </f:facet>
  |         <h:outputText value="#{dataRow.description}"/>
  |       </t:column>
  |     </t:dataTable>
  |   </a4j:outputPanel>
  | </h:form>
  | 

Thanks,
Brad Smith

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4042107#4042107

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4042107



More information about the jboss-user mailing list