Compare commits

...

4 Commits

Author SHA1 Message Date
mcarquigny 361bb0c1ed Many fixes n stuff 2 months ago
mcarquigny 892158fc30 Fix style 2 months ago
mcarquigny 96899a8477 Fix style 2 months ago
mcarquigny 08cf066c88 Fix style 2 months ago
  1. 1
      .eslintrc.cjs
  2. 1
      .gitignore
  3. 2
      README.md
  4. BIN
      public/font/Geist-Black.otf
  5. BIN
      public/font/Geist-Bold.otf
  6. BIN
      public/font/Geist-ExtraBold.otf
  7. BIN
      public/font/Geist-ExtraLight.otf
  8. BIN
      public/font/Geist-Light.otf
  9. BIN
      public/font/Geist-Medium.otf
  10. BIN
      public/font/Geist-Regular.otf
  11. BIN
      public/font/Geist-SemiBold.otf
  12. BIN
      public/font/Geist-Thin.otf
  13. BIN
      public/font/Geist-var.ttf
  14. 2
      quasar.config.js
  15. 2
      src/boot/pocketbase.js
  16. 9
      src/css/app.scss
  17. BIN
      src/css/font/Geist-var.ttf
  18. 170
      src/pages/StockItem.vue

1
.eslintrc.cjs

@ -74,6 +74,7 @@ module.exports = {
'no-unused-vars': 'off', 'no-unused-vars': 'off',
'no-trailing-spaces' : 'off', 'no-trailing-spaces' : 'off',
'vue/multi-word-component-names' : 'off', 'vue/multi-word-component-names' : 'off',
'vue/no-v-text-v-html-on-component' : 'off',
// allow debugger during development only // allow debugger during development only
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'

1
.gitignore

@ -33,3 +33,4 @@ yarn-error.log*
.env.local* .env.local*
pocketbase/pb_data/* pocketbase/pb_data/*
pocketbase/pocketbase.exe

2
README.md

@ -8,7 +8,7 @@ HFSPlay stock management
- [ ] editable categories - [ ] editable categories
- [x] qrcode generation - [x] qrcode generation
- [x] fix search to be persistent - [x] fix search to be persistent
- [ ] fix comments to be more legible - [x] fix comments to be more legible
- [ ] fix comments to allow resolution - [ ] fix comments to allow resolution
- [ ] batch print QR codes - [ ] batch print QR codes
- [x] fix tables pagination - [x] fix tables pagination

BIN
public/font/Geist-Black.otf

Binary file not shown.

BIN
public/font/Geist-Bold.otf

Binary file not shown.

BIN
public/font/Geist-ExtraBold.otf

Binary file not shown.

BIN
public/font/Geist-ExtraLight.otf

Binary file not shown.

BIN
public/font/Geist-Light.otf

Binary file not shown.

BIN
public/font/Geist-Medium.otf

Binary file not shown.

BIN
public/font/Geist-Regular.otf

Binary file not shown.

BIN
public/font/Geist-SemiBold.otf

Binary file not shown.

BIN
public/font/Geist-Thin.otf

Binary file not shown.

BIN
public/font/Geist-var.ttf

Binary file not shown.

2
quasar.config.js

@ -19,8 +19,6 @@ module.exports = configure(function (/* ctx */) {
// --> boot files are part of "main.js" // --> boot files are part of "main.js"
// https://v2.quasar.dev/quasar-cli-vite/boot-files // https://v2.quasar.dev/quasar-cli-vite/boot-files
boot: [ boot: [
'axios',
'pocketbase' 'pocketbase'
], ],

2
src/boot/pocketbase.js

@ -1,6 +1,6 @@
import { boot } from 'quasar/wrappers' import { boot } from 'quasar/wrappers'
import PocketBase from 'pocketbase' import PocketBase from 'pocketbase'
const pb = new PocketBase('http://127.0.0.1:8090') const pb = new PocketBase(process.env.DEV ? 'http://127.0.0.1:8090' : 'https://stock.hfsplay.fr')
export default boot(({ app }) => { export default boot(({ app }) => {
pb.collection('_superusers').authWithPassword( pb.collection('_superusers').authWithPassword(

9
src/css/app.scss

@ -1 +1,10 @@
// app global css in SCSS form // app global css in SCSS form
@font-face {
font-family: geist;
src: url(./font/Geist-var.ttf) format('truetype');
}
// declare a class which applies it
html, body {
font-family: 'geist';
}

BIN
src/css/font/Geist-var.ttf

Binary file not shown.

170
src/pages/StockItem.vue

@ -1,10 +1,12 @@
<template> <template>
<q-page class="q-pa-md"> <q-page class="q-pa-md">
<q-btn @click="generateQRCode" class="float-right" icon="qr_code"></q-btn> <q-btn @click="generateQRCode" class="float-right" icon="qr_code"></q-btn>
<q-chip class="float-right text-white" color="secondary">{{item.ref}}</q-chip> <div class="q-ma-none text-h3 text-weight-bolder row" :class="{'text-faded': !item.name}">
<q-chip v-if="item.deleted" class="float-right q-mr-md" color="red">Supprimé</q-chip> <span class="q-mr-md">{{ item.name || '---- -- ----' }}</span>
<h2 class="q-ma-none" :class="{'text-faded': !item.name}">{{item.name || '---- -- ----'}}</h2> <q-chip square size="lg" class="text-white q-mr-md" color="secondary">{{item.ref}}</q-chip>
<h4 class="q-ma-none q-pb-md text-grey">{{item.type}}</h4> <q-chip square size="lg" v-if="item.deleted" color="red">Supprimé</q-chip>
</div>
<h5 class="q-ma-none q-pb-md text-grey">{{item.type}}</h5>
<q-dialog v-model="showQr"> <q-dialog v-model="showQr">
<q-card style="width: 500px"> <q-card style="width: 500px">
@ -23,19 +25,29 @@
</q-card> </q-card>
</q-dialog> </q-dialog>
<div class="q-py-md"> <div class="row q-col-gutter-xl">
<div class="col-12 col-lg-6">
<div class="row">
<div class="col">
<h4 class="q-ma-none q-pb-md text-light">Informations</h4>
</div>
</div>
<div>
<q-input v-model="item.name" <q-input v-model="item.name"
:disable="item.deleted" :disable="item.deleted"
type="text" type="text"
label="Nom"
outlined color="secondary" outlined color="secondary"
stack-label label="Nom" class="q-mb-md" class="q-mb-md"
@update:model-value="changed = true"/> @update:model-value="changed = true">
</q-input>
<q-input v-model="item.owner" <q-input v-model="item.owner"
:disable="item.deleted" :disable="item.deleted"
outlined color="secondary" stack-label label="Propriétaire" class="q-mb-md" outlined color="secondary" stack-label label="Propriétaire" class="q-mb-md"
@input="changed = true"/> @input="changed = true"/>
<q-field borderless stack-label label="Etat cosmétique" class="q-mb-md"> <q-field borderless stack-label label="Etat cosmétique" class="q-mb-md">
<q-btn-toggle <q-btn-toggle
class="q-mt-sm"
no-caps no-caps
:disable="item.deleted" :disable="item.deleted"
v-model="item.state" v-model="item.state"
@ -54,6 +66,7 @@
</q-field> </q-field>
<q-field borderless stack-label label="Fonctionnel" class="q-mb-md"> <q-field borderless stack-label label="Fonctionnel" class="q-mb-md">
<q-btn-toggle <q-btn-toggle
class="q-mt-sm"
no-caps no-caps
:disable="item.deleted" :disable="item.deleted"
v-model="item.working" v-model="item.working"
@ -69,6 +82,7 @@
</q-field> </q-field>
<q-field borderless stack-label label="En stock" class="q-mb-md"> <q-field borderless stack-label label="En stock" class="q-mb-md">
<q-btn-toggle <q-btn-toggle
class="q-mt-sm"
no-caps no-caps
:disable="item.deleted" :disable="item.deleted"
v-model="item.available" v-model="item.available"
@ -92,6 +106,7 @@
{label: 'Non', value: false} {label: 'Non', value: false}
]" ]"
@input="changed = true" @input="changed = true"
class="q-mt-sm"
/> />
</q-field> </q-field>
<q-input <q-input
@ -100,7 +115,7 @@
@update:model-value="changed = true" @update:model-value="changed = true"
type="textarea" type="textarea"
:max-height="100" :max-height="100"
rows="4" rows="5"
outlined color="secondary" stack-label label="Commentaire" class="q-mb-md" outlined color="secondary" stack-label label="Commentaire" class="q-mb-md"
inverted inverted
/> />
@ -110,27 +125,51 @@
:flat="!changed" :flat="!changed"
>Enregistrer</q-btn> >Enregistrer</q-btn>
</div> </div>
</div>
<br/> <div class="col-12 col-lg-6">
<br/> <div class="row">
<div class="col">
<h4 class="q-ma-none q-pb-md text-light">Historique</h4> <h4 class="q-ma-none q-pb-md text-light">Historique</h4>
<q-timeline color="secondary"> </div>
<!--<q-timeline-entry heading>--> <div class="col text-right">
<!--Historique--> <q-btn outline icon="add" label="ajouter une entrée" color="primary" @click="openHistoryForm()"></q-btn>
<!--</q-timeline-entry>--> </div>
<q-timeline-entry </div>
title="Ajouter une entrée"
side="left" <q-list bordered separator class="rounded-borders">
icon="add" <q-item clickable
color="primary" v-for="event in history"
@click="openHistoryForm()" :key="event.id"
style="cursor:pointer" @click="showHistory = true;selectedHistory = event"
> >
<q-slide-transition> <q-item-section top thumbnail class="q-ml-none" style="margin:-8px 0 -8px -16px">
<div v-show="showHistoryForm"> <img
:src="getImageUrl(event, event.image_file, true)"
alt="photo"
v-if="event.image_file"
/>
</q-item-section>
<q-item-section>
<q-item-label lines="3" v-html="event.text.split('\n').join('</br>')"></q-item-label>
<q-item-label caption><span class="text-capitalize">{{ event.user }}</span></q-item-label>
</q-item-section>
<q-item-section side top>
<q-item-label caption>{{ getDate(event.created) }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</div>
</div>
<q-dialog v-model="showHistoryForm">
<q-card>
<q-card-section>
<div class="text-h6">Ajouter une entrée</div>
</q-card-section>
<q-card-section>
<q-input <q-input
v-model="pendingHistory" v-model="pendingHistory"
autofocus
type="textarea" type="textarea"
label="Description" label="Description"
:max-height="100" :max-height="100"
@ -138,10 +177,6 @@
invertedd invertedd
color="secondary" color="secondary"
/> />
<!-- <q-input label="Date"-->
<!-- v-model="pendingHistoryDate"-->
<!-- type="datetime"-->
<!-- format24h />-->
<br/> <br/>
<q-uploader <q-uploader
:accept="'.jpg,.png'" :accept="'.jpg,.png'"
@ -152,48 +187,40 @@
no-thumbnails no-thumbnails
hide-upload-btn hide-upload-btn
flat flat
bordered
color="secondary" color="secondary"
/> />
<br/> <br/>
<q-btn flat color="faded" @click.stop="showHistoryForm = false">Annuler</q-btn> </q-card-section>
<q-separator></q-separator>
<q-card-actions align="right">
<q-btn flat color="grey" @click.stop="showHistoryForm = false">Annuler</q-btn>
<q-btn flat color="primary" @click.stop="addHistory()">Ok</q-btn> <q-btn flat color="primary" @click.stop="addHistory()">Ok</q-btn>
</div> </q-card-actions>
</q-slide-transition> </q-card>
</q-timeline-entry> </q-dialog>
<q-timeline-entry
v-for="event in history.slice().reverse()" <q-dialog v-model="showHistory">
:key="event.id" <q-card>
:subtitle="getDate(event.date)" <img :src="getImageUrl(selectedHistory, selectedHistory.image_file)"
:title="event.user"
side="left"
>
<div>
<q-icon name="format_quote"
color="light"
size="2rem"
/>
{{ event.text }}
<q-icon name="format_quote"
color="light"
size="2rem"
/>
</div>
<q-img :src="getImageUrl(event, event.image_file)"
alt="photo" alt="photo"
v-if="event.image_file" v-if="selectedHistory.image_file"
class="q-py-md"
style="max-height:300px;max-width:300px"
:fit="'contain'"
/> />
<br/> <q-card-section>
<q-btn flat <div v-html="selectedHistory.text.split('\n').join('</br>')"></div>
:disable="item.deleted" <div class="text-caption text-grey">
icon="delete" <span class="text-capitalize">{{ selectedHistory.user }}</span>
label="Supprimer cette entrée" <q-separator vertical />
@click="removeHistory(event)" <span>{{ getDate(selectedHistory.created) }}</span>
/> </div>
</q-timeline-entry> </q-card-section>
</q-timeline> <q-card-actions align="right">
<q-btn flat color="red" @click.stop="removeHistory(selectedHistory)">Supprimer</q-btn>
<q-btn flat color="grey" @click.stop="showHistory = false;selectedHistory = null">Fermer</q-btn>
</q-card-actions>
</q-card>
</q-dialog>
</q-page> </q-page>
</template> </template>
@ -214,7 +241,9 @@ export default {
username: null, username: null,
qrCodeDataUrl: null, qrCodeDataUrl: null,
showQr: false, showQr: false,
item: {} item: {},
showHistory: false,
selectedHistory: null
} }
}, },
computed: { computed: {
@ -335,8 +364,8 @@ export default {
console.error('Error compressing image:', error) console.error('Error compressing image:', error)
} }
}, },
getImageUrl (history, image) { getImageUrl (history, image, thumb = false) {
return this.$pb.files.getURL(history, image, { thumb: '300x300f' }) return this.$pb.files.getURL(history, image, { thumb: thumb ? '300x300f' : null })
}, },
loadItem () { loadItem () {
let item = this.stock.find(item => { let item = this.stock.find(item => {
@ -367,5 +396,8 @@ export default {
} }
</script> </script>
<style> <style scoped>
.q-field__label{
padding-bottom:16px !important;
}
</style> </style>

Loading…
Cancel
Save