Skip to content

Commit 551782c

Browse files
authored
Merge pull request #2598 from jplag/report-viewer/query-on-all-views
Allow loading files per query on all views
2 parents d9a89c7 + d7808fd commit 551782c

3 files changed

Lines changed: 38 additions & 39 deletions

File tree

report-viewer/report-viewer/src/router.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,14 @@ router.onError((error) => {
9393
redirectOnError(error, 'An error occurred while routing. Please reload the page.\n')
9494
})
9595

96+
// preserve query parameters
97+
router.beforeEach((to, from, next) => {
98+
// Only add the old query if the target has none defined, this prevents an infinite redirect loop
99+
if (Object.keys(to.query).length === 0 && Object.keys(from.query).length > 0) {
100+
next({ ...to, query: from.query })
101+
} else {
102+
next()
103+
}
104+
})
105+
96106
export { router, redirectOnError }

report-viewer/report-viewer/src/stores/fileLoading.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,29 @@ export const REPORT_FILE_NAME = 'results.jplag'
55

66
export async function loadReport(): Promise<void> {
77
let reportFile: Blob | null = null
8-
let reportName: string | null = null
8+
let reportName: string = REPORT_FILE_NAME
99
if (await useLocalReportFileMode()) {
1010
reportFile = await getLocalFile(REPORT_FILE_NAME)
11-
reportName = REPORT_FILE_NAME
1211
} else if (import.meta.env.MODE == 'demo' || import.meta.env.MODE == 'dev-demo') {
1312
reportFile = await getLocalFile('example.jplag')
1413
reportName = 'progpedia.jplag'
14+
} else if (getQueryFileUrl() !== null) {
15+
const queryURL = new URL(getQueryFileUrl()!)
16+
const response = await fetch(queryURL)
17+
reportFile = await response.blob()
18+
19+
const urlParts = queryURL.pathname.split('/')
20+
const lastUrlPart = urlParts[urlParts.length - 1]
21+
if (lastUrlPart?.endsWith('.jplag')) {
22+
reportName = lastUrlPart
23+
}
1524
}
1625
if (!reportFile) {
1726
throw new Error(`No report file found. Please provide a valid report file.`)
1827
}
1928

2029
const report = await new ReportFileHandler().extractContent(reportFile)
21-
reportStore().loadReport(report.files, report.submissionFiles, reportName ?? REPORT_FILE_NAME)
30+
reportStore().loadReport(report.files, report.submissionFiles, reportName)
2231
}
2332

2433
async function getLocalFile(path: string): Promise<Blob | null> {
@@ -35,7 +44,7 @@ async function getLocalFile(path: string): Promise<Blob | null> {
3544
}
3645
}
3746

38-
export async function useLocalReportFileMode() {
47+
async function useLocalReportFileMode() {
3948
try {
4049
await getLocalFile(REPORT_FILE_NAME)
4150
return true
@@ -45,3 +54,15 @@ export async function useLocalReportFileMode() {
4554
}
4655
/* eslint-enable @typescript-eslint/no-unused-vars */
4756
}
57+
58+
function getQueryFileUrl() {
59+
const urlParameters = new URLSearchParams(document.location.search)
60+
return urlParameters.get('file')
61+
}
62+
63+
/**
64+
* Checks whether the loadReport function is able to load a report
65+
*/
66+
export async function canLoadFile() {
67+
return (await useLocalReportFileMode()) || getQueryFileUrl() !== null
68+
}

report-viewer/report-viewer/src/views/FileUploadView.vue

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
/>
2828
</div>
2929
<h1 class="text-7xl">JPlag Report Viewer</h1>
30-
<div v-if="!hasQueryFile && !loadingFiles && !exampleFiles">
30+
<div v-if="!loadingFiles && !exampleFiles">
3131
<div
3232
class="border-accent-dark bg-accent/25 mx-auto mt-10 flex w-96 cursor-pointer flex-col justify-center rounded-md border px-5 py-5"
3333
@click="uploadFileThroughWindow()"
@@ -56,11 +56,10 @@
5656

5757
<script setup lang="ts">
5858
import { onErrorCaptured, ref, type Ref } from 'vue'
59-
import { useRoute } from 'vue-router'
6059
import { router } from '@/router'
6160
import VersionInfoComponent from '../components/VersionInfoComponent.vue'
6261
import { reportStore } from '@/stores/reportStore'
63-
import { REPORT_FILE_NAME, useLocalReportFileMode } from '@/stores/fileLoading'
62+
import { canLoadFile } from '@/stores/fileLoading'
6463
import { uiStore } from '@/stores/uiStore'
6564
import { ReportFileHandler } from '@jplag/parser'
6665
import { LoadingCircle } from '@jplag/ui-components/base'
@@ -69,7 +68,7 @@ reportStore().reset()
6968
7069
const exampleFiles = ref(import.meta.env.MODE == 'demo' || import.meta.env.MODE == 'dev-demo')
7170
72-
useLocalReportFileMode().then((value) => {
71+
canLoadFile().then((value) => {
7372
if (value) {
7473
navigateToOverview()
7574
}
@@ -81,22 +80,6 @@ const loadingFiles = ref(false)
8180
type fileMethod = 'query' | 'upload' | 'unknown'
8281
const errors: Ref<{ error: Error; source: fileMethod }[]> = ref([])
8382
84-
// Loads file passed in query param, if any.
85-
const queryParams = useRoute().query
86-
let queryFileURL: URL | null = null
87-
if (typeof queryParams.file === 'string' && queryParams.file !== '') {
88-
try {
89-
queryFileURL = new URL(queryParams.file)
90-
} catch (e) {
91-
registerError(e as Error, 'query')
92-
queryFileURL = null
93-
}
94-
}
95-
if (queryFileURL !== null) {
96-
loadQueryFile(queryFileURL)
97-
}
98-
const hasQueryFile = queryFileURL !== null
99-
10083
function navigateToOverview() {
10184
router.push({
10285
name: 'OverviewView'
@@ -164,21 +147,6 @@ async function uploadFileThroughWindow() {
164147
input.click()
165148
}
166149
167-
/**
168-
* Handles click on Continue with query file.
169-
*/
170-
async function loadQueryFile(url: URL) {
171-
try {
172-
const response = await fetch(url)
173-
if (!response.ok) {
174-
throw new Error('Response not OK')
175-
}
176-
await handleFile(await response.blob(), REPORT_FILE_NAME)
177-
} catch (e) {
178-
registerError(e as Error, 'query')
179-
}
180-
}
181-
182150
function registerError(error: Error, source: fileMethod) {
183151
loadingFiles.value = false
184152
errors.value.push({ error, source })

0 commit comments

Comments
 (0)