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);
+ }
+ }
+}