Skip to content

Commit

Permalink
Merge branch 'release/2.2.2'
Browse files Browse the repository at this point in the history
  • Loading branch information
pfilsx committed Mar 22, 2019
2 parents 79e9d7b + 94b3af8 commit 8332836
Show file tree
Hide file tree
Showing 9 changed files with 311 additions and 9 deletions.
51 changes: 51 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,70 @@ DataGridBundle
==============
General:
[![Build Status](https://travis-ci.com/pfilsx/DataGridBundle.svg?branch=master)](https://travis-ci.com/pfilsx/DataGridBundle)
[![Latest Stable Version](https://poser.pugx.org/pfilsx/data-grid-bundle/v/stable)](https://packagist.org/packages/pfilsx/data-grid-bundle)
[![License](https://poser.pugx.org/pfilsx/data-grid-bundle/license)](https://packagist.org/packages/pfilsx/data-grid-bundle)

Quality:
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/pfilsx/DataGridBundle/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/pfilsx/DataGridBundle/?branch=master)
[![Build Status](https://scrutinizer-ci.com/g/pfilsx/DataGridBundle/badges/build.png?b=master)](https://scrutinizer-ci.com/g/pfilsx/DataGridBundle/build-status/master)
[![Coverage Status](https://coveralls.io/repos/github/pfilsx/DataGridBundle/badge.svg?branch=master)](https://coveralls.io/github/pfilsx/DataGridBundle?branch=master)
[![Code Intelligence Status](https://scrutinizer-ci.com/g/pfilsx/DataGridBundle/badges/code-intelligence.svg?b=master)](https://scrutinizer-ci.com/code-intelligence)

Numbers:
[![Total Downloads](https://poser.pugx.org/pfilsx/data-grid-bundle/downloads)](https://packagist.org/packages/pfilsx/data-grid-bundle)
[![Monthly Downloads](https://poser.pugx.org/pfilsx/data-grid-bundle/d/monthly)](https://packagist.org/packages/pfilsx/data-grid-bundle)
[![Daily Downloads](https://poser.pugx.org/pfilsx/data-grid-bundle/d/daily)](https://packagist.org/packages/pfilsx/data-grid-bundle)



Introduction
------------

The bundle provides a Data Grid Tables integration for your Symfony Project. It automatically registers
the new DataGridFactory and Twig GridExtension which can be easily as well as highly configured.

Features
--------
* Display a Data Grid from a `Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository`
* Automatic filter(with bundle js included)
* Automatic Sorting on columns
* Easy to configure
* Easy to extend
* Documented (in Resources/doc)
* Change of DataGrid presentation with override default twig template or just configure css classes on each column/filter.

Requirement
-----------
* PHP 7.1+
* Symfony 4+
* Twig 2+

Installation
------------

Via bash:
```bash
$ composer require pfilsx/data-grid-bundle
```
Via composer.json:

You need to add the following lines in your deps :
```json
{
"require": {
"pfilsx/data-grid-bundle": ">=2.0"
}
}
```

For non symfony-flex apps dont forget to add bundle:
``` php
$bundles = array(
...
new Pfilsx\DataGrid\DataGridBundle(),
);
```

Documentation
-------------

Expand Down
11 changes: 8 additions & 3 deletions src/Grid/DataGridBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,15 @@ public function setNoDataMessage(string $message): DataGridBuilderInterface
return $this;
}

public function enablePagination(array $options = []) : DataGridBuilderInterface
public function enablePagination($options = []) : DataGridBuilderInterface
{
$this->options['pagination'] = true;
$this->options['paginationOptions'] = $options;
if (is_array($options) && !empty($options)){
$this->options['pagination'] = true;
$this->options['paginationOptions'] = $options;
} else {
$this->options['pagination'] = false;
$this->options['paginationOptions'] = [];
}
return $this;
}
/**
Expand Down
2 changes: 1 addition & 1 deletion src/Grid/DataGridBuilderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public function setTemplate(string $path): self;

public function setNoDataMessage(string $message): self;

public function enablePagination(array $options = []) : self;
public function enablePagination($options = []) : self;

/**
* @internal
Expand Down
2 changes: 1 addition & 1 deletion src/Grid/DataGridFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public function __construct(ContainerInterface $container, RequestStack $request
public function createGrid(string $gridType, ServiceEntityRepository $repository): DataGrid
{
if (!is_subclass_of($gridType, AbstractGridType::class)) {
throw new InvalidArgumentException('Expected subclass of' . AbstractGridType::class);
throw new InvalidArgumentException('Expected subclass of ' . AbstractGridType::class);
}
$this->repository = $repository;
/** @var AbstractGridType $type */
Expand Down
4 changes: 2 additions & 2 deletions src/Resources/doc/grid/DataGridBuilder.rst
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ addDataColumn(string $attribute, array $columnOptions = [])
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Adds DataColumn to grid. Similar to ``addColumn(self::DATA_COLUMN, ['attribute' => ''])``

enablePagination(array $options = [])
enablePagination(array|false $options = [])
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Configures grid pagination options. Only one option available right now - ``limit``.
Configures grid pagination options or disable pagination. Only one option available right now - ``limit``.
``limit`` - max count of rows on each page.

setTemplate(string $path)
Expand Down
15 changes: 15 additions & 0 deletions src/Resources/doc/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,21 @@ Step 4: Display grid in your twig template
{{ grid_view(dataGrid, {class: 'table'}) }}
Additional step: Register assets for automating sorting and filtering
----------------
You need to include ``datagrid.min.css`` and ``datagrid.js`` from ``public/bundles/datagrid/`` for automatic
filters and sorting

.. block-code:: bash

$ php bin/console assets:install

.. block-code:: html

<link rel="stylesheet" href="public/bundles/datagrid/datagrid.min.css">
<script src="public/bundles/datagrid/datagrid.js"></script>


DataGridType reference
----------------------
.. toctree::
Expand Down
99 changes: 99 additions & 0 deletions tests/DataGridBuilderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<?php


namespace Pfilsx\DataGrid\tests;


use InvalidArgumentException;
use Pfilsx\DataGrid\Grid\Columns\ActionColumn;
use Pfilsx\DataGrid\Grid\Columns\BooleanColumn;
use Pfilsx\DataGrid\Grid\Columns\DataColumn;
use Pfilsx\DataGrid\Grid\Columns\DateColumn;
use Pfilsx\DataGrid\Grid\Columns\ImageColumn;
use Pfilsx\DataGrid\Grid\Columns\SerialColumn;
use Pfilsx\DataGrid\Grid\DataGridBuilder;

class DataGridBuilderTest extends BaseCase
{
/**
* @var DataGridBuilder
*/
private $builder;

const ACTION_COLUMN = 'Pfilsx\DataGrid\Grid\Columns\ActionColumn';
const BOOLEAN_COLUMN = 'Pfilsx\DataGrid\Grid\Columns\BooleanColumn';
const IMAGE_COLUMN = 'Pfilsx\DataGrid\Grid\Columns\ImageColumn';
const DATA_COLUMN = 'Pfilsx\DataGrid\Grid\Columns\DataColumn';
const SERIAL_COLUMN = 'Pfilsx\DataGrid\Grid\Columns\SerialColumn';
const DATE_COLUMN = 'Pfilsx\DataGrid\Grid\Columns\DateColumn';

protected function setUp(): void
{
parent::setUp();
$this->builder = new DataGridBuilder($this->container);
}

public function testWrongColumnClass(): void
{
$this->expectException(InvalidArgumentException::class);
$this->builder->addColumn('wrongClass', []);
}

public function testAddColumn()
{
$this->builder
->addColumn(self::SERIAL_COLUMN);
$this->assertCount(1, $this->builder->getColumns());
$this->assertInstanceOf(SerialColumn::class, $this->builder->getColumns()[0]);

$this->builder->addDataColumn('id');
$this->assertCount(2, $this->builder->getColumns());
$this->assertInstanceOf(DataColumn::class, $this->builder->getColumns()[1]);

$this->builder->addColumn(self::BOOLEAN_COLUMN, [
'attribute' => 'isEnabled'
]);
$this->assertCount(3, $this->builder->getColumns());
$this->assertInstanceOf(BooleanColumn::class, $this->builder->getColumns()[2]);

$this->builder->addColumn(self::IMAGE_COLUMN, [
'attribute' => 'logo'
]);
$this->assertCount(4, $this->builder->getColumns());
$this->assertInstanceOf(ImageColumn::class, $this->builder->getColumns()[3]);

$this->builder->addColumn(self::DATE_COLUMN, [
'attribute' => 'creationDate'
]);
$this->assertCount(5, $this->builder->getColumns());
$this->assertInstanceOf(DateColumn::class, $this->builder->getColumns()[4]);

$this->builder->addColumn(self::ACTION_COLUMN, [
'pathPrefix' => 'category_'
]);
$this->assertCount(6, $this->builder->getColumns());
$this->assertInstanceOf(ActionColumn::class, $this->builder->getColumns()[5]);

return $this->builder;
}

/**
* @depends testAddColumn
* @param DataGridBuilder $builder
*/
public function testSetTemplate($builder): void
{
$builder->setTemplate('test_template.html.twig');
$this->assertEquals('test_template.html.twig', $builder->getOptions()['template']);
}

public function testSetPagination(): void
{
$this->builder->enablePagination(['limit' => 10]);
$this->assertTrue($this->builder->getOptions()['pagination']);
$this->assertEquals(10, $this->builder->getOptions()['paginationOptions']['limit']);

$this->builder->enablePagination(false);
$this->assertFalse($this->builder->getOptions()['pagination']);
}
}
10 changes: 8 additions & 2 deletions tests/DataGridFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,20 @@ protected function setUp(): void
$configuration = new DataGridConfiguration([
'template' => 'test_template',
'noDataMessage' => 'empty',
'pagination' => ['limit' => 10]
'pagination' => []
]);
$this->factory = new DataGridFactory($this->container, $this->container->get('request_stack'), $configuration);
}

public function testWrongGridTypeException(): void
{
$this->expectException(InvalidArgumentException::class);
$this->factory->createGrid('testClass', $this->createMock(ServiceEntityRepository::class));
$this->factory->createGrid('testType', $this->createMock(ServiceEntityRepository::class));
}

public function testCreateGrid(): void
{
$this->factory->createGrid(get_class($this->createMock(AbstractGridType::class)), $this->createMock(ServiceEntityRepository::class));
$this->assertTrue(true);
}
}
126 changes: 126 additions & 0 deletions tests/DataGridFiltersBuilderTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<?php


namespace Pfilsx\DataGrid\tests;

use Doctrine\Common\Collections\Criteria;
use Doctrine\Common\Collections\Expr\Expression;
use Pfilsx\DataGrid\Grid\DataGridFiltersBuilder;

class DataGridFiltersBuilderTest extends BaseCase
{
/**
* @var DataGridFiltersBuilder
*/
private $builder;

protected function setUp(): void
{
parent::setUp();
$this->builder = new DataGridFiltersBuilder($this->container);
}

public function testAddEqualFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->addEqualFilter('id');
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
}

public function testAddEqualFilter(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->setParams(['id' => '1']);
$this->builder->addEqualFilter('id');
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
}

public function testAddEqualFilterNull(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->setParams(['id' => null]);
$this->builder->addEqualFilter('id');
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
}

public function testAddLikeFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->addLikeFilter('id');
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
}

public function testAddLikeFilter(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->setParams(['id' => '1']);
$this->builder->addLikeFilter('id');
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
}

public function testAddRelationFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->addRelationFilter('fid', 'App\Entity\TestEntity');
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
}

public function testAddRelationFilter(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->setParams(['fid' => '1']);
$this->builder->addRelationFilter('fid', 'App\Entity\TestEntity');
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
}

public function testAddCustomFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->addCustomFilter('id', function ($criteria, $attr, $value) {
$criteria->andWhere(Criteria::expr()->eq($attr, $value));
});
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
}

public function testAddCustomFilter(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->setParams(['id' => '1']);
$this->builder->addCustomFilter('id', function ($criteria, $attr, $value) {
$criteria->andWhere(Criteria::expr()->eq($attr, $value));
});
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
}

public function testAddDateFilterOnEmptyData(): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->addDateFilter('id');
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
}

/**
* @dataProvider comparisonProvider
* @param string $comparison
*/
public function testAddDateFilter($comparison): void
{
$this->assertNull($this->builder->getCriteria()->getWhereExpression());
$this->builder->setParams(['date' => '01-01-1990']);
$this->builder->addDateFilter('date', $comparison);
$this->assertInstanceOf(Expression::class, $this->builder->getCriteria()->getWhereExpression());
}


public function comparisonProvider(){
return [
['equal'],
['notEqual'],
['lt'],
['lte'],
['gt'],
['gte'],
['someTest']
];
}
}

0 comments on commit 8332836

Please sign in to comment.