diff --git a/forms/gridfield/GridFieldExporter.php b/forms/gridfield/GridFieldExporter.php index b15c27080..d519a7ec5 100644 --- a/forms/gridfield/GridFieldExporter.php +++ b/forms/gridfield/GridFieldExporter.php @@ -47,6 +47,7 @@ class GridFieldExporter implements GridField_HTMLProvider, GridField_ActionProvi null ); $button->setButtonIcon('exportlist'); + $button->addExtraClass('no-ajax'); return array( 'after' => '

' . $button->Field() . '

', ); diff --git a/javascript/GridField.js b/javascript/GridField.js index 0fcfd8d03..c94e15713 100644 --- a/javascript/GridField.js +++ b/javascript/GridField.js @@ -6,7 +6,7 @@ * @param {successCallback} callback to call after reloading succeeded. */ reload: function(ajaxOpts, successCallback) { - var self = this, form = this.closest('form'), data = form.find(':input').serializeArray(); + var self = this, form = this.closest('form'), data = form.find(':input').serializeArray(); if(!ajaxOpts) ajaxOpts = {}; if(!ajaxOpts.data) ajaxOpts.data = []; ajaxOpts.data = ajaxOpts.data.concat(data); @@ -105,6 +105,28 @@ } }); + /** + * Prevents actions from causing an ajax reload of the field. + * Useful e.g. for actions which rely on HTTP response headers being interpreted nativel + * by the browser, like file download triggers. + */ + $('.ss-gridfield .action.no-ajax').entwine({ + onclick: function(e){ + var self = this, btn = this.closest(':button'), grid = this.getGridField(), + form = this.closest('form'), data = form.find(':input').serialize(); + + // Add current button + data += '&' + encodeURIComponent(btn.attr('name')) + '=' + encodeURIComponent(btn.val()); + + // Include any GET parameters from the current URL, as the view state might depend on it. + // For example, a list prefiltered through external search criteria might be passed to GridField. + if(window.location.search) data = window.location.search.replace(/^\?/, '') + '&' + data; + + window.location.href = $.path.makeUrlAbsolute(grid.data('url') + '?' + data, $('base').attr('href')); + return false; + } + }); + $('fieldset.ss-gridfield .new-link').entwine({ onclick: function(e) { this.getGridField().showDetailView($(this).prop('href'));