Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/log-viewer.php
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,9 @@
// Order to sort the folders. Other options: `Ascending`, `Descending`
'folder_sorting_order' => SortingOrder::Descending,

// Method for sorting log-files into directories. Other options: `Alphabetical`, `ModifiedTime`
'file_sorting_method' => FolderSortingMethod::ModifiedTime,

// Order to sort the logs. Other options: `Ascending`, `Descending`
'log_sorting_order' => SortingOrder::Descending,

Expand Down
2 changes: 1 addition & 1 deletion public/app.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/mix-manifest.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"/app.js": "/app.js?id=74d3e481ad3e8fa14f1daaa0aa46e109",
"/app.js": "/app.js?id=64391c136df5323279f6bc14315c3654",
"/app.css": "/app.css?id=5593a0331dd40729ff41e32a6035d872",
"/img/log-viewer-128.png": "/img/log-viewer-128.png?id=d576c6d2e16074d3f064e60fe4f35166",
"/img/log-viewer-32.png": "/img/log-viewer-32.png?id=f8ec67d10f996aa8baf00df3b61eea6d",
Expand Down
6 changes: 4 additions & 2 deletions resources/js/components/FileList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,10 @@
<div class="text-sm text-gray-500 dark:text-gray-400">
<label for="file-sort-direction" class="sr-only">Sort direction</label>
<select id="file-sort-direction" class="select" v-model="fileStore.direction">
<option value="desc">Newest first</option>
<option value="asc">Oldest first</option>
<option v-if="!LogViewer.files_sort_by_time" value="asc">From A to Z</option>
<option v-if="!LogViewer.files_sort_by_time" value="desc">From Z to A</option>
<option v-if="LogViewer.files_sort_by_time" value="desc">Newest first</option>
<option v-if="LogViewer.files_sort_by_time" value="asc">Oldest first</option>
</select>
</div>
</div>
Expand Down
17 changes: 14 additions & 3 deletions src/Http/Controllers/FilesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\URL;
use Opcodes\LogViewer\Enums\FolderSortingMethod;
use Opcodes\LogViewer\Facades\LogViewer;
use Opcodes\LogViewer\Http\Resources\LogFileResource;

Expand All @@ -13,11 +14,21 @@ class FilesController
public function index(Request $request)
{
$files = LogViewer::getFiles();
$sortingMethod = config('log-viewer.defaults.file_sorting_method', FolderSortingMethod::ModifiedTime);

if ($sortingMethod === FolderSortingMethod::ModifiedTime) {
if ($request->query('direction', 'desc') === 'asc') {
$files = $files->sortByEarliestFirst();
} else {
$files = $files->sortByLatestFirst();
}

if ($request->query('direction', 'desc') === 'asc') {
$files = $files->sortByEarliestFirst();
} else {
$files = $files->sortByLatestFirst();
if ($request->query('direction', 'desc') === 'asc') {
$files = $files->sortAlphabeticallyAsc();
} else {
$files = $files->sortAlphabeticallyDesc();
}
}

return LogFileResource::collection($files);
Expand Down
26 changes: 18 additions & 8 deletions src/Http/Controllers/FoldersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public function index(Request $request)
$sortingMethod = config('log-viewer.defaults.folder_sorting_method', FolderSortingMethod::ModifiedTime);
$sortingOrder = config('log-viewer.defaults.folder_sorting_order', SortingOrder::Descending);

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

if ($sortingMethod === FolderSortingMethod::Alphabetical) {
Expand All @@ -28,22 +29,31 @@ public function index(Request $request)
} else {
$folders = $folders->sortAlphabeticallyDesc();
}
} else { // ModifiedTime
if ($fileSortingOrder === 'asc') {
$folders = $folders->sortByEarliestFirstIncludingFiles();
} else {
$folders = $folders->sortByLatestFirstIncludingFiles();
}
}

// Still sort files inside folders by direction param
$folders->each(function ($folder) use ($fileSortingOrder) {
// Sort files within folders after sorting folders
$folders->each(function ($folder) use ($fileSortingMethod, $fileSortingOrder) {
if ($fileSortingMethod === FolderSortingMethod::ModifiedTime) {
if ($fileSortingOrder === 'asc') {
$folder->files()->sortByEarliestFirst();
} else {
$folder->files()->sortByLatestFirst();
}
});
} else { // ModifiedTime
if ($fileSortingOrder === 'asc') {
$folders = $folders->sortByEarliestFirstIncludingFiles();

} else {
$folders = $folders->sortByLatestFirstIncludingFiles();
if ($fileSortingOrder === 'asc') {
$folder->files()->sortAlphabeticallyAsc();
} else {
$folder->files()->sortAlphabeticallyDesc();
}
}
}
});

return LogFolderResource::collection($folders->values());
}
Expand Down
4 changes: 4 additions & 0 deletions src/Http/Controllers/IndexController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Opcodes\LogViewer\Http\Controllers;

use Opcodes\LogViewer\Enums\FolderSortingMethod;
use Opcodes\LogViewer\Facades\LogViewer;
use Opcodes\LogViewer\LogFolder;
use Opcodes\LogViewer\Utils\Utils;
Expand All @@ -14,6 +15,8 @@ public function __invoke()
abort(404);
}

$files_sort_by_time = config('log-viewer.defaults.file_sorting_method') === FolderSortingMethod::ModifiedTime;

return view(LogViewer::getViewLayout(), [
'logViewerScriptVariables' => [
'headers' => (object) [],
Expand All @@ -23,6 +26,7 @@ public function __invoke()
'path' => config('log-viewer.route_path'),
'back_to_system_url' => config('log-viewer.back_to_system_url'),
'back_to_system_label' => config('log-viewer.back_to_system_label'),
'files_sort_by_time' => $files_sort_by_time,
'max_log_size_formatted' => Utils::bytesForHumans(LogViewer::maxLogSize()),
'show_support_link' => config('log-viewer.show_support_link', true),

Expand Down
14 changes: 14 additions & 0 deletions src/LogFileCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,20 @@ public function sortByLatestFirst(): self
return $this;
}

public function sortAlphabeticallyAsc(): self
{
$this->items = $this->sortBy('name')->values()->toArray();

return $this;
}

public function sortAlphabeticallyDesc(): self
{
$this->items = $this->sortByDesc('name')->values()->toArray();

return $this;
}

public function latest(): ?LogFile
{
return $this->sortByDesc->latestTimestamp()->first();
Expand Down
135 changes: 135 additions & 0 deletions tests/Feature/LogFilesControllerAlphaSortTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
<?php

use Opcodes\LogViewer\Enums\FolderSortingMethod;

use function Pest\Laravel\getJson;

beforeEach(function () {
config(['log-viewer.include_files' => ['*.log']]);
});

it('you can get alphabetically sorted default desc logs files controller 1', function () {
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::Alphabetical]);
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);

generateLogFiles([
'one.log',
'two.log',
'three.log',
'four.log',
], randomContent: true);

$response = getJson(route('log-viewer.files'));

expect(array_column($response->json(), 'name'))->toBe([
'two.log',
'three.log',
'one.log',
'four.log',
]);
});

it('you can get alphabetically sorted asc logs files controller 1', function () {
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::Alphabetical]);
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);

generateLogFiles([
'one.log',
'two.log',
'three.log',
'four.log',
], randomContent: true);

$response = getJson(route('log-viewer.files', ['direction' => 'asc']));

expect(array_column($response->json(), 'name'))->toBe([
'four.log',
'one.log',
'three.log',
'two.log',
]);
});

it('you can get alphabetically sorted desc logs files controller 1', function () {
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::Alphabetical]);
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);

generateLogFiles([
'one.log',
'two.log',
'three.log',
'four.log',
], randomContent: true);

$response = getJson(route('log-viewer.files', ['direction' => 'desc']));

expect(array_column($response->json(), 'name'))->toBe([
'two.log',
'three.log',
'one.log',
'four.log',
]);
});

it('you can get alphabetically sorted default desc logs files controller 2', function () {
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::ModifiedTime]);
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);

generateLogFiles([
'one.log',
'two.log',
'three.log',
'four.log',
], randomContent: true);

$response = getJson(route('log-viewer.files'));

expect(array_column($response->json(), 'name'))->toBe([
'two.log',
'three.log',
'one.log',
'four.log',
]);
});

it('you can get alphabetically sorted asc logs files controller 2', function () {
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::ModifiedTime]);
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);

generateLogFiles([
'one.log',
'two.log',
'three.log',
'four.log',
], randomContent: true);

$response = getJson(route('log-viewer.files', ['direction' => 'asc']));

expect(array_column($response->json(), 'name'))->toBe([
'four.log',
'one.log',
'three.log',
'two.log',
]);
});

it('you can get alphabetically sorted desc logs files controller 2', function () {
config(['log-viewer.defaults.folder_sorting_method' => FolderSortingMethod::ModifiedTime]);
config(['log-viewer.defaults.file_sorting_method' => FolderSortingMethod::Alphabetical]);

generateLogFiles([
'one.log',
'two.log',
'three.log',
'four.log',
], randomContent: true);

$response = getJson(route('log-viewer.files', ['direction' => 'desc']));

expect(array_column($response->json(), 'name'))->toBe([
'two.log',
'three.log',
'one.log',
'four.log',
]);
});
Loading
Loading