Skip to content

Commit cb9849b

Browse files
authored
Default filters with tests (#2076)
* Default filters with tests * PHPStan Error Handling; non ?? check on filled() for $columnsByField; Using data_get for filter key instead of direct access
1 parent efe9bee commit cb9849b

4 files changed

Lines changed: 794 additions & 0 deletions

File tree

src/Components/Filters/FilterBase.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class FilterBase implements Wireable
2121

2222
public array $filterRelation = [];
2323

24+
public mixed $defaultValue = null;
25+
2426
public function __construct(
2527
public string $column,
2628
public ?string $field = null,
@@ -70,6 +72,13 @@ public function baseClass(string $attrClass): self
7072
return $this;
7173
}
7274

75+
public function default(mixed $value): self
76+
{
77+
$this->defaultValue = $value;
78+
79+
return $this;
80+
}
81+
7382
public function toLivewire(): array
7483
{
7584
return (array) $this;

src/Concerns/Filter.php

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Illuminate\Support\{Arr, Carbon, Collection, Str};
99
use Livewire\Attributes\On;
1010
use PowerComponents\LivewirePowerGrid\Column;
11+
use PowerComponents\LivewirePowerGrid\Components\Filters\FilterBase;
1112

1213
trait Filter
1314
{
@@ -28,6 +29,95 @@ public function emitClearFiltersEvent(bool $emit): void
2829
$this->emitClearFiltersEvent = $emit;
2930
}
3031

32+
protected function applyDefaultFilters(): void
33+
{
34+
$columnsByField = collect($this->columns)
35+
->mapWithKeys(fn (Column $column) => [
36+
filled($column->field) ? $column->field : $column->dataField => $column,
37+
]);
38+
39+
collect($this->filters())
40+
->filter(fn ($filter) => filled($filter->defaultValue))
41+
->each(function (FilterBase $filter) use (&$defaultFiltersApplied, $columnsByField) {
42+
$field = $filter->field;
43+
$column = $filter->column;
44+
45+
/** @var string $key */
46+
$key = data_get($filter, 'key');
47+
$defaultValue = $filter->defaultValue;
48+
49+
$columnData = $columnsByField->get($column);
50+
$label = data_get($columnData, 'title', $field);
51+
52+
switch ($key) {
53+
case 'select':
54+
data_set($this->filters, "select.{$field}", $defaultValue);
55+
$this->addEnabledFilters($field, $label);
56+
$defaultFiltersApplied = true;
57+
break;
58+
59+
case 'multi_select':
60+
$values = is_array($defaultValue) ? $defaultValue : [$defaultValue];
61+
data_set($this->filters, "multi_select.{$field}", $values);
62+
$this->addEnabledFilters($field, $label);
63+
$defaultFiltersApplied = true;
64+
break;
65+
66+
case 'boolean':
67+
data_set($this->filters, "boolean.{$field}", $defaultValue);
68+
$this->addEnabledFilters($field, $label);
69+
$defaultFiltersApplied = true;
70+
break;
71+
72+
case 'input_text':
73+
if (is_array($defaultValue)) {
74+
// Support for both value and operator
75+
data_set($this->filters, "input_text.{$field}", $defaultValue['value'] ?? '');
76+
if (isset($defaultValue['operator'])) {
77+
data_set($this->filters, "input_text_options.{$field}", $defaultValue['operator']);
78+
}
79+
} else {
80+
data_set($this->filters, "input_text.{$field}", $defaultValue);
81+
}
82+
$this->addEnabledFilters($field, $label);
83+
$defaultFiltersApplied = true;
84+
break;
85+
86+
case 'number':
87+
if (is_array($defaultValue)) {
88+
if (isset($defaultValue['start'])) {
89+
data_set($this->filters, "number.{$field}.start", $defaultValue['start']);
90+
}
91+
if (isset($defaultValue['end'])) {
92+
data_set($this->filters, "number.{$field}.end", $defaultValue['end']);
93+
}
94+
} else {
95+
data_set($this->filters, "number.{$field}.start", $defaultValue);
96+
}
97+
$this->addEnabledFilters($field, $label);
98+
$defaultFiltersApplied = true;
99+
break;
100+
101+
case 'date':
102+
case 'datetime':
103+
if (is_array($defaultValue) && isset($defaultValue['start']) && isset($defaultValue['end'])) {
104+
$this->filters[$key][$field] = [
105+
'start' => $defaultValue['start'],
106+
'end' => $defaultValue['end'],
107+
'formatted' => $defaultValue['formatted'] ?? '',
108+
];
109+
$this->addEnabledFilters($field, $label);
110+
$defaultFiltersApplied = true;
111+
}
112+
break;
113+
}
114+
});
115+
116+
if ($defaultFiltersApplied) {
117+
$this->persistState('filters');
118+
}
119+
}
120+
31121
/**
32122
* @throws Exception
33123
*/

src/PowerGridComponent.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ public function mount(): void
6464

6565
$this->restoreState();
6666

67+
$this->applyDefaultFilters();
68+
6769
$this->resolveSummarizeColumn();
6870
}
6971

0 commit comments

Comments
 (0)