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
>
>