Skip to content

Commit 20a0881

Browse files
committed
divide solutions on two columns: yours and others
1 parent 6db29a1 commit 20a0881

File tree

3 files changed

+74
-24
lines changed

3 files changed

+74
-24
lines changed

app/Http/Controllers/User/SolutionController.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,23 @@ public function store(Request $request, User $user): RedirectResponse
4545

4646
public function show(User $user, Solution $solution): View
4747
{
48-
4948
$currentExercise = $solution->exercise;
5049

5150
$solutionsListForCurrentExercise = $solution->exercise
5251
->solutions()
5352
->where('user_id', $user->id)
5453
->get();
5554

55+
$solutionsOfOtherUsers = $solution->exercise
56+
->solutions()
57+
->where('user_id', '!=', $user->id)
58+
->get();
59+
5660
return view('solution.show', compact(
5761
'currentExercise',
5862
'solutionsListForCurrentExercise',
59-
'user'
63+
'solutionsOfOtherUsers',
64+
'user',
6065
));
6166
}
6267

resources/views/solution/show.blade.php

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
{{ getTitleContent(__('solution.solution_for_title', ['exercise' => $currentExercise->getFullTitle()])) }}
66
@endsection
77
@section('description'){{ $user->id }} - {{ __('solution.code_review') }} - {{ $user->name }} -
8-
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}@endsection
8+
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}@endsection
99

1010
@section('content')
1111

1212
<div class="d-flex flex-wrap justify-content-between mb-2 mb-lg-4">
1313
<div class="h5">
1414
<a href="{{ route('exercises.show', $currentExercise) }}">
15-
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}
15+
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}
1616
</div>
1717
<div class="h5">
1818
<a href="{{ route('users.show', $user) }}">{{ $user->name }}</a>
@@ -22,21 +22,33 @@
2222
<h2 class="text-center">{{ __('solution.code_review') }}</h2>
2323
<div class="text-center h5">{{ __('solution.sub_title') }}</div>
2424
<hr>
25+
26+
<div class="row no-gutters mb-3">
27+
<div class="col-12 col-md-6 text-center">
28+
<h5>Ваше решение</h5>
29+
</div>
30+
@if ($solutionsOfOtherUsers->isNotEmpty())
31+
<div class="col-12 col-md-6 text-center">
32+
<h5>Решения других пользователей</h5>
33+
</div>
34+
@endif
35+
</div>
36+
2537
<div class="row no-gutters">
26-
<div class="col-12 col-md p-2 p-lg-4">
38+
<div class="col-12 col-md-6 p-2 p-lg-4">
2739
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
2840
@foreach ($solutionsListForCurrentExercise as $currentSolution)
2941
@if ($loop->first)
3042
<li class="nav-item" role="presentation">
3143
<a class="nav-link active" id="pills-{{ $currentSolution->id }}-tab" data-bs-toggle="pill"
32-
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
33-
aria-selected="true">v.{{ $loop->iteration }}</a>
44+
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
45+
aria-selected="true">v.{{ $loop->iteration }}</a>
3446
</li>
3547
@else
3648
<li class="nav-item" role="presentation">
3749
<a class="nav-link" id="pills-{{ $currentSolution->id }}-tab" data-bs-toggle="pill"
38-
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
39-
aria-selected="true">v.{{ $loop->iteration }}</a>
50+
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
51+
aria-selected="true">v.{{ $loop->iteration }}</a>
4052
</li>
4153
@endif
4254
@endforeach
@@ -45,51 +57,51 @@
4557
@foreach ($solutionsListForCurrentExercise as $currentSolution)
4658
@if ($loop->first)
4759
<div class="tab-pane fade show active" id="pills-{{ $currentSolution->id }}" role="tabpanel"
48-
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
60+
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
4961
@solution(['solution' => $currentSolution])
5062
</div>
5163
@else
5264
<div class="tab-pane fade show" id="pills-{{ $currentSolution->id }}" role="tabpanel"
53-
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
65+
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
5466
@solution(['solution' => $currentSolution])
5567
</div>
5668
@endif
5769
@endforeach
5870
</div>
5971
</div>
6072

61-
@if (count($solutionsListForCurrentExercise) > 1)
62-
<div class="d-none d-md-block border-left"></div>
63-
<div class="col p-2 p-lg-4">
73+
@if ($solutionsOfOtherUsers->isNotEmpty())
74+
<div class="col-12 col-md-6 p-2 p-lg-4">
75+
<div class="border-start d-none d-md-block"></div>
6476
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
65-
@foreach ($solutionsListForCurrentExercise as $currentSolution)
77+
@foreach ($solutionsOfOtherUsers as $currentSolution)
6678
@if ($loop->first)
6779
<li class="nav-item" role="presentation">
6880
<a class="nav-link active" id="pills-{{ $currentSolution->id }}double-tab" data-bs-toggle="pill"
69-
href="#pills-{{ $currentSolution->id }}double" role="tab"
70-
aria-controls="pills-{{ $currentSolution->id }}double"
71-
aria-selected="true">v.{{ $loop->iteration }}</a>
81+
href="#pills-{{ $currentSolution->id }}double" role="tab"
82+
aria-controls="pills-{{ $currentSolution->id }}double"
83+
aria-selected="true">v.{{ $loop->iteration }}</a>
7284
</li>
7385
@else
7486
<li class="nav-item" role="presentation">
7587
<a class="nav-link" id="pills-{{ $currentSolution->id }}double-tab" data-bs-toggle="pill"
76-
href="#pills-{{ $currentSolution->id }}double" role="tab"
77-
aria-controls="pills-{{ $currentSolution->id }}double"
78-
aria-selected="true">v.{{ $loop->iteration }}</a>
88+
href="#pills-{{ $currentSolution->id }}double" role="tab"
89+
aria-controls="pills-{{ $currentSolution->id }}double"
90+
aria-selected="true">v.{{ $loop->iteration }}</a>
7991
</li>
8092
@endif
8193
@endforeach
8294
</ul>
8395
<div class="tab-content" id="pills-tabContent">
84-
@foreach ($solutionsListForCurrentExercise as $currentSolution)
96+
@foreach ($solutionsOfOtherUsers as $currentSolution)
8597
@if ($loop->first)
8698
<div class="tab-pane fade show active" id="pills-{{ $currentSolution->id }}double" role="tabpanel"
87-
aria-labelledby="pills-{{ $currentSolution->id }}double-tab">
99+
aria-labelledby="pills-{{ $currentSolution->id }}double-tab">
88100
@solution(['solution' => $currentSolution])
89101
</div>
90102
@else
91103
<div class="tab-pane fade show" id="pills-{{ $currentSolution->id }}double" role="tabpanel"
92-
aria-labelledby="pills-{{ $currentSolution->id }}double-tab">
104+
aria-labelledby="pills-{{ $currentSolution->id }}double-tab">
93105
@solution(['solution' => $currentSolution])
94106
</div>
95107
@endif

tests/Feature/Http/Controllers/User/SolutionControllerTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Tests\Feature\Http\Controllers\User;
44

55
use App\Models\Solution;
6+
use App\Models\User;
67
use Database\Seeders\ChaptersTableSeeder;
78
use Database\Seeders\ExercisesTableSeeder;
89
use Tests\ControllerTestCase;
@@ -56,4 +57,36 @@ public function testDestroy(): void
5657

5758
$this->assertDatabaseMissing('solutions', $solution->toArray());
5859
}
60+
61+
public function testShowDisplaysOtherUsersSolutions(): void
62+
{
63+
$solution = $this->user->solutions()->first();
64+
$exercise = $solution->exercise;
65+
66+
$otherUser = User::factory()->create();
67+
68+
$otherSolutions = Solution::factory()->count(2)->create([
69+
'user_id' => $otherUser->id,
70+
'exercise_id' => $exercise->id,
71+
]);
72+
73+
$route = route('users.solutions.show', [$this->user, $solution]);
74+
75+
$response = $this->get($route);
76+
$response->assertOk();
77+
78+
$response->assertViewHas('solutionsListForCurrentExercise');
79+
$response->assertViewHas('solutionsOfOtherUsers');
80+
81+
$response->assertViewHas('solutionsListForCurrentExercise', function ($solutions) use ($solution) {
82+
return $solutions->contains('id', $solution->id);
83+
});
84+
85+
$response->assertViewHas('solutionsOfOtherUsers', function ($solutions) use ($otherSolutions) {
86+
$solutionIds = $solutions->pluck('id')->sort()->values()->all();
87+
$otherSolutionIds = $otherSolutions->pluck('id')->sort()->values()->all();
88+
89+
return $solutionIds === $otherSolutionIds;
90+
});
91+
}
5992
}

0 commit comments

Comments
 (0)