{"version":3,"file":"main.a2a2528f8fdc5b5df8fa.bundle.js","mappings":"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","sources":["webpack://nas-trt-frontend/./src/paths.js","webpack://nas-trt-frontend/./src/Container.js","webpack://nas-trt-frontend/./src/browse/alphaOptions.js","webpack://nas-trt-frontend/./src/utils.js","webpack://nas-trt-frontend/./src/TermLink.js","webpack://nas-trt-frontend/./src/browse/Alphabetical.js","webpack://nas-trt-frontend/./src/SidebarContainer.js","webpack://nas-trt-frontend/./src/browse/ResultTree.js","webpack://nas-trt-frontend/./src/browse/Hierarchical.js","webpack://nas-trt-frontend/./src/browse/Browse.js","webpack://nas-trt-frontend/./src/Search.js","webpack://nas-trt-frontend/./src/FormElements.js","webpack://nas-trt-frontend/./src/StatusMessage.js","webpack://nas-trt-frontend/./src/Contact.js","webpack://nas-trt-frontend/./src/HotTopics.js","webpack://nas-trt-frontend/./src/Header.js","webpack://nas-trt-frontend/./src/RecentlyAdded.js","webpack://nas-trt-frontend/./src/Footer.js","webpack://nas-trt-frontend/./src/download/Select.js","webpack://nas-trt-frontend/./src/download/formats.js","webpack://nas-trt-frontend/./src/download/months.js","webpack://nas-trt-frontend/./src/download/SortableTable.js","webpack://nas-trt-frontend/./src/download/ViewResults.js","webpack://nas-trt-frontend/./src/download/DownloadArea.js","webpack://nas-trt-frontend/./src/TermDetail.js","webpack://nas-trt-frontend/./src/BreadcrumbBar.js","webpack://nas-trt-frontend/./src/AddToRecordButton.js","webpack://nas-trt-frontend/./src/TermDisplay.js","webpack://nas-trt-frontend/./src/SearchResults.js","webpack://nas-trt-frontend/./src/EmbeddableView.js","webpack://nas-trt-frontend/./src/TermSuggestion.js","webpack://nas-trt-frontend/./src/HowToUse.js","webpack://nas-trt-frontend/./src/AboutTRT.js","webpack://nas-trt-frontend/./src/Resources.js","webpack://nas-trt-frontend/./src/Home.js","webpack://nas-trt-frontend/./src/App.js","webpack://nas-trt-frontend/./src/style.css?7163","webpack://nas-trt-frontend/./src/index.js","webpack://nas-trt-frontend/./src/nonce.js","webpack://nas-trt-frontend/./src/style.css"],"sourcesContent":["const paths = {\r\n home: \"/\",\r\n hotTopicTerms: \"/hot-topic-terms\",\r\n howToUse: \"/how-to-use\",\r\n suggestTerms: \"/suggest-terms\",\r\n contactTrb: \"/contact\",\r\n download: \"/download\",\r\n embed: \"/embed\",\r\n about: \"/about-the-trt\",\r\n};\r\n\r\nObject.freeze(paths);\r\n\r\nexport default paths;\r\n","import styled from \"styled-components\";\r\n\r\nconst Container = styled.div`\r\n width: 100%;\r\n margin-right: auto;\r\n margin-left: auto;\r\n }\r\n @media (min-width: 576px) {\r\n max-width: 540px;\r\n }\r\n @media (min-width: 768px) {\r\n max-width: 720px;\r\n }\r\n @media (min-width: 992px) {\r\n max-width: 960px;\r\n }\r\n @media (min-width: 1200px) {\r\n max-width: 1140px;\r\n }\r\n @media (min-width: 1400px) {\r\n max-width: 1320px;\r\n }\r\n`;\r\n\r\nexport default Container;\r\n","const alphaOptions = [\r\n \"#\",\r\n \"A\",\r\n \"B\",\r\n \"C\",\r\n \"D\",\r\n \"E\",\r\n \"F\",\r\n \"G\",\r\n \"H\",\r\n \"I\",\r\n \"J\",\r\n \"K\",\r\n \"L\",\r\n \"M\",\r\n \"N\",\r\n \"O\",\r\n \"P\",\r\n \"Q\",\r\n \"R\",\r\n \"S\",\r\n \"T\",\r\n \"U\",\r\n \"V\",\r\n \"W\",\r\n \"XYZ\",\r\n];\r\n\r\nObject.freeze(alphaOptions);\r\n\r\nexport default alphaOptions;\r\n","import { useState } from \"react\";\r\n\r\nfunction extractTermId(uri) {\r\n return new URL(uri).pathname.split(\"/\")[2];\r\n}\r\n\r\nfunction useInput() {\r\n const [value, setValue] = useState(\"\");\r\n\r\n function handleChange(event) {\r\n setValue(event.target.value);\r\n }\r\n return [value, handleChange];\r\n}\r\n\r\nexport { extractTermId, useInput };\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { NavLink } from \"react-router-dom\";\r\nimport styled from \"styled-components\";\r\nimport { extractTermId } from \"./utils\";\r\n\r\nconst Link = styled.a`\r\n color: var(--color-academies-blue);\r\n :visited {\r\n color: var(--color-academies-blue);\r\n }\r\n &.active {\r\n font-weight: bold;\r\n }\r\n`;\r\n\r\nfunction TermLink(props) {\r\n const { uri, label, setEmbeddedTermUri } = props;\r\n\r\n if (setEmbeddedTermUri) {\r\n return (\r\n {\r\n e.preventDefault();\r\n setEmbeddedTermUri(uri);\r\n }}\r\n >\r\n {label}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {label}\r\n \r\n );\r\n}\r\n\r\nTermLink.propTypes = {\r\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired,\r\n uri: PropTypes.string.isRequired,\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nTermLink.defaultProps = {\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default TermLink;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\nimport alphaOptions from \"./alphaOptions\";\r\nimport TermLink from \"../TermLink\";\r\n\r\nconst AlphaList = styled.ul`\r\n display: flex;\r\n list-style: none;\r\n margin: 0;\r\n padding-inline-start: 0;\r\n padding: 0.5rem 1rem;\r\n flex-wrap: wrap;\r\n justify-content: center;\r\n align-content: stretch;\r\n column-gap: 0.25rem;\r\n\r\n button {\r\n padding: 0.5rem;\r\n margin: 0;\r\n background: none;\r\n border: none;\r\n &.active {\r\n color: var(--color-academies-blue);\r\n font-weight: bold;\r\n }\r\n &:hover {\r\n color: var(--color-academies-blue);\r\n cursor: pointer;\r\n }\r\n font-size: var(--type-size-medium);\r\n }\r\n`;\r\n\r\nconst TermList = styled.ul`\r\n margin: unset;\r\n padding-left: 1.5rem;\r\n overflow-y: auto;\r\n list-style: none;\r\n border-top: 2px solid rgba(150, 150, 150, 0.5);\r\n ::-webkit-scrollbar {\r\n width: 15px;\r\n }\r\n ::-webkit-scrollbar-track {\r\n background: rgba(196, 196, 196, 0.25);\r\n }\r\n ::-webkit-scrollbar-thumb {\r\n background: #c4c4c4;\r\n border-radius: 2px;\r\n }\r\n ::-webkit-scrollbar-thumb:hover {\r\n background: #848484;\r\n }\r\n\r\n li {\r\n padding: 0.25rem 0;\r\n @media (max-width: 768px) {\r\n padding: 0.5rem 0;\r\n }\r\n > em {\r\n color: grey;\r\n padding-left: 1rem;\r\n }\r\n }\r\n`;\r\n\r\nfunction Alphabetical(props) {\r\n const { setEmbeddedTermUri } = props;\r\n const [alphaInput, setAlphaInput] = useState(\"A\");\r\n const [concepts, setConcepts] = useState([]);\r\n const [loading, setLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n setConcepts([]);\r\n setLoading(true);\r\n const url = `/api/getConceptsByInput?${new URLSearchParams({\r\n input: alphaInput.split(\"\").join(\"|\"),\r\n })}`;\r\n fetch(url)\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n setLoading(false);\r\n setConcepts(\r\n data.sort((a, b) =>\r\n a.label.toLowerCase() > b.label.toLowerCase() ? 1 : -1\r\n )\r\n );\r\n });\r\n }, [alphaInput]);\r\n\r\n return (\r\n <>\r\n \r\n {alphaOptions.map((option) => (\r\n
  • \r\n setAlphaInput(option)}\r\n >\r\n {option}\r\n \r\n
  • \r\n ))}\r\n
    \r\n \r\n {loading ? (\r\n Loading...\r\n ) : (\r\n concepts.map((concept) => (\r\n
  • \r\n \r\n {concept.useFor && Use {concept.useFor} }\r\n
  • \r\n ))\r\n )}\r\n
    \r\n \r\n );\r\n}\r\n\r\nAlphabetical.propTypes = {\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nAlphabetical.defaultProps = {\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default Alphabetical;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\n\r\nconst ContainerDiv = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n border: 0.75px solid var(--color-ocean-blue);\r\n background: rgba(244, 244, 244, 0.15);\r\n margin-bottom: 2rem;\r\n height: ${(p) => p.height};\r\n`;\r\n\r\nconst Header = styled.div`\r\n color: white;\r\n font-size: var(--type-size-larger);\r\n padding: 0.5rem;\r\n background-color: var(--color-ocean-blue);\r\n display: inline-flex;\r\n\r\n span {\r\n padding: 0 0.5rem;\r\n }\r\n\r\n svg {\r\n height: 1.5rem;\r\n width: 1.5rem;\r\n color: white;\r\n }\r\n`;\r\n\r\nfunction SidebarContainer(props) {\r\n const { height, children, HeaderIcon, headerText } = props;\r\n return (\r\n \r\n
    \r\n {headerText} \r\n \r\n
    \r\n {children}\r\n
    \r\n );\r\n}\r\n\r\nSidebarContainer.propTypes = {\r\n headerText: PropTypes.string.isRequired,\r\n HeaderIcon: PropTypes.func.isRequired,\r\n children: PropTypes.element.isRequired,\r\n height: PropTypes.string,\r\n};\r\n\r\nSidebarContainer.defaultProps = {\r\n height: null,\r\n};\r\n\r\nexport default SidebarContainer;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\nimport { FaCaretSquareUp, FaCaretSquareDown } from \"react-icons/fa\";\r\nimport TermLink from \"../TermLink\";\r\n\r\nconst ChildList = styled.ul`\r\n list-style: none;\r\n padding-inline-start: 0.75rem;\r\n margin: 0;\r\n\r\n li {\r\n padding: 0.25rem 0;\r\n }\r\n\r\n .child-terms {\r\n border-left: 1px solid var(--color-grey-background);\r\n }\r\n\r\n @media (max-width: 768px) {\r\n li {\r\n padding: 0.5rem 0;\r\n }\r\n }\r\n`;\r\n\r\nconst Term = styled.div`\r\n display: flex;\r\n min-height: 1.5rem;\r\n align-items: stretch;\r\n\r\n svg {\r\n height: 1.25rem;\r\n width: 1.25rem;\r\n }\r\n .num-narrowers {\r\n color: grey;\r\n }\r\n`;\r\n\r\nconst ExpandButton = styled.button`\r\n background: none;\r\n border: none;\r\n margin: 0;\r\n padding-left: 0.25rem;\r\n`;\r\n\r\nfunction ResultTree(props) {\r\n const { uri, label, narrowers, setEmbeddedTermUri } = props;\r\n const isTopTerms = label === \"Top Terms\";\r\n\r\n const [expanded, setExpanded] = useState(isTopTerms);\r\n const [loading, setLoading] = useState(false);\r\n const [children, setChildren] = useState([]);\r\n\r\n useEffect(() => {\r\n if (expanded && !children.length) {\r\n setLoading(true);\r\n const url = `/api/getChildConcepts${\r\n !isTopTerms ? `?${new URLSearchParams({ uri })}` : \"\"\r\n }`;\r\n fetch(url)\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n setLoading(false);\r\n setChildren(\r\n data.sort((a, b) =>\r\n a.prefLabel.toLowerCase() > b.prefLabel.toLowerCase() ? 1 : -1\r\n )\r\n );\r\n });\r\n }\r\n }, [expanded]);\r\n\r\n return (\r\n <>\r\n {!isTopTerms && (\r\n \r\n \r\n \r\n  \r\n {narrowers.length ? (\r\n ({narrowers.length})\r\n ) : null}\r\n \r\n {narrowers.length ? (\r\n setExpanded(!expanded)}>\r\n {expanded ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n ) : null}\r\n \r\n )}\r\n\r\n \r\n {loading &&
  • Loading child concepts...
  • }\r\n {expanded &&\r\n children.map((concept) => (\r\n
  • \r\n \r\n
  • \r\n ))}\r\n
    \r\n \r\n );\r\n}\r\n\r\nResultTree.propTypes = {\r\n uri: PropTypes.string,\r\n label: PropTypes.string.isRequired,\r\n narrowers: PropTypes.arrayOf(PropTypes.string),\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nResultTree.defaultProps = {\r\n uri: null,\r\n narrowers: [],\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default ResultTree;\r\n","import React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport PropTypes from \"prop-types\";\r\nimport ResultTree from \"./ResultTree\";\r\n\r\nconst Container = styled.div`\r\n overflow: auto;\r\n padding: 0.5rem;\r\n`;\r\n\r\nfunction Hierarchical(props) {\r\n const { setEmbeddedTermUri } = props;\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nHierarchical.propTypes = {\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nHierarchical.defaultProps = {\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default Hierarchical;\r\n","import React, { useState } from \"react\";\r\nimport styled from \"styled-components\";\r\nimport { BsEye } from \"react-icons/bs\";\r\nimport PropTypes from \"prop-types\";\r\nimport Alphabetical from \"./Alphabetical\";\r\nimport SidebarContainer from \"../SidebarContainer\";\r\nimport Hierarchical from \"./Hierarchical\";\r\n\r\nconst Tabs = styled.ul`\r\n display: flex;\r\n list-style: none;\r\n flex-wrap: wrap;\r\n padding-inline-start: 0;\r\n margin: initial;\r\n border-bottom: 0.75px solid #707070;\r\n li {\r\n flex: 1;\r\n box-sizing: border-box;\r\n border-left: 0.75px solid #707070;\r\n padding: 1rem;\r\n background: #becccf;\r\n &.current {\r\n background: white;\r\n }\r\n button {\r\n font-size: var(--type-size-medium);\r\n font-weight: bold;\r\n background: none;\r\n border: none;\r\n margin: 0;\r\n padding: 0;\r\n width: 100%;\r\n text-align: left;\r\n }\r\n }\r\n\r\n li:first-child {\r\n border-left: none;\r\n }\r\n`;\r\n\r\nfunction Browse(props) {\r\n const { setEmbeddedTermUri } = props;\r\n const views = [\"Hierarchical\", \"Alphabetical\"];\r\n const [currentView, setCurrentView] = useState(views[0]);\r\n const selectView = (view) => {\r\n switch (view) {\r\n case \"Alphabetical\":\r\n return ;\r\n case \"Hierarchical\":\r\n return ;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n \r\n <>\r\n \r\n {views.map((view) => (\r\n
  • \r\n setCurrentView(view)}\r\n >\r\n {view}\r\n \r\n
  • \r\n ))}\r\n
    \r\n {selectView(currentView)}\r\n \r\n
    \r\n );\r\n}\r\n\r\nBrowse.propTypes = {\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nBrowse.defaultProps = {\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default Browse;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\nimport { BsSearch } from \"react-icons/bs\";\r\nimport { extractTermId } from \"./utils\";\r\nimport SidebarContainer from \"./SidebarContainer\";\r\n\r\nconst SearchContainer = styled.div`\r\n padding: 0.5rem;\r\n box-sizing: border-box;\r\n`;\r\n\r\nconst SearchBox = styled.div`\r\n padding: 0.25rem;\r\n border: 1px solid #c4c4c4;\r\n form {\r\n display: flex;\r\n }\r\n\r\n input[type=\"search\"] {\r\n width: 100%;\r\n padding: 0.75rem;\r\n border: none;\r\n font-size: var(--type-size-medium);\r\n ::placeholder {\r\n position: relative;\r\n font-style: italic;\r\n color: #999999;\r\n font-size: var(--type-size-smaller);\r\n }\r\n :focus {\r\n outline: 2px solid var(--color-academies-blue);\r\n }\r\n }\r\n\r\n button[type=\"submit\"] {\r\n border: none;\r\n color: white;\r\n background-color: var(--color-academies-blue);\r\n width: 2.5rem;\r\n padding: 0;\r\n outline: 2px solid var(--color-academies-blue);\r\n }\r\n\r\n svg {\r\n height: 1rem;\r\n width: 1rem;\r\n }\r\n`;\r\n\r\nconst ResultsBox = styled.div`\r\n position: relative;\r\n ul {\r\n background-color: rgba(244, 244, 244);\r\n box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16);\r\n margin: 0;\r\n display: block;\r\n list-style: none;\r\n position: absolute;\r\n padding-inline-start: 0;\r\n width: 100%;\r\n }\r\n\r\n li {\r\n padding: 0.5rem;\r\n &:hover {\r\n background-color: #e5e5e5;\r\n }\r\n &.selected {\r\n background: #e5e5e5;\r\n }\r\n > span {\r\n font-style: italic;\r\n color: grey;\r\n }\r\n > span > em {\r\n background-color: var(--color-nas-gold);\r\n }\r\n user-select: none;\r\n }\r\n`;\r\n\r\nconst numResults = 5;\r\nconst minSearchTermChars = 3;\r\n\r\nfunction Search(props) {\r\n const { setEmbeddedTermUri, setEmbeddedSearchTerm } = props;\r\n\r\n const [searchTerm, setSearchTerm] = useState(\"\");\r\n const [results, setResults] = useState([]);\r\n const [stateMessage, setStateMessage] = useState(\"\");\r\n const [searchActive, setSearchActive] = useState(false);\r\n const [resultClicked, setResultClicked] = useState(false);\r\n const [selectedIndex, setSelectedIndex] = useState(-1);\r\n const history = useHistory();\r\n\r\n const params = new URLSearchParams(useLocation().search);\r\n const paramsTerm = params.get(\"term\");\r\n\r\n useEffect(() => {\r\n let isSubscribed = true;\r\n const queryContainsBoolean = !!searchTerm\r\n .split(\" \")\r\n .filter((token) => [\"AND\", \"OR\"].includes(token)).length;\r\n\r\n if (queryContainsBoolean) {\r\n setStateMessage(\r\n \"To see results for an AND/OR query, click the search icon or press Enter.\"\r\n );\r\n setResults([]);\r\n } else if (searchActive && searchTerm.length >= minSearchTermChars) {\r\n const url = `/api/getAutocompleteResults?${new URLSearchParams({\r\n text: searchTerm,\r\n numResults,\r\n })}`;\r\n setStateMessage(\"Loading...\");\r\n setResults([]);\r\n fetch(url)\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n if (isSubscribed) {\r\n const exactMatches = data.filter(\r\n (result) => result.label.toLowerCase() === searchTerm\r\n );\r\n const otherResults = data\r\n .filter((result) => !exactMatches.includes(result))\r\n .sort((a, b) =>\r\n a.label.toLowerCase() > b.label.toLowerCase() ? 1 : -1\r\n );\r\n\r\n setResults(exactMatches.concat(otherResults).slice(0, numResults));\r\n setStateMessage(data.length ? \"\" : \"No suggested results.\");\r\n setSelectedIndex(-1);\r\n }\r\n })\r\n .catch(() => {\r\n setStateMessage(\"Error: Unable to retrieve suggestions.\");\r\n });\r\n } else {\r\n setResults([]);\r\n setStateMessage(\"\");\r\n }\r\n return () => {\r\n isSubscribed = false;\r\n };\r\n }, [searchTerm]);\r\n\r\n function handleSubmit(e) {\r\n e.preventDefault();\r\n setSearchActive(false);\r\n setStateMessage(\"\");\r\n if (setEmbeddedSearchTerm) {\r\n setEmbeddedTermUri(\"\");\r\n setEmbeddedSearchTerm(searchTerm);\r\n } else {\r\n history.push({\r\n pathname: \"/search\",\r\n search: `?${new URLSearchParams({ term: searchTerm })}`,\r\n });\r\n }\r\n }\r\n\r\n function goToResultPage(result) {\r\n setSearchActive(false);\r\n setSelectedIndex(-1);\r\n setSearchTerm(result.label);\r\n if (setEmbeddedTermUri) {\r\n setEmbeddedTermUri(result.uri);\r\n } else {\r\n const termId = extractTermId(result.uri);\r\n history.push({\r\n pathname: `/term/${termId}`,\r\n });\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n
    \r\n {\r\n setSearchActive(true);\r\n setSearchTerm(e.target.value);\r\n }}\r\n minLength={minSearchTermChars}\r\n onFocus={() => setSearchActive(true)}\r\n onBlur={() => {\r\n if (!resultClicked) {\r\n setSelectedIndex(-1);\r\n setSearchActive(false);\r\n }\r\n setResultClicked(false);\r\n }}\r\n onKeyDown={(event) => {\r\n if (results.length && event.key === \"ArrowDown\") {\r\n setSearchActive(true);\r\n if (selectedIndex < results.length - 1) {\r\n setSelectedIndex(\r\n selectedIndex >= 0 ? selectedIndex + 1 : 0\r\n );\r\n }\r\n } else if (results.length && event.key === \"ArrowUp\") {\r\n setSelectedIndex(selectedIndex >= 0 ? selectedIndex - 1 : -1);\r\n } else if (event.key === \"Enter\" && selectedIndex >= 0) {\r\n event.preventDefault();\r\n const result = results[selectedIndex];\r\n goToResultPage(result);\r\n }\r\n }}\r\n value={searchTerm !== null ? searchTerm : paramsTerm}\r\n />\r\n \r\n \r\n
    \r\n\r\n \r\n {searchActive && stateMessage ? {stateMessage} : null}\r\n\r\n {results.length && searchActive ? (\r\n
      \r\n {results.map((result, index) => (\r\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\r\n {\r\n setResultClicked(true);\r\n setSelectedIndex(index);\r\n }}\r\n onClick={() => {\r\n goToResultPage(result);\r\n }}\r\n key={result.uri}\r\n className={index === selectedIndex ? \"selected\" : null}\r\n aria-selected={index === selectedIndex ? \"true\" : \"false\"}\r\n >\r\n {result.label}\r\n {result.useFor && USE FOR {result.useFor}}\r\n \r\n ))}\r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nSearch.propTypes = {\r\n setEmbeddedTermUri: PropTypes.func,\r\n setEmbeddedSearchTerm: PropTypes.func,\r\n};\r\n\r\nSearch.defaultProps = {\r\n setEmbeddedTermUri: null,\r\n setEmbeddedSearchTerm: null,\r\n};\r\n\r\nexport default Search;\r\n","import styled from \"styled-components\";\r\n\r\nconst TextInput = styled.input`\r\n display: block;\r\n width: 100%;\r\n padding: 0.5rem;\r\n margin: 0.5rem 0rem 1rem;\r\n resize: vertical;\r\n box-sizing: border-box;\r\n font-family: sans-serif;\r\n font-size: var(--type-size-medium);\r\n height: ${(props) => props.height};\r\n border: 1px solid #c4c4c4;\r\n\r\n ::placeholder {\r\n font-size: var(--type-size-medium);\r\n font-size: var(--type-size-smaller);\r\n color: #999999;\r\n }\r\n`;\r\n\r\nconst SubmitButton = styled.input`\r\n width: 100%;\r\n font-size: var(--type-size-medium);\r\n background-color: var(--color-academies-blue);\r\n color: white;\r\n border: none;\r\n height: 2rem;\r\n border-radius: 5px;\r\n :disabled {\r\n background-color: #c4c4c4;\r\n }\r\n`;\r\n\r\nconst CaptchaContainer = styled.div`\r\n padding: 1rem;\r\n`;\r\n\r\nexport { TextInput, SubmitButton, CaptchaContainer };\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\nimport {\r\n BsExclamationCircle as ErrorIcon,\r\n BsCheckCircle as SuccessIcon,\r\n} from \"react-icons/bs\";\r\n\r\nconst Container = styled.div`\r\n padding: 0.5rem;\r\n margin: 0.5rem 0;\r\n border-radius: 10px;\r\n display: flex;\r\n align-items: center;\r\n\r\n &.error {\r\n background-color: var(--color-orange);\r\n }\r\n\r\n &.success {\r\n background-color: var(--color-nam-green);\r\n }\r\n\r\n &.error,\r\n &.success {\r\n color: white;\r\n }\r\n\r\n svg {\r\n flex-shrink: 0;\r\n padding-right: 0.5rem;\r\n }\r\n`;\r\n\r\nfunction StatusMessage(props) {\r\n const { message, type } = props;\r\n\r\n let Icon;\r\n let iconColor;\r\n\r\n switch (type) {\r\n case \"error\":\r\n Icon = ErrorIcon;\r\n iconColor = \"white\";\r\n break;\r\n case \"success\":\r\n Icon = SuccessIcon;\r\n iconColor = \"white\";\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return (\r\n \r\n \r\n {message}\r\n \r\n );\r\n}\r\n\r\nStatusMessage.propTypes = {\r\n message: PropTypes.string.isRequired,\r\n type: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default StatusMessage;\r\n","import React, { useState } from \"react\";\r\nimport ReCaptchaV2 from \"react-google-recaptcha\";\r\nimport { TextInput, SubmitButton, CaptchaContainer } from \"./FormElements\";\r\nimport StatusMessage from \"./StatusMessage\";\r\nimport { useInput } from \"./utils\";\r\n\r\nfunction Contact() {\r\n const [name, setName] = useInput();\r\n const [emailAddress, setEmailAddress] = useInput();\r\n const [affiliation, setAffiliation] = useInput();\r\n const [message, setMessage] = useInput();\r\n\r\n const recaptchaRef = React.useRef();\r\n const [captchaToken, setCaptchaToken] = useState(\"\");\r\n\r\n // array of status message and type\r\n const [status, setStatus] = useState([]);\r\n\r\n function handleSubmit(e) {\r\n e.preventDefault();\r\n fetch(\"/api/submitContactUs\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n name,\r\n emailAddress,\r\n affiliation,\r\n text: message,\r\n captchaToken,\r\n }),\r\n })\r\n .then((resp) => resp.text())\r\n .then((text) => {\r\n if (text === \"Captcha code invalid.\") {\r\n setStatus([\r\n \"Unable to send messsage: captcha code invalid.\",\r\n \"error\",\r\n ]);\r\n } else if (text === \"Message sent.\") {\r\n setStatus([\r\n \"Thank you for your email. We will respond as soon as possible.\",\r\n \"success\",\r\n ]);\r\n e.target.reset();\r\n } else {\r\n setStatus([\"Error: unable to send message.\", \"error\"]);\r\n }\r\n })\r\n .catch(() => {\r\n setStatus([\"Error: unable to verify captcha code.\", \"error\"]);\r\n });\r\n setCaptchaToken(\"\");\r\n recaptchaRef.current.reset();\r\n }\r\n\r\n return (\r\n
    \r\n

    Contact Us

    \r\n
    \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n \r\n {\r\n setCaptchaToken(token);\r\n }}\r\n onExpired={() => setCaptchaToken(null)}\r\n />\r\n \r\n !elem\r\n )}\r\n />\r\n {status.length ? (\r\n \r\n ) : null}\r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default Contact;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { useTransition, animated } from \"react-spring\";\r\nimport styled from \"styled-components\";\r\nimport {\r\n BsPlusCircle as PlusIcon,\r\n BsDashCircle as MinusIcon,\r\n} from \"react-icons/bs\";\r\nimport StatusMessage from \"./StatusMessage\";\r\nimport TermLink from \"./TermLink\";\r\n\r\nconst HotTopic = styled.div`\r\n :first-child {\r\n margin-top: 2em;\r\n }\r\n padding: 0.5rem 0;\r\n border-bottom: 1.5px solid #c4c4c4;\r\n`;\r\n\r\nconst HotTopicHeader = styled.h3`\r\n button {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n width: 100%;\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n &:hover {\r\n cursor: pointer;\r\n }\r\n }\r\n\r\n div:first-child {\r\n display: flex;\r\n align-items: center;\r\n font-size: var(--type-size-larger);\r\n font-weight: 400;\r\n\r\n img {\r\n margin-right: 1em;\r\n width: 3.5em;\r\n }\r\n }\r\n\r\n a {\r\n font-size: var(--type-size-larger);\r\n font-weight: 400;\r\n }\r\n\r\n margin: 0;\r\n padding: 0rem;\r\n`;\r\n\r\nconst pStyle = {\r\n margin: \"10px 0px 0px\"\r\n};\r\n\r\nconst aStyle = {\r\n color: \"var(--color-academies-blue)\"\r\n}\r\n\r\nconst iconStyles = { color: \"var(--color-academies-blue)\", size: \"1.25rem\" };\r\n\r\nfunction HotTopics() {\r\n gtag('event', 'page_view');\r\n const [hotTopics, setHotTopics] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [expandedResultIndex, setExpandedResultIndex] = useState(-1);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n\r\n const transitions = useTransition(\r\n expandedResultIndex !== -1 && expandedResultIndex,\r\n {\r\n from: { opacity: 0, maxHeight: \"0px\" },\r\n enter: { opacity: 1, maxHeight: \"1000px\" },\r\n leave: { opacity: 0, maxHeight: \"0px\" },\r\n }\r\n );\r\n\r\n useEffect(() => {\r\n fetch(\"/api/getHotTopics\")\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n data.forEach((hotTopic) => {\r\n hotTopic.concepts.sort((a, b) =>\r\n a.prefLabel.toLowerCase() > b.prefLabel.toLowerCase() ? 1 : -1\r\n );\r\n });\r\n\r\n data.sort((a, b) =>\r\n a.prefLabel.toLowerCase() > b.prefLabel.toLowerCase() ? 1 : -1\r\n );\r\n setHotTopics(data);\r\n setLoading(false);\r\n setExpandedResultIndex(-1);\r\n })\r\n .catch(() => {\r\n setLoading(false);\r\n setErrorMessage(\"Error: Unable to retrieve hot topics.\");\r\n });\r\n }, []);\r\n\r\n if (loading) {\r\n return \"Loading...\";\r\n }\r\n\r\n return (\r\n <>\r\n

    Hot Topic Terms

    \r\n

    Looking for TRT terms on a popular topic? We have some suggestions:

    \r\n {errorMessage && }\r\n {hotTopics.length > 0 &&\r\n hotTopics.map((hotTopic, hotTopicIndex) => (\r\n \r\n \r\n setExpandedResultIndex(hotTopicIndex)\r\n : () => setExpandedResultIndex(-1)\r\n }\r\n >\r\n
    \r\n \r\n {hotTopic.prefLabel}\r\n
    \r\n {hotTopicIndex === expandedResultIndex ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
    \r\n {hotTopicIndex === expandedResultIndex &&\r\n transitions(\r\n (styles, item) =>\r\n item === expandedResultIndex && (\r\n \r\n
      \r\n {hotTopic.concepts.map((concept) => (\r\n
    • \r\n \r\n
    • \r\n ))}\r\n
    \r\n
    \r\n )\r\n )}\r\n
    \r\n ))}\r\n

    Also check out our Hot Topics page on TRID.\r\n Hot Topics are preconfigured TRID searches that capture the latest publications and projects added to the Database.\r\n The URL can be copied and pasted to an email, document, or website. The URL will run a TRID search when clicked.

    \r\n \r\n );\r\n}\r\n\r\nexport default HotTopics;\r\n","import React, { useState } from \"react\";\r\nimport { Link, NavLink } from \"react-router-dom\";\r\nimport styled from \"styled-components\";\r\nimport { BsChevronDown, BsChevronUp, BsEnvelope } from \"react-icons/bs\";\r\nimport paths from \"./paths\";\r\nimport Container from \"./Container\";\r\n\r\nconst Logos = styled(Container)`\r\n display: flex;\r\n box-sizing: border-box;\r\n gap: 2rem;\r\n justify-content: space-between;\r\n /*height: 3rem;*/\r\n padding: 1.5rem;\r\n width: auto;\r\n\r\n a {\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n #nas-logo, #trb-logo {\r\n fill: #1D1646;\r\n width: 250px;\r\n }\r\n\r\n .trblogo-dark {\r\n fill: #231f20;\r\n }\r\n\r\n .trblogo-light {\r\n fill: #9f9fa0;\r\n }\r\n\r\n @media (max-width: 576px) {\r\n box-sizing: content-box;\r\n height: 1.5rem;\r\n padding: 1rem;\r\n\r\n #nas-logo, #trb-logo {\r\n width: 100pt;\r\n }\r\n }\r\n`;\r\n\r\nconst BackgroundHeader = styled.div`\r\n background: var(--color-pale-background);\r\n border: 0.5px solid #dddddd;\r\n padding: 1.75rem;\r\n\r\n a:hover {\r\n text-decoration: none;\r\n }\r\n`;\r\n\r\nconst TopGradient = styled.div`\r\n background: linear-gradient(\r\n 90deg,\r\n var(--color-academies-blue) 0%,\r\n var(--color-nae-blue) 39.54%,\r\n var(--color-nam-green) 65.84%,\r\n var(--color-nas-gold) 100%\r\n );\r\n height: 12px;\r\n`;\r\n\r\nconst TitleContainer = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n\r\n @media (max-width: 768px) {\r\n flex-direction: column;\r\n text-align: center;\r\n padding-bottom: 1rem;\r\n h1 {\r\n margin-bottom: 0.5em;\r\n }\r\n }\r\n\r\n @media (max-width: 576px) {\r\n h1 {\r\n font-size: large;\r\n }\r\n }\r\n`;\r\n\r\nconst ContactLink = styled(Link)`\r\n color: var(--color-academies-blue) !important;\r\n display: flex;\r\n align-items: center;\r\n font-size: var(--type-size-smaller);\r\n font-style: italic;\r\n\r\n span {\r\n padding-left: 0.5rem;\r\n }\r\n\r\n svg {\r\n color: var(--color-academies-blue);\r\n height: 1.25em;\r\n width: 1.25em;\r\n }\r\n\r\n @media (max-width: 768px) {\r\n font-size: var(--type-size-medium);\r\n }\r\n`;\r\n\r\nconst NavItemContainer = styled.ul`\r\n display: flex;\r\n justify-content: space-around;\r\n list-style: none;\r\n padding-inline-start: 0;\r\n\r\n @media (max-width: 768px) {\r\n display: none;\r\n }\r\n\r\n a {\r\n border-top: 1px solid var(--color-academies-blue);\r\n text-align: center;\r\n width: 100%;\r\n font-size: var(--type-size-smaller);\r\n padding-top: 1rem;\r\n\r\n &.active {\r\n border-top: 4px solid var(--color-academies-blue);\r\n padding-top: calc(1rem - 3px);\r\n font-weight: bold;\r\n }\r\n }\r\n`;\r\n\r\nconst MobileNavItemContainer = styled.div`\r\n display: none;\r\n @media (max-width: 768px) {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n\r\n .inner {\r\n display: flex;\r\n flex-direction: column;\r\n width: 22rem;\r\n background-color: white;\r\n }\r\n\r\n svg {\r\n height: 1.5em;\r\n width: 1.5em;\r\n color: var(--color-nae-blue);\r\n }\r\n\r\n @media (max-width: 576px) {\r\n .inner {\r\n width: 18rem;\r\n }\r\n }\r\n\r\n button {\r\n font-size: var(--type-size-medium);\r\n font-weight: bold;\r\n background: white;\r\n border: 0.5px solid #dddddd;\r\n width: 100%;\r\n height: 3rem;\r\n\r\n .inner-button {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 0 1rem;\r\n align-items: center;\r\n }\r\n }\r\n\r\n ul {\r\n list-style: none;\r\n background-color: white;\r\n padding-inline-start: unset;\r\n margin: unset;\r\n border-bottom: 0.5px solid #dddddd;\r\n }\r\n li {\r\n padding: 0.75rem 1.5rem;\r\n }\r\n\r\n a {\r\n color: var(--color-nae-blue);\r\n }\r\n\r\n .active > li {\r\n background-color: var(--color-academies-blue);\r\n color: white;\r\n border-bottom: none;\r\n border-top: none;\r\n }\r\n`;\r\n\r\nfunction Header() {\r\n const pages = [\r\n { title: \"Thesaurus Home\", path: paths.home },\r\n { title: \"How to Use the Thesaurus\", path: paths.howToUse },\r\n { title: \"Hot Topic Terms\", path: paths.hotTopicTerms },\r\n { title: \"Suggest Terms\", path: paths.suggestTerms },\r\n { title: \"Download\", path: paths.download },\r\n { title: \"About the TRT\", path: paths.about },\r\n ];\r\n const [mobileShowNavItems, setMobileShowNavItems] = useState(false);\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n

    \r\n Transportation Research Thesaurus (TRT)\r\n

    \r\n \r\n \r\n Contact Us\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Header;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport styled from \"styled-components\";\r\nimport { BsStar } from \"react-icons/bs\";\r\nimport SidebarContainer from \"./SidebarContainer\";\r\nimport TermLink from \"./TermLink\";\r\n\r\nconst ItemList = styled.ul`\r\n margin: unset;\r\n padding-left: 1.5rem;\r\n overflow-y: auto;\r\n list-style: none;\r\n li {\r\n padding: 0.25rem 0;\r\n @media (max-width: 768px) {\r\n padding: 0.5rem 0;\r\n }\r\n }\r\n`;\r\n\r\nconst conceptsToShow = 10;\r\n\r\nfunction RecentlyAdded() {\r\n const [concepts, setConcepts] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n const url = `/api/getRecentlyAddedConcepts?${new URLSearchParams({\r\n limit: conceptsToShow,\r\n })}`;\r\n fetch(url)\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n setLoading(false);\r\n setConcepts(data);\r\n });\r\n }, []);\r\n\r\n return (\r\n \r\n \r\n {loading ? (\r\n Loading...\r\n ) : (\r\n concepts.map((concept) => (\r\n
  • \r\n \r\n
  • \r\n ))\r\n )}\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default RecentlyAdded;\r\n","import React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Container from \"./Container\";\r\nimport NASOnline from \"./images/footer/nasonline.png\";\r\nimport NAEOnline from \"./images/footer/naeonline.png\";\r\nimport NAMOnline from \"./images/footer/namonline.png\";\r\nimport ConnectFacebook from \"./images/footer/connect-facebook.svg\";\r\nimport ConnectEmail from \"./images/footer/connect-email.svg\";\r\nimport ConnectLinkedIn from \"./images/footer/connect-linkedin.svg\";\r\nimport ConnectRSS from \"./images/footer/connect-rss.svg\";\r\nimport ConnectTwitter from \"./images/footer/connect-twitter.svg\";\r\nimport DonateIcon from \"./images/footer/donate-icon.svg\";\r\n\r\nconst FooterBackground = styled.div`\r\n position: relative;\r\n background-color: var(--color-neutral--granite);\r\n width: 100%;\r\n font-weight: var(--lato--bold);\r\n z-index: 16;\r\n`;\r\n\r\nconst FlexContainer = styled(Container)`\r\n @media print, screen and (min-width: 65rem) {\r\n display: -webkit-flex;\r\n display: flex;\r\n }\r\n\r\n @media print, screen and (max-width: 1200px) {\r\n max-width: 100%;\r\n }\r\n\r\n padding: 0;\r\n width: 100%;\r\n\r\n a:focus,\r\n a:hover {\r\n text-decoration: underline;\r\n }\r\n\r\n ol,\r\n ul {\r\n list-style: none;\r\n }\r\n`;\r\n\r\nconst OrgLinks = styled.div`\r\n @media print, screen and (min-width: 65em) {\r\n -webkit-flex: 0 0 340px;\r\n flex: 0 0 340px;\r\n }\r\n\r\n -webkit-align-items: center;\r\n align-items: center;\r\n background-color: rgba(0, 0, 0, 0.2);\r\n display: -webkit-flex;\r\n display: flex;\r\n font-size: 0.8em;\r\n font-size: var(--type-size--small);\r\n -webkit-flex-direction: column;\r\n flex-direction: column;\r\n letter-spacing: 0.1rem;\r\n padding-right: 1.25rem;\r\n padding-left: 1.25rem;\r\n position: relative;\r\n text-align: center;\r\n text-transform: uppercase;\r\n\r\n &:before {\r\n content: \"\";\r\n position: absolute;\r\n top: 0;\r\n right: 100%;\r\n width: calc(100vw - 70rem);\r\n height: 100%;\r\n background-color: rgba(0, 0, 0, 0.2);\r\n }\r\n`;\r\n\r\nconst FooterLogo = styled.div`\r\n @media print, screen and (min-width: 65em) {\r\n margin-bottom: 1.5em;\r\n }\r\n\r\n display: block;\r\n max-width: 235px;\r\n margin: 2rem auto 0;\r\n width: 233px;\r\n\r\n #nas-logo {\r\n fill: white;\r\n width: 233px;\r\n }\r\n`;\r\n\r\nconst OrgLink = styled.a`\r\n color: var(--color-neutral--white);\r\n\r\n @media print, screen and (min-width: 45em) {\r\n font-size: 0.625rem;\r\n font-size: var(--type-size--6);\r\n }\r\n\r\n -webkit-align-items: center;\r\n align-items: center;\r\n display: -webkit-flex;\r\n display: flex;\r\n padding-top: 0.75em;\r\n padding-bottom: 0.75em;\r\n position: relative;\r\n text-align: left;\r\n text-decoration: none;\r\n\r\n &:visited {\r\n color: var(--color-neutral--white);\r\n }\r\n`;\r\n\r\nconst OrgLogo = styled.img`\r\n width: 1.5em;\r\n height: 1.5em;\r\n margin-right: 5px;\r\n`;\r\n\r\nconst FooterLinks = styled.div`\r\n @media print, screen and (min-width: 65em) {\r\n -webkit-flex: 1 1 100%;\r\n flex: 1 1 100%;\r\n }\r\n\r\n display: -webkit-flex;\r\n display: flex;\r\n -webkit-flex-wrap: wrap;\r\n flex-wrap: wrap;\r\n -webkit-justify-content: space-between;\r\n justify-content: space-between;\r\n padding: 2rem 1rem 2rem 2rem;\r\n`;\r\n\r\nconst FooterList = styled.ul`\r\n @media screen and (min-width: 65em) {\r\n -webkit-flex-wrap: wrap;\r\n flex-wrap: wrap;\r\n -webkit-align-items: flex-start;\r\n align-items: flex-start;\r\n -webkit-justify-content: flex-start;\r\n justify-content: flex-start;\r\n -webkit-flex: 0 1 50%;\r\n flex: 0 1 50%;\r\n max-height: 200px;\r\n text-align: left;\r\n }\r\n\r\n padding: 0;\r\n display: -webkit-flex;\r\n display: flex;\r\n -webkit-flex-direction: column;\r\n flex-direction: column;\r\n width: 100%;\r\n margin-bottom: 2em;\r\n text-align: center;\r\n`;\r\n\r\nconst FooterItem = styled.li`\r\n @media screen and (min-width: 65em) {\r\n width: 50%;\r\n }\r\n`;\r\n\r\nconst FooterLink = styled.a`\r\n display: block;\r\n padding-top: 0.75em;\r\n padding-bottom: 0.75em;\r\n font-size: 1rem;\r\n font-weight: 700;\r\n font-weight: var(--lato--bold);\r\n text-decoration: none;\r\n letter-spacing: 0.05em;\r\n color: var(--color-neutral--white) !important;\r\n`;\r\n\r\nconst FooterSocials = styled.div`\r\n @media screen and (min-width: 65em) {\r\n -webkit-flex: 0 1 33%;\r\n flex: 0 1 33%;\r\n margin-left: auto;\r\n }\r\n\r\n width: 100%;\r\n`;\r\n\r\nconst FooterSocialConnect = styled.p`\r\n @media screen and (min-width: 65em) {\r\n display: block;\r\n text-align: left;\r\n margin-bottom: 1em;\r\n }\r\n\r\n text-align: center;\r\n margin-bottom: 1em;\r\n font-size: 1.15em;\r\n font-weight: 400;\r\n font-weight: var(--lato--regular);\r\n line-height: 1.5;\r\n color: var(--color-neutral--white);\r\n`;\r\n\r\nconst FooterSocialList = styled.ul`\r\n @media screen and (min-width: 65em) {\r\n display: block;\r\n }\r\n\r\n padding: 0;\r\n display: -webkit-flex;\r\n display: flex;\r\n -webkit-flex-wrap: wrap;\r\n flex-wrap: wrap;\r\n -webkit-justify-content: center;\r\n justify-content: center;\r\n`;\r\n\r\nconst FooterSocialItem = styled.li`\r\n @media screen and (min-width: 65em) {\r\n margin: 0 0.5em 0.5em 0;\r\n float: left;\r\n }\r\n\r\n margin: 0 0.5em 0.25em;\r\n`;\r\n\r\nconst FooterSocialLink = styled.a`\r\n @media screen and (min-width: 65em) {\r\n width: 30px;\r\n height: 30px;\r\n }\r\n\r\n display: -webkit-flex;\r\n display: flex;\r\n -webkit-align-items: center;\r\n align-items: center;\r\n -webkit-justify-content: center;\r\n justify-content: center;\r\n width: 40px;\r\n height: 40px;\r\n border: 1px solid #fff;\r\n border: 1px solid var(--color-neutral--white);\r\n border-radius: 50%;\r\n text-decoration: none;\r\n opacity: 0.8;\r\n transition: opacity 0.15s, -webkit-transform 0.15s;\r\n transition: opacity 0.15s, transform 0.15s;\r\n transition: opacity 0.15s, transform 0.15s, -webkit-transform 0.15s;\r\n\r\n &:hover {\r\n opacity: 1;\r\n -webkit-transform: scale(1.1);\r\n transform: scale(1.1);\r\n }\r\n`;\r\n\r\nconst FooterSocialImage = styled.img`\r\n height: 90%;\r\n width: 90%;\r\n`;\r\n\r\nconst FooterLegal = styled.div`\r\n @media print, screen and (min-width: 65em) {\r\n display: -webkit-flex;\r\n display: flex;\r\n -webkit-flex-direction: row-reverse;\r\n flex-direction: row-reverse;\r\n -webkit-align-items: center;\r\n align-items: center;\r\n -webkit-justify-content: space-between;\r\n justify-content: space-between;\r\n text-align: left;\r\n }\r\n\r\n width: 100%;\r\n margin-top: 1em;\r\n padding-top: 2em;\r\n border-top: 1px solid hsla(0, 0%, 100%, 0.3);\r\n text-align: center;\r\n`;\r\n\r\nconst FooterLegalButton = styled.button`\r\n border: 1px solid #fff;\r\n border: 1px solid var(--color-neutral--white);\r\n color: #fff;\r\n color: var(--color-neutral--white);\r\n\r\n @media print, screen and (min-width: 65em) {\r\n -webkit-order: 2;\r\n order: 2;\r\n margin-bottom: 0;\r\n }\r\n\r\n margin-bottom: 2rem;\r\n background-color: transparent;\r\n padding: 1.2em 1.5em;\r\n padding-right: 2.5rem;\r\n\r\n display: inline-block;\r\n font-size: 0.75rem;\r\n font-weight: 900;\r\n font-weight: var(--lato--black);\r\n letter-spacing: 2px;\r\n\r\n position: relative;\r\n text-align: left;\r\n text-decoration: none;\r\n text-transform: uppercase;\r\n transition: background-color 0.15s, border-color 0.15s;\r\n\r\n font-family: Lato, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,\r\n Ubuntu, Cantarell, Open Sans, Helvetica Neue, sans-serif;\r\n font-family: var(--type-font--lato);\r\n\r\n border-radius: 0;\r\n\r\n &:active,\r\n &:focus,\r\n &:hover {\r\n text-decoration: underline;\r\n }\r\n`;\r\n\r\nconst FooterLegalSpan = styled.span`\r\n display: block;\r\n height: 100%;\r\n overflow: hidden;\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n width: 4.25em;\r\n`;\r\n\r\nconst FooterLegalIcon = styled.img`\r\n height: 2.5em;\r\n position: absolute;\r\n top: 50%;\r\n left: 60%;\r\n -webkit-transform: translate(-50%, -50%);\r\n transform: translate(-50%, -50%);\r\n width: 2.5em;\r\n`;\r\n\r\nconst FooterLegalList = styled.ul`\r\n padding: 0;\r\n`;\r\n\r\nconst FooterLegalItem = styled.li`\r\n @media print, screen and (min-width: 65em) {\r\n display: inline-block;\r\n\r\n & + li:before {\r\n content: \"|\";\r\n display: inline-block;\r\n margin-right: 0.5em;\r\n margin-left: 0.5em;\r\n font-weight: 300;\r\n font-weight: var(--lato--light);\r\n color: var(--color-neutral--white);\r\n }\r\n }\r\n`;\r\n\r\nconst FooterLegalLink = styled.a`\r\n @media print, screen and (min-width: 65em) {\r\n display: inline-block;\r\n margin-bottom: 0;\r\n }\r\n\r\n display: block;\r\n margin-bottom: 0.5em;\r\n font-size: 0.95em;\r\n font-weight: 700;\r\n font-weight: var(--lato--bold);\r\n text-decoration: none;\r\n color: var(--color-neutral--white);\r\n\r\n &:visited {\r\n color: var(--color-neutral--white);\r\n }\r\n`;\r\n\r\nconst FooterLegalCopyright = styled.p`\r\n @media print, screen and (min-width: 65em) {\r\n margin-top: 0.5em;\r\n }\r\n\r\n margin-top: 1em;\r\n font-size: 0.9em;\r\n opacity: 0.9;\r\n font-weight: 300;\r\n font-weight: var(--lato--light);\r\n line-height: 1.5;\r\n`;\r\n\r\nconst FooterLegalCopyrightLink = styled.a`\r\n @media print, screen and (min-width: 65em) {\r\n display: inline-block;\r\n margin-bottom: 0;\r\n }\r\n\r\n display: block;\r\n margin-bottom: 0.5em;\r\n font-size: 0.8em;\r\n font-weight: var(--lato--bold);\r\n text-decoration: none;\r\n color: var(--color-neutral--white);\r\n\r\n &:visited {\r\n color: var(--color-neutral--white);\r\n }\r\n`;\r\n\r\nfunction Footer() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n National Academy of Sciences\r\n \r\n\r\n \r\n \r\n National Academy of Engineering\r\n \r\n\r\n \r\n \r\n National Academy of Medicine\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n About Us\r\n \r\n \r\n \r\n \r\n Our Work\r\n \r\n \r\n \r\n \r\n Events\r\n \r\n \r\n \r\n \r\n Contact Us\r\n \r\n \r\n \r\n \r\n Opportunities\r\n \r\n \r\n \r\n \r\n Publications\r\n \r\n \r\n \r\n \r\n Visit\r\n \r\n \r\n \r\n \r\n Current Operating Status\r\n \r\n \r\n \r\n \r\n E-Newsletters\r\n \r\n \r\n \r\n \r\n Connect With Us\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n Privacy Statement\r\n \r\n \r\n \r\n \r\n DMCA Policy\r\n \r\n \r\n \r\n \r\n Terms of Use\r\n \r\n \r\n \r\n \r\n Site Map\r\n \r\n \r\n \r\n \r\n \r\n Copyright © 2021 National Academy of Sciences. All Rights\r\n Reserved.\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default Footer;\r\n","import React from \"react\";\r\nimport ReactSelect, { components } from \"react-select\";\r\nimport { BiCaretDown, BiCaretUp } from \"react-icons/bi\";\r\n// eslint-disable-next-line import/no-extraneous-dependencies\r\nimport { CacheProvider } from \"@emotion/react\";\r\n// eslint-disable-next-line import/no-extraneous-dependencies\r\nimport createCache from \"@emotion/cache\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\n\r\n// Used with the CacheProvider to apply a nonce to react-select emotion style tags\r\nconst cache = createCache({\r\n // eslint-disable-next-line no-underscore-dangle\r\n nonce: window.__webpack_nonce__,\r\n key: \"trt-select\",\r\n});\r\n\r\nconst StyledSelect = styled(ReactSelect)`\r\n & .React-Select__control {\r\n box-shadow: 2px 2px 4px 0px rgba(196, 196, 196, 0.75);\r\n border: 0.5px solid rgba(220, 220, 220, 1);\r\n border-radius: 10px;\r\n width: 100%;\r\n }\r\n\r\n & .React-Select__value-container {\r\n display: flex;\r\n\r\n .React-Select__single-value {\r\n position: relative;\r\n transform: none;\r\n }\r\n }\r\n\r\n & .React-Select__menu {\r\n border-radius: 10px;\r\n top: 85%;\r\n }\r\n & .React-Select__indicator-separator {\r\n background: none;\r\n }\r\n & .React-Select__dropdown-indicator {\r\n color: black;\r\n background-color: lightgrey;\r\n border-radius: 50%;\r\n padding: 0.1rem;\r\n margin-right: 0.5rem;\r\n }\r\n\r\n // both of the below are required to\r\n & .React-Select__option--is-focused {\r\n background-color: var(--color-academies-blue);\r\n color: white;\r\n\r\n :active {\r\n background-color: var(--color-academies-blue);\r\n }\r\n }\r\n & .React-Select__option--is-selected {\r\n background-color: var(--color-nae-blue);\r\n }\r\n`;\r\n\r\nconst DropdownIndicator = (props) => {\r\n const {\r\n selectProps: { menuIsOpen },\r\n } = props;\r\n return (\r\n // eslint-disable-next-line react/jsx-props-no-spreading\r\n \r\n {!menuIsOpen && }\r\n {menuIsOpen && }\r\n \r\n );\r\n};\r\n\r\nDropdownIndicator.propTypes = {\r\n selectProps: PropTypes.shape({\r\n menuIsOpen: PropTypes.bool.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nfunction Select(props) {\r\n const { onChange, options, placeholder, value } = props;\r\n return (\r\n \r\n option.value === value)[0]}\r\n placeholder={placeholder}\r\n />\r\n \r\n );\r\n}\r\n\r\nSelect.propTypes = {\r\n onChange: PropTypes.func.isRequired,\r\n options: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n placeholder: PropTypes.string.isRequired,\r\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\r\n};\r\n\r\nexport default Select;\r\n","const formats = {\r\n N3: \"N3\",\r\n BinaryRDF: \"Binary RDF\",\r\n RdfXml: \"RDF XML\",\r\n CSV: \"CSV\",\r\n Excel: \"Excel\",\r\n};\r\n\r\nObject.freeze(formats);\r\n\r\nexport default formats;\r\n","const months = [\r\n \"January\",\r\n \"February\",\r\n \"March\",\r\n \"April\",\r\n \"May\",\r\n \"June\",\r\n \"July\",\r\n \"August\",\r\n \"September\",\r\n \"October\",\r\n \"November\",\r\n \"December\",\r\n];\r\n\r\nObject.freeze(months);\r\n\r\nexport default months;\r\n","/* eslint-disable react/jsx-props-no-spreading */\r\nimport React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { BsChevronDown, BsChevronUp } from \"react-icons/bs\";\r\nimport { useTable, useSortBy } from \"react-table\";\r\n\r\nfunction SortableTable({ columns, data }) {\r\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =\r\n useTable(\r\n {\r\n columns,\r\n data,\r\n },\r\n useSortBy\r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n {headerGroups.map((headerGroup) => (\r\n \r\n {headerGroup.headers.map((column) => {\r\n let icon = \"\";\r\n if (column.isSorted) icon = ;\r\n if (column.isSortedDesc) icon = ;\r\n\r\n return (\r\n // Add the sorting props to control sorting.\r\n \r\n );\r\n })}\r\n \r\n ))}\r\n \r\n \r\n {rows.map((row) => {\r\n prepareRow(row);\r\n return (\r\n \r\n {row.cells.map((cell) => (\r\n \r\n ))}\r\n \r\n );\r\n })}\r\n \r\n
    \r\n {column.render(\"Header\")}\r\n {/* Add a sort direction indicator */}\r\n {icon}\r\n
    {cell.render(\"Cell\")}
    \r\n \r\n );\r\n}\r\n\r\nSortableTable.propTypes = {\r\n columns: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n Header: PropTypes.string.isRequired,\r\n accessor: PropTypes.string.isRequired,\r\n })\r\n ).isRequired,\r\n data: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n};\r\n\r\nexport default SortableTable;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\nimport SortableTable from \"./SortableTable\";\r\n\r\nconst Styles = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n\r\n table {\r\n border-spacing: 0;\r\n border: 1px solid black;\r\n\r\n tr {\r\n :last-child {\r\n td {\r\n border-bottom: 0;\r\n }\r\n }\r\n }\r\n\r\n th {\r\n background: var(--color-ocean-blue);\r\n color: white;\r\n font-weight: bold;\r\n\r\n svg {\r\n margin-left: 0.5em;\r\n }\r\n }\r\n\r\n th,\r\n td {\r\n margin: 0;\r\n padding: 0.5rem;\r\n border-bottom: 1px solid var(--color-pale-background);\r\n border-right: 1px solid var(--color-pale-background);\r\n\r\n :last-child {\r\n border-right: 0;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst ExplainerText = styled.p`\r\n padding-bottom: 1rem;\r\n font-size: var(--type-size-smaller);\r\n`;\r\n\r\nfunction ViewResults({ downloadMode, monthFrom, yearFrom, topTermUri }) {\r\n const [loading, setLoading] = useState(true);\r\n const [data, setData] = useState([]);\r\n const columns = [\r\n {\r\n Header: \"Term\",\r\n accessor: \"prefLabel\",\r\n // Show the label without - characters when sorting\r\n Cell: ({ column, row: { original } }) => {\r\n if (column.isSorted || column.isSortedDesc) {\r\n return original.label;\r\n }\r\n return original.prefLabel;\r\n },\r\n // Sort the table by the trimmed label\r\n sortType: React.useMemo(() => (rowA, rowB) => {\r\n if (!rowA || !rowB) return 1;\r\n return rowA.original.label.toLowerCase() >\r\n rowB.original.label.toLowerCase()\r\n ? 1\r\n : -1;\r\n }),\r\n },\r\n ];\r\n const params = {};\r\n\r\n switch (downloadMode) {\r\n case \"By Top-Level Term\":\r\n params.uri = topTermUri;\r\n break;\r\n case \"By Date\":\r\n params.date = new Date(yearFrom, monthFrom, 1).toISOString();\r\n columns.push({\r\n Header: \"Last Modified Date\",\r\n accessor: \"modified\",\r\n Cell: ({ row: { original } }) => original.modified.toLocaleDateString(),\r\n });\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n useEffect(() => {\r\n fetch(`/download/view?${new URLSearchParams(params)}`)\r\n .then((resp) => resp.json())\r\n .then((json) => {\r\n setLoading(false);\r\n const newData = [...json];\r\n const dashRegex = new RegExp(\"^[-]*\\\\s\");\r\n newData.forEach((row, index) => {\r\n if (downloadMode === \"By Date\") {\r\n newData[index].label = row.prefLabel;\r\n } else {\r\n newData[index].label = row.prefLabel.replace(dashRegex, \"\");\r\n }\r\n newData[index].modified = new Date(row.modified);\r\n });\r\n setData(newData);\r\n });\r\n }, []);\r\n\r\n if (loading) {\r\n return \"Loading...\";\r\n }\r\n\r\n if (!loading && data.count === 0) {\r\n return \"No Results Found.\";\r\n }\r\n\r\n return (\r\n <>\r\n {[\"By Top-Level Term\", \"Entire TRT\"].includes(downloadMode) && (\r\n \r\n Terms are arranged in hierarchical order. Each “-” represents a lower\r\n level of the hierarchy.\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nViewResults.propTypes = {\r\n downloadMode: PropTypes.string.isRequired,\r\n monthFrom: PropTypes.oneOfType([PropTypes.string, PropTypes.number])\r\n .isRequired,\r\n yearFrom: PropTypes.oneOfType([PropTypes.string, PropTypes.number])\r\n .isRequired,\r\n topTermUri: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default ViewResults;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { FaSpinner } from \"react-icons/fa\";\r\nimport styled, { keyframes } from \"styled-components\";\r\nimport download from \"downloadjs\";\r\nimport Select from \"./Select\";\r\nimport formats from \"./formats\";\r\nimport months from \"./months\";\r\nimport ViewResults from \"./ViewResults\";\r\n\r\nconst RadioButtons = styled.div`\r\n padding-bottom: 1rem;\r\n > label {\r\n padding-left: 0.1rem;\r\n padding-right: 1rem;\r\n }\r\n\r\n @media (max-width: 992px) {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n`;\r\n\r\nconst SelectContainer = styled.div`\r\n display: flex;\r\n gap: 1rem;\r\n > div {\r\n width: 100%;\r\n margin-bottom: 1rem;\r\n }\r\n`;\r\n\r\nconst ButtonSection = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n button {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 45%;\r\n font-size: var(--type-size-medium);\r\n color: white;\r\n border: none;\r\n background-color: var(--color-nae-blue);\r\n height: 2rem;\r\n border-radius: 5px;\r\n :disabled {\r\n background-color: #c4c4c4;\r\n }\r\n }\r\n\r\n button:first-child {\r\n background-color: var(--color-nam-green);\r\n :disabled {\r\n background-color: #c4c4c4;\r\n }\r\n }\r\n`;\r\n\r\nconst SpinnerAnimation = keyframes`\r\n0% {\r\n -webkit-transform: rotate(0deg);\r\n transform: rotate(0deg);\r\n}\r\n100% {\r\n -webkit-transform: rotate(359deg);\r\n transform: rotate(359deg);\r\n}\r\n`;\r\n\r\nconst DownloadSpinner = styled(FaSpinner)`\r\n margin-left: 0.25rem;\r\n -webkit-animation: ${SpinnerAnimation} 2s infinite linear;\r\n animation: ${SpinnerAnimation} 2s infinite linear;\r\n`;\r\n\r\nconst Hr = styled.hr`\r\n margin: 2rem 0;\r\n`;\r\n\r\nconst ViewResultsReturnButton = styled.button`\r\n font-size: var(--type-size-medium);\r\n background-color: var(--color-nae-blue);\r\n color: white;\r\n border: none;\r\n height: 2rem;\r\n border-radius: 5px;\r\n`;\r\n\r\nconst modes = [\"By Date\", \"By Top-Level Term\", \"Entire TRT\"];\r\n\r\nfunction generateYears(startYear) {\r\n const currentYear = new Date().getFullYear();\r\n const years = [];\r\n for (let year = startYear; year <= currentYear; year += 1) {\r\n years.push(year);\r\n }\r\n return years;\r\n}\r\nconst years = generateYears(2019);\r\n\r\nfunction DownloadArea() {\r\n gtag('event', 'pageview');\r\n const [downloadMode, setDownloadMode] = useState(modes[0]);\r\n\r\n const [monthFrom, setMonthFrom] = useState(\"\");\r\n const [yearFrom, setYearFrom] = useState(\"\");\r\n const [topTermUri, setTopTermUri] = useState(\"\");\r\n const [terms, setTerms] = useState([]);\r\n\r\n const [downloadFormat, setDownloadFormat] = useState(\"\");\r\n const [isDownloading, setIsDownloading] = useState(false);\r\n const [isViewingResults, setIsViewingResults] = useState(false);\r\n\r\n function doDownload(downloadLink) {\r\n if (!isDownloading) {\r\n setIsDownloading(true);\r\n let filename;\r\n fetch(downloadLink)\r\n .then((response) => {\r\n if (response.status === 200) {\r\n filename = response.headers.get(\"content-disposition\");\r\n [, filename] = filename.split(\"filename=\");\r\n return response.blob();\r\n }\r\n return \"\";\r\n })\r\n .then((body) => {\r\n download(body, filename, \"application/octet-stream\");\r\n setIsDownloading(false);\r\n });\r\n }\r\n }\r\n\r\n function createDownloadButton() {\r\n let buttonValid = false;\r\n let viewDisabled = true;\r\n\r\n if (downloadFormat) {\r\n const params = { format: downloadFormat };\r\n if (downloadMode === \"By Top-Level Term\" && topTermUri) {\r\n params.uri = topTermUri;\r\n buttonValid = true;\r\n viewDisabled = false;\r\n } else if (\r\n downloadMode === \"By Date\" &&\r\n monthFrom !== \"\" &&\r\n yearFrom !== \"\"\r\n ) {\r\n params.date = new Date(yearFrom, monthFrom, 1).toISOString();\r\n buttonValid = true;\r\n viewDisabled = false;\r\n } else if (downloadMode === \"Entire TRT\") {\r\n buttonValid = true;\r\n viewDisabled = false;\r\n }\r\n\r\n if (buttonValid) {\r\n return (\r\n \r\n \r\n \r\n doDownload(`/download/file?${new URLSearchParams(params)}`)\r\n }\r\n >\r\n Download {isDownloading && }\r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n if (\r\n (downloadMode === \"By Top-Level Term\" && topTermUri) ||\r\n (downloadMode === \"By Date\" && monthFrom !== \"\" && yearFrom !== \"\") ||\r\n downloadMode === \"Entire TRT\"\r\n ) {\r\n viewDisabled = false;\r\n }\r\n\r\n return (\r\n \r\n {\r\n if (!viewDisabled) setIsViewingResults(true);\r\n }}\r\n >\r\n Preview Results\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n useEffect(() => {\r\n fetch(`/api/getTopConcepts`)\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n const termsObj = {};\r\n data.forEach((term) => {\r\n const { uri, prefLabel } = term;\r\n termsObj[uri] = prefLabel;\r\n });\r\n setTerms(termsObj);\r\n });\r\n }, []);\r\n\r\n function changeDownloadMode(e) {\r\n const mode = e.target.value;\r\n setDownloadMode(mode);\r\n [setTopTermUri, setYearFrom, setMonthFrom].forEach((setter) => setter(\"\"));\r\n }\r\n\r\n if (isViewingResults) {\r\n return (\r\n
    \r\n

    Viewing TRT Download

    \r\n setIsViewingResults(false)}\r\n >\r\n Return to Download\r\n \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n

    Download TRT

    \r\n

    To export the TRT, select an option and format below.

    \r\n
    \r\n \r\n {modes.map((mode) => (\r\n \r\n ))}\r\n \r\n {downloadMode === \"By Date\" && (\r\n <>\r\n

    \r\n Select a starting month and year to retrieve a file of any new TRT\r\n terms added or modified since that date.\r\n

    \r\n \r\n ({\r\n label: month,\r\n value: index,\r\n }))}\r\n value={monthFrom}\r\n onChange={(option) => setMonthFrom(option.value)}\r\n />\r\n ({ label: year, value: year }))}\r\n value={yearFrom}\r\n onChange={(option) => setYearFrom(option.value)}\r\n />\r\n \r\n \r\n )}\r\n {downloadMode === \"By Top-Level Term\" && (\r\n <>\r\n

    Choose a top-level term:

    \r\n (a[1] > b[1] ? 1 : -1))\r\n .map(([uri, prefLabel]) => ({\r\n label: prefLabel,\r\n value: uri,\r\n }))}\r\n value={topTermUri}\r\n onChange={(option) => setTopTermUri(option.value)}\r\n />\r\n \r\n )}\r\n
    \r\n \r\n ({\r\n label,\r\n value: key,\r\n }))}\r\n value={downloadFormat}\r\n onChange={(option) => setDownloadFormat(option.value)}\r\n />\r\n \r\n {createDownloadButton()}\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default DownloadArea;\r\n","import React, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled, { keyframes } from \"styled-components\";\r\nimport { FaSpinner } from \"react-icons/fa\";\r\nimport { BsDownload } from \"react-icons/bs\";\r\nimport download from \"downloadjs\";\r\nimport TermLink from \"./TermLink\";\r\nimport formats from \"./download/formats\";\r\nimport Select from \"./download/Select\";\r\n\r\nconst Description = styled.p`\r\n font-size: var(--type-size-smaller);\r\n overflow-wrap: break-word;\r\n`;\r\n\r\nconst Columns = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-content: flex-start;\r\n gap: 1em;\r\n padding-top: 1rem;\r\n`;\r\n\r\nconst Column = styled.div`\r\n width: 30%;\r\n @media (max-width: 576px) {\r\n width: 47%;\r\n }\r\n h5 {\r\n font-size: var(--type-size-smaller);\r\n margin: 0;\r\n }\r\n ul {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n }\r\n li {\r\n font-size: var(--type-size-smaller);\r\n padding-top: 0.25rem;\r\n }\r\n a {\r\n color: var(--color-academies-blue);\r\n :visited {\r\n color: var(--color-academies-blue);\r\n }\r\n }\r\n`;\r\n\r\nconst DescriptionList = styled.dl`\r\n padding-top: 1rem;\r\n font-size: var(--type-size-small);\r\n div {\r\n padding-bottom: 0.5rem;\r\n }\r\n dt {\r\n display: inline;\r\n font-style: italic;\r\n }\r\n dd {\r\n display: inline;\r\n margin-inline-start: 0;\r\n }\r\n`;\r\n\r\nconst DownloadArea = styled.div`\r\n display: flex;\r\n justify-content: flex-end;\r\n align-items: center;\r\n`;\r\n\r\nconst DownloadButton = styled.button`\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n font-size: var(--type-size-medium);\r\n background-color: var(--color-nae-blue);\r\n color: white;\r\n border: none;\r\n height: 2rem;\r\n margin-left: 1rem;\r\n border-radius: 5px;\r\n :disabled {\r\n background-color: #c4c4c4;\r\n }\r\n\r\n svg {\r\n margin-left: 0.5em;\r\n }\r\n`;\r\n\r\nconst SpinnerAnimation = keyframes`\r\n0% {\r\n -webkit-transform: rotate(0deg);\r\n transform: rotate(0deg);\r\n}\r\n100% {\r\n -webkit-transform: rotate(359deg);\r\n transform: rotate(359deg);\r\n}\r\n`;\r\n\r\nconst DownloadSpinner = styled(FaSpinner)`\r\n -webkit-animation: ${SpinnerAnimation} 2s infinite linear;\r\n animation: ${SpinnerAnimation} 2s infinite linear;\r\n`;\r\n\r\nfunction TermDetail(props) {\r\n const {\r\n uri,\r\n source,\r\n definitions,\r\n broader,\r\n narrower,\r\n related,\r\n altLabels,\r\n scopeNotes,\r\n setEmbeddedTermUri,\r\n } = props;\r\n const [downloadFormat, setDownloadFormat] = useState(\"Excel\");\r\n const [isDownloading, setIsDownloading] = useState(false);\r\n\r\n function doDownload(downloadLink) {\r\n if (!isDownloading) {\r\n setIsDownloading(true);\r\n let filename;\r\n fetch(downloadLink)\r\n .then((response) => {\r\n if (response.status === 200) {\r\n filename = response.headers.get(\"content-disposition\");\r\n [, filename] = filename.split(\"filename=\");\r\n return response.blob();\r\n }\r\n return \"\";\r\n })\r\n .then((body) => {\r\n download(body, filename, \"application/octet-stream\");\r\n setIsDownloading(false);\r\n });\r\n }\r\n }\r\n\r\n let { created } = props;\r\n\r\n created = new Date(created).toLocaleDateString();\r\n\r\n const getTermLink = (term) => (\r\n \r\n );\r\n\r\n const relatedLinks = [\r\n {\r\n label: \"RIP\",\r\n url: `https://rip.trb.org/Results?${new URLSearchParams({\r\n specificTerms: uri,\r\n q: \"\",\r\n })}`,\r\n },\r\n {\r\n label: \"TRID\",\r\n url: `https://trid.trb.org/Results?${new URLSearchParams({\r\n specificTerms: uri,\r\n q: \"\",\r\n })}`,\r\n },\r\n {\r\n label: \"PubsIndex\",\r\n url: `https://pubsindex.trb.org/results.aspx?${new URLSearchParams({\r\n specificTerms: uri,\r\n })}`,\r\n },\r\n ].map((link) => (\r\n // Open external links in new tab if using embedded view.\r\n
  • \r\n {setEmbeddedTermUri ? (\r\n \r\n {link.label}\r\n \r\n ) : (\r\n {link.label}\r\n )}\r\n
  • \r\n ));\r\n\r\n const alphaTermCompareFn = (a, b) =>\r\n a.prefLabel.toLowerCase() > b.prefLabel.toLowerCase() ? 1 : -1;\r\n\r\n return (\r\n
    \r\n {definitions[0] && (\r\n \r\n {definitions[0]} {source && <>(Source: {source})}\r\n \r\n )}\r\n \r\n {altLabels.length ? (\r\n \r\n
    Use For
    \r\n
      \r\n {altLabels.sort().map((label) => (\r\n
    • {label}
    • \r\n ))}\r\n
    \r\n
    \r\n ) : null}\r\n {broader ? (\r\n \r\n
    Broader Term
    \r\n
      \r\n
    • {getTermLink(broader)}
    • \r\n
    \r\n
    \r\n ) : null}\r\n {narrower.length ? (\r\n \r\n
    Narrower Terms
    \r\n
      \r\n {narrower.sort(alphaTermCompareFn).map((term) => (\r\n
    • {getTermLink(term)}
    • \r\n ))}\r\n
    \r\n
    \r\n ) : null}\r\n {related.length ? (\r\n \r\n
    Related Terms
    \r\n
      \r\n {related.sort(alphaTermCompareFn).map((term) => (\r\n
    • {getTermLink(term)}
    • \r\n ))}\r\n
    \r\n
    \r\n ) : null}\r\n \r\n
    Find Related Records
    \r\n
      {relatedLinks}
    \r\n
    \r\n
    \r\n \r\n {scopeNotes.length ? (\r\n
    \r\n
    Scope Notes:
    \r\n
    {scopeNotes[0]}
    \r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n
    Created:
    \r\n
    {created}
    \r\n
    \r\n
    \r\n
    \r\n {!setEmbeddedTermUri ? (\r\n \r\n ({\r\n label,\r\n value: key,\r\n }))}\r\n value={downloadFormat}\r\n onChange={(option) => setDownloadFormat(option.value)}\r\n />\r\n \r\n doDownload(\r\n `/download/file?${new URLSearchParams({\r\n format: downloadFormat,\r\n uri,\r\n isSubtreeExport: false,\r\n })}`\r\n )\r\n }\r\n >\r\n Download {isDownloading ? : }\r\n \r\n \r\n ) : null}\r\n
    \r\n );\r\n}\r\n\r\nconst childConceptProp = PropTypes.arrayOf(\r\n PropTypes.objectOf(PropTypes.string)\r\n);\r\n\r\nTermDetail.propTypes = {\r\n uri: PropTypes.string.isRequired,\r\n source: PropTypes.string,\r\n altLabels: PropTypes.arrayOf(PropTypes.string),\r\n definitions: PropTypes.arrayOf(PropTypes.string),\r\n broader: PropTypes.objectOf(PropTypes.string),\r\n narrower: childConceptProp,\r\n related: childConceptProp,\r\n scopeNotes: PropTypes.arrayOf(PropTypes.string),\r\n created: PropTypes.string,\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nTermDetail.defaultProps = {\r\n source: \"\",\r\n altLabels: [],\r\n definitions: [],\r\n broader: {},\r\n narrower: [],\r\n related: [],\r\n scopeNotes: [],\r\n created: \"\",\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default TermDetail;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\nimport TermLink from \"./TermLink\";\r\n\r\nconst StyledOl = styled.ol`\r\n list-style-type: none;\r\n padding-inline-start: 0;\r\n padding-bottom: 0.5rem;\r\n margin: 0;\r\n display: flex;\r\n flex-wrap: wrap;\r\n\r\n li {\r\n font-style: italic;\r\n font-size: var(--type-size-medium);\r\n color: grey;\r\n padding-right: 0.25rem;\r\n }\r\n\r\n li.term::after {\r\n content: \" >\";\r\n }\r\n\r\n li.final {\r\n color: #767676;\r\n font-weight: bold;\r\n }\r\n`;\r\n\r\nfunction BreadcrumbBar(props) {\r\n const { terms, setEmbeddedTermUri } = props;\r\n const parentTerms = terms.slice(0, terms.length - 1);\r\n const thisTerm = terms[terms.length - 1];\r\n\r\n return (\r\n \r\n
  • Top Terms
  • \r\n {parentTerms.map((term) => (\r\n {term.prefLabel}}\r\n setEmbeddedTermUri={setEmbeddedTermUri}\r\n />\r\n ))}\r\n
  • {thisTerm.prefLabel}
  • \r\n
    \r\n );\r\n}\r\n\r\nBreadcrumbBar.propTypes = {\r\n terms: PropTypes.arrayOf(PropTypes.objectOf(PropTypes.string)).isRequired,\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nBreadcrumbBar.defaultProps = {\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default BreadcrumbBar;\r\n","import React, { useState } from \"react\";\r\nimport styled from \"styled-components\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst Button = styled.button`\r\n background-color: var(--color-nae-blue);\r\n font-size: var(--type-size-smaller);\r\n color: white;\r\n border: none;\r\n border-radius: 5px;\r\n padding: 0.5rem;\r\n flex-shrink: 0;\r\n\r\n &.was-added {\r\n background-color: var(--color-nam-green);\r\n }\r\n`;\r\n\r\nfunction AddToRecordButton(props) {\r\n const { termLabel, termUri } = props;\r\n\r\n const [wasAdded, setWasAdded] = useState(false);\r\n\r\n // the URL of the page rendering the tool. Will use wildcard if this enviroment variable isn't provided.\r\n const parentDomain = process.env.EMBED_PARENT_DOMAIN;\r\n\r\n return (\r\n <>\r\n {\r\n window.parent.postMessage(\r\n { termLabel, termUri },\r\n parentDomain || \"*\"\r\n );\r\n setWasAdded(true);\r\n }}\r\n disabled={wasAdded}\r\n added={wasAdded}\r\n >\r\n {wasAdded ? \"Added to Record\" : \"Add to Record\"}\r\n \r\n \r\n );\r\n}\r\n\r\nAddToRecordButton.propTypes = {\r\n termLabel: PropTypes.string.isRequired,\r\n termUri: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default AddToRecordButton;\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport styled from \"styled-components\";\r\nimport smoothscroll from \"smoothscroll-polyfill\";\r\nimport TermDetail from \"./TermDetail\";\r\nimport BreadcrumbBar from \"./BreadcrumbBar\";\r\nimport AddToRecordButton from \"./AddToRecordButton\";\r\nimport { extractTermId } from \"./utils\";\r\n\r\n// Support smooth scrolling in Safari.\r\nsmoothscroll.polyfill();\r\n\r\nconst Header = styled.h3`\r\n color: var(--color-academies-blue);\r\n font-size: var(--type-size-large);\r\n margin-bottom: 0;\r\n padding-bottom: 0.5rem;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 0.5rem;\r\n`;\r\n\r\nfunction TermDisplay(props) {\r\n gtag('event', 'page_view');\r\n const { embeddedTermUri, setEmbeddedTermUri } = props;\r\n\r\n let termId;\r\n if (!embeddedTermUri) {\r\n ({ termId } = useParams());\r\n } else {\r\n termId = extractTermId(embeddedTermUri);\r\n }\r\n const isEmbedded = Boolean(embeddedTermUri);\r\n\r\n const [details, setDetails] = useState();\r\n const [breadcrumbTerms, setBreadcrumbTerms] = useState([]);\r\n\r\n const scrollRef = useRef();\r\n\r\n useEffect(() => {\r\n let isSubscribed = true;\r\n setDetails(null);\r\n\r\n // If term display is not on the screen, scroll up to it.\r\n if (scrollRef.current.getBoundingClientRect().top < 0) {\r\n // Enable smooth scrolling unless prefers-reduced-motion enabled.\r\n const behavior = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\r\n .matches\r\n ? \"auto\"\r\n : \"smooth\";\r\n scrollRef.current.scrollIntoView({ behavior });\r\n }\r\n\r\n fetch(`/api/getConceptDetails?${new URLSearchParams({ uriOrId: termId })}`)\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n if (isSubscribed) {\r\n setDetails(data);\r\n }\r\n });\r\n return () => {\r\n isSubscribed = false;\r\n };\r\n }, [termId]);\r\n\r\n useEffect(() => {\r\n let isSubscribed = true;\r\n setBreadcrumbTerms([]);\r\n const url = `/api/getConceptParents?${new URLSearchParams({\r\n uriOrId: termId,\r\n })}`;\r\n fetch(url)\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n if (isSubscribed) {\r\n setBreadcrumbTerms(data);\r\n }\r\n });\r\n return () => {\r\n isSubscribed = false;\r\n };\r\n }, [termId]);\r\n\r\n return (\r\n
    \r\n {details ? (\r\n
    \r\n {details.prefLabel}{\" \"}\r\n {isEmbedded && (\r\n \r\n )}\r\n
    \r\n ) : (\r\n Loading...\r\n )}\r\n\r\n {breadcrumbTerms.length ? (\r\n \r\n ) : (\r\n details && Loading breadcrumbs...\r\n )}\r\n {details ? (\r\n \r\n ) : null}\r\n
    \r\n );\r\n}\r\n\r\nTermDisplay.propTypes = {\r\n embeddedTermUri: PropTypes.string,\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nTermDisplay.defaultProps = {\r\n embeddedTermUri: null,\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default TermDisplay;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Redirect, useLocation } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport { useTransition, animated } from \"react-spring\";\r\nimport styled from \"styled-components\";\r\nimport {\r\n BsPlusCircle as PlusIcon,\r\n BsDashCircle as MinusIcon,\r\n} from \"react-icons/bs\";\r\nimport TermDetail from \"./TermDetail\";\r\nimport BreadcrumbBar from \"./BreadcrumbBar\";\r\nimport TermLink from \"./TermLink\";\r\nimport AddToRecordButton from \"./AddToRecordButton\";\r\nimport StatusMessage from \"./StatusMessage\";\r\n\r\nconst SearchDescription = styled.p`\r\n font-size: var(--type-size-larger);\r\n .highlight {\r\n color: var(--color-academies-blue);\r\n font-weight: bold;\r\n }\r\n border-bottom: 1.5px solid #999999;\r\n padding-bottom: 1rem;\r\n margin: 0;\r\n`;\r\n\r\nconst Result = styled.div`\r\n padding: 1rem 0;\r\n border-bottom: 1.5px solid #c4c4c4;\r\n`;\r\n\r\nconst ResultHeader = styled.div`\r\n a {\r\n font-size: var(--type-size-larger);\r\n font-weight: 400;\r\n color: var(--color-academies-blue);\r\n }\r\n em {\r\n font-size: var(--type-size-smaller);\r\n font-weight: 400;\r\n }\r\n svg {\r\n flex-shrink: 0;\r\n }\r\n margin: 0;\r\n padding: 0rem;\r\n display: flex;\r\n gap: 0.5rem;\r\n align-items: center;\r\n`;\r\n\r\nconst ResultExpandButton = styled.button`\r\n display: flex;\r\n text-align: left;\r\n justify-content: space-between;\r\n width: 100%;\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n align-items: center;\r\n gap: 0.5rem;\r\n &:hover {\r\n cursor: pointer;\r\n }\r\n`;\r\n\r\nconst ResultContainer = styled.div`\r\n max-height: 60rem;\r\n padding-right: 0.5rem;\r\n overflow-y: auto;\r\n\r\n @media (max-width: 576px) {\r\n max-height: 40rem;\r\n }\r\n\r\n &.embedded {\r\n max-height: none;\r\n overflow-y: none;\r\n }\r\n`;\r\n\r\nconst ResultBroader = styled.div`\r\n a,\r\n span {\r\n font-style: italic;\r\n font-size: var(--type-size-smaller);\r\n color: grey !important;\r\n }\r\n`;\r\n\r\nconst UseForText = styled.span`\r\n font-style: italic;\r\n color: grey;\r\n font-size: var(--type-size-medium);\r\n`;\r\n\r\nconst iconStyles = { color: \"var(--color-academies-blue)\", size: \"1.25rem\" };\r\n\r\nfunction SearchResults(props) {\r\n gtag('event', 'page_view');\r\n const { embeddedSearchTerm, setEmbeddedTermUri } = props;\r\n\r\n // If not embedded, get search term from query param. Redirect to Home if missing.\r\n let searchTerm;\r\n if (embeddedSearchTerm) {\r\n searchTerm = embeddedSearchTerm;\r\n } else {\r\n const params = new URLSearchParams(useLocation().search);\r\n searchTerm = params.get(\"term\");\r\n if (!searchTerm) {\r\n return ;\r\n }\r\n }\r\n\r\n const [results, setResults] = useState([]);\r\n const [breadcrumbTerms, setBreadcrumbTerms] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [expandedResultIndex, setExpandedResultIndex] = useState(-1);\r\n const [expandedTermDetails, setExpandedTermDetails] = useState(null);\r\n\r\n const transitions = useTransition(\r\n expandedResultIndex !== -1 && expandedTermDetails,\r\n {\r\n from: { opacity: 0, maxHeight: \"0px\" },\r\n enter: { opacity: 1, maxHeight: \"1000px\" },\r\n leave: { opacity: 0, maxHeight: \"0px\" },\r\n }\r\n );\r\n\r\n useEffect(() => {\r\n let isSubscribed = true;\r\n if (searchTerm.length < 3) {\r\n setLoading(false);\r\n setErrorMessage(\r\n \"Please enter a search term of at least three characters.\"\r\n );\r\n } else {\r\n setLoading(true);\r\n setResults([]);\r\n setExpandedResultIndex(-1);\r\n fetch(\r\n `/api/getSearchResults?${new URLSearchParams({\r\n text: searchTerm,\r\n })}`\r\n )\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n if (isSubscribed) {\r\n const exactMatches = data.filter(\r\n (result) =>\r\n result.label.toLowerCase() === searchTerm.toLowerCase()\r\n );\r\n\r\n const otherResults = data\r\n .filter((result) => !exactMatches.includes(result))\r\n .sort((a, b) =>\r\n a.label.toLowerCase() > b.label.toLowerCase() ? 1 : -1\r\n );\r\n setResults(exactMatches.concat(otherResults));\r\n setLoading(false);\r\n setExpandedResultIndex(0);\r\n setErrorMessage(\"\");\r\n }\r\n })\r\n .catch(() => {\r\n if (isSubscribed) {\r\n setLoading(false);\r\n setErrorMessage(\"Error: Unable to retrieve search results.\");\r\n }\r\n });\r\n }\r\n\r\n return () => {\r\n isSubscribed = false;\r\n };\r\n }, [searchTerm]);\r\n\r\n useEffect(() => {\r\n let isSubscribed = true;\r\n if (results.length && expandedResultIndex >= 0) {\r\n setExpandedTermDetails(null);\r\n setBreadcrumbTerms([]);\r\n const termUri = results[expandedResultIndex].uri;\r\n fetch(\r\n `/api/getConceptDetails?${new URLSearchParams({ uriOrId: termUri })}`\r\n )\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n if (isSubscribed) {\r\n setExpandedTermDetails(data);\r\n }\r\n });\r\n\r\n fetch(\r\n `/api/getConceptParents?${new URLSearchParams({\r\n uriOrId: termUri,\r\n })}`\r\n )\r\n .then((resp) => resp.json())\r\n .then((data) => {\r\n if (isSubscribed) {\r\n setBreadcrumbTerms(data);\r\n }\r\n });\r\n }\r\n\r\n return () => {\r\n isSubscribed = false;\r\n };\r\n }, [expandedResultIndex, results]);\r\n\r\n if (loading) {\r\n return Loading search results...;\r\n }\r\n\r\n return (\r\n <>\r\n

    Search Results

    \r\n {!errorMessage ? (\r\n \r\n Your search for {searchTerm}{\" \"}\r\n returned {results.length ? \"the following:\" : \"no results.\"}\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {results.map((result, resultIndex) => {\r\n let BroaderTerm = () => (\r\n \r\n Broader Term: \r\n \r\n \r\n );\r\n if (resultIndex === expandedResultIndex && breadcrumbTerms.length) {\r\n BroaderTerm = () => (\r\n \r\n );\r\n } else if (result.broaderLabel === \"TRT\") {\r\n BroaderTerm = () => (\r\n \r\n Top-Level Term\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n {\r\n setExpandedResultIndex(resultIndex);\r\n setExpandedTermDetails(null);\r\n setBreadcrumbTerms([]);\r\n }\r\n : () => {\r\n setExpandedResultIndex(-1);\r\n setExpandedTermDetails(null);\r\n setBreadcrumbTerms([]);\r\n }\r\n }\r\n >\r\n
    \r\n \r\n {result.useFor && (\r\n USE FOR {result.useFor}\r\n )}\r\n
    \r\n {resultIndex === expandedResultIndex ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {embeddedSearchTerm && (\r\n \r\n )}\r\n
    \r\n \r\n {resultIndex === expandedResultIndex &&\r\n expandedTermDetails &&\r\n transitions(\r\n (styles, item) =>\r\n item &&\r\n item.uri === expandedTermDetails.uri && (\r\n \r\n \r\n \r\n )\r\n )}\r\n {resultIndex === expandedTermDetails && !expandedTermDetails ? (\r\n Loading details...\r\n ) : null}\r\n
    \r\n );\r\n })}\r\n
    \r\n \r\n );\r\n}\r\n\r\nSearchResults.propTypes = {\r\n embeddedSearchTerm: PropTypes.string,\r\n setEmbeddedTermUri: PropTypes.func,\r\n};\r\n\r\nSearchResults.defaultProps = {\r\n embeddedSearchTerm: null,\r\n setEmbeddedTermUri: null,\r\n};\r\n\r\nexport default SearchResults;\r\n","import React, { useState } from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Search from \"./Search\";\r\nimport SearchResults from \"./SearchResults\";\r\nimport TermDisplay from \"./TermDisplay\";\r\nimport Browse from \"./browse/Browse\";\r\n\r\nconst Container = styled.div`\r\n padding: 1rem;\r\n padding-top: 0;\r\n`;\r\n\r\nconst FixedSearch = styled.div`\r\n position: sticky;\r\n top: 0;\r\n padding-top: 1rem;\r\n width: 100%;\r\n background: white;\r\n`;\r\n\r\nfunction EmbeddableView() {\r\n const [termUri, setTermUri] = useState(\"\");\r\n const [searchTerm, setSearchTerm] = useState(\"\");\r\n\r\n return (\r\n \r\n \r\n

    Transportation Research Thesaurus (TRT)

    \r\n \r\n
    \r\n\r\n {termUri && (\r\n \r\n )}\r\n {searchTerm && !termUri && (\r\n \r\n )}\r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default EmbeddableView;\r\n","import React, { useState } from \"react\";\r\nimport styled from \"styled-components\";\r\nimport { FaPlusCircle, FaMinusCircle } from \"react-icons/fa\";\r\nimport ReCaptchaV2 from \"react-google-recaptcha\";\r\nimport { TextInput, SubmitButton, CaptchaContainer } from \"./FormElements\";\r\nimport StatusMessage from \"./StatusMessage\";\r\nimport { useInput } from \"./utils\";\r\n\r\nconst TermContainer = styled.div`\r\n padding: 0 0.5rem;\r\n border-bottom: 1px solid lightgrey;\r\n margin: 1rem 0;\r\n`;\r\n\r\nconst ButtonContainer = styled.div`\r\n display: flex;\r\n padding: 0.5rem;\r\n gap: 0.5rem;\r\n`;\r\n\r\nconst Button = styled.button`\r\n display: flex;\r\n align-items: center;\r\n color: white;\r\n text-align: left;\r\n font-size: var(--type-size-smaller);\r\n border: none;\r\n border-radius: 5px;\r\n padding: 0.5rem;\r\n gap: 0.5rem;\r\n background: var(--color-nae-blue);\r\n \r\n &.remove {\r\n background: var(--color-red-brick);\r\n }\r\n svg {\r\n font-size: 1rem;\r\n color: white;\r\n }\r\n \r\n :disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n svg {\r\n color: #c4c4c4;\r\n }\r\n`;\r\n\r\nconst maxTerms = 5;\r\nconst termTemplate = { term: \"\", note: \"\" };\r\nObject.freeze(termTemplate);\r\n\r\nfunction TermSuggestion() {\r\n gtag('event', 'page_view');\r\n const [name, setName] = useInput(\"\");\r\n const [emailAddress, setEmailAddress] = useInput(\"\");\r\n const [affiliation, setAffiliation] = useInput(\"\");\r\n const [terms, setTerms] = useState([{ ...termTemplate }]);\r\n\r\n const recaptchaRef = React.useRef();\r\n const [captchaToken, setCaptchaToken] = useState(\"\");\r\n\r\n // array of status message and type\r\n const [status, setStatus] = useState([]);\r\n\r\n function handleSubmit(e) {\r\n e.preventDefault();\r\n fetch(\"/api/submitSuggestion\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n name,\r\n emailAddress,\r\n affiliation,\r\n terms: terms.filter((term) => term.term),\r\n captchaToken,\r\n }),\r\n })\r\n .then((resp) => resp.text())\r\n .then((text) => {\r\n if (text === \"Captcha code invalid.\") {\r\n setStatus([\r\n \"Unable to send messsage: captcha code invalid.\",\r\n \"error\",\r\n ]);\r\n } else if (text === \"Suggestion submitted.\") {\r\n const successMessage = `Thank you for your term suggestion${\r\n terms.length > 1 ? \"s\" : \"\"\r\n }. We appreciate your input. The TRT Subcommittee will consider your proposed term${\r\n terms.length > 1 ? \"s\" : \"\"\r\n } at a future meeting.`;\r\n setStatus([successMessage, \"success\"]);\r\n e.target.reset();\r\n } else {\r\n setStatus([\"Error: unable to send term suggestion.\", \"error\"]);\r\n }\r\n })\r\n .catch(() => {\r\n setStatus([\"Error: unable to verify captcha code.\", \"error\"]);\r\n });\r\n setCaptchaToken(\"\");\r\n recaptchaRef.current.reset();\r\n }\r\n\r\n return (\r\n
    \r\n

    Suggest New TRT Terms

    \r\n

    \r\n Use the form below to suggest up to 5 new terms for inclusion in the\r\n Transportation Research Thesaurus. Use the comment box to include any\r\n information supporting the request for the new term such as a citation\r\n or source and to recommend where the new term should appear in the\r\n hierarchy.\r\n

    \r\n
    \r\n
    \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n {terms.map((term, index) => (\r\n // eslint-disable-next-line react/no-array-index-key\r\n
    \r\n

    Suggested Term {index + 1}

    \r\n \r\n \r\n\r\n \r\n \r\n
    \r\n ))}\r\n \r\n {\r\n setTerms(terms.concat({ ...termTemplate }));\r\n }}\r\n disabled={terms.length >= maxTerms}\r\n >\r\n \r\n Suggest Another Term\r\n \r\n\r\n {\r\n setTerms(terms.slice(0, -1));\r\n }}\r\n disabled={terms.length <= 1}\r\n >\r\n Remove Suggestion\r\n \r\n \r\n \r\n {\r\n setCaptchaToken(token);\r\n }}\r\n onExpired={() => setCaptchaToken(null)}\r\n />\r\n \r\n term.term),\r\n ].some((elem) => !elem)}\r\n />\r\n \r\n {status.length ? (\r\n \r\n ) : null}\r\n
    \r\n );\r\n}\r\n\r\nexport default TermSuggestion;\r\n","import React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport TermDetailImage from \"./images/term-detail.png\";\r\nimport FindTermImage from \"./images/find-term.png\";\r\nimport paths from \"./paths\";\r\n\r\nconst Figure = styled.figure`\r\n margin: 0;\r\n padding: 1rem 0.25rem;\r\n img {\r\n width: 100%;\r\n border: 1px solid lightgrey;\r\n }\r\n figcaption {\r\n font-size: var(--type-size-smaller);\r\n font-style: italic;\r\n }\r\n`;\r\n\r\nconst Link = styled.a`\r\n color: var(--color-academies-blue);\r\n &:visited {\r\n color: var(--color-academies-blue);\r\n }\r\n`;\r\n\r\nfunction HowToUse() {\r\n gtag('event', 'page_view');\r\n return (\r\n <>\r\n

    How to Use the TRT

    \r\n
    \r\n

    \r\n The Transportation Research Thesaurus (TRT) contains approximately\r\n 9,500 preferred terms and 2,500 non-preferred terms.\r\n

    \r\n

    \r\n Preferred terms ensure that the same word will be used consistently to\r\n label the same concept or idea.\r\n

    \r\n

    \r\n Non-preferred terms are synonyms, variant names or alternative\r\n spellings of preferred terms. Non-preferred terms direct the user to\r\n the preferred term for the concept in question.\r\n

    \r\n

    \r\n TRT terms are organized hierarchically under 21 general top-level\r\n terms. Proper names, including geographic names, are NOT included in\r\n the TRT.\r\n

    \r\n
    \r\n
    \r\n

    Find a Term

    \r\n
    \r\n \"Search\r\n
    \r\n

    Search

    \r\n

    \r\n Type a word or string of letters in the search field. As you type,\r\n potential matches appear in a drop-down list. You may click on any\r\n term in this list to see the term display. Or, click the 🔍 button to\r\n see a list of all matches starting with or containing that string. The\r\n best match will appear first, followed by other matches in\r\n alphabetical order. For example, “access” will return Access, Access\r\n control (Communications), Access control (Transportation), Access\r\n roads, Accessibility, etc.\r\n

    \r\n

    \r\n Searches are performed on both preferred terms and non-preferred\r\n terms. Non-preferred terms appear in italics and will also display the\r\n preferred term.\r\n

    \r\n

    \r\n Boolean operators OR and AND can be used to broaden or narrow search\r\n results. Boolean operators must be typed in upper case.\r\n

    \r\n

    Browse the Hierarchical Index

    \r\n

    \r\n Clicking on hierarchy produces a list of all 21 top-level terms for\r\n the hierarchies. Click on the arrow beside a specific top-level term\r\n to see a list of narrower terms belonging to that hierarchy. Clicking\r\n on a term in the term list will display the term record.\r\n

    \r\n

    Browse the Alphabetical Index

    \r\n

    \r\n Clicking on a letter in the Browse Alphabetical list produces an\r\n alphabetical list of all terms beginning with that letter. Click on a\r\n term in the alphabetical list to display the term record. In the\r\n alphabetical indexes, non-preferred terms will include a link to the\r\n preferred term.\r\n

    \r\n
    \r\n
    \r\n

    Display a Term

    \r\n

    \r\n To see a term’s full record, click on the term in the results display\r\n when using either the Search or Browse features. The record shows the\r\n term’s semantic network: hierarchical position, broader term, narrower\r\n terms, non-preferred (i.e., Use For terms) and related terms.\r\n

    \r\n

    Some preferred terms also include definitions and scope notes.

    \r\n
    \r\n \"Term\r\n
    Example of Term Record
    \r\n
    \r\n
    \r\n
    \r\n

    Find Related Records

    \r\n

    \r\n TRT terms are used to index records in TRB’s TRID, Research in\r\n Progress and Publications Index databases. To search for a particular\r\n term in one of these databases, click the appropriate link in the term\r\n record.\r\n

    \r\n
    \r\n
    \r\n

    Download Options

    \r\n

    \r\n Each term can be downloaded in Excel, CSV, RDF XML, Binary XML or N3\r\n format by choosing an option at the bottom of the term’s record.\r\n

    \r\n

    \r\n You also may export the entire TRT, or a customized portion by date or\r\n top-level term, on the Download{\" \"}\r\n page.\r\n

    \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default HowToUse;\r\n","import React from \"react\";\r\nimport styled from \"styled-components\";\r\n\r\nconst Link = styled.a`\r\n color: var(--color-academies-blue);\r\n font-weight: bold;\r\n`;\r\n\r\nconst Links = styled.ul`\r\n margin: 0;\r\n line-height: 2;\r\n li {\r\n list-style: none;\r\n }\r\n`;\r\n\r\nfunction AboutTRT() {\r\n gtag('event', 'page_view');\r\n return (\r\n <>\r\n

    About the TRT

    \r\n

    \r\n The Transportation Research Thesaurus (TRT) was initially developed\r\n under{\" \"}\r\n \r\n NCHRP Project 20-32\r\n {\" \"}\r\n to provide a tool to improve the indexing and retrieval of\r\n transportation information. The thesaurus covers all modes and aspects\r\n of transportation. A primary use is to provide a common and consistent\r\n language between producers and users of the{\" \"}\r\n \r\n Transportation Research Information Services (TRIS)\r\n {\" \"}\r\n Database. The thesaurus is currently also used as an indexing tool for\r\n federal, state and university collections. Through the use of the TRT’s\r\n standardized vocabulary, the transportation community’s access to\r\n information has been improved.\r\n

    \r\n

    \r\n The TRT currently has over 12,000 terms: approximately 9,500 preferred\r\n terms and 2,500 non-preferred (i.e., lead-in) terms. The terms are\r\n arranged in hierarchies under 21 top-level terms. The TRT is regularly\r\n updated, with terms vetted by a committee of transportation information\r\n professionals, to ensure that it reflects current terminology and\r\n concepts in the transportation sector.\r\n

    \r\n

    \r\n For further information on the development of Transportation Research\r\n Thesaurus see{\" \"}\r\n \r\n {\" \"}\r\n NCHRP Report 450 - Transportation Research Thesaurus and User Guide\r\n \r\n . In 2016, a review of the TRT was launched.{\" \"}\r\n \r\n {\" \"}\r\n NCHRP Research Report 874 - The Transportation Research Thesaurus:\r\n Capabilities and Enhancements\r\n {\" \"}\r\n documents the first phase of{\" \"}\r\n \r\n NCHRP 20-109\r\n \r\n , which entailed a comprehensive assessment of the TRT’s capabilities\r\n and strategies for the TRT’s future development. The TRT website was\r\n redesigned as a Phase II activity of this project.\r\n

    \r\n

    \r\n Three short video tutorials on how and why to use the TRT are also\r\n available:{\" \"}\r\n

    \r\n \r\n
  • \r\n \r\n Why Use the Transportation Research Thesaurus?\r\n \r\n
  • \r\n\r\n
  • \r\n \r\n Super Searching with the Transportation Research Thesaurus\r\n \r\n
  • \r\n\r\n
  • \r\n \r\n Keywords for the Technical Report Documentation Page: Let the TRT\r\n Help\r\n \r\n
  • \r\n
    \r\n

    \r\n For more information about the TRT, or any of the TRIS Databases, please\r\n visit our{\" \"}\r\n \r\n {\" \"}\r\n Documentation and Training Materials\r\n \r\n .\r\n

    \r\n \r\n );\r\n}\r\n\r\nexport default AboutTRT;\r\n","import React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport { BsCameraVideo } from \"react-icons/bs\";\r\n\r\nconst Header = styled.h3`\r\n padding-bottom: 1rem;\r\n`;\r\n\r\nconst LinksBox = styled.ul`\r\n background: var(--color-pale-background);\r\n padding: 1rem;\r\n margin: 0;\r\n line-height: 1.5;\r\n\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.5rem;\r\n\r\n li {\r\n list-style: none;\r\n }\r\n\r\n a {\r\n color: var(--color-nae-blue);\r\n\r\n display: flex;\r\n gap: 1rem;\r\n align-items: center;\r\n }\r\n\r\n a > svg {\r\n flex: 0 0 1.5rem;\r\n }\r\n\r\n svg > path {\r\n fill: var(--color-ocean-blue);\r\n}\r\n\r\n`;\r\n\r\nconst links = [\r\n {\r\n text: \"The TRT: Your Multi-Tool for Finding and Organizing Transportation Information\",\r\n url: \"https://vimeo.com/266159036\",\r\n isVideo: true,\r\n title: 'Video link'\r\n },\r\n {\r\n text: \"Super Searching with the TRT\",\r\n url: \"https://vimeo.com/266158951\",\r\n isVideo: true,\r\n title: 'Video link'\r\n },\r\n {\r\n text: \"Keywords for the Technical Report Documentation Page: Let the TRT Help\",\r\n url: \"https://vimeo.com/496881977\",\r\n isVideo: true,\r\n title: 'Video link'\r\n },\r\n {\r\n text: \"About TRB’s Transportation Research Information Services (TRIS)\",\r\n url: \"http://www.trb.org/InformationServices/InformationServices.aspx\",\r\n },\r\n { text: \"TRID--the TRIS and ITRD Database\", url: \"https://trid.trb.org/\" },\r\n {\r\n text: \"Research in Progress (RIP) Database\",\r\n url: \"https://rip.trb.org/\",\r\n },\r\n { text: \"TRB Publications Index\", url: \"https://pubsindex.trb.org/\" },\r\n {\r\n text: \"TRIS Databases: Documentation & Training Materials\",\r\n url: \"http://www.trb.org/InformationServices/ResourcesfortheTRISDatabases.aspx\",\r\n }\r\n];\r\n\r\nfunction Resources() {\r\n return (\r\n <>\r\n
    Resources
    \r\n \r\n {links.map((link) => (\r\n
  • \r\n \r\n {link.isVideo && ()}\r\n {link.text}\r\n \r\n
  • \r\n ))}\r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default Resources;\r\n","import React from \"react\";\r\nimport styled from \"styled-components\";\r\nimport Image from \"./images/connected-roads-scaled.jpg\";\r\nimport Resources from \"./Resources\";\r\n\r\nconst HeaderImage = styled.img`\r\n width: 100%;\r\n padding-bottom: 2rem;\r\n`;\r\n\r\n// Hide Resources when in mobile view. It will then be rendered under Search, Browse etc.\r\nconst ResourcesContainer = styled.div`\r\n padding-top: 2rem;\r\n @media (max-width: 576px) {\r\n display: none;\r\n }\r\n`;\r\n\r\nfunction Home() {\r\n return (\r\n <>\r\n

    Welcome to the TRT

    \r\n \r\n

    \r\n The Transportation Research Thesaurus (TRT) is a tool to provide a\r\n common and consistent language between producers and users of\r\n transportation information. The TRT covers all modes and aspects of\r\n transportation. Terms are arranged in hierarchies under 21 top concepts.\r\n

    \r\n

    \r\n You can search the TRT by keyword, or browse alphabetically and by\r\n hierarchy. Click on any term to view its relationships (broader,\r\n narrower, and related terms) and to find records indexed with that term\r\n in TRB’s TRID, Research in Progress (RIP) and Publications Index\r\n databases.\r\n

    \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default Home;\r\n","import React from \"react\";\r\nimport { BrowserRouter as Router, Switch, Route } from \"react-router-dom\";\r\nimport styled from \"styled-components\";\r\n\r\nimport paths from \"./paths\";\r\nimport Container from \"./Container\";\r\nimport Browse from \"./browse/Browse\";\r\nimport Search from \"./Search\";\r\nimport Contact from \"./Contact\";\r\nimport HotTopics from \"./HotTopics\";\r\nimport Header from \"./Header\";\r\nimport RecentlyAdded from \"./RecentlyAdded\";\r\nimport Footer from \"./Footer\";\r\nimport DownloadArea from \"./download/DownloadArea\";\r\nimport TermDisplay from \"./TermDisplay\";\r\nimport EmbeddableView from \"./EmbeddableView\";\r\nimport TermSuggestion from \"./TermSuggestion\";\r\nimport HowToUse from \"./HowToUse\";\r\nimport AboutTRT from \"./AboutTRT\";\r\nimport Resources from \"./Resources\";\r\nimport SearchResults from \"./SearchResults\";\r\nimport Home from \"./Home\";\r\n\r\n\r\nconst Column = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n width: 50%;\r\n padding-bottom: 2rem;\r\n @media (max-width: 576px) {\r\n width: auto;\r\n }\r\n`;\r\n\r\nconst Main = styled(Container)`\r\n display: flex;\r\n column-gap: 4rem;\r\n padding-top: 3rem;\r\n\r\n @media (max-width: 768px) {\r\n padding-top: 1.5rem;\r\n column-gap: 3rem;\r\n }\r\n @media (max-width: 576px) {\r\n flex-direction: column;\r\n width: auto;\r\n margin-left: 1.5rem;\r\n margin-right: 1.5rem;\r\n }\r\n`;\r\n\r\n// Only show Resources at the bottom in mobile view.\r\nconst ResourcesContainer = styled.div`\r\n @media (min-width: 577px) {\r\n display: none;\r\n }\r\n`;\r\n\r\n\r\nfunction App() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n