col-browser 2.2.0 → 2.2.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/README.md +1 -1
- package/es/chunks/DatasetlogoWithFallback-B9WXvNCA.js +24 -0
- package/es/chunks/DatasetlogoWithFallback-B9WXvNCA.js.map +1 -0
- package/es/chunks/{Distributions-CXIEJ6e6.js → Distributions-Cwl_75VG.js} +349 -348
- package/es/chunks/{Distributions-CXIEJ6e6.js.map → Distributions-Cwl_75VG.js.map} +1 -1
- package/es/chunks/{MetricsPresentation-U_CO8JoH.js → MetricsPresentation-DKCJQOtf.js} +2 -2
- package/es/chunks/{MetricsPresentation-U_CO8JoH.js.map → MetricsPresentation-DKCJQOtf.js.map} +1 -1
- package/es/chunks/{DatasetlogoWithFallback-CbP7vRs_.js → PresentationItem-C4yZ555-.js} +243 -262
- package/es/chunks/PresentationItem-C4yZ555-.js.map +1 -0
- package/es/chunks/index-BmhRLlZh.js +100 -0
- package/es/chunks/index-BmhRLlZh.js.map +1 -0
- package/es/index.js +1 -1
- package/es/routing.js +1 -1
- package/es/sourceDataset.js +57 -56
- package/es/sourceDataset.js.map +1 -1
- package/es/sourceDatasetList.js +5 -4
- package/es/sourceDatasetList.js.map +1 -1
- package/es/taxon.js +18 -12
- package/es/taxon.js.map +1 -1
- package/es/taxonDistribution.js +1 -1
- package/es/tree.js +60 -57
- package/es/tree.js.map +1 -1
- package/package.json +1 -1
- package/types/index.d.ts +13 -0
- package/umd/col-browser.js +150 -134
- package/umd/col-browser.js.map +1 -1
- package/umd/col-browser.min.js +5 -5
- package/umd/col-browser.min.js.map +1 -1
- package/es/chunks/DatasetlogoWithFallback-CbP7vRs_.js.map +0 -1
- package/es/chunks/index-CNK3JADR.js +0 -95
- package/es/chunks/index-CNK3JADR.js.map +0 -1
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\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 }\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 loadRoot = async () => {\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 this.setState({ rootLoading: true, treeData: [] });\n return client(\n `${\n config.dataApi\n }dataset/${datasetKey}/tree?projectKey=${datasetKey}${type ? \"&type=\"+type :\"\"}&limit=${CHILD_PAGE_SIZE}&offset=${\n this.state.treeData.length\n }${hideExtinct ? `&extinct=false&extinct=` : \"\"}${insertPlaceholder ? \"&insertPlaceholder=true\" : \"\"}`\n )\n .then(this.decorateWithSectorsAndDataset)\n .then((res) => {\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({\n rootTotal: rootTotal,\n rootLoading: false,\n treeData: [...this.state.treeData, ...treeData],\n expandedKeys:\n treeData.length < 10 ? treeData.map((n) => n.taxon.id).filter(n => n ===\"CS5HF\") : [],\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 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 { treeData } = this.state;\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 (\n dataRef.children[dataRef.children.length - 1].key ===\n \"__loadMoreBTN__\"\n ) {\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=\"__loadMoreBTN__\"\n />\n ),\n key: \"__loadMoreBTN__\",\n childCount: 0,\n isLeaf: true,\n },\n ];\n }\n if (!dontUpdateState) {\n this.setState({\n treeData: [...treeData],\n loadedKeys: [...new Set([...this.state.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 (\n parentNode.children[parentNode.children.length - 1].key ===\n \"__loadMoreBTN__\"\n ) {\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}>\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","LoadMoreChildrenTreeNode","ColTree","getSectorsBatch","treeRef","prevProps","client","res","r","showSourceTaxon","hideExtinct","insertPlaceholder","type","expandedTaxonKey","defaultExpandKey","defaultTaxonKey","mainTreeData","rootTotal","treeData","tx","dataRef","n","err","root","root_","i","node","rootIndex","x","loadedKeys","t","reloadAll","dontUpdateState","limit","offset","childDataRef","loadMoreFn","dataset","treeNode","id","nodeArray","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","key","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\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 }\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 loadRoot = async () => {\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 this.setState({ rootLoading: true, treeData: [] });\n return client(\n `${\n config.dataApi\n }dataset/${datasetKey}/tree?projectKey=${datasetKey}${type ? \"&type=\"+type :\"\"}&limit=${CHILD_PAGE_SIZE}&offset=${\n this.state.treeData.length\n }${hideExtinct ? `&extinct=false&extinct=` : \"\"}${insertPlaceholder ? \"&insertPlaceholder=true\" : \"\"}`\n )\n .then(this.decorateWithSectorsAndDataset)\n .then((res) => {\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({\n rootTotal: rootTotal,\n rootLoading: false,\n treeData: [...this.state.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 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 { treeData } = this.state;\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 (\n dataRef.children[dataRef.children.length - 1].key ===\n \"__loadMoreBTN__\"\n ) {\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=\"__loadMoreBTN__\"\n />\n ),\n key: \"__loadMoreBTN__\",\n childCount: 0,\n isLeaf: true,\n },\n ];\n }\n if (!dontUpdateState) {\n this.setState({\n treeData: [...treeData],\n loadedKeys: [...new Set([...this.state.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 (\n parentNode.children[parentNode.children.length - 1].key ===\n \"__loadMoreBTN__\"\n ) {\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}>\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","LoadMoreChildrenTreeNode","ColTree","getSectorsBatch","treeRef","prevProps","client","res","r","showSourceTaxon","hideExtinct","insertPlaceholder","type","expandedTaxonKey","defaultExpandKey","defaultTaxonKey","mainTreeData","rootTotal","treeData","tx","dataRef","err","root","root_","i","node","rootIndex","x","loadedKeys","t","reloadAll","dontUpdateState","limit","offset","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","key","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/types/index.d.ts
CHANGED
|
@@ -41,6 +41,12 @@ export interface TreeProps
|
|
|
41
41
|
extends DatasetKeyProps,
|
|
42
42
|
ThemeProps,
|
|
43
43
|
NavigationProps {
|
|
44
|
+
/**
|
|
45
|
+
* Uncontrolled fallback: the taxon to expand to on load when
|
|
46
|
+
* `expandedTaxonKey` is not set. Nothing is expanded unless one of these is
|
|
47
|
+
* provided — pass a root id to open it, e.g. `"CS5HF"` opens Eukaryota in
|
|
48
|
+
* current Catalogue of Life releases.
|
|
49
|
+
*/
|
|
44
50
|
defaultTaxonKey?: string;
|
|
45
51
|
expandedTaxonKey?: string;
|
|
46
52
|
onExpandedTaxonKeyChange?: (taxonKey: string | null) => void;
|
|
@@ -150,6 +156,13 @@ export interface WithRoutingOptions {
|
|
|
150
156
|
navigation?: "spa" | "reload";
|
|
151
157
|
/** Per-kind URL prefixes used to read/write the controlled identifier. */
|
|
152
158
|
paths?: Partial<Record<WithRoutingOptions["kind"], string>>;
|
|
159
|
+
/**
|
|
160
|
+
* Reserved query string (e.g. "?v=br") appended to every generated link and
|
|
161
|
+
* preserved across the component's own state writes, but excluded from its
|
|
162
|
+
* parsed state — so a release/variant marker never leaks into Search filters
|
|
163
|
+
* or Tree state.
|
|
164
|
+
*/
|
|
165
|
+
query?: string;
|
|
153
166
|
}
|
|
154
167
|
|
|
155
168
|
/**
|