Skip to content

Commit 32b262c

Browse files
committed
ability to change root prefix; change to "log_sorting_order" which makes more sense;
1 parent 661ef8f commit 32b262c

File tree

10 files changed

+52
-22
lines changed

10 files changed

+52
-22
lines changed

config/log-viewer.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,8 @@
268268
// Order to sort the folders. Other options: `Ascending`, `Descending`
269269
'folder_sorting_order' => SortingOrder::Descending,
270270

271-
// Order to sort the files. Other options: `Ascending`, `Descending`
272-
'file_sorting_order' => SortingOrder::Descending,
271+
// Order to sort the logs. Other options: `Ascending`, `Descending`
272+
'log_sorting_order' => SortingOrder::Descending,
273273

274274
// Number of results per page. Must be one of the above `per_page_options` values
275275
'per_page' => 25,
@@ -281,4 +281,16 @@
281281
'shorter_stack_traces' => false,
282282

283283
],
284+
285+
/*
286+
|--------------------------------------------------------------------------
287+
| Root folder prefix
288+
|--------------------------------------------------------------------------
289+
| The prefix for log files inside Laravel's `storage/logs` folder.
290+
| Log Viewer does not show the full path to these files in the UI,
291+
| but only the filename prefixed with this value.
292+
|
293+
*/
294+
295+
'root_folder_prefix' => 'root',
284296
];

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=601a9335bbd07ad6070f9d7da29cd3cb",
2+
"/app.js": "/app.js?id=aad92fca2262c03653db52125757e99d",
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
@@ -98,8 +98,8 @@
9898
<ChevronRightIcon :class="[fileStore.isOpen(folder) ? 'rotate-90' : '', 'transition duration-100']" />
9999
</span>
100100
<span class="file-name">
101-
<span v-if="String(folder.clean_path || '').startsWith('root')">
102-
<span class="text-gray-500 dark:text-gray-400">root</span>{{ String(folder.clean_path).substring(4) }}
101+
<span v-if="String(folder.clean_path || '').startsWith(rootFolderPrefix)">
102+
<span class="text-gray-500 dark:text-gray-400">{{ rootFolderPrefix }}</span>{{ String(folder.clean_path).substring(rootFolderPrefix.length) }}
103103
</span>
104104
<span v-else>{{ folder.clean_path }}</span>
105105
</span>
@@ -255,6 +255,8 @@ const selectFile = (fileIdentifier) => {
255255
}
256256
};
257257
258+
const rootFolderPrefix = window.LogViewer?.root_folder_prefix || 'root';
259+
258260
onMounted(async () => {
259261
hostStore.selectHost(route.query.host || null);
260262
});

resources/js/stores/logViewer.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export const useLogViewerStore = defineStore({
3737
? useLocalStorage('logViewerResultsPerPage', window.LogViewer?.defaults?.per_page ?? 25)
3838
: (window.LogViewer?.defaults?.per_page ?? 25),
3939
direction: shouldUseLocalStorage
40-
? useLocalStorage('logViewerDirection', window.LogViewer?.defaults?.file_sorting_order || 'desc')
41-
: (window.LogViewer?.defaults?.file_sorting_order || 'desc'),
40+
? useLocalStorage('logViewerDirection', window.LogViewer?.defaults?.log_sorting_order || 'desc')
41+
: (window.LogViewer?.defaults?.log_sorting_order || 'desc'),
4242
helpSlideOverOpen: false,
4343

4444
// Log data

src/Http/Controllers/IndexController.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Opcodes\LogViewer\Http\Controllers;
44

55
use Opcodes\LogViewer\Facades\LogViewer;
6+
use Opcodes\LogViewer\LogFolder;
67
use Opcodes\LogViewer\Utils\Utils;
78

89
class IndexController
@@ -30,11 +31,12 @@ public function __invoke()
3031
'per_page_options' => config('log-viewer.per_page_options') ?? [10, 25, 50, 100, 250, 500],
3132
'defaults' => [
3233
'use_local_storage' => config('log-viewer.defaults.use_local_storage'),
33-
'file_sorting_order' => config('log-viewer.defaults.file_sorting_order'),
34+
'log_sorting_order' => config('log-viewer.defaults.log_sorting_order'),
3435
'per_page' => config('log-viewer.defaults.per_page'),
3536
'theme' => config('log-viewer.defaults.theme'),
3637
'shorter_stack_traces' => config('log-viewer.defaults.shorter_stack_traces'),
3738
],
39+
'root_folder_prefix' => LogFolder::rootPrefix(),
3840
],
3941
]);
4042
}

src/LogFolder.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class LogFolder
1111
{
1212
public string $identifier;
1313
protected mixed $files;
14+
protected static string $rootPrefix;
1415

1516
public function __construct(
1617
public string $path,
@@ -38,15 +39,27 @@ public function isRoot(): bool
3839
|| $this->path === rtrim(LogViewer::basePathForLogs(), DIRECTORY_SEPARATOR);
3940
}
4041

42+
/**
43+
* Returns the prefix string used to represent the root folder.
44+
*/
45+
public static function rootPrefix(): string
46+
{
47+
if (! isset(self::$rootPrefix)) {
48+
self::$rootPrefix = config('log-viewer.root_folder_prefix', 'root');
49+
}
50+
51+
return self::$rootPrefix;
52+
}
53+
4154
public function cleanPath(): string
4255
{
4356
if ($this->isRoot()) {
44-
return 'root';
57+
return self::rootPrefix();
4558
}
4659

4760
$folder = $this->path;
4861

49-
$folder = str_replace(LogViewer::basePathForLogs(), 'root'.DIRECTORY_SEPARATOR, $folder);
62+
$folder = str_replace(LogViewer::basePathForLogs(), self::rootPrefix().DIRECTORY_SEPARATOR, $folder);
5063

5164
if ($unixHomePath = getenv('HOME')) {
5265
$folder = str_replace($unixHomePath, '~', $folder);

tests/Feature/Authorization/CanDownloadFoldersTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ function assertCannotDownloadFolder(string $folderName): void
2929
generateLogFiles([$fileName = 'laravel.log']);
3030
$folder = LogViewer::getFolder('');
3131

32-
assertCanDownloadFolder($folder->identifier, 'root.zip');
32+
assertCanDownloadFolder($folder->identifier, LogFolder::rootPrefix().'.zip');
3333
});
3434

3535
test('cannot download a folder that\'s not found', function () {
@@ -47,7 +47,7 @@ function assertCannotDownloadFolder(string $folderName): void
4747
// now let's allow access again
4848
Gate::define('downloadLogFolder', fn (mixed $user) => true);
4949

50-
assertCanDownloadFolder($folder->identifier, 'root.zip');
50+
assertCanDownloadFolder($folder->identifier, LogFolder::rootPrefix().'.zip');
5151
});
5252

5353
test('"downloadLogFolder" gate is supplied with a log folder object', function () {
@@ -63,7 +63,7 @@ function assertCannotDownloadFolder(string $folderName): void
6363
return true;
6464
});
6565

66-
assertCanDownloadFolder($expectedFolder->identifier, 'root.zip');
66+
assertCanDownloadFolder($expectedFolder->identifier, LogFolder::rootPrefix().'.zip');
6767

6868
expect($gateChecked)->toBeTrue();
6969
});

tests/Feature/LogFoldersControllerTest.php

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

33
use Opcodes\LogViewer\Enums\FolderSortingMethod;
44
use Opcodes\LogViewer\Enums\SortingOrder;
5+
use Opcodes\LogViewer\LogFolder;
56

67
use function Pest\Laravel\getJson;
78

@@ -23,8 +24,8 @@
2324

2425
expect($response->json())->not->toHaveKey('data');
2526
$response->assertJsonCount(2)
26-
->assertJsonFragment(['clean_path' => 'root'.DIRECTORY_SEPARATOR.'one'])
27-
->assertJsonFragment(['clean_path' => 'root'.DIRECTORY_SEPARATOR.'two']);
27+
->assertJsonFragment(['clean_path' => LogFolder::rootPrefix().DIRECTORY_SEPARATOR.'one'])
28+
->assertJsonFragment(['clean_path' => LogFolder::rootPrefix().DIRECTORY_SEPARATOR.'two']);
2829
});
2930

3031
it('folders are sorted alphabetically descending when configured', function () {
@@ -44,8 +45,8 @@
4445
$folders = $response->json();
4546
// Should be sorted: 'root', 'alpha', 'one', 'two'
4647
$response->assertJsonCount(4);
47-
expect($folders[0]['clean_path'])->toBe('root');
48-
expect($folders[1]['clean_path'])->toBe('root'.DIRECTORY_SEPARATOR.'alpha');
49-
expect($folders[2]['clean_path'])->toBe('root'.DIRECTORY_SEPARATOR.'one');
50-
expect($folders[3]['clean_path'])->toBe('root'.DIRECTORY_SEPARATOR.'two');
48+
expect($folders[0]['clean_path'])->toBe(LogFolder::rootPrefix());
49+
expect($folders[1]['clean_path'])->toBe(LogFolder::rootPrefix().DIRECTORY_SEPARATOR.'alpha');
50+
expect($folders[2]['clean_path'])->toBe(LogFolder::rootPrefix().DIRECTORY_SEPARATOR.'one');
51+
expect($folders[3]['clean_path'])->toBe(LogFolder::rootPrefix().DIRECTORY_SEPARATOR.'two');
5152
});

tests/Unit/LogFolderCollectionTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@
123123
});
124124

125125
test('LogFolderCollection can sort its folders alphabetically ascending, with root always on top', function () {
126-
$rootFolder = Mockery::mock(new LogFolder('', []))->allows(['isRoot' => true, 'cleanPath' => 'root']);
126+
$rootFolder = Mockery::mock(new LogFolder('', []))->allows(['isRoot' => true, 'cleanPath' => LogFolder::rootPrefix()]);
127127
$bFolder = Mockery::mock(new LogFolder('b', []))->allows(['isRoot' => false, 'cleanPath' => 'b']);
128128
$aFolder = Mockery::mock(new LogFolder('a', []))->allows(['isRoot' => false, 'cleanPath' => 'a']);
129129
$zFolder = Mockery::mock(new LogFolder('z', []))->allows(['isRoot' => false, 'cleanPath' => 'z']);
@@ -138,7 +138,7 @@
138138
});
139139

140140
test('LogFolderCollection can sort its folders alphabetically descending, with root always on top', function () {
141-
$rootFolder = Mockery::mock(new LogFolder('', []))->allows(['isRoot' => true, 'cleanPath' => 'root']);
141+
$rootFolder = Mockery::mock(new LogFolder('', []))->allows(['isRoot' => true, 'cleanPath' => LogFolder::rootPrefix()]);
142142
$bFolder = Mockery::mock(new LogFolder('b', []))->allows(['isRoot' => false, 'cleanPath' => 'b']);
143143
$aFolder = Mockery::mock(new LogFolder('a', []))->allows(['isRoot' => false, 'cleanPath' => 'a']);
144144
$zFolder = Mockery::mock(new LogFolder('z', []))->allows(['isRoot' => false, 'cleanPath' => 'z']);

0 commit comments

Comments
 (0)