col-browser 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 &#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\";\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: false,\n showInfo: 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 onChange={({ target: { checked } }) => {\n this.setState({ showInfo: checked });\n }}\n >\n Source\n </Checkbox>\n\n <Checkbox\n defaultChecked={false}\n onChange={({ target: { checked } }) => {\n this.setState({ hideExtinct: 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","ref","setAuth","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 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 &#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","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "col-browser",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Catalogue of Life browse and search React components",
5
5
  "main": "umd/col-browser.js",
6
6
  "module": "es/index.js",
package/types/index.d.ts CHANGED
@@ -112,6 +112,8 @@ export interface TaxonBreakdownProps extends ThemeProps, NavigationProps {
112
112
  /** Breakdown depth. Defaults to 1. */
113
113
  level?: number;
114
114
  showLevelSwitch?: boolean;
115
+ /** HTTP Basic Auth credentials in `user:password` form. */
116
+ auth?: string;
115
117
  }
116
118
 
117
119
  export interface TaxonDistributionProps extends ThemeProps, NavigationProps {
@@ -119,6 +121,8 @@ export interface TaxonDistributionProps extends ThemeProps, NavigationProps {
119
121
  datasetKey?: string | number;
120
122
  gbifChecklistKey?: string | number;
121
123
  style?: React.CSSProperties;
124
+ /** HTTP Basic Auth credentials in `user:password` form. */
125
+ auth?: string;
122
126
  }
123
127
 
124
128
  export const Tree: React.FC<TreeProps>;
@@ -69613,6 +69613,21 @@ html body {
69613
69613
  ] })
69614
69614
  ] });
69615
69615
  };
69616
+ const PREFIX = "col-browser:";
69617
+ function readSetting(key2, fallback) {
69618
+ try {
69619
+ const raw = window.localStorage.getItem(PREFIX + key2);
69620
+ return raw === null ? fallback : JSON.parse(raw);
69621
+ } catch {
69622
+ return fallback;
69623
+ }
69624
+ }
69625
+ function writeSetting(key2, value) {
69626
+ try {
69627
+ window.localStorage.setItem(PREFIX + key2, JSON.stringify(value));
69628
+ } catch {
69629
+ }
69630
+ }
69616
69631
  const INFRASPECIFIC_RANKS$1 = [
69617
69632
  "infraspecific name",
69618
69633
  "species",
@@ -69684,8 +69699,10 @@ html body {
69684
69699
  /* @__PURE__ */ jsxRuntimeExports.jsx(
69685
69700
  Checkbox,
69686
69701
  {
69702
+ defaultChecked: this.state.showInfo,
69687
69703
  onChange: ({ target: { checked } }) => {
69688
69704
  this.setState({ showInfo: checked });
69705
+ writeSetting("tree-show-source", checked);
69689
69706
  },
69690
69707
  children: "Source"
69691
69708
  }
@@ -69693,9 +69710,10 @@ html body {
69693
69710
  /* @__PURE__ */ jsxRuntimeExports.jsx(
69694
69711
  Checkbox,
69695
69712
  {
69696
- defaultChecked: false,
69713
+ defaultChecked: this.state.hideExtinct,
69697
69714
  onChange: ({ target: { checked } }) => {
69698
69715
  this.setState({ hideExtinct: checked });
69716
+ writeSetting("tree-extant-only", checked);
69699
69717
  },
69700
69718
  children: "Extant only"
69701
69719
  }
@@ -69721,8 +69739,8 @@ html body {
69721
69739
  });
69722
69740
  setAuth(this.props.auth);
69723
69741
  this.state = {
69724
- hideExtinct: false,
69725
- showInfo: false,
69742
+ hideExtinct: readSetting("tree-extant-only", false),
69743
+ showInfo: readSetting("tree-show-source", false),
69726
69744
  dataset: null
69727
69745
  };
69728
69746
  this.cache = createTreeCache(this.props.datasetKey);
@@ -70651,6 +70669,7 @@ html body {
70651
70669
  this.getDatasets.cancel();
70652
70670
  }
70653
70671
  }
70672
+ const CONTENT_TYPE_KEY = "search-content-type";
70654
70673
  const FormItem = Form.Item;
70655
70674
  const RadioGroup = Radio.Group;
70656
70675
  const FACET_VOCAB = [
@@ -70781,8 +70800,12 @@ html body {
70781
70800
  params.TAXON_ID = defaultTaxonKey;
70782
70801
  }
70783
70802
  if (isEmpty(params)) {
70784
- params = defaultParams;
70785
- this.pushParams(defaultParams);
70803
+ params = { ...defaultParams };
70804
+ const storedContentType = readSetting(CONTENT_TYPE_KEY, void 0);
70805
+ if (storedContentType !== void 0 && storedContentType !== null) {
70806
+ params.sectorMode = storedContentType;
70807
+ }
70808
+ this.pushParams(params);
70786
70809
  } else if (!params.facet) {
70787
70810
  params.facet = FACET_VOCAB;
70788
70811
  }
@@ -70856,6 +70879,7 @@ html body {
70856
70879
  this.setState({ params: query }, () => this.pushParams(query));
70857
70880
  });
70858
70881
  __publicField(this, "updateSearch", (params) => {
70882
+ if ("sectorMode" in params) writeSetting(CONTENT_TYPE_KEY, params.sectorMode);
70859
70883
  let newParams = { ...this.state.params, offset: 0, limit: 50 };
70860
70884
  forEach(params, (v2, k) => {
70861
70885
  newParams[k] = v2;
@@ -78025,25 +78049,9 @@ html body {
78025
78049
  return k == null ? MISSING_COLOR : ESTABLISHMENT_COLORS[k];
78026
78050
  };
78027
78051
  const POSITRON_STYLE = "https://basemaps.cartocdn.com/gl/positron-gl-style/style.json";
78028
- const GBIF_VISIBLE_STORAGE_KEY = "col-browser:gbif-visible";
78029
- const readStoredGbifVisible = (defaultValue) => {
78030
- try {
78031
- const v2 = window.sessionStorage.getItem(GBIF_VISIBLE_STORAGE_KEY);
78032
- if (v2 === "true") return true;
78033
- if (v2 === "false") return false;
78034
- } catch {
78035
- }
78036
- return defaultValue;
78037
- };
78038
- const writeStoredGbifVisible = (visible) => {
78039
- try {
78040
- window.sessionStorage.setItem(
78041
- GBIF_VISIBLE_STORAGE_KEY,
78042
- visible ? "true" : "false"
78043
- );
78044
- } catch {
78045
- }
78046
- };
78052
+ const GBIF_VISIBLE_KEY = "gbif-visible";
78053
+ const readStoredGbifVisible = (defaultValue) => readSetting(GBIF_VISIBLE_KEY, defaultValue);
78054
+ const writeStoredGbifVisible = (visible) => writeSetting(GBIF_VISIBLE_KEY, visible);
78047
78055
  const GBIF_TILE_PATH = "/v2/map/occurrence/density/{z}/{x}/{y}@1x.png?srs=EPSG%3A3857&style=iNaturalist.poly&bin=hex&hexPerTile=64&hasCoordinate=true&hasGeospatialIssue=false&occurrenceStatus=PRESENT&checklistKey={checklistKey}&taxonKey={taxonKey}";
78048
78056
  const FOCAL_SOURCE = "col-focal-distributions";
78049
78057
  const FOCAL_FILL = "col-focal-fill";
@@ -78175,7 +78183,7 @@ html body {
78175
78183
  const [focalVisible, setFocalVisible] = reactExports.useState(true);
78176
78184
  const isGbifOnly = !!gbifChecklistKey && (!records || records.length === 0);
78177
78185
  const [gbifVisible, setGbifVisible] = reactExports.useState(
78178
- () => isGbifOnly ? true : readStoredGbifVisible(true)
78186
+ () => readStoredGbifVisible(true)
78179
78187
  );
78180
78188
  const [visibleTaxonIds, setVisibleTaxonIds] = reactExports.useState(/* @__PURE__ */ new Set());
78181
78189
  const [controlOpen, setControlOpen] = reactExports.useState(false);
@@ -78183,10 +78191,14 @@ html body {
78183
78191
  const handleToggleGbif = () => {
78184
78192
  setGbifVisible((v2) => {
78185
78193
  const next2 = !v2;
78186
- if (!isGbifOnly) writeStoredGbifVisible(next2);
78194
+ writeStoredGbifVisible(next2);
78187
78195
  return next2;
78188
78196
  });
78189
78197
  };
78198
+ const activateGbif = () => {
78199
+ setGbifVisible(true);
78200
+ writeStoredGbifVisible(true);
78201
+ };
78190
78202
  const presentMeans = reactExports.useMemo(() => {
78191
78203
  if (!(records == null ? void 0 : records.length)) return [];
78192
78204
  const seen = /* @__PURE__ */ new Set();
@@ -78603,6 +78615,44 @@ html body {
78603
78615
  }
78604
78616
  );
78605
78617
  }
78618
+ if (isGbifOnly && !gbifVisible) {
78619
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
78620
+ "div",
78621
+ {
78622
+ className: "col-distributions-map col-distributions-map--collapsed",
78623
+ style: {
78624
+ display: "flex",
78625
+ alignItems: "center",
78626
+ gap: 6,
78627
+ padding: "8px 12px",
78628
+ background: "#fafafa",
78629
+ border: "1px solid #eee",
78630
+ borderRadius: 4,
78631
+ color: "#666",
78632
+ fontSize: 12
78633
+ },
78634
+ children: [
78635
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "No curated distribution data." }),
78636
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
78637
+ "a",
78638
+ {
78639
+ role: "button",
78640
+ tabIndex: 0,
78641
+ style: { cursor: "pointer" },
78642
+ onClick: activateGbif,
78643
+ onKeyDown: (e2) => {
78644
+ if (e2.key === "Enter" || e2.key === " ") {
78645
+ e2.preventDefault();
78646
+ activateGbif();
78647
+ }
78648
+ },
78649
+ children: "Show GBIF occurrences"
78650
+ }
78651
+ )
78652
+ ]
78653
+ }
78654
+ );
78655
+ }
78606
78656
  const focalName = ((_a2 = focalTaxon == null ? void 0 : focalTaxon.name) == null ? void 0 : _a2.scientificName) || "This taxon";
78607
78657
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "col-distributions-map", style: { position: "relative" }, children: [
78608
78658
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -86546,6 +86596,7 @@ html body {
86546
86596
  }
86547
86597
  var highchartsReact_minExports = requireHighchartsReact_min();
86548
86598
  const HighchartsReact = /* @__PURE__ */ getDefaultExportFromCjs(highchartsReact_minExports);
86599
+ const BREAKDOWN_LEVEL_KEY = "breakdown-level";
86549
86600
  const MAX_SLICES_PER_RING = 100;
86550
86601
  const canonicalRanks = [
86551
86602
  "kingdom",
@@ -86588,10 +86639,15 @@ html body {
86588
86639
  const [options, setOptions] = reactExports.useState(null);
86589
86640
  const [loading, setLoading] = reactExports.useState(false);
86590
86641
  const [invalid, setInvalid] = reactExports.useState(false);
86591
- const [activeLevel, setActiveLevel] = reactExports.useState(level);
86642
+ const [activeLevel, setActiveLevel] = reactExports.useState(
86643
+ () => showLevelSwitch ? readSetting(BREAKDOWN_LEVEL_KEY, level) : level
86644
+ );
86645
+ reactExports.useEffect(() => {
86646
+ if (!showLevelSwitch) setActiveLevel(level);
86647
+ }, [level, showLevelSwitch]);
86592
86648
  reactExports.useEffect(() => {
86593
- setActiveLevel(level);
86594
- }, [level]);
86649
+ if (showLevelSwitch) writeSetting(BREAKDOWN_LEVEL_KEY, activeLevel);
86650
+ }, [activeLevel, showLevelSwitch]);
86595
86651
  reactExports.useEffect(() => {
86596
86652
  if ((taxon == null ? void 0 : taxon.id) && datasetKey) {
86597
86653
  getData();
@@ -89713,8 +89769,10 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
89713
89769
  level = 1,
89714
89770
  showLevelSwitch = false,
89715
89771
  darkMode,
89772
+ auth,
89716
89773
  ...routerProps
89717
89774
  }) => {
89775
+ setAuth(auth);
89718
89776
  const [taxon, setTaxon] = reactExports.useState(null);
89719
89777
  const [dataset, setDataset] = reactExports.useState(null);
89720
89778
  const [rank, setRank] = reactExports.useState([]);
@@ -89753,8 +89811,10 @@ Please report this to https://github.com/markedjs/marked.`, e2) {
89753
89811
  datasetKey,
89754
89812
  gbifChecklistKey,
89755
89813
  style: style2,
89814
+ auth,
89756
89815
  ...routerProps
89757
89816
  }) => {
89817
+ setAuth(auth);
89758
89818
  const [taxon, setTaxon] = reactExports.useState(null);
89759
89819
  const [distributions, setDistributions] = reactExports.useState(null);
89760
89820
  const [rank, setRank] = reactExports.useState([]);