From 09219dcf15b02712510e984f1a46a0632d7416c6 Mon Sep 17 00:00:00 2001
From: Brian Canini <canini.16@osu.edu>
Date: Wed, 5 Aug 2020 15:02:36 -0400
Subject: [PATCH] Updating drupal/view_unpublished (1.0.0-rc2 => 1.0.0-rc3)

---
 composer.json                                 |  2 +-
 composer.lock                                 | 16 ++--
 vendor/composer/installed.json                | 16 ++--
 .../src/Plugin/views/filter/NodeStatus.php    |  3 -
 .../src/ViewUnpublishedInstallHelper.php      | 80 +++++++++++++++++++
 .../Functional/ViewUnpublishedViewsTest.php   |  4 +-
 .../Kernel/ViewUnpublishedDependencyTest.php  | 69 ++++++++++++++++
 .../view_unpublished.info.yml                 |  6 +-
 .../view_unpublished/view_unpublished.install | 24 +++---
 .../view_unpublished.permissions.yml          |  2 +-
 .../view_unpublished.services.yml             |  7 ++
 .../view_unpublished.views.inc                | 10 ++-
 .../view_unpublished.views_execution.inc      |  3 -
 13 files changed, 196 insertions(+), 46 deletions(-)
 create mode 100644 web/modules/view_unpublished/src/ViewUnpublishedInstallHelper.php
 create mode 100644 web/modules/view_unpublished/tests/src/Kernel/ViewUnpublishedDependencyTest.php
 create mode 100644 web/modules/view_unpublished/view_unpublished.services.yml

diff --git a/composer.json b/composer.json
index 17ddc02d50..041f5b0aee 100644
--- a/composer.json
+++ b/composer.json
@@ -173,7 +173,7 @@
         "drupal/twitter_block": "3.0-alpha0",
         "drupal/userprotect": "1.1",
         "drupal/video_embed_field": "2.4",
-        "drupal/view_unpublished": "1.0-rc2",
+        "drupal/view_unpublished": "1.0-rc3",
         "drupal/views_accordion": "1.1",
         "drupal/views_ajax_history": "1.5",
         "drupal/views_autocomplete_filters": "1.3",
diff --git a/composer.lock b/composer.lock
index d6670ccd50..ccccdc6c61 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "8f3515004e0cf833c3fe5d3ee771f2bb",
+    "content-hash": "39b9746c20709cbd7601baab7dd38d74",
     "packages": [
         {
             "name": "alchemy/zippy",
@@ -7934,17 +7934,17 @@
         },
         {
             "name": "drupal/view_unpublished",
-            "version": "1.0.0-rc2",
+            "version": "1.0.0-rc3",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/view_unpublished.git",
-                "reference": "8.x-1.0-rc2"
+                "reference": "8.x-1.0-rc3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.0-rc2.zip",
-                "reference": "8.x-1.0-rc2",
-                "shasum": "673b2a76176b68b5f27affd4c2a718c2eaa45764"
+                "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.0-rc3.zip",
+                "reference": "8.x-1.0-rc3",
+                "shasum": "6973708d48b76531fa9227d8b959a516e1cb9129"
             },
             "require": {
                 "drupal/core": "^8 || ^9"
@@ -7952,8 +7952,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-1.0-rc2",
-                    "datestamp": "1593633641",
+                    "version": "8.x-1.0-rc3",
+                    "datestamp": "1595646359",
                     "security-coverage": {
                         "status": "not-covered",
                         "message": "RC releases are not covered by Drupal security advisories."
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 6496457e56..6f1380af51 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -8180,18 +8180,18 @@
     },
     {
         "name": "drupal/view_unpublished",
-        "version": "1.0.0-rc2",
-        "version_normalized": "1.0.0.0-RC2",
+        "version": "1.0.0-rc3",
+        "version_normalized": "1.0.0.0-RC3",
         "source": {
             "type": "git",
             "url": "https://git.drupalcode.org/project/view_unpublished.git",
-            "reference": "8.x-1.0-rc2"
+            "reference": "8.x-1.0-rc3"
         },
         "dist": {
             "type": "zip",
-            "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.0-rc2.zip",
-            "reference": "8.x-1.0-rc2",
-            "shasum": "673b2a76176b68b5f27affd4c2a718c2eaa45764"
+            "url": "https://ftp.drupal.org/files/projects/view_unpublished-8.x-1.0-rc3.zip",
+            "reference": "8.x-1.0-rc3",
+            "shasum": "6973708d48b76531fa9227d8b959a516e1cb9129"
         },
         "require": {
             "drupal/core": "^8 || ^9"
@@ -8199,8 +8199,8 @@
         "type": "drupal-module",
         "extra": {
             "drupal": {
-                "version": "8.x-1.0-rc2",
-                "datestamp": "1593633641",
+                "version": "8.x-1.0-rc3",
+                "datestamp": "1595646359",
                 "security-coverage": {
                     "status": "not-covered",
                     "message": "RC releases are not covered by Drupal security advisories."
diff --git a/web/modules/view_unpublished/src/Plugin/views/filter/NodeStatus.php b/web/modules/view_unpublished/src/Plugin/views/filter/NodeStatus.php
index 8fe9c814ee..073732894c 100644
--- a/web/modules/view_unpublished/src/Plugin/views/filter/NodeStatus.php
+++ b/web/modules/view_unpublished/src/Plugin/views/filter/NodeStatus.php
@@ -4,7 +4,6 @@
 
 use Drupal\node\Entity\NodeType;
 use Drupal\node\Plugin\views\filter\Status;
-use Drupal\views\Annotation\ViewsFilter;
 
 /**
  * Filter by view all unpublished permissions granted by view_unpublished.
@@ -12,8 +11,6 @@
  * Takes over the Published or Admin filter query.
  *
  * @ingroup views_filter_handlers
- *
- * @ViewsFilter("view_unpublished_node_status")
  */
 class NodeStatus extends Status {
 
diff --git a/web/modules/view_unpublished/src/ViewUnpublishedInstallHelper.php b/web/modules/view_unpublished/src/ViewUnpublishedInstallHelper.php
new file mode 100644
index 0000000000..de63ec48c5
--- /dev/null
+++ b/web/modules/view_unpublished/src/ViewUnpublishedInstallHelper.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Drupal\view_unpublished;
+
+use Drupal\Core\Config\CachedStorage;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+
+/**
+ * Class ViewUnpublishedInstallHelper.
+ */
+class ViewUnpublishedInstallHelper {
+
+  /**
+   * Drupal\Core\Config\ConfigFactoryInterface definition.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * Drupal\Core\Config\CachedStorage definition.
+   *
+   * @var \Drupal\Core\Config\CachedStorage
+   */
+  protected $configStorage;
+
+  /**
+   * Drupal\Core\Entity\EntityTypeManagerInterface definition.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * Constructs a new ViewUnpublishedInstallHelper object.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager service.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The config factory service.
+   * @param \Drupal\Core\Config\CachedStorage $config_storage
+   *   The config storage service.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, ConfigFactoryInterface $config_factory, CachedStorage $config_storage) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->configFactory = $config_factory;
+    $this->configStorage = $config_storage;
+  }
+
+  /**
+   * Helper that flags node_access to be rebuilt if unpublished nodes exist.
+   */
+  public function flagRebuild() {
+    $query = $this->entityTypeManager->getStorage('node')->getQuery();
+    $count_unpublished = (int) $query->condition('status', FALSE)->count()->execute();
+    if ($count_unpublished > 0) {
+      node_access_needs_rebuild(TRUE);
+    }
+  }
+
+  /**
+   * Remove the errant view_unpublished dependency from Views.
+   */
+  public function removeDependency() {
+
+    $view_names = $this->configStorage->listAll('views.view');
+    foreach ($view_names as $name) {
+      $dependencies = $this->configFactory->get($name)->get('dependencies.module');
+      if (!empty($dependencies) && array_key_exists('view_unpublished', array_flip($dependencies))) {
+        $dependencies = array_diff($dependencies, ['view_unpublished']);
+        $this->configFactory
+          ->getEditable($name)
+          ->set('dependencies.module', $dependencies)
+          ->save(TRUE);
+      }
+    }
+  }
+
+}
diff --git a/web/modules/view_unpublished/tests/src/Functional/ViewUnpublishedViewsTest.php b/web/modules/view_unpublished/tests/src/Functional/ViewUnpublishedViewsTest.php
index 6f553f9dca..f44640dc25 100644
--- a/web/modules/view_unpublished/tests/src/Functional/ViewUnpublishedViewsTest.php
+++ b/web/modules/view_unpublished/tests/src/Functional/ViewUnpublishedViewsTest.php
@@ -46,10 +46,10 @@ protected function setUp() {
    */
   public function testIt() {
     $page_node = $this->createNode(['type' => 'page']);
-    $page_node->setPublished(FALSE);
+    $page_node->setUnPublished();
     $page_node->save();
     $article_node = $this->createNode(['type' => 'article']);
-    $article_node->setPublished(FALSE);
+    $article_node->setUnPublished();
     $article_node->save();
 
     $this->drupalLogin($this->createUser(['view any unpublished content', 'access content overview']));
diff --git a/web/modules/view_unpublished/tests/src/Kernel/ViewUnpublishedDependencyTest.php b/web/modules/view_unpublished/tests/src/Kernel/ViewUnpublishedDependencyTest.php
new file mode 100644
index 0000000000..b43938a722
--- /dev/null
+++ b/web/modules/view_unpublished/tests/src/Kernel/ViewUnpublishedDependencyTest.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Drupal\Tests\view_unpublished\Kernel;
+
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\views\Views;
+
+/**
+ * Tests the View Unpublished dependency issue.
+ *
+ * @group view_unpublished
+ */
+class ViewUnpublishedDependencyTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'field',
+    'node',
+    'system',
+    'text',
+    'user',
+    'view_unpublished',
+    'views',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('node');
+    $this->installConfig('node');
+  }
+
+  /**
+   * Tests view_unpublished not added as dependency of content view.
+   */
+  public function testDependencyNotAdded() {
+    // Check dependency before saving.
+    $module_deps = $this->config('views.view.content')->get('dependencies.module');
+    $this->assertArrayNotHasKey('view_unpublished', array_flip($module_deps));
+
+    // Save and check again.
+    $view = Views::getView('content');
+    $view->save();
+    $module_deps = $this->config('views.view.content')->get('dependencies.module');
+    $this->assertArrayNotHasKey('view_unpublished', array_flip($module_deps));
+  }
+
+  /**
+   * Tests the remove dependency install helper.
+   */
+  public function testDependencyRemoved() {
+    $module_deps = $this->config('views.view.content')->get('dependencies.module');
+    $module_deps[] = 'view_unpublished';
+    $this->config('views.view.content')->set('dependencies.module', $module_deps)->save(TRUE);
+    $this->container->get('view_unpublished.install_helper')->removeDependency();
+    $module_deps = $this->config('views.view.content')->get('dependencies.module');
+    $this->assertNotEmpty($module_deps);
+    $this->assertArrayNotHasKey('view_unpublished', array_flip($module_deps));
+  }
+
+}
diff --git a/web/modules/view_unpublished/view_unpublished.info.yml b/web/modules/view_unpublished/view_unpublished.info.yml
index 1030f2667b..ce33c2b77c 100644
--- a/web/modules/view_unpublished/view_unpublished.info.yml
+++ b/web/modules/view_unpublished/view_unpublished.info.yml
@@ -7,7 +7,7 @@ type: module
 dependencies:
   - drupal:node
 
-# Information added by Drupal.org packaging script on 2020-07-01
-version: '8.x-1.0-rc2'
+# Information added by Drupal.org packaging script on 2020-07-25
+version: '8.x-1.0-rc3'
 project: 'view_unpublished'
-datestamp: 1593633642
+datestamp: 1595646337
diff --git a/web/modules/view_unpublished/view_unpublished.install b/web/modules/view_unpublished/view_unpublished.install
index d8cc7b703f..2792f8d2ba 100644
--- a/web/modules/view_unpublished/view_unpublished.install
+++ b/web/modules/view_unpublished/view_unpublished.install
@@ -11,25 +11,16 @@
  * Implements hook_install().
  */
 function view_unpublished_install() {
-  _view_unpublished_flag_rebuild_if_needed();
+  Drupal::service('view_unpublished.install_helper')->flagRebuild();
 }
 
 /**
  * Implements hook_uninstall().
  */
 function view_unpublished_uninstall() {
-  _view_unpublished_flag_rebuild_if_needed();
-}
-
-/**
- * Helper that flags node_access to be rebuilt if unpublished nodes exist.
- */
-function _view_unpublished_flag_rebuild_if_needed() {
-  $query = \Drupal::entityTypeManager()->getStorage('node')->getQuery();
-  $count_unpublished = (int) $query->condition('status', FALSE)->count()->execute();
-  if ($count_unpublished > 0) {
-    node_access_needs_rebuild(TRUE);
-  }
+  Drupal::service('view_unpublished.install_helper')->flagRebuild();
+  // Remove any errant view_unpublished dependency.
+  Drupal::service('view_unpublished.install_helper')->removeDependency();
 }
 
 /**
@@ -45,3 +36,10 @@ function view_unpublished_update_8001() {
     [':rebuild' => Url::fromRoute('node.configure_rebuild_confirm')->toString()]
   );
 }
+
+/**
+ * Remove any view_unpublished dependency that may have been added to views.
+ */
+function view_unpublished_update_8002() {
+  Drupal::service('view_unpublished.install_helper')->removeDependency();
+}
diff --git a/web/modules/view_unpublished/view_unpublished.permissions.yml b/web/modules/view_unpublished/view_unpublished.permissions.yml
index 34690838f9..f671132d0f 100644
--- a/web/modules/view_unpublished/view_unpublished.permissions.yml
+++ b/web/modules/view_unpublished/view_unpublished.permissions.yml
@@ -2,4 +2,4 @@ view any unpublished content:
   title: 'View any unpublished content'
 
 permission_callbacks:
-  - Drupal\view_unpublished\ViewUnpublishedPermissions::permissions
\ No newline at end of file
+  - Drupal\view_unpublished\ViewUnpublishedPermissions::permissions
diff --git a/web/modules/view_unpublished/view_unpublished.services.yml b/web/modules/view_unpublished/view_unpublished.services.yml
new file mode 100644
index 0000000000..b1f20653ad
--- /dev/null
+++ b/web/modules/view_unpublished/view_unpublished.services.yml
@@ -0,0 +1,7 @@
+services:
+  logger.channel.view_unpublished:
+    parent: logger.channel_base
+    arguments: ['view_unpublished']
+  view_unpublished.install_helper:
+    class: Drupal\view_unpublished\ViewUnpublishedInstallHelper
+    arguments: ['@entity_type.manager', '@config.factory', '@config.storage']
diff --git a/web/modules/view_unpublished/view_unpublished.views.inc b/web/modules/view_unpublished/view_unpublished.views.inc
index b8714d0719..0edfad6397 100644
--- a/web/modules/view_unpublished/view_unpublished.views.inc
+++ b/web/modules/view_unpublished/view_unpublished.views.inc
@@ -5,10 +5,12 @@
  * Provide views data for view_unpublished.module.
  */
 
+use Drupal\view_unpublished\Plugin\views\filter\NodeStatus;
+
 /**
- * Implements hook_views_data_alter().
+ * Implements hook_views_plugins_filter_alter().
  */
-function view_unpublished_views_data_alter(array &$data) {
-  // The published status + extra handler is taken over by our handler.
-  $data['node_field_data']['status_extra']['filter']['id'] = 'view_unpublished_node_status';
+function view_unpublished_views_plugins_filter_alter(array &$plugins) {
+  // Change the 'status' handler class.
+  $plugins['node_status']['class'] = NodeStatus::class;
 }
diff --git a/web/modules/view_unpublished/view_unpublished.views_execution.inc b/web/modules/view_unpublished/view_unpublished.views_execution.inc
index 9df92816b8..0ee308ce32 100644
--- a/web/modules/view_unpublished/view_unpublished.views_execution.inc
+++ b/web/modules/view_unpublished/view_unpublished.views_execution.inc
@@ -12,9 +12,6 @@
  * Implements hook_views_query_substitutions().
  */
 function view_unpublished_views_query_substitutions(ViewExecutable $view) {
-  if ($view->id() != 'content' && !empty($view->filter['status']->value) && $view->filter['status']->value == 1) {
-    return;
-  }
   $account = \Drupal::currentUser();
   $substitutions = [];
   foreach (NodeType::loadMultiple() as $type) {
-- 
GitLab