Skip to content

Commit 15a8639

Browse files
authored
Initial Commits
1 parent e58bfba commit 15a8639

29 files changed

+1086
-203
lines changed

src/Traits/Configuration/FilterConfiguration.php

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters\Configuration;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Livewire\Attributes\On;
7+
use Rappasoft\LaravelLivewireTables\Events\FilterApplied;
8+
use Rappasoft\LaravelLivewireTables\Views\Filter;
9+
use Rappasoft\LaravelLivewireTables\Views\Filters\{MultiSelectDropdownFilter, MultiSelectFilter};
10+
11+
trait FilterConfiguration {
12+
13+
14+
#[On('setFilter')]
15+
#[On('set-filter')]
16+
public function setFilter(string $filterKey, string|array|null $value): void
17+
{
18+
$this->appliedFilters[$filterKey] = $this->filterComponents[$filterKey] = $value;
19+
20+
$this->callHook('filterSet', ['filter' => $filterKey, 'value' => $value]);
21+
$this->callTraitHook('filterSet', ['filter' => $filterKey, 'value' => $value]);
22+
if ($this->getEventStatusFilterApplied() && $filterKey != null && $value != null) {
23+
event(new FilterApplied($this->getTableName(), $filterKey, $value));
24+
}
25+
$this->dispatch('filter-was-set', tableName: $this->getTableName(), filterKey: $filterKey, value: $value);
26+
$this->storeFilterValues();
27+
28+
}
29+
30+
#[On('clearFilters')]
31+
#[On('clear-filters')]
32+
public function setFilterDefaults(): void
33+
{
34+
foreach ($this->getFilters() as $filter) {
35+
if ($filter->isResetByClearButton()) {
36+
$this->resetFilter($filter);
37+
}
38+
}
39+
40+
}
41+
/**
42+
* @param mixed $filter
43+
*/
44+
public function resetFilter($filter): void
45+
{
46+
if (! $filter instanceof Filter) {
47+
$filter = $this->getFilterByKey($filter);
48+
}
49+
$this->callHook('filterReset', ['filter' => $filter->getKey()]);
50+
$this->callTraitHook('filterReset', ['filter' => $filter->getKey()]);
51+
$this->setFilter($filter->getKey(), $filter->getDefaultValue());
52+
53+
}
54+
55+
#[On('livewireArrayFilterUpdateValues')]
56+
public function updateLivewireArrayFilterValues(string $filterKey, string $tableName, array $values): void
57+
{
58+
if ($this->tableName == $tableName) {
59+
$filter = $this->getFilterByKey($filterKey);
60+
$filter->options($values);
61+
}
62+
63+
}
64+
65+
public function selectAllFilterOptions(string $filterKey): void
66+
{
67+
$filter = $this->getFilterByKey($filterKey);
68+
69+
if (! $filter instanceof MultiSelectFilter && ! $filter instanceof MultiSelectDropdownFilter) {
70+
return;
71+
}
72+
73+
if (count($this->getAppliedFilterWithValue($filterKey) ?? []) === count($filter->getOptions())) {
74+
$this->resetFilter($filterKey);
75+
76+
return;
77+
}
78+
79+
$this->setFilter($filterKey, array_keys($filter->getOptions()));
80+
}
81+
82+
public function applyFilters(): Builder
83+
{
84+
if ($this->filtersAreEnabled() && $this->hasFilters() && $this->hasAppliedFiltersWithValues()) {
85+
foreach ($this->getFilters() as $filter) {
86+
foreach ($this->getAppliedFiltersWithValues() as $key => $value) {
87+
if ($filter->getKey() === $key && $filter->hasFilterCallback()) {
88+
// Let the filter class validate the value
89+
$value = $filter->validate($value);
90+
91+
if ($value === false) {
92+
continue;
93+
}
94+
95+
$this->callHook('filterApplying', ['filter' => $filter->getKey(), 'value' => $value]);
96+
$this->callTraitHook('filterApplying', ['filter' => $filter->getKey(), 'value' => $value]);
97+
98+
($filter->getFilterCallback())($this->getBuilder(), $value);
99+
}
100+
}
101+
}
102+
$this->storeFilterValues();
103+
}
104+
105+
return $this->getBuilder();
106+
}
107+
108+
109+
110+
public function updatedFilterComponents(string|array|null $value, string $filterName): void
111+
{
112+
$this->resetComputedPage();
113+
114+
// Clear bulk actions on filter - if enabled
115+
if ($this->getClearSelectedOnFilter()) {
116+
$this->clearSelected();
117+
$this->setSelectAllDisabled();
118+
}
119+
120+
// Clear filters on empty value
121+
$filter = $this->getFilterByKey($filterName);
122+
123+
if ($filter && $filter->isEmpty($value)) {
124+
$this->callHook('filterRemoved', ['filter' => $filter->getKey()]);
125+
$this->callTraitHook('filterRemoved', ['filter' => $filter->getKey()]);
126+
127+
$this->resetFilter($filterName);
128+
} elseif ($filter) {
129+
$this->callHook('filterUpdated', ['filter' => $filter->getKey(), 'value' => $value]);
130+
$this->callTraitHook('filterUpdated', ['filter' => $filter->getKey(), 'value' => $value]);
131+
if ($this->getEventStatusFilterApplied() && $filter->getKey() != null && $value != null) {
132+
event(new FilterApplied($this->getTableName(), $filter->getKey(), $value));
133+
}
134+
$this->dispatch('filter-was-set', tableName: $this->getTableName(), filterKey: $filter->getKey(), value: $value);
135+
136+
}
137+
138+
}
139+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters\Configuration;
4+
5+
use Rappasoft\LaravelLivewireTables\DataTransferObjects\FilterGenericData;
6+
7+
trait FilterGenericDataConfiguration
8+
{
9+
public function generateFilterGenericData(): array
10+
{
11+
return (new FilterGenericData($this->getTableName(), $this->getFilterLayout(), $this->isTailwind(), $this->isBootstrap4(), $this->isBootstrap5()))->toArray();
12+
}
13+
14+
public function setFilterGenericData(array $filterGenericData = []): void
15+
{
16+
$this->filterGenericData = $filterGenericData;
17+
}
18+
19+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters\Configuration;
4+
5+
use Rappasoft\LaravelLivewireTables\Exceptions\DataTableConfigurationException;
6+
7+
trait FilterMenuConfiguration
8+
{
9+
10+
public function setFilterLayout(string $type): self
11+
{
12+
if (! in_array($type, ['popover', 'slide-down'], true)) {
13+
throw new DataTableConfigurationException('Invalid filter layout type');
14+
}
15+
16+
$this->filterLayout = $type;
17+
18+
return $this;
19+
}
20+
21+
public function setFilterLayoutPopover(): self
22+
{
23+
return $this->setFilterLayout('popover');
24+
}
25+
26+
public function setFilterLayoutSlideDown(): self
27+
{
28+
return $this->setFilterLayout('slide-down');
29+
}
30+
31+
public function setFilterSlideDownDefaultStatus(bool $status): self
32+
{
33+
$this->filterSlideDownDefaultVisible = $status;
34+
35+
return $this;
36+
}
37+
38+
public function setFilterSlideDownDefaultStatusDisabled(): self
39+
{
40+
return $this->setFilterSlideDownDefaultStatus(false);
41+
}
42+
43+
public function setFilterSlideDownDefaultStatusEnabled(): self
44+
{
45+
return $this->setFilterSlideDownDefaultStatus(true);
46+
}
47+
48+
49+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters\Configuration;
4+
5+
trait FilterPillsConfiguration
6+
{
7+
public function setFilterPillsStatus(bool $status): self
8+
{
9+
$this->filterPillsStatus = $status;
10+
11+
return $this;
12+
}
13+
14+
public function setFilterPillsEnabled(): self
15+
{
16+
return $this->setFilterPillsStatus(true);
17+
}
18+
19+
public function setFilterPillsDisabled(): self
20+
{
21+
return $this->setFilterPillsStatus(false);
22+
}
23+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters\Configuration;
4+
5+
trait FilterStatusConfiguration
6+
{
7+
public function setFiltersStatus(bool $status): self
8+
{
9+
$this->filtersStatus = $status;
10+
11+
return $this;
12+
}
13+
14+
public function setFiltersEnabled(): self
15+
{
16+
return $this->setFiltersStatus(true);
17+
}
18+
19+
public function setFiltersDisabled(): self
20+
{
21+
return $this->setFiltersStatus(false);
22+
}
23+
24+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters\Configuration;
4+
5+
trait FilterVisibilityConfiguration
6+
{
7+
public function setFiltersVisibilityStatus(bool $status): self
8+
{
9+
$this->filtersVisibilityStatus = $status;
10+
11+
return $this;
12+
}
13+
14+
public function setFiltersVisibilityEnabled(): self
15+
{
16+
return $this->setFiltersVisibilityStatus(true);
17+
}
18+
19+
public function setFiltersVisibilityDisabled(): self
20+
{
21+
return $this->setFiltersVisibilityStatus(false);
22+
}
23+
24+
25+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters;
4+
5+
use Livewire\Attributes\Locked;
6+
use Illuminate\Support\Collection;
7+
use Rappasoft\LaravelLivewireTables\Traits\Filters\{Configuration\FilterConfiguration, Helpers\FilterHelpers};
8+
9+
trait HandlesFilterTraits
10+
{
11+
use FilterConfiguration,
12+
FilterHelpers,
13+
HasFiltersStatus,
14+
HasFilterGenericData,
15+
HasFilterMenu,
16+
HasFilterPills,
17+
HasFilterQueryString,
18+
HasFiltersVisibility,
19+
ManagesFilters;
20+
21+
// Set in JS
22+
public array $filterComponents = [];
23+
24+
// Set in Frontend
25+
public array $appliedFilters = [];
26+
27+
#[Locked]
28+
public int $filterCount;
29+
30+
protected ?Collection $filterCollection;
31+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters;
4+
5+
use Rappasoft\LaravelLivewireTables\Traits\Filters\Configuration\FilterGenericDataConfiguration;
6+
use Rappasoft\LaravelLivewireTables\Traits\Filters\Helpers\FilterGenericDataHelpers;
7+
8+
trait HasFilterGenericData
9+
{
10+
use FilterGenericDataConfiguration,
11+
FilterGenericDataHelpers;
12+
13+
public array $filterGenericData = [];
14+
15+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Filters;
4+
5+
use Livewire\Attributes\Locked;
6+
use Rappasoft\LaravelLivewireTables\Traits\Filters\Configuration\FilterMenuConfiguration;
7+
use Rappasoft\LaravelLivewireTables\Traits\Filters\Helpers\FilterMenuHelpers;
8+
use Rappasoft\LaravelLivewireTables\Traits\Filters\Styling\HasFilterMenuStyling;
9+
10+
11+
trait HasFilterMenu
12+
{
13+
use FilterMenuConfiguration,
14+
FilterMenuHelpers,
15+
HasFilterMenuStyling;
16+
17+
#[Locked]
18+
public string $filterLayout = 'popover';
19+
20+
// Entangled in JS
21+
public bool $filterSlideDownDefaultVisible = false;
22+
23+
24+
}

0 commit comments

Comments
 (0)