updated frontend from typescript to javascript

This commit is contained in:
cnachtigall1991
2021-10-05 00:16:20 +02:00
parent 27edfd0cfe
commit 886f182ff2
41 changed files with 1183 additions and 28 deletions

31
src/components/Footer.vue Normal file
View File

@@ -0,0 +1,31 @@
<template>
<div class="bg-secondary text-center pt-5 pb-4">
<div class="icons pb-4">
<a class="text-white" target="_blank" href="https://git.harting.dev/CSGOWTF/csgowtf">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="bi bi-github"
viewBox="0 0 16 16">
<path
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/>
</svg>
</a>
</div>
<div class="text">
<p>This site is an open source project, originally created and maintained by <span class="text-warning">anonfunc</span> and <span
class="text-warning">vikingowl</span>.</p>
<p class="text-muted">For feedback contact us at <a class="text-muted text-decoration-none"
href="mailto:#">EMAIL</a></p>
</div>
</div>
</template>
<script>
export default {
name: "Footer",
}
</script>
<style scoped>
p {
font-size: .85rem;
}
</style>

110
src/components/Nav.vue Normal file
View File

@@ -0,0 +1,110 @@
<template>
<nav class="navbar navbar-expand navbar-dark fixed-top">
<div class="container-fluid w-75">
<div class="navbar-nav">
<router-link class="navbar-brand text-warning fw-bold fs-3" to="/">CSGO<span class="text-up text-white fw-bold">WTF</span>
</router-link>
<router-link class="nav-link" to="/explore">Explore</router-link>
</div>
<form class="d-flex col-5 justify-content-end" @keydown.enter.prevent="parseSearch">
<label for="search">
<svg class="bi bi-search" fill="currentColor" height="24" viewBox="0 0 16 16" width="24"
xmlns="http://www.w3.org/2000/svg">
<path
d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"/>
</svg>
</label>
<input id="search" v-model="data.searchInput" aria-label="Search"
class="form-control w-75 bg-transparent border-0"
placeholder="SteamID64, Profile Link or Custom URL"
type="search">
</form>
</div>
</nav>
</template>
<script>
import {reactive} from "vue";
import {useStore} from 'vuex'
import {sanitize} from 'string-sanitizer'
import router from "../router";
export default {
name: 'Nav',
setup() {
const store = useStore()
const data = reactive({
searchInput: ''
})
const parseSearch = () => {
const input = data.searchInput
const customUrlPattern = 'https://steamcommunity.com/id/'
const profileUrlPattern = 'https://steamcommunity.com/profiles/'
const id64Pattern = /^\d{17}$/
store.state.id64 = ''
store.state.vanityUrl = ''
if (id64Pattern.test(input)) {
store.state.id64 = input
} else if (input.match(customUrlPattern)) {
store.state.vanityUrl = sanitize(input.split('/')[4].split('?')[0])
} else if (input.match(profileUrlPattern)) {
const tmp = input.split('/')[4].split('?')[0]
if (id64Pattern.test(tmp)) {
store.state.id64 = tmp
}
} else {
store.state.vanityUrl = sanitize(input)
}
if (store.state.id64 !== '' || store.state.vanityUrl !== '') {
data.searchInput = ''
if (store.state.id64) {
router.push(`/player/${store.state.id64}`)
} else if (store.state.vanityUrl) {
router.push(`/player/${store.state.vanityUrl}`)
}
}
}
return {
data, parseSearch
}
}
}
</script>
<style lang="scss" scoped>
nav {
height: 70px;
width: 100vw;
background: rgba(16, 18, 26, 0.5);
.text-up {
font-size: 40%;
vertical-align: top;
}
label {
padding-top: 6px;
}
input[type="search"] {
min-width: 300px;
max-width: 300px;
&:focus {
box-shadow: 0 4px 2px -2px rgba(95, 120, 146, 0.59);
transition: .2s ease-in-out;
transform: scale(.975);
}
&::placeholder {
color: #aaa;
}
}
}
</style>

View File

@@ -0,0 +1,71 @@
<template>
<table>
<thead>
<tr>
<th class="player__avatar"></th>
<th class="player__name"></th>
<th class="player__rank"></th>
<th class="player__kills cursor__help" title="Kills">K</th>
<th class="player__assist cursor__help" title="Assists">A</th>
<th class="player__deaths cursor__help" title="Deaths">D</th>
<th class="player__diff cursor__help" title="Kill death difference">+/-</th>
<th class="player__kd cursor__help" title="Kill death ratio">K/D</th>
<th class="player__adr cursor__help" title="Average damage per round">ADR</th>
<th class="player__hs cursor__help" title="Percentage of kills with a headshot">HS%</th>
<th class="player__kast cursor__help" title="Percentage of rounds with a Kill, Assist, Survived or Death Traded">
KAST
</th>
<th class="player__rating cursor__help" title="Estimated HLTV Rating 1.0">Rating</th>
</tr>
</thead>
<tbody v-for="player in props.stats" :key="player.player.steamid64">
<tr v-if="player.team_id === props.team_id" class="player">
<ScoreTeamPlayer
:assists="player.assists"
:avatar="player.player.avatar"
:deaths="player.deaths"
:dmg="player.extended?.dmg?.enemy"
:hs="player.headshot"
:kast="player.extended?.kast"
:kdiff="player.kills - player.deaths"
:kills="player.kills"
:mk_duo="player.extended?.multi_kills?.duo"
:mk_pent="player.extended?.multi_kills?.pent"
:mk_quad="player.extended?.multi_kills?.quad"
:mk_triple="player.extended?.multi_kills?.triple"
:name="player.player.name"
:rounds_played="props.rounds_played"
:rank="player.extended?.rank?.old"
/>
</tr>
</tbody>
</table>
</template>
<script>
import ScoreTeamPlayer from '@/components/ScoreTeamPlayer.vue'
export default {
name: 'ScoreTeam',
components: {ScoreTeamPlayer},
props: {
stats: {
type: Object,
required: true
},
rounds_played: {
type: Number,
required: true,
default: 0
},
team_id: {
type: Number,
required: true,
default: 1
}
},
setup(props) {
return {props}
}
}
</script>

View File

@@ -0,0 +1,130 @@
<template>
<td>
<img :src="props.avatar" alt="Player avatar" class="player__avatar">
</td>
<td class="player__name">
{{ props.name }}
</td>
<td>
<img :src="props.rank ? require('@/images/ranks/' + props.rank + '.png') : require('@/images/ranks/0.png')"
alt="Player rank"
class="player__rank">
</td>
<td class="player__kills">
{{ props.kills }}
</td>
<td class="player__assist">
{{ props.assists }}
</td>
<td class="player__deaths">
{{ props.deaths }}
</td>
<td :class="props.kdiff >= 0 ? 'text-success' : 'text-danger'" class="player__diff">
{{ props.kdiff }}
</td>
<td class="player__kd">
{{ (props.kills > 0 && props.deaths > 0) ? (props.kills / props.deaths).toFixed(2) : (props.kills > 0 && props.deaths === 0) ? props.kills : 0.00 }}
</td>
<td class="player__adr">
{{ (props.dmg / props.rounds_played).toFixed(2) }}
</td>
<td class="player__hs">
{{ (props.hs > 0 && props.kills > 0) ? (props.hs * 100 / props.kills).toFixed(0) + "%" : "0%" }}
</td>
<td class="player__kast">
{{ props.kast ? props.kast + "%" : "-" }}
</td>
<td class="player__rating">
{{
GetHLTV_1(props.kills, props.rounds_played, props.deaths, props.mk_duo, props.mk_triple, props.mk_quad, props.mk_pent)
}}
</td>
</template>
<script>
import {GetHLTV_1} from "../utils";
export default {
name: 'ScoreTeamPlayer',
props: {
avatar: {
type: String,
required: true,
default: 'Avatar'
},
name: {
type: String,
required: true,
default: 'Name'
},
rank: {
type: Number,
required: true,
default: 0
},
kills: {
type: Number,
required: true,
default: 0
},
assists: {
type: Number,
required: true,
default: 0
},
deaths: {
type: Number,
required: true,
default: 0
},
kdiff: {
type: Number,
required: true,
default: 0
},
hs: {
type: Number,
required: true,
default: 0
},
rounds_played: {
type: Number,
required: true,
default: 0
},
mk_duo: {
type: Number,
required: true,
default: 0
},
mk_triple: {
type: Number,
required: true,
default: 0
},
mk_quad: {
type: Number,
required: true,
default: 0
},
mk_pent: {
type: Number,
required: true,
default: 0
},
kast: {
type: Number,
required: true,
default: 0
},
dmg: {
type: Number,
required: true,
default: 0
},
},
setup(props) {
return {props, GetHLTV_1}
}
}
</script>