add server filter and KD Line
This commit is contained in:
Generated
+9
@@ -9,6 +9,7 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chart.js": "^4.2.1",
|
"chart.js": "^4.2.1",
|
||||||
|
"chartjs-plugin-annotation": "^2.2.1",
|
||||||
"core-js": "^3.8.3",
|
"core-js": "^3.8.3",
|
||||||
"vue": "^3.2.13",
|
"vue": "^3.2.13",
|
||||||
"vue-chartjs": "^5.2.0",
|
"vue-chartjs": "^5.2.0",
|
||||||
@@ -4376,6 +4377,14 @@
|
|||||||
"pnpm": "^7.0.0"
|
"pnpm": "^7.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/chartjs-plugin-annotation": {
|
||||||
|
"version": "2.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-2.2.1.tgz",
|
||||||
|
"integrity": "sha512-RL9UtrFr2SXd7C47zD0MZqn6ZLgrcRt3ySC6cYal2amBdANcYB1QcwFXcpKWAYnO4SGJYRok7P5rKDDNgJMA/w==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"chart.js": ">=3.7.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/chokidar": {
|
"node_modules/chokidar": {
|
||||||
"version": "3.5.3",
|
"version": "3.5.3",
|
||||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
|
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chart.js": "^4.2.1",
|
"chart.js": "^4.2.1",
|
||||||
|
"chartjs-plugin-annotation": "^2.2.1",
|
||||||
"core-js": "^3.8.3",
|
"core-js": "^3.8.3",
|
||||||
"vue": "^3.2.13",
|
"vue": "^3.2.13",
|
||||||
"vue-chartjs": "^5.2.0",
|
"vue-chartjs": "^5.2.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="playerChart">
|
<div class="playerChart">
|
||||||
<Scatter :data="chart" :options="options" />
|
<Scatter :data="chart" :options="chartOptions" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -13,11 +13,12 @@ import {
|
|||||||
Tooltip,
|
Tooltip,
|
||||||
Legend
|
Legend
|
||||||
} from 'chart.js'
|
} from 'chart.js'
|
||||||
|
import annotationPlugin from 'chartjs-plugin-annotation'
|
||||||
|
|
||||||
import { Scatter } from 'vue-chartjs'
|
import { Scatter } from 'vue-chartjs'
|
||||||
import { defineComponent } from 'vue'
|
import { defineComponent } from 'vue'
|
||||||
|
|
||||||
ChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend)
|
ChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin)
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'PlayerChart',
|
name: 'PlayerChart',
|
||||||
@@ -46,16 +47,9 @@ export default defineComponent({
|
|||||||
chartData.datasets[0].labels = Object.keys(this.$props.players)
|
chartData.datasets[0].labels = Object.keys(this.$props.players)
|
||||||
chartData.datasets[0].data = Object.values(this.$props.players).map((e:any) => ({ x: e.deaths, y: e.kills }))
|
chartData.datasets[0].data = Object.values(this.$props.players).map((e:any) => ({ x: e.deaths, y: e.kills }))
|
||||||
return chartData
|
return chartData
|
||||||
}
|
},
|
||||||
},
|
chartOptions () {
|
||||||
/* watch: {
|
const options = {
|
||||||
players: function (newval: any, oldval: any): void {
|
|
||||||
|
|
||||||
}
|
|
||||||
}, */
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
options: {
|
|
||||||
responsive: true,
|
responsive: true,
|
||||||
plugins: {
|
plugins: {
|
||||||
tooltip: {
|
tooltip: {
|
||||||
@@ -71,9 +65,48 @@ export default defineComponent({
|
|||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
annotation: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!this.$props.players) {
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
const maxX = Math.max(...Object.values(this.$props.players).map(e => e.deaths))
|
||||||
|
const maxY = Math.max(...Object.values(this.$props.players).map(e => e.kills))
|
||||||
|
let endX, endY
|
||||||
|
if (maxY > maxX) {
|
||||||
|
endX = maxX
|
||||||
|
endY = (maxX / maxY) * maxY
|
||||||
|
} else {
|
||||||
|
endY = maxY
|
||||||
|
endX = (maxY / maxX) * maxX
|
||||||
|
}
|
||||||
|
options.plugins.annotation = {
|
||||||
|
annotations: {
|
||||||
|
line: {
|
||||||
|
type: 'line',
|
||||||
|
yMin: 0,
|
||||||
|
xMin: 0,
|
||||||
|
yMax: endY,
|
||||||
|
xMax: endX,
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: 'black',
|
||||||
|
borderDash: [1, 5]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/* watch: {
|
||||||
|
players: function (newval: any, oldval: any): void {
|
||||||
|
|
||||||
|
}
|
||||||
|
}, */
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
+23
-14
@@ -1,7 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<select v-on:change="weaponFilter">
|
<select v-model="filters.server" v-on:change="fetchPlayers(filters)">
|
||||||
<option>global</option>
|
<option></option>
|
||||||
<option v-for="(weaponData, weaponId) in weapons" v-bind:key="weaponId">{{ weaponId }}</option>
|
<option v-for="(serverData, serverId) in servers" v-bind:key="serverId" :value="serverId">{{ serverData.name }}</option>
|
||||||
|
</select>
|
||||||
|
<select v-model="filters.weapon" v-on:change="fetchPlayers(filters)">
|
||||||
|
<option></option>
|
||||||
|
<option v-for="(weaponData, weaponId) in weapons" v-bind:key="weaponId" :value="weaponId">{{ weaponId }}</option>
|
||||||
</select>
|
</select>
|
||||||
<div class="playersData">
|
<div class="playersData">
|
||||||
|
|
||||||
@@ -23,9 +27,12 @@ import PlayerChart from '@/components/PlayerChart.vue'
|
|||||||
export default class PlayerView extends Vue {
|
export default class PlayerView extends Vue {
|
||||||
players: any = {}
|
players: any = {}
|
||||||
weapons: any = {}
|
weapons: any = {}
|
||||||
|
servers: any = {}
|
||||||
|
filters: any = {}
|
||||||
created () {
|
created () {
|
||||||
this.fetchPlayers({})
|
this.fetchPlayers({})
|
||||||
this.fetchWeapons({})
|
this.fetchWeapons({})
|
||||||
|
this.fetchServers()
|
||||||
}
|
}
|
||||||
|
|
||||||
async fetchWeapons ({ server }: { server?: string }) {
|
async fetchWeapons ({ server }: { server?: string }) {
|
||||||
@@ -38,23 +45,25 @@ export default class PlayerView extends Vue {
|
|||||||
this.weapons = data
|
this.weapons = data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fetchServers () {
|
||||||
|
const response = await fetch(
|
||||||
|
'https://tone.sleepycat.date/v1/client/servers'
|
||||||
|
)
|
||||||
|
const data = await response.json()
|
||||||
|
this.servers = data
|
||||||
|
console.log(this.servers)
|
||||||
|
}
|
||||||
|
|
||||||
data () {
|
data () {
|
||||||
return { a: 1 }
|
return { a: 1 }
|
||||||
}
|
}
|
||||||
|
|
||||||
weaponFilter (e: Event) {
|
|
||||||
const weapon = (e.target as HTMLInputElement).value
|
|
||||||
if (weapon === 'global') {
|
|
||||||
return this.fetchPlayers({})
|
|
||||||
}
|
|
||||||
this.fetchPlayers({ weapon })
|
|
||||||
}
|
|
||||||
|
|
||||||
async fetchPlayers ({ weapon, server }: { weapon?: string, server?: string }) {
|
async fetchPlayers ({ weapon, server }: { weapon?: string, server?: string }) {
|
||||||
const searchParams: Record<string, string> = {}
|
const searchParams: Record<string, string> = {}
|
||||||
if (weapon) { searchParams.weapon = weapon }
|
if (weapon?.toString()) { searchParams.weapon = weapon }
|
||||||
if (server) { searchParams.server = server }
|
if (server?.toString()) { searchParams.server = server }
|
||||||
|
console.log(server, weapon)
|
||||||
|
console.log('https://tone.sleepycat.date/v1/client/players?' + new URLSearchParams(searchParams))
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
'https://tone.sleepycat.date/v1/client/players?' + new URLSearchParams(searchParams)
|
'https://tone.sleepycat.date/v1/client/players?' + new URLSearchParams(searchParams)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user