extendedDataTable : storing column visibility in database
gonzalad Jun 20, 2011 5:00 AMHello,
I need to store user preferences in database.
Such preferences include extendedDataTable column visibility and column grouping.
When the user toggles column visibility or grouping, I want to update its database preferences.
I use RF 3.3.3.
I've tried usingthe tableState attribute of extendedDatatable, but it is only a JSON String, so i would need to parse it.
Is there an easy way to :
- get the tableState as an easy to maniulate object ?
- add a server listener which will be called whenever column visibility or grouping is changed ?
Thanks !
P.S.
just using rich:extendedDataTable binding attribute and calling ExtendedDataTableState.getExtendedDataTableState(getExtendedDataTable()) appears to solve the first question, but it seems to me quite counter intuitive. Shouldn't tableState just give an instance of ExtendedDataTableState instead of a String ?
Sample code :
Programmatically toggling column (just make sure myAction is always called - i.e. using a seam page action) :
{code}
public void myAction() {
ExtendedDataTableState lState = getExtendedDataTableState();
// test : verify c3 column is always hidden
if (lState.isColumnVisible("c3")) {
lState.toggleColumnVisibility(getExtendedDataTable(), "c3");
}
...
}
private ExtendedDataTableState getExtendedDataTableState() {
return getChargeClienteleDataTableState().getExtendedDataTableStateObject();
}
private UIExtendedDataTable getExtendedDataTable() {
return getChargeClienteleDataTableState().getExtendedDataTable();
}
private ChargeClienteleDataTableState getChargeClienteleDataTableState() {
return (ChargeClienteleDataTableState) Component.getInstance("chargeClienteleDataTableState");
}
{code}
Getting access to ExtendedDataTableState :
{code}
@Name("chargeClienteleDataTableState")
@Scope(ScopeType.EVENT)
public class ChargeClienteleDataTableState {
private ExtendedDataTableState extendedDataTableObject;
private UIExtendedDataTable extendedDataTable;
public UIExtendedDataTable getExtendedDataTable() {
return extendedDataTable;
}
public void setExtendedDataTable(UIExtendedDataTable extendedDataTable) {
this.extendedDataTable = extendedDataTable;
}
public ExtendedDataTableState getExtendedDataTableStateObject() {
if (extendedDataTableObject==null) {
extendedDataTableObject = ExtendedDataTableState.getExtendedDataTableState(getExtendedDataTable());
}
return extendedDataTableObject;
}
}
{code}
JSF code :
{code:xml}
<rich:extendedDataTable var="chargeClientele" value="#{rechercherChargeClienteleAction.dataModel}"
binding="#{chargeClienteleDataTableState.extendedDataTable}">
<rich:column id="c1" label="#{messages['chargeClientele.nom.label']}">
#{chargeClientele.nom}
</rich:column>
<rich:column id="c2" label="#{messages['chargeClientele.prenom.label']}">
#{chargeClientele.prenom}
</rich:column>
<rich:column id="c3" label="#{messages['chargeClientele.userRACF.label']}">
#{chargeClientele.userRACF}
</rich:column>
{code}