upgrades core to 8.4.2
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
* 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) {
|
||||
/**
|
||||
* Render "new" and "updated" node indicators, as well as "X new" replies links.
|
||||
*/
|
||||
Drupal.behaviors.trackerHistory = {
|
||||
attach(context) {
|
||||
// Find all "new" comment indicator placeholders newer than 30 days ago that
|
||||
// have not already been read after their last comment timestamp.
|
||||
const nodeIDs = [];
|
||||
const $nodeNewPlaceholders = $(context)
|
||||
.find('[data-history-node-timestamp]')
|
||||
.once('history')
|
||||
.filter(function () {
|
||||
const nodeTimestamp = parseInt(this.getAttribute('data-history-node-timestamp'), 10);
|
||||
const nodeID = this.getAttribute('data-history-node-id');
|
||||
if (Drupal.history.needsServerCheck(nodeID, nodeTimestamp)) {
|
||||
nodeIDs.push(nodeID);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
// Find all "new" comment indicator placeholders newer than 30 days ago that
|
||||
// have not already been read after their last comment timestamp.
|
||||
const $newRepliesPlaceholders = $(context)
|
||||
.find('[data-history-node-last-comment-timestamp]')
|
||||
.once('history')
|
||||
.filter(function () {
|
||||
const lastCommentTimestamp = parseInt(this.getAttribute('data-history-node-last-comment-timestamp'), 10);
|
||||
const nodeTimestamp = parseInt(this.previousSibling.previousSibling.getAttribute('data-history-node-timestamp'), 10);
|
||||
// Discard placeholders that have zero comments.
|
||||
if (lastCommentTimestamp === nodeTimestamp) {
|
||||
return false;
|
||||
}
|
||||
const 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;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
if ($nodeNewPlaceholders.length === 0 && $newRepliesPlaceholders.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Fetch the node read timestamps from the server.
|
||||
Drupal.history.fetchTimestamps(nodeIDs, () => {
|
||||
processNodeNewIndicators($nodeNewPlaceholders);
|
||||
processNewRepliesIndicators($newRepliesPlaceholders);
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
function processNodeNewIndicators($placeholders) {
|
||||
const newNodeString = Drupal.t('new');
|
||||
const updatedNodeString = Drupal.t('updated');
|
||||
|
||||
$placeholders.each((index, placeholder) => {
|
||||
const timestamp = parseInt(placeholder.getAttribute('data-history-node-timestamp'), 10);
|
||||
const nodeID = placeholder.getAttribute('data-history-node-id');
|
||||
const lastViewTimestamp = Drupal.history.getLastRead(nodeID);
|
||||
|
||||
if (timestamp > lastViewTimestamp) {
|
||||
const 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.
|
||||
const placeholdersToUpdate = {};
|
||||
$placeholders.each((index, placeholder) => {
|
||||
const timestamp = parseInt(placeholder.getAttribute('data-history-node-last-comment-timestamp'), 10);
|
||||
const nodeID = placeholder.previousSibling.previousSibling.getAttribute('data-history-node-id');
|
||||
const 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.
|
||||
const 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(results) {
|
||||
for (const nodeID in results) {
|
||||
if (results.hasOwnProperty(nodeID) && placeholdersToUpdate.hasOwnProperty(nodeID)) {
|
||||
const url = results[nodeID].first_new_comment_link;
|
||||
const text = Drupal.formatPlural(results[nodeID].new_comment_count, '1 new', '@count new');
|
||||
$(placeholdersToUpdate[nodeID]).append(`<br /><a href="${url}">${text}</a>`);
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}(jQuery, Drupal, window));
|
||||
@@ -1,64 +1,47 @@
|
||||
/**
|
||||
* Attaches behaviors for the Tracker module's History module integration.
|
||||
*
|
||||
* May only be loaded for authenticated users, with the History module enabled.
|
||||
*/
|
||||
* DO NOT EDIT THIS FILE.
|
||||
* See the following change record for more information,
|
||||
* https://www.drupal.org/node/2815083
|
||||
* @preserve
|
||||
**/
|
||||
|
||||
(function ($, Drupal, window) {
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* 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.
|
||||
attach: function attach(context) {
|
||||
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;
|
||||
}
|
||||
});
|
||||
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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
return false;
|
||||
});
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
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;
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -76,28 +59,24 @@
|
||||
var lastViewTimestamp = Drupal.history.getLastRead(nodeID);
|
||||
|
||||
if (timestamp > lastViewTimestamp) {
|
||||
var message = (lastViewTimestamp === 0) ? newNodeString : updatedNodeString;
|
||||
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;
|
||||
@@ -105,9 +84,9 @@
|
||||
$.ajax({
|
||||
url: Drupal.url('comments/render_new_comments_node_links'),
|
||||
type: 'POST',
|
||||
data: {'node_ids[]': nodeIDs},
|
||||
data: { 'node_ids[]': nodeIDs },
|
||||
dataType: 'json',
|
||||
success: function (results) {
|
||||
success: function success(results) {
|
||||
for (var nodeID in results) {
|
||||
if (results.hasOwnProperty(nodeID) && placeholdersToUpdate.hasOwnProperty(nodeID)) {
|
||||
var url = results[nodeID].first_new_comment_link;
|
||||
@@ -118,5 +97,4 @@
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
})(jQuery, Drupal, window);
|
||||
})(jQuery, Drupal, window);
|
||||
@@ -6,6 +6,7 @@ source:
|
||||
plugin: variable
|
||||
variables:
|
||||
- tracker_batch_size
|
||||
source_module: tracker
|
||||
process:
|
||||
cron_index_limit: tracker_batch_size
|
||||
destination:
|
||||
|
||||
@@ -9,7 +9,7 @@ use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "d7_tracker_node",
|
||||
* source_provider = "tracker"
|
||||
* source_module = "tracker"
|
||||
* )
|
||||
*/
|
||||
class TrackerNode extends DrupalSqlBase {
|
||||
|
||||
@@ -9,7 +9,7 @@ use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "d7_tracker_user",
|
||||
* source_provider = "tracker"
|
||||
* source_module = "tracker"
|
||||
* )
|
||||
*/
|
||||
class TrackerUser extends DrupalSqlBase {
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace Drupal\tracker\Tests\Views;
|
||||
|
||||
@trigger_error(__NAMESPACE__ . '\TrackerTestBase is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. Instead, use \Drupal\Tests\tracker\Functional\Views\TrackerTestBase', E_USER_DEPRECATED);
|
||||
|
||||
use Drupal\comment\Tests\CommentTestTrait;
|
||||
use Drupal\Core\Language\LanguageInterface;
|
||||
use Drupal\views\Tests\ViewTestBase;
|
||||
@@ -10,6 +12,9 @@ use Drupal\comment\Entity\Comment;
|
||||
|
||||
/**
|
||||
* Base class for all tracker tests.
|
||||
*
|
||||
* @deprecated Scheduled for removal in Drupal 9.0.0.
|
||||
* Use \Drupal\Tests\tracker\Functional\Views\TrackerTestBase instead.
|
||||
*/
|
||||
abstract class TrackerTestBase extends ViewTestBase {
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ dependencies:
|
||||
- tracker
|
||||
- views
|
||||
|
||||
# Information added by Drupal.org packaging script on 2017-08-16
|
||||
version: '8.3.7'
|
||||
# Information added by Drupal.org packaging script on 2017-11-03
|
||||
version: '8.4.2'
|
||||
core: '8.x'
|
||||
project: 'drupal'
|
||||
datestamp: 1502903957
|
||||
datestamp: 1509719929
|
||||
|
||||
@@ -9,8 +9,8 @@ use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
|
||||
use Drupal\Core\Session\AccountInterface;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\node\Entity\Node;
|
||||
use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
|
||||
use Drupal\Tests\BrowserTestBase;
|
||||
use Drupal\Tests\system\Functional\Cache\AssertPageCacheContextsAndTagsTrait;
|
||||
|
||||
/**
|
||||
* Create and delete nodes and check for their display in the tracker listings.
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\Tests\tracker\Functional\Views;
|
||||
|
||||
use Drupal\comment\Tests\CommentTestTrait;
|
||||
use Drupal\Core\Language\LanguageInterface;
|
||||
use Drupal\Tests\views\Functional\ViewTestBase;
|
||||
use Drupal\views\Tests\ViewTestData;
|
||||
use Drupal\comment\Entity\Comment;
|
||||
|
||||
/**
|
||||
* Base class for all tracker tests.
|
||||
*/
|
||||
abstract class TrackerTestBase extends ViewTestBase {
|
||||
|
||||
use CommentTestTrait;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['comment', 'tracker', 'tracker_test_views'];
|
||||
|
||||
/**
|
||||
* The node used for testing.
|
||||
*
|
||||
* @var \Drupal\node\NodeInterface
|
||||
*/
|
||||
protected $node;
|
||||
|
||||
/**
|
||||
* The comment used for testing.
|
||||
*
|
||||
* @var \Drupal\comment\CommentInterface
|
||||
*/
|
||||
protected $comment;
|
||||
|
||||
protected function setUp($import_test_views = TRUE) {
|
||||
parent::setUp($import_test_views);
|
||||
|
||||
ViewTestData::createTestViews(get_class($this), ['tracker_test_views']);
|
||||
|
||||
$this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']);
|
||||
// Add a comment field.
|
||||
$this->addDefaultCommentField('node', 'page');
|
||||
|
||||
$permissions = ['access comments', 'create page content', 'post comments', 'skip comment approval'];
|
||||
$account = $this->drupalCreateUser($permissions);
|
||||
|
||||
$this->drupalLogin($account);
|
||||
|
||||
$this->node = $this->drupalCreateNode([
|
||||
'title' => $this->randomMachineName(8),
|
||||
'uid' => $account->id(),
|
||||
'status' => 1,
|
||||
]);
|
||||
|
||||
$this->comment = Comment::create([
|
||||
'entity_id' => $this->node->id(),
|
||||
'entity_type' => 'node',
|
||||
'field_name' => 'comment',
|
||||
'subject' => $this->randomMachineName(),
|
||||
'comment_body[' . LanguageInterface::LANGCODE_NOT_SPECIFIED . '][0][value]' => $this->randomMachineName(20),
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace Drupal\Tests\tracker\Functional\Views;
|
||||
|
||||
use Drupal\views\Views;
|
||||
|
||||
/**
|
||||
* Tests the tracker user uid handlers.
|
||||
*
|
||||
* @group tracker
|
||||
*/
|
||||
class TrackerUserUidTest extends TrackerTestBase {
|
||||
|
||||
/**
|
||||
* Views used by this test.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $testViews = ['test_tracker_user_uid'];
|
||||
|
||||
/**
|
||||
* Tests the user uid filter and argument.
|
||||
*/
|
||||
public function testUserUid() {
|
||||
$map = [
|
||||
'nid' => 'nid',
|
||||
'title' => 'title',
|
||||
];
|
||||
|
||||
$expected = [
|
||||
[
|
||||
'nid' => $this->node->id(),
|
||||
'title' => $this->node->label(),
|
||||
]
|
||||
];
|
||||
|
||||
$view = Views::getView('test_tracker_user_uid');
|
||||
$this->executeView($view);
|
||||
|
||||
// We should have no results as the filter is set for uid 0.
|
||||
$this->assertIdenticalResultSet($view, [], $map);
|
||||
$view->destroy();
|
||||
|
||||
// Change the filter value to our user.
|
||||
$view->initHandlers();
|
||||
$view->filter['uid_touch_tracker']->value = $this->node->getOwnerId();
|
||||
$this->executeView($view);
|
||||
|
||||
// We should have one result as the filter is set for the created user.
|
||||
$this->assertIdenticalResultSet($view, $expected, $map);
|
||||
$view->destroy();
|
||||
|
||||
// Remove the filter now, so only the argument will affect the query.
|
||||
$view->removeHandler('default', 'filter', 'uid_touch_tracker');
|
||||
|
||||
// Test the incorrect argument UID.
|
||||
$view->initHandlers();
|
||||
$this->executeView($view, [rand()]);
|
||||
$this->assertIdenticalResultSet($view, [], $map);
|
||||
$view->destroy();
|
||||
|
||||
// Test the correct argument UID.
|
||||
$view->initHandlers();
|
||||
$this->executeView($view, [$this->node->getOwnerId()]);
|
||||
$this->assertIdenticalResultSet($view, $expected, $map);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -8,8 +8,8 @@ package: Core
|
||||
# version: VERSION
|
||||
# core: 8.x
|
||||
|
||||
# Information added by Drupal.org packaging script on 2017-08-16
|
||||
version: '8.3.7'
|
||||
# Information added by Drupal.org packaging script on 2017-11-03
|
||||
version: '8.4.2'
|
||||
core: '8.x'
|
||||
project: 'drupal'
|
||||
datestamp: 1502903957
|
||||
datestamp: 1509719929
|
||||
|
||||
@@ -135,16 +135,21 @@ function tracker_cron() {
|
||||
/**
|
||||
* Access callback: Determines access permission for a user's own account.
|
||||
*
|
||||
* @deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. As
|
||||
* internal API, _tracker_user_access() may also be removed in a minor
|
||||
* release.
|
||||
*
|
||||
* @internal
|
||||
*
|
||||
* @param \Drupal\Core\Session\AccountInterface $account
|
||||
* The user account to track.
|
||||
*
|
||||
* @return bool
|
||||
* TRUE if a user is accessing tracking info for their own account and
|
||||
* has permission to access the content.
|
||||
*
|
||||
* @see tracker_menu()
|
||||
*/
|
||||
function _tracker_myrecent_access(AccountInterface $account) {
|
||||
@trigger_error('_tracker_myrecent_access() is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.', E_USER_DEPRECATED);
|
||||
// This path is only allowed for authenticated users looking at their own content.
|
||||
return $account->id() && (\Drupal::currentUser()->id() == $account->id()) && $account->hasPermission('access content');
|
||||
}
|
||||
@@ -152,16 +157,21 @@ function _tracker_myrecent_access(AccountInterface $account) {
|
||||
/**
|
||||
* Access callback: Determines access permission for an account.
|
||||
*
|
||||
* @deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. As
|
||||
* internal API, _tracker_user_access() may also be removed in a minor
|
||||
* release.
|
||||
*
|
||||
* @internal
|
||||
*
|
||||
* @param int $account
|
||||
* The user account ID to track.
|
||||
*
|
||||
* @return bool
|
||||
* TRUE if a user has permission to access the account for $account and
|
||||
* has permission to access the content.
|
||||
*
|
||||
* @see tracker_menu()
|
||||
*/
|
||||
function _tracker_user_access($account) {
|
||||
@trigger_error('_tracker_user_access() is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.', E_USER_DEPRECATED);
|
||||
return $account->access('view') && $account->hasPermission('access content');
|
||||
}
|
||||
|
||||
|
||||
@@ -19,8 +19,6 @@ use Drupal\node\Entity\Node;
|
||||
*
|
||||
* @return array
|
||||
* A renderable array.
|
||||
*
|
||||
* @see tracker_menu()
|
||||
*/
|
||||
function tracker_page($account = NULL) {
|
||||
if ($account) {
|
||||
|
||||
Reference in New Issue
Block a user