4 changed files with 129 additions and 32 deletions
@ -0,0 +1,103 @@ |
|||||
|
<template> |
||||
|
<q-page padding> |
||||
|
<!-- content --> |
||||
|
PRINT SETTINGS |
||||
|
<q-btn @click="openPrintPage">Open Print Page</q-btn> |
||||
|
<pre> |
||||
|
{{items}} |
||||
|
</pre> |
||||
|
</q-page> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import QRCode from 'qrcode' |
||||
|
|
||||
|
export default { |
||||
|
name: 'PrintSettingsPage', |
||||
|
data () { |
||||
|
return { |
||||
|
items: null, |
||||
|
qrCodes: [] |
||||
|
} |
||||
|
}, |
||||
|
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> |
Loading…
Reference in new issue