1 Reply Latest reply on May 23, 2008 8:18 PM by madman1

    problem with fileUpload. I need limitToList

      Hello, sorry for my english.

      I have the typical, ajaxRender=true, component. My problem is that I don't want to reRender this component while I upload a file. So I try this:

      <a4j:region renderRegionOnly="false">
       <h:form id="fileUploadForm">
       <h:panelGrid>
       <rich:fileUpload maxFilesQuantity="10" id="fileUpload" fileUploadListener="#{filesUploader.listener}">
       <a4j:support event="onuploadcomplete" reRender="filesTree" />
       <f:facet name="progress">
       <rich:progressBar limitToList="true"/>
       </f:facet>
       </rich:fileUpload>
       </h:panelGrid>
       </h:form>
       </a4j:region>


      In this way components ajaxRendered=true, don't auto update. The problem is that, this don't work:
      <a4j:support event="onuploadcomplete" reRender="filesTree" />

      Because filesTree, it's a component outside the region. So I try this:

      <a4j:region renderRegionOnly="false">
       <h:form id="fileUploadForm">
       <h:panelGrid>
       <rich:fileUpload maxFilesQuantity="10" onuploadcomplete="hack();" id="fileUpload" fileUploadListener="#{filesUploader.listener}">
       <f:facet name="progress">
       <rich:progressBar limitToList="true"/>
       </f:facet>
       </rich:fileUpload>
       </h:panelGrid>
       </h:form>
       </a4j:region>
       <a4j:jsFunction name="hack" reRender="filesTree"/>


      But don't work, I get a javascript error (I saw with firebug).


      How can I do it? I think that a limitToList attribute for fileUpload, could be good. I was reading the source, and I find, in the public abstract class FileUploadRendererBase this method:

       private String getActionScript(FacesContext context, UIComponent component,
       String action, Object oncomplete) throws IOException {
       ComponentVariables variables = ComponentsVariableResolver.getVariables(
       this, component);
       String clientId = component.getClientId(context);
       String containerId = (String) variables.getVariable("containerId");
       JSFunction ajaxFunction = new JSFunction(
       AjaxRendererUtils.AJAX_FUNCTION_NAME);
       ajaxFunction.addParameter(containerId);
       ajaxFunction.addParameter(new JSReference("formId"));
       ajaxFunction.addParameter(new JSReference("event"));
       // AjaxRendererUtils.buildAjaxFunction(
       // component, context);
      
       Map options = AjaxRendererUtils.buildEventOptions(context, component);
       Map parameters = (Map) options.get("parameters");
       parameters.put("action", action);
       parameters.put(Filter.UPLOAD_FILES_ID, new JSReference("uid"));
       parameters.put(clientId, clientId);
       parameters.put(AjaxRendererUtils.AJAX_SINGLE_ATTR, clientId);
       if (oncomplete != null) {
       options.put("onbeforedomupdate", oncomplete);
       }
       ajaxFunction.addParameter(options);
      
       JSFunctionDefinition function = new JSFunctionDefinition("uid");
       function.addParameter("formId");
       function.addParameter("event");
       function.addToBody(ajaxFunction.toScript());
      
       return function.toScript();
       }


      Maybe only putting, ajaxFunction.setLimitToList(true);
      and the same in the intern progressBar, a new limitToList attribute could work. Umm... it's sure that is more dificult, but I suggest a new attribute.


      Thanks.

        • 1. Re: problem with fileUpload. I need limitToList

          There are a little error (jsFunction should be inside a form), now fixed:

          <h:form id="fileUploadForm">
           <a4j:region renderRegionOnly="false">
           <h:panelGrid>
           <rich:fileUpload maxFilesQuantity="10" onuploadcomplete="hack();" id="fileUpload" fileUploadListener="#{filesUploader.listener}">
           <f:facet name="progress">
           <rich:progressBar limitToList="true"/>
           </f:facet>
           </rich:fileUpload>
           </h:panelGrid>
           </a4j:region>
           <a4j:jsFunction name="hack" reRender="filesTree"/>
           </h:form>


          But still, don't work.