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
4 changes: 2 additions & 2 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ parameters:
count: 1
path: src/DataSource/DibiFluentMssqlDataSource.php
-
message: "#^Cannot call method filterData\\(\\) on Contributte\\\\Datagrid\\\\DataModel\\|null\\.$#"
message: "#^Cannot call method filterData\\(\\) on Contributte\\\\Datagrid\\\\AbstractDataModel\\|null\\.$#"
count: 1
path: src/Datagrid.php
-
message: "#^Cannot call method filterRow\\(\\) on Contributte\\\\Datagrid\\\\DataModel\\|null\\.$#"
message: "#^Cannot call method filterRow\\(\\) on Contributte\\\\Datagrid\\\\AbstractDataModel\\|null\\.$#"
count: 1
path: src/Datagrid.php
- # In PHP 8+, the Stringable typehint should be used, and this can be removed.
Expand Down
32 changes: 32 additions & 0 deletions src/AbstractDataModel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php declare(strict_types = 1);

namespace Contributte\Datagrid;

use Contributte\Datagrid\Components\DatagridPaginator\DatagridPaginator;
use Contributte\Datagrid\DataSource\IDataSource;
use Contributte\Datagrid\Utils\Sorting;

/**
* @method onBeforeFilter(IDataSource $dataSource)
* @method onAfterFilter(IDataSource $dataSource)
* @method onAfterPaginated(IDataSource $dataSource)
*/
abstract class AbstractDataModel
{

/** @var array|callable[] */
public array $onBeforeFilter = [];

/** @var array|callable[] */
public array $onAfterFilter = [];

/** @var array|callable[] */
public array $onAfterPaginated = [];

abstract public function getDataSource(): IDataSource;

abstract public function filterData(?DatagridPaginator $paginatorComponent, Sorting $sorting, array $filters): iterable;

abstract public function filterRow(array $condition): array;

}
4 changes: 2 additions & 2 deletions src/AggregationFunction/TDatagridAggregationFunction.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Contributte\Datagrid\AggregationFunction;

use Contributte\Datagrid\DataModel;
use Contributte\Datagrid\AbstractDataModel;
use Contributte\Datagrid\DataSource\IDataSource;
use Contributte\Datagrid\Exception\DatagridException;

Expand All @@ -27,7 +27,7 @@ public function addAggregationFunction(
throw new DatagridException('You can use either ColumnsSummary or AggregationFunctions');
}

if (!$this->dataModel instanceof DataModel) {
if (!$this->dataModel instanceof AbstractDataModel) {
throw new DatagridException('You have to set a data source first.');
}

Expand Down
18 changes: 2 additions & 16 deletions src/DataModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,25 +29,11 @@
use Nette\SmartObject;
use Nextras\Orm\Collection\ICollection;

/**
* @method onBeforeFilter(IDataSource $dataSource)
* @method onAfterFilter(IDataSource $dataSource)
* @method onAfterPaginated(IDataSource $dataSource)
*/
final class DataModel
final class DataModel extends AbstractDataModel
{

use SmartObject;

/** @var array|callable[] */
public array $onBeforeFilter = [];

/** @var array|callable[] */
public array $onAfterFilter = [];

/** @var array|callable[] */
public array $onAfterPaginated = [];

private IDataSource $dataSource;

public function __construct(mixed $source, string $primaryKey)
Expand Down Expand Up @@ -133,7 +119,7 @@ public function filterData(
return $this->dataSource->sort($sorting)->getData();
}

public function filterRow(array $condition): mixed
public function filterRow(array $condition): array
{
$this->onBeforeFilter($this->dataSource);
$this->onAfterFilter($this->dataSource);
Expand Down
2 changes: 1 addition & 1 deletion src/DataSource/IDataSource.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public function getCount(): int;
/**
* Get the data
*/
public function getData(): iterable;
public function getData(): array;

/**
* Filter data
Expand Down
16 changes: 12 additions & 4 deletions src/Datagrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ class Datagrid extends Control
/** @var array<ToolbarButton> */
protected array $toolbarButtons = [];

protected ?DataModel $dataModel = null;
protected ?AbstractDataModel $dataModel = null;

protected string $primaryKey = 'id';

Expand Down Expand Up @@ -344,7 +344,7 @@ public function render(): void
/**
* Check whether datagrid has set some columns, initiated data source, etc
*/
if (!($this->dataModel instanceof DataModel)) {
if (!($this->dataModel instanceof AbstractDataModel)) {
throw new DatagridException('You have to set a data source first.');
}

Expand Down Expand Up @@ -469,7 +469,7 @@ public function setRowCallback(callable $callback): self
*/
public function setPrimaryKey(string $primaryKey): self
{
if ($this->dataModel instanceof DataModel) {
if ($this->dataModel instanceof AbstractDataModel) {
throw new DatagridException('Please set datagrid primary key before setting datasource.');
}

Expand All @@ -481,10 +481,18 @@ public function setPrimaryKey(string $primaryKey): self
/**
* @return static
* @throws InvalidArgumentException
* @throws DatagridException
*/
public function setDataSource(mixed $source): self
{
$this->dataModel = new DataModel($source, $this->primaryKey);
$this->setDataModel(new DataModel($source, $this->primaryKey));

return $this;
}

public function setDataModel(AbstractDataModel $dataModel): self
{
$this->dataModel = $dataModel;

$this->dataModel->onBeforeFilter[] = [$this, 'beforeDataModelFilter'];
$this->dataModel->onAfterFilter[] = [$this, 'afterDataModelFilter'];
Expand Down
62 changes: 62 additions & 0 deletions src/RestDataModel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php declare(strict_types = 1);

namespace Contributte\Datagrid;

use Contributte\Datagrid\Components\DatagridPaginator\DatagridPaginator;
use Contributte\Datagrid\DataSource\IDataSource;
use Contributte\Datagrid\Utils\Sorting;

class RestDataModel extends AbstractDataModel
{

private IDataSource $dataSource;

public function __construct(IDataSource $source)
{
$this->dataSource = $source;
}

public function getDataSource(): IDataSource
{
return $this->dataSource;
}

public function filterData(?DatagridPaginator $paginatorComponent, Sorting $sorting, array $filters): iterable
{
$this->onBeforeFilter($this->dataSource);

$this->dataSource->filter($filters);

$this->onAfterFilter($this->dataSource);

/**
* Paginator is optional
*/
if ($paginatorComponent !== null) {
$paginator = $paginatorComponent->getPaginator();

$this->dataSource->sort($sorting)->limit(
$paginator->getOffset(),
$paginator->getItemsPerPage()
);

$this->onAfterPaginated($this->dataSource);

$data = $this->dataSource->getData();
$paginator->setItemCount($this->dataSource->getCount());

return $data;
}

return $this->dataSource->sort($sorting)->getData();
}

public function filterRow(array $condition): array
{
$this->onBeforeFilter($this->dataSource);
$this->onAfterFilter($this->dataSource);

return $this->dataSource->filterOne($condition)->getData();
}

}