Skip to content

Commit 0538b0a

Browse files
Merge pull request #82 from imbus/SIT-125_bugfix-sorting-problem-on-settings-page
Sit 125 bugfix sorting problem on settings page
2 parents d79478a + bf26ca6 commit 0538b0a

File tree

2 files changed

+109
-3
lines changed

2 files changed

+109
-3
lines changed

app/Http/Controllers/Api/PredefinedFilterController.php

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
use Illuminate\Http\Request;
1313
use Illuminate\Support\Facades\Validator;
1414
use App\Helpers\Helper;
15-
use Log;
1615

1716
class PredefinedFilterController extends Controller
1817
{
@@ -23,12 +22,43 @@ public function __construct(PredefinedFilterService $service)
2322
$this->service = $service;
2423
}
2524

26-
public function index()
25+
public function index(Request $request) : JsonResponse | array
2726
{
2827
$filters = $this->service->getAllViewableFilters();
29-
return (new PredefinedFiltersTransformer)->transformPredefinedFilters($filters, $filters->count());
28+
29+
if ($request->filled('search')) {
30+
$search = strtolower($request->get('search'));
31+
$filters = $filters->filter(fn($filter) =>
32+
str_contains(strtolower($filter->name), $search)
33+
);
34+
}
35+
36+
// --- Sorting ---
37+
$sort = $request->input('sort', 'name');
38+
$order = $request->input('order', 'asc');
39+
40+
$allowed_columns = ['id', 'name', 'is_public', 'created_by'];
41+
42+
if (!in_array($sort, $allowed_columns)) {
43+
$sort = 'name';
44+
}
45+
46+
$filters = $order === 'desc'
47+
? $filters->sortByDesc(fn($f) => strtolower(data_get($f, $sort, '')))
48+
: $filters->sortBy(fn($f) => strtolower(data_get($f, $sort, '')));
49+
50+
// --- Pagination ---
51+
$total = $filters->count();
52+
$offset = (int) $request->input('offset', 0);
53+
$limit = (int) $request->input('limit', config('app.max_results', 50));
54+
55+
$filters = $filters->slice($offset, $limit)->values();
56+
57+
return (new PredefinedFiltersTransformer)->transformPredefinedFilters($filters, $total);
3058
}
3159

60+
61+
3262
public function show(int $id)
3363
{
3464
$filter = $this->service->getFilterById($id);

tests/Feature/PredefinedFilter/Api/PredefinedFilterControllerTest.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,82 @@ public function test_su_can_see_private_filter(){
145145
->assertJsonFragment(['name'=>'Allowed Private Filter']);
146146
}
147147

148+
public function test_index_can_search_by_name(): void
149+
{
150+
$user = User::factory()->create();
151+
152+
$match = PredefinedFilter::factory()->create([
153+
'name' => 'Important Filter',
154+
'is_public' => 0,
155+
'created_by' => $user->id,
156+
]);
157+
$noMatch = PredefinedFilter::factory()->create([
158+
'name' => 'Unrelated',
159+
'is_public' => 0,
160+
'created_by' => $user->id,
161+
]);
162+
163+
$response = $this->actingAs($user, 'api')
164+
->getJson('/api/v1/predefinedFilters?search=important')
165+
->assertOk();
166+
167+
$response->assertJsonFragment(['name' => 'Important Filter']);
168+
$response->assertJsonMissing(['name' => 'Unrelated']);
169+
$this->assertCount(1, $response->json('rows'));
170+
}
171+
172+
public function test_index_can_sort_results_by_name(): void
173+
{
174+
$user = User::factory()->create();
175+
176+
$a = PredefinedFilter::factory()->create(['name' => 'Alpha', 'is_public' => 0, 'created_by' => $user->id]);
177+
$z = PredefinedFilter::factory()->create(['name' => 'Zulu', 'is_public' => 0, 'created_by' => $user->id]);
178+
$m = PredefinedFilter::factory()->create(['name' => 'Mike', 'is_public' => 0, 'created_by' => $user->id]);
179+
180+
// Ascending
181+
$asc = $this->actingAs($user, 'api')
182+
->getJson('/api/v1/predefinedFilters?sort=name&order=asc')
183+
->assertOk()
184+
->json('rows');
185+
186+
$this->assertEquals(['Alpha', 'Mike', 'Zulu'], array_column($asc, 'name'));
187+
188+
// Descending
189+
$desc = $this->actingAs($user, 'api')
190+
->getJson('/api/v1/predefinedFilters?sort=name&order=desc')
191+
->assertOk()
192+
->json('rows');
193+
194+
$this->assertEquals(['Zulu', 'Mike', 'Alpha'], array_column($desc, 'name'));
195+
}
196+
197+
public function test_index_can_paginate_results(): void
198+
{
199+
$user = User::factory()->create();
200+
201+
$filters = PredefinedFilter::factory()->count(5)->sequence(
202+
['name' => 'Filter 1', 'is_public' => 0],
203+
['name' => 'Filter 2', 'is_public' => 0],
204+
['name' => 'Filter 3', 'is_public' => 0],
205+
['name' => 'Filter 4', 'is_public' => 0],
206+
['name' => 'Filter 5', 'is_public' => 0],
207+
)->create(['created_by' => $user->id]);
208+
209+
$response1 = $this->actingAs($user, 'api')
210+
->getJson('/api/v1/predefinedFilters?limit=2&offset=0')
211+
->assertOk();
212+
213+
$this->assertCount(2, $response1->json('rows'));
214+
$this->assertEquals(5, $response1->json('total'));
215+
216+
$response2 = $this->actingAs($user, 'api')
217+
->getJson('/api/v1/predefinedFilters?limit=2&offset=2')
218+
->assertOk();
219+
220+
$this->assertCount(2, $response2->json('rows'));
221+
$this->assertEquals(5, $response2->json('total'));
222+
}
223+
148224
//------SHOW TESTS------
149225

150226
public function test_show_404_when_missing(): void

0 commit comments

Comments
 (0)