@canopy-iiif/app 1.10.7 → 1.10.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/build/iiif.js CHANGED
@@ -1861,6 +1861,47 @@ async function buildIiifCollectionPages(CONFIG) {
1861
1861
  await gatherFromCollection(entry.raw || entryId, collectionKey);
1862
1862
  }
1863
1863
  }
1864
+ // Handle IIIF Presentation 2 paged collections (first/next pattern).
1865
+ // The root of a paged v2 collection carries a `first` link instead of
1866
+ // embedding items; each page carries a `next` link to the following page.
1867
+ const resolvePageUrl = (val) => {
1868
+ if (!val) return "";
1869
+ if (typeof val === "string") return val.trim();
1870
+ const id = val["@id"] || val.id;
1871
+ return typeof id === "string" ? id.trim() : "";
1872
+ };
1873
+ // Start from `first` if present (root collection), otherwise `next` (current is a page).
1874
+ let pageUrl =
1875
+ resolvePageUrl(col && col.first) ||
1876
+ resolvePageUrl(ncol && ncol.first) ||
1877
+ resolvePageUrl(col && col.next) ||
1878
+ resolvePageUrl(ncol && ncol.next);
1879
+ while (pageUrl) {
1880
+ const pageKey = norm(pageUrl) || pageUrl;
1881
+ if (visitedCollections.has(pageKey)) break;
1882
+ visitedCollections.add(pageKey);
1883
+ const page = await readJsonFromUri(pageUrl, {log: true});
1884
+ if (!page) break;
1885
+ const npage = await upgradeIiifResource(page);
1886
+ const pageEntries = extractCollectionEntries(npage);
1887
+ for (const entry of pageEntries) {
1888
+ const entryId = entry && entry.id;
1889
+ if (!entryId) continue;
1890
+ const entryType = normalizeIiifType(entry.type || entry.fallback || "");
1891
+ const dedupeKey = norm(entryId) || String(entryId || "");
1892
+ if (!dedupeKey) continue;
1893
+ if (entryType === "manifest") {
1894
+ if (queuedManifestIds.has(dedupeKey)) continue;
1895
+ queuedManifestIds.add(dedupeKey);
1896
+ tasks.push({id: entryId, parent: collectionKey});
1897
+ manifestTasksFromCollections += 1;
1898
+ } else if (entryType === "collection") {
1899
+ await gatherFromCollection(entry.raw || entryId, collectionKey);
1900
+ }
1901
+ }
1902
+ // Advance to the next page.
1903
+ pageUrl = resolvePageUrl((page && page.next) || (npage && npage.next));
1904
+ }
1864
1905
  // Traverse strictly by parent/child hierarchy (Presentation 3): items → Manifest or Collection
1865
1906
  } catch (_) {}
1866
1907
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canopy-iiif/app",
3
- "version": "1.10.7",
3
+ "version": "1.10.8",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "Mat Jordan <mat@northwestern.edu>",
package/ui/dist/index.mjs CHANGED
@@ -47582,7 +47582,7 @@ function buildClusterOptions(leaflet, maxClusterRadius) {
47582
47582
  const anchor = CUSTOM_MARKER_RADIUS;
47583
47583
  return {
47584
47584
  chunkedLoading: true,
47585
- maxClusterRadius: typeof maxClusterRadius === "number" ? maxClusterRadius : void 0,
47585
+ maxClusterRadius: typeof maxClusterRadius === "number" ? maxClusterRadius : 160,
47586
47586
  iconCreateFunction: (cluster) => {
47587
47587
  const count = cluster && typeof cluster.getChildCount === "function" ? cluster.getChildCount() : 0;
47588
47588
  return leaflet.divIcon({