Skip to content

Commit 268ce04

Browse files
Merge pull request #102 from hydroserver2/165-visualization-testing
165 visualization testing
2 parents 8652334 + e5b6915 commit 268ce04

19 files changed

+526
-405
lines changed

cypress/e2e/base/navbar.cy.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/components/VisualizeData/DataVisPopupPlot.vue renamed to src/components/Datastream/DatastreamPopupPlot.vue

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,7 @@
2525
color="grey"
2626
:to="{
2727
name: 'VisualizeData',
28-
query: {
29-
sites: datastream.thingId,
30-
datastreams: datastream.id,
31-
beginDate: beginTime,
32-
endDate: endTime,
33-
},
28+
query: getDatastreamQueryParams(datastream),
3429
}"
3530
>
3631
Visualization Page
@@ -43,11 +38,13 @@
4338
import { Datastream, GraphSeries } from '@/types'
4439
import { subtractHours } from '@/utils/observationsUtils'
4540
import { createEChartsOption } from '@/utils/plotting/echarts'
46-
import { fetchGraphSeries } from '@/utils/plotting/graphSeriesUtils'
4741
import { EChartsOption } from 'echarts'
4842
import { onMounted, ref } from 'vue'
4943
import VChart from 'vue-echarts'
5044
import 'echarts'
45+
import { useObservationStore } from '@/store/observations'
46+
47+
const { fetchGraphSeries } = useObservationStore()
5148
5249
const props = defineProps({
5350
datastream: {
@@ -71,6 +68,31 @@ const timeSelections = [
7168
{ label: 'Last Year', value: 8760 },
7269
]
7370
71+
type Query = {
72+
sites: string
73+
datastreams: string
74+
selectedDateBtnId?: number
75+
beginDate?: string
76+
endDate?: string
77+
}
78+
79+
const getDatastreamQueryParams = (datastream: Datastream) => {
80+
let query: Query = {
81+
sites: datastream.thingId,
82+
datastreams: datastream.id,
83+
}
84+
85+
if (selectedTime.value === 8760) query.selectedDateBtnId = 0
86+
else if (selectedTime.value === 720) query.selectedDateBtnId = 1
87+
else if (selectedTime.value === 168) query.selectedDateBtnId = 2
88+
else {
89+
query.beginDate = beginTime.value
90+
query.endDate = endTime.value
91+
}
92+
93+
return query
94+
}
95+
7496
const updateState = async (hours?: number) => {
7597
updating.value = true
7698
selectedTime.value = hours || 72

src/components/Datastream/DatastreamTable.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
</div>
6262
<div v-else>
6363
<v-dialog v-model="item.chartOpen" width="80rem">
64-
<DataVisPopupPlot
64+
<DatastreamPopupPlot
6565
:datastream="item"
6666
@close="item.chartOpen = false"
6767
/>
@@ -102,7 +102,7 @@
102102
</template>
103103

104104
<script setup lang="ts">
105-
import DataVisPopupPlot from '@/components/VisualizeData/DataVisPopupPlot.vue'
105+
import DatastreamPopupPlot from '@/components/Datastream/DatastreamPopupPlot.vue'
106106
import DatastreamTableActions from '@/components/Datastream/DatastreamTableActions.vue'
107107
import Sparkline from '@/components/Sparkline.vue'
108108
import { computed, onMounted, ref } from 'vue'

src/components/Datastream/DatastreamTableActions.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
<v-list-item
7878
v-if="datastream.isDataVisible"
7979
prepend-icon="mdi-chart-line"
80-
title="View Time Series Plot"
80+
title="Visualize Data"
8181
:to="{
8282
name: 'VisualizeData',
8383
query: { sites: thingId, datastreams: datastream.id },

src/components/VisualizeData/DataVisDatasetsTable.vue

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<v-row class="my-2" align="center">
33
<v-col>
4-
<h5 class="text-h5">Datasets</h5>
4+
<h5 class="text-h5">Datastreams</h5>
55
</v-col>
66

77
<v-col cols="12" sm="auto">
@@ -18,7 +18,7 @@
1818
<v-select
1919
label="Show/Hide Columns"
2020
v-model="selectedHeaders"
21-
:items="headers"
21+
:items="selectableHeaders"
2222
item-text="title"
2323
item-value="key"
2424
multiple
@@ -50,21 +50,23 @@
5050
<v-btn @click="clearSelected"> Clear Selected </v-btn>
5151

5252
<v-btn variant="outlined" @click="showOnlySelected = !showOnlySelected">
53-
Showing: {{ showOnlySelected ? 'Selected' : 'All' }}
53+
{{ showOnlySelected ? 'Show All' : 'Show Selected' }}
5454
</v-btn>
5555

5656
<v-btn
57+
:loading="downloading"
5758
prepend-icon="mdi-download"
58-
@click="downloadSelectedDatastreamsCSVs(selectedDatastreams)"
59+
@click="downloadSelected(selectedDatastreams)"
5960
>Download Selected</v-btn
6061
>
6162
</v-toolbar>
6263
<v-data-table-virtual
6364
:headers="headers.filter((header) => header.visible)"
6465
:items="tableItems"
6566
:sort-by="sortBy"
67+
multi-sort
6668
:search="search"
67-
height="400"
69+
:style="{ 'max-height': `${tableHeight}vh` }"
6870
fixed-header
6971
class="elevation-2"
7072
color="green"
@@ -105,18 +107,30 @@ const {
105107
selectedDatastreams,
106108
observedProperties,
107109
processingLevels,
110+
tableHeight,
108111
} = storeToRefs(useDataVisStore())
109112
110113
const emit = defineEmits(['copyState'])
111114
112115
const showOnlySelected = ref(false)
113116
const openInfoCard = ref(false)
117+
const downloading = ref(false)
114118
const selectedDatastream = ref<Datastream | null>(null)
115119
116120
const copyStateToClipboard = async () => {
117121
emit('copyState')
118122
}
119123
124+
const downloadSelected = async (selectedDatastreams: Datastream[]) => {
125+
downloading.value = true
126+
try {
127+
await downloadSelectedDatastreamsCSVs(selectedDatastreams)
128+
} catch (error) {
129+
console.error('Error downloading selected datastreams', error)
130+
}
131+
downloading.value = false
132+
}
133+
120134
const onRowClick = (event: Event, item: any) => {
121135
// If the click came from a checkbox, do nothing.
122136
let targetElement = event.target as HTMLElement
@@ -201,7 +215,15 @@ const headers = reactive([
201215
},
202216
])
203217
204-
const sortBy = [{ key: 'siteCodeName' }]
218+
const selectableHeaders = computed(() => {
219+
return headers.filter((header) => header.key !== 'plot')
220+
})
221+
222+
const sortBy = [
223+
{ key: 'siteCodeName' },
224+
{ key: 'observedPropertyName' },
225+
{ key: 'qualityControlLevelDefinition' },
226+
]
205227
const selectedHeaders = computed({
206228
get: () =>
207229
headers.filter((header) => header.visible).map((header) => header.key),

src/components/VisualizeData/DataVisFiltersDrawer.vue

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<v-expansion-panel title="Sites">
1818
<v-expansion-panel-text>
1919
<v-text-field
20+
class="pb-1"
2021
clearable
2122
@click:clear="searchThing = ''"
2223
v-model="searchThing"
@@ -47,6 +48,7 @@
4748
<v-expansion-panel title="Observed Properties">
4849
<v-expansion-panel-text>
4950
<v-text-field
51+
class="pb-1"
5052
clearable
5153
@click:clear="searchObservedProperty = ''"
5254
v-model="searchObservedProperty"
@@ -76,6 +78,7 @@
7678
<v-expansion-panel title="Processing Levels">
7779
<v-expansion-panel-text>
7880
<v-text-field
81+
class="pb-1"
7982
clearable
8083
@click:clear="searchProcessingLevel = ''"
8184
v-model="searchProcessingLevel"
@@ -222,6 +225,13 @@ const clearFilters = () => {
222225
}
223226
224227
const { smAndDown } = useDisplay()
225-
const panels = ref([0, 1, 2, 3])
228+
const panels = ref([0, 1, 2])
226229
const drawer = ref(!!smAndDown)
227230
</script>
231+
232+
<style scoped>
233+
::v-deep .v-selection-control,
234+
::v-deep .v-label {
235+
align-items: start;
236+
}
237+
</style>

src/components/VisualizeData/DataVisTimeFilters.vue

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
:color="
88
selectedDateBtnId === option.id ? 'blue' : 'blue-grey-lighten-4'
99
"
10-
@click="setDateRange(option.id)"
10+
@click="onDateBtnClick(option.id)"
1111
>
1212
{{ option.label }}
1313
</v-btn>
@@ -17,14 +17,14 @@
1717
<DatePickerField
1818
:model-value="beginDate"
1919
placeholder="Begin Date"
20-
@update:model-value="handleCustomDateSelection('begin', $event)"
20+
@update:model-value="setDateRange({ begin: $event })"
2121
/>
2222
</v-col>
2323
<v-col cols="6" sm="3">
2424
<DatePickerField
2525
:model-value="endDate"
2626
placeholder="End Date"
27-
@update:model-value="handleCustomDateSelection('end', $event)"
27+
@update:model-value="setDateRange({ end: $event })"
2828
/>
2929
</v-col>
3030
</v-row>
@@ -35,15 +35,9 @@ import DatePickerField from '@/components/VisualizeData/DatePickerField.vue'
3535
import { useDataVisStore } from '@/store/dataVisualization'
3636
import { storeToRefs } from 'pinia'
3737
38-
const { setDateRange } = useDataVisStore()
38+
const { setDateRange, onDateBtnClick } = useDataVisStore()
3939
4040
const { dateOptions, beginDate, endDate, selectedDateBtnId } = storeToRefs(
4141
useDataVisStore()
4242
)
43-
44-
const handleCustomDateSelection = (type: 'begin' | 'end', date: Date) => {
45-
if (type === 'begin') beginDate.value = date
46-
else endDate.value = date
47-
selectedDateBtnId.value = -1
48-
}
4943
</script>

0 commit comments

Comments
 (0)