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