Compare commits
2 Commits
2991a88a30
...
e07b236313
| Author | SHA1 | Date | |
|---|---|---|---|
| e07b236313 | |||
| fccd9b999b |
@@ -62,8 +62,11 @@
|
|||||||
"vue"
|
"vue"
|
||||||
],
|
],
|
||||||
"transform": {
|
"transform": {
|
||||||
".*\\.(vue)$": "vue-jest",
|
"^.*\\.(vue)$": "vue-jest",
|
||||||
"^.+\\.js$": "<rootDir>/node_modules/babel-jest"
|
"^.+\\.js$": "babel-jest"
|
||||||
|
},
|
||||||
|
"moduleNameMapper": {
|
||||||
|
"^@/(.*)$": "<rootDir>/src/$1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,25 @@
|
|||||||
<template>
|
<template>
|
||||||
<main id="app" class="container">
|
<main id="app" class="container">
|
||||||
<Player></Player>
|
<PlayerView :id="state.player_id" v-slot="{ player, updateWealth }">
|
||||||
|
<section class="section">
|
||||||
|
<HeaderBar :app_state="state">
|
||||||
|
<template v-slot:title>{{ player.name }}</template>
|
||||||
|
</HeaderBar>
|
||||||
|
<Wealth
|
||||||
|
:wealth="[player.cp, player.sp, player.gp, player.pp]"
|
||||||
|
:debt="player.debt"
|
||||||
|
@update="updateWealth">
|
||||||
|
</wealth>
|
||||||
|
<Chest :player="state.show_player_chest ? player.id : 0"></Chest>
|
||||||
|
</section>
|
||||||
|
</PlayerView>
|
||||||
</main>
|
</main>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Player from './components/Player.vue'
|
import PlayerView from './components/PlayerView.js'
|
||||||
|
import HeaderBar from './components/HeaderBar.vue'
|
||||||
|
import Wealth from './components/Wealth.vue'
|
||||||
import Chest from './components/Chest.vue'
|
import Chest from './components/Chest.vue'
|
||||||
import { AppStorage } from './AppStorage'
|
import { AppStorage } from './AppStorage'
|
||||||
|
|
||||||
@@ -29,12 +43,14 @@ export default {
|
|||||||
name: 'app',
|
name: 'app',
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
state: AppStorage.state,
|
state: AppStorage.state,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Player,
|
PlayerView,
|
||||||
Chest
|
HeaderBar,
|
||||||
|
Chest,
|
||||||
|
Wealth
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
// Initiate with active player set to value found in cookie
|
// Initiate with active player set to value found in cookie
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export const AppStorage = {
|
|||||||
const [players, claims] = data;
|
const [players, claims] = data;
|
||||||
this.__initPlayerList(players);
|
this.__initPlayerList(players);
|
||||||
this.__initClaimsStore(claims);
|
this.__initClaimsStore(claims);
|
||||||
});
|
})
|
||||||
// TODO: when __initPlayerList won't use promises
|
// TODO: when __initPlayerList won't use promises
|
||||||
//.then(_ => this.state.initiated = true);
|
//.then(_ => this.state.initiated = true);
|
||||||
},
|
},
|
||||||
@@ -94,7 +94,8 @@ export const AppStorage = {
|
|||||||
));
|
));
|
||||||
promises.push(promise);
|
promises.push(promise);
|
||||||
}
|
}
|
||||||
Promise.all(promises).then(_ => this.state.initiated = true);
|
Promise.all(promises)
|
||||||
|
.then(_ => this.state.initiated = true)
|
||||||
},
|
},
|
||||||
// User actions
|
// User actions
|
||||||
// Sets a new active player by id
|
// Sets a new active player by id
|
||||||
|
|||||||
52
lootalot_front/src/components/HeaderBar.vue
Normal file
52
lootalot_front/src/components/HeaderBar.vue
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<template>
|
||||||
|
<nav class="navbar is-info">
|
||||||
|
<div class="navbar-brand">
|
||||||
|
<p class="navbar-item is-size-4"><slot name="title">...</slot></p>
|
||||||
|
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false">
|
||||||
|
<span aria-hidden="true"></span>
|
||||||
|
<span aria-hidden="true"></span>
|
||||||
|
<span aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="menu" class="navbar-menu">
|
||||||
|
<div class="navbar-start" v-if="!playerIsGroup">
|
||||||
|
<a class="navbar-item" @click="switchPlayerChestVisibility">
|
||||||
|
{{ app_state.show_player_chest ? 'Coffre de groupe' : 'Mon coffre' }}</a>
|
||||||
|
</div>
|
||||||
|
<div class="navbar-end">
|
||||||
|
<div class="navbar-item has-dropdown is-hoverable">
|
||||||
|
<a class="navbar-link">Autres</a>
|
||||||
|
<div class="navbar-dropdown is-right">
|
||||||
|
<a class="navbar-item">History of Loot</a>
|
||||||
|
<template v-if="playerIsGroup">
|
||||||
|
<hr class="navbar-divider">
|
||||||
|
<div class="navbar-item heading">Admin</div>
|
||||||
|
<a class="navbar-item">"Resolve claims"</a>
|
||||||
|
<a class="navbar-item">"Add player"</a>
|
||||||
|
</template>
|
||||||
|
<hr class="navbar-divider">
|
||||||
|
<div class="navbar-item heading">Changer</div>
|
||||||
|
<a v-for="(p,i) in app_state.player_list" :key="i"
|
||||||
|
@click="setActivePlayer(i)"
|
||||||
|
href="#" class="navbar-item">
|
||||||
|
{{ p.name }}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { AppStorage } from '../AppStorage'
|
||||||
|
export default {
|
||||||
|
props: ["app_state"],
|
||||||
|
methods: {
|
||||||
|
setActivePlayer (idx) { AppStorage.setActivePlayer(idx); },
|
||||||
|
switchPlayerChestVisibility () { AppStorage.switchPlayerChestVisibility(); },
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
playerIsGroup () { return this.app_state.player_id == 0 },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="">
|
|
||||||
<nav class="navbar is-info">
|
|
||||||
<div class="navbar-brand">
|
|
||||||
<p class="navbar-item is-size-4" @click="show_wealth = !show_wealth">{{ app_state.initiated ? player.name : "..." }}</p>
|
|
||||||
<a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false">
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div id="menu" class="navbar-menu">
|
|
||||||
<div class="navbar-start" v-if="!playerIsGroup">
|
|
||||||
<a class="navbar-item" @click="switchPlayerChestVisibility">
|
|
||||||
{{ app_state.show_player_chest ? 'Coffre de groupe' : 'Mon coffre' }}</a>
|
|
||||||
</div>
|
|
||||||
<div class="navbar-end">
|
|
||||||
<div class="navbar-item has-dropdown is-hoverable">
|
|
||||||
<a class="navbar-link">Autres</a>
|
|
||||||
<div class="navbar-dropdown is-right">
|
|
||||||
<a class="navbar-item">History of Loot</a>
|
|
||||||
<hr class="navbar-divider">
|
|
||||||
<div class="navbar-item heading">Changer</div>
|
|
||||||
<a v-for="(p,i) in app_state.player_list" :key="i"
|
|
||||||
@click="setActivePlayer(i)"
|
|
||||||
href="#" class="navbar-item">
|
|
||||||
{{ p.name }}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<section class="box is-shadowless" v-if="show_wealth">
|
|
||||||
<Wealth :wealth="wealth" :debt="player.debt"></Wealth>
|
|
||||||
</section>
|
|
||||||
<section class="card">
|
|
||||||
<div class="card-content">
|
|
||||||
<Loot v-if="is_adding"></Loot>
|
|
||||||
<Chest v-else :player="shownChest"></Chest>
|
|
||||||
</div>
|
|
||||||
<div class="card-footer" v-if="shownChest == player.id">
|
|
||||||
<template v-if="is_adding">
|
|
||||||
<a class="card-footer-item">Confirmer</a>
|
|
||||||
<a class="card-footer-item" @click="toggleAdding">Annuler</a>
|
|
||||||
</template>
|
|
||||||
<a v-else class="card-footer-item" @click="toggleAdding">
|
|
||||||
+ {{ playerIsGroup ? 'Nouveau loot' : 'Acheter' }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { AppStorage } from '../AppStorage'
|
|
||||||
import Chest from './Chest.vue'
|
|
||||||
import Wealth from './Wealth.vue'
|
|
||||||
import Loot from './Loot.vue'
|
|
||||||
/*
|
|
||||||
The Player control board.
|
|
||||||
*/
|
|
||||||
export default {
|
|
||||||
components: { Chest, Wealth, Loot },
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
app_state: AppStorage.state,
|
|
||||||
is_adding: false,
|
|
||||||
show_wealth: true,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
player () {
|
|
||||||
if (!this.app_state.initiated) return {}
|
|
||||||
const idx = this.app_state.player_id;
|
|
||||||
return this.app_state.player_list[idx];
|
|
||||||
},
|
|
||||||
wealth () {
|
|
||||||
if (!this.app_state.initiated) {
|
|
||||||
return ["-", "-", "-", "-"];
|
|
||||||
} else {
|
|
||||||
const cp = this.player.cp
|
|
||||||
const sp = this.player.sp
|
|
||||||
const gp = this.player.gp
|
|
||||||
const pp = this.player.pp
|
|
||||||
return [cp, sp, gp, pp];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Check if the active player is the special 'Group' player
|
|
||||||
playerIsGroup () {
|
|
||||||
return this.app_state.player_id == 0;
|
|
||||||
},
|
|
||||||
shownChest () {
|
|
||||||
return this.app_state.show_player_chest
|
|
||||||
? this.app_state.player_id
|
|
||||||
: 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
toggleAdding () {
|
|
||||||
this.is_adding = !this.is_adding;
|
|
||||||
},
|
|
||||||
switchPlayerChestVisibility () {
|
|
||||||
AppStorage.switchPlayerChestVisibility();
|
|
||||||
},
|
|
||||||
hidePlayerChest () {
|
|
||||||
if (this.app_state.show_player_chest) {
|
|
||||||
this.switchPlayerChestVisibility();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setActivePlayer (playerIdx) {
|
|
||||||
var playerIdx = Number(playerIdx);
|
|
||||||
AppStorage.setActivePlayer(playerIdx);
|
|
||||||
if (playerIdx == 0) { this.hidePlayerChest() }
|
|
||||||
},
|
|
||||||
closeDropdown () {
|
|
||||||
this.show_dropdown = false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.fa-exchange-alt.disabled { opacity: 0.4; }
|
|
||||||
</style>
|
|
||||||
32
lootalot_front/src/components/PlayerView.js
Normal file
32
lootalot_front/src/components/PlayerView.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { AppStorage } from '../AppStorage'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
props: ["id"],
|
||||||
|
data () { return {}},
|
||||||
|
methods: {
|
||||||
|
updateWealth (value) {
|
||||||
|
AppStorage.updatePlayerWealth(value)
|
||||||
|
.then(_ => {if (AppStorage.debug) console.log("Wealth updated")})
|
||||||
|
.catch(e => {if (AppStorage.debug) console.error("wealthUpdate Error", e)})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
player () {
|
||||||
|
if (!AppStorage.state.initiated) {
|
||||||
|
return { name: "Loading",
|
||||||
|
id: 0,
|
||||||
|
cp: '-', sp: '-', gp: '-', pp: '-',
|
||||||
|
debt: 0 };
|
||||||
|
} else {
|
||||||
|
console.log("Update player");
|
||||||
|
return AppStorage.state.player_list[this.id];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
render () {
|
||||||
|
return this.$scopedSlots.default({
|
||||||
|
player: this.player,
|
||||||
|
updateWealth: this.updateWealth,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,12 +2,11 @@
|
|||||||
<section class="level is-mobile">
|
<section class="level is-mobile">
|
||||||
<div class="level-left">
|
<div class="level-left">
|
||||||
<div class="level-item">
|
<div class="level-item">
|
||||||
<span class="icon is-large"
|
<span class="icon is-large" @click="edit = !edit">
|
||||||
@click="edit = !edit">
|
<i class="fas fa-2x fa-piggy-bank"></i>
|
||||||
<i class="fas fa-2x fa-piggy-bank"></i>
|
</span>
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<template v-if="edit">
|
<template v-if="edit">
|
||||||
<div class="level-item">
|
<div class="level-item">
|
||||||
<input class="input" type="number" step="0.01" v-model="edit_value"></input>
|
<input class="input" type="number" step="0.01" v-model="edit_value"></input>
|
||||||
</div>
|
</div>
|
||||||
@@ -16,8 +15,8 @@
|
|||||||
Modifier
|
Modifier
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="level-item ">
|
<div class="level-item ">
|
||||||
<p class="is-size-4">{{ wealth[3] }}</p>
|
<p class="is-size-4">{{ wealth[3] }}</p>
|
||||||
<p class="heading">PP</p>
|
<p class="heading">PP</p>
|
||||||
@@ -46,7 +45,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { AppStorage } from '../AppStorage.js'
|
|
||||||
export default {
|
export default {
|
||||||
props: ["wealth", "debt"],
|
props: ["wealth", "debt"],
|
||||||
data () {
|
data () {
|
||||||
@@ -57,8 +55,8 @@
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
updateWealth () {
|
updateWealth () {
|
||||||
AppStorage.updatePlayerWealth(this.edit_value)
|
this.$emit("update", this.edit_value);
|
||||||
.then(_ => this.resetValues());
|
this.resetValues();
|
||||||
},
|
},
|
||||||
resetValues () {
|
resetValues () {
|
||||||
this.edit = false;
|
this.edit = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user