Skip to content
Open
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
18 changes: 18 additions & 0 deletions src/Column/ColumnText.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php declare(strict_types = 1);

namespace ADT\Datagrid\Column;

use ADT\Datagrid\Component\DataGrid;
use Contributte\Datagrid\Column\ColumnText as BaseColumnText;
use Contributte\Datagrid\Filter\Filter;
use Contributte\Datagrid\Filter\FilterSelect;

class ColumnText extends BaseColumnText
{
public function setFilterBoolean(?string $column = null, ?bool $nullable = null): FilterSelect|Filter
{
assert($this->grid instanceof DataGrid);

return $this->grid->addFilterBoolean($this->key, $this->name, $column ?? $this->column, $nullable);
}
}
110 changes: 110 additions & 0 deletions src/Component/DataGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use ADT\DoctrineComponents\QueryObject\QueryObject;
use ADT\DoctrineComponents\QueryObject\QueryObjectByMode;
use ADT\Forms\BootstrapFormRenderer;
use ADT\Datagrid\Column\ColumnText;
use ADT\Datagrid\Filter\FilterSwitcher;
use ADT\QueryObjectDataSource\QueryObjectDataSource;
use ADT\Utils\Utils;
Expand All @@ -24,17 +25,22 @@
use Contributte\Datagrid\Filter\FilterMultiSelect;
use Contributte\Datagrid\Filter\FilterSelect;
use Contributte\Datagrid\Utils\ArraysHelper;
use Contributte\Datagrid\Utils\PropertyAccessHelper;
use DateTimeInterface;
use Nette;
use Nette\Application\Responses\FileResponse;
use Nette\Application\UI\Form;
use Nette\Bridges\ApplicationLatte\Template;
use Nette\Utils\DateTime;
use Nette\Utils\Json;
use ReflectionClass;

class DataGrid extends \Contributte\Datagrid\Datagrid
{
const string SELECTED_GRID_FILTER_KEY = 'advancedFilterId';

private const string FILTER_BOOLEAN_NULL = 'null';

public const string TEMPLATE_DEFAULT = 'DataGrid.latte';

public const array ACTION_NOT_DROPDOWN_ITEM = [
Expand Down Expand Up @@ -262,6 +268,110 @@ public function addColumnNumber(string $key, string $name, ?string $column = nul
return parent::addColumnNumber($key, $name, $column)->setAlign('left');
}

public function addColumnText(string $key, string $name, ?string $column = null): ColumnText
{
$column ??= $key;

$columnText = new ColumnText($this, $key, $column, $name);
$this->addColumn($key, $columnText);

return $columnText;
}

public function addColumnBoolean(string $key, string $name, ?string $column = null, string $filter = 'boolIcon'): ColumnText
{
$column ??= $key;

$columnText = $this->addColumnText($key, $name, $column);
$columnText
->setRenderer(function ($item) use ($column, $filter): string {
$template = $this->getTemplate();
assert($template instanceof Template);

return $template->getLatte()->invokeFilter($filter, [$this->resolveBoolValue($item, $column)]);
})
->setTemplateEscaping(false);

return $columnText;
}

private function resolveBoolValue(object $item, string $column): ?bool
{
$value = $item;
foreach (explode('.', $column) as $property) {
if (!is_object($value)) {
return null;
}
$value = PropertyAccessHelper::getValue($value, $property);
}

return $value === null ? null : (bool) $value;
}

public function addFilterBoolean(string $key, string $name, ?string $column = null, ?bool $nullable = null): FilterSelect|Filter
{
$column ??= $key;

$options = $this->getBooleanOptions();
if ($nullable ?? $this->isColumnNullable($column)) {
$options[self::FILTER_BOOLEAN_NULL] = $this->getTranslator()->translate('ublaboo_datagrid.not_set');
}

return $this->addFilterSelect($key, $name, $options, $column)
->setPrompt($this->getTranslator()->translate('ublaboo_datagrid.all'))
->setCondition(function (QueryObject $query, $value) use ($column) {
if ($value === '' || $value === null) {
return;
}

if ($value === self::FILTER_BOOLEAN_NULL) {
$query->by($column, null);
return;
}

$query->by($column, (bool) $value);
});
}

/**
* @return array<int, string>
*/
private function getBooleanOptions(): array
{
return [
1 => $this->getTranslator()->translate('ublaboo_datagrid.yes'),
0 => $this->getTranslator()->translate('ublaboo_datagrid.no'),
];
}

private function isColumnNullable(string $column): bool
{
if (str_contains($column, '.')) {
return false;
}

$dataSource = $this->getDataSource();
if (!$dataSource instanceof QueryObjectDataSource) {
return false;
}

$entityClass = $dataSource->getQueryObject()->getEntityClass();
$metadata = $this->em->getClassMetadata($entityClass);

if ($metadata->hasField($column)) {
return $metadata->isNullable($column);
}

$getter = 'get' . ucfirst($column);
$reflection = new ReflectionClass($entityClass);
if ($reflection->hasMethod($getter)) {
$returnType = $reflection->getMethod($getter)->getReturnType();
return $returnType !== null && $returnType->allowsNull();
}

return false;
}

public function addFilterSelectMonth(string $key, string $name): FilterSelect|Filter
{
return $this->addFilterSelect($key, $name, [
Expand Down
1 change: 1 addition & 0 deletions src/lang/ublaboo_datagrid.cs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ delete.confirm: "Opravdu smazat?"
delete.label: Smazat
yes: "Ano"
no: "Ne"
not_set: "Nevyplněno"
advanced_search.submit: Filtrovat
advanced_search.required_filter: "Zadejte alespoň 1 filtr."
advanced_search.save: Uložit
Expand Down
1 change: 1 addition & 0 deletions src/lang/ublaboo_datagrid.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ delete.confirm: "Do you really want to delete this item?"
delete.label: Delete
yes: "Yes"
no: "No"
not_set: "Not set"
advanced_search.submit: Filter
advanced_search.required_filter: "Please enter at least 1 filter."
advanced_search.save: Save
Expand Down