Compare commits
3 Commits
93b26908f1
...
86afee27c5
Author | SHA1 | Date |
---|---|---|
|
86afee27c5 | 3 months ago |
|
57e62912b1 | 3 months ago |
|
25e5dbe94a | 3 months ago |
4 changed files with 170 additions and 32 deletions
@ -0,0 +1,144 @@ |
|||
<template> |
|||
<q-page padding class="main-grid"> |
|||
<q-toolbar class="print-settings"> |
|||
<q-btn @click="openPrintPage">Open Print Page</q-btn> |
|||
<q-input type="number" v-model="itemsW" min="1" label="Colonnes"></q-input> |
|||
<q-input type="number" v-model="itemsH" min="1" label="Lignes"></q-input> |
|||
<q-slider v-model="pageGap" :min="1" label></q-slider> |
|||
</q-toolbar> |
|||
<div class="print-preview"> |
|||
<div class="grid-container" :style="{gridTemplateColumns: `repeat(${itemsW}, 1fr)`, gridTemplateRows: `repeat(${itemsH}, 1fr)`, gap: `${pageGap/10}% ${pageGap*1.414/10}%`, padding: `${pageGap/10}% ${pageGap*1.414/10}%`}"> |
|||
<div v-for="i in (itemsW*itemsH)" :key="i" class="grid-item"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</q-page> |
|||
</template> |
|||
|
|||
<script> |
|||
import QRCode from 'qrcode' |
|||
|
|||
export default { |
|||
name: 'PrintSettingsPage', |
|||
data () { |
|||
return { |
|||
items: null, |
|||
qrCodes: [], |
|||
itemsW: 3, |
|||
itemsH: 4, |
|||
pageGap: 10 |
|||
} |
|||
}, |
|||
computed: { |
|||
urls () { |
|||
// get root url of current page |
|||
let rootUrl = window.location.origin |
|||
return this.items.map(item => { |
|||
return { |
|||
url: `${rootUrl}/item/${item.ref}`, |
|||
name: item.name, |
|||
ref: item.ref |
|||
} |
|||
}) |
|||
} |
|||
}, |
|||
async created () { |
|||
let items = await this.$pb.collection('stock').getList(1, 24, { |
|||
fields: 'ref,name', |
|||
filter: 'deleted = false', |
|||
sort: '-created' |
|||
}) |
|||
this.items = items.items |
|||
}, |
|||
methods: { |
|||
async openPrintPage () { |
|||
for (let url of this.urls) { |
|||
this.qrCodes.push( |
|||
{ qr: await QRCode.toDataURL(url.url, { width: 200, margin: 0, border: 0 }), name: url.name, ref: url.ref } |
|||
) |
|||
} |
|||
const printWindow = window.open('', '_blank') |
|||
const printContent = ` |
|||
<html> |
|||
<head> |
|||
<style> |
|||
@page { size: A4; margin: 1cm; } |
|||
body { margin: 1cm; } |
|||
.grid-container { |
|||
display: grid; |
|||
grid-template-columns: repeat(3, 1fr); |
|||
grid-template-rows: repeat(4, 1fr); |
|||
gap: 10px; |
|||
height: 100%; |
|||
page-break-after: always; |
|||
} |
|||
.grid-item { |
|||
border: 1px solid gray; |
|||
border-radius: 8px; |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-content: center; |
|||
padding: 10px; |
|||
box-sizing: border-box; |
|||
} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
${this.qrCodes.reduce((acc, qr, index) => { |
|||
if (index % 12 === 0) { |
|||
acc.push([]) |
|||
} |
|||
acc[acc.length - 1].push(qr) |
|||
return acc |
|||
}, []).map((group, groupIndex) => ` |
|||
<div class="grid-container"> |
|||
${group.map(qr => ` |
|||
<div class="grid-item"> |
|||
<img src="${qr.qr}"/> |
|||
<span>${qr.name}</span> |
|||
</div> |
|||
`).join('')} |
|||
</div> |
|||
`).join('')} |
|||
</body> |
|||
</html> |
|||
` |
|||
printWindow.document.write(printContent) |
|||
printWindow.document.close() |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.main-grid { |
|||
display: grid; |
|||
gap: 10px; |
|||
height: 100%; |
|||
max-height: 100vh; |
|||
} |
|||
.print-preview { |
|||
height: 50vh; |
|||
aspect-ratio: 1/1.414; |
|||
position: relative; |
|||
} |
|||
.grid-container { |
|||
display: grid; |
|||
gap: 10px; |
|||
height: 100%; |
|||
width:100%; |
|||
page-break-after: always; |
|||
border: 1px solid gray; |
|||
} |
|||
.grid-item { |
|||
border: 1px solid gray; |
|||
border-radius: 8px; |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-content: center; |
|||
padding: 10px; |
|||
box-sizing: border-box; |
|||
} |
|||
</style> |
Loading…
Reference in new issue