From 3770e0f14aee153340e973d13745dab7712501be Mon Sep 17 00:00:00 2001 From: Jack Sleight Date: Tue, 14 Jan 2025 14:00:14 +0000 Subject: [PATCH 1/3] Add empty/not empty filters for replicator and grid --- src/Query/Scopes/Filters/Fields/Grid.php | 55 ++++++++++++++++++- .../Scopes/Filters/Fields/Replicator.php | 55 ++++++++++++++++++- 2 files changed, 106 insertions(+), 4 deletions(-) diff --git a/src/Query/Scopes/Filters/Fields/Grid.php b/src/Query/Scopes/Filters/Fields/Grid.php index ed710847ee..7a0d4f755a 100644 --- a/src/Query/Scopes/Filters/Fields/Grid.php +++ b/src/Query/Scopes/Filters/Fields/Grid.php @@ -2,7 +2,58 @@ namespace Statamic\Query\Scopes\Filters\Fields; -class Grid extends Textarea +use Statamic\Support\Str; +use Statamic\Support\Arr; + +class Grid extends FieldtypeFilter { - // + public function fieldItems() + { + return [ + 'operator' => [ + 'type' => 'select', + 'placeholder' => __('Select Operator'), + 'options' => [ + 'like' => __('Contains'), + 'null' => __('Empty'), + 'not-null' => __('Not empty'), + ], + 'default' => 'like', + ], + 'value' => [ + 'type' => 'text', + 'if' => [ + 'operator' => 'like', + ], + 'required' => false, + ], + ]; + } + + public function apply($query, $handle, $values) + { + $operator = $values['operator']; + $value = $values['value']; + + if ($operator === 'like') { + $value = Str::ensureLeft($value, '%'); + $value = Str::ensureRight($value, '%'); + } + + match ($operator) { + 'null' => $query->whereNull($handle), + 'not-null' => $query->whereNotNull($handle), + default => $query->where($handle, $operator, $value), + }; + } + + public function badge($values) + { + $field = $this->fieldtype->field()->display(); + $operator = $values['operator']; + $translatedOperator = Arr::get($this->fieldItems(), "operator.options.{$operator}"); + $value = $values['value']; + + return $field.' '.strtolower($translatedOperator).' '.$value; + } } diff --git a/src/Query/Scopes/Filters/Fields/Replicator.php b/src/Query/Scopes/Filters/Fields/Replicator.php index 4d0ee67dc8..c8bc6de98b 100644 --- a/src/Query/Scopes/Filters/Fields/Replicator.php +++ b/src/Query/Scopes/Filters/Fields/Replicator.php @@ -2,7 +2,58 @@ namespace Statamic\Query\Scopes\Filters\Fields; -class Replicator extends Textarea +use Statamic\Support\Str; +use Statamic\Support\Arr; + +class Replicator extends FieldtypeFilter { - // + public function fieldItems() + { + return [ + 'operator' => [ + 'type' => 'select', + 'placeholder' => __('Select Operator'), + 'options' => [ + 'like' => __('Contains'), + 'null' => __('Empty'), + 'not-null' => __('Not empty'), + ], + 'default' => 'like', + ], + 'value' => [ + 'type' => 'text', + 'if' => [ + 'operator' => 'like', + ], + 'required' => false, + ], + ]; + } + + public function apply($query, $handle, $values) + { + $operator = $values['operator']; + $value = $values['value']; + + if ($operator === 'like') { + $value = Str::ensureLeft($value, '%'); + $value = Str::ensureRight($value, '%'); + } + + match ($operator) { + 'null' => $query->whereNull($handle), + 'not-null' => $query->whereNotNull($handle), + default => $query->where($handle, $operator, $value), + }; + } + + public function badge($values) + { + $field = $this->fieldtype->field()->display(); + $operator = $values['operator']; + $translatedOperator = Arr::get($this->fieldItems(), "operator.options.{$operator}"); + $value = $values['value']; + + return $field.' '.strtolower($translatedOperator).' '.$value; + } } From c4ed00fde11f8e7cbcac0925eac2be98814eb452 Mon Sep 17 00:00:00 2001 From: Jack Sleight Date: Tue, 14 Jan 2025 14:37:17 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=8D=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Query/Scopes/Filters/Fields/Grid.php | 2 +- src/Query/Scopes/Filters/Fields/Replicator.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Query/Scopes/Filters/Fields/Grid.php b/src/Query/Scopes/Filters/Fields/Grid.php index 7a0d4f755a..6446ba9fe9 100644 --- a/src/Query/Scopes/Filters/Fields/Grid.php +++ b/src/Query/Scopes/Filters/Fields/Grid.php @@ -2,8 +2,8 @@ namespace Statamic\Query\Scopes\Filters\Fields; -use Statamic\Support\Str; use Statamic\Support\Arr; +use Statamic\Support\Str; class Grid extends FieldtypeFilter { diff --git a/src/Query/Scopes/Filters/Fields/Replicator.php b/src/Query/Scopes/Filters/Fields/Replicator.php index c8bc6de98b..1614b5f1ef 100644 --- a/src/Query/Scopes/Filters/Fields/Replicator.php +++ b/src/Query/Scopes/Filters/Fields/Replicator.php @@ -2,8 +2,8 @@ namespace Statamic\Query\Scopes\Filters\Fields; -use Statamic\Support\Str; use Statamic\Support\Arr; +use Statamic\Support\Str; class Replicator extends FieldtypeFilter { From 7a94c2e36100b5d1e18deb64bc489fb1f3d11b82 Mon Sep 17 00:00:00 2001 From: Jack Sleight Date: Wed, 15 Jan 2025 10:24:12 +0000 Subject: [PATCH 3/3] Why not bard? --- src/Query/Scopes/Filters/Fields/Bard.php | 55 +++++++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/Query/Scopes/Filters/Fields/Bard.php b/src/Query/Scopes/Filters/Fields/Bard.php index 18e7f23530..5af40ca404 100644 --- a/src/Query/Scopes/Filters/Fields/Bard.php +++ b/src/Query/Scopes/Filters/Fields/Bard.php @@ -2,7 +2,58 @@ namespace Statamic\Query\Scopes\Filters\Fields; -class Bard extends Textarea +use Statamic\Support\Arr; +use Statamic\Support\Str; + +class Bard extends FieldtypeFilter { - // + public function fieldItems() + { + return [ + 'operator' => [ + 'type' => 'select', + 'placeholder' => __('Select Operator'), + 'options' => [ + 'like' => __('Contains'), + 'null' => __('Empty'), + 'not-null' => __('Not empty'), + ], + 'default' => 'like', + ], + 'value' => [ + 'type' => 'text', + 'if' => [ + 'operator' => 'like', + ], + 'required' => false, + ], + ]; + } + + public function apply($query, $handle, $values) + { + $operator = $values['operator']; + $value = $values['value']; + + if ($operator === 'like') { + $value = Str::ensureLeft($value, '%'); + $value = Str::ensureRight($value, '%'); + } + + match ($operator) { + 'null' => $query->whereNull($handle), + 'not-null' => $query->whereNotNull($handle), + default => $query->where($handle, $operator, $value), + }; + } + + public function badge($values) + { + $field = $this->fieldtype->field()->display(); + $operator = $values['operator']; + $translatedOperator = Arr::get($this->fieldItems(), "operator.options.{$operator}"); + $value = $values['value']; + + return $field.' '.strtolower($translatedOperator).' '.$value; + } }