Submitting dynamic form in ModalPanel
ronanf Feb 19, 2009 1:40 PMHi,
I have created a test case to illustrate a problem I am seeing.
I am trying to create a forum of dynamically loaded inputs which is presented to the user in a ModalPanel. The form loads with the correct default values however the list containing the values is not set upon form submition.
JSF:
<f:view> <h:form id="metaForm"> <div> <h:outputText value="#{testBean.listOutput}" id="listOutput" escape="false"/> </div> <div> <a4j:commandLink value="Edit" id="editLink" style="float:right;"> <a4j:support event="onclick" oncomplete="#{rich:component('metadataEditModelPanel')}.show()" reRender="metaEditPanel" eventsQueue="metaEvents" ignoreDupResponses="true"/> </a4j:commandLink> </div> </h:form> <f:subview id="metadataEditModelPanelView"> <h:form id="panelForm2"> <div> <rich:modalPanel id="metadataEditModelPanel" width="300" height="400"> <f:facet name="header"> <h:panelGroup> <h:outputText value="Edrms alert"></h:outputText> </h:panelGroup> </f:facet> <f:facet name="controls"> <h:panelGroup> <h:graphicImage value="../images/close.png" styleClass="hidelink" id="hidelink"/> <rich:componentControl for="metadataEditModelPanel" attachTo="hidelink" operation="hide" event="onclick"/> </h:panelGroup> </f:facet> <h:panelGroup id="metaEditPanel" binding="#{testBean.metaPanelGroup}"/> <div> <a4j:commandButton value="Save" id="templateSubmit" action="#{testBean.saveEditedMetadata}" style="width:60px" eventsQueue="metaEvents" ignoreDupResponses="true" oncomplete="#{rich:component('metadataEditModelPanel')}.hide()" reRender="listOutput"/> </div> </rich:modalPanel> </div> </h:form> </f:subview> </f:view>
Backing bean:
public class TestBean { private HtmlPanelGroup metaPanelGroup; private Map<String, Object> metaItemsMap = new HashMap<String, Object>(); private static int staticCount = 0; public TestBean() { populateMetaItemsMap(); } private void populateMetaItemsMap() { metaItemsMap.put("1", "bob"); metaItemsMap.put("2", "jim"); } public String getListOutput() { StringBuilder sBuilder = new StringBuilder(); for (Object o : this.getMetaItemsMap().values()) { sBuilder.append(o.toString()); sBuilder.append("<br/>"); } return sBuilder.toString(); } public HtmlPanelGroup getMetaPanelGroup() { if (metaPanelGroup == null) { metaPanelGroup = new HtmlPanelGroup(); } else { metaPanelGroup.getChildren().clear(); } ArrayList<UIComponent> components = new ArrayList<UIComponent>(); int i = 1; for (Object item : this.getMetaItemsMap().values()) { HtmlInputText htmlInputText = new HtmlInputText(); htmlInputText.setId("_" + staticClassCounter() + "in"); htmlInputText.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression(FacesContext.getCurrentInstance().getELContext(), "#{testBean.metaItemsMap['" + i + "']}", String.class)); components.add(htmlInputText); i++; } if (components.size() > 0) { metaPanelGroup.getChildren().addAll(components); } return metaPanelGroup; } public void setMetaPanelGroup(HtmlPanelGroup metaPanelGroup) { metaPanelGroup.getChildren().clear(); HtmlPanelGroup newPanelGroup = this.getMetaPanelGroup(); metaPanelGroup.getChildren().addAll(newPanelGroup.getChildren()); } public Map<String, Object> getMetaItemsMap() { return metaItemsMap; } public void setMetaItemsMap(Map<String, Object> metaItemsMap) { this.metaItemsMap = metaItemsMap; } public void saveEditedMetadata() { System.out.println("Save"); } private static int staticClassCounter() { return ++staticCount; } }
Any help in resolving this problem would be much appreciated.