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);
|