update the character list to keep sort and filters in the query params.

This commit is contained in:
iamBadgers
2024-09-02 17:00:42 -07:00
parent cae3f48063
commit 903117696e
2 changed files with 64 additions and 33 deletions

View File

@@ -3,15 +3,16 @@
<v-text-field <v-text-field
class="filter flex-1-0" class="filter flex-1-0"
placeholder="Filter by Name" placeholder="Filter by Name"
v-model="filtervalue" v-model="filterValue"
></v-text-field> ></v-text-field>
</div> </div>
<v-data-table-server <v-data-table-server
:headers="headers" :headers="headers"
v-model:items-per-page="resultePerPage"
:items="characters" :items="characters"
:items-length="count" :items-length="count"
v-model:page="page" v-model:items-per-page="resultePerPage"
v-model:page="pageValue"
v-model:sort-by="sortValue"
@update:options="loadData" @update:options="loadData"
> >
<template v-slot:item.id="{ item }"> <template v-slot:item.id="{ item }">
@@ -26,9 +27,8 @@
<template #bottom></template> <template #bottom></template>
</v-data-table-server> </v-data-table-server>
<v-pagination <v-pagination
:model-value="page" v-model:model-value="pageValue"
:length="pageCount" :length="pageCount"
@update:modelValue="setPage($event)"
></v-pagination> ></v-pagination>
</template> </template>
@@ -36,7 +36,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { Character } from '../types' import { Character } from '../types'
import { onMounted, ref, watch } from 'vue' import { onBeforeMount, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { VDataTable } from 'vuetify/components' import { VDataTable } from 'vuetify/components'
import axios from 'axios' import axios from 'axios'
@@ -57,18 +57,17 @@ const router = useRouter()
const characters = ref<Character[]>([]) const characters = ref<Character[]>([])
const pageCount = ref(1) const pageCount = ref(1)
const page = ref(1)
const resultePerPage = ref(10) const resultePerPage = ref(10)
const count = ref(10) const count = ref(10)
const filtervalue = ref('') const pageValue = ref(1)
const filterValue = ref('')
const sortValue = ref([])
async function loadData({ page, itemsPerPage, sortBy }: any) { async function loadData({ page, itemsPerPage, sortBy }: any) {
let sortString = 'id' let sortString = 'id asc'
if (sortBy[0]) { if (sortBy[0]) {
console.log(sortBy[0].key)
console.log(sortBy[0].order)
sortString = `${sortBy[0].key} ${sortBy[0].order}` sortString = `${sortBy[0].key} ${sortBy[0].order}`
} }
@@ -76,47 +75,82 @@ async function loadData({ page, itemsPerPage, sortBy }: any) {
page: `${page - 1}`, page: `${page - 1}`,
count: `${itemsPerPage}`, count: `${itemsPerPage}`,
orderBy: sortString, orderBy: sortString,
filter: filtervalue.value ? `characterName:"${filtervalue.value}"` : '' filter: filterValue.value ? `characterName:"${filterValue.value}"` : ''
}) })
characters.value = response.data.characterData characters.value = response.data.characterData
pageCount.value = response.data.pageCount pageCount.value = response.data.pageCount
count.value = response.data.totalCount count.value = response.data.totalCount
router.replace({
query: {
page: pageValue.value,
sort: sortString === 'id asc' ? '' : sortString,
filter: filterValue.value
}
})
} }
function setPage(targetPage: number) { async function reloadData() {
router.replace({ query: { page: targetPage, filter: route.query.filter } }) loadData({
page: pageValue.value,
itemsPerPage: 10,
sortBy: sortValue.value
})
} }
watch(route, (newValue, oldValue) => { watch(route, (newRoute, oldRoute) => {
if (!route.query.page) { if (newRoute.query.page) {
router.replace({ query: { page: 1, filter: route.query.filter } }) pageValue.value = Number(newRoute.query.page)
page.value = 1 }
} else {
page.value = Number(route.query.page) if (newRoute.query.sort) {
sortValue.value = [
{
key: newRoute.query.sort.split(' ')[0],
order: newRoute.query.sort.split(' ')[1]
}
]
}
if (newRoute.query.filter) {
filterValue.value = newRoute.query.filter.toString()
} }
page.value = Number(route.query.page)
loadData({ page: page.value, itemsPerPage: resultePerPage.value, sortBy: [] })
}) })
let debounce: ReturnType<typeof setTimeout> let debounce: ReturnType<typeof setTimeout>
watch(filtervalue, (newFilter: string, oldFilter: string) => { watch(filterValue, (newFilter: string, oldFilter: string) => {
clearTimeout(debounce) clearTimeout(debounce)
debounce = setTimeout(() => { debounce = setTimeout(() => {
router.replace({ query: { page: route.query.page, filter: newFilter } }) router.replace({ query: { page: route.query.page, filter: newFilter } })
}, 500) }, 500)
loadData({ page: page.value, itemsPerPage: resultePerPage.value, sortBy: [] }) loadData({ page: pageValue.value, itemsPerPage: resultePerPage.value, sortBy: [] })
}) })
onMounted(async () => { onBeforeMount(async () => {
// Initialize Filter
if (!route.query.page) { if (!route.query.page) {
router.replace({ query: { page: 1 } }) pageValue.value = 1
page.value = 1
} else { } else {
page.value = Number(route.query.page) pageValue.value = Number(route.query.page)
count.value = route.query.page * 10
} }
// Initialize Sort
if (!route.query.sort) {
sortValue.value = []
} else {
sortValue.value = [
{
key: route.query.sort.split(' ')[0],
order: route.query.sort.split(' ')[1]
}
]
}
// Initialize Filter
if (route.query.filter) { if (route.query.filter) {
filtervalue.value = route.query.filter.toString() filterValue.value = route.query.filter.toString()
} }
}) })
</script> </script>

View File

@@ -85,10 +85,7 @@ async function loadData({ page, itemsPerPage, sortBy }: any) {
games.value = response.data.gameData games.value = response.data.gameData
pageCount.value = response.data.pageCount pageCount.value = response.data.pageCount
count.value = response.data.totalCount count.value = response.data.totalCount
console.log('asdf')
console.log(page)
console.log(itemsPerPage)
console.log(sortBy)
router.replace({ router.replace({
query: { query: {
page: pageValue.value, page: pageValue.value,