Files
gyoza2/src/layouts/DefaultLayout.vue
2026-07-26 00:23:28 +02:00

249 lines
7.1 KiB
Vue

<template>
<q-layout v-if="!loading"> <!-- Be sure to play with the Layout demo on docs -->
<q-header class="no-shadow text-center">
<q-toolbar color="secondary" inverted>
<q-btn
flat
size="18px"
icon="o_menu"
color="secondary"
@click="leftDrawer = !leftDrawer"
/>
<q-toolbar-title class="text-center">
<div class="q-px-md" @click="$router.push('/dashboard')" style="display:inline-block;cursor:pointer">
<img src="~assets/gyoza.svg" style="height:36px">
</div>
</q-toolbar-title>
<q-btn flat class="no-pointer-events" color="secondary">{{username}}</q-btn>
<q-btn
flat
size="18px"
icon="o_logout"
@click="unsetUser()"
color="secondary"
/>
</q-toolbar>
</q-header>
<q-drawer
side="left"
v-model="leftDrawer"
>
<q-list highlight
no-border
inset-separator
>
<q-item-label header>Catégories</q-item-label>
<q-item v-for="category in categories"
:key="category.code"
:to="'/category/' + category.code"
>
<q-item-section>{{ category.name }}</q-item-section>
<q-item-section side>
<q-chip square
dense
color="secondary"
text-color="white"
>{{ counters[category.name] }}</q-chip>
</q-item-section>
<q-item-section side>
<q-btn round
flat
size="md"
icon="o_add"
:title="`Ajouter un(e) ${category.name}`"
@click.stop.prevent="addItem(category)"
>
</q-btn>
</q-item-section>
</q-item>
<!--<q-item-separator />-->
<!--<q-list-header>Previous chats</q-list-header>-->
<!--<q-item>-->
<!--<q-item-side avatar="statics/guy-avatar.png" />-->
<!--<q-item-main label="Jack Doe" />-->
<!--</q-item>-->
<!-- PRINT STUFF-->
<q-separator/>
<q-item-label header>Utilitaires</q-item-label>
<q-item :to="'/tasks'"
>
<q-item-section>Tâches</q-item-section>
<q-item-section side>
<q-icon name="o_task"></q-icon>
</q-item-section>
</q-item>
<q-item :to="'/print-settings'"
disable
>
<q-item-section>Impression</q-item-section>
<q-item-section side>
<q-icon name="o_print"></q-icon>
</q-item-section>
</q-item>
</q-list>
</q-drawer>
<q-page-container>
<!-- This is where pages get injected -->
<router-view />
</q-page-container>
</q-layout>
</template>
<script>
import { QSpinnerBars, date } from 'quasar'
export default {
name: 'DefaultLayout',
data () {
return {
leftDrawer: true,
loading: false,
dataRef: null
}
},
computed: {
categories () {
return this.$store.state.core.firebase.categories
},
counters () {
let stock = this.$store.state.core.firebase.stock
let result = {}
if (!this.categories || !stock) return result
for (let cat of this.categories) {
let catStock = stock.filter(item => { return item.type === cat.name })
let lastRef = (catStock[catStock.length - 1] || {}).ref
let ref = lastRef ? parseInt(lastRef.split('-')[1]) : 0
result[cat.name] = ref
}
return result
},
username () {
return this.$store.state.core.username
}
},
created () {
this.loading = true
this.$q.loading.setDefaults({
spinner: QSpinnerBars,
message: 'OK, laisse moi juste le temps de charger...',
messageColor: 'white',
spinnerSize: 150, // in pixels
spinnerColor: 'white',
customClass: 'bg-secondary',
delay: 0
})
this.$q.loading.show()
this.loadAppData()
// Realtime reactivity to DB changes
// TODO: Fix this
// this.dataRef = Firebase.database().ref()
// this.dataRef.on('value', (snapshot) => {
// this.$store.dispatch('core/loadAppData')
// })
},
mounted () {
let username = this.$q.localStorage.getItem('username')
console.log('user', username)
if (!username) {
this.$q.dialog({
title: 'Hey salut !',
message: 'Moi c\'est Gyōza. C\'est quoi ton pseudo ?',
prompt: {
model: '',
type: 'text' // optional
},
cancel: false,
preventClose: true,
color: 'secondary'
}).onOk(username => {
this.$q.localStorage.set('username', username)
this.$store.commit('core/setUsername', username)
this.$q.notify({
message: `Enchanté ${username} !`,
color: 'green',
avatar: '/gyoza.svg',
timeout: 2000
})
})
} else {
this.$store.commit('core/setUsername', username)
}
},
methods: {
loadAppData () {
this.$q.loading.show()
return this.$store.dispatch('core/loadAppData').then(data => {
console.log(data)
this.$q.loading.hide()
this.loading = false
})
},
unsetUser () {
this.$q.dialog({
title: 'Une petite seconde...',
message: 'Tu vas être déconnecté(e) là. C\'est vraiment ça que tu veux ?',
color: 'primary',
ok: 'Bah oui, FDP',
cancel: 'Ah non en fait'
})
.onOk(() => {
this.$q.localStorage.remove('username')
this.$q.localStorage.remove('credentials')
this.$router.push('/')
})
},
async addItem (category) {
this.$q.loading.show()
// Get next short id
let shortId = await this.$store.dispatch('core/getNextShortId')
let newItem = {
available: true,
comment: '',
name: '',
owner: 'HFS',
ref: null,
state: null,
type: category.name,
system: null,
short_id: shortId
}
newItem.ref = `${category.code}-${String(this.counters[category.name] + 1).padStart(4, '0')}`
await this.$store.dispatch('core/addToCollection', {
collection: 'stock',
data: newItem
})
// Insert history record
await this.$store.dispatch('core/addToCollection', {
collection: 'history',
data: {
ref: newItem.ref,
text: 'Entrée en stock',
user: this.$store.state.core.username,
timestamp: Date.now()
}
})
await this.loadAppData()
// Process to new item
this.$q.loading.hide()
this.$q.dialog({
title: `Item "${category.name}" créé`,
message: 'Tu veux aller éditer les détails de cet item ?',
color: 'primary',
ok: 'Oui, STP',
cancel: 'Osef'
})
.onOk(() => {
this.$router.push(`/item/${newItem.ref}`)
})
}
}
}
</script>
<style>
</style>