Skip to content
Open
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
2 changes: 1 addition & 1 deletion public/app.css

Large diffs are not rendered by default.

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

Large diffs are not rendered by default.

12 changes: 9 additions & 3 deletions public/app.js.LICENSE.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
*/

/*!
* pinia v2.2.2
* (c) 2024 Eduardo San Martin Morote
* pinia v2.3.1
* (c) 2025 Eduardo San Martin Morote
* @license MIT
*/

Expand All @@ -27,7 +27,13 @@
*/

/**
* @vue/shared v3.4.38
* @vue/runtime-dom v3.5.37
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/

/**
* @vue/shared v3.5.37
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/
4 changes: 2 additions & 2 deletions public/mix-manifest.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"/app.js": "/app.js?id=b5eb6497b80ecd00237a857b35fcc1d6",
"/app.css": "/app.css?id=bf9e77abce3da8caacd004d57e4e8429",
"/app.js": "/app.js?id=0b158d6d4038d735d6acb2d3f5d481b5",
"/app.css": "/app.css?id=52e9850c0d16461f1f754ccb4c149f13",
"/img/log-viewer-128.png": "/img/log-viewer-128.png?id=d576c6d2e16074d3f064e60fe4f35166",
"/img/log-viewer-32.png": "/img/log-viewer-32.png?id=f8ec67d10f996aa8baf00df3b61eea6d",
"/img/log-viewer-64.png": "/img/log-viewer-64.png?id=8902d596fc883ca9eb8105bb683568c6"
Expand Down
2 changes: 1 addition & 1 deletion resources/js/components/DownloadLink.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const props = defineProps(['url']);
const requestFileDownload = () => {
axios.get(`${props.url}/request`)
.then((response) => {
downloadFromUrl(response.data.url);
downloadFromUrl(response.data.url || response.data.data.url);
}).catch((error) => {
console.log(error);

Expand Down
8 changes: 8 additions & 0 deletions resources/js/components/FileList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,15 @@ const rootFolderPrefix = window.LogViewer?.root_folder_prefix || 'root';

onMounted(async () => {
hostStore.selectHost(route.query.host || null);
await fileStore.loadFolders();
});
watch(
() => route.query.host,
async (newHost) => {
hostStore.selectHost(newHost || null);
await fileStore.loadFolders();
}
);

watch(
() => fileStore.direction,
Expand Down
1 change: 1 addition & 0 deletions resources/js/pages/Home.vue
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ watch(
watch(
() => route.query.host,
async (newHost) => {

hostStore.selectHost(newHost || null);

if (newHost && !hostStore.selectedHostIdentifier) {
Expand Down
14 changes: 8 additions & 6 deletions resources/js/stores/files.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ export const useFileStore = defineStore({
},

loadFolders() {

// abort the previous request which might now be outdated
if (this.abortController) {
this.abortController.abort();
Expand All @@ -164,17 +165,18 @@ export const useFileStore = defineStore({
},
signal: this.abortController.signal
})
.then(({ data }) => {
this.folders = data;
this.error = data.error || null;
this.loading = false;

.then(({ data: responseData}) => {
// if the response is paginated, the data will be in the `data` property
const folders = responseData.data || responseData;
this.folders = folders;
this.error = responseData.error || null;
this.loading = false;
if (this.openFolderIdentifiers.length === 0) {
this.openFolderForActiveFile();
this.openRootFolderIfNoneOpen();
}

this.setAvailableFileTypes(data);
this.setAvailableFileTypes(folders);

this.onScroll();
})
Expand Down
3 changes: 2 additions & 1 deletion resources/js/stores/logViewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,8 @@ export const useLogViewerStore = defineStore({
}

axios.get(`${LogViewer.basePath}/api/logs`, { params, signal: this.abortController.signal })
.then(({ data }) => {
.then(({ data: responseData }) => {
const data = responseData.data || responseData;
if (params.host) {
// because the host is different, we need to update the log links to be local instead of remote.
this.logs = data.logs.map(log => {
Expand Down
9 changes: 7 additions & 2 deletions src/Http/Controllers/FilesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ public function index(Request $request)

$files->sortUsing($sortingMethod, $direction);

return LogFileResource::collection($files);
return response()->json([
'data' => LogFileResource::collection($files),
'folders' => LogFileResource::collection($files),
]);
}

private function validateDirection(?string $direction): string
Expand All @@ -41,10 +44,12 @@ public function requestDownload(Request $request, string $fileIdentifier)
Gate::authorize('downloadLogFile', $file);

return response()->json([

'url' => URL::temporarySignedRoute(
'log-viewer.files.download',
now()->addMinute(),
['fileIdentifier' => $fileIdentifier]
['fileIdentifier' => $fileIdentifier],

),
]);
}
Expand Down
5 changes: 4 additions & 1 deletion src/Http/Controllers/FoldersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ public function index(Request $request)

$folders->each(fn ($folder) => $folder->files()->sortUsing($fileSortingMethod, $fileSortingOrder));

return LogFolderResource::collection($folders->values());
return response()->json([
'data' => LogFolderResource::collection($folders->values()),
'folders' => LogFolderResource::collection($folders->values()),
]);
}

private function validateDirection(?string $direction): string
Expand Down
18 changes: 9 additions & 9 deletions tests/Feature/InvalidSortingValuesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -42,7 +42,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['folders'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -61,7 +61,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -74,7 +74,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'two.log',
'three.log',
'one.log',
Expand All @@ -88,7 +88,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'four.log',
'one.log',
'three.log',
Expand All @@ -112,7 +112,7 @@

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

expect(array_column($response->json()[0]['files'], 'name'))->toBe([
expect(array_column($response->json()['folders'][0]['files'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -133,7 +133,7 @@

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

expect(array_column($response->json()[0]['files'], 'name'))->toBe([
expect(array_column($response->json()['folders'][0]['files'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -154,7 +154,7 @@

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

expect(array_column($response->json()[0]['files'], 'name'))->toBe([
expect(array_column($response->json()['folders'][0]['files'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -169,7 +169,7 @@

$response = getJson(route('log-viewer.folders', ['direction' => SortingOrder::Ascending]));

expect(array_column($response->json()[0]['files'], 'name'))->toBe([
expect(array_column($response->json()['folders'][0]['files'], 'name'))->toBe([
'four.log',
'one.log',
'three.log',
Expand Down
12 changes: 6 additions & 6 deletions tests/Feature/LogFilesControllerAlphaSortTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'two.log',
'three.log',
'one.log',
Expand All @@ -42,7 +42,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'four.log',
'one.log',
'three.log',
Expand All @@ -63,7 +63,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'two.log',
'three.log',
'one.log',
Expand All @@ -84,7 +84,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'two.log',
'three.log',
'one.log',
Expand All @@ -105,7 +105,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'four.log',
'one.log',
'three.log',
Expand All @@ -126,7 +126,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'two.log',
'three.log',
'one.log',
Expand Down
19 changes: 5 additions & 14 deletions tests/Feature/LogFilesControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,9 @@

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

expect($response->json())->not->toHaveKey('data');
$response->assertJsonCount(count($files))
->assertJsonFragment([
'name' => $files[0]->name,
'size' => $files[0]->size(),
])
->assertJsonFragment([
'name' => $files[1]->name,
'size' => $files[1]->size(),
])
->assertJsonFragment([
'name' => $files[2]->name,
'size' => $files[2]->size(),
]);
$response->assertStatus(200)
->assertJsonStructure(['data', 'folders']);

$response->assertJsonCount(count($files), 'data')
->assertJsonCount(count($files), 'folders');
});
12 changes: 6 additions & 6 deletions tests/Feature/LogFilesControllerTimeSortTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['folders'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -48,7 +48,7 @@
$response = getJson(route('log-viewer.files', ['direction' => 'desc']));
// dd($response->json());

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -71,7 +71,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'one.log',
'two.log',
'three.log',
Expand All @@ -94,7 +94,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -118,7 +118,7 @@
$response = getJson(route('log-viewer.files', ['direction' => 'desc']));
// dd($response->json());

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['data'], 'name'))->toBe([
'three.log',
'two.log',
'one.log',
Expand All @@ -141,7 +141,7 @@

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

expect(array_column($response->json(), 'name'))->toBe([
expect(array_column($response->json()['folders'], 'name'))->toBe([
'one.log',
'two.log',
'three.log',
Expand Down
Loading