update the character list to keep sort and filters in the query params.
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user