filter for character list

This commit is contained in:
iamBadgers
2024-05-18 19:03:13 -07:00
parent 8809a94160
commit f2d32fe72e
4 changed files with 38 additions and 6 deletions

View File

@@ -20,14 +20,21 @@ app.get('/api/character/:characterId', async (req, res) => {
app.post('/api/character', jsonParser, async (req, res) => { app.post('/api/character', jsonParser, async (req, res) => {
const page = req.body.page const page = req.body.page
const orderBy = req.body.orderBy const orderBy = req.body.orderBy ? obp.parse(req.body.orderBy) : ['id']
const count = req.body.count const count = req.body.count
const filter = req.body.filter ? fp.parse(req.body.filter) : {}
const characterData = await Character.findAll({ const characterData = await Character.findAll({
offset: page * count, offset: page * count,
limit: count limit: count,
order: orderBy,
where: filter
}) })
const pageCount = Math.ceil((await Character.count()) / count) const pageCount = Math.ceil(
(await Character.count({
where: filter
})) / count
)
res.setHeader('Content-Type', 'application/json') res.setHeader('Content-Type', 'application/json')
res.json({ characterData, pageCount }) res.json({ characterData, pageCount })

View File

@@ -2,6 +2,7 @@
<v-app> <v-app>
<v-main> <v-main>
<v-app-bar> <v-app-bar>
<v-btn to="/serverstats">Server Stats</v-btn>
<v-btn to="/games">Games</v-btn> <v-btn to="/games">Games</v-btn>
<v-btn to="/characters">Characters</v-btn> <v-btn to="/characters">Characters</v-btn>
<v-btn to="/gms">GMs</v-btn> <v-btn to="/gms">GMs</v-btn>

View File

@@ -1,4 +1,11 @@
<template> <template>
<div class="d-flex flex-row">
<v-text-field
class="filter flex-1-0"
placeholder="Filter by Name"
v-model="filtervalue"
></v-text-field>
</div>
<v-table> <v-table>
<thead> <thead>
<tr> <tr>
@@ -48,11 +55,14 @@ const page = ref(1)
let count = 10 let count = 10
const filtervalue = ref('')
async function loadData() { async function loadData() {
const response = await axios.post('/api/character', { const response = await axios.post('/api/character', {
page: `${page.value - 1}`, page: `${page.value - 1}`,
count: `10`, count: `10`,
orderBy: 'id' orderBy: 'id',
filter: filtervalue.value ? `characterName:"${filtervalue.value}"` : ''
}) })
characters.value = response.data.characterData characters.value = response.data.characterData
@@ -74,6 +84,14 @@ watch(route, (newValue, oldValue) => {
loadData() loadData()
}) })
let debounce = null
watch(filtervalue, (oldFilter, newFilter) => {
debounce = clearTimeout(debounce)
debounce = setTimeout(() => {
loadData()
}, 500)
})
onMounted(async () => { onMounted(async () => {
if (!route.query.page) { if (!route.query.page) {
router.replace({ query: { page: 1 } }) router.replace({ query: { page: 1 } })

View File

@@ -43,7 +43,7 @@ async function loadData() {
const response = await axios.post('/api/game', { const response = await axios.post('/api/game', {
page: `${page.value - 1}`, page: `${page.value - 1}`,
count: `${count}`, count: `${count}`,
filter: filtervalue.value ? `title:${filtervalue.value}` : '', filter: filtervalue.value ? `title:"${filtervalue.value}"` : '',
orderBy: 'id' orderBy: 'id'
}) })
@@ -74,6 +74,12 @@ watch(filtervalue, (oldFilter, newFilter) => {
}) })
onMounted(async () => { onMounted(async () => {
if (!route.query.page) {
router.replace({ query: { page: 1 } })
page.value = 1
} else {
page.value = Number(route.query.page)
}
loadData() loadData()
}) })
</script> </script>