col-browser 2.6.0 → 2.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/chunks/{Distributions-Czffme5Y.js → Distributions-Byhvu1wv.js} +7 -8
- package/es/chunks/{Distributions-Czffme5Y.js.map → Distributions-Byhvu1wv.js.map} +1 -1
- package/es/chunks/ErrorMsg-D5nALHuK.js +103 -0
- package/es/chunks/ErrorMsg-D5nALHuK.js.map +1 -0
- package/es/chunks/{XrGutter-COJhHpia.js → XrGutter-nBDDl_Lq.js} +2 -2
- package/es/chunks/{XrGutter-COJhHpia.js.map → XrGutter-nBDDl_Lq.js.map} +1 -1
- package/es/chunks/dataset-BZpjo3Yq.js.map +1 -1
- package/es/chunks/enumeration-CsrJrIIR.js +24 -0
- package/es/chunks/{enumeration-CV8i_q_O.js.map → enumeration-CsrJrIIR.js.map} +1 -1
- package/es/search.js +3 -3
- package/es/sourceDataset.js +195 -183
- package/es/sourceDataset.js.map +1 -1
- package/es/sourceDatasetList.js +9 -10
- package/es/sourceDatasetList.js.map +1 -1
- package/es/taxon.js +733 -704
- package/es/taxon.js.map +1 -1
- package/es/taxonDistribution.js +1 -1
- package/es/tree.js +3 -4
- package/es/tree.js.map +1 -1
- package/package.json +1 -1
- package/umd/col-browser.js +116 -40
- package/umd/col-browser.js.map +1 -1
- package/umd/col-browser.min.js +4 -4
- package/umd/col-browser.min.js.map +1 -1
- package/es/chunks/ErrorMsg-K8k5PPTp.js +0 -26
- package/es/chunks/ErrorMsg-K8k5PPTp.js.map +0 -1
- package/es/chunks/MergedDataBadge-DK53L3R8.js +0 -82
- package/es/chunks/MergedDataBadge-DK53L3R8.js.map +0 -1
- package/es/chunks/enumeration-CV8i_q_O.js +0 -12
package/es/taxonDistribution.js
CHANGED
|
@@ -4,7 +4,7 @@ import { useState as a, useEffect as D } from "react";
|
|
|
4
4
|
import { s as T, c as s, R as g, b as k } from "./chunks/router-CssZk5qZ.js";
|
|
5
5
|
import { c as l } from "./chunks/config--bs_09I6.js";
|
|
6
6
|
import { Row as v, Col as w, Spin as A } from "antd";
|
|
7
|
-
import { D as C } from "./chunks/Distributions-
|
|
7
|
+
import { D as C } from "./chunks/Distributions-Byhvu1wv.js";
|
|
8
8
|
const E = ({
|
|
9
9
|
taxonId: o,
|
|
10
10
|
datasetKey: i,
|
package/es/tree.js
CHANGED
|
@@ -11,8 +11,7 @@ import { L as P, c as K, R as H, s as ut, b as pt } from "./chunks/router-CssZk5
|
|
|
11
11
|
import { c as D } from "./chunks/config--bs_09I6.js";
|
|
12
12
|
import L from "dataloader";
|
|
13
13
|
import { c as V, b as z, g as ft } from "./chunks/dataset-BZpjo3Yq.js";
|
|
14
|
-
import { M as xt } from "./chunks/
|
|
15
|
-
import { E as gt } from "./chunks/ErrorMsg-K8k5PPTp.js";
|
|
14
|
+
import { M as xt, E as gt } from "./chunks/ErrorMsg-D5nALHuK.js";
|
|
16
15
|
import { g as yt } from "./chunks/sector-ucUgPp75.js";
|
|
17
16
|
import { C as R, N as mt } from "./chunks/DatasetCitation-Cep2dces.js";
|
|
18
17
|
import { r as F, w as M } from "./chunks/storage-BgdCo9fV.js";
|
|
@@ -830,8 +829,8 @@ function St({
|
|
|
830
829
|
}
|
|
831
830
|
) });
|
|
832
831
|
}
|
|
833
|
-
const
|
|
832
|
+
const Ot = st(et(St));
|
|
834
833
|
export {
|
|
835
|
-
|
|
834
|
+
Ot as Tree
|
|
836
835
|
};
|
|
837
836
|
//# 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 😥</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 😥</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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"}
|
|
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 😥</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 😥</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
package/umd/col-browser.js
CHANGED
|
@@ -69853,6 +69853,24 @@ html body {
|
|
|
69853
69853
|
(res) => res.data
|
|
69854
69854
|
);
|
|
69855
69855
|
};
|
|
69856
|
+
const vocabCache = /* @__PURE__ */ new Map();
|
|
69857
|
+
const cachedVocab = (path, transform2) => {
|
|
69858
|
+
const url = `${config.dataApi}vocab/${path}`;
|
|
69859
|
+
if (!vocabCache.has(url)) {
|
|
69860
|
+
vocabCache.set(
|
|
69861
|
+
url,
|
|
69862
|
+
client(url).then((res) => transform2(res.data)).catch((err) => {
|
|
69863
|
+
vocabCache.delete(url);
|
|
69864
|
+
throw err;
|
|
69865
|
+
})
|
|
69866
|
+
);
|
|
69867
|
+
}
|
|
69868
|
+
return vocabCache.get(url);
|
|
69869
|
+
};
|
|
69870
|
+
const getNomStatusVocab = () => cachedVocab(
|
|
69871
|
+
"nomstatus",
|
|
69872
|
+
(data) => data.reduce((a, c) => (a[c.name] = c, a), {})
|
|
69873
|
+
);
|
|
69856
69874
|
const token = "%[a-f0-9]{2}";
|
|
69857
69875
|
const singleMatcher = new RegExp("(" + token + ")|([^%]+?)", "gi");
|
|
69858
69876
|
const multiMatcher = new RegExp("(" + token + ")+", "gi");
|
|
@@ -77538,12 +77556,43 @@ html body {
|
|
|
77538
77556
|
if (total <= visible && !showAll) return null;
|
|
77539
77557
|
return /* @__PURE__ */ jsxRuntimeExports.jsx("a", { onClick: () => onChange(!showAll), style: { cursor: "pointer" }, children: showAll ? "Show less" : `Show all (${total})` });
|
|
77540
77558
|
};
|
|
77559
|
+
const NOM_CODES = /* @__PURE__ */ new Set([
|
|
77560
|
+
"bacterial",
|
|
77561
|
+
"botanical",
|
|
77562
|
+
"cultivars",
|
|
77563
|
+
"phyto",
|
|
77564
|
+
"phylo",
|
|
77565
|
+
"virus",
|
|
77566
|
+
"zoological"
|
|
77567
|
+
]);
|
|
77568
|
+
const nomStatusLabel = (vocab, nomStatus, code) => {
|
|
77569
|
+
if (!nomStatus) return "";
|
|
77570
|
+
const term = vocab == null ? void 0 : vocab[nomStatus];
|
|
77571
|
+
if (!term) return nomStatus;
|
|
77572
|
+
const key2 = NOM_CODES.has(code) && typeof term[code] === "string" ? code : "zoological";
|
|
77573
|
+
return term[key2] || term.name || nomStatus;
|
|
77574
|
+
};
|
|
77575
|
+
const NomStatus = ({ nomStatus, code, brackets }) => {
|
|
77576
|
+
const [vocab, setVocab] = reactExports.useState(null);
|
|
77577
|
+
reactExports.useEffect(() => {
|
|
77578
|
+
let cancelled = false;
|
|
77579
|
+
getNomStatusVocab().then((v2) => {
|
|
77580
|
+
if (!cancelled) setVocab(v2);
|
|
77581
|
+
}).catch(() => {
|
|
77582
|
+
});
|
|
77583
|
+
return () => {
|
|
77584
|
+
cancelled = true;
|
|
77585
|
+
};
|
|
77586
|
+
}, []);
|
|
77587
|
+
if (!nomStatus) return null;
|
|
77588
|
+
const label = nomStatusLabel(vocab, nomStatus, code);
|
|
77589
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: brackets ? `(${label})` : label });
|
|
77590
|
+
};
|
|
77541
77591
|
const TOP_N = 5;
|
|
77542
77592
|
const SynonymsTable = ({
|
|
77543
77593
|
datasetKey,
|
|
77544
77594
|
data,
|
|
77545
77595
|
style: style2,
|
|
77546
|
-
nomStatus,
|
|
77547
77596
|
references,
|
|
77548
77597
|
decisions,
|
|
77549
77598
|
typeMaterial,
|
|
@@ -77552,7 +77601,6 @@ html body {
|
|
|
77552
77601
|
misapplied
|
|
77553
77602
|
}) => {
|
|
77554
77603
|
const [showAll, setShowAll] = reactExports.useState(false);
|
|
77555
|
-
const getNomStatus = (taxon) => !nomStatus ? get(taxon, "name.nomStatus") : nomStatus[get(taxon, "name.nomStatus")][get(taxon, "name.code"), "zoological"];
|
|
77556
77604
|
const sorter = (a, b2) => {
|
|
77557
77605
|
if (get(a, "name.combinationAuthorship.year") && get(b2, "name.combinationAuthorship.year")) {
|
|
77558
77606
|
return get(b2, "name.combinationAuthorship.year") - get(a, "name.combinationAuthorship.year");
|
|
@@ -77630,7 +77678,14 @@ html body {
|
|
|
77630
77678
|
}
|
|
77631
77679
|
),
|
|
77632
77680
|
" ",
|
|
77633
|
-
|
|
77681
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
77682
|
+
NomStatus,
|
|
77683
|
+
{
|
|
77684
|
+
nomStatus: get(s, "name.nomStatus"),
|
|
77685
|
+
code: get(s, "name.code"),
|
|
77686
|
+
brackets: true
|
|
77687
|
+
}
|
|
77688
|
+
),
|
|
77634
77689
|
" ",
|
|
77635
77690
|
get(s, "status") === "misapplied" && get(s, "accordingTo") ? get(s, "accordingTo") : "",
|
|
77636
77691
|
get(s, "status") === "ambiguous synonym" && "(Ambiguous)",
|
|
@@ -88282,7 +88337,6 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
88282
88337
|
this.getInfo(taxonKey);
|
|
88283
88338
|
this.getRank(taxonKey);
|
|
88284
88339
|
this.getIncludes(taxonKey);
|
|
88285
|
-
this.getNomStatus(taxonKey);
|
|
88286
88340
|
}
|
|
88287
88341
|
});
|
|
88288
88342
|
__publicField(this, "getCatalogue", () => {
|
|
@@ -88445,13 +88499,6 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
88445
88499
|
(res) => this.setState({ rank: res.data.map((r2) => r2.name) })
|
|
88446
88500
|
);
|
|
88447
88501
|
});
|
|
88448
|
-
__publicField(this, "getNomStatus", () => {
|
|
88449
|
-
client(`${config.dataApi}vocab/nomstatus`).then(
|
|
88450
|
-
(res) => this.setState({
|
|
88451
|
-
nomStatus: res.data.reduce((a, c) => (a[c.name] = c, a), {})
|
|
88452
|
-
})
|
|
88453
|
-
);
|
|
88454
|
-
});
|
|
88455
88502
|
__publicField(this, "getIncludes", (taxonKey) => {
|
|
88456
88503
|
const { datasetKey } = this.props;
|
|
88457
88504
|
client(
|
|
@@ -88484,7 +88531,6 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
88484
88531
|
sourceDataset: null,
|
|
88485
88532
|
includes: [],
|
|
88486
88533
|
rank: [],
|
|
88487
|
-
nomStatus: null,
|
|
88488
88534
|
catalogue: null,
|
|
88489
88535
|
referenceIndexMap: {},
|
|
88490
88536
|
sourceDatasetKeyMap: null
|
|
@@ -88496,7 +88542,6 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
88496
88542
|
this.getInfo(taxonKey);
|
|
88497
88543
|
this.getRank(taxonKey);
|
|
88498
88544
|
this.getIncludes(taxonKey);
|
|
88499
|
-
this.getNomStatus(taxonKey);
|
|
88500
88545
|
}
|
|
88501
88546
|
}
|
|
88502
88547
|
render() {
|
|
@@ -88514,7 +88559,6 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
88514
88559
|
sourceDataset,
|
|
88515
88560
|
includes: includes2,
|
|
88516
88561
|
rank,
|
|
88517
|
-
nomStatus,
|
|
88518
88562
|
taxonError,
|
|
88519
88563
|
synonymsError,
|
|
88520
88564
|
classificationError,
|
|
@@ -88698,7 +88742,13 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
88698
88742
|
)
|
|
88699
88743
|
] })
|
|
88700
88744
|
] }),
|
|
88701
|
-
get(taxon, "name.nomStatus") &&
|
|
88745
|
+
get(taxon, "name.nomStatus") && /* @__PURE__ */ jsxRuntimeExports.jsx(PresentationItem$1, { md, label: "Nomenclatural Status", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
88746
|
+
NomStatus,
|
|
88747
|
+
{
|
|
88748
|
+
nomStatus: get(taxon, "name.nomStatus"),
|
|
88749
|
+
code: get(taxon, "name.code")
|
|
88750
|
+
}
|
|
88751
|
+
) }),
|
|
88702
88752
|
infoError && /* @__PURE__ */ jsxRuntimeExports.jsx(Alert, { message: /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorMsg, { error: infoError }), type: "error" }),
|
|
88703
88753
|
!isSynonym && get(info, "synonyms") && /* @__PURE__ */ jsxRuntimeExports.jsx(PresentationItem$1, { md, label: "Synonyms and combinations", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
88704
88754
|
SynonymsTable,
|
|
@@ -89001,6 +89051,39 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
89001
89051
|
this.getRank();
|
|
89002
89052
|
}
|
|
89003
89053
|
}
|
|
89054
|
+
const findSectorTaxon = (datasetKey, sector) => {
|
|
89055
|
+
const { id, mode, subject, target } = sector;
|
|
89056
|
+
const byTarget = mode === "merge" || mode === "union";
|
|
89057
|
+
const params = new URLSearchParams({ TAXON_ID: target.id });
|
|
89058
|
+
if (byTarget) {
|
|
89059
|
+
params.set("q", target.name);
|
|
89060
|
+
} else {
|
|
89061
|
+
params.set("SECTOR_KEY", id);
|
|
89062
|
+
if (subject.rank) params.set("rank", subject.rank);
|
|
89063
|
+
params.set("q", subject.name);
|
|
89064
|
+
}
|
|
89065
|
+
params.set("type", "EXACT");
|
|
89066
|
+
return client(
|
|
89067
|
+
`${config.dataApi}dataset/${datasetKey}/nameusage/search?${params}`
|
|
89068
|
+
).then((res) => {
|
|
89069
|
+
const hits = get(res, "data.result") || [];
|
|
89070
|
+
if (byTarget) {
|
|
89071
|
+
return hits.find((h) => {
|
|
89072
|
+
var _a2;
|
|
89073
|
+
return ((_a2 = h.usage) == null ? void 0 : _a2.id) === target.id;
|
|
89074
|
+
});
|
|
89075
|
+
}
|
|
89076
|
+
const parentId = (h) => {
|
|
89077
|
+
var _a2, _b2;
|
|
89078
|
+
return (_b2 = (_a2 = h.classification) == null ? void 0 : _a2[h.classification.length - 2]) == null ? void 0 : _b2.id;
|
|
89079
|
+
};
|
|
89080
|
+
return hits.find((h) => parentId(h) === target.id) || hits[0];
|
|
89081
|
+
});
|
|
89082
|
+
};
|
|
89083
|
+
const searchable = (s) => {
|
|
89084
|
+
var _a2, _b2;
|
|
89085
|
+
return !!((_a2 = s == null ? void 0 : s.target) == null ? void 0 : _a2.id) && (s.mode === "merge" || s.mode === "union" ? !!s.target.name : !!((_b2 = s.subject) == null ? void 0 : _b2.name));
|
|
89086
|
+
};
|
|
89004
89087
|
class TaxonomicCoverage extends React.Component {
|
|
89005
89088
|
constructor(props) {
|
|
89006
89089
|
super(props);
|
|
@@ -89011,30 +89094,22 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
89011
89094
|
`${config.dataApi}dataset/${datasetKey}/sector?limit=1000&subjectDatasetKey=${dataset.key}`
|
|
89012
89095
|
).then((res) => {
|
|
89013
89096
|
return Promise.allSettled(
|
|
89014
|
-
res.data.result.filter(
|
|
89015
|
-
(
|
|
89016
|
-
|
|
89017
|
-
|
|
89018
|
-
|
|
89019
|
-
|
|
89020
|
-
|
|
89021
|
-
|
|
89022
|
-
|
|
89023
|
-
|
|
89024
|
-
taxonMap[path].push(
|
|
89025
|
-
taxon.classification[taxon.classification.length - 1]
|
|
89026
|
-
);
|
|
89027
|
-
} else {
|
|
89028
|
-
taxonMap[path] = [
|
|
89029
|
-
taxon.classification[taxon.classification.length - 1]
|
|
89030
|
-
];
|
|
89031
|
-
}
|
|
89097
|
+
res.data.result.filter(searchable).map(
|
|
89098
|
+
(s) => findSectorTaxon(datasetKey, s).then((hit) => {
|
|
89099
|
+
if (hit) {
|
|
89100
|
+
const cl = hit.classification;
|
|
89101
|
+
const path = cl.slice(1, cl.length - 1).map((t2) => t2.name).join(" > ");
|
|
89102
|
+
const entry = { taxon: cl[cl.length - 1], merged: s.mode === "merge" };
|
|
89103
|
+
if (taxonMap[path]) {
|
|
89104
|
+
taxonMap[path].push(entry);
|
|
89105
|
+
} else {
|
|
89106
|
+
taxonMap[path] = [entry];
|
|
89032
89107
|
}
|
|
89033
|
-
}
|
|
89034
|
-
|
|
89035
|
-
|
|
89036
|
-
|
|
89037
|
-
}
|
|
89108
|
+
}
|
|
89109
|
+
}).catch((err) => {
|
|
89110
|
+
console.log(s);
|
|
89111
|
+
console.log(err);
|
|
89112
|
+
})
|
|
89038
89113
|
)
|
|
89039
89114
|
).then(() => this.setState({ taxonMap, loading: false }));
|
|
89040
89115
|
});
|
|
@@ -89048,8 +89123,9 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
|
|
|
89048
89123
|
k !== "" ? ":" : ""
|
|
89049
89124
|
] }),
|
|
89050
89125
|
" ",
|
|
89051
|
-
taxonMap[k].map((
|
|
89052
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
89126
|
+
taxonMap[k].map(({ taxon, merged }, idx) => /* @__PURE__ */ jsxRuntimeExports.jsxs(React.Fragment, { children: [
|
|
89127
|
+
merged && /* @__PURE__ */ jsxRuntimeExports.jsx(MergedDataBadge, {}),
|
|
89128
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(LinkTo, { to: "tree", args: { taxonKey: taxon.id }, children: taxon.name }),
|
|
89053
89129
|
idx !== taxonMap[k].length - 1 ? ", " : ""
|
|
89054
89130
|
] }, idx))
|
|
89055
89131
|
] }, k)) : "N/A" : /* @__PURE__ */ jsxRuntimeExports.jsx(Skeleton, { active: true, paragraph: { rows: 4 } });
|