diff --git a/library/components/poster/types/countryPosterType.js b/library/components/poster/types/countryPosterType.js index 5c613bff8..bbe72d2b5 100644 --- a/library/components/poster/types/countryPosterType.js +++ b/library/components/poster/types/countryPosterType.js @@ -8,7 +8,7 @@ * a country with no region is 'other'. */ import data from '@map/data/country-posters.json' -import { makeCountrySheet, sheetWithheld } from '@map/packet/countrySheet.js' +import { makeCountrySheet, largeSheet, posterWithheld, rowsWithheld } from '@map/packet/countrySheet.js' import { createPeopleGroupRecords } from '@map/lists/peopleGroupRecords.js' import { keyedError } from '@map/i18n/keyedError.js' import { countryName } from '@map/utils/countryName.js' @@ -38,11 +38,11 @@ export default { const sheet = makeCountrySheet({ records: recordsFor, assetsBase, countries: data.countries }) const byId = new Map(data.countries.map((c) => [c.id, c])) return { - // a withheld whole-country poster withholds its list, packet and cards too (countrySheet.js WITHHELD) - records: (c) => (sheetWithheld(c) ? Promise.reject(keyedError('messages.countryPosterTooMany', TOO_MANY)) : recordsFor({ type: 'country', values: [c.iso3] })), + // a whole country's withheld rows (countrySheet.js WITHHELD: India's list, packet and cards) say so, unfetched + records: (c) => (rowsWithheld(c) ? Promise.reject(keyedError('messages.countryPosterTooMany', TOO_MANY)) : recordsFor({ type: 'country', values: [c.iso3] })), // the sheet gets the data's own record (English, the series index by id), as on the wall sheet: (card, format) => sheet(byId.get(card.id) || card, format), - unsupported: (c) => (sheetWithheld(c) || c.unsupportedReason ? t('messages.countryPosterTooMany') : null), + unsupported: (c) => (posterWithheld(c) || (c.unsupportedReason && !largeSheet(c)) ? t('messages.countryPosterTooMany') : null), unit: 'UPG', itemCountKey: 'regions.countryCount', eventName: 'doxa-country-posters:show-on-map', downloadPrefix: 'doxa-country', cardStocks: true, } }, diff --git a/library/packet/countrySheet.js b/library/packet/countrySheet.js index 73ae1d46e..4d05f8c51 100644 --- a/library/packet/countrySheet.js +++ b/library/packet/countrySheet.js @@ -79,7 +79,8 @@ export function seriesFor(countries, item) { * packet and cards are offered on a desktop or laptop only (a phone cannot draw a sheet that big). * The data (country-posters.json) still records why no PAPER sheet fits; this table is what prints instead. */ -export const LARGE_SHEETS = { IND: { format: '60x96', formats: ['60x96', '66x66', '36x60'], desktopOnly: true } } +// India: 5 x 8 ft (60x96) ONLY, the size its whole-country layout is built and tuned for. +export const LARGE_SHEETS = { IND: { format: '60x96', formats: ['60x96'], desktopOnly: true } } const largeOf = (item) => (item && LARGE_SHEETS[String(item.iso3 || '').toUpperCase()]) || null /** * ★ WITHHELD: a whole-country poster that is NOT shipped yet, though the renderer can draw it. India's 855 groups do @@ -89,9 +90,21 @@ const largeOf = (item) => (item && LARGE_SHEETS[String(item.iso3 || '').toUpperC * packet and cards with the same sentence. India's STATE and union-territory posters are separate cards * (`indiaState`) and are not affected. check:country-sheet-one-path fails if India's poster comes back unannounced. */ -export const WITHHELD = new Set(['IND']) -export function sheetWithheld(item) { return Boolean(item && !item.indiaState && WITHHELD.has(String(item.iso3 || '').toUpperCase())) } -export function largeSheet(item) { return sheetWithheld(item) ? null : largeOf(item) } +// WHAT of a whole country is withheld: its POSTER, and/or its ROWS (its prayer list, packet and cards). +// India's whole-country poster is withheld EVERYWHERE BY DEFAULT (it is not released yet). It prints only in an +// explicit PREVIEW context: the Vite DEV server (the pilot's Plugin Studio, where it is reviewed), whose element +// bootstrap sets globalThis.DXM_PREVIEW_UNRELEASED. The read is gated on import.meta.env.DEV too, so every BUILT bundle +// compiles it away: no page, embed or console can set a global and print it from production. Never by a URL +// parameter. Its rows (about a thousand pages) stay withheld everywhere. +export const WITHHELD = { IND: { poster: true, rows: true, preview: true } } +export const previewUnreleased = () => Boolean(import.meta.env && import.meta.env.DEV && globalThis.DXM_PREVIEW_UNRELEASED === true) +const withheldOf = (item) => (item && !item.indiaState && WITHHELD[String(item.iso3 || '').toUpperCase()]) || null +// No caller can open it: the preview state is read HERE, never passed in (so a built bundle cannot print it). +export function posterWithheld(item) { const w = withheldOf(item); return Boolean(w?.poster) && !(w.preview && previewUnreleased()) } +export function rowsWithheld(item) { return Boolean(withheldOf(item)?.rows) } +/** The poster's withholding (the name Poster Design reads). */ +export function sheetWithheld(item) { return posterWithheld(item) } +export function largeSheet(item) { return posterWithheld(item) ? null : largeOf(item) } // The sheet format a request gets: a large-sheet country prints at the large size ASKED FOR when it has one (66x66, // 36x60), else at its default (60x96); a packet's page 1 stays a page; every other country gets exactly what it asked. export function sheetFormatFor(item, format) { @@ -115,7 +128,7 @@ export function makeCountrySheet({ records, assetsBase, countries = null }) { return async function countrySheet(item, format) { const iso3 = item && item.iso3 if (!iso3) return '' // a selection or a row without a country: no sheet - if (sheetWithheld(item)) return '' // withheld (above): nothing is fetched or drawn + if (posterWithheld(item)) return '' // a withheld poster (above): nothing is fetched or drawn // Lazy, like the zone sheet: the generator and the boundary loader are only pulled when a // reader actually prints, so they stay out of every wall's initial download. const { generateCountrySheet } = await import('@map/packet/posterSheets.js') diff --git a/plugin-designs/country-posters/country-poster-wall.vue b/plugin-designs/country-posters/country-poster-wall.vue index b86b94c6c..77617bbbc 100644 --- a/plugin-designs/country-posters/country-poster-wall.vue +++ b/plugin-designs/country-posters/country-poster-wall.vue @@ -44,7 +44,7 @@ import { getRuntimeLocale, detectLocale, tStatic } from '@map/i18n/index.js' // library/. Generated by library/scripts/posters/emit-countries.mjs, which now writes there. import data from '@map/data/country-posters.json' import { resolveAssetsBase } from '@map/utils/embedBase.js' -import { makeCountrySheet, largeSheet, sheetWithheld } from '@map/packet/countrySheet.js' +import { makeCountrySheet, largeSheet, posterWithheld, rowsWithheld } from '@map/packet/countrySheet.js' import { isPhonePrint } from '@map/composables/printInPlace.js' import { keyedError } from '@map/i18n/keyedError.js' // India's states and union territories: the shared table (fetched when the wall shows them) and their sheet. @@ -170,7 +170,7 @@ const desktopOnly = () => Promise.reject(keyedError('poster.phoneLimitAll', 'Thi // A WITHHELD whole-country poster (countrySheet.js WITHHELD: India) withholds its list, packet and cards too, with // the same sentence the card shows (about a thousand pages, offered when the poster is). const withheld = () => Promise.reject(keyedError('messages.countryPosterTooMany', 'Too many people groups to fit on one poster legibly — a solution is in progress.')) -const countryRecords = (c) => (sheetWithheld(c) ? withheld() : phoneBlocked(c) ? desktopOnly() : c.indiaState +const countryRecords = (c) => (rowsWithheld(c) ? withheld() : phoneBlocked(c) ? desktopOnly() : c.indiaState ? (c.slugs.length ? recordsFor({ type: 'pg_slugs', values: c.slugs }) : Promise.resolve([])) : recordsFor({ type: 'country', values: [c.iso3] })) // ★ GENERATED AT THE CLICK, through the ONE shared path (@map/packet/countrySheet.js, which the Regions @@ -244,7 +244,7 @@ const collapsedBy = (sec) => sec.total < 60 // unsupportedReason is an English note (and a flag), not display text. The card already states the // count above it, so the sentence needs no number and no plural agreement. // A requested country with no poster at all says so in regions-list.vue's words (the regions catalogue). -const unsupported = (c) => (c.noGroups ? t('countryPosters.indiaStateNoGroups') : c.noPoster ? tRegions('No poster has been generated for this country yet.') : sheetWithheld(c) ? t('messages.countryPosterTooMany') : phoneBlocked(c) ? t('poster.phoneLimitAll') : c.unsupportedReason && !largeSheet(c) ? t('messages.countryPosterTooMany') : null) +const unsupported = (c) => (c.noGroups ? t('countryPosters.indiaStateNoGroups') : c.noPoster ? tRegions('No poster has been generated for this country yet.') : posterWithheld(c) ? t('messages.countryPosterTooMany') : phoneBlocked(c) ? t('poster.phoneLimitAll') : c.unsupportedReason && !largeSheet(c) ? t('messages.countryPosterTooMany') : null) // ★ THROUGH THE CATALOGUE, like the UPG-100 wall: the heading, the tag, the intro and the counts read // in the page's language. The intro keeps its one emphasis as three plain keys (A, the emphasis, B) diff --git a/plugin-designs/country-posters/country-posters-mfe.vue b/plugin-designs/country-posters/country-posters-mfe.vue index ce0b2922c..88bc2dd64 100644 --- a/plugin-designs/country-posters/country-posters-mfe.vue +++ b/plugin-designs/country-posters/country-posters-mfe.vue @@ -34,6 +34,8 @@ import { ref, computed, inject, onMounted, onBeforeUnmount } from 'vue' import { buildPaneColumn, PANE_GRID_STYLES } from '@map/layouts/pane-wrapper/pane-wrapper.js' import { useShadowStyles } from '@map/composables/useShadowStyles.js' import ViewSelect from '@map/components/ViewSelect.vue' +import { countryName } from '@map/utils/countryName.js' +import { getRuntimeLocale, detectLocale } from '@map/i18n/index.js' import ShareButton from '@map/components/map-controls/ShareButton.vue' import { useI18n } from 'vue-i18n' import enTabs from '@map/i18n/locales/en/tabs.json' @@ -68,13 +70,21 @@ const spec = computed(() => ({ // strip desynchronises from the scroll column. panes: [ { id: 'wall', label: t('tabs.countryPosters'), at: [0, 0], config: { profile: 'country-poster-wall' } }, - { id: 'map', label: t('tabs.map'), at: [1, 0], config: { profile: 'countries-map' } }, + // the same DEV-gated read as countrySheet.js previewUnreleased(), INLINE so every build drops the pane entirely + ...(import.meta.env && import.meta.env.DEV && globalThis.DXM_PREVIEW_UNRELEASED === true ? [INDIA_PANE] : []), + { id: 'map', label: t('tabs.map'), at: [2, 0], config: { profile: 'countries-map' } }, ], // The switcher lives in this element's own header, so the layout's "… below ↓" // pill would be a second, redundant control (same call upg-100-mfe makes). paneHint: false, })) +// INDIA: the whole-India poster (66x66 by default) on its own tab, the same wall filtered to India, labelled with +// India's own name in the reader's language (Intl). Shown ONLY in a preview context (countrySheet.js +// previewUnreleased(): the Plugin Studio on the pilot), because the poster is not released; everywhere else the tab +// is absent and India's card keeps the withheld sentence. +const INDIA_PANE = { id: 'india', label: countryName('IND', getRuntimeLocale() || detectLocale() || 'en') || 'India', at: [1, 0], config: { profile: 'country-poster-wall', countries: ['IND'] } } + const stage = ref(null) // DERIVED from the pane order, never a hardcoded id — the same trap upg-100-mfe // records: `ref('map')` silently became wrong the moment the panes were reordered. diff --git a/plugin-designs/country-posters/scripts/check-country-sheet-one-path.mjs b/plugin-designs/country-posters/scripts/check-country-sheet-one-path.mjs index d67c42897..091eab838 100644 --- a/plugin-designs/country-posters/scripts/check-country-sheet-one-path.mjs +++ b/plugin-designs/country-posters/scripts/check-country-sheet-one-path.mjs @@ -17,14 +17,27 @@ // absent from the data gets no series. // // Exit 0 pass, 1 fail, 75 not measured. `--self-test` plants each defect and requires its arm to fail. -import { readFileSync, readdirSync, statSync } from 'node:fs' +import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs' import { join, relative, dirname } from 'node:path' import { fileURLToPath } from 'node:url' import { parse as parseSfc, babelParse } from '@vue/compiler-sfc' const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..') const PD = join(ROOT, 'plugin-designs') -const KNOWN_CALLERS = ['plugin-designs/country-posters/country-poster-wall.vue', 'plugin-designs/regions-dashboard/regions-list.vue'] +const KNOWN_CALLERS = ['plugin-designs/country-posters/country-poster-wall.vue'] +// The Regions list may draw a country sheet itself OR delegate to (whose library type draws it). +// If it still calls makeCountrySheet it must pass arms F and G like the wall; either way the library type must. +const REGIONS_LIST = 'plugin-designs/regions-dashboard/regions-list.vue' +const COUNTRY_TYPE = 'library/components/poster/types/countryPosterType.js' +// ARM H: the library 'country' type (the element's caller) withholds like the wall: rows reject with the sentence, +// a withheld poster's card shows the sentence. +export function armH(typeSrc) { + const fails = [] + if (!/makeCountrySheet\(/.test(typeSrc)) fails.push(`${COUNTRY_TYPE}: no longer draws through makeCountrySheet`) + if (!/rowsWithheld\(c\) \? Promise\.reject\(keyedError\('messages\.countryPosterTooMany'/.test(typeSrc)) fails.push(`${COUNTRY_TYPE}: withheld ROWS are not withheld (the element would print India's list)`) + if (!/posterWithheld\(c\) \|\|[^?]*\? t\('messages\.countryPosterTooMany'\)/.test(typeSrc)) fails.push(`${COUNTRY_TYPE}: a withheld POSTER's card does not show the sentence`) + return fails +} // India's states and union territories draw through their own ONE path; inside this plugin only that helper may // call the generator directly. const STATE_HELPER = 'plugin-designs/country-posters/src/indiaStateSheet.js' @@ -99,11 +112,11 @@ export function armB(seriesFor, countries, sheetFormatFor = null) { const by = (iso) => countries.find((c) => c.iso3 === iso) const ind = by('IND') const s = ind && seriesFor(countries, ind) - // THE LARGE-SHEET FORMAT RULE: India prints the large size ASKED FOR, else its 60x96 default; a packet page stays a + // THE LARGE-SHEET FORMAT RULE: India prints 60x96 ONLY (any request but a packet page gets it); a packet page stays a // page; any other country gets exactly what it asked for. if (sheetFormatFor) { - const want = [[ind, '66x66', '66x66'], [ind, '36x60', '36x60'], [ind, '60x96', '60x96'], [ind, 'letter', '60x96'], [ind, '3x4', '60x96'], [ind, 'packet', 'packet'], - [by('NPL'), '3x3', '3x3'], [by('NPL'), 'letter', 'letter'], [by('CHN'), '3x4', '3x4']] + const want = [[ind, '60x96', '60x96'], [ind, '66x66', '60x96'], [ind, '36x60', '60x96'], [ind, 'letter', '60x96'], [ind, '3x4', '60x96'], [ind, 'packet', 'packet'], + [by('NPL'), '3x3', '3x3'], [by('NPL'), 'letter', 'letter'], [by('CHN'), '3x4', '3x4'], [by('NPL'), '66x66', '66x66']] for (const [item, ask, exp] of want) { const got = sheetFormatFor(item, ask); if (got !== exp) fails.push(`sheetFormatFor(${item?.iso3}, ${ask}) = ${got}, expected ${exp}`) } } const oversized = countries.filter((c) => (c.sheet ?? null) === null) @@ -179,27 +192,41 @@ export function armF(srcs) { // ARM E: India is its OWN section, FIRST, counted ONCE. The India country card, the state cards and the none-listed // cards group together; the section's total is India's own count (not the card sum, which counts 855 twice); on that // true total it outranks every regional section. PosterWall's default (no sectionTotal) must still be the card sum. -// ARM G — A WITHHELD WHOLE-COUNTRY POSTER stays withheld (India: not shipped until it prints legibly). The library -// draws NOTHING for it in any format and fetches no record (0 big jobs); a state card is never withheld; and each -// caller shows messages.countryPosterTooMany on the card and rejects the country's rows with it (no list/packet/cards). -export async function armG(cs, srcs) { +// ARM G — WHAT OF A WHOLE COUNTRY IS WITHHELD (countrySheet.js WITHHELD), and the PREVIEW guard. India: +// (a) BY DEFAULT (every public host: DX Life, the research landing, any embed) its whole-country POSTER is withheld +// (the sentence; largeSheet() null) and its ROWS are withheld; +// (b) only in a PREVIEW context (the Vite dev server: the Plugin Studio on the pilot) the poster prints, 60x96 ONLY; its rows stay withheld. A state card is never withheld. +// Each caller shows the sentence for a withheld POSTER and rejects the rows for withheld ROWS; Country Posters' India +// tab exists only under the preview flag. +export async function armG(cs, srcs, mfeSrc = '') { const fails = [] - if (!(cs.WITHHELD instanceof Set) || !cs.WITHHELD.has('IND')) fails.push("countrySheet.js WITHHELD no longer holds India: its whole-country poster would ship") - let fetched = 0 - const sheet = cs.makeCountrySheet({ records: () => { fetched++; return Promise.resolve([{ name: 'x', latitude: 20, longitude: 78 }]) }, assetsBase: () => '', countries: [] }) - for (const f of ['3x3', '3x4', 'letter', 'packet', '60x96', '66x66', '36x60']) { - let out - try { out = await sheet({ id: 'country-ind', iso3: 'IND', label: 'India' }, f) } catch (e) { out = 'THREW ' + e.message } - if (out !== '') fails.push(`makeCountrySheet drew something for withheld India at ${f}`) - } - if (fetched) fails.push(`makeCountrySheet fetched records ${fetched}x for withheld India (a big job started)`) - if (cs.sheetWithheld({ iso3: 'IND', indiaState: true, id: 'india-state-gujarat' })) fails.push('an India STATE card is withheld (only the whole-country poster may be)') - if (cs.largeSheet({ iso3: 'IND' })) fails.push('largeSheet(India) is not null while withheld, so callers would offer its poster') + const ind = { id: 'country-ind', iso3: 'IND', label: 'India' } + // (a) by default: outside the Vite dev server (here: no import.meta.env.DEV) the preview is shut EVEN IF a page or a + // console sets the global; (b) an open preview (passed explicitly) prints the poster at 66x66. + const was = globalThis.DXM_PREVIEW_UNRELEASED + try { + globalThis.DXM_PREVIEW_UNRELEASED = true + if (cs.previewUnreleased()) fails.push('(a) the preview opens outside the dev server from a global alone: a page/console could print the withheld poster from production') + if (!cs.posterWithheld(ind) || cs.largeSheet(ind)) fails.push("(a) India's whole-country poster is NOT withheld by default: it would ship to every host") + } finally { if (was === undefined) delete globalThis.DXM_PREVIEW_UNRELEASED; else globalThis.DXM_PREVIEW_UNRELEASED = was } + if (!cs.rowsWithheld(ind)) fails.push("India's rows are not withheld: its list/packet/cards (~1,000 pages) would print") + // (b) the open preview itself is proved under Vite (import.meta.env.DEV true) by check:poster-section; here, the size: + const big = cs.LARGE_SHEETS && cs.LARGE_SHEETS.IND + if (!big || big.format !== '60x96' || big.formats.join() !== '60x96') fails.push(`India's whole-country poster is not 60x96 ONLY (${big && big.formats})`) + if (cs.posterWithheld.length > 1 || cs.largeSheet.length > 1) fails.push('posterWithheld()/largeSheet() take a second argument again: a production caller could open the withheld poster') + if (cs.sheetWithheld(ind) !== cs.posterWithheld(ind)) fails.push('sheetWithheld() no longer means the poster') + if (cs.rowsWithheld({ iso3: 'IND', indiaState: true, id: 'india-state-gujarat' })) fails.push('an India STATE card has withheld rows (only the whole country may)') for (const [name, src] of Object.entries(srcs)) { - if (!/sheetWithheld\((?:c|item)\) \? t(?:Key)?\('messages\.countryPosterTooMany'\)/.test(src)) fails.push(`${name}: a withheld country's card does not show messages.countryPosterTooMany`) - if (!/sheetWithheld\((?:c|item)\) \? (?:withheld\(\)|Promise\.reject\(keyedError\('messages\.countryPosterTooMany')/.test(src)) fails.push(`${name}: a withheld country's rows are not withheld (its list/packet/cards would print)`) - if (/const withheld = /.test(src) && !/const withheld = \(\) => Promise\.reject\(keyedError\('messages\.countryPosterTooMany'/.test(src)) fails.push(`${name}: withheld() does not reject with messages.countryPosterTooMany`) + if (!/posterWithheld\((?:c|item)\) \? t(?:Key)?\('messages\.countryPosterTooMany'\)/.test(src)) fails.push(`${name}: a withheld POSTER's card does not show messages.countryPosterTooMany`) + if (!/rowsWithheld\((?:c|item)\) \? (?:withheld\(\)|Promise\.reject\(keyedError\('messages\.countryPosterTooMany')/.test(src)) fails.push(`${name}: withheld ROWS are not withheld (its list/packet/cards would print)`) + if (/sheetWithheld\(/.test(src)) fails.push(`${name}: still reads sheetWithheld() (ambiguous: poster or rows?)`) } + if (mfeSrc && !/\.\.\.\(import\.meta\.env && import\.meta\.env\.DEV && globalThis\.DXM_PREVIEW_UNRELEASED === true \? \[INDIA_PANE\] : \[\]\)/.test(mfeSrc)) fails.push('country-posters-mfe: the India tab is not gated on the DEV-only preview read') + // the BUILT tree never mentions the flag (every read is compiled away) + try { + const pub = join(ROOT, 'public/dx-maps') + for (const b of readdirSync(pub)) { const f = join(pub, b, `${b}.js`); if (existsSync(f) && readFileSync(f, 'utf8').includes('DXM_PREVIEW_UNRELEASED')) fails.push(`the built ${b}.js mentions DXM_PREVIEW_UNRELEASED (a preview read survived the build)`) } + } catch (_) { /* no built tree here */ } return fails } @@ -242,6 +269,10 @@ async function main() { for (const p of listSources(PD)) files[relative(ROOT, p)] = readFileSync(p, 'utf8') const REG = readFileSync(join(ROOT, 'plugin-designs/regions-dashboard/regions-list.vue'), 'utf8') + const MFE = readFileSync(join(ROOT, 'plugin-designs/country-posters/country-posters-mfe.vue'), 'utf8') + const TYPE = readFileSync(join(ROOT, COUNTRY_TYPE), 'utf8') + const regIsCaller = /makeCountrySheet\(/.test(REG) + const lists = (wallSrc, regSrc = REG) => (regIsCaller ? { wall: wallSrc, regions: regSrc } : { wall: wallSrc }) if (selfTest) { const wall = KNOWN_CALLERS[0] const cases = [ @@ -255,14 +286,20 @@ async function main() { ['a division silently dropped', () => armC(H, states.filter((st) => st.id !== 'india-mz'), adm1Ind)], ['the wall stops passing sectionTotal (India counted twice)', () => armE(countries, states, files[wall].replace(':section-total=', ':x-section-total='), readFileSync(join(ROOT, 'library/components/poster/PosterWall.vue'), 'utf8'), H).fails], ['India country card left in Asia', () => armE(countries, states, files[wall].replace("=== 'IND'", "=== 'XXX'"), readFileSync(join(ROOT, 'library/components/poster/PosterWall.vue'), 'utf8'), H).fails], - ['India ignores a requested 66x66', () => armB(seriesFor, countries, (it, f) => (it?.iso3 === 'IND' && f !== 'packet' ? '60x96' : f))], + ['India offered 66x66 again', () => armB(seriesFor, countries, (it, f) => (it?.iso3 === 'IND' && f === '66x66' ? '66x66' : sheetFormatFor(it, f)))], ['a packet page becomes a large sheet', () => armB(seriesFor, countries, (it, f) => (it?.iso3 === 'IND' ? '60x96' : f))], ['the wall resolves [] for a phone-blocked card', () => armF({ wall: files[wall].replace("const desktopOnly = () => Promise.reject(keyedError('poster.phoneLimitAll'", "const desktopOnly = () => Promise.resolve([]) || (keyedError('poster.phoneLimitAll'"), regions: REG })], - ['the Regions list resolves [] for a phone-blocked card', () => armF({ wall: files[wall], regions: REG.replace("phoneBlocked(item) ? Promise.reject(keyedError('poster.phoneLimitAll'", "phoneBlocked(item) ? Promise.resolve([]) || (keyedError('poster.phoneLimitAll'") })], + ['the Regions list resolves [] for a phone-blocked card', () => armF(lists(files[wall], REG.replace("phoneBlocked(item) ? Promise.reject(keyedError('poster.phoneLimitAll'", "phoneBlocked(item) ? Promise.resolve([]) || (keyedError('poster.phoneLimitAll'")))], ['a locale loses a state name', () => armD(states, { ...areas, ro: { ...areas.ro, stateNames: Object.fromEntries(Object.entries(areas.ro.stateNames).filter(([k]) => k !== 'IN-GJ')) } }, meta)], ['the names lose their licence line', () => armD(states, areas, { ...meta, licence: '' })], - ['the whole-India poster un-withheld', async () => armG({ ...CS, WITHHELD: new Set(), largeSheet: (it) => CS.LARGE_SHEETS[it?.iso3] || null, makeCountrySheet: (o) => async (it, f) => { await o.records({}); return '' } }, { wall: files[wall], regions: REG })], - ['the wall prints the list of a withheld country', async () => armG(CS, { wall: files[wall].replace("const countryRecords = (c) => (sheetWithheld(c) ? withheld() : ", "const countryRecords = (c) => ("), regions: REG })], + ['India\'s poster released by default', async () => armG({ ...CS, posterWithheld: () => false, largeSheet: () => CS.LARGE_SHEETS.IND }, lists(files[wall]), MFE)], + ['an opener argument comes back', async () => armG({ ...CS, posterWithheld: (it, open) => CS.posterWithheld(it) }, lists(files[wall]), MFE)], + ['the preview read without DEV (a global opens production)', async () => armG({ ...CS, previewUnreleased: () => globalThis.DXM_PREVIEW_UNRELEASED === true }, lists(files[wall]), MFE)], + ['India\'s rows un-withheld', async () => armG({ ...CS, rowsWithheld: () => false }, lists(files[wall]), MFE)], + ['the India tab shown without the preview flag', async () => armG(CS, lists(files[wall]), MFE.replace('...(import.meta.env && import.meta.env.DEV && globalThis.DXM_PREVIEW_UNRELEASED === true ? [INDIA_PANE] : []),', 'INDIA_PANE,'))], + ['the wall prints the list of a country whose rows are withheld', async () => armG(CS, lists(files[wall].replace('rowsWithheld(c) ? withheld() : ', '')))], + ['the library type prints withheld rows', () => armH(TYPE.replace('rowsWithheld(c) ? ', 'false ? '))], + ['the library type shows a withheld poster', () => armH(TYPE.replace('posterWithheld(c) ||', 'false ||'))], ['a helper that mutates the shared ADM1', () => armC({ ...H, stateGeometry: (z, a, n) => { (a.features || []).forEach((f) => { if (f.properties.shapeName === n) f.properties.listId = z.id }); return H.stateGeometry(z, a, n) } }, states, JSON.parse(JSON.stringify(adm1Ind)))], ] let bad = 0 @@ -281,8 +318,8 @@ async function main() { const callers = [] const E = armE(countries, states, files['plugin-designs/country-posters/country-poster-wall.vue'], readFileSync(join(ROOT, 'library/components/poster/PosterWall.vue'), 'utf8'), H) - const G = await armG(CS, { wall: files['plugin-designs/country-posters/country-poster-wall.vue'], regions: REG }) - const fails = [...armA(files, callers), ...armB(seriesFor, countries, sheetFormatFor), ...armC(H, states, adm1Ind), ...G, ...E.fails, ...armD(states, areas, meta), ...armF({ wall: files['plugin-designs/country-posters/country-poster-wall.vue'], regions: REG })] + const G = [...await armG(CS, lists(files['plugin-designs/country-posters/country-poster-wall.vue']), MFE), ...armH(TYPE)] + const fails = [...armA(files, callers), ...armB(seriesFor, countries, sheetFormatFor), ...armC(H, states, adm1Ind), ...G, ...E.fails, ...armD(states, areas, meta), ...armF(lists(files['plugin-designs/country-posters/country-poster-wall.vue']))] const missing = [...KNOWN_CALLERS, `${STATE_CALLER}#state`].filter((k) => !callers.includes(k)) if (missing.length) fails.push(`known callers not found calling makeCountrySheet: ${missing.join(', ')}`) if (fails.length) { fails.forEach((f) => console.log(`FAIL ${f}`)); process.exitCode = 1; return } diff --git a/plugin-designs/country-posters/scripts/check-poster-section.mjs b/plugin-designs/country-posters/scripts/check-poster-section.mjs index 23db06b43..efab543de 100644 --- a/plugin-designs/country-posters/scripts/check-poster-section.mjs +++ b/plugin-designs/country-posters/scripts/check-poster-section.mjs @@ -3,8 +3,8 @@ // A. the TYPE REGISTRY: 'country' is registered, an unknown type is null, a plugin can register its own. // B. SCOPES: DX Life's /regions slugs (africa … oceania) each resolve; every spelling of a region (its // slug, its API value, its English name) resolves to the same countries; the scopes cover all countries once. -// C. a WITHHELD whole-country poster stays withheld through the type (the card's sentence; its rows rejected, -// no records fetched). +// C. India through the type, by default: its whole-country POSTER card shows the withheld sentence; its ROWS are +// rejected with it, no records fetched. // D. the ELEMENT's attributes map to its config (collapsible on by default, collapsible="false", collapsed). // E. THE LIFT: every name PosterSection.vue's template uses is injected from the wall (a section never reads // something its wall does not provide). @@ -18,7 +18,7 @@ const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..') // real region), so the /regions/other scope resolves to zero countries and is no longer one of the covering scopes. const DXL = ['africa', 'asia', 'europe', 'latin-america-and-caribbean', 'middle-east', 'north-america-and-non-spanish-caribbean', 'oceania'] -async function arms({ types, country, element, sectionSrc }) { +async function arms({ types, country, element, sectionSrc, cs }) { const fails = [] // A if (!types.posterTypeNames().includes('country')) fails.push("A: the registry has no 'country' type") @@ -45,12 +45,23 @@ async function arms({ types, country, element, sectionSrc }) { else { let fetched = 0 const act = country.actions({ assetsBase: () => '', apiBase: () => { fetched++; return '' }, lang: () => 'en', profileConfig: null, t: (k) => k }) - if (act.unsupported(ind) !== 'messages.countryPosterTooMany') fails.push("C: withheld India's card does not show messages.countryPosterTooMany") + if (act.unsupported(ind) !== 'messages.countryPosterTooMany') fails.push("C: India's whole-country poster card does not show the withheld sentence by default (it is not released)") let why = '' try { await act.records(ind); why = 'resolved' } catch (e) { why = e && (e.i18nKey || e.message) } if (!/countryPosterTooMany/.test(String(why))) fails.push(`C: withheld India's rows are not withheld (${why})`) if (fetched) fails.push('C: withheld India fetched records') } + // C2. THE PREVIEW, under Vite (import.meta.env.DEV is true here, as on the pilot's dev server): only with the global + // set does India's whole-country poster open, at 60x96; its rows stay withheld; without it, withheld. + const was = globalThis.DXM_PREVIEW_UNRELEASED + try { + globalThis.DXM_PREVIEW_UNRELEASED = true + const big = cs.largeSheet({ iso3: 'IND' }) + if (cs.posterWithheld({ iso3: 'IND' }) || !big || big.format !== '60x96') fails.push(`C2: in a DEV preview India's poster does not open at 60x96 (${big && big.format})`) + if (!cs.rowsWithheld({ iso3: 'IND' })) fails.push("C2: the preview also released India's rows") + delete globalThis.DXM_PREVIEW_UNRELEASED + if (!cs.posterWithheld({ iso3: 'IND' })) fails.push('C2: without the preview global India is not withheld') + } finally { if (was === undefined) delete globalThis.DXM_PREVIEW_UNRELEASED; else globalThis.DXM_PREVIEW_UNRELEASED = was } // D const fake = (attrs) => ({ getAttribute: (n) => (n in attrs ? attrs[n] : null), hasAttribute: (n) => n in attrs }) const d0 = element.posterSectionConfig(fake({ scope: 'africa' })) @@ -80,11 +91,13 @@ try { const country = (await load('library/components/poster/types/countryPosterType.js')).default const element = await load('library/elements/posterSectionConfig.js') const sectionSrc = readFileSync(join(ROOT, 'library/components/poster/PosterSection.vue'), 'utf8') - const real = { types, country, element, sectionSrc } + const cs = await load('library/packet/countrySheet.js') + const real = { types, country, element, sectionSrc, cs } if (process.argv.includes('--self-test')) { const poisons = [ ["a registry without 'country'", { ...real, types: { ...types, posterTypeNames: () => [] } }, /^A:/], ['a region key without "&" → "and"', { ...real, country: { ...country, items: (s, l) => (/-and-/.test(String(s)) ? [] : country.items(s, l)) } }, /^B:/], + ['the preview ignored under DEV', { ...real, cs: { ...cs, posterWithheld: () => true, largeSheet: () => null } }, /^C2:/], ['a section that uses a name it does not inject', { ...real, sectionSrc: sectionSrc.replace('', '{{ notProvided }}') }, /^E:/], ] for (const [name, inp, rx] of poisons) { @@ -95,7 +108,7 @@ try { } else { const f = await arms(real) if (f.length) { f.forEach((x) => console.log('FAIL ' + x)); code = 1 } - else console.log(`PASS check:poster-section — the 'country' type; ${DXL.length} DX Life scopes cover every country once (and their other spellings); withheld India stays withheld; the element's attributes; PosterSection injects every name it uses`) + else console.log(`PASS check:poster-section — the 'country' type; ${DXL.length} DX Life scopes cover every country once (and their other spellings); India withheld by default; the element's attributes; PosterSection injects every name it uses`) } } finally { await server.close() } process.exit(code) diff --git a/plugin-designs/regions-dashboard/regions-list.vue b/plugin-designs/regions-dashboard/regions-list.vue index 11b5c104e..b6e660a57 100644 --- a/plugin-designs/regions-dashboard/regions-list.vue +++ b/plugin-designs/regions-dashboard/regions-list.vue @@ -70,7 +70,7 @@ import PosterWall from '@map/components/poster/PosterWall.vue' import RegionSectionCard from '@map/components/regions/RegionSectionCard.vue' import posterData from '@map/data/country-posters.json' import { createPeopleGroupRecords } from '@map/lists/peopleGroupRecords.js' -import { makeCountrySheet, largeSheet, sheetWithheld } from '@map/packet/countrySheet.js' +import { makeCountrySheet, largeSheet, posterWithheld, rowsWithheld } from '@map/packet/countrySheet.js' import { isPhonePrint } from '@map/composables/printInPlace.js' import { keyedError } from '@map/i18n/keyedError.js' import { resolveAssetsBase } from '@map/utils/embedBase.js' @@ -373,11 +373,11 @@ function postersFor(region) { // its card says so and offers no rows, rather than failing (the Country Posters wall applies the same rule, same table). const ON_PHONE = isPhonePrint() const phoneBlocked = (c) => ON_PHONE && Boolean(largeSheet(c)?.desktopOnly) -const posterUnsupported = (c) => (sheetWithheld(c) ? tKey('messages.countryPosterTooMany') : phoneBlocked(c) ? tKey('poster.phoneLimitAll') +const posterUnsupported = (c) => (posterWithheld(c) ? tKey('messages.countryPosterTooMany') : phoneBlocked(c) ? tKey('poster.phoneLimitAll') : c.unsupportedReason && !largeSheet(c) ? tKey('messages.countryPosterTooMany') : null) // A blocked card's rows REJECT with the notice, never [] ("no people groups" on a card that has hundreds). // A withheld whole-country poster (countrySheet.js WITHHELD: India) withholds its list, packet and cards too. -const posterRows = (item) => (sheetWithheld(item) ? Promise.reject(keyedError('messages.countryPosterTooMany', 'Too many people groups to fit on one poster legibly — a solution is in progress.')) : phoneBlocked(item) ? Promise.reject(keyedError('poster.phoneLimitAll', 'This needs a desktop or laptop computer.')) : countryRecords({ type: 'country', values: [item.iso3] })) +const posterRows = (item) => (rowsWithheld(item) ? Promise.reject(keyedError('messages.countryPosterTooMany', 'Too many people groups to fit on one poster legibly — a solution is in progress.')) : phoneBlocked(item) ? Promise.reject(keyedError('poster.phoneLimitAll', 'This needs a desktop or laptop computer.')) : countryRecords({ type: 'country', values: [item.iso3] })) // One region's wall is already inside a region section, so it needs no second level of // collapsing and no grouping: everything in it is that one region. diff --git a/public/dx-maps/country-posters/countries-map/index.html b/public/dx-maps/country-posters/countries-map/index.html index 85bbeda2c..edb3419c2 100644 --- a/public/dx-maps/country-posters/countries-map/index.html +++ b/public/dx-maps/country-posters/countries-map/index.html @@ -76,7 +76,7 @@ - + - + - + - + \n\n\n" + "script": "\n\n\n" } }, { @@ -177,8 +177,8 @@ "scriptUrl": "./cities-internet/cities-internet.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -194,7 +194,7 @@ "scriptUrl": "./cities-internet/cities-internet.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } } ] @@ -232,7 +232,7 @@ "bundle": "country-posters", "scriptUrl": "./country-posters/country-posters.js", "output": "dx-maps/country-posters/country-posters.js", - "integrity": "sha384-FHnDp2cPYAei2U30kIqwxuOXX4+vDsmy2FPavVm6g+RFnk8k5Iyd5eXwCzfgX++q", + "integrity": "sha384-5OPrLQNYx8cPKfvwpoEz6SHiO1YKYUsJbFPQcTtwC8QUQTWkOEV+Reqr+7fxDkC2", "elements": [ "country-posters-map" ], @@ -255,8 +255,8 @@ "scriptUrl": "./country-posters/country-posters.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -272,7 +272,7 @@ "scriptUrl": "./country-posters/country-posters.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -288,8 +288,8 @@ "scriptUrl": "./country-posters/country-posters.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -305,7 +305,7 @@ "scriptUrl": "./country-posters/country-posters.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } } ] @@ -466,7 +466,7 @@ "bundle": "doxa-research-map", "scriptUrl": "./doxa-research-map/doxa-research-map.js", "output": "dx-maps/doxa-research-map/doxa-research-map.js", - "integrity": "sha384-WeOQrnujUZ4A942d6Y3k8d2TxlVowsYxSrjxoD2XOTJtTUX0c2C4ntp6oi5wQDN4", + "integrity": "sha384-XrPeGIB26yCMS1OWjB8c44HqtVbSCC9vyep2fEoqzh34ZI7kwZd1BebXIUcTxfLn", "elements": [ "doxa-research-map" ], @@ -485,8 +485,8 @@ "scriptUrl": "./doxa-research-map/doxa-research-map.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" }, "instances": [ { @@ -512,7 +512,7 @@ "bundle": "doxa-simple-map", "scriptUrl": "./doxa-simple-map/doxa-simple-map.js", "output": "dx-maps/doxa-simple-map/doxa-simple-map.js", - "integrity": "sha384-jk+quEe8NnQEMtsEM71OE5IquBg4vpRktGEQueboxU0+/HQimXSbsyCeUrs/Rzmu", + "integrity": "sha384-nHRJFyHIqimO7KdT8Gx/BksX36tY1YHFWW1jb70F3ZtlldeswE9y7IQNyY4ic2BN", "elements": [ "dxm-simple-map" ], @@ -531,8 +531,8 @@ "scriptUrl": "./doxa-simple-map/doxa-simple-map.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" }, "instances": [ { @@ -929,7 +929,7 @@ "bundle": "my-upg-100-list", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "output": "dx-maps/my-upg-100-list/my-upg-100-list.js", - "integrity": "sha384-NI+A8OCrOoKb53elAZUtoKYfH1+fT0CyF8htPQGnHKpZvJAckCPNoUBUAohAp9eR", + "integrity": "sha384-P3qyu7MegojDl8iaorzqXxW52wTX0K++PKsw5t5ocq/ZytZmgMqWVnSsGjDB2HSw", "elements": [ "my-upg-100-list-map" ], @@ -952,7 +952,7 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -968,8 +968,8 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -985,8 +985,8 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] @@ -1117,7 +1117,7 @@ "bundle": "poster-design", "scriptUrl": "./poster-design/poster-design.js", "output": "dx-maps/poster-design/poster-design.js", - "integrity": "sha384-5cb+LDsmrXit1M/6zdQujDSUH5TDtqJTSN++4xvCpaZd4WwSWJybdj3KyRzsanWn", + "integrity": "sha384-lmKbLPYkuoRaRLpC+JuT0FhUIZCb+e/ki0TcCsEcaIr9RBpXoTLjeO68t025moId", "elements": [ "poster-design" ], @@ -1140,7 +1140,7 @@ "scriptUrl": "./poster-design/poster-design.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1156,7 +1156,7 @@ "scriptUrl": "./poster-design/poster-design.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1172,7 +1172,7 @@ "scriptUrl": "./poster-design/poster-design.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } } ] @@ -1292,7 +1292,7 @@ "bundle": "regions-dashboard", "scriptUrl": "./regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js", - "integrity": "sha384-FQqnTMBl07mWKZHpHNNkhCkuaY2TngmbhnFwx09Qutj2HwDTgN9nAQeTm1EBQ3Gg", + "integrity": "sha384-wFK1JUeWwZE9pshq0QjRlB3W/qlfMfOvaiTxuy6v5/KswtcCnEu5yuZxExZTO8GV", "elements": [ "regions-dashboard" ], @@ -1315,8 +1315,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -1332,7 +1332,7 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1348,8 +1348,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/manifest.json b/public/dx-maps/manifest.json index 90f8ca7a3..97fff0617 100644 --- a/public/dx-maps/manifest.json +++ b/public/dx-maps/manifest.json @@ -142,7 +142,7 @@ "bundle": "cities-internet", "scriptUrl": "./cities-internet/cities-internet.js", "output": "dx-maps/cities-internet/cities-internet.js", - "integrity": "sha384-/kNcRxqLX/p7+cFvQ7Ft1uhwBYfW28D82LEHcvRBZM+TvTIKvZ12R60ujHB4v4/5", + "integrity": "sha384-kUGhXBMOJap+zSgt/uSycCzzaJdtMzx0wYdhBudXxjjUIMVclBaYP6c8jF82zu0C", "elements": [ "cities-internet-map" ], @@ -161,7 +161,7 @@ "scriptUrl": "./cities-internet/cities-internet.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -177,8 +177,8 @@ "scriptUrl": "./cities-internet/cities-internet.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -194,7 +194,7 @@ "scriptUrl": "./cities-internet/cities-internet.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } } ] @@ -232,7 +232,7 @@ "bundle": "country-posters", "scriptUrl": "./country-posters/country-posters.js", "output": "dx-maps/country-posters/country-posters.js", - "integrity": "sha384-FHnDp2cPYAei2U30kIqwxuOXX4+vDsmy2FPavVm6g+RFnk8k5Iyd5eXwCzfgX++q", + "integrity": "sha384-5OPrLQNYx8cPKfvwpoEz6SHiO1YKYUsJbFPQcTtwC8QUQTWkOEV+Reqr+7fxDkC2", "elements": [ "country-posters-map" ], @@ -255,8 +255,8 @@ "scriptUrl": "./country-posters/country-posters.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -272,7 +272,7 @@ "scriptUrl": "./country-posters/country-posters.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -288,8 +288,8 @@ "scriptUrl": "./country-posters/country-posters.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -305,7 +305,7 @@ "scriptUrl": "./country-posters/country-posters.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } } ] @@ -466,7 +466,7 @@ "bundle": "doxa-research-map", "scriptUrl": "./doxa-research-map/doxa-research-map.js", "output": "dx-maps/doxa-research-map/doxa-research-map.js", - "integrity": "sha384-WeOQrnujUZ4A942d6Y3k8d2TxlVowsYxSrjxoD2XOTJtTUX0c2C4ntp6oi5wQDN4", + "integrity": "sha384-XrPeGIB26yCMS1OWjB8c44HqtVbSCC9vyep2fEoqzh34ZI7kwZd1BebXIUcTxfLn", "elements": [ "doxa-research-map" ], @@ -485,8 +485,8 @@ "scriptUrl": "./doxa-research-map/doxa-research-map.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" }, "instances": [ { @@ -512,7 +512,7 @@ "bundle": "doxa-simple-map", "scriptUrl": "./doxa-simple-map/doxa-simple-map.js", "output": "dx-maps/doxa-simple-map/doxa-simple-map.js", - "integrity": "sha384-jk+quEe8NnQEMtsEM71OE5IquBg4vpRktGEQueboxU0+/HQimXSbsyCeUrs/Rzmu", + "integrity": "sha384-nHRJFyHIqimO7KdT8Gx/BksX36tY1YHFWW1jb70F3ZtlldeswE9y7IQNyY4ic2BN", "elements": [ "dxm-simple-map" ], @@ -531,8 +531,8 @@ "scriptUrl": "./doxa-simple-map/doxa-simple-map.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" }, "instances": [ { @@ -929,7 +929,7 @@ "bundle": "my-upg-100-list", "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "output": "dx-maps/my-upg-100-list/my-upg-100-list.js", - "integrity": "sha384-NI+A8OCrOoKb53elAZUtoKYfH1+fT0CyF8htPQGnHKpZvJAckCPNoUBUAohAp9eR", + "integrity": "sha384-P3qyu7MegojDl8iaorzqXxW52wTX0K++PKsw5t5ocq/ZytZmgMqWVnSsGjDB2HSw", "elements": [ "my-upg-100-list-map" ], @@ -952,7 +952,7 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -968,8 +968,8 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -985,8 +985,8 @@ "scriptUrl": "./my-upg-100-list/my-upg-100-list.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] @@ -1117,7 +1117,7 @@ "bundle": "poster-design", "scriptUrl": "./poster-design/poster-design.js", "output": "dx-maps/poster-design/poster-design.js", - "integrity": "sha384-5cb+LDsmrXit1M/6zdQujDSUH5TDtqJTSN++4xvCpaZd4WwSWJybdj3KyRzsanWn", + "integrity": "sha384-lmKbLPYkuoRaRLpC+JuT0FhUIZCb+e/ki0TcCsEcaIr9RBpXoTLjeO68t025moId", "elements": [ "poster-design" ], @@ -1140,7 +1140,7 @@ "scriptUrl": "./poster-design/poster-design.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1156,7 +1156,7 @@ "scriptUrl": "./poster-design/poster-design.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1172,7 +1172,7 @@ "scriptUrl": "./poster-design/poster-design.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } } ] @@ -1292,7 +1292,7 @@ "bundle": "regions-dashboard", "scriptUrl": "./regions-dashboard/regions-dashboard.js", "output": "dx-maps/regions-dashboard/regions-dashboard.js", - "integrity": "sha384-FQqnTMBl07mWKZHpHNNkhCkuaY2TngmbhnFwx09Qutj2HwDTgN9nAQeTm1EBQ3Gg", + "integrity": "sha384-wFK1JUeWwZE9pshq0QjRlB3W/qlfMfOvaiTxuy6v5/KswtcCnEu5yuZxExZTO8GV", "elements": [ "regions-dashboard" ], @@ -1315,8 +1315,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } }, { @@ -1332,7 +1332,7 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n" + "script": "\n\n\n" } }, { @@ -1348,8 +1348,8 @@ "scriptUrl": "./regions-dashboard/regions-dashboard.js", "embed": { "iframe": "", - "script": "\n\n\n\n\n\n", - "scriptMapbox": "\n\n\n\n\n\n" + "script": "\n\n\n\n\n\n", + "scriptMapbox": "\n\n\n\n\n\n" } } ] diff --git a/public/dx-maps/poster-design/poster-design-mfe/index.html b/public/dx-maps/poster-design/poster-design-mfe/index.html index dfb1cd5fe..a47b9019a 100644 --- a/public/dx-maps/poster-design/poster-design-mfe/index.html +++ b/public/dx-maps/poster-design/poster-design-mfe/index.html @@ -73,7 +73,7 @@ - + - + - + - + - + - +