col-browser 2.2.0 → 2.2.1
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/es/chunks/index-BmhRLlZh.js +100 -0
- package/es/chunks/index-BmhRLlZh.js.map +1 -0
- package/es/index.js +1 -1
- package/es/routing.js +1 -1
- package/package.json +1 -1
- package/types/index.d.ts +7 -0
- package/umd/col-browser.js +29 -20
- package/umd/col-browser.js.map +1 -1
- package/umd/col-browser.min.js +5 -5
- package/umd/col-browser.min.js.map +1 -1
- package/es/chunks/index-CNK3JADR.js +0 -95
- package/es/chunks/index-CNK3JADR.js.map +0 -1
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { j as K } from "./jsx-runtime-BzflLqGi.js";
|
|
2
|
-
import { useState as j, useEffect as k, useMemo as g, useCallback as T } from "react";
|
|
3
|
-
import d from "query-string";
|
|
4
|
-
const y = (n) => n === "hash", b = (n) => {
|
|
5
|
-
if (y(n)) {
|
|
6
|
-
const o = typeof window < "u" && window.location.hash || "", e = o.startsWith("#") ? o.slice(1) : o, t = e.indexOf("?");
|
|
7
|
-
return {
|
|
8
|
-
path: t >= 0 ? e.slice(0, t) : e,
|
|
9
|
-
search: t >= 0 ? e.slice(t) : ""
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
return {
|
|
13
|
-
path: typeof window < "u" && window.location.pathname || "",
|
|
14
|
-
search: typeof window < "u" && window.location.search || ""
|
|
15
|
-
};
|
|
16
|
-
}, v = (n, o, e) => {
|
|
17
|
-
const t = e && Object.keys(e).length > 0 ? `?${d.stringify(e, { arrayFormat: "none" })}` : "";
|
|
18
|
-
if (y(n)) {
|
|
19
|
-
const s = `${o}${t}`;
|
|
20
|
-
window.location.hash = s;
|
|
21
|
-
} else {
|
|
22
|
-
const s = `${o}${t}`;
|
|
23
|
-
window.history.pushState(null, "", s), window.dispatchEvent(new PopStateEvent("popstate"));
|
|
24
|
-
}
|
|
25
|
-
}, E = (n, o) => {
|
|
26
|
-
const e = y(n) ? "hashchange" : "popstate";
|
|
27
|
-
return window.addEventListener(e, o), () => window.removeEventListener(e, o);
|
|
28
|
-
}, f = (n, o, e) => {
|
|
29
|
-
if (!o) return null;
|
|
30
|
-
const t = e == null || typeof e == "object" ? "" : String(e), s = typeof e == "object" && e && Object.keys(e).length > 0 ? `?${d.stringify(e, { arrayFormat: "none" })}` : "", r = `${o}${t}${s}`;
|
|
31
|
-
return y(n) ? `#${r}` : r;
|
|
32
|
-
}, p = (n, o, e, t) => {
|
|
33
|
-
if (!e) return;
|
|
34
|
-
if (o === "reload") {
|
|
35
|
-
const a = f(n, e, t);
|
|
36
|
-
a != null && typeof window < "u" && window.location.assign(a);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
let s = e, r = null;
|
|
40
|
-
typeof t == "string" || typeof t == "number" ? s = `${e}${t}` : t && typeof t == "object" && (r = t), v(n, s, r);
|
|
41
|
-
}, N = (n, o, e) => ({
|
|
42
|
-
hrefForTaxon: (t) => f(n, e.taxon, t),
|
|
43
|
-
hrefForTree: (t) => f(n, e.tree, t),
|
|
44
|
-
hrefForSearch: (t) => f(n, e.search, t),
|
|
45
|
-
hrefForSource: (t) => f(n, e.source, t),
|
|
46
|
-
onNavigateToTaxon: (t) => p(n, o, e.taxon, t),
|
|
47
|
-
onNavigateToTree: (t) => p(n, o, e.tree, t),
|
|
48
|
-
onNavigateToSearch: (t) => p(n, o, e.search, t),
|
|
49
|
-
onNavigateToSource: (t) => p(n, o, e.source, t)
|
|
50
|
-
}), u = (n, o) => {
|
|
51
|
-
if (o) {
|
|
52
|
-
if (!n.startsWith(o)) {
|
|
53
|
-
const e = n.indexOf(o);
|
|
54
|
-
return e < 0 ? void 0 : n.slice(e + o.length).split("/").filter(Boolean).pop();
|
|
55
|
-
}
|
|
56
|
-
return n.slice(o.length).split("/").filter(Boolean).pop();
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
function I(n, o) {
|
|
60
|
-
const { kind: e, mode: t = "path", navigation: s = "spa", paths: r = {} } = o, a = (m) => {
|
|
61
|
-
const [B, S] = j(0);
|
|
62
|
-
k(() => E(t, () => S((l) => l + 1)), []);
|
|
63
|
-
const { path: c, search: $ } = b(t), F = g(() => N(t, s, r), []);
|
|
64
|
-
let i = {};
|
|
65
|
-
if (e === "taxon")
|
|
66
|
-
i.taxonKey = u(c, r.taxon);
|
|
67
|
-
else if (e === "source")
|
|
68
|
-
i.sourceDatasetKey = u(c, r.source);
|
|
69
|
-
else if (e === "taxonBreakdown")
|
|
70
|
-
i.taxonId = u(c, r.taxonBreakdown);
|
|
71
|
-
else if (e === "taxonDistribution")
|
|
72
|
-
i.taxonId = u(c, r.taxonDistribution);
|
|
73
|
-
else if (e === "bibtex")
|
|
74
|
-
i.sourceDatasetKey = u(c, r.bibtex);
|
|
75
|
-
else if (e === "tree") {
|
|
76
|
-
const l = d.parse($);
|
|
77
|
-
i.expandedTaxonKey = l.taxonKey || void 0, i.onExpandedTaxonKeyChange = T((h) => {
|
|
78
|
-
const w = b(t), x = d.parse(w.search);
|
|
79
|
-
h ? x.taxonKey = h : delete x.taxonKey, v(t, w.path || r.tree || "/", x);
|
|
80
|
-
}, []);
|
|
81
|
-
} else if (e === "search") {
|
|
82
|
-
const l = d.parse($, { arrayFormat: "none" });
|
|
83
|
-
i.filters = l, i.onFiltersChange = T((h) => {
|
|
84
|
-
const w = b(t);
|
|
85
|
-
v(t, w.path || r.search || "/", h);
|
|
86
|
-
}, []);
|
|
87
|
-
}
|
|
88
|
-
return /* @__PURE__ */ K.jsx(n, { ...F, ...i, ...m });
|
|
89
|
-
};
|
|
90
|
-
return a.displayName = `withRouting(${n.displayName || n.name || "Component"})`, a;
|
|
91
|
-
}
|
|
92
|
-
export {
|
|
93
|
-
I as w
|
|
94
|
-
};
|
|
95
|
-
//# sourceMappingURL=index-CNK3JADR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-CNK3JADR.js","sources":["../../src/url/index.js"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from \"react\";\nimport qs from \"query-string\";\n\n// withRouting(Component, options): adapts a controlled col-browser\n// component to read/write the host page's URL.\n//\n// options.kind — one of \"taxon\" | \"tree\" | \"source\" | \"sourceList\" |\n// \"search\" | \"taxonBreakdown\" | \"taxonDistribution\" |\n// \"bibtex\"\n// options.mode — \"path\" (recommended for the COL portal) or \"hash\"\n// (used by the GitHub Pages demo)\n// options.navigation — \"spa\" (default) or \"reload\". Controls what the four\n// onNavigateToX callbacks do when an in-component\n// action triggers cross-page navigation (e.g. a\n// Highcharts pie segment click with no <a href>\n// fallback). \"spa\" uses history.pushState — right\n// for SPA hosts (react-router, Next.js, TanStack\n// Router). \"reload\" calls window.location.assign,\n// forcing the browser to load the target page —\n// right for static / multi-page hosts (a Jekyll\n// portal, the GitHub Pages demo, any plain HTML).\n// The in-component state callbacks\n// (onExpandedTaxonKeyChange, onFiltersChange) always\n// use pushState so they don't reload the page while\n// the user is interacting with a single component.\n// options.paths — prefix strings for the four navigation targets, e.g.\n// { taxon: \"/taxon/\", tree: \"/tree\", search: \"/search\",\n// source: \"/source/\" }. For hash mode, the prefixes\n// are applied to window.location.hash (without the\n// leading #). Both modes use plain pathnames; query\n// strings are only used for `expandedTaxonKey` (Tree)\n// and `filters` (Search).\n//\n// All wrappers provide the four hrefForX + onNavigateToX pairs, derived\n// from `paths` and the active routing mode. Kind-specific wrappers also\n// inject the controlled identifier and the appropriate change handler\n// (e.g. `filters` + `onFiltersChange` for Search).\n\nconst isHash = (mode) => mode === \"hash\";\n\nconst readLocationKind = (mode) => {\n if (isHash(mode)) {\n const raw = (typeof window !== \"undefined\" && window.location.hash) || \"\";\n const hash = raw.startsWith(\"#\") ? raw.slice(1) : raw;\n const qIdx = hash.indexOf(\"?\");\n return {\n path: qIdx >= 0 ? hash.slice(0, qIdx) : hash,\n search: qIdx >= 0 ? hash.slice(qIdx) : \"\",\n };\n }\n return {\n path: (typeof window !== \"undefined\" && window.location.pathname) || \"\",\n search: (typeof window !== \"undefined\" && window.location.search) || \"\",\n };\n};\n\nconst writeLocation = (mode, path, search) => {\n const searchStr = search && Object.keys(search).length > 0\n ? `?${qs.stringify(search, { arrayFormat: \"none\" })}`\n : \"\";\n if (isHash(mode)) {\n const next = `${path}${searchStr}`;\n window.location.hash = next;\n } else {\n const url = `${path}${searchStr}`;\n window.history.pushState(null, \"\", url);\n // notify any listeners (the adapter subscribes via popstate / hashchange)\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n};\n\nconst subscribe = (mode, cb) => {\n const evt = isHash(mode) ? \"hashchange\" : \"popstate\";\n window.addEventListener(evt, cb);\n return () => window.removeEventListener(evt, cb);\n};\n\n// Build href: the URL the host would land on for each target.\nconst hrefFor = (mode, prefix, args) => {\n if (!prefix) return null;\n const arg = args == null ? \"\" : typeof args === \"object\" ? \"\" : String(args);\n const tail = typeof args === \"object\" && args && Object.keys(args).length > 0\n ? `?${qs.stringify(args, { arrayFormat: \"none\" })}`\n : \"\";\n const url = `${prefix}${arg}${tail}`;\n return isHash(mode) ? `#${url}` : url;\n};\n\nconst navigate = (mode, navigation, prefix, args) => {\n if (!prefix) return;\n if (navigation === \"reload\") {\n // Force a real browser navigation. hrefFor builds the same URL the\n // adapter would render in href= attributes, so the imperative and\n // anchor paths land on identical URLs.\n const url = hrefFor(mode, prefix, args);\n if (url != null && typeof window !== \"undefined\") {\n window.location.assign(url);\n }\n return;\n }\n // Default \"spa\" behaviour: pushState + popstate so an SPA host re-renders.\n let path = prefix;\n let search = null;\n if (typeof args === \"string\" || typeof args === \"number\") {\n path = `${prefix}${args}`;\n } else if (args && typeof args === \"object\") {\n search = args;\n }\n writeLocation(mode, path, search);\n};\n\nconst buildNavProps = (mode, navigation, paths) => ({\n hrefForTaxon: (id) => hrefFor(mode, paths.taxon, id),\n hrefForTree: (a) => hrefFor(mode, paths.tree, a),\n hrefForSearch: (a) => hrefFor(mode, paths.search, a),\n hrefForSource: (id) => hrefFor(mode, paths.source, id),\n\n onNavigateToTaxon: (id) => navigate(mode, navigation, paths.taxon, id),\n onNavigateToTree: (a) => navigate(mode, navigation, paths.tree, a),\n onNavigateToSearch: (a) => navigate(mode, navigation, paths.search, a),\n onNavigateToSource: (id) => navigate(mode, navigation, paths.source, id),\n});\n\n// Extract the last path segment after a prefix, ignoring trailing slash.\nconst lastSegmentAfter = (path, prefix) => {\n if (!prefix) return undefined;\n if (!path.startsWith(prefix)) {\n // Allow matching when the host wraps in a base path; fall back to\n // \"anything after the prefix substring\".\n const i = path.indexOf(prefix);\n if (i < 0) return undefined;\n return path.slice(i + prefix.length).split(\"/\").filter(Boolean).pop();\n }\n return path.slice(prefix.length).split(\"/\").filter(Boolean).pop();\n};\n\nexport function withRouting(Component, options) {\n const { kind, mode = \"path\", navigation = \"spa\", paths = {} } = options;\n\n const Wrapped = (props) => {\n const [tick, setTick] = useState(0);\n useEffect(() => subscribe(mode, () => setTick((t) => t + 1)), []);\n\n const { path, search } = readLocationKind(mode);\n\n const navProps = useMemo(() => buildNavProps(mode, navigation, paths), []);\n\n // Controlled identifier per kind.\n let extra = {};\n if (kind === \"taxon\") {\n extra.taxonKey = lastSegmentAfter(path, paths.taxon);\n } else if (kind === \"source\") {\n extra.sourceDatasetKey = lastSegmentAfter(path, paths.source);\n } else if (kind === \"taxonBreakdown\") {\n extra.taxonId = lastSegmentAfter(path, paths.taxonBreakdown);\n } else if (kind === \"taxonDistribution\") {\n extra.taxonId = lastSegmentAfter(path, paths.taxonDistribution);\n } else if (kind === \"bibtex\") {\n extra.sourceDatasetKey = lastSegmentAfter(path, paths.bibtex);\n } else if (kind === \"tree\") {\n const parsed = qs.parse(search);\n extra.expandedTaxonKey = parsed.taxonKey || undefined;\n extra.onExpandedTaxonKeyChange = useCallback((id) => {\n const cur = readLocationKind(mode);\n const next = qs.parse(cur.search);\n if (id) next.taxonKey = id;\n else delete next.taxonKey;\n writeLocation(mode, cur.path || paths.tree || \"/\", next);\n }, []);\n } else if (kind === \"search\") {\n const parsed = qs.parse(search, { arrayFormat: \"none\" });\n extra.filters = parsed;\n extra.onFiltersChange = useCallback((filters) => {\n const cur = readLocationKind(mode);\n writeLocation(mode, cur.path || paths.search || \"/\", filters);\n }, []);\n }\n // sourceList: no controlled identifier; only nav callbacks.\n\n return <Component {...navProps} {...extra} {...props} />;\n };\n Wrapped.displayName = `withRouting(${\n Component.displayName || Component.name || \"Component\"\n })`;\n return Wrapped;\n}\n\nexport default withRouting;\n"],"names":["isHash","mode","readLocationKind","raw","hash","qIdx","writeLocation","path","search","searchStr","qs","next","url","subscribe","cb","evt","hrefFor","prefix","args","arg","tail","navigate","navigation","buildNavProps","paths","id","a","lastSegmentAfter","i","withRouting","Component","options","kind","Wrapped","props","tick","setTick","useState","useEffect","t","navProps","useMemo","extra","parsed","useCallback","cur","filters"],"mappings":"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"}
|