Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/Component/BaseGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -313,8 +313,9 @@ protected function addIsActive(DataGrid $grid): void
$order[] = 'isActive';
}

$grid->addColumnText('isActive', 'app.forms.global.isActive');
$grid->addColumnText('isActive', 'app.forms.global.isActive.label');
$grid->setColumnsOrder($order);
$grid->addIsActiveSwitcher();
}

/**
Expand Down
14 changes: 9 additions & 5 deletions src/Component/DataGrid.latte
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,14 @@
</div>

<span class="datagrid-exports" n:if="$exports" n:snippet="exports" n:block="exports">
{foreach $exports as $export}
{$export->setClass('btn noajax')->render()}
{/foreach}
</span>
{foreach $exports as $export}
{$export->setClass('btn noajax')->render()}
{/foreach}
</span>
<span class="datagrid-exports d-flex align-items-center" n:ifset="$filters['isActive']" n:snippet="isActive" n:block="isActive">
{var $form = $control['filter']}
{include $filters['isActive']->getTemplate(), filter => $filters['isActive'], input => $form['filter'][$filters['isActive']->getKey()], outer => TRUE}
</span>
</div>
</div>

Expand All @@ -131,7 +135,7 @@
{var $i = 0}
{var $filter_columns_class = 'col-sm-' . (12 / $control->getOuterFilterColumnsCount())}
{foreach $filters as $filterName => $f}
{continueIf $filterName === 'search'}
{continueIf in_array($filterName, ['search', 'isActive'])}
{**
* Each fitler is rendered separately in its own template
*}
Expand Down
74 changes: 65 additions & 9 deletions src/Component/DataGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,15 @@
use ADT\Datagrid\Model\Entities\GridExport;
use ADT\Datagrid\Model\Export\Excel\ExportExcel;
use ADT\Datagrid\Model\Queries\GridFilterQueryFactory;
use ADT\Datagrid\Model\Service\DatagridService;
use ADT\DoctrineComponents\EntityManager;
use ADT\DoctrineComponents\QueryObject\Filters\IsActiveFilter;
use ADT\DoctrineComponents\QueryObject\QueryObject;
use ADT\DoctrineComponents\QueryObject\QueryObjectByMode;
use ADT\Forms\BootstrapFormRenderer;
use ADT\Datagrid\Filter\FilterSwitcher;
use ADT\QueryObjectDataSource\QueryObjectDataSource;
use ADT\Datagrid\Model\Service\DatagridService;
use ADT\Utils\Utils;
use DateTimeInterface;
use Nette;
use Nette\Application\Responses\FileResponse;
use Nette\Application\UI\Form;
use Nette\Utils\DateTime;
use Nette\Utils\Json;
use Contributte\Datagrid\Column\ColumnDateTime;
use Contributte\Datagrid\Column\ColumnNumber;
use Contributte\Datagrid\Exception\DataGridException;
Expand All @@ -29,6 +25,12 @@
use Contributte\Datagrid\Filter\FilterMultiSelect;
use Contributte\Datagrid\Filter\FilterSelect;
use Contributte\Datagrid\Utils\ArraysHelper;
use DateTimeInterface;
use Nette;
use Nette\Application\Responses\FileResponse;
use Nette\Application\UI\Form;
use Nette\Utils\DateTime;
use Nette\Utils\Json;

class DataGrid extends \Contributte\Datagrid\Datagrid
{
Expand All @@ -53,6 +55,7 @@ class DataGrid extends \Contributte\Datagrid\Datagrid
protected bool $rememberState = false;
protected string $gridName;
protected string $email;
private bool $isActiveValue = true;

public function getSessionData(?string $key = null, mixed $defaultValue = null): array
{
Expand Down Expand Up @@ -126,6 +129,7 @@ public function render(): void
$this->template->gridHtmlDataAttributes = $this->htmlDataAttributes;
$this->template->showTableFoot = $this->showTableFoot;
$this->template->toolbarButons = $this->toolbarButtons;
$this->template->isActiveValue = $this->isActiveValue;
$this->template->gridFilters = $this->gridFilterQueryFactory->create()->byGrid($this->gridName)->fetch();

parent::render();
Expand Down Expand Up @@ -323,10 +327,60 @@ public function addExportExcel(
return $export;
}

/**
* @throws DataGridException
*/
public function addIsActiveSwitcher(): void
{
$postRequest = $this->getPresenter()->getRequest()->getPost('filter');
$isActive = $this->addFilterSwitcher('isActive', 'app.forms.global.isActive.label', 'isActive')
->setValue(true)
->addAttribute('title', $this->translator->translate('app.forms.global.isActive.title'));

if (
(isset($this->params['filter']['isActive']) && $this->params['filter']['isActive'] === 'true')
|| (isset($postRequest['isActive']) && $postRequest['isActive'] === '1')
) {
$isActive
->setValue(true)
->setDefaultValue(true)
->addAttribute('checked', 'checked');
}
elseif (
(isset($this->params['filter']['isActive']) && $this->params['filter']['isActive'] === 'false')
|| (isset($postRequest['isActive']) && $postRequest['isActive'] === '0')
) {
$isActive->setCondition(function (IsActiveFilter $query) {
$query->disableIsActiveFilter();
});
$this->isActiveValue = false;
}
}

/**
* @throws DatagridException
*/
public function addFilterSwitcher(
string $key,
string $name,
?string $column = null
): FilterSwitcher
{
$column ??= $key;

$this->addFilterCheck($key);

return $this->filters[$key] = new FilterSwitcher($this, $key, $name, $column);
}

public function isFilterActive(?string $filter = null): bool
{
$filters = $filter ? [$filter => ($this->filter[$filter] ?? null)] : $this->filter;

if (isset($filters['isActive']) && $filters['isActive'] === 'false') {
$filters['isActive'] = null;
}

$is_filter = ArraysHelper::testTruthy($filters);

return $is_filter || $this->forceFilterActive;
Expand All @@ -335,8 +389,10 @@ public function isFilterActive(?string $filter = null): bool
public function handleResetAdvancedFilter(): void
{
$searchFilter = $this->filter['search'] ?? null;
$isActive = $this->filter['isActive'] ?? null;
$this->handleResetFilter();
if ($searchFilter) {
$this->filter['isActive'] = $isActive;
$this->filter['search'] = $searchFilter;
}
}
Expand Down Expand Up @@ -519,13 +575,13 @@ public function setEntityManager(EntityManager $em): static
$this->em = $em;
return $this;
}

public function setEmail(string $email): static
{
$this->email = $email;
return $this;
}

public function setGridName(string $gridName): static
{
$this->gridName = $gridName;
Expand Down
5 changes: 5 additions & 0 deletions src/Component/datagrid_filter_checkbox.latte
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{**
* @param Filter $filter
* @param Nette\Forms\Controls\TextInput $input
*}
{formPair $input}
9 changes: 9 additions & 0 deletions src/Component/datagrid_filter_switcher.latte
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{**
* @param Filter $filter
* @param Nette\Forms\Controls\TextInput $input
*}
<div class="form-check form-switch">
{php $input->setValue($isActiveValue)} {* TODO *}
<input n:name="$input" type="hidden" value="0" />
<input n:name="$input" value="1" />
</div>
94 changes: 94 additions & 0 deletions src/Filter/FilterCheckbox.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php declare(strict_types = 1);

namespace ADT\Datagrid\Filter;

use Contributte\Datagrid\Datagrid;
use Contributte\Datagrid\Filter\Filter;
use Contributte\Datagrid\Filter\FilterText;
use Nette\Application\UI\Form;
use Nette\Forms\Container;
use Nette\Forms\Controls\BaseControl;
use UnexpectedValueException;

class FilterCheckbox extends Filter
{

protected array $attributes = [
'class' => ['form-check-input'],
];

protected ?string $template = 'datagrid_filter_checkbox.latte';

protected ?string $type = 'checkbox';

protected bool $defaultValue = false;

protected string $column;

public function __construct(
Datagrid $grid,
string $key,
string $name,
string $column
)
{
$this->column = $column;
parent::__construct($grid, $key, $name);
}

public function addToFormContainer(Container $container): void
{
$form = $container->lookup(Form::class);

if (!$form instanceof Form) {
throw new UnexpectedValueException();
}

$translator = $form->getTranslator();

if ($translator === null) {
throw new UnexpectedValueException();
}

$this->addControl($container, $this->key, $this->name);
}

public function getValue(): mixed
{
if (isset($this->value) && $this->value === 'false') {
return null;
}

return filter_var($this->value, FILTER_VALIDATE_BOOLEAN);
}

protected function addControl(
Container $container,
string $key,
string $name
): BaseControl
{
$input = $container->addCheckbox($key, $name)
->setHtmlAttribute('data-autosubmit-change', true);
$this->addAttributes($input);

return $input;
}

public function setValueSet(bool $valueSet): self
{
$this->valueSet = $valueSet;
return $this;
}

public function setDefaultValue(bool $defaultValue): self
{
$this->defaultValue = $defaultValue;
return $this;
}

public function getCondition(): array
{
return array_fill_keys((array)$this->column, $this->getValue());
}
}
26 changes: 26 additions & 0 deletions src/Filter/FilterSwitcher.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php declare(strict_types = 1);

namespace ADT\Datagrid\Filter;

use Nette\Forms\Container;
use Nette\Forms\Controls\BaseControl;

class FilterSwitcher extends FilterCheckbox
{
protected ?string $template = 'datagrid_filter_switcher.latte';

protected function addControl(
Container $container,
string $key,
string $name
): BaseControl
{
$input = parent::addControl($container, $key, $name);

$input
->setHtmlAttribute('type', 'checkbox')
->setHtmlAttribute('role', 'switch');

return $input;
}
}