Revision: 56487
Author:   cngo
Date:     2015-10-30 16:54:10 +0100 (Fri, 30 Oct 2015)
Log Message:
-----------
CMS-9659: Backported 

- Used a separated channel for ajax requests from add/rename dialogs
 
 - Prevented double form submissions by disabling button before sending ajax 
request [from revision 56282]

- Disabled the button right before sending ajax request, enabled it again after 
request completed 
- Fixed the script to enable/disable button. [from revision 56289]

- Added comments to clarify reason to use a separate AJAX channel in rename/add 
dialogs [from revision 56309]
- Change private variable name to clarify intent [from revision 56332]

Modified Paths:
--------------
    
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/dialog/AbstractDialog.java
    
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/dialog/ButtonWrapper.java
    
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/widgets/NameUriField.java
    
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/AddDocumentDialog.java
    
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/FolderShortcutPlugin.java
    
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/RenameDocumentDialog.java

Modified: 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/dialog/AbstractDialog.java
===================================================================
--- 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/dialog/AbstractDialog.java
  2015-10-30 15:52:28 UTC (rev 56486)
+++ 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/dialog/AbstractDialog.java
  2015-10-30 15:54:10 UTC (rev 56487)
@@ -16,7 +16,6 @@
 package org.hippoecm.frontend.dialog;
 
 import java.io.Serializable;
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -24,9 +23,11 @@
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.ajax.AjaxChannel;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.IAjaxIndicatorAware;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.extensions.ajax.markup.html.AjaxIndicatorAppender;
 import org.apache.wicket.feedback.ContainerFeedbackMessageFilter;
@@ -83,6 +84,7 @@
 
     private boolean fullscreen = false;
     private String buttonCssClass;
+    private AjaxChannel ajaxChannel;
 
     protected static class PersistentFeedbackMessagesModel extends 
FeedbackMessagesModel {
 
@@ -271,11 +273,16 @@
         buttonsView.setOutputMarkupId(true);
         add(buttonsView);
 
-        ok = new ButtonWrapper(new StringResourceModel("ok", 
AbstractDialog.this, null)) {
+        ok = new ButtonWrapper(new ResourceModel("ok")) {
             @Override
             protected void onSubmit() {
                 handleSubmit();
             }
+
+            @Override
+            protected void onUpdateAjaxAttributes(final AjaxRequestAttributes 
attributes) {
+                attributes.setChannel(ajaxChannel);
+            }
         };
         ok.setKeyType(KeyType.Enter);
         buttons.add(ok);
@@ -434,6 +441,10 @@
         ok.setAjax(false);
     }
 
+    public void setAjaxChannel(AjaxChannel ajaxChannel) {
+        this.ajaxChannel = ajaxChannel;
+    }
+
     protected void setOkEnabled(boolean isset) {
         ok.setEnabled(isset);
     }

Modified: 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/dialog/ButtonWrapper.java
===================================================================
--- 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/dialog/ButtonWrapper.java
   2015-10-30 15:52:28 UTC (rev 56486)
+++ 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/dialog/ButtonWrapper.java
   2015-10-30 15:54:10 UTC (rev 56487)
@@ -20,6 +20,8 @@
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.AjaxCallListener;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.ComponentTag;
@@ -89,6 +91,23 @@
                 public boolean isEnabled() {
                     return enabled;
                 }
+
+                @Override
+                protected void updateAjaxAttributes(final 
AjaxRequestAttributes attributes) {
+                    super.updateAjaxAttributes(attributes);
+                    attributes.getAjaxCallListeners().add(new 
AjaxCallListener(){
+                        @Override
+                        public CharSequence getBeforeHandler(final Component 
component) {
+                            return "$('#" + getMarkupId() + 
"').prop('disabled', true);";
+                        }
+
+                        @Override
+                        public CharSequence getCompleteHandler(final Component 
component) {
+                            return "$('#" + getMarkupId() + 
"').prop('disabled', false);";
+                        }
+                    });
+                    ButtonWrapper.this.onUpdateAjaxAttributes(attributes);
+                }
             };
             button.setModel(label);
             return button;
@@ -116,6 +135,9 @@
         }
     }
 
+    protected void onUpdateAjaxAttributes(final AjaxRequestAttributes 
attributes) {
+    }
+
     public Button getButton() {
         if (button == null) {
             button = decorate(createButton());

Modified: 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/widgets/NameUriField.java
===================================================================
--- 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/widgets/NameUriField.java
   2015-10-30 15:52:28 UTC (rev 56486)
+++ 
hippo-cms7/cms/branches/hippo-cms-3.0.x/api/src/main/java/org/hippoecm/frontend/widgets/NameUriField.java
   2015-10-30 15:54:10 UTC (rev 56487)
@@ -17,6 +17,7 @@
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxChannel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.ajax.attributes.ThrottlingSettings;
@@ -41,6 +42,8 @@
     private final IModel<String> nameModel;
     private final IModel<String> urlModel;
 
+    private AjaxChannel ajaxChannel;
+
     private final IModel<StringCodec> codecModel;
 
     private final FormComponent<String> nameComponent;
@@ -97,6 +100,7 @@
             @Override
             protected void updateAjaxAttributes(final AjaxRequestAttributes 
attributes) {
                 super.updateAjaxAttributes(attributes);
+                attributes.setChannel(ajaxChannel);
                 attributes.setThrottlingSettings(new 
ThrottlingSettings(NameUriField.this.getPath(), Duration.milliseconds(500)));
             }
         });
@@ -206,4 +210,8 @@
             target.add(urlComponent);
         }
     }
+
+    public void setAjaxChannel(AjaxChannel ajaxChannel) {
+        this.ajaxChannel = ajaxChannel;
 }
+}

Modified: 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/AddDocumentDialog.java
===================================================================
--- 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/AddDocumentDialog.java
 2015-10-30 15:52:28 UTC (rev 56486)
+++ 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/AddDocumentDialog.java
 2015-10-30 15:54:10 UTC (rev 56487)
@@ -20,6 +20,7 @@
 import java.util.Set;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxChannel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.markup.html.basic.Label;
@@ -62,6 +63,13 @@
 
         add(nameUriContainer = new NameUriField("name-url", 
this.nodeNameCodecModel));
 
+        // The dialog produces ajax requests in NameUriField and OK/Cancel 
dialog buttons, which may cause Wicket
+        // exceptions when typing very fast. Thus it needs to use a dedicated 
ajax channel with ACTIVE behavior when
+        // some AJAX requests may be sent after dialog is closed.
+        final AjaxChannel activeAjaxChannel = new AjaxChannel(getMarkupId(), 
AjaxChannel.Type.ACTIVE);
+        setAjaxChannel(activeAjaxChannel);
+        nameUriContainer.setAjaxChannel(activeAjaxChannel);
+
         final IModel<String> documentType = new 
StringResourceModel("document-type", this, null);
         final Label typeLabel = new Label("typelabel", documentType);
         add(typeLabel);

Modified: 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/FolderShortcutPlugin.java
===================================================================
--- 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/FolderShortcutPlugin.java
      2015-10-30 15:52:28 UTC (rev 56486)
+++ 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/FolderShortcutPlugin.java
      2015-10-30 15:54:10 UTC (rev 56487)
@@ -29,6 +29,7 @@
 import javax.jcr.Session;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.wicket.ajax.AjaxChannel;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
@@ -306,6 +307,13 @@
 
             add(nameUriContainer = new NameUriField("name-url", codecModel));
 
+            // The dialog produces ajax requests in NameUriField and OK/Cancel 
dialog buttons, which may cause Wicket
+            // exceptions when typing very fast. Thus it needs to use a 
dedicated ajax channel with ACTIVE behavior when
+            // some AJAX requests may be sent after dialog is closed.
+            final AjaxChannel activeAjaxChannel = new 
AjaxChannel(getMarkupId(), AjaxChannel.Type.ACTIVE);
+            setAjaxChannel(activeAjaxChannel);
+            nameUriContainer.setAjaxChannel(activeAjaxChannel);
+
             List<String> emptyList = new LinkedList<>();
             emptyList.add("");
 

Modified: 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/RenameDocumentDialog.java
===================================================================
--- 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/RenameDocumentDialog.java
      2015-10-30 15:52:28 UTC (rev 56486)
+++ 
hippo-cms7/cms/branches/hippo-cms-3.0.x/builtin/src/main/java/org/hippoecm/frontend/plugins/standardworkflow/RenameDocumentDialog.java
      2015-10-30 15:54:10 UTC (rev 56487)
@@ -17,6 +17,7 @@
 
 import java.util.Locale;
 
+import org.apache.wicket.ajax.AjaxChannel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.hippoecm.addon.workflow.IWorkflowInvoker;
@@ -49,6 +50,13 @@
 
         add(nameUriContainer = new NameUriField("name-url", 
nodeNameCodecModel, originalUriName, originalTargetName, true));
 
+        // The dialog produces ajax requests in NameUriField and OK/Cancel 
dialog buttons, which may cause Wicket
+        // exceptions when typing very fast. Thus it needs to use a dedicated 
ajax channel with ACTIVE behavior when
+        // some AJAX requests may be sent after dialog is closed.
+        final AjaxChannel activeAjaxChannel = new AjaxChannel(getMarkupId(), 
AjaxChannel.Type.ACTIVE);
+        setAjaxChannel(activeAjaxChannel);
+        nameUriContainer.setAjaxChannel(activeAjaxChannel);
+
         final Locale cmsLocale = UserSession.get().getLocale();
         final RenameMessage message = new RenameMessage(cmsLocale, 
renameDocumentArguments.getLocalizedNames());
         if (message.shouldShow()) {

_______________________________________________
Hippocms-svn mailing list
Hippocms-svn@lists.onehippo.org
https://lists.onehippo.org/mailman/listinfo/hippocms-svn

Reply via email to