Skip to content

Commit

Permalink
Fixed appending array to paginator (#84)
Browse files Browse the repository at this point in the history
* Fixed error when appending array data to table with the `appendData` method
  * Data is now appended with hidden input to rows-number-definition-form and to search-form from the table `getGeneratedHiddenFields` method which is now returning html and not an array as before
  * You may have to update your `rows-number-definition.blade.php` and `rows-searching.blade.php` view if you have published them
  • Loading branch information
Okipa authored Mar 1, 2022
1 parent 36b1464 commit b496539
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 59 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## [4.0.5](https://github.com/Okipa/laravel-table/compare/4.0.4...4.0.5)

2022-03-01

* Fixed error when appending array data to table with the `appendData` method
* Data is now appended with hidden input to rows-number-definition-form and to search-form from the table `getGeneratedHiddenFields` method which is now returning html and not an array as before
* You may have to update your `rows-number-definition.blade.php` and `rows-searching.blade.php` view if you have published them

## [4.0.4](https://github.com/Okipa/laravel-table/compare/4.0.3...4.0.4)

2021-08-17
Expand Down
4 changes: 1 addition & 3 deletions resources/views/bootstrap/rows-number-definition.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
<input type="hidden" name="{{ $table->getSearchField() }}" value="{{ $table->getRequest()->get($table->getSearchField()) }}">
<input type="hidden" name="{{ $table->getSortByField() }}" value="{{ $table->getRequest()->get($table->getSortByField()) }}">
<input type="hidden" name="{{ $table->getSortDirField() }}" value="{{ $table->getRequest()->get($table->getSortDirField()) }}">
@foreach($table->getGeneratedHiddenFields() as $appendedKey => $appendedValue)
<input type="hidden" name="{{ $appendedKey }}" value="{{ $appendedValue }}">
@endforeach
{!! $table->getGeneratedHiddenFields() !!}}
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text text-secondary">
Expand Down
4 changes: 1 addition & 3 deletions resources/views/bootstrap/rows-searching.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
<input type="hidden" name="{{ $table->getRowsNumberField() }}" value="{{ $table->getRequest()->get($table->getRowsNumberField()) }}">
<input type="hidden" name="{{ $table->getSortByField() }}" value="{{ $table->getRequest()->get($table->getSortByField()) }}">
<input type="hidden" name="{{ $table->getSortDirField() }}" value="{{ $table->getRequest()->get($table->getSortDirField()) }}">
@foreach($table->getGeneratedHiddenFields() as $appendedKey => $appendedValue)
<input type="hidden" name="{{ $appendedKey }}" value="{{ $appendedValue }}">
@endforeach
{!! $table->getGeneratedHiddenFields() !!}}
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text text-secondary">
Expand Down
55 changes: 38 additions & 17 deletions src/Traits/Table/HasPagination.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,42 @@ trait HasPagination

protected array $appendedToPaginator = [];

protected array $generatedHiddenFields = [];
protected string $generatedHiddenFields = '';

public function appendData(array $appendedToPaginator): Table
{
$appendedToPaginator = array_filter($appendedToPaginator);
$this->appendedToPaginator = $appendedToPaginator;
// Todo: remove `generatedHiddenFields` management in a future major version,
// which is a duplicate of `appendedToPaginator`.
$this->generatedHiddenFields = $appendedToPaginator;
$this->generatedHiddenFields = $this->generateHiddenInputsFromArray($appendedToPaginator);

/** @var \Okipa\LaravelTable\Table $this */
return $this;
}

public function getGeneratedHiddenFields(): array
protected function generateHiddenInputsFromArray(array $data = [], $namePrefix = ''): string
{
if (! $data) {
return '';
}
$html = '';
$namePrefix = trim($namePrefix);
foreach ($data as $key => $value) {
$keyEsc = htmlentities($key);
if ($namePrefix !== '') {
$keyEsc = $namePrefix . "[{$keyEsc}]";
}
if (is_array($value)) {
$html .= $this->generateHiddenInputsFromArray($value, $keyEsc);
} else {
$valueEsc = htmlentities($value);
$html .= "<input type=\"hidden\" name=\"{$keyEsc}\" value=\"{$valueEsc}\">" . PHP_EOL;
}
}

return $html;
}

public function getGeneratedHiddenFields(): string
{
return $this->generatedHiddenFields;
}
Expand All @@ -50,6 +71,18 @@ public function getPaginator(): LengthAwarePaginator

abstract public function getDestroyConfirmationClosure(): ?Closure;

abstract public function getRowsNumberField(): string;

abstract public function getSearchField(): string;

abstract public function getSortByField(): string;

abstract public function getSortByValue(): ?string;

abstract public function getSortDirField(): string;

abstract public function getSortDirValue(): ?string;

protected function paginateFromQuery(Builder $query): void
{
/** @var int|null $perPage */
Expand All @@ -65,18 +98,6 @@ protected function paginateFromQuery(Builder $query): void

abstract public function getRowsNumberValue(): ?int;

abstract public function getRowsNumberField(): string;

abstract public function getSearchField(): string;

abstract public function getSortByField(): string;

abstract public function getSortByValue(): ?string;

abstract public function getSortDirField(): string;

abstract public function getSortDirValue(): ?string;

public function getAppendedToPaginator(): array
{
return $this->appendedToPaginator;
Expand Down
45 changes: 9 additions & 36 deletions tests/Unit/PaginationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,48 +4,21 @@

use Okipa\LaravelTable\Table;
use Okipa\LaravelTable\Test\LaravelTableTestCase;
use Okipa\LaravelTable\Test\Models\User;

class PaginationTest extends LaravelTableTestCase
{
public function testAppendData(): void
{
$appended = ['foo' => 'bar', 'baz' => 'qux', 'quux_corge' => 'grault garply', 'waldo'];
$appended = [
'foo' => 'bar',
'baz' => [
'qux',
'quux' => 'corge',
'grault',
],
7 => 'garply',
];
$table = (new Table())->appendData($appended);
self::assertEquals($table->getAppendedToPaginator(), $appended);
self::assertEquals($table->getGeneratedHiddenFields(), $appended);
}

public function testAppendDataHtml(): void
{
$this->routes(['users'], ['index']);
$appended = ['foo' => 'bar', 'baz' => 'qux', 'quux_corge' => 'grault garply', 'waldo'];
$table = (new Table())->routes(['index' => ['name' => 'users.index']])
->model(User::class)
->appendData($appended);
$table->column('name')->title('Name')->searchable();
$table->configure();
$rowsNumberDefinitionHtml = view(
'laravel-table::' . $table->getrowsNumberDefinitionTemplatePath(),
compact('table')
)->toHtml();
self::assertStringContainsString('<input type="hidden" name="foo" value="bar">', $rowsNumberDefinitionHtml);
self::assertStringContainsString('<input type="hidden" name="baz" value="qux">', $rowsNumberDefinitionHtml);
self::assertStringContainsString(
'<input type="hidden" name="quux_corge" value="grault garply">',
$rowsNumberDefinitionHtml
);
self::assertStringContainsString('<input type="hidden" name="0" value="waldo">', $rowsNumberDefinitionHtml);
$rowsSearchingHtml = view(
'laravel-table::' . $table->getRowsSearchingTemplatePath(),
compact('table')
)->toHtml();
self::assertStringContainsString('<input type="hidden" name="foo" value="bar">', $rowsSearchingHtml);
self::assertStringContainsString('<input type="hidden" name="baz" value="qux">', $rowsSearchingHtml);
self::assertStringContainsString(
'<input type="hidden" name="quux_corge" value="grault garply">',
$rowsSearchingHtml
);
self::assertStringContainsString('<input type="hidden" name="0" value="waldo">', $rowsSearchingHtml);
}
}
28 changes: 28 additions & 0 deletions tests/Unit/RowsNumberTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -156,4 +156,32 @@ public function testSetUnlimitedRowsNumberHtml(): void
self::assertStringContainsString($user->email, $html);
}
}

public function testGenerateHiddenFieldsOnRowsNumberFormHtml(): void
{
$this->routes(['users'], ['index']);
$appended = [
'foo' => 'bar',
'baz' => [
'qux',
'quux' => 'corge',
'grault'
],
7 => 'garply',
];
$table = (new Table())->routes(['index' => ['name' => 'users.index']])
->model(User::class)
->appendData($appended);
$table->column('name')->title('Name')->searchable();
$table->configure();
$rowsNumberHtml = view(
'laravel-table::' . $table->getRowsNumberDefinitionTemplatePath(),
compact('table')
)->toHtml();
self::assertStringContainsString('<input type="hidden" name="foo" value="bar">', $rowsNumberHtml);
self::assertStringContainsString('<input type="hidden" name="baz[0]" value="qux">', $rowsNumberHtml);
self::assertStringContainsString('<input type="hidden" name="baz[quux]" value="corge">', $rowsNumberHtml);
self::assertStringContainsString('<input type="hidden" name="baz[1]" value="grault">', $rowsNumberHtml);
self::assertStringContainsString('<input type="hidden" name="7" value="garply">', $rowsNumberHtml);
}
}
25 changes: 25 additions & 0 deletions tests/Unit/SearchTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -494,4 +494,29 @@ public function testJsonFieldCaseInsensitiveHtml(): void
$table->configure();
self::assertTrue($user->is($table->getPaginator()->getCollection()->first()));
}

public function testGenerateHiddenFieldsOnSearchFormHtml(): void
{
$this->routes(['users'], ['index']);
$appended = [
'foo' => 'bar',
'baz' => [
'qux',
'quux' => 'corge',
'grault',
],
7 => 'garply',
];
$table = (new Table())->routes(['index' => ['name' => 'users.index']])
->model(User::class)
->appendData($appended);
$table->column('name')->title('Name')->searchable();
$table->configure();
$searchHtml = view('laravel-table::' . $table->getRowsSearchingTemplatePath(), compact('table'))->toHtml();
self::assertStringContainsString('<input type="hidden" name="foo" value="bar">', $searchHtml);
self::assertStringContainsString('<input type="hidden" name="baz[0]" value="qux">', $searchHtml);
self::assertStringContainsString('<input type="hidden" name="baz[quux]" value="corge">', $searchHtml);
self::assertStringContainsString('<input type="hidden" name="baz[1]" value="grault">', $searchHtml);
self::assertStringContainsString('<input type="hidden" name="7" value="garply">', $searchHtml);
}
}

0 comments on commit b496539

Please sign in to comment.