diff --git a/app/Filament/Clusters/StaticData/Resources/Players/Pages/CreatePlayer.php b/app/Filament/Clusters/StaticData/Resources/Players/Pages/CreatePlayer.php new file mode 100644 index 00000000..06e4802f --- /dev/null +++ b/app/Filament/Clusters/StaticData/Resources/Players/Pages/CreatePlayer.php @@ -0,0 +1,11 @@ +modalDescription('Separator comma ",", First line: "name,player_id"') + ->importer(PlayerImporter::class), + ]; + } +} diff --git a/app/Filament/Clusters/StaticData/Resources/Players/PlayerResource.php b/app/Filament/Clusters/StaticData/Resources/Players/PlayerResource.php new file mode 100644 index 00000000..0b0ee5e7 --- /dev/null +++ b/app/Filament/Clusters/StaticData/Resources/Players/PlayerResource.php @@ -0,0 +1,41 @@ + ListPlayers::route('/'), + ]; + } +} diff --git a/app/Filament/Clusters/StaticData/Resources/Players/Schemas/PlayerForm.php b/app/Filament/Clusters/StaticData/Resources/Players/Schemas/PlayerForm.php new file mode 100644 index 00000000..834dd75b --- /dev/null +++ b/app/Filament/Clusters/StaticData/Resources/Players/Schemas/PlayerForm.php @@ -0,0 +1,18 @@ +components([ + TextInput::make('player_id')->afterLabel(['Must be unique']), + TextInput::make('name'), + ]); + } +} diff --git a/app/Filament/Clusters/StaticData/Resources/Players/Tables/PlayersTable.php b/app/Filament/Clusters/StaticData/Resources/Players/Tables/PlayersTable.php new file mode 100644 index 00000000..3f28d1e6 --- /dev/null +++ b/app/Filament/Clusters/StaticData/Resources/Players/Tables/PlayersTable.php @@ -0,0 +1,32 @@ +columns([ + Stack::make([ + TextColumn::make('player_id') + ->badge() + ->searchable(), + TextColumn::make('name') + ->searchable(), + ]), + ]) + ->contentGrid([ + 'md' => 3, + 'xl' => 5, + ]) + ->recordActions([ + EditAction::make()->hiddenLabel(), + ]); + } +} diff --git a/app/Filament/Imports/PlayerImporter.php b/app/Filament/Imports/PlayerImporter.php new file mode 100644 index 00000000..88a1f4bf --- /dev/null +++ b/app/Filament/Imports/PlayerImporter.php @@ -0,0 +1,60 @@ +castStateUsing(function (string $state): ?int { + if (blank($state)) { + return null; + } + + return (int) $state; + }) + ->requiredMapping() + ->numeric(), + ImportColumn::make('name') + ->castStateUsing(function (string $state): ?string { + if (blank($state)) { + return null; + } + + $state = preg_replace('@\([^\)]*\)$@', '', $state); + + return trim($state); + }) + ->requiredMapping() + ->rules(['required', 'max:255']), + ]; + } + + public function resolveRecord(): Player + { + return Player::firstOrNew([ + 'player_id' => (int) $this->data['player_id'], + ]); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your player 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/Models/Player.php b/app/Models/Player.php new file mode 100644 index 00000000..c61e882e --- /dev/null +++ b/app/Models/Player.php @@ -0,0 +1,13 @@ +id(); + $table->integer('player_id')->index()->uniqid(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('players'); + } +};