jeffersongoncalves/filament-action-export
Installation:
composer require jeffersongoncalves/filament-action-export "^3.0"
First Use Case: Add to a Filament table's header actions (for full dataset export) or bulk actions (for selected records):
use JeffersonGoncalves\FilamentExportAction\Actions\FilamentExportHeaderAction;
public function table(Table $table): Table {
return $table
->columns([...])
->headerActions([
FilamentExportHeaderAction::make('export')
->formats([ExportFormat::Csv, ExportFormat::Xlsx])
]);
}
Where to Look First:
Enums/ExportFormat.php: Available formats (Csv, Xlsx, Pdf).ValueObjects/AdditionalColumn.php: For custom columns in exports.Bulk Export (Selected Records):
FilamentExportBulkAction::make('export')
->formats([ExportFormat::Pdf])
->excludeColumns(['password'])
->additionalColumns([...])
->directDownload(); // Skip modal
Header Export (All Records):
FilamentExportHeaderAction::make('export')
->withFilters() // Respect active filters
->withSearch() // Include search terms
->modifyQueryUsing(fn ($query) => $query->where('active', true));
Dynamic File Naming:
->fileNameUsing(fn ($action) => "report-{$action->getRecords()->count()}")
PDF Customization:
Publish views (php artisan vendor:publish --tag=filament-action-export-views) to override:
resources/views/vendor/filament-action-export/pdf.blade.phpresources/views/vendor/filament-action-export/print.blade.phpSnappy PDF Driver:
composer require barryvdh/laravel-snappy
->snappy()
->pdfOptions(['paper' => 'a4', 'orientation' => 'landscape']);
Chunking Large Datasets:
Use chunkSize() for memory efficiency:
->chunkSize(500); // Default: 1000
Reactive Column Selection: Disable column filters in the modal:
->disableFilterColumns();
| Use Case | Implementation |
|---|---|
| Exclude sensitive data | ->excludeColumns(['password']) |
| Add static metadata | ->extraViewData(['company' => 'Acme']) |
| Format dates | ->formatStates(['created_at' => fn($v) => Carbon::parse($v)->format('d/m/Y')]) |
| Custom Excel writer | ->modifyExcelWriter(fn($writer) => $writer->setStyle(...)) |
Print/Preview Issues:
print_enabled is true in config and no JS errors block iframe rendering.shouldRefresh is not defined (v3.6.6+ fix).Empty Relationship Data:
roles.name).->eagerLoadRelationships(['roles']) or manually eager-load in modifyQueryUsing.PDF/Snappy Dependencies:
Class 'Snappy' not found → Install barryvdh/laravel-snappy.DomPDF not found → Install barryvdh/laravel-dompdf.Column Filter Sync:
->withHiddenColumns() or ensure disableFilterColumns() is false.Livewire State Conflicts:
Property [mountedTableBulkAction] not found (v3.6.5+).statePath() instead of name() in custom views.Log Export Data:
->modifyExcelWriter(fn($writer) => {
\Log::info('Exporting records:', $writer->getRecords()->toArray());
});
Test PDF Locally:
->directDownload()
->modifyPdfWriter(fn($pdf) => $pdf->stream("test.pdf"));
Inspect Modal State:
Add x-data to published table-view.blade.php to debug Alpine.js state:
<div x-data="{ debug: @entangle('debug') }" x-init="console.log($data)">
Custom Export Logic:
Override the handle() method in a custom action class:
class CustomExportAction extends FilamentExportHeaderAction {
public function handle(): void {
$this->modifyQueryUsing(fn($query) => $query->where('custom', true));
parent::handle();
}
}
Dynamic Format Availability:
->formatsUsing(fn () => auth()->user()->can('export_xlsx') ? [ExportFormat::Xlsx] : [])
Post-Export Actions:
Use afterExport event (publish config first):
// config/filament-action-export.php
'events' => [
'afterExport' => fn ($action) => \Log::info("Exported {$action->getFormat()}", $action->getRecords()->toArray()),
];
Global Defaults:
Set in config/filament-action-export.php to avoid repetition:
'default_format' => 'xlsx',
'pdf_driver' => 'snappy',
Time Format: Override the filename suffix format:
->timeFormat('Y-m-d_His'); // e.g., "report_2023-10-05_143022.xlsx"
Icons: Customize in config:
'icons' => [
'action' => 'heroicon-o-cloud-arrow-down',
],
How can I help you explore Laravel packages today?