diff --git a/app/Http/Controllers/User/UserController.php b/app/Http/Controllers/User/UserController.php index 61f1e1a..c6ad84b 100644 --- a/app/Http/Controllers/User/UserController.php +++ b/app/Http/Controllers/User/UserController.php @@ -99,6 +99,41 @@ class UserController extends Controller ]); } + // New page: list of ThankCards received by the current user + public function receivedCards(Request $request): View + { + $selectedMonth = $request->input('month', Carbon::now()->format('Y-m')); + $user = Auth::user(); + $data = $this->userService->getReceivedPageData($user, $selectedMonth); + return view('user.received', $data); + } + + // New page: list of ThankCards sent by the current user + public function sentCards(Request $request): View + { + $selectedMonth = $request->input('month', Carbon::now()->format('Y-m')); + $user = Auth::user(); + $data = $this->userService->getSentPageData($user, $selectedMonth); + return view('user.sent', $data); + } + + // New page: ranking (both received and sent) with tabs + public function ranking(Request $request): View + { + $selectedMonth = $request->input('month', Carbon::now()->format('Y-m')); + $user = Auth::user(); + $receivedRanking = $this->userService->getRankingList('received', $selectedMonth, $user); + $sentRanking = $this->userService->getRankingList('sent', $selectedMonth, $user); + return view('user.ranking', [ + 'selectedMonth' => $selectedMonth, + 'receivedRankers' => $receivedRanking['rankers'], + 'receivedCurrentUserRankItem' => $receivedRanking['currentUserRankItem'], + 'sentRankers' => $sentRanking['rankers'], + 'sentCurrentUserRankItem' => $sentRanking['currentUserRankItem'], + ]); + } + + /** * Show the change password form. */ diff --git a/app/Services/User/UserService.php b/app/Services/User/UserService.php index 928e171..5d194ed 100644 --- a/app/Services/User/UserService.php +++ b/app/Services/User/UserService.php @@ -193,10 +193,10 @@ class UserService implements UserServiceInterface $currentUserRankItem = $userItem; } - if ($index < 4) { - $rankers[] = $userItem; - } + // Include every ranked user (no hard limit) + $rankers[] = $userItem; $rank++; + } if (!$currentUserRankItem) { @@ -214,6 +214,32 @@ class UserService implements UserServiceInterface ]; } + // Retrieve paginated list of received ThankCards for a user + public function getReceivedPageData(User $user, string $selectedMonth): array + { + $start = Carbon::parse($selectedMonth)->startOfMonth(); + $end = Carbon::parse($selectedMonth)->endOfMonth(); + $cards = Administration::where('msnv', $user->msnv) + ->whereBetween('date', [$start, $end]) + ->where('received', '>', 0) + ->orderBy('date', 'desc') + ->get(); + return ['cards' => $cards]; + } + + // Retrieve paginated list of sent ThankCards for a user + public function getSentPageData(User $user, string $selectedMonth): array + { + $start = Carbon::parse($selectedMonth)->startOfMonth(); + $end = Carbon::parse($selectedMonth)->endOfMonth(); + $cards = Administration::where('msnv', $user->msnv) + ->whereBetween('date', [$start, $end]) + ->where('sent', '>', 0) + ->orderBy('date', 'desc') + ->get(); + return ['cards' => $cards]; + } + public function updateProfile(User $user, array $data, ?\Illuminate\Http\UploadedFile $avatarFile = null): void { if (isset($data['name'])) { diff --git a/resources/views/user/ranking.blade.php b/resources/views/user/ranking.blade.php new file mode 100644 index 0000000..caf6ddf --- /dev/null +++ b/resources/views/user/ranking.blade.php @@ -0,0 +1,328 @@ +@extends('layouts.app') + +@section('title', 'Bảng xếp hạng') + +@section('content') +
+ {{-- 1. HERO SECTION --}} +
+ +

🏆 Bảng xếp hạng

+

Tôn vinh những cá nhân lan tỏa văn hóa cảm ơn và ghi nhận trong tổ chức.

+
+ trophy +
+ + {{-- 4. TAB SWITCHER --}} +
+
+ + +
+
+ + {{-- CONTENT CONTAINER --}} +
+ + {{-- ==================== TAB: NHẬN ==================== --}} +
+ {{-- 2. TOP 3 PODIUM --}} + @if(!empty($receivedRankers) && count($receivedRankers) >= 3) +
+ {{-- 2nd Place --}} +
+
+
+ +
+ 🥈 #2 +
+
+ {{ $receivedRankers[1]->name ?? '---' }} + {{ $receivedRankers[1]->department ?? '' }} + {{ $receivedRankers[1]->score ?? 0 }} điểm +
+ + {{-- 1st Place --}} +
+
👑
+
+
+ +
+ 🥇 #1 +
+
+ {{ $receivedRankers[0]->name ?? '---' }} + {{ $receivedRankers[0]->department ?? '' }} + {{ $receivedRankers[0]->score ?? 0 }} điểm +
+ + {{-- 3rd Place --}} +
+
+
+ +
+ 🥉 #3 +
+
+ {{ $receivedRankers[2]->name ?? '---' }} + {{ $receivedRankers[2]->department ?? '' }} + {{ $receivedRankers[2]->score ?? 0 }} điểm +
+
+ @endif + + {{-- 3. THÀNH TÍCH CỦA BẠN --}} + @if($receivedCurrentUserRankItem) +
+
+
+ You +
+ #{{ $receivedCurrentUserRankItem->rank }} +
+
+
+

Thành tích của bạn (Nhận)

+

{{ $receivedCurrentUserRankItem->name }}

+
+
+
+

{{ $receivedCurrentUserRankItem->score }}

+

Điểm

+
+
+ @endif + + {{-- 6. ĐỒNG HẠNG & LEADERBOARD CARDS --}} +
+ @php + $groupedReceived = collect($receivedRankers ?? [])->groupBy('rank'); + @endphp + @if($groupedReceived->count() > 0) + @foreach($groupedReceived as $rank => $group) +
+ {{-- Group Header --}} +
+
+ @if($rank == 1) + 🥇 + @elseif($rank == 2) + 🥈 + @elseif($rank == 3) + 🥉 + @else +
#{{ $rank }}
+ @endif +
+

Hạng #{{ $rank }}

+

{{ $group->count() }} người đồng hạng

+
+
+
+ {{ $group->first()->score }} + điểm +
+
+ + {{-- Users in Group --}} +
+ @foreach($group as $user) +
+
+ +
+

{{ $user->name }}

+

{{ $user->department }}

+
+
+ @endforeach +
+
+ @endforeach + @else + + @endif +
+
+ + {{-- ==================== TAB: GỬI ==================== --}} + + +
+
+ + + +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/user/received.blade.php b/resources/views/user/received.blade.php new file mode 100644 index 0000000..3fefb8c --- /dev/null +++ b/resources/views/user/received.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.app') + +@section('title', 'Thanks đã nhận') + +@section('content') +
+ {{-- Hero Section – same look as dashboard --}} + +

💜 Thanks đã nhận

+

Các lời cảm ơn mà đồng nghiệp đã gửi đến bạn.

+
+ + {{-- Summary Card – simple total count --}} +
+ + + + + +
+ + {{-- Cards List – use simple styled cards --}} + @if (!empty($cards) && $cards->count()) +
+ @foreach ($cards as $c) +
+
+ Từ: {{ $c->sender ?? '---' }} + {{ \Carbon\Carbon::parse($c->date)->format('d/m/Y') }} +
+

{{ $c->received }} thẻ

+
+ @endforeach +
+ @else + + @endif +
+@endsection diff --git a/resources/views/user/sent.blade.php b/resources/views/user/sent.blade.php new file mode 100644 index 0000000..3325d92 --- /dev/null +++ b/resources/views/user/sent.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.app') + +@section('title', 'Thanks đã gửi') + +@section('content') +
+ {{-- Hero Section – same look as dashboard --}} + +

📨 Thanks đã gửi

+

Các lời cảm ơn bạn đã gửi tới đồng nghiệp.

+
+ + {{-- Summary Card – simple total count --}} +
+ + + + + +
+ + {{-- Cards List – use simple styled cards --}} + @if (!empty($cards) && $cards->count()) +
+ @foreach ($cards as $c) +
+
+ Gửi tới: {{ $c->receiver ?? '---' }} + {{ \Carbon\Carbon::parse($c->date)->format('d/m/Y') }} +
+

{{ $c->sent }} thẻ

+
+ @endforeach +
+ @else + + @endif +
+@endsection diff --git a/routes/web.php b/routes/web.php index 6b1be88..b150299 100644 --- a/routes/web.php +++ b/routes/web.php @@ -41,10 +41,10 @@ Route::middleware('auth')->group(function () { Route::middleware('member')->group(function () { Route::get('/my-page', [UserController::class, 'index'])->name('user.dashboard'); - // Coming soon routes for new tabs - Route::view('/received-cards', 'coming-soon')->name('user.received'); - Route::view('/sent-cards', 'coming-soon')->name('user.sent'); - Route::view('/ranking', 'coming-soon')->name('user.ranking'); + // Coming soon routes replaced with real pages + Route::get('/received-cards', [UserController::class, 'receivedCards'])->name('user.received'); + Route::get('/sent-cards', [UserController::class, 'sentCards'])->name('user.sent'); + Route::get('/ranking', [UserController::class, 'ranking'])->name('user.ranking'); Route::view('/gallery', 'coming-soon')->name('user.gallery'); Route::view('/stats', 'coming-soon')->name('user.stats');