Skip to content

Commit 638b54d

Browse files
joshuablumclaudejasonvarga
authored
[6.x] Fix field filters returning all results when filtering by 0 (#14747)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Jason Varga <jason@pixelfear.com>
1 parent 0ce3195 commit 638b54d

6 files changed

Lines changed: 67 additions & 7 deletions

File tree

src/Query/Scopes/Filters/Fields/Date.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public function badge($values)
8181

8282
public function isComplete($values): bool
8383
{
84-
$values = array_filter($values);
84+
$values = Arr::removeNullValues($values);
8585

8686
if (! $operator = Arr::get($values, 'operator')) {
8787
return false;

src/Query/Scopes/Filters/Fields/Dimensions.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Statamic\Query\Scopes\Filters\Fields;
44

5-
use Illuminate\Support\Arr;
5+
use Statamic\Support\Arr;
66

77
use function Statamic\trans as __;
88

@@ -78,7 +78,7 @@ public function badge($values)
7878

7979
public function isComplete($values): bool
8080
{
81-
$values = array_filter($values);
81+
$values = Arr::removeNullValues($values);
8282

8383
return Arr::hasAll($values, ['dimension', 'operator', 'value']);
8484
}

src/Query/Scopes/Filters/Fields/FieldtypeFilter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public function badge($values)
8484

8585
public function isComplete($values): bool
8686
{
87-
$values = array_filter($values);
87+
$values = Arr::removeNullValues($values);
8888

8989
if (! $operator = Arr::get($values, 'operator')) {
9090
return false;

src/Query/Scopes/Filters/Fields/Terms.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function badge($values)
7070

7171
public function isComplete($values): bool
7272
{
73-
$values = array_filter($values);
73+
$values = Arr::removeNullValues($values);
7474

7575
if (! $operator = Arr::get($values, 'operator')) {
7676
return false;

src/Query/Scopes/Filters/Fields/Toggle.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Statamic\Query\Scopes\Filters\Fields;
44

5-
use Illuminate\Support\Arr;
5+
use Statamic\Support\Arr;
66

77
use function Statamic\trans as __;
88

@@ -40,7 +40,7 @@ public function badge($values)
4040

4141
public function isComplete($values): bool
4242
{
43-
$values = array_filter($values);
43+
$values = Arr::removeNullValues($values);
4444

4545
return Arr::has($values, 'value');
4646
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace Tests\Query;
4+
5+
use PHPUnit\Framework\Attributes\DataProvider;
6+
use PHPUnit\Framework\Attributes\Test;
7+
use Statamic\Fields\Field;
8+
use Statamic\Fieldtypes\Integer as IntegerFieldtype;
9+
use Statamic\Fieldtypes\Text;
10+
use Statamic\Query\Scopes\Filters\Fields\Dimensions;
11+
use Tests\TestCase;
12+
13+
class FieldtypeFilterTest extends TestCase
14+
{
15+
#[Test]
16+
#[DataProvider('completenessProvider')]
17+
public function it_determines_if_a_filter_is_complete($values, $expected)
18+
{
19+
$filter = (new Text)->setField(new Field('test', ['type' => 'text']))->filter();
20+
21+
$this->assertEquals($expected, $filter->isComplete($values));
22+
}
23+
24+
public static function completenessProvider()
25+
{
26+
return [
27+
'no operator' => [['value' => 'foo'], false],
28+
'operator but no value' => [['operator' => '='], false],
29+
'operator and value' => [['operator' => '=', 'value' => 'foo'], true],
30+
'zero string value' => [['operator' => '=', 'value' => '0'], true],
31+
'zero integer value' => [['operator' => '=', 'value' => 0], true],
32+
'null value' => [['operator' => '=', 'value' => null], false],
33+
'empty string value' => [['operator' => '=', 'value' => ''], false],
34+
'null operator without value' => [['operator' => 'null'], true],
35+
'not-null operator without value' => [['operator' => 'not-null'], true],
36+
];
37+
}
38+
39+
#[Test]
40+
#[DataProvider('dimensionsCompletenessProvider')]
41+
public function it_determines_if_a_dimensions_filter_is_complete($values, $expected)
42+
{
43+
$fieldtype = (new IntegerFieldtype)->setField(new Field('test', ['type' => 'integer']));
44+
$filter = new Dimensions($fieldtype);
45+
46+
$this->assertEquals($expected, $filter->isComplete($values));
47+
}
48+
49+
public static function dimensionsCompletenessProvider()
50+
{
51+
return [
52+
'all fields present' => [['dimension' => 'width', 'operator' => '=', 'value' => '100'], true],
53+
'zero value' => [['dimension' => 'width', 'operator' => '=', 'value' => 0], true],
54+
'zero string value' => [['dimension' => 'width', 'operator' => '=', 'value' => '0'], true],
55+
'null value' => [['dimension' => 'width', 'operator' => '=', 'value' => null], false],
56+
'missing value' => [['dimension' => 'width', 'operator' => '='], false],
57+
'missing dimension' => [['operator' => '=', 'value' => '100'], false],
58+
];
59+
}
60+
}

0 commit comments

Comments
 (0)