col-browser 2.3.10 → 2.4.0

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.
Files changed (53) hide show
  1. package/README.md +29 -0
  2. package/es/bibtex.js +2 -2
  3. package/es/chunks/{BibTex-CPaVr-5w.js → BibTex-79CCKAOK.js} +2 -2
  4. package/es/chunks/{BibTex-CPaVr-5w.js.map → BibTex-79CCKAOK.js.map} +1 -1
  5. package/es/chunks/{DatasetCitation-JpNSTWz-.js → DatasetCitation-BXtAmjdZ.js} +2 -2
  6. package/es/chunks/{DatasetCitation-JpNSTWz-.js.map → DatasetCitation-BXtAmjdZ.js.map} +1 -1
  7. package/es/chunks/{DatasetlogoWithFallback-BhWvpgDn.js → DatasetlogoWithFallback-Dava2uqZ.js} +2 -2
  8. package/es/chunks/{DatasetlogoWithFallback-BhWvpgDn.js.map → DatasetlogoWithFallback-Dava2uqZ.js.map} +1 -1
  9. package/es/chunks/{Distributions-CKn1-Qze.js → Distributions-Bd4hFYdS.js} +3 -3
  10. package/es/chunks/{Distributions-CKn1-Qze.js.map → Distributions-Bd4hFYdS.js.map} +1 -1
  11. package/es/chunks/{MergedDataBadge-DK4XUXsL.js → MergedDataBadge-C1CgoRFz.js} +2 -2
  12. package/es/chunks/{MergedDataBadge-DK4XUXsL.js.map → MergedDataBadge-C1CgoRFz.js.map} +1 -1
  13. package/es/chunks/{TaxonBreakdown-BYRnP8bH.js → TaxonBreakdown-DeWamLu_.js} +2 -2
  14. package/es/chunks/{TaxonBreakdown-BYRnP8bH.js.map → TaxonBreakdown-DeWamLu_.js.map} +1 -1
  15. package/es/chunks/{XrGutter-CORP2r5Y.js → XrGutter-CU7_QPAp.js} +2 -2
  16. package/es/chunks/{XrGutter-CORP2r5Y.js.map → XrGutter-CU7_QPAp.js.map} +1 -1
  17. package/es/chunks/config-D1NH4DTr.js +22 -0
  18. package/es/chunks/config-D1NH4DTr.js.map +1 -0
  19. package/es/chunks/{dataset-BuF063rn.js → dataset-BL6g4w0G.js} +2 -2
  20. package/es/chunks/{dataset-BuF063rn.js.map → dataset-BL6g4w0G.js.map} +1 -1
  21. package/es/chunks/{enumeration-CC8SblcI.js → enumeration-DM8Hb36g.js} +2 -2
  22. package/es/chunks/{enumeration-CC8SblcI.js.map → enumeration-DM8Hb36g.js.map} +1 -1
  23. package/es/chunks/{sector-Behb-WCC.js → sector-Qeo1zPxr.js} +2 -2
  24. package/es/chunks/{sector-Behb-WCC.js.map → sector-Qeo1zPxr.js.map} +1 -1
  25. package/es/chunks/withTheme-Dh6PRuII.js +17 -0
  26. package/es/chunks/withTheme-Dh6PRuII.js.map +1 -0
  27. package/es/config.js +5 -0
  28. package/es/config.js.map +1 -0
  29. package/es/index.js +4 -2
  30. package/es/index.js.map +1 -1
  31. package/es/search.js +14 -13
  32. package/es/search.js.map +1 -1
  33. package/es/sourceDataset.js +7 -6
  34. package/es/sourceDataset.js.map +1 -1
  35. package/es/sourceDatasetList.js +16 -15
  36. package/es/sourceDatasetList.js.map +1 -1
  37. package/es/taxon.js +215 -214
  38. package/es/taxon.js.map +1 -1
  39. package/es/taxonBreakdown.js +23 -22
  40. package/es/taxonBreakdown.js.map +1 -1
  41. package/es/taxonDistribution.js +20 -19
  42. package/es/taxonDistribution.js.map +1 -1
  43. package/es/tree.js +8 -7
  44. package/es/tree.js.map +1 -1
  45. package/package.json +5 -1
  46. package/types/config.d.ts +1 -0
  47. package/types/index.d.ts +21 -0
  48. package/umd/col-browser.js +14 -5
  49. package/umd/col-browser.js.map +1 -1
  50. package/umd/col-browser.min.js +4 -4
  51. package/umd/col-browser.min.js.map +1 -1
  52. package/es/chunks/config-B2Z9BaEd.js +0 -30
  53. package/es/chunks/config-B2Z9BaEd.js.map +0 -1
@@ -1,44 +1,45 @@
1
- import { c as e, w } from "./chunks/config-B2Z9BaEd.js";
2
- import { j as n } from "./chunks/jsx-runtime-BzflLqGi.js";
3
- import { T } from "./chunks/TaxonBreakdown-BYRnP8bH.js";
4
- import { useState as s, useEffect as A } from "react";
1
+ import { w } from "./chunks/withTheme-Dh6PRuII.js";
2
+ import { j as o } from "./chunks/jsx-runtime-BzflLqGi.js";
3
+ import { T } from "./chunks/TaxonBreakdown-DeWamLu_.js";
4
+ import { useState as e, useEffect as A } from "react";
5
5
  import { s as b, c as r, R as v, b as B } from "./chunks/router-CssZk5qZ.js";
6
+ import { c as s } from "./chunks/config-D1NH4DTr.js";
6
7
  import { Row as D, Col as C, Spin as E } from "antd";
7
8
  const S = ({
8
- taxonId: o,
9
+ taxonId: n,
9
10
  datasetKey: t,
10
- level: m = 1,
11
+ level: p = 1,
11
12
  showLevelSwitch: l = !1,
12
- darkMode: x,
13
- auth: f,
13
+ darkMode: f,
14
+ auth: x,
14
15
  ...u
15
16
  }) => {
16
- b(f);
17
- const [i, d] = s(null), [c, h] = s(null), [p, j] = s([]);
17
+ b(x);
18
+ const [i, d] = e(null), [c, h] = e(null), [m, j] = e([]);
18
19
  A(() => {
19
- o && t && k(), t && (R(), g());
20
- }, [o, t]);
21
- const g = () => r(`${e.dataApi}vocab/rank`).then(
20
+ n && t && k(), t && (R(), g());
21
+ }, [n, t]);
22
+ const g = () => r(`${s.dataApi}vocab/rank`).then(
22
23
  (a) => j(a.data.map(($) => $.name))
23
- ), k = () => r(`${e.dataApi}dataset/${t}/taxon/${o}`).then(
24
+ ), k = () => r(`${s.dataApi}dataset/${t}/taxon/${n}`).then(
24
25
  (a) => d(a.data)
25
- ), R = () => r(`${e.dataApi}dataset/${t}`).then(
26
+ ), R = () => r(`${s.dataApi}dataset/${t}`).then(
26
27
  (a) => h(a.data)
27
28
  );
28
- return /* @__PURE__ */ n.jsx(v.Provider, { value: B(u), children: i && c && p.length > 0 ? /* @__PURE__ */ n.jsx(
29
+ return /* @__PURE__ */ o.jsx(v.Provider, { value: B(u), children: i && c && m.length > 0 ? /* @__PURE__ */ o.jsx(
29
30
  T,
30
31
  {
31
32
  taxon: i,
32
33
  datasetKey: t,
33
- rank: p,
34
+ rank: m,
34
35
  dataset: c,
35
- level: m,
36
+ level: p,
36
37
  showLevelSwitch: l,
37
- darkMode: x
38
+ darkMode: f
38
39
  }
39
- ) : /* @__PURE__ */ n.jsx(D, { justify: "center", style: { padding: "24px" }, children: /* @__PURE__ */ n.jsx(C, { children: /* @__PURE__ */ n.jsx(E, { size: "large" }) }) }) });
40
- }, H = w(S);
40
+ ) : /* @__PURE__ */ o.jsx(D, { justify: "center", style: { padding: "24px" }, children: /* @__PURE__ */ o.jsx(C, { children: /* @__PURE__ */ o.jsx(E, { size: "large" }) }) }) });
41
+ }, J = w(S);
41
42
  export {
42
- H as TaxonBreakdown
43
+ J as TaxonBreakdown
43
44
  };
44
45
  //# sourceMappingURL=taxonBreakdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"taxonBreakdown.js","sources":["../src/Taxon/BreakDownWrapper.js","../src/entries/taxonBreakdown.js"],"sourcesContent":["import TaxonBreakdown from \"./TaxonBreakdown\";\nimport React, { useEffect, useState } from \"react\";\nimport client, { setAuth } from \"../api/client\";\nimport config from \"../config\";\nimport { Row, Col, Spin } from \"antd\";\nimport { RouterContext, buildRouter } from \"../router\";\n\nexport const BreakDownWrapper = ({\n taxonId,\n datasetKey,\n level = 1,\n showLevelSwitch = false,\n darkMode,\n auth,\n ...routerProps\n}) => {\n // Private candidate releases (preview/dev) require Basic auth on every call,\n // including the breakdown's taxon/dataset/rank fetches via `client`.\n setAuth(auth);\n const [taxon, setTaxon] = useState(null);\n const [dataset, setDataset] = useState(null);\n const [rank, setRank] = useState([]);\n\n useEffect(() => {\n if (taxonId && datasetKey) getTaxon();\n if (datasetKey) {\n getDataset();\n getRank();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [taxonId, datasetKey]);\n\n const getRank = () =>\n client(`${config.dataApi}vocab/rank`).then((res) =>\n setRank(res.data.map((r) => r.name))\n );\n const getTaxon = () =>\n client(`${config.dataApi}dataset/${datasetKey}/taxon/${taxonId}`).then(\n (res) => setTaxon(res.data)\n );\n const getDataset = () =>\n client(`${config.dataApi}dataset/${datasetKey}`).then((res) =>\n setDataset(res.data)\n );\n\n return (\n <RouterContext.Provider value={buildRouter(routerProps)}>\n {!!taxon && !!dataset && rank.length > 0 ? (\n <TaxonBreakdown\n taxon={taxon}\n datasetKey={datasetKey}\n rank={rank}\n dataset={dataset}\n level={level}\n showLevelSwitch={showLevelSwitch}\n darkMode={darkMode}\n />\n ) : (\n <Row justify=\"center\" style={{ padding: \"24px\" }}>\n <Col>\n <Spin size=\"large\" />\n </Col>\n </Row>\n )}\n </RouterContext.Provider>\n );\n};\n","import { withTheme } from \"../withTheme\";\nimport { BreakDownWrapper } from \"../Taxon/BreakDownWrapper\";\n\nexport const TaxonBreakdown = withTheme(BreakDownWrapper);\n"],"names":["BreakDownWrapper","taxonId","datasetKey","level","showLevelSwitch","darkMode","auth","routerProps","setAuth","taxon","setTaxon","useState","dataset","setDataset","rank","setRank","useEffect","getTaxon","getDataset","getRank","client","config","res","r","RouterContext","buildRouter","jsx","TaxonBreakdown","Row","Col","Spin","withTheme"],"mappings":";;;;;;AAOO,MAAMA,IAAmB,CAAC;AAAA,EAC/B,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,iBAAAC,IAAkB;AAAA,EAClB,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AAGJ,EAAAC,EAAQF,CAAI;AACZ,QAAM,CAACG,GAAOC,CAAQ,IAAIC,EAAS,IAAI,GACjC,CAACC,GAASC,CAAU,IAAIF,EAAS,IAAI,GACrC,CAACG,GAAMC,CAAO,IAAIJ,EAAS,CAAA,CAAE;AAEnC,EAAAK,EAAU,MAAM;AACd,IAAIf,KAAWC,KAAYe,EAAA,GACvBf,MACFgB,EAAA,GACAC,EAAA;AAAA,EAGJ,GAAG,CAAClB,GAASC,CAAU,CAAC;AAExB,QAAMiB,IAAU,MACdC,EAAO,GAAGC,EAAO,OAAO,YAAY,EAAE;AAAA,IAAK,CAACC,MAC1CP,EAAQO,EAAI,KAAK,IAAI,CAACC,MAAMA,EAAE,IAAI,CAAC;AAAA,EAAA,GAEjCN,IAAW,MACfG,EAAO,GAAGC,EAAO,OAAO,WAAWnB,CAAU,UAAUD,CAAO,EAAE,EAAE;AAAA,IAChE,CAACqB,MAAQZ,EAASY,EAAI,IAAI;AAAA,EAAA,GAExBJ,IAAa,MACjBE,EAAO,GAAGC,EAAO,OAAO,WAAWnB,CAAU,EAAE,EAAE;AAAA,IAAK,CAACoB,MACrDT,EAAWS,EAAI,IAAI;AAAA,EAAA;AAGvB,+BACGE,EAAc,UAAd,EAAuB,OAAOC,EAAYlB,CAAW,GACnD,UAAEE,KAAWG,KAAWE,EAAK,SAAS,IACrCY,gBAAAA,EAAAA;AAAAA,IAACC;AAAAA,IAAA;AAAA,MACC,OAAAlB;AAAA,MACA,YAAAP;AAAA,MACA,MAAAY;AAAA,MACA,SAAAF;AAAA,MACA,OAAAT;AAAA,MACA,iBAAAC;AAAA,MACA,UAAAC;AAAA,IAAA;AAAA,EAAA,IAGFqB,gBAAAA,EAAAA,IAACE,GAAA,EAAI,SAAQ,UAAS,OAAO,EAAE,SAAS,OAAA,GACtC,UAAAF,gBAAAA,EAAAA,IAACG,KACC,UAAAH,gBAAAA,EAAAA,IAACI,GAAA,EAAK,MAAK,SAAQ,EAAA,CACrB,GACF,GAEJ;AAEJ,GC/DaH,IAAiBI,EAAU/B,CAAgB;"}
1
+ {"version":3,"file":"taxonBreakdown.js","sources":["../src/Taxon/BreakDownWrapper.js","../src/entries/taxonBreakdown.js"],"sourcesContent":["import TaxonBreakdown from \"./TaxonBreakdown\";\nimport React, { useEffect, useState } from \"react\";\nimport client, { setAuth } from \"../api/client\";\nimport config from \"../config\";\nimport { Row, Col, Spin } from \"antd\";\nimport { RouterContext, buildRouter } from \"../router\";\n\nexport const BreakDownWrapper = ({\n taxonId,\n datasetKey,\n level = 1,\n showLevelSwitch = false,\n darkMode,\n auth,\n ...routerProps\n}) => {\n // Private candidate releases (preview/dev) require Basic auth on every call,\n // including the breakdown's taxon/dataset/rank fetches via `client`.\n setAuth(auth);\n const [taxon, setTaxon] = useState(null);\n const [dataset, setDataset] = useState(null);\n const [rank, setRank] = useState([]);\n\n useEffect(() => {\n if (taxonId && datasetKey) getTaxon();\n if (datasetKey) {\n getDataset();\n getRank();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [taxonId, datasetKey]);\n\n const getRank = () =>\n client(`${config.dataApi}vocab/rank`).then((res) =>\n setRank(res.data.map((r) => r.name))\n );\n const getTaxon = () =>\n client(`${config.dataApi}dataset/${datasetKey}/taxon/${taxonId}`).then(\n (res) => setTaxon(res.data)\n );\n const getDataset = () =>\n client(`${config.dataApi}dataset/${datasetKey}`).then((res) =>\n setDataset(res.data)\n );\n\n return (\n <RouterContext.Provider value={buildRouter(routerProps)}>\n {!!taxon && !!dataset && rank.length > 0 ? (\n <TaxonBreakdown\n taxon={taxon}\n datasetKey={datasetKey}\n rank={rank}\n dataset={dataset}\n level={level}\n showLevelSwitch={showLevelSwitch}\n darkMode={darkMode}\n />\n ) : (\n <Row justify=\"center\" style={{ padding: \"24px\" }}>\n <Col>\n <Spin size=\"large\" />\n </Col>\n </Row>\n )}\n </RouterContext.Provider>\n );\n};\n","import { withTheme } from \"../withTheme\";\nimport { BreakDownWrapper } from \"../Taxon/BreakDownWrapper\";\n\nexport const TaxonBreakdown = withTheme(BreakDownWrapper);\n"],"names":["BreakDownWrapper","taxonId","datasetKey","level","showLevelSwitch","darkMode","auth","routerProps","setAuth","taxon","setTaxon","useState","dataset","setDataset","rank","setRank","useEffect","getTaxon","getDataset","getRank","client","config","res","r","RouterContext","buildRouter","jsx","TaxonBreakdown","Row","Col","Spin","withTheme"],"mappings":";;;;;;;AAOO,MAAMA,IAAmB,CAAC;AAAA,EAC/B,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,iBAAAC,IAAkB;AAAA,EAClB,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AAGJ,EAAAC,EAAQF,CAAI;AACZ,QAAM,CAACG,GAAOC,CAAQ,IAAIC,EAAS,IAAI,GACjC,CAACC,GAASC,CAAU,IAAIF,EAAS,IAAI,GACrC,CAACG,GAAMC,CAAO,IAAIJ,EAAS,CAAA,CAAE;AAEnC,EAAAK,EAAU,MAAM;AACd,IAAIf,KAAWC,KAAYe,EAAA,GACvBf,MACFgB,EAAA,GACAC,EAAA;AAAA,EAGJ,GAAG,CAAClB,GAASC,CAAU,CAAC;AAExB,QAAMiB,IAAU,MACdC,EAAO,GAAGC,EAAO,OAAO,YAAY,EAAE;AAAA,IAAK,CAACC,MAC1CP,EAAQO,EAAI,KAAK,IAAI,CAACC,MAAMA,EAAE,IAAI,CAAC;AAAA,EAAA,GAEjCN,IAAW,MACfG,EAAO,GAAGC,EAAO,OAAO,WAAWnB,CAAU,UAAUD,CAAO,EAAE,EAAE;AAAA,IAChE,CAACqB,MAAQZ,EAASY,EAAI,IAAI;AAAA,EAAA,GAExBJ,IAAa,MACjBE,EAAO,GAAGC,EAAO,OAAO,WAAWnB,CAAU,EAAE,EAAE;AAAA,IAAK,CAACoB,MACrDT,EAAWS,EAAI,IAAI;AAAA,EAAA;AAGvB,+BACGE,EAAc,UAAd,EAAuB,OAAOC,EAAYlB,CAAW,GACnD,UAAEE,KAAWG,KAAWE,EAAK,SAAS,IACrCY,gBAAAA,EAAAA;AAAAA,IAACC;AAAAA,IAAA;AAAA,MACC,OAAAlB;AAAA,MACA,YAAAP;AAAA,MACA,MAAAY;AAAA,MACA,SAAAF;AAAA,MACA,OAAAT;AAAA,MACA,iBAAAC;AAAA,MACA,UAAAC;AAAA,IAAA;AAAA,EAAA,IAGFqB,gBAAAA,EAAAA,IAACE,GAAA,EAAI,SAAQ,UAAS,OAAO,EAAE,SAAS,OAAA,GACtC,UAAAF,gBAAAA,EAAAA,IAACG,KACC,UAAAH,gBAAAA,EAAAA,IAACI,GAAA,EAAK,MAAK,SAAQ,EAAA,CACrB,GACF,GAEJ;AAEJ,GC/DaH,IAAiBI,EAAU/B,CAAgB;"}
@@ -1,41 +1,42 @@
1
- import { c as a, w as R } from "./chunks/config-B2Z9BaEd.js";
2
- import { j as i } from "./chunks/jsx-runtime-BzflLqGi.js";
3
- import { useState as s, useEffect as $ } from "react";
4
- import { s as D, c as l, R as T, b as g } from "./chunks/router-CssZk5qZ.js";
1
+ import { w as R } from "./chunks/withTheme-Dh6PRuII.js";
2
+ import { j as n } from "./chunks/jsx-runtime-BzflLqGi.js";
3
+ import { useState as a, useEffect as $ } from "react";
4
+ import { s as D, c as s, R as T, b as g } from "./chunks/router-CssZk5qZ.js";
5
+ import { c as l } from "./chunks/config-D1NH4DTr.js";
5
6
  import { Row as k, Col as v, Spin as w } from "antd";
6
- import { D as A } from "./chunks/Distributions-CKn1-Qze.js";
7
+ import { D as A } from "./chunks/Distributions-Bd4hFYdS.js";
7
8
  const C = ({
8
9
  taxonId: o,
9
- datasetKey: n,
10
+ datasetKey: i,
10
11
  gbifChecklistKey: d,
11
12
  style: x,
12
13
  auth: b,
13
14
  ...h
14
15
  }) => {
15
16
  D(b);
16
- const [u, c] = s(null), [p, m] = s(null), [f, j] = s([]);
17
+ const [u, p] = a(null), [c, m] = a(null), [f, j] = a([]);
17
18
  return $(() => {
18
19
  let r = !1;
19
- if (c(null), m(null), !(!o || !n))
20
- return l(`${a.dataApi}vocab/rank`).then((t) => {
20
+ if (p(null), m(null), !(!o || !i))
21
+ return s(`${l.dataApi}vocab/rank`).then((t) => {
21
22
  r || j(t.data.map((e) => e.name));
22
- }), l(
23
- `${a.dataApi}dataset/${n}/taxon/${encodeURIComponent(o)}`
23
+ }), s(
24
+ `${l.dataApi}dataset/${i}/taxon/${encodeURIComponent(o)}`
24
25
  ).then((t) => {
25
- r || c(t.data);
26
- }), l(
27
- `${a.dataApi}dataset/${n}/taxon/${encodeURIComponent(o)}/info`
26
+ r || p(t.data);
27
+ }), s(
28
+ `${l.dataApi}dataset/${i}/taxon/${encodeURIComponent(o)}/info`
28
29
  ).then((t) => {
29
30
  var e;
30
31
  r || m(((e = t == null ? void 0 : t.data) == null ? void 0 : e.distributions) || []);
31
32
  }), () => {
32
33
  r = !0;
33
34
  };
34
- }, [o, n]), /* @__PURE__ */ i.jsx(T.Provider, { value: g(h), children: !u || p === null || f.length === 0 ? /* @__PURE__ */ i.jsx(k, { justify: "center", style: { padding: "24px" }, children: /* @__PURE__ */ i.jsx(v, { children: /* @__PURE__ */ i.jsx(w, { size: "large" }) }) }) : /* @__PURE__ */ i.jsx(
35
+ }, [o, i]), /* @__PURE__ */ n.jsx(T.Provider, { value: g(h), children: !u || c === null || f.length === 0 ? /* @__PURE__ */ n.jsx(k, { justify: "center", style: { padding: "24px" }, children: /* @__PURE__ */ n.jsx(v, { children: /* @__PURE__ */ n.jsx(w, { size: "large" }) }) }) : /* @__PURE__ */ n.jsx(
35
36
  A,
36
37
  {
37
- data: p,
38
- datasetKey: n,
38
+ data: c,
39
+ datasetKey: i,
39
40
  focalTaxon: u,
40
41
  rankOrder: f,
41
42
  gbifChecklistKey: d,
@@ -43,8 +44,8 @@ const C = ({
43
44
  style: x
44
45
  }
45
46
  ) });
46
- }, P = R(C);
47
+ }, W = R(C);
47
48
  export {
48
- P as TaxonDistribution
49
+ W as TaxonDistribution
49
50
  };
50
51
  //# sourceMappingURL=taxonDistribution.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"taxonDistribution.js","sources":["../src/Taxon/DistributionsWrapper.js","../src/entries/taxonDistribution.js"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport client, { setAuth } from \"../api/client\";\nimport config from \"../config\";\nimport { Row, Col, Spin } from \"antd\";\nimport Distributions from \"./Distributions\";\nimport { RouterContext, buildRouter } from \"../router\";\n\n// Standalone wrapper around the Taxon page's Distributions block.\n// Loads the focal taxon, its info (which carries the distributions array),\n// and the rank vocabulary — same data the Taxon page already loads — so\n// embedders can drop the map onto any page given just (datasetKey, taxonId).\nexport const DistributionsWrapper = ({\n taxonId,\n datasetKey,\n gbifChecklistKey,\n style,\n auth,\n ...routerProps\n}) => {\n // Private candidate releases (preview/dev) require Basic auth on every call,\n // including the taxon/info/rank fetches below via `client`.\n setAuth(auth);\n const [taxon, setTaxon] = useState(null);\n const [distributions, setDistributions] = useState(null);\n const [rank, setRank] = useState([]);\n\n useEffect(() => {\n let cancelled = false;\n setTaxon(null);\n setDistributions(null);\n\n if (!taxonId || !datasetKey) return undefined;\n\n client(`${config.dataApi}vocab/rank`).then((res) => {\n if (!cancelled) setRank(res.data.map((r) => r.name));\n });\n client(\n `${config.dataApi}dataset/${datasetKey}/taxon/${encodeURIComponent(taxonId)}`\n ).then((res) => {\n if (!cancelled) setTaxon(res.data);\n });\n client(\n `${config.dataApi}dataset/${datasetKey}/taxon/${encodeURIComponent(taxonId)}/info`\n ).then((res) => {\n if (!cancelled) setDistributions(res?.data?.distributions || []);\n });\n\n return () => {\n cancelled = true;\n };\n }, [taxonId, datasetKey]);\n\n return (\n <RouterContext.Provider value={buildRouter(routerProps)}>\n {!taxon || distributions === null || rank.length === 0 ? (\n <Row justify=\"center\" style={{ padding: \"24px\" }}>\n <Col>\n <Spin size=\"large\" />\n </Col>\n </Row>\n ) : (\n <Distributions\n data={distributions}\n datasetKey={datasetKey}\n focalTaxon={taxon}\n rankOrder={rank}\n gbifChecklistKey={gbifChecklistKey}\n showDistributionMap={true}\n style={style}\n />\n )}\n </RouterContext.Provider>\n );\n};\n\nexport default DistributionsWrapper;\n","import { withTheme } from \"../withTheme\";\nimport { DistributionsWrapper } from \"../Taxon/DistributionsWrapper\";\n\nexport const TaxonDistribution = withTheme(DistributionsWrapper);\n"],"names":["DistributionsWrapper","taxonId","datasetKey","gbifChecklistKey","style","auth","routerProps","setAuth","taxon","setTaxon","useState","distributions","setDistributions","rank","setRank","useEffect","cancelled","client","config","res","r","_a","jsx","RouterContext","buildRouter","Row","Col","Spin","Distributions","TaxonDistribution","withTheme"],"mappings":";;;;;;AAWO,MAAMA,IAAuB,CAAC;AAAA,EACnC,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AAGJ,EAAAC,EAAQF,CAAI;AACZ,QAAM,CAACG,GAAOC,CAAQ,IAAIC,EAAS,IAAI,GACjC,CAACC,GAAeC,CAAgB,IAAIF,EAAS,IAAI,GACjD,CAACG,GAAMC,CAAO,IAAIJ,EAAS,CAAA,CAAE;AAEnC,SAAAK,EAAU,MAAM;AACd,QAAIC,IAAY;AAIhB,QAHAP,EAAS,IAAI,GACbG,EAAiB,IAAI,GAEjB,GAACX,KAAW,CAACC;AAEjB,aAAAe,EAAO,GAAGC,EAAO,OAAO,YAAY,EAAE,KAAK,CAACC,MAAQ;AAClD,QAAKH,KAAWF,EAAQK,EAAI,KAAK,IAAI,CAACC,MAAMA,EAAE,IAAI,CAAC;AAAA,MACrD,CAAC,GACDH;AAAA,QACE,GAAGC,EAAO,OAAO,WAAWhB,CAAU,UAAU,mBAAmBD,CAAO,CAAC;AAAA,MAAA,EAC3E,KAAK,CAACkB,MAAQ;AACd,QAAKH,KAAWP,EAASU,EAAI,IAAI;AAAA,MACnC,CAAC,GACDF;AAAA,QACE,GAAGC,EAAO,OAAO,WAAWhB,CAAU,UAAU,mBAAmBD,CAAO,CAAC;AAAA,MAAA,EAC3E,KAAK,CAACkB,MAAQ;;AACd,QAAKH,KAAWJ,IAAiBS,IAAAF,KAAA,gBAAAA,EAAK,SAAL,gBAAAE,EAAW,kBAAiB,EAAE;AAAA,MACjE,CAAC,GAEM,MAAM;AACX,QAAAL,IAAY;AAAA,MACd;AAAA,EACF,GAAG,CAACf,GAASC,CAAU,CAAC,GAGtBoB,gBAAAA,EAAAA,IAACC,EAAc,UAAd,EAAuB,OAAOC,EAAYlB,CAAW,GACnD,UAAA,CAACE,KAASG,MAAkB,QAAQE,EAAK,WAAW,IACnDS,gBAAAA,EAAAA,IAACG,GAAA,EAAI,SAAQ,UAAS,OAAO,EAAE,SAAS,UACtC,UAAAH,gBAAAA,EAAAA,IAACI,GAAA,EACC,UAAAJ,gBAAAA,EAAAA,IAACK,GAAA,EAAK,MAAK,QAAA,CAAQ,EAAA,CACrB,GACF,IAEAL,gBAAAA,EAAAA;AAAAA,IAACM;AAAAA,IAAA;AAAA,MACC,MAAMjB;AAAA,MACN,YAAAT;AAAA,MACA,YAAYM;AAAA,MACZ,WAAWK;AAAA,MACX,kBAAAV;AAAA,MACA,qBAAqB;AAAA,MACrB,OAAAC;AAAA,IAAA;AAAA,EAAA,GAGN;AAEJ,GCtEayB,IAAoBC,EAAU9B,CAAoB;"}
1
+ {"version":3,"file":"taxonDistribution.js","sources":["../src/Taxon/DistributionsWrapper.js","../src/entries/taxonDistribution.js"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport client, { setAuth } from \"../api/client\";\nimport config from \"../config\";\nimport { Row, Col, Spin } from \"antd\";\nimport Distributions from \"./Distributions\";\nimport { RouterContext, buildRouter } from \"../router\";\n\n// Standalone wrapper around the Taxon page's Distributions block.\n// Loads the focal taxon, its info (which carries the distributions array),\n// and the rank vocabulary — same data the Taxon page already loads — so\n// embedders can drop the map onto any page given just (datasetKey, taxonId).\nexport const DistributionsWrapper = ({\n taxonId,\n datasetKey,\n gbifChecklistKey,\n style,\n auth,\n ...routerProps\n}) => {\n // Private candidate releases (preview/dev) require Basic auth on every call,\n // including the taxon/info/rank fetches below via `client`.\n setAuth(auth);\n const [taxon, setTaxon] = useState(null);\n const [distributions, setDistributions] = useState(null);\n const [rank, setRank] = useState([]);\n\n useEffect(() => {\n let cancelled = false;\n setTaxon(null);\n setDistributions(null);\n\n if (!taxonId || !datasetKey) return undefined;\n\n client(`${config.dataApi}vocab/rank`).then((res) => {\n if (!cancelled) setRank(res.data.map((r) => r.name));\n });\n client(\n `${config.dataApi}dataset/${datasetKey}/taxon/${encodeURIComponent(taxonId)}`\n ).then((res) => {\n if (!cancelled) setTaxon(res.data);\n });\n client(\n `${config.dataApi}dataset/${datasetKey}/taxon/${encodeURIComponent(taxonId)}/info`\n ).then((res) => {\n if (!cancelled) setDistributions(res?.data?.distributions || []);\n });\n\n return () => {\n cancelled = true;\n };\n }, [taxonId, datasetKey]);\n\n return (\n <RouterContext.Provider value={buildRouter(routerProps)}>\n {!taxon || distributions === null || rank.length === 0 ? (\n <Row justify=\"center\" style={{ padding: \"24px\" }}>\n <Col>\n <Spin size=\"large\" />\n </Col>\n </Row>\n ) : (\n <Distributions\n data={distributions}\n datasetKey={datasetKey}\n focalTaxon={taxon}\n rankOrder={rank}\n gbifChecklistKey={gbifChecklistKey}\n showDistributionMap={true}\n style={style}\n />\n )}\n </RouterContext.Provider>\n );\n};\n\nexport default DistributionsWrapper;\n","import { withTheme } from \"../withTheme\";\nimport { DistributionsWrapper } from \"../Taxon/DistributionsWrapper\";\n\nexport const TaxonDistribution = withTheme(DistributionsWrapper);\n"],"names":["DistributionsWrapper","taxonId","datasetKey","gbifChecklistKey","style","auth","routerProps","setAuth","taxon","setTaxon","useState","distributions","setDistributions","rank","setRank","useEffect","cancelled","client","config","res","r","_a","jsx","RouterContext","buildRouter","Row","Col","Spin","Distributions","TaxonDistribution","withTheme"],"mappings":";;;;;;;AAWO,MAAMA,IAAuB,CAAC;AAAA,EACnC,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AAGJ,EAAAC,EAAQF,CAAI;AACZ,QAAM,CAACG,GAAOC,CAAQ,IAAIC,EAAS,IAAI,GACjC,CAACC,GAAeC,CAAgB,IAAIF,EAAS,IAAI,GACjD,CAACG,GAAMC,CAAO,IAAIJ,EAAS,CAAA,CAAE;AAEnC,SAAAK,EAAU,MAAM;AACd,QAAIC,IAAY;AAIhB,QAHAP,EAAS,IAAI,GACbG,EAAiB,IAAI,GAEjB,GAACX,KAAW,CAACC;AAEjB,aAAAe,EAAO,GAAGC,EAAO,OAAO,YAAY,EAAE,KAAK,CAACC,MAAQ;AAClD,QAAKH,KAAWF,EAAQK,EAAI,KAAK,IAAI,CAACC,MAAMA,EAAE,IAAI,CAAC;AAAA,MACrD,CAAC,GACDH;AAAA,QACE,GAAGC,EAAO,OAAO,WAAWhB,CAAU,UAAU,mBAAmBD,CAAO,CAAC;AAAA,MAAA,EAC3E,KAAK,CAACkB,MAAQ;AACd,QAAKH,KAAWP,EAASU,EAAI,IAAI;AAAA,MACnC,CAAC,GACDF;AAAA,QACE,GAAGC,EAAO,OAAO,WAAWhB,CAAU,UAAU,mBAAmBD,CAAO,CAAC;AAAA,MAAA,EAC3E,KAAK,CAACkB,MAAQ;;AACd,QAAKH,KAAWJ,IAAiBS,IAAAF,KAAA,gBAAAA,EAAK,SAAL,gBAAAE,EAAW,kBAAiB,EAAE;AAAA,MACjE,CAAC,GAEM,MAAM;AACX,QAAAL,IAAY;AAAA,MACd;AAAA,EACF,GAAG,CAACf,GAASC,CAAU,CAAC,GAGtBoB,gBAAAA,EAAAA,IAACC,EAAc,UAAd,EAAuB,OAAOC,EAAYlB,CAAW,GACnD,UAAA,CAACE,KAASG,MAAkB,QAAQE,EAAK,WAAW,IACnDS,gBAAAA,EAAAA,IAACG,GAAA,EAAI,SAAQ,UAAS,OAAO,EAAE,SAAS,UACtC,UAAAH,gBAAAA,EAAAA,IAACI,GAAA,EACC,UAAAJ,gBAAAA,EAAAA,IAACK,GAAA,EAAK,MAAK,QAAA,CAAQ,EAAA,CACrB,GACF,IAEAL,gBAAAA,EAAAA;AAAAA,IAACM;AAAAA,IAAA;AAAA,MACC,MAAMjB;AAAA,MACN,YAAAT;AAAA,MACA,YAAYM;AAAA,MACZ,WAAWK;AAAA,MACX,kBAAAV;AAAA,MACA,qBAAqB;AAAA,MACrB,OAAAC;AAAA,IAAA;AAAA,EAAA,GAGN;AAEJ,GCtEayB,IAAoBC,EAAU9B,CAAoB;"}
package/es/tree.js CHANGED
@@ -2,18 +2,19 @@ var Y = Object.defineProperty;
2
2
  var tt = (x, y, t) => y in x ? Y(x, y, { enumerable: !0, configurable: !0, writable: !0, value: t }) : x[y] = t;
3
3
  var u = (x, y, t) => tt(x, typeof y != "symbol" ? y + "" : y, t);
4
4
  import { a as et } from "./chunks/withDatasetKey-BgMY05XE.js";
5
- import { c as D, w as st } from "./chunks/config-B2Z9BaEd.js";
5
+ import { w as st } from "./chunks/withTheme-Dh6PRuII.js";
6
6
  import { j as e } from "./chunks/jsx-runtime-BzflLqGi.js";
7
7
  import j, { createContext as at } from "react";
8
8
  import { Popover as ot, Divider as it, Spin as q, Tag as nt, Alert as w, Skeleton as rt, Tree as lt, Button as dt, Row as ht, Col as I, Checkbox as N } from "antd";
9
9
  import { sortBy as _, get as m, isUndefined as A, flatten as ct, isArray as O } from "lodash-es";
10
10
  import { L as P, c as K, R as H, s as ut, b as pt } from "./chunks/router-CssZk5qZ.js";
11
+ import { c as D } from "./chunks/config-D1NH4DTr.js";
11
12
  import L from "dataloader";
12
- import { c as V, b as z, g as ft } from "./chunks/dataset-BuF063rn.js";
13
- import { M as xt } from "./chunks/MergedDataBadge-DK4XUXsL.js";
13
+ import { c as V, b as z, g as ft } from "./chunks/dataset-BL6g4w0G.js";
14
+ import { M as xt } from "./chunks/MergedDataBadge-C1CgoRFz.js";
14
15
  import { E as gt } from "./chunks/ErrorMsg-K8k5PPTp.js";
15
- import { g as yt } from "./chunks/sector-Behb-WCC.js";
16
- import { C as R, N as mt } from "./chunks/DatasetCitation-JpNSTWz-.js";
16
+ import { g as yt } from "./chunks/sector-Qeo1zPxr.js";
17
+ import { C as R, N as mt } from "./chunks/DatasetCitation-BXtAmjdZ.js";
17
18
  import { r as F, w as M } from "./chunks/storage-BgdCo9fV.js";
18
19
  const E = at({
19
20
  datasetLoader: null,
@@ -829,8 +830,8 @@ function St({
829
830
  }
830
831
  ) });
831
832
  }
832
- const Ot = st(et(St));
833
+ const Rt = st(et(St));
833
834
  export {
834
- Ot as Tree
835
+ Rt as Tree
835
836
  };
836
837
  //# sourceMappingURL=tree.js.map
package/es/tree.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tree.js","sources":["../src/ColTree/treeCache.js","../src/ColTree/TaxonSources.js","../src/ColTree/ColTreeContext.js","../src/ColTree/ColTreeNode.js","../src/ColTree/ColTree.js","../src/ColTree/index.js","../src/entries/tree.js"],"sourcesContent":["import { createContext } from \"react\";\nimport DataLoader from \"dataloader\";\nimport { getDatasetsBatch, getPublishersBatch } from \"../api/dataset\";\n\n// Shared DataLoaders for the Tree subtree. Created once per (datasetKey,\n// mounted Tree) and provided via TreeCacheContext so every TaxonSources,\n// every sector-dataset decoration in ColTree, and any other in-tree\n// consumer hits the same in-memory cache. Without this, each TaxonSources\n// instance creates its own loader and the same source/publisher dataset\n// is fetched once per node it appears under.\n//\n// DataLoader batches calls inside a microtask and caches resolved values\n// indefinitely for the lifetime of the loader.\n\nexport const TreeCacheContext = createContext({\n datasetLoader: null,\n publisherLoader: null,\n});\n\nexport const createTreeCache = (datasetKey) => ({\n datasetLoader: new DataLoader((ids) => getDatasetsBatch(ids, datasetKey)),\n publisherLoader: new DataLoader((ids) =>\n getPublishersBatch(ids, datasetKey)\n ),\n});\n","import React from \"react\";\nimport { Popover, Spin, Divider } from \"antd\";\nimport DataLoader from \"dataloader\";\nimport { sortBy } from \"lodash-es\";\nimport { LinkTo } from \"../router\";\nimport { TreeCacheContext } from \"./treeCache\";\nimport { getDatasetsBatch, getPublishersBatch } from \"../api/dataset\";\nimport config from \"../config\";\n\nclass TaxonSources extends React.Component {\n static contextType = TreeCacheContext;\n\n constructor(props) {\n super(props);\n this.state = {\n data: [],\n showInNode: false,\n loading: false,\n };\n }\n\n // Returns the shared cache from TreeCacheContext if available, or a\n // throwaway local DataLoader so the popover still works even if context\n // doesn't reach this instance (which used to leave the spinner stuck\n // because getData early-returned with no loading state set).\n getDatasetLoader = () => {\n const { datasetKey } = this.props;\n if (this.context?.datasetLoader) return this.context.datasetLoader;\n if (!this._localDatasetLoader) {\n this._localDatasetLoader = new DataLoader((ids) =>\n getDatasetsBatch(ids, datasetKey)\n );\n }\n return this._localDatasetLoader;\n };\n\n getPublisherLoader = () => {\n const { datasetKey } = this.props;\n if (this.context?.publisherLoader) return this.context.publisherLoader;\n if (!this._localPublisherLoader) {\n this._localPublisherLoader = new DataLoader((ids) =>\n getPublishersBatch(ids, datasetKey)\n );\n }\n return this._localPublisherLoader;\n };\n\n componentDidMount = () => {\n const { sourceDatasetKeys } = this.props;\n if (sourceDatasetKeys && sourceDatasetKeys.length < 4) {\n this.setState({ showInNode: true }, this.getData);\n }\n };\n\n getData = () => {\n const { sourceDatasetKeys } = this.props;\n if (!sourceDatasetKeys?.length) return;\n this.setState({ loading: true });\n const loader = this.getDatasetLoader();\n Promise.all(\n sourceDatasetKeys.map((s) => loader.load(s).catch(() => null))\n )\n .then((data) => {\n this.setState({ data: sortBy(data, [\"alias\"]), loading: false });\n })\n .catch(() => {\n this.setState({ data: [], loading: false });\n });\n };\n\n getPublisherData = () => {\n const { publisherDatasetKeys } = this.props;\n if (!publisherDatasetKeys) return;\n const loader = this.getPublisherLoader();\n Promise.all(\n Object.keys(publisherDatasetKeys).map((s) =>\n loader\n .load(s)\n .then((publisher) => ({\n ...publisher,\n datasets: publisherDatasetKeys[s],\n }))\n .catch(() => null)\n )\n )\n .then((data) => {\n this.setState({ publishers: sortBy(data.filter(Boolean), [\"alias\"]) });\n })\n .catch(() => {\n this.setState({ publishers: [] });\n });\n };\n\n render = () => {\n const { data, showInNode, popOverVisible, loading } = this.state;\n const { taxon, datasetKey } = this.props;\n const linkStyle = { color: \"orange\", fontSize: \"11px\" };\n const publisherUrl = (uuid) =>\n `${config.clbPortal}/dataset/${datasetKey}/publisher/${uuid}`;\n\n if (showInNode) {\n return data\n .filter((d) => !!d)\n .map((d, index) => (\n <LinkTo\n to=\"source\"\n args={d.key}\n key={d.key}\n className=\"col-tree-data-source\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.key)}\n </LinkTo>\n ));\n }\n\n return (\n <div style={{ display: \"inline\" }} id={`taxon_sources_${taxon.id}`}>\n <Popover\n getPopupContainer={() =>\n document.getElementById(`taxon_sources_${taxon.id}`)\n }\n content={\n loading || data.length === 0 ? (\n <div\n style={{ minWidth: \"200px\", textAlign: \"center\", padding: \"8px 0\" }}\n >\n <Spin size=\"small\" />\n </div>\n ) : (\n <div style={{ maxWidth: \"500px\" }}>\n {data.length > 0 && (\n <div>\n {data\n .filter((d) => !!d)\n .map((d, index) => (\n <LinkTo\n to=\"source\"\n args={d.key}\n key={d.key}\n className=\"col-tree-data-source\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.key)}\n </LinkTo>\n ))}\n </div>\n )}\n {this.state.publishers && this.state.publishers.length > 0 && (\n <div style={{ marginTop: \"12px\" }}>\n <strong>Publishers</strong>\n <div>\n {this.state.publishers\n .filter((d) => !!d)\n .map((d, index) => (\n <a\n key={d.id}\n href={publisherUrl(d.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.id)}\n {d.datasets?.length\n ? ` (${d.datasets.length.toLocaleString(\"en-GB\")})`\n : \"\"}\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n title={\n <div style={{ padding: \"4px 0\" }}>\n <span style={{ fontWeight: 500 }}>Sources for </span>\n <em>{taxon?.name}</em>\n <Divider style={{ margin: \"8px 0 0\" }} />\n </div>\n }\n open={popOverVisible}\n onOpenChange={(visible) =>\n this.setState({ popOverVisible: visible }, () => {\n if (visible && this.state.data.length === 0) this.getData();\n if (\n visible &&\n this.props.publisherDatasetKeys &&\n !this.state.publishers\n ) {\n this.getPublisherData();\n }\n })\n }\n trigger=\"click\"\n placement=\"rightTop\"\n >\n <a\n className=\"col-tree-data-source\"\n role=\"button\"\n tabIndex={0}\n style={{ cursor: \"pointer\", color: \"orange\", fontSize: \"11px\" }}\n onClick={(e) => e.preventDefault()}\n >\n Multiple sources\n </a>\n </Popover>\n </div>\n );\n };\n}\n\nexport default TaxonSources;\n","import React from \"react\";\n\nexport const ColTreeContext = React.createContext();\n","import React from \"react\";\nimport { Tag } from \"antd\";\nimport { get, isUndefined } from \"lodash-es\";\nimport TaxonSources from \"./TaxonSources\";\nimport MergedDataBadge from \"../components/MergedDataBadge\";\nimport {ColTreeContext} from \"./ColTreeContext\"\nimport { LinkTo } from \"../router\";\n\nclass ColTreeNode extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n style: {},\n provisional: this.props.taxon.status === \"provisionally accepted\",\n loading: false,\n };\n }\n\n rankIsAboveSpecies = (rank) => {\n return this.props.rank.indexOf(rank) < this.props.rank.indexOf(\"species\");\n };\n\n render = () => {\n const {\n taxon,\n taxon: { sector, sourceDatasetKeys, publisherDatasetKeys },\n datasetKey,\n } = this.props;\n\n const sectorSourceDataset = get(sector, \"dataset\");\n/* const hasDatasetSectors = datasetSectors && ( sector && sector.subjectDatasetKey ? Object.keys(omit(datasetSectors, [sector.subjectDatasetKey])).length > 0 : true)\n */ \nconst hasDatasetSectors =\n(sourceDatasetKeys || []).filter((d) => sector?.subjectDatasetKey !== d)\n .length > 0;\n const estimate = taxon.estimate && taxon.estimates ? taxon.estimates.find(e => e.estimate === taxon.estimate) : null;\n // Virtual \"Not assigned\" placeholders inserted by the API\n // (insertPlaceholder=true) aren't real taxa, so they can't be linked\n // to a taxon page.\n const isPlaceholder =\n typeof taxon.id === \"string\" && taxon.id.indexOf(\"incertae-sedis\") > -1;\n\n return (\n <ColTreeContext.Consumer>\n {({ showInfo }) => (\n <div id={taxon.id}>\n <span>\n <span className=\"tree-node-rank\">{taxon.rank}: </span>\n {isPlaceholder ? (\n <span dangerouslySetInnerHTML={{ __html: taxon.labelHtml }} />\n ) : (\n <LinkTo to=\"taxon\" args={taxon.id}>\n <span dangerouslySetInnerHTML={{ __html: taxon.labelHtml }} />\n </LinkTo>\n )}\n {taxon?.merged && (\n <MergedDataBadge style={{ marginLeft: \"4px\" }} datasetKey={taxon?.datasetKey} verbatimSourceKey={taxon?.verbatimSourceKey}/>\n )}\n </span>\n {/* estimate && (\n <span>\n {\" \"}\n • <TaxonEstimate estimate={estimate} taxon={taxon} />\n </span>\n ) */}\n {showInfo && taxon.status === \"provisionally accepted\" && (\n <React.Fragment> • <Tag color=\"warning\" style={{marginRight: 0}}>\n prov.\n </Tag>\n </React.Fragment>\n )}\n\n {!isUndefined(taxon.count) &&\n this.rankIsAboveSpecies(taxon?.rank) && (\n <span>\n {\" \"}\n • {Number(taxon.count).toLocaleString()}{\" \"}\n {showInfo && !isUndefined(taxon.speciesEstimate) && (\n <span>\n {\" \"}\n of{\" \"}\n {Number(\n taxon.speciesEstimate\n ).toLocaleString()}{\" \"}\n est.{\" \"}\n </span>\n )}\n spp.\n </span>\n )} \n \n \n {showInfo && sector && (\n <span>\n <span> • </span>\n <LinkTo\n to=\"source\"\n args={sector.subjectDatasetKey}\n style={hasDatasetSectors ? {fontWeight: 'bold'} : null}\n className=\"col-tree-data-source\"\n >\n {get(sectorSourceDataset, \"alias\") || sector.subjectDatasetKey}{hasDatasetSectors && \", \"}\n </LinkTo>\n </span>\n )}\n {showInfo && hasDatasetSectors && (\n <React.Fragment> <TaxonSources\n sourceDatasetKeys={sourceDatasetKeys}\n publisherDatasetKeys={publisherDatasetKeys}\n taxon={taxon}\n datasetKey={datasetKey}\n />\n </React.Fragment>\n )}\n \n </div>\n )}\n </ColTreeContext.Consumer>\n\n );\n };\n}\n\nexport default ColTreeNode;\n","import React from \"react\";\nimport { Tree, Alert, Spin, Button, Skeleton } from \"antd\";\nimport { flatten, get, isArray } from \"lodash-es\";\nimport client from \"../api/client\";\nimport config from \"../config\";\nimport ColTreeNode from \"./ColTreeNode\";\nimport ErrorMsg from \"../components/ErrorMsg\";\nimport { getSectorsBatch } from \"../api/sector\";\nimport DataLoader from \"dataloader\";\nimport { TreeCacheContext } from \"./treeCache\";\n\nconst CHILD_PAGE_SIZE = 1000; // How many children will we load at a time\n\n// Key of the synthetic \"Load more...\" child node. It has to be scoped to its\n// parent: two nodes that both have more children than one page would otherwise\n// share one key and antd warns \"Same 'key' exist in the Tree\" (issue #59).\nconst LOAD_MORE_PREFIX = \"__loadMoreBTN__\";\nconst loadMoreKey = (parentKey) => `${LOAD_MORE_PREFIX}${parentKey}`;\nconst isLoadMoreKey = (key) =>\n typeof key === \"string\" && key.startsWith(LOAD_MORE_PREFIX);\n\nclass LoadMoreChildrenTreeNode extends React.Component {\n constructor(props) {\n super(props);\n this.state = { loading: false };\n }\n\n onClick = () => {\n this.setState({ loading: true }, () =>\n this.props.onClick().then(() => this.setState({ loading: false }))\n );\n };\n render = () => {\n const { loading } = this.state;\n return (\n <React.Fragment>\n {loading && <Spin />}\n {!loading && (\n <a onClick={this.onClick}>\n <strong>Load more...</strong>\n </a>\n )}\n </React.Fragment>\n );\n };\n}\n\nclass ColTree extends React.Component {\n static contextType = TreeCacheContext;\n\n constructor(props) {\n super(props);\n\n this.state = {\n rootLoading: true,\n treeData: [],\n loadedKeys: [],\n expandedKeys: [],\n rootTotal: 0,\n error: null,\n nodeNotFoundErr: null,\n rank: []\n };\n this.treeRef = React.createRef();\n // Incremented on every root load; a response whose id is no longer the\n // current one is stale and gets discarded (see loadRoot).\n this.rootRequestId = 0;\n }\n\n // datasetLoader comes from the shared TreeCacheContext so multiple tree\n // nodes (and TaxonSources instances) share one in-memory cache instead\n // of each re-fetching the same source datasets.\n get datasetLoader() {\n return this.context.datasetLoader;\n }\n\n componentDidMount = () => {\n const { datasetKey } = this.props;\n this.loadRoot();\n this.sectorLoader = new DataLoader((ids) =>\n getSectorsBatch(ids, datasetKey)\n );\n this.getRank()\n const { treeRef } = this.props;\n treeRef(this);\n };\n\n componentDidUpdate = (prevProps) => {\n if (\n prevProps.defaultExpandKey !== this.props.defaultExpandKey ||\n prevProps.hideExtinct !== this.props.hideExtinct ||\n prevProps.insertPlaceholder !== this.props.insertPlaceholder\n ) {\n this.reloadRoot();\n }\n };\n\n getRank = () => {\n client(`${config.dataApi}vocab/rank`).then((res) =>\n this.setState({ rank: res.data.map((r) => r.name) })\n );\n };\n\n reloadRoot = () =>\n this.setState(\n {\n rootLoading: true,\n treeData: [],\n loadedKeys: [],\n rootTotal: 0,\n error: null,\n nodeNotFoundErr: null,\n },\n this.loadRoot\n );\n\n \n\n // `append` is only set by the \"Load more\" button, which pages in the next\n // batch of root taxa; every other caller loads page one from scratch.\n // Each call takes a request id and a response is merged only while its id is\n // still the current one. Without that, two overlapping loads — React\n // StrictMode's double mount in dev, or a prop change while a load is in\n // flight — both merged their page into treeData, so every root appeared\n // twice and antd warned \"Same 'key' exist in the Tree\" (issue #59).\n loadRoot = async (append = false) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n insertPlaceholder,\n type,\n expandedTaxonKey,\n } = this.props;\n\n const defaultExpandKey = expandedTaxonKey;\n const { defaultTaxonKey } = this.props;\n\n const requestId = ++this.rootRequestId;\n const offset = append ? this.state.treeData.length : 0;\n\n this.setState(\n append ? { rootLoading: true } : { rootLoading: true, treeData: [] }\n );\n return client(\n `${\n config.dataApi\n }dataset/${datasetKey}/tree?projectKey=${datasetKey}${type ? \"&type=\"+type :\"\"}&limit=${CHILD_PAGE_SIZE}&offset=${offset}${hideExtinct ? `&extinct=false&extinct=` : \"\"}${insertPlaceholder ? \"&insertPlaceholder=true\" : \"\"}`\n )\n .then(this.decorateWithSectorsAndDataset)\n .then((res) => {\n // A newer load has started since — drop this page instead of merging it.\n if (requestId !== this.rootRequestId) return;\n const mainTreeData = res.data.result || [];\n const rootTotal = res.data.total;\n const treeData = mainTreeData.map((tx) => {\n let dataRef = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n dataRef.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n reloadChildren={() => this.fetchChildPage(dataRef, true)}\n rank={this.state.rank}\n />\n );\n dataRef.ref = dataRef;\n return dataRef;\n });\n\n this.setState((prevState) => ({\n rootTotal: rootTotal,\n rootLoading: false,\n treeData: append ? [...prevState.treeData, ...treeData] : treeData,\n // Nothing is auto-expanded by default. Consumers open a specific root\n // (or deep taxon) by passing `defaultTaxonKey`/`expandedTaxonKey` —\n // e.g. defaultTaxonKey=\"CS5HF\" opens Eukaryota in current COL releases.\n expandedKeys: [],\n error: null,\n }),\n () => {\n if (defaultExpandKey) {\n return this.expandToTaxon(defaultExpandKey);\n } else if (defaultTaxonKey) {\n return this.expandToTaxon(defaultTaxonKey);\n }\n });\n if (treeData.length === 1) {\n this.fetchChildPage(treeData[treeData.length - 1]);\n }\n })\n .catch((err) => {\n if (requestId !== this.rootRequestId) return;\n this.setState({\n treeData: [],\n rootLoading: false,\n expandedKeys: [],\n error: err,\n });\n });\n };\n\n expandToTaxon = async (defaultExpandKey) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n type\n } = this.props;\n\n this.setState({ rootLoading: true/* , treeData: [] */ });\n const { data } = await client(\n `${\n config.dataApi\n }dataset/${datasetKey}/tree/${defaultExpandKey}?projectKey=${datasetKey}&insertPlaceholder=true${type ? \"&type=\"+type :\"\"}${\n hideExtinct ? `&extinct=false` : \"\"\n }`\n ).then((res) =>\n this.decorateWithSectorsAndDataset({\n data: { result: res.data },\n }).then(() => res)\n );\n\n if (data.length === 0) {\n return this.setState(\n {\n error: {\n message: `No classification found for Taxon ID: ${defaultExpandKey}`,\n },\n },\n this.loadRoot\n );\n }\n const tx = data[data.length - 1];\n let root = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n root.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(root, true)}\n />\n );\n\n root.ref = root;\n const root_ = root;\n for (let i = data.length - 2; i >= 0; i--) {\n const tx = data[i];\n const node = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n node.ref = node;\n node.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(node, true)}\n />\n );\n\n root.children = [node];\n root = node;\n }\n\n /* const treeData = [root_]; */\nconst { treeData } = this.state;\n var rootIndex = treeData.findIndex((x) => x.key == root_.key);\n treeData[rootIndex] = root_;\n const loadedKeys = [...data.map((t) => t.id).reverse()];\n\n this.setState({ treeData }, () =>\n this.reloadLoadedKeys(loadedKeys, defaultExpandKey)\n );\n };\n\n fetchChildPage = async (dataRef, reloadAll, dontUpdateState) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n insertPlaceholder,\n type\n } = this.props;\n const childcount = get(dataRef, \"childCount\");\n const limit = CHILD_PAGE_SIZE;\n const offset = get(dataRef, \"childOffset\");\n const res = await client(\n `${config.dataApi}dataset/${datasetKey}/tree/${\n dataRef.taxon.id //taxonKey\n }/children?limit=${limit}&offset=${offset}&projectKey=${datasetKey}${type ? \"&type=\"+type :\"\"}${\n hideExtinct ? `&extinct=false` : \"\"\n }${insertPlaceholder ? \"&insertPlaceholder=true\" : \"\"}`\n );\n await this.decorateWithSectorsAndDataset(res);\n\n const data = res.data.result\n ? res.data.result.map((tx) => {\n let childDataRef = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n parent: dataRef,\n name: tx.name,\n };\n\n childDataRef.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(childDataRef, true)}\n />\n );\n childDataRef.ref = childDataRef;\n\n return childDataRef;\n })\n : [];\n\n // reloadAll is used to force reload all children from offset 0 - used when new children have been posted\n dataRef.children =\n dataRef.children && offset !== 0 && !reloadAll\n ? [...dataRef.children, ...data]\n : data;\n // If extinct are filtered out, you cannot rely on childCount\n if (res.data.last && dataRef.childCount > dataRef.children.length) {\n dataRef.childCount = dataRef.children.length;\n }\n if (!res.data.last) {\n const loadMoreFn = () => {\n dataRef.childOffset += CHILD_PAGE_SIZE;\n if (isLoadMoreKey(get(dataRef.children[dataRef.children.length - 1], \"key\"))) {\n dataRef.children = dataRef.children.slice(0, -1);\n }\n return this.fetchChildPage(dataRef, false);\n };\n dataRef.children = [\n ...dataRef.children,\n {\n title: (\n <LoadMoreChildrenTreeNode\n onClick={loadMoreFn}\n key={loadMoreKey(dataRef.key)}\n />\n ),\n key: loadMoreKey(dataRef.key),\n childCount: 0,\n isLeaf: true,\n },\n ];\n }\n if (!dontUpdateState) {\n // Use the updater form: this often runs right after a sibling setState\n // (e.g. loadRoot's auto-expand of a single root) that may not have\n // committed yet, so this.state can be stale here.\n this.setState((prevState) => ({\n treeData: [...prevState.treeData],\n loadedKeys: [...new Set([...prevState.loadedKeys, dataRef.key])],\n }));\n }\n };\n\n decorateWithSectorsAndDataset = (res) => {\n if (!res.data.result) return res;\n return Promise.all(\n res.data.result\n .filter((tx) => !!tx.sectorDatasetKey)\n .map((tx) =>\n this.datasetLoader\n .load(tx.sectorDatasetKey)\n .then(\n (dataset) =>\n (tx.sector = {\n id: tx.sectorKey,\n subjectDatasetKey: tx.sectorDatasetKey,\n dataset: dataset,\n })\n )\n )\n ).then(() => res);\n };\n\n onLoadData = (treeNode, reloadAll = false) => {\n if (reloadAll) {\n treeNode.childOffset = 0;\n }\n return this.fetchChildPage(treeNode.ref, reloadAll);\n };\n\n findNode = (id, nodeArray) => {\n let node = null;\n\n node = nodeArray.find((n) => get(n, \"taxon.id\") === id);\n\n if (node) {\n return node;\n } else {\n const children = nodeArray.map((n) => get(n, \"children\") || []);\n const flattenedChildren = flatten(children); //.flat();\n if (flattenedChildren.length === 0) {\n return null;\n } else {\n return this.findNode(id, flattenedChildren);\n }\n }\n };\n\n pageThroughChildrenUntilTaxonFound = async (parentNode, taxonId) => {\n let node;\n while (!node && parentNode.children.length < parentNode.childCount) {\n parentNode.childOffset += CHILD_PAGE_SIZE;\n if (isLoadMoreKey(get(parentNode.children[parentNode.children.length - 1], \"key\"))) {\n parentNode.children = parentNode.children.slice(0, -1);\n }\n await this.fetchChildPage(parentNode, false, true);\n node = this.findNode(taxonId, parentNode.children);\n }\n if (!node) {\n node = parentNode.children.find((c) =>\n get(c, \"taxon.id\") ? c.taxon.id.indexOf(\"incertae-sedis\") > -1 : false\n );\n }\n return node;\n };\n\n reloadLoadedKeys = async (keys, expandKey, expandAll = true) => {\n this.setState({ rootLoading: true });\n const { loadedKeys: storedKeys } = this.state;\n // const defaultExpandKey = get(qs.parse(get(location, \"search\")), 'taxonKey');\n\n let { treeData } = this.state;\n const targetTaxon = expandKey ? this.findNode(expandKey, treeData) : null;\n const loadedKeys = keys ? [...keys] : [...storedKeys];\n for (let index = 0; index < loadedKeys.length; index++) {\n let node = this.findNode(loadedKeys[index], treeData);\n if (!node && targetTaxon && loadedKeys[index - 1]) {\n // If the node is not found look for insertae sedis nodes in the children of the parent and insert the 'Not assigned' between the parent and the node\n const parentNode = this.findNode(loadedKeys[index - 1], treeData);\n if (\n parentNode &&\n isArray(get(parentNode, \"children\")) &&\n parentNode.children.length > 0\n ) {\n node = await this.pageThroughChildrenUntilTaxonFound(\n parentNode,\n loadedKeys[index]\n );\n if (node) {\n loadedKeys.splice(index, 0, node.taxon.id);\n } else {\n // It has gone missing from the tree\n this.setState(\n {\n nodeNotFoundErr: (\n <span>Cannot find taxon {expandKey} in tree &#128549;</span>\n ),\n rootLoading: false,\n }/* ,\n () => {\n if (\n this.props.treeType === \"CATALOGUE\" &&\n typeof this.props.addMissingTargetKey === \"function\"\n ) {\n this.props.addMissingTargetKey(expandKey);\n }\n } */\n );\n }\n }\n }\n if (node) {\n await this.fetchChildPage(node, true, true);\n let targetNode = node.children.find(\n (c) => get(c, \"taxon.id\") === get(targetTaxon, \"taxon.id\")\n );\n if (\n targetTaxon &&\n index === loadedKeys.length - 2 &&\n get(node, \"taxon.id\") !== get(targetTaxon, \"taxon.id\") &&\n isArray(node.children) &&\n !targetNode\n ) {\n if (node.children.length < node.childCount) {\n // its the parent of the taxon we are after - if its not in the first page, insert it\n targetNode = await this.pageThroughChildrenUntilTaxonFound(\n node,\n get(targetTaxon, \"taxon.id\")\n );\n // node.children = [targetTaxon, ...node.children];\n if (targetNode) {\n this.setState({ treeData: [...this.state.treeData] }, () => {\n setTimeout(() => {\n const elmnt = document.getElementById(expandKey);\n elmnt.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n /* if (get(this, \"treeRef.current\")) {\n this.treeRef.current.scrollTo({ key: expandKey });\n } */\n }, 100);\n });\n } else {\n // It has gone missing from the tree\n this.setState(\n {\n nodeNotFoundErr: (\n <span>Cannot find taxon {expandKey} in tree &#128549;</span>\n ),\n rootLoading: false,\n },\n () => {\n if (\n this.props.treeType === \"CATALOGUE\" &&\n typeof this.props.addMissingTargetKey === \"function\"\n ) {\n this.props.addMissingTargetKey(expandKey);\n }\n }\n );\n }\n }\n }\n }\n }\n const newState = { loadedKeys, rootLoading: false };\n if (expandAll) {\n newState.expandedKeys = loadedKeys;\n }\n this.setState(newState, () => {\n if (expandKey) {\n setTimeout(() => {\n const elmnt = document.getElementById(expandKey);\n elmnt.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n /* if (get(this, \"treeRef.current\")) {\n this.treeRef.current.scrollTo({ key: expandKey });\n } */\n }, 100);\n }\n });\n };\n\n render() {\n const {\n error,\n rootTotal,\n rootLoading,\n treeData,\n defaultExpandAll,\n nodeNotFoundErr,\n loadedKeys,\n expandedKeys,\n } = this.state;\n const { treeType, dataset, height, expandedTaxonKey } = this.props;\n void height;\n const defaultExpandKey = expandedTaxonKey;\n\n return (\n <div>\n {error && (\n <React.Fragment>\n {get(error, \"response.data.code\") !== 404 ? (\n <Alert\n closable\n onClose={() => this.setState({ error: null })}\n style={{ marginTop: \"8px\" }}\n message={<ErrorMsg error={error} />}\n type=\"error\"\n />\n ) : (\n <Alert\n closable\n onClose={() => this.setState({ error: null })}\n style={{ marginTop: \"8px\" }}\n message={\n <Custom404\n error={error}\n treeType={treeType}\n dataset={dataset}\n loadRoot={this.loadRoot}\n />\n }\n type=\"warning\"\n />\n )}\n </React.Fragment>\n )}\n {nodeNotFoundErr && (\n <Alert\n closable\n onClose={() => this.setState({ nodeNotFoundErr: null })}\n style={{ marginTop: \"8px\" }}\n message={nodeNotFoundErr}\n type=\"warning\"\n />\n )}\n {rootLoading && <Skeleton paragraph={{ rows: 10 }} active />}\n {!rootLoading && treeData.length > 0 && (\n <Tree\n ref={this.treeRef}\n defaultExpandAll={defaultExpandAll}\n // height={height || 600}\n // defaultExpandedKeys={defaultExpandedKeys}\n loadData={this.onLoadData}\n onLoad={(loadedKeys) => this.setState({ loadedKeys })}\n loadedKeys={loadedKeys}\n expandedKeys={expandedKeys}\n treeData={treeData}\n filterTreeNode={(node) => node.key === defaultExpandKey}\n onExpand={(expandedKeys, obj) => {\n this.setState({ expandedKeys });\n if (this.props.onExpandedTaxonKeyChange) {\n this.props.onExpandedTaxonKeyChange(\n obj.expanded ? obj.node.key : null\n );\n }\n }}\n ></Tree>\n )}\n\n {!error && treeData.length < rootTotal && (\n <Button loading={rootLoading} onClick={() => this.loadRoot(true)}>\n Load more{\" \"}\n </Button>\n )}\n </div>\n );\n }\n}\n\nexport default ColTree;\n","import React from \"react\";\nimport ColTree from \"./ColTree\";\nimport { get } from \"lodash-es\";\nimport NameAutocomplete from \"./NameAutocomplete\";\nimport client, { setAuth } from \"../api/client\";\nimport { Row, Col, Checkbox } from \"antd\";\nimport { ColTreeContext } from \"./ColTreeContext\";\nimport { TreeCacheContext, createTreeCache } from \"./treeCache\";\nimport { getDataset } from \"../api/dataset\";\nimport Citation from \"../components/DatasetCitation\";\nimport { RouterContext, buildRouter } from \"../router\";\nimport { readSetting, writeSetting } from \"../storage\";\n\nconst INFRASPECIFIC_RANKS = [\n \"infraspecific name\",\n \"species\",\n \"variety\",\n \"form\",\n];\n\nclass ColTreeWrapper extends React.Component {\n static contextType = RouterContext;\n\n constructor(props) {\n super(props);\n setAuth(this.props.auth);\n this.state = {\n hideExtinct: readSetting(\"tree-extant-only\", false),\n showInfo: readSetting(\"tree-show-source\", false),\n dataset: null,\n };\n // Per-Tree DataLoader cache. Rebuilt only if datasetKey changes (rare).\n this.cache = createTreeCache(this.props.datasetKey);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.datasetKey !== this.props.datasetKey) {\n this.cache = createTreeCache(this.props.datasetKey);\n }\n }\n\n componentDidMount = async () => {\n const { datasetKey, citation } = this.props;\n if (citation) {\n try {\n const { data: dataset } = await getDataset(datasetKey);\n this.setState({ dataset });\n } catch (err) {\n // ignore\n }\n }\n };\n\n render = () => {\n const {\n datasetKey,\n defaultTaxonKey,\n expandedTaxonKey,\n onExpandedTaxonKeyChange,\n showTreeOptions,\n linkToSpeciesPage,\n citation,\n type,\n insertPlaceholder = true,\n } = this.props;\n const { hideExtinct, dataset } = this.state;\n\n const handleSelectName = (name) => {\n const key = get(name, \"key\");\n if (!key) return;\n const rank = get(name, \"rank\");\n if (linkToSpeciesPage && INFRASPECIFIC_RANKS.includes(rank)) {\n // Leaf-like selection: jump to the taxon page via the host's nav.\n const navigateToTaxon = this.context?.taxon?.onNavigate;\n if (navigateToTaxon) navigateToTaxon(key);\n } else if (onExpandedTaxonKeyChange) {\n onExpandedTaxonKeyChange(key);\n if (this.treeRef && this.treeRef.reloadRoot) this.treeRef.reloadRoot();\n }\n };\n\n const handleResetSearch = () => {\n if (onExpandedTaxonKeyChange) onExpandedTaxonKeyChange(null);\n };\n\n return (\n <div className=\"catalogue-of-life\">\n {citation === \"top\" && dataset && <Citation dataset={dataset} />}\n <TreeCacheContext.Provider value={this.cache}>\n <ColTreeContext.Provider value={this.state}>\n <Row>\n <Col flex=\"auto\">\n <NameAutocomplete\n hideExtinct={hideExtinct}\n datasetKey={datasetKey}\n style={{\n width: \"100%\",\n paddingTop: \"5px\",\n paddingBottom: \"5px\",\n }}\n defaultTaxonKey={expandedTaxonKey || null}\n onSelectName={handleSelectName}\n onResetSearch={handleResetSearch}\n />\n </Col>\n {showTreeOptions && (\n <Col style={{ paddingLeft: \"8px\" }}>\n <Checkbox\n defaultChecked={this.state.showInfo}\n onChange={({ target: { checked } }) => {\n this.setState({ showInfo: checked });\n writeSetting(\"tree-show-source\", checked);\n }}\n >\n Source\n </Checkbox>\n\n <Checkbox\n defaultChecked={this.state.hideExtinct}\n onChange={({ target: { checked } }) => {\n this.setState({ hideExtinct: checked });\n writeSetting(\"tree-extant-only\", checked);\n }}\n >\n Extant only\n </Checkbox>\n </Col>\n )}\n </Row>\n <ColTree\n insertPlaceholder={insertPlaceholder}\n hideExtinct={hideExtinct}\n datasetKey={datasetKey}\n defaultTaxonKey={defaultTaxonKey}\n expandedTaxonKey={expandedTaxonKey}\n onExpandedTaxonKeyChange={onExpandedTaxonKeyChange}\n treeRef={(ref) => (this.treeRef = ref)}\n type={type}\n />\n </ColTreeContext.Provider>\n </TreeCacheContext.Provider>\n {citation === \"bottom\" && dataset && <Citation dataset={dataset} />}\n </div>\n );\n };\n}\n\n// Public wrapper: takes controlled props + navigation callbacks, builds\n// the RouterContext, hands the rest down.\nexport default function Tree({\n datasetKey,\n defaultTaxonKey,\n expandedTaxonKey,\n onExpandedTaxonKeyChange,\n showTreeOptions,\n linkToSpeciesPage,\n citation,\n type,\n insertPlaceholder,\n auth,\n ...routerProps\n}) {\n return (\n <RouterContext.Provider value={buildRouter(routerProps)}>\n <ColTreeWrapper\n datasetKey={datasetKey}\n defaultTaxonKey={defaultTaxonKey}\n expandedTaxonKey={expandedTaxonKey}\n onExpandedTaxonKeyChange={onExpandedTaxonKeyChange}\n showTreeOptions={showTreeOptions}\n linkToSpeciesPage={linkToSpeciesPage}\n citation={citation}\n type={type}\n insertPlaceholder={insertPlaceholder}\n auth={auth}\n />\n </RouterContext.Provider>\n );\n}\n","import withDatasetKey from \"../withDatasetKey\";\nimport { withTheme } from \"../withTheme\";\nimport colTree from \"../ColTree\";\n\nexport const Tree = withTheme(withDatasetKey(colTree));\n"],"names":["TreeCacheContext","createContext","createTreeCache","datasetKey","DataLoader","ids","getDatasetsBatch","getPublishersBatch","TaxonSources","React","props","__publicField","_a","sourceDatasetKeys","loader","s","data","sortBy","publisherDatasetKeys","publisher","showInNode","popOverVisible","loading","taxon","linkStyle","publisherUrl","uuid","config","d","index","jsx","LinkTo","Popover","Spin","jsxs","Divider","visible","e","ColTreeContext","ColTreeNode","rank","sector","sectorSourceDataset","get","hasDatasetSectors","isPlaceholder","showInfo","MergedDataBadge","Tag","isUndefined","CHILD_PAGE_SIZE","LOAD_MORE_PREFIX","loadMoreKey","parentKey","isLoadMoreKey","key","LoadMoreChildrenTreeNode","ColTree","getSectorsBatch","treeRef","prevProps","client","res","r","append","showSourceTaxon","hideExtinct","insertPlaceholder","type","expandedTaxonKey","defaultExpandKey","defaultTaxonKey","requestId","offset","mainTreeData","rootTotal","treeData","tx","dataRef","prevState","err","root","root_","i","node","rootIndex","x","loadedKeys","t","reloadAll","dontUpdateState","limit","childDataRef","loadMoreFn","dataset","treeNode","id","nodeArray","n","children","flattenedChildren","flatten","parentNode","taxonId","c","keys","expandKey","expandAll","storedKeys","targetTaxon","isArray","targetNode","newState","error","rootLoading","defaultExpandAll","nodeNotFoundErr","expandedKeys","treeType","height","Alert","ErrorMsg","Skeleton","Tree","obj","Button","INFRASPECIFIC_RANKS","ColTreeWrapper","citation","getDataset","onExpandedTaxonKeyChange","showTreeOptions","linkToSpeciesPage","handleSelectName","name","navigateToTaxon","_b","handleResetSearch","Citation","Row","Col","NameAutocomplete","Checkbox","checked","writeSetting","ref","setAuth","readSetting","RouterContext","auth","routerProps","buildRouter","withTheme","withDatasetKey","colTree"],"mappings":";;;;;;;;;;;;;;;;;AAcO,MAAMA,IAAmBC,GAAc;AAAA,EAC5C,eAAe;AAAA,EACf,iBAAiB;AACnB,CAAC,GAEYC,IAAkB,CAACC,OAAgB;AAAA,EAC9C,eAAe,IAAIC,EAAW,CAACC,MAAQC,EAAiBD,GAAKF,CAAU,CAAC;AAAA,EACxE,iBAAiB,IAAIC;AAAA,IAAW,CAACC,MAC/BE,EAAmBF,GAAKF,CAAU;AAAA,EAAA;AAEtC;ACfA,MAAMK,UAAqBC,EAAM,UAAU;AAAA,EAGzC,YAAYC,GAAO;AACjB,UAAMA,CAAK;AAYb;AAAA;AAAA;AAAA;AAAA,IAAAC,EAAA,0BAAmB,MAAM;;AACvB,YAAM,EAAE,YAAAR,MAAe,KAAK;AAC5B,cAAIS,IAAA,KAAK,YAAL,QAAAA,EAAc,gBAAsB,KAAK,QAAQ,iBAChD,KAAK,wBACR,KAAK,sBAAsB,IAAIR;AAAA,QAAW,CAACC,MACzCC,EAAiBD,GAAKF,CAAU;AAAA,MAAA,IAG7B,KAAK;AAAA,IACd;AAEA,IAAAQ,EAAA,4BAAqB,MAAM;;AACzB,YAAM,EAAE,YAAAR,MAAe,KAAK;AAC5B,cAAIS,IAAA,KAAK,YAAL,QAAAA,EAAc,kBAAwB,KAAK,QAAQ,mBAClD,KAAK,0BACR,KAAK,wBAAwB,IAAIR;AAAA,QAAW,CAACC,MAC3CE,EAAmBF,GAAKF,CAAU;AAAA,MAAA,IAG/B,KAAK;AAAA,IACd;AAEA,IAAAQ,EAAA,2BAAoB,MAAM;AACxB,YAAM,EAAE,mBAAAE,MAAsB,KAAK;AACnC,MAAIA,KAAqBA,EAAkB,SAAS,KAClD,KAAK,SAAS,EAAE,YAAY,GAAA,GAAQ,KAAK,OAAO;AAAA,IAEpD;AAEA,IAAAF,EAAA,iBAAU,MAAM;AACd,YAAM,EAAE,mBAAAE,MAAsB,KAAK;AACnC,UAAI,EAACA,KAAA,QAAAA,EAAmB,QAAQ;AAChC,WAAK,SAAS,EAAE,SAAS,GAAA,CAAM;AAC/B,YAAMC,IAAS,KAAK,iBAAA;AACpB,cAAQ;AAAA,QACND,EAAkB,IAAI,CAACE,MAAMD,EAAO,KAAKC,CAAC,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,MAAA,EAE5D,KAAK,CAACC,MAAS;AACd,aAAK,SAAS,EAAE,MAAMC,EAAOD,GAAM,CAAC,OAAO,CAAC,GAAG,SAAS,IAAO;AAAA,MACjE,CAAC,EACA,MAAM,MAAM;AACX,aAAK,SAAS,EAAE,MAAM,CAAA,GAAI,SAAS,IAAO;AAAA,MAC5C,CAAC;AAAA,IACL;AAEA,IAAAL,EAAA,0BAAmB,MAAM;AACvB,YAAM,EAAE,sBAAAO,MAAyB,KAAK;AACtC,UAAI,CAACA,EAAsB;AAC3B,YAAMJ,IAAS,KAAK,mBAAA;AACpB,cAAQ;AAAA,QACN,OAAO,KAAKI,CAAoB,EAAE;AAAA,UAAI,CAACH,MACrCD,EACG,KAAKC,CAAC,EACN,KAAK,CAACI,OAAe;AAAA,YACpB,GAAGA;AAAA,YACH,UAAUD,EAAqBH,CAAC;AAAA,UAAA,EAChC,EACD,MAAM,MAAM,IAAI;AAAA,QAAA;AAAA,MACrB,EAEC,KAAK,CAACC,MAAS;AACd,aAAK,SAAS,EAAE,YAAYC,EAAOD,EAAK,OAAO,OAAO,GAAG,CAAC,OAAO,CAAC,EAAA,CAAG;AAAA,MACvE,CAAC,EACA,MAAM,MAAM;AACX,aAAK,SAAS,EAAE,YAAY,CAAA,GAAI;AAAA,MAClC,CAAC;AAAA,IACL;AAEA,IAAAL,EAAA,gBAAS,MAAM;AACb,YAAM,EAAE,MAAAK,GAAM,YAAAI,GAAY,gBAAAC,GAAgB,SAAAC,EAAA,IAAY,KAAK,OACrD,EAAE,OAAAC,GAAO,YAAApB,EAAA,IAAe,KAAK,OAC7BqB,IAAY,EAAE,OAAO,UAAU,UAAU,OAAA,GACzCC,IAAe,CAACC,MACpB,GAAGC,EAAO,SAAS,YAAYxB,CAAU,cAAcuB,CAAI;AAE7D,aAAIN,IACKJ,EACJ,OAAO,CAACY,MAAM,CAAC,CAACA,CAAC,EACjB,IAAI,CAACA,GAAGC,MACPC,gBAAAA,EAAAA;AAAAA,QAACC;AAAA,QAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAMH,EAAE;AAAA,UAER,WAAU;AAAA,UACV,OAAOJ;AAAA,UAEL,WAAAK,IAAQ,OAAO,OAAOD,EAAE,SAASA,EAAE;AAAA,QAAA;AAAA,QAJhCA,EAAE;AAAA,MAAA,CAMV,IAIHE,gBAAAA,EAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,SAAS,SAAA,GAAY,IAAI,iBAAiBP,EAAM,EAAE,IAC9D,UAAAO,gBAAAA,EAAAA;AAAAA,QAACE;AAAA,QAAA;AAAA,UACC,mBAAmB,MACjB,SAAS,eAAe,iBAAiBT,EAAM,EAAE,EAAE;AAAA,UAErD,SACED,KAAWN,EAAK,WAAW,IACzBc,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,EAAE,UAAU,SAAS,WAAW,UAAU,SAAS,QAAA;AAAA,cAE1D,UAAAA,gBAAAA,EAAAA,IAACG,GAAA,EAAK,MAAK,QAAA,CAAQ;AAAA,YAAA;AAAA,UAAA,IAGrBC,gBAAAA,EAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,UAAU,WACrB,UAAA;AAAA,YAAAlB,EAAK,SAAS,KACbc,gBAAAA,EAAAA,IAAC,OAAA,EACE,YACE,OAAO,CAACF,MAAM,CAAC,CAACA,CAAC,EACjB,IAAI,CAACA,GAAGC,MACPC,gBAAAA,EAAAA;AAAAA,cAACC;AAAA,cAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAMH,EAAE;AAAA,gBAER,WAAU;AAAA,gBACV,OAAOJ;AAAA,gBAEL,WAAAK,IAAQ,OAAO,OAAOD,EAAE,SAASA,EAAE;AAAA,cAAA;AAAA,cAJhCA,EAAE;AAAA,YAAA,CAMV,GACL;AAAA,YAED,KAAK,MAAM,cAAc,KAAK,MAAM,WAAW,SAAS,KACvDM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,UACvB,UAAA;AAAA,cAAAJ,gBAAAA,EAAAA,IAAC,YAAO,UAAA,aAAA,CAAU;AAAA,cAClBA,gBAAAA,EAAAA,IAAC,OAAA,EACE,UAAA,KAAK,MAAM,WACT,OAAO,CAACF,MAAM,CAAC,CAACA,CAAC,EACjB,IAAI,CAACA,GAAGC;;AACPK,uCAAAA,EAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,MAAMT,EAAaG,EAAE,EAAE;AAAA,oBACvB,QAAO;AAAA,oBACP,KAAI;AAAA,oBACJ,OAAOJ;AAAA,oBAEL,UAAA;AAAA,uBAAAK,IAAQ,OAAO,OAAOD,EAAE,SAASA,EAAE;AAAA,uBACpChB,IAAAgB,EAAE,aAAF,QAAAhB,EAAY,SACT,KAAKgB,EAAE,SAAS,OAAO,eAAe,OAAO,CAAC,MAC9C;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBATCA,EAAE;AAAA,gBAAA;AAAA,eAWV,EAAA,CACL;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,GAEJ;AAAA,UAGJ,OACEM,gBAAAA,EAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,WACrB,UAAA;AAAA,YAAAJ,gBAAAA,MAAC,UAAK,OAAO,EAAE,YAAY,IAAA,GAAO,UAAA,gBAAY;AAAA,YAC9CA,gBAAAA,EAAAA,IAAC,MAAA,EAAI,UAAAP,KAAA,gBAAAA,EAAO,KAAA,CAAK;AAAA,kCAChBY,IAAA,EAAQ,OAAO,EAAE,QAAQ,YAAU,CAAG;AAAA,UAAA,GACzC;AAAA,UAEF,MAAMd;AAAA,UACN,cAAc,CAACe,MACb,KAAK,SAAS,EAAE,gBAAgBA,EAAA,GAAW,MAAM;AAC/C,YAAIA,KAAW,KAAK,MAAM,KAAK,WAAW,UAAQ,QAAA,GAEhDA,KACA,KAAK,MAAM,wBACX,CAAC,KAAK,MAAM,cAEZ,KAAK,iBAAA;AAAA,UAET,CAAC;AAAA,UAEH,SAAQ;AAAA,UACR,WAAU;AAAA,UAEV,UAAAN,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,UAAU;AAAA,cACV,OAAO,EAAE,QAAQ,WAAW,OAAO,UAAU,UAAU,OAAA;AAAA,cACvD,SAAS,CAACO,MAAMA,EAAE,eAAA;AAAA,cACnB,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA,GAEJ;AAAA,IAEJ;AAnME,SAAK,QAAQ;AAAA,MACX,MAAM,CAAA;AAAA,MACN,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA;AAAA,EAEb;AA+LF;AAxME1B,EADIH,GACG,eAAcR;ACRhB,MAAMsC,IAAiB7B,EAAM,cAAA;ACMpC,MAAM8B,UAAoB9B,EAAM,UAAU;AAAA,EACxC,YAAYC,GAAO;AACjB,UAAMA,CAAK;AAQb,IAAAC,EAAA,4BAAqB,CAAC6B,MACb,KAAK,MAAM,KAAK,QAAQA,CAAI,IAAI,KAAK,MAAM,KAAK,QAAQ,SAAS;AAG1E,IAAA7B,EAAA,gBAAS,MAAM;AACb,YAAM;AAAA,QACJ,OAAAY;AAAA,QACA,OAAO,EAAE,QAAAkB,GAAQ,mBAAA5B,GAAmB,sBAAAK,EAAA;AAAA,QACpC,YAAAf;AAAA,MAAA,IACE,KAAK,OAEHuC,IAAsBC,EAAIF,GAAQ,SAAS,GAG/CG,KACL/B,KAAqB,CAAA,GAAI,OAAO,CAACe,OAAMa,KAAA,gBAAAA,EAAQ,uBAAsBb,CAAC,EACpE,SAAS;AACS,MAAAL,EAAM,YAAYA,EAAM,aAAYA,EAAM,UAAU,KAAK,CAAAc,MAAKA,EAAE,aAAad,EAAM,QAAQ;AAI5G,YAAMsB,IACJ,OAAOtB,EAAM,MAAO,YAAYA,EAAM,GAAG,QAAQ,gBAAgB,IAAI;AAEvE,aACEO,gBAAAA,EAAAA,IAACQ,EAAe,UAAf,EACU,UAAA,CAAC,EAAE,UAAAQ,EAAA,MACIZ,gBAAAA,EAAAA,KAAC,OAAA,EAAI,IAAIX,EAAM,IACf,UAAA;AAAA,QAAAW,gBAAAA,OAAC,QAAA,EACC,UAAA;AAAA,UAAAA,gBAAAA,EAAAA,KAAC,QAAA,EAAK,WAAU,kBAAkB,UAAA;AAAA,YAAAX,EAAM;AAAA,YAAK;AAAA,UAAA,GAAE;AAAA,UAC9CsB,IACCf,gBAAAA,EAAAA,IAAC,QAAA,EAAK,yBAAyB,EAAE,QAAQP,EAAM,UAAA,EAAU,CAAG,IAE5DO,gBAAAA,MAACC,GAAA,EAAO,IAAG,SAAQ,MAAMR,EAAM,IAC7B,UAAAO,gBAAAA,EAAAA,IAAC,QAAA,EAAK,yBAAyB,EAAE,QAAQP,EAAM,UAAA,EAAU,CAAG,EAAA,CAC9D;AAAA,WAEDA,KAAA,gBAAAA,EAAO,WACRO,gBAAAA,EAAAA,IAACiB,IAAA,EAAgB,OAAO,EAAE,YAAY,MAAA,GAAS,YAAYxB,KAAA,gBAAAA,EAAO,YAAY,mBAAmBA,KAAA,gBAAAA,EAAO,kBAAA,CAAkB;AAAA,QAAA,GAE5H;AAAA,QAOCuB,KAAYvB,EAAM,WAAW,4BAC5BW,gBAAAA,EAAAA,KAACzB,EAAM,UAAN,EAAe,UAAA;AAAA,UAAA;AAAA,UAAGqB,gBAAAA,EAAAA,IAACkB,MAAI,OAAM,WAAU,OAAO,EAAC,aAAa,EAAA,GAAI,UAAA,QAAA,CAEjE;AAAA,QAAA,GACA;AAAA,QAGH,CAACC,EAAY1B,EAAM,KAAK,KACvB,KAAK,mBAAmBA,KAAA,gBAAAA,EAAO,IAAI,KACjCW,gBAAAA,EAAAA,KAAC,QAAA,EACE,UAAA;AAAA,UAAA;AAAA,UAAI;AAAA,UACF,OAAOX,EAAM,KAAK,EAAE,eAAA;AAAA,UAAkB;AAAA,UACxCuB,KAAY,CAACG,EAAY1B,EAAM,eAAe,4BAC5C,QAAA,EACE,UAAA;AAAA,YAAA;AAAA,YAAI;AAAA,YACF;AAAA,YACF;AAAA,cACCA,EAAM;AAAA,YAAA,EACN,eAAA;AAAA,YAAkB;AAAA,YAAI;AAAA,YACnB;AAAA,UAAA,GACP;AAAA,UACA;AAAA,QAAA,GAEJ;AAAA,QAIDuB,KAAYL,KACXP,gBAAAA,EAAAA,KAAC,QAAA,EACC,UAAA;AAAA,UAAAJ,gBAAAA,EAAAA,IAAC,UAAK,UAAA,MAAA,CAAG;AAAA,UACTI,gBAAAA,EAAAA;AAAAA,YAACH;AAAA,YAAA;AAAA,cACC,IAAG;AAAA,cACH,MAAMU,EAAO;AAAA,cACb,OAAOG,IAAoB,EAAC,YAAY,WAAU;AAAA,cAClD,WAAU;AAAA,cAET,UAAA;AAAA,gBAAAD,EAAID,GAAqB,OAAO,KAAKD,EAAO;AAAA,gBAAmBG,KAAqB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACvF,GACF;AAAA,QAEDE,KAAYF,KACXV,gBAAAA,EAAAA,KAACzB,EAAM,UAAN,EAAe,UAAA;AAAA,UAAA;AAAA,UAACqB,gBAAAA,EAAAA;AAAAA,YAACtB;AAAA,YAAA;AAAA,cACd,mBAAAK;AAAA,cACA,sBAAAK;AAAA,cACA,OAAAK;AAAA,cACA,YAAApB;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,EAAA,CACF;AAAA,MAAA,EAAA,CAGJ,EAAA,CAER;AAAA,IAGZ;AA7GE,SAAK,QAAQ;AAAA,MACX,OAAO,CAAA;AAAA,MACP,aAAa,KAAK,MAAM,MAAM,WAAW;AAAA,MACzC,SAAS;AAAA,IAAA;AAAA,EAEb;AAyGF;AC9GA,MAAM+C,IAAkB,KAKlBC,IAAmB,mBACnBC,IAAc,CAACC,MAAc,GAAGF,CAAgB,GAAGE,CAAS,IAC5DC,IAAgB,CAACC,MACrB,OAAOA,KAAQ,YAAYA,EAAI,WAAWJ,CAAgB;AAE5D,MAAMK,WAAiC/C,EAAM,UAAU;AAAA,EACrD,YAAYC,GAAO;AACjB,UAAMA,CAAK;AAIb,IAAAC,EAAA,iBAAU,MAAM;AACd,WAAK;AAAA,QAAS,EAAE,SAAS,GAAA;AAAA,QAAQ,MAC/B,KAAK,MAAM,QAAA,EAAU,KAAK,MAAM,KAAK,SAAS,EAAE,SAAS,IAAO,CAAC;AAAA,MAAA;AAAA,IAErE;AACA,IAAAA,EAAA,gBAAS,MAAM;AACb,YAAM,EAAE,SAAAW,MAAY,KAAK;AACzB,aACEY,gBAAAA,OAACzB,EAAM,UAAN,EACE,UAAA;AAAA,QAAAa,2BAAYW,GAAA,EAAK;AAAA,QACjB,CAACX,KACAQ,gBAAAA,EAAAA,IAAC,KAAA,EAAE,SAAS,KAAK,SACf,UAAAA,gBAAAA,EAAAA,IAAC,UAAA,EAAO,UAAA,eAAA,CAAY,EAAA,CACtB;AAAA,MAAA,GAEJ;AAAA,IAEJ;AApBE,SAAK,QAAQ,EAAE,SAAS,GAAA;AAAA,EAC1B;AAoBF;AAEA,MAAM2B,UAAgBhD,EAAM,UAAU;AAAA,EAGpC,YAAYC,GAAO;AACjB,UAAMA,CAAK;AAyBb,IAAAC,EAAA,2BAAoB,MAAM;AACxB,YAAM,EAAE,YAAAR,MAAe,KAAK;AAC5B,WAAK,SAAA,GACL,KAAK,eAAe,IAAIC;AAAA,QAAW,CAACC,MAClCqD,GAAgBrD,GAAKF,CAAU;AAAA,MAAA,GAEjC,KAAK,QAAA;AACL,YAAM,EAAE,SAAAwD,MAAY,KAAK;AACzB,MAAAA,EAAQ,IAAI;AAAA,IACd;AAEA,IAAAhD,EAAA,4BAAqB,CAACiD,MAAc;AAClC,OACEA,EAAU,qBAAqB,KAAK,MAAM,oBAC1CA,EAAU,gBAAgB,KAAK,MAAM,eACrCA,EAAU,sBAAsB,KAAK,MAAM,sBAE3C,KAAK,WAAA;AAAA,IAET;AAEA,IAAAjD,EAAA,iBAAU,MAAM;AACd,MAAAkD,EAAO,GAAGlC,EAAO,OAAO,YAAY,EAAE;AAAA,QAAK,CAACmC,MAC1C,KAAK,SAAS,EAAE,MAAMA,EAAI,KAAK,IAAI,CAACC,MAAMA,EAAE,IAAI,GAAG;AAAA,MAAA;AAAA,IAEvD;AAEA,IAAApD,EAAA,oBAAa,MACX,KAAK;AAAA,MACH;AAAA,QACE,aAAa;AAAA,QACb,UAAU,CAAA;AAAA,QACV,YAAY,CAAA;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,iBAAiB;AAAA,MAAA;AAAA,MAEnB,KAAK;AAAA,IAAA;AAYT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,EAAA,kBAAW,OAAOqD,IAAS,OAAU;AACnC,YAAM;AAAA,QACJ,iBAAAC;AAAA,QACA,YAAA9D;AAAA,QACA,aAAA+D;AAAA,QACA,mBAAAC;AAAA,QACA,MAAAC;AAAA,QACA,kBAAAC;AAAA,MAAA,IACE,KAAK,OAEHC,IAAmBD,GACnB,EAAE,iBAAAE,MAAoB,KAAK,OAE3BC,IAAY,EAAE,KAAK,eACnBC,IAAST,IAAS,KAAK,MAAM,SAAS,SAAS;AAErD,kBAAK;AAAA,QACHA,IAAS,EAAE,aAAa,GAAA,IAAS,EAAE,aAAa,IAAM,UAAU,CAAA,EAAC;AAAA,MAAE,GAE9DH;AAAA,QACL,GACElC,EAAO,OACT,WAAWxB,CAAU,oBAAoBA,CAAU,GAAGiE,IAAO,WAASA,IAAM,EAAE,UAAUlB,CAAe,WAAWuB,CAAM,GAAGP,IAAc,4BAA4B,EAAE,GAAGC,IAAoB,4BAA4B,EAAE;AAAA,MAAA,EAE3N,KAAK,KAAK,6BAA6B,EACvC,KAAK,CAACL,MAAQ;AAEb,YAAIU,MAAc,KAAK,cAAe;AACtC,cAAME,IAAeZ,EAAI,KAAK,UAAU,CAAA,GAClCa,IAAYb,EAAI,KAAK,OACrBc,IAAWF,EAAa,IAAI,CAACG,MAAO;AACxC,cAAIC,IAAU;AAAA,YACZ,OAAOD;AAAA,YACP,KAAKA,EAAG;AAAA,YACR,YAAA1E;AAAA,YACA,YAAY0E,EAAG;AAAA,YACf,QAAQA,EAAG,eAAe;AAAA,YAC1B,aAAa;AAAA,UAAA;AAEf,iBAAAC,EAAQ,QACNhD,gBAAAA,EAAAA;AAAAA,YAACS;AAAA,YAAA;AAAA,cACC,OAAOsC;AAAA,cAGP,YAAA1E;AAAA,cACA,iBAAA8D;AAAA,cACA,gBAAgB,MAAM,KAAK,eAAea,GAAS,EAAI;AAAA,cACvD,MAAM,KAAK,MAAM;AAAA,YAAA;AAAA,UAAA,GAGrBA,EAAQ,MAAMA,GACPA;AAAA,QACT,CAAC;AAED,aAAK;AAAA,UAAS,CAACC,OAAe;AAAA,YAC5B,WAAAJ;AAAA,YACA,aAAa;AAAA,YACb,UAAUX,IAAS,CAAC,GAAGe,EAAU,UAAU,GAAGH,CAAQ,IAAIA;AAAA;AAAA;AAAA;AAAA,YAI1D,cAAc,CAAA;AAAA,YACd,OAAO;AAAA,UAAA;AAAA,UAEP,MAAM;AACJ,gBAAIN;AACF,qBAAO,KAAK,cAAcA,CAAgB;gBACjCC;AACT,qBAAO,KAAK,cAAcA,CAAe;AAAA,UAE7C;AAAA,QAAA,GACEK,EAAS,WAAW,KACtB,KAAK,eAAeA,EAASA,EAAS,SAAS,CAAC,CAAC;AAAA,MAErD,CAAC,EACA,MAAM,CAACI,MAAQ;AACd,QAAIR,MAAc,KAAK,iBACvB,KAAK,SAAS;AAAA,UACZ,UAAU,CAAA;AAAA,UACV,aAAa;AAAA,UACb,cAAc,CAAA;AAAA,UACd,OAAOQ;AAAA,QAAA,CACR;AAAA,MACH,CAAC;AAAA,IACL;AAEA,IAAArE,EAAA,uBAAgB,OAAO2D,MAAqB;AAC1C,YAAM;AAAA,QACJ,iBAAAL;AAAA,QACA,YAAA9D;AAAA,QACA,aAAA+D;AAAA,QACA,MAAAE;AAAA,MAAA,IACE,KAAK;AAET,WAAK,SAAS;AAAA,QAAE,aAAa;AAAA;AAAA,MAAA,CAA0B;AACvD,YAAM,EAAE,MAAApD,EAAA,IAAS,MAAM6C;AAAA,QACrB,GACElC,EAAO,OACT,WAAWxB,CAAU,SAASmE,CAAgB,eAAenE,CAAU,0BAA0BiE,IAAO,WAASA,IAAM,EAAE,GACvHF,IAAc,mBAAmB,EACnC;AAAA,MAAA,EACA;AAAA,QAAK,CAACJ,MACN,KAAK,8BAA8B;AAAA,UACjC,MAAM,EAAE,QAAQA,EAAI,KAAA;AAAA,QAAK,CAC1B,EAAE,KAAK,MAAMA,CAAG;AAAA,MAAA;AAGnB,UAAI9C,EAAK,WAAW;AAClB,eAAO,KAAK;AAAA,UACV;AAAA,YACE,OAAO;AAAA,cACL,SAAS,yCAAyCsD,CAAgB;AAAA,YAAA;AAAA,UACpE;AAAA,UAEF,KAAK;AAAA,QAAA;AAGT,YAAMO,IAAK7D,EAAKA,EAAK,SAAS,CAAC;AAC/B,UAAIiE,IAAO;AAAA,QACT,OAAOJ;AAAA,QACP,KAAKA,EAAG;AAAA,QACR,YAAA1E;AAAA,QACA,YAAY0E,EAAG;AAAA,QACf,QAAQA,EAAG,eAAe;AAAA,QAC1B,aAAa;AAAA,MAAA;AAEf,MAAAI,EAAK,QACHnD,gBAAAA,EAAAA;AAAAA,QAACS;AAAA,QAAA;AAAA,UACC,OAAOsC;AAAA,UAGP,YAAA1E;AAAA,UACA,iBAAA8D;AAAA,UACA,MAAM,KAAK,MAAM;AAAA,UACjB,gBAAgB,MAAM,KAAK,eAAegB,GAAM,EAAI;AAAA,QAAA;AAAA,MAAA,GAIvDA,EAAK,MAAMA;AACZ,YAAMC,IAAQD;AACd,eAASE,IAAInE,EAAK,SAAS,GAAGmE,KAAK,GAAGA,KAAK;AACzC,cAAMN,IAAK7D,EAAKmE,CAAC,GACXC,IAAO;AAAA,UACX,OAAOP;AAAAA,UACP,KAAKA,EAAG;AAAA,UACR,YAAA1E;AAAA,UACA,YAAY0E,EAAG;AAAA,UACf,QAAQA,EAAG,eAAe;AAAA,UAC1B,aAAa;AAAA,QAAA;AAEf,QAAAO,EAAK,MAAMA,GACXA,EAAK,QACHtD,gBAAAA,EAAAA;AAAAA,UAACS;AAAA,UAAA;AAAA,YACC,OAAOsC;AAAAA,YAGP,YAAA1E;AAAA,YACA,iBAAA8D;AAAA,YACA,MAAM,KAAK,MAAM;AAAA,YACjB,gBAAgB,MAAM,KAAK,eAAemB,GAAM,EAAI;AAAA,UAAA;AAAA,QAAA,GAIxDH,EAAK,WAAW,CAACG,CAAI,GACrBH,IAAOG;AAAA,MACT;AAGJ,YAAM,EAAE,UAAAR,MAAa,KAAK;AACtB,UAAIS,IAAYT,EAAS,UAAU,CAACU,MAAMA,EAAE,OAAOJ,EAAM,GAAG;AAC5D,MAAAN,EAASS,CAAS,IAAIH;AACtB,YAAMK,IAAa,CAAC,GAAGvE,EAAK,IAAI,CAACwE,MAAMA,EAAE,EAAE,EAAE,SAAS;AAEtD,WAAK;AAAA,QAAS,EAAE,UAAAZ,EAAA;AAAA,QAAY,MAC1B,KAAK,iBAAiBW,GAAYjB,CAAgB;AAAA,MAAA;AAAA,IAEtD;AAEA,IAAA3D,EAAA,wBAAiB,OAAOmE,GAASW,GAAWC,MAAoB;AAC9D,YAAM;AAAA,QACJ,iBAAAzB;AAAA,QACA,YAAA9D;AAAA,QACA,aAAA+D;AAAA,QACA,mBAAAC;AAAA,QACA,MAAAC;AAAA,MAAA,IACE,KAAK;AACU,MAAAzB,EAAImC,GAAS,YAAY;AAC5C,YAAMa,IAAQzC,GACRuB,IAAS9B,EAAImC,GAAS,aAAa,GACnChB,IAAM,MAAMD;AAAA,QAChB,GAAGlC,EAAO,OAAO,WAAWxB,CAAU,SACpC2E,EAAQ,MAAM,EAChB,mBAAmBa,CAAK,WAAWlB,CAAM,eAAetE,CAAU,GAAGiE,IAAO,WAASA,IAAM,EAAE,GAC3FF,IAAc,mBAAmB,EACnC,GAAGC,IAAoB,4BAA4B,EAAE;AAAA,MAAA;AAEvD,YAAM,KAAK,8BAA8BL,CAAG;AAE5C,YAAM9C,IAAO8C,EAAI,KAAK,SAClBA,EAAI,KAAK,OAAO,IAAI,CAACe,MAAO;AAC1B,YAAIe,IAAe;AAAA,UACjB,OAAOf;AAAA,UACP,KAAKA,EAAG;AAAA,UACR,YAAA1E;AAAA,UACA,YAAY0E,EAAG;AAAA,UACf,QAAQA,EAAG,eAAe;AAAA,UAC1B,aAAa;AAAA,UACb,QAAQC;AAAA,UACR,MAAMD,EAAG;AAAA,QAAA;AAGX,eAAAe,EAAa,QACX9D,gBAAAA,EAAAA;AAAAA,UAACS;AAAA,UAAA;AAAA,YACC,OAAOsC;AAAA,YAGP,YAAA1E;AAAA,YACA,iBAAA8D;AAAA,YACA,MAAM,KAAK,MAAM;AAAA,YACjB,gBAAgB,MAAM,KAAK,eAAe2B,GAAc,EAAI;AAAA,UAAA;AAAA,QAAA,GAGhEA,EAAa,MAAMA,GAEZA;AAAA,MACT,CAAC,IACD,CAAA;AAWJ,UARAd,EAAQ,WACNA,EAAQ,YAAYL,MAAW,KAAK,CAACgB,IACjC,CAAC,GAAGX,EAAQ,UAAU,GAAG9D,CAAI,IAC7BA,GAEF8C,EAAI,KAAK,QAAQgB,EAAQ,aAAaA,EAAQ,SAAS,WACzDA,EAAQ,aAAaA,EAAQ,SAAS,SAEpC,CAAChB,EAAI,KAAK,MAAM;AAClB,cAAM+B,IAAa,OACjBf,EAAQ,eAAe5B,GACnBI,EAAcX,EAAImC,EAAQ,SAASA,EAAQ,SAAS,SAAS,CAAC,GAAG,KAAK,CAAC,MACzEA,EAAQ,WAAWA,EAAQ,SAAS,MAAM,GAAG,EAAE,IAE1C,KAAK,eAAeA,GAAS,EAAK;AAE3C,QAAAA,EAAQ,WAAW;AAAA,UACjB,GAAGA,EAAQ;AAAA,UACX;AAAA,YACE,OACEhD,gBAAAA,EAAAA;AAAAA,cAAC0B;AAAA,cAAA;AAAA,gBACC,SAASqC;AAAA,cAAA;AAAA,cACJzC,EAAY0B,EAAQ,GAAG;AAAA,YAAA;AAAA,YAGhC,KAAK1B,EAAY0B,EAAQ,GAAG;AAAA,YAC5B,YAAY;AAAA,YACZ,QAAQ;AAAA,UAAA;AAAA,QACV;AAAA,MAEJ;AACA,MAAKY,KAIH,KAAK,SAAS,CAACX,OAAe;AAAA,QAC5B,UAAU,CAAC,GAAGA,EAAU,QAAQ;AAAA,QAChC,YAAY,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAGA,EAAU,YAAYD,EAAQ,GAAG,CAAC,CAAC;AAAA,MAAA,EAC/D;AAAA,IAEN;AAEA,IAAAnE,EAAA,uCAAgC,CAACmD,MAC1BA,EAAI,KAAK,SACP,QAAQ;AAAA,MACbA,EAAI,KAAK,OACN,OAAO,CAACe,MAAO,CAAC,CAACA,EAAG,gBAAgB,EACpC;AAAA,QAAI,CAACA,MACJ,KAAK,cACF,KAAKA,EAAG,gBAAgB,EACxB;AAAA,UACC,CAACiB,MACEjB,EAAG,SAAS;AAAA,YACX,IAAIA,EAAG;AAAA,YACP,mBAAmBA,EAAG;AAAA,YACtB,SAAAiB;AAAA,UAAA;AAAA,QACF;AAAA,MACJ;AAAA,IACJ,EACF,KAAK,MAAMhC,CAAG,IAhBaA;AAmB/B,IAAAnD,EAAA,oBAAa,CAACoF,GAAUN,IAAY,QAC9BA,MACFM,EAAS,cAAc,IAElB,KAAK,eAAeA,EAAS,KAAKN,CAAS;AAGpD,IAAA9E,EAAA,kBAAW,CAACqF,GAAIC,MAAc;AAC5B,UAAIb,IAAO;AAIX,UAFAA,IAAOa,EAAU,KAAK,CAACC,MAAMvD,EAAIuD,GAAG,UAAU,MAAMF,CAAE,GAElDZ;AACF,eAAOA;AACF;AACL,cAAMe,IAAWF,EAAU,IAAI,CAACC,MAAMvD,EAAIuD,GAAG,UAAU,KAAK,EAAE,GACxDE,IAAoBC,GAAQF,CAAQ;AAC1C,eAAIC,EAAkB,WAAW,IACxB,OAEA,KAAK,SAASJ,GAAII,CAAiB;AAAA,MAE9C;AAAA,IACF;AAEA,IAAAzF,EAAA,4CAAqC,OAAO2F,GAAYC,MAAY;AAClE,UAAInB;AACJ,aAAO,CAACA,KAAQkB,EAAW,SAAS,SAASA,EAAW;AACtD,QAAAA,EAAW,eAAepD,GACtBI,EAAcX,EAAI2D,EAAW,SAASA,EAAW,SAAS,SAAS,CAAC,GAAG,KAAK,CAAC,MAC/EA,EAAW,WAAWA,EAAW,SAAS,MAAM,GAAG,EAAE,IAEvD,MAAM,KAAK,eAAeA,GAAY,IAAO,EAAI,GACjDlB,IAAO,KAAK,SAASmB,GAASD,EAAW,QAAQ;AAEnD,aAAKlB,MACHA,IAAOkB,EAAW,SAAS;AAAA,QAAK,CAACE,MAC/B7D,EAAI6D,GAAG,UAAU,IAAIA,EAAE,MAAM,GAAG,QAAQ,gBAAgB,IAAI,KAAK;AAAA,MAAA,IAG9DpB;AAAA,IACT;AAEA,IAAAzE,EAAA,0BAAmB,OAAO8F,GAAMC,GAAWC,IAAY,OAAS;AAC9D,WAAK,SAAS,EAAE,aAAa,GAAA,CAAM;AACnC,YAAM,EAAE,YAAYC,EAAA,IAAe,KAAK;AAGxC,UAAI,EAAE,UAAAhC,MAAa,KAAK;AACxB,YAAMiC,IAAcH,IAAY,KAAK,SAASA,GAAW9B,CAAQ,IAAI,MAC/DW,IAAakB,IAAO,CAAC,GAAGA,CAAI,IAAI,CAAC,GAAGG,CAAU;AACpD,eAAS/E,IAAQ,GAAGA,IAAQ0D,EAAW,QAAQ1D,KAAS;AACtD,YAAIuD,IAAO,KAAK,SAASG,EAAW1D,CAAK,GAAG+C,CAAQ;AACpD,YAAI,CAACQ,KAAQyB,KAAetB,EAAW1D,IAAQ,CAAC,GAAG;AAEjD,gBAAMyE,IAAa,KAAK,SAASf,EAAW1D,IAAQ,CAAC,GAAG+C,CAAQ;AAChE,UACE0B,KACAQ,EAAQnE,EAAI2D,GAAY,UAAU,CAAC,KACnCA,EAAW,SAAS,SAAS,MAE7BlB,IAAO,MAAM,KAAK;AAAA,YAChBkB;AAAA,YACAf,EAAW1D,CAAK;AAAA,UAAA,GAEduD,IACFG,EAAW,OAAO1D,GAAO,GAAGuD,EAAK,MAAM,EAAE,IAGzC,KAAK;AAAA,YACH;AAAA,cACE,wCACG,QAAA,EAAK,UAAA;AAAA,gBAAA;AAAA,gBAAmBsB;AAAA,gBAAU;AAAA,cAAA,GAAkB;AAAA,cAEvD,aAAa;AAAA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UACf;AAAA,QAYR;AACA,YAAItB,GAAM;AACR,gBAAM,KAAK,eAAeA,GAAM,IAAM,EAAI;AAC1C,cAAI2B,IAAa3B,EAAK,SAAS;AAAA,YAC7B,CAACoB,MAAM7D,EAAI6D,GAAG,UAAU,MAAM7D,EAAIkE,GAAa,UAAU;AAAA,UAAA;AAE3D,UACEA,KACAhF,MAAU0D,EAAW,SAAS,KAC9B5C,EAAIyC,GAAM,UAAU,MAAMzC,EAAIkE,GAAa,UAAU,KACrDC,EAAQ1B,EAAK,QAAQ,KACrB,CAAC2B,KAEG3B,EAAK,SAAS,SAASA,EAAK,eAE9B2B,IAAa,MAAM,KAAK;AAAA,YACtB3B;AAAA,YACAzC,EAAIkE,GAAa,UAAU;AAAA,UAAA,GAGzBE,IACF,KAAK,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,MAAM,QAAQ,EAAA,GAAK,MAAM;AAC1D,uBAAW,MAAM;AAEf,cADc,SAAS,eAAeL,CAAS,EACzC,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU;AAAA,YAI9D,GAAG,GAAG;AAAA,UACR,CAAC,IAGD,KAAK;AAAA,YACH;AAAA,cACE,wCACG,QAAA,EAAK,UAAA;AAAA,gBAAA;AAAA,gBAAmBA;AAAA,gBAAU;AAAA,cAAA,GAAkB;AAAA,cAEvD,aAAa;AAAA,YAAA;AAAA,YAEf,MAAM;AACJ,cACE,KAAK,MAAM,aAAa,eACxB,OAAO,KAAK,MAAM,uBAAwB,cAE1C,KAAK,MAAM,oBAAoBA,CAAS;AAAA,YAE5C;AAAA,UAAA;AAAA,QAKV;AAAA,MACF;AACA,YAAMM,IAAW,EAAE,YAAAzB,GAAY,aAAa,GAAA;AAC5C,MAAIoB,MACFK,EAAS,eAAezB,IAE1B,KAAK,SAASyB,GAAU,MAAM;AAC5B,QAAIN,KACF,WAAW,MAAM;AAEf,UADc,SAAS,eAAeA,CAAS,EACzC,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU;AAAA,QAI9D,GAAG,GAAG;AAAA,MAEV,CAAC;AAAA,IACH;AAtgBE,SAAK,QAAQ;AAAA,MACX,aAAa;AAAA,MACb,UAAU,CAAA;AAAA,MACV,YAAY,CAAA;AAAA,MACZ,cAAc,CAAA;AAAA,MACd,WAAW;AAAA,MACX,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,MAAM,CAAA;AAAA,IAAC,GAET,KAAK,UAAUjG,EAAM,UAAA,GAGrB,KAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAgB;AAClB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAmfA,SAAS;AACP,UAAM;AAAA,MACJ,OAAAwG;AAAA,MACA,WAAAtC;AAAA,MACA,aAAAuC;AAAA,MACA,UAAAtC;AAAA,MACA,kBAAAuC;AAAA,MACA,iBAAAC;AAAA,MACA,YAAA7B;AAAA,MACA,cAAA8B;AAAA,IAAA,IACE,KAAK,OACH,EAAE,UAAAC,GAAU,SAAAxB,GAAS,QAAAyB,GAAQ,kBAAAlD,EAAA,IAAqB,KAAK,OAEvDC,IAAmBD;AAEzB,kCACG,OAAA,EACE,UAAA;AAAA,MAAA4C,KACCnF,gBAAAA,EAAAA,IAACrB,EAAM,UAAN,EACE,YAAIwG,GAAO,oBAAoB,MAAM,MACpCnF,gBAAAA,EAAAA;AAAAA,QAAC0F;AAAA,QAAA;AAAA,UACC,UAAQ;AAAA,UACR,SAAS,MAAM,KAAK,SAAS,EAAE,OAAO,MAAM;AAAA,UAC5C,OAAO,EAAE,WAAW,MAAA;AAAA,UACpB,SAAS1F,gBAAAA,EAAAA,IAAC2F,IAAA,EAAS,OAAAR,EAAA,CAAc;AAAA,UACjC,MAAK;AAAA,QAAA;AAAA,MAAA,IAGPnF,gBAAAA,EAAAA;AAAAA,QAAC0F;AAAA,QAAA;AAAA,UACC,UAAQ;AAAA,UACR,SAAS,MAAM,KAAK,SAAS,EAAE,OAAO,MAAM;AAAA,UAC5C,OAAO,EAAE,WAAW,MAAA;AAAA,UACpB,SACE1F,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAAmF;AAAA,cACA,UAAAK;AAAA,cACA,SAAAxB;AAAA,cACA,UAAU,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAGnB,MAAK;AAAA,QAAA;AAAA,MAAA,GAGX;AAAA,MAEDsB,KACCtF,gBAAAA,EAAAA;AAAAA,QAAC0F;AAAA,QAAA;AAAA,UACC,UAAQ;AAAA,UACR,SAAS,MAAM,KAAK,SAAS,EAAE,iBAAiB,MAAM;AAAA,UACtD,OAAO,EAAE,WAAW,MAAA;AAAA,UACpB,SAASJ;AAAA,UACT,MAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAGRF,2BAAgBQ,IAAA,EAAS,WAAW,EAAE,MAAM,GAAA,GAAM,QAAM,IAAC;AAAA,MACzD,CAACR,KAAetC,EAAS,SAAS,KACjC9C,gBAAAA,EAAAA;AAAAA,QAAC6F;AAAAA,QAAA;AAAA,UACC,KAAK,KAAK;AAAA,UACV,kBAAAR;AAAA,UAGA,UAAU,KAAK;AAAA,UACf,QAAQ,CAAC5B,MAAe,KAAK,SAAS,EAAE,YAAAA,GAAY;AAAA,UACpD,YAAAA;AAAA,UACA,cAAA8B;AAAA,UACA,UAAAzC;AAAA,UACA,gBAAgB,CAACQ,MAASA,EAAK,QAAQd;AAAA,UACvC,UAAU,CAAC+C,GAAcO,MAAQ;AAC/B,iBAAK,SAAS,EAAE,cAAAP,EAAAA,CAAc,GAC1B,KAAK,MAAM,4BACb,KAAK,MAAM;AAAA,cACTO,EAAI,WAAWA,EAAI,KAAK,MAAM;AAAA,YAAA;AAAA,UAGpC;AAAA,QAAA;AAAA,MAAA;AAAA,MAIH,CAACX,KAASrC,EAAS,SAASD,KAC3BzC,gBAAAA,EAAAA,KAAC2F,IAAA,EAAO,SAASX,GAAa,SAAS,MAAM,KAAK,SAAS,EAAI,GAAG,UAAA;AAAA,QAAA;AAAA,QACtD;AAAA,MAAA,EAAA,CACZ;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AAnmBEvG,EADI8C,GACG,eAAczD;ACnCvB,MAAM8H,KAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAMC,UAAuBtH,EAAM,UAAU;AAAA,EAG3C,YAAYC,GAAO;AACjB,UAAMA,CAAK;AAiBb,IAAAC,EAAA,2BAAoB,YAAY;AAC9B,YAAM,EAAE,YAAAR,GAAY,UAAA6H,EAAA,IAAa,KAAK;AACtC,UAAIA;AACF,YAAI;AACF,gBAAM,EAAE,MAAMlC,EAAA,IAAY,MAAMmC,GAAW9H,CAAU;AACrD,eAAK,SAAS,EAAE,SAAA2F,GAAS;AAAA,QAC3B,QAAc;AAAA,QAEd;AAAA,IAEJ;AAEA,IAAAnF,EAAA,gBAAS,MAAM;AACb,YAAM;AAAA,QACJ,YAAAR;AAAA,QACA,iBAAAoE;AAAA,QACA,kBAAAF;AAAA,QACA,0BAAA6D;AAAA,QACA,iBAAAC;AAAA,QACA,mBAAAC;AAAA,QACA,UAAAJ;AAAA,QACA,MAAA5D;AAAA,QACA,mBAAAD,IAAoB;AAAA,MAAA,IAClB,KAAK,OACH,EAAE,aAAAD,GAAa,SAAA4B,EAAA,IAAY,KAAK,OAEhCuC,IAAmB,CAACC,MAAS;;AACjC,cAAM/E,IAAMZ,EAAI2F,GAAM,KAAK;AAC3B,YAAI,CAAC/E,EAAK;AACV,cAAMf,IAAOG,EAAI2F,GAAM,MAAM;AAC7B,YAAIF,KAAqBN,GAAoB,SAAStF,CAAI,GAAG;AAE3D,gBAAM+F,KAAkBC,KAAA5H,IAAA,KAAK,YAAL,gBAAAA,EAAc,UAAd,gBAAA4H,EAAqB;AAC7C,UAAID,OAAiChF,CAAG;AAAA,QAC1C,OAAW2E,MACTA,EAAyB3E,CAAG,GACxB,KAAK,WAAW,KAAK,QAAQ,cAAY,KAAK,QAAQ,WAAA;AAAA,MAE9D,GAEMkF,IAAoB,MAAM;AAC9B,QAAIP,OAAmD,IAAI;AAAA,MAC7D;AAEA,aACEhG,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,QAAA8F,MAAa,SAASlC,KAAWhE,gBAAAA,EAAAA,IAAC4G,GAAA,EAAS,SAAA5C,GAAkB;AAAA,QAC9DhE,gBAAAA,EAAAA,IAAC9B,EAAiB,UAAjB,EAA0B,OAAO,KAAK,OACvC,UAAAkC,gBAAAA,EAAAA,KAACI,EAAe,UAAf,EAAwB,OAAO,KAAK,OACnC,UAAA;AAAA,UAAAJ,gBAAAA,OAACyG,IAAA,EACC,UAAA;AAAA,YAAA7G,gBAAAA,EAAAA,IAAC8G,GAAA,EAAI,MAAK,QACR,UAAA9G,gBAAAA,EAAAA;AAAAA,cAAC+G;AAAAA,cAAA;AAAA,gBACC,aAAA3E;AAAA,gBACA,YAAA/D;AAAA,gBACA,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,eAAe;AAAA,gBAAA;AAAA,gBAEjB,iBAAiBkE,KAAoB;AAAA,gBACrC,cAAcgE;AAAA,gBACd,eAAeI;AAAA,cAAA;AAAA,YAAA,GAEnB;AAAA,YACCN,KACCjG,gBAAAA,EAAAA,KAAC0G,GAAA,EAAI,OAAO,EAAE,aAAa,SACzB,UAAA;AAAA,cAAA9G,gBAAAA,EAAAA;AAAAA,gBAACgH;AAAA,gBAAA;AAAA,kBACC,gBAAgB,KAAK,MAAM;AAAA,kBAC3B,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAAC,EAAA,QAAgB;AACrC,yBAAK,SAAS,EAAE,UAAUA,EAAA,CAAS,GACnCC,EAAa,oBAAoBD,CAAO;AAAA,kBAC1C;AAAA,kBACD,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIDjH,gBAAAA,EAAAA;AAAAA,gBAACgH;AAAA,gBAAA;AAAA,kBACC,gBAAgB,KAAK,MAAM;AAAA,kBAC3B,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAAC,EAAA,QAAgB;AACrC,yBAAK,SAAS,EAAE,aAAaA,EAAA,CAAS,GACtCC,EAAa,oBAAoBD,CAAO;AAAA,kBAC1C;AAAA,kBACD,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAED,EAAA,CACF;AAAA,UAAA,GAEJ;AAAA,UACAjH,gBAAAA,EAAAA;AAAAA,YAAC2B;AAAA,YAAA;AAAA,cACC,mBAAAU;AAAA,cACA,aAAAD;AAAA,cACA,YAAA/D;AAAA,cACA,iBAAAoE;AAAA,cACA,kBAAAF;AAAA,cACA,0BAAA6D;AAAA,cACA,SAAS,CAACe,MAAS,KAAK,UAAUA;AAAA,cAClC,MAAA7E;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,EAAA,CACF,EAAA,CACA;AAAA,QACC4D,MAAa,YAAYlC,KAAWhE,gBAAAA,EAAAA,IAAC4G,KAAS,SAAA5C,EAAA,CAAkB;AAAA,MAAA,GACnE;AAAA,IAEJ;AAvHE,IAAAoD,GAAQ,KAAK,MAAM,IAAI,GACvB,KAAK,QAAQ;AAAA,MACX,aAAaC,EAAY,oBAAoB,EAAK;AAAA,MAClD,UAAUA,EAAY,oBAAoB,EAAK;AAAA,MAC/C,SAAS;AAAA,IAAA,GAGX,KAAK,QAAQjJ,EAAgB,KAAK,MAAM,UAAU;AAAA,EACpD;AAAA,EAEA,mBAAmB0D,GAAW;AAC5B,IAAIA,EAAU,eAAe,KAAK,MAAM,eACtC,KAAK,QAAQ1D,EAAgB,KAAK,MAAM,UAAU;AAAA,EAEtD;AA0GF;AA5HES,EADIoH,GACG,eAAcqB;AAgIvB,SAAwBzB,GAAK;AAAA,EAC3B,YAAAxH;AAAA,EACA,iBAAAoE;AAAA,EACA,kBAAAF;AAAA,EACA,0BAAA6D;AAAA,EACA,iBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,UAAAJ;AAAA,EACA,MAAA5D;AAAA,EACA,mBAAAD;AAAA,EACA,MAAAkF;AAAA,EACA,GAAGC;AACL,GAAG;AACD,+BACGF,EAAc,UAAd,EAAuB,OAAOG,GAAYD,CAAW,GACpD,UAAAxH,gBAAAA,EAAAA;AAAAA,IAACiG;AAAA,IAAA;AAAA,MACC,YAAA5H;AAAA,MACA,iBAAAoE;AAAA,MACA,kBAAAF;AAAA,MACA,0BAAA6D;AAAA,MACA,iBAAAC;AAAA,MACA,mBAAAC;AAAA,MACA,UAAAJ;AAAA,MACA,MAAA5D;AAAA,MACA,mBAAAD;AAAA,MACA,MAAAkF;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AC9KO,MAAM1B,KAAO6B,GAAUC,GAAeC,EAAO,CAAC;"}
1
+ {"version":3,"file":"tree.js","sources":["../src/ColTree/treeCache.js","../src/ColTree/TaxonSources.js","../src/ColTree/ColTreeContext.js","../src/ColTree/ColTreeNode.js","../src/ColTree/ColTree.js","../src/ColTree/index.js","../src/entries/tree.js"],"sourcesContent":["import { createContext } from \"react\";\nimport DataLoader from \"dataloader\";\nimport { getDatasetsBatch, getPublishersBatch } from \"../api/dataset\";\n\n// Shared DataLoaders for the Tree subtree. Created once per (datasetKey,\n// mounted Tree) and provided via TreeCacheContext so every TaxonSources,\n// every sector-dataset decoration in ColTree, and any other in-tree\n// consumer hits the same in-memory cache. Without this, each TaxonSources\n// instance creates its own loader and the same source/publisher dataset\n// is fetched once per node it appears under.\n//\n// DataLoader batches calls inside a microtask and caches resolved values\n// indefinitely for the lifetime of the loader.\n\nexport const TreeCacheContext = createContext({\n datasetLoader: null,\n publisherLoader: null,\n});\n\nexport const createTreeCache = (datasetKey) => ({\n datasetLoader: new DataLoader((ids) => getDatasetsBatch(ids, datasetKey)),\n publisherLoader: new DataLoader((ids) =>\n getPublishersBatch(ids, datasetKey)\n ),\n});\n","import React from \"react\";\nimport { Popover, Spin, Divider } from \"antd\";\nimport DataLoader from \"dataloader\";\nimport { sortBy } from \"lodash-es\";\nimport { LinkTo } from \"../router\";\nimport { TreeCacheContext } from \"./treeCache\";\nimport { getDatasetsBatch, getPublishersBatch } from \"../api/dataset\";\nimport config from \"../config\";\n\nclass TaxonSources extends React.Component {\n static contextType = TreeCacheContext;\n\n constructor(props) {\n super(props);\n this.state = {\n data: [],\n showInNode: false,\n loading: false,\n };\n }\n\n // Returns the shared cache from TreeCacheContext if available, or a\n // throwaway local DataLoader so the popover still works even if context\n // doesn't reach this instance (which used to leave the spinner stuck\n // because getData early-returned with no loading state set).\n getDatasetLoader = () => {\n const { datasetKey } = this.props;\n if (this.context?.datasetLoader) return this.context.datasetLoader;\n if (!this._localDatasetLoader) {\n this._localDatasetLoader = new DataLoader((ids) =>\n getDatasetsBatch(ids, datasetKey)\n );\n }\n return this._localDatasetLoader;\n };\n\n getPublisherLoader = () => {\n const { datasetKey } = this.props;\n if (this.context?.publisherLoader) return this.context.publisherLoader;\n if (!this._localPublisherLoader) {\n this._localPublisherLoader = new DataLoader((ids) =>\n getPublishersBatch(ids, datasetKey)\n );\n }\n return this._localPublisherLoader;\n };\n\n componentDidMount = () => {\n const { sourceDatasetKeys } = this.props;\n if (sourceDatasetKeys && sourceDatasetKeys.length < 4) {\n this.setState({ showInNode: true }, this.getData);\n }\n };\n\n getData = () => {\n const { sourceDatasetKeys } = this.props;\n if (!sourceDatasetKeys?.length) return;\n this.setState({ loading: true });\n const loader = this.getDatasetLoader();\n Promise.all(\n sourceDatasetKeys.map((s) => loader.load(s).catch(() => null))\n )\n .then((data) => {\n this.setState({ data: sortBy(data, [\"alias\"]), loading: false });\n })\n .catch(() => {\n this.setState({ data: [], loading: false });\n });\n };\n\n getPublisherData = () => {\n const { publisherDatasetKeys } = this.props;\n if (!publisherDatasetKeys) return;\n const loader = this.getPublisherLoader();\n Promise.all(\n Object.keys(publisherDatasetKeys).map((s) =>\n loader\n .load(s)\n .then((publisher) => ({\n ...publisher,\n datasets: publisherDatasetKeys[s],\n }))\n .catch(() => null)\n )\n )\n .then((data) => {\n this.setState({ publishers: sortBy(data.filter(Boolean), [\"alias\"]) });\n })\n .catch(() => {\n this.setState({ publishers: [] });\n });\n };\n\n render = () => {\n const { data, showInNode, popOverVisible, loading } = this.state;\n const { taxon, datasetKey } = this.props;\n const linkStyle = { color: \"orange\", fontSize: \"11px\" };\n const publisherUrl = (uuid) =>\n `${config.clbPortal}/dataset/${datasetKey}/publisher/${uuid}`;\n\n if (showInNode) {\n return data\n .filter((d) => !!d)\n .map((d, index) => (\n <LinkTo\n to=\"source\"\n args={d.key}\n key={d.key}\n className=\"col-tree-data-source\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.key)}\n </LinkTo>\n ));\n }\n\n return (\n <div style={{ display: \"inline\" }} id={`taxon_sources_${taxon.id}`}>\n <Popover\n getPopupContainer={() =>\n document.getElementById(`taxon_sources_${taxon.id}`)\n }\n content={\n loading || data.length === 0 ? (\n <div\n style={{ minWidth: \"200px\", textAlign: \"center\", padding: \"8px 0\" }}\n >\n <Spin size=\"small\" />\n </div>\n ) : (\n <div style={{ maxWidth: \"500px\" }}>\n {data.length > 0 && (\n <div>\n {data\n .filter((d) => !!d)\n .map((d, index) => (\n <LinkTo\n to=\"source\"\n args={d.key}\n key={d.key}\n className=\"col-tree-data-source\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.key)}\n </LinkTo>\n ))}\n </div>\n )}\n {this.state.publishers && this.state.publishers.length > 0 && (\n <div style={{ marginTop: \"12px\" }}>\n <strong>Publishers</strong>\n <div>\n {this.state.publishers\n .filter((d) => !!d)\n .map((d, index) => (\n <a\n key={d.id}\n href={publisherUrl(d.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.id)}\n {d.datasets?.length\n ? ` (${d.datasets.length.toLocaleString(\"en-GB\")})`\n : \"\"}\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n title={\n <div style={{ padding: \"4px 0\" }}>\n <span style={{ fontWeight: 500 }}>Sources for </span>\n <em>{taxon?.name}</em>\n <Divider style={{ margin: \"8px 0 0\" }} />\n </div>\n }\n open={popOverVisible}\n onOpenChange={(visible) =>\n this.setState({ popOverVisible: visible }, () => {\n if (visible && this.state.data.length === 0) this.getData();\n if (\n visible &&\n this.props.publisherDatasetKeys &&\n !this.state.publishers\n ) {\n this.getPublisherData();\n }\n })\n }\n trigger=\"click\"\n placement=\"rightTop\"\n >\n <a\n className=\"col-tree-data-source\"\n role=\"button\"\n tabIndex={0}\n style={{ cursor: \"pointer\", color: \"orange\", fontSize: \"11px\" }}\n onClick={(e) => e.preventDefault()}\n >\n Multiple sources\n </a>\n </Popover>\n </div>\n );\n };\n}\n\nexport default TaxonSources;\n","import React from \"react\";\n\nexport const ColTreeContext = React.createContext();\n","import React from \"react\";\nimport { Tag } from \"antd\";\nimport { get, isUndefined } from \"lodash-es\";\nimport TaxonSources from \"./TaxonSources\";\nimport MergedDataBadge from \"../components/MergedDataBadge\";\nimport {ColTreeContext} from \"./ColTreeContext\"\nimport { LinkTo } from \"../router\";\n\nclass ColTreeNode extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n style: {},\n provisional: this.props.taxon.status === \"provisionally accepted\",\n loading: false,\n };\n }\n\n rankIsAboveSpecies = (rank) => {\n return this.props.rank.indexOf(rank) < this.props.rank.indexOf(\"species\");\n };\n\n render = () => {\n const {\n taxon,\n taxon: { sector, sourceDatasetKeys, publisherDatasetKeys },\n datasetKey,\n } = this.props;\n\n const sectorSourceDataset = get(sector, \"dataset\");\n/* const hasDatasetSectors = datasetSectors && ( sector && sector.subjectDatasetKey ? Object.keys(omit(datasetSectors, [sector.subjectDatasetKey])).length > 0 : true)\n */ \nconst hasDatasetSectors =\n(sourceDatasetKeys || []).filter((d) => sector?.subjectDatasetKey !== d)\n .length > 0;\n const estimate = taxon.estimate && taxon.estimates ? taxon.estimates.find(e => e.estimate === taxon.estimate) : null;\n // Virtual \"Not assigned\" placeholders inserted by the API\n // (insertPlaceholder=true) aren't real taxa, so they can't be linked\n // to a taxon page.\n const isPlaceholder =\n typeof taxon.id === \"string\" && taxon.id.indexOf(\"incertae-sedis\") > -1;\n\n return (\n <ColTreeContext.Consumer>\n {({ showInfo }) => (\n <div id={taxon.id}>\n <span>\n <span className=\"tree-node-rank\">{taxon.rank}: </span>\n {isPlaceholder ? (\n <span dangerouslySetInnerHTML={{ __html: taxon.labelHtml }} />\n ) : (\n <LinkTo to=\"taxon\" args={taxon.id}>\n <span dangerouslySetInnerHTML={{ __html: taxon.labelHtml }} />\n </LinkTo>\n )}\n {taxon?.merged && (\n <MergedDataBadge style={{ marginLeft: \"4px\" }} datasetKey={taxon?.datasetKey} verbatimSourceKey={taxon?.verbatimSourceKey}/>\n )}\n </span>\n {/* estimate && (\n <span>\n {\" \"}\n • <TaxonEstimate estimate={estimate} taxon={taxon} />\n </span>\n ) */}\n {showInfo && taxon.status === \"provisionally accepted\" && (\n <React.Fragment> • <Tag color=\"warning\" style={{marginRight: 0}}>\n prov.\n </Tag>\n </React.Fragment>\n )}\n\n {!isUndefined(taxon.count) &&\n this.rankIsAboveSpecies(taxon?.rank) && (\n <span>\n {\" \"}\n • {Number(taxon.count).toLocaleString()}{\" \"}\n {showInfo && !isUndefined(taxon.speciesEstimate) && (\n <span>\n {\" \"}\n of{\" \"}\n {Number(\n taxon.speciesEstimate\n ).toLocaleString()}{\" \"}\n est.{\" \"}\n </span>\n )}\n spp.\n </span>\n )} \n \n \n {showInfo && sector && (\n <span>\n <span> • </span>\n <LinkTo\n to=\"source\"\n args={sector.subjectDatasetKey}\n style={hasDatasetSectors ? {fontWeight: 'bold'} : null}\n className=\"col-tree-data-source\"\n >\n {get(sectorSourceDataset, \"alias\") || sector.subjectDatasetKey}{hasDatasetSectors && \", \"}\n </LinkTo>\n </span>\n )}\n {showInfo && hasDatasetSectors && (\n <React.Fragment> <TaxonSources\n sourceDatasetKeys={sourceDatasetKeys}\n publisherDatasetKeys={publisherDatasetKeys}\n taxon={taxon}\n datasetKey={datasetKey}\n />\n </React.Fragment>\n )}\n \n </div>\n )}\n </ColTreeContext.Consumer>\n\n );\n };\n}\n\nexport default ColTreeNode;\n","import React from \"react\";\nimport { Tree, Alert, Spin, Button, Skeleton } from \"antd\";\nimport { flatten, get, isArray } from \"lodash-es\";\nimport client from \"../api/client\";\nimport config from \"../config\";\nimport ColTreeNode from \"./ColTreeNode\";\nimport ErrorMsg from \"../components/ErrorMsg\";\nimport { getSectorsBatch } from \"../api/sector\";\nimport DataLoader from \"dataloader\";\nimport { TreeCacheContext } from \"./treeCache\";\n\nconst CHILD_PAGE_SIZE = 1000; // How many children will we load at a time\n\n// Key of the synthetic \"Load more...\" child node. It has to be scoped to its\n// parent: two nodes that both have more children than one page would otherwise\n// share one key and antd warns \"Same 'key' exist in the Tree\" (issue #59).\nconst LOAD_MORE_PREFIX = \"__loadMoreBTN__\";\nconst loadMoreKey = (parentKey) => `${LOAD_MORE_PREFIX}${parentKey}`;\nconst isLoadMoreKey = (key) =>\n typeof key === \"string\" && key.startsWith(LOAD_MORE_PREFIX);\n\nclass LoadMoreChildrenTreeNode extends React.Component {\n constructor(props) {\n super(props);\n this.state = { loading: false };\n }\n\n onClick = () => {\n this.setState({ loading: true }, () =>\n this.props.onClick().then(() => this.setState({ loading: false }))\n );\n };\n render = () => {\n const { loading } = this.state;\n return (\n <React.Fragment>\n {loading && <Spin />}\n {!loading && (\n <a onClick={this.onClick}>\n <strong>Load more...</strong>\n </a>\n )}\n </React.Fragment>\n );\n };\n}\n\nclass ColTree extends React.Component {\n static contextType = TreeCacheContext;\n\n constructor(props) {\n super(props);\n\n this.state = {\n rootLoading: true,\n treeData: [],\n loadedKeys: [],\n expandedKeys: [],\n rootTotal: 0,\n error: null,\n nodeNotFoundErr: null,\n rank: []\n };\n this.treeRef = React.createRef();\n // Incremented on every root load; a response whose id is no longer the\n // current one is stale and gets discarded (see loadRoot).\n this.rootRequestId = 0;\n }\n\n // datasetLoader comes from the shared TreeCacheContext so multiple tree\n // nodes (and TaxonSources instances) share one in-memory cache instead\n // of each re-fetching the same source datasets.\n get datasetLoader() {\n return this.context.datasetLoader;\n }\n\n componentDidMount = () => {\n const { datasetKey } = this.props;\n this.loadRoot();\n this.sectorLoader = new DataLoader((ids) =>\n getSectorsBatch(ids, datasetKey)\n );\n this.getRank()\n const { treeRef } = this.props;\n treeRef(this);\n };\n\n componentDidUpdate = (prevProps) => {\n if (\n prevProps.defaultExpandKey !== this.props.defaultExpandKey ||\n prevProps.hideExtinct !== this.props.hideExtinct ||\n prevProps.insertPlaceholder !== this.props.insertPlaceholder\n ) {\n this.reloadRoot();\n }\n };\n\n getRank = () => {\n client(`${config.dataApi}vocab/rank`).then((res) =>\n this.setState({ rank: res.data.map((r) => r.name) })\n );\n };\n\n reloadRoot = () =>\n this.setState(\n {\n rootLoading: true,\n treeData: [],\n loadedKeys: [],\n rootTotal: 0,\n error: null,\n nodeNotFoundErr: null,\n },\n this.loadRoot\n );\n\n \n\n // `append` is only set by the \"Load more\" button, which pages in the next\n // batch of root taxa; every other caller loads page one from scratch.\n // Each call takes a request id and a response is merged only while its id is\n // still the current one. Without that, two overlapping loads — React\n // StrictMode's double mount in dev, or a prop change while a load is in\n // flight — both merged their page into treeData, so every root appeared\n // twice and antd warned \"Same 'key' exist in the Tree\" (issue #59).\n loadRoot = async (append = false) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n insertPlaceholder,\n type,\n expandedTaxonKey,\n } = this.props;\n\n const defaultExpandKey = expandedTaxonKey;\n const { defaultTaxonKey } = this.props;\n\n const requestId = ++this.rootRequestId;\n const offset = append ? this.state.treeData.length : 0;\n\n this.setState(\n append ? { rootLoading: true } : { rootLoading: true, treeData: [] }\n );\n return client(\n `${\n config.dataApi\n }dataset/${datasetKey}/tree?projectKey=${datasetKey}${type ? \"&type=\"+type :\"\"}&limit=${CHILD_PAGE_SIZE}&offset=${offset}${hideExtinct ? `&extinct=false&extinct=` : \"\"}${insertPlaceholder ? \"&insertPlaceholder=true\" : \"\"}`\n )\n .then(this.decorateWithSectorsAndDataset)\n .then((res) => {\n // A newer load has started since — drop this page instead of merging it.\n if (requestId !== this.rootRequestId) return;\n const mainTreeData = res.data.result || [];\n const rootTotal = res.data.total;\n const treeData = mainTreeData.map((tx) => {\n let dataRef = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n dataRef.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n reloadChildren={() => this.fetchChildPage(dataRef, true)}\n rank={this.state.rank}\n />\n );\n dataRef.ref = dataRef;\n return dataRef;\n });\n\n this.setState((prevState) => ({\n rootTotal: rootTotal,\n rootLoading: false,\n treeData: append ? [...prevState.treeData, ...treeData] : treeData,\n // Nothing is auto-expanded by default. Consumers open a specific root\n // (or deep taxon) by passing `defaultTaxonKey`/`expandedTaxonKey` —\n // e.g. defaultTaxonKey=\"CS5HF\" opens Eukaryota in current COL releases.\n expandedKeys: [],\n error: null,\n }),\n () => {\n if (defaultExpandKey) {\n return this.expandToTaxon(defaultExpandKey);\n } else if (defaultTaxonKey) {\n return this.expandToTaxon(defaultTaxonKey);\n }\n });\n if (treeData.length === 1) {\n this.fetchChildPage(treeData[treeData.length - 1]);\n }\n })\n .catch((err) => {\n if (requestId !== this.rootRequestId) return;\n this.setState({\n treeData: [],\n rootLoading: false,\n expandedKeys: [],\n error: err,\n });\n });\n };\n\n expandToTaxon = async (defaultExpandKey) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n type\n } = this.props;\n\n this.setState({ rootLoading: true/* , treeData: [] */ });\n const { data } = await client(\n `${\n config.dataApi\n }dataset/${datasetKey}/tree/${defaultExpandKey}?projectKey=${datasetKey}&insertPlaceholder=true${type ? \"&type=\"+type :\"\"}${\n hideExtinct ? `&extinct=false` : \"\"\n }`\n ).then((res) =>\n this.decorateWithSectorsAndDataset({\n data: { result: res.data },\n }).then(() => res)\n );\n\n if (data.length === 0) {\n return this.setState(\n {\n error: {\n message: `No classification found for Taxon ID: ${defaultExpandKey}`,\n },\n },\n this.loadRoot\n );\n }\n const tx = data[data.length - 1];\n let root = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n root.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(root, true)}\n />\n );\n\n root.ref = root;\n const root_ = root;\n for (let i = data.length - 2; i >= 0; i--) {\n const tx = data[i];\n const node = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n node.ref = node;\n node.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(node, true)}\n />\n );\n\n root.children = [node];\n root = node;\n }\n\n /* const treeData = [root_]; */\nconst { treeData } = this.state;\n var rootIndex = treeData.findIndex((x) => x.key == root_.key);\n treeData[rootIndex] = root_;\n const loadedKeys = [...data.map((t) => t.id).reverse()];\n\n this.setState({ treeData }, () =>\n this.reloadLoadedKeys(loadedKeys, defaultExpandKey)\n );\n };\n\n fetchChildPage = async (dataRef, reloadAll, dontUpdateState) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n insertPlaceholder,\n type\n } = this.props;\n const childcount = get(dataRef, \"childCount\");\n const limit = CHILD_PAGE_SIZE;\n const offset = get(dataRef, \"childOffset\");\n const res = await client(\n `${config.dataApi}dataset/${datasetKey}/tree/${\n dataRef.taxon.id //taxonKey\n }/children?limit=${limit}&offset=${offset}&projectKey=${datasetKey}${type ? \"&type=\"+type :\"\"}${\n hideExtinct ? `&extinct=false` : \"\"\n }${insertPlaceholder ? \"&insertPlaceholder=true\" : \"\"}`\n );\n await this.decorateWithSectorsAndDataset(res);\n\n const data = res.data.result\n ? res.data.result.map((tx) => {\n let childDataRef = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n parent: dataRef,\n name: tx.name,\n };\n\n childDataRef.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(childDataRef, true)}\n />\n );\n childDataRef.ref = childDataRef;\n\n return childDataRef;\n })\n : [];\n\n // reloadAll is used to force reload all children from offset 0 - used when new children have been posted\n dataRef.children =\n dataRef.children && offset !== 0 && !reloadAll\n ? [...dataRef.children, ...data]\n : data;\n // If extinct are filtered out, you cannot rely on childCount\n if (res.data.last && dataRef.childCount > dataRef.children.length) {\n dataRef.childCount = dataRef.children.length;\n }\n if (!res.data.last) {\n const loadMoreFn = () => {\n dataRef.childOffset += CHILD_PAGE_SIZE;\n if (isLoadMoreKey(get(dataRef.children[dataRef.children.length - 1], \"key\"))) {\n dataRef.children = dataRef.children.slice(0, -1);\n }\n return this.fetchChildPage(dataRef, false);\n };\n dataRef.children = [\n ...dataRef.children,\n {\n title: (\n <LoadMoreChildrenTreeNode\n onClick={loadMoreFn}\n key={loadMoreKey(dataRef.key)}\n />\n ),\n key: loadMoreKey(dataRef.key),\n childCount: 0,\n isLeaf: true,\n },\n ];\n }\n if (!dontUpdateState) {\n // Use the updater form: this often runs right after a sibling setState\n // (e.g. loadRoot's auto-expand of a single root) that may not have\n // committed yet, so this.state can be stale here.\n this.setState((prevState) => ({\n treeData: [...prevState.treeData],\n loadedKeys: [...new Set([...prevState.loadedKeys, dataRef.key])],\n }));\n }\n };\n\n decorateWithSectorsAndDataset = (res) => {\n if (!res.data.result) return res;\n return Promise.all(\n res.data.result\n .filter((tx) => !!tx.sectorDatasetKey)\n .map((tx) =>\n this.datasetLoader\n .load(tx.sectorDatasetKey)\n .then(\n (dataset) =>\n (tx.sector = {\n id: tx.sectorKey,\n subjectDatasetKey: tx.sectorDatasetKey,\n dataset: dataset,\n })\n )\n )\n ).then(() => res);\n };\n\n onLoadData = (treeNode, reloadAll = false) => {\n if (reloadAll) {\n treeNode.childOffset = 0;\n }\n return this.fetchChildPage(treeNode.ref, reloadAll);\n };\n\n findNode = (id, nodeArray) => {\n let node = null;\n\n node = nodeArray.find((n) => get(n, \"taxon.id\") === id);\n\n if (node) {\n return node;\n } else {\n const children = nodeArray.map((n) => get(n, \"children\") || []);\n const flattenedChildren = flatten(children); //.flat();\n if (flattenedChildren.length === 0) {\n return null;\n } else {\n return this.findNode(id, flattenedChildren);\n }\n }\n };\n\n pageThroughChildrenUntilTaxonFound = async (parentNode, taxonId) => {\n let node;\n while (!node && parentNode.children.length < parentNode.childCount) {\n parentNode.childOffset += CHILD_PAGE_SIZE;\n if (isLoadMoreKey(get(parentNode.children[parentNode.children.length - 1], \"key\"))) {\n parentNode.children = parentNode.children.slice(0, -1);\n }\n await this.fetchChildPage(parentNode, false, true);\n node = this.findNode(taxonId, parentNode.children);\n }\n if (!node) {\n node = parentNode.children.find((c) =>\n get(c, \"taxon.id\") ? c.taxon.id.indexOf(\"incertae-sedis\") > -1 : false\n );\n }\n return node;\n };\n\n reloadLoadedKeys = async (keys, expandKey, expandAll = true) => {\n this.setState({ rootLoading: true });\n const { loadedKeys: storedKeys } = this.state;\n // const defaultExpandKey = get(qs.parse(get(location, \"search\")), 'taxonKey');\n\n let { treeData } = this.state;\n const targetTaxon = expandKey ? this.findNode(expandKey, treeData) : null;\n const loadedKeys = keys ? [...keys] : [...storedKeys];\n for (let index = 0; index < loadedKeys.length; index++) {\n let node = this.findNode(loadedKeys[index], treeData);\n if (!node && targetTaxon && loadedKeys[index - 1]) {\n // If the node is not found look for insertae sedis nodes in the children of the parent and insert the 'Not assigned' between the parent and the node\n const parentNode = this.findNode(loadedKeys[index - 1], treeData);\n if (\n parentNode &&\n isArray(get(parentNode, \"children\")) &&\n parentNode.children.length > 0\n ) {\n node = await this.pageThroughChildrenUntilTaxonFound(\n parentNode,\n loadedKeys[index]\n );\n if (node) {\n loadedKeys.splice(index, 0, node.taxon.id);\n } else {\n // It has gone missing from the tree\n this.setState(\n {\n nodeNotFoundErr: (\n <span>Cannot find taxon {expandKey} in tree &#128549;</span>\n ),\n rootLoading: false,\n }/* ,\n () => {\n if (\n this.props.treeType === \"CATALOGUE\" &&\n typeof this.props.addMissingTargetKey === \"function\"\n ) {\n this.props.addMissingTargetKey(expandKey);\n }\n } */\n );\n }\n }\n }\n if (node) {\n await this.fetchChildPage(node, true, true);\n let targetNode = node.children.find(\n (c) => get(c, \"taxon.id\") === get(targetTaxon, \"taxon.id\")\n );\n if (\n targetTaxon &&\n index === loadedKeys.length - 2 &&\n get(node, \"taxon.id\") !== get(targetTaxon, \"taxon.id\") &&\n isArray(node.children) &&\n !targetNode\n ) {\n if (node.children.length < node.childCount) {\n // its the parent of the taxon we are after - if its not in the first page, insert it\n targetNode = await this.pageThroughChildrenUntilTaxonFound(\n node,\n get(targetTaxon, \"taxon.id\")\n );\n // node.children = [targetTaxon, ...node.children];\n if (targetNode) {\n this.setState({ treeData: [...this.state.treeData] }, () => {\n setTimeout(() => {\n const elmnt = document.getElementById(expandKey);\n elmnt.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n /* if (get(this, \"treeRef.current\")) {\n this.treeRef.current.scrollTo({ key: expandKey });\n } */\n }, 100);\n });\n } else {\n // It has gone missing from the tree\n this.setState(\n {\n nodeNotFoundErr: (\n <span>Cannot find taxon {expandKey} in tree &#128549;</span>\n ),\n rootLoading: false,\n },\n () => {\n if (\n this.props.treeType === \"CATALOGUE\" &&\n typeof this.props.addMissingTargetKey === \"function\"\n ) {\n this.props.addMissingTargetKey(expandKey);\n }\n }\n );\n }\n }\n }\n }\n }\n const newState = { loadedKeys, rootLoading: false };\n if (expandAll) {\n newState.expandedKeys = loadedKeys;\n }\n this.setState(newState, () => {\n if (expandKey) {\n setTimeout(() => {\n const elmnt = document.getElementById(expandKey);\n elmnt.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n /* if (get(this, \"treeRef.current\")) {\n this.treeRef.current.scrollTo({ key: expandKey });\n } */\n }, 100);\n }\n });\n };\n\n render() {\n const {\n error,\n rootTotal,\n rootLoading,\n treeData,\n defaultExpandAll,\n nodeNotFoundErr,\n loadedKeys,\n expandedKeys,\n } = this.state;\n const { treeType, dataset, height, expandedTaxonKey } = this.props;\n void height;\n const defaultExpandKey = expandedTaxonKey;\n\n return (\n <div>\n {error && (\n <React.Fragment>\n {get(error, \"response.data.code\") !== 404 ? (\n <Alert\n closable\n onClose={() => this.setState({ error: null })}\n style={{ marginTop: \"8px\" }}\n message={<ErrorMsg error={error} />}\n type=\"error\"\n />\n ) : (\n <Alert\n closable\n onClose={() => this.setState({ error: null })}\n style={{ marginTop: \"8px\" }}\n message={\n <Custom404\n error={error}\n treeType={treeType}\n dataset={dataset}\n loadRoot={this.loadRoot}\n />\n }\n type=\"warning\"\n />\n )}\n </React.Fragment>\n )}\n {nodeNotFoundErr && (\n <Alert\n closable\n onClose={() => this.setState({ nodeNotFoundErr: null })}\n style={{ marginTop: \"8px\" }}\n message={nodeNotFoundErr}\n type=\"warning\"\n />\n )}\n {rootLoading && <Skeleton paragraph={{ rows: 10 }} active />}\n {!rootLoading && treeData.length > 0 && (\n <Tree\n ref={this.treeRef}\n defaultExpandAll={defaultExpandAll}\n // height={height || 600}\n // defaultExpandedKeys={defaultExpandedKeys}\n loadData={this.onLoadData}\n onLoad={(loadedKeys) => this.setState({ loadedKeys })}\n loadedKeys={loadedKeys}\n expandedKeys={expandedKeys}\n treeData={treeData}\n filterTreeNode={(node) => node.key === defaultExpandKey}\n onExpand={(expandedKeys, obj) => {\n this.setState({ expandedKeys });\n if (this.props.onExpandedTaxonKeyChange) {\n this.props.onExpandedTaxonKeyChange(\n obj.expanded ? obj.node.key : null\n );\n }\n }}\n ></Tree>\n )}\n\n {!error && treeData.length < rootTotal && (\n <Button loading={rootLoading} onClick={() => this.loadRoot(true)}>\n Load more{\" \"}\n </Button>\n )}\n </div>\n );\n }\n}\n\nexport default ColTree;\n","import React from \"react\";\nimport ColTree from \"./ColTree\";\nimport { get } from \"lodash-es\";\nimport NameAutocomplete from \"./NameAutocomplete\";\nimport client, { setAuth } from \"../api/client\";\nimport { Row, Col, Checkbox } from \"antd\";\nimport { ColTreeContext } from \"./ColTreeContext\";\nimport { TreeCacheContext, createTreeCache } from \"./treeCache\";\nimport { getDataset } from \"../api/dataset\";\nimport Citation from \"../components/DatasetCitation\";\nimport { RouterContext, buildRouter } from \"../router\";\nimport { readSetting, writeSetting } from \"../storage\";\n\nconst INFRASPECIFIC_RANKS = [\n \"infraspecific name\",\n \"species\",\n \"variety\",\n \"form\",\n];\n\nclass ColTreeWrapper extends React.Component {\n static contextType = RouterContext;\n\n constructor(props) {\n super(props);\n setAuth(this.props.auth);\n this.state = {\n hideExtinct: readSetting(\"tree-extant-only\", false),\n showInfo: readSetting(\"tree-show-source\", false),\n dataset: null,\n };\n // Per-Tree DataLoader cache. Rebuilt only if datasetKey changes (rare).\n this.cache = createTreeCache(this.props.datasetKey);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.datasetKey !== this.props.datasetKey) {\n this.cache = createTreeCache(this.props.datasetKey);\n }\n }\n\n componentDidMount = async () => {\n const { datasetKey, citation } = this.props;\n if (citation) {\n try {\n const { data: dataset } = await getDataset(datasetKey);\n this.setState({ dataset });\n } catch (err) {\n // ignore\n }\n }\n };\n\n render = () => {\n const {\n datasetKey,\n defaultTaxonKey,\n expandedTaxonKey,\n onExpandedTaxonKeyChange,\n showTreeOptions,\n linkToSpeciesPage,\n citation,\n type,\n insertPlaceholder = true,\n } = this.props;\n const { hideExtinct, dataset } = this.state;\n\n const handleSelectName = (name) => {\n const key = get(name, \"key\");\n if (!key) return;\n const rank = get(name, \"rank\");\n if (linkToSpeciesPage && INFRASPECIFIC_RANKS.includes(rank)) {\n // Leaf-like selection: jump to the taxon page via the host's nav.\n const navigateToTaxon = this.context?.taxon?.onNavigate;\n if (navigateToTaxon) navigateToTaxon(key);\n } else if (onExpandedTaxonKeyChange) {\n onExpandedTaxonKeyChange(key);\n if (this.treeRef && this.treeRef.reloadRoot) this.treeRef.reloadRoot();\n }\n };\n\n const handleResetSearch = () => {\n if (onExpandedTaxonKeyChange) onExpandedTaxonKeyChange(null);\n };\n\n return (\n <div className=\"catalogue-of-life\">\n {citation === \"top\" && dataset && <Citation dataset={dataset} />}\n <TreeCacheContext.Provider value={this.cache}>\n <ColTreeContext.Provider value={this.state}>\n <Row>\n <Col flex=\"auto\">\n <NameAutocomplete\n hideExtinct={hideExtinct}\n datasetKey={datasetKey}\n style={{\n width: \"100%\",\n paddingTop: \"5px\",\n paddingBottom: \"5px\",\n }}\n defaultTaxonKey={expandedTaxonKey || null}\n onSelectName={handleSelectName}\n onResetSearch={handleResetSearch}\n />\n </Col>\n {showTreeOptions && (\n <Col style={{ paddingLeft: \"8px\" }}>\n <Checkbox\n defaultChecked={this.state.showInfo}\n onChange={({ target: { checked } }) => {\n this.setState({ showInfo: checked });\n writeSetting(\"tree-show-source\", checked);\n }}\n >\n Source\n </Checkbox>\n\n <Checkbox\n defaultChecked={this.state.hideExtinct}\n onChange={({ target: { checked } }) => {\n this.setState({ hideExtinct: checked });\n writeSetting(\"tree-extant-only\", checked);\n }}\n >\n Extant only\n </Checkbox>\n </Col>\n )}\n </Row>\n <ColTree\n insertPlaceholder={insertPlaceholder}\n hideExtinct={hideExtinct}\n datasetKey={datasetKey}\n defaultTaxonKey={defaultTaxonKey}\n expandedTaxonKey={expandedTaxonKey}\n onExpandedTaxonKeyChange={onExpandedTaxonKeyChange}\n treeRef={(ref) => (this.treeRef = ref)}\n type={type}\n />\n </ColTreeContext.Provider>\n </TreeCacheContext.Provider>\n {citation === \"bottom\" && dataset && <Citation dataset={dataset} />}\n </div>\n );\n };\n}\n\n// Public wrapper: takes controlled props + navigation callbacks, builds\n// the RouterContext, hands the rest down.\nexport default function Tree({\n datasetKey,\n defaultTaxonKey,\n expandedTaxonKey,\n onExpandedTaxonKeyChange,\n showTreeOptions,\n linkToSpeciesPage,\n citation,\n type,\n insertPlaceholder,\n auth,\n ...routerProps\n}) {\n return (\n <RouterContext.Provider value={buildRouter(routerProps)}>\n <ColTreeWrapper\n datasetKey={datasetKey}\n defaultTaxonKey={defaultTaxonKey}\n expandedTaxonKey={expandedTaxonKey}\n onExpandedTaxonKeyChange={onExpandedTaxonKeyChange}\n showTreeOptions={showTreeOptions}\n linkToSpeciesPage={linkToSpeciesPage}\n citation={citation}\n type={type}\n insertPlaceholder={insertPlaceholder}\n auth={auth}\n />\n </RouterContext.Provider>\n );\n}\n","import withDatasetKey from \"../withDatasetKey\";\nimport { withTheme } from \"../withTheme\";\nimport colTree from \"../ColTree\";\n\nexport const Tree = withTheme(withDatasetKey(colTree));\n"],"names":["TreeCacheContext","createContext","createTreeCache","datasetKey","DataLoader","ids","getDatasetsBatch","getPublishersBatch","TaxonSources","React","props","__publicField","_a","sourceDatasetKeys","loader","s","data","sortBy","publisherDatasetKeys","publisher","showInNode","popOverVisible","loading","taxon","linkStyle","publisherUrl","uuid","config","d","index","jsx","LinkTo","Popover","Spin","jsxs","Divider","visible","e","ColTreeContext","ColTreeNode","rank","sector","sectorSourceDataset","get","hasDatasetSectors","isPlaceholder","showInfo","MergedDataBadge","Tag","isUndefined","CHILD_PAGE_SIZE","LOAD_MORE_PREFIX","loadMoreKey","parentKey","isLoadMoreKey","key","LoadMoreChildrenTreeNode","ColTree","getSectorsBatch","treeRef","prevProps","client","res","r","append","showSourceTaxon","hideExtinct","insertPlaceholder","type","expandedTaxonKey","defaultExpandKey","defaultTaxonKey","requestId","offset","mainTreeData","rootTotal","treeData","tx","dataRef","prevState","err","root","root_","i","node","rootIndex","x","loadedKeys","t","reloadAll","dontUpdateState","limit","childDataRef","loadMoreFn","dataset","treeNode","id","nodeArray","n","children","flattenedChildren","flatten","parentNode","taxonId","c","keys","expandKey","expandAll","storedKeys","targetTaxon","isArray","targetNode","newState","error","rootLoading","defaultExpandAll","nodeNotFoundErr","expandedKeys","treeType","height","Alert","ErrorMsg","Skeleton","Tree","obj","Button","INFRASPECIFIC_RANKS","ColTreeWrapper","citation","getDataset","onExpandedTaxonKeyChange","showTreeOptions","linkToSpeciesPage","handleSelectName","name","navigateToTaxon","_b","handleResetSearch","Citation","Row","Col","NameAutocomplete","Checkbox","checked","writeSetting","ref","setAuth","readSetting","RouterContext","auth","routerProps","buildRouter","withTheme","withDatasetKey","colTree"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "col-browser",
3
- "version": "2.3.10",
3
+ "version": "2.4.0",
4
4
  "description": "Catalogue of Life browse and search React components",
5
5
  "main": "umd/col-browser.js",
6
6
  "module": "es/index.js",
@@ -43,6 +43,10 @@
43
43
  "types": "./types/taxonDistribution.d.ts",
44
44
  "import": "./es/taxonDistribution.js"
45
45
  },
46
+ "./config": {
47
+ "types": "./types/config.d.ts",
48
+ "import": "./es/config.js"
49
+ },
46
50
  "./routing": {
47
51
  "types": "./types/routing.d.ts",
48
52
  "import": "./es/routing.js"
@@ -0,0 +1 @@
1
+ export { configure, type ColBrowserConfig } from "./index";