Skip to content

Commit add3072

Browse files
committed
Reverse Sorting, tests needed
1 parent 036975b commit add3072

5 files changed

Lines changed: 54 additions & 9 deletions

File tree

app/Http/Controllers/ComputerScienceResourceController.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ public function index(Request $request)
180180
/// Handle Sorting
181181
$sortBy = $request->query('sort_by', 'top');
182182
$query = $this->resourceSortingManager->applySort($query, $sortBy);
183+
if ($request->query('reverse', '0') == '1') {
184+
$query = $this->resourceSortingManager->reverse($query);
185+
}
183186

184187
// Paginate and return
185188
$resources = $query->paginate(10)->appends($request->query());

app/Services/SortingManagers/SortingManager.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,27 @@ public function applySort(Builder $query, string $sortBy): Builder
2020

2121
return $query; // fallback: no sort applied
2222
}
23+
24+
/**
25+
* Reverses the direction (ASC <-> DESC) of the *last* order clause in the query.
26+
*/
27+
public function reverse(Builder $query): Builder
28+
{
29+
$orders = $query->getQuery()->orders;
30+
31+
if (empty($orders)) {
32+
return $query;
33+
}
34+
35+
$lastOrder = array_pop($orders);
36+
37+
if (isset($lastOrder['direction'])) {
38+
$lastOrder['direction'] = strtolower($lastOrder['direction']) === 'asc' ? 'desc' : 'asc';
39+
}
40+
41+
$orders[] = $lastOrder;
42+
$query->getQuery()->orders = $orders;
43+
44+
return $query;
45+
}
2346
}

app/SortingStrategies/DateSortingStrategy.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ public static function apply(Builder $query, string $sortBy): Builder
1616
{
1717
switch ($sortBy) {
1818
case 'latest':
19-
$query->orderBy('created_at', 'desc');
19+
$query->orderBy('created_at', 'DESC');
2020
break;
2121
case 'oldest':
22-
$query->orderBy('created_at', 'asc');
22+
$query->orderBy('created_at', 'ASC');
2323
break;
2424
case 'recently_updated':
25-
$query->orderBy('updated_at', 'desc');
25+
$query->orderBy('updated_at', 'DESC');
2626
break;
2727
}
2828

app/SortingStrategies/VoteSortingStrategy.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,19 @@ public static function apply(Builder $query, string $sortBy): Builder
2525

2626
switch ($sortBy) {
2727
case 'top':
28-
$query->orderBy('upvote_summaries.score', 'desc');
28+
$query->orderBy('upvote_summaries.score', 'DESC');
2929
break;
3030

3131
case 'bottom':
32-
$query->orderBy('upvote_summaries.score', 'asc');
32+
$query->orderBy('upvote_summaries.score', 'ASC');
3333
break;
3434

3535
case 'controversial':
36-
$query->orderBy('upvote_summaries.controversy', 'asc');
36+
$query->orderBy('upvote_summaries.controversy', 'ASC');
3737
break;
3838

3939
case 'total_votes':
40-
$query->orderBy('upvote_summaries.total_votes', 'desc');
40+
$query->orderBy('upvote_summaries.total_votes', 'DESC');
4141
break;
4242

4343
case 'hot':

resources/js/Components/Resources/FilterBar.vue

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ const selectedUpdates = ref(null);
3939
4040
// sort_by options
4141
const selectedSorting = ref("top");
42+
const selectedReverse = ref(false);
4243
4344
// date filters
4445
const createdFrom = ref(null);
@@ -80,6 +81,7 @@ onMounted(() => {
8081
8182
// initialize sort_by
8283
selectedSorting.value = urlParams.get("sort_by") || "top";
84+
selectedReverse.value = urlParams.get("reverse") === "1";
8385
8486
createdFrom.value = urlParams.get("created_from")
8587
? new Date(urlParams.get("created_from") + "T00:00:00")
@@ -106,7 +108,8 @@ onMounted(() => {
106108
createdTo.value !== null ||
107109
updatedFrom.value !== null ||
108110
updatedTo.value !== null ||
109-
selectedSorting.value !== "top"
111+
selectedSorting.value !== "top" ||
112+
selectedReverse.value == true
110113
);
111114
}
112115
@@ -166,6 +169,7 @@ function search() {
166169
updated_to:
167170
updatedTo.value?.toISOString().slice(0, 10) || undefined,
168171
sort_by: selectedSorting.value || undefined,
172+
reverse: selectedReverse.value == true ? true : undefined,
169173
}),
170174
{ preserveScroll: true }
171175
);
@@ -201,6 +205,7 @@ function resetFilters() {
201205
202206
// Sorting
203207
selectedSorting.value = "top";
208+
selectedReverse.value = false;
204209
}
205210
</script>
206211

@@ -424,7 +429,7 @@ function resetFilters() {
424429
<!-- Sorting Buttons -->
425430
<div class="w-full">
426431
<h2 class="text-sm font-medium mb-2">Sorting</h2>
427-
<div class="flex flex-wrap gap-2">
432+
<div class="flex flex-wrap gap-2 mb-2">
428433
<button
429434
v-for="opt in resourceSortingLabels"
430435
:key="opt.value"
@@ -440,6 +445,20 @@ function resetFilters() {
440445
{{ opt.label }}
441446
</button>
442447
</div>
448+
449+
<h2 class="text-sm font-medium mb-2">Reverse Sorting</h2>
450+
<button
451+
type="button"
452+
@click="selectedReverse = !selectedReverse"
453+
:class="[
454+
'px-3 py-1 rounded-full text-sm font-medium focus:outline-none',
455+
selectedReverse
456+
? 'bg-blue-600 text-white'
457+
: 'bg-gray-200 text-gray-700 hover:bg-gray-300',
458+
]"
459+
>
460+
Reverse
461+
</button>
443462
</div>
444463
</div>
445464

0 commit comments

Comments
 (0)