From c0d9404ca20da0e74f47cbcb5d4be3030ee98547 Mon Sep 17 00:00:00 2001 From: Jack McDade Date: Fri, 27 Mar 2026 16:45:27 -0400 Subject: [PATCH] Fix collection badges Closes #13341 --- src/Stache/Query/QueriesEntryStatus.php | 12 ++++++++++++ tests/Data/Entries/EntryQueryBuilderTest.php | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/Stache/Query/QueriesEntryStatus.php b/src/Stache/Query/QueriesEntryStatus.php index 0588563521..ee02ce52cb 100644 --- a/src/Stache/Query/QueriesEntryStatus.php +++ b/src/Stache/Query/QueriesEntryStatus.php @@ -45,6 +45,18 @@ private function addCollectionStatusLogicToQuery($query, $status, $collection): return; } + if ($status === 'scheduled' && $collection->futureDateBehavior() !== 'private') { + $query->where('date', 'invalid'); // intentionally trigger no results. + + return; + } + + if ($status === 'expired' && $collection->pastDateBehavior() !== 'private') { + $query->where('date', 'invalid'); // intentionally trigger no results. + + return; + } + if ($collection->futureDateBehavior() === 'private') { $status === 'scheduled' ? $query->where('date', '>', now()) diff --git a/tests/Data/Entries/EntryQueryBuilderTest.php b/tests/Data/Entries/EntryQueryBuilderTest.php index 599f2550c8..1d6b4371bd 100644 --- a/tests/Data/Entries/EntryQueryBuilderTest.php +++ b/tests/Data/Entries/EntryQueryBuilderTest.php @@ -1215,6 +1215,18 @@ public function it_filters_by_status($status, $expected) EntryFactory::collection('calendar')->id('calendar-past')->published(true)->date(now()->subDay())->create(); EntryFactory::collection('calendar')->id('calendar-past-draft')->published(false)->date(now()->subDay())->create(); + Collection::make('news')->dated(true)->futureDateBehavior('unlisted')->pastDateBehavior('public')->save(); + EntryFactory::collection('news')->id('news-future')->published(true)->date(now()->addDay())->create(); + EntryFactory::collection('news')->id('news-future-draft')->published(false)->date(now()->addDay())->create(); + EntryFactory::collection('news')->id('news-past')->published(true)->date(now()->subDay())->create(); + EntryFactory::collection('news')->id('news-past-draft')->published(false)->date(now()->subDay())->create(); + + Collection::make('alerts')->dated(true)->futureDateBehavior('public')->pastDateBehavior('unlisted')->save(); + EntryFactory::collection('alerts')->id('alerts-future')->published(true)->date(now()->addDay())->create(); + EntryFactory::collection('alerts')->id('alerts-future-draft')->published(false)->date(now()->addDay())->create(); + EntryFactory::collection('alerts')->id('alerts-past')->published(true)->date(now()->subDay())->create(); + EntryFactory::collection('alerts')->id('alerts-past-draft')->published(false)->date(now()->subDay())->create(); + // Undated, but with customized date behavior. Nonsensical situation, but it can happen. // See https://github.com/statamic/eloquent-driver/issues/288 Collection::make('undated')->dated(false)->futureDateBehavior('private')->pastDateBehavior('private')->save(); @@ -1235,6 +1247,10 @@ public static function filterByStatusProvider() 'event-past-draft', 'calendar-future-draft', 'calendar-past-draft', + 'news-future-draft', + 'news-past-draft', + 'alerts-future-draft', + 'alerts-past-draft', 'undated-draft', ]], 'published' => ['published', [ @@ -1243,6 +1259,10 @@ public static function filterByStatusProvider() 'event-future', 'calendar-future', 'calendar-past', + 'news-future', + 'news-past', + 'alerts-future', + 'alerts-past', 'undated', ]], 'scheduled' => ['scheduled', [