2018-06-27 22:30:15 -04:00
/ * *
2019-06-20 10:45:51 -04:00
* Handles updating and editing comments .
*
* @ file This file contains functionality for the admin comments page .
2019-06-26 14:19:52 -04:00
* @ since 2.1 . 0
2018-06-27 22:30:15 -04:00
* @ output wp - admin / js / edit - comments . js
* /
2020-07-06 16:17:02 -04:00
/* global adminCommentsSettings, thousandsSeparator, list_args, QTags, ajaxurl, wpAjax */
2018-08-19 09:33:24 -04:00
/* global commentReply, theExtraList, theList, setCommentsList */
2012-08-22 20:04:18 -04:00
( function ( $ ) {
2015-08-31 13:58:22 -04:00
var getCount , updateCount , updateCountText , updatePending , updateApproved ,
2019-03-18 11:22:53 -04:00
updateHtmlTitle , updateDashboardText , updateInModerationText , adminTitle = document . title ,
2015-09-24 16:16:49 -04:00
isDashboard = $ ( '#dashboard_right_now' ) . length ,
2020-07-06 16:17:02 -04:00
titleDiv , titleRegEx ,
_ _ = wp . i18n . _ _ ;
2012-08-22 20:04:18 -04:00
2019-06-20 10:45:51 -04:00
/ * *
* Extracts a number from the content of a jQuery element .
*
* @ since 2.9 . 0
* @ access private
*
* @ param { jQuery } el jQuery element .
*
* @ return { number } The number found in the given element .
* /
2015-09-24 16:16:49 -04:00
getCount = function ( el ) {
var n = parseInt ( el . html ( ) . replace ( /[^0-9]+/g , '' ) , 10 ) ;
if ( isNaN ( n ) ) {
return 0 ;
2015-09-24 11:53:25 -04:00
}
2015-09-24 16:16:49 -04:00
return n ;
} ;
2015-09-24 11:53:25 -04:00
2019-06-20 10:45:51 -04:00
/ * *
* Updates an html element with a localized number string .
*
* @ since 2.9 . 0
* @ access private
*
* @ param { jQuery } el The jQuery element to update .
* @ param { number } n Number to be put in the element .
*
* @ return { void }
* /
2015-09-24 16:16:49 -04:00
updateCount = function ( el , n ) {
var n1 = '' ;
if ( isNaN ( n ) ) {
return ;
2012-08-22 20:04:18 -04:00
}
2015-09-24 16:16:49 -04:00
n = n < 1 ? '0' : n . toString ( ) ;
if ( n . length > 3 ) {
while ( n . length > 3 ) {
n1 = thousandsSeparator + n . substr ( n . length - 3 ) + n1 ;
n = n . substr ( 0 , n . length - 3 ) ;
}
n = n + n1 ;
2015-08-20 12:36:25 -04:00
}
2015-09-24 16:16:49 -04:00
el . html ( n ) ;
2012-08-22 20:04:18 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Updates the number of approved comments on a specific post and the filter bar .
*
* @ since 4.4 . 0
* @ access private
*
* @ param { number } diff The amount to lower or raise the approved count with .
* @ param { number } commentPostId The ID of the post to be updated .
*
* @ return { void }
* /
2015-09-24 16:16:49 -04:00
updateApproved = function ( diff , commentPostId ) {
var postSelector = '.post-com-count-' + commentPostId ,
noClass = 'comment-count-no-comments' ,
approvedClass = 'comment-count-approved' ,
approved ,
noComments ;
2012-08-22 20:04:18 -04:00
2015-09-24 16:16:49 -04:00
updateCountText ( 'span.approved-count' , diff ) ;
2012-08-22 20:04:18 -04:00
2015-09-24 16:16:49 -04:00
if ( ! commentPostId ) {
return ;
}
2012-08-22 20:04:18 -04:00
2019-06-20 10:45:51 -04:00
// Cache selectors to not get duplicates.
2015-09-24 16:16:49 -04:00
approved = $ ( 'span.' + approvedClass , postSelector ) ;
noComments = $ ( 'span.' + noClass , postSelector ) ;
2012-08-22 20:04:18 -04:00
2015-09-24 16:16:49 -04:00
approved . each ( function ( ) {
var a = $ ( this ) , n = getCount ( a ) + diff ;
if ( n < 1 )
n = 0 ;
2012-08-22 20:04:18 -04:00
2015-09-24 16:16:49 -04:00
if ( 0 === n ) {
a . removeClass ( approvedClass ) . addClass ( noClass ) ;
2012-08-22 20:04:18 -04:00
} else {
2015-09-24 16:16:49 -04:00
a . addClass ( approvedClass ) . removeClass ( noClass ) ;
2012-08-22 20:04:18 -04:00
}
2015-09-24 16:16:49 -04:00
updateCount ( a , n ) ;
} ) ;
2012-08-22 20:04:18 -04:00
2015-09-24 16:16:49 -04:00
noComments . each ( function ( ) {
var a = $ ( this ) ;
if ( diff > 0 ) {
a . removeClass ( noClass ) . addClass ( approvedClass ) ;
} else {
a . addClass ( noClass ) . removeClass ( approvedClass ) ;
}
updateCount ( a , diff ) ;
} ) ;
2012-08-22 20:04:18 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Updates a number count in all matched HTML elements
*
* @ since 4.4 . 0
* @ access private
*
* @ param { string } selector The jQuery selector for elements to update a count
* for .
* @ param { number } diff The amount to lower or raise the count with .
*
* @ return { void }
* /
2015-09-24 16:16:49 -04:00
updateCountText = function ( selector , diff ) {
$ ( selector ) . each ( function ( ) {
var a = $ ( this ) , n = getCount ( a ) + diff ;
if ( n < 1 ) {
n = 0 ;
}
updateCount ( a , n ) ;
} ) ;
2012-08-22 20:04:18 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Updates a text about comment count on the dashboard .
*
* @ since 4.4 . 0
* @ access private
*
* @ param { Object } response Ajax response from the server that includes a
* translated "comment count" message .
*
* @ return { void }
* /
2019-03-18 11:22:53 -04:00
updateDashboardText = function ( response ) {
2015-09-24 16:16:49 -04:00
if ( ! isDashboard || ! response || ! response . i18n _comments _text ) {
2012-08-22 20:04:18 -04:00
return ;
}
2015-09-24 16:16:49 -04:00
2019-03-18 11:22:53 -04:00
$ ( '.comment-count a' , '#dashboard_right_now' ) . text ( response . i18n _comments _text ) ;
} ;
2015-09-24 16:16:49 -04:00
2019-03-18 11:22:53 -04:00
/ * *
* Updates the "comments in moderation" text across the UI .
*
* @ since 5.2 . 0
*
2020-07-27 19:35:02 -04:00
* @ param { Object } response Ajax response from the server that includes a
2019-06-20 10:45:51 -04:00
* translated "comments in moderation" message .
2019-03-18 11:22:53 -04:00
*
* @ return { void }
* /
updateInModerationText = function ( response ) {
if ( ! response || ! response . i18n _moderation _text ) {
return ;
}
// Update the "comment in moderation" text across the UI.
$ ( '.comments-in-moderation-text' ) . text ( response . i18n _moderation _text ) ;
// Hide the "comment in moderation" text in the Dashboard "At a Glance" widget.
if ( isDashboard && response . in _moderation ) {
$ ( '.comment-mod-count' , '#dashboard_right_now' )
[ response . in _moderation > 0 ? 'removeClass' : 'addClass' ] ( 'hidden' ) ;
}
2012-08-22 20:04:18 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Updates the title of the document with the number comments to be approved .
*
* @ since 4.4 . 0
* @ access private
*
* @ param { number } diff The amount to lower or raise the number of to be
* approved comments with .
*
* @ return { void }
* /
2019-03-18 11:22:53 -04:00
updateHtmlTitle = function ( diff ) {
2015-09-09 21:03:25 -04:00
var newTitle , regExMatch , titleCount , commentFrag ;
2015-08-31 13:58:22 -04:00
2020-07-06 16:17:02 -04:00
/* translators: %s: Comments count. */
titleRegEx = titleRegEx || new RegExp ( _ _ ( 'Comments (%s)' ) . replace ( '%s' , '\\([0-9' + thousandsSeparator + ']+\\)' ) + '?' ) ;
2020-01-28 19:45:18 -05:00
// Count funcs operate on a $'d element.
2015-08-31 13:58:22 -04:00
titleDiv = titleDiv || $ ( '<div />' ) ;
newTitle = adminTitle ;
2015-09-09 21:03:25 -04:00
commentFrag = titleRegEx . exec ( document . title ) ;
if ( commentFrag ) {
commentFrag = commentFrag [ 0 ] ;
titleDiv . html ( commentFrag ) ;
titleCount = getCount ( titleDiv ) + diff ;
} else {
titleDiv . html ( 0 ) ;
titleCount = diff ;
}
2015-08-31 13:58:22 -04:00
if ( titleCount >= 1 ) {
updateCount ( titleDiv , titleCount ) ;
regExMatch = titleRegEx . exec ( document . title ) ;
if ( regExMatch ) {
2020-07-06 16:17:02 -04:00
/* translators: %s: Comments count. */
newTitle = document . title . replace ( regExMatch [ 0 ] , _ _ ( 'Comments (%s)' ) . replace ( '%s' , titleDiv . text ( ) ) + ' ' ) ;
2015-08-31 13:58:22 -04:00
}
} else {
regExMatch = titleRegEx . exec ( newTitle ) ;
if ( regExMatch ) {
2020-07-06 17:34:04 -04:00
newTitle = newTitle . replace ( regExMatch [ 0 ] , _ _ ( 'Comments' ) ) ;
2015-08-31 13:58:22 -04:00
}
}
document . title = newTitle ;
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Updates the number of pending comments on a specific post and the filter bar .
*
* @ since 3.2 . 0
* @ access private
*
* @ param { number } diff The amount to lower or raise the pending count with .
* @ param { number } commentPostId The ID of the post to be updated .
*
* @ return { void }
* /
2015-08-20 12:36:25 -04:00
updatePending = function ( diff , commentPostId ) {
var postSelector = '.post-com-count-' + commentPostId ,
noClass = 'comment-count-no-pending' ,
2015-08-21 13:26:26 -04:00
noParentClass = 'post-com-count-no-pending' ,
2015-08-20 12:36:25 -04:00
pendingClass = 'comment-count-pending' ,
pending ,
noPending ;
2015-08-31 13:58:22 -04:00
if ( ! isDashboard ) {
updateHtmlTitle ( diff ) ;
}
2015-08-21 13:26:26 -04:00
$ ( 'span.pending-count' ) . each ( function ( ) {
2012-08-22 20:04:18 -04:00
var a = $ ( this ) , n = getCount ( a ) + diff ;
if ( n < 1 )
n = 0 ;
2013-11-14 00:10:10 -05:00
a . closest ( '.awaiting-mod' ) [ 0 === n ? 'addClass' : 'removeClass' ] ( 'count-0' ) ;
2012-08-22 20:04:18 -04:00
updateCount ( a , n ) ;
} ) ;
2015-08-20 12:36:25 -04:00
if ( ! commentPostId ) {
return ;
}
2020-01-28 19:45:18 -05:00
// Cache selectors to not get dupes.
2015-08-20 12:36:25 -04:00
pending = $ ( 'span.' + pendingClass , postSelector ) ;
noPending = $ ( 'span.' + noClass , postSelector ) ;
pending . each ( function ( ) {
var a = $ ( this ) , n = getCount ( a ) + diff ;
if ( n < 1 )
n = 0 ;
if ( 0 === n ) {
2015-08-21 13:26:26 -04:00
a . parent ( ) . addClass ( noParentClass ) ;
2015-08-20 12:36:25 -04:00
a . removeClass ( pendingClass ) . addClass ( noClass ) ;
2015-08-21 13:26:26 -04:00
} else {
a . parent ( ) . removeClass ( noParentClass ) ;
a . addClass ( pendingClass ) . removeClass ( noClass ) ;
2015-08-20 12:36:25 -04:00
}
updateCount ( a , n ) ;
} ) ;
noPending . each ( function ( ) {
var a = $ ( this ) ;
if ( diff > 0 ) {
2015-08-21 13:26:26 -04:00
a . parent ( ) . removeClass ( noParentClass ) ;
2015-08-20 12:36:25 -04:00
a . removeClass ( noClass ) . addClass ( pendingClass ) ;
2015-08-21 13:26:26 -04:00
} else {
a . parent ( ) . addClass ( noParentClass ) ;
a . addClass ( noClass ) . removeClass ( pendingClass ) ;
2015-08-20 12:36:25 -04:00
}
updateCount ( a , diff ) ;
} ) ;
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Initializes the comments list .
*
* @ since 4.4 . 0
*
* @ global
*
* @ return { void }
* /
2018-08-19 09:33:24 -04:00
window . setCommentsList = function ( ) {
2015-09-24 16:16:49 -04:00
var totalInput , perPageInput , pageInput , dimAfter , delBefore , updateTotalCount , delAfter , refillTheExtraList , diff ,
lastConfidentTime = 0 ;
2015-08-20 12:36:25 -04:00
2015-09-24 16:16:49 -04:00
totalInput = $ ( 'input[name="_total"]' , '#comments-form' ) ;
perPageInput = $ ( 'input[name="_per_page"]' , '#comments-form' ) ;
pageInput = $ ( 'input[name="_page"]' , '#comments-form' ) ;
2015-08-20 12:36:25 -04:00
2019-06-20 10:45:51 -04:00
/ * *
* Updates the total with the latest count .
*
* The time parameter makes sure that we only update the total if this value is
* a newer value than we previously received .
*
* The time and setConfidentTime parameters make sure that we only update the
* total when necessary . So a value that has been generated earlier will not
* update the total .
*
* @ since 2.8 . 0
* @ access private
*
* @ param { number } total Total number of comments .
* @ param { number } time Unix timestamp of response .
* @ param { boolean } setConfidentTime Whether to update the last confident time
* with the given time .
*
* @ return { void }
* /
2015-09-24 16:16:49 -04:00
updateTotalCount = function ( total , time , setConfidentTime ) {
if ( time < lastConfidentTime )
2015-08-20 12:36:25 -04:00
return ;
2015-09-24 16:16:49 -04:00
if ( setConfidentTime )
lastConfidentTime = time ;
totalInput . val ( total . toString ( ) ) ;
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Changes DOM that need to be changed after a list item has been dimmed .
*
* @ since 2.5 . 0
* @ access private
*
* @ param { Object } r Ajax response object .
* @ param { Object } settings Settings for the wpList object .
*
* @ return { void }
* /
2015-09-24 16:16:49 -04:00
dimAfter = function ( r , settings ) {
var editRow , replyID , replyButton , response ,
c = $ ( '#' + settings . element ) ;
if ( true !== settings . parsed ) {
response = settings . parsed . responses [ 0 ] ;
2015-08-20 12:36:25 -04:00
}
2015-09-24 16:16:49 -04:00
editRow = $ ( '#replyrow' ) ;
replyID = $ ( '#comment_ID' , editRow ) . val ( ) ;
replyButton = $ ( '#replybtn' , editRow ) ;
2015-08-20 12:36:25 -04:00
2015-09-24 16:16:49 -04:00
if ( c . is ( '.unapproved' ) ) {
if ( settings . data . id == replyID )
2020-07-06 16:17:02 -04:00
replyButton . text ( _ _ ( 'Approve and Reply' ) ) ;
2015-08-20 12:36:25 -04:00
2016-04-22 17:30:28 -04:00
c . find ( '.row-actions span.view' ) . addClass ( 'hidden' ) . end ( )
. find ( 'div.comment_status' ) . html ( '0' ) ;
2015-09-24 16:16:49 -04:00
} else {
if ( settings . data . id == replyID )
2020-07-06 16:17:02 -04:00
replyButton . text ( _ _ ( 'Reply' ) ) ;
2015-08-20 12:36:25 -04:00
2016-04-22 17:30:28 -04:00
c . find ( '.row-actions span.view' ) . removeClass ( 'hidden' ) . end ( )
. find ( 'div.comment_status' ) . html ( '1' ) ;
2015-09-24 16:16:49 -04:00
}
diff = $ ( '#' + settings . element ) . is ( '.' + settings . dimClass ) ? 1 : - 1 ;
if ( response ) {
updateDashboardText ( response . supplemental ) ;
2019-03-18 11:22:53 -04:00
updateInModerationText ( response . supplemental ) ;
2015-09-24 16:16:49 -04:00
updatePending ( diff , response . supplemental . postId ) ;
updateApproved ( - 1 * diff , response . supplemental . postId ) ;
} else {
updatePending ( diff ) ;
updateApproved ( - 1 * diff ) ;
}
2012-08-22 20:04:18 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Handles marking a comment as spam or trashing the comment .
*
* Is executed in the list delBefore hook .
*
* @ since 2.8 . 0
* @ access private
*
* @ param { Object } settings Settings for the wpList object .
* @ param { HTMLElement } list Comments table element .
*
* @ return { Object } The settings object .
* /
2015-09-24 16:16:49 -04:00
delBefore = function ( settings , list ) {
var note , id , el , n , h , a , author ,
action = false ,
wpListsData = $ ( settings . target ) . attr ( 'data-wp-lists' ) ;
settings . data . _total = totalInput . val ( ) || 0 ;
settings . data . _per _page = perPageInput . val ( ) || 0 ;
settings . data . _page = pageInput . val ( ) || 0 ;
settings . data . _url = document . location . href ;
settings . data . comment _status = $ ( 'input[name="comment_status"]' , '#comments-form' ) . val ( ) ;
if ( wpListsData . indexOf ( ':trash=1' ) != - 1 )
action = 'trash' ;
else if ( wpListsData . indexOf ( ':spam=1' ) != - 1 )
action = 'spam' ;
if ( action ) {
id = wpListsData . replace ( /.*?comment-([0-9]+).*/ , '$1' ) ;
el = $ ( '#comment-' + id ) ;
note = $ ( '#' + action + '-undo-holder' ) . html ( ) ;
el . find ( '.check-column :checkbox' ) . prop ( 'checked' , false ) ; // Uncheck the row so as not to be affected by Bulk Edits.
if ( el . siblings ( '#replyrow' ) . length && commentReply . cid == id )
commentReply . close ( ) ;
if ( el . is ( 'tr' ) ) {
n = el . children ( ':visible' ) . length ;
author = $ ( '.author strong' , el ) . text ( ) ;
h = $ ( '<tr id="undo-' + id + '" class="undo un' + action + '" style="display:none;"><td colspan="' + n + '">' + note + '</td></tr>' ) ;
} else {
author = $ ( '.comment-author' , el ) . text ( ) ;
h = $ ( '<div id="undo-' + id + '" style="display:none;" class="undo un' + action + '">' + note + '</div>' ) ;
2015-08-19 22:51:25 -04:00
}
2015-09-24 16:16:49 -04:00
el . before ( h ) ;
2015-09-24 11:53:25 -04:00
2015-09-24 16:16:49 -04:00
$ ( 'strong' , '#undo-' + id ) . text ( author ) ;
a = $ ( '.undo a' , '#undo-' + id ) ;
a . attr ( 'href' , 'comment.php?action=un' + action + 'comment&c=' + id + '&_wpnonce=' + settings . data . _ajax _nonce ) ;
a . attr ( 'data-wp-lists' , 'delete:the-comment-list:comment-' + id + '::un' + action + '=1' ) ;
2019-02-20 18:37:50 -05:00
a . attr ( 'class' , 'vim-z vim-destructive aria-button-if-js' ) ;
2015-09-24 16:16:49 -04:00
$ ( '.avatar' , el ) . first ( ) . clone ( ) . prependTo ( '#undo-' + id + ' .' + action + '-undo-inside' ) ;
2015-09-24 11:53:25 -04:00
2021-01-22 07:32:03 -05:00
a . on ( 'click' , function ( e ) {
2015-10-08 21:27:27 -04:00
e . preventDefault ( ) ;
2020-01-28 19:45:18 -05:00
e . stopPropagation ( ) ; // Ticket #35904.
2015-09-24 16:16:49 -04:00
list . wpList . del ( this ) ;
$ ( '#undo-' + id ) . css ( { backgroundColor : '#ceb' } ) . fadeOut ( 350 , function ( ) {
$ ( this ) . remove ( ) ;
$ ( '#comment-' + id ) . css ( 'backgroundColor' , '' ) . fadeIn ( 300 , function ( ) { $ ( this ) . show ( ) ; } ) ;
} ) ;
} ) ;
}
return settings ;
2015-09-24 11:53:25 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Handles actions that need to be done after marking as spam or thrashing a
* comment .
*
* The ajax requests return the unix time stamp a comment was marked as spam or
* trashed . We use this to have a correct total amount of comments .
*
* @ since 2.5 . 0
* @ access private
*
* @ param { Object } r Ajax response object .
* @ param { Object } settings Settings for the wpList object .
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
delAfter = function ( r , settings ) {
2015-08-20 13:19:25 -04:00
var total _items _i18n , total , animated , animatedCallback ,
2015-08-19 22:51:25 -04:00
response = true === settings . parsed ? { } : settings . parsed . responses [ 0 ] ,
commentStatus = true === settings . parsed ? '' : response . supplemental . status ,
2015-08-20 12:36:25 -04:00
commentPostId = true === settings . parsed ? '' : response . supplemental . postId ,
2015-09-24 11:53:25 -04:00
newTotal = true === settings . parsed ? '' : response . supplemental ,
2015-08-19 22:51:25 -04:00
targetParent = $ ( settings . target ) . parent ( ) ,
commentRow = $ ( '#' + settings . element ) ,
spamDiff , trashDiff , pendingDiff , approvedDiff ,
2019-03-18 11:22:53 -04:00
/ *
* As ` wpList ` toggles only the ` unapproved ` class , the approved comment
* rows can have both the ` approved ` and ` unapproved ` classes .
* /
approved = commentRow . hasClass ( 'approved' ) && ! commentRow . hasClass ( 'unapproved' ) ,
2015-08-19 22:51:25 -04:00
unapproved = commentRow . hasClass ( 'unapproved' ) ,
spammed = commentRow . hasClass ( 'spam' ) ,
2016-02-28 22:20:26 -05:00
trashed = commentRow . hasClass ( 'trash' ) ,
2020-01-28 19:45:18 -05:00
undoing = false ; // Ticket #35904.
2015-08-19 22:51:25 -04:00
2015-09-24 11:53:25 -04:00
updateDashboardText ( newTotal ) ;
2019-03-18 11:22:53 -04:00
updateInModerationText ( newTotal ) ;
2015-09-24 11:53:25 -04:00
2020-01-28 19:45:18 -05:00
/ *
* The order of these checks is important .
* . unspam can also have . approve or . unapprove .
* . untrash can also have . approve or . unapprove .
* /
2015-08-19 22:51:25 -04:00
if ( targetParent . is ( 'span.undo' ) ) {
2020-01-28 19:45:18 -05:00
// The comment was spammed.
2015-08-19 22:51:25 -04:00
if ( targetParent . hasClass ( 'unspam' ) ) {
spamDiff = - 1 ;
if ( 'trash' === commentStatus ) {
trashDiff = 1 ;
} else if ( '1' === commentStatus ) {
approvedDiff = 1 ;
} else if ( '0' === commentStatus ) {
pendingDiff = 1 ;
}
2012-08-22 20:04:18 -04:00
2020-01-28 19:45:18 -05:00
// The comment was trashed.
2015-08-19 22:51:25 -04:00
} else if ( targetParent . hasClass ( 'untrash' ) ) {
trashDiff = - 1 ;
2012-08-22 20:04:18 -04:00
2015-08-19 22:51:25 -04:00
if ( 'spam' === commentStatus ) {
spamDiff = 1 ;
} else if ( '1' === commentStatus ) {
approvedDiff = 1 ;
} else if ( '0' === commentStatus ) {
pendingDiff = 1 ;
}
}
2016-02-28 22:20:26 -05:00
undoing = true ;
2020-01-28 19:45:18 -05:00
// User clicked "Spam".
2015-08-19 22:51:25 -04:00
} else if ( targetParent . is ( 'span.spam' ) ) {
2020-01-28 19:45:18 -05:00
// The comment is currently approved.
2015-08-19 22:51:25 -04:00
if ( approved ) {
approvedDiff = - 1 ;
2020-01-28 19:45:18 -05:00
// The comment is currently pending.
2015-08-19 22:51:25 -04:00
} else if ( unapproved ) {
pendingDiff = - 1 ;
2020-02-09 23:12:07 -05:00
// The comment was in the Trash.
2015-08-19 22:51:25 -04:00
} else if ( trashed ) {
trashDiff = - 1 ;
}
2020-01-28 19:45:18 -05:00
// You can't spam an item on the Spam screen.
2015-08-19 22:51:25 -04:00
spamDiff = 1 ;
2020-01-28 19:45:18 -05:00
// User clicked "Unspam".
2015-08-19 22:51:25 -04:00
} else if ( targetParent . is ( 'span.unspam' ) ) {
if ( approved ) {
pendingDiff = 1 ;
} else if ( unapproved ) {
approvedDiff = 1 ;
} else if ( trashed ) {
2020-01-28 19:45:18 -05:00
// The comment was previously approved.
2015-08-19 22:51:25 -04:00
if ( targetParent . hasClass ( 'approve' ) ) {
approvedDiff = 1 ;
2020-01-28 19:45:18 -05:00
// The comment was previously pending.
2015-08-19 22:51:25 -04:00
} else if ( targetParent . hasClass ( 'unapprove' ) ) {
pendingDiff = 1 ;
}
} else if ( spammed ) {
if ( targetParent . hasClass ( 'approve' ) ) {
approvedDiff = 1 ;
} else if ( targetParent . hasClass ( 'unapprove' ) ) {
pendingDiff = 1 ;
}
}
2020-01-28 19:45:18 -05:00
// You can unspam an item on the Spam screen.
2015-08-19 22:51:25 -04:00
spamDiff = - 1 ;
2020-01-28 19:45:18 -05:00
// User clicked "Trash".
2015-08-19 22:51:25 -04:00
} else if ( targetParent . is ( 'span.trash' ) ) {
if ( approved ) {
approvedDiff = - 1 ;
} else if ( unapproved ) {
pendingDiff = - 1 ;
2020-01-28 19:45:18 -05:00
// The comment was in the spam queue.
2015-08-19 22:51:25 -04:00
} else if ( spammed ) {
spamDiff = - 1 ;
}
2020-01-28 19:45:18 -05:00
// You can't trash an item on the Trash screen.
2015-08-19 22:51:25 -04:00
trashDiff = 1 ;
2020-01-28 19:45:18 -05:00
// User clicked "Restore".
2015-08-19 22:51:25 -04:00
} else if ( targetParent . is ( 'span.untrash' ) ) {
if ( approved ) {
pendingDiff = 1 ;
} else if ( unapproved ) {
approvedDiff = 1 ;
} else if ( trashed ) {
if ( targetParent . hasClass ( 'approve' ) ) {
approvedDiff = 1 ;
} else if ( targetParent . hasClass ( 'unapprove' ) ) {
pendingDiff = 1 ;
}
}
2020-01-28 19:45:18 -05:00
// You can't go from Trash to Spam.
// You can untrash on the Trash screen.
2015-08-19 22:51:25 -04:00
trashDiff = - 1 ;
2020-01-28 19:45:18 -05:00
// User clicked "Approve".
2015-08-19 22:51:25 -04:00
} else if ( targetParent . is ( 'span.approve:not(.unspam):not(.untrash)' ) ) {
approvedDiff = 1 ;
pendingDiff = - 1 ;
2020-01-28 19:45:18 -05:00
// User clicked "Unapprove".
2015-08-19 22:51:25 -04:00
} else if ( targetParent . is ( 'span.unapprove:not(.unspam):not(.untrash)' ) ) {
approvedDiff = - 1 ;
pendingDiff = 1 ;
2020-01-28 19:45:18 -05:00
// User clicked "Delete Permanently".
2015-08-19 22:51:25 -04:00
} else if ( targetParent . is ( 'span.delete' ) ) {
if ( spammed ) {
spamDiff = - 1 ;
} else if ( trashed ) {
trashDiff = - 1 ;
}
2012-08-22 20:04:18 -04:00
}
2015-08-19 22:51:25 -04:00
if ( pendingDiff ) {
2015-08-20 12:36:25 -04:00
updatePending ( pendingDiff , commentPostId ) ;
2015-09-24 13:57:25 -04:00
updateCountText ( 'span.all-count' , pendingDiff ) ;
2012-08-22 20:04:18 -04:00
}
2015-08-19 22:51:25 -04:00
if ( approvedDiff ) {
2015-08-20 12:36:25 -04:00
updateApproved ( approvedDiff , commentPostId ) ;
2015-09-24 13:57:25 -04:00
updateCountText ( 'span.all-count' , approvedDiff ) ;
2015-08-19 22:51:25 -04:00
}
2012-08-22 20:04:18 -04:00
2015-08-19 22:51:25 -04:00
if ( spamDiff ) {
updateCountText ( 'span.spam-count' , spamDiff ) ;
}
2012-08-22 20:04:18 -04:00
2015-08-19 22:51:25 -04:00
if ( trashDiff ) {
updateCountText ( 'span.trash-count' , trashDiff ) ;
}
2012-08-22 20:04:18 -04:00
2017-03-17 12:54:42 -04:00
if (
( ( 'trash' === settings . data . comment _status ) && ! getCount ( $ ( 'span.trash-count' ) ) ) ||
( ( 'spam' === settings . data . comment _status ) && ! getCount ( $ ( 'span.spam-count' ) ) )
) {
$ ( '#delete_all' ) . hide ( ) ;
}
2015-08-31 13:58:22 -04:00
if ( ! isDashboard ) {
2012-08-22 20:04:18 -04:00
total = totalInput . val ( ) ? parseInt ( totalInput . val ( ) , 10 ) : 0 ;
if ( $ ( settings . target ) . parent ( ) . is ( 'span.undo' ) )
total ++ ;
else
total -- ;
if ( total < 0 )
total = 0 ;
2015-08-19 22:51:25 -04:00
if ( 'object' === typeof r ) {
if ( response . supplemental . total _items _i18n && lastConfidentTime < response . supplemental . time ) {
total _items _i18n = response . supplemental . total _items _i18n || '' ;
if ( total _items _i18n ) {
2019-08-30 14:34:06 -04:00
$ ( '.displaying-num' ) . text ( total _items _i18n . replace ( ' ' , String . fromCharCode ( 160 ) ) ) ;
$ ( '.total-pages' ) . text ( response . supplemental . total _pages _i18n . replace ( ' ' , String . fromCharCode ( 160 ) ) ) ;
2015-08-19 22:51:25 -04:00
$ ( '.tablenav-pages' ) . find ( '.next-page, .last-page' ) . toggleClass ( 'disabled' , response . supplemental . total _pages == $ ( '.current-page' ) . val ( ) ) ;
}
updateTotalCount ( total , response . supplemental . time , true ) ;
} else if ( response . supplemental . time ) {
updateTotalCount ( total , response . supplemental . time , false ) ;
2012-08-22 20:04:18 -04:00
}
} else {
updateTotalCount ( total , r , false ) ;
}
}
2016-02-28 22:20:26 -05:00
if ( ! theExtraList || theExtraList . length === 0 || theExtraList . children ( ) . length === 0 || undoing ) {
2012-08-22 20:04:18 -04:00
return ;
}
2015-08-20 01:54:25 -04:00
theList . get ( 0 ) . wpList . add ( theExtraList . children ( ':eq(0):not(.no-items)' ) . remove ( ) . clone ( ) ) ;
2012-08-22 20:04:18 -04:00
refillTheExtraList ( ) ;
2015-08-20 01:54:25 -04:00
2015-08-20 12:36:25 -04:00
animated = $ ( ':animated' , '#the-comment-list' ) ;
2019-03-18 11:22:53 -04:00
animatedCallback = function ( ) {
2015-08-20 01:54:25 -04:00
if ( ! $ ( '#the-comment-list tr:visible' ) . length ) {
theList . get ( 0 ) . wpList . add ( theExtraList . find ( '.no-items' ) . clone ( ) ) ;
}
} ;
if ( animated . length ) {
animated . promise ( ) . done ( animatedCallback ) ;
} else {
animatedCallback ( ) ;
}
2012-08-22 20:04:18 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Retrieves additional comments to populate the extra list .
*
* @ since 3.1 . 0
* @ access private
*
* @ param { boolean } [ ev ] Repopulate the extra comments list if true .
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
refillTheExtraList = function ( ev ) {
var args = $ . query . get ( ) , total _pages = $ ( '.total-pages' ) . text ( ) , per _page = $ ( 'input[name="_per_page"]' , '#comments-form' ) . val ( ) ;
if ( ! args . paged )
args . paged = 1 ;
if ( args . paged > total _pages ) {
return ;
}
if ( ev ) {
theExtraList . empty ( ) ;
2020-01-28 19:45:18 -05:00
args . number = Math . min ( 8 , per _page ) ; // See WP_Comments_List_Table::prepare_items() in class-wp-comments-list-table.php.
2012-08-22 20:04:18 -04:00
} else {
args . number = 1 ;
2020-01-28 19:45:18 -05:00
args . offset = Math . min ( 8 , per _page ) - 1 ; // Fetch only the next item on the extra list.
2012-08-22 20:04:18 -04:00
}
args . no _placeholder = true ;
args . paged ++ ;
2020-01-28 19:45:18 -05:00
// $.query.get() needs some correction to be sent into an Ajax request.
2012-08-22 20:04:18 -04:00
if ( true === args . comment _type )
args . comment _type = '' ;
args = $ . extend ( args , {
'action' : 'fetch-list' ,
'list_args' : list _args ,
'_ajax_fetch_list_nonce' : $ ( '#_ajax_fetch_list_nonce' ) . val ( )
} ) ;
$ . ajax ( {
url : ajaxurl ,
global : false ,
dataType : 'json' ,
data : args ,
success : function ( response ) {
theExtraList . get ( 0 ) . wpList . add ( response . rows ) ;
}
} ) ;
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Globally available jQuery object referring to the extra comments list .
*
* @ global
* /
2018-08-19 09:33:24 -04:00
window . theExtraList = $ ( '#the-extra-comment-list' ) . wpList ( { alt : '' , delColor : 'none' , addColor : 'none' } ) ;
2019-06-20 10:45:51 -04:00
/ * *
* Globally available jQuery object referring to the comments list .
*
* @ global
* /
2018-08-19 09:33:24 -04:00
window . theList = $ ( '#the-comment-list' ) . wpList ( { alt : '' , delBefore : delBefore , dimAfter : dimAfter , delAfter : delAfter , addColor : 'none' } )
2021-01-22 07:32:03 -05:00
. on ( 'wpListDelEnd' , function ( e , s ) {
2012-11-05 20:01:52 -05:00
var wpListsData = $ ( s . target ) . attr ( 'data-wp-lists' ) , id = s . element . replace ( /[^0-9]+/g , '' ) ;
2012-08-22 20:04:18 -04:00
2012-11-05 20:01:52 -05:00
if ( wpListsData . indexOf ( ':trash=1' ) != - 1 || wpListsData . indexOf ( ':spam=1' ) != - 1 )
2013-11-14 00:10:10 -05:00
$ ( '#undo-' + id ) . fadeIn ( 300 , function ( ) { $ ( this ) . show ( ) ; } ) ;
2012-08-22 20:04:18 -04:00
} ) ;
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Object containing functionality regarding the comment quick editor and reply
* editor .
*
* @ since 2.7 . 0
*
* @ global
* /
2018-08-19 09:33:24 -04:00
window . commentReply = {
2012-08-22 20:04:18 -04:00
cid : '' ,
act : '' ,
2016-04-22 17:43:28 -04:00
originalContent : '' ,
2012-08-22 20:04:18 -04:00
2019-06-20 10:45:51 -04:00
/ * *
* Initializes the comment reply functionality .
*
* @ since 2.7 . 0
2020-01-28 19:45:18 -05:00
*
* @ memberof commentReply
2019-06-20 10:45:51 -04:00
* /
2012-08-22 20:04:18 -04:00
init : function ( ) {
var row = $ ( '#replyrow' ) ;
2021-01-22 07:32:03 -05:00
$ ( '.cancel' , row ) . on ( 'click' , function ( ) { return commentReply . revert ( ) ; } ) ;
$ ( '.save' , row ) . on ( 'click' , function ( ) { return commentReply . send ( ) ; } ) ;
$ ( 'input#author-name, input#author-email, input#author-url' , row ) . on ( 'keypress' , function ( e ) {
2012-08-22 20:04:18 -04:00
if ( e . which == 13 ) {
commentReply . send ( ) ;
e . preventDefault ( ) ;
return false ;
}
} ) ;
2020-01-28 19:45:18 -05:00
// Add events.
2021-01-22 07:32:03 -05:00
$ ( '#the-comment-list .column-comment > p' ) . on ( 'dblclick' , function ( ) {
2012-08-22 20:04:18 -04:00
commentReply . toggle ( $ ( this ) . parent ( ) ) ;
} ) ;
2021-01-22 07:32:03 -05:00
$ ( '#doaction, #post-query-submit' ) . on ( 'click' , function ( ) {
2012-08-22 20:04:18 -04:00
if ( $ ( '#the-comment-list #replyrow' ) . length > 0 )
commentReply . close ( ) ;
} ) ;
this . comments _listing = $ ( '#comments-form > input[name="comment_status"]' ) . val ( ) || '' ;
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Adds doubleclick event handler to the given comment list row .
*
* The double - click event will toggle the comment edit or reply form .
*
* @ since 2.7 . 0
*
* @ memberof commentReply
*
* @ param { Object } r The row to add double click handlers to .
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
addEvents : function ( r ) {
r . each ( function ( ) {
2021-01-22 07:32:03 -05:00
$ ( this ) . find ( '.column-comment > p' ) . on ( 'dblclick' , function ( ) {
2012-08-22 20:04:18 -04:00
commentReply . toggle ( $ ( this ) . parent ( ) ) ;
} ) ;
} ) ;
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Opens the quick edit for the given element .
*
* @ since 2.7 . 0
*
* @ memberof commentReply
*
* @ param { HTMLElement } el The element you want to open the quick editor for .
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
toggle : function ( el ) {
2020-07-06 16:17:02 -04:00
if ( 'none' !== $ ( el ) . css ( 'display' ) && ( $ ( '#replyrow' ) . parent ( ) . is ( '#com-reply' ) || window . confirm ( _ _ ( 'Are you sure you want to edit this comment?\nThe changes you made will be lost.' ) ) ) ) {
2021-02-23 14:45:04 -05:00
$ ( el ) . find ( 'button.vim-q' ) . trigger ( 'click' ) ;
2015-06-19 09:48:25 -04:00
}
2012-08-22 20:04:18 -04:00
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Closes the comment quick edit or reply form and undoes any changes .
*
* @ since 2.7 . 0
*
* @ memberof commentReply
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
revert : function ( ) {
if ( $ ( '#the-comment-list #replyrow' ) . length < 1 )
return false ;
$ ( '#replyrow' ) . fadeOut ( 'fast' , function ( ) {
commentReply . close ( ) ;
} ) ;
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Closes the comment quick edit or reply form and undoes any changes .
*
* @ since 2.7 . 0
*
* @ memberof commentReply
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
close : function ( ) {
2018-02-28 17:36:34 -05:00
var commentRow = $ ( ) ,
replyRow = $ ( '#replyrow' ) ;
2012-08-22 20:04:18 -04:00
2019-06-20 10:45:51 -04:00
// Return if the replyrow is not showing.
2018-02-28 17:36:34 -05:00
if ( replyRow . parent ( ) . is ( '#com-reply' ) ) {
2012-08-22 20:04:18 -04:00
return ;
2018-02-28 17:36:34 -05:00
}
if ( this . cid ) {
commentRow = $ ( '#comment-' + this . cid ) ;
}
2012-08-22 20:04:18 -04:00
2018-02-28 17:36:34 -05:00
/ *
* When closing the Quick Edit form , show the comment row and move focus
* back to the Quick Edit button .
* /
if ( 'edit-comment' === this . act ) {
commentRow . fadeIn ( 300 , function ( ) {
commentRow
. show ( )
. find ( '.vim-q' )
. attr ( 'aria-expanded' , 'false' )
2021-01-22 07:32:03 -05:00
. trigger ( 'focus' ) ;
2018-02-28 17:36:34 -05:00
} ) . css ( 'backgroundColor' , '' ) ;
}
// When closing the Reply form, move focus back to the Reply button.
if ( 'replyto-comment' === this . act ) {
commentRow . find ( '.vim-r' )
. attr ( 'aria-expanded' , 'false' )
2021-01-22 07:32:03 -05:00
. trigger ( 'focus' ) ;
2012-08-22 20:04:18 -04:00
}
2020-01-28 19:45:18 -05:00
// Reset the Quicktags buttons.
2019-06-20 10:45:51 -04:00
if ( typeof QTags != 'undefined' )
2012-08-22 20:04:18 -04:00
QTags . closeAllTags ( 'replycontent' ) ;
$ ( '#add-new-comment' ) . css ( 'display' , '' ) ;
2018-02-28 17:36:34 -05:00
replyRow . hide ( ) ;
$ ( '#com-reply' ) . append ( replyRow ) ;
2012-08-22 20:04:18 -04:00
$ ( '#replycontent' ) . css ( 'height' , '' ) . val ( '' ) ;
$ ( '#edithead input' ) . val ( '' ) ;
2018-02-28 17:36:34 -05:00
$ ( '.notice-error' , replyRow )
2017-10-02 17:52:52 -04:00
. addClass ( 'hidden' )
. find ( '.error' ) . empty ( ) ;
2018-02-28 17:36:34 -05:00
$ ( '.spinner' , replyRow ) . removeClass ( 'is-active' ) ;
2012-08-22 20:04:18 -04:00
this . cid = '' ;
2016-04-22 17:43:28 -04:00
this . originalContent = '' ;
2012-08-22 20:04:18 -04:00
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Opens the comment quick edit or reply form .
*
* @ since 2.7 . 0
*
* @ memberof commentReply
*
2020-06-20 08:02:12 -04:00
* @ param { number } comment _id The comment ID to open an editor for .
* @ param { number } post _id The post ID to open an editor for .
2019-06-20 10:45:51 -04:00
* @ param { string } action The action to perform . Either 'edit' or 'replyto' .
*
* @ return { boolean } Always false .
* /
2012-08-22 20:04:18 -04:00
open : function ( comment _id , post _id , action ) {
2013-12-02 19:55:10 -05:00
var editRow , rowData , act , replyButton , editHeight ,
t = this ,
c = $ ( '#comment-' + comment _id ) ,
2015-09-15 09:44:34 -04:00
h = c . height ( ) ,
colspanVal = 0 ;
2012-08-22 20:04:18 -04:00
2016-04-22 17:43:28 -04:00
if ( ! this . discardCommentChanges ( ) ) {
return false ;
}
2012-08-22 20:04:18 -04:00
t . close ( ) ;
t . cid = comment _id ;
editRow = $ ( '#replyrow' ) ;
rowData = $ ( '#inline-' + comment _id ) ;
action = action || 'replyto' ;
act = 'edit' == action ? 'edit' : 'replyto' ;
act = t . act = act + '-comment' ;
2016-04-22 17:43:28 -04:00
t . originalContent = $ ( 'textarea.comment' , rowData ) . val ( ) ;
2015-09-24 22:21:26 -04:00
colspanVal = $ ( '> th:visible, > td:visible' , c ) . length ;
2012-08-22 20:04:18 -04:00
2015-09-15 09:44:34 -04:00
// Make sure it's actually a table and there's a `colspan` value to apply.
if ( editRow . hasClass ( 'inline-edit-row' ) && 0 !== colspanVal ) {
$ ( 'td' , editRow ) . attr ( 'colspan' , colspanVal ) ;
}
2015-09-13 08:47:27 -04:00
2012-08-22 20:04:18 -04:00
$ ( '#action' , editRow ) . val ( act ) ;
$ ( '#comment_post_ID' , editRow ) . val ( post _id ) ;
$ ( '#comment_ID' , editRow ) . val ( comment _id ) ;
if ( action == 'edit' ) {
2015-09-14 21:31:26 -04:00
$ ( '#author-name' , editRow ) . val ( $ ( 'div.author' , rowData ) . text ( ) ) ;
2012-08-22 20:04:18 -04:00
$ ( '#author-email' , editRow ) . val ( $ ( 'div.author-email' , rowData ) . text ( ) ) ;
$ ( '#author-url' , editRow ) . val ( $ ( 'div.author-url' , rowData ) . text ( ) ) ;
$ ( '#status' , editRow ) . val ( $ ( 'div.comment_status' , rowData ) . text ( ) ) ;
$ ( '#replycontent' , editRow ) . val ( $ ( 'textarea.comment' , rowData ) . val ( ) ) ;
2015-10-01 10:52:25 -04:00
$ ( '#edithead, #editlegend, #savebtn' , editRow ) . show ( ) ;
2012-08-22 20:04:18 -04:00
$ ( '#replyhead, #replybtn, #addhead, #addbtn' , editRow ) . hide ( ) ;
2013-12-02 19:55:10 -05:00
if ( h > 120 ) {
// Limit the maximum height when editing very long comments to make it more manageable.
// The textarea is resizable in most browsers, so the user can adjust it if needed.
editHeight = h > 500 ? 500 : h ;
$ ( '#replycontent' , editRow ) . css ( 'height' , editHeight + 'px' ) ;
}
2012-08-22 20:04:18 -04:00
c . after ( editRow ) . fadeOut ( 'fast' , function ( ) {
2013-11-14 00:10:10 -05:00
$ ( '#replyrow' ) . fadeIn ( 300 , function ( ) { $ ( this ) . show ( ) ; } ) ;
2012-08-22 20:04:18 -04:00
} ) ;
} else if ( action == 'add' ) {
$ ( '#addhead, #addbtn' , editRow ) . show ( ) ;
2015-10-01 10:52:25 -04:00
$ ( '#replyhead, #replybtn, #edithead, #editlegend, #savebtn' , editRow ) . hide ( ) ;
2012-08-22 20:04:18 -04:00
$ ( '#the-comment-list' ) . prepend ( editRow ) ;
$ ( '#replyrow' ) . fadeIn ( 300 ) ;
2013-11-14 00:10:10 -05:00
} else {
replyButton = $ ( '#replybtn' , editRow ) ;
2015-10-01 10:52:25 -04:00
$ ( '#edithead, #editlegend, #savebtn, #addhead, #addbtn' , editRow ) . hide ( ) ;
2012-08-22 20:04:18 -04:00
$ ( '#replyhead, #replybtn' , editRow ) . show ( ) ;
c . after ( editRow ) ;
if ( c . hasClass ( 'unapproved' ) ) {
2020-07-06 16:17:02 -04:00
replyButton . text ( _ _ ( 'Approve and Reply' ) ) ;
2012-08-22 20:04:18 -04:00
} else {
2020-07-06 16:17:02 -04:00
replyButton . text ( _ _ ( 'Reply' ) ) ;
2012-08-22 20:04:18 -04:00
}
2013-11-14 00:10:10 -05:00
$ ( '#replyrow' ) . fadeIn ( 300 , function ( ) { $ ( this ) . show ( ) ; } ) ;
2012-08-22 20:04:18 -04:00
}
setTimeout ( function ( ) {
2022-03-18 14:14:02 -04:00
var rtop , rbottom , scrollTop , vp , scrollBottom ,
2024-12-13 20:32:18 -05:00
isComposing = false ,
isContextMenuOpen = false ;
2012-08-22 20:04:18 -04:00
rtop = $ ( '#replyrow' ) . offset ( ) . top ;
rbottom = rtop + $ ( '#replyrow' ) . height ( ) ;
scrollTop = window . pageYOffset || document . documentElement . scrollTop ;
2013-11-14 00:10:10 -05:00
vp = document . documentElement . clientHeight || window . innerHeight || 0 ;
2012-08-22 20:04:18 -04:00
scrollBottom = scrollTop + vp ;
if ( scrollBottom - 20 < rbottom )
window . scroll ( 0 , rbottom - vp + 35 ) ;
else if ( rtop - 20 < scrollTop )
window . scroll ( 0 , rtop - 35 ) ;
2022-03-18 14:14:02 -04:00
$ ( '#replycontent' )
. trigger ( 'focus' )
2024-12-13 20:32:18 -05:00
. on ( 'contextmenu keydown' , function ( e ) {
// Check if the context menu is open and set state.
if ( e . type === 'contextmenu' ) {
isContextMenuOpen = true ;
}
// Update the context menu state if the Escape key is pressed.
if ( e . type === 'keydown' && e . which === 27 && isContextMenuOpen ) {
isContextMenuOpen = false ;
}
} )
2022-03-18 14:14:02 -04:00
. on ( 'keyup' , function ( e ) {
2024-12-13 20:32:18 -05:00
// Close on Escape unless Input Method Editors (IMEs) are in use or the context menu is open.
if ( e . which === 27 && ! isComposing && ! isContextMenuOpen ) {
2022-03-18 14:14:02 -04:00
commentReply . revert ( ) ;
}
} )
. on ( 'compositionstart' , function ( ) {
isComposing = true ;
} ) ;
2012-08-22 20:04:18 -04:00
} , 600 ) ;
return false ;
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Submits the comment quick edit or reply form .
*
* @ since 2.7 . 0
*
* @ memberof commentReply
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
send : function ( ) {
2017-10-02 17:52:52 -04:00
var post = { } ,
$errorNotice = $ ( '#replysubmit .error-notice' ) ;
2012-08-22 20:04:18 -04:00
2017-10-02 17:52:52 -04:00
$errorNotice . addClass ( 'hidden' ) ;
2015-04-03 00:52:27 -04:00
$ ( '#replysubmit .spinner' ) . addClass ( 'is-active' ) ;
2012-08-22 20:04:18 -04:00
$ ( '#replyrow input' ) . not ( ':button' ) . each ( function ( ) {
var t = $ ( this ) ;
post [ t . attr ( 'name' ) ] = t . val ( ) ;
} ) ;
post . content = $ ( '#replycontent' ) . val ( ) ;
post . id = post . comment _post _ID ;
post . comments _listing = this . comments _listing ;
post . p = $ ( '[name="p"]' ) . val ( ) ;
if ( $ ( '#comment-' + $ ( '#comment_ID' ) . val ( ) ) . hasClass ( 'unapproved' ) )
post . approve _parent = 1 ;
$ . ajax ( {
type : 'POST' ,
url : ajaxurl ,
data : post ,
success : function ( x ) { commentReply . show ( x ) ; } ,
error : function ( r ) { commentReply . error ( r ) ; }
} ) ;
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Shows the new or updated comment or reply .
*
* This function needs to be passed the ajax result as received from the server .
* It will handle the response and show the comment that has just been saved to
* the server .
*
* @ since 2.7 . 0
*
* @ memberof commentReply
*
* @ param { Object } xml Ajax response object .
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
show : function ( xml ) {
var t = this , r , c , id , bg , pid ;
if ( typeof ( xml ) == 'string' ) {
t . error ( { 'responseText' : xml } ) ;
return false ;
}
r = wpAjax . parseAjaxResponse ( xml ) ;
if ( r . errors ) {
t . error ( { 'responseText' : wpAjax . broken } ) ;
return false ;
}
t . revert ( ) ;
r = r . responses [ 0 ] ;
id = '#comment-' + r . id ;
if ( 'edit-comment' == t . act )
$ ( id ) . remove ( ) ;
if ( r . supplemental . parent _approved ) {
pid = $ ( '#comment-' + r . supplemental . parent _approved ) ;
2015-08-20 12:36:25 -04:00
updatePending ( - 1 , r . supplemental . parent _post _id ) ;
2012-08-22 20:04:18 -04:00
if ( this . comments _listing == 'moderated' ) {
pid . animate ( { 'backgroundColor' : '#CCEEBB' } , 400 , function ( ) {
pid . fadeOut ( ) ;
} ) ;
return ;
}
}
2015-09-24 11:53:25 -04:00
if ( r . supplemental . i18n _comments _text ) {
2019-03-18 11:22:53 -04:00
updateDashboardText ( r . supplemental ) ;
updateInModerationText ( r . supplemental ) ;
updateApproved ( 1 , r . supplemental . parent _post _id ) ;
updateCountText ( 'span.all-count' , 1 ) ;
2015-09-24 11:53:25 -04:00
}
2021-01-22 07:32:03 -05:00
r . data = r . data || '' ;
c = r . data . toString ( ) . trim ( ) ; // Trim leading whitespaces.
2013-11-14 00:10:10 -05:00
$ ( c ) . hide ( ) ;
2012-08-22 20:04:18 -04:00
$ ( '#replyrow' ) . after ( c ) ;
2013-09-21 06:51:09 -04:00
2012-08-22 20:04:18 -04:00
id = $ ( id ) ;
t . addEvents ( id ) ;
bg = id . hasClass ( 'unapproved' ) ? '#FFFFE0' : id . closest ( '.widefat, .postbox' ) . css ( 'backgroundColor' ) ;
id . animate ( { 'backgroundColor' : '#CCEEBB' } , 300 )
. animate ( { 'backgroundColor' : bg } , 300 , function ( ) {
if ( pid && pid . length ) {
pid . animate ( { 'backgroundColor' : '#CCEEBB' } , 300 )
. animate ( { 'backgroundColor' : bg } , 300 )
. removeClass ( 'unapproved' ) . addClass ( 'approved' )
. find ( 'div.comment_status' ) . html ( '1' ) ;
}
} ) ;
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Shows an error for the failed comment update or reply .
*
* @ since 2.7 . 0
*
* @ memberof commentReply
*
* @ param { string } r The Ajax response .
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
error : function ( r ) {
2017-10-02 17:52:52 -04:00
var er = r . statusText ,
$errorNotice = $ ( '#replysubmit .notice-error' ) ,
$error = $errorNotice . find ( '.error' ) ;
2012-08-22 20:04:18 -04:00
2015-04-03 00:52:27 -04:00
$ ( '#replysubmit .spinner' ) . removeClass ( 'is-active' ) ;
2012-08-22 20:04:18 -04:00
if ( r . responseText )
er = r . responseText . replace ( /<.[^<>]*?>/g , '' ) ;
2017-10-02 17:52:52 -04:00
if ( er ) {
$errorNotice . removeClass ( 'hidden' ) ;
$error . html ( er ) ;
2024-08-25 18:37:19 -04:00
wp . a11y . speak ( er ) ;
2017-10-02 17:52:52 -04:00
}
2012-08-22 20:04:18 -04:00
} ,
2019-06-20 10:45:51 -04:00
/ * *
* Opens the add comments form in the comments metabox on the post edit page .
*
* @ since 3.4 . 0
*
* @ memberof commentReply
*
2020-06-20 08:02:12 -04:00
* @ param { number } post _id The post ID .
2019-06-20 10:45:51 -04:00
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
addcomment : function ( post _id ) {
var t = this ;
$ ( '#add-new-comment' ) . fadeOut ( 200 , function ( ) {
t . open ( 0 , post _id , 'add' ) ;
$ ( 'table.comments-box' ) . css ( 'display' , '' ) ;
$ ( '#no-comments' ) . remove ( ) ;
} ) ;
2016-04-22 17:43:28 -04:00
} ,
/ * *
2019-06-20 10:45:51 -04:00
* Alert the user if they have unsaved changes on a comment that will be lost if
* they proceed with the intended action .
*
* @ since 4.6 . 0
*
* @ memberof commentReply
2016-04-22 17:43:28 -04:00
*
2019-06-20 10:45:51 -04:00
* @ return { boolean } Whether it is safe the continue with the intended action .
2016-04-22 17:43:28 -04:00
* /
discardCommentChanges : function ( ) {
var editRow = $ ( '#replyrow' ) ;
2022-09-27 13:06:09 -04:00
if ( '' === $ ( '#replycontent' , editRow ) . val ( ) || this . originalContent === $ ( '#replycontent' , editRow ) . val ( ) ) {
2016-04-22 17:43:28 -04:00
return true ;
}
2020-07-06 16:17:02 -04:00
return window . confirm ( _ _ ( 'Are you sure you want to do this?\nThe comment changes you made will be lost.' ) ) ;
2012-08-22 20:04:18 -04:00
}
} ;
2021-03-18 15:01:03 -04:00
$ ( function ( ) {
2012-08-22 20:04:18 -04:00
var make _hotkeys _redirect , edit _comment , toggle _all , make _bulk ;
setCommentsList ( ) ;
commentReply . init ( ) ;
2015-10-08 21:27:27 -04:00
$ ( document ) . on ( 'click' , 'span.delete a.delete' , function ( e ) {
e . preventDefault ( ) ;
} ) ;
2012-08-22 20:04:18 -04:00
if ( typeof $ . table _hotkeys != 'undefined' ) {
2019-06-20 10:45:51 -04:00
/ * *
* Creates a function that navigates to a previous or next page .
*
* @ since 2.7 . 0
* @ access private
*
* @ param { string } which What page to navigate to : either next or prev .
*
* @ return { Function } The function that executes the navigation .
* /
2012-08-22 20:04:18 -04:00
make _hotkeys _redirect = function ( which ) {
return function ( ) {
var first _last , l ;
first _last = 'next' == which ? 'first' : 'last' ;
l = $ ( '.tablenav-pages .' + which + '-page:not(.disabled)' ) ;
if ( l . length )
window . location = l [ 0 ] . href . replace ( /\&hotkeys_highlight_(first|last)=1/g , '' ) + '&hotkeys_highlight_' + first _last + '=1' ;
2013-11-14 00:10:10 -05:00
} ;
2012-08-22 20:04:18 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Navigates to the edit page for the selected comment .
*
* @ since 2.7 . 0
* @ access private
*
* @ param { Object } event The event that triggered this action .
* @ param { Object } current _row A jQuery object of the selected row .
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
edit _comment = function ( event , current _row ) {
window . location = $ ( 'span.edit a' , current _row ) . attr ( 'href' ) ;
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Toggles all comments on the screen , for bulk actions .
*
* @ since 2.7 . 0
* @ access private
*
* @ return { void }
* /
2012-08-22 20:04:18 -04:00
toggle _all = function ( ) {
2014-01-01 19:11:14 -05:00
$ ( '#cb-select-all-1' ) . data ( 'wp-toggle' , 1 ) . trigger ( 'click' ) . removeData ( 'wp-toggle' ) ;
2012-08-22 20:04:18 -04:00
} ;
2019-06-20 10:45:51 -04:00
/ * *
* Creates a bulk action function that is executed on all selected comments .
*
* @ since 2.7 . 0
* @ access private
*
* @ param { string } value The name of the action to execute .
*
* @ return { Function } The function that executes the bulk action .
* /
2012-08-22 20:04:18 -04:00
make _bulk = function ( value ) {
return function ( ) {
var scope = $ ( 'select[name="action"]' ) ;
$ ( 'option[value="' + value + '"]' , scope ) . prop ( 'selected' , true ) ;
2021-02-23 14:45:04 -05:00
$ ( '#doaction' ) . trigger ( 'click' ) ;
2013-11-14 00:10:10 -05:00
} ;
2012-08-22 20:04:18 -04:00
} ;
$ . table _hotkeys (
$ ( 'table.widefat' ) ,
2014-01-01 19:11:14 -05:00
[
'a' , 'u' , 's' , 'd' , 'r' , 'q' , 'z' ,
[ 'e' , edit _comment ] ,
[ 'shift+x' , toggle _all ] ,
[ 'shift+a' , make _bulk ( 'approve' ) ] ,
[ 'shift+s' , make _bulk ( 'spam' ) ] ,
[ 'shift+d' , make _bulk ( 'delete' ) ] ,
[ 'shift+t' , make _bulk ( 'trash' ) ] ,
[ 'shift+z' , make _bulk ( 'untrash' ) ] ,
[ 'shift+u' , make _bulk ( 'unapprove' ) ]
] ,
{
2020-07-06 16:17:02 -04:00
highlight _first : adminCommentsSettings . hotkeys _highlight _first ,
highlight _last : adminCommentsSettings . hotkeys _highlight _last ,
2014-01-01 19:11:14 -05:00
prev _page _link _cb : make _hotkeys _redirect ( 'prev' ) ,
2014-02-07 19:52:12 -05:00
next _page _link _cb : make _hotkeys _redirect ( 'next' ) ,
2014-01-01 19:11:14 -05:00
hotkeys _opts : {
disableInInput : true ,
type : 'keypress' ,
noDisable : '.check-column input[type="checkbox"]'
2015-03-30 09:54:26 -04:00
} ,
cycle _expr : '#the-comment-list tr' ,
start _row _index : 0
2014-01-01 19:11:14 -05:00
}
2012-08-22 20:04:18 -04:00
) ;
}
2014-06-23 19:55:16 -04:00
2014-09-01 23:57:18 -04:00
// Quick Edit and Reply have an inline comment editor.
2018-02-28 17:36:34 -05:00
$ ( '#the-comment-list' ) . on ( 'click' , '.comment-inline' , function ( ) {
2014-09-01 23:57:18 -04:00
var $el = $ ( this ) ,
action = 'replyto' ;
if ( 'undefined' !== typeof $el . data ( 'action' ) ) {
action = $el . data ( 'action' ) ;
}
2014-06-23 19:55:16 -04:00
2018-02-28 17:36:34 -05:00
$ ( this ) . attr ( 'aria-expanded' , 'true' ) ;
2014-09-01 23:57:18 -04:00
commentReply . open ( $el . data ( 'commentId' ) , $el . data ( 'postId' ) , action ) ;
} ) ;
2012-08-22 20:04:18 -04:00
} ) ;
} ) ( jQuery ) ;