Skip to content

Commit d1bbc95

Browse files
authored
feat: Add CSV export functionality for Tags, Categories, and People (#13)
* Add export functionality to PersonResource Introduced a `PersonExporter` class to handle exporting Person data with defined columns and notifications. Updated `ListPeople` to include an export action supporting CSV format, enhancing data management capabilities. * Add export functionality for categories Implemented a `CategoryExporter` class to handle category exports with specific columns and notifications. Integrated an export action into the category list page, supporting CSV format. This enhancement improves data handling and accessibility for category records. * Add Tag export functionality with CSV support Introduced `TagExporter` to handle exporting tags with columns for ID, name, and color. Integrated an export action into the `ListTags` page, enabling CSV export and providing notification details for successes and failures.
1 parent d7ef4b5 commit d1bbc95

File tree

6 files changed

+126
-0
lines changed

6 files changed

+126
-0
lines changed
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace App\Filament\Exports;
4+
5+
use App\Models\Category;
6+
use Filament\Actions\Exports\ExportColumn;
7+
use Filament\Actions\Exports\Exporter;
8+
use Filament\Actions\Exports\Models\Export;
9+
10+
class CategoryExporter extends Exporter
11+
{
12+
protected static ?string $model = Category::class;
13+
14+
public static function getColumns(): array
15+
{
16+
return [
17+
ExportColumn::make('id')
18+
->label('ID'),
19+
ExportColumn::make('name'),
20+
];
21+
}
22+
23+
public static function getCompletedNotificationBody(Export $export): string
24+
{
25+
$body = 'Your category export has completed and '.number_format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.';
26+
27+
if ($failedRowsCount = $export->getFailedRowsCount()) {
28+
$body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
29+
}
30+
31+
return $body;
32+
}
33+
}
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace App\Filament\Exports;
4+
5+
use App\Models\Person;
6+
use Filament\Actions\Exports\ExportColumn;
7+
use Filament\Actions\Exports\Exporter;
8+
use Filament\Actions\Exports\Models\Export;
9+
10+
class PersonExporter extends Exporter
11+
{
12+
protected static ?string $model = Person::class;
13+
14+
public static function getColumns(): array
15+
{
16+
return [
17+
ExportColumn::make('id')
18+
->label('ID'),
19+
ExportColumn::make('user.name'),
20+
ExportColumn::make('name'),
21+
ExportColumn::make('nick_name'),
22+
];
23+
}
24+
25+
public static function getCompletedNotificationBody(Export $export): string
26+
{
27+
$body = 'Your person export has completed and '.number_format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.';
28+
29+
if ($failedRowsCount = $export->getFailedRowsCount()) {
30+
$body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
31+
}
32+
33+
return $body;
34+
}
35+
}

app/Filament/Exports/TagExporter.php

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace App\Filament\Exports;
4+
5+
use App\Models\Tag;
6+
use Filament\Actions\Exports\ExportColumn;
7+
use Filament\Actions\Exports\Exporter;
8+
use Filament\Actions\Exports\Models\Export;
9+
10+
class TagExporter extends Exporter
11+
{
12+
protected static ?string $model = Tag::class;
13+
14+
public static function getColumns(): array
15+
{
16+
return [
17+
ExportColumn::make('id')
18+
->label('ID'),
19+
ExportColumn::make('name'),
20+
ExportColumn::make('color'),
21+
];
22+
}
23+
24+
public static function getCompletedNotificationBody(Export $export): string
25+
{
26+
$body = 'Your tag export has completed and '.number_format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.';
27+
28+
if ($failedRowsCount = $export->getFailedRowsCount()) {
29+
$body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
30+
}
31+
32+
return $body;
33+
}
34+
}

app/Filament/Resources/CategoryResource/Pages/ListCategories.php

+8
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
namespace App\Filament\Resources\CategoryResource\Pages;
44

5+
use App\Filament\Exports\CategoryExporter;
56
use App\Filament\Resources\CategoryResource;
67
use Filament\Actions\CreateAction;
8+
use Filament\Actions\ExportAction;
9+
use Filament\Actions\Exports\Enums\ExportFormat;
710
use Filament\Resources\Pages\ListRecords;
811

912
class ListCategories extends ListRecords
@@ -14,6 +17,11 @@ protected function getHeaderActions(): array
1417
{
1518
return [
1619
CreateAction::make(),
20+
ExportAction::make()
21+
->exporter(CategoryExporter::class)
22+
->formats([
23+
ExportFormat::Csv,
24+
]),
1725
];
1826
}
1927
}

app/Filament/Resources/PersonResource/Pages/ListPeople.php

+8
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
namespace App\Filament\Resources\PersonResource\Pages;
44

5+
use App\Filament\Exports\PersonExporter;
56
use App\Filament\Imports\PersonImporter;
67
use App\Filament\Resources\PersonResource;
78
use Filament\Actions\CreateAction;
9+
use Filament\Actions\ExportAction;
10+
use Filament\Actions\Exports\Enums\ExportFormat;
811
use Filament\Actions\ImportAction;
912
use Filament\Resources\Pages\ListRecords;
1013

@@ -18,6 +21,11 @@ protected function getHeaderActions(): array
1821
CreateAction::make(),
1922
ImportAction::make()
2023
->importer(PersonImporter::class),
24+
ExportAction::make()
25+
->exporter(PersonExporter::class)
26+
->formats([
27+
ExportFormat::Csv,
28+
]),
2129
];
2230
}
2331
}

app/Filament/Resources/TagResource/Pages/ListTags.php

+8
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
namespace App\Filament\Resources\TagResource\Pages;
44

5+
use App\Filament\Exports\TagExporter;
56
use App\Filament\Imports\TagImporter;
67
use App\Filament\Resources\TagResource;
78
use Filament\Actions\CreateAction;
9+
use Filament\Actions\ExportAction;
10+
use Filament\Actions\Exports\Enums\ExportFormat;
811
use Filament\Actions\ImportAction;
912
use Filament\Resources\Pages\ListRecords;
1013

@@ -18,6 +21,11 @@ protected function getHeaderActions(): array
1821
CreateAction::make(),
1922
ImportAction::make()
2023
->importer(TagImporter::class),
24+
ExportAction::make()
25+
->exporter(TagExporter::class)
26+
->formats([
27+
ExportFormat::Csv,
28+
]),
2129
];
2230
}
2331
}

0 commit comments

Comments
 (0)