emmanpbarrameda/filament-take-picture-field
Installation:
composer require emmanpbarrameda/filament-take-picture-field
Publish the config file (if needed):
php artisan vendor:publish --provider="Emmanpbarrameda\FilamentTakePictureField\FilamentTakePictureFieldServiceProvider" --tag="filament-take-picture-field-config"
First Use Case: Add the field to a Filament form resource:
use Emmanpbarrameda\FilamentTakePictureField\Fields\TakePictureField;
TakePictureField::make('profile_photo')
->label('Profile Photo')
->required()
->directory('profile-photos')
->visibility('public')
->aspectRatio(1) // 1:1 ratio
->maxDimensions(1024, 1024),
Where to Look First:
Basic Integration: Use the field in a Filament resource form:
TakePictureField::make('product_image')
->directory('products')
->visibility('private')
->maxDimensions(2048, 2048),
Multi-Camera Support: Enable camera selection for devices with multiple cameras:
TakePictureField::make('document_scan')
->allowCameraSelection()
->directory('documents'),
Multiple Shots: Capture multiple images in a single field:
TakePictureField::make('gallery_images')
->multiple()
->maxShots(5)
->directory('gallery'),
Dynamic Configuration: Use closures for dynamic settings:
TakePictureField::make('dynamic_photo')
->directory(fn ($record) => "users/{$record->id}/photos")
->maxDimensions(fn () => [config('app.max_width'), config('app.max_height')]),
Validation and Processing: Combine with Filament’s validation rules:
TakePictureField::make('avatar')
->required()
->image()
->maxSize(2048)
->directory('avatars'),
Displaying Captured Images: Use the field in a table for display:
use Emmanpbarrameda\FilamentTakePictureField\Columns\TakePictureColumn;
TakePictureColumn::make('profile_photo')
->width(64)
->height(64),
directory exists in your filesystem (e.g., storage/app/public/profile-photos).visibility('public').MediaDevices). Test in supported browsers.TakePictureField::make('fallback_image')
->fallbackUpload()
->directory('fallbacks'),
Browser Compatibility:
Directory Permissions:
visibility('public'), ensure the directory is symlinked to public/storage:
php artisan storage:link
www-data or nginx).Image Processing:
maxDimensions, but heavy resizing may impact performance. Test with large images.Multiple Shots:
CORS Issues:
// config/cors.php
'paths' => ['api/*', 'sanctum/csrf-cookie', 'filament/*'],
Camera Not Working:
NotAllowedError for permission issues).Images Not Saving:
directory path is correct and writable.storage/logs/laravel.log) for filesystem errors.Field Not Rendering:
config/filament.php under form_components.php artisan filament:cache:clear
Extending the Field: Customize behavior by extending the field:
namespace App\Filament\Fields;
use Emmanpbarrameda\FilamentTakePictureField\Fields\TakePictureField;
class CustomTakePictureField extends TakePictureField
{
protected function setUp(): void
{
parent::setUp();
$this->beforeSaving(function ($record, $state) {
// Add custom logic (e.g., rename files, add watermarks)
$state['custom_processed'] = true;
});
}
}
Dynamic Directories: Use closures for dynamic directories based on record attributes:
TakePictureField::make('user_photo')
->directory(fn ($record) => "users/{$record->id}/photos_{$record->created_at->format('Y-m')}")
->visibility('private'),
Fallback for Unsupported Devices: Combine with a regular file upload field:
Column::make('photo')
->image()
->fallback(
FileUpload::make('photo_fallback')
->directory('fallbacks')
->image()
),
Testing: Mock the camera API in tests using tools like jsdom or Puppeteer:
// Example using Pest and BrowserKit
$response = $this->get('/filament/resources/test-resource/create');
$response->assertSee('Camera access required');
Performance:
quality():
TakePictureField::make('thumbnail')
->quality(80)
->maxDimensions(512, 512),
Localization: Customize labels and messages in your language files:
// lang/en/filament-take-picture-field.php
return [
'camera_access_required' => 'Please allow camera access to capture your photo.',
];
How can I help you explore Laravel packages today?