Files
core/src/Privacy/RelationManagers/ErasureRequestsRelationManager.php
T

81 lines
3.5 KiB
PHP
Raw Normal View History

<?php
namespace Modules\Core\Privacy\RelationManagers;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables\Actions\Action;
use Filament\Tables\Actions\ViewAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Modules\Core\Privacy\ErasureRequestStatus;
use Modules\Core\Privacy\Filament\Resources\DataErasureRequestResource;
use Modules\Core\Privacy\Models\DataErasureRequest;
use Modules\Core\Privacy\PrivacyService;
/**
* Lists erasure requests where the record being viewed (Customer or User) is the
* subject — scoped via the Customer::erasureRequests()/{User}::erasureRequests()
* morphMany macros registered in CorePlugin. Read-mostly, same as
* DataErasureRequestResource itself — no create here either, requests are opened
* via PrivacyService (see CustomerErasureActionsExtension for the Customer-page
* entry point).
*/
class ErasureRequestsRelationManager extends RelationManager
{
protected static string $relationship = 'erasureRequests';
protected static ?string $title = 'Erasure Requests';
public function table(Table $table): Table
{
return $table
->recordTitleAttribute('id')
->columns([
TextColumn::make('id')
->label('#'),
TextColumn::make('status')
->badge()
->formatStateUsing(fn (ErasureRequestStatus $state) => ucfirst($state->value))
->color(fn (ErasureRequestStatus $state) => match ($state) {
ErasureRequestStatus::Pending => 'warning',
ErasureRequestStatus::Cancelled => 'gray',
ErasureRequestStatus::Completed => 'success',
}),
TextColumn::make('requestedBy')
->label('Requested by')
->state(fn (DataErasureRequest $record) => DataErasureRequest::displayNameFor($record->requestedBy)),
TextColumn::make('scheduled_for')
->label('Scheduled for')
->dateTime(),
TextColumn::make('caused_by_request_id')
->label('Cascade')
->formatStateUsing(fn (?int $state) => $state ? "from #{$state}" : '—'),
TextColumn::make('created_at')
->label('Requested at')
->dateTime(),
])
->defaultSort('created_at', 'desc')
->filters([
SelectFilter::make('status')
->options([
ErasureRequestStatus::Pending->value => 'Pending',
ErasureRequestStatus::Cancelled->value => 'Cancelled',
ErasureRequestStatus::Completed->value => 'Completed',
]),
])
->headerActions([])
->actions([
ViewAction::make()
->url(fn (DataErasureRequest $record) => DataErasureRequestResource::getUrl('view', ['record' => $record])),
Action::make('cancel')
->label('Cancel')
->icon('heroicon-o-x-circle')
->color('danger')
->requiresConfirmation()
->visible(fn (DataErasureRequest $record) => $record->isPending())
->action(fn (DataErasureRequest $record, PrivacyService $privacyService) => $privacyService->cancelErasure($record)),
]);
}
}