Jul 22, 2025
0
Level 6
Is it possible to add stat widget in filament view page? or inside relation manager table?
instead of using the summarizer I want to display the summary data above the table
<?php
namespace App\Filament\Admin\Resources\MemberResource\RelationManagers;
use Carbon\Carbon;
use Filament\Forms;
use Filament\Tables;
use App\Enums\User\Role;
use Filament\Resources\RelationManagers\RelationManager;
class TransactionsRelationManager extends RelationManager
{
protected static string $relationship = 'transactions';
public function table(Table $table): Table
{
return $table
->recordTitleAttribute('id')
->columns([
TextColumn::make('reference_code')
->label('Reference #')
->searchable(),
TextColumn::make('points')
->numeric()
->label('Points')
->formatStateUsing(function ($state, $record) {
$points = number_format($state, 0); // format as integer, no decimals
if ($record->type === Type::Earn) {
return '+ ' . $points;
}
if ($record->type === Type::Redeem) {
return '- ' . $points;
}
if ($record->type === Type::AdjustmentAdd) {
return '+ ' . $points;
}
if ($record->type === Type::AdjustmentSubtract) {
return '- ' . $points;
}
return $points;
})
->summarize([
Summarizer::make()
->label('Points from Buying (Filtered)')
->using(function () {
$record = $this->getOwnerRecord();
$from = request()->input('tableFilters.created_ts.created_from');
$to = request()->input('tableFilters.created_ts.created_to');
$query = Transaction::query()
->where('member_id', $record->id)
->where('type', Type::EarnFromBuying);
if ($from) {
$query->where('created_ts', '>=', Carbon::parse($from)->startOfDay()->timestamp);
}
if ($to) {
$query->where('created_ts', '<=', Carbon::parse($to)->endOfDay()->timestamp);
}
return number_format($query->sum('points'), 2);
}),
Summarizer::make()
->label('Points from Selling (Filtered)')
->using(function () {
$record = $this->getOwnerRecord();
$from = request()->input('tableFilters.created_ts.created_from');
$to = request()->input('tableFilters.created_ts.created_to');
$query = Transaction::query()
->where('member_id', $record->id)
->where('type', Type::EarnFromSelling);
if ($from) {
$query->where('created_ts', '>=', Carbon::parse($from)->startOfDay()->timestamp);
}
if ($to) {
$query->where('created_ts', '<=', Carbon::parse($to)->endOfDay()->timestamp);
}
return number_format($query->sum('points'), 2);
}),
]),
])
->defaultSort('created_ts', 'desc')
->paginationPageOptions([5,10,25])
->filters([
Tables\Filters\Filter::make('created_ts')
->label('Transaction Date')
->form([
DatePicker::make('created_from')
->label('Transaction From')
->maxDate(Carbon::today()),
DatePicker::make('created_to')
->label('Transaction To')
->maxDate(Carbon::today()),
])
->query(function (Builder $query, array $data): Builder {
return $query
->when(
$data['created_from'],
fn (Builder $query, $date): Builder =>
$query->where('created_ts', '>=', Carbon::parse($date)->startOfDay()->timestamp),
)
->when(
$data['created_to'],
fn (Builder $query, $date): Builder =>
$query->where('created_ts', '<=', Carbon::parse($date)->endOfDay()->timestamp),
);
})
])
->headerActions([
ExportAction::make()
->exporter(TransactionExporter::class)
->color('info')
->icon('heroicon-m-arrow-down-tray')
])
->actions([
// Tables\Actions\EditAction::make(),
// Tables\Actions\DeleteAction::make(),
])
->bulkActions([
// Tables\Actions\BulkActionGroup::make([
// Tables\Actions\DeleteBulkAction::make(),
// ]),
]);
}
}
Please or to participate in this conversation.