diff --git a/app/Activity/TagRepo.php b/app/Activity/TagRepo.php index 4f2dbed59..82c26b00e 100644 --- a/app/Activity/TagRepo.php +++ b/app/Activity/TagRepo.php @@ -38,7 +38,8 @@ class TagRepo DB::raw('SUM(IF(entity_type = \'book\', 1, 0)) as book_count'), DB::raw('SUM(IF(entity_type = \'bookshelf\', 1, 0)) as shelf_count'), ]) - ->orderBy($sort, $listOptions->getOrder()); + ->orderBy($sort, $listOptions->getOrder()) + ->whereHas('entity'); if ($nameFilter) { $query->where('name', '=', $nameFilter); diff --git a/tests/Entity/TagTest.php b/tests/Entity/TagTest.php index c1240e955..729f93903 100644 --- a/tests/Entity/TagTest.php +++ b/tests/Entity/TagTest.php @@ -9,7 +9,7 @@ use Tests\TestCase; class TagTest extends TestCase { - protected $defaultTagCount = 20; + protected int $defaultTagCount = 20; /** * Get an instance of a page that has many tags. @@ -193,6 +193,24 @@ class TagTest extends TestCase $resp->assertSee('Tags can be assigned via the page editor sidebar'); } + public function test_tag_index_does_not_include_tags_on_recycle_bin_items() + { + $page = $this->entities->page(); + $page->tags()->create(['name' => 'DeleteRecord', 'value' => 'itemToDeleteTest']); + + $resp = $this->asEditor()->get('/tags'); + $resp->assertSee('DeleteRecord'); + $resp = $this->asEditor()->get('/tags?name=DeleteRecord'); + $resp->assertSee('itemToDeleteTest'); + + $this->entities->sendToRecycleBin($page); + + $resp = $this->asEditor()->get('/tags'); + $resp->assertDontSee('DeleteRecord'); + $resp = $this->asEditor()->get('/tags?name=DeleteRecord'); + $resp->assertDontSee('itemToDeleteTest'); + } + public function test_tag_classes_visible_on_entities() { $this->asEditor(); diff --git a/tests/Helpers/EntityProvider.php b/tests/Helpers/EntityProvider.php index 982063421..1897abefa 100644 --- a/tests/Helpers/EntityProvider.php +++ b/tests/Helpers/EntityProvider.php @@ -207,6 +207,29 @@ class EntityProvider return $draftPage; } + /** + * Send an entity to the recycle bin. + */ + public function sendToRecycleBin(Entity $entity) + { + $trash = app()->make(TrashCan::class); + + if ($entity instanceof Page) { + $trash->softDestroyPage($entity); + } elseif ($entity instanceof Chapter) { + $trash->softDestroyChapter($entity); + } elseif ($entity instanceof Book) { + $trash->softDestroyBook($entity); + } elseif ($entity instanceof Bookshelf) { + $trash->softDestroyBookshelf($entity); + } + + $entity->refresh(); + if (is_null($entity->deleted_at)) { + throw new \Exception("Could not send entity type [{$entity->getMorphClass()}] to the recycle bin"); + } + } + /** * Fully destroy the given entity from the system, bypassing the recycle bin * stage. Still runs through main app deletion logic.