WICKET-6286 Add support for success callback to 'NewWindow' location Add 'onDownloadCompleted()' callback that is executed after any success or failure callback. Like in jQuery - do something in all cases.
WICKET-6340 Use XHTML friendly markup when creating the iframe Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a7c01094 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a7c01094 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a7c01094 Branch: refs/heads/master Commit: a7c01094b369c95316ee103f364f04f57cbba1ad Parents: 27bb0bb Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org> Authored: Mon Mar 20 17:26:23 2017 +0100 Committer: Sven Meier <svenme...@apache.org> Committed: Tue Mar 21 23:23:17 2017 +0100 ---------------------------------------------------------------------- .../examples/ajax/builtin/AjaxDownloadPage.java | 9 ++++++- .../wicket/extensions/ajax/AjaxDownload.java | 28 +++++++++++++++++++- .../extensions/ajax/wicket-ajaxdownload.js | 24 ++++++++++------- 3 files changed, 50 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/a7c01094/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java index 3a7ccb5..b339b64 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java @@ -252,8 +252,15 @@ public class AjaxDownloadPage extends BasePage downloadingContainer.setVisible(false); target.add(downloadingContainer); } + + @Override + protected void onDownloadCompleted(AjaxRequestTarget target) + { + downloadingContainer.setVisible(false); + target.add(downloadingContainer); + } }; - download.setLocation(AjaxDownload.Location.NewWindow); + download.setLocation(AjaxDownload.Location.SameWindow); add(download); add(new AjaxLink<Void>("downloadInNewWindow") http://git-wip-us.apache.org/repos/asf/wicket/blob/a7c01094/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java index aacbfd9..34595e6 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java @@ -72,18 +72,23 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior * The resource will be downloaded via a temporary created iframe. * This is recommended when there are resources in the DOM which will be * closed automatically on JavaScript <em>unload</em> event, like WebSockets. + * Supports both <em>success</em> and <em>failure</em> callbacks! */ IFrame, /** * The resource will be downloaded by changing the location of the current DOM document. * Note: This will trigger JavaScript <em>unload</em> event on the page! + * Supports only <em>success</em> callback, i.e. it is not possible to detect whether + * the download has finished successfully or not. */ - Self, + SameWindow, /** * The resource will be downloaded in a new browser window by using JavaScript * <code>window.open()</code> API. + * Supports only <em>success</em> callback, i.e. it is not possible to detect whether + * the download has finished successfully or not. */ NewWindow } @@ -230,14 +235,34 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior { } + /** + * A callback executed when the download of the resource finished successfully. + * + * @param target The Ajax request handler + */ protected void onDownloadSuccess(AjaxRequestTarget target) { } + /** + * A callback executed when the download of the resource failed for some reason, + * e.g. an error at the server side. + * + * @param target The Ajax request handler + */ protected void onDownloadFailed(AjaxRequestTarget target) { } + /** + * A callback executed when the download of the resource finished successfully or with a failure. + * + * @param target The Ajax request handler + */ + protected void onDownloadCompleted(AjaxRequestTarget target) + { + } + @Override public void renderHead(Component component, IHeaderResponse response) { @@ -255,6 +280,7 @@ public class AjaxDownload extends AbstractDefaultAjaxBehavior } else if ("failed".equals(result)) { onDownloadFailed(target); } + onDownloadCompleted(target); } public final Location getLocation() { http://git-wip-us.apache.org/repos/asf/wicket/blob/a7c01094/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js index 4c5d554..26de71e 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js @@ -28,6 +28,12 @@ Wicket.AjaxDownload = { initiate : function(settings) { + var notifyServer = function (result) { + settings.attributes.ep = settings.attributes.ep || {}; + settings.attributes.ep.result = result; + Wicket.Ajax.ajax(settings.attributes); + }; + var checkComplete = function (frame) { var result; @@ -47,9 +53,7 @@ }, 0); } - settings.attributes.ep = settings.attributes.ep || {}; - settings.attributes.ep.result = result; - Wicket.Ajax.ajax(settings.attributes); + notifyServer(result); } else { setTimeout(function() { checkComplete(frame); @@ -57,16 +61,18 @@ } }; - if (settings.method === 'self') { + if (settings.method === 'samewindow') { setTimeout(function () { - window.location.href = settings.downloadUrl; + window.location.assign(settings.downloadUrl); checkComplete(); - }, 100); + }, 10); } else if (settings.method === 'newwindow') { - window.open(settings.downloadUrl, 'ajax-download'); - checkComplete(); + var wo = window.open(settings.downloadUrl, 'ajax-download'); + jQuery(wo).load(function(evt) { + notifyServer(undefined); + }); } else { - var frame = jQuery("<iframe>").hide().prop("src", settings.downloadUrl).appendTo("body"); + var frame = jQuery("<iframe></iframe>").hide().prop("src", settings.downloadUrl).appendTo("body"); checkComplete(frame); } }