0 Replies Latest reply on May 21, 2009 2:47 PM by Jose Miguel Loor

    rich tree does not reRender

    Jose Miguel Loor Apprentice

      Hi

      i have a rich:tree control in an application with seam. I have a contextMenu attrached to the tree nodes, when i click on an item of the contextMenu i rise a modalPanel with some inputs to create a new record

      If i enter the right information (i mean information that does not break a database constraint), everything works fine. The modalPanel closes, and the tree refreshes right, showing me the new inserted element.

      But lets say i enter incorrect information in the modalPanel; it does not close (wich is right) and the messages appears in the modalPanel; then i fix the data in the input boxes and try to save. The modalPanel closes, the data is correctoy inserted in the database, but the tree does not show me the new node. If i refresh the page (F5 in the browser) then i see the new node. What can be happening ?? Do i need to set any kind of state so the tree refreshes ok again ??

      this is the relevant code:

      ----- tree -----
      
      <rich:tree id="clasificacionTree"
       value="#{indControladorClasificacion.nodoRaiz}"
       var="clasificacionNodo">
       <rich:treeNode data="#{clasificacionNodo}">
       <h:outputText value="#{clasificacionNodo.etiqueta}" />
       <rich:contextMenu id="nodeContextMenu" event="oncontextmenu"
       attached="true" submitMode="ajax">
       <rich:menuItem id="addMenuItem"
       value="#{messages['boton.nuevo']}"
       actionListener="#{indControladorClasificacion.agregarActionListener}"
       reRender="formModalPanel"
       oncomplete="Richfaces.showModalPanel('formModalPanel')" />
       <rich:menuItem id="editMenuItem"
       value="#{messages['boton.modificar']}"
       rendered="#{clasificacionNodo.nivel > 0}"
       actionListener="#{indControladorClasificacion.editarActionListener}"
       reRender="formModalPanel"
       oncomplete="Richfaces.showModalPanel('formModalPanel')" />
       <rich:menuItem id="deleteMenuItem"
       value="#{messages['boton.quitar']}"
       rendered="#{clasificacionNodo.nivel > 0}"
       actionListener="#{indControladorClasificacion.eliminarActionListener}"
       reRender="clasificacionMainPanel"
       onclick="if(cancelaBorrado('#{messages['pantalla.confirmacion.borrado']}','#{clasificacionNodo.codigo}','#{clasificacionNodo.etiqueta}')) {return false;}" />
       </rich:contextMenu>
       </rich:treeNode>
       </rich:tree>
      --- modal panel form ---
      <a4j:form id="clasificacionModalForm">
       <a4j:outputPanel id="panelMensajes" ajaxRendered="true">
       <h:messages layout="table" errorClass="mensaje-error"
       warnClass="mensaje-advertencia" infoClass="mensaje-informacion" />
       </a4j:outputPanel>
       <rich:simpleTogglePanel
       label="#{messages['dialogo.titulo.panel.datos']}"
       switchType="client">
       <h:panelGrid columns="2" styleClass="formulario"
       columnClasses="item-label, item-value">
       <h:outputLabel value="#{messages['nombreClasificacion']}"
       for="nombreClasificacion" />
       <s:decorate template="/template/item-layout.xhtml">
       <h:inputText id="nombreClasificacion" required="true"
       autocomplete="off"
       requiredMessage="#{messages['clasificacion.nombreClasificacion.requerido']}"
       value="#{indServicioClasificacion.instance.descripcionClasificacion}"
       size="#{messages['pantalla.inputText.size']}" />
       </s:decorate>
       <h:outputLabel value="#{messages['nemonicoClasificacion']}"
       for="abreviacionClasificacion" />
       <s:decorate template="/template/item-layout.xhtml">
       <h:inputText id="abreviacionClasificacion" required="true"
       autocomplete="off"
       requiredMessage="#{messages['clasificacion.nemonicoClasificacion.requerido']}"
       value="#{indServicioClasificacion.instance.nemonicoClasificacion}"
       size="#{messages['pantalla.inputText.size']}" />
       </s:decorate>
       <h:outputLabel value="#{messages['descripcionClasificacion']}"
       for="descripcionClasificacion" />
       <s:decorate template="/template/item-layout.xhtml">
       <h:inputTextarea id="descripcionClasificacion" required="true"
       requiredMessage="#{messages['clasificacion.descripcionClasificacion.requerido']}"
       value="#{indServicioClasificacion.instance.descripcionLClasificacion}"
       cols="#{messages['pantalla.inputText.size']}" />
       </s:decorate>
       </h:panelGrid>
       <rich:panel>
       <a4j:commandButton id="guardarClasificacionCommandButton"
       value="#{messages['boton.guardar']}"
       actionListener="#{indControladorClasificacion.guardarActionListener}"
       data="#{indControladorClasificacion.existenErrores}"
       oncomplete="if (!data) {Richfaces.hideModalPanel('formModalPanel');} else {return false;}"
       reRender="clasificacionTree" />
       <a4j:commandButton id="cancelarClasificacionCommandButton"
       value="#{messages['boton.cancelar']}" ajaxSingle="true"
       oncomplete="Richfaces.hideModalPanel('formModalPanel')" />
       </rich:panel>
       </rich:simpleTogglePanel>
       </a4j:form>
      --- class method ---
      
      public void guardarActionListener(final ActionEvent event) {
       Long idOriginal = indServicioClasificacion.getInstance().getCodigoClasificacion();
       try {
       if (idOriginal != null) {
       indServicioClasificacion.update();
       } else {
       if (parentData.getData() instanceof Agrupacion) {
       Agrupacion agrupacion = parentData.getData();
       indServicioClasificacion.getInstance().setAgrupacion(agrupacion);
       indServicioClasificacion.getInstance().setClasificacionPadre(null);
       } else if (parentData.getData() instanceof Clasificacion) {
       Clasificacion clasificacionPadre = parentData.getData();
       indServicioClasificacion.getInstance().setAgrupacion(clasificacionPadre.getAgrupacion());
       indServicioClasificacion.getInstance().setClasificacionPadre(clasificacionPadre);
       }
       int nivel = parentData.getNivel() + 1;
       TipoClasificacion tipoClasificacion = obtenerTipoClasificacion(nivel);
       indServicioClasificacion.getInstance().setCodigoTipoClasificacion(tipoClasificacion);
       indServicioClasificacion.persist();
       }
       cargarArbol();
       } catch (RuntimeException e) {
       if (idOriginal == null) {
       indServicioClasificacion.clearInstance();
       }
       super.putErrorMessage("No pudo guardar el registro: " + e.getMessage());
       }
       }