I am trying to open a modal window from within a repeater. In the example application Library, my goal is equivalent to opening BookDetails in a ModalWindow instead of going to a separate page.
All of the below works perfectly if I place the html anchor outside of the html table and if I add() the AjaxLink outside of the ListView. I have a simple panel:
<wicket:panel>
<div wicket:id="editItemPopup"></div>
<table>
<tr>
<th>Product</th>
<th>Sku</th>
<th>Price</th>
<th wicket:id="day1">7/1</th>
</tr>
<tr wicket:id="items">
<td wicket:id="product">The Hotel</td>
<td wicket:id="sku">King</td>
<td wicket:id="price">$100</td>
<td>
<a wicket:id="openEditItem" href=""> <span wicket:id="available">20</span>
</a>
</td>
</tr>
</table>
</wicket:panel>
public class ProductPanel extends Panel {
private static final long serialVersionUID = -3546659646601591561L;
private Availability availability;
public ProductPanel(String id) {
super(id);
final ModalWindow editItemWindow = new ModalWindow("editItemPopup");
editItemWindow.setTitle("Add/Edit Item");
editItemWindow.setContent(new EditItemPanel(editItemWindow
.getContentId()));
add(editItemWindow);
add(new Label("day1", "10/1"));
List<WarehouseItem> whsItems = WarehouseService
.getAvailability(ProductType.HOTEL);
availability = new Availability(whsItems);
ListView itemView = new ListView("items", availability
.getSkuAvailabilities()) {
private static final long serialVersionUID = 7672521500786369826L;
@Override
protected void populateItem(ListItem listItem) {
SkuAvailability skuAvailability = (SkuAvailability) listItem
.getModelObject();
Sku sku = skuAvailability.getSku();
listItem.add(new Label("product", sku.getProductName()));
listItem.add(new Label("sku", sku.getName()));
listItem.add(new Label("price", String.valueOf(skuAvailability
.getWarehouseItem().getPrice())));
Date d = availability.getEventDates ().first();
WarehouseItem wItem = skuAvailability.getWarehouseItem(d);
add(new AjaxLink("openEditItem") {
private static final long serialVersionUID = 1L;
public void onClick(AjaxRequestTarget target) {
editItemWindow.show(target);
}
});
int qty = 0;
if (wItem != null)
qty = wItem.getQuantityAvailable();
listItem.add(new Label("available", String.valueOf(qty)));
}
};
add(itemView);
}
}
Unfortunately, when I add the AjaxLink within the ListView I get the following exception. I'm likely missing something rather simple, but thus far it's eluding me. Thank you for your time.
WicketMessage: Error attaching this container for rendering: [MarkupContainer [Component id = items, page = com.vegas.pos.PosPage, path = 0:navTabs:panel:productTabs:panel:items.ProductPanel$1, isVisible = true, isVersioned = false]]
Root cause:
java.lang.IllegalArgumentException: A child with id 'openEditItem' already exists:
[MarkupContainer [Component id = items, page = com.vegas.pos.PosPage, path = 0:navTabs:panel:productTabs:panel:
items.ProductPanel$1, isVisible = true, isVersioned = false]]
at wicket.MarkupContainer.add(MarkupContainer.java:156)
at com.vegas.pos.browse.ProductPanel$1.populateItem(ProductPanel.java:58)
at wicket.markup.html.list.ListView.internalOnAttach
(ListView.java:580)
at wicket.Component.internalAttach(Component.java:2521)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:341)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java
:354)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:354)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:354)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java
:354)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:354)
at wicket.Page.renderPage(Page.java:387)
at wicket.request.target.component.BookmarkablePageRequestTarget.respond(BookmarkablePageRequestTarget.java
:226)
at wicket.request.compound.DefaultResponseStrategy.respond(DefaultResponseStrategy.java:49)
at wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond(AbstractCompoundRequestCycleProcessor.java
:66)
at wicket.RequestCycle.doProcessEventsAndRespond(RequestCycle.java:858)
at wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:885)
at wicket.RequestCycle.step(RequestCycle.java:966)
at wicket.RequestCycle.steps(RequestCycle.java:1040)
at wicket.RequestCycle.request(RequestCycle.java:454)
at wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:216)
at javax.servlet.http.HttpServlet.service
(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:358)
at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch
(WebApplicationHandler.java:294)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:567)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1807)
at org.mortbay.jetty.servlet.WebApplicationContext.handle
(WebApplicationContext.java:525)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1757)
at org.mortbay.http.HttpServer.service(HttpServer.java:879)
at org.mortbay.http.HttpConnection.service
(HttpConnection.java:789)
at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:960)
at org.mortbay.http.HttpConnection.handle(HttpConnection.java:806)
at org.mortbay.http.SocketListener.handleConnection
(SocketListener.java:218)
at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:331)
at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:520)
Complete stack:
wicket.WicketRuntimeException
: Error attaching this container for rendering: [MarkupContainer [Component id = items, page = com.vegas.pos.PosPage, path = 0:navTabs:panel:productTabs:panel:items.ProductPanel$1, isVisible = true, isVersioned = false]]
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:361)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:354)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:354)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:354)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:354)
at wicket.MarkupContainer.internalAttach(MarkupContainer.java:354)
at wicket.Page.renderPage(Page.java:387)
at wicket.request.target.component.BookmarkablePageRequestTarget.respond(BookmarkablePageRequestTarget.java:226)
at wicket.request.compound.DefaultResponseStrategy.respond
(DefaultResponseStrategy.java:49)
at wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond(AbstractCompoundRequestCycleProcessor.java:66)
at wicket.RequestCycle.doProcessEventsAndRespond(RequestCycle.java
:858)
at wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:885)
at wicket.RequestCycle.step(RequestCycle.java:966)
at wicket.RequestCycle.steps(RequestCycle.java:1040)
at wicket.RequestCycle.request
(RequestCycle.java:454)
at wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:216)
Page
[Page class = com.vegas.pos.PosPage, id = 0]:
| # | Path | Size | Type | Model Object |
|---|---|---|---|---|
| 1 | _<body> | 425 bytes | wicket.markup.html.internal.HtmlBodyContainer | |
| 2 | head | 452 bytes | wicket.markup.html.basic.Label | Concierge |
| 3 | navTabs | 14.1K | wicket.extensions.markup.html.tabs.TabbedPanel | 0 |
| 4 | navTabs:panel | 12.6K | com.vegas.pos.browse.BrowsePanel | |
| 5 | navTabs:panel:cart | 451 bytes | wicket.markup.html.basic.Label | The Cart |
| 6 | navTabs:panel:productTabs | 14.1K | wicket.extensions.markup.html.tabs.TabbedPanel | 0 |
| 7 | navTabs:panel:productTabs:panel | 10.1K | com.vegas.pos.browse.HotelPanel | |
| 8 | navTabs:panel:productTabs:panel:day1 | 447 bytes | wicket.markup.html.basic.Label | 10/1 |
| 9 | navTabs:panel:productTabs:panel:editItemPopup | 3.1K | wicket.extensions.ajax.markup.html.modal.ModalWindow | |
| 10 | navTabs:panel:productTabs:panel:editItemPopup:content | 625 bytes | com.vegas.pos.browse.EditItemPanel | |
| 11 | navTabs:panel:productTabs:panel:items | 14.1K | wicket.markup.html.list.ListView | [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED] |
| 12 | navTabs:panel:productTabs:panel:items:0 | 14.1K | wicket.markup.html.list.ListItem | [EMAIL PROTECTED] |
| 13 | navTabs:panel:productTabs:panel:items:0:available | 450 bytes | wicket.markup.html.basic.Label | 10 |
| 14 | navTabs:panel:productTabs:panel:items:0:price | 447 bytes | wicket.markup.html.basic.Label | 100 |
| 15 | navTabs:panel:productTabs:panel:items:0:product | 454 bytes | wicket.markup.html.basic.Label | Motel 14 |
| 16 | navTabs:panel:productTabs:panel:items:0:sku | 447 bytes | wicket.markup.html.basic.Label | Queen |
| 17 | navTabs:panel:productTabs:panel:items:1 | 14.1K | wicket.markup.html.list.ListItem | [EMAIL PROTECTED] |
| 18 | navTabs:panel:productTabs:panel:items:1:price | 447 bytes | wicket.markup.html.basic.Label | 100 |
| 19 | navTabs:panel:productTabs:panel:items:1:product | 454 bytes | wicket.markup.html.basic.Label | Motel 19 |
| 20 | navTabs:panel:productTabs:panel:items:1:sku | 447 bytes | wicket.markup.html.basic.Label | Queen |
| 21 | navTabs:panel:productTabs:panel:items:openEditItem | 14.1K | wicket.ajax.markup.html.AjaxLink | |
| 22 | navTabs:panel:productTabs:tabs | 14.1K | wicket.markup.html.list.Loop | 4 |
| 23 | navTabs:panel:productTabs:tabs:0 | 14.1K | wicket.markup.html.WebMarkupContainer | |
| 24 | navTabs:panel:productTabs:tabs:0:link | 14.1K | wicket.markup.html.link.Link | |
| 25 | navTabs:panel:productTabs:tabs:0:link:title | 450 bytes | wicket.markup.html.basic.Label | Hotels |
| 26 | navTabs:panel:productTabs:tabs:1 | 14.1K | wicket.markup.html.WebMarkupContainer | |
| 27 | navTabs:panel:productTabs:tabs:1:link | 14.1K | wicket.markup.html.link.Link | |
| 28 | navTabs:panel:productTabs:tabs:1:link:title | 449 bytes | wicket.markup.html.basic.Label | Shows |
| 29 | navTabs:panel:productTabs:tabs:2 | 14.1K | wicket.markup.html.WebMarkupContainer | |
| 30 | navTabs:panel:productTabs:tabs:2:link | 14.1K | wicket.markup.html.link.Link | |
| 31 | navTabs:panel:productTabs:tabs:2:link:title | 449 bytes | wicket.markup.html.basic.Label | Tours |
| 32 | navTabs:panel:productTabs:tabs:3 | 14.1K | wicket.markup.html.WebMarkupContainer | |
| 33 | navTabs:panel:productTabs:tabs:3:link | 14.1K | wicket.markup.html.link.Link | |
| 34 | navTabs:panel:productTabs:tabs:3:link:title | 453 bytes | wicket.markup.html.basic.Label | Edit Item |
| 35 | navTabs:tabs | 14.1K | wicket.markup.html.list.Loop | 2 |
| 36 | navTabs:tabs:0 | 14.1K | wicket.markup.html.WebMarkupContainer | |
| 37 | navTabs:tabs:0:link | 14.1K | wicket.markup.html.link.Link | |
| 38 | navTabs:tabs:0:link:title | 451 bytes | wicket.markup.html.basic.Label | Product |
| 39 | navTabs:tabs:1 | 14.1K | wicket.markup.html.WebMarkupContainer | |
| 40 | navTabs:tabs:1:link | 14.1K | wicket.markup.html.link.Link | |
| 41 | navTabs:tabs:1:link:title | 449 bytes | wicket.markup.html.basic.Label | Admin |
| 42 | title | 453 bytes | wicket.markup.html.basic.Label | Concierge |
--
Scott Swank
reformed mathematician
------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________ Wicket-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/wicket-user
