diff --git a/report-viewer/src/App.vue b/report-viewer/src/App.vue index a76889ad25..58b62b9de5 100644 --- a/report-viewer/src/App.vue +++ b/report-viewer/src/App.vue @@ -14,6 +14,15 @@ :icon="store().uiState.useDarkMode ? ['fas', 'sun'] : ['fas', 'moon']" /> + + You are using an outdated version of the JPlag Report Viewer ({{ + reportViewerVersion.toString() + }}).
+ Version {{ newestVersion.toString() }} is available on + GitHub. +
@@ -25,7 +34,47 @@ import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' import { library } from '@fortawesome/fontawesome-svg-core' import { faMoon, faSun } from '@fortawesome/free-solid-svg-icons' import { store } from './stores/store' +import ToastComponent from './components/ToastComponent.vue' +import { Version, reportViewerVersion } from './model/Version' +import { computed, ref } from 'vue' library.add(faMoon) library.add(faSun) + +const newestVersion = ref(new Version(-1, -1, -1)) +const isDemo = import.meta.env.MODE == 'demo' +const hasShownToast = ref(sessionStorage.getItem('hasShownToast') == 'true') + +const showToast = computed(() => { + const value = + !isDemo && + !newestVersion.value.isInvalid() && + !reportViewerVersion.isDevVersion() && + newestVersion.value.compareTo(reportViewerVersion) > 0 && + !hasShownToast.value + + if (value) { + sessionStorage.setItem('hasShownToast', 'true') + } else { + sessionStorage.removeItem('hasShownToast') + } + + return value +}) + +fetch('https://api.github.com/repos/jplag/JPlag/releases/latest') + .then((response) => response.json()) + .then((data) => { + const versionString = data.tag_name + // remove the 'v' from the version string and split it into an array + const versionArray = versionString.substring(1).split('.') + newestVersion.value = new Version( + parseInt(versionArray[0]), + parseInt(versionArray[1]), + parseInt(versionArray[2]) + ) + }) + .catch(() => { + newestVersion.value = new Version(-1, -1, -1) + }) diff --git a/report-viewer/src/components/RepositoryReference.vue b/report-viewer/src/components/RepositoryReference.vue deleted file mode 100644 index c05d85bd21..0000000000 --- a/report-viewer/src/components/RepositoryReference.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/report-viewer/src/components/ToastComponent.vue b/report-viewer/src/components/ToastComponent.vue new file mode 100644 index 0000000000..d2ff857801 --- /dev/null +++ b/report-viewer/src/components/ToastComponent.vue @@ -0,0 +1,45 @@ + + + diff --git a/report-viewer/src/components/VersionInfoComponent.vue b/report-viewer/src/components/VersionInfoComponent.vue index 4463cc94b4..bc6d6b9e0a 100644 --- a/report-viewer/src/components/VersionInfoComponent.vue +++ b/report-viewer/src/components/VersionInfoComponent.vue @@ -7,17 +7,7 @@
-
- You are using an outdated version of the JPlag Report Viewer ({{ - reportViewerVersion.toString() - }}).
- Version {{ newestVersion.toString() }} is available on - GitHub. -
- -
JPlag v{{ reportViewerVersion.toString() }}
+ JPlag v{{ reportViewerVersion.toString() }}
The minimal version of JPlag that is supported by the viewer is v{{ @@ -32,31 +22,13 @@
Demo of JPlag v{{ reportViewerVersion.toString() }}
Displays the result of JPlag on the Progpedia dataset.
- +
diff --git a/report-viewer/src/components/VersionRepositoryReference.vue b/report-viewer/src/components/VersionRepositoryReference.vue new file mode 100644 index 0000000000..11f504c072 --- /dev/null +++ b/report-viewer/src/components/VersionRepositoryReference.vue @@ -0,0 +1,40 @@ + + + diff --git a/report-viewer/src/version.json b/report-viewer/src/version.json index 9134088500..d03da50710 100644 --- a/report-viewer/src/version.json +++ b/report-viewer/src/version.json @@ -1,6 +1,6 @@ { "report_viewer_version": { - "major": 0, + "major": 5, "minor": 0, "patch": 0 }, diff --git a/report-viewer/src/viewWrapper/ClusterViewWrapper.vue b/report-viewer/src/viewWrapper/ClusterViewWrapper.vue index 234569c676..51876a6f08 100644 --- a/report-viewer/src/viewWrapper/ClusterViewWrapper.vue +++ b/report-viewer/src/viewWrapper/ClusterViewWrapper.vue @@ -8,7 +8,7 @@ - + @@ -19,7 +19,7 @@ import ClusterView from '@/views/ClusterView.vue' import LoadingCircle from '@/components/LoadingCircle.vue' import type { Overview } from '@/model/Overview' import { redirectOnError } from '@/router' -import RepositoryReference from '@/components/RepositoryReference.vue' +import VersionRepositoryReference from '@/components/VersionRepositoryReference.vue' const props = defineProps({ clusterIndex: { diff --git a/report-viewer/src/viewWrapper/ComparisonViewWrapper.vue b/report-viewer/src/viewWrapper/ComparisonViewWrapper.vue index 6fd64f83b0..47f04aac03 100644 --- a/report-viewer/src/viewWrapper/ComparisonViewWrapper.vue +++ b/report-viewer/src/viewWrapper/ComparisonViewWrapper.vue @@ -14,7 +14,7 @@ - + @@ -27,7 +27,7 @@ import { ComparisonFactory } from '@/model/factories/ComparisonFactory' import LoadingCircle from '@/components/LoadingCircle.vue' import { redirectOnError } from '@/router' import type { Language } from '@/model/Language' -import RepositoryReference from '@/components/RepositoryReference.vue' +import VersionRepositoryReference from '@/components/VersionRepositoryReference.vue' import type { BaseCodeMatch } from '@/model/BaseCodeReport' import { BaseCodeReportFactory } from '@/model/factories/BaseCodeReportFactory' diff --git a/report-viewer/src/viewWrapper/InformationViewWrapper.vue b/report-viewer/src/viewWrapper/InformationViewWrapper.vue index 56d6e79529..fc9e16ef05 100644 --- a/report-viewer/src/viewWrapper/InformationViewWrapper.vue +++ b/report-viewer/src/viewWrapper/InformationViewWrapper.vue @@ -8,7 +8,7 @@ - + @@ -21,7 +21,7 @@ import LoadingCircle from '@/components/LoadingCircle.vue' import { redirectOnError } from '@/router' import { OptionsFactory } from '@/model/factories/OptionsFactory' import type { CliOptions } from '@/model/CliOptions' -import RepositoryReference from '@/components/RepositoryReference.vue' +import VersionRepositoryReference from '@/components/VersionRepositoryReference.vue' const overview: Ref = ref(null) const cliOptions: Ref = ref(undefined) diff --git a/report-viewer/src/viewWrapper/OverviewViewWrapper.vue b/report-viewer/src/viewWrapper/OverviewViewWrapper.vue index 13c0008439..e73d074db5 100644 --- a/report-viewer/src/viewWrapper/OverviewViewWrapper.vue +++ b/report-viewer/src/viewWrapper/OverviewViewWrapper.vue @@ -8,7 +8,7 @@ - + @@ -19,7 +19,7 @@ import OverviewView from '@/views/OverviewView.vue' import type { Overview } from '@/model/Overview' import LoadingCircle from '@/components/LoadingCircle.vue' import { redirectOnError } from '@/router' -import RepositoryReference from '@/components/RepositoryReference.vue' +import VersionRepositoryReference from '@/components/VersionRepositoryReference.vue' const overview: Ref = ref(null) diff --git a/report-viewer/tests/unit/components/VersionInfoComponent.test.ts b/report-viewer/tests/unit/components/VersionInfoComponent.test.ts index 6cbb9966bc..a706ffafe0 100644 --- a/report-viewer/tests/unit/components/VersionInfoComponent.test.ts +++ b/report-viewer/tests/unit/components/VersionInfoComponent.test.ts @@ -19,20 +19,6 @@ describe('VersionInfoComponent', () => { ) }) - it('Render outdated version', async () => { - vi.spyOn(versionTsFile, 'reportViewerVersion', 'get').mockReturnValue(mockVersionJSON(4, 3, 0)) - vi.spyOn(versionTsFile, 'minimalReportVersion', 'get').mockReturnValue(mockVersionJSON(4, 0, 0)) - global.fetch = vi.fn().mockResolvedValueOnce(mockVersionResponse('v4.4.0')) - - const wrapper = mount(VersionInfoComponent) - await flushPromises() - - expect(wrapper.text()).toContain('outdated version') - expect(wrapper.text()).toContain( - 'The minimal version of JPlag that is supported by the viewer is v4.0.0.' - ) - }) - it('Render latest version', async () => { vi.spyOn(versionTsFile, 'reportViewerVersion', 'get').mockReturnValue(mockVersionJSON(4, 3, 0)) vi.spyOn(versionTsFile, 'minimalReportVersion', 'get').mockReturnValue(mockVersionJSON(4, 0, 0))