From d7adcecabe813aead5d6cd254680a3e927794f1a Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Tue, 29 Oct 2024 23:09:53 +0000 Subject: [PATCH 1/4] Initial Commit --- .../livewire-component-filter.blade.php | 3 +- src/Traits/Helpers/FilterHelpers.php | 12 +++ .../Filters/LivewireComponentArrayFilter.php | 55 ++++++++++++ src/Views/Filters/LivewireComponentFilter.php | 37 +------- .../Filters/IsLivewireComponentFilter.php | 45 ++++++++++ src/Views/Traits/IsExternalArrayFilter.php | 90 +++++++++++++++++++ 6 files changed, 205 insertions(+), 37 deletions(-) create mode 100644 src/Views/Filters/LivewireComponentArrayFilter.php create mode 100644 src/Views/Traits/Filters/IsLivewireComponentFilter.php create mode 100644 src/Views/Traits/IsExternalArrayFilter.php diff --git a/resources/views/components/tools/filters/livewire-component-filter.blade.php b/resources/views/components/tools/filters/livewire-component-filter.blade.php index 89b407133..a430faf9f 100644 --- a/resources/views/components/tools/filters/livewire-component-filter.blade.php +++ b/resources/views/components/tools/filters/livewire-component-filter.blade.php @@ -1,5 +1,4 @@
- - +
diff --git a/src/Traits/Helpers/FilterHelpers.php b/src/Traits/Helpers/FilterHelpers.php index 056500190..cef39d960 100644 --- a/src/Traits/Helpers/FilterHelpers.php +++ b/src/Traits/Helpers/FilterHelpers.php @@ -345,4 +345,16 @@ public function showFilterPillsSection(): bool { return $this->filtersAreEnabled() && $this->filterPillsAreEnabled() && $this->hasAppliedVisibleFiltersForPills(); } + + #[On('livewireArrayFilterUpdateValues')] + public function updateLivewireArrayFilterValues(string $filterKey, string $tableName, array $values) + { + if ($this->tableName == $tableName) + { + $filter = $this->getFilterByKey($filterKey); + $filter->options($values); + } + + } + } diff --git a/src/Views/Filters/LivewireComponentArrayFilter.php b/src/Views/Filters/LivewireComponentArrayFilter.php new file mode 100644 index 000000000..9c180fa33 --- /dev/null +++ b/src/Views/Filters/LivewireComponentArrayFilter.php @@ -0,0 +1,55 @@ +filterDefaultValue ?? null; + } + + public function getFilterPillValue($value): array|string|bool|null + { + $values = []; + foreach ($value as $key => $item) { + + $found = $this->getCustomFilterPillValue($item) ?? ($this->options[$item] ?? $item); + if ($found) { + $values[] = $found; + } + } + + return $values; + } + + +} diff --git a/src/Views/Filters/LivewireComponentFilter.php b/src/Views/Filters/LivewireComponentFilter.php index cfcf29e8c..c111713e1 100644 --- a/src/Views/Filters/LivewireComponentFilter.php +++ b/src/Views/Filters/LivewireComponentFilter.php @@ -5,17 +5,17 @@ use Rappasoft\LaravelLivewireTables\Exceptions\DataTableConfigurationException; use Rappasoft\LaravelLivewireTables\Views\Filter; use Rappasoft\LaravelLivewireTables\Views\Traits\Core\HasWireables; +use Rappasoft\LaravelLivewireTables\Views\Traits\Filters\IsLivewireComponentFilter; class LivewireComponentFilter extends Filter { use HasWireables; + use IsLivewireComponentFilter; public string $wireMethod = 'blur'; protected string $view = 'livewire-tables::components.tools.filters.livewire-component-filter'; - public string $livewireComponent = ''; - public function validate(string $value): string|bool { return $value; @@ -34,37 +34,4 @@ public function getFilterDefaultValue(): ?string return $this->filterDefaultValue ?? null; } - public function setLivewireComponent(string $livewireComponent): self - { - - $class = '\\'.config('livewire.class_namespace').'\\'.collect(str($livewireComponent)->explode('.'))->map(fn ($segment) => (string) str($segment)->studly())->join('\\'); - - if (! class_exists($class)) { - throw new DataTableConfigurationException('You must specify a valid path to your Livewire Component Filter.'); - } - - if (! is_subclass_of($class, \Livewire\Component::class)) { - throw new DataTableConfigurationException('Your Livewire Component Filter MUST Extend Livewire\Component.'); - } - - $this->livewireComponent = $livewireComponent; - - return $this; - } - - public function getLivewireComponent(): string - { - return $this->livewireComponent ?? ''; - } - - public function render(): string|\Illuminate\Contracts\Foundation\Application|\Illuminate\View\View|\Illuminate\View\Factory - { - if ($this->livewireComponent == '') { - throw new DataTableConfigurationException('You must specify a valid path to your Livewire Component Filter.'); - } - - return view($this->getViewPath(), $this->getFilterDisplayData())->with([ - 'livewireComponent' => $this->livewireComponent, - ]); - } } diff --git a/src/Views/Traits/Filters/IsLivewireComponentFilter.php b/src/Views/Traits/Filters/IsLivewireComponentFilter.php new file mode 100644 index 000000000..427c86c78 --- /dev/null +++ b/src/Views/Traits/Filters/IsLivewireComponentFilter.php @@ -0,0 +1,45 @@ +explode('.'))->map(fn ($segment) => (string) str($segment)->studly())->join('\\'); + + if (! class_exists($class)) { + throw new DataTableConfigurationException('You must specify a valid path to your Livewire Component Filter.'); + } + + if (! is_subclass_of($class, \Livewire\Component::class)) { + throw new DataTableConfigurationException('Your Livewire Component Filter MUST Extend Livewire\Component.'); + } + + $this->livewireComponent = $livewireComponent; + + return $this; + } + + public function getLivewireComponent(): string + { + return $this->livewireComponent ?? ''; + } + + + public function render(): string|\Illuminate\Contracts\Foundation\Application|\Illuminate\View\View|\Illuminate\View\Factory + { + if ($this->livewireComponent == '') { + throw new DataTableConfigurationException('You must specify a valid path to your Livewire Component Filter.'); + } + + return view($this->getViewPath(), $this->getFilterDisplayData())->with([ + 'livewireComponent' => $this->livewireComponent, + ]); + } +} \ No newline at end of file diff --git a/src/Views/Traits/IsExternalArrayFilter.php b/src/Views/Traits/IsExternalArrayFilter.php new file mode 100644 index 000000000..8e3ae6b80 --- /dev/null +++ b/src/Views/Traits/IsExternalArrayFilter.php @@ -0,0 +1,90 @@ +tableName && $filterKey == $this->filterKey) + { + $this->selectedItems = $value; + $this->clearFilter(); + $this->needsUpdating = false; + + } + } + + protected function clearFilter() {} + + #[Renderless] + public function updatedSelectedItems($values) + { + $this->needsUpdating = true; + } + + protected function enableUpdateDispatch(): void + { + $this->needsUpdating = true; + } + + protected function disableUpdateDispatch(): void + { + $this->needsUpdating = false; + } + + #[Renderless] + protected function sendUpdateDispatch(array $returnValues) + { + if ($this->needsUpdating) + { + if (!empty($returnValues)) + { + $this->dispatch('livewireArrayFilterUpdateValues', tableName: $this->tableName, filterKey: $this->filterKey, values: $returnValues)->to($this->tableComponent); + $this->value = array_keys($returnValues); + } + else + { + $this->value = []; + } + $this->needsUpdating = false; + + } + } + + public function renderingIsExternalArrayFilter() + { + $returnValues = []; + + if ($this->needsUpdating == true && !empty($this->selectedItems)) + { + foreach ($this->selectedItems as $selectedItem) + { + $returnValues[$selectedItem] = $this->selectOptions[$selectedItem] ?? 'Unknown'; + } + $this->sendUpdateDispatch($returnValues); + } + } + +} From 0a23df2d6c7ce1e630b9f41517398c698dd42e5d Mon Sep 17 00:00:00 2001 From: lrljoe Date: Tue, 29 Oct 2024 23:10:20 +0000 Subject: [PATCH 2/4] Fix styling --- src/Traits/Helpers/FilterHelpers.php | 6 ++-- .../Filters/LivewireComponentArrayFilter.php | 4 +-- src/Views/Filters/LivewireComponentFilter.php | 1 - .../Filters/IsLivewireComponentFilter.php | 5 ++-- src/Views/Traits/IsExternalArrayFilter.php | 28 +++++++------------ 5 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/Traits/Helpers/FilterHelpers.php b/src/Traits/Helpers/FilterHelpers.php index cef39d960..c51830cd8 100644 --- a/src/Traits/Helpers/FilterHelpers.php +++ b/src/Traits/Helpers/FilterHelpers.php @@ -346,15 +346,13 @@ public function showFilterPillsSection(): bool return $this->filtersAreEnabled() && $this->filterPillsAreEnabled() && $this->hasAppliedVisibleFiltersForPills(); } - #[On('livewireArrayFilterUpdateValues')] + #[On('livewireArrayFilterUpdateValues')] public function updateLivewireArrayFilterValues(string $filterKey, string $tableName, array $values) { - if ($this->tableName == $tableName) - { + if ($this->tableName == $tableName) { $filter = $this->getFilterByKey($filterKey); $filter->options($values); } } - } diff --git a/src/Views/Filters/LivewireComponentArrayFilter.php b/src/Views/Filters/LivewireComponentArrayFilter.php index 9c180fa33..9a648473a 100644 --- a/src/Views/Filters/LivewireComponentArrayFilter.php +++ b/src/Views/Filters/LivewireComponentArrayFilter.php @@ -20,7 +20,7 @@ class LivewireComponentArrayFilter extends Filter public function validate(array $value): array|bool { - + return $value; } @@ -50,6 +50,4 @@ public function getFilterPillValue($value): array|string|bool|null return $values; } - - } diff --git a/src/Views/Filters/LivewireComponentFilter.php b/src/Views/Filters/LivewireComponentFilter.php index c111713e1..8605c2e99 100644 --- a/src/Views/Filters/LivewireComponentFilter.php +++ b/src/Views/Filters/LivewireComponentFilter.php @@ -33,5 +33,4 @@ public function getFilterDefaultValue(): ?string { return $this->filterDefaultValue ?? null; } - } diff --git a/src/Views/Traits/Filters/IsLivewireComponentFilter.php b/src/Views/Traits/Filters/IsLivewireComponentFilter.php index 427c86c78..fbcf83d0a 100644 --- a/src/Views/Traits/Filters/IsLivewireComponentFilter.php +++ b/src/Views/Traits/Filters/IsLivewireComponentFilter.php @@ -31,15 +31,14 @@ public function getLivewireComponent(): string return $this->livewireComponent ?? ''; } - public function render(): string|\Illuminate\Contracts\Foundation\Application|\Illuminate\View\View|\Illuminate\View\Factory { if ($this->livewireComponent == '') { throw new DataTableConfigurationException('You must specify a valid path to your Livewire Component Filter.'); } - + return view($this->getViewPath(), $this->getFilterDisplayData())->with([ 'livewireComponent' => $this->livewireComponent, ]); } -} \ No newline at end of file +} diff --git a/src/Views/Traits/IsExternalArrayFilter.php b/src/Views/Traits/IsExternalArrayFilter.php index 8e3ae6b80..64b503968 100644 --- a/src/Views/Traits/IsExternalArrayFilter.php +++ b/src/Views/Traits/IsExternalArrayFilter.php @@ -24,11 +24,10 @@ trait IsExternalArrayFilter public array $selectOptions = []; #[On('filter-was-set')] - #[Renderless] + #[Renderless] public function setFilterValues($tableName, $filterKey, $value) { - if ($tableName == $this->tableName && $filterKey == $this->filterKey) - { + if ($tableName == $this->tableName && $filterKey == $this->filterKey) { $this->selectedItems = $value; $this->clearFilter(); $this->needsUpdating = false; @@ -38,7 +37,7 @@ public function setFilterValues($tableName, $filterKey, $value) protected function clearFilter() {} - #[Renderless] + #[Renderless] public function updatedSelectedItems($values) { $this->needsUpdating = true; @@ -54,18 +53,14 @@ protected function disableUpdateDispatch(): void $this->needsUpdating = false; } - #[Renderless] + #[Renderless] protected function sendUpdateDispatch(array $returnValues) { - if ($this->needsUpdating) - { - if (!empty($returnValues)) - { - $this->dispatch('livewireArrayFilterUpdateValues', tableName: $this->tableName, filterKey: $this->filterKey, values: $returnValues)->to($this->tableComponent); + if ($this->needsUpdating) { + if (! empty($returnValues)) { + $this->dispatch('livewireArrayFilterUpdateValues', tableName: $this->tableName, filterKey: $this->filterKey, values: $returnValues)->to($this->tableComponent); $this->value = array_keys($returnValues); - } - else - { + } else { $this->value = []; } $this->needsUpdating = false; @@ -77,14 +72,11 @@ public function renderingIsExternalArrayFilter() { $returnValues = []; - if ($this->needsUpdating == true && !empty($this->selectedItems)) - { - foreach ($this->selectedItems as $selectedItem) - { + if ($this->needsUpdating == true && ! empty($this->selectedItems)) { + foreach ($this->selectedItems as $selectedItem) { $returnValues[$selectedItem] = $this->selectOptions[$selectedItem] ?? 'Unknown'; } $this->sendUpdateDispatch($returnValues); } } - } From 92f9e18046018ff899f51d8e1d42a485493634f3 Mon Sep 17 00:00:00 2001 From: LRLJoe Date: Wed, 30 Oct 2024 22:25:08 +0000 Subject: [PATCH 3/4] Add blade for Livewire Component Array Filter - not live --- .../livewire-component-array-filter.blade.php | 4 +++ src/Traits/Helpers/FilterHelpers.php | 2 +- .../Filters/LivewireComponentArrayFilter.php | 7 +++- src/Views/Traits/Filters/HasOptions.php | 2 +- src/Views/Traits/IsExternalArrayFilter.php | 32 +++++++------------ 5 files changed, 24 insertions(+), 23 deletions(-) create mode 100644 resources/views/components/tools/filters/livewire-component-array-filter.blade.php diff --git a/resources/views/components/tools/filters/livewire-component-array-filter.blade.php b/resources/views/components/tools/filters/livewire-component-array-filter.blade.php new file mode 100644 index 000000000..237d062fa --- /dev/null +++ b/resources/views/components/tools/filters/livewire-component-array-filter.blade.php @@ -0,0 +1,4 @@ +
+ + +
diff --git a/src/Traits/Helpers/FilterHelpers.php b/src/Traits/Helpers/FilterHelpers.php index c51830cd8..d9bfddf51 100644 --- a/src/Traits/Helpers/FilterHelpers.php +++ b/src/Traits/Helpers/FilterHelpers.php @@ -347,7 +347,7 @@ public function showFilterPillsSection(): bool } #[On('livewireArrayFilterUpdateValues')] - public function updateLivewireArrayFilterValues(string $filterKey, string $tableName, array $values) + public function updateLivewireArrayFilterValues(string $filterKey, string $tableName, array $values): void { if ($this->tableName == $tableName) { $filter = $this->getFilterByKey($filterKey); diff --git a/src/Views/Filters/LivewireComponentArrayFilter.php b/src/Views/Filters/LivewireComponentArrayFilter.php index 9a648473a..ad995b3dc 100644 --- a/src/Views/Filters/LivewireComponentArrayFilter.php +++ b/src/Views/Filters/LivewireComponentArrayFilter.php @@ -16,7 +16,7 @@ class LivewireComponentArrayFilter extends Filter public string $wireMethod = 'blur'; - protected string $view = 'livewire-tables::components.tools.filters.livewire-component-filter'; + protected string $view = 'livewire-tables::components.tools.filters.livewire-component-array-filter'; public function validate(array $value): array|bool { @@ -50,4 +50,9 @@ public function getFilterPillValue($value): array|string|bool|null return $values; } + + public function getKeys(): array + { + return array_keys($this->options ?? []); + } } diff --git a/src/Views/Traits/Filters/HasOptions.php b/src/Views/Traits/Filters/HasOptions.php index 3447fe660..a8e39a363 100644 --- a/src/Views/Traits/Filters/HasOptions.php +++ b/src/Views/Traits/Filters/HasOptions.php @@ -33,7 +33,7 @@ public function options(array $options = []): self public function getOptions(): array { - return $this->options ?? $this->options = config($this->optionsPath, []); + return $this->options ?? $this->options = (property_exists($this, 'optionsPath') ? config($this->optionsPath, []) : []); } public function getKeys(): array diff --git a/src/Views/Traits/IsExternalArrayFilter.php b/src/Views/Traits/IsExternalArrayFilter.php index 64b503968..c66d2bbd7 100644 --- a/src/Views/Traits/IsExternalArrayFilter.php +++ b/src/Views/Traits/IsExternalArrayFilter.php @@ -7,7 +7,7 @@ trait IsExternalArrayFilter { #[Modelable] - public $value = []; + public array $value = []; public string $filterKey = ''; @@ -24,12 +24,10 @@ trait IsExternalArrayFilter public array $selectOptions = []; #[On('filter-was-set')] - #[Renderless] - public function setFilterValues($tableName, $filterKey, $value) + public function setFilterValues(string $tableName, string $filterKey, array $value): void { - if ($tableName == $this->tableName && $filterKey == $this->filterKey) { + if ($tableName == $this->tableName && $filterKey == $this->filterKey && $this->selectedItems != $value) { $this->selectedItems = $value; - $this->clearFilter(); $this->needsUpdating = false; } @@ -38,37 +36,31 @@ public function setFilterValues($tableName, $filterKey, $value) protected function clearFilter() {} #[Renderless] - public function updatedSelectedItems($values) + public function updatedSelectedItems(string $value): void { - $this->needsUpdating = true; - } - - protected function enableUpdateDispatch(): void - { - $this->needsUpdating = true; - } + if (!$this->needsUpdating) + { + $this->needsUpdating = true; - protected function disableUpdateDispatch(): void - { - $this->needsUpdating = false; + } } #[Renderless] - protected function sendUpdateDispatch(array $returnValues) + protected function sendUpdateDispatch(array $returnValues): void { if ($this->needsUpdating) { if (! empty($returnValues)) { - $this->dispatch('livewireArrayFilterUpdateValues', tableName: $this->tableName, filterKey: $this->filterKey, values: $returnValues)->to($this->tableComponent); $this->value = array_keys($returnValues); } else { $this->value = []; } - $this->needsUpdating = false; + $this->dispatch('livewireArrayFilterUpdateValues', tableName: $this->tableName, filterKey: $this->filterKey, values: $returnValues)->to($this->tableComponent); } } - public function renderingIsExternalArrayFilter() + #[Renderless] + public function renderingIsExternalArrayFilter(): void { $returnValues = []; From 924f13ef80e35798c9ec87dfd6c56ba7121eded3 Mon Sep 17 00:00:00 2001 From: lrljoe Date: Wed, 30 Oct 2024 22:25:40 +0000 Subject: [PATCH 4/4] Fix styling --- src/Views/Traits/IsExternalArrayFilter.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Views/Traits/IsExternalArrayFilter.php b/src/Views/Traits/IsExternalArrayFilter.php index c66d2bbd7..480d36e82 100644 --- a/src/Views/Traits/IsExternalArrayFilter.php +++ b/src/Views/Traits/IsExternalArrayFilter.php @@ -38,8 +38,7 @@ protected function clearFilter() {} #[Renderless] public function updatedSelectedItems(string $value): void { - if (!$this->needsUpdating) - { + if (! $this->needsUpdating) { $this->needsUpdating = true; }