diff --git a/src/Helpers/Model.php b/src/Helpers/Model.php index 8de3ca1b4..97e101ea6 100644 --- a/src/Helpers/Model.php +++ b/src/Helpers/Model.php @@ -108,9 +108,9 @@ public function filter(): Builder private function validateInputTextOptions(string $field): bool { return isset($this->filters['input_text_options'][$field]) && in_array( - strtolower($this->filters['input_text_options'][$field]), - ['is', 'is_not', 'contains', 'contains_not', 'starts_with', 'ends_with'] - ); + strtolower($this->filters['input_text_options'][$field]), + ['is', 'is_not', 'contains', 'contains_not', 'starts_with', 'ends_with'] + ); } /** @@ -169,7 +169,7 @@ public function filterInputText(Builder $query, string $field, $value) */ public function filterBoolean($query, string $field, $value) { - /** @var \Illuminate\Database\Eloquent\Builder $query */ + /** @var Builder $query */ if ($value != 'all') { $value = ($value == 'true'); $query->where($field, '=', $value); @@ -183,7 +183,7 @@ public function filterBoolean($query, string $field, $value) */ public function filterSelect($query, string $field, $value) { - /** @var \Illuminate\Database\Eloquent\Builder $query */ + /** @var Builder $query */ if (filled($value)) { $query->where($field, $value); } @@ -196,7 +196,7 @@ public function filterSelect($query, string $field, $value) */ public function filterMultiSelect($query, string $field, $value) { - $empty = false; + $empty = false; $values = collect($value)->get('values'); if (count($values) === 0) { return; @@ -220,13 +220,13 @@ public function filterNumber($query, string $field, $value) { if (isset($value['start']) && !isset($value['end'])) { $start = str_replace($value['thousands'], '', $value['start']); - $start = (float) str_replace($value['decimal'], '.', $start); + $start = (float)str_replace($value['decimal'], '.', $start); $query->where($field, '>=', $start); } if (!isset($value['start']) && isset($value['end'])) { $end = str_replace($value['thousands'], '', $value['end']); - $end = (float) str_replace($value['decimal'], '.', $end); + $end = (float)str_replace($value['decimal'], '.', $end); $query->where($field, '<=', $end); } @@ -247,11 +247,10 @@ public function filterContains(): Model $this->query = $this->query->where(function (Builder $query) { /** @var Column $column */ foreach ($this->columns as $column) { - if ($column->searchable) { - $hasColumn = Schema::hasColumn($query->getModel()->getTable(), $column->field); - if ($hasColumn) { - $query->orWhere($column->field, 'like', '%' . $this->search . '%'); - } + $hasColumn = Schema::hasColumn($query->getModel()->getTable(), $column->field); + + if ($column->searchable && $hasColumn) { + $query->orWhere($column->field, 'like', '%' . $this->search . '%'); } } diff --git a/src/PowerGridComponent.php b/src/PowerGridComponent.php index 959d9b4cd..437e80030 100644 --- a/src/PowerGridComponent.php +++ b/src/PowerGridComponent.php @@ -3,6 +3,7 @@ namespace PowerComponents\LivewirePowerGrid; use Exception; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection as BaseCollection; use Livewire\{Component, WithPagination}; use PowerComponents\LivewirePowerGrid\Helpers\{Collection, Model}; @@ -48,11 +49,11 @@ class PowerGridComponent extends Component protected $listeners = [ 'eventChangeDatePiker' => 'eventChangeDatePiker', - 'eventInputChanged' => 'eventInputChanged', - 'eventToggleChanged' => 'eventInputChanged', - 'eventMultiSelect' => 'eventMultiSelect', - 'eventRefresh' => '$refresh', - 'eventToggleColumn' => 'toggleColumn', + 'eventInputChanged' => 'eventInputChanged', + 'eventToggleChanged' => 'eventInputChanged', + 'eventMultiSelect' => 'eventMultiSelect', + 'eventRefresh' => '$refresh', + 'eventToggleColumn' => 'toggleColumn', ]; public bool $toggleColumns = false; @@ -132,7 +133,7 @@ public function showToggleColumns(): PowerGridComponent */ public function showCheckBox(string $attribute = 'id'): PowerGridComponent { - $this->checkbox = true; + $this->checkbox = true; $this->checkboxAttribute = $attribute; return $this; @@ -146,7 +147,7 @@ public function showPerPage(int $perPage = 10): PowerGridComponent { if (\Str::contains($perPage, $this->perPageValues)) { $this->perPageInput = true; - $this->perPage = $perPage; + $this->perPage = $perPage; } return $this; @@ -170,7 +171,7 @@ public function render() $this->powerGridTheme = PowerGrid::theme($this->template() ?? powerGridTheme())->apply(); $this->columns = collect($this->columns)->map(function ($column) { - return (object) $column; + return (object)$column; })->toArray(); $this->relationSearch = $this->relationSearch(); @@ -188,7 +189,7 @@ public function render() private function renderView($data) { return view($this->powerGridTheme->layout->table, [ - 'data' => $data, + 'data' => $data, 'theme' => $this->powerGridTheme, 'table' => 'livewire-powergrid::components.table', ]); @@ -200,8 +201,6 @@ private function resolveModel($datasource = null) return $this->datasource(); } - $this->total = $datasource->count(); - return $datasource; } @@ -272,7 +271,7 @@ public function updateMessages(string $status, string $field = '_default_message $updateMessages = [ 'success' => [ '_default_message' => __('Data has been updated successfully!'), - 'status' => __('Custom Field updated successfully!'), + 'status' => __('Custom Field updated successfully!'), ], 'error' => [ '_default_message' => __('Error updating the data.'), @@ -312,14 +311,18 @@ public function fillData() $this->filtered = $results->pluck('id')->toArray(); $paginated = Collection::paginate($results, $this->perPage); - $results = $paginated->setCollection($this->transform($paginated->getCollection())); + $results = $paginated->setCollection($this->transform($paginated->getCollection())); } return $results; } + if (filled($this->search)) { + $this->gotoPage(1); + } + $results = $this->resolveModel($datasource) - ->where(function (\Illuminate\Database\Eloquent\Builder $query) { + ->where(function (Builder $query) { Model::query($query) ->setColumns($this->columns) ->setSearch($this->search) @@ -336,6 +339,8 @@ public function fillData() $results = $results->paginate($results->count()); } + $this->total = $results->total(); + return $results->setCollection($this->transform($results->getCollection())); } @@ -357,7 +362,7 @@ private function transform($results) || is_a($this->addColumns(), PowerGridEloquent::class) ) { return $results->transform(function ($row) { - $row = (object) $row; + $row = (object)$row; $columns = $this->addColumns()->columns; foreach ($columns as $key => $column) { $row->{$key} = $column($row); @@ -382,7 +387,7 @@ public function toggleColumn($field): void $column['hidden'] = !data_get($column, 'hidden'); } - return (object) $column; + return (object)$column; })->toArray(); } } diff --git a/tests/Feature/PaginationTest.php b/tests/Feature/PaginationTest.php index ed5a1f925..7c42f2847 100644 --- a/tests/Feature/PaginationTest.php +++ b/tests/Feature/PaginationTest.php @@ -70,6 +70,13 @@ ->call('gotoPage', '11') ->assertSeeHtml('wire:click="previousPage"'); +it('search for something that is not on the current page') + ->livewire(DishesTable::class) + ->assertSeeHtml('Francesinha vegana') + ->call('gotoPage', 2) + ->set('search', 'Francesinha vegana') + ->assertSeeHtml('Francesinha vegana'); + it('properly paginates', function () { $component = powergrid(); $component->perPage = 5;