2015-08-17 17:00:26 -07:00
/ * *
* @ file
* Attaches behaviors for the Comment module ' s "new" indicator .
*
* May only be loaded for authenticated users , with the History module
* installed .
* /
( function ( $ , Drupal , window ) {
"use strict" ;
/ * *
2015-09-04 13:20:09 -07:00
* Renders "new" comment indicators wherever necessary .
2015-08-17 17:00:26 -07:00
*
* @ type { Drupal ~ behavior }
2015-09-04 13:20:09 -07:00
*
* @ prop { Drupal ~ behaviorAttach } attach
* Attaches "new" comment indicators behavior .
2015-08-17 17:00:26 -07:00
* /
Drupal . behaviors . commentNewIndicator = {
attach : function ( context ) {
2015-09-04 13:20:09 -07:00
// Collect all "new" comment indicator placeholders (and their
// corresponding node IDs) newer than 30 days ago that have not already
// been read after their last comment timestamp.
2015-08-17 17:00:26 -07:00
var nodeIDs = [ ] ;
var $placeholders = $ ( context )
. find ( '[data-comment-timestamp]' )
. once ( 'history' )
. filter ( function ( ) {
var $placeholder = $ ( this ) ;
var commentTimestamp = parseInt ( $placeholder . attr ( 'data-comment-timestamp' ) , 10 ) ;
var nodeID = $placeholder . closest ( '[data-history-node-id]' ) . attr ( 'data-history-node-id' ) ;
if ( Drupal . history . needsServerCheck ( nodeID , commentTimestamp ) ) {
nodeIDs . push ( nodeID ) ;
return true ;
}
else {
return false ;
}
} ) ;
if ( $placeholders . length === 0 ) {
return ;
}
// Fetch the node read timestamps from the server.
Drupal . history . fetchTimestamps ( nodeIDs , function ( ) {
processCommentNewIndicators ( $placeholders ) ;
} ) ;
}
} ;
2015-09-04 13:20:09 -07:00
/ * *
* Processes the markup for "new comment" indicators .
*
* @ param { jQuery } $placeholders
* The elements that should be processed .
* /
2015-08-17 17:00:26 -07:00
function processCommentNewIndicators ( $placeholders ) {
var isFirstNewComment = true ;
var newCommentString = Drupal . t ( 'new' ) ;
var $placeholder ;
$placeholders . each ( function ( index , placeholder ) {
$placeholder = $ ( placeholder ) ;
var timestamp = parseInt ( $placeholder . attr ( 'data-comment-timestamp' ) , 10 ) ;
var $node = $placeholder . closest ( '[data-history-node-id]' ) ;
var nodeID = $node . attr ( 'data-history-node-id' ) ;
var lastViewTimestamp = Drupal . history . getLastRead ( nodeID ) ;
if ( timestamp > lastViewTimestamp ) {
// Turn the placeholder into an actual "new" indicator.
var $comment = $ ( placeholder )
. removeClass ( 'hidden' )
. text ( newCommentString )
2015-08-27 12:03:05 -07:00
. closest ( '.js-comment' )
2015-08-17 17:00:26 -07:00
// Add 'new' class to the comment, so it can be styled.
. addClass ( 'new' ) ;
// Insert "new" anchor just before the "comment-<cid>" anchor if
// this is the first new comment in the DOM.
if ( isFirstNewComment ) {
isFirstNewComment = false ;
$comment . prev ( ) . before ( '<a id="new" />' ) ;
// If the URL points to the first new comment, then scroll to that
// comment.
if ( window . location . hash === '#new' ) {
window . scrollTo ( 0 , $comment . offset ( ) . top - Drupal . displace . offsets . top ) ;
}
}
}
} ) ;
}
} ) ( jQuery , Drupal , window ) ;