Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: remove leaderboardList page and direct 'Manage Leaderboards' to Filament #2669

Merged
Merged
38 changes: 38 additions & 0 deletions app/Filament/Actions/DeleteLeaderboardAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

declare(strict_types=1);

namespace App\Filament\Actions;

use App\Models\Leaderboard;
use App\Models\User;
use Filament\Tables\Actions\Action;
use Illuminate\Support\Facades\Auth;

class DeleteLeaderboardAction extends Action
{
protected function setup(): void
{
parent::setUp();

/** @var User $user */
$user = Auth::user();

$this->label('Delete leaderboard')
->icon('heroicon-s-trash')
->color('danger')
->requiresConfirmation()
->modalDescription("Are you sure you want to permanently delete this leaderboard?")
->action(function (Leaderboard $leaderboard) use ($user) {
// TODO use soft deletes
if (!$user->can('forceDelete', $leaderboard)) {
return;
}

$leaderboard->forceDelete();
})
->visible(function (Leaderboard $leaderboard) use ($user) {
return $user->can('forceDelete', $leaderboard);
});
}
}
59 changes: 59 additions & 0 deletions app/Filament/Actions/ResetAllLeaderboardEntriesAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

declare(strict_types=1);

namespace App\Filament\Actions;

use App\Models\Leaderboard;
use App\Models\User;
use Filament\Tables\Actions\Action;
use Illuminate\Support\Facades\Auth;

class ResetAllLeaderboardEntriesAction extends Action
{
protected function setUp(): void
{
parent::setUp();

/** @var User $user */
$user = Auth::user();

$this->label('Delete all entries')
->icon('heroicon-s-trash')
->color('danger')
->requiresConfirmation()
->modalDescription("Are you sure you want to permanently delete all entries of this leaderboard?")
->action(function ($record = null) use ($user) {
$leaderboard = $record ?? $this->getLeaderboardParent();

if (!$user->can('resetAllEntries', $leaderboard)) {
return;
}

$leaderboard->entries()->delete();

activity()
->useLog('default')
->causedBy($user->id)
->performedOn($leaderboard)
->event('resetAllLeaderboardEntries')
->log('Reset All Leaderboard Entries');
})
->visible(function () use ($user) {
return $user->can('resetAllEntries', [Leaderboard::class]);
});
}

protected function getLeaderboardParent(): ?Leaderboard
{
$livewire = $this->getLivewire();

if (!method_exists($livewire, 'getRelationship')) {
return null;
}

$parentLeaderboardId = $livewire->getRelationship()->getParent()->id;

return Leaderboard::findOrFail($parentLeaderboardId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace App\Filament\Resources\GameResource\RelationManagers;

use App\Filament\Actions\DeleteLeaderboardAction;
use App\Filament\Actions\ResetAllLeaderboardEntriesAction;
use App\Models\Game;
use App\Models\Leaderboard;
use App\Models\User;
Expand Down Expand Up @@ -104,59 +106,8 @@ public function table(Table $table): Table
return $user->can('update', $leaderboard);
}),

Action::make('reset_all_entries')
->label('Delete All Entries')
->icon('heroicon-s-trash')
->color('danger')
->requiresConfirmation()
->modalDescription("Are you sure you want to permanently delete all entries of this leaderboard?")
->action(function (Leaderboard $leaderboard) {
/** @var User $user */
$user = auth()->user();

if (!$user->can('resetAllEntries', $leaderboard)) {
return;
}

$leaderboard->entries()->delete();

activity()
->useLog('default')
->causedBy($user)
->performedOn($leaderboard)
->event('resetAllLeaderboardEntries')
->log('Reset All Leaderboard Entries');
})
->visible(function (Leaderboard $leaderboard) {
/** @var User $user */
$user = auth()->user();

return $user->can('resetAllEntries', $leaderboard);
}),

Action::make('delete_leaderboard')
->label('Delete Leaderboard')
->icon('heroicon-s-trash')
->color('danger')
->requiresConfirmation()
->modalDescription("Are you sure you want to permanently delete this leaderboard?")
->action(function (Leaderboard $leaderboard) {
/** @var User $user */
$user = auth()->user();

// TODO use soft deletes
if (!$user->can('forceDelete', $leaderboard)) {
return;
}

$leaderboard->forceDelete();
})
->visible(function (Leaderboard $leaderboard) {
/** @var User $user */
$user = auth()->user();

return $user->can('forceDelete', $leaderboard);
}),
ResetAllLeaderboardEntriesAction::make('delete_all_entries'),
DeleteLeaderboardAction::make('delete_leaderboard'),
]),
])
->bulkActions([
Expand Down
32 changes: 28 additions & 4 deletions app/Filament/Resources/LeaderboardResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace App\Filament\Resources;

use App\Filament\Actions\DeleteLeaderboardAction;
use App\Filament\Actions\ResetAllLeaderboardEntriesAction;
use App\Filament\Extensions\Resources\Resource;
use App\Filament\Resources\LeaderboardResource\Pages;
use App\Filament\Resources\LeaderboardResource\RelationManagers;
Expand Down Expand Up @@ -90,10 +92,6 @@ public static function infolist(Infolist $infolist): Infolist
Infolists\Components\TextEntry::make('Title'),

Infolists\Components\TextEntry::make('Description'),

Infolists\Components\TextEntry::make('LowerIsBetter')
->label('Lower Is Better')
->formatStateUsing(fn (string $state): string => $state === '1' ? 'Yes' : 'No'),
]),

Infolists\Components\Section::make('Rules')
Expand Down Expand Up @@ -126,7 +124,12 @@ public static function form(Form $form): Form

Forms\Components\TextInput::make('Description')
->maxLength(255),
]),

Forms\Components\Section::make('Rules')
->icon('heroicon-c-wrench-screwdriver')
->columns(['md' => 2, 'xl' => 3, '2xl' => 4])
->schema([
Forms\Components\Select::make('Format')
->options(
collect(ValueFormat::cases())
Expand Down Expand Up @@ -190,6 +193,11 @@ public static function table(Table $table): Table
->orWhere('display_name', 'like', "%{$search}%");
});
}),

Tables\Columns\TextColumn::make('DisplayOrder')
->label('Display Order')
->sortable()
->toggleable(),
])
->searchPlaceholder('(ID, Title, Game, Dev)')
->filters([
Expand Down Expand Up @@ -230,7 +238,17 @@ public static function table(Table $table): Table
}),
])
->actions([
Tables\Actions\ActionGroup::make([
Tables\Actions\ActionGroup::make([
ResetAllLeaderboardEntriesAction::make('delete_all_entries'),
DeleteLeaderboardAction::make('delete_leaderboard'),
])
->dropdown(false),

Tables\Actions\Action::make('audit-log')
->url(fn ($record) => LeaderboardResource::getUrl('audit-log', ['record' => $record]))
->icon('fas-clock-rotate-left'),
]),
])
->bulkActions([

Expand Down Expand Up @@ -270,4 +288,10 @@ public static function getEloquentQuery(): Builder
return parent::getEloquentQuery()
->with(['game', 'developer']);
}

// Do not allow on-site leaderboard creation.
public static function canCreate(): bool
{
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace App\Filament\Resources\LeaderboardResource\RelationManagers;

use App\Filament\Actions\ResetAllLeaderboardEntriesAction;
use App\Models\Leaderboard;
use App\Models\LeaderboardEntry;
use App\Platform\Actions\RemoveLeaderboardEntry;
Expand Down Expand Up @@ -70,7 +71,7 @@ public function table(Table $table): Table

])
->headerActions([

ResetAllLeaderboardEntriesAction::make('delete_all_entries'),
])
->actions([
Tables\Actions\EditAction::make(),
Expand Down
83 changes: 0 additions & 83 deletions app/Helpers/database/leaderboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -240,67 +240,6 @@ function getLeaderboardUserEntry(Leaderboard $leaderboard, User $user): ?array
return $retVal;
}

function getLeaderboardsList(
int $gameID,
int $sortBy,
): array {
$ifDesc = "";
if ($sortBy >= 10) {
$ifDesc = " DESC";
}

switch ($sortBy % 10) {
case 0:
$orderClause = "ORDER BY ld.DisplayOrder $ifDesc, c.ID, GameTitle";
break;
case 2:
$orderClause = "ORDER BY GameTitle $ifDesc";
break;
case 3:
$orderClause = "ORDER BY ConsoleName $ifDesc, c.ID, GameTitle";
break;
case 4:
$orderClause = "ORDER BY ld.Title $ifDesc";
break;
case 5:
$orderClause = "ORDER BY ld.Description $ifDesc";
break;
case 6:
$orderClause = "ORDER BY ld.LowerIsBetter $ifDesc, ld.Format $ifDesc";
break;
case 7:
$ifDesc = $sortBy == 17 ? "ASC" : "DESC";

$orderClause = "ORDER BY NumResults $ifDesc";
break;
default:
$orderClause = "ORDER BY ld.ID $ifDesc";
break;
}

$query = "SELECT
ld.ID, ld.Title, ld.Description, ld.Format, ld.Mem, ld.DisplayOrder,
leInner.NumResults,
ld.LowerIsBetter, ua.User AS Author,
gd.ID AS GameID, gd.ImageIcon AS GameIcon, gd.Title AS GameTitle,
c.Name AS ConsoleName, c.ID AS ConsoleID
FROM LeaderboardDef AS ld
LEFT JOIN GameData AS gd ON gd.ID = ld.GameID
LEFT JOIN
(
SELECT le.leaderboard_id, COUNT(*) AS NumResults FROM leaderboard_entries AS le
WHERE le.deleted_at IS NULL
GROUP BY le.leaderboard_id
) AS leInner ON leInner.leaderboard_id = ld.ID
LEFT JOIN Console AS c ON c.ID = gd.ConsoleID
LEFT JOIN UserAccounts AS ua ON ua.ID = ld.author_id
WHERE gd.ID = :gameId
GROUP BY ld.GameID, ld.ID
$orderClause";

return legacyDbFetchAll($query, ['gameId' => $gameID])->toArray();
}

function submitLBData(
string $user,
int $lbID,
Expand Down Expand Up @@ -440,25 +379,3 @@ function UploadNewLeaderboard(

return true;
}

function requestResetLB(int $lbID): bool
{
$entries = LeaderboardEntry::where('leaderboard_id', $lbID);
$entriesDeleted = $entries->delete();

// When `delete()` returns false, it indicates an error has occurred.
return $entriesDeleted !== false;
}

function requestDeleteLB(int $lbID): bool
{
$leaderboard = Leaderboard::find($lbID);

if (!$leaderboard) {
return false;
}

$leaderboard->forceDelete();

return true;
}
2 changes: 1 addition & 1 deletion app/Policies/LeaderboardPolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public function forceDelete(User $user, Leaderboard $leaderboard): bool
]);
}

public function resetAllEntries(User $user, Leaderboard $leaderboard): bool
public function resetAllEntries(User $user): bool
{
return $user->hasAnyRole([
Role::DEVELOPER_STAFF,
Expand Down
1 change: 0 additions & 1 deletion config/missing-page-redirector.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@
* leaderboards
*/
'/leaderboardinfo.php' => '/leaderboard/{i}',
'/leaderboardList.php' => '/game/{g}/leaderboards',

/*
* user
Expand Down
21 changes: 0 additions & 21 deletions public/request/leaderboard/delete.php

This file was deleted.

Loading