From b399141c7ee3f1d5bf7023038852faeb73a33439 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Thu, 21 Aug 2025 17:07:34 +0530 Subject: [PATCH] Add UserExporter and UserImporter classes with export/import functionality --- app/Filament/Exports/UserExporter.php | 52 +++++++++++++++ app/Filament/Imports/UserImporter.php | 85 +++++++++++++++++++++++++ app/Filament/Resources/UserResource.php | 17 +++++ 3 files changed, 154 insertions(+) create mode 100644 app/Filament/Exports/UserExporter.php create mode 100644 app/Filament/Imports/UserImporter.php diff --git a/app/Filament/Exports/UserExporter.php b/app/Filament/Exports/UserExporter.php new file mode 100644 index 000000000..8c8f99d72 --- /dev/null +++ b/app/Filament/Exports/UserExporter.php @@ -0,0 +1,52 @@ +label('ID'), + ExportColumn::make('no') + ->label('NO') + ->state(function ($record) use (&$rowNumber) { + // Increment and return the row number + return ++$rowNumber; + }), + ExportColumn::make('name') + ->label('Name'), + ExportColumn::make('email') + ->label('Email'), + ExportColumn::make('password') + ->label('Password'), + ExportColumn::make('created_at') + ->label('CREATED AT'), + ExportColumn::make('updated_at') + ->label('UPDATED AT'), + ExportColumn::make('deleted_at') + ->enabledByDefault(false) + ->label('DELETED AT'), + ]; + } + + public static function getCompletedNotificationBody(Export $export): string + { + $body = 'Your user export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.'; + + if ($failedRowsCount = $export->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/UserImporter.php b/app/Filament/Imports/UserImporter.php new file mode 100644 index 000000000..222c6efbc --- /dev/null +++ b/app/Filament/Imports/UserImporter.php @@ -0,0 +1,85 @@ +requiredMapping() + ->exampleHeader('Name') + ->example('Admin') + ->label('Name') + ->rules(['required']),//, 'max:255' + ImportColumn::make('email') + ->requiredMapping() + ->exampleHeader('Email') + ->example('admin@cripumps.com') + ->label('Email') + ->rules(['required', 'email']),//, 'max:255' + ImportColumn::make('password') + ->requiredMapping() + ->exampleHeader('Password') + ->example('admin@pass') + ->label('Password') + ->rules(['required']),//, 'max:255' + ]; + } + + public function resolveRecord(): ?User + { + $warnMsg = []; + if (Str::length($this->data['name']) < 0) { + $warnMsg[] = "User name not found"; + } + // || !is_numeric($this->data['code']) || !preg_match('/^[1-9]\d{3,}$/', $this->data['code']) + if (Str::length($this->data['email']) < 5) { + $warnMsg[] = "Invalid email found"; + } + if (Str::length($this->data['password']) < 3) { + $warnMsg[] = "Invalid password found"; + } + + if (!empty($warnMsg)) { + throw new RowImportFailedException(implode(', ', $warnMsg)); + } + + User::updateOrCreate([ + 'email' => $this->data['email'], + ], + [ + 'name' => $this->data['name'], + 'password' => $this->data['password'], + ]); + + return null; + // return User::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + //return new User(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your user import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Resources/UserResource.php b/app/Filament/Resources/UserResource.php index 5cb82c35b..9a72144e1 100644 --- a/app/Filament/Resources/UserResource.php +++ b/app/Filament/Resources/UserResource.php @@ -2,13 +2,18 @@ namespace App\Filament\Resources; +use App\Filament\Exports\UserExporter; +use App\Filament\Imports\UserImporter; use App\Filament\Resources\UserResource\Pages; use App\Filament\Resources\UserResource\RelationManagers; use App\Models\User; +use Filament\Facades\Filament; use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; +use Filament\Tables\Actions\ExportAction; +use Filament\Tables\Actions\ImportAction; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; @@ -134,6 +139,18 @@ class UserResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(UserImporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view import user'); + }), + ExportAction::make() + ->exporter(UserExporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view export user'); + }), ]); }