diff --git a/src/Traits/Filters/HandlesPillsData.php b/src/Traits/Filters/HandlesPillsData.php index 47302988e..07c9cc630 100644 --- a/src/Traits/Filters/HandlesPillsData.php +++ b/src/Traits/Filters/HandlesPillsData.php @@ -11,7 +11,7 @@ public function getPillDataForFilter(): array $filters = []; foreach ($this->getAppliedFiltersWithValuesForPills() as $filterKey => $value) { - if (! is_null($filter = $this->getFilterByKey($filterKey))) { + if (! is_null($filter = $this->getFilterByKey($filterKey)) && ! $filter->isEmpty($filter->validate($value))) { $filters[$filter->getKey()] = FilterPillData::make( filterKey: $filter->getKey(), customPillBlade: $filter->getCustomPillBlade() ?? null, diff --git a/src/Traits/Filters/Helpers/FilterPillsHelpers.php b/src/Traits/Filters/Helpers/FilterPillsHelpers.php index 5f881b81b..fc096bca7 100644 --- a/src/Traits/Filters/Helpers/FilterPillsHelpers.php +++ b/src/Traits/Filters/Helpers/FilterPillsHelpers.php @@ -49,11 +49,13 @@ public function getAppliedFiltersWithValuesForPills(): array } $validatedValue = $filter->validate($item); + if ($filter instanceof BooleanFilter) { return ! ($filter->isEmpty($validatedValue)); - } elseif ($validatedValue === null || $validatedValue === 'null') { + } elseif ($validatedValue === null || $validatedValue === 'null' || $filter->isEmpty($validatedValue)) { return false; } elseif (is_array($validatedValue)) { + $filter->isEmpty($validatedValue); if (array_key_exists(0, $validatedValue) && (is_null($validatedValue[0]) || $validatedValue[0] == 'null')) { return false; } diff --git a/src/Views/Filters/DateRangeFilter.php b/src/Views/Filters/DateRangeFilter.php index eb8777d2b..a115b7939 100644 --- a/src/Views/Filters/DateRangeFilter.php +++ b/src/Views/Filters/DateRangeFilter.php @@ -40,12 +40,10 @@ public function validate(array|string|null $values): array|bool return false; } - $startDate = $this->createCarbonDate($returnedValues['minDate']); - $endDate = $this->createCarbonDate($returnedValues['maxDate']); - - if (! ($startDate instanceof Carbon) || ! ($endDate instanceof Carbon)) { + if (! (($startDate = $this->createCarbonDate($returnedValues['minDate'])) instanceof Carbon) || ! (($endDate = $this->createCarbonDate($returnedValues['maxDate'])) instanceof Carbon)) { return false; } + if ($startDate->gt($endDate)) { return false; } @@ -198,6 +196,9 @@ public function getFilterPillValue($value): array|string|bool|null public function isEmpty(array|string|null $value): bool { + if (is_null($value) || empty($value)) { + return true; + } $values = []; if (is_array($value)) { if (! isset($value['minDate']) || ! isset($value['maxDate'])) { diff --git a/tests/Unit/Views/Filters/DateRangeFilterTest.php b/tests/Unit/Views/Filters/DateRangeFilterTest.php index a6dccecac..c7c0b7e62 100644 --- a/tests/Unit/Views/Filters/DateRangeFilterTest.php +++ b/tests/Unit/Views/Filters/DateRangeFilterTest.php @@ -435,4 +435,27 @@ public function test_check_if_can_get_locale(): void $this->assertSame('de', self::$filterInstance->getPillsLocale()); $this->assertTrue(self::$filterInstance->hasPillsLocale()); } + + public function test_can_check_validation_rejects_invalid_values_array(): void + { + $missingStartDate = self::$filterInstance->validate([null, '2020-01-01']); + $missingEndDate = self::$filterInstance->validate(['2020-01-01', null]); + $missingBoth = self::$filterInstance->validate([null, null]); + + $this->assertFalse($missingStartDate); + $this->assertFalse($missingEndDate); + $this->assertFalse($missingBoth); + $this->assertTrue(self::$filterInstance->isEmpty($missingStartDate)); + $this->assertTrue(self::$filterInstance->isEmpty($missingEndDate)); + $this->assertTrue(self::$filterInstance->isEmpty($missingBoth)); + } + + public function test_can_check_validation_rejects_broken_values_array(): void + { + $this->assertFalse(self::$filterInstance->validate(['minDate' => 'asdf', 'maxDate' => '2020-02-02'])); + $this->assertFalse(self::$filterInstance->validate(['minDate' => '4121-31-31', 'maxDate' => '2020-02-02'])); + $this->assertFalse(self::$filterInstance->validate(['minDate' => '2020-02-02', 'maxDate' => 'asdf'])); + $this->assertFalse(self::$filterInstance->validate(['minDate' => '2020-02-02', 'maxDate' => '4121-31-31'])); + + } }