fix(exporter,viewer): islamicart legacy-parity backlog - Epics 1,2,4,5,6,7,9 (#1432)

Commit: 2b28b50ec3b4eecab066be7a949d5c523f980c09
Date: 2026-07-06 11:44:50 +0000
Author: PascalHavelange

Commit Message

fix(exporter,viewer): islamicart legacy-parity backlog - Epics 1,2,4,5,6,7,9 (#1432)

* fix(exporter,viewer): export missing item fields (artist, architects, workshop, scribe, binding, catalogue link) and fix object also-known-as

- item-exporter.ts: generalize extra JSON extraction (previously monument-only
  history/patrons) to also surface workshop, scriber, binding_desc,
  catalogue_holding_link, linkcatalogs (objects) and architects (monuments);
  add a top-level artist_names[] field via the artist_item/artists join,
  since legacy artist names are language-independent structured entities,
  not per-translation text.
- ItemDetail.vue: render Artist/Scribe (objects) and Architects (monuments)
  as key facts, Workshop/Binding (objects), and a Catalogue link content
  section, in legacy's field order; fix "Also known as" to show for
  object-type items too, not just monuments (data was already exported,
  the object branch just never checked it).
- DatabaseResults.vue: fix the "Architect/Artist/Master" search field to
  match the new artist_names/architects data instead of silently matching
  against initial_owner.
- bump @metanull/islamicart-data to 1.0.21 (was pinned to a stale 1.0.19
  install).

Epic 1 of the islamicart legacy-parity backlog (tmp/islamicart-parity-audit-2026-07-06.md).

* feat(viewer): render already-imported item detail features (Special Features, Citation, Timeline link)

- ItemDetail.vue: add a "Special Features" section listing monument
  sub-detail child items (type='detail', parent_id -> monument) that were
  already fully imported/exported but never queried by the viewer.
- Add an auto-generated Citation blurb + permalink, mirroring legacy's
  per-item citation text, computed entirely from data already on the page.
- Add a "View on Timeline" link scoped to the item's country + date range,
  reusing TimelineResults.vue'\''s existing country/begin/end query params
  (legacy never stores a direct item<->HCR-event link either; it computes
  this same country/date overlap live).

Epic 2 of the islamicart legacy-parity backlog.

* feat(viewer): restore Database search form parity with legacy

- Split the merged "Name / Keyword" field option into legacy'\''s distinct
  "Keyword(s)" (general full-text) and "Name" options, and restore the
  "Other" catch-all option -- FIELD_OPTIONS now has legacy'\''s exact 9
  options, in order.
- Replace the freeform year number inputs with legacy'\''s fixed
  century-boundary date dropdowns (501-2001 "from", 600-2000 "to").
- Add a "Search language" filter, applied once globally to the whole
  query (like the date range), matching legacy'\''s searchlanguage
  dropdown -- switches which language'\''s translations matchField()
  searches against, loading that language'\''s translations on demand.

Epic 4 of the islamicart legacy-parity backlog.

* fix(viewer): Permanent Collection results -- add EPM opt-in scoping, dynasty/museum info, chronological sort, count split

- PcList.vue/PcEntrance.vue: add the same "Include Explore Islamic Art
  Collections" opt-in checkbox already used by the Database feature.
  PcList.vue previously had zero ISL/EPM scoping at all, so once EPM items
  were actually populated in the data package it silently mixed them into
  every Permanent Collection browse -- and, transitively, into Timeline'\''s
  "view items from this period" link, which forwards into PcList.vue with
  no project param and now inherits the ISL-only default automatically.
- PcList.vue: add dynasty and holding-museum text to each result card'\''s
  meta line (guarded against dangling partner_id references that aren'\''t
  in the currently-exported partner set, to avoid ever showing a raw UUID);
  sort results chronologically by start_date, matching legacy; split the
  result count into "N objects, M monuments" instead of a flat item count.

Epic 5 of the islamicart legacy-parity backlog.

* fix(viewer): rename Partner Institutions to Other Partners

Matches legacy'\''s pc_parnter_other term ("Other Partners",
mwnf3_translation.sql:7552) exactly, on both the ISL and EPM sections
of the Partners entrance page.

Epic 6 (partial) of the islamicart legacy-parity backlog. The other
half of Epic 6 (Story 6.2, a missing Contact "fax" field) turned out
to need an importer change, not just exporter/viewer: partner-exporter.ts
correctly has nothing to select because museum-transformer.ts and
institution-transformer.ts never capture the museum/institution'\''s own
top-level fax number at all (only named contact persons'\'' individual fax
numbers are captured, into extra.contact_person_1/2). Deferred -- out of
scope for an exporter/viewer-only pass.

* feat(exporter,viewer): dynasty representative image, Artistic Introduction/Exhibitions cross-links, glossary linking

- dynasty-exporter.ts: add a representative `image` field per dynasty --
  the first (by display_order) image belonging to any item linked via
  item_dynasty, mirroring the legacy dynasties micro-site.
- DynastyDetail.vue: render that image; add cross-links to any Artistic
  Introduction theme or Exhibition whose attached items overlap with this
  dynasty'\''s linked items (computed client-side from collections.json +
  items.json, now that both features exist natively in this viewer);
  wire up glossary-term linking in the dynasty history text.
- Glossary linking scans the full glossary set client-side rather than a
  precomputed per-dynasty list, since there'\''s no dynasty_translation_spelling
  table (unlike items/collections/timeline-events) -- avoids a schema +
  importer change for a small (~600-term), cheap-to-scan lookup.

Epic 7 of the islamicart legacy-parity backlog.

* fix(viewer): add "Select a Country" placeholder to Timeline entrance

Matches legacy hcr_home.php'\''s forced-choice pattern: a disabled
"Select a Country" placeholder is now the default option, ahead of an
explicit "All Countries" choice (given its own sentinel value so the
existing empty-string-means-no-filter query-building logic keeps working
unchanged).

Epic 9 of the islamicart legacy-parity backlog.

---------

Co-authored-by: Pascal HAVELANGE <havelangep@hotmail.com>

Files Changed


This documentation was automatically generated from Git commit data.