From 7fe07c25a2cde7408ef55596af3f471348beb2e4 Mon Sep 17 00:00:00 2001 From: Maaike Date: Thu, 22 Aug 2024 17:01:33 +0200 Subject: [PATCH] Fix/data centric monitoring (#57) * fix: replace topic hierarchy with dataset identifier to align monitoring page with data-centric approach * feat: only show inspect button for BUFR files * fix: replace topic selectors with dataset ID selectors + return object 'metadata' containing both dataset ID and topic + style: improve look of station editor and other pages * fix: query API by metadata ID rather than data ID in monitoring page * build: lock Vuetify version to 3.7.0 to prevent breaking changes --- Dockerfile | 2 +- package-lock.json | 8 +- package.json | 4 +- src/components/CodeListSelector.vue | 8 +- src/components/CsvToBUFRForm.vue | 116 +++-- src/components/DatasetEditorForm.vue | 7 +- src/components/DatasetIdentifierSelector.vue | 150 +++++++ src/components/DownloadButton.vue | 2 - src/components/ImportOSCAR.vue | 397 ----------------- src/components/StationEditor.vue | 342 --------------- src/components/SynopForm.vue | 28 +- src/components/TopicHierarchySelector.vue | 125 ------ src/components/{ => monitoring}/BarChart.vue | 0 .../{ => monitoring}/MonitoringPage.vue | 41 +- .../NotificationDashboard.vue | 71 +-- .../{ => monitoring}/PublishedData.vue | 72 ++-- .../{ => monitoring}/StationMap.vue | 0 .../{ => monitoring}/StationStats.vue | 0 .../{ => monitoring}/SummaryStats.vue | 0 src/components/stations/ImportOSCAR.vue | 407 ++++++++++++++++++ src/components/stations/StationEditor.vue | 330 ++++++++++++++ .../{ => stations}/StationTable.vue | 5 +- src/components/stations/TopicSelector.vue | 138 ++++++ src/views/ImportOSCAR.vue | 2 +- src/views/MonitoringPage.vue | 2 +- src/views/StationEditor.vue | 2 +- src/views/StationTable.vue | 2 +- 27 files changed, 1214 insertions(+), 1047 deletions(-) create mode 100644 src/components/DatasetIdentifierSelector.vue delete mode 100644 src/components/ImportOSCAR.vue delete mode 100644 src/components/StationEditor.vue delete mode 100644 src/components/TopicHierarchySelector.vue rename src/components/{ => monitoring}/BarChart.vue (100%) rename src/components/{ => monitoring}/MonitoringPage.vue (81%) rename src/components/{ => monitoring}/NotificationDashboard.vue (84%) rename src/components/{ => monitoring}/PublishedData.vue (64%) rename src/components/{ => monitoring}/StationMap.vue (100%) rename src/components/{ => monitoring}/StationStats.vue (100%) rename src/components/{ => monitoring}/SummaryStats.vue (100%) create mode 100644 src/components/stations/ImportOSCAR.vue create mode 100644 src/components/stations/StationEditor.vue rename src/components/{ => stations}/StationTable.vue (96%) create mode 100644 src/components/stations/TopicSelector.vue diff --git a/Dockerfile b/Dockerfile index d43c7dc..f940aa0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ FROM node:lts-alpine WORKDIR /wis2box-webapp # copy both 'package.json' and 'package-lock.json' (if available) -COPY package*.json . +COPY package*.json ./ # install project dependencies RUN npm install diff --git a/package-lock.json b/package-lock.json index 3c1f97d..8a6a727 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "vue-router": "^4.0.0", "vue-tel-input": "^8.3.1", "vue3-apexcharts": "^1.4.4", - "vuetify": "^3.4.0", + "vuetify": "3.7.0", "webfontloader": "^1.0.0" }, "devDependencies": { @@ -3203,9 +3203,9 @@ } }, "node_modules/vuetify": { - "version": "3.6.10", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.6.10.tgz", - "integrity": "sha512-Myd9+EFq4Gmu61yKPNVS0QdGQkcZ9cHom27wuvRw7jgDxM+X4MT9BwQRk/Dt1q3G3JlK8oh+ZYyq5Ps/Z73cMg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.0.tgz", + "integrity": "sha512-x+UaU4SPYNcJSE/voCTBFrNn0q9Spzx2EMfDdUj0NYgHGKb59OqnZte+AjaJaoOXy1AHYIGEpm5Ryk2BEfgWuw==", "engines": { "node": "^12.20 || >=14.13" }, diff --git a/package.json b/package.json index 05060c0..b1e17d9 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "vue-router": "^4.0.0", "vue-tel-input": "^8.3.1", "vue3-apexcharts": "^1.4.4", - "vuetify": "^3.4.0", + "vuetify": "3.7.0", "webfontloader": "^1.0.0" }, "devDependencies": { @@ -43,6 +43,6 @@ "vite-plugin-vuetify": "^1.0.0" }, "overrides": { - "esbuild": "^0.21.0" + "esbuild": "^0.21.5" } } diff --git a/src/components/CodeListSelector.vue b/src/components/CodeListSelector.vue index 9b2470e..c039e59 100644 --- a/src/components/CodeListSelector.vue +++ b/src/components/CodeListSelector.vue @@ -21,6 +21,8 @@ clearable persistent-hint return-object + variant="outlined" + class="my-5" />
@@ -29,14 +31,14 @@ diff --git a/src/components/DatasetEditorForm.vue b/src/components/DatasetEditorForm.vue index a045351..f21ed40 100644 --- a/src/components/DatasetEditorForm.vue +++ b/src/components/DatasetEditorForm.vue @@ -82,7 +82,7 @@ @@ -390,7 +390,7 @@ @@ -855,7 +855,7 @@ export default defineComponent({ const message = ref("Select existing discovery metadata file or create a new file."); const submissionIssues = ref([]); // List of datasets to select from, if any - const items = ref([]); + const items = ref(['Loading...']); // Dialog for initial information when creating // a new dataset const showInitialDialog = ref(false); @@ -1073,7 +1073,6 @@ export default defineComponent({ // Get CSV response and parse it into an object const responseData = await response.text(); const parsed = Papa.parse(responseData, { header: true }); - console.log(parsed.data) // Filter out any empty data (the final row of the CSV) const filteredData = parsed.data.filter(item => item.Name && item.Description); // Map this data into the correct format for the v-select component diff --git a/src/components/DatasetIdentifierSelector.vue b/src/components/DatasetIdentifierSelector.vue new file mode 100644 index 0000000..20f000c --- /dev/null +++ b/src/components/DatasetIdentifierSelector.vue @@ -0,0 +1,150 @@ + + + diff --git a/src/components/DownloadButton.vue b/src/components/DownloadButton.vue index 589b96b..d65cdad 100644 --- a/src/components/DownloadButton.vue +++ b/src/components/DownloadButton.vue @@ -38,7 +38,6 @@ export default defineComponent({ // Create a temporary anchor element to initiate the download const link = document.createElement('a'); if( props.fileUrl != '' ) { - //console.log("Downloading file from URL: " + props.fileUrl) link.href = props.fileUrl; link.target = '_blank'; // Programmatically trigger the click event on the link to start the download @@ -47,7 +46,6 @@ export default defineComponent({ URL.revokeObjectURL(link.href); } else if( props.data != '' ) { - //console.log("Downloading file from data: " + props.data) // Decode the base64 encoded data const decodedData = atob(props.data); // Convert the decoded data to a Uint8Array diff --git a/src/components/ImportOSCAR.vue b/src/components/ImportOSCAR.vue deleted file mode 100644 index cec472f..0000000 --- a/src/components/ImportOSCAR.vue +++ /dev/null @@ -1,397 +0,0 @@ - - diff --git a/src/components/StationEditor.vue b/src/components/StationEditor.vue deleted file mode 100644 index 661ee9a..0000000 --- a/src/components/StationEditor.vue +++ /dev/null @@ -1,342 +0,0 @@ - - - diff --git a/src/components/SynopForm.vue b/src/components/SynopForm.vue index 7d554a2..019d54d 100644 --- a/src/components/SynopForm.vue +++ b/src/components/SynopForm.vue @@ -41,19 +41,22 @@ - + - + + + @@ -211,8 +214,8 @@ diff --git a/src/components/BarChart.vue b/src/components/monitoring/BarChart.vue similarity index 100% rename from src/components/BarChart.vue rename to src/components/monitoring/BarChart.vue diff --git a/src/components/MonitoringPage.vue b/src/components/monitoring/MonitoringPage.vue similarity index 81% rename from src/components/MonitoringPage.vue rename to src/components/monitoring/MonitoringPage.vue index 0648ffd..f1588a1 100644 --- a/src/components/MonitoringPage.vue +++ b/src/components/monitoring/MonitoringPage.vue @@ -4,14 +4,14 @@ WIS2 Notifications Monitoring Dashboard - - + + - + - + @@ -52,7 +52,7 @@ - @@ -64,20 +64,20 @@ import { defineComponent, ref, computed } from 'vue'; import { VCardTitle } from 'vuetify/lib/components/index.mjs'; import VueDatePicker from '@vuepic/vue-datepicker'; import '@vuepic/vue-datepicker/dist/main.css'; -import TopicHierarchySelector from './TopicHierarchySelector.vue'; -import NotificationDashboard from '@/components/NotificationDashboard.vue'; +import DatasetIdentifierSelector from '@/components/DatasetIdentifierSelector.vue'; +import NotificationDashboard from '@/components/monitoring/NotificationDashboard.vue'; export default defineComponent({ name: 'MonitoringPage', components: { VCardTitle, VueDatePicker, - TopicHierarchySelector, + DatasetIdentifierSelector, NotificationDashboard }, setup() { // Static variables - + const testMode = import.meta.env.VITE_TEST_MODE === "true" || import.meta.env.VITE_API_URL == undefined; const now = new Date(); const twentyFourHoursAgo = new Date(now.getTime() - 86400000); @@ -89,8 +89,8 @@ export default defineComponent({ // Topic selected by the user, used to get the topic hierarchy // from the topics array - const selectedTopicTemp = ref(null); - const selectedTopic = ref(null); + const selectedDatasetTemp = ref(null); + const selectedDataset = ref(null); // Date range for notifications, defaults to [24 hours from now, now] const selectedDateRangeTemp = ref([twentyFourHoursAgo, now]); const selectedStartDate = ref(twentyFourHoursAgo); @@ -104,15 +104,15 @@ export default defineComponent({ const selectedLimitTemp = ref(100); const selectedLimit = ref(100); // Boolean to show the notification dashboard - const showDashboard = ref(false); // Key to make sure dashboard always updates when the update button is pressed + const showDashboard = ref(false); const dashboardKey = ref(0); // Computed // Boolean for whether the monitor button is disabled or not const updateDisabled = computed(() => { - return !selectedTopicTemp.value || !selectedDateRangeTemp.value || (selectedDateRangeTemp.value.length !== 2) + return !selectedDatasetTemp.value || !selectedDateRangeTemp.value || (selectedDateRangeTemp.value.length !== 2) }) // Methods @@ -121,7 +121,7 @@ export default defineComponent({ // user clicks on the monitor button const handleUpdate = () => { // Update props - selectedTopic.value = selectedTopicTemp.value; + selectedDataset.value = selectedDatasetTemp.value; selectedStartDate.value = new Date(selectedDateRangeTemp.value[0]); selectedEndDate.value = new Date(selectedDateRangeTemp.value[1]); searchedWsi.value = searchedWsiTemp.value; @@ -130,14 +130,17 @@ export default defineComponent({ dashboardKey.value++ // Display dashboard showDashboard.value = true; - // Log - console.log('Sent start time:', selectedStartDate.value.toISOString()) - console.log('Sent end time:', selectedEndDate.value.toISOString()) + // Log in test mode + if (testMode) { + console.log('TEST_MODE is enabled') + console.log('Sent start time:', selectedStartDate.value.toISOString()) + console.log('Sent end time:', selectedEndDate.value.toISOString()) + } } return { - selectedTopicTemp, - selectedTopic, + selectedDatasetTemp, + selectedDataset, selectedDateRangeTemp, selectedStartDate, selectedEndDate, diff --git a/src/components/NotificationDashboard.vue b/src/components/monitoring/NotificationDashboard.vue similarity index 84% rename from src/components/NotificationDashboard.vue rename to src/components/monitoring/NotificationDashboard.vue index 2ce3f06..f47eaf9 100644 --- a/src/components/NotificationDashboard.vue +++ b/src/components/monitoring/NotificationDashboard.vue @@ -59,16 +59,16 @@ diff --git a/src/components/stations/StationEditor.vue b/src/components/stations/StationEditor.vue new file mode 100644 index 0000000..26eae89 --- /dev/null +++ b/src/components/stations/StationEditor.vue @@ -0,0 +1,330 @@ + + diff --git a/src/components/StationTable.vue b/src/components/stations/StationTable.vue similarity index 96% rename from src/components/StationTable.vue rename to src/components/stations/StationTable.vue index 93c71ee..a9cd4da 100644 --- a/src/components/StationTable.vue +++ b/src/components/stations/StationTable.vue @@ -5,7 +5,7 @@ Stations - + diff --git a/src/views/MonitoringPage.vue b/src/views/MonitoringPage.vue index 267d638..ed3e67f 100644 --- a/src/views/MonitoringPage.vue +++ b/src/views/MonitoringPage.vue @@ -3,5 +3,5 @@ \ No newline at end of file diff --git a/src/views/StationEditor.vue b/src/views/StationEditor.vue index 8c7c0a7..4f447dc 100644 --- a/src/views/StationEditor.vue +++ b/src/views/StationEditor.vue @@ -3,5 +3,5 @@ diff --git a/src/views/StationTable.vue b/src/views/StationTable.vue index dff89ae..439d010 100644 --- a/src/views/StationTable.vue +++ b/src/views/StationTable.vue @@ -3,5 +3,5 @@