h:panelgrid rerendering doesn't work with ModalPanel
rschoeler Feb 15, 2009 2:04 PMHi folks, today I've started to work a little bit more with AJAX-functionality and I'm very impressed from the out-of-the-box usage....wow....really good work.
Nevertheless the currently available pdf-doc is not so clear for me - therefore my code could contains useless staff. I've searched the issue-tracking but not found related topic.
Following "bug":
After coming back from the ModalPanel id="newKeyPanel" no rendering of a4j:region id="button_region_all" resp. h:panelGrid id="buttons_all" will be done. Although the assumption rendered="#{mappingHandler.selectedIdentifier != null}" is satisfied
The rest of the page is rendered or rerendered correctly
Naturally I've tried other ways of rerendering e.g. take h:panelgrid id etc.
Maybe someone can find the error in my code - I've no more ideas...
My steps:
1. Click on a4j:commandLink with id="newKeyLink" -> opens ModalPanel
2. Insert name for new key
3. Click Button store -> allIdentifiers were updated
4. Rerendering is all done according to reRender="id_combo,list_of_mappings,button_region_all", except id=button_region_all
By the way the ModalPanel src is taken from rich:datatable-demo....very good work...... 8-}
My Environment:
- jdk1.6.0_11
- RF 3.3.0 GA
- MyFace 1.2.5
- Apache Tomcat/6.0.16 (Standalone)
<div id="workplace"> <!-- Region for whole AJAX-Side --> <a4j:region id="outside" renderRegionOnly="true"> <a4j:region id="combo_region"> <h:panelGrid id="id_combo" columns="6" styleClass="standardTableBordered"> <h:outputLabel value="#{msgs.mapping_identifier_label}: " for="idList" /> <rich:comboBox id="idList" value="#{mappingHandler.selectedIdentifier}" suggestionValues="#{mappingHandler.allIdentifiers}" directInputSuggestions="true" defaultLabel="#{msgs.mapping_combo_default}"> <a4j:support event="onselect" reRender="list_of_mappings,buttons_all" ajaxSingle="true" limitToList="true"/> </rich:comboBox> <rich:spacer width="100" height="10" title="Here is a spacer..."/> <a4j:commandLink ajaxSingle="true"id="newKeyLink" oncomplete="#{rich:component('newKeyPanel')}.show()"> <h:graphicImage value="/images/edit.gif" style="border:0"/> </a4j:commandLink> <rich:toolTip for="newKeyLink" value="#{msg.tooltip_create_new_mappingkey}"/> <rich:message for="idList" /> </h:panelGrid> </a4j:region> <!-- id is combo_region--> <br/> <a4j:region id="table_region"> <rich:dataTable id="list_of_mappings" rows="10" onRowMouseOver="this.style.backgroundColor='#F1F1F1'" onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'" cellpadding="0" cellspacing="0" width="1000" border="0" var="record" value="#{mappingHandler.result}"> ... <rich:column> <f:facet name="header"> <h:outputText value="#{msgs.mapping_actions}" /> </f:facet> <a4j:commandLink id="deletelink" action="#{mappingHandler.deleteMapping}" reRender="list_of_mappings" onclick="if(!confirm('#{msgs.js_delete_mapping}')){return false;};" ajaxSingle="true"> <h:graphicImage value="/images/delete.gif" style="border:0"/> <f:setPropertyActionListener value="#{record.oid}" target="#{mappingHandler.oidForDeletion}" /> </a4j:commandLink> <rich:toolTip for="deletelink" value="#{msgs.tooltip_delete_mapping}"/> </rich:column> </rich:dataTable> </a4j:region> <!-- id is table_region--> <br/> <a4j:region id="button_region_all" selfRendered="true"> <h:panelGrid id="buttons_all" columns="2" styleClass="standardTableBordered" rendered="#{mappingHandler.selectedIdentifier != null}"> <a4j:commandButton value="#{msgs.button_label_new_mapping}" onclick="this.disabled=true;" action="#{mappingHandler.createNewMapping}" reRender="list_of_mappings,buttons_all" /> <h:commandButton value="#{msgs.button_label_save}" action="#{mappingHandler.save}" /> </h:panelGrid> </a4j:region> </a4j:region> <!-- id is outside --> </div> <!-- END CONTAINER --> </h:form> <!-- Modal Panel to insertion of new key--> <rich:modalPanel id="newKeyPanel" autosized="true" width="450"> <f:facet name="header"> <h:outputText value="#{msgs.modal_new_key_header}" /> </f:facet> <f:facet name="controls"> <h:panelGroup> <h:graphicImage value="/images/close.png" id="hidelink" styleClass="hidelink"/> <rich:componentControl for="newKeyPanel" attachTo="hidelink" operation="hide" event="onclick" /> </h:panelGroup> </f:facet> <h:form> <rich:messages style="color:red;"></rich:messages> <h:panelGrid columns="1"> <a4j:outputPanel ajaxRendered="true"> <h:panelGrid columns="2"> <h:outputText value="#{msgs.modal_new_key_name}: "/> <h:inputText value="#{mappingHandler.newIdentifier}" /> </h:panelGrid> </a4j:outputPanel> <a4j:commandButton value="Store" action="#{mappingHandler.createNewKey}" reRender="id_combo,list_of_mappings,button_region_all" oncomplete="if(#{facesContext.maximumSeverity==null}) #{rich:component('newKeyPanel')}.hide();" /> </h:panelGrid> </h:form> </rich:modalPanel>
public class MappingHandler{ private List<String> allIdentifiers; private String selectedIdentifier; //name of new created identifier private String newIdentifier; //the query-result public List<GenericMapping> result; public List<GenericMapping> getResult() { //case 1: no result exists and nothing selected if(this.result == null && this.selectedIdentifier == null) { result = new ArrayList<GenericMapping>(); } if(this.result == null && this.selectedIdentifier != null){ //case 2: no result exists, but something is selected result = new GenericMappingDAO().listAll(this.selectedIdentifier); } return this.result; } public void createNewKey(){ log.info("Save new identifier: " + this.newIdentifier); this.allIdentifiers.add(this.newIdentifier); this.selectedIdentifier = this.newIdentifier; this.result = new ArrayList<GenericMapping>(); this.newIdentifier = null; } ... }
regards
roland