Skip to content

Commit 12b3df6

Browse files
Merge pull request #270 from JLG-WOCFR-DEV/codex/add-redirect-button-with-ajax-handling
Add apply redirect quick action and bulk handler
2 parents f059b9d + bcb1d4e commit 12b3df6

File tree

3 files changed

+578
-85
lines changed

3 files changed

+578
-85
lines changed

liens-morts-detector-jlg/assets/js/blc-admin-scripts.js

Lines changed: 189 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
jQuery(document).ready(function($) {
2-
var ACTION_FOCUS_SELECTOR = '.blc-edit-link, .blc-unlink, .blc-ignore, .blc-suggest-redirect, .blc-view-context, .blc-recheck';
2+
var ACTION_FOCUS_SELECTOR = '.blc-edit-link, .blc-unlink, .blc-ignore, .blc-suggest-redirect, .blc-apply-redirect, .blc-view-context, .blc-recheck';
33

44
var defaultMessages = {
55
editPromptMessage: "Entrez la nouvelle URL pour :\n%s",
@@ -42,7 +42,14 @@ jQuery(document).ready(function($) {
4242
contextLabel: 'Contexte',
4343
recheckInProgress: 'Re-vérification du lien en cours…',
4444
recheckSuccess: 'La re-vérification du lien est terminée.',
45-
recheckError: 'Impossible de re-vérifier le lien. Veuillez réessayer.'
45+
recheckError: 'Impossible de re-vérifier le lien. Veuillez réessayer.',
46+
applyRedirectConfirmation: 'Appliquer la redirection détectée vers %s ?',
47+
applyRedirectSuccess: 'La redirection détectée a été appliquée.',
48+
applyRedirectError: 'Impossible d\'appliquer la redirection détectée.',
49+
applyRedirectMissingTarget: 'Aucune redirection détectée n\'est disponible pour ce lien.',
50+
applyRedirectModalTitle: 'Appliquer la redirection détectée',
51+
applyRedirectModalConfirm: 'Appliquer',
52+
bulkApplyRedirectModalMessage: 'Voulez-vous appliquer la redirection détectée aux %s liens sélectionnés ?'
4653
};
4754

4855
var messages = $.extend({}, defaultMessages, window.blcAdminMessages || {});
@@ -737,7 +744,44 @@ jQuery(document).ready(function($) {
737744

738745
accessibility.speak(getAnnouncementMessage(response), 'polite');
739746

740-
var nextFocusTarget = findNextFocusTarget($row);
747+
var rowHtml = '';
748+
var rowRemoved = true;
749+
if (response && response.data) {
750+
if (typeof response.data.rowHtml === 'string') {
751+
rowHtml = response.data.rowHtml;
752+
}
753+
754+
if (typeof response.data.rowRemoved !== 'undefined') {
755+
rowRemoved = !!response.data.rowRemoved;
756+
}
757+
}
758+
759+
var $replacementRow = $();
760+
if (rowHtml) {
761+
var $candidate = $(rowHtml);
762+
if ($candidate.length) {
763+
$replacementRow = $candidate.filter('tr').first();
764+
if (!$replacementRow.length) {
765+
$replacementRow = $candidate.find('tr').first();
766+
}
767+
}
768+
}
769+
770+
if ($replacementRow && $replacementRow.length && response && response.data && typeof response.data.rowRemoved === 'undefined') {
771+
rowRemoved = false;
772+
}
773+
774+
var nextFocusTarget = null;
775+
if ($replacementRow && $replacementRow.length) {
776+
var $firstAction = $replacementRow.find(ACTION_FOCUS_SELECTOR).filter(':visible').first();
777+
if ($firstAction.length) {
778+
nextFocusTarget = $firstAction[0];
779+
}
780+
}
781+
782+
if (!nextFocusTarget) {
783+
nextFocusTarget = findNextFocusTarget($row);
784+
}
741785

742786
if (helpers && typeof helpers.close === 'function') {
743787
helpers.close(nextFocusTarget);
@@ -747,6 +791,29 @@ jQuery(document).ready(function($) {
747791
var $normalizedRow = $currentRow && $currentRow.jquery ? $currentRow : $();
748792
var $tbody = $normalizedRow.closest('tbody');
749793

794+
if (!rowRemoved && $replacementRow && $replacementRow.length && $normalizedRow.length) {
795+
if (!$tbody.length) {
796+
$tbody = $('#the-list');
797+
}
798+
799+
$normalizedRow.replaceWith($replacementRow);
800+
801+
$(document).trigger('blcAdmin:listUpdated', {
802+
response: response,
803+
tbody: $tbody,
804+
table: $tbody.closest('table'),
805+
messageRow: null,
806+
replacedRow: $replacementRow
807+
});
808+
809+
return;
810+
}
811+
812+
if (!rowRemoved) {
813+
$normalizedRow.css('opacity', 1);
814+
return;
815+
}
816+
750817
if ($normalizedRow.length) {
751818
$normalizedRow.remove();
752819
}
@@ -787,7 +854,9 @@ jQuery(document).ready(function($) {
787854
}
788855

789856
if ($row && $row.length) {
790-
if (prefersReducedMotion) {
857+
if (!rowRemoved) {
858+
finalizeListUpdate($row);
859+
} else if (prefersReducedMotion) {
791860
finalizeListUpdate($row);
792861
} else {
793862
$row.fadeOut(300, function() {
@@ -862,6 +931,62 @@ jQuery(document).ready(function($) {
862931
});
863932
});
864933

934+
$('#the-list').on('click', '.blc-apply-redirect', function(e) {
935+
e.preventDefault();
936+
937+
var linkElement = $(this);
938+
var detectedTarget = linkElement.data('detectedTarget');
939+
if (typeof detectedTarget !== 'string') {
940+
detectedTarget = '';
941+
}
942+
detectedTarget = detectedTarget.trim();
943+
944+
if (!detectedTarget) {
945+
var missingMessage = messages.applyRedirectMissingTarget || messages.applyRedirectError || messages.genericError;
946+
accessibility.speak(missingMessage, 'assertive');
947+
window.alert(missingMessage);
948+
return;
949+
}
950+
951+
var confirmationTemplate = messages.applyRedirectConfirmation || '';
952+
var confirmationMessage = confirmationTemplate ? formatTemplate(confirmationTemplate, detectedTarget) : '';
953+
if (confirmationMessage) {
954+
if (!window.confirm(confirmationMessage)) {
955+
return;
956+
}
957+
}
958+
959+
var oldUrl = linkElement.data('url');
960+
if (typeof oldUrl !== 'string') {
961+
oldUrl = '';
962+
}
963+
var postId = linkElement.data('postid');
964+
var rowId = linkElement.data('rowId');
965+
if (typeof rowId === 'undefined') {
966+
rowId = '';
967+
}
968+
var occurrenceIndex = linkElement.data('occurrenceIndex');
969+
if (typeof occurrenceIndex === 'undefined') {
970+
occurrenceIndex = '';
971+
}
972+
var nonce = linkElement.data('nonce');
973+
974+
var helpers = createInlineActionHelpers(linkElement, {
975+
errorMessage: messages.applyRedirectError
976+
});
977+
978+
processLinkUpdate(linkElement, {
979+
helpers: helpers,
980+
value: detectedTarget,
981+
oldUrl: oldUrl,
982+
postId: postId,
983+
rowId: rowId,
984+
occurrenceIndex: occurrenceIndex,
985+
nonce: nonce,
986+
action: 'blc_apply_detected_redirect'
987+
});
988+
});
989+
865990
function getSelectedBulkAction($form) {
866991
var action = $form.find('select[name="action"]').val();
867992

@@ -891,6 +1016,10 @@ jQuery(document).ready(function($) {
8911016
title = messages.restoreModalTitle || '';
8921017
confirmText = messages.restoreModalConfirm || '';
8931018
template = messages.bulkRestoreModalMessage || '';
1019+
} else if (action === 'apply_redirect') {
1020+
title = messages.applyRedirectModalTitle || messages.editModalTitle || '';
1021+
confirmText = messages.applyRedirectModalConfirm || messages.editModalConfirm || '';
1022+
template = messages.bulkApplyRedirectModalMessage || '';
8941023
} else {
8951024
title = messages.unlinkModalTitle || '';
8961025
confirmText = messages.unlinkModalConfirm || '';
@@ -974,8 +1103,45 @@ jQuery(document).ready(function($) {
9741103
return /\s/.test(value);
9751104
}
9761105

1106+
function createInlineActionHelpers(button, options) {
1107+
var $button = $(button);
1108+
var settings = options || {};
1109+
1110+
return {
1111+
setSubmitting: function(state) {
1112+
$button.prop('disabled', !!state);
1113+
if (state) {
1114+
$button.attr('aria-busy', 'true');
1115+
} else {
1116+
$button.removeAttr('aria-busy');
1117+
}
1118+
},
1119+
showError: function(message) {
1120+
var fallback = settings.errorMessage || messages.applyRedirectError || messages.genericError;
1121+
var finalMessage = message || fallback;
1122+
1123+
accessibility.speak(finalMessage, 'assertive');
1124+
window.alert(finalMessage);
1125+
},
1126+
close: function(nextFocus) {
1127+
$button.prop('disabled', false);
1128+
$button.removeAttr('aria-busy');
1129+
1130+
if (nextFocus && typeof nextFocus.focus === 'function') {
1131+
nextFocus.focus();
1132+
} else if (settings.restoreFocus !== false) {
1133+
$button.focus();
1134+
}
1135+
}
1136+
};
1137+
}
1138+
9771139
function processLinkUpdate(linkElement, params) {
978-
var helpers = params.helpers;
1140+
var helpers = params.helpers || {
1141+
setSubmitting: function() {},
1142+
showError: function() {},
1143+
close: function() {}
1144+
};
9791145
var oldUrl = params.oldUrl || '';
9801146
var trimmedValue = (params.value || '').trim();
9811147

@@ -994,32 +1160,44 @@ jQuery(document).ready(function($) {
9941160
return;
9951161
}
9961162

997-
helpers.setSubmitting(true);
1163+
if (typeof helpers.setSubmitting === 'function') {
1164+
helpers.setSubmitting(true);
1165+
}
9981166

9991167
var row = linkElement.closest('tr');
10001168
row.css('opacity', 0.5);
10011169

1002-
$.post(ajaxurl, {
1003-
action: 'blc_edit_link',
1170+
var requestData = {
1171+
action: params.action || 'blc_edit_link',
10041172
post_id: params.postId,
10051173
row_id: params.rowId,
10061174
occurrence_index: params.occurrenceIndex,
10071175
old_url: oldUrl,
10081176
new_url: trimmedValue,
10091177
_ajax_nonce: params.nonce
1010-
}).done(function(response) {
1178+
};
1179+
1180+
if (params.extraData && typeof params.extraData === 'object') {
1181+
$.extend(requestData, params.extraData);
1182+
}
1183+
1184+
$.post(ajaxurl, requestData).done(function(response) {
10111185
if (response && response.success) {
10121186
handleSuccessfulResponse(response, row, helpers);
10131187
} else {
10141188
var errorMessage = response && response.data && response.data.message
10151189
? response.data.message
10161190
: messages.genericError;
1017-
helpers.setSubmitting(false);
1191+
if (typeof helpers.setSubmitting === 'function') {
1192+
helpers.setSubmitting(false);
1193+
}
10181194
helpers.showError((messages.errorPrefix || '') + errorMessage);
10191195
row.css('opacity', 1);
10201196
}
10211197
}).fail(function() {
1022-
helpers.setSubmitting(false);
1198+
if (typeof helpers.setSubmitting === 'function') {
1199+
helpers.setSubmitting(false);
1200+
}
10231201
helpers.showError(messages.genericError);
10241202
row.css('opacity', 1);
10251203
});

0 commit comments

Comments
 (0)