Skip to content

Commit

Permalink
Merge branch '9.0'
Browse files Browse the repository at this point in the history
* 9.0:
  Bump v9.14.0 🚀
  [9.0] Add column formatter. (#2193)
  Bump v9.13.0 🚀
  Remove abstract to prevent possible breaking change.
  Apply fixes from StyleCI
  Use searchPane instead of searchPanes.
  Apply fixes from StyleCI
  Add test for searching via search panes.
  Add test for search panes options response.
  Do not throw exception. Add TODO.
  Add search pane custom search handler.
  Set empty array as default searchPanes.
  Implement basic whereIn search panes. Relationships not yet supported.
  Add support for search panes. Fix #2463, #2471
  • Loading branch information
yajra committed Nov 3, 2020
2 parents b1bb78f + 568e670 commit 82c1ec1
Show file tree
Hide file tree
Showing 6 changed files with 221 additions and 4 deletions.
18 changes: 17 additions & 1 deletion CHANGELOG.md
Expand Up @@ -8,6 +8,16 @@

### [Unreleased]

### [v9.14.0] - 2020-11-03

- Add column formatter. [#2193]
- Fix [yajra/laravel-datatables-editor#33](https://github.com/yajra/laravel-datatables-editor/issues/33)

### [v9.13.0] - 2020-10-31

- Add support for search panes. [#2475]
- Fix [#2463], [#2471]

### [v9.12.0] - 2020-10-31

- Add disable ordering via orderColumn. [#2481], credits to [@gredimano]
Expand Down Expand Up @@ -399,7 +409,9 @@ return (new CollectionDataTable(User::all())->toJson();
- Fix orderColumn api where related tables are not joined.
- Fix nested with relation search and sort function.

[Unreleased]: https://github.com/yajra/laravel-datatables/compare/v9.12.0...9.0
[Unreleased]: https://github.com/yajra/laravel-datatables/compare/v9.14.0...9.0
[v9.14.0]: https://github.com/yajra/laravel-datatables/compare/v9.13.0...v9.14.0
[v9.13.0]: https://github.com/yajra/laravel-datatables/compare/v9.12.0...v9.13.0
[v9.12.0]: https://github.com/yajra/laravel-datatables/compare/v9.11.1...v9.12.0
[v9.11.1]: https://github.com/yajra/laravel-datatables/compare/v9.11.0...v9.11.1
[v9.11.0]: https://github.com/yajra/laravel-datatables/compare/v9.10.2...v9.11.0
Expand Down Expand Up @@ -544,6 +556,8 @@ return (new CollectionDataTable(User::all())->toJson();
[#2414]: https://github.com/yajra/laravel-datatables/pull/2414
[#2478]: https://github.com/yajra/laravel-datatables/pull/2478
[#2481]: https://github.com/yajra/laravel-datatables/pull/2481
[#2475]: https://github.com/yajra/laravel-datatables/pull/2475
[#2193]: https://github.com/yajra/laravel-datatables/pull/2193

[#1934]: https://github.com/yajra/laravel-datatables/issues/1934
[#2091]: https://github.com/yajra/laravel-datatables/issues/2091
Expand Down Expand Up @@ -585,6 +599,8 @@ return (new CollectionDataTable(User::all())->toJson();
[#1975]: https://github.com/yajra/laravel-datatables/issues/1975
[#1747]: https://github.com/yajra/laravel-datatables/issues/1747
[#1953]: https://github.com/yajra/laravel-datatables/issues/1953
[#2463]: https://github.com/yajra/laravel-datatables/issues/2463
[#2471]: https://github.com/yajra/laravel-datatables/issues/2471

[laravel-datatables-fractal]: https://github.com/yajra/laravel-datatables-fractal

Expand Down
13 changes: 13 additions & 0 deletions src/Contracts/Formatter.php
@@ -0,0 +1,13 @@
<?php

namespace Yajra\DataTables\Contracts;

interface Formatter
{
/**
* @param string $value
* @param mixed $row
* @return string
*/
public function format($value, $row);
}
64 changes: 64 additions & 0 deletions src/DataTableAbstract.php
Expand Up @@ -10,6 +10,7 @@
use Illuminate\Support\Traits\Macroable;
use Psr\Log\LoggerInterface;
use Yajra\DataTables\Contracts\DataTable;
use Yajra\DataTables\Contracts\Formatter;
use Yajra\DataTables\Exceptions\Exception;
use Yajra\DataTables\Processors\DataProcessor;
use Yajra\DataTables\Utilities\Helper;
Expand Down Expand Up @@ -145,6 +146,11 @@ abstract class DataTableAbstract implements DataTable, Arrayable, Jsonable
*/
protected $serializer;

/**
* @var array
*/
protected $searchPanes = [];

/**
* Can the DataTable engine be created with these parameters.
*
Expand Down Expand Up @@ -184,6 +190,29 @@ public function addColumn($name, $content, $order = false)
return $this;
}

/**
* @param string|array $columns
* @param mixed|\Yajra\DataTables\Contracts\Formatter $formatter
* @return $this
* @throws \Exception
*/
public function formatColumn($columns, $formatter)
{
if (is_string($formatter) && class_exists($formatter)) {
$formatter = app($formatter);
}

if (! $formatter instanceof Formatter) {
throw new \Exception('$formatter must be an instance of '. Formatter::class);
}

foreach ((array) $columns as $column) {
$this->addColumn($column . '_formatted', $formatter);
}

return $this;
}

/**
* Add DT row index column on response.
*
Expand Down Expand Up @@ -657,9 +686,18 @@ protected function filterRecords()
}

$this->columnSearch();
$this->searchPanesSearch();
$this->filteredRecords = $this->isFilterApplied ? $this->filteredCount() : $this->totalRecords;
}

/**
* Perform search using search pane values.
*/
protected function searchPanesSearch()
{
// Add support for search pane.
}

/**
* Perform global search.
*
Expand Down Expand Up @@ -772,6 +810,10 @@ protected function render(array $data)
$output = $this->showDebugger($output);
}

foreach ($this->searchPanes as $column => $searchPane) {
$output['searchPanes']['options'][$column] = $searchPane['options'];
}

return new JsonResponse(
$output,
200,
Expand Down Expand Up @@ -924,4 +966,26 @@ protected function getPrimaryKeyName()
{
return 'id';
}

/**
* Add a search pane options on response.
*
* @param string $column
* @param mixed $options
* @param callable|null $builder
* @return $this
*/
public function searchPane($column, $options, callable $builder = null)
{
$options = value($options);

if ($options instanceof Arrayable) {
$options = $options->toArray();
}

$this->searchPanes[$column]['options'] = $options;
$this->searchPanes[$column]['builder'] = $builder;

return $this;
}
}
14 changes: 11 additions & 3 deletions src/Processors/DataProcessor.php
Expand Up @@ -4,6 +4,7 @@

use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Support\Arr;
use Yajra\DataTables\Contracts\Formatter;
use Yajra\DataTables\Utilities\Helper;

class DataProcessor
Expand Down Expand Up @@ -127,9 +128,16 @@ public function process($object = false)
*/
protected function addColumns($data, $row)
{
foreach ($this->appendColumns as $key => $value) {
$value['content'] = Helper::compileContent($value['content'], $data, $row);
$data = Helper::includeInArray($value, $data);
foreach ($this->appendColumns as $value) {
if ($value['content'] instanceof Formatter) {
$column = str_replace('_formatted', '', $value['name']);

$value['content'] = $value['content']->format($data[$column], $row);
} else {
$value['content'] = Helper::compileContent($value['content'], $data, $row);
}

$data = Helper::includeInArray($value, $data);
}

return $data;
Expand Down
22 changes: 22 additions & 0 deletions src/QueryDataTable.php
Expand Up @@ -107,6 +107,28 @@ public function make($mDataSupport = true)
}
}

/**
* Perform search using search pane values.
*/
protected function searchPanesSearch()
{
$columns = $this->request->get('searchPanes', []);

foreach ($columns as $column => $values) {
if ($this->isBlacklisted($column)) {
continue;
}

if ($callback = data_get($this->searchPanes, $column . '.builder')) {
$callback($this->getBaseQueryBuilder(), $values);
} else {
$this->getBaseQueryBuilder()->whereIn($column, $values);
}

$this->isFilterApplied = true;
}
}

/**
* Prepare query by executing count, filter, order and paginate.
*/
Expand Down
94 changes: 94 additions & 0 deletions tests/Integration/QueryDataTableTest.php
Expand Up @@ -2,13 +2,16 @@

namespace Yajra\DataTables\Tests\Integration;

use Carbon\Carbon;
use Illuminate\Database\Query\Builder;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
use Yajra\DataTables\Contracts\Formatter;
use Yajra\DataTables\DataTables;
use Yajra\DataTables\Facades\DataTables as DatatablesFacade;
use Yajra\DataTables\QueryDataTable;
use Yajra\DataTables\Tests\Models\User;
use Yajra\DataTables\Tests\TestCase;

class QueryDataTableTest extends TestCase
Expand Down Expand Up @@ -229,6 +232,43 @@ public function it_allows_search_on_added_column_with_custom_filter_handler()
$this->assertStringContainsString('"1" = ?', $queries[1]['query']);
}

/** @test */
public function it_returns_search_panes_options()
{
$crawler = $this->call('GET', '/query/search-panes');

$crawler->assertJson([
'draw' => 0,
'recordsTotal' => 20,
'recordsFiltered' => 20,
'searchPanes' => [
'options' => [
'name' => [],
],
],
]);

$options = $crawler->json()['searchPanes']['options'];

$this->assertEquals(count($options['name']), 20);
}

/** @test */
public function it_performs_search_using_search_panes()
{
$crawler = $this->call('GET', '/query/search-panes', [
'searchPanes' => [
'id' => [1, 2],
],
]);

$crawler->assertJson([
'draw' => 0,
'recordsTotal' => 20,
'recordsFiltered' => 2,
]);
}

/** @test */
public function it_allows_column_search_added_column_with_custom_filter_handler()
{
Expand All @@ -248,6 +288,27 @@ public function it_allows_column_search_added_column_with_custom_filter_handler(
]);
}

/** @test */
public function it_can_return_formatted_columns()
{
$crawler = $this->call('GET', '/query/formatColumn');

$crawler->assertJson([
'draw' => 0,
'recordsTotal' => 20,
'recordsFiltered' => 20,
]);

$user = DB::table('users')->find(1);
$data = $crawler->json('data')[0];

$this->assertTrue(isset($data['created_at']));
$this->assertTrue(isset($data['created_at_formatted']));

$this->assertEquals($user->created_at, $data['created_at']);
$this->assertEquals(Carbon::parse($user->created_at)->format('Y-m-d'), $data['created_at_formatted']);
}

protected function setUp(): void
{
parent::setUp();
Expand All @@ -258,6 +319,12 @@ protected function setUp(): void
return $dataTable->query(DB::table('users'))->toJson();
});

$route->get('/query/formatColumn', function (DataTables $dataTable) {
return $dataTable->query(DB::table('users'))
->formatColumn('created_at', new DateFormatter('Y-m-d'))
->toJson();
});

$route->get('/query/simple', function (DataTables $dataTable) {
return $dataTable->query(DB::table('users'))->skipTotalRecords()->toJson();
});
Expand Down Expand Up @@ -328,5 +395,32 @@ protected function setUp(): void
->rawColumns(['name', 'email'])
->toJson();
});

$route->get('/query/search-panes', function (DataTables $dataTable) {
$options = User::select('id as value', 'name as label')->get();

return $dataTable->query(DB::table('users'))
->searchPane('name', $options)
->toJson();
});
}
}

class DateFormatter implements Formatter
{
protected $format;

public function __construct($format = null)
{
$this->format = $format;
}

public function format($value, $row)
{
if ($this->format) {
return Carbon::parse($value)->format($this->format);
}

return Carbon::parse($value)->diffForHumans();
}
}

0 comments on commit 82c1ec1

Please sign in to comment.