Skip to content

Commit

Permalink
Merge pull request #20 from webbingbrasil/default-clause
Browse files Browse the repository at this point in the history
Default clause
  • Loading branch information
dmandrade authored Mar 29, 2023
2 parents a607242 + 3eff87b commit 80169e5
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 25 deletions.
53 changes: 53 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,59 @@ This filter allows users to search records in the following conditions:
- Contains/not contains user's input
- Is set/not set

## Set Default Clause

You can set a default clause condition for any filter, for example:

```php
use Webbingbrasil\FilamentAdvancedFilter\Filters\TextFilter;
use Webbingbrasil\FilamentAdvancedFilter\Filters\BooleanFilter;

FilamentAdvancedFilter\Filters\TextFilter::make('brand')
->relationship('brand', 'name')
->default(FilamentAdvancedFilter\Filters\TextFilter::CLAUSE_CONTAIN);

FilamentAdvancedFilter\Filters\BooleanFilter::make('is_visible')
->default(FilamentAdvancedFilter\Filters\BooleanFilter::CLAUSE_IS_FALSE);
```

## Enable Clause Label

By default the clause label is disabled, you can enable it by calling the `enableClauseLabel` method:

```php
use Webbingbrasil\FilamentAdvancedFilter\Filters\TextFilter;

FilamentAdvancedFilter\Filters\TextFilter::make('brand')
->enableClauseLabel()
```

## Fields Wrapper

You can change the wrapper for the filter fields, for example to use a Group component instead of Fieldset:

```php
use Webbingbrasil\FilamentAdvancedFilter\Filters\TextFilter;

FilamentAdvancedFilter\Filters\TextFilter::make('brand')
->enableClauseLabel()
->wrapperUsing(fn () => Forms\Components\Group::make())
```

## Field Debounce

You can set a custom debounce time for the filter fields, for example to wait 700ms before applying the filter:

```php
use Webbingbrasil\FilamentAdvancedFilter\Filters\TextFilter;

FilamentAdvancedFilter\Filters\TextFilter::make('brand')
->debounce(700)
```

By default the debounce time is 500ms.


## Credits

- [Danilo Andrade](https://github.com/dmandrade)
Expand Down
61 changes: 44 additions & 17 deletions src/Concerns/HasClauses.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@ trait HasClauses

protected string | Closure | null $attribute = null;

protected string | Closure | null $wrapperUsing = null;
protected string | Closure | null $wrapperFormUsing = null;

protected bool $disableClauseLabel = true;
protected bool | Closure $enableClauseLabel = false;

protected int $debounce = 500;

/** @deprecated use `->attribute()` on the filter instead */
public function column(string | Closure | null $name): static
Expand All @@ -32,20 +34,30 @@ public function attribute(string | Closure | null $name): static
return $this;
}

public function debounce(int $debounce): static
{
$this->debounce = $debounce;

return $this;
}

/** @deprecated use `->getAttribute()` instead */
public function getColumn(): string
{
return $this->getAttribute();
}


public function getAttribute(): string
{
return $this->evaluate($this->attribute) ?? $this->getName();
}

public function apply(Builder $query, array $data = []): Builder
{
if ($this->isHidden()) {
return $query;
}

if ($this->hasQueryModificationCallback()) {
return parent::apply($query, $data);
}
Expand All @@ -68,42 +80,57 @@ public function apply(Builder $query, array $data = []): Builder

public function getFormSchema(): array
{
$fields = $this->fields();
$clause = Select::make('clause')
->label($this->getLabel())
->options($this->clauses());

if ($this->disableClauseLabel) {
if ($this->isClauseLabelDisabled()) {
$clause->disableLabel();
}

return $this->evaluate($this->formSchema) ?? [
$this->getWrapperComponent()
->schema(array_merge([$clause], $this->fields()))
];
if (filled($defaultState = $this->getDefaultState())) {
$clause->default($defaultState);
}

return $this->evaluate($this->formSchema, [
'clauseField' => $clause,
'fields' => $fields
]) ?? [
$this->getWrapper()
->schema(array_merge([$clause], $fields))
];
}

public function enableClauseLabel(): static
public function enableClauseLabel(bool | Closure $condition = true): static
{
$this->disableClauseLabel = false;
$this->enableClauseLabel = $condition;

return $this;
}

public function isClauseLabelDisabled(): bool
{
return ! $this->evaluate($this->enableClauseLabel);
}

public function wrapperUsing(?Closure $callback): static
{
$this->wrapperUsing = $callback;
$this->wrapperFormUsing = $callback;

return $this;
}

public function getWrapper(): ?Component
public function getWrapper(): Component
{
return $this->evaluate($this->wrapperUsing);
}
$wrapperComponent = $this->evaluate($this->wrapperFormUsing);

protected function getWrapperComponent()
{
return $this->getWrapper() ?? Fieldset::make($this->getLabel())->columns(1);
if ($wrapperComponent instanceof Component)
{
return $wrapperComponent;
}

return Fieldset::make($this->getLabel())->columns(1);
}

public function fields(): array
Expand Down
4 changes: 2 additions & 2 deletions src/Filters/BooleanFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

namespace Webbingbrasil\FilamentAdvancedFilter\Filters;

use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
use Webbingbrasil\FilamentAdvancedFilter\Concerns\HasClauses;

class BooleanFilter extends Filter
class BooleanFilter extends BaseFilter
{
use HasClauses;

Expand Down
5 changes: 3 additions & 2 deletions src/Filters/DateFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
namespace Webbingbrasil\FilamentAdvancedFilter\Filters;

use Carbon\Carbon;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Select;
use Webbingbrasil\FilamentAdvancedFilter\Concerns\HasClauses;

class DateFilter extends Filter
class DateFilter extends BaseFilter
{
use HasClauses;

Expand Down Expand Up @@ -149,6 +149,7 @@ public function fields(): array
->when(fn ($get) => $get('clause') == static::CLAUSE_BETWEEN),
TextInput::make('period_value')
->type('number')
->debounce($this->debounce)
->minValue(0)
->disableLabel()
->placeholder('0')
Expand Down
7 changes: 5 additions & 2 deletions src/Filters/NumberFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

namespace Webbingbrasil\FilamentAdvancedFilter\Filters;

use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
use Filament\Forms\Components\TextInput;
use Webbingbrasil\FilamentAdvancedFilter\Concerns\HasClauses;

class NumberFilter extends Filter
class NumberFilter extends BaseFilter
{
use HasClauses;

Expand Down Expand Up @@ -99,6 +99,7 @@ public function fields(): array
return [
TextInput::make('value')
->type('number')
->debounce($this->debounce)
->disableLabel()
->placeholder('0')
->when(fn ($get) => !in_array($get('clause'), [
Expand All @@ -110,10 +111,12 @@ public function fields(): array
TextInput::make('from')
->label(__('filament-advancedfilter::clauses.from'))
->type('number')
->debounce($this->debounce)
->when(fn ($get) => $get('clause') == static::CLAUSE_BETWEEN),
TextInput::make('until')
->label(__('filament-advancedfilter::clauses.until'))
->type('number')
->debounce($this->debounce)
->when(fn ($get) => $get('clause') == static::CLAUSE_BETWEEN),
];
}
Expand Down
5 changes: 3 additions & 2 deletions src/Filters/TextFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

namespace Webbingbrasil\FilamentAdvancedFilter\Filters;

use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;
use Filament\Forms\Components\TextInput;
use Webbingbrasil\FilamentAdvancedFilter\Concerns\HasClauses;

class TextFilter extends Filter
class TextFilter extends BaseFilter
{
use HasClauses;

Expand Down Expand Up @@ -83,6 +83,7 @@ public function fields(): array
{
return [
TextInput::make('value')
->debounce($this->debounce)
->hidden(fn ($get) => in_array(
$get('clause'),
[self::CLAUSE_NOT_SET, self::CLAUSE_SET]
Expand Down

0 comments on commit 80169e5

Please sign in to comment.