Hi Martin,
thanks for pointing me to the reuse component concept. It solved my
problem partially but not completely. The problem is, that the links
provided by the listview result in HTTP GET request which means that any
values recently entered will not be transferred back and get lost. I am
now using my own link implementations based on the SubmitLink class. I
am attaching all files of my working example as reference.
Generally I think it makes great sense to have this behaviour as part of
the ListView. At least I expected it to work this way in the first place.
Regards,
Seb
On 14.08.2010 16:40, Martin Makundi wrote:
Hi!
You can solve this in a robust manner using reusemanager:
http://osdir.com/ml/users-wicket.apache.org/2010-08/msg00161.html
2010/8/14 Sebastian<nospam...@gmx.net>:
Hi,
I am trying to use a list view component on a page where rows with text
fields can be added, removed or moved around. I am using the removeLink,
moveUpLink and moveDownLink methods of the listview to create the respective
links for each list item.
The problem is that even when I enable the reuseListItems option, on using
any of these links the text fields "forget" the recently entered data (raw
input) and revert to the values of the backing model.
This issue does not occur when I am adding rows the list view.
Below is an example. I can add rows using the "Add Row" button. When I enter
text into the text fields, when I use the links next to a row, the content
of any text field is cleared.
Any suggestions?
Regards,
Seb
/******************** PAGE ********************************/
import java.util.*;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.list.*;
import org.apache.wicket.model.*;
public class ListViewPage extends WebPage {
public static class Row {
public String key;
public String value;
}
private final List<Row> rows = new ArrayList<Row>();
public ListViewPage(final PageParameters parameters) {
add(new Form<List<Row>>("rowsForm").
add(new Button("addRowButton") {
public void onSubmit() { rows.add(new Row()); }
}.setDefaultFormProcessing(false)).
add(new ListView<Row>("rowsList", new PropertyModel<List<Row>>(this,
"rows")) {
protected void populateItem(final ListItem<Row> item) {
final Row row = item.getModelObject();
item.add(new Label("index", new AbstractReadOnlyModel<Integer>() {
public Integer getObject() { return item.getIndex() + 1; }
}));
item.add(new RequiredTextField<String>("key", new
PropertyModel<String>(row, "key")));
item.add(new TextField<String>("value", new
PropertyModel<String>(row, "value")));
item.add(removeLink("removeRowLink", item));
item.add(moveUpLink("moveUpLink", item));
item.add(moveDownLink("moveDownLink", item));
}
}.setReuseItems(true)));
}
}
/******************** HTML ********************************/
<html>
<head><title>ListView Test</title></head>
<body>
<form wicket:id="rowsForm">
<button wicket:id="addRowButton">Add Row</button>
<table><tr wicket:id="rowsList">
<td> #<span wicket:id="index">1</span></td>
<td>Key:<input type="text" wicket:id="key" /></td>
<td>Value:<input type="text" wicket:id="value" /></td>
<td>
<a href="#" wicket:id="moveUpLink">[↑]</a>
<a href="#" wicket:id="moveDownLink">[↓]</a>
<a href="#" wicket:id="removeRowLink">[X]</a>
</td>
</tr></table>
<input type="submit" value="Submit" />
</form>
</body>
</html>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org
package wickettest;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.wicket.markup.html.form.FormComponent;
public class FormComponentReuseManager implements Serializable
{
private static final long serialVersionUID = 1L;
private final Map<Object, Map<String, FormComponent< ? >>>
componentsByRowId = new HashMap<Object, Map<String, FormComponent< ? >>>();
public <T> FormComponent<T> rememberOrReuse(final Object rowId, final
FormComponent<T> newComponent)
{
Map<String, FormComponent< ? >> rowComponents =
componentsByRowId.get(rowId);
if (rowComponents == null)
componentsByRowId.put(rowId, rowComponents = new
HashMap<String, FormComponent< ? >>());
@SuppressWarnings("unchecked")
final FormComponent<T> existingComponent = (FormComponent<T>)
rowComponents.get(newComponent.getId());
if (existingComponent == null)
{
rowComponents.put(newComponent.getId(), newComponent);
return newComponent;
}
return existingComponent;
}
}
package wickettest;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.PropertyModel;
public class ListViewPage extends WebPage
{
public static class Row implements Serializable
{
private static final long serialVersionUID = 1L;
public String key;
public String value;
}
private static final long serialVersionUID = 1L;
private final List<Row> rows = new ArrayList<Row>();
@SuppressWarnings("serial")
public ListViewPage(final PageParameters parameters)
{
final FormComponentReuseManager mgr = new
FormComponentReuseManager();
final Form<List<Row>> form = new Form<List<Row>>("rowsForm");
add(form);
form.add(new Button("addRowButton")
{
@Override
public void onSubmit()
{
rows.add(new Row());
}
}.setDefaultFormProcessing(false));
form.add(new ListView<Row>("rowsList", new
PropertyModel<List<Row>>(this, "rows"))
{
@Override
protected void populateItem(final ListItem<Row>
item)
{
final Row row = item.getModelObject();
item.add(new Label("index", new
AbstractReadOnlyModel<Integer>()
{
@Override
public Integer
getObject()
{
return
item.getIndex() + 1;
}
}));
item.add(mgr.rememberOrReuse(row, new
RequiredTextField<String>("key", new PropertyModel<String>(
row, "key"))));
item.add(mgr.rememberOrReuse(row, new
TextField<String>("value", new PropertyModel<String>(row,
"value"))));
item.add(new SubmitLink("removeRowLink")
{
@Override
public void onSubmit()
{
getList().remove(item.getModelObject());
getParent().getParent().removeAll();
};
}.setDefaultFormProcessing(false));
item.add(new SubmitLink("moveUpLink")
{
@Override
public boolean
isVisible()
{
return
getList().indexOf(item.getModelObject()) > 0;
};
@Override
public void onSubmit()
{
final int index
= getList().indexOf(item.getModelObject());
Collections.swap(getList(), index, index - 1);
getParent().getParent().removeAll();
};
}.setDefaultFormProcessing(false));
item.add(new SubmitLink("moveDownLink")
{
@Override
public boolean
isVisible()
{
return
getList().indexOf(item.getModelObject()) < getList().size() - 1;
};
@Override
public void onSubmit()
{
final int index
= getList().indexOf(item.getModelObject());
Collections.swap(getList(), index, index + 1);
getParent().getParent().removeAll();
};
}.setDefaultFormProcessing(false));
}
}.setReuseItems(true));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org