annotate core/modules/tracker/js/tracker-history.es6.js @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 /**
Chris@0 2 * Attaches behaviors for the Tracker module's History module integration.
Chris@0 3 *
Chris@0 4 * May only be loaded for authenticated users, with the History module enabled.
Chris@0 5 */
Chris@17 6 (function($, Drupal, window) {
Chris@0 7 function processNodeNewIndicators($placeholders) {
Chris@0 8 const newNodeString = Drupal.t('new');
Chris@0 9 const updatedNodeString = Drupal.t('updated');
Chris@0 10
Chris@0 11 $placeholders.each((index, placeholder) => {
Chris@17 12 const timestamp = parseInt(
Chris@17 13 placeholder.getAttribute('data-history-node-timestamp'),
Chris@17 14 10,
Chris@17 15 );
Chris@0 16 const nodeID = placeholder.getAttribute('data-history-node-id');
Chris@0 17 const lastViewTimestamp = Drupal.history.getLastRead(nodeID);
Chris@0 18
Chris@0 19 if (timestamp > lastViewTimestamp) {
Chris@17 20 const message =
Chris@17 21 lastViewTimestamp === 0 ? newNodeString : updatedNodeString;
Chris@0 22 $(placeholder).append(`<span class="marker">${message}</span>`);
Chris@0 23 }
Chris@0 24 });
Chris@0 25 }
Chris@0 26
Chris@0 27 function processNewRepliesIndicators($placeholders) {
Chris@0 28 // Figure out which placeholders need the "x new" replies links.
Chris@0 29 const placeholdersToUpdate = {};
Chris@0 30 $placeholders.each((index, placeholder) => {
Chris@17 31 const timestamp = parseInt(
Chris@17 32 placeholder.getAttribute('data-history-node-last-comment-timestamp'),
Chris@17 33 10,
Chris@17 34 );
Chris@17 35 const nodeID = placeholder.previousSibling.previousSibling.getAttribute(
Chris@17 36 'data-history-node-id',
Chris@17 37 );
Chris@0 38 const lastViewTimestamp = Drupal.history.getLastRead(nodeID);
Chris@0 39
Chris@0 40 // Queue this placeholder's "X new" replies link to be downloaded from the
Chris@0 41 // server.
Chris@0 42 if (timestamp > lastViewTimestamp) {
Chris@0 43 placeholdersToUpdate[nodeID] = placeholder;
Chris@0 44 }
Chris@0 45 });
Chris@0 46
Chris@0 47 // Perform an AJAX request to retrieve node view timestamps.
Chris@0 48 const nodeIDs = Object.keys(placeholdersToUpdate);
Chris@0 49 if (nodeIDs.length === 0) {
Chris@0 50 return;
Chris@0 51 }
Chris@0 52 $.ajax({
Chris@0 53 url: Drupal.url('comments/render_new_comments_node_links'),
Chris@0 54 type: 'POST',
Chris@0 55 data: { 'node_ids[]': nodeIDs },
Chris@0 56 dataType: 'json',
Chris@0 57 success(results) {
Chris@17 58 Object.keys(results || {}).forEach(nodeID => {
Chris@14 59 if (placeholdersToUpdate.hasOwnProperty(nodeID)) {
Chris@0 60 const url = results[nodeID].first_new_comment_link;
Chris@17 61 const text = Drupal.formatPlural(
Chris@17 62 results[nodeID].new_comment_count,
Chris@17 63 '1 new',
Chris@17 64 '@count new',
Chris@17 65 );
Chris@17 66 $(placeholdersToUpdate[nodeID]).append(
Chris@17 67 `<br /><a href="${url}">${text}</a>`,
Chris@17 68 );
Chris@0 69 }
Chris@14 70 });
Chris@0 71 },
Chris@0 72 });
Chris@0 73 }
Chris@17 74
Chris@17 75 /**
Chris@17 76 * Render "new" and "updated" node indicators, as well as "X new" replies links.
Chris@17 77 */
Chris@17 78 Drupal.behaviors.trackerHistory = {
Chris@17 79 attach(context) {
Chris@17 80 // Find all "new" comment indicator placeholders newer than 30 days ago that
Chris@17 81 // have not already been read after their last comment timestamp.
Chris@17 82 const nodeIDs = [];
Chris@17 83 const $nodeNewPlaceholders = $(context)
Chris@17 84 .find('[data-history-node-timestamp]')
Chris@17 85 .once('history')
Chris@17 86 .filter(function() {
Chris@17 87 const nodeTimestamp = parseInt(
Chris@17 88 this.getAttribute('data-history-node-timestamp'),
Chris@17 89 10,
Chris@17 90 );
Chris@17 91 const nodeID = this.getAttribute('data-history-node-id');
Chris@17 92 if (Drupal.history.needsServerCheck(nodeID, nodeTimestamp)) {
Chris@17 93 nodeIDs.push(nodeID);
Chris@17 94 return true;
Chris@17 95 }
Chris@17 96
Chris@17 97 return false;
Chris@17 98 });
Chris@17 99
Chris@17 100 // Find all "new" comment indicator placeholders newer than 30 days ago that
Chris@17 101 // have not already been read after their last comment timestamp.
Chris@17 102 const $newRepliesPlaceholders = $(context)
Chris@17 103 .find('[data-history-node-last-comment-timestamp]')
Chris@17 104 .once('history')
Chris@17 105 .filter(function() {
Chris@17 106 const lastCommentTimestamp = parseInt(
Chris@17 107 this.getAttribute('data-history-node-last-comment-timestamp'),
Chris@17 108 10,
Chris@17 109 );
Chris@17 110 const nodeTimestamp = parseInt(
Chris@17 111 this.previousSibling.previousSibling.getAttribute(
Chris@17 112 'data-history-node-timestamp',
Chris@17 113 ),
Chris@17 114 10,
Chris@17 115 );
Chris@17 116 // Discard placeholders that have zero comments.
Chris@17 117 if (lastCommentTimestamp === nodeTimestamp) {
Chris@17 118 return false;
Chris@17 119 }
Chris@17 120 const nodeID = this.previousSibling.previousSibling.getAttribute(
Chris@17 121 'data-history-node-id',
Chris@17 122 );
Chris@17 123 if (Drupal.history.needsServerCheck(nodeID, lastCommentTimestamp)) {
Chris@17 124 if (nodeIDs.indexOf(nodeID) === -1) {
Chris@17 125 nodeIDs.push(nodeID);
Chris@17 126 }
Chris@17 127 return true;
Chris@17 128 }
Chris@17 129
Chris@17 130 return false;
Chris@17 131 });
Chris@17 132
Chris@17 133 if (
Chris@17 134 $nodeNewPlaceholders.length === 0 &&
Chris@17 135 $newRepliesPlaceholders.length === 0
Chris@17 136 ) {
Chris@17 137 return;
Chris@17 138 }
Chris@17 139
Chris@17 140 // Fetch the node read timestamps from the server.
Chris@17 141 Drupal.history.fetchTimestamps(nodeIDs, () => {
Chris@17 142 processNodeNewIndicators($nodeNewPlaceholders);
Chris@17 143 processNewRepliesIndicators($newRepliesPlaceholders);
Chris@17 144 });
Chris@17 145 },
Chris@17 146 };
Chris@17 147 })(jQuery, Drupal, window);