col-browser 2.3.9 → 2.3.10

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/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 // 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 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 // 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 (\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 &#128549;</span>\n ),\n rootLoading: false,\n }/* ,\n () => {\n if (\n this.props.treeType === \"CATALOGUE\" &&\n typeof this.props.addMissingTargetKey === \"function\"\n ) {\n this.props.addMissingTargetKey(expandKey);\n }\n } */\n );\n }\n }\n }\n if (node) {\n await this.fetchChildPage(node, true, true);\n let targetNode = node.children.find(\n (c) => get(c, \"taxon.id\") === get(targetTaxon, \"taxon.id\")\n );\n if (\n targetTaxon &&\n index === loadedKeys.length - 2 &&\n get(node, \"taxon.id\") !== get(targetTaxon, \"taxon.id\") &&\n isArray(node.children) &&\n !targetNode\n ) {\n if (node.children.length < node.childCount) {\n // its the parent of the taxon we are after - if its not in the first page, insert it\n targetNode = await this.pageThroughChildrenUntilTaxonFound(\n node,\n get(targetTaxon, \"taxon.id\")\n );\n // node.children = [targetTaxon, ...node.children];\n if (targetNode) {\n this.setState({ treeData: [...this.state.treeData] }, () => {\n setTimeout(() => {\n const elmnt = document.getElementById(expandKey);\n elmnt.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n /* if (get(this, \"treeRef.current\")) {\n this.treeRef.current.scrollTo({ key: expandKey });\n } */\n }, 100);\n });\n } else {\n // It has gone missing from the tree\n this.setState(\n {\n nodeNotFoundErr: (\n <span>Cannot find taxon {expandKey} in tree &#128549;</span>\n ),\n rootLoading: false,\n },\n () => {\n if (\n this.props.treeType === \"CATALOGUE\" &&\n typeof this.props.addMissingTargetKey === \"function\"\n ) {\n this.props.addMissingTargetKey(expandKey);\n }\n }\n );\n }\n }\n }\n }\n }\n const newState = { loadedKeys, rootLoading: false };\n if (expandAll) {\n newState.expandedKeys = loadedKeys;\n }\n this.setState(newState, () => {\n if (expandKey) {\n setTimeout(() => {\n const elmnt = document.getElementById(expandKey);\n elmnt.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n /* if (get(this, \"treeRef.current\")) {\n this.treeRef.current.scrollTo({ key: expandKey });\n } */\n }, 100);\n }\n });\n };\n\n render() {\n const {\n error,\n rootTotal,\n rootLoading,\n treeData,\n defaultExpandAll,\n nodeNotFoundErr,\n loadedKeys,\n expandedKeys,\n } = this.state;\n const { treeType, dataset, height, expandedTaxonKey } = this.props;\n void height;\n const defaultExpandKey = expandedTaxonKey;\n\n return (\n <div>\n {error && (\n <React.Fragment>\n {get(error, \"response.data.code\") !== 404 ? (\n <Alert\n closable\n onClose={() => this.setState({ error: null })}\n style={{ marginTop: \"8px\" }}\n message={<ErrorMsg error={error} />}\n type=\"error\"\n />\n ) : (\n <Alert\n closable\n onClose={() => this.setState({ error: null })}\n style={{ marginTop: \"8px\" }}\n message={\n <Custom404\n error={error}\n treeType={treeType}\n dataset={dataset}\n loadRoot={this.loadRoot}\n />\n }\n type=\"warning\"\n />\n )}\n </React.Fragment>\n )}\n {nodeNotFoundErr && (\n <Alert\n closable\n onClose={() => this.setState({ nodeNotFoundErr: null })}\n style={{ marginTop: \"8px\" }}\n message={nodeNotFoundErr}\n type=\"warning\"\n />\n )}\n {rootLoading && <Skeleton paragraph={{ rows: 10 }} active />}\n {!rootLoading && treeData.length > 0 && (\n <Tree\n ref={this.treeRef}\n defaultExpandAll={defaultExpandAll}\n // height={height || 600}\n // defaultExpandedKeys={defaultExpandedKeys}\n loadData={this.onLoadData}\n onLoad={(loadedKeys) => this.setState({ loadedKeys })}\n loadedKeys={loadedKeys}\n expandedKeys={expandedKeys}\n treeData={treeData}\n filterTreeNode={(node) => node.key === defaultExpandKey}\n onExpand={(expandedKeys, obj) => {\n this.setState({ expandedKeys });\n if (this.props.onExpandedTaxonKeyChange) {\n this.props.onExpandedTaxonKeyChange(\n obj.expanded ? obj.node.key : null\n );\n }\n }}\n ></Tree>\n )}\n\n {!error && treeData.length < rootTotal && (\n <Button loading={rootLoading} onClick={this.loadRoot}>\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","prevState","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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"}
1
+ {"version":3,"file":"tree.js","sources":["../src/ColTree/treeCache.js","../src/ColTree/TaxonSources.js","../src/ColTree/ColTreeContext.js","../src/ColTree/ColTreeNode.js","../src/ColTree/ColTree.js","../src/ColTree/index.js","../src/entries/tree.js"],"sourcesContent":["import { createContext } from \"react\";\nimport DataLoader from \"dataloader\";\nimport { getDatasetsBatch, getPublishersBatch } from \"../api/dataset\";\n\n// Shared DataLoaders for the Tree subtree. Created once per (datasetKey,\n// mounted Tree) and provided via TreeCacheContext so every TaxonSources,\n// every sector-dataset decoration in ColTree, and any other in-tree\n// consumer hits the same in-memory cache. Without this, each TaxonSources\n// instance creates its own loader and the same source/publisher dataset\n// is fetched once per node it appears under.\n//\n// DataLoader batches calls inside a microtask and caches resolved values\n// indefinitely for the lifetime of the loader.\n\nexport const TreeCacheContext = createContext({\n datasetLoader: null,\n publisherLoader: null,\n});\n\nexport const createTreeCache = (datasetKey) => ({\n datasetLoader: new DataLoader((ids) => getDatasetsBatch(ids, datasetKey)),\n publisherLoader: new DataLoader((ids) =>\n getPublishersBatch(ids, datasetKey)\n ),\n});\n","import React from \"react\";\nimport { Popover, Spin, Divider } from \"antd\";\nimport DataLoader from \"dataloader\";\nimport { sortBy } from \"lodash-es\";\nimport { LinkTo } from \"../router\";\nimport { TreeCacheContext } from \"./treeCache\";\nimport { getDatasetsBatch, getPublishersBatch } from \"../api/dataset\";\nimport config from \"../config\";\n\nclass TaxonSources extends React.Component {\n static contextType = TreeCacheContext;\n\n constructor(props) {\n super(props);\n this.state = {\n data: [],\n showInNode: false,\n loading: false,\n };\n }\n\n // Returns the shared cache from TreeCacheContext if available, or a\n // throwaway local DataLoader so the popover still works even if context\n // doesn't reach this instance (which used to leave the spinner stuck\n // because getData early-returned with no loading state set).\n getDatasetLoader = () => {\n const { datasetKey } = this.props;\n if (this.context?.datasetLoader) return this.context.datasetLoader;\n if (!this._localDatasetLoader) {\n this._localDatasetLoader = new DataLoader((ids) =>\n getDatasetsBatch(ids, datasetKey)\n );\n }\n return this._localDatasetLoader;\n };\n\n getPublisherLoader = () => {\n const { datasetKey } = this.props;\n if (this.context?.publisherLoader) return this.context.publisherLoader;\n if (!this._localPublisherLoader) {\n this._localPublisherLoader = new DataLoader((ids) =>\n getPublishersBatch(ids, datasetKey)\n );\n }\n return this._localPublisherLoader;\n };\n\n componentDidMount = () => {\n const { sourceDatasetKeys } = this.props;\n if (sourceDatasetKeys && sourceDatasetKeys.length < 4) {\n this.setState({ showInNode: true }, this.getData);\n }\n };\n\n getData = () => {\n const { sourceDatasetKeys } = this.props;\n if (!sourceDatasetKeys?.length) return;\n this.setState({ loading: true });\n const loader = this.getDatasetLoader();\n Promise.all(\n sourceDatasetKeys.map((s) => loader.load(s).catch(() => null))\n )\n .then((data) => {\n this.setState({ data: sortBy(data, [\"alias\"]), loading: false });\n })\n .catch(() => {\n this.setState({ data: [], loading: false });\n });\n };\n\n getPublisherData = () => {\n const { publisherDatasetKeys } = this.props;\n if (!publisherDatasetKeys) return;\n const loader = this.getPublisherLoader();\n Promise.all(\n Object.keys(publisherDatasetKeys).map((s) =>\n loader\n .load(s)\n .then((publisher) => ({\n ...publisher,\n datasets: publisherDatasetKeys[s],\n }))\n .catch(() => null)\n )\n )\n .then((data) => {\n this.setState({ publishers: sortBy(data.filter(Boolean), [\"alias\"]) });\n })\n .catch(() => {\n this.setState({ publishers: [] });\n });\n };\n\n render = () => {\n const { data, showInNode, popOverVisible, loading } = this.state;\n const { taxon, datasetKey } = this.props;\n const linkStyle = { color: \"orange\", fontSize: \"11px\" };\n const publisherUrl = (uuid) =>\n `${config.clbPortal}/dataset/${datasetKey}/publisher/${uuid}`;\n\n if (showInNode) {\n return data\n .filter((d) => !!d)\n .map((d, index) => (\n <LinkTo\n to=\"source\"\n args={d.key}\n key={d.key}\n className=\"col-tree-data-source\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.key)}\n </LinkTo>\n ));\n }\n\n return (\n <div style={{ display: \"inline\" }} id={`taxon_sources_${taxon.id}`}>\n <Popover\n getPopupContainer={() =>\n document.getElementById(`taxon_sources_${taxon.id}`)\n }\n content={\n loading || data.length === 0 ? (\n <div\n style={{ minWidth: \"200px\", textAlign: \"center\", padding: \"8px 0\" }}\n >\n <Spin size=\"small\" />\n </div>\n ) : (\n <div style={{ maxWidth: \"500px\" }}>\n {data.length > 0 && (\n <div>\n {data\n .filter((d) => !!d)\n .map((d, index) => (\n <LinkTo\n to=\"source\"\n args={d.key}\n key={d.key}\n className=\"col-tree-data-source\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.key)}\n </LinkTo>\n ))}\n </div>\n )}\n {this.state.publishers && this.state.publishers.length > 0 && (\n <div style={{ marginTop: \"12px\" }}>\n <strong>Publishers</strong>\n <div>\n {this.state.publishers\n .filter((d) => !!d)\n .map((d, index) => (\n <a\n key={d.id}\n href={publisherUrl(d.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={linkStyle}\n >\n {(index ? \", \" : \"\") + (d.alias || d.id)}\n {d.datasets?.length\n ? ` (${d.datasets.length.toLocaleString(\"en-GB\")})`\n : \"\"}\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n }\n title={\n <div style={{ padding: \"4px 0\" }}>\n <span style={{ fontWeight: 500 }}>Sources for </span>\n <em>{taxon?.name}</em>\n <Divider style={{ margin: \"8px 0 0\" }} />\n </div>\n }\n open={popOverVisible}\n onOpenChange={(visible) =>\n this.setState({ popOverVisible: visible }, () => {\n if (visible && this.state.data.length === 0) this.getData();\n if (\n visible &&\n this.props.publisherDatasetKeys &&\n !this.state.publishers\n ) {\n this.getPublisherData();\n }\n })\n }\n trigger=\"click\"\n placement=\"rightTop\"\n >\n <a\n className=\"col-tree-data-source\"\n role=\"button\"\n tabIndex={0}\n style={{ cursor: \"pointer\", color: \"orange\", fontSize: \"11px\" }}\n onClick={(e) => e.preventDefault()}\n >\n Multiple sources\n </a>\n </Popover>\n </div>\n );\n };\n}\n\nexport default TaxonSources;\n","import React from \"react\";\n\nexport const ColTreeContext = React.createContext();\n","import React from \"react\";\nimport { Tag } from \"antd\";\nimport { get, isUndefined } from \"lodash-es\";\nimport TaxonSources from \"./TaxonSources\";\nimport MergedDataBadge from \"../components/MergedDataBadge\";\nimport {ColTreeContext} from \"./ColTreeContext\"\nimport { LinkTo } from \"../router\";\n\nclass ColTreeNode extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n style: {},\n provisional: this.props.taxon.status === \"provisionally accepted\",\n loading: false,\n };\n }\n\n rankIsAboveSpecies = (rank) => {\n return this.props.rank.indexOf(rank) < this.props.rank.indexOf(\"species\");\n };\n\n render = () => {\n const {\n taxon,\n taxon: { sector, sourceDatasetKeys, publisherDatasetKeys },\n datasetKey,\n } = this.props;\n\n const sectorSourceDataset = get(sector, \"dataset\");\n/* const hasDatasetSectors = datasetSectors && ( sector && sector.subjectDatasetKey ? Object.keys(omit(datasetSectors, [sector.subjectDatasetKey])).length > 0 : true)\n */ \nconst hasDatasetSectors =\n(sourceDatasetKeys || []).filter((d) => sector?.subjectDatasetKey !== d)\n .length > 0;\n const estimate = taxon.estimate && taxon.estimates ? taxon.estimates.find(e => e.estimate === taxon.estimate) : null;\n // Virtual \"Not assigned\" placeholders inserted by the API\n // (insertPlaceholder=true) aren't real taxa, so they can't be linked\n // to a taxon page.\n const isPlaceholder =\n typeof taxon.id === \"string\" && taxon.id.indexOf(\"incertae-sedis\") > -1;\n\n return (\n <ColTreeContext.Consumer>\n {({ showInfo }) => (\n <div id={taxon.id}>\n <span>\n <span className=\"tree-node-rank\">{taxon.rank}: </span>\n {isPlaceholder ? (\n <span dangerouslySetInnerHTML={{ __html: taxon.labelHtml }} />\n ) : (\n <LinkTo to=\"taxon\" args={taxon.id}>\n <span dangerouslySetInnerHTML={{ __html: taxon.labelHtml }} />\n </LinkTo>\n )}\n {taxon?.merged && (\n <MergedDataBadge style={{ marginLeft: \"4px\" }} datasetKey={taxon?.datasetKey} verbatimSourceKey={taxon?.verbatimSourceKey}/>\n )}\n </span>\n {/* estimate && (\n <span>\n {\" \"}\n • <TaxonEstimate estimate={estimate} taxon={taxon} />\n </span>\n ) */}\n {showInfo && taxon.status === \"provisionally accepted\" && (\n <React.Fragment> • <Tag color=\"warning\" style={{marginRight: 0}}>\n prov.\n </Tag>\n </React.Fragment>\n )}\n\n {!isUndefined(taxon.count) &&\n this.rankIsAboveSpecies(taxon?.rank) && (\n <span>\n {\" \"}\n • {Number(taxon.count).toLocaleString()}{\" \"}\n {showInfo && !isUndefined(taxon.speciesEstimate) && (\n <span>\n {\" \"}\n of{\" \"}\n {Number(\n taxon.speciesEstimate\n ).toLocaleString()}{\" \"}\n est.{\" \"}\n </span>\n )}\n spp.\n </span>\n )} \n \n \n {showInfo && sector && (\n <span>\n <span> • </span>\n <LinkTo\n to=\"source\"\n args={sector.subjectDatasetKey}\n style={hasDatasetSectors ? {fontWeight: 'bold'} : null}\n className=\"col-tree-data-source\"\n >\n {get(sectorSourceDataset, \"alias\") || sector.subjectDatasetKey}{hasDatasetSectors && \", \"}\n </LinkTo>\n </span>\n )}\n {showInfo && hasDatasetSectors && (\n <React.Fragment> <TaxonSources\n sourceDatasetKeys={sourceDatasetKeys}\n publisherDatasetKeys={publisherDatasetKeys}\n taxon={taxon}\n datasetKey={datasetKey}\n />\n </React.Fragment>\n )}\n \n </div>\n )}\n </ColTreeContext.Consumer>\n\n );\n };\n}\n\nexport default ColTreeNode;\n","import React from \"react\";\nimport { Tree, Alert, Spin, Button, Skeleton } from \"antd\";\nimport { flatten, get, isArray } from \"lodash-es\";\nimport client from \"../api/client\";\nimport config from \"../config\";\nimport ColTreeNode from \"./ColTreeNode\";\nimport ErrorMsg from \"../components/ErrorMsg\";\nimport { getSectorsBatch } from \"../api/sector\";\nimport DataLoader from \"dataloader\";\nimport { TreeCacheContext } from \"./treeCache\";\n\nconst CHILD_PAGE_SIZE = 1000; // How many children will we load at a time\n\n// Key of the synthetic \"Load more...\" child node. It has to be scoped to its\n// parent: two nodes that both have more children than one page would otherwise\n// share one key and antd warns \"Same 'key' exist in the Tree\" (issue #59).\nconst LOAD_MORE_PREFIX = \"__loadMoreBTN__\";\nconst loadMoreKey = (parentKey) => `${LOAD_MORE_PREFIX}${parentKey}`;\nconst isLoadMoreKey = (key) =>\n typeof key === \"string\" && key.startsWith(LOAD_MORE_PREFIX);\n\nclass LoadMoreChildrenTreeNode extends React.Component {\n constructor(props) {\n super(props);\n this.state = { loading: false };\n }\n\n onClick = () => {\n this.setState({ loading: true }, () =>\n this.props.onClick().then(() => this.setState({ loading: false }))\n );\n };\n render = () => {\n const { loading } = this.state;\n return (\n <React.Fragment>\n {loading && <Spin />}\n {!loading && (\n <a onClick={this.onClick}>\n <strong>Load more...</strong>\n </a>\n )}\n </React.Fragment>\n );\n };\n}\n\nclass ColTree extends React.Component {\n static contextType = TreeCacheContext;\n\n constructor(props) {\n super(props);\n\n this.state = {\n rootLoading: true,\n treeData: [],\n loadedKeys: [],\n expandedKeys: [],\n rootTotal: 0,\n error: null,\n nodeNotFoundErr: null,\n rank: []\n };\n this.treeRef = React.createRef();\n // Incremented on every root load; a response whose id is no longer the\n // current one is stale and gets discarded (see loadRoot).\n this.rootRequestId = 0;\n }\n\n // datasetLoader comes from the shared TreeCacheContext so multiple tree\n // nodes (and TaxonSources instances) share one in-memory cache instead\n // of each re-fetching the same source datasets.\n get datasetLoader() {\n return this.context.datasetLoader;\n }\n\n componentDidMount = () => {\n const { datasetKey } = this.props;\n this.loadRoot();\n this.sectorLoader = new DataLoader((ids) =>\n getSectorsBatch(ids, datasetKey)\n );\n this.getRank()\n const { treeRef } = this.props;\n treeRef(this);\n };\n\n componentDidUpdate = (prevProps) => {\n if (\n prevProps.defaultExpandKey !== this.props.defaultExpandKey ||\n prevProps.hideExtinct !== this.props.hideExtinct ||\n prevProps.insertPlaceholder !== this.props.insertPlaceholder\n ) {\n this.reloadRoot();\n }\n };\n\n getRank = () => {\n client(`${config.dataApi}vocab/rank`).then((res) =>\n this.setState({ rank: res.data.map((r) => r.name) })\n );\n };\n\n reloadRoot = () =>\n this.setState(\n {\n rootLoading: true,\n treeData: [],\n loadedKeys: [],\n rootTotal: 0,\n error: null,\n nodeNotFoundErr: null,\n },\n this.loadRoot\n );\n\n \n\n // `append` is only set by the \"Load more\" button, which pages in the next\n // batch of root taxa; every other caller loads page one from scratch.\n // Each call takes a request id and a response is merged only while its id is\n // still the current one. Without that, two overlapping loads — React\n // StrictMode's double mount in dev, or a prop change while a load is in\n // flight — both merged their page into treeData, so every root appeared\n // twice and antd warned \"Same 'key' exist in the Tree\" (issue #59).\n loadRoot = async (append = false) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n insertPlaceholder,\n type,\n expandedTaxonKey,\n } = this.props;\n\n const defaultExpandKey = expandedTaxonKey;\n const { defaultTaxonKey } = this.props;\n\n const requestId = ++this.rootRequestId;\n const offset = append ? this.state.treeData.length : 0;\n\n this.setState(\n append ? { rootLoading: true } : { rootLoading: true, treeData: [] }\n );\n return client(\n `${\n config.dataApi\n }dataset/${datasetKey}/tree?projectKey=${datasetKey}${type ? \"&type=\"+type :\"\"}&limit=${CHILD_PAGE_SIZE}&offset=${offset}${hideExtinct ? `&extinct=false&extinct=` : \"\"}${insertPlaceholder ? \"&insertPlaceholder=true\" : \"\"}`\n )\n .then(this.decorateWithSectorsAndDataset)\n .then((res) => {\n // A newer load has started since — drop this page instead of merging it.\n if (requestId !== this.rootRequestId) return;\n const mainTreeData = res.data.result || [];\n const rootTotal = res.data.total;\n const treeData = mainTreeData.map((tx) => {\n let dataRef = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n dataRef.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n reloadChildren={() => this.fetchChildPage(dataRef, true)}\n rank={this.state.rank}\n />\n );\n dataRef.ref = dataRef;\n return dataRef;\n });\n\n this.setState((prevState) => ({\n rootTotal: rootTotal,\n rootLoading: false,\n treeData: append ? [...prevState.treeData, ...treeData] : treeData,\n // Nothing is auto-expanded by default. Consumers open a specific root\n // (or deep taxon) by passing `defaultTaxonKey`/`expandedTaxonKey` —\n // e.g. defaultTaxonKey=\"CS5HF\" opens Eukaryota in current COL releases.\n expandedKeys: [],\n error: null,\n }),\n () => {\n if (defaultExpandKey) {\n return this.expandToTaxon(defaultExpandKey);\n } else if (defaultTaxonKey) {\n return this.expandToTaxon(defaultTaxonKey);\n }\n });\n if (treeData.length === 1) {\n this.fetchChildPage(treeData[treeData.length - 1]);\n }\n })\n .catch((err) => {\n if (requestId !== this.rootRequestId) return;\n this.setState({\n treeData: [],\n rootLoading: false,\n expandedKeys: [],\n error: err,\n });\n });\n };\n\n expandToTaxon = async (defaultExpandKey) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n type\n } = this.props;\n\n this.setState({ rootLoading: true/* , treeData: [] */ });\n const { data } = await client(\n `${\n config.dataApi\n }dataset/${datasetKey}/tree/${defaultExpandKey}?projectKey=${datasetKey}&insertPlaceholder=true${type ? \"&type=\"+type :\"\"}${\n hideExtinct ? `&extinct=false` : \"\"\n }`\n ).then((res) =>\n this.decorateWithSectorsAndDataset({\n data: { result: res.data },\n }).then(() => res)\n );\n\n if (data.length === 0) {\n return this.setState(\n {\n error: {\n message: `No classification found for Taxon ID: ${defaultExpandKey}`,\n },\n },\n this.loadRoot\n );\n }\n const tx = data[data.length - 1];\n let root = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n root.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(root, true)}\n />\n );\n\n root.ref = root;\n const root_ = root;\n for (let i = data.length - 2; i >= 0; i--) {\n const tx = data[i];\n const node = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n };\n node.ref = node;\n node.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(node, true)}\n />\n );\n\n root.children = [node];\n root = node;\n }\n\n /* const treeData = [root_]; */\nconst { treeData } = this.state;\n var rootIndex = treeData.findIndex((x) => x.key == root_.key);\n treeData[rootIndex] = root_;\n const loadedKeys = [...data.map((t) => t.id).reverse()];\n\n this.setState({ treeData }, () =>\n this.reloadLoadedKeys(loadedKeys, defaultExpandKey)\n );\n };\n\n fetchChildPage = async (dataRef, reloadAll, dontUpdateState) => {\n const {\n showSourceTaxon,\n datasetKey,\n hideExtinct,\n insertPlaceholder,\n type\n } = this.props;\n const childcount = get(dataRef, \"childCount\");\n const limit = CHILD_PAGE_SIZE;\n const offset = get(dataRef, \"childOffset\");\n const res = await client(\n `${config.dataApi}dataset/${datasetKey}/tree/${\n dataRef.taxon.id //taxonKey\n }/children?limit=${limit}&offset=${offset}&projectKey=${datasetKey}${type ? \"&type=\"+type :\"\"}${\n hideExtinct ? `&extinct=false` : \"\"\n }${insertPlaceholder ? \"&insertPlaceholder=true\" : \"\"}`\n );\n await this.decorateWithSectorsAndDataset(res);\n\n const data = res.data.result\n ? res.data.result.map((tx) => {\n let childDataRef = {\n taxon: tx,\n key: tx.id,\n datasetKey,\n childCount: tx.childCount,\n isLeaf: tx.childCount === 0,\n childOffset: 0,\n parent: dataRef,\n name: tx.name,\n };\n\n childDataRef.title = (\n <ColTreeNode\n taxon={tx}\n \n \n datasetKey={datasetKey}\n showSourceTaxon={showSourceTaxon}\n rank={this.state.rank}\n reloadChildren={() => this.fetchChildPage(childDataRef, true)}\n />\n );\n childDataRef.ref = childDataRef;\n\n return childDataRef;\n })\n : [];\n\n // reloadAll is used to force reload all children from offset 0 - used when new children have been posted\n dataRef.children =\n dataRef.children && offset !== 0 && !reloadAll\n ? [...dataRef.children, ...data]\n : data;\n // If extinct are filtered out, you cannot rely on childCount\n if (res.data.last && dataRef.childCount > dataRef.children.length) {\n dataRef.childCount = dataRef.children.length;\n }\n if (!res.data.last) {\n const loadMoreFn = () => {\n dataRef.childOffset += CHILD_PAGE_SIZE;\n if (isLoadMoreKey(get(dataRef.children[dataRef.children.length - 1], \"key\"))) {\n dataRef.children = dataRef.children.slice(0, -1);\n }\n return this.fetchChildPage(dataRef, false);\n };\n dataRef.children = [\n ...dataRef.children,\n {\n title: (\n <LoadMoreChildrenTreeNode\n onClick={loadMoreFn}\n key={loadMoreKey(dataRef.key)}\n />\n ),\n key: loadMoreKey(dataRef.key),\n childCount: 0,\n isLeaf: true,\n },\n ];\n }\n if (!dontUpdateState) {\n // Use the updater form: this often runs right after a sibling setState\n // (e.g. loadRoot's auto-expand of a single root) that may not have\n // committed yet, so this.state can be stale here.\n this.setState((prevState) => ({\n treeData: [...prevState.treeData],\n loadedKeys: [...new Set([...prevState.loadedKeys, dataRef.key])],\n }));\n }\n };\n\n decorateWithSectorsAndDataset = (res) => {\n if (!res.data.result) return res;\n return Promise.all(\n res.data.result\n .filter((tx) => !!tx.sectorDatasetKey)\n .map((tx) =>\n this.datasetLoader\n .load(tx.sectorDatasetKey)\n .then(\n (dataset) =>\n (tx.sector = {\n id: tx.sectorKey,\n subjectDatasetKey: tx.sectorDatasetKey,\n dataset: dataset,\n })\n )\n )\n ).then(() => res);\n };\n\n onLoadData = (treeNode, reloadAll = false) => {\n if (reloadAll) {\n treeNode.childOffset = 0;\n }\n return this.fetchChildPage(treeNode.ref, reloadAll);\n };\n\n findNode = (id, nodeArray) => {\n let node = null;\n\n node = nodeArray.find((n) => get(n, \"taxon.id\") === id);\n\n if (node) {\n return node;\n } else {\n const children = nodeArray.map((n) => get(n, \"children\") || []);\n const flattenedChildren = flatten(children); //.flat();\n if (flattenedChildren.length === 0) {\n return null;\n } else {\n return this.findNode(id, flattenedChildren);\n }\n }\n };\n\n pageThroughChildrenUntilTaxonFound = async (parentNode, taxonId) => {\n let node;\n while (!node && parentNode.children.length < parentNode.childCount) {\n parentNode.childOffset += CHILD_PAGE_SIZE;\n if (isLoadMoreKey(get(parentNode.children[parentNode.children.length - 1], \"key\"))) {\n parentNode.children = parentNode.children.slice(0, -1);\n }\n await this.fetchChildPage(parentNode, false, true);\n node = this.findNode(taxonId, parentNode.children);\n }\n if (!node) {\n node = parentNode.children.find((c) =>\n get(c, \"taxon.id\") ? c.taxon.id.indexOf(\"incertae-sedis\") > -1 : false\n );\n }\n return node;\n };\n\n reloadLoadedKeys = async (keys, expandKey, expandAll = true) => {\n this.setState({ rootLoading: true });\n const { loadedKeys: storedKeys } = this.state;\n // const defaultExpandKey = get(qs.parse(get(location, \"search\")), 'taxonKey');\n\n let { treeData } = this.state;\n const targetTaxon = expandKey ? this.findNode(expandKey, treeData) : null;\n const loadedKeys = keys ? [...keys] : [...storedKeys];\n for (let index = 0; index < loadedKeys.length; index++) {\n let node = this.findNode(loadedKeys[index], treeData);\n if (!node && targetTaxon && loadedKeys[index - 1]) {\n // If the node is not found look for insertae sedis nodes in the children of the parent and insert the 'Not assigned' between the parent and the node\n const parentNode = this.findNode(loadedKeys[index - 1], treeData);\n if (\n parentNode &&\n isArray(get(parentNode, \"children\")) &&\n parentNode.children.length > 0\n ) {\n node = await this.pageThroughChildrenUntilTaxonFound(\n parentNode,\n loadedKeys[index]\n );\n if (node) {\n loadedKeys.splice(index, 0, node.taxon.id);\n } else {\n // It has gone missing from the tree\n this.setState(\n {\n nodeNotFoundErr: (\n <span>Cannot find taxon {expandKey} in tree &#128549;</span>\n ),\n rootLoading: false,\n }/* ,\n () => {\n if (\n this.props.treeType === \"CATALOGUE\" &&\n typeof this.props.addMissingTargetKey === \"function\"\n ) {\n this.props.addMissingTargetKey(expandKey);\n }\n } */\n );\n }\n }\n }\n if (node) {\n await this.fetchChildPage(node, true, true);\n let targetNode = node.children.find(\n (c) => get(c, \"taxon.id\") === get(targetTaxon, \"taxon.id\")\n );\n if (\n targetTaxon &&\n index === loadedKeys.length - 2 &&\n get(node, \"taxon.id\") !== get(targetTaxon, \"taxon.id\") &&\n isArray(node.children) &&\n !targetNode\n ) {\n if (node.children.length < node.childCount) {\n // its the parent of the taxon we are after - if its not in the first page, insert it\n targetNode = await this.pageThroughChildrenUntilTaxonFound(\n node,\n get(targetTaxon, \"taxon.id\")\n );\n // node.children = [targetTaxon, ...node.children];\n if (targetNode) {\n this.setState({ treeData: [...this.state.treeData] }, () => {\n setTimeout(() => {\n const elmnt = document.getElementById(expandKey);\n elmnt.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n /* if (get(this, \"treeRef.current\")) {\n this.treeRef.current.scrollTo({ key: expandKey });\n } */\n }, 100);\n });\n } else {\n // It has gone missing from the tree\n this.setState(\n {\n nodeNotFoundErr: (\n <span>Cannot find taxon {expandKey} in tree &#128549;</span>\n ),\n rootLoading: false,\n },\n () => {\n if (\n this.props.treeType === \"CATALOGUE\" &&\n typeof this.props.addMissingTargetKey === \"function\"\n ) {\n this.props.addMissingTargetKey(expandKey);\n }\n }\n );\n }\n }\n }\n }\n }\n const newState = { loadedKeys, rootLoading: false };\n if (expandAll) {\n newState.expandedKeys = loadedKeys;\n }\n this.setState(newState, () => {\n if (expandKey) {\n setTimeout(() => {\n const elmnt = document.getElementById(expandKey);\n elmnt.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n /* if (get(this, \"treeRef.current\")) {\n this.treeRef.current.scrollTo({ key: expandKey });\n } */\n }, 100);\n }\n });\n };\n\n render() {\n const {\n error,\n rootTotal,\n rootLoading,\n treeData,\n defaultExpandAll,\n nodeNotFoundErr,\n loadedKeys,\n expandedKeys,\n } = this.state;\n const { treeType, dataset, height, expandedTaxonKey } = this.props;\n void height;\n const defaultExpandKey = expandedTaxonKey;\n\n return (\n <div>\n {error && (\n <React.Fragment>\n {get(error, \"response.data.code\") !== 404 ? (\n <Alert\n closable\n onClose={() => this.setState({ error: null })}\n style={{ marginTop: \"8px\" }}\n message={<ErrorMsg error={error} />}\n type=\"error\"\n />\n ) : (\n <Alert\n closable\n onClose={() => this.setState({ error: null })}\n style={{ marginTop: \"8px\" }}\n message={\n <Custom404\n error={error}\n treeType={treeType}\n dataset={dataset}\n loadRoot={this.loadRoot}\n />\n }\n type=\"warning\"\n />\n )}\n </React.Fragment>\n )}\n {nodeNotFoundErr && (\n <Alert\n closable\n onClose={() => this.setState({ nodeNotFoundErr: null })}\n style={{ marginTop: \"8px\" }}\n message={nodeNotFoundErr}\n type=\"warning\"\n />\n )}\n {rootLoading && <Skeleton paragraph={{ rows: 10 }} active />}\n {!rootLoading && treeData.length > 0 && (\n <Tree\n ref={this.treeRef}\n defaultExpandAll={defaultExpandAll}\n // height={height || 600}\n // defaultExpandedKeys={defaultExpandedKeys}\n loadData={this.onLoadData}\n onLoad={(loadedKeys) => this.setState({ loadedKeys })}\n loadedKeys={loadedKeys}\n expandedKeys={expandedKeys}\n treeData={treeData}\n filterTreeNode={(node) => node.key === defaultExpandKey}\n onExpand={(expandedKeys, obj) => {\n this.setState({ expandedKeys });\n if (this.props.onExpandedTaxonKeyChange) {\n this.props.onExpandedTaxonKeyChange(\n obj.expanded ? obj.node.key : null\n );\n }\n }}\n ></Tree>\n )}\n\n {!error && treeData.length < rootTotal && (\n <Button loading={rootLoading} onClick={() => this.loadRoot(true)}>\n Load more{\" \"}\n </Button>\n )}\n </div>\n );\n }\n}\n\nexport default ColTree;\n","import React from \"react\";\nimport ColTree from \"./ColTree\";\nimport { get } from \"lodash-es\";\nimport NameAutocomplete from \"./NameAutocomplete\";\nimport client, { setAuth } from \"../api/client\";\nimport { Row, Col, Checkbox } from \"antd\";\nimport { ColTreeContext } from \"./ColTreeContext\";\nimport { TreeCacheContext, createTreeCache } from \"./treeCache\";\nimport { getDataset } from \"../api/dataset\";\nimport Citation from \"../components/DatasetCitation\";\nimport { RouterContext, buildRouter } from \"../router\";\nimport { readSetting, writeSetting } from \"../storage\";\n\nconst INFRASPECIFIC_RANKS = [\n \"infraspecific name\",\n \"species\",\n \"variety\",\n \"form\",\n];\n\nclass ColTreeWrapper extends React.Component {\n static contextType = RouterContext;\n\n constructor(props) {\n super(props);\n setAuth(this.props.auth);\n this.state = {\n hideExtinct: readSetting(\"tree-extant-only\", false),\n showInfo: readSetting(\"tree-show-source\", false),\n dataset: null,\n };\n // Per-Tree DataLoader cache. Rebuilt only if datasetKey changes (rare).\n this.cache = createTreeCache(this.props.datasetKey);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.datasetKey !== this.props.datasetKey) {\n this.cache = createTreeCache(this.props.datasetKey);\n }\n }\n\n componentDidMount = async () => {\n const { datasetKey, citation } = this.props;\n if (citation) {\n try {\n const { data: dataset } = await getDataset(datasetKey);\n this.setState({ dataset });\n } catch (err) {\n // ignore\n }\n }\n };\n\n render = () => {\n const {\n datasetKey,\n defaultTaxonKey,\n expandedTaxonKey,\n onExpandedTaxonKeyChange,\n showTreeOptions,\n linkToSpeciesPage,\n citation,\n type,\n insertPlaceholder = true,\n } = this.props;\n const { hideExtinct, dataset } = this.state;\n\n const handleSelectName = (name) => {\n const key = get(name, \"key\");\n if (!key) return;\n const rank = get(name, \"rank\");\n if (linkToSpeciesPage && INFRASPECIFIC_RANKS.includes(rank)) {\n // Leaf-like selection: jump to the taxon page via the host's nav.\n const navigateToTaxon = this.context?.taxon?.onNavigate;\n if (navigateToTaxon) navigateToTaxon(key);\n } else if (onExpandedTaxonKeyChange) {\n onExpandedTaxonKeyChange(key);\n if (this.treeRef && this.treeRef.reloadRoot) this.treeRef.reloadRoot();\n }\n };\n\n const handleResetSearch = () => {\n if (onExpandedTaxonKeyChange) onExpandedTaxonKeyChange(null);\n };\n\n return (\n <div className=\"catalogue-of-life\">\n {citation === \"top\" && dataset && <Citation dataset={dataset} />}\n <TreeCacheContext.Provider value={this.cache}>\n <ColTreeContext.Provider value={this.state}>\n <Row>\n <Col flex=\"auto\">\n <NameAutocomplete\n hideExtinct={hideExtinct}\n datasetKey={datasetKey}\n style={{\n width: \"100%\",\n paddingTop: \"5px\",\n paddingBottom: \"5px\",\n }}\n defaultTaxonKey={expandedTaxonKey || null}\n onSelectName={handleSelectName}\n onResetSearch={handleResetSearch}\n />\n </Col>\n {showTreeOptions && (\n <Col style={{ paddingLeft: \"8px\" }}>\n <Checkbox\n defaultChecked={this.state.showInfo}\n onChange={({ target: { checked } }) => {\n this.setState({ showInfo: checked });\n writeSetting(\"tree-show-source\", checked);\n }}\n >\n Source\n </Checkbox>\n\n <Checkbox\n defaultChecked={this.state.hideExtinct}\n onChange={({ target: { checked } }) => {\n this.setState({ hideExtinct: checked });\n writeSetting(\"tree-extant-only\", checked);\n }}\n >\n Extant only\n </Checkbox>\n </Col>\n )}\n </Row>\n <ColTree\n insertPlaceholder={insertPlaceholder}\n hideExtinct={hideExtinct}\n datasetKey={datasetKey}\n defaultTaxonKey={defaultTaxonKey}\n expandedTaxonKey={expandedTaxonKey}\n onExpandedTaxonKeyChange={onExpandedTaxonKeyChange}\n treeRef={(ref) => (this.treeRef = ref)}\n type={type}\n />\n </ColTreeContext.Provider>\n </TreeCacheContext.Provider>\n {citation === \"bottom\" && dataset && <Citation dataset={dataset} />}\n </div>\n );\n };\n}\n\n// Public wrapper: takes controlled props + navigation callbacks, builds\n// the RouterContext, hands the rest down.\nexport default function Tree({\n datasetKey,\n defaultTaxonKey,\n expandedTaxonKey,\n onExpandedTaxonKeyChange,\n showTreeOptions,\n linkToSpeciesPage,\n citation,\n type,\n insertPlaceholder,\n auth,\n ...routerProps\n}) {\n return (\n <RouterContext.Provider value={buildRouter(routerProps)}>\n <ColTreeWrapper\n datasetKey={datasetKey}\n defaultTaxonKey={defaultTaxonKey}\n expandedTaxonKey={expandedTaxonKey}\n onExpandedTaxonKeyChange={onExpandedTaxonKeyChange}\n showTreeOptions={showTreeOptions}\n linkToSpeciesPage={linkToSpeciesPage}\n citation={citation}\n type={type}\n insertPlaceholder={insertPlaceholder}\n auth={auth}\n />\n </RouterContext.Provider>\n );\n}\n","import withDatasetKey from \"../withDatasetKey\";\nimport { withTheme } from \"../withTheme\";\nimport colTree from \"../ColTree\";\n\nexport const Tree = withTheme(withDatasetKey(colTree));\n"],"names":["TreeCacheContext","createContext","createTreeCache","datasetKey","DataLoader","ids","getDatasetsBatch","getPublishersBatch","TaxonSources","React","props","__publicField","_a","sourceDatasetKeys","loader","s","data","sortBy","publisherDatasetKeys","publisher","showInNode","popOverVisible","loading","taxon","linkStyle","publisherUrl","uuid","config","d","index","jsx","LinkTo","Popover","Spin","jsxs","Divider","visible","e","ColTreeContext","ColTreeNode","rank","sector","sectorSourceDataset","get","hasDatasetSectors","isPlaceholder","showInfo","MergedDataBadge","Tag","isUndefined","CHILD_PAGE_SIZE","LOAD_MORE_PREFIX","loadMoreKey","parentKey","isLoadMoreKey","key","LoadMoreChildrenTreeNode","ColTree","getSectorsBatch","treeRef","prevProps","client","res","r","append","showSourceTaxon","hideExtinct","insertPlaceholder","type","expandedTaxonKey","defaultExpandKey","defaultTaxonKey","requestId","offset","mainTreeData","rootTotal","treeData","tx","dataRef","prevState","err","root","root_","i","node","rootIndex","x","loadedKeys","t","reloadAll","dontUpdateState","limit","childDataRef","loadMoreFn","dataset","treeNode","id","nodeArray","n","children","flattenedChildren","flatten","parentNode","taxonId","c","keys","expandKey","expandAll","storedKeys","targetTaxon","isArray","targetNode","newState","error","rootLoading","defaultExpandAll","nodeNotFoundErr","expandedKeys","treeType","height","Alert","ErrorMsg","Skeleton","Tree","obj","Button","INFRASPECIFIC_RANKS","ColTreeWrapper","citation","getDataset","onExpandedTaxonKeyChange","showTreeOptions","linkToSpeciesPage","handleSelectName","name","navigateToTaxon","_b","handleResetSearch","Citation","Row","Col","NameAutocomplete","Checkbox","checked","writeSetting","ref","setAuth","readSetting","RouterContext","auth","routerProps","buildRouter","withTheme","withDatasetKey","colTree"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "col-browser",
3
- "version": "2.3.9",
3
+ "version": "2.3.10",
4
4
  "description": "Catalogue of Life browse and search React components",
5
5
  "main": "umd/col-browser.js",
6
6
  "module": "es/index.js",
@@ -68527,6 +68527,9 @@ html body {
68527
68527
  );
68528
68528
  };
68529
68529
  const CHILD_PAGE_SIZE = 1e3;
68530
+ const LOAD_MORE_PREFIX = "__loadMoreBTN__";
68531
+ const loadMoreKey = (parentKey) => `${LOAD_MORE_PREFIX}${parentKey}`;
68532
+ const isLoadMoreKey = (key2) => typeof key2 === "string" && key2.startsWith(LOAD_MORE_PREFIX);
68530
68533
  class LoadMoreChildrenTreeNode extends React.Component {
68531
68534
  constructor(props) {
68532
68535
  super(props);
@@ -68580,7 +68583,14 @@ html body {
68580
68583
  },
68581
68584
  this.loadRoot
68582
68585
  ));
68583
- __publicField(this, "loadRoot", async () => {
68586
+ // `append` is only set by the "Load more" button, which pages in the next
68587
+ // batch of root taxa; every other caller loads page one from scratch.
68588
+ // Each call takes a request id and a response is merged only while its id is
68589
+ // still the current one. Without that, two overlapping loads — React
68590
+ // StrictMode's double mount in dev, or a prop change while a load is in
68591
+ // flight — both merged their page into treeData, so every root appeared
68592
+ // twice and antd warned "Same 'key' exist in the Tree" (issue #59).
68593
+ __publicField(this, "loadRoot", async (append2 = false) => {
68584
68594
  const {
68585
68595
  showSourceTaxon,
68586
68596
  datasetKey,
@@ -68591,10 +68601,15 @@ html body {
68591
68601
  } = this.props;
68592
68602
  const defaultExpandKey = expandedTaxonKey;
68593
68603
  const { defaultTaxonKey } = this.props;
68594
- this.setState({ rootLoading: true, treeData: [] });
68604
+ const requestId = ++this.rootRequestId;
68605
+ const offset2 = append2 ? this.state.treeData.length : 0;
68606
+ this.setState(
68607
+ append2 ? { rootLoading: true } : { rootLoading: true, treeData: [] }
68608
+ );
68595
68609
  return client(
68596
- `${config.dataApi}dataset/${datasetKey}/tree?projectKey=${datasetKey}${type2 ? "&type=" + type2 : ""}&limit=${CHILD_PAGE_SIZE}&offset=${this.state.treeData.length}${hideExtinct ? `&extinct=false&extinct=` : ""}${insertPlaceholder ? "&insertPlaceholder=true" : ""}`
68610
+ `${config.dataApi}dataset/${datasetKey}/tree?projectKey=${datasetKey}${type2 ? "&type=" + type2 : ""}&limit=${CHILD_PAGE_SIZE}&offset=${offset2}${hideExtinct ? `&extinct=false&extinct=` : ""}${insertPlaceholder ? "&insertPlaceholder=true" : ""}`
68597
68611
  ).then(this.decorateWithSectorsAndDataset).then((res) => {
68612
+ if (requestId !== this.rootRequestId) return;
68598
68613
  const mainTreeData = res.data.result || [];
68599
68614
  const rootTotal = res.data.total;
68600
68615
  const treeData = mainTreeData.map((tx) => {
@@ -68620,16 +68635,16 @@ html body {
68620
68635
  return dataRef;
68621
68636
  });
68622
68637
  this.setState(
68623
- {
68638
+ (prevState) => ({
68624
68639
  rootTotal,
68625
68640
  rootLoading: false,
68626
- treeData: [...this.state.treeData, ...treeData],
68641
+ treeData: append2 ? [...prevState.treeData, ...treeData] : treeData,
68627
68642
  // Nothing is auto-expanded by default. Consumers open a specific root
68628
68643
  // (or deep taxon) by passing `defaultTaxonKey`/`expandedTaxonKey` —
68629
68644
  // e.g. defaultTaxonKey="CS5HF" opens Eukaryota in current COL releases.
68630
68645
  expandedKeys: [],
68631
68646
  error: null
68632
- },
68647
+ }),
68633
68648
  () => {
68634
68649
  if (defaultExpandKey) {
68635
68650
  return this.expandToTaxon(defaultExpandKey);
@@ -68642,6 +68657,7 @@ html body {
68642
68657
  this.fetchChildPage(treeData[treeData.length - 1]);
68643
68658
  }
68644
68659
  }).catch((err) => {
68660
+ if (requestId !== this.rootRequestId) return;
68645
68661
  this.setState({
68646
68662
  treeData: [],
68647
68663
  rootLoading: false,
@@ -68778,7 +68794,7 @@ html body {
68778
68794
  if (!res.data.last) {
68779
68795
  const loadMoreFn = () => {
68780
68796
  dataRef.childOffset += CHILD_PAGE_SIZE;
68781
- if (dataRef.children[dataRef.children.length - 1].key === "__loadMoreBTN__") {
68797
+ if (isLoadMoreKey(get(dataRef.children[dataRef.children.length - 1], "key"))) {
68782
68798
  dataRef.children = dataRef.children.slice(0, -1);
68783
68799
  }
68784
68800
  return this.fetchChildPage(dataRef, false);
@@ -68791,9 +68807,9 @@ html body {
68791
68807
  {
68792
68808
  onClick: loadMoreFn
68793
68809
  },
68794
- "__loadMoreBTN__"
68810
+ loadMoreKey(dataRef.key)
68795
68811
  ),
68796
- key: "__loadMoreBTN__",
68812
+ key: loadMoreKey(dataRef.key),
68797
68813
  childCount: 0,
68798
68814
  isLeaf: true
68799
68815
  }
@@ -68845,7 +68861,7 @@ html body {
68845
68861
  let node2;
68846
68862
  while (!node2 && parentNode.children.length < parentNode.childCount) {
68847
68863
  parentNode.childOffset += CHILD_PAGE_SIZE;
68848
- if (parentNode.children[parentNode.children.length - 1].key === "__loadMoreBTN__") {
68864
+ if (isLoadMoreKey(get(parentNode.children[parentNode.children.length - 1], "key"))) {
68849
68865
  parentNode.children = parentNode.children.slice(0, -1);
68850
68866
  }
68851
68867
  await this.fetchChildPage(parentNode, false, true);
@@ -68961,6 +68977,7 @@ html body {
68961
68977
  rank: []
68962
68978
  };
68963
68979
  this.treeRef = React.createRef();
68980
+ this.rootRequestId = 0;
68964
68981
  }
68965
68982
  // datasetLoader comes from the shared TreeCacheContext so multiple tree
68966
68983
  // nodes (and TaxonSources instances) share one in-memory cache instead
@@ -69041,7 +69058,7 @@ html body {
69041
69058
  }
69042
69059
  }
69043
69060
  ),
69044
- !error && treeData.length < rootTotal && /* @__PURE__ */ jsxRuntimeExports.jsxs(Button$1, { loading: rootLoading, onClick: this.loadRoot, children: [
69061
+ !error && treeData.length < rootTotal && /* @__PURE__ */ jsxRuntimeExports.jsxs(Button$1, { loading: rootLoading, onClick: () => this.loadRoot(true), children: [
69045
69062
  "Load more",
69046
69063
  " "
69047
69064
  ] })