-
-
Notifications
You must be signed in to change notification settings - Fork 222
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add summary support in the collections table (#1558)
- Loading branch information
1 parent
35d1469
commit ff67c7a
Showing
3 changed files
with
206 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
154 changes: 154 additions & 0 deletions
154
tests/Concerns/Components/DishesCalculationsCollectionTable.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
<?php | ||
|
||
namespace PowerComponents\LivewirePowerGrid\Tests\Concerns\Components; | ||
|
||
use Illuminate\Database\Eloquent\Builder; | ||
use Illuminate\Support\{Carbon, Collection, Number}; | ||
use PowerComponents\LivewirePowerGrid\Tests\Concerns\Models\Dish; | ||
use PowerComponents\LivewirePowerGrid\{ | ||
Column, | ||
Footer, | ||
Header, | ||
PowerGrid, | ||
PowerGridComponent, | ||
PowerGridFields | ||
}; | ||
|
||
class DishesCalculationsCollectionTable extends PowerGridComponent | ||
{ | ||
public array $eventId = []; | ||
|
||
public bool $join = false; | ||
|
||
public function setUp(): array | ||
{ | ||
$this->showCheckBox(); | ||
|
||
return [ | ||
Header::make() | ||
->showToggleColumns() | ||
->showSearchInput(), | ||
|
||
Footer::make() | ||
->showPerPage() | ||
->showRecordCount(), | ||
]; | ||
} | ||
|
||
public function datasource(): Collection | ||
{ | ||
return collect([ | ||
[ | ||
'id' => 29, | ||
'name' => 'Luan', | ||
'balance' => 241.86, | ||
'is_online' => true, | ||
'created_at' => '2023-01-01 00:00:00', | ||
], | ||
[ | ||
'id' => 57, | ||
'name' => 'Daniel', | ||
'balance' => 166.51, | ||
'is_online' => true, | ||
'created_at' => '2023-02-02 00:00:00', | ||
], | ||
[ | ||
'id' => 93, | ||
'name' => 'Claudio', | ||
'balance' => 219.01, | ||
'is_online' => false, | ||
'created_at' => '2023-03-03 00:00:00', | ||
], | ||
[ | ||
'id' => 104, | ||
'name' => 'Vitor', | ||
'balance' => 44.28, | ||
'is_online' => true, | ||
'created_at' => '2023-04-04 00:00:00', | ||
], | ||
]); | ||
} | ||
|
||
public function query(): Builder | ||
{ | ||
return Dish::with('category'); | ||
} | ||
|
||
public function join(): Builder | ||
{ | ||
return Dish::query() | ||
->join('categories', function ($categories) { | ||
$categories->on('dishes.category_id', '=', 'categories.id'); | ||
}) | ||
->select('dishes.*', 'categories.name as category_name'); | ||
} | ||
|
||
public function fields(): PowerGridFields | ||
{ | ||
return PowerGrid::fields() | ||
->add('id') | ||
->add('name') | ||
->add('balance', fn ($item) => Number::currency($item->balance, in: 'BRL', locale: 'pt-BR')) | ||
->add('is_online', fn ($item) => $item->is_online ? '✅' : '❌') | ||
->add('created_at', fn ($item) => Carbon::parse($item->created_at)) | ||
->add('created_at_formatted', fn ($item) => Carbon::parse($item->created_at)->format('d/m/Y')); | ||
} | ||
|
||
public function columns(): array | ||
{ | ||
return [ | ||
Column::make('Index', 'id')->index(), | ||
|
||
Column::make('ID', 'id') | ||
->withCount('Count ID', true, false), | ||
|
||
Column::add() | ||
->title('Name') | ||
->field('name') | ||
->searchable() | ||
->sortable(), | ||
|
||
Column::add() | ||
->title('Balance') | ||
->field('balance') | ||
->withSum('Sum Balance', true, false) | ||
->withAvg('Avg Balance', true, false) | ||
->withCount('Count Balance', true, false) | ||
->withMin('Min Balance', true, false) | ||
->withMax('Max Balance', true, false) | ||
->sortable(), | ||
|
||
Column::add() | ||
->title('Online') | ||
->field('is_online'), | ||
|
||
Column::add() | ||
->title('Created At') | ||
->field('created_at_formatted'), | ||
]; | ||
} | ||
|
||
public function summarizeFormat(): array | ||
{ | ||
$fmt = (new \NumberFormatter('pt-PT', \NumberFormatter::DEFAULT_STYLE)); | ||
|
||
return [ | ||
'id.{count}' => fn ($value) => $fmt->format($value) . ' item(s)', | ||
|
||
'balance.{sum,avg,min,max}' => function ($value) { | ||
return (new \NumberFormatter('en_US', \NumberFormatter::CURRENCY)) | ||
->formatCurrency($value, 'USD'); | ||
}, | ||
]; | ||
} | ||
|
||
public function bootstrap(): void | ||
{ | ||
config(['livewire-powergrid.theme' => 'bootstrap']); | ||
} | ||
|
||
public function tailwind(): void | ||
{ | ||
config(['livewire-powergrid.theme' => 'tailwind']); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
<?php | ||
|
||
use PowerComponents\LivewirePowerGrid\Tests\Concerns\Components\DishesCalculationsCollectionTable; | ||
|
||
use function PowerComponents\LivewirePowerGrid\Tests\Plugins\livewire; | ||
|
||
it('calculates "count" on id field', function (string $component, object $params) { | ||
livewire($component) | ||
->call($params->theme) | ||
->assertSeeHtml('Count ID: 4 item(s)') | ||
->set('search', 'Luan') | ||
->assertSeeHtml('Count ID: 1 item(s)'); | ||
})->with('calculations collection'); | ||
|
||
it('calculates "sum" on price balance', function (string $component, object $params) { | ||
livewire($component) | ||
->call($params->theme) | ||
->assertSeeHtml('<span>Sum Balance: $671.66</span>') | ||
->set('search', 'Luan') | ||
->assertSeeHtml('<span>Sum Balance: $241.86</span>'); | ||
})->with('calculations collection'); | ||
|
||
it('calculates and formats "avg" on balance field and calorie fields', function (string $component, object $params) { | ||
livewire($component) | ||
->call($params->theme) | ||
->assertSeeHtml('<span>Avg Balance: $167.92</span>') | ||
->set('search', 'Luan') | ||
->assertSeeHtml('<span>Avg Balance: $241.86</span>'); | ||
})->with('calculations collection'); | ||
|
||
it('calculates "min" on balance field', function (string $component, object $params) { | ||
livewire($component) | ||
->call($params->theme) | ||
->assertSeeHtml('<span>Min Balance: $44.28</span>') | ||
->set('search', 'Luan') | ||
->assertSeeHtml('<span>Min Balance: $241.86</span>'); | ||
})->with('calculations collection'); | ||
|
||
it('calculates "max" on balance field', function (string $component, object $params) { | ||
livewire($component) | ||
->call($params->theme) | ||
->assertSeeHtml('<span>Max Balance: $241.86</span>') | ||
->set('search', 'Luan') | ||
->assertSeeHtml('<span>Max Balance: $241.86</span>'); | ||
})->with('calculations collection'); | ||
|
||
dataset('calculations collection', [ | ||
'tailwind' => [DishesCalculationsCollectionTable::class, (object) ['theme' => 'tailwind']], | ||
'bootstrap' => [DishesCalculationsCollectionTable::class, (object) ['theme' => 'bootstrap']], | ||
]); |