From 6e1149d12e4eeb435892d05703c2f9e7255f413b Mon Sep 17 00:00:00 2001 From: Samuel Weirich <4281791+SamuelWei@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:13:36 +0200 Subject: [PATCH 1/8] Add sorting/filtering room personalized links list, refactor datatable to dataview --- .../api/v1/RoomTokenController.php | 44 ++- lang/de/app.php | 1 + lang/de/rooms.php | 8 + lang/en/app.php | 1 + lang/en/rooms.php | 8 + .../components/RoomTabPersonalizedLinks.vue | 291 +++++++++++------- .../RoomTabPersonalizedLinksAddButton.vue | 5 +- resources/sass/app/_typography.scss | 5 + 8 files changed, 255 insertions(+), 108 deletions(-) diff --git a/app/Http/Controllers/api/v1/RoomTokenController.php b/app/Http/Controllers/api/v1/RoomTokenController.php index 8a57f5694..43f14cf93 100644 --- a/app/Http/Controllers/api/v1/RoomTokenController.php +++ b/app/Http/Controllers/api/v1/RoomTokenController.php @@ -2,11 +2,13 @@ namespace App\Http\Controllers\api\v1; +use App\Enums\RoomUserRole; use App\Http\Controllers\Controller; use App\Http\Requests\RoomTokenRequest; use App\Http\Resources\RoomToken as RoomTokenResource; use App\Models\Room; use App\Models\RoomToken; +use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\AnonymousResourceCollection; use Illuminate\Http\Response; use Log; @@ -19,9 +21,47 @@ class RoomTokenController extends Controller * @param Room $room Room for which the tokens should be listed. * @return AnonymousResourceCollection */ - public function index(Room $room) + public function index(Room $room, Request $request) { - return RoomTokenResource::collection($room->tokens); + $additional = []; + + $sortBy = match ($request->get('sort_by')) { + 'lastname' => 'lastname', + 'last_usage' => 'last_usage', + default => 'firstname', + }; + + $sortOrder = match ($request->get('sort_direction')) { + 'desc' => 'desc', + default => 'asc', + }; + + $filter = match ($request->get('filter')) { + 'participant_role' => ['role', RoomUserRole::USER], + 'moderator_role' => ['role', RoomUserRole::MODERATOR], + default => null, + }; + + $resource = $room->tokens()->orderBy($sortBy, $sortOrder); + + // count all before applying filters + $additional['meta']['total_no_filter'] = $resource->count(); + + if ($request->has('search')) { + $searchQueries = explode(' ', preg_replace('/\s\s+/', ' ', $request->search)); + foreach ($searchQueries as $searchQuery) { + $resource = $resource->where(function ($query) use ($searchQuery) { + $query->where('firstname', 'like', '%'.$searchQuery.'%') + ->orWhere('lastname', 'like', '%'.$searchQuery.'%'); + }); + } + } + + if ($filter) { + $resource = $resource->where($filter[0], $filter[1]); + } + + return RoomTokenResource::collection($resource->paginate(setting('pagination_page_size')))->additional($additional); } /** diff --git a/lang/de/app.php b/lang/de/app.php index 76bedcaf9..7a823442e 100644 --- a/lang/de/app.php +++ b/lang/de/app.php @@ -51,6 +51,7 @@ 'stale_model' => 'Der :model-Datensatz wurde in der Zwischenzeit geändert!', 'token_not_found' => 'Der personalisierte Raumlink konnte nicht gefunden werden.', ], + 'filter_no_results' => 'Keine Ergebnisse gefunden', 'firstname' => 'Vorname', 'flash' => [ 'client_error' => 'Es ist ein unbekannter Fehler in der Anwendung aufgetreten!', diff --git a/lang/de/rooms.php b/lang/de/rooms.php index ca41aa745..87fbb1062 100644 --- a/lang/de/rooms.php +++ b/lang/de/rooms.php @@ -328,7 +328,15 @@ 'delete' => 'Personalisierten Raumlink löschen', 'edit' => 'Personalisierten Raumlink bearbeiten', 'expires' => 'Verfallsdatum', + 'expires_at' => 'Läuft ab am :date', + 'filter' => [ + 'all' => 'Alle', + 'moderator_role' => 'Nur Moderatoren', + 'participant_role' => 'Nur Teilnehmer', + ], 'last_usage' => 'Zuletzt verwendet', + 'last_used_at' => 'Zuletzt verwendet am :date', + 'last_used_never' => 'Noch nie verwendet', 'nodata' => 'Keine personalisierten Raumlinks vorhanden!', 'room_link_copied' => 'Der persionalisierte Raumlink für :firstname :lastname wurde in Ihre Zwischenablage kopiert.', 'title' => 'Personalisierte Raumlinks', diff --git a/lang/en/app.php b/lang/en/app.php index c950d5505..2763cecf7 100644 --- a/lang/en/app.php +++ b/lang/en/app.php @@ -51,6 +51,7 @@ 'stale_model' => 'The :model entity was updated in the meanwhile!', 'token_not_found' => 'The personalized room link could not be found.', ], + 'filter_no_results' => 'No results found', 'firstname' => 'Firstname', 'flash' => [ 'client_error' => 'An unknown error occurred in the application!', diff --git a/lang/en/rooms.php b/lang/en/rooms.php index 1be3edd40..06cec62be 100644 --- a/lang/en/rooms.php +++ b/lang/en/rooms.php @@ -327,7 +327,15 @@ 'delete' => 'Delete personalized room link', 'edit' => 'Edit personalized room link', 'expires' => 'Expiry date', + 'expires_at' => 'Expires at :date', + 'filter' => [ + 'all' => 'All', + 'moderator_role' => 'Only moderators', + 'participant_role' => 'Only participants', + ], 'last_usage' => 'Last used', + 'last_used_at' => 'Last used at :date', + 'last_used_never' => 'Never used', 'nodata' => 'No personalized room links available!', 'room_link_copied' => 'The personalized room link for :firstname :lastname was copied to your clipboard.', 'title' => 'Personalized room links', diff --git a/resources/js/components/RoomTabPersonalizedLinks.vue b/resources/js/components/RoomTabPersonalizedLinks.vue index 8f6a803d9..d18ac14cd 100644 --- a/resources/js/components/RoomTabPersonalizedLinks.vue +++ b/resources/js/components/RoomTabPersonalizedLinks.vue @@ -1,131 +1,198 @@