From 6c98e3b12f8b41a471e37a44eb413ce6489a70be Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sat, 26 Nov 2016 09:58:47 +0100 Subject: [PATCH 1/6] [ticket/9590] Submit permissions form in chunks when using "Apply all" This will add an AJAX call that will submit the permissions form in chunks of 5 fieldsets when clicking on "Apply all permissions". PHPBB3-9590 --- phpBB/adm/style/ajax.js | 78 ++++++++++++++++++++++++++ phpBB/includes/acp/acp_permissions.php | 5 ++ 2 files changed, 83 insertions(+) diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js index 4ad6b6afa5..42dcbe6de8 100644 --- a/phpBB/adm/style/ajax.js +++ b/phpBB/adm/style/ajax.js @@ -62,7 +62,77 @@ phpbb.addAjaxCallback('row_delete', function(res) { } }); +/** + * Handler for submitting permissions form in chunks + * This call will submit permissions forms in chunks of 5 fieldsets. + */ +function submitPermissions() { + var $form = $('form#set-permissions'), + fieldsetList = $form.find('fieldset[id^=perm]'), + formDataSets = [], + $submitAllButton = $form.find('input[type=submit][name^=action]')[0]; + $.each(fieldsetList, function (key, value) { + if (key % 5 === 0) { + formDataSets[Math.floor(key / 5)] = $form.find('fieldset#' + value.id + ' input').serialize(); + } else { + formDataSets[Math.floor(key / 5)] += '&' + $form.find('fieldset#' + value.id + ' input').serialize(); + } + }); + + // Set proper start values for handling refresh of page + var permissionSubmitSize = formDataSets.length, + permissionRequestCount = 0, + permissionSubmitFailed = false; + + /** + * Handler for submitted permissions form chunk + * + * @param {object} res Object returned by AJAX call + */ + function handlePermissionReturn(res) { + permissionRequestCount++; + var $dark = $('#darkenwrapper'); + + if (res.S_USER_WARNING) { + phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT); + permissionSubmitFailed = true; + } else if (!permissionSubmitFailed && res.S_USER_NOTICE) { + if (permissionRequestCount >= permissionSubmitSize) { + var $alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT); + // Do not allow closing alert + $dark.off('click'); + $alert.find('.alert_close').hide(); + + if (typeof res.REFRESH_DATA !== 'undefined') { + setTimeout(function () { + window.location = res.REFRESH_DATA.url; + + // Hide the alert even if we refresh the page, in case the user + // presses the back button. + $dark.fadeOut(phpbb.alertTime, function () { + if (typeof $alert !== 'undefined') { + $alert.hide(); + } + }); + }, res.REFRESH_DATA.time * 1000); // Server specifies time in seconds + } + } + } + } + + $.each(formDataSets, function (key, formData) { + $.ajax({ + url: $form.action, + type: 'POST', + data: formData + '&' + $submitAllButton.name + '=' + encodeURIComponent($submitAllButton.value) + + '&creation_time=' + $form.find('input[type=hidden][name=creation_time]')[0].value + + '&form_token=' + $form.find('input[type=hidden][name=form_token]')[0].value, + success: handlePermissionReturn, + error: handlePermissionReturn + }); + }); +} $('[data-ajax]').each(function() { var $this = $(this), @@ -83,6 +153,14 @@ $('[data-ajax]').each(function() { */ $(function() { phpbb.resizeTextArea($('textarea:not(.no-auto-resize)'), {minHeight: 75}); + + var $setPermissionsForm = $('form#set-permissions'); + if ($setPermissionsForm.length) { + $setPermissionsForm.on('submit', function (e) { + submitPermissions(); + e.preventDefault(); + }); + } }); diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php index 660afb4e93..62e75a2db7 100644 --- a/phpBB/includes/acp/acp_permissions.php +++ b/phpBB/includes/acp/acp_permissions.php @@ -755,6 +755,7 @@ class acp_permissions $this->log_action($mode, 'add', $permission_type, $ug_type, $ug_id, $forum_id); + meta_refresh(5, $this->u_action); trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action)); } @@ -825,10 +826,12 @@ class acp_permissions if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local') { + meta_refresh(5, $this->u_action . '&forum_id[]=' . implode('&forum_id[]=', $forum_ids)); trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&forum_id[]=' . implode('&forum_id[]=', $forum_ids))); } else { + meta_refresh(5, $this->u_action); trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action)); } } @@ -899,10 +902,12 @@ class acp_permissions if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local') { + meta_refresh(5, $this->u_action . '&forum_id[]=' . implode('&forum_id[]=', $forum_id)); trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action . '&forum_id[]=' . implode('&forum_id[]=', $forum_id))); } else { + meta_refresh(5, $this->u_action); trigger_error($user->lang['AUTH_UPDATED'] . adm_back_link($this->u_action)); } } From ff76a3e433700687cb1937cfe97263a94cd539d4 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sat, 26 Nov 2016 12:31:22 +0100 Subject: [PATCH 2/6] [ticket/9590] Correctly set roles and refresh page using POST PHPBB3-9590 --- phpBB/adm/style/ajax.js | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js index 42dcbe6de8..21cc22c6c6 100644 --- a/phpBB/adm/style/ajax.js +++ b/phpBB/adm/style/ajax.js @@ -74,15 +74,16 @@ function submitPermissions() { $.each(fieldsetList, function (key, value) { if (key % 5 === 0) { - formDataSets[Math.floor(key / 5)] = $form.find('fieldset#' + value.id + ' input').serialize(); + formDataSets[Math.floor(key / 5)] = $form.find('fieldset#' + value.id).serialize(); } else { - formDataSets[Math.floor(key / 5)] += '&' + $form.find('fieldset#' + value.id + ' input').serialize(); + formDataSets[Math.floor(key / 5)] += '&' + $form.find('fieldset#' + value.id).serialize(); } }); // Set proper start values for handling refresh of page var permissionSubmitSize = formDataSets.length, permissionRequestCount = 0, + forumIds = [], permissionSubmitFailed = false; /** @@ -98,6 +99,19 @@ function submitPermissions() { phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT); permissionSubmitFailed = true; } else if (!permissionSubmitFailed && res.S_USER_NOTICE) { + // Fill list of selected forums + if (typeof res.REFRESH_DATA !== 'undefined') { + $.each(res.REFRESH_DATA.url.split('&'), function (key, value){ + var forumIdMatch = value.match(/^forum_id\[\]=([0-9]+)$/); + if (forumIdMatch !== null) { + forumIds.push(forumIdMatch[1]); + // Remove added forum IDs from refresh URL + res.REFRESH_DATA.url = res.REFRESH_DATA.url.replace('&' + forumIdMatch[0], ''); + } + }); + } + + // Display success message at the end of submitting the form if (permissionRequestCount >= permissionSubmitSize) { var $alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT); // Do not allow closing alert @@ -106,7 +120,15 @@ function submitPermissions() { if (typeof res.REFRESH_DATA !== 'undefined') { setTimeout(function () { - window.location = res.REFRESH_DATA.url; + // Create forum to submit using POST. This will prevent + // exceeding the maximum length of URLs + var form = '
'; + $.each(forumIds, function (key, value) { + form += ''; + }); + form += '
'; + $form = $(form); + $('body').append($form); // Hide the alert even if we refresh the page, in case the user // presses the back button. @@ -115,12 +137,16 @@ function submitPermissions() { $alert.hide(); } }); + + // Submit form + $form.submit(); }, res.REFRESH_DATA.time * 1000); // Server specifies time in seconds } } } } + // Create AJAX request for each form data set $.each(formDataSets, function (key, formData) { $.ajax({ url: $form.action, From 30b3fbb2cf4fba62ab4deb3cbcb5875e26af8cf4 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sat, 26 Nov 2016 13:27:24 +0100 Subject: [PATCH 3/6] [ticket/9590] Support ajax submit of permissions for specific forums PHPBB3-9590 --- phpBB/adm/style/ajax.js | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js index 21cc22c6c6..d95b1d47d6 100644 --- a/phpBB/adm/style/ajax.js +++ b/phpBB/adm/style/ajax.js @@ -70,15 +70,8 @@ function submitPermissions() { var $form = $('form#set-permissions'), fieldsetList = $form.find('fieldset[id^=perm]'), formDataSets = [], - $submitAllButton = $form.find('input[type=submit][name^=action]')[0]; - - $.each(fieldsetList, function (key, value) { - if (key % 5 === 0) { - formDataSets[Math.floor(key / 5)] = $form.find('fieldset#' + value.id).serialize(); - } else { - formDataSets[Math.floor(key / 5)] += '&' + $form.find('fieldset#' + value.id).serialize(); - } - }); + $submitAllButton = $form.find('input[type=submit][name^=action]')[0], + $submitButton = $form.find('input[type=submit][data-clicked=true]')[0]; // Set proper start values for handling refresh of page var permissionSubmitSize = formDataSets.length, @@ -86,6 +79,24 @@ function submitPermissions() { forumIds = [], permissionSubmitFailed = false; + if ($submitAllButton === $submitButton) { + $.each(fieldsetList, function (key, value) { + if (key % 5 === 0) { + formDataSets[Math.floor(key / 5)] = $form.find('fieldset#' + value.id).serialize(); + } else { + formDataSets[Math.floor(key / 5)] += '&' + $form.find('fieldset#' + value.id).serialize(); + } + }); + } else { + formDataSets[0] = $form.find('fieldset#' + $submitButton.closest('fieldset.permissions').id).serialize(); + // Add each forum ID to forum ID list to preserve selected forums + $.each($form.find('input[type=hidden][name^=forum_id]'), function (key, value) { + if (value.name.match(/^forum_id\[([0-9]+)\]$/)) { + forumIds.push(value.value); + } + }); + } + /** * Handler for submitted permissions form chunk * @@ -186,6 +197,10 @@ $(function() { submitPermissions(); e.preventDefault(); }); + $setPermissionsForm.find('input[type=submit]').click(function() { + $('input[type=submit]', $(this).parents($('form#set-permissions'))).removeAttr('data-clicked'); + $(this).attr('data-clicked', true); + }); } }); From b01b3b8b94ed2f77b9855c53d590bd9e3e734278 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sat, 26 Nov 2016 23:31:52 +0100 Subject: [PATCH 4/6] [ticket/9590] Preserve selected forums after previous page redirect Also improved the way the forum ID list is generated when clicking on "Apply all permissions". PHPBB3-9590 --- phpBB/adm/style/ajax.js | 47 ++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js index d95b1d47d6..e9f03baac3 100644 --- a/phpBB/adm/style/ajax.js +++ b/phpBB/adm/style/ajax.js @@ -89,14 +89,15 @@ function submitPermissions() { }); } else { formDataSets[0] = $form.find('fieldset#' + $submitButton.closest('fieldset.permissions').id).serialize(); - // Add each forum ID to forum ID list to preserve selected forums - $.each($form.find('input[type=hidden][name^=forum_id]'), function (key, value) { - if (value.name.match(/^forum_id\[([0-9]+)\]$/)) { - forumIds.push(value.value); - } - }); } + // Add each forum ID to forum ID list to preserve selected forums + $.each($form.find('input[type=hidden][name^=forum_id]'), function (key, value) { + if (value.name.match(/^forum_id\[([0-9]+)\]$/)) { + forumIds.push(value.value); + } + }); + /** * Handler for submitted permissions form chunk * @@ -110,21 +111,29 @@ function submitPermissions() { phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT); permissionSubmitFailed = true; } else if (!permissionSubmitFailed && res.S_USER_NOTICE) { - // Fill list of selected forums - if (typeof res.REFRESH_DATA !== 'undefined') { - $.each(res.REFRESH_DATA.url.split('&'), function (key, value){ - var forumIdMatch = value.match(/^forum_id\[\]=([0-9]+)$/); - if (forumIdMatch !== null) { - forumIds.push(forumIdMatch[1]); - // Remove added forum IDs from refresh URL - res.REFRESH_DATA.url = res.REFRESH_DATA.url.replace('&' + forumIdMatch[0], ''); - } - }); - } - // Display success message at the end of submitting the form if (permissionRequestCount >= permissionSubmitSize) { var $alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT); + var $alertBoxLink = $alert.find('p.alert_text > a'); + + // Create form to submit instead of normal "Back to previous page" link + if ($alertBoxLink) { + // Remove forum_id[] from URL + $alertBoxLink.attr('href', $alertBoxLink.attr('href').replace(/(&forum_id\[\]=[0-9]+)/, '')); + var previousPageForm = '
'; + $.each(forumIds, function (key, value) { + previousPageForm += ''; + }); + previousPageForm += '
'; + + $alertBoxLink.on('click', function (e) { + var $previousPageForm = $(previousPageForm); + $('body').append($previousPageForm); + e.preventDefault(); + $previousPageForm.submit(); + }); + } + // Do not allow closing alert $dark.off('click'); $alert.find('.alert_close').hide(); @@ -133,7 +142,7 @@ function submitPermissions() { setTimeout(function () { // Create forum to submit using POST. This will prevent // exceeding the maximum length of URLs - var form = '
'; + var form = ''; $.each(forumIds, function (key, value) { form += ''; }); From 0f46d35f7548c76f352b55855225a343238809e8 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sat, 26 Nov 2016 23:56:11 +0100 Subject: [PATCH 5/6] [ticket/9590] Further deduplicate code for form data PHPBB3-9590 --- phpBB/adm/style/ajax.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js index e9f03baac3..64670f9d10 100644 --- a/phpBB/adm/style/ajax.js +++ b/phpBB/adm/style/ajax.js @@ -79,18 +79,18 @@ function submitPermissions() { forumIds = [], permissionSubmitFailed = false; - if ($submitAllButton === $submitButton) { - $.each(fieldsetList, function (key, value) { - if (key % 5 === 0) { - formDataSets[Math.floor(key / 5)] = $form.find('fieldset#' + value.id).serialize(); - } else { - formDataSets[Math.floor(key / 5)] += '&' + $form.find('fieldset#' + value.id).serialize(); - } - }); - } else { - formDataSets[0] = $form.find('fieldset#' + $submitButton.closest('fieldset.permissions').id).serialize(); + if ($submitAllButton !== $submitButton) { + fieldsetList = $form.find('fieldset#' + $submitButton.closest('fieldset.permissions').id); } + $.each(fieldsetList, function (key, value) { + if (key % 5 === 0) { + formDataSets[Math.floor(key / 5)] = $form.find('fieldset#' + value.id).serialize(); + } else { + formDataSets[Math.floor(key / 5)] += '&' + $form.find('fieldset#' + value.id).serialize(); + } + }); + // Add each forum ID to forum ID list to preserve selected forums $.each($form.find('input[type=hidden][name^=forum_id]'), function (key, value) { if (value.name.match(/^forum_id\[([0-9]+)\]$/)) { From 5e36dd3d0bcc046437ca8ecd0ae144fc33d799a2 Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Sun, 27 Nov 2016 00:12:59 +0100 Subject: [PATCH 6/6] [ticket/9590] Correctly update submit size and replace all forum_id[] PHPBB3-9590 --- phpBB/adm/style/ajax.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/phpBB/adm/style/ajax.js b/phpBB/adm/style/ajax.js index 64670f9d10..7ddd2d3742 100644 --- a/phpBB/adm/style/ajax.js +++ b/phpBB/adm/style/ajax.js @@ -74,7 +74,7 @@ function submitPermissions() { $submitButton = $form.find('input[type=submit][data-clicked=true]')[0]; // Set proper start values for handling refresh of page - var permissionSubmitSize = formDataSets.length, + var permissionSubmitSize = 0, permissionRequestCount = 0, forumIds = [], permissionSubmitFailed = false; @@ -91,6 +91,8 @@ function submitPermissions() { } }); + permissionSubmitSize = formDataSets.length; + // Add each forum ID to forum ID list to preserve selected forums $.each($form.find('input[type=hidden][name^=forum_id]'), function (key, value) { if (value.name.match(/^forum_id\[([0-9]+)\]$/)) { @@ -119,7 +121,7 @@ function submitPermissions() { // Create form to submit instead of normal "Back to previous page" link if ($alertBoxLink) { // Remove forum_id[] from URL - $alertBoxLink.attr('href', $alertBoxLink.attr('href').replace(/(&forum_id\[\]=[0-9]+)/, '')); + $alertBoxLink.attr('href', $alertBoxLink.attr('href').replace(/(&forum_id\[\]=[0-9]+)/g, '')); var previousPageForm = ''; $.each(forumIds, function (key, value) { previousPageForm += ''; @@ -142,7 +144,7 @@ function submitPermissions() { setTimeout(function () { // Create forum to submit using POST. This will prevent // exceeding the maximum length of URLs - var form = ''; + var form = ''; $.each(forumIds, function (key, value) { form += ''; });