/** * @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"; /** * Renders "new" comment indicators wherever necessary. * * @type {Drupal~behavior} * * @prop {Drupal~behaviorAttach} attach * Attaches "new" comment indicators behavior. */ Drupal.behaviors.commentNewIndicator = { attach: function (context) { // 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. 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); }); } }; /** * Processes the markup for "new comment" indicators. * * @param {jQuery} $placeholders * The elements that should be processed. */ 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) .closest('.js-comment') // Add 'new' class to the comment, so it can be styled. .addClass('new'); // Insert "new" anchor just before the "comment-" anchor if // this is the first new comment in the DOM. if (isFirstNewComment) { isFirstNewComment = false; $comment.prev().before(''); // 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);