Feature: Data Access and Data Export Admin Service
This commit introduces the data retention and data export Admin Services, accessed by the Boboko admin UI
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
<?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)),
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user