Hi,

thanks all for answers. 

After more thinking about it what I need is probably custom
rowStatePreserver.

JSF already mandates working with states for each row in UIdata. There
are two modes:

1) rowStatePreserved = false (old one): only editableValueHolder and its
submittedValue, localValue, value and submittedValue are preserved

2) rowStatePreserved = true: full state of component per-row is
preserved

What can make editable dataTable very easy is possibility to plug-in
custom behaviour to row state iteration. Internally myfaces use in
UIData Map<clientId,States) for row states. If you want to switch
different row to different modes, you must also provide such map: 
Map<String id, State>  where State = {"required"="true",
"displayValueOnly"="false"} etc.

Example of possible APIs:

<a:dataTable rowStatePreserver="#{myStatePreserver}">

MyRowStatePreserver extends javax.faces...DefaultRowStatePreserver

RowKeySet rowsInEditableMode;
States states;

public void setRowState(Object rowKey, UIComponent c) {
        super.setRowState(rowKey, c)
        if (rowsInEditableMode.contains(rowKey) {

        State state = states.get(c.getId());
        c.setRequired(state.isRequired)
        c.setDisplayValueOnly(state.isDisplayValueOnly)
}
}

What do you think about it? 

Regards, 

Kočičák

Çağatay Çivici píše v St 08. 06. 2011 v 10:01 +0300:
> I have implemented something similar in PrimeFaces via cellEditor
> component which can take any editable component as a child;
> 
> 
> http://www.primefaces.org/showcase-labs/ui/datatableEditing.jsf
> 
> On Jun 7, 2011, at 11:05 PM, Werner Punz wrote:
> 
> > I opted for approach 1 in one project i have on github, speed is not
> > really an issue since you display only a handful of datasets anyway,
> > but I tried to keep the editable information outside of the
> > lifecycle
> > to avoid unnecessary saves and restores.
> > 
> > Werner
> > 
> > 
> > 
> > 
> > Am 07.06.11 21:29, schrieb Martin Koci:
> > > Hi,
> > > 
> > > 
> > > how to do editable table in JSF? Not with all rows/cell in
> > > editable
> > > state,  only with those ones which user switch with icon to update
> > > state.
> > > 
> > > Example:
> > > <a:column id="emailColumn">
> > >    <a:inputText id="email" value="#{rowData.email}" />
> > > </a:column>
> > > 
> > > <a:column>
> > >  <h:commandButton value="Switch to update"
> > > actionListener="#{rowData.switchToUpdate}" />
> > > </a:column>
> > > 
> > > 
> > > Solution 1:
> > > add ValueExpression to attribute determines state of component:
> > > 
> > > <a:inputText id="email" value="#{suser.email}"
> > > displayValueOnly="#{!
> > > rowData.editableState}"/>
> > > 
> > > This solution has serious disadvantages:
> > > -- you must add expression to each component
> > > -- for required additional expression is needed:
> > > required="#{rowData.required}"
> > > -- evaluation of VEs for each row is very slow
> > > 
> > > 
> > > Solution 2:
> > > use DataModelListener
> > > 
> > > Use o implementation of DataModelListener and when UIData scrolls
> > > to
> > > row, set property of component directly:
> > > uiComponent.setDisplayValueOnly(true|false)
> > > 
> > > Disadvantages:
> > > -- dependency on DataModel as value for UIData
> > > -- cannot be done from plain XHTML
> > > 
> > > 
> > > 
> > > What do you think about this problem? Do you know any elegant
> > > solution
> > > for this?
> > > 
> > > Thanks,
> > > 
> > > Kočičák
> > > 
> > > 
> > > 
> > > 
> > 
> > 
> > 
> 
> Çağatay Çivici
> Principal Consultant
> PrimeFaces Lead | JSF EG Member
> 
> Prime Teknoloji
> Bilkent Cyberpark, A-303d
> 06800 Ankara/Turkey
> Tel: +90 312 265 05 07
> http://www.prime.com.tr
> 
> 


Reply via email to