Opening a card's Prayer List or Card Deck chooser warms what its print will need (the people groups, and for the packet the sheet's boundaries and engine), so the print after the choice skips those loads; browsing alone loads nothing extra

This commit is contained in:
Doxa Maps 2026-10-03 16:41:12 +00:00
parent 19bce9aa94
commit 48e3d92e32
2 changed files with 18 additions and 0 deletions

View file

@ -112,6 +112,9 @@ const props = defineProps({
// async (item, format) => a map SHEET generated now (packet/posterSheets.js); tried first for the poster
// print and the packet's page 1. usePosterPrints' sheet.
sheet: { type: Function, default: null },
// (item, which) => void: start the loads a print of this item will need, called when the reader OPENS a print
// chooser (the Prayer List packets, the Card Deck sizes): an intent moment before the tap, so the print skips them.
prewarm: { type: Function, default: null },
// Card stock for the deck print, when this wall offers one. See card-render.js
// STOCK — both orientations are available. This is the DEFAULT selection.
cardStock: { type: String, default: 'poker' },
@ -782,6 +785,10 @@ const deckKey = (id, which) => `${id}:${which}`
function toggleDeck(id, ev, which = 'deck') {
const key = deckKey(id, which)
deckOpenFor.value = deckOpenFor.value === key ? null : key
if (deckOpenFor.value === key && props.prewarm) {
const item = (props.items || []).find((x) => x && x.id === id)
if (item) { try { props.prewarm(item, which) } catch (_) { /* a warm-up is only a head start */ } }
}
// Tell the size row how far down to start: the print row's REAL height, which is
// one line in en and two in the long-label locales. Walking up from the clicked
// button to its own .pfs keeps this correct per card rather than per wall.

View file

@ -191,6 +191,16 @@ const countryOnlySheet = (card, format, opts) => sheetForRecord(byId.get(card.id
const stateSheet = makeIndiaStateSheet({
records: recordsFor, assetsBase: () => assetsBase.value, states: () => indiaStates.value, region: INDIA_REGION,
})
// ★ WARM ON INTENT: opening a card's Prayer List or Card Deck chooser starts that card's people groups (the cached
// provider the print then reads) and, for the packet, whose page 1 is the country sheet, the sheet's boundaries and
// engine (warmSheet), so the print after the choice skips those loads. Never on browsing alone, never for a withheld card.
function prewarmPrint(card, which) {
if (!card || card.noGroups || rowsWithheld(card) || posterWithheld(card)) return
const rows = card.indiaState ? (card.slugs && card.slugs.length ? recordsFor({ type: 'pg_slugs', values: card.slugs }) : null)
: (card.iso3 ? recordsFor({ type: 'country', values: [card.iso3] }) : null)
if (rows && rows.catch) rows.catch(() => {})
if (which === 'packet') import('@map/packet/posterSheets.js').then((m) => m.warmSheet && m.warmSheet(assetsBase.value)).catch(() => {})
}
const countrySheet = (card, format, opts) => (card.indiaState ? stateSheet(card, format, opts) : countryOnlySheet(card, format, opts))
// The name table the generated sheet was labelled from, so a packet in another language relabels page 1's
// country names (the same seam the UPG-100 wall passes).
@ -274,6 +284,7 @@ const soonMessage = computed(() => t('messages.countryWallSoon'))
:records="countryRecords"
:card-stocks="true"
:sheet="countrySheet"
:prewarm="prewarmPrint"
:iso3-names="iso3Names"
:map-image="countryMap"
:collapsible="!filtered"