Hi!
 
I have a problem which I hoped somebody could have a look at. It might be that what I'm trying to do isn't possible, but I think it should have worked ;)
 
To give you a quick presentation of my "case" or problem:
 
- I have a dataTable which is filled with Document objects retrieved from a database.
- The Document object has a property "created" which is a Date timestamp
- In the dataTable I alternate the background of each row with white and blue
- Then, what I would like to do, is to do a test on the "created" property, if the Document has been created within a fixed time, present it with a yellow line instead.
- I set the different background-colors with three different styles, tableViewRow1 - tableViewRow2 and tableViewRow3 (the latest is the yellow line).
 
To do a test on the dates I convert them into milliseconds and do a simple subtraction - if todayDate minus createdDate is smaller than criteriaDate, then the Document is considered "new" and should have a yellow background.
 
This is how I've defined my dataTable:
 
 
<h:dataTable id="documentsTableView"
         binding="#{documentModelFactory.htmlDataTable}"
         value="#{documentModelFactory.documents}"
         var="document"
         columnClasses="tableViewColumn"
         rowClasses="#{ (documentModelFactory.todayInMillisec - document.createdInMillisec) <    documentModelFactory.criteriaInMillisec ? 'tableViewRow3':'tableViewRow1,tableViewRow2'}" 
         styleClass="tableView"
         footerClass="tableViewFooter"
         headerClass="tableViewHeader"
         >
 
So this would be the interesting lines:
         rowClasses="#{ (documentModelFactory.todayInMillisec - document.createdInMillisec)<  documentModelFactory.criteriaInMillisec ? 'tableViewRow3':'tableViewRow1,tableViewRow2'}"
 
I don't get an exception, and my _expression_ seems valid. But it seems like it is always rendered to be false, I only get the white and blue rows, and I don't understand why. 
 
I have done different tests on the _expression_, and this confuses me, because it seems like the result is what it should be.
 
# Test 1
For each row I created a column printing the result of the _expression_, false or true.
 
<h:column>
       <f:facet name="header">
            <h:outputText value="Test " />
       </f:facet>
       <h:outputText value="#{ (documentModelFactory.todayInMillisec - document.createdInMillisec)<  documentModelFactory.criteriaInMillisec }" />
 </h:column>
 
In all cases this is giving me the correct result, new documents get 'true' and the old ones get 'false'.
 
So then I thought that there is a problem setting the tableViewRow3 param properly for the <tr class="" >  :
 
#Test 2
I created a selectDocument action which basically just sets the document in my bean when a commandLink in the dataTable is fired.
Then, in my method I retrieve the HtmlDataTable object, and do a logging of the current rowClasses for that row:
    htmlDataTable.getRowClasses() - which returns a String
 
If I selected an "old" document, it returned "'tableViewRow1,tableViewRow2", but if i selected a new document, it returned 'tableViewRow3'.
 
So it seems like my _expression_ is rendered correctly, the rowClass is set properly, but still I don't get a yellow line. In the html source I have only <tr>'s with
'tableViewRow1' and 'tableViewRow2'.
 
Anybody? :)
 
I don't know if it has something to do with the time / when the rowClasses param is "rendered", that it doesn't know what the "document" property is at that time??? I had the impression that the html was encoded "on the fly", and then this shouldn't be a problem? But I'm not exactly an expert so.. :)
 
I guess an alternative solution is to do the testing in my bean and build up a comma-separated String to specify a rowClass for each row displayed in the dataTable, and then set the rowClasses to something like 

rowClasses="#{bean.rowStyles}"

but first solution seems like a much easier approach (less costly as well), and it would also be interesting to know why it doesn't work.
 
Thank you for your time!
 
Eivind Roennevik
 
 
 
 
 

Reply via email to