Skip to content

Commit 0f29a9c

Browse files
better date range display and add default form button
1 parent 577519a commit 0f29a9c

2 files changed

Lines changed: 60 additions & 24 deletions

File tree

frontend/src/components/user-stats/SearchForm.vue

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,57 @@
11
<template>
22
<div class="line">
3-
<DatePicker v-model="dateRange" selectionMode="range" :manualInput="false" showIcon fluid :showOnFocus="false" @update:modelValue="fetchUserStats" />
3+
<DatePicker
4+
v-model="dateRange"
5+
dateFormat="d M yy"
6+
selectionMode="range"
7+
:manualInput="false"
8+
showIcon
9+
fluid
10+
:showOnFocus="false"
11+
@update:modelValue="fetchUserStats"
12+
/>
413
<Select v-model="selectedIndexer" :options="selectableIndexers" filter optionLabel="name" placeholder="Select an indexer" @change="fetchUserStats" />
514
</div>
15+
<div class="wrapper-center">
16+
<MultiSelect
17+
v-model="selectedValues"
18+
:options="displayableValues"
19+
@update:modelValue="(val) => emit('selectedValuesUpdated', val)"
20+
filter
21+
display="chip"
22+
placeholder="Charts to display"
23+
/>
24+
</div>
25+
<div class="wrapper-center" style="margin-top: 5px">
26+
<Button label="Set as default" size="small" @click="setDefaultForm" />
27+
</div>
628
</template>
729
<script lang="ts" setup>
8-
import { getUserStats, type GetUserStatsQuery, type UserProfileVec } from '@/services/api/userStatsService'
9-
import { DatePicker, Select } from 'primevue'
30+
import { getUserStats, type GetUserStatsQuery, type UserProfileScrapedVec, type UserProfileVec } from '@/services/api/userStatsService'
31+
import { DatePicker, Select, MultiSelect, Button } from 'primevue'
1032
import { onMounted, ref } from 'vue'
11-
import { startOfWeek, endOfWeek } from 'date-fns'
33+
import { startOfMonth, endOfMonth } from 'date-fns'
1234
import { getIndexersEnriched, type IndexerEnriched } from '@/services/api/indexerService'
1335
import { showToast } from '@/main'
1436
1537
const emit = defineEmits<{
1638
gotResults: [UserProfileVec]
39+
selectedValuesUpdated: [(keyof UserProfileScrapedVec)[]]
1740
}>()
1841
42+
const displayableValues = ref<(keyof UserProfileScrapedVec)[]>([
43+
'downloaded',
44+
'uploaded',
45+
'bonus_points',
46+
'leeching',
47+
'seeding',
48+
'ratio',
49+
'uploaded_torrents',
50+
'snatched',
51+
'invited',
52+
'torrent_comments',
53+
])
54+
const selectedValues = ref<(typeof displayableValues.value)[number][]>(['uploaded', 'downloaded'])
1955
const loading = ref(false)
2056
const selectableIndexers = ref<IndexerEnriched[]>([])
2157
const selectedIndexer = ref<IndexerEnriched>()
@@ -28,7 +64,7 @@ const form = ref<GetUserStatsQuery>({
2864
2965
const setPresetRange = () => {
3066
const today = new Date()
31-
dateRange.value = [startOfWeek(today), endOfWeek(today)]
67+
dateRange.value = [startOfMonth(today), endOfMonth(today)]
3268
}
3369
const fetchUserStats = async () => {
3470
if (selectedIndexer.value) {
@@ -41,14 +77,30 @@ const fetchUserStats = async () => {
4177
.finally(() => (loading.value = false))
4278
}
4379
}
80+
const setDefaultForm = () => {
81+
localStorage.setItem('defaultSelectedValues', JSON.stringify(selectedValues.value))
82+
localStorage.setItem('defaultSelectedIndexer', JSON.stringify(selectedIndexer.value))
83+
showToast('', 'Indexer and displayed values set as default', 'success', 3000)
84+
}
4485
onMounted(async () => {
4586
const indexers = await getIndexersEnriched(true)
4687
if (indexers.length === 0) {
4788
showToast('', 'No indexer with data available. Set them up in the settings', 'warn', 4000)
4889
return
4990
}
5091
selectableIndexers.value = indexers
51-
selectedIndexer.value = selectableIndexers.value[0]
92+
// load default form if it exists
93+
const defaultSelectedValues = localStorage.getItem('defaultSelectedValues')
94+
if (defaultSelectedValues) {
95+
selectedValues.value = JSON.parse(defaultSelectedValues)
96+
emit('selectedValuesUpdated', selectedValues.value)
97+
}
98+
const defaultSelectedIndexer = localStorage.getItem('defaultSelectedIndexer')
99+
if (defaultSelectedIndexer) {
100+
selectedIndexer.value = JSON.parse(defaultSelectedIndexer)
101+
} else {
102+
selectedIndexer.value = selectableIndexers.value[0]
103+
}
52104
setPresetRange()
53105
await fetchUserStats()
54106
})

frontend/src/views/HomeView.vue

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
<template>
22
<main style="width: 100%">
3-
<SearchForm @gotResults="gotResults" />
4-
<div class="wrapper-center">
5-
<MultiSelect v-model="selectedValues" :options="displayableValues" filter display="chip" placeholder="Charts to display" />
6-
</div>
3+
<SearchForm @gotResults="gotResults" @selectedValuesUpdated="(val) => (selectedValues = val)" />
74
<IndexerStatsOverview v-if="userStats" :userStats :selectedValues style="margin-top: 40px" />
85
<IndexerStatsGraphs v-if="userStats" :userStats :selectedValues style="margin-top: 40px" />
96
</main>
@@ -12,24 +9,11 @@
129
import IndexerStatsGraphs from '@/components/user-stats/IndexerStatsGraphs.vue'
1310
import IndexerStatsOverview from '@/components/user-stats/IndexerStatsOverview.vue'
1411
import SearchForm from '@/components/user-stats/SearchForm.vue'
15-
import { MultiSelect } from 'primevue'
1612
import type { UserProfileScrapedVec, UserProfileVec } from '@/services/api/userStatsService'
1713
import { ref } from 'vue'
1814
1915
const userStats = ref<UserProfileVec>()
20-
const displayableValues = ref<(keyof UserProfileScrapedVec)[]>([
21-
'downloaded',
22-
'uploaded',
23-
'bonus_points',
24-
'leeching',
25-
'seeding',
26-
'ratio',
27-
'uploaded_torrents',
28-
'snatched',
29-
'invited',
30-
'torrent_comments',
31-
])
32-
const selectedValues = ref<(typeof displayableValues.value)[number][]>(['uploaded', 'downloaded'])
16+
const selectedValues = ref<(keyof UserProfileScrapedVec)[]>(['uploaded', 'downloaded'])
3317
3418
const gotResults = (stats: UserProfileVec) => {
3519
userStats.value = stats

0 commit comments

Comments
 (0)