This commit is contained in:
hackerESQ
2025-09-28 21:13:52 -05:00
parent 8908e2da02
commit c6032c5b66
7 changed files with 88 additions and 86 deletions
+41 -38
View File
@@ -1,25 +1,28 @@
<?php
declare(strict_types=1);
namespace App\Livewire\Datatables;
use App\Models\Holding;
use Illuminate\Support\Number;
use Illuminate\Database\Eloquent\Builder;
use Rappasoft\LaravelLivewireTables\Views\Column;
use Illuminate\Support\Number;
use Rappasoft\LaravelLivewireTables\DataTableComponent;
use Rappasoft\LaravelLivewireTables\Views\Column;
class HoldingsTable extends DataTableComponent
{
public $portfolio;
public $portfolio;
public array $hiddenColumns = [];
public function mount ($portfolio): void
public function mount($portfolio): void
{
//
}
public function builder(): Builder
{
{
return Holding::query()
->portfolio($this->portfolio->id)
->with(['market_data'])
@@ -34,65 +37,65 @@ class HoldingsTable extends DataTableComponent
$this->hiddenColumns = ['name', 'average_cost_basis', 'market_value', 'fifty_two_week_low', 'fifty_two_week_high'];
$this->setTableWrapperAttributes([
'default' => false,
'default' => false,
'default-styling' => false,
'default-colors' => false,
'class' => 'overflow-scroll'
]);
'class' => 'overflow-scroll',
]);
$this->setTableAttributes([
'default' => false,
'default' => false,
'default-styling' => false,
'default-colors' => false,
'class' => 'table',
]);
$this->setTheadAttributes([
'default' => false,
'default' => false,
'default-styling' => true,
'default-colors' => false,
]);
$this->setThAttributes(function(Column $column) {
$this->setThAttributes(function (Column $column) {
$attributes = [
'default' => false,
'default-styling' => false,
'default-colors' => false,
'class' => 'text-xs font-medium whitespace-nowrap uppercase tracking-wider text-nowrap'
'class' => 'text-xs font-medium whitespace-nowrap uppercase tracking-wider text-nowrap',
];
if (in_array($column->getField(), $this->hiddenColumns)) {
$attributes['class'] = $attributes['class'] . ' hidden md:table-cell';
$attributes['class'] = $attributes['class'].' hidden md:table-cell';
}
return $attributes;
});
$this->setThSortButtonAttributes(fn() => [
$this->setThSortButtonAttributes(fn () => [
'default' => false,
'default-styling' => true,
'default-colors' => false,
'class' => 'cursor-pointer'
'class' => 'cursor-pointer',
]);
$this->setTbodyAttributes([
'default' => false,
'default-styling' => true,
'default-colors' => false,
]);
$this->setTrAttributes(fn() => [
'default' => false,
'default-styling' => true,
'default-colors' => false,
'class' => 'cursor-pointer hover:bg-neutral/25'
]);
$this->setTdAttributes(function(Column $column) {
$this->setTrAttributes(fn () => [
'default' => false,
'default-styling' => true,
'default-colors' => false,
'class' => 'cursor-pointer hover:bg-neutral/25',
]);
$this->setTdAttributes(function (Column $column) {
$attributes = [
'default' => false,
'default-styling' => false,
'default-colors' => false,
'class' => 'text-nowrap'
'class' => 'text-nowrap',
];
if (in_array($column->getField(), $this->hiddenColumns)) {
$attributes['class'] = $attributes['class'] . ' hidden md:table-cell';
$attributes['class'] = $attributes['class'].' hidden md:table-cell';
}
return $attributes;
@@ -107,11 +110,11 @@ class HoldingsTable extends DataTableComponent
$this->setPrimaryKey('id');
$this->setTableRowUrl(function($row) {
$this->setTableRowUrl(function ($row) {
return route('holding.show', ['portfolio' => $row->portfolio_id, 'symbol' => $row->symbol]);
})->setTableRowUrlTarget(function($row) {
})->setTableRowUrlTarget(function ($row) {
return 'navigate';
});
}
@@ -127,19 +130,19 @@ class HoldingsTable extends DataTableComponent
->sortable(),
Column::make(__('Average Cost Basis'), 'average_cost_basis')
->sortable()
->format(fn($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency) ),
->format(fn ($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency)),
Column::make(__('Total Cost Basis'), 'total_cost_basis')
->sortable()
->format(fn($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency) ),
->format(fn ($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency)),
Column::make(__('Market Value'), 'market_data.market_value')
->sortable()
->format(fn($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency) ),
->format(fn ($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency)),
Column::make(__('Total Market Value'))
->sortable(fn (Builder $query, string $direction) => $query->orderBy('total_market_value', $direction))
->label(fn ($row) => Number::currency($row->total_market_value ?? 0, $row->market_data?->currency)),
Column::make(__('Market Gain/Loss'))
->html()
->label(fn($row) => Number::currency($row->market_gain_dollars ?? 0, $row->market_data?->currency) . view('components.ui.gain-loss-arrow-badge', [
->label(fn ($row) => Number::currency($row->market_gain_dollars ?? 0, $row->market_data?->currency).view('components.ui.gain-loss-arrow-badge', [
'costBasis' => $row->average_cost_basis,
'marketValue' => $row->market_data?->market_value,
'small' => true,
@@ -147,22 +150,22 @@ class HoldingsTable extends DataTableComponent
->sortable(fn (Builder $query, string $direction) => $query->orderBy('market_gain_dollars', $direction)),
Column::make(__('Realized Gain/Loss'), 'realized_gain_dollars')
->sortable()
->format(fn($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency) ),
->format(fn ($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency)),
Column::make(__('Dividends Earned'), 'dividends_earned')
->sortable()
->format(fn($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency) ),
->format(fn ($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency)),
Column::make(__('52 week low'), 'market_data.fifty_two_week_low')
->sortable()
->format(fn($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency) ),
->format(fn ($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency)),
Column::make(__('52 week high'), 'market_data.fifty_two_week_high')
->sortable()
->format(fn($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency) ),
->format(fn ($value, $row) => Number::currency($value ?? 0, $row->market_data?->currency)),
Column::make(__('Number of Transactions'))
->sortable(fn (Builder $query, string $direction) => $query->orderBy('num_transactions', $direction))
->label(fn ($row) => $row->num_transactions),
Column::make(__('Last Refreshed'), 'market_data.updated_at')
->sortable()
->format(fn($value) => \Carbon\Carbon::parse($value)->diffForHumans() )
->format(fn ($value) => \Carbon\Carbon::parse($value)->diffForHumans()),
];
}
}