David Chandler <david.chandler <at> learnjsf.com> writes:

> 
> 
> Sounds like you need the id in the hidden field to be consistent both before 
and after sort, which it isn't if you're using a row index (1,2,3...) Could you 
instead put in the hidden field a unique property of the object in each row so 
that it wouldn't change?
> By the way, I'd love to see your CSS code to scroll using this technique. Do 
you mind posting it or a how-to link?Thanks,/dmc
> 
> -- David ChandlerDevelopment Coachlearnjsf.com
> 


What I need for the javascript is an offset.  I don't think having the id of 
the selected item helps because I won't know how far down on the list the 
selected item is.  At the moment, I'm wondering if I can walk the DOM and find 
the row with the right style, then compute the offset from that.  I can't get 
the rowStyle and rowStyleClass attrubutes of my dataTable to work right, so 
that's out for the moment.  When I was doing the sorting manually, this all 
worked like a charm, but I can't seem to get it to work when myfaces does the 
sorting for me.  I would like to get this working because it cleans up the code 
considerably.

Here is the JSF/CSS/javascript for my table:

Relevant parts of JSF:
<body onload="scrollToActive()"
  <h:form id="bankForm">
    <%/* 
         the scrollPosition holds the offset of the selected item. I don't 
         want to see the value, but I need to have it rendered.  Storing the 
         value in the styleClass gives the JavaScript something to look for.
    */%>
    <h:outputText id="scrollPosition" styleClass="#{bankBean.scrollPosition}"
                  value=""/>
     <t:div id="scrollingDiv" styleClass="scrollingDiv">
      <t:dataTable id="banklist"
                   binding="#{bankBean.masterTable}" 
                   value="#{bankBean.masterList}" var="bank"
                   rowIndexVar="rowIndex"
                   sortColumn="#{bankBean.sortAttribute}"
                   sortAscending="#{bankBean.sortAscending}"
                   rowStyle="#{bankBean.selectedRowIndex == 
rowIndex ? 'activeTableCell' : 'tableCell'}"
                   rowStyleClass="#{bankBean.selectedRowIndex == 
rowIndex ? 'activeTableCell' : 'tableCell'}"
                   border="1" headerClass="header3"
                   preserveDataModel="false">
        <t:column sortable="true" sortPropertyName="name" width="400">
          <f:facet name="header">
              <h:outputText styleClass="tableHeader" value="Bank Name"/>
          </f:facet>
          <t:div styleClass="#{bankBean.style}">
            <h:commandLink action="#{bankBean.changeActive}">
              <h:outputText styleClass="#{bankBean.style}" value="#{bank.name}">
                <e:convertTrim maxLength="50"/>
              </h:outputText>
              <t:updateActionListener property="#{bankBean.selectedRowIndex}" 
value="#{rowIndex}"/>
            </h:commandLink>
          </t:div>
        </t:column>
        
       MORE COLUMNS HERE
     </t:dataTable>
    </h:form>
etc.


Relevant parts of the CSS, there is more for non-IE, but I wanted to be brief:

div.scrollingDiv {
    clear: both;
    overflow: auto; /* to scroll */
    height: 184px;
    width: 600px;  /* 20 wider than the table for IE */
    border-left: 1px gray solid;
    border-right: 1px gray solid;
    border-bottom: 1px gray solid;
    text-align: left;
/* width of the table in the div. For IE it's the actual table size */
div.scrollingDiv table {
    float: left;
    empty-cells: show;
    width: 580px;
}
/* This will fix the header row in IE */
div.scrollingDiv thead tr {
    position: relative;
}

The javascript:
    // this function will set the scroll position for the scrolling table
    function scrollToActive() {
        //alert("In scrollToActive!");
        var name = document.forms[0].name;
        var elem = document.getElementById(name + ":scrollingDiv");
        var pos= document.getElementById(name + ":scrollPosition");
        if( elem != null ) {
            elem.scrollTop = parseInt(pos.className);
        }

    }






Reply via email to