martinpetricko/filament-restore-or-create

FilamentPHP package that adds ability to check for similar deleted records and restore them instead of creating new ones.

1.0.0 2025-04-23 00:52 UTC

This package is auto-updated.

Last update: 2025-04-23 00:54:08 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Restore or Create is a FilamentPHP plugin that helps prevent duplicate records by detecting and restoring soft-deleted models when similar data is submitted via a create form.

Features

  • Detects similar soft-deleted records before creating a new one.
  • Displays a modal with details and an option to restore the deleted record.
  • Fully customizable detection, display, and behavior logic.

Installation

Install via Composer:

composer require martinpetricko/filament-restore-or-create

Optionally, publish the translation files:

php artisan vendor:publish --tag="filament-restore-or-create-translations"

Usage

Add CheckDeleted trait to your resource's CreateRecord page:

use MartinPetricko\FilamentRestoreOrCreate\Concerns\CreateRecord\CheckDeleted;

class CreateUser extends CreateRecord
{
    use CheckDeleted;

    protected static string $resource = UserResource::class;
}

Customization

Attributes to check

Define which fields should be used to detect similar deleted records:

protected function checkDeletedAttributes(): array
{
    return ['name', 'email', 'phone'];
}

Custom Query Logic

Override the default query to define your own matching logic:

protected function checkDeletedModel(array $data): ?Model
{
    return static::getResource()::getEloquentQuery()
        ->whereLike('name', '%' . $data['name'] . '%')
        ->onlyTrashed()
        ->latest()
        ->first();
}

Modal Display Fields

Choose which attributes to show in the confirmation modal:

protected function showDeletedAttributes(): ?array
{
    return ['name', 'email', 'phone', 'address', 'deleted_at'];
}

Restore Notification

Customize the notification shown after a record is restored:

protected function getRestoredNotification(): ?Notification
{
    return Notification::make()
        ->success()
        ->title('Restored');
}

Redirect After Restore

Control where the user is redirected after restoring:

protected function getRestoreRedirectUrl(Model $record): string
{
    /** @var class-string<Resource> $resource */
    $resource = static::getResource();

    if ($resource::hasPage('edit') && $resource::canEdit($record)) {
        return $resource::getUrl('edit', ['record' => $record]);
    }

    return $resource::getUrl();
}

Advanced Integration

If you override beforeCreate or getFormActions, ensure the restore behavior is still called:

class CreateUser extends CreateRecord
{
    use CheckDeleted {
        beforeCreate as checkDeletedBeforeCreate;
    }
    
    protected function getFormActions(): array
    {
        return [
            // Custom form actions
            
            $this->getCheckDeletedFormAction(),
        ];
    }

    protected function beforeCreate(): void
    {
        $this->checkDeletedBeforeCreate();
        
        // Your custom logic
    }
}

Testing

composer test

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.