add query arguments for filters
This commit is contained in:
@@ -82,16 +82,13 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
players: {
|
|
||||||
handler (newval: { [key: string]: Player }): void {
|
|
||||||
if (!newval) return
|
|
||||||
this.sortingData.direction *= -1
|
|
||||||
},
|
|
||||||
immediate: true
|
|
||||||
},
|
|
||||||
playerHighlighted (newval) {
|
playerHighlighted (newval) {
|
||||||
|
console.log('newVal')
|
||||||
const newElement = this.$refs['player:' + newval] as HTMLElement[]
|
const newElement = this.$refs['player:' + newval] as HTMLElement[]
|
||||||
if (newElement && newElement[0]) { newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) }
|
// Some hack because of some inconsistency
|
||||||
|
setTimeout(function () {
|
||||||
|
if (newElement && newElement[0]) { newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) }
|
||||||
|
}, 0)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
updated () {
|
updated () {
|
||||||
|
|||||||
+120
-25
@@ -12,34 +12,71 @@
|
|||||||
<option v-for="weaponId in sortedWeaponList" v-bind:key="weaponId" :value="weaponId">{{ weaponId }}</option>
|
<option v-for="weaponId in sortedWeaponList" v-bind:key="weaponId" :value="weaponId">{{ weaponId }}</option>
|
||||||
</select> -->
|
</select> -->
|
||||||
<span class="multiselect-wrapper">
|
<span class="multiselect-wrapper">
|
||||||
<VueMultiselect selectLabel="" deselectLabel="remove" placeholder="Select server" v-model="model.server"
|
<VueMultiselect
|
||||||
:options="groupedServers" group-values="servers" group_label="id" :group-select="false" :allow-empty="true"
|
selectLabel=""
|
||||||
:multiple="false" :custom-label="((e: any) => e.name)" track-by="name" label="name">
|
deselectLabel="remove"
|
||||||
|
placeholder="Select server"
|
||||||
|
v-model="model.server"
|
||||||
|
:options="groupedServers"
|
||||||
|
group-values="servers"
|
||||||
|
group_label="id"
|
||||||
|
:group-select="false"
|
||||||
|
:allow-empty="true"
|
||||||
|
:multiple="false"
|
||||||
|
:custom-label="((e: any) => e.name)"
|
||||||
|
track-by="name"
|
||||||
|
label="name"
|
||||||
|
>
|
||||||
</VueMultiselect>
|
</VueMultiselect>
|
||||||
<button @click="model.server = undefined">X</button>
|
<button @click="model.server = undefined">X</button>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="multiselect-wrapper">
|
<span class="multiselect-wrapper">
|
||||||
<VueMultiselect selectLabel="" deselectLabel="remove" placeholder="Select weapon" v-model="model.weapon"
|
<VueMultiselect
|
||||||
:custom-label="((e: any) => weaponLocale[e] || e)" :options="sortedWeaponList" :allow-empty="true">
|
selectLabel=""
|
||||||
|
deselectLabel="remove"
|
||||||
|
placeholder="Select weapon"
|
||||||
|
v-model="model.weapon"
|
||||||
|
:custom-label="((e: any) => weaponLocale[e] || e)"
|
||||||
|
:options="sortedWeaponList"
|
||||||
|
:allow-empty="true"
|
||||||
|
>
|
||||||
</VueMultiselect>
|
</VueMultiselect>
|
||||||
<button @click="model.weapon = undefined">X</button>
|
<button @click="model.weapon = undefined">X</button>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="multiselect-wrapper">
|
<span class="multiselect-wrapper">
|
||||||
<VueMultiselect :options-limit="20" selectLabel="" deselectLabel="remove" placeholder="Search player"
|
<VueMultiselect
|
||||||
v-model="playerHighlighted" :options="sortedPlayerList" :allow-empty="true"
|
:options-limit="20"
|
||||||
:custom-label="((e: Player) => e?.username)"></VueMultiselect>
|
selectLabel=""
|
||||||
|
deselectLabel="remove"
|
||||||
|
placeholder="Search player"
|
||||||
|
v-model="playerHighlighted"
|
||||||
|
:options="sortedPlayerList"
|
||||||
|
:allow-empty="true"
|
||||||
|
:custom-label="((e: Player) => e?.username)"
|
||||||
|
></VueMultiselect>
|
||||||
<button @click="playerHighlighted = undefined">X</button>
|
<button @click="playerHighlighted = undefined">X</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="playerView">
|
<div id="playerView">
|
||||||
<PlayerList :filters="filters" v-on:highlightPlayer="highlight_player" :playerHighlighted="playerHighlighted?.id">
|
<PlayerList
|
||||||
|
:filters="filters"
|
||||||
|
v-on:highlightPlayer="highlight_player"
|
||||||
|
:playerHighlighted="playerHighlighted?.id"
|
||||||
|
>
|
||||||
</PlayerList>
|
</PlayerList>
|
||||||
<PlayerChart :filters="filters" v-on:highlightPlayer="highlight_player" :playerHighlighted="playerHighlighted?.id">
|
<PlayerChart
|
||||||
|
:filters="filters"
|
||||||
|
v-on:highlightPlayer="highlight_player"
|
||||||
|
:playerHighlighted="playerHighlighted?.id"
|
||||||
|
>
|
||||||
</PlayerChart>
|
</PlayerChart>
|
||||||
<WeaponChart :filters="{ player: playerHighlighted?.id, ...filters }" :playerHighlighted="playerHighlighted?.id">
|
<WeaponChart
|
||||||
|
:filters="{ player: playerHighlighted?.id, ...filters }"
|
||||||
|
:playerHighlighted="playerHighlighted?.id"
|
||||||
|
>
|
||||||
</WeaponChart>
|
</WeaponChart>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -53,22 +90,37 @@ import { defineComponent } from 'vue'
|
|||||||
import VueMultiselect from 'vue-multiselect'
|
import VueMultiselect from 'vue-multiselect'
|
||||||
import 'vue-multiselect/dist/vue-multiselect.css'
|
import 'vue-multiselect/dist/vue-multiselect.css'
|
||||||
import weapons from '../stores/weapons.json'
|
import weapons from '../stores/weapons.json'
|
||||||
|
import router from '@/router'
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'PlayerView',
|
name: 'PlayerView',
|
||||||
components: {
|
components: {
|
||||||
VueMultiselect, PlayerList, PlayerChart, WeaponChart
|
VueMultiselect,
|
||||||
|
PlayerList,
|
||||||
|
PlayerChart,
|
||||||
|
WeaponChart
|
||||||
},
|
},
|
||||||
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
model: { server: undefined, weapon: undefined } as unknown as { weapon: Weapon | Weapon[] | undefined, server: (Server & { name?: string }) | (Server & { name?: string })[] | undefined },
|
model: { server: undefined, weapon: undefined } as unknown as {
|
||||||
|
weapon: string | undefined;
|
||||||
|
server: { name?: string } | (Server & { name?: string })[] | undefined;
|
||||||
|
},
|
||||||
filters: {} as Filters,
|
filters: {} as Filters,
|
||||||
store: useKillStore(),
|
store: useKillStore(),
|
||||||
playerHighlighted: undefined as (Player & { id: string }) | undefined,
|
playerHighlighted: undefined as (Player & { id: string }) | undefined,
|
||||||
weaponLocale: weapons as { [key: string]: string }
|
weaponLocale: weapons as { [key: string]: string }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
created () {
|
||||||
|
let server
|
||||||
|
if (this.$route.query.server) server = { name: this.$route.query.server?.toString() }
|
||||||
|
this.model = {
|
||||||
|
server,
|
||||||
|
weapon: this.$route.query.weapon?.toString()
|
||||||
|
}
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
servers (): { [key: string]: Server } {
|
servers (): { [key: string]: Server } {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
@@ -78,10 +130,15 @@ export default defineComponent({
|
|||||||
return data
|
return data
|
||||||
},
|
},
|
||||||
groupedServers () {
|
groupedServers () {
|
||||||
const hosts = [] as { id: string, servers: (Server & { name?: string })[] }[]
|
const hosts = [] as {
|
||||||
|
id: string;
|
||||||
|
servers: (Server & { name?: string })[];
|
||||||
|
}[]
|
||||||
Object.entries(this.servers).forEach((e) => {
|
Object.entries(this.servers).forEach((e) => {
|
||||||
if (!hosts.find(host => host.id === e[1].host + 'sfdsdfsd')) hosts.push({ id: e[1].host + 'sfdsdfsd', servers: [] as Server[] })
|
if (!hosts.find((host) => host.id === e[1].host + 'sfdsdfsd')) { hosts.push({ id: e[1].host + 'sfdsdfsd', servers: [] as Server[] }) }
|
||||||
hosts.find(host => host.id === e[1].host + 'sfdsdfsd')?.servers.push({ name: e[0], ...e[1] })
|
hosts
|
||||||
|
.find((host) => host.id === e[1].host + 'sfdsdfsd')
|
||||||
|
?.servers.push({ name: e[0], ...e[1] })
|
||||||
})
|
})
|
||||||
return hosts
|
return hosts
|
||||||
},
|
},
|
||||||
@@ -111,7 +168,10 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
sortedPlayerList (): Player[] {
|
sortedPlayerList (): Player[] {
|
||||||
if (!this.players) return []
|
if (!this.players) return []
|
||||||
const players = Object.entries(this.players).map(e => ({ id: e[0], ...e[1] }))
|
const players = Object.entries(this.players).map((e) => ({
|
||||||
|
id: e[0],
|
||||||
|
...e[1]
|
||||||
|
}))
|
||||||
return players.sort((a: Player, b: Player) => {
|
return players.sort((a: Player, b: Player) => {
|
||||||
if (a.username < b.username) {
|
if (a.username < b.username) {
|
||||||
return -1
|
return -1
|
||||||
@@ -124,12 +184,47 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
players () {
|
||||||
|
const player = this.$route.query.player?.toString()
|
||||||
|
if (player && this.playerHighlighted?.id !== player) {
|
||||||
|
this.highlight_player(player)
|
||||||
|
}
|
||||||
|
},
|
||||||
model: {
|
model: {
|
||||||
handler (newModel) {
|
handler (newModel) {
|
||||||
this.filters.server = newModel.server?.name
|
this.filters.server = newModel.server?.name
|
||||||
this.filters.weapon = newModel.weapon
|
this.filters.weapon = newModel.weapon
|
||||||
},
|
},
|
||||||
deep: true
|
deep: true
|
||||||
|
},
|
||||||
|
filters: {
|
||||||
|
handler (newValue) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const { server: _, weapon: _2, ...withoutFilters } = this.$route.query
|
||||||
|
router.push({ query: { ...newValue, ...withoutFilters } }).then(e => { console.log(e) })
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
|
},
|
||||||
|
playerHighlighted (newValue, oldValue) {
|
||||||
|
if (newValue?.id === oldValue?.id) return
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const { player: _, ...withoutPlayer } = this.$route.query
|
||||||
|
router.push({ query: { player: newValue?.id, ...withoutPlayer } }).then(e => { console.log(e) })
|
||||||
|
},
|
||||||
|
'$route' (to) {
|
||||||
|
if (this.playerHighlighted?.id !== to.query.player) {
|
||||||
|
const playerId = to.query.player?.toString()
|
||||||
|
if (playerId) {
|
||||||
|
this.highlight_player(playerId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.filters.weapon !== to.query.weapon) {
|
||||||
|
this.model.weapon = to.query.weapon
|
||||||
|
}
|
||||||
|
if (this.filters.server !== to.query.server) {
|
||||||
|
if (to.query.server) this.model.server = { name: to.query.server }
|
||||||
|
else this.model.server = undefined
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -147,7 +242,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.multiselect {
|
.multiselect {
|
||||||
margin: 0 .5em 1em .5em;
|
margin: 0 0.5em 1em 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect-wrapper {
|
.multiselect-wrapper {
|
||||||
@@ -165,8 +260,8 @@ export default defineComponent({
|
|||||||
display: grid;
|
display: grid;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
grid-template-areas:
|
grid-template-areas:
|
||||||
'list chart'
|
"list chart"
|
||||||
'list info';
|
"list info";
|
||||||
grid-template-columns: 50% 50%;
|
grid-template-columns: 50% 50%;
|
||||||
grid-template-rows: 50% 50%;
|
grid-template-rows: 50% 50%;
|
||||||
}
|
}
|
||||||
@@ -177,8 +272,7 @@ export default defineComponent({
|
|||||||
/* height:100%; */
|
/* height:100%; */
|
||||||
display: grid;
|
display: grid;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
grid-template-areas:
|
grid-template-areas: "list list";
|
||||||
'list list';
|
|
||||||
grid-template-columns: 100%;
|
grid-template-columns: 100%;
|
||||||
grid-template-rows: 100%;
|
grid-template-rows: 100%;
|
||||||
width: calc(100vw - 1em);
|
width: calc(100vw - 1em);
|
||||||
@@ -186,11 +280,11 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
.multiselect-wrapper button {
|
.multiselect-wrapper button {
|
||||||
margin: 0 .5em 1em 0;
|
margin: 0 0.5em 1em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.multiselect {
|
.multiselect {
|
||||||
width: calc(100% - 1em)
|
width: calc(100% - 1em);
|
||||||
}
|
}
|
||||||
|
|
||||||
.playerChart {
|
.playerChart {
|
||||||
@@ -204,4 +298,5 @@ export default defineComponent({
|
|||||||
|
|
||||||
#filters {
|
#filters {
|
||||||
grid-area: filters;
|
grid-area: filters;
|
||||||
}</style>
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
Reference in New Issue
Block a user