From e803777403150e852b57ef549c754c366a1c2427 Mon Sep 17 00:00:00 2001 From: Arne Becker Date: Thu, 1 Aug 2024 10:38:27 +0200 Subject: [PATCH 1/2] add not equal, greater than equal and less than equal conditions --- .../lang/en/filament-value-range-filter.php | 10 ++ src/Filters/ValueRangeFilter.php | 99 +++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/resources/lang/en/filament-value-range-filter.php b/resources/lang/en/filament-value-range-filter.php index 59f26ee..d8c37d0 100644 --- a/resources/lang/en/filament-value-range-filter.php +++ b/resources/lang/en/filament-value-range-filter.php @@ -3,8 +3,18 @@ return [ 'range.options.equal' => 'is equal to', + 'range.options.not_equal' => 'is not equal to', 'range.options.between' => 'is between', 'range.options.greater_than' => 'is greater than', + 'range.options.greater_than_eqal' => 'is greater than or equal to', 'range.options.less_than' => 'is less than', + 'range.options.less_than_equal' => 'is less than or equal to', + 'range.indicator.equal' => ':label is equal to :value', + 'range.indicator.not_equal' => ':label is not equal to :value', + 'range.indicator.between' => ':label is between :formValue and :toValue', + 'range.indicator.greater_than' => ':label is greater than :value', + 'range.indicator.greater_than_eqal' => ':label is greater than or equal to :value', + 'range.indicator.less_than' => ':label is less than :value', + 'range.indicator.less_than_equal' => ':label is less than or equal to :value', ]; diff --git a/src/Filters/ValueRangeFilter.php b/src/Filters/ValueRangeFilter.php index 9c4a52c..cd2c5f3 100644 --- a/src/Filters/ValueRangeFilter.php +++ b/src/Filters/ValueRangeFilter.php @@ -20,10 +20,16 @@ class ValueRangeFilter extends Filter protected ?string $indicatorEqualLabel = null; + protected ?string $indicatorNotEqualLabel = null; + protected ?string $indicatorGreaterThanLabel = null; + protected ?string $indicatorGreaterThanEqualLabel = null; + protected ?string $indicatorLessThanLabel = null; + protected ?string $indicatorLessThanEqualLabel = null; + protected string|Closure $locale = 'en'; protected function setUp(): void @@ -40,22 +46,33 @@ protected function setUp(): void ->live() ->options([ 'equal' => __('filament-value-range-filter::filament-value-range-filter.range.options.equal'), + 'not_equal' => __('filament-value-range-filter::filament-value-range-filter.range.options.not_equal'), 'between' => __('filament-value-range-filter::filament-value-range-filter.range.options.between'), 'greater_than' => __('filament-value-range-filter::filament-value-range-filter.range.options.greater_than'), + 'greater_than_equal' => __('filament-value-range-filter::filament-value-range-filter.range.options.greater_than_equal'), 'less_than' => __('filament-value-range-filter::filament-value-range-filter.range.options.less_than'), + 'less_than_equal' => __('filament-value-range-filter::filament-value-range-filter.range.options.less_than_equal'), ]) ->afterStateUpdated(function (Set $set) { $set('range_equal', null); + $set('range_not_equal', null); $set('range_between_from', null); $set('range_between_to', null); $set('range_greater_than', null); + $set('range_greater_than_equal', null); $set('range_less_than', null); + $set('range_less_than_equal', null); }), Forms\Components\TextInput::make('range_equal') ->hiddenLabel() ->numeric() ->placeholder(fn (): string => $this->getFormattedValue(0)) ->visible(fn (Get $get): bool => $get('range_condition') === 'equal' || empty($get('range_condition'))), + Forms\Components\TextInput::make('range_not_equal') + ->hiddenLabel() + ->numeric() + ->placeholder(fn (): string => $this->getFormattedValue(0)) + ->visible(fn (Get $get): bool => $get('range_condition') === 'not_equal'), Forms\Components\Grid::make([ 'default' => 1, 'sm' => 2, @@ -76,11 +93,21 @@ protected function setUp(): void ->numeric() ->placeholder(fn (): string => $this->getFormattedValue(0)) ->visible(fn (Get $get): bool => $get('range_condition') === 'greater_than'), + Forms\Components\TextInput::make('range_greater_than_equal') + ->hiddenLabel() + ->numeric() + ->placeholder(fn (): string => $this->getFormattedValue(0)) + ->visible(fn (Get $get): bool => $get('range_condition') === 'greater_than_equal'), Forms\Components\TextInput::make('range_less_than') ->hiddenLabel() ->numeric() ->placeholder(fn (): string => $this->getFormattedValue(0)) ->visible(fn (Get $get): bool => $get('range_condition') === 'less_than'), + Forms\Components\TextInput::make('range_less_than_equal') + ->hiddenLabel() + ->numeric() + ->placeholder(fn (): string => $this->getFormattedValue(0)) + ->visible(fn (Get $get): bool => $get('range_condition') === 'less_than_equal'), ]) ->columns(1), ]) @@ -90,6 +117,10 @@ protected function setUp(): void $data['range_equal'], fn (Builder $query, $value): Builder => $query->where($this->getName(), '=', $this->getValue($value)), ) + ->when( + $data['range_not_equal'], + fn (Builder $query, $value): Builder => $query->where($this->getName(), '!=', $this->getValue($value)), + ) ->when( $data['range_between_from'] && $data['range_between_to'], function (Builder $query, $value) use ($data) { @@ -100,9 +131,17 @@ function (Builder $query, $value) use ($data) { $data['range_greater_than'], fn (Builder $query, $value): Builder => $query->where($this->getName(), '>', $this->getValue($value)), ) + ->when( + $data['range_greater_than_equal'], + fn (Builder $query, $value): Builder => $query->where($this->getName(), '>=', $this->getValue($value)), + ) ->when( $data['range_less_than'], fn (Builder $query, $value): Builder => $query->where($this->getName(), '<', $this->getValue($value)), + ) + ->when( + $data['range_less_than_equal'], + fn (Builder $query, $value): Builder => $query->where($this->getName(), '<=', $this->getValue($value)), ); }) ->indicateUsing(function (array $data): array { @@ -119,16 +158,40 @@ function (Builder $query, $value) use ($data) { ->removeField('range_equal'); } + if ($data['range_not_equal']) { + $indicators[] = Indicator::make(__('filament-value-range-filter::filament-value-range-filter.range.indicator.not_equal', [ + 'label' => $this->getIndicatorEqualLabel() ?? $this->getLabel(), + 'value' => $this->getFormattedValue($data['range_not_equal']) + ])) + ->removeField('range_not_equal'); + } + if ($data['range_greater_than']) { $indicators[] = Indicator::make($this->getIndicatorGreaterThanLabel() ?? $this->getLabel().' is greater than '.$this->getFormattedValue($data['range_greater_than'])) ->removeField('range_greater_than'); } + if ($data['range_greater_than_equal']) { + $indicators[] = Indicator::make(__('filament-value-range-filter::filament-value-range-filter.range.indicator.greater_than_equal', [ + 'label' => $this->getIndicatorGreaterThanEqualLabel() ?? $this->getLabel(), + 'value' => $this->getFormattedValue($data['range_greater_than_equal']) + ])) + ->removeField('range_greater_than_equal'); + } + if ($data['range_less_than']) { $indicators[] = Indicator::make($this->getIndicatorLessThanLabel() ?? $this->getLabel().' is less than '.$this->getFormattedValue($data['range_less_than'])) ->removeField('range_less_than'); } + if ($data['range_less_than_equal']) { + $indicators[] = Indicator::make(__('filament-value-range-filter::filament-value-range-filter.range.indicator.less_than_equal', [ + 'label' => $this->getIndicatorLessThanEqualLabel() ?? $this->getLabel(), + 'value' => $this->getFormattedValue($data['range_less_than_equal']) + ])) + ->removeField('range_less_than_equal'); + } + return $indicators; }); } @@ -175,6 +238,18 @@ public function getIndicatorEqualLabel(): ?string return $this->evaluate($this->indicatorEqualLabel); } + public function indicatorNotEqualLabel(?string $label): static + { + $this->indicatorNotEqualLabel = $label; + + return $this; + } + + public function getIndicatorNotEqualLabel(): ?string + { + return $this->evaluate($this->indicatorNotEqualLabel); + } + public function indicatorGreaterThanLabel(?string $label): static { $this->indicatorGreaterThanLabel = $label; @@ -187,6 +262,18 @@ public function getIndicatorGreaterThanLabel(): ?string return $this->evaluate($this->indicatorGreaterThanLabel); } + public function indicatorGreaterThanEqualLabel(?string $label): static + { + $this->indicatorGreaterThanEqualLabel = $label; + + return $this; + } + + public function getIndicatorGreaterThanEqualLabel(): ?string + { + return $this->evaluate($this->indicatorGreaterThanEqualLabel); + } + public function indicatorLessThanLabel(?string $label): static { $this->indicatorLessThanLabel = $label; @@ -199,6 +286,18 @@ public function getIndicatorLessThanLabel(): ?string return $this->evaluate($this->indicatorLessThanLabel); } + public function indicatorLessThanEqualLabel(?string $label): static + { + $this->indicatorLessThanEqualLabel = $label; + + return $this; + } + + public function getIndicatorLessThanEqualLabel(): ?string + { + return $this->evaluate($this->indicatorLessThanEqualLabel); + } + public function locale(string|Closure $locale = 'en'): static { $this->locale = $locale; From b5c0805c2da7576ec431a3327db30064044a3296 Mon Sep 17 00:00:00 2001 From: Arne Becker Date: Mon, 5 Aug 2024 10:26:34 +0200 Subject: [PATCH 2/2] fix typo in translation string --- resources/lang/en/filament-value-range-filter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/en/filament-value-range-filter.php b/resources/lang/en/filament-value-range-filter.php index d8c37d0..3c16fae 100644 --- a/resources/lang/en/filament-value-range-filter.php +++ b/resources/lang/en/filament-value-range-filter.php @@ -11,7 +11,7 @@ 'range.options.less_than_equal' => 'is less than or equal to', 'range.indicator.equal' => ':label is equal to :value', 'range.indicator.not_equal' => ':label is not equal to :value', - 'range.indicator.between' => ':label is between :formValue and :toValue', + 'range.indicator.between' => ':label is between :fromValue and :toValue', 'range.indicator.greater_than' => ':label is greater than :value', 'range.indicator.greater_than_eqal' => ':label is greater than or equal to :value', 'range.indicator.less_than' => ':label is less than :value',