Compare commits

...

2 commits

Author SHA1 Message Date
Doxa Maps
0f9f29d4f4 Merge the pilot (development 3a6d392a1) into the UPG-100 pin-hint fix 2026-10-03 12:27:46 +00:00
Doxa Maps
0ef664c75a UPG-100 batch mode: the first selection dismisses the pin hint, which covered the HUD's bottom row
PinHint ("Tap a coloured dot…") dismisses on uiStore's pin selection, or on a
'dxmaps:pin-selected' event from inside the map's root, its documented contract
for a map with its own selection. A batch tap selects a territory, not a
uiStore pin, so the pill stayed up and, at 390, sat over the bottom of the HUD's
Copy / Export CSV / Clear row. A hit-test across those buttons found the pill.
The first territory selected now sends that event.

Measured at 390 (Android UA), en + ar, one territory selected. Before: the pill
was over Copy and Export CSV at 85% of their height. After: no pill at +1.2 s or
at +15 s, and every hit-test point on the row is the button itself.
check:batch-selection-export pins the dispatch.
2026-10-01 14:09:12 +00:00
2 changed files with 10 additions and 0 deletions

View file

@ -275,6 +275,8 @@ const wired = {
&& vue.indexOf('class="upg-hud-flash"') > 0 && vue.indexOf('class="upg-hud-flash"') < vue.indexOf('class="upg-hud-actions"') && vue.indexOf('class="upg-hud-flash"') > 0 && vue.indexOf('class="upg-hud-flash"') < vue.indexOf('class="upg-hud-actions"')
&& !/\.upg-hud-flash\{[^}]*display:\s*none/.test(vue) && !/@media[^{]*\{[^}]*\.upg-hud-flash\{[^}]*display:\s*none/.test(vue) && !/\.upg-hud-flash\{[^}]*display:\s*none/.test(vue) && !/@media[^{]*\{[^}]*\.upg-hud-flash\{[^}]*display:\s*none/.test(vue)
})(), })(),
// The first batch selection dismisses PinHint through its documented event (it sat over the HUD's bottom row at 390).
'the first batch selection dismisses the pin hint': /watch\(selCount, \(n, was\) => \{\s*\n\s*if \(n > 0 && !was && mapEl\.value\) mapEl\.value\.dispatchEvent\(new CustomEvent\('dxmaps:pin-selected', \{ bubbles: true \}\)\)/.test(vue),
'the regroup warning on Copy': /const warn = regroupable\(sel\) \? '' : t\('upgMap\.copyNotRegroupable'\)/.test(vue), 'the regroup warning on Copy': /const warn = regroupable\(sel\) \? '' : t\('upgMap\.copyNotRegroupable'\)/.test(vue),
// The packet / card-deck title goes through selectionTitleNames (arm A6 proves it), with the keyed empty case. // The packet / card-deck title goes through selectionTitleNames (arm A6 proves it), with the keyed empty case.
'the title names come from selectionTitleNames': /const names = selectionTitleNames\(zoneNames, selectedTerritories\.value, from,\s*\n\s*\(\) => keyedError\('wall\.hud\.noRecords'/.test(vue) 'the title names come from selectionTitleNames': /const names = selectionTitleNames\(zoneNames, selectedTerritories\.value, from,\s*\n\s*\(\) => keyedError\('wall\.hud\.noRecords'/.test(vue)

View file

@ -239,6 +239,14 @@ const selectedTerritories = ref([]) // [{ key, name, count, kind }]
const selTotal = computed(() => // live running UUPG total (null counts = 0) const selTotal = computed(() => // live running UUPG total (null counts = 0)
selectedTerritories.value.reduce((a, t) => a + (Number(t.count) || 0), 0)) selectedTerritories.value.reduce((a, t) => a + (Number(t.count) || 0), 0))
const selCount = computed(() => selectedTerritories.value.length) const selCount = computed(() => selectedTerritories.value.length)
// ★ THE BATCH SELECTION IS THIS MAP'S OWN SELECTION GESTURE. PinHint ("Tap a coloured dot…") dismisses on uiStore's
// pin selection, or on a 'dxmaps:pin-selected' event from inside the map's root: its documented contract for a map
// with its own selection. A batch tap selects a TERRITORY, not a uiStore pin, so the pill stayed up and, at 390, sat
// over the HUD's bottom button row (Copy / Export CSV / Clear). The first territory selected dismisses it, as a
// pin tap does; before that the HUD has no button rows to cover.
watch(selCount, (n, was) => {
if (n > 0 && !was && mapEl.value) mapEl.value.dispatchEvent(new CustomEvent('dxmaps:pin-selected', { bubbles: true }))
})
const copyFlash = ref('') // transient "Copied!" / "Copy failed" label const copyFlash = ref('') // transient "Copied!" / "Copy failed" label
let countryNameMap = null // iso3→label, built from live records let countryNameMap = null // iso3→label, built from live records