11jQuery ( 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