allow stats to be edited from admin panel

This commit is contained in:
Phillip Thelen
2024-08-28 16:03:29 +02:00
parent 0bd0ba096b
commit ff53a387d4
7 changed files with 319 additions and 5 deletions

View File

@@ -1,5 +1,8 @@
<template> <template>
<form @submit.prevent="saveHero({ hero, msg: 'Authentication' })"> <form @submit.prevent="saveHero({ hero: {
auth: hero.auth,
preferences: hero.preferences,
}, msg: 'Authentication' })">
<div class="card mt-2"> <div class="card mt-2">
<div class="card-header"> <div class="card-header">
<h3 <h3

View File

@@ -47,6 +47,11 @@
:preferences="hero.preferences" :preferences="hero.preferences"
/> />
<stats
:hero="hero"
:reset-counter="resetCounter"
/>
<items-owned <items-owned
:hero="hero" :hero="hero"
:reset-counter="resetCounter" :reset-counter="resetCounter"
@@ -127,6 +132,7 @@ import SubscriptionAndPerks from './subscriptionAndPerks';
import CustomizationsOwned from './customizationsOwned.vue'; import CustomizationsOwned from './customizationsOwned.vue';
import Achievements from './achievements.vue'; import Achievements from './achievements.vue';
import UserHistory from './userHistory.vue'; import UserHistory from './userHistory.vue';
import Stats from './stats.vue';
import { userStateMixin } from '../../../mixins/userState'; import { userStateMixin } from '../../../mixins/userState';
@@ -142,6 +148,7 @@ export default {
ContributorDetails, ContributorDetails,
Transactions, Transactions,
UserHistory, UserHistory,
Stats,
SubscriptionAndPerks, SubscriptionAndPerks,
UserProfile, UserProfile,
Achievements, Achievements,

View File

@@ -0,0 +1,266 @@
<template>
<form @submit.prevent="submitClicked()">
<div class="card mt-2">
<div class="card-header">
<h3
class="mb-0 mt-0"
:class="{'open': expand}"
@click="expand = !expand"
>
Stats
</h3>
</div>
<div
v-if="expand"
class="card-body"
>
<div class="form-group row">
<label class="col-sm-3 col-form-label red-label">Health</label>
<div class="col-sm-9">
<input
v-model="hero.stats.hp"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label yellow-label">Experience</label>
<div class="col-sm-9">
<input
v-model="hero.stats.exp"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label blue-label">Mana</label>
<div class="col-sm-9">
<input
v-model="hero.stats.mp"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">Level</label>
<div class="col-sm-9">
<input
v-model="hero.stats.lvl"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">Gold</label>
<div class="col-sm-9">
<input
v-model="hero.stats.gp"
class="form-control"
type="number"
>
</div>
</div>
<h3>Stat Points</h3>
<div class="form-group row">
<label class="col-sm-3 col-form-label">Unallocated</label>
<div class="col-sm-9">
<input
v-model="hero.stats.points"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label red-label">Strength</label>
<div class="col-sm-9">
<input
v-model="hero.stats.str"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label blue-label">Intelligence</label>
<div class="col-sm-9">
<input
v-model="hero.stats.int"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label purple-label">Perception</label>
<div class="col-sm-9">
<input
v-model="hero.stats.per"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label yellow-label">Constitution</label>
<div class="col-sm-9">
<input
v-model="hero.stats.con"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row" v-if="statPointsIncorrect">
<label class="col-sm-3 col-form-label"></label>
<div class="col-sm-9 red-label">Error: Sum of stat points should equal the users level
</div>
</div>
<h3>Buffs</h3>
<div class="form-group row">
<label class="col-sm-3 col-form-label red-label">Strength</label>
<div class="col-sm-9">
<input
v-model="hero.stats.buffs.str"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label blue-label">Intelligence</label>
<div class="col-sm-9">
<input
v-model="hero.stats.buffs.int"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label purple-label">Perception</label>
<div class="col-sm-9">
<input
v-model="hero.stats.buffs.per"
class="form-control"
type="number"
>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label yellow-label">Constitution</label>
<div class="col-sm-9">
<input
v-model="hero.stats.buffs.con"
class="form-control"
type="number"
>
</div>
</div>
</div>
<div
v-if="expand"
class="card-footer"
>
<input
type="submit"
value="Save"
class="btn btn-primary mt-1"
>
</div>
</div>
</form>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
.about-row {
margin-left: 0px;
margin-right: 0px;
}
.red-label {
color: $red_100;
}
.blue-label {
color: $blue_100;
}
.purple-label {
color: $purple_300;
}
.yellow-label {
color: $yellow_50;
}
</style>
<script>
import markdownDirective from '@/directives/markdown';
import saveHero from '../mixins/saveHero';
import { mapState } from '@/libs/store';
import { userStateMixin } from '../../../mixins/userState';
function resetData (self) {
self.expand = false;
}
export default {
directives: {
markdown: markdownDirective,
},
mixins: [
userStateMixin,
saveHero,
],
computed: {
...mapState({ user: 'user.data' }),
statPointsIncorrect () {
console.log(this.hero.stats.points, this.hero.stats.str,
this.hero.stats.int, this.hero.stats.per,
this.hero.stats.con, this.hero.stats.lvl);
return (parseInt(this.hero.stats.points, 10)
+ parseInt(this.hero.stats.str, 10)
+ parseInt(this.hero.stats.int, 10)
+ parseInt(this.hero.stats.per, 10)
+ parseInt(this.hero.stats.con, 10)
) !== this.hero.stats.lvl;
},
},
props: {
resetCounter: {
type: Number,
required: true,
},
hero: {
type: Object,
required: true,
},
},
data () {
return {
expand: false,
};
},
watch: {
resetCounter () {
resetData(this);
},
},
mounted () {
resetData(this);
},
methods: {
submitClicked () {
if (this.statPointsIncorrect) {
return;
}
this.saveHero({hero: { stats: this.hero.stats }, msg: 'Stats'})
},
}
};
</script>

View File

@@ -1,5 +1,7 @@
<template> <template>
<form @submit.prevent="saveHero({ hero, msg: 'Subscription Perks' })"> <form @submit.prevent="saveHero({ hero: {
purchased: hero.purchased
}, msg: 'Subscription Perks' })">
<div class="card mt-2"> <div class="card mt-2">
<div class="card-header"> <div class="card-header">
<h3 <h3

View File

@@ -1,5 +1,5 @@
<template> <template>
<form @submit.prevent="saveHero({hero, msg: 'Users Profile'})"> <form @submit.prevent="saveHero({hero: { profile: hero.profile }, msg: 'Users Profile'})">
<div class="card mt-2"> <div class="card mt-2">
<div class="card-header"> <div class="card-header">
<h3 <h3

View File

@@ -146,7 +146,7 @@ api.getHeroes = {
// Note, while the following routes are called getHero / updateHero // Note, while the following routes are called getHero / updateHero
// they can be used by admins to get/update any user // they can be used by admins to get/update any user
const heroAdminFields = 'auth balance contributor flags items lastCron party preferences profile purchased secret permissions achievements'; const heroAdminFields = 'auth balance contributor flags items lastCron party preferences profile purchased secret permissions achievements stats';
const heroAdminFieldsToFetch = heroAdminFields; // these variables will make more sense when... const heroAdminFieldsToFetch = heroAdminFields; // these variables will make more sense when...
const heroAdminFieldsToShow = heroAdminFields; // ... apiTokenObscured is added const heroAdminFieldsToShow = heroAdminFields; // ... apiTokenObscured is added
@@ -319,6 +319,42 @@ api.updateHero = {
} }
} }
if (updateData.stats) {
if (updateData.stats.hp) {
hero.stats.hp = updateData.stats.hp;
}
if (updateData.stats.mp) {
hero.stats.mp = updateData.stats.mp;
}
if (updateData.stats.exp) {
hero.stats.exp = updateData.stats.exp;
}
if (updateData.stats.gp) {
hero.stats.gp = updateData.stats.gp;
}
if (updateData.stats.lvl) {
hero.stats.lvl = updateData.stats.lvl;
}
if (updateData.stats.points) {
hero.stats.points = updateData.stats.points;
}
if (updateData.stats.str) {
hero.stats.str = updateData.stats.str;
}
if (updateData.stats.int) {
hero.stats.int = updateData.stats.int;
}
if (updateData.stats.per) {
hero.stats.per = updateData.stats.per;
}
if (updateData.stats.con) {
hero.stats.con = updateData.stats.con;
}
if (updateData.stats.buffs) {
hero.stats.buffs = updateData.stats.buffs;
}
}
// give them gems if they got an higher level // give them gems if they got an higher level
// tier = level in this context // tier = level in this context
let newTier = updateData.contributor && updateData.contributor.level; let newTier = updateData.contributor && updateData.contributor.level;