2015-08-27 12:03:05 -07:00
/ * *
* Attaches behaviors for the Tracker module ' s History module integration .
*
* May only be loaded for authenticated users , with the History module enabled .
* /
( function ( $ , Drupal , window ) {
2015-10-21 21:44:50 -07:00
'use strict' ;
2015-08-27 12:03:05 -07:00
/ * *
* Render "new" and "updated" node indicators , as well as "X new" replies links .
* /
Drupal . behaviors . trackerHistory = {
attach : function ( context ) {
// Find all "new" comment indicator placeholders newer than 30 days ago that
// have not already been read after their last comment timestamp.
var nodeIDs = [ ] ;
var $nodeNewPlaceholders = $ ( context )
. find ( '[data-history-node-timestamp]' )
. once ( 'history' )
. filter ( function ( ) {
var nodeTimestamp = parseInt ( this . getAttribute ( 'data-history-node-timestamp' ) , 10 ) ;
var nodeID = this . getAttribute ( 'data-history-node-id' ) ;
if ( Drupal . history . needsServerCheck ( nodeID , nodeTimestamp ) ) {
nodeIDs . push ( nodeID ) ;
return true ;
}
else {
return false ;
}
} ) ;
// Find all "new" comment indicator placeholders newer than 30 days ago that
// have not already been read after their last comment timestamp.
var $newRepliesPlaceholders = $ ( context )
. find ( '[data-history-node-last-comment-timestamp]' )
. once ( 'history' )
. filter ( function ( ) {
var lastCommentTimestamp = parseInt ( this . getAttribute ( 'data-history-node-last-comment-timestamp' ) , 10 ) ;
var nodeTimestamp = parseInt ( this . previousSibling . previousSibling . getAttribute ( 'data-history-node-timestamp' ) , 10 ) ;
// Discard placeholders that have zero comments.
if ( lastCommentTimestamp === nodeTimestamp ) {
return false ;
}
var nodeID = this . previousSibling . previousSibling . getAttribute ( 'data-history-node-id' ) ;
if ( Drupal . history . needsServerCheck ( nodeID , lastCommentTimestamp ) ) {
if ( nodeIDs . indexOf ( nodeID ) === - 1 ) {
nodeIDs . push ( nodeID ) ;
}
return true ;
}
else {
return false ;
}
} ) ;
if ( $nodeNewPlaceholders . length === 0 && $newRepliesPlaceholders . length === 0 ) {
return ;
}
// Fetch the node read timestamps from the server.
Drupal . history . fetchTimestamps ( nodeIDs , function ( ) {
processNodeNewIndicators ( $nodeNewPlaceholders ) ;
processNewRepliesIndicators ( $newRepliesPlaceholders ) ;
} ) ;
}
} ;
function processNodeNewIndicators ( $placeholders ) {
var newNodeString = Drupal . t ( 'new' ) ;
var updatedNodeString = Drupal . t ( 'updated' ) ;
$placeholders . each ( function ( index , placeholder ) {
var timestamp = parseInt ( placeholder . getAttribute ( 'data-history-node-timestamp' ) , 10 ) ;
var nodeID = placeholder . getAttribute ( 'data-history-node-id' ) ;
var lastViewTimestamp = Drupal . history . getLastRead ( nodeID ) ;
if ( timestamp > lastViewTimestamp ) {
var message = ( lastViewTimestamp === 0 ) ? newNodeString : updatedNodeString ;
$ ( placeholder ) . append ( '<span class="marker">' + message + '</span>' ) ;
}
} ) ;
}
function processNewRepliesIndicators ( $placeholders ) {
// Figure out which placeholders need the "x new" replies links.
var placeholdersToUpdate = { } ;
$placeholders . each ( function ( index , placeholder ) {
var timestamp = parseInt ( placeholder . getAttribute ( 'data-history-node-last-comment-timestamp' ) , 10 ) ;
var nodeID = placeholder . previousSibling . previousSibling . getAttribute ( 'data-history-node-id' ) ;
var lastViewTimestamp = Drupal . history . getLastRead ( nodeID ) ;
// Queue this placeholder's "X new" replies link to be downloaded from the
// server.
if ( timestamp > lastViewTimestamp ) {
placeholdersToUpdate [ nodeID ] = placeholder ;
}
} ) ;
// Perform an AJAX request to retrieve node view timestamps.
var nodeIDs = Object . keys ( placeholdersToUpdate ) ;
if ( nodeIDs . length === 0 ) {
return ;
}
$ . ajax ( {
url : Drupal . url ( 'comments/render_new_comments_node_links' ) ,
type : 'POST' ,
data : { 'node_ids[]' : nodeIDs } ,
dataType : 'json' ,
success : function ( results ) {
for ( var nodeID in results ) {
if ( results . hasOwnProperty ( nodeID ) && placeholdersToUpdate . hasOwnProperty ( nodeID ) ) {
var url = results [ nodeID ] . first _new _comment _link ;
var text = Drupal . formatPlural ( results [ nodeID ] . new _comment _count , '1 new' , '@count new' ) ;
$ ( placeholdersToUpdate [ nodeID ] ) . append ( '<br /><a href="' + url + '">' + text + '</a>' ) ;
}
}
}
} ) ;
}
} ) ( jQuery , Drupal , window ) ;