Skip to content

Commit 351757e

Browse files
authored
Add Customisation for "Search" in QueryString (rappasoft#2017)
* AddSearchQueryString * Add tests for hasQueryStringAliasFor... * Additional Tests For SearchQueryString * Move Livewire to Visuals section * Simplify the queryString methods * Add hasQueryStringAliasForSearch test * PCOV Runs as PHPUnit not ParaTest * Remove PCOV From Workflows Where Not Used * Fix styling --------- Co-authored-by: lrljoe <[email protected]>
1 parent 92dc8fb commit 351757e

File tree

10 files changed

+299
-22
lines changed

10 files changed

+299
-22
lines changed

.github/workflows/run-tests-pcov-pull.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ jobs:
9393
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
9494

9595
- name: Run Unit Tests
96-
run: php ./vendor/bin/paratest --cache-directory=".phpunit.cache/code-coverage" --strict-coverage --coverage-clover ./coverage.xml
96+
run: php ./vendor/bin/phpunit --cache-directory=".phpunit.cache/code-coverage" --strict-coverage --coverage-clover ./coverage.xml
9797

9898
- name: Upload coverage reports to Codecov
9999
uses: codecov/codecov-action@v4

.github/workflows/run-tests-pull.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
name: PULL PHP-${{ matrix.php }} - Laravel-10
2222
env:
2323
extensionKey: phpextensions-${{ matrix.os }}-P${{ matrix.php }}
24-
extensions: dom, curl, libxml, mbstring, zip, pcntl, pcov, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr
24+
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr
2525

2626
steps:
2727
- name: Checkout code
@@ -100,7 +100,7 @@ jobs:
100100
name: PULL PHP-${{ matrix.php }} - Laravel-11
101101
env:
102102
extensionKey: phpextensions-${{ matrix.os }}-P${{ matrix.php }}-L${{ matrix.laravel }}
103-
extensions: dom, curl, libxml, mbstring, zip, pcntl, pcov, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr
103+
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr
104104

105105
steps:
106106
- name: Checkout code

.github/workflows/run-tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
name: PHP-${{ matrix.php }} - Laravel-10
2424
env:
2525
extensionKey: phpextensions-${{ matrix.os }}-P${{ matrix.php }}
26-
extensions: dom, curl, libxml, mbstring, zip, pcntl, pcov, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr
26+
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr
2727

2828
steps:
2929
- name: Checkout code
@@ -102,7 +102,7 @@ jobs:
102102
name: PHP-${{ matrix.php }} - Laravel-11
103103
env:
104104
extensionKey: phpextensions-${{ matrix.os }}-P${{ matrix.php }}
105-
extensions: dom, curl, libxml, mbstring, zip, pcntl, pcov, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr
105+
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo, :psr
106106

107107
steps:
108108
- name: Checkout code

docs/datatable/query-string.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,55 @@ public function configure(): void
102102
{
103103
$this->setQueryStringAliasForFilter('filtervalues');
104104
}
105+
```
106+
107+
## Search
108+
109+
The search query string is **enabled by default**, but if you ever needed to toggle it you can use the following methods:
110+
111+
### setQueryStringStatusForSearch
112+
113+
Enable/disable the query string for search
114+
115+
```php
116+
public function configure(): void
117+
{
118+
$this->setQueryStringStatusForSearch(true);
119+
$this->setQueryStringStatusForSearch(false);
120+
}
121+
```
122+
123+
### setQueryStringForSearchEnabled
124+
125+
Enable the query string for search
126+
127+
```php
128+
public function configure(): void
129+
{
130+
// Shorthand for $this->setQueryStringStatusForSearch(true)
131+
$this->setQueryStringForSearchEnabled();
132+
}
133+
```
134+
135+
### setQueryStringForSearchDisabled
136+
137+
Disable the query string for search
138+
139+
```php
140+
public function configure(): void
141+
{
142+
// Shorthand for $this->setQueryStringStatusForSearch(false)
143+
$this->setQueryStringForSearchDisabled();
144+
}
145+
```
146+
147+
### setQueryStringAliasForSearch
148+
149+
Change the Alias in the URL for the search, otherwise defaults to "$tablename-search"
150+
151+
```php
152+
public function configure(): void
153+
{
154+
$this->setQueryStringAliasForSearch('search');
155+
}
105156
```

src/Traits/Core/QueryStrings/HasQueryStringForFilter.php

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,11 @@ trait HasQueryStringForFilter
1313

1414
protected function queryStringHasQueryStringForFilter(): array
1515
{
16-
if ($this->queryStringForFilterIsEnabled()) {
17-
return [
16+
return ($this->queryStringForFilterIsEnabled()) ?
17+
[
1818
'appliedFilters' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAliasForFilter()],
1919
'filterComponents' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAliasForFilter()],
20-
];
21-
}
22-
23-
return [];
20+
] : [];
2421
}
2522

2623
public function setupQueryStringStatusForFilter(): void
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Core\QueryStrings;
4+
5+
use Livewire\Attributes\Locked;
6+
7+
trait HasQueryStringForSearch
8+
{
9+
#[Locked]
10+
public ?bool $queryStringStatusForSearch;
11+
12+
protected ?string $queryStringAliasForSearch;
13+
14+
protected function queryStringHasQueryStringForSearch(): array
15+
{
16+
return ($this->queryStringForSearchEnabled() && $this->searchIsEnabled()) ? ['search' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAliasForSearch()]] : [];
17+
18+
}
19+
20+
public function setupQueryStringStatusForSearch(): void
21+
{
22+
if (! $this->hasQueryStringStatusForSearch()) {
23+
$this->setQueryStringForSearchEnabled();
24+
}
25+
}
26+
27+
public function hasQueryStringStatusForSearch(): bool
28+
{
29+
return isset($this->queryStringStatusForSearch);
30+
}
31+
32+
public function getQueryStringStatusForSearch(): bool
33+
{
34+
return $this->queryStringStatusForSearch ?? true;
35+
}
36+
37+
public function queryStringForSearchEnabled(): bool
38+
{
39+
$this->setupQueryStringStatusForSearch();
40+
41+
return $this->getQueryStringStatusForSearch() && $this->searchIsEnabled();
42+
}
43+
44+
public function setQueryStringStatusForSearch(bool $status): self
45+
{
46+
$this->queryStringStatusForSearch = $status;
47+
48+
return $this;
49+
}
50+
51+
public function setQueryStringForSearchEnabled(): self
52+
{
53+
$this->setQueryStringStatusForSearch(true);
54+
55+
return $this;
56+
}
57+
58+
public function setQueryStringForSearchDisabled(): self
59+
{
60+
$this->setQueryStringStatusForSearch(false);
61+
62+
return $this;
63+
}
64+
65+
public function hasQueryStringAliasForSearch(): bool
66+
{
67+
return isset($this->queryStringAliasForSearch);
68+
}
69+
70+
public function getQueryStringAliasForSearch(): string
71+
{
72+
return $this->queryStringAliasForSearch ?? $this->getQueryStringAlias().'-search';
73+
}
74+
75+
public function setQueryStringAliasForSearch(string $alias): self
76+
{
77+
$this->queryStringAliasForSearch = $alias;
78+
79+
return $this;
80+
}
81+
}

src/Traits/WithSearch.php

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
use Livewire\Attributes\Locked;
77
use Rappasoft\LaravelLivewireTables\Events\SearchApplied;
88
use Rappasoft\LaravelLivewireTables\Traits\Configuration\SearchConfiguration;
9+
use Rappasoft\LaravelLivewireTables\Traits\Core\QueryStrings\HasQueryStringForSearch;
910
use Rappasoft\LaravelLivewireTables\Traits\Helpers\SearchHelpers;
1011

1112
trait WithSearch
1213
{
1314
use SearchConfiguration,
1415
SearchHelpers;
16+
use HasQueryStringForSearch;
1517

1618
public string $search = '';
1719

@@ -38,17 +40,6 @@ trait WithSearch
3840

3941
protected bool $trimSearchString = false;
4042

41-
protected function queryStringWithSearch(): array
42-
{
43-
if ($this->queryStringIsEnabled() && $this->searchIsEnabled()) {
44-
return [
45-
'search' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAlias().'-search'],
46-
];
47-
}
48-
49-
return [];
50-
}
51-
5243
// TODO
5344
public function applySearch(): Builder
5445
{

tests/Traits/Core/QueryStrings/QueryStringForFiltersTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,6 @@ public function configure(): void
105105
$this->assertSame('table-filters', $mock->getQueryStringAliasForFilter());
106106
$mock->setQueryStringAliasForFilter('pet-filters');
107107
$this->assertSame('pet-filters', $mock->getQueryStringAliasForFilter());
108+
$this->assertTrue($mock->hasQueryStringAliasForFilter());
108109
}
109110
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Tests\Traits\Core\QueryStrings;
4+
5+
use PHPUnit\Framework\Attributes\DataProvider;
6+
use PHPUnit\Framework\Attributes\Depends;
7+
use Rappasoft\LaravelLivewireTables\Tests\Http\Livewire\PetsTable;
8+
use Rappasoft\LaravelLivewireTables\Tests\TestCase;
9+
10+
final class QueryStringForSearchTest extends TestCase
11+
{
12+
public function test_can_get_default_search_query_string_status(): void
13+
{
14+
$mock = new class extends PetsTable
15+
{
16+
public ?array $testAttributesArray;
17+
18+
public function configure(): void
19+
{
20+
$this->setDataTableFingerprint('test');
21+
}
22+
};
23+
24+
$mock->configure();
25+
$mock->boot();
26+
27+
$this->assertSame(true, $mock->getQueryStringStatusForSearch());
28+
}
29+
30+
public function test_can_disable_search_query_string_status(): void
31+
{
32+
$mock = new class extends PetsTable
33+
{
34+
public ?array $testAttributesArray;
35+
36+
public function configure(): void
37+
{
38+
$this->setDataTableFingerprint('test');
39+
$this->setQueryStringForSearchDisabled();
40+
}
41+
};
42+
43+
$mock->configure();
44+
$mock->boot();
45+
46+
$this->assertSame(false, $mock->getQueryStringStatusForSearch());
47+
}
48+
49+
public function test_can_enable_search_query_string_status(): void
50+
{
51+
$mock = new class extends PetsTable
52+
{
53+
public ?array $testAttributesArray;
54+
55+
public function configure(): void
56+
{
57+
$this->setDataTableFingerprint('test');
58+
$this->setQueryStringForSearchDisabled();
59+
}
60+
};
61+
62+
$mock->configure();
63+
$mock->boot();
64+
65+
$this->assertSame(false, $mock->getQueryStringStatusForSearch());
66+
$mock->setQueryStringForSearchEnabled();
67+
$this->assertSame(true, $mock->getQueryStringStatusForSearch());
68+
69+
}
70+
71+
public function test_can_get_default_search_query_string_alias(): void
72+
{
73+
$mock = new class extends PetsTable
74+
{
75+
public ?array $testAttributesArray;
76+
77+
public function configure(): void
78+
{
79+
$this->setDataTableFingerprint('test');
80+
}
81+
};
82+
83+
$mock->configure();
84+
$mock->boot();
85+
86+
$this->assertSame('table-search', $mock->getQueryStringAliasForSearch());
87+
}
88+
89+
public function test_can_change_default_search_query_string_alias(): void
90+
{
91+
$mock = new class extends PetsTable
92+
{
93+
public ?array $testAttributesArray;
94+
95+
public function configure(): void
96+
{
97+
$this->setDataTableFingerprint('test');
98+
}
99+
};
100+
101+
$mock->configure();
102+
$mock->boot();
103+
104+
$this->assertFalse($mock->hasQueryStringAliasForSearch());
105+
$this->assertSame('table-search', $mock->getQueryStringAliasForSearch());
106+
$mock->setQueryStringAliasForSearch('pet-search');
107+
$this->assertSame('pet-search', $mock->getQueryStringAliasForSearch());
108+
$this->assertTrue($mock->hasQueryStringAliasForSearch());
109+
}
110+
}

0 commit comments

Comments
 (0)