diff --git a/.github/workflows/run-tests-pcov-pull.yml b/.github/workflows/run-tests-pcov-pull.yml index 639edbf63..785b3c173 100644 --- a/.github/workflows/run-tests-pcov-pull.yml +++ b/.github/workflows/run-tests-pcov-pull.yml @@ -93,7 +93,7 @@ jobs: run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - name: Run Unit Tests - run: php ./vendor/bin/paratest --cache-directory=".phpunit.cache/code-coverage" --strict-coverage --coverage-clover ./coverage.xml + run: php ./vendor/bin/phpunit --cache-directory=".phpunit.cache/code-coverage" --strict-coverage --coverage-clover ./coverage.xml - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4 diff --git a/.github/workflows/run-tests-pull.yml b/.github/workflows/run-tests-pull.yml index 28e642d03..8b0fdd2c4 100644 --- a/.github/workflows/run-tests-pull.yml +++ b/.github/workflows/run-tests-pull.yml @@ -21,7 +21,7 @@ jobs: name: PULL PHP-${{ matrix.php }} - Laravel-10 env: extensionKey: phpextensions-${{ matrix.os }}-P${{ matrix.php }} - extensions: dom, curl, libxml, mbstring, zip, pcntl, pcov, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr steps: - name: Checkout code @@ -100,7 +100,7 @@ jobs: name: PULL PHP-${{ matrix.php }} - Laravel-11 env: extensionKey: phpextensions-${{ matrix.os }}-P${{ matrix.php }}-L${{ matrix.laravel }} - extensions: dom, curl, libxml, mbstring, zip, pcntl, pcov, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr steps: - name: Checkout code diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 5fdfbfd7d..8078c1ddb 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -23,7 +23,7 @@ jobs: name: PHP-${{ matrix.php }} - Laravel-10 env: extensionKey: phpextensions-${{ matrix.os }}-P${{ matrix.php }} - extensions: dom, curl, libxml, mbstring, zip, pcntl, pcov, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr steps: - name: Checkout code @@ -102,7 +102,7 @@ jobs: name: PHP-${{ matrix.php }} - Laravel-11 env: extensionKey: phpextensions-${{ matrix.os }}-P${{ matrix.php }} - extensions: dom, curl, libxml, mbstring, zip, pcntl, pcov, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr steps: - name: Checkout code diff --git a/docs/datatable/query-string.md b/docs/datatable/query-string.md index 8f1e2b3c1..f0763a643 100644 --- a/docs/datatable/query-string.md +++ b/docs/datatable/query-string.md @@ -102,4 +102,55 @@ public function configure(): void { $this->setQueryStringAliasForFilter('filtervalues'); } +``` + +## Search + +The search query string is **enabled by default**, but if you ever needed to toggle it you can use the following methods: + +### setQueryStringStatusForSearch + +Enable/disable the query string for search + +```php +public function configure(): void +{ + $this->setQueryStringStatusForSearch(true); + $this->setQueryStringStatusForSearch(false); +} +``` + +### setQueryStringForSearchEnabled + +Enable the query string for search + +```php +public function configure(): void +{ + // Shorthand for $this->setQueryStringStatusForSearch(true) + $this->setQueryStringForSearchEnabled(); +} +``` + +### setQueryStringForSearchDisabled + +Disable the query string for search + +```php +public function configure(): void +{ + // Shorthand for $this->setQueryStringStatusForSearch(false) + $this->setQueryStringForSearchDisabled(); +} +``` + +### setQueryStringAliasForSearch + +Change the Alias in the URL for the search, otherwise defaults to "$tablename-search" + +```php +public function configure(): void +{ + $this->setQueryStringAliasForSearch('search'); +} ``` \ No newline at end of file diff --git a/src/Traits/Core/QueryStrings/HasQueryStringForFilter.php b/src/Traits/Core/QueryStrings/HasQueryStringForFilter.php index 143aae376..624242301 100644 --- a/src/Traits/Core/QueryStrings/HasQueryStringForFilter.php +++ b/src/Traits/Core/QueryStrings/HasQueryStringForFilter.php @@ -13,14 +13,11 @@ trait HasQueryStringForFilter protected function queryStringHasQueryStringForFilter(): array { - if ($this->queryStringForFilterIsEnabled()) { - return [ + return ($this->queryStringForFilterIsEnabled()) ? + [ 'appliedFilters' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAliasForFilter()], 'filterComponents' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAliasForFilter()], - ]; - } - - return []; + ] : []; } public function setupQueryStringStatusForFilter(): void diff --git a/src/Traits/Core/QueryStrings/HasQueryStringForSearch.php b/src/Traits/Core/QueryStrings/HasQueryStringForSearch.php new file mode 100644 index 000000000..10cac7fb9 --- /dev/null +++ b/src/Traits/Core/QueryStrings/HasQueryStringForSearch.php @@ -0,0 +1,81 @@ +queryStringForSearchEnabled() && $this->searchIsEnabled()) ? ['search' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAliasForSearch()]] : []; + + } + + public function setupQueryStringStatusForSearch(): void + { + if (! $this->hasQueryStringStatusForSearch()) { + $this->setQueryStringForSearchEnabled(); + } + } + + public function hasQueryStringStatusForSearch(): bool + { + return isset($this->queryStringStatusForSearch); + } + + public function getQueryStringStatusForSearch(): bool + { + return $this->queryStringStatusForSearch ?? true; + } + + public function queryStringForSearchEnabled(): bool + { + $this->setupQueryStringStatusForSearch(); + + return $this->getQueryStringStatusForSearch() && $this->searchIsEnabled(); + } + + public function setQueryStringStatusForSearch(bool $status): self + { + $this->queryStringStatusForSearch = $status; + + return $this; + } + + public function setQueryStringForSearchEnabled(): self + { + $this->setQueryStringStatusForSearch(true); + + return $this; + } + + public function setQueryStringForSearchDisabled(): self + { + $this->setQueryStringStatusForSearch(false); + + return $this; + } + + public function hasQueryStringAliasForSearch(): bool + { + return isset($this->queryStringAliasForSearch); + } + + public function getQueryStringAliasForSearch(): string + { + return $this->queryStringAliasForSearch ?? $this->getQueryStringAlias().'-search'; + } + + public function setQueryStringAliasForSearch(string $alias): self + { + $this->queryStringAliasForSearch = $alias; + + return $this; + } +} diff --git a/src/Traits/WithSearch.php b/src/Traits/WithSearch.php index 0d86e1397..ddfe98553 100644 --- a/src/Traits/WithSearch.php +++ b/src/Traits/WithSearch.php @@ -6,12 +6,14 @@ use Livewire\Attributes\Locked; use Rappasoft\LaravelLivewireTables\Events\SearchApplied; use Rappasoft\LaravelLivewireTables\Traits\Configuration\SearchConfiguration; +use Rappasoft\LaravelLivewireTables\Traits\Core\QueryStrings\HasQueryStringForSearch; use Rappasoft\LaravelLivewireTables\Traits\Helpers\SearchHelpers; trait WithSearch { use SearchConfiguration, SearchHelpers; + use HasQueryStringForSearch; public string $search = ''; @@ -38,17 +40,6 @@ trait WithSearch protected bool $trimSearchString = false; - protected function queryStringWithSearch(): array - { - if ($this->queryStringIsEnabled() && $this->searchIsEnabled()) { - return [ - 'search' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAlias().'-search'], - ]; - } - - return []; - } - // TODO public function applySearch(): Builder { diff --git a/tests/Traits/Core/QueryStrings/QueryStringForFiltersTest.php b/tests/Traits/Core/QueryStrings/QueryStringForFiltersTest.php index 9387e6cdb..6ee41bccb 100644 --- a/tests/Traits/Core/QueryStrings/QueryStringForFiltersTest.php +++ b/tests/Traits/Core/QueryStrings/QueryStringForFiltersTest.php @@ -105,5 +105,6 @@ public function configure(): void $this->assertSame('table-filters', $mock->getQueryStringAliasForFilter()); $mock->setQueryStringAliasForFilter('pet-filters'); $this->assertSame('pet-filters', $mock->getQueryStringAliasForFilter()); + $this->assertTrue($mock->hasQueryStringAliasForFilter()); } } diff --git a/tests/Traits/Core/QueryStrings/QueryStringForSearchTest.php b/tests/Traits/Core/QueryStrings/QueryStringForSearchTest.php new file mode 100644 index 000000000..6fb3c5a71 --- /dev/null +++ b/tests/Traits/Core/QueryStrings/QueryStringForSearchTest.php @@ -0,0 +1,110 @@ +setDataTableFingerprint('test'); + } + }; + + $mock->configure(); + $mock->boot(); + + $this->assertSame(true, $mock->getQueryStringStatusForSearch()); + } + + public function test_can_disable_search_query_string_status(): void + { + $mock = new class extends PetsTable + { + public ?array $testAttributesArray; + + public function configure(): void + { + $this->setDataTableFingerprint('test'); + $this->setQueryStringForSearchDisabled(); + } + }; + + $mock->configure(); + $mock->boot(); + + $this->assertSame(false, $mock->getQueryStringStatusForSearch()); + } + + public function test_can_enable_search_query_string_status(): void + { + $mock = new class extends PetsTable + { + public ?array $testAttributesArray; + + public function configure(): void + { + $this->setDataTableFingerprint('test'); + $this->setQueryStringForSearchDisabled(); + } + }; + + $mock->configure(); + $mock->boot(); + + $this->assertSame(false, $mock->getQueryStringStatusForSearch()); + $mock->setQueryStringForSearchEnabled(); + $this->assertSame(true, $mock->getQueryStringStatusForSearch()); + + } + + public function test_can_get_default_search_query_string_alias(): void + { + $mock = new class extends PetsTable + { + public ?array $testAttributesArray; + + public function configure(): void + { + $this->setDataTableFingerprint('test'); + } + }; + + $mock->configure(); + $mock->boot(); + + $this->assertSame('table-search', $mock->getQueryStringAliasForSearch()); + } + + public function test_can_change_default_search_query_string_alias(): void + { + $mock = new class extends PetsTable + { + public ?array $testAttributesArray; + + public function configure(): void + { + $this->setDataTableFingerprint('test'); + } + }; + + $mock->configure(); + $mock->boot(); + + $this->assertFalse($mock->hasQueryStringAliasForSearch()); + $this->assertSame('table-search', $mock->getQueryStringAliasForSearch()); + $mock->setQueryStringAliasForSearch('pet-search'); + $this->assertSame('pet-search', $mock->getQueryStringAliasForSearch()); + $this->assertTrue($mock->hasQueryStringAliasForSearch()); + } +} diff --git a/tests/Traits/Visuals/SearchVisualsTest.php b/tests/Traits/Visuals/SearchVisualsTest.php index 1891bfd16..c025e1185 100644 --- a/tests/Traits/Visuals/SearchVisualsTest.php +++ b/tests/Traits/Visuals/SearchVisualsTest.php @@ -76,4 +76,50 @@ public function test_search_live_filter_is_applied(): void ->call('setSearchLive') ->assertSeeHtml('wire:model.live="search"'); } + + public function test_search_via_query_string_functions(): void + { + Livewire::withQueryParams(['table-search' => 'Cartman']) + ->test(PetsTable::class) + ->assertSee('Cartman') + ->assertDontSee('Chico'); + + Livewire::withQueryParams(['table-search' => 'Chico']) + ->test(PetsTable::class) + ->assertSee('Chico') + ->assertDontSee('Cartman'); + + $mock = new class extends PetsTable + { + public ?array $testAttributesArray; + + public function configure(): void + { + $this->setPrimaryKey('id'); + $this->setDataTableFingerprint('test'); + $this->setQueryStringAliasForSearch('pet-search'); + } + }; + + Livewire::withQueryParams(['table-search' => 'Chico']) + ->test($mock) + ->assertSee('Chico') + ->assertSee('Cartman'); + + Livewire::withQueryParams(['pet-search' => 'Chico']) + ->test($mock) + ->assertSee('Chico') + ->assertDontSee('Cartman'); + + Livewire::withQueryParams(['pet-search' => null]) + ->test($mock) + ->assertSee('Chico') + ->assertSee('Cartman'); + + Livewire::withQueryParams([]) + ->test($mock) + ->assertSee('Chico') + ->assertSee('Cartman'); + + } }