Customizable export and print functionality for Filament Admin Panel.
This package provides a bulk action and header action to export your filament tables easily.
- PHP 8
- Filament 2.0
composer require alperenersoy/filament-export
To use this package in a standalone table builder instead of Filament Admin Panel you need to follow these steps. Otherwise, some features such as print and preview may not work properly.
- Import
filament-export.css
in your/resources/app.css
@import '../../vendor/alperenersoy/filament-export/resources/css/filament-export.css';
- Import
filament-export.js
in your/resources/app.js
import '../../vendor/alperenersoy/filament-export/resources/js/filament-export.js';
- Compile your assets
npm run dev
You can export selected rows with the bulk action.
Filament Admin Panel
$table->bulkActions([
...
FilamentExportBulkAction::make('export')
...
]);
Filament Table Builder
protected function getTableBulkActions(): array
{
return [
...
FilamentExportBulkAction::make('Export'),
...
];
}
You can filter, search, sort and export your table with the header action.
Filament Admin Panel
$table->headerActions([
...
FilamentExportHeaderAction::make('export')
...
]);
Filament Table Builder
protected function getTableHeaderActions(): array
{
return [
...
FilamentExportHeaderAction::make('Export'),
...
];
}
Since ButtonAction is deprecated you may use this action with ->button() instead.
Both actions provide functions for configuration.
FilamentExportBulkAction::make('export')
->fileName('My File') // Default file name
->timeFormat('m y d') // Default time format for naming exports
->disablePdf() // Disable PDF format for download
->disableXlsx() // Disable XLSX format for download
->disableCsv() // Disable CSV format for download
->defaultFormat('pdf') // xlsx, csv or pdf
->defaultPageOrientation('landscape') // Page orientation for pdf files. portrait or landscape
->directDownload() // Download directly without showing modal
->disableAdditionalColumns() // Disable additional columns input
->disableFilterColumns() // Disable filter columns input
->disableFileName() // Disable file name input
->disableFileNamePrefix() // Disable file name prefix
->disablePreview() // Disable export preview
->disableTableColumns() // Disable table columns in the export
->withHiddenColumns() //Show the columns which are toggled hidden
->fileNameFieldLabel('File Name') // Label for file name input
->formatFieldLabel('Format') // Label for format input
->pageOrientationFieldLabel('Page Orientation') // Label for page orientation input
->filterColumnsFieldLabel('filter columns') // Label for filter columns input
->additionalColumnsFieldLabel('Additional Columns') // Label for additional columns input
->additionalColumnsTitleFieldLabel('Title') // Label for additional columns' title input
->additionalColumnsDefaultValueFieldLabel('Default Value') // Label for additional columns' default value input
->additionalColumnsAddButtonLabel('Add Column') // Label for additional columns' add button
->withColumns([TextColumn::make('additionalModelColumn')]) // Export additional model columns that aren't visible in the table results
->csvDelimiter(',') // Delimiter for csv files
->modifyExcelWriter(fn (SimpleExcelWriter $writer) => $writer->nameCurrentSheet('Sheet')) // Modify SimpleExcelWriter before download
->modifyPdfWriter(fn (\Barryvdh\DomPDF\PDF|\Barryvdh\Snappy\PdfWrapper $writer) => $writer->setPaper('a4', 'landscape')) // Modify DomPdf or Snappy writer before download
->formatStates([
'name' => fn (?Model $record) => strtoupper($record->name),
]) // Manually format states for a specific column
You can also use default bulk action and header action functions to customize actions.
- Since header action does server-side pagination you may choose header action over bulk action.
- You may disable preview.
- You may enable direct download.
Publish configuration
php artisan vendor:publish --provider="AlperenErsoy\FilamentExport\FilamentExportServiceProvider" --tag="config"
You can configure these settings:
return [
'default_format' => 'xlsx',
'time_format' => 'M_d_Y-H_i',
'default_page_orientation' => 'portrait',
'disable_additional_columns' => false,
'disable_filter_columns' => false,
'disable_file_name' => false,
'disable_preview' => false,
'use_snappy' => false,
'action_icon' => 'heroicon-o-document-download',
'preview_icon' => 'heroicon-o-eye',
'export_icon' => 'heroicon-o-download',
'print_icon' => 'heroicon-o-printer',
'cancel_icon' => 'heroicon-o-x-circle'
];
Publish views
php artisan vendor:publish --provider="AlperenErsoy\FilamentExport\FilamentExportServiceProvider" --tag="views"
This package has two views:
-
"components\table_view.blade.php" view is used for preview.
-
"pdf.blade.php" view is used as pdf export template.
-
"print.blade.php" view is used as print template.
FilamentExportBulkAction::make('export')
->extraViewData([
'myVariable' => 'My Variable'
])
or use closures
FilamentExportHeaderAction::make('export')
->extraViewData(fn ($action) => [
'recordCount' => $action->getRecords()->count()
])
Then use them in the templates as regular blade variables:
{{ $myVariable }}
By default the output for the export is a copy of the output from the table view. In some instances, you might wish to change this (e.g. remove HTML formatting or change date formatting to be more compatible with your spreadsheet application).
public function table(Table $table): Table
{
return $table
...
->headerActions([
FilamentExportHeaderAction::make('export')->label(__('Export'))
->formatStates([
'first_name' => fn(Column $column):string => $column->getState(), // returns raw value
'last_name' => fn(string $state) :string => $state, // returns raw value
'fullname' => fn(Model $record) :string => $record->fullname . "\t", // returns value with appended character(s)
'middle_name' => function(Model $record) { // more complex example
$state = $record->middle_name;
if($middle_name == 'bob') {
// do some extra code/calculations
$state = 'not bob';
}
return $state;
}
])
,
]);
}
By default, this package uses dompdf as pdf generator.
If you want to use Snappy instead you need to install barryvdh/laravel-snappy to your project and configure it yourself. (See barryvdh/laravel-snappy for more information.)
To use snappy for PDF exports:
- You can simply add ->snappy() to your actions.
FilamentExportBulkAction::make('export')
->snappy()
or
FilamentExportHeaderAction::make('export')
->snappy()
- You can update the config file to use it as default.
[
...
'use_snappy' => true,
...
]