diff --git a/src/Component/BaseGrid.php b/src/Component/BaseGrid.php index 4e45d52..cdd7567 100755 --- a/src/Component/BaseGrid.php +++ b/src/Component/BaseGrid.php @@ -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(); } /** diff --git a/src/Component/DataGrid.latte b/src/Component/DataGrid.latte index fa9277d..6bb0900 100644 --- a/src/Component/DataGrid.latte +++ b/src/Component/DataGrid.latte @@ -111,10 +111,14 @@ - {foreach $exports as $export} - {$export->setClass('btn noajax')->render()} - {/foreach} - + {foreach $exports as $export} + {$export->setClass('btn noajax')->render()} + {/foreach} + + + {var $form = $control['filter']} + {include $filters['isActive']->getTemplate(), filter => $filters['isActive'], input => $form['filter'][$filters['isActive']->getKey()], outer => TRUE} + @@ -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 *} diff --git a/src/Component/DataGrid.php b/src/Component/DataGrid.php index 569f746..e5af12e 100644 --- a/src/Component/DataGrid.php +++ b/src/Component/DataGrid.php @@ -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; @@ -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 { @@ -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 { @@ -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(); @@ -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; @@ -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; } } @@ -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; diff --git a/src/Component/datagrid_filter_checkbox.latte b/src/Component/datagrid_filter_checkbox.latte new file mode 100644 index 0000000..9606902 --- /dev/null +++ b/src/Component/datagrid_filter_checkbox.latte @@ -0,0 +1,5 @@ +{** + * @param Filter $filter + * @param Nette\Forms\Controls\TextInput $input + *} +{formPair $input} \ No newline at end of file diff --git a/src/Component/datagrid_filter_switcher.latte b/src/Component/datagrid_filter_switcher.latte new file mode 100644 index 0000000..8b52da2 --- /dev/null +++ b/src/Component/datagrid_filter_switcher.latte @@ -0,0 +1,9 @@ +{** + * @param Filter $filter + * @param Nette\Forms\Controls\TextInput $input + *} +
+ {php $input->setValue($isActiveValue)} {* TODO *} + + +
\ No newline at end of file diff --git a/src/Filter/FilterCheckbox.php b/src/Filter/FilterCheckbox.php new file mode 100644 index 0000000..0003db9 --- /dev/null +++ b/src/Filter/FilterCheckbox.php @@ -0,0 +1,94 @@ + ['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()); + } +} diff --git a/src/Filter/FilterSwitcher.php b/src/Filter/FilterSwitcher.php new file mode 100644 index 0000000..4b7b9cf --- /dev/null +++ b/src/Filter/FilterSwitcher.php @@ -0,0 +1,26 @@ +setHtmlAttribute('type', 'checkbox') + ->setHtmlAttribute('role', 'switch'); + + return $input; + } +}