Browse Source

Add inventory sorting / grouping; add empty button asset;

master
Nero Ignis 3 years ago
parent
commit
2fd2e45b65
  1. BIN
      src/assets/gui/blank.png
  2. 90
      src/components/InventoryView.vue
  3. 51
      src/store/index.js

BIN
src/assets/gui/blank.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

90
src/components/InventoryView.vue

@ -1,6 +1,71 @@
<template> <template>
<div class="container container-fluid" id="main-container"> <div class="container container-fluid" id="main-container">
<div class="row"> <div class="row">
<div class="col-12">
<div class="float-end" id="sort-buttons">
<div class="pixel-border-static" v-on:click="$store.commit('toggleGrouping')">
Group by category
</div>
<div class="pixel-border-static" v-on:click="$store.commit('sortInventory')">
Sort {{ $store.state.inventorySortDesc ? 'Z-A' : 'A-Z' }}
</div>
</div>
</div>
<template v-if="$store.state.groupInventory">
<template v-if="$store.getters.getSeedsInInventory.length > 0">
<div class="col-12 inventory-header">
<h5>Seeds</h5>
</div>
<div class="col-6"
v-for="item in $store.getters.getSeedsInInventory"
v-bind:key="item"
data-bs-dismiss="modal">
<div :class="'inventory-item ' + getFrameClass(item.type)">
<div class="float-end">
<img :src="item.icon" :alt="item.name" class="item-icon">
</div>
{{ item.name }}<br/>
x{{ item.quantity }}
</div>
</div>
</template>
<template v-if="$store.getters.getFieldProductsInInventory.length > 0">
<div class="col-12 inventory-header">
<h5>Field products</h5>
</div>
<div class="col-6"
v-for="item in $store.getters.getFieldProductsInInventory"
v-bind:key="item"
data-bs-dismiss="modal">
<div :class="'inventory-item ' + getFrameClass(item.type)">
<div class="float-end">
<img :src="item.icon" :alt="item.name" class="item-icon">
</div>
{{ item.name }}<br/>
x{{ item.quantity }}
</div>
</div>
</template>
<template v-if="$store.getters.getAnimalProductsInInventory.length > 0">
<div class="col-12 inventory-header">
<h5>Animal products</h5>
</div>
<div class="col-6"
v-for="item in $store.getters.getAnimalProductsInInventory"
v-bind:key="item"
data-bs-dismiss="modal">
<div :class="'inventory-item ' + getFrameClass(item.type)">
<div class="float-end">
<img :src="item.icon" :alt="item.name" class="item-icon">
</div>
{{ item.name }}<br/>
x{{ item.quantity }}
</div>
</div>
</template>
</template>
<template v-else>
<div class="col-6" <div class="col-6"
v-for="item in $store.getters.getInventoryWithItemData" v-for="item in $store.getters.getInventoryWithItemData"
v-bind:key="item" v-bind:key="item"
@ -13,8 +78,9 @@
x{{ item.quantity }} x{{ item.quantity }}
</div> </div>
</div> </div>
</template>
<div v-if="$store.state.inventory.length === 0"> <div v-if="$store.state.inventory.length === 0">
You don't have any items yet. Your inventory is empty.
</div> </div>
</div> </div>
</div> </div>
@ -36,6 +102,7 @@ export default {
<style scoped> <style scoped>
#main-container { #main-container {
margin-top: 5em; margin-top: 5em;
margin-bottom: 5em;
} }
.item-icon { .item-icon {
@ -48,4 +115,25 @@ export default {
background-color: white; background-color: white;
border-radius: 20px; border-radius: 20px;
} }
#sort-buttons {
color: white;
margin-bottom: 1em;
}
#sort-buttons img {
margin-left: 0.3em;
}
.inventory-header {
color: white;
}
.pixel-border-static {
margin-left: 0.3em;
display: inline-block;
background-color: white;
border-radius: 20px;
color: black;
}
</style> </style>

51
src/store/index.js

@ -26,6 +26,8 @@ export default createStore({
weekdayNr: null weekdayNr: null
}, },
inventory: [], inventory: [],
inventorySortDesc: true,
groupInventory: false,
cropField: [], cropField: [],
selections: { selections: {
field: null, field: null,
@ -46,7 +48,7 @@ export default createStore({
item.quantity = inventoryItem.quantity; item.quantity = inventoryItem.quantity;
return item; return item;
}); }) ?? [];
}, },
getSeedsInInventory(state) { getSeedsInInventory(state) {
return state.inventory.filter((inventoryItem) => { return state.inventory.filter((inventoryItem) => {
@ -56,7 +58,27 @@ export default createStore({
item.quantity = inventoryItem.quantity; item.quantity = inventoryItem.quantity;
return item; return item;
}); }) ?? [];
},
getFieldProductsInInventory(state) {
return state.inventory.filter((inventoryItem) => {
return inventoryItem.type === ItemTypes.FieldProducts && inventoryItem.quantity > 0;
}).map((inventoryItem) => {
let item = ItemService.getItemByID(inventoryItem.id);
item.quantity = inventoryItem.quantity;
return item;
}) ?? [];
},
getAnimalProductsInInventory(state) {
return state.inventory.filter((inventoryItem) => {
return inventoryItem.type === ItemTypes.AnimalProducts && inventoryItem.quantity > 0;
}).map((inventoryItem) => {
let item = ItemService.getItemByID(inventoryItem.id);
item.quantity = inventoryItem.quantity;
return item;
}) ?? [];
} }
}, },
mutations: { mutations: {
@ -77,7 +99,7 @@ export default createStore({
generateField(state) { generateField(state) {
let fieldIndex = 0; let fieldIndex = 0;
while(state.cropField.length < state.player.unlocked.fields) { while (state.cropField.length < state.player.unlocked.fields) {
fieldIndex++; fieldIndex++;
state.cropField.push({ state.cropField.push({
@ -86,7 +108,7 @@ export default createStore({
} }
}, },
selectField(state, id) { selectField(state, id) {
console.debug('select field with id '+id) console.debug('select field with id ' + id)
state.selections.field = id; state.selections.field = id;
}, },
plantSeed(state, seed) { plantSeed(state, seed) {
@ -138,7 +160,7 @@ export default createStore({
if (purchasePrice > state.player.money) { if (purchasePrice > state.player.money) {
iziToast.error({ iziToast.error({
title: "Not enough money to buy "+props.quantity+" of "+props.item.name title: "Not enough money to buy " + props.quantity + " of " + props.item.name
}); });
return false; return false;
} }
@ -151,7 +173,7 @@ export default createStore({
state.player.money -= purchasePrice; state.player.money -= purchasePrice;
iziToast.success({ iziToast.success({
title: 'Purchased '+props.item.name+(props.quantity > 1 ? ' ('+props.quantity+')' : '') title: 'Purchased ' + props.item.name + (props.quantity > 1 ? ' (' + props.quantity + ')' : '')
}); });
}, },
addItemToInventory(state, props = {item: Object, quantity: Number}) { addItemToInventory(state, props = {item: Object, quantity: Number}) {
@ -203,6 +225,23 @@ export default createStore({
}, },
alphaAddMoney(state) { alphaAddMoney(state) {
state.player.money = Number(state.player.money) + Number(1_000); state.player.money = Number(state.player.money) + Number(1_000);
},
sortInventory(state) {
state.inventory = state.inventory.sort((a, b) => {
let aItem = ItemService.getItemByID(a.id);
let bItem = ItemService.getItemByID(b.id);
if (state.inventorySortDesc === true) {
return (bItem.name > aItem.name) ? 1 : -1;
} else {
return (aItem.name < bItem.name) ? -1 : 1;
}
})
state.inventorySortDesc = !state.inventorySortDesc;
},
toggleGrouping(state) {
state.groupInventory = !state.groupInventory;
} }
}, },
actions: {}, actions: {},

Loading…
Cancel
Save