dev@jsftemplating.java.net

Re: JSFTemplating: Enhancement #10: Dynamic table

From: Padraig Byrne <padraigbyrne_at_yahoo.com>
Date: Fri, 10 Aug 2007 14:18:30 -0700 (PDT)

Not sure of etiquette here so apologoes if replying in this manner is not allowed I am currently evaluating woodstock fo ruse with seam & facelets but jsf templating look very interesting. Does this feature support muti column sorting in a datatable ? Rgds, Padraig. ----- Original Message ---- From: Ken Paulsen <Ken.Paulsen_at_Sun.COM> To: dev_at_jsftemplating.dev.java.net Sent: Friday, August 10, 2007 10:00:09 PM Subject: Re: JSFTemplating: Enhancement #10: Dynamic table Hi Karam, Yes, I believe it is part of JSFT now so you will not need that .jar file. JSFT has com.sun.jsftemplating.component.dataprovider.*. If you remove it and still have problems let me know. Thanks! Ken Karam Singh Badesha wrote: > Ken, > Remember some time you have sent me a jar file "MultipleDataList.jar" > or something like that. Is that part of jsftemplating now? Just asking > so that I can go ahead and remove it after I pick up latest > jsftemplating build. > > thanks > Karam > > Ken Paulsen wrote: >> >> I forgot the attachment... here it is. >> >> ken >> >> Ken Paulsen wrote: >>> >>> Hi Karam, >>> >>> I am very sorry for my slow response time lately. I had a >>> conference then vacation, then lots of email. :( >>> >>> I just spent some time implementing this feature. Attached is a >>> sample .jsf page which includes all the data in the page. You >>> (obviously) would want to retrieve this from your database, backend >>> logic, or managed bean instead. However, I think it clearly shows >>> how to use the component. >>> >>> The table is the same. The table row group has a new name, the same >>> old properties, and all the column properties. The column >>> properties are prefixed with "column". All properties supported by >>> the Woodstock "tableColumn" component should work. Each column >>> property must be specified as a List (this is done in the .jsf page >>> using {"list element #1", "list element #2", ...} -- however, you >>> can use a #{} expression to resolve to your data which must be a >>> List). There is 1 additional property called "columnValue". This >>> also must be a List which contains the content for each column. >>> Only staticText is supported. >>> >>> Let me know if you have any questions or problems! You will need to >>> checkout/build JSFTemplating to get this feature... or wait until >>> tomorrow to get the nightly build. >>> >>> Thanks! >>> >>> Ken >>> >>> Karam Singh Badesha wrote: >>>> Ken, >>>> Any status? >>>> >>>> thanks >>>> Karam >>>> >>>> Ken Paulsen wrote: >>>>> >>>>> Hi Karam, >>>>> >>>>> I'm sorry I haven't made any progress. I will make an effort to >>>>> get something for you to look at this week. >>>>> >>>>> Ken >>>>> >>>>> Karam.Badesha_at_Sun.COM wrote: >>>>>> Ken, >>>>>> Any updates? >>>>>> >>>>>> thanks >>>>>> -Karam >>>>>> >>>>>> Ken Paulsen wrote: >>>>>> >>>>>>> >>>>>>> The foreach that I currently have is a component itself. So it >>>>>>> won't create multiple TableColumn components. Also the tree >>>>>>> doesn't allow non-tree UIComponents inside it. >>>>>>> >>>>>>> If we add a foreach that is executed during the creation time, >>>>>>> then yes... it would work. In JSFT, it wouldn't be too hard to >>>>>>> do this since the descriptors (LayoutElement) already exist for >>>>>>> looping, they'd just have to be used during the tree creation... >>>>>>> which amounts to 1 extra condition. We'd probably need a flag >>>>>>> indicating that it is intended for tree-creation time... or >>>>>>> perhaps a subclass of the existing while/foreach layoutelements. >>>>>>> >>>>>>> Ken >>>>>>> >>>>>>> Imre Oßwald wrote: >>>>>>> >>>>>>>> Couldn't that be done with some kind of foreach? (I think i >>>>>>>> have done that in facelets that way) >>>>>>>> >>>>>>>> Imre >>>>>>>> >>>>>>>> On 04.07.2007, at 03:17, Karam Singh Badesha wrote: >>>>>>>> >>>>>>>>> Ok great. >>>>>>>>> >>>>>>>>> thanks >>>>>>>>> Karam >>>>>>>>> >>>>>>>>> Ken Paulsen wrote: >>>>>>>>> >>>>>>>>>> >>>>>>>>>> I think I have enough to go on. I'm going to try to make this >>>>>>>>>> generic and put it in the JSFT code. Although when I get into >>>>>>>>>> it, I may change my mind. ;) >>>>>>>>>> >>>>>>>>>> Thanks! >>>>>>>>>> >>>>>>>>>> Ken >>>>>>>>>> >>>>>>>>>> Karam Singh Badesha wrote: >>>>>>>>>> >>>>>>>>>>> Ken, >>>>>>>>>>> This should be fine. Let me know if you are going to deliver >>>>>>>>>>> this directly to the jsftemplating repository or release as >>>>>>>>>>> separate jar file. I am out of the office until July11 so >>>>>>>>>>> might not be able to respond any questions that you send >>>>>>>>>>> later. If there is anything else you want to know, please >>>>>>>>>>> let me know now. >>>>>>>>>>> >>>>>>>>>>> thanks >>>>>>>>>>> Karam >>>>>>>>>>> >>>>>>>>>>> Ken Paulsen wrote: >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Hi Karam, >>>>>>>>>>>> >>>>>>>>>>>> Supporting the attributes you need on the column could look >>>>>>>>>>>> something like this: >>>>>>>>>>>> >>>>>>>>>>>> <sun:table ...> >>>>>>>>>>>> <sun:dynamicColumnTableRowGroup data="#{dataOnly}" >>>>>>>>>>>> columnId="#{listOfIds}" >>>>>>>>>>>> columnHeaderText="#{listOfHeaderText}" >>>>>>>>>>>> columnFooterText="#{listOfFooterText}" >>>>>>>>>>>> columnRowHeader="#{listOf...}" >>>>>>>>>>>> columnSort="#{listOf...}" >>>>>>>>>>>> columnAlign="#{listOf...}" >>>>>>>>>>>> columnWidth="#{listOf...}" >>>>>>>>>>>> columnSpacerColumn="#{listOf...}" >>>>>>>>>>>> [TableRowGroup properties here] >>>>>>>>>>>> /> >>>>>>>>>>>> </sun:table> >>>>>>>>>>>> >>>>>>>>>>>> It is necessary to pass in a List of values because each >>>>>>>>>>>> column needs a value for each of these properties. >>>>>>>>>>>> >>>>>>>>>>>> There are other ways (including passing in a data structure >>>>>>>>>>>> that contains all the info in one EL expression), I'd like >>>>>>>>>>>> to know what you'd prefer. I'd also probably want to >>>>>>>>>>>> support all the other TRG properties to make it generally >>>>>>>>>>>> useful. >>>>>>>>>>>> >>>>>>>>>>>> Ken >>>>>>>>>>>> >>>>>>>>>>>> Karam Singh Badesha wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Ken, >>>>>>>>>>>>> Actually TableRowGroup is ok to stay on the jsf page, all >>>>>>>>>>>>> I need is a way to pass the various columns (tableColumn) >>>>>>>>>>>>> to the page. Currently on tableColumn I only use following >>>>>>>>>>>>> properties: >>>>>>>>>>>>> id headerText >>>>>>>>>>>>> footerText >>>>>>>>>>>>> rowHeader >>>>>>>>>>>>> sort >>>>>>>>>>>>> align >>>>>>>>>>>>> width >>>>>>>>>>>>> spacerColumn >>>>>>>>>>>>> >>>>>>>>>>>>> In the following example: >>>>>>>>>>>>> <sun:table ...> >>>>>>>>>>>>> <sun:dynamicColumnTableRowGroup data="#{dataOnly}" >>>>>>>>>>>>> columnVisible="#{listOfVisibleValuesOneForEachColumn}" >>>>>>>>>>>>> columnSortIcon="#{listOfSortIconValuesOneForEachColumn}" >>>>>>>>>>>>> ... >>>>>>>>>>>>> [TableRowGroup properties here] /> >>>>>>>>>>>>> </sun:table> >>>>>>>>>>>>> >>>>>>>>>>>>> What does columnVisible and columnSortIcon do? In this >>>>>>>>>>>>> approach where do I specify the columnHeaders? If this >>>>>>>>>>>>> approach is straight forward and I can get the column >>>>>>>>>>>>> headers etc from a resource file, its fine with me. >>>>>>>>>>>>> >>>>>>>>>>>>> thanks >>>>>>>>>>>>> Karam >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Ken Paulsen wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Hi Karam, >>>>>>>>>>>>>> >>>>>>>>>>>>>> We need to work out what tableData's data structure looks >>>>>>>>>>>>>> like. The table component could have all it's properties >>>>>>>>>>>>>> as as it normally does (no need to worry about them). >>>>>>>>>>>>>> However, you're hiding the tableRowGroup and tableColumn >>>>>>>>>>>>>> components... so they'll need to be created from the data. >>>>>>>>>>>>>> >>>>>>>>>>>>>> TableRowGroup supports the following properties: >>>>>>>>>>>>>> >>>>>>>>>>>>>> tableDataSorter >>>>>>>>>>>>>> onDblClick >>>>>>>>>>>>>> onKeyPress >>>>>>>>>>>>>> sourceData >>>>>>>>>>>>>> aboveColumnFooter >>>>>>>>>>>>>> extraFooterHtml >>>>>>>>>>>>>> onKeyUp >>>>>>>>>>>>>> onMouseUp >>>>>>>>>>>>>> extraHeaderHtml >>>>>>>>>>>>>> footerText >>>>>>>>>>>>>> align >>>>>>>>>>>>>> selectMultipleToggleButton >>>>>>>>>>>>>> onClick >>>>>>>>>>>>>> groupToggleButton >>>>>>>>>>>>>> toolTip >>>>>>>>>>>>>> onMouseDown >>>>>>>>>>>>>> tableDataFilter >>>>>>>>>>>>>> multipleColumnFooters >>>>>>>>>>>>>> rows >>>>>>>>>>>>>> sourceVar >>>>>>>>>>>>>> valign >>>>>>>>>>>>>> first >>>>>>>>>>>>>> onMouseOut >>>>>>>>>>>>>> multipleTableColumnFooters >>>>>>>>>>>>>> onMouseOver >>>>>>>>>>>>>> onMouseMove >>>>>>>>>>>>>> emptyDataMsg >>>>>>>>>>>>>> selected >>>>>>>>>>>>>> collapsed >>>>>>>>>>>>>> visible >>>>>>>>>>>>>> aboveColumnHeader >>>>>>>>>>>>>> onKeyDown >>>>>>>>>>>>>> headerText >>>>>>>>>>>>>> styleClasses >>>>>>>>>>>>>> aboveColumnHeader >>>>>>>>>>>>>> onKeyDown >>>>>>>>>>>>>> headerText >>>>>>>>>>>>>> styleClasses >>>>>>>>>>>>>> >>>>>>>>>>>>>> TableRowGroup also supports these facets: >>>>>>>>>>>>>> >>>>>>>>>>>>>> header >>>>>>>>>>>>>> footer >>>>>>>>>>>>>> >>>>>>>>>>>>>> TableColumn supports these properties: >>>>>>>>>>>>>> >>>>>>>>>>>>>> spacerColumn >>>>>>>>>>>>>> width >>>>>>>>>>>>>> onDblClick >>>>>>>>>>>>>> sort >>>>>>>>>>>>>> selectedId >>>>>>>>>>>>>> onKeyPress >>>>>>>>>>>>>> severity >>>>>>>>>>>>>> rendered >>>>>>>>>>>>>> rowHeader >>>>>>>>>>>>>> extraTableFooterHtml >>>>>>>>>>>>>> extraFooterHtml >>>>>>>>>>>>>> onKeyUp >>>>>>>>>>>>>> onMouseUp >>>>>>>>>>>>>> styleClass >>>>>>>>>>>>>> descending >>>>>>>>>>>>>> embeddedActions >>>>>>>>>>>>>> height >>>>>>>>>>>>>> extraHeaderHtml >>>>>>>>>>>>>> align >>>>>>>>>>>>>> footerText >>>>>>>>>>>>>> scope >>>>>>>>>>>>>> style >>>>>>>>>>>>>> sortImageURL >>>>>>>>>>>>>> onClick >>>>>>>>>>>>>> sortIcon >>>>>>>>>>>>>> toolTip >>>>>>>>>>>>>> onMouseDown >>>>>>>>>>>>>> alignKey >>>>>>>>>>>>>> tableFooterText >>>>>>>>>>>>>> valign >>>>>>>>>>>>>> noWrap >>>>>>>>>>>>>> onMouseOut >>>>>>>>>>>>>> onMouseOver >>>>>>>>>>>>>> emptyCell >>>>>>>>>>>>>> visible >>>>>>>>>>>>>> onMouseOut >>>>>>>>>>>>>> onMouseOver >>>>>>>>>>>>>> onMouseMove >>>>>>>>>>>>>> emptyCell >>>>>>>>>>>>>> visible >>>>>>>>>>>>>> onKeyDown >>>>>>>>>>>>>> headerText >>>>>>>>>>>>>> >>>>>>>>>>>>>> TableColumn defines these facets: >>>>>>>>>>>>>> >>>>>>>>>>>>>> footer >>>>>>>>>>>>>> header >>>>>>>>>>>>>> tableFooter >>>>>>>>>>>>>> >>>>>>>>>>>>>> So as you can see, the data structure is non-trivial. >>>>>>>>>>>>>> However, it may not be as bad as it seems either. If we >>>>>>>>>>>>>> can agree to not try to generate TableRowGroup, we can >>>>>>>>>>>>>> leave its definition in the .jsf file. I don't think it >>>>>>>>>>>>>> adds a lot of value to try to eliminate it. As for all >>>>>>>>>>>>>> the properties on TableColumn... we could decide to >>>>>>>>>>>>>> support only a subset. And/or we could create a naming >>>>>>>>>>>>>> pattern to cause the factory to apply the values >>>>>>>>>>>>>> correctly -- this is made more difficult, however, b/c >>>>>>>>>>>>>> there are multiple TableColumns and the values may vary >>>>>>>>>>>>>> between the TableColumns. >>>>>>>>>>>>>> >>>>>>>>>>>>>> So we need to know what properties will be supported >>>>>>>>>>>>>> directly by your proposed "data" property (if any), and >>>>>>>>>>>>>> which will require additional properties in the jsf file >>>>>>>>>>>>>> delegate. For example: >>>>>>>>>>>>>> >>>>>>>>>>>>>> <sun:table ...> >>>>>>>>>>>>>> <sun:dynamicColumnTableRowGroup >>>>>>>>>>>>>> data="#{dataPlusPropertiesForAllTableColumns}" >>>>>>>>>>>>>> [tableRowGroup properties here] /> >>>>>>>>>>>>>> </sun:table> >>>>>>>>>>>>>> >>>>>>>>>>>>>> OR: >>>>>>>>>>>>>> >>>>>>>>>>>>>> <sun:table ...> >>>>>>>>>>>>>> <sun:dynamicColumnTableRowGroup data="#{dataOnly}" >>>>>>>>>>>>>> columnVisible="#{listOfVisibleValuesOneForEachColumn}" >>>>>>>>>>>>>> columnSortIcon="#{listOfSortIconValuesOneForEachColumn}" >>>>>>>>>>>>>> ... >>>>>>>>>>>>>> [TableRowGroup properties here] /> >>>>>>>>>>>>>> </sun:table> >>>>>>>>>>>>>> >>>>>>>>>>>>>> As you can see, the first approach requires a complex >>>>>>>>>>>>>> data structure that you must populate. The 2nd approach >>>>>>>>>>>>>> requires you to create the same order of complexity, >>>>>>>>>>>>>> however, it is distributed among multiple List objects >>>>>>>>>>>>>> which contain the properties to set for each column. >>>>>>>>>>>>>> >>>>>>>>>>>>>> What do you think? >>>>>>>>>>>>>> >>>>>>>>>>>>>> A 1-off solution wouldn't have to be so generic and could >>>>>>>>>>>>>> be more specific to your data and needs. You could use >>>>>>>>>>>>>> either the "binding" attribute, or a custom factory (like >>>>>>>>>>>>>> above), but it would allow to only do the work you need >>>>>>>>>>>>>> for your use case. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Ken >>>>>>>>>>>>>> >>>>>>>>>>>>>> Karam Singh Badesha wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Here is example of how it might look like in .jsf file: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> <sun:table data="#{pageSession.tableData}" >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> .../> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> tableData will have all the column tag information and >>>>>>>>>>>>>>> in the .jsf page there will be no column tags. Please >>>>>>>>>>>>>>> suggest a way to take care of this. It is not really my >>>>>>>>>>>>>>> app specific, it can be used by anyone. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> thanks >>>>>>>>>>>>>>> Karam >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Karam Singh Badesha wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Ken, >>>>>>>>>>>>>>>> Here is an example of what I am trying to do: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Right now in the .jsf page I have to list the column >>>>>>>>>>>>>>>> tag with header etc. I have the situation where I have >>>>>>>>>>>>>>>> drop down boxes and depending upon different >>>>>>>>>>>>>>>> selections, number of columns and column headers could >>>>>>>>>>>>>>>> change. And I want the control to be defined in the >>>>>>>>>>>>>>>> Resources file, etc number of columns, column headers >>>>>>>>>>>>>>>> etc. I am not sure how it will work myself, as the jsf >>>>>>>>>>>>>>>> code is changing (when number of columns change). I >>>>>>>>>>>>>>>> think when we talked last time, you suggested that I >>>>>>>>>>>>>>>> somehow create the table object in java code (handler) >>>>>>>>>>>>>>>> and pass it to the page. What do you suggest? Let me >>>>>>>>>>>>>>>> know if this is clear or not. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> thanks >>>>>>>>>>>>>>>> Karam >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Ken Paulsen wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Hi Karam, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I can look into doing this... however, after reading >>>>>>>>>>>>>>>>> the issue more closely, I need some more information >>>>>>>>>>>>>>>>> from you. How do you want to specify the table columns >>>>>>>>>>>>>>>>> from the page? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> TableColumns typically have children, so they'd also >>>>>>>>>>>>>>>>> have to be created. Do you want those to just be >>>>>>>>>>>>>>>>> staticText? Or do you want control over what type they >>>>>>>>>>>>>>>>> are also? Which TableColumn attribute do you want >>>>>>>>>>>>>>>>> control over? Perhaps you can provide an example of >>>>>>>>>>>>>>>>> what you'd like it to look like in the .jsf file? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> After looking at this more closely, I suspect this may >>>>>>>>>>>>>>>>> end up being custom for your needs. However, if I can >>>>>>>>>>>>>>>>> keep it generic and useful for others as well, I will. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Ken >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Karam Singh Badesha wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Hi Ken, >>>>>>>>>>>>>>>>>> Is it possible to get a solution for issue #10 in >>>>>>>>>>>>>>>>>> jsftemplating? I really need some solution for this >>>>>>>>>>>>>>>>>> so that create dynamic tables. Please let me know. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> thanks >>>>>>>>>>>>>>>>>> Karam >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>> >> >> ------------------------------------------------------------------------ >> >> $attribute{row1}); mapPut(map="$attribute{row1}" key="a" value="Row1 >> Col A"); mapPut(map="$attribute{row1}" key="b" value="Row1 Col B"); >> mapPut(map="$attribute{row1}" key="c" value="Row1 Col C"); // Row 2 >> createMap(result=>$attribute{row2}); mapPut(map="$attribute{row2}" >> key="a" value="Row2 Col A"); mapPut(map="$attribute{row2}" key="b" >> value="Row2 Col B"); mapPut(map="$attribute{row2}" key="c" >> value="Row2 Col C"); // Row 3 createMap(result=>$attribute{row3}); >> mapPut(map="$attribute{row3}" key="a" value="Row3 Col A"); >> mapPut(map="$attribute{row3}" key="b" value="Row3 Col B"); >> mapPut(map="$attribute{row3}" key="c" value="Row3 Col C"); // Create >> List of Map (List of the rows) setAttribute(key='listOfRows' >> value={"$attribute{row1}" "${row2}" "${row3}"} ); // Row 1 (again, >> different obj.) createMap(result=>$attribute{rowA}); >> mapPut(map="$attribute{rowA}" key="foo" value="Other Obj: A - foo"); >> mapPut(map="$attribute{rowA}" key="bar" value="Other Obj: A - bar"); >> // Row 2 (again, different obj.) createMap(result=>$attribute{rowB}); >> mapPut(map="$attribute{rowB}" key="foo" value="Other Obj: B - foo"); >> mapPut(map="$attribute{rowB}" key="bar" value="Other Obj: B - bar"); >> // Row 3 (again, different obj.) createMap(result=>$attribute{rowC}); >> mapPut(map="$attribute{rowC}" key="foo" value="Other Obj: C - foo"); >> mapPut(map="$attribute{rowC}" key="bar" value="Other Obj: C - bar"); >> // Create List of Map (List of more rows) setAttribute(key='moreRows' >> value={"$attribute{rowA}" "${rowB}" "${rowC}"} ); />