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'}"
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"
>
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>
<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

