simedkom/app/Filament/Resources/Manage/DataChanges/Tables/DataChangeTable.php

115 lines
4.7 KiB
PHP

<?php
namespace App\Filament\Resources\Manage\DataChanges\Tables;
use App\Enums\DataChangeStatus;
use App\Enums\RoleEnum;
use App\Filament\Actions\DefaultBulkActions;
use App\Filament\Columns\RowIndexColumn;
use App\Filament\Resources\Manage\DataChanges\Actions\DataChangeRequest\AcceptAction;
use App\Filament\Resources\Manage\DataChanges\Actions\DataChangeRequest\RejectAction;
use App\Filament\Support\CheerfulNotification;
use App\Models\Company;
use App\Models\DataChangeRequest;
use App\Models\Journalist;
use App\Models\PartnerMedia;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\ViewAction;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Filters\TrashedFilter;
use Filament\Tables\Table;
class DataChangeTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
...RowIndexColumn::make(),
TextColumn::make('user.name')
->label('Pemohon')
->searchable()
->sortable()
->description(fn (DataChangeRequest $record): ?string => $record?->entity?->name)
->visible(! auth()->user()->hasRole(RoleEnum::PERUSAHAAN->value)),
TextColumn::make('entity_type')
->label('Jenis Data')
->searchable()
->sortable()
->description(fn (DataChangeRequest $record): ?string => match (true) {
isset($record->new_data['__delete_request__']) => CheerfulNotification::getByKey('data_change.deletion'),
empty($record->old_data) => CheerfulNotification::getByKey('data_change.addition'),
default => CheerfulNotification::getByKey('data_change.change'),
})
->formatStateUsing(fn (DataChangeRequest $record): ?string => match ($record->entity_type) {
Company::class => 'Perusahaan',
PartnerMedia::class => 'Media',
Journalist::class => 'Jurnalis',
default => 'Lainnya',
})
->color(fn (DataChangeRequest $record): ?string => match ($record->entity_type) {
Company::class => 'success',
PartnerMedia::class => 'info',
Journalist::class => 'warning',
default => 'secondary',
})
->badge(),
TextColumn::make('status')
->label('Status')
->searchable()
->sortable()
->badge()
->formatStateUsing(fn (DataChangeStatus $state): string => $state->getLabel())
->color(fn (DataChangeStatus $state): string => $state->getColor())
->description(fn (DataChangeRequest $record): ?string => $record?->review ? 'Oleh: '.$record->review?->reviewer?->name : ''),
TextColumn::make('change_reason')
->label('Alasan Perubahan')
->limit(50),
TextColumn::make('review.note')
->label('Alasan Penolakan')
->limit(50),
TextColumn::make('created_at')
->label('Tanggal Permohonan')
->date()
->sortable()
->dateTime('l, d F Y H:i:s')
->wrap(),
])
->filters([
SelectFilter::make('status')
->label('Status')
->options(DataChangeStatus::class)
->native(false),
TrashedFilter::make()
->native(false)
->visible(fn () => auth()->user()?->hasRole(RoleEnum::DEVELOPER->value)),
])
->recordActions([
ViewAction::make(),
AcceptAction::make(),
RejectAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
...DefaultBulkActions::make('permohonan perubahan data'),
]),
])
->emptyStateIcon(Heroicon::OutlinedDocumentText)
->emptyStateHeading(fn () => CheerfulNotification::getByKey('data_change.empty_state_heading'))
->emptyStateDescription(fn () => CheerfulNotification::getByKey('data_change.empty_state'))
->defaultSort('created_at', 'desc')
->deferFilters(false)
->paginated([25, 50, 100, 'all'])
->deferLoading();
}
}