Skip to content

Commit 2140b51

Browse files
authored
Merge pull request #472 from yakoffka/feature/adding_alphabetical_file_sorting
Adding alphabetical file sorting
2 parents 503c545 + f2c6de6 commit 2140b51

File tree

12 files changed

+654
-15
lines changed

12 files changed

+654
-15
lines changed

config/log-viewer.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,9 @@
288288
// Order to sort the folders. Other options: `Ascending`, `Descending`
289289
'folder_sorting_order' => SortingOrder::Descending,
290290

291+
// Method for sorting log-files into directories. Other options: `Alphabetical`, `ModifiedTime`
292+
'file_sorting_method' => FolderSortingMethod::ModifiedTime,
293+
291294
// Order to sort the logs. Other options: `Ascending`, `Descending`
292295
'log_sorting_order' => SortingOrder::Descending,
293296

public/app.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/mix-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"/app.js": "/app.js?id=74d3e481ad3e8fa14f1daaa0aa46e109",
2+
"/app.js": "/app.js?id=64391c136df5323279f6bc14315c3654",
33
"/app.css": "/app.css?id=5593a0331dd40729ff41e32a6035d872",
44
"/img/log-viewer-128.png": "/img/log-viewer-128.png?id=d576c6d2e16074d3f064e60fe4f35166",
55
"/img/log-viewer-32.png": "/img/log-viewer-32.png?id=f8ec67d10f996aa8baf00df3b61eea6d",

resources/js/components/FileList.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@
4545
<div class="text-sm text-gray-500 dark:text-gray-400">
4646
<label for="file-sort-direction" class="sr-only">Sort direction</label>
4747
<select id="file-sort-direction" class="select" v-model="fileStore.direction">
48-
<option value="desc">Newest first</option>
49-
<option value="asc">Oldest first</option>
48+
<option v-if="!LogViewer.files_sort_by_time" value="asc">From A to Z</option>
49+
<option v-if="!LogViewer.files_sort_by_time" value="desc">From Z to A</option>
50+
<option v-if="LogViewer.files_sort_by_time" value="desc">Newest first</option>
51+
<option v-if="LogViewer.files_sort_by_time" value="asc">Oldest first</option>
5052
</select>
5153
</div>
5254
</div>

src/Http/Controllers/FilesController.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Illuminate\Http\Request;
66
use Illuminate\Support\Facades\Gate;
77
use Illuminate\Support\Facades\URL;
8+
use Opcodes\LogViewer\Enums\FolderSortingMethod;
89
use Opcodes\LogViewer\Facades\LogViewer;
910
use Opcodes\LogViewer\Http\Resources\LogFileResource;
1011

@@ -13,11 +14,21 @@ class FilesController
1314
public function index(Request $request)
1415
{
1516
$files = LogViewer::getFiles();
17+
$sortingMethod = config('log-viewer.defaults.file_sorting_method', FolderSortingMethod::ModifiedTime);
18+
19+
if ($sortingMethod === FolderSortingMethod::ModifiedTime) {
20+
if ($request->query('direction', 'desc') === 'asc') {
21+
$files = $files->sortByEarliestFirst();
22+
} else {
23+
$files = $files->sortByLatestFirst();
24+
}
1625

17-
if ($request->query('direction', 'desc') === 'asc') {
18-
$files = $files->sortByEarliestFirst();
1926
} else {
20-
$files = $files->sortByLatestFirst();
27+
if ($request->query('direction', 'desc') === 'asc') {
28+
$files = $files->sortAlphabeticallyAsc();
29+
} else {
30+
$files = $files->sortAlphabeticallyDesc();
31+
}
2132
}
2233

2334
return LogFileResource::collection($files);

src/Http/Controllers/FoldersController.php

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public function index(Request $request)
2020
$sortingMethod = config('log-viewer.defaults.folder_sorting_method', FolderSortingMethod::ModifiedTime);
2121
$sortingOrder = config('log-viewer.defaults.folder_sorting_order', SortingOrder::Descending);
2222

23+
$fileSortingMethod = config('log-viewer.defaults.file_sorting_method', FolderSortingMethod::ModifiedTime);
2324
$fileSortingOrder = $request->query('direction', 'desc');
2425

2526
if ($sortingMethod === FolderSortingMethod::Alphabetical) {
@@ -28,22 +29,31 @@ public function index(Request $request)
2829
} else {
2930
$folders = $folders->sortAlphabeticallyDesc();
3031
}
32+
} else { // ModifiedTime
33+
if ($fileSortingOrder === 'asc') {
34+
$folders = $folders->sortByEarliestFirstIncludingFiles();
35+
} else {
36+
$folders = $folders->sortByLatestFirstIncludingFiles();
37+
}
38+
}
3139

32-
// Still sort files inside folders by direction param
33-
$folders->each(function ($folder) use ($fileSortingOrder) {
40+
// Sort files within folders after sorting folders
41+
$folders->each(function ($folder) use ($fileSortingMethod, $fileSortingOrder) {
42+
if ($fileSortingMethod === FolderSortingMethod::ModifiedTime) {
3443
if ($fileSortingOrder === 'asc') {
3544
$folder->files()->sortByEarliestFirst();
3645
} else {
3746
$folder->files()->sortByLatestFirst();
3847
}
39-
});
40-
} else { // ModifiedTime
41-
if ($fileSortingOrder === 'asc') {
42-
$folders = $folders->sortByEarliestFirstIncludingFiles();
48+
4349
} else {
44-
$folders = $folders->sortByLatestFirstIncludingFiles();
50+
if ($fileSortingOrder === 'asc') {
51+
$folder->files()->sortAlphabeticallyAsc();
52+
} else {
53+
$folder->files()->sortAlphabeticallyDesc();
54+
}
4555
}
46-
}
56+
});
4757

4858
return LogFolderResource::collection($folders->values());
4959
}

src/Http/Controllers/IndexController.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Opcodes\LogViewer\Http\Controllers;
44

5+
use Opcodes\LogViewer\Enums\FolderSortingMethod;
56
use Opcodes\LogViewer\Facades\LogViewer;
67
use Opcodes\LogViewer\LogFolder;
78
use Opcodes\LogViewer\Utils\Utils;
@@ -14,6 +15,8 @@ public function __invoke()
1415
abort(404);
1516
}
1617

18+
$files_sort_by_time = config('log-viewer.defaults.file_sorting_method') === FolderSortingMethod::ModifiedTime;
19+
1720
return view(LogViewer::getViewLayout(), [
1821
'logViewerScriptVariables' => [
1922
'headers' => (object) [],
@@ -23,6 +26,7 @@ public function __invoke()
2326
'path' => config('log-viewer.route_path'),
2427
'back_to_system_url' => config('log-viewer.back_to_system_url'),
2528
'back_to_system_label' => config('log-viewer.back_to_system_label'),
29+
'files_sort_by_time' => $files_sort_by_time,
2630
'max_log_size_formatted' => Utils::bytesForHumans(LogViewer::maxLogSize()),
2731
'show_support_link' => config('log-viewer.show_support_link', true),
2832

src/LogFileCollection.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ public function sortByLatestFirst(): self
2828
return $this;
2929
}
3030

31+
public function sortAlphabeticallyAsc(): self
32+
{
33+
$this->items = $this->sortBy('name')->values()->toArray();
34+
35+
return $this;
36+
}
37+
38+
public function sortAlphabeticallyDesc(): self
39+
{
40+
$this->items = $this->sortByDesc('name')->values()->toArray();
41+
42+
return $this;
43+
}
44+
3145
public function latest(): ?LogFile
3246
{
3347
return $this->sortByDesc->latestTimestamp()->first();
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
<?php
2+
3+
use Opcodes\LogViewer\Enums\FolderSortingMethod;
4+
5+
use function Pest\Laravel\getJson;
6+
7+
beforeEach(function () {
8+
config(['log-viewer.include_files' => ['*.log']]);
9+
});
10+
11+
it('you can get alphabetically sorted default desc logs files controller 1', function () {
12+
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::Alphabetical]);
13+
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);
14+
15+
generateLogFiles([
16+
'one.log',
17+
'two.log',
18+
'three.log',
19+
'four.log',
20+
], randomContent: true);
21+
22+
$response = getJson(route('log-viewer.files'));
23+
24+
expect(array_column($response->json(), 'name'))->toBe([
25+
'two.log',
26+
'three.log',
27+
'one.log',
28+
'four.log',
29+
]);
30+
});
31+
32+
it('you can get alphabetically sorted asc logs files controller 1', function () {
33+
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::Alphabetical]);
34+
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);
35+
36+
generateLogFiles([
37+
'one.log',
38+
'two.log',
39+
'three.log',
40+
'four.log',
41+
], randomContent: true);
42+
43+
$response = getJson(route('log-viewer.files', ['direction' => 'asc']));
44+
45+
expect(array_column($response->json(), 'name'))->toBe([
46+
'four.log',
47+
'one.log',
48+
'three.log',
49+
'two.log',
50+
]);
51+
});
52+
53+
it('you can get alphabetically sorted desc logs files controller 1', function () {
54+
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::Alphabetical]);
55+
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);
56+
57+
generateLogFiles([
58+
'one.log',
59+
'two.log',
60+
'three.log',
61+
'four.log',
62+
], randomContent: true);
63+
64+
$response = getJson(route('log-viewer.files', ['direction' => 'desc']));
65+
66+
expect(array_column($response->json(), 'name'))->toBe([
67+
'two.log',
68+
'three.log',
69+
'one.log',
70+
'four.log',
71+
]);
72+
});
73+
74+
it('you can get alphabetically sorted default desc logs files controller 2', function () {
75+
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::ModifiedTime]);
76+
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);
77+
78+
generateLogFiles([
79+
'one.log',
80+
'two.log',
81+
'three.log',
82+
'four.log',
83+
], randomContent: true);
84+
85+
$response = getJson(route('log-viewer.files'));
86+
87+
expect(array_column($response->json(), 'name'))->toBe([
88+
'two.log',
89+
'three.log',
90+
'one.log',
91+
'four.log',
92+
]);
93+
});
94+
95+
it('you can get alphabetically sorted asc logs files controller 2', function () {
96+
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::ModifiedTime]);
97+
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);
98+
99+
generateLogFiles([
100+
'one.log',
101+
'two.log',
102+
'three.log',
103+
'four.log',
104+
], randomContent: true);
105+
106+
$response = getJson(route('log-viewer.files', ['direction' => 'asc']));
107+
108+
expect(array_column($response->json(), 'name'))->toBe([
109+
'four.log',
110+
'one.log',
111+
'three.log',
112+
'two.log',
113+
]);
114+
});
115+
116+
it('you can get alphabetically sorted desc logs files controller 2', function () {
117+
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::ModifiedTime]);
118+
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);
119+
120+
generateLogFiles([
121+
'one.log',
122+
'two.log',
123+
'three.log',
124+
'four.log',
125+
], randomContent: true);
126+
127+
$response = getJson(route('log-viewer.files', ['direction' => 'desc']));
128+
129+
expect(array_column($response->json(), 'name'))->toBe([
130+
'two.log',
131+
'three.log',
132+
'one.log',
133+
'four.log',
134+
]);
135+
});

0 commit comments

Comments
 (0)