From 5dc562cab4106198f0393dc2d65cd3f4524cca32 Mon Sep 17 00:00:00 2001 From: itinerare Date: Wed, 29 Jan 2025 09:53:55 -0500 Subject: [PATCH] fix(characters): add vote data to design update casts, refactor handling --- .../Character/CharacterDesignUpdate.php | 52 +++++++++++++++---- app/Services/DesignUpdateManager.php | 2 +- config/lorekeeper/extensions.php | 2 +- resources/views/admin/designs/index.blade.php | 18 +------ .../views/character/design/_header.blade.php | 40 +++++--------- 5 files changed, 58 insertions(+), 56 deletions(-) diff --git a/app/Models/Character/CharacterDesignUpdate.php b/app/Models/Character/CharacterDesignUpdate.php index c3b86f9162..ef5ef38019 100644 --- a/app/Models/Character/CharacterDesignUpdate.php +++ b/app/Models/Character/CharacterDesignUpdate.php @@ -25,7 +25,7 @@ class CharacterDesignUpdate extends Model { 'hash', 'species_id', 'subtype_ids', 'rarity_id', 'has_comments', 'has_image', 'has_addons', 'has_features', 'submitted_at', 'update_type', 'fullsize_hash', - 'approval_votes', 'rejection_votes', + 'vote_data', ]; /** @@ -44,6 +44,7 @@ class CharacterDesignUpdate extends Model { 'submitted_at' => 'datetime', 'subtype_ids' => 'array', 'data' => 'array', + 'vote_data' => 'array', ]; /** @@ -324,15 +325,6 @@ public function getUrlAttribute() { return url('designs/'.$this->id); } - /** - * Gets the voting data of the design update request. - * - * @return string - */ - public function getVoteDataAttribute() { - return collect($this->attributes['vote_data'], true); - } - /********************************************************************************************** OTHER FUNCTIONS @@ -383,4 +375,44 @@ public function displaySubtypes() { return implode(', ', $result); } + + /** + * Gets the voting data of the gallery submission and performs preliminary processing. + * + * @param bool $withUsers + * + * @return array + */ + public function getVoteData($withUsers = 0) { + $voteData['raw'] = $this->vote_data; + + // Only query users if necessary, and condense to one query per submission + if ($withUsers) { + $users = User::whereIn('id', array_keys($voteData['raw']))->select('id', 'name', 'rank_id')->get(); + } else { + $users = null; + } + + $voteData['raw'] = collect($voteData['raw'])->mapWithKeys(function ($vote, $id) use ($users) { + return [$id => [ + 'vote' => $vote, + 'user' => $users ? $users->where('id', $id)->first() : $id, + ]]; + }); + + // Tally approve/reject sums for ease + $voteData['approve'] = $voteData['reject'] = 0; + foreach ($voteData['raw'] as $vote) { + switch ($vote['vote']) { + case 1: + $voteData['reject'] += 1; + break; + case 2: + $voteData['approve'] += 1; + break; + } + } + + return $voteData; + } } diff --git a/app/Services/DesignUpdateManager.php b/app/Services/DesignUpdateManager.php index efe6d36903..6bbb002c50 100644 --- a/app/Services/DesignUpdateManager.php +++ b/app/Services/DesignUpdateManager.php @@ -998,7 +998,7 @@ public function voteRequest($action, $request, $user) { $voteData = (isset($request->vote_data) ? collect($request->vote_data, true) : collect([])); $voteData->get($user->id) ? $voteData->pull($user->id) : null; $voteData->put($user->id, $vote); - $request->vote_data = $voteData->toJson(); + $request->vote_data = $voteData; $request->save(); diff --git a/config/lorekeeper/extensions.php b/config/lorekeeper/extensions.php index 21faaf5ea1..6892cdb123 100644 --- a/config/lorekeeper/extensions.php +++ b/config/lorekeeper/extensions.php @@ -43,7 +43,7 @@ 'character_TH_profile_link' => 0, // Design Update Voting - Mercury - 'design_update_voting' => 0, + 'design_update_voting' => 1, // Item Entry Expansion - Mercury 'item_entry_expansion' => [ diff --git a/resources/views/admin/designs/index.blade.php b/resources/views/admin/designs/index.blade.php index 6c72ce4d98..5d93832876 100644 --- a/resources/views/admin/designs/index.blade.php +++ b/resources/views/admin/designs/index.blade.php @@ -70,20 +70,6 @@
@foreach ($requests as $r)
- @if (config('lorekeeper.extensions.design_update_voting')) - voteData as $voter => $vote) { - if ($vote == 1) { - $rejectSum += 1; - } - if ($vote == 2) { - $approveSum += 1; - } - } - ?> - @endif
{!! $r->character ? $r->character->displayName : 'Deleted Character [#' . $r->character_id . ']' !!}
@@ -98,8 +84,8 @@
- {{ $rejectSum }}/{{ Settings::get('design_votes_needed') }} : - {{ $approveSum }}/{{ Settings::get('design_votes_needed') }} + {{ $r->getVoteData()['reject'] }}/{{ Settings::get('design_votes_needed') }} : + {{ $r->getVoteData()['approve'] }}/{{ Settings::get('design_votes_needed') }}
diff --git a/resources/views/character/design/_header.blade.php b/resources/views/character/design/_header.blade.php index be69c0b166..7cfe8b4eb0 100644 --- a/resources/views/character/design/_header.blade.php +++ b/resources/views/character/design/_header.blade.php @@ -15,18 +15,6 @@ @endif @if ($request->status != 'Draft' && Auth::user()->hasPower('manage_characters') && config('lorekeeper.extensions.design_update_voting')) - voteData as $voter => $vote) { - if ($vote == 1) { - $rejectSum += 1; - } - if ($vote == 2) { - $approveSum += 1; - } - } - ?>
{{ $request->status == 'Pending' ? 'Vote' : 'Past Votes' }} on this {{ $request->update_type == 'MYO' ? 'MYO Submission' : 'Design Update' }} @@ -34,15 +22,15 @@
- {{ $rejectSum }}/{{ Settings::get('design_votes_needed') }} + {{ $request->getVoteData()['reject'] }}/{{ Settings::get('design_votes_needed') }} {!! Form::open(['url' => 'admin/designs/vote/' . $request->id . '/reject', 'id' => 'voteRejectForm']) !!} - + {!! Form::close() !!}
- {{ $approveSum }}/{{ Settings::get('design_votes_needed') }} + {{ $request->getVoteData()['approve'] }}/{{ Settings::get('design_votes_needed') }} {!! Form::open(['url' => 'admin/designs/vote/' . $request->id . '/approve', 'id' => 'voteApproveForm']) !!} - + {!! Form::close() !!}
@@ -60,24 +48,20 @@
Reject:
    - @foreach ($request->voteData as $voter => $vote) - @if ($vote == 1) -
  • - {!! App\Models\User\User::find($voter)->displayName !!} {{ $voter == Auth::user()->id ? '(you)' : '' }} -
  • - @endif + @foreach ($request->getVoteData(1)['raw']->where('vote', 1) as $vote) +
  • + {!! $vote['user']->displayName !!}{{ $vote['user']->id == Auth::user()->id ? ' (you)' : '' }} +
  • @endforeach
Approve:
    - @foreach ($request->voteData as $voter => $vote) - @if ($vote == 2) -
  • - {!! App\Models\User\User::find($voter)->displayName !!} {{ $voter == Auth::user()->id ? '(you)' : '' }} -
  • - @endif + @foreach ($request->getVoteData(1)['raw']->where('vote', 2) as $vote) +
  • + {!! $vote['user']->displayName !!}{{ $vote['user']->id == Auth::user()->id ? ' (you)' : '' }} +
  • @endforeach