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/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..d9bfddf51 100644 --- a/src/Traits/Helpers/FilterHelpers.php +++ b/src/Traits/Helpers/FilterHelpers.php @@ -345,4 +345,14 @@ public function showFilterPillsSection(): bool { return $this->filtersAreEnabled() && $this->filterPillsAreEnabled() && $this->hasAppliedVisibleFiltersForPills(); } + + #[On('livewireArrayFilterUpdateValues')] + public function updateLivewireArrayFilterValues(string $filterKey, string $tableName, array $values): void + { + 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..ad995b3dc --- /dev/null +++ b/src/Views/Filters/LivewireComponentArrayFilter.php @@ -0,0 +1,58 @@ +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; + } + + public function getKeys(): array + { + return array_keys($this->options ?? []); + } +} diff --git a/src/Views/Filters/LivewireComponentFilter.php b/src/Views/Filters/LivewireComponentFilter.php index cfcf29e8c..8605c2e99 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; @@ -33,38 +33,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/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/Filters/IsLivewireComponentFilter.php b/src/Views/Traits/Filters/IsLivewireComponentFilter.php new file mode 100644 index 000000000..fbcf83d0a --- /dev/null +++ b/src/Views/Traits/Filters/IsLivewireComponentFilter.php @@ -0,0 +1,44 @@ +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/IsExternalArrayFilter.php b/src/Views/Traits/IsExternalArrayFilter.php new file mode 100644 index 000000000..480d36e82 --- /dev/null +++ b/src/Views/Traits/IsExternalArrayFilter.php @@ -0,0 +1,73 @@ +tableName && $filterKey == $this->filterKey && $this->selectedItems != $value) { + $this->selectedItems = $value; + $this->needsUpdating = false; + + } + } + + protected function clearFilter() {} + + #[Renderless] + public function updatedSelectedItems(string $value): void + { + if (! $this->needsUpdating) { + $this->needsUpdating = true; + + } + } + + #[Renderless] + protected function sendUpdateDispatch(array $returnValues): void + { + if ($this->needsUpdating) { + if (! empty($returnValues)) { + $this->value = array_keys($returnValues); + } else { + $this->value = []; + } + $this->dispatch('livewireArrayFilterUpdateValues', tableName: $this->tableName, filterKey: $this->filterKey, values: $returnValues)->to($this->tableComponent); + + } + } + + #[Renderless] + public function renderingIsExternalArrayFilter(): void + { + $returnValues = []; + + if ($this->needsUpdating == true && ! empty($this->selectedItems)) { + foreach ($this->selectedItems as $selectedItem) { + $returnValues[$selectedItem] = $this->selectOptions[$selectedItem] ?? 'Unknown'; + } + $this->sendUpdateDispatch($returnValues); + } + } +}