Skip to content

Commit 3271df3

Browse files
authored
Add QueryStringForSort
1 parent 351757e commit 3271df3

File tree

4 files changed

+240
-11
lines changed

4 files changed

+240
-11
lines changed

docs/datatable/query-string.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,55 @@ public function configure(): void
153153
{
154154
$this->setQueryStringAliasForSearch('search');
155155
}
156+
```
157+
158+
## Sorts
159+
160+
The sorts query string is **enabled by default**, but if you ever needed to toggle it you can use the following methods:
161+
162+
### setQueryStringStatusForSort
163+
164+
Enable/disable the query string for sort
165+
166+
```php
167+
public function configure(): void
168+
{
169+
$this->setQueryStringStatusForSort(true);
170+
$this->setQueryStringStatusForSort(false);
171+
}
172+
```
173+
174+
### setQueryStringForSortEnabled
175+
176+
Enable the query string for sort
177+
178+
```php
179+
public function configure(): void
180+
{
181+
// Shorthand for $this->setQueryStringStatusForSort(true)
182+
$this->setQueryStringForSortEnabled();
183+
}
184+
```
185+
186+
### setQueryStringForSortDisabled
187+
188+
Disable the query string for sort
189+
190+
```php
191+
public function configure(): void
192+
{
193+
// Shorthand for $this->setQueryStringStatusForSort(false)
194+
$this->setQueryStringForSortDisabled();
195+
}
196+
```
197+
198+
### setQueryStringAliasForSort
199+
200+
Change the Alias in the URL for the sorts, otherwise defaults to "$tablename-sorts"
201+
202+
```php
203+
public function configure(): void
204+
{
205+
$this->setQueryStringAliasForSort('sorts');
206+
}
156207
```
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
namespace Rappasoft\LaravelLivewireTables\Traits\Core\QueryStrings;
4+
5+
use Livewire\Attributes\Locked;
6+
7+
trait HasQueryStringForSort
8+
{
9+
#[Locked]
10+
public ?bool $queryStringStatusForSort;
11+
12+
protected ?string $queryStringAliasForSort;
13+
14+
protected function queryStringHasQueryStringForSort(): array
15+
{
16+
return ($this->queryStringForSortEnabled() && $this->sortingIsEnabled()) ? ['sorts' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAliasForSort()]] : [];
17+
18+
}
19+
public function setupQueryStringStatusForSort(): void
20+
{
21+
if (! $this->hasQueryStringStatusForSort()) {
22+
$this->setQueryStringForSortEnabled();
23+
}
24+
}
25+
26+
public function hasQueryStringStatusForSort(): bool
27+
{
28+
return isset($this->queryStringStatusForSort);
29+
}
30+
31+
public function getQueryStringStatusForSort(): bool
32+
{
33+
return $this->queryStringStatusForSort ?? true;
34+
}
35+
36+
public function queryStringForSortEnabled(): bool
37+
{
38+
$this->setupQueryStringStatusForSort();
39+
40+
return $this->getQueryStringStatusForSort() && $this->sortingIsEnabled();
41+
}
42+
43+
public function setQueryStringStatusForSort(bool $status): self
44+
{
45+
$this->queryStringStatusForSort = $status;
46+
47+
return $this;
48+
}
49+
50+
public function setQueryStringForSortEnabled(): self
51+
{
52+
return $this->setQueryStringStatusForSort(true);
53+
}
54+
55+
public function setQueryStringForSortDisabled(): self
56+
{
57+
return $this->setQueryStringStatusForSort(false);
58+
}
59+
60+
public function hasQueryStringAliasForSort(): bool
61+
{
62+
return isset($this->queryStringAliasForSort);
63+
}
64+
65+
public function getQueryStringAliasForSort(): string
66+
{
67+
return $this->queryStringAliasForSort ?? $this->getQueryStringAlias().'-sorts';
68+
}
69+
70+
public function setQueryStringAliasForSort(string $alias): self
71+
{
72+
$this->queryStringAliasForSort = $alias;
73+
74+
return $this;
75+
}
76+
}

src/Traits/WithSorting.php

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
use Livewire\Attributes\Locked;
88
use Rappasoft\LaravelLivewireTables\Traits\Configuration\SortingConfiguration;
99
use Rappasoft\LaravelLivewireTables\Traits\Helpers\SortingHelpers;
10+
use Rappasoft\LaravelLivewireTables\Traits\Core\QueryStrings\HasQueryStringForSort;
1011

1112
trait WithSorting
1213
{
1314
use SortingConfiguration,
1415
SortingHelpers;
15-
16+
use HasQueryStringForSort;
17+
1618
public array $sorts = [];
1719

1820
public Collection $sortableColumns;
@@ -31,16 +33,6 @@ trait WithSorting
3133

3234
public string $defaultSortingLabelDesc = 'Z-A';
3335

34-
public function queryStringWithSorting(): array
35-
{
36-
if ($this->queryStringIsEnabled() && $this->sortingIsEnabled()) {
37-
return [
38-
'sorts' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAlias().'-sorts'],
39-
];
40-
}
41-
42-
return [];
43-
}
4436

4537
public function sortBy(string $columnSelectName): ?string
4638
{
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 QueryStringForSortTest extends TestCase
11+
{
12+
public function test_can_get_default_sort_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->getQueryStringStatusForSort());
28+
}
29+
30+
public function test_can_disable_sort_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->setQueryStringForSortDisabled();
40+
}
41+
};
42+
43+
$mock->configure();
44+
$mock->boot();
45+
46+
$this->assertSame(false, $mock->getQueryStringStatusForSort());
47+
}
48+
49+
public function test_can_enable_sort_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->setQueryStringForSortDisabled();
59+
}
60+
};
61+
62+
$mock->configure();
63+
$mock->boot();
64+
65+
$this->assertSame(false, $mock->getQueryStringStatusForSort());
66+
$mock->setQueryStringForSortEnabled();
67+
$this->assertSame(true, $mock->getQueryStringStatusForSort());
68+
69+
}
70+
71+
public function test_can_get_default_sort_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-sorts', $mock->getQueryStringAliasForSort());
87+
88+
}
89+
90+
public function test_can_change_default_sort_query_string_alias(): void
91+
{
92+
$mock = new class extends PetsTable
93+
{
94+
public ?array $testAttributesArray;
95+
96+
public function configure(): void
97+
{
98+
$this->setDataTableFingerprint('test');
99+
}
100+
};
101+
102+
$mock->configure();
103+
$mock->boot();
104+
105+
$this->assertSame('table-sorts', $mock->getQueryStringAliasForSort());
106+
$mock->setQueryStringAliasForSort('pet-sorts');
107+
$this->assertSame('pet-sorts', $mock->getQueryStringAliasForSort());
108+
$this->assertTrue($mock->hasQueryStringAliasForSort());
109+
}
110+
}

0 commit comments

Comments
 (0)