From 16cfac419d5a4d9626760c710bedc3a6fc4d91cc Mon Sep 17 00:00:00 2001 From: salam Date: Wed, 18 Mar 2026 14:19:34 +0100 Subject: [PATCH] add player --- .../Resources/Players/Pages/CreatePlayer.php | 11 + .../Resources/Players/Pages/EditPlayer.php | 19 + .../Resources/Players/Pages/ListPlayers.php | 24 ++ .../Resources/Players/PlayerResource.php | 41 ++ .../Resources/Players/Schemas/PlayerForm.php | 18 + .../Resources/Players/Tables/PlayersTable.php | 32 ++ app/Filament/Imports/PlayerImporter.php | 60 +++ app/Models/Player.php | 13 + composer.lock | 400 ++++++------------ ...2026_03_18_121404_create_players_table.php | 29 ++ 10 files changed, 376 insertions(+), 271 deletions(-) create mode 100644 app/Filament/Clusters/StaticData/Resources/Players/Pages/CreatePlayer.php create mode 100644 app/Filament/Clusters/StaticData/Resources/Players/Pages/EditPlayer.php create mode 100644 app/Filament/Clusters/StaticData/Resources/Players/Pages/ListPlayers.php create mode 100644 app/Filament/Clusters/StaticData/Resources/Players/PlayerResource.php create mode 100644 app/Filament/Clusters/StaticData/Resources/Players/Schemas/PlayerForm.php create mode 100644 app/Filament/Clusters/StaticData/Resources/Players/Tables/PlayersTable.php create mode 100644 app/Filament/Imports/PlayerImporter.php create mode 100644 app/Models/Player.php create mode 100644 database/migrations/2026_03_18_121404_create_players_table.php 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'); + } +};