+
{{ index }}
{{ players[playerId].username }}
{{ players[playerId].kills }}
{{ players[playerId].deaths }}
@@ -23,33 +26,58 @@
import { defineComponent } from 'vue'
import { Player } from '@/store/index'
import { useStore } from 'vuex'
+import { Vue } from 'vue-class-component'
export default defineComponent({
props: {
- filters: Object
+ filters: Object,
+ playerHighlighted: String
},
+ emits: ['highlightPlayer'],
data () {
return {
sortingData: { direction: -1, argument: '' as keyof Player | 'k/d' },
playerIdList: [] as string[],
- store: useStore()
+ store: useStore(),
+ selected: undefined as string | undefined
}
},
computed: {
- players ():{[key:string]:Player} { return this.store.getters.getPlayerList(this.filters) }
+ players (): { [key: string]: Player } { return this.store.getters.getPlayerList(this.filters) }
},
watch: {
players: {
- handler (newval:{[key:string]:Player}): void {
+ handler (newval: { [key: string]: Player }): void {
if (!newval) return
this.playerIdList = []
this.sortingData.direction *= -1
this.playerIdList = Object.keys(newval)
this.sortPlayerList(this.sortingData.argument)
+ this.$nextTick(() => {
+ const element = (this.$refs['player:' + this.selected] as HTMLElement[])
+ if (element && element.length > 0) element[0].classList.add('selected')
+ })
},
immediate: true
+ },
+ playerHighlighted (newval, oldval) {
+ const oldElement = this.$refs['player:' + oldval] as HTMLElement[]
+ if (oldElement) {
+ oldElement[0].classList.remove('selected')
+ delete this.selected
+ }
+ const newElement = this.$refs['player:' + newval] as HTMLElement[]
+ if (!newElement) return
+ newElement[0].classList.add('selected')
+ newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' })
+ this.selected = newval
}
},
+ updated () {
+ const element = this.$refs['player:' + this.$props.playerHighlighted] as HTMLElement[]
+ if (!element || !element[0]) return
+ element[0].scrollIntoView({ behavior: 'smooth', block: 'center' })
+ },
methods: {
sortPlayerList (arg: ((keyof Player) | 'k/d')) {
if (arg === this.sortingData.argument) {
@@ -61,7 +89,7 @@ export default defineComponent({
}
this.sortingData.argument = arg
- this.playerIdList.sort((a:string, b:string) => {
+ this.playerIdList.sort((a: string, b: string) => {
if (!this.players) {
return 0
}
@@ -82,6 +110,26 @@ export default defineComponent({
}
return 0
})
+ },
+ selectNextPlayer (e: KeyboardEvent) {
+ const values = {
+ Home: -Infinity,
+ End: Infinity,
+ PageDown: 100,
+ PageUp: -100,
+ ArrowUp: -1,
+ ArrowDown: 1,
+ ArrowRight: 10,
+ ArrowLeft: -10
+ } as { [key: string]: number }
+ if (!this.selected) return
+ if (!Object.keys(values).includes(e.key)) return
+ e.preventDefault()
+ const index = this.playerIdList.indexOf(this.selected)
+ let nextIndex = (index + values[e.key])
+ if (nextIndex >= this.playerIdList.length) nextIndex = this.playerIdList.length - 1
+ if (nextIndex < 0) nextIndex = 0
+ this.$emit('highlightPlayer', this.playerIdList[nextIndex])
}
}
@@ -89,17 +137,61 @@ export default defineComponent({
+
+.selected {
+ background: var(--comment) !important;
+}
diff --git a/src/store/index.ts b/src/store/index.ts
index 3993355..76aacb8 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -43,7 +43,15 @@ export default createStore
({
weapons: {}
},
getters: {
- getPlayerList: (state) => ({ server, weapon }: { server?: number, weapon?: string }) => {
+ getPlayerList: (state) => ({ server, weapon, minKills, minDeaths }: { server?: number, weapon?: string, minKills:number, minDeaths:number }) => {
+ let playerFilter: string[] = []
+ if (state.players['']) {
+ playerFilter = Object.entries(state.players['']).filter(([, value]:any) => { return (value.kills >= minKills) || (value.deaths >= minDeaths) }).map(e => e[0])
+ }
+ if (playerFilter.length > 0 && state.players[(server || '') + (weapon || '')]) {
+ return Object.fromEntries(Object.entries(state.players[(server || '') + (weapon || '')]).filter(([key]) => playerFilter.includes(key)))
+ }
+
return state.players[(server || '') + (weapon || '')]
},
getWeaponList: (state) => ({ server, player }: { server?: number, player?: string }) => {
@@ -76,6 +84,7 @@ export default createStore({
data[e].max_kill_distance = Number(data[e].max_kill_distance)
data[e].avg_kill_distance = Number(data[e].avg_kill_distance)
})
+
context.commit('setPlayers', { data, filters: { weapon, server } })
},
async fetchWeapons (context, { player, server }) {
diff --git a/src/views/PlayerView.vue b/src/views/PlayerView.vue
index e2a6aeb..d657ea5 100644
--- a/src/views/PlayerView.vue
+++ b/src/views/PlayerView.vue
@@ -1,17 +1,23 @@
-
-
-
+
+
+
+
+
+
-
-
+
@@ -30,13 +36,13 @@ export default defineComponent({
data () {
return {
- filters: {},
- store: useStore()
- } as { filters: { weapon?: string, server?: string }, store: Store
}
+ filters: { minKills: 100, minDeaths: 100 },
+ store: useStore(),
+ playerHighlighted: undefined
+ } as { filters: { weapon?: string, server?: string }, store: Store, playerHighlighted?: string }
},
computed: {
servers (): Server[] { return this.store.state.servers },
- players (): { [key: string]: Player } { return this.store.getters.getPlayerList(this.filters) },
weapons (): { [key: string]: Weapon } { return this.store.getters.getWeaponList(this.filters) }
},
methods: {
@@ -58,8 +64,15 @@ export default defineComponent({