Skip to content

Commit e018121

Browse files
authored
[9.0] Add column formatter. (#2193)
* Add column formatters. * Apply fixes from StyleCI * Add formatColumn test. * Apply fixes from StyleCI * Reverse cs. * Fix doc blocks and exception error message. Co-authored-by: Arjay Angeles <[email protected]>
1 parent 1f0945d commit e018121

File tree

4 files changed

+96
-3
lines changed

4 files changed

+96
-3
lines changed

src/Contracts/Formatter.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Yajra\DataTables\Contracts;
4+
5+
interface Formatter
6+
{
7+
/**
8+
* @param string $value
9+
* @param mixed $row
10+
* @return string
11+
*/
12+
public function format($value, $row);
13+
}

src/DataTableAbstract.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Illuminate\Support\Traits\Macroable;
1111
use Psr\Log\LoggerInterface;
1212
use Yajra\DataTables\Contracts\DataTable;
13+
use Yajra\DataTables\Contracts\Formatter;
1314
use Yajra\DataTables\Exceptions\Exception;
1415
use Yajra\DataTables\Processors\DataProcessor;
1516
use Yajra\DataTables\Utilities\Helper;
@@ -189,6 +190,29 @@ public function addColumn($name, $content, $order = false)
189190
return $this;
190191
}
191192

193+
/**
194+
* @param string|array $columns
195+
* @param mixed|\Yajra\DataTables\Contracts\Formatter $formatter
196+
* @return $this
197+
* @throws \Exception
198+
*/
199+
public function formatColumn($columns, $formatter)
200+
{
201+
if (is_string($formatter) && class_exists($formatter)) {
202+
$formatter = app($formatter);
203+
}
204+
205+
if (! $formatter instanceof Formatter) {
206+
throw new \Exception('$formatter must be an instance of '. Formatter::class);
207+
}
208+
209+
foreach ((array) $columns as $column) {
210+
$this->addColumn($column . '_formatted', $formatter);
211+
}
212+
213+
return $this;
214+
}
215+
192216
/**
193217
* Add DT row index column on response.
194218
*

src/Processors/DataProcessor.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Contracts\Support\Htmlable;
66
use Illuminate\Support\Arr;
7+
use Yajra\DataTables\Contracts\Formatter;
78
use Yajra\DataTables\Utilities\Helper;
89

910
class DataProcessor
@@ -127,9 +128,16 @@ public function process($object = false)
127128
*/
128129
protected function addColumns($data, $row)
129130
{
130-
foreach ($this->appendColumns as $key => $value) {
131-
$value['content'] = Helper::compileContent($value['content'], $data, $row);
132-
$data = Helper::includeInArray($value, $data);
131+
foreach ($this->appendColumns as $value) {
132+
if ($value['content'] instanceof Formatter) {
133+
$column = str_replace('_formatted', '', $value['name']);
134+
135+
$value['content'] = $value['content']->format($data[$column], $row);
136+
} else {
137+
$value['content'] = Helper::compileContent($value['content'], $data, $row);
138+
}
139+
140+
$data = Helper::includeInArray($value, $data);
133141
}
134142

135143
return $data;

tests/Integration/QueryDataTableTest.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
namespace Yajra\DataTables\Tests\Integration;
44

5+
use Carbon\Carbon;
56
use Illuminate\Database\Query\Builder;
67
use Illuminate\Foundation\Testing\DatabaseTransactions;
78
use Illuminate\Http\JsonResponse;
89
use Illuminate\Support\Facades\DB;
10+
use Yajra\DataTables\Contracts\Formatter;
911
use Yajra\DataTables\DataTables;
1012
use Yajra\DataTables\Facades\DataTables as DatatablesFacade;
1113
use Yajra\DataTables\QueryDataTable;
@@ -286,6 +288,27 @@ public function it_allows_column_search_added_column_with_custom_filter_handler(
286288
]);
287289
}
288290

291+
/** @test */
292+
public function it_can_return_formatted_columns()
293+
{
294+
$crawler = $this->call('GET', '/query/formatColumn');
295+
296+
$crawler->assertJson([
297+
'draw' => 0,
298+
'recordsTotal' => 20,
299+
'recordsFiltered' => 20,
300+
]);
301+
302+
$user = DB::table('users')->find(1);
303+
$data = $crawler->json('data')[0];
304+
305+
$this->assertTrue(isset($data['created_at']));
306+
$this->assertTrue(isset($data['created_at_formatted']));
307+
308+
$this->assertEquals($user->created_at, $data['created_at']);
309+
$this->assertEquals(Carbon::parse($user->created_at)->format('Y-m-d'), $data['created_at_formatted']);
310+
}
311+
289312
protected function setUp(): void
290313
{
291314
parent::setUp();
@@ -296,6 +319,12 @@ protected function setUp(): void
296319
return $dataTable->query(DB::table('users'))->toJson();
297320
});
298321

322+
$route->get('/query/formatColumn', function (DataTables $dataTable) {
323+
return $dataTable->query(DB::table('users'))
324+
->formatColumn('created_at', new DateFormatter('Y-m-d'))
325+
->toJson();
326+
});
327+
299328
$route->get('/query/simple', function (DataTables $dataTable) {
300329
return $dataTable->query(DB::table('users'))->skipTotalRecords()->toJson();
301330
});
@@ -376,3 +405,22 @@ protected function setUp(): void
376405
});
377406
}
378407
}
408+
409+
class DateFormatter implements Formatter
410+
{
411+
protected $format;
412+
413+
public function __construct($format = null)
414+
{
415+
$this->format = $format;
416+
}
417+
418+
public function format($value, $row)
419+
{
420+
if ($this->format) {
421+
return Carbon::parse($value)->format($this->format);
422+
}
423+
424+
return Carbon::parse($value)->diffForHumans();
425+
}
426+
}

0 commit comments

Comments
 (0)