From 45cb45b8cc8de79ca65ec015405b0fe54ecae069 Mon Sep 17 00:00:00 2001 From: Vari Date: Sat, 27 Jul 2024 18:20:54 +0200 Subject: [PATCH] Added Admin UI for handling bad chat messages. --- .../Web/Admin/Tools/AdminToolController.php | 5 + .../Web/Admin/Tools/ChatMessageController.php | 48 ++++++++++ .../Admin/Tools/HandleChatMessageRequest.php | 29 ++++++ dist/app/Models/Admin/BadChatMessage.php | 11 ++- .../Admin/Tools/ChatMessageEntry.php | 27 ++++++ ..._194650_create_bad_chat_messages_table.php | 1 + dist/resources/css/modal.scss | 2 +- dist/resources/css/table.scss | 2 +- .../resources/views/admin/dashboard.blade.php | 18 +++- .../views/admin/tools/chat-messages.blade.php | 59 ++++++++++++ .../admin/tools/chat-message-entry.blade.php | 93 +++++++++++++++++++ .../views/components/icons/bell.blade.php | 3 + .../views/components/icons/chat.blade.php | 4 + .../components/icons/checkmark.blade.php | 3 + .../views/components/layouts/app.blade.php | 2 +- dist/routes/admin.php | 4 + 16 files changed, 303 insertions(+), 8 deletions(-) create mode 100644 dist/app/Http/Controllers/Web/Admin/Tools/ChatMessageController.php create mode 100644 dist/app/Http/Requests/Api/Admin/Tools/HandleChatMessageRequest.php create mode 100644 dist/app/View/Components/Admin/Tools/ChatMessageEntry.php create mode 100644 dist/resources/views/admin/tools/chat-messages.blade.php create mode 100644 dist/resources/views/components/admin/tools/chat-message-entry.blade.php create mode 100644 dist/resources/views/components/icons/bell.blade.php create mode 100644 dist/resources/views/components/icons/chat.blade.php create mode 100644 dist/resources/views/components/icons/checkmark.blade.php diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php b/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php index 42f61de..45cbb86 100644 --- a/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php +++ b/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php @@ -32,10 +32,15 @@ final public static function getAllTools(): array FileManagerController::class, LogViewerController::class, UsersController::class, + ChatMessageController::class, InboxMailerController::class, ]; } + public static function getNotificationText(): ?string { + return null; + } + final public static function getName(): string { return static::$name; diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/ChatMessageController.php b/dist/app/Http/Controllers/Web/Admin/Tools/ChatMessageController.php new file mode 100644 index 0000000..8f74068 --- /dev/null +++ b/dist/app/Http/Controllers/Web/Admin/Tools/ChatMessageController.php @@ -0,0 +1,48 @@ +paginate(); + + return view('admin.tools.chat-messages', ['messages' => $badMessages]); + } + + public function handleMessage(HandleCHatMessageRequest $request, BadChatMessage $message) + { + $message->consequences = $request->consequences; + $message->handled = true; + $message->handledBy()->associate(\Auth::user()); + $message->save(); + + Session::flash('alert-success', 'Handled message saved successfully.'); + return Redirect::back(); + } + + public static function getNotificationText(): ?string + { + $unhandledCount = BadChatMessage::where('handled', '=', false)->count(); + + if($unhandledCount > 0) + return 'There are Unhandled Chat Messages'; + return null; + } +} \ No newline at end of file diff --git a/dist/app/Http/Requests/Api/Admin/Tools/HandleChatMessageRequest.php b/dist/app/Http/Requests/Api/Admin/Tools/HandleChatMessageRequest.php new file mode 100644 index 0000000..a543fce --- /dev/null +++ b/dist/app/Http/Requests/Api/Admin/Tools/HandleChatMessageRequest.php @@ -0,0 +1,29 @@ +can(Permissions::VIEW_USERS->value); + } + + public function rules(): array + { + return [ + 'consequences' => 'required|string' + ]; + } + + protected function passedValidation() + { + $this->consequences = $this->input('consequences'); + } +} \ No newline at end of file diff --git a/dist/app/Models/Admin/BadChatMessage.php b/dist/app/Models/Admin/BadChatMessage.php index ec04135..ae7717d 100644 --- a/dist/app/Models/Admin/BadChatMessage.php +++ b/dist/app/Models/Admin/BadChatMessage.php @@ -4,15 +4,24 @@ use App\Models\User\User; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * @mixin IdeHelperBadChatMessage */ class BadChatMessage extends Model { + protected $casts = [ + 'handled' => 'bool', + ]; - public function user() + public function user(): BelongsTo { return $this->belongsTo(User::class); } + + public function handledBy(): BelongsTo + { + return $this->belongsTo(User::class, 'handled_by_id'); + } } diff --git a/dist/app/View/Components/Admin/Tools/ChatMessageEntry.php b/dist/app/View/Components/Admin/Tools/ChatMessageEntry.php new file mode 100644 index 0000000..d3bbacb --- /dev/null +++ b/dist/app/View/Components/Admin/Tools/ChatMessageEntry.php @@ -0,0 +1,27 @@ +foreignUuid('user_id')->constrained(); $table->text('message'); $table->boolean('handled')->default(false); + $table->foreignUuid('handled_by_id')->nullable()->constrained('users'); $table->text('consequences')->nullable(); $table->timestamps(); }); diff --git a/dist/resources/css/modal.scss b/dist/resources/css/modal.scss index 25143d6..6e1d257 100644 --- a/dist/resources/css/modal.scss +++ b/dist/resources/css/modal.scss @@ -1,7 +1,7 @@ @import 'jquery-modal'; .modal { - @apply dark:bg-slate-800 bg-slate-300 shadow-glow shadow-gray-800/50; + @apply dark:bg-slate-800 bg-slate-300 shadow-glow shadow-gray-800/50 z-50; .close-modal { @apply dark:border-slate-800 border-slate-300 border-2 rounded-full; diff --git a/dist/resources/css/table.scss b/dist/resources/css/table.scss index 62ddb38..d5fe4f5 100644 --- a/dist/resources/css/table.scss +++ b/dist/resources/css/table.scss @@ -2,7 +2,7 @@ table { @apply w-full rounded-xl; thead { - @apply sticky z-10 top-0 text-gray-900 dark:text-gray-500 bg-slate-400 dark:bg-gray-900 rounded-xl; + @apply sticky top-0 text-gray-900 dark:text-gray-500 bg-slate-400 dark:bg-gray-900 rounded-xl; th { @apply text-sm uppercase py-2 first:pl-3 last:pr-3 px-1 sm:px-3 default:text-left ; diff --git a/dist/resources/views/admin/dashboard.blade.php b/dist/resources/views/admin/dashboard.blade.php index 6813ada..e230d38 100644 --- a/dist/resources/views/admin/dashboard.blade.php +++ b/dist/resources/views/admin/dashboard.blade.php @@ -1,7 +1,7 @@ - + use App\Http\Controllers\Web\Admin\Tools\AdminToolController; +@endphp
@@ -11,10 +11,20 @@ $user = \Illuminate\Support\Facades\Auth::user(); if($user->cant($toolClass::getNeededPermission())) continue; + + $notificationText = $toolClass::getNotificationText() @endphp -
+
+ @if($notificationText !== null) +
+ +
+ @endif + + {{ $toolClass::getName() }} diff --git a/dist/resources/views/admin/tools/chat-messages.blade.php b/dist/resources/views/admin/tools/chat-messages.blade.php new file mode 100644 index 0000000..c40823a --- /dev/null +++ b/dist/resources/views/admin/tools/chat-messages.blade.php @@ -0,0 +1,59 @@ +@props(['messages']) + +@php + /** @var \Illuminate\Database\Eloquent\Collection|\App\Models\Admin\BadChatMessage[]|\Illuminate\Contracts\Pagination\LengthAwarePaginator $messages */ + + $handledMessages = $unhandledMessages = []; + + foreach ($messages as $message) { + if($message->handled) + $handledMessages[] = $message; + else + $unhandledMessages[] = $message; + } + +@endphp + + +
+ @if($messages->count() <= 0) +

No Messages

+ @endif + + @if(count($unhandledMessages) > 0) +

Unhandled

+ + + + + + + + + + @foreach($unhandledMessages as $message) + + @endforeach + +
UserMessageHandledActions
+ @endif + @if(count($handledMessages) > 0) +

Handled

+ + + + + + + + + + + @foreach($handledMessages as $message) + + @endforeach + +
UserMessageHandledConsequencesHandled By
+ @endif +
+
diff --git a/dist/resources/views/components/admin/tools/chat-message-entry.blade.php b/dist/resources/views/components/admin/tools/chat-message-entry.blade.php new file mode 100644 index 0000000..333f440 --- /dev/null +++ b/dist/resources/views/components/admin/tools/chat-message-entry.blade.php @@ -0,0 +1,93 @@ +@php + /** @var \App\Models\Admin\BadChatMessage $message */ +@endphp +
+ @csrf + + +
+ Profile Picture of {{ $message->user->last_known_username }} + + {{ $message->user->last_known_username ?? $message->user->id }} + +
+ + +
+ {{ $message->message }} +
+ + + @if($message->handled) +
+ +
+ @else +
+
+ +
+
+ @endif + + @if($message->handled) + +
+ {{ $message->consequences ?? '---' }} +
+ + + @if($message->handledBy === null) + Handler Unknown + @else +
+ Profile Picture of {{ $message->handledBy?->last_known_username }} + + {{ $message->handledBy?->last_known_username ?? $message->handledBy?->id }} + +
+ @endif + + @endif + @if(!$message->handled) + + + Handle + + + + @endif + +
diff --git a/dist/resources/views/components/icons/bell.blade.php b/dist/resources/views/components/icons/bell.blade.php new file mode 100644 index 0000000..39d07df --- /dev/null +++ b/dist/resources/views/components/icons/bell.blade.php @@ -0,0 +1,3 @@ + + + diff --git a/dist/resources/views/components/icons/chat.blade.php b/dist/resources/views/components/icons/chat.blade.php new file mode 100644 index 0000000..d436778 --- /dev/null +++ b/dist/resources/views/components/icons/chat.blade.php @@ -0,0 +1,4 @@ + + + + diff --git a/dist/resources/views/components/icons/checkmark.blade.php b/dist/resources/views/components/icons/checkmark.blade.php new file mode 100644 index 0000000..60ef583 --- /dev/null +++ b/dist/resources/views/components/icons/checkmark.blade.php @@ -0,0 +1,3 @@ + + + diff --git a/dist/resources/views/components/layouts/app.blade.php b/dist/resources/views/components/layouts/app.blade.php index fce648f..aa89d1e 100644 --- a/dist/resources/views/components/layouts/app.blade.php +++ b/dist/resources/views/components/layouts/app.blade.php @@ -9,7 +9,7 @@ @stack('head') -
+
@if(Session::has('alert-error')) {!! Session::get('alert-error') !!} @endif diff --git a/dist/routes/admin.php b/dist/routes/admin.php index bc5226c..5137006 100644 --- a/dist/routes/admin.php +++ b/dist/routes/admin.php @@ -2,6 +2,7 @@ use App\Http\Controllers\Api\Catalog\CatalogController; use App\Http\Controllers\Web\Admin\DashboardController; +use App\Http\Controllers\Web\Admin\Tools\ChatMessageController; use App\Http\Controllers\Web\Admin\Tools\FileManagerController; use App\Http\Controllers\Web\Admin\Tools\GameNewsController; use App\Http\Controllers\Web\Admin\Tools\InboxMailerController; @@ -37,6 +38,9 @@ Route::get('mailer', [InboxMailerController::class, 'index'])->name(InboxMailerController::class); Route::post('mailer', [InboxMailerController::class, 'send'])->name('mailer.send'); +Route::get('chat-filter', [ChatMessageController::class, 'index'])->name(ChatMessageController::class); +Route::post('chat-filter/handle-message/{message}', [ChatMessageController::class, 'handleMessage'])->name('chat-filter.handle'); + Route::fallback(function () { return redirect(route('admin.dashboard')); });