diff --git a/src/DataGrid.php b/src/DataGrid.php index 81e328da..128ddea8 100644 --- a/src/DataGrid.php +++ b/src/DataGrid.php @@ -313,6 +313,7 @@ class DataGrid extends Control /** * @var bool + * @deprecated */ protected $outerFilterRendering = false; @@ -1636,11 +1637,19 @@ public function filterSucceeded(NetteForm $form): void $this->reload(); } + /** * @return static */ public function setOuterFilterRendering(bool $outerFilterRendering = true): self { + $this->onFiltersAssembled['setOuterFilterRendering'] = function (iterable $filters) use ($outerFilterRendering) { + /** @var Filter $filter */ + foreach ($filters as $filter) { + $filter->setOuterRendering($outerFilterRendering); + } + }; + $this->outerFilterRendering = $outerFilterRendering; return $this; @@ -1649,10 +1658,28 @@ public function setOuterFilterRendering(bool $outerFilterRendering = true): self public function hasOuterFilterRendering(): bool { - return $this->outerFilterRendering; + foreach ($this->filters as $filter) { + if ($filter->hasOuterRendering()) { + return true; + } + } + + return false; } + public function hasColumnFilterRendering(): bool + { + foreach ($this->filters as $filter) { + if (!$filter->hasOuterRendering()) { + return true; + } + } + + return false; + } + + /** * @return static * @throws InvalidArgumentException diff --git a/src/Filter/Filter.php b/src/Filter/Filter.php index 18e13813..0b50c3e7 100644 --- a/src/Filter/Filter.php +++ b/src/Filter/Filter.php @@ -61,6 +61,11 @@ abstract class Filter 'class' => ['form-control', 'input-sm', 'form-control-sm'], ]; + /** + * @var bool + */ + protected $outerRendering = false; + /** * @var string|null */ @@ -192,6 +197,23 @@ public function getType(): ?string } + /** + * @return static + */ + public function setOuterRendering(bool $outerRendering = true): self + { + $this->outerRendering = $outerRendering; + + return $this; + } + + + public function hasOuterRendering(): bool + { + return $this->outerRendering; + } + + /** * @param mixed $value * @return static diff --git a/src/templates/datagrid.latte b/src/templates/datagrid.latte index 3a70f59b..e62588e2 100644 --- a/src/templates/datagrid.latte +++ b/src/templates/datagrid.latte @@ -40,6 +40,8 @@ {var $i = 0} {var $filterColumnsClass = 'col-sm-' . (12 / $control->getOuterFilterColumnsCount())}
+ {continueIf !$f->hasOuterRendering()} + {** * Each fitler is rendered separately in its own template *} @@ -138,7 +140,7 @@ - + {foreach $columns as $key => $column} @@ -196,12 +198,12 @@ {='ublaboo_datagrid.action'|translate} - + {foreach $columns as $key => $column} {var $th = $column->getElementForRender('th', $key)} {$th->startTag()|noescape} {var $col_header = 'col-filter-' . $key . '-header'} - {if !$control->hasOuterFilterRendering() && isset($filters[$key])} + {if isset($filters[$key]) && !$filters[$key]->hasOuterRendering()} {var $i = $filter['filter'][$key]} {var $filter_block = 'filter-' . $filters[$key]->getKey()} @@ -221,7 +223,7 @@ {$th->endTag()|noescape} {/foreach} - {if !$control->hasAutoSubmit() && !$control->hasOuterFilterRendering()} + {if !$control->hasAutoSubmit() && $control->hasColumnFilterRendering()} {input $filter['filter']['submit']} {/if} diff --git a/tests/Cases/FilterTest.phpt b/tests/Cases/FilterTest.phpt index 2734f997..c6a74fc8 100644 --- a/tests/Cases/FilterTest.phpt +++ b/tests/Cases/FilterTest.phpt @@ -10,6 +10,7 @@ use Nette\Application\AbortException; use Tester\Assert; use Tester\TestCase; use Ublaboo\DataGrid\DataGrid; +use Ublaboo\DataGrid\Tests\Files\TestingDataGridFactory; use Ublaboo\DataGrid\Tests\Files\TestingDataGridFactoryRouter; final class FilterTest extends TestCase @@ -27,6 +28,37 @@ final class FilterTest extends TestCase }, AbortException::class); } + public function testFilterRendering(): void + { + $factory = new TestingDataGridFactory(); + /** @var DataGrid $grid */ + $grid = $factory->createTestingDataGrid(); + + $grid->addFilterText('default', 'default'); + $grid->assembleFilters(); + Assert::false($grid->hasOuterFilterRendering()); + Assert::true($grid->hasColumnFilterRendering()); + + $grid->setOuterFilterRendering(); + $grid->assembleFilters(); + Assert::true($grid->hasOuterFilterRendering()); + Assert::false($grid->hasColumnFilterRendering()); + + $grid->removeFilter('default'); + $filters = $grid->assembleFilters(); + Assert::count(0, $filters); + + $grid->addFilterText('outerFilter', 'outerFilter') + ->setOuterRendering(); + $grid->assembleFilters(); + Assert::true($grid->hasOuterFilterRendering()); + Assert::false($grid->hasColumnFilterRendering()); + + $grid->addFilterText('columnFilter', 'columnFilter'); + Assert::true($grid->hasOuterFilterRendering()); + Assert::true($grid->hasColumnFilterRendering()); + } + } (new FilterTest)->run();