diff --git a/package.json b/package.json index 0d498c802..f464c5d0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rukn-books", - "version": "0.48.0", + "version": "0.48.1", "description": "Simple book-keeping app for everyone", "author": { "name": "Rukn Software", diff --git a/src/pages/POS/POS.vue b/src/pages/POS/POS.vue index 667246559..a5ba5b784 100644 --- a/src/pages/POS/POS.vue +++ b/src/pages/POS/POS.vue @@ -174,6 +174,7 @@ import { getItemVisibility, isLoyaltyProgramExpiredAndMaxed, } from 'models/helpers'; +import { resolveAttachImageSrc } from 'src/utils/attachments'; import { ItemVisibility } from 'src/components/POS/types'; import { POSItem, @@ -742,7 +743,8 @@ export default defineComponent({ filters: filters, })) as Item[]; - this.items = [] as POSItem[]; + const posItems: POSItem[] = []; + const imageLoaders: Array<() => Promise> = []; for (const item of items) { let availableQty = 0; @@ -751,22 +753,42 @@ export default defineComponent({ } if (!item.name) { - return; + continue; } if (hideUnavailable && filters.trackItem && availableQty <= 0) { continue; } - this.items.push({ + const idx = posItems.length; + posItems.push({ availableQty, name: item.name, - image: item?.image as string, rate: item.rate as Money, unit: item.unit as string, hasBatch: !!item.hasBatch, hasSerialNumber: !!item.hasSerialNumber, }); + + const imageValue = item?.image as string | null | undefined; + imageLoaders.push(async () => { + const image = await resolveAttachImageSrc(imageValue, this.fyo); + if (!image) return; + if (this.items[idx]?.name !== item.name) return; + this.items[idx].image = image; + }); } + + // Render items immediately; fill in images as they resolve. + this.items = posItems; + void Promise.all( + imageLoaders.map(async (run) => { + try { + await run(); + } catch { + // best-effort + } + }) + ); }, async selectedReturnInvoice(invoiceName: string) { const salesInvoiceDoc = (await this.fyo.doc.getDoc(