Skip to content

Commit

Permalink
Add customisation for QueryString specific to Filters (#2011)
Browse files Browse the repository at this point in the history
* Add customisation for QueryString specific to Filters

* Move all QueryString Filter Code to HasQueryStringForFilter


---------

Co-authored-by: lrljoe <lrljoe@users.noreply.github.com>
  • Loading branch information
lrljoe and lrljoe authored Oct 25, 2024
1 parent 2cd0344 commit 124bac1
Show file tree
Hide file tree
Showing 6 changed files with 305 additions and 50 deletions.
38 changes: 1 addition & 37 deletions docs/datatable/available-methods.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,43 +76,7 @@ public function configure(): void

## Query String

The query string is **enabled by default**, but if you ever needed to toggle it you can use the following methods:

### setQueryStringStatus

Enable/disable the query string.

```php
public function configure(): void
{
$this->setQueryStringStatus(true);
$this->setQueryStringStatus(false);
}
```

### setQueryStringEnabled

Enable the query string.

```php
public function configure(): void
{
// Shorthand for $this->setQueryStringStatus(true)
$this->setQueryStringEnabled();
}
```

### setQueryStringDisabled

Disable the query string.

```php
public function configure(): void
{
// Shorthand for $this->setQueryStringStatus(false)
$this->setQueryStringDisabled();
}
```
The documentation for Query String now lives: [here](./query-string)

## Relationships

Expand Down
105 changes: 105 additions & 0 deletions docs/datatable/query-string.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
---
title: Query String
weight: 5
---

The query string is **enabled by default**, but if you ever needed to toggle it you can use the following methods:

## Global
### setQueryStringStatus

Enable/disable the query string.

```php
public function configure(): void
{
$this->setQueryStringStatus(true);
$this->setQueryStringStatus(false);
}
```

### setQueryStringEnabled

Enable the query string.

```php
public function configure(): void
{
// Shorthand for $this->setQueryStringStatus(true)
$this->setQueryStringEnabled();
}
```

### setQueryStringDisabled

Disable the query string.

```php
public function configure(): void
{
// Shorthand for $this->setQueryStringStatus(false)
$this->setQueryStringDisabled();
}
```

### setQueryStringAlias

Change the Alias in the URL, otherwise defaults to "$tablename"

```php
public function configure(): void
{
$this->setQueryStringAlias('table1');
}
```

## Filters

The filter query string is **enabled by default**, but if you ever needed to toggle it you can use the following methods:

### setQueryStringStatusForFilter

Enable/disable the query string for the filters

```php
public function configure(): void
{
$this->setQueryStringStatusForFilter(true);
$this->setQueryStringStatusForFilter(false);
}
```

### setQueryStringForFilterEnabled

Enable the query string for the filters

```php
public function configure(): void
{
// Shorthand for $this->setQueryStringStatusForFilter(true)
$this->setQueryStringForFilterEnabled();
}
```

### setQueryStringForFilterDisabled

Disable the query string for the filters

```php
public function configure(): void
{
// Shorthand for $this->setQueryStringStatusForFilter(false)
$this->setQueryStringForFilterDisabled();
}
```

### setQueryStringAliasForFilter

Change the Alias in the URL for the filter, otherwise defaults to "$tablename-filters"

```php
public function configure(): void
{
$this->setQueryStringAliasForFilter('filtervalues');
}
```
2 changes: 1 addition & 1 deletion docs/datatable/styling.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Styling
weight: 5
weight: 6
---

The package offers significant opportunities to customise the look & feel of the core table, as well as other elements (which are documented in the relevant sections).
Expand Down
87 changes: 87 additions & 0 deletions src/Traits/Core/QueryStrings/HasQueryStringForFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

namespace Rappasoft\LaravelLivewireTables\Traits\Core\QueryStrings;

use Livewire\Attributes\Locked;

trait HasQueryStringForFilter
{
#[Locked]
public ?bool $queryStringStatusForFilter;

protected ?string $queryStringAliasForFilter;

protected function queryStringHasQueryStringForFilter(): array
{
if ($this->queryStringForFilterIsEnabled()) {
return [
'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
{
if (! $this->hasQueryStringStatusForFilter()) {
$this->setQueryStringForFilterEnabled();
}
}

public function hasQueryStringStatusForFilter(): bool
{
return isset($this->queryStringStatusForFilter);
}

public function getQueryStringStatusForFilter(): bool
{
return $this->queryStringStatusForFilter ?? true;
}

public function queryStringForFilterIsEnabled(): bool
{
$this->setupQueryStringStatusForFilter();

return ($this->queryStringIsEnabled() === true || $this->getQueryStringStatusForFilter() === true) && $this->filtersAreEnabled();
}

public function setQueryStringStatusForFilter(bool $status): self
{
$this->queryStringStatusForFilter = $status;

return $this;
}

public function setQueryStringForFilterEnabled(): self
{
$this->setQueryStringStatusForFilter(true);

return $this;
}

public function setQueryStringForFilterDisabled(): self
{
$this->setQueryStringStatusForFilter(false);

return $this;
}

public function hasQueryStringAliasForFilter(): bool
{
return isset($this->queryStringAliasForFilter);
}

public function getQueryStringAliasForFilter(): string
{
return $this->queryStringAliasForFilter ?? $this->getQueryStringAlias().'-filters';
}

public function setQueryStringAliasForFilter(string $alias): self
{
$this->queryStringAliasForFilter = $alias;

return $this;
}
}
14 changes: 2 additions & 12 deletions src/Traits/WithFilters.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
use Livewire\Attributes\Locked;
use Rappasoft\LaravelLivewireTables\Events\FilterApplied;
use Rappasoft\LaravelLivewireTables\Traits\Configuration\FilterConfiguration;
use Rappasoft\LaravelLivewireTables\Traits\Core\QueryStrings\HasQueryStringForFilter;
use Rappasoft\LaravelLivewireTables\Traits\Helpers\FilterHelpers;

trait WithFilters
{
use FilterConfiguration,
FilterHelpers;
use HasQueryStringForFilter;

#[Locked]
public bool $filtersStatus = true;
Expand Down Expand Up @@ -47,18 +49,6 @@ public function filters(): array
return [];
}

protected function queryStringWithFilters(): array
{
if ($this->queryStringIsEnabled() && $this->filtersAreEnabled()) {
return [
'appliedFilters' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAlias().'-filters'],
'filterComponents' => ['except' => null, 'history' => false, 'keep' => false, 'as' => $this->getQueryStringAlias().'-filters'],
];
}

return [];
}

public function applyFilters(): Builder
{
if ($this->filtersAreEnabled() && $this->hasFilters() && $this->hasAppliedFiltersWithValues()) {
Expand Down
109 changes: 109 additions & 0 deletions tests/Traits/Core/QueryStrings/QueryStringForFiltersTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
<?php

namespace Rappasoft\LaravelLivewireTables\Tests\Traits\Core\QueryStrings;

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Depends;
use Rappasoft\LaravelLivewireTables\Tests\Http\Livewire\PetsTable;
use Rappasoft\LaravelLivewireTables\Tests\TestCase;

final class QueryStringForFiltersTest extends TestCase
{
public function test_can_get_default_filter_query_string_status(): void
{
$mock = new class extends PetsTable
{
public ?array $testAttributesArray;

public function configure(): void
{
$this->setDataTableFingerprint('test');
}
};

$mock->configure();
$mock->boot();

$this->assertSame(true, $mock->getQueryStringStatusForFilter());
}

public function test_can_disable_filter_query_string_status(): void
{
$mock = new class extends PetsTable
{
public ?array $testAttributesArray;

public function configure(): void
{
$this->setDataTableFingerprint('test');
$this->setQueryStringForFilterDisabled();
}
};

$mock->configure();
$mock->boot();

$this->assertSame(false, $mock->getQueryStringStatusForFilter());
}

public function test_can_enable_filter_query_string_status(): void
{
$mock = new class extends PetsTable
{
public ?array $testAttributesArray;

public function configure(): void
{
$this->setDataTableFingerprint('test');
$this->setQueryStringForFilterDisabled();
}
};

$mock->configure();
$mock->boot();

$this->assertSame(false, $mock->getQueryStringStatusForFilter());
$mock->setQueryStringForFilterEnabled();
$this->assertSame(true, $mock->getQueryStringStatusForFilter());

}

public function test_can_get_default_filter_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-filters', $mock->getQueryStringAliasForFilter());

}

public function test_can_change_default_filter_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-filters', $mock->getQueryStringAliasForFilter());
$mock->setQueryStringAliasForFilter('pet-filters');
$this->assertSame('pet-filters', $mock->getQueryStringAliasForFilter());
}
}

0 comments on commit 124bac1

Please sign in to comment.