{"version":3,"file":"static/js/807.9996bb32.chunk.js","mappings":"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","sources":["components/common/ApiDocsHero/ApiDocsHero.js","components/common/NumberCallouts/NumberCallouts.js","components/common/Resource/ResourceHero.js","components/common/SmallBanner/SmallBanner.js","components/common/AccessApiModal/AccessApiModal.js","components/pages/DatasetPage/DatasetPageModals.js","hocs/withAccessApiModal/withAccessApiModal.js","components/icons/SubscribeIcon.js","assets/circleBackground.svg","components/dataset/DatasetHero/DatasetHero.js","components/icons/DataIcon.js","components/icons/AccessIcon.js","assets/fontawesome/solid/list.svg","components/dataset/DataBar/DataBar.js","components/common/NumberCallouts/DynamicNumberCallouts.js","components/common/HelpDeskContact/HelpDeskContact.js","components/dataset/DatasetRelated/DatasetRelated.js","components/dataset/DatasetDetails/DatasetDetails.js","components/dataset/DatasetDetails/DatasetDetailsVersions.js","components/pages/DatasetPage/DatasetPage.js","components/dataset/DatasetVersionDropdown/DatasetVersionDropdown.js","components/common/ClipboardCopyBtn/ClipboardCopyBtn.js","components/dataset/DataTable/InteractiveDataResources.js","components/dataset/DataTable/DataReloadTrigger.js","assets/fontawesome/solid/magnifying-glass.svg","assets/fontawesome/solid/sort.svg","components/dataset/DataTable/ColumnConfigurator.js","components/dataset/DataTable/DataExportModal.js","components/dataset/DataTable/DataTableToolbar.js","components/common/MultiValueTextInput/MultiValueTextInput.js","components/dataset/DataTable/FilterFormConjunctionDropdown.js","components/dataset/DataTable/FilterRow.js","components/dataset/DataTable/FilterGroup.js","components/dataset/DataTable/FilterFormAdvanced.js","components/dataset/DataTable/FilterFormBasic.js","components/dataset/DataTable/FiltersForm.js","hooks/useLoadDatasetVersionResources.js","utilities/openGraph.js","components/pages/DatasetPage/DatasetInteractivePage.js","components/changelog/ChangelogSection/ChangelogSection.js","components/pages/ChangelogPage/ChangelogPage.js","components/pages/DatasetPage/DatasetApiDocsPage.js","components/pages/DatasetPage/DatasetPageContainer.js"],"sourcesContent":["import React from 'react'\nimport PropTypes from 'prop-types'\nimport Text from '../Text/Text'\nimport ComponentShell from '../ComponentShell/ComponentShell'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport { extractRelativePath } from '../../../utilities/linkHelpers'\n\nimport './ApiDocsHero.scss'\n\nconst ApiDocsHero = ({ header, apiUrl, leftColOffset, version, oas, showApiButton }) => {\n const { isMobile } = useDisplayContext()\n return (\n <section className='ApiDocsHero'>\n <ComponentShell leftColOffset={leftColOffset}>\n <Text className='ApiDocsHero__desc' typeFace={isMobile ? '02 H2/White/L' : '00 Display/White'}>\n {header}\n <div className='ApiDocsHero__tagHolder'>\n {version && <span className='ApiDocsHero__tag'>{version}</span>}\n {oas && <span className='ApiDocsHero__tag'>{oas}</span>}\n </div>\n </Text>\n {apiUrl && showApiButton && (\n <div className='btn btn-primary'>{extractRelativePath(apiUrl)}</div>\n )}\n </ComponentShell>\n </section>\n )\n}\n\nApiDocsHero.propTypes = {\n apiUrl: PropTypes.string,\n header: PropTypes.string,\n leftColOffset: PropTypes.number,\n version: PropTypes.string,\n oas: PropTypes.string,\n showApiButton: PropTypes.bool\n}\n\nexport default ApiDocsHero\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport ComponentShell from '../ComponentShell/ComponentShell'\n\nimport './NumberCallouts.scss'\n\nconst getCallouts = (callouts) => {\n return callouts.map(({\n fieldNumCalloutDatatype: suffix,\n fieldNumCalloutNumber: value,\n fieldNumCalloutShortDesc: title,\n fieldNumCalloutIsDollarAmt: isDollar\n }) => {\n return {\n title,\n suffix,\n value,\n isDollar\n }\n })\n}\nconst NumberCallouts = ({ callouts, leftColOffset }) => {\n const cleanCallouts = getCallouts(callouts)\n\n return (\n <div className='NumberCallouts'>\n <ComponentShell leftColOffset={leftColOffset}>\n <p className='NumberCallouts__title'>By the numbers</p>\n <div className='NumberCallouts__callouts'>\n {cleanCallouts.map(({\n title,\n prefix = '',\n value,\n suffix,\n isDollar\n }, i) => {\n if (isDollar) prefix = `${prefix}$`\n return (\n <div key={i} className='NumberCallouts__callout'>\n <div className='NumberCallouts__callout-value-container'>\n {prefix && (\n <p className='NumberCallouts__callout-prefix'>{prefix}</p>\n )}\n <p className='NumberCallouts__callout-value'>{value}</p>\n {suffix && (\n <p className='NumberCallouts__callout-suffix'>{suffix}</p>\n )}\n </div>\n <p className='NumberCallouts__callout-title'>{title}</p>\n </div>\n )\n })}\n </div>\n </ComponentShell>\n </div>\n )\n}\n\nNumberCallouts.propTypes = {\n callouts: PropTypes.arrayOf(PropTypes.shape({\n fieldNumCalloutShortDesc: PropTypes.string.isRequired,\n fieldNumCalloutNumber: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string\n ]).isRequired,\n fieldNumCalloutDatatype: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string\n ]),\n fieldNumCalloutIsDollarAmt: PropTypes.bool.isRequired\n })),\n leftColOffset: PropTypes.number\n}\n\nNumberCallouts.defaultProps = {\n callouts: [],\n leftColOffset: 0\n}\n\nexport default NumberCallouts\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { ButtonBack, ButtonNext, Dot, DotGroup } from 'pure-react-carousel'\nimport cx from 'classnames'\nimport dayjs from 'dayjs'\nimport isEmpty from 'lodash/isEmpty'\nimport Text from '../Text/Text'\nimport { ReactComponent as DownToLineIcon } from '../../../assets/fontawesome/solid/down-to-line.svg'\nimport DatasetCard from './DatasetCard'\nimport CarouselArrow from '../../icons/CarouselArrow'\nimport ResourceSmallCarousel from './ResourceSmallCarousel'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\n\nimport './ResourceHero.scss'\nimport LinkHandler from '../LinkHandler/LinkHandler'\n\nconst ResourceHero = (props) => {\n const {\n header,\n resources,\n topic,\n fileDownloadUrl,\n lastUpdated\n } = props\n\n const { isMobile } = useDisplayContext()\n const hasResources = !isEmpty(resources)\n const isMultiResourceDisplay = resources.length > 1\n\n function renderDownloadButton () {\n if (!fileDownloadUrl) {\n return null\n }\n\n return (\n <LinkHandler variant='primary' className='download_btn' href={fileDownloadUrl} target='blank'>\n <DownToLineIcon className='DownToLineIcon' />\n <Text\n typeFace='Button/White/L'\n className='download_btn_text'\n >Download\n </Text>\n </LinkHandler>\n )\n }\n\n function renderUpdatedDateDisplay () {\n return (\n <div\n className={cx({\n ResourceHero__updated: true,\n hasButtonSibling: fileDownloadUrl,\n bottomMargin: isMobile\n })}\n >\n {lastUpdated &&\n <>\n <Text typeFace='Small Text/LightGray'>Page last modified</Text>\n <Text typeFace='Body/16pt/White/L/List'>{lastUpdated ? dayjs(lastUpdated).format('MMMM D, YYYY') : null}</Text>\n </>}\n </div>\n )\n }\n\n function renderInnerLeftContent () {\n // desktop and mobile always render headers here;\n // mobile always renders the download and date display here;\n // desktop only does if single resource display\n // reverse order on mobile\n return (\n <>\n <Text className='ResourceHero__eyebrow' domElement='span' typeFace='Small Text/LightGray'>{topic}</Text>\n <Text className='ResourceHero__header' typeFace='00 Display/White'>{header}</Text>\n {isMultiResourceDisplay && !isMobile &&\n <Text className='ResourceHero__eyebrow' domElement='span' typeFace='Small Text/LightGray'>Related Datasets</Text>}\n {(isMobile && !isMultiResourceDisplay) && (\n <div className='ResourceHero__actions'>\n {renderUpdatedDateDisplay()}\n {renderDownloadButton()}\n </div>\n )}\n {(isMobile && isMultiResourceDisplay) && (\n <div className='ResourceHero__actions'>\n {renderUpdatedDateDisplay()}\n {renderDownloadButton()}\n <Text className='ResourceHero__eyebrow' domElement='span' typeFace='Small Text/LightGray'>Related Datasets</Text>\n </div>\n )}\n {(!isMultiResourceDisplay && !isMobile) && (\n <div className='ResourceHero__actions'>\n {renderDownloadButton()}\n {renderUpdatedDateDisplay()}\n </div>\n )}\n </>\n )\n }\n\n function renderInnerRightContent () {\n // mobile download button is only rendered in left content\n // both mobile and desktop render a resource here if single resource display\n return (\n <>\n {!isMobile && isMultiResourceDisplay && renderDownloadButton()}\n {hasResources && !isMultiResourceDisplay && (\n <DatasetCard\n heading={resources[0].heading}\n footer={dayjs(resources[0].date).format('MMMM D, YYYY')}\n slug={resources[0].slug}\n />\n )}\n </>\n )\n }\n\n function getRenderedResources () {\n return resources.map((resource, i) => {\n return (\n <DatasetCard\n key={i}\n heading={resource.heading}\n footer={dayjs(resource.date).format('MMMM D, YYYY')}\n slug={resource.slug}\n />\n )\n })\n }\n\n function renderCarouselControls (carouselData) {\n const { numOfVisibleSlides } = carouselData\n return (\n <div className='ResourceHero__slider-actions'>\n <ButtonBack className='ResourceHero__slider-actions-back-next'>\n <CarouselArrow size='large' direction='left' />\n </ButtonBack>\n\n <DotGroup\n showAsSelectedForCurrentSlideOnly\n renderDots={() => {\n return getDotSlideArray(resources.length, numOfVisibleSlides).map((slide, i) => {\n return (\n <Dot className='ResourceHero__slider-actions-dot' slide={slide} key={i} />\n )\n })\n }}\n />\n\n <ButtonNext className='ResourceHero__slider-actions-back-next'>\n <CarouselArrow size='large' direction='right' />\n </ButtonNext>\n </div>\n )\n }\n\n return (\n <div className={cx('ResourceHero', {\n ResourceHero__multi_resource: isMultiResourceDisplay\n })}\n >\n <div className='ResourceHero__jumbotron jumbotron'>\n <div className='ResourceHero__inner'>\n <div className='ResourceHero__inner_left'>\n {renderInnerLeftContent()}\n </div>\n\n <div className='ResourceHero__inner_right'>\n {isMultiResourceDisplay && (\n <div className='ResourceHero__actions_multi desktop-only'>\n {/* this only displayd on desktop for multi resource displays */}\n {renderUpdatedDateDisplay()}\n {renderInnerRightContent()}\n </div>\n )}\n {!isMultiResourceDisplay && renderInnerRightContent()}\n </div>\n </div>\n\n {isMultiResourceDisplay && (\n <ResourceSmallCarousel\n isDatasetCarousel\n useVisibleSlidesAsStep\n renderControls={controls => renderCarouselControls(controls)}\n renderedResources={getRenderedResources()}\n />\n )}\n </div>\n </div>\n\n )\n}\n\nfunction getDotSlideArray (numOfSlides, step) {\n return Array(Math.ceil(numOfSlides / step)).fill(true).map((v, i) => {\n return i * step\n })\n}\n\nResourceHero.propTypes = {\n /** Large text heading */\n header: PropTypes.string.isRequired,\n /** Small text */\n topic: PropTypes.string.isRequired,\n /** An array of resource objects used to render SmallResource; same prop schema */\n resources: PropTypes.array,\n fileDownloadUrl: PropTypes.string,\n lastUpdated: PropTypes.string\n}\n\nResourceHero.defaultProps = {\n resources: []\n}\n\nexport default ResourceHero\n\nconst ResourceHeroLoading = () => (\n <div className='ResourceHeroLoading'>\n <div>\n <div>\n <div className='ResourceHeroLoading__topic skeleton-box skeleton-box-inverse' />\n <div className='ResourceHeroLoading__title skeleton-box skeleton-box-inverse' />\n <div className='ResourceHeroLoading__spacer' />\n <div className='ResourceHeroLoading__last-updated-head skeleton-box skeleton-box-inverse' />\n <div className='ResourceHeroLoading__last-updated skeleton-box skeleton-box-inverse' />\n </div>\n <div>\n <div>\n <div className='ResourceHeroLoading__resource-topic skeleton-box skeleton-box-inverse' />\n <div className='ResourceHeroLoading__resource-title skeleton-box skeleton-box-inverse' />\n <div className='ResourceHeroLoading__spacer' />\n <div className='ResourceHeroLoading__resource-link skeleton-box skeleton-box-inverse' />\n </div>\n </div>\n </div>\n </div>\n)\n\nexport { getDotSlideArray, ResourceHeroLoading }\n","import React from 'react'\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport PropTypes from 'prop-types'\n\nimport './SmallBanner.scss'\n\nconst SmallBanner = ({\n title,\n text,\n bgImgPath,\n children,\n cssClassOverride\n}) => {\n const style = {}\n\n if (bgImgPath) {\n style.backgroundImage = `url(${bgImgPath})`\n }\n\n return (\n <Container\n fluid\n className={cssClassOverride || 'SmallBanner'}\n style={style}\n >\n <Row>\n <Col className='align-self-center'>\n <h2>{title}</h2>\n <p>{text}</p>\n </Col>\n <Col className='align-self-center' md='auto'>\n {children}\n </Col>\n </Row>\n </Container>\n )\n}\n\nSmallBanner.propTypes = {\n title: PropTypes.string,\n text: PropTypes.string,\n bgImgPath: PropTypes.string,\n children: PropTypes.node,\n cssClassOverride: PropTypes.string\n}\n\nSmallBanner.defaultProps = {\n title: 'Subscribe to CMS data updates',\n text: 'Don\\'t miss out on any news and updates on CMS data'\n}\n\nexport default SmallBanner\n","import React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport memoize from 'lodash/memoize'\nimport { ReactComponent as SortDownIcon } from '../../../assets/fontawesome/solid/sort-down.svg'\nimport Modal from 'react-bootstrap/Modal'\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport FormLabel from 'react-bootstrap/FormLabel'\nimport Select from 'react-select'\nimport ModalCloseButton from '../ModalCloseButton/ModalCloseButton'\nimport Text from '../Text/Text'\nimport { isPreviewUrl } from '../../../utilities/routeHelpers'\nimport {\n getNewestDatasetVersion,\n excludeNonInteractiveDatasetVersions\n} from '../../../utilities/datasetHelpers'\nimport config from '../../../config'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\n\nimport './AccessApiModal.scss'\nimport LinkHandler from '../LinkHandler/LinkHandler'\n\nconst { apiSite, apiDocsParam } = config\n\nconst commonSelectProps = {\n className: 'AccessApiModal__select',\n classNamePrefix: 'AccessApiModal__select',\n components: { DropdownIndicator },\n isClearable: false,\n isSearchable: false,\n isMulti: false\n}\n\nclass AccessApiModal extends React.PureComponent {\n constructor () {\n super()\n this.state = {\n selectedVersion: null\n }\n }\n\n inputRef = React.createRef()\n\n memoizedExcludedDatasetVersions = memoize(excludeNonInteractiveDatasetVersions)\n\n get apiUrl () {\n const { selectedVersion } = this.state\n if (!selectedVersion) {\n return ''\n }\n const uuid = selectedVersion.isLatest ? this.props.datasetUuid : selectedVersion.id\n\n return `${apiSite}/data-api/v1/dataset/${uuid}/data`\n }\n\n // IMPORTANT: this should always be used instead of props.versions\n // since it will ensure that we are always using the filtered versions; if for some reason\n // reason there is a mode where we don't want to exclude versions without a data file,\n // we can use that prop here\n get versions () {\n const { versions = [] } = this.props\n return this.memoizedExcludedDatasetVersions(versions).map((version, index) => {\n // Add a property to identify the latest version.\n return {\n ...version,\n isLatest: index === 0\n\n }\n })\n }\n\n get versionOptions () {\n return this.versions.map((version, index) => {\n // Give latest version special treatment.\n if (version.isLatest) {\n return {\n id: this.props.datasetUuid,\n value: this.props.datasetUuid,\n label: 'Latest',\n version: version\n }\n }\n return {\n id: version.id,\n value: version.id,\n label: version.fieldDatasetVersionCombined,\n version: version\n }\n })\n }\n\n get versionDropdownTitle () {\n const { selectedVersion } = this.state\n\n if (!selectedVersion) {\n return ''\n } else {\n return selectedVersion?.fieldDatasetVersionCombined\n }\n }\n\n get selectedVersionValue () {\n const { selectedVersion } = this.state\n\n if (!selectedVersion) {\n return ''\n }\n\n // Give latest version special treatment.\n if (selectedVersion.isLatest) {\n return {\n id: this.props.datasetUuid,\n value: this.props.datasetUuid,\n label: 'Latest',\n version: selectedVersion\n }\n }\n\n return {\n id: selectedVersion.id,\n value: selectedVersion.id,\n label: selectedVersion.fieldDatasetVersionCombined,\n version: selectedVersion\n }\n }\n\n // since versions might load after this modal is rendered (even when not showing),\n // we need to select an initial version when they become available\n componentDidUpdate (prevProps, prevState) {\n if ((!prevProps.versions || prevProps.versions.length === 0) && !prevState.selectedVersion) {\n this.selectInitialVersion()\n }\n }\n\n // always select the initial version upon showing modal\n handleShowModal = () => {\n this.selectInitialVersion()\n }\n\n selectInitialVersion () {\n const { currentVersion } = this.props\n\n if (this.versions && this.versions.length > 0) {\n this.setState({\n selectedVersion: currentVersion || getNewestDatasetVersion(this.versions)\n })\n }\n }\n\n handleSelectVersion = ({ version }) => {\n this.setState({\n selectedVersion: version\n })\n }\n\n handleCopyClick = () => {\n this.inputRef.current.select()\n document.execCommand('copy')\n }\n\n renderVersionDropdown () {\n return (\n <div className='AccessApiModal__versionDropdownGroup'>\n <FormLabel className='AccessApiModal__formLabel'>Time Period</FormLabel>\n <Select\n aria-label='Select the API time period'\n {...commonSelectProps}\n value={this.selectedVersionValue}\n options={this.versionOptions}\n onChange={this.handleSelectVersion}\n />\n </div>\n )\n }\n\n renderApiEndpointInputGroup () {\n const { selectedVersion } = this.state\n\n const JSONvalue = { id: 'JSON', value: 'JSON', label: 'JSON' }\n return (\n <div>\n <FormLabel className='AccessApiModal__formLabel'>API Endpoint</FormLabel>\n <div className='AccessApiModal__ApiInputGroup'>\n {/* Swallow on change until other values present else it will reset other modal fields */}\n <Select\n aria-label='Select the API endpoint file format'\n {...commonSelectProps}\n value={JSONvalue}\n options={[JSONvalue]}\n />\n <input\n ref={this.inputRef}\n className='AccessApiModal__urlInput'\n value={this.apiUrl}\n readOnly\n onChange={() => {}}\n />\n <CopyButton selectedVersion={selectedVersion} onClick={this.handleCopyClick} />\n </div>\n </div>\n )\n }\n\n render () {\n const {\n show,\n onHide,\n datasetName,\n datasetUrlPath,\n isDesktop,\n isMobileDevice,\n history\n } = this.props\n\n const linkUrl = isPreviewUrl(datasetUrlPath) ? `/preview${datasetUrlPath}/${apiDocsParam}` : `${datasetUrlPath}/${apiDocsParam}`\n\n return (\n <Modal\n className='AccessApiModal'\n size='lg'\n show={show}\n onHide={onHide}\n onShow={this.handleShowModal}\n centered\n >\n\n <Modal.Header className='AccessApiModal__modal-header'>\n <Modal.Title>\n <Text typeFace='02 H2/Black/L'>Access API for {datasetName}</Text>\n </Modal.Title>\n <ModalCloseButton onClick={onHide} />\n </Modal.Header>\n\n <Modal.Body className='AccessApiModal__modal-body'>\n <Text typeFace='Body/16pt/Black/L'>\n The Open Data API (ODA) provides programmatic access to this dataset including the ability to filter, query, and aggregate data. The latest endpoint returns the most recent version of the data.\n </Text>\n <Container>\n <Row>\n <Col lg={isDesktop ? 3 : 12}>\n {this.renderVersionDropdown()}\n </Col>\n\n <Col lg={isDesktop ? 9 : 12}>\n {this.renderApiEndpointInputGroup()}\n </Col>\n </Row>\n <div className={isMobileDevice ? 'AccessApiModal__mobile' : 'AccessApiModal__link'}>\n <LinkHandler href={linkUrl} routerData={{ search: history?.location?.search }}>API Docs for the Dataset</LinkHandler>\n </div>\n </Container>\n </Modal.Body>\n </Modal>\n )\n }\n}\n\nconst CopyButton = (props) => {\n const { onClick, selectedVersion } = props\n const [isClicked, setIsClicked] = useState(false)\n\n useEffect(() => {\n // revert clicked state if user selects different version\n setIsClicked(false)\n }, [selectedVersion])\n\n function handleClick (e) {\n setIsClicked(true)\n onClick(e)\n }\n\n return (\n <button\n className={cx('copy-btn', { clicked: isClicked })}\n onClick={(e) => handleClick(e)}\n >\n {!isClicked && <span>Copy</span>}\n {isClicked && <span>Copied</span>}\n </button>\n )\n}\n\nCopyButton.propTypes = {\n selectedVersion: PropTypes.object,\n onClick: PropTypes.func.isRequired\n}\n\nfunction DropdownIndicator () {\n return (\n <span><SortDownIcon className='dropdownIndicator' /></span>\n )\n}\n\nAccessApiModal.propTypes = {\n show: PropTypes.bool,\n onHide: PropTypes.func,\n versions: PropTypes.arrayOf(PropTypes.object),\n currentVersion: PropTypes.object,\n datasetUuid: PropTypes.string.isRequired,\n datasetName: PropTypes.string.isRequired,\n datasetFrequency: PropTypes.string.isRequired,\n datasetUrlPath: PropTypes.string.isRequired,\n isDesktop: PropTypes.bool,\n isMobileDevice: PropTypes.bool,\n history: PropTypes.object\n}\n\nAccessApiModal.defaultProps = {\n versions: [],\n datasetUuid: '',\n datasetName: '',\n datasetUrlPath: '',\n datasetFrequency: 'Annually'\n}\n\nexport default (props) => {\n const { isDesktop, isMobileDevice } = useDisplayContext()\n\n return (\n <AccessApiModal\n {...props}\n isDesktop={isDesktop}\n isMobileDevice={isMobileDevice}\n />\n )\n}\n\nexport { AccessApiModal }\n","import React, { PureComponent } from 'react'\nimport PropTypes from 'prop-types'\nimport compose from '../../../hocs/compose'\nimport withUserAgreementModal from '../../../hocs/withUserAgreementModal/withUserAgreementModal'\nimport withDatasetDownloadModal from '../../../hocs/withDatasetDownloadModal/withDatasetDownloadModal'\nimport withApiAccessModal from '../../../hocs/withAccessApiModal/withAccessApiModal'\nimport withDisplayContext from '../../../hocs/withDisplayContext/withDisplayContext'\nimport {\n getDatasetFrequency,\n getNewestDatasetVersion,\n getVersionLabelUrl,\n getDatasetUuid,\n getDatasetLicenceAgreement,\n DATASET_PAGE_REFERRER\n} from '../../../utilities/datasetHelpers'\nimport { retainAccessToken } from '../../../utilities/linkHelpers'\n\nclass DatasetPageModals extends PureComponent {\n doIfAgreed = async (callback) => {\n const { getUserAgreementStatus, data } = this.props\n\n const datasetUuid = getDatasetUuid(data)\n const licenseAgreement = getDatasetLicenceAgreement(data)\n\n const { hasAgreed } = await getUserAgreementStatus(datasetUuid, { licenseAgreement })\n\n if (hasAgreed) {\n callback()\n }\n }\n\n handleViewDataClick = () => {\n this.doIfAgreed(() => {\n this.goToLatestVersion()\n })\n }\n\n handleVersionLinkClick = (e, version) => {\n if (e) {\n e.preventDefault()\n }\n\n this.doIfAgreed(() => {\n this.goToVersion(version)\n })\n }\n\n goToVersion = (version) => {\n const { history, data } = this.props\n\n if (this.isLatestVersion(version)) {\n this.goToLatestVersion()\n } else {\n const datasetFrequency = getDatasetFrequency(data)\n const versionLabelUrl = getVersionLabelUrl(version, datasetFrequency)\n let urlString = `${history.location.pathname}/data/${versionLabelUrl}`\n\n urlString = retainAccessToken(urlString)\n\n history.push(urlString, { pageReferrer: DATASET_PAGE_REFERRER })\n }\n }\n\n goToLatestVersion = () => {\n const { history } = this.props\n let urlString = `${history.location.pathname}/data`\n\n urlString = retainAccessToken(urlString)\n history.push(urlString, { pageReferrer: DATASET_PAGE_REFERRER })\n }\n\n handleDownloadClick = () => {\n const {\n openDatasetDownloadModal,\n showMobileDownloadModal,\n versions,\n downloadResources,\n data,\n currentVersion,\n isMobileDevice\n } = this.props\n\n if (isMobileDevice) {\n // if mobile device show mobile notice\n showMobileDownloadModal()\n return\n }\n\n this.doIfAgreed(() => {\n openDatasetDownloadModal({\n versions,\n currentVersion,\n downloadResources,\n dataset: data\n })\n })\n }\n\n handleAccessApiClick = () => {\n const {\n openAccessApiModal,\n versions,\n currentVersion,\n data\n } = this.props\n\n this.doIfAgreed(() => {\n openAccessApiModal({\n versions,\n currentVersion,\n data\n })\n })\n }\n\n isLatestVersion = (version) => {\n const { versions } = this.props\n const newestVersion = getNewestDatasetVersion(versions)\n\n return version.id === newestVersion.id\n }\n\n /**\n * this is basically doing what a HOC does (enhancing a component with additional props),\n * but I thought since it is using a bunch of HOCs itself it would be easier to follow\n * in this format rather than rolling it up into an additional HOC. But it would be easy to\n * convert+move if need be.\n *\n * All this logic also could have gone into DatasetPageContainer, but I think it's already\n * big enough and I think DatasetPageContainer being the one who's main responsibilities are to\n * setup routes as well as load and maintain the data is a good distinction and large enough responsibility\n *\n */\n render () {\n const { children } = this.props\n\n const additionalProps = {\n onDownloadClick: this.handleDownloadClick,\n onAccessApiClick: this.handleAccessApiClick,\n onViewDataClick: this.handleViewDataClick,\n onVersionLinkClick: this.handleVersionLinkClick\n }\n\n return React.Children.map(children, child => {\n return React.cloneElement(child, additionalProps)\n })\n }\n}\n\nDatasetPageModals.propTypes = {\n data: PropTypes.object,\n versions: PropTypes.arrayOf(PropTypes.object),\n downloadResources: PropTypes.arrayOf(PropTypes.object),\n currentVersion: PropTypes.object,\n children: PropTypes.oneOfType([\n PropTypes.element,\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.element, PropTypes.string]))\n ]),\n history: PropTypes.object,\n openDatasetDownloadModal: PropTypes.func,\n openAccessApiModal: PropTypes.func,\n getUserAgreementStatus: PropTypes.func,\n showMobileDownloadModal: PropTypes.func,\n isMobileDevice: PropTypes.bool\n}\n\nexport default compose(\n withDisplayContext,\n withUserAgreementModal(),\n withApiAccessModal(),\n withDatasetDownloadModal()\n)(DatasetPageModals)\n","import React, { PureComponent } from 'react'\nimport PropTypes from 'prop-types'\nimport AccessApiModal from '../../components/common/AccessApiModal/AccessApiModal'\nimport {\n getDatasetName,\n getDatasetFrequency,\n getDatasetUrlPath,\n getDatasetUuid\n} from '../../utilities/datasetHelpers'\n\nfunction withAccessApiModal (WrappedComponent) {\n class WithApiAccessModal extends PureComponent {\n state = {\n isOpen: false,\n versions: [],\n currentVersion: null,\n data: null\n }\n\n openAccessApiModal = async (payload) => {\n const {\n data,\n versions,\n currentVersion\n } = payload\n\n this.setState({\n isOpen: true,\n data,\n currentVersion,\n versions\n })\n }\n\n closeAccessApiModal = () => {\n this.setState({\n isOpen: false\n })\n }\n\n handleCloseAccessApiModal = () => {\n this.closeAccessApiModal()\n }\n\n render () {\n const {\n isOpen,\n data,\n versions,\n currentVersion\n } = this.state\n\n return (\n <>\n <WrappedComponent\n openAccessApiModal={this.openAccessApiModal}\n closeAccessApiModal={this.closeAccessApiModal}\n {...this.props}\n />\n <AccessApiModal\n show={isOpen}\n onHide={this.handleCloseAccessApiModal}\n datasetUuid={getDatasetUuid(data)}\n datasetName={getDatasetName(data)}\n datasetFrequency={getDatasetFrequency(data)}\n datasetUrlPath={getDatasetUrlPath(data)}\n versions={versions}\n currentVersion={currentVersion}\n history={this.props.history}\n />\n </>\n )\n }\n }\n\n WithApiAccessModal.propTypes = {\n history: PropTypes.object\n }\n\n return WithApiAccessModal\n}\n\nexport default () => {\n return (Component) => withAccessApiModal(Component)\n}\n","import React from 'react'\n\nconst SubscribeIcon = () => (\n <span className='SubscribeIcon SvgIcon'>\n <svg className='subscribe-icon' xmlns='http://www.w3.org/2000/svg' width='14' height='18' version='1'>\n <path fill='currentColor' fillRule='evenodd' d='M0 0h14v18l-7-7-7 7V0zm2 2v11l4-5 6 5V2H2z' />\n </svg>\n </span>\n)\n\nexport default SubscribeIcon\n","var _defs, _g;\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nfunction SvgCircleBackground(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n width: 567,\n height: 425,\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"path\", {\n id: \"a\",\n d: \"M.86.16h434.07v225.71H.86z\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n id: \"c\",\n d: \"M.06.26H310.5v188.68H.06z\"\n }))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n fillRule: \"evenodd\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M187.68 184.7a118.5 118.5 0 0 0-83.55 34.19c-46.86 46.07-47.51 121.68-1.44 168.55a118.31 118.31 0 0 0 85 35.63 118.5 118.5 0 0 0 83.55-34.2 118.41 118.41 0 0 0 35.63-83.97 118.41 118.41 0 0 0-34.19-84.57 118.32 118.32 0 0 0-85-35.64m.01 239.38a119.3 119.3 0 0 1-85.71-35.93c-46.46-47.26-45.8-123.5 1.45-169.97a119.5 119.5 0 0 1 84.25-34.47 119.3 119.3 0 0 1 85.72 35.93 119.4 119.4 0 0 1 34.47 85.28 119.4 119.4 0 0 1-35.93 84.68 119.49 119.49 0 0 1-84.25 34.48\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M187.68 240.95A62.57 62.57 0 0 0 143.57 259a63 63 0 0 0-.76 89 62.47 62.47 0 0 0 44.88 18.81c16.6 0 32.27-6.4 44.12-18.05a62.51 62.51 0 0 0 18.8-44.34 62.52 62.52 0 0 0-18.04-44.66 62.47 62.47 0 0 0-44.89-18.8zm.01 126.87a63.46 63.46 0 0 1-45.6-19.12 64 64 0 0 1 .78-90.4 63.56 63.56 0 0 1 44.81-18.35 63.46 63.46 0 0 1 45.6 19.11 63.51 63.51 0 0 1 18.34 45.37 63.5 63.5 0 0 1-19.11 45.04 63.56 63.56 0 0 1-44.82 18.34zM159.02 1.78a52.23 52.23 0 0 0-36.83 15.07 52.59 52.59 0 0 0-.63 74.29 52.14 52.14 0 0 0 37.46 15.7 52.23 52.23 0 0 0 36.82-15.07 52.59 52.59 0 0 0 .64-74.28 52.14 52.14 0 0 0-37.46-15.7m0 106.05a53.14 53.14 0 0 1-38.18-16 53.6 53.6 0 0 1 .65-75.7A53.22 53.22 0 0 1 159.02.78a53.14 53.14 0 0 1 38.17 16 53.18 53.18 0 0 1 15.36 37.99 53.18 53.18 0 0 1-16 37.71 53.22 53.22 0 0 1-37.53 15.36\"\n }), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"translate(132 28)\"\n }, /*#__PURE__*/React.createElement(\"mask\", {\n id: \"b\",\n fill: \"#fff\"\n }, /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#a\"\n })), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M27.02 1.16A25 25 0 0 0 9.39 8.37 25 25 0 0 0 1.86 26.1a25 25 0 0 0 7.22 17.84 24.97 24.97 0 0 0 17.94 7.53 25 25 0 0 0 17.63-7.22 25.18 25.18 0 0 0 .3-35.57 24.97 24.97 0 0 0-17.93-7.52zm0 51.3c-7.07 0-13.7-2.77-18.65-7.81a25.98 25.98 0 0 1-7.5-18.56A25.98 25.98 0 0 1 8.68 7.66 26 26 0 0 1 27.02.16c7.07 0 13.7 2.77 18.65 7.82a26.18 26.18 0 0 1-.32 36.98 26 26 0 0 1-18.33 7.5zM400.85 122.25a51.02 51.02 0 0 0-35.97 14.72 51.37 51.37 0 0 0-.62 72.56 50.94 50.94 0 0 0 36.6 15.34 51.01 51.01 0 0 0 35.96-14.72A50.97 50.97 0 0 0 452.16 174a50.98 50.98 0 0 0-14.72-36.4 50.94 50.94 0 0 0-36.6-15.35m.01 103.62a51.93 51.93 0 0 1-37.3-15.64 52.37 52.37 0 0 1 .63-73.97 52 52 0 0 1 36.67-15.01c14.14 0 27.4 5.55 37.3 15.64A51.97 51.97 0 0 1 453.16 174a51.96 51.96 0 0 1-15.64 36.86 52 52 0 0 1-36.67 15\",\n mask: \"url(#b)\"\n })), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M532.85 184.91a16.67 16.67 0 0 0 0 33.3c4.4 0 8.54-1.7 11.67-4.77a16.54 16.54 0 0 0 4.98-11.73 16.54 16.54 0 0 0-4.77-11.82 16.53 16.53 0 0 0-11.88-4.98m0 34.3c-4.77 0-9.24-1.87-12.59-5.27a17.67 17.67 0 0 1 12.59-30.03c4.77 0 9.24 1.87 12.59 5.28 3.3 3.36 5.1 7.8 5.06 12.52a17.54 17.54 0 0 1-5.27 12.44 17.55 17.55 0 0 1-12.38 5.06M299.28 39.22a30.08 30.08 0 0 0-21.2 8.68 30.29 30.29 0 0 0-.37 42.78 30.03 30.03 0 0 0 21.58 9.05c7.98 0 15.5-3.09 21.2-8.68a30.06 30.06 0 0 0 9.05-21.32 30.05 30.05 0 0 0-8.68-21.47 30.03 30.03 0 0 0-21.58-9.04m0 61.5A31.02 31.02 0 0 1 277 91.39a31.29 31.29 0 0 1 .37-44.2 31.07 31.07 0 0 1 21.91-8.96c8.45 0 16.37 3.32 22.3 9.34a31.05 31.05 0 0 1 8.96 22.18 31.05 31.05 0 0 1-9.35 22.02 31.07 31.07 0 0 1-21.9 8.97\"\n }), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"translate(0 58)\"\n }, /*#__PURE__*/React.createElement(\"mask\", {\n id: \"d\",\n fill: \"#fff\"\n }, /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#c\"\n })), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M299.28 1.25a10.23 10.23 0 1 0 7.16 17.5 10.15 10.15 0 0 0 3.06-7.19c.02-2.73-1.02-5.3-2.93-7.25a10.14 10.14 0 0 0-7.29-3.05m0 21.43a11.23 11.23 0 1 1 0-22.44c3.04 0 5.88 1.2 8 3.36a11.14 11.14 0 0 1 3.22 7.96c-.02 3-1.22 5.8-3.35 7.9a11.15 11.15 0 0 1-7.86 3.22M75.85 188.94a93.39 93.39 0 0 1-67.1-28.13A94.31 94.31 0 0 1 0 150.53v-1.7a93.54 93.54 0 0 0 9.47 11.28 92.4 92.4 0 0 0 66.38 27.83c2.23 0 4.45-.08 6.66-.24l-.57 1.04c-2.02.13-4.05.2-6.1.2m7.28-.28l.58-1.05a92.58 92.58 0 0 0 27.58-6.64l.5.44c.3-.35.61-.7.92-1.03a93.02 93.02 0 0 0 33.74-24.85l.16.35c.44-.2.9-.38 1.34-.57a93.91 93.91 0 0 1-37.88 27.23l-.1-.07-.13.16a93.64 93.64 0 0 1-26.7 6.03m63.77-33.67a92.39 92.39 0 0 0 15.43-25.6l1.18-.25a93.39 93.39 0 0 1-15.2 25.72l-.16-.4-1.25.53m15.87-26.72c.78-2.05 1.5-4.13 2.14-6.23l.73 1.01a93.08 93.08 0 0 1-1.71 4.98l-1.16.24m3.24-6.41l-.74-1.04a93.5 93.5 0 0 0 3.64-25.16 92.58 92.58 0 0 0-11.01-44.83l.42-1h.17a93.56 93.56 0 0 1 11.42 45.84c-.07 9-1.4 17.8-3.9 26.19m-8.33-73.04l-.92-.03a93.6 93.6 0 0 0-14.54-19.18 92.72 92.72 0 0 0-34.55-22.27l-.23-1.15a93.69 93.69 0 0 1 35.5 22.72 94.6 94.6 0 0 1 14.85 19.66l-.11.25M0 40.9v-1.7c2.94-4 6.24-7.83 9.9-11.42A93.53 93.53 0 0 1 75.83.8a94.29 94.29 0 0 1 30.52 5.02l.21 1.14a93.23 93.23 0 0 0-30.73-5.17 92.54 92.54 0 0 0-65.25 26.7A93.29 93.29 0 0 0 0 40.9\",\n mask: \"url(#d)\"\n })), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M81.94 246.74l.57-1.04 1.2-.09-.59 1.05-1.18.08m80.4-59.35l.43-1.12 1.16-.24-.42 1.1-1.18.26M158.5 107.84h-.18l.08-.18.1.18m-1.22-.12l-.52-.93c.3.02.61.03.92.03l-.4.9m-49.6-42.38l-1.1-.4a55.1 55.1 0 0 1-.22-1.13l1.08.38.23 1.15M75.85 209.02a55.75 55.75 0 0 1-40.06-16.79 55.8 55.8 0 0 1-16.1-39.85 55.8 55.8 0 0 1 16.78-39.57A55.84 55.84 0 0 1 75.84 96.7a55.75 55.75 0 0 1 40.05 16.79A55.8 55.8 0 0 1 132 153.34a55.8 55.8 0 0 1-16.78 39.57 55.84 55.84 0 0 1-39.37 16.11M75.84 97.7a54.85 54.85 0 0 0-38.67 15.82 54.8 54.8 0 0 0-16.49 38.87 54.8 54.8 0 0 0 15.82 39.14 54.76 54.76 0 0 0 39.35 16.5 54.84 54.84 0 0 0 38.66-15.83 54.8 54.8 0 0 0 16.5-38.87 54.8 54.8 0 0 0-15.83-39.14 54.76 54.76 0 0 0-39.34-16.5M225.33 211.22c-2.36 0-4.71-.1-7.03-.33l.06-.17-1.89-.65-.2.6a73.57 73.57 0 0 1-17.3-4.25l.06-.41-1.66-.22a73.92 73.92 0 0 1-27.7-19.75l1.19-.17a72.75 72.75 0 0 0 31.3 20.63l-1.16-.2-.1.7c.64.1 1.3.21 1.94.33l.1-.58 1.92.59-.07.36 1.93.41.06-.25 1.92.48-.05.22 1.92.49.07-.3c.66.14 1.3.26 1.96.38l-.13.44c.64.19 1.27.37 1.9.57l.2-.67-.16-.05a74.3 74.3 0 0 0 19.29.33l.17.99c-2.81.32-5.67.48-8.54.48m-56.43-26.07a74.91 74.91 0 0 1-3.26-4.1l.37-1.2a73.86 73.86 0 0 0 4.06 5.12l-1.17.18m-4-5.1a73.55 73.55 0 0 1-13.66-43.55 73.98 73.98 0 0 1 6-28.69h.1l.56 1.02a73 73 0 0 0-5.66 27.68 72.56 72.56 0 0 0 13.03 42.3l-.36 1.23m-6.14-73.2l-.84-.01-.14-.26a74.1 74.1 0 0 1 15.6-22.27 73.65 73.65 0 0 1 37.14-19.78l-.22 1.06a72.66 72.66 0 0 0-36.22 19.43 73.1 73.1 0 0 0-15.32 21.83m128.56-9.55c-.35-.15-.69-.3-1.03-.47a73.04 73.04 0 0 0-15.38-16.83c-.21-.57-.4-1.14-.58-1.72A75.46 75.46 0 0 1 287.6 97l-.28.29m-17.85-18.42a72.48 72.48 0 0 0-44.16-14.83c-4.72 0-9.37.45-13.9 1.32l.2-1.06a74.8 74.8 0 0 1 13.7-1.25c15.96 0 31.1 4.98 43.7 14.23.14.53.3 1.06.46 1.59\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M169.67 186.04l-.77-.9 1.16-.17.8.9-1.19.17M158.4 107.66l-.47-.83.84.01-.37.82m51.9-42.08c.09-.35.16-.7.23-1.06l1.1-.22-.22 1.06-1.1.22M286.9 97.73l-.6-.91 1.03.47-.44.44m-15.97-17.74a77.4 77.4 0 0 0-1.44-1.12c-.17-.53-.32-1.06-.45-1.59.44.33.88.65 1.3.99.18.58.38 1.15.59 1.72M165.64 181.05l-.73-1 .36-1.23.74 1.04-.37 1.2m-7.74-72.23l-.56-1.02.98.03-.42 1m.03-2.01h-.25l.11-.26.15.26\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M158.32 107.84l-.98-.03-.06-.1.4-.89.25.01.47.83-.08.18M234.9 210.6l-.16-.98c5.87-.75 11.59-2.2 17.04-4.32l.16 1.01a73.55 73.55 0 0 1-17.03 4.3m17.98-4.67l-.15-1.02.9-.37.99.67-1.74.72m2.81-1.2a104 104 0 0 0-.97-.66 73.08 73.08 0 0 0 21.83-14.83c24.8-24.38 28.5-62.26 10.88-90.65l.13-.13c.41.17.83.33 1.25.47 17.25 28.69 13.33 66.56-11.56 91.03a74.09 74.09 0 0 1-21.56 14.77\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M254.63 205.22l-1-.67c.37-.15.74-.3 1.1-.47l.97.66-1.07.48M288.82 98.94c-.42-.14-.84-.3-1.25-.47l.6-.6.65 1.07M225.33 166.81a29.46 29.46 0 0 1-21.17-8.87 29.48 29.48 0 0 1-8.51-21.06 29.48 29.48 0 0 1 8.87-20.91 29.5 29.5 0 0 1 20.8-8.52A29.46 29.46 0 0 1 248 117.97l-.35.7.93.46.14-.28a29.45 29.45 0 0 1 6.3 18.54 29.48 29.48 0 0 1-8.88 20.9 29.5 29.5 0 0 1-20.8 8.52m0-58.36c-7.57 0-14.71 2.92-20.11 8.23a28.49 28.49 0 0 0-8.57 20.2 28.49 28.49 0 0 0 8.22 20.36 28.47 28.47 0 0 0 20.46 8.57c7.56 0 14.7-2.92 20.1-8.22a28.5 28.5 0 0 0 8.57-20.21 28.5 28.5 0 0 0-8.22-20.35 28.47 28.47 0 0 0-20.46-8.58M377.25 313.5c-25.27 0-49.35-7.31-69.9-20.94l-.12-1.29a124.83 124.83 0 0 0 70.02 21.23c33.19 0 64.5-12.82 88.18-36.09a125.12 125.12 0 0 0 27.71-40.8c.24.29.48.57.73.84a126.12 126.12 0 0 1-27.74 40.67 126.06 126.06 0 0 1-88.88 36.38m-70.97-21.66a128.3 128.3 0 0 1-32.76-32.15l.08-.05-.9-1.77-.33.17-1.11-1.66.5-.27c-.33-.58-.65-1.16-.99-1.73l-.6.34c-1.06-1.67-2.08-3.37-3.06-5.08l.53-.35a99.4 99.4 0 0 0-1.11-1.66l-.4.28-.95-1.76.2-.15-1-1.38a125.4 125.4 0 0 1-12.44-38.3l.95-.38a124.87 124.87 0 0 0 34.64 68.95c5.76 5.86 12 11.09 18.61 15.64l.14 1.3m-37.56-40.87l-.6.38c.36.55.7 1.12 1.05 1.68l.6-.36-1.05-1.7m225.58-15.53l-.73-.85a126.6 126.6 0 0 0 6.93-72.85l.88-.7a127.58 127.58 0 0 1-7.08 74.4m5.97-74.8a125.06 125.06 0 0 0-33.32-62.12 124.88 124.88 0 0 0-89.72-37.61c-16.24 0-32.03 3.07-46.7 8.93v-.09-.99a126.65 126.65 0 0 1 46.7-8.85c34.29 0 66.4 13.46 90.44 37.9a126.06 126.06 0 0 1 33.48 62.14l-.88.68M288.33 97.7l-.37-.15-.35-.55.74-.73a126.64 126.64 0 0 1 41.19-27.12 48.59 48.59 0 0 1-.01 1.08 125.62 125.62 0 0 0-41.2 27.47\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M307.35 292.56l-1.07-.72-.14-1.3 1.09.73.12 1.29M493.87 236.45l-.73-.83.43-1.04.73.85-.43 1.02m6.63-74.72l-.23-1.1.88-.7.23 1.1-.88.7M288.16 97.87l-.2-.32.38.15-.18.17m41.37-27.64a42.19 42.19 0 0 0 0-1.08l1-.4v1.08l-1 .4M251.78 205.3l-.3-2.15c.38.23.75.47 1.11.71l.15 1.06-.96.38m.64-2.74l-1.09-.7c-.63-5.34-.93-10.77-.89-16.25a125.93 125.93 0 0 1 36.14-87.56l.7.3.16.25a124.94 124.94 0 0 0-36 87.02c-.04 5.71.29 11.37.98 16.94\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M252.6 203.86c-.37-.24-.74-.48-1.11-.7l-.16-1.3 1.1.7.16 1.3M287.29 98.35l-.71-.3.31-.32.4.62M251.94 206.31l-.16-1.01.96-.38.15 1.02-.95.37m35.5-107.71l-.15-.25.28.12-.13.13m.52-1.05l-.63-.26.28-.29.35.55\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M287.57 98.47l-.28-.12-.4-.62.44-.44.63.26.2.32-.6.6M377.24 261a73.76 73.76 0 0 1-53-22.2c-28.72-29.23-28.31-76.37.9-105.1a73.88 73.88 0 0 1 52.1-21.31c20.09 0 38.9 7.89 53 22.21 28.72 29.22 28.31 76.37-.9 105.09a73.88 73.88 0 0 1-52.1 21.32m0-147.62a72.89 72.89 0 0 0-51.4 21.03c-28.82 28.34-29.22 74.84-.88 103.67a72.78 72.78 0 0 0 52.28 21.92c19.35 0 37.6-7.47 51.4-21.03 28.82-28.34 29.22-74.85.88-103.67a72.77 72.77 0 0 0-52.28-21.92M257.79 200.08a5.94 5.94 0 1 1-8.47 8.33 5.94 5.94 0 0 1 8.47-8.33\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M291.75 93.64a5.94 5.94 0 1 1-8.47 8.32 5.94 5.94 0 0 1 8.47-8.32M162.94 103.6a5.94 5.94 0 1 1-8.47 8.32 5.94 5.94 0 0 1 8.47-8.33M86.22 242.98a3.9 3.9 0 1 1-5.57 5.48 3.9 3.9 0 0 1 5.57-5.48M213.68 62.05a3.9 3.9 0 1 1-5.58 5.48 3.9 3.9 0 0 1 5.58-5.48M272.52 76.2a3.9 3.9 0 1 1-5.57 5.48 3.9 3.9 0 0 1 5.57-5.48M332.9 66.98a3.9 3.9 0 1 1-5.57 5.48 3.9 3.9 0 0 1 5.58-5.48M496.64 233.06a3.9 3.9 0 1 1-5.57 5.48 3.9 3.9 0 0 1 5.57-5.48M309.62 288.6a3.9 3.9 0 1 1-5.57 5.48 3.9 3.9 0 0 1 5.57-5.48M503.5 157.76a3.9 3.9 0 1 1-5.57 5.48 3.9 3.9 0 0 1 5.57-5.48M109.77 62.44a3.9 3.9 0 1 1-5.58 5.48 3.9 3.9 0 0 1 5.58-5.48M172.35 176.61a8.14 8.14 0 1 1-11.6 11.41 8.14 8.14 0 0 1 11.6-11.4M272.14 85.63l-.75-.71.45-.48c.17.31.35.63.54.94l-.24.25m.96-1c-.19-.31-.36-.63-.53-.95l.87-.9.74.73-1.08 1.12\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M272.38 85.38c-.19-.3-.37-.63-.54-.94l.73-.76c.17.32.34.64.53.95l-.72.75M264.43 94.52l-.81-.65c.62-.78 1.24-1.54 1.87-2.3l.8.67c-.63.75-1.24 1.51-1.86 2.28M268.2 90l-.79-.69 1.97-2.22.77.7-1.95 2.2M260.87 99.17l-.84-.62c.58-.79 1.17-1.58 1.77-2.36l.83.64c-.6.77-1.18 1.55-1.76 2.34M276.27 81.43l-.73-.74c.7-.7 1.41-1.38 2.14-2.05l.7.76c-.7.67-1.42 1.35-2.11 2.03M248.71 118.85c-.23-.3-.47-.59-.72-.88l1.02-1.93.92.5-1.22 2.31M248.57 119.13l-.93-.47.35-.69.72.88-.14.28M246 124.42l-.94-.44 1.26-2.67.94.45-1.25 2.66M254.32 108.9l-.89-.55c.52-.84 1.04-1.67 1.58-2.5l.87.57c-.53.82-1.05 1.65-1.56 2.48M257.5 103.97l-.87-.58c.55-.82 1.11-1.63 1.68-2.44l.85.6c-.56.8-1.12 1.6-1.66 2.42M280.55 77.4l-.7-.77 2.23-1.96.68.79c-.74.64-1.48 1.29-2.2 1.95M309.37 57.18l-.49-.92a146 146 0 0 1 2.63-1.37l.47.93c-.87.44-1.74.9-2.6 1.36M304.83 59.72c-.36-.21-.73-.4-1.12-.56.85-.5 1.7-1 2.57-1.48l.51.91-1.96 1.13\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M304.24 60.06l-.53-.9c.39.16.76.35 1.12.56-.2.1-.4.22-.59.34M319.96 52.04l-.42-.95c.9-.4 1.81-.78 2.73-1.16l.4.96-2.71 1.15M314.61 54.5l-.45-.93c.89-.44 1.78-.86 2.68-1.27l.43.95c-.89.4-1.77.83-2.66 1.25M285 73.56l-.66-.8c.76-.64 1.52-1.26 2.3-1.87l.65.81c-.77.61-1.53 1.23-2.29 1.86M299.24 63.14l-.57-.88 2.51-1.58.55.9c-.84.5-1.67 1.03-2.5 1.56M289.6 69.9l-.53-.7.01-.22 2.26-1.69.62.84c-.8.58-1.58 1.17-2.36 1.76\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M289.07 69.2l-.1-.14.11-.08v.22M294.35 66.42l-.6-.86c.81-.56 1.62-1.12 2.45-1.67l.58.86c-.82.55-1.63 1.1-2.43 1.67M243.66 129.8l-.96-.39 1.15-2.72.96.41c-.4.9-.77 1.8-1.15 2.7M232.73 181.34l-1.04-.03c.02-.99.06-1.98.1-2.97l1.05.05c-.05.98-.09 1.97-.11 2.95M233 175.45l-1.03-.07c.07-.98.14-1.97.23-2.95l1.04.09c-.09.97-.16 1.95-.23 2.93M231.65 187.25c-.02-1-.02-1.98-.02-2.97h1.05v2.95l-1.03.02M233.53 169.59l-1.04-.12c.1-.98.22-1.96.35-2.94l1.03.13c-.12.98-.24 1.95-.34 2.93M232.29 199.1c-.1-.98-.18-1.97-.25-2.95l1.03-.08.25 2.94-1.03.1M231.84 193.18v-.08l.19.07-.19.01m1-.76l-1.05-.42-.07-1.79 1.04-.03c.02.75.05 1.5.09 2.24\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M232.03 193.17l-.19-.07-.05-1.1 1.06.42.03.7-.85.05M233.9 210.88l-.03-.14 1.04-.13.01.09-1.02.18m-.2-1.13l-.3-1.8 1.03-.16.3 1.83-1.03.13\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M233.87 210.74l-.17-1 1.04-.12c.05.33.1.66.17.99l-1.04.13M232.97 205c-.13-.97-.26-1.96-.37-2.94l1.03-.12.37 2.93-1.03.14M234.28 163.75l-1.03-.16c.15-.98.3-1.95.47-2.93l1.03.18c-.17.97-.32 1.94-.47 2.9M420.72 46.48c-.94-.3-1.88-.57-2.82-.84l.29-1c.94.27 1.9.55 2.84.84l-.31 1M239.63 140.85l-1-.32c.3-.94.62-1.88.94-2.81l.98.34-.92 2.79M409.35 43.46c-.96-.21-1.92-.42-2.88-.61l.2-1.02 2.9.61-.22 1.02M415.06 44.85c-.94-.25-1.9-.49-2.85-.72l.25-1.01c.96.23 1.92.47 2.87.73l-.27 1M241.53 135.29l-.97-.36c.34-.93.68-1.85 1.04-2.77l.97.38c-.35.91-.7 1.83-1.03 2.75M236.5 152.19l-1.02-.24c.22-.96.46-1.92.7-2.88l1.01.26-.7 2.86M237.95 146.49l-1-.28.81-2.85 1 .3c-.28.94-.55 1.88-.81 2.83M426.3 48.33c-.92-.33-1.85-.65-2.78-.96l.33-.99c.93.31 1.87.63 2.8.96l-.35.98M235.27 157.94l-1.02-.2c.18-.96.38-1.93.59-2.9l1.01.22c-.2.96-.4 1.92-.58 2.88M325.4 49.8l-.38-.97c.92-.36 1.84-.71 2.77-1.05l.36.98c-.92.34-1.84.68-2.76 1.04M452.82 60.83l-2.53-1.49.52-.9 2.55 1.5-.54.9M462.62 67.28l-2.4-1.68.6-.86c.8.55 1.61 1.12 2.41 1.7l-.6.84M520.26 218.27l-1.01-.23.64-2.88 1.02.22c-.2.97-.42 1.93-.65 2.9M518.8 224.02l-1-.28.75-2.84 1.01.25c-.24.96-.5 1.91-.75 2.87M484.59 86.73c-.67-.73-1.34-1.44-2.02-2.15l.75-.72c.69.71 1.36 1.43 2.03 2.16l-.76.7M517.12 229.7l-1-.32.87-2.81 1 .3-.87 2.82M467.31 70.8c-.77-.6-1.54-1.2-2.32-1.78l.62-.84 2.35 1.8-.65.82M471.87 74.5l-2.26-1.88.65-.8c.77.62 1.53 1.25 2.28 1.89l-.67.8M476.27 78.4l-2.18-1.97.69-.78 2.2 1.99-.7.77M480.51 82.48c-.69-.7-1.39-1.38-2.1-2.06l.73-.75c.7.68 1.41 1.37 2.11 2.08l-.74.73M521.5 212.47l-1.03-.2c.18-.95.36-1.92.52-2.89l1.03.18c-.17.97-.34 1.94-.53 2.91M462.06 304.7l-.6-.85c.8-.56 1.6-1.14 2.39-1.72l.61.85-2.4 1.72M457.14 308.01l-.56-.87c.82-.54 1.64-1.07 2.45-1.62l.59.86c-.82.55-1.65 1.1-2.48 1.63M466.83 301.2l-.63-.83 2.32-1.8.65.8c-.77.62-1.55 1.23-2.34 1.83M452.1 311.12l-.53-.9c.85-.5 1.69-1 2.52-1.52l.54.89c-.83.52-1.68 1.03-2.53 1.53M484.4 285.33l-.75-.71 2-2.16.77.7c-.66.73-1.33 1.45-2.01 2.17M488.38 280.94l-.79-.69c.65-.74 1.28-1.49 1.9-2.24l.8.67c-.62.75-1.26 1.5-1.91 2.26M471.47 297.5l-.67-.8c.75-.62 1.5-1.26 2.24-1.9l.69.79-2.26 1.92M480.26 289.57l-.73-.75c.7-.69 1.4-1.38 2.08-2.08l.75.73-2.1 2.1M475.94 293.63l-.7-.78c.74-.66 1.46-1.32 2.17-2l.71.77c-.71.67-1.44 1.34-2.18 2M403.58 42.3c-.97-.18-1.94-.34-2.9-.5l.16-1.02c.98.15 1.95.32 2.92.5l-.18 1.02M371.31 40.12l-.04-1.04a155 155 0 0 1 2.97-.1l.02 1.04c-.98.02-1.96.06-2.94.1M365.43 40.5l-.09-1.03c.99-.09 1.98-.16 2.96-.23l.07 1.04-2.94.22M359.56 41.13l-.13-1.04c.99-.12 1.97-.24 2.95-.34l.11 1.03c-.97.1-1.95.22-2.93.34M380.16 40l-2.5-.02h-.45v-1.04h.54c.81 0 1.62 0 2.42.02l-.01 1.04M386.04 40.22c-.98-.06-1.96-.1-2.94-.14l.04-1.04c.99.04 1.98.08 2.96.14l-.06 1.04M336.52 45.98l-.3-1 2.85-.81.28 1c-.95.26-1.89.53-2.83.81M353.73 41.99l-.18-1.03c.98-.17 1.96-.32 2.94-.47l.15 1.03c-.97.15-1.94.3-2.91.47M342.2 44.42l-.26-1.01c.95-.24 1.91-.48 2.88-.7l.23 1.01-2.86.7M347.92 43.09l-.21-1.02 2.92-.59.19 1.03c-.97.18-1.93.37-2.9.58M397.76 41.37c-.97-.14-1.94-.26-2.91-.38l.12-1.03c.98.11 1.96.24 2.94.38l-.15 1.03M437.21 52.69c-.9-.4-1.79-.8-2.7-1.18l.42-.96 2.7 1.18-.42.96M442.53 55.2c-.88-.44-1.76-.87-2.65-1.29l.45-.94c.89.42 1.78.85 2.66 1.29l-.46.93M447.73 57.9l-2.59-1.38.49-.92c.87.45 1.74.92 2.6 1.4l-.5.9M235.06 216.71c-.21-.97-.42-1.94-.61-2.9l1.02-.21.61 2.89-1.02.22M431.8 50.4c-.9-.37-1.82-.72-2.74-1.07l.37-.97c.92.34 1.84.7 2.76 1.07l-.39.97M391.92 40.68a150 150 0 0 0-2.94-.26l.08-1.04c.99.08 1.98.16 2.96.26l-.1 1.04M457.79 63.96a145.6 145.6 0 0 0-2.47-1.59l.56-.88c.83.52 1.66 1.05 2.48 1.6l-.57.87M330.92 47.78l-.34-.99c.94-.32 1.87-.63 2.81-.93l.32 1c-.93.3-1.86.6-2.8.92M251.34 113.96l-.9-.51c.47-.86.97-1.72 1.47-2.56l.9.52-1.47 2.55M351.85 329.04c-.98-.18-1.95-.36-2.92-.56l.21-1.02c.96.2 1.93.38 2.9.55l-.2 1.03M236.46 222.47c-.25-.93-.48-1.87-.71-2.8l.21.12.18-.29.6-.15.73 2.86-1 .26M357.7 329.98l-2.93-.44.16-1.03c.97.16 1.94.3 2.91.44l-.14 1.03M515.2 235.3l-.98-.36c.34-.92.66-1.85.98-2.77l.99.33c-.32.94-.65 1.87-.99 2.8M346.04 327.86c-.97-.21-1.93-.44-2.89-.67l.25-1.01 2.86.67-.22 1.01M508.13 251.57l-.93-.47c.44-.87.88-1.75 1.3-2.63l.94.45c-.43.89-.86 1.77-1.31 2.65M510.7 246.25l-.94-.44 1.2-2.68.95.41-1.2 2.7M369.5 331.15l-2.96-.2.08-1.05c.98.08 1.96.15 2.94.2l-.06 1.05M363.59 330.68c-.98-.1-1.97-.2-2.95-.32l.12-1.04c.98.12 1.95.23 2.93.32l-.1 1.04M505.34 256.79l-.9-.51c.47-.86.94-1.71 1.4-2.58l.92.5c-.46.86-.94 1.73-1.42 2.59M317.98 318.55c-.9-.4-1.8-.81-2.7-1.24l.45-.94 2.67 1.23-.42.95M523.24 200.75l-1.03-.11c.1-.98.2-1.96.28-2.93l1.04.08c-.09 1-.18 1.97-.29 2.96M312.63 316.02c-.88-.43-1.76-.88-2.64-1.34l.49-.92c.86.45 1.74.9 2.61 1.33l-.46.94M523.76 194.84l-1.04-.07.17-2.94 1.04.04c-.05 1-.1 1.98-.17 2.97M328.97 322.95l-2.79-1.01.37-.98c.92.35 1.84.68 2.76 1.01l-.34.98M522.48 206.63l-1.03-.15c.15-.97.28-1.95.4-2.92l1.04.13c-.12.98-.26 1.96-.4 2.94M334.59 324.82l-2.82-.9.33-1c.92.31 1.86.61 2.8.9l-.31 1M340.28 326.45l-2.85-.78.28-1 2.84.78-.27 1M323.43 320.86c-.92-.36-1.83-.74-2.74-1.13l.4-.96c.9.39 1.81.76 2.72 1.12l-.38.97M384.34 331.25l-.05-1.04 2.95-.15.06 1.04-2.96.15M419.39 325.38l-.3-1c.94-.28 1.88-.57 2.81-.87l.32 1c-.94.3-1.89.59-2.83.87M402.06 329.4l-.18-1.04 2.91-.51.2 1.02c-.98.18-1.96.36-2.93.52M407.9 328.29l-.21-1.02c.96-.2 1.91-.42 2.87-.64l.24 1.02c-.97.22-1.93.44-2.9.64M425.03 323.58l-.34-1c.93-.3 1.85-.63 2.78-.97l.35.98c-.92.34-1.86.67-2.79.99M413.67 326.95l-.25-1 2.84-.76.28 1c-.95.27-1.91.52-2.87.76M441.46 316.81l-.45-.93 2.63-1.31.47.93-2.65 1.31M446.74 314.13l-.5-.92c.87-.46 1.73-.94 2.59-1.42l.2-.1.5.9-.2.11c-.85.49-1.72.96-2.59 1.43M436.08 319.29l-.42-.96c.9-.39 1.8-.79 2.69-1.2l.43.95c-.9.41-1.8.82-2.7 1.2M430.6 321.54l-.38-.97c.91-.35 1.82-.72 2.73-1.09l.4.96c-.92.38-1.83.75-2.75 1.1M492.17 276.38l-.82-.65 1.8-2.31.84.63c-.6.78-1.2 1.56-1.82 2.33M396.18 330.25l-.13-1.03c.97-.12 1.94-.25 2.92-.4l.15 1.03c-.98.15-1.96.28-2.94.4M499.15 266.86l-.87-.59c.55-.8 1.09-1.63 1.62-2.45l.87.57c-.53.82-1.07 1.65-1.62 2.47M502.35 261.88l-.9-.54c.52-.83 1.03-1.67 1.52-2.52l.9.53c-.5.85-1 1.7-1.52 2.53M307.53 313.02l.06-.81.3.16-.36.65m-.98-.2c-.59-.32-1.17-.65-1.74-.99l.52-.9 1.3.74-.08 1.15\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M307.39 313.28l-.84-.46.07-1.15.97.54-.06.8-.14.27M378.4 331.4v-1.05c.98 0 1.96-.02 2.95-.04l.02 1.05-2.97.03M375.43 331.37l-2.96-.08.04-1.04 2.94.08-.02 1.04M495.75 271.7l-.84-.63c.58-.78 1.15-1.58 1.71-2.38l.86.6c-.57.8-1.14 1.6-1.73 2.4M390.27 330.88l-.1-1.04c.99-.08 1.97-.18 2.94-.28l.11 1.04c-.98.1-1.97.2-2.95.28M513.06 240.82l-.96-.4 1.09-2.73.97.38c-.36.92-.72 1.84-1.1 2.75M502.19 110.24c-.51-.85-1.02-1.68-1.55-2.51l.89-.56 1.55 2.53-.9.54M262.63 275.19l-1.8-2.36.84-.62c.59.79 1.19 1.56 1.79 2.34l-.83.64M249.63 255.4a137 137 0 0 1-1.4-2.61l.93-.48c.45.87.91 1.73 1.39 2.6l-.92.5M507.85 120.55l-1.34-2.63.92-.48 1.35 2.64-.93.47M252.58 260.54l-1.5-2.55.9-.52 1.5 2.53-.9.54M512.66 131.28c-.36-.91-.73-1.82-1.12-2.72l.96-.4c.39.9.76 1.81 1.13 2.73l-.97.39M259.09 270.44c-.58-.8-1.14-1.6-1.7-2.43l.85-.58c.56.8 1.12 1.61 1.7 2.4l-.85.61M510.36 125.86c-.4-.89-.8-1.78-1.23-2.67l.94-.44c.43.9.84 1.79 1.24 2.69l-.95.42M255.74 265.56c-.55-.83-1.08-1.66-1.6-2.5l.88-.55c.52.83 1.05 1.66 1.59 2.47l-.88.58M505.12 115.33c-.47-.86-.95-1.71-1.44-2.56l.9-.52c.5.85.98 1.72 1.45 2.58l-.91.5M492.2 95.7c-.6-.78-1.22-1.54-1.84-2.3l.81-.66c.62.76 1.24 1.54 1.85 2.32l-.82.64M239.96 233.8a147 147 0 0 1-.96-2.8l.99-.34c.3.93.62 1.86.95 2.79l-.98.34M488.48 91.14c-.63-.75-1.28-1.5-1.92-2.23l.78-.69 1.94 2.24-.8.68M238.1 228.17c-.3-.95-.58-1.9-.85-2.84l1-.29.84 2.82-1 .31M242.05 239.34l-1.08-2.76.98-.37c.34.91.7 1.83 1.07 2.74l-.97.39M244.36 244.8l-1.18-2.72.95-.41 1.18 2.7-.95.42M499.05 105.26c-.54-.82-1.09-1.64-1.64-2.44l.86-.6 1.65 2.46-.87.58M495.72 100.4l-1.74-2.37.84-.62 1.75 2.39-.85.6M246.9 250.15c-.45-.89-.88-1.78-1.3-2.67l.94-.44 1.28 2.65-.93.46M514.74 136.78c-.32-.92-.66-1.84-1-2.76l.97-.37c.35.93.68 1.85 1.01 2.78l-.98.35M524.04 188.91l-1.05-.03.02-.76c.35-.25.7-.49 1.06-.71l-.03 1.5m-1-2.03v-.94h1.04v.3c-.35.2-.7.41-1.05.64\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M523.01 188.12l.02-1.24 1.05-.65-.01 1.18c-.36.22-.72.46-1.06.71M522.38 171.22l-.3-2.94 1.03-.12c.11.99.22 1.97.31 2.96l-1.04.1M287.68 300.29c-.78-.6-1.55-1.22-2.31-1.85l.66-.8c.76.62 1.52 1.23 2.29 1.83l-.64.82M521.7 165.35c-.13-.97-.28-1.94-.43-2.91l1.03-.17c.15.98.3 1.96.43 2.94l-1.03.14M302.26 310.33c-.84-.5-1.68-1.02-2.51-1.55l.55-.88c.83.53 1.66 1.04 2.5 1.54l-.54.9M523.03 182.99c-.01-.98-.04-1.97-.07-2.95l1.04-.03c.04.99.06 1.98.07 2.97l-1.04.01M522.83 177.1c-.06-.98-.12-1.97-.2-2.95l1.04-.08c.08 1 .14 1.98.2 2.97l-1.04.06M282.95 296.43l-2.1-1.82.7-.79c.73.66 1.47 1.3 2.22 1.93l-.18.21-.67.05.03.42M297.26 307.18c-.82-.54-1.63-1.09-2.45-1.65l.6-.86c.8.56 1.61 1.1 2.43 1.64l-.58.87M292.4 303.83c-.8-.57-1.6-1.16-2.38-1.75l.62-.83c.79.59 1.57 1.17 2.37 1.74l-.61.84M516.6 142.36l-.9-2.8.99-.33c.3.94.61 1.88.9 2.83l-1 .3M270.3 284.23c-.68-.73-1.34-1.46-2-2.2l.79-.7c.65.75 1.3 1.47 1.97 2.2l-.77.7M266.37 279.79l-1.9-2.28.82-.66c.62.76 1.24 1.51 1.88 2.26l-.8.68M518.22 148.02c-.25-.95-.51-1.9-.78-2.84l1-.28c.27.95.54 1.9.79 2.85l-1 .27M274.39 288.5c-.7-.69-1.39-1.4-2.07-2.1l.75-.73 2.06 2.1-.74.74M278.66 292.62c-.73-.67-1.45-1.35-2.16-2.04l.72-.75c.71.68 1.42 1.36 2.15 2.02l-.71.77M519.61 153.73l-.38-1.66 1.01-.27.4 1.7-1.03.23m-.6-2.63l-.06-.23 1-.25.06.21-1 .26\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M519.23 152.07l-.23-.97 1.01-.27.23.97-1 .27M520.78 159.53l-.55-2.9 1.02-.21c.2.97.38 1.95.55 2.92l-1.02.19M114.44 236.47l-.5-.48c.45-.48.9-.96 1.37-1.43l.5.49-1.37 1.42M109.25 242.45l-.54-.44 1.12-1.38.23-.09.45.38c-.43.5-.84 1.02-1.26 1.53\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M109.83 240.63l.14-.16.09.07-.23.09M111.28 238.97l-.02-.02 1.32-1.5.52.48-.4.45-1.42.6\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M111.79 239.4l-.5-.43 1.4-.6-.9 1.04M106.86 245.58l-.57-.42 1.2-1.58.55.42c-.4.53-.8 1.05-1.18 1.58M117.21 233.65l-.49-.5 1.44-1.38.48.51c-.48.45-.96.9-1.43 1.37M98.58 259l-.62-.31c.3-.6.6-1.18.92-1.76l.62.33-.92 1.75M96.86 262.56l-.63-.29.84-1.8.64.3c-.3.6-.57 1.2-.85 1.8M102.45 252.12l-.6-.36c.35-.57.7-1.13 1.07-1.69l.58.38-1.05 1.67M104.59 248.8l-.58-.39 1.12-1.63.58.4-1.12 1.63M120.1 230.94l-.47-.52 1.5-1.32.45.53c-.5.43-1 .87-1.48 1.31M139.48 217.34l-.33-.62 1.76-.93.32.63c-.58.3-1.17.6-1.75.92M136.03 219.27l-.36-.6 1.73-1 .34.62-1.71.98M146.44 213.53l-.12-.29.58-.25-.46.53m1.5-.21l.38-.45.1.25-.48.2\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M146.6 213.88l-.16-.35.46-.54 1.25-.53.17.4-.38.45-1.34.57M143 215.54l-.3-.63c.6-.3 1.2-.58 1.8-.85l.3.63-1.8.85M123.09 228.35l-.45-.54 1.55-1.25.44.54-1.54 1.25M132.66 221.34l-.38-.59 1.69-1.06.37.6-1.68 1.05M126.19 225.89l-.43-.56 1.6-1.2.4.57-1.58 1.19M129.38 223.55l-.4-.57 1.64-1.13.39.58c-.55.37-1.1.74-1.63 1.12M95.29 266.19l-.65-.27c.25-.61.5-1.22.77-1.83l.65.28c-.27.6-.52 1.2-.77 1.82M87.93 300.85l-.7-.02.07-2 .7.03-.07 1.99M88.12 296.89l-.7-.05.16-1.99.7.06c-.06.66-.12 1.32-.16 1.98M87.2 304.82v-2h.7v1.99l-.7.01M88.47 292.94l-.7-.07c.07-.67.15-1.33.24-1.99l.7.1c-.1.65-.17 1.3-.24 1.96M87.63 312.8a95.4 95.4 0 0 1-.16-2l.7-.05c.04.66.1 1.32.16 1.98l-.7.06M87.34 308.81l-.1-2 .7-.02.1 1.98-.7.04M88.72 320.71c-.12-.65-.23-1.3-.33-1.97l.69-.1.33 1.95-.7.13M88.1 316.76a95.1 95.1 0 0 1-.26-1.98l.7-.08.25 1.97-.7.1M88.98 289.01l-.7-.1c.1-.66.2-1.31.32-1.97l.69.12c-.11.65-.22 1.3-.31 1.95M214.41 209.42l-1.8-.3.06-.22 1.74.52M214.37 210.14c-.63-.2-1.26-.38-1.9-.57l.13-.44 1.81.29.17.05-.21.67M92.57 273.61l-.67-.21.63-1.9.66.24-.62 1.87M206.78 207.86c-.65-.16-1.28-.34-1.92-.52l.06-.33c.66.13 1.3.27 1.96.42l-.1.43\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M206.72 208.11a91.1 91.1 0 0 0-1.93-.41l.07-.36c.64.18 1.27.36 1.92.52l-.06.25M210.64 208.76c-.64-.13-1.3-.27-1.94-.42l.12-.46 1.93.49-.1.39\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M210.57 209.05c-.64-.17-1.28-.34-1.92-.49l.05-.22 1.94.42-.07.29M93.85 269.87l-.65-.24c.22-.62.46-1.24.7-1.86l.65.25-.7 1.85M90.46 281.24l-.68-.16c.15-.65.3-1.3.47-1.94l.68.18-.47 1.92M91.44 277.4l-.67-.18c.17-.64.36-1.28.55-1.92l.67.2c-.2.63-.37 1.27-.55 1.9M218.13 211.38l-1.88-.64.03-.06c.67.08 1.34.15 2.02.21l-.18.5\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M218.3 210.9l-2.03-.22.2-.6c.63.2 1.26.42 1.89.64l-.06.17M89.64 285.11l-.69-.13.4-1.96.68.15-.39 1.94M150.26 212.37l-.26-.65c.62-.24 1.24-.48 1.87-.7l.24.66c-.62.22-1.24.45-1.85.7M235.75 219.66l-1.49-.87.35-.6c.58.32 1.15.66 1.71 1l-.18.31-.4.1v.06\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M235.96 219.8l-.21-.14-.02-.06.41-.1-.18.3M242.56 224.13l-1.62-1.13.4-.58 1.62 1.14-.4.57M281.32 325.69l-.68-.16c.15-.64.3-1.29.43-1.93l.69.14c-.14.65-.28 1.3-.44 1.95M280.34 329.55l-.67-.19.5-1.91.68.17-.5 1.93M257.33 237.21c-.45-.49-.9-.97-1.36-1.44l.5-.49c.47.48.92.97 1.37 1.46l-.51.47M279.2 333.37l-.66-.22c.2-.62.4-1.25.58-1.88l.67.2-.58 1.9M245.71 226.5l-1.56-1.2.41-.56 1.58 1.2-.43.56M248.77 228.99c-.5-.43-1-.85-1.52-1.27l.44-.54c.52.42 1.03.84 1.53 1.28l-.45.53M251.74 231.61l-1.47-1.32.46-.53c.5.44 1 .89 1.48 1.34l-.47.51M254.59 234.35l-1.41-1.38.48-.5c.48.45.95.92 1.43 1.39l-.5.5M282.15 321.79l-.69-.14c.13-.64.24-1.3.35-1.94l.7.11-.36 1.97M242.17 383.82l-.4-.57c.54-.38 1.08-.77 1.6-1.16l.42.57c-.53.39-1.07.78-1.62 1.16M238.87 386.04l-.38-.59 1.65-1.08.4.58-1.67 1.1M245.39 381.46l-.43-.55c.53-.4 1.05-.81 1.56-1.22l.44.55-1.57 1.22M235.48 388.13l-.36-.6 1.7-1.02.36.6c-.56.34-1.13.69-1.7 1.02M257.2 370.8l-.5-.49 1.34-1.45.52.46-1.35 1.47M259.88 367.83l-.53-.46 1.28-1.5.54.44-1.3 1.52M248.5 378.98l-.44-.54 1.5-1.28.46.53-1.52 1.29M254.42 373.64l-.5-.5c.48-.46.95-.93 1.4-1.4l.5.49-1.4 1.4M251.51 376.37l-.46-.52 1.45-1.34.48.5c-.48.46-.97.91-1.47 1.36M202.95 206.75l-.79-.25.8.14-.01.11M202.84 207.33l-1.95-.33.11-.7 1.16.2.79.25-.1.58M181.14 205.86l-.03-.7c.67-.03 1.33-.05 2-.06l.01.7-1.98.06M177.18 206.12l-.06-.7 2-.15.04.7-1.98.15M173.24 206.54l-.09-.7 1.99-.23.07.7-1.97.23M187.09 205.78l-1.69-.01h-.3v-.7h.38l1.62.01-.01.7M191.05 205.93l-1.98-.1.03-.7 1.99.1-.04.7M157.74 209.8l-.2-.67a92.7 92.7 0 0 1 1.92-.54l.18.67-1.9.55M169.31 207.12l-.12-.7 1.98-.3.1.69-1.96.3M161.56 208.75l-.18-.68 1.94-.47.16.69c-.64.15-1.28.3-1.92.47M165.4 207.86l-.14-.69c.66-.14 1.31-.27 1.97-.39l.13.69-1.95.39M198.93 206.7l-1.96-.25.08-.7.32.04c.53.22 1.06.43 1.6.63l-.04.28\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M198.97 206.42a71.1 71.1 0 0 1-1.6-.63l1.66.22-.06.41M225.47 214.31c-.6-.27-1.21-.53-1.82-.78l.28-.65c.6.26 1.22.52 1.82.8l-.28.63M229.04 216l-1.78-.86.3-.63 1.8.86-.32.63M232.54 217.83a90.9 90.9 0 0 0-1.74-.93l.32-.63 1.76.94-.34.62M89.5 324.64l-.41-1.96.69-.14.4 1.95-.68.15M221.82 212.77l-1.84-.71.25-.66 1.86.72-.27.65M195 206.24c-.66-.07-1.31-.13-1.97-.18l.05-.7c.66.06 1.33.11 1.99.18l-.07.7M239.3 221.9c-.55-.37-1.1-.72-1.66-1.07l.38-.6 1.67 1.08-.39.59M153.97 211.01l-.22-.66 1.89-.63.21.67c-.63.2-1.25.41-1.88.63M100.45 255.53l-.61-.35c.32-.58.65-1.15.99-1.72l.6.35-.98 1.72M168.05 400.19l-1.96-.38.14-.69c.65.14 1.3.26 1.94.38l-.12.69M90.44 328.51l-.49-1.93.68-.17.49 1.92-.68.18M171.98 400.82l-1.97-.3.11-.69 1.96.3-.1.69M277.92 337.14l-.66-.25c.23-.61.44-1.24.66-1.86l.66.23c-.21.63-.43 1.25-.66 1.88M164.14 399.4l-1.94-.46.17-.68 1.92.45-.15.69M273.16 348.08l-.62-.31.87-1.77.63.3c-.28.6-.58 1.2-.88 1.78M274.9 344.5l-.64-.3.8-1.8.64.28-.8 1.82M179.92 401.6c-.66-.03-1.32-.08-1.99-.13l.06-.7c.66.05 1.31.1 1.97.13l-.04.7M175.95 401.3a88.4 88.4 0 0 1-1.99-.23l.09-.7c.65.09 1.3.16 1.96.22l-.06.7M271.29 351.6l-.62-.35c.33-.58.64-1.15.95-1.73l.62.33-.95 1.74M145.27 393.13l-1.81-.83.3-.63 1.8.82-.3.64M283.33 313.9l-.7-.07.2-1.98.69.06c-.06.67-.12 1.33-.2 1.99M141.67 391.43l-1.77-.9.32-.62 1.76.9-.31.62M283.67 309.93l-.7-.05.12-1.98.7.03c-.03.67-.07 1.33-.12 2M152.66 396.1l-1.87-.69.25-.66c.61.24 1.23.46 1.85.68l-.23.66M282.82 317.86l-.7-.1c.1-.66.2-1.31.28-1.97l.7.09-.28 1.98M156.44 397.35l-1.9-.61.22-.67 1.89.6-.21.68M160.27 398.45l-1.92-.53.2-.68c.63.19 1.26.36 1.9.53l-.18.68M148.93 394.69l-1.84-.76.28-.65 1.82.76-.26.65M189.9 401.68l-.03-.7 1.98-.1.05.7-2 .1M213.47 397.73l-.2-.68c.64-.18 1.27-.38 1.9-.58l.21.67-1.9.59M201.82 400.42l-.12-.69c.66-.1 1.3-.22 1.96-.35l.13.7-1.97.34M205.75 399.68l-.15-.69c.65-.13 1.3-.27 1.94-.42l.16.68c-.65.15-1.3.3-1.95.43M217.27 396.51l-.23-.66c.63-.22 1.25-.43 1.87-.66l.24.66c-.62.23-1.25.45-1.88.66M209.63 398.78l-.17-.68 1.91-.5.19.67c-.64.18-1.28.35-1.93.51M228.32 391.96l-.3-.63c.59-.28 1.18-.58 1.77-.88l.32.63-1.79.88M231.87 390.16l-.33-.62 1.74-.95.13-.08.34.62-.13.07-1.75.96M224.7 393.63l-.28-.64 1.8-.81.3.63c-.6.28-1.21.56-1.82.82M221.01 395.14l-.25-.65a90.1 90.1 0 0 0 1.84-.73l.27.64-1.86.75M262.43 364.77l-.55-.44 1.21-1.55.56.42-1.22 1.57M197.86 401l-.09-.7c.66-.07 1.32-.16 1.97-.26l.1.7c-.66.1-1.32.18-1.98.26M267.12 358.36l-.58-.39c.37-.54.73-1.1 1.08-1.65l.6.38-1.1 1.66M269.27 355.02l-.6-.37c.35-.56.69-1.12 1.02-1.69l.6.36c-.33.57-.67 1.13-1.02 1.7M138.15 389.59l-1.74-.97.35-.61 1.72.97-.33.61M185.9 401.77v-.7c.67 0 1.33-.01 1.99-.03l.02.7-2 .03M183.91 401.75c-.66 0-1.33-.02-2-.05l.03-.7 1.99.05-.02.7M264.84 361.62l-.57-.42c.4-.53.78-1.06 1.15-1.6l.58.4-1.16 1.62M193.89 401.42l-.06-.7c.66-.05 1.32-.11 1.97-.18l.08.7c-.66.06-1.33.13-2 .18M276.48 340.85l-.65-.27c.25-.6.5-1.22.73-1.83l.66.25-.74 1.85M269.17 253.02l-1.04-1.68.6-.38 1.04 1.7-.6.36M108.05 363.97l-1.21-1.59.56-.42 1.2 1.58-.55.43M99.3 350.66l-.94-1.76.62-.32c.3.58.62 1.16.94 1.74l-.62.34M272.97 259.96l-.9-1.77.3-.15 1.15 1.64-.55.28\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M273.52 259.69l-1.15-1.65.32-.17.9 1.77-.07.05M101.28 354.11c-.34-.56-.67-1.14-1-1.71l.6-.35 1 1.7-.6.36M276.21 267.17l-.75-1.82.64-.28.76 1.84-.65.26M105.66 360.77c-.39-.53-.77-1.08-1.15-1.63l.58-.4c.38.55.75 1.1 1.14 1.63l-.57.4M274.66 263.53l-.82-1.8.63-.3.83 1.82-.64.28M103.4 357.49l-1.07-1.68.6-.37c.34.56.7 1.11 1.06 1.66l-.58.39M271.14 256.45l-.97-1.72v-.01l1.09 1.66-.12.07M271.26 256.38l-1.08-1.66.6-.34.97 1.73-.49.27M262.44 243.24a99.5 99.5 0 0 0-1.23-1.54l.55-.45 1.24 1.56-.56.43M92.8 336.13c-.23-.63-.44-1.26-.65-1.89l.66-.22c.2.63.42 1.25.64 1.87l-.66.24M259.95 240.18l-1.3-1.5.53-.46 1.3 1.5-.53.46M91.54 332.34c-.2-.63-.39-1.27-.57-1.9l.67-.2.57 1.9-.67.2M94.2 339.85c-.25-.61-.49-1.23-.72-1.85l.65-.25c.23.62.47 1.23.72 1.84l-.65.26M95.75 343.52l-.8-1.82.65-.28c.26.61.52 1.21.8 1.82l-.65.28M267.06 249.67a93.9 93.9 0 0 0-1.1-1.64l.17-.12c.32.58.64 1.16.98 1.73l-.05.03\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M267.1 249.64l-.97-1.73.4-.28c.38.55.75 1.1 1.11 1.66l-.53.35M264.82 246.41l-1.17-1.6.56-.41.16.22.8 1.53-.35.26\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M265.18 246.15c-.28-.5-.54-1.02-.8-1.53l1 1.38-.2.15M97.46 347.13c-.3-.6-.6-1.2-.87-1.8l.63-.3.86 1.79-.62.3M277.61 270.88l-.68-1.86.66-.25.68 1.87-.66.24M283.86 305.94l-.7-.02.03-1.98h.7c0 .67-.01 1.33-.03 2M282.75 294.04l-.21-1.98.7-.08.2 1.99-.69.07M124.89 380.85c-.52-.4-1.04-.82-1.55-1.24l.44-.54 1.54 1.23-.43.55M282.29 290.1l-.3-1.97.7-.1.3 1.97-.7.1M134.7 387.6a98.6 98.6 0 0 1-1.7-1.04l.38-.59 1.68 1.04-.36.6M283.19 301.96l-.05-1.99.7-.02.05 2h-.7M283.05 298l-.1-1.57.14.12.5-.59h.03c.05.66.1 1.33.13 2l-.7.03\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#212d3d\",\n d: \"M283.1 296.55l-.15-.13-.03-.4.67-.06-.5.59M121.8 378.33l-1.5-1.3.47-.53 1.49 1.3-.45.53M131.34 385.49l-1.65-1.12.4-.57 1.63 1.1-.38.59M128.06 383.23l-1.6-1.17.42-.56c.53.4 1.06.78 1.6 1.16l-.42.57M278.86 274.63l-.6-1.88.66-.22c.2.63.41 1.26.6 1.9l-.66.2M113.2 370.05l-1.34-1.48.53-.47c.43.5.88.99 1.32 1.47l-.52.48M110.56 367.06l-1.28-1.53.55-.45a98 98 0 0 0 1.26 1.53l-.53.45M279.95 278.43c-.17-.63-.34-1.27-.53-1.9l.68-.2.53 1.93-.68.17M115.95 372.93l-1.4-1.43.52-.48 1.38 1.41-.5.5M118.82 375.69c-.48-.45-.97-.9-1.45-1.37l.49-.5 1.44 1.36-.48.5M280.89 282.28l-.45-1.93.68-.16c.16.64.3 1.29.45 1.94l-.68.15M281.67 286.17l-.37-1.95.69-.14.37 1.97-.7.12\"\n }))));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgCircleBackground);\nexport default __webpack_public_path__ + \"static/media/circleBackground.d1cdb0ccdf03b63f50177e2f5ec1f659.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react'\nimport PropTypes from 'prop-types'\nimport dayjs from 'dayjs'\nimport isEmpty from 'lodash/isEmpty'\nimport Breadcrumb from 'react-bootstrap/Breadcrumb'\nimport Container from 'react-bootstrap/Container'\nimport SubscribeIcon from '../../icons/SubscribeIcon'\nimport CaretLeftRightIcon from '../../icons/CaretLeftRightIcon'\nimport datasetVersionFormatter from '../../../utilities/datasetVersionFormatter'\nimport { getDatasetVersionValue, getTooltipBasedOnFrequency, getDatasetVersionText } from '../../../utilities/datasetHelpers'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\n\nimport circleBackground from '../../../assets/circleBackground.svg'\nimport DatasetVersionIcon from '../../common/DatasetVersionIcon/DatasetVersionIcon'\n\nimport './DatasetHero.scss'\n\nconst DatasetHero = ({\n dataSource,\n description,\n govDeliverySubscriptionLink,\n id,\n name,\n navInfo,\n onSubscribe,\n updateFrequency,\n latestVersion,\n retired\n}) => {\n const { category, subtopic, topic } = navInfo\n\n return (\n <div\n id={id}\n className='DatasetHero jumbotron'\n fluid='true'\n style={{ backgroundImage: `url(${circleBackground})` }}\n >\n <Container>\n <Breadcrumb className='DatasetHero__breadcrumb desktop'>\n {/* Navigational Category (no page exists) */}\n {category && <Breadcrumb.Item active>{category}</Breadcrumb.Item>}\n {/* Mandatory Topic */}\n {topic && <li className='breadcrumb-item'><LinkHandler className='DatasetHero__breadcrumb__link' href={topic.slug} label={topic.name} /></li>}\n {/* Subtopic, if present */}\n {!isEmpty(subtopic) && <li className='breadcrumb-item'><LinkHandler className='DatasetHero__breadcrumb__link' href={subtopic.slug} label={subtopic.name} /></li>}\n </Breadcrumb>\n <Breadcrumb className='DatasetHero__breadcrumb mobile'>\n {/* render only if topic or subtopic data exists, prioritize subtopic */}\n {(!isEmpty(topic) || !isEmpty(subtopic)) && (\n <li className='breadcrumb-item'>\n <LinkHandler\n className='DatasetHero__breadcrumb__link'\n href={!isEmpty(subtopic) ? subtopic.slug : topic.slug}\n >\n <CaretLeftRightIcon color='currentColor' direction='left' />\n {!isEmpty(subtopic) ? subtopic.name : topic.name}\n </LinkHandler>\n </li>\n )}\n </Breadcrumb>\n <div className='DatasetHero__container-inner'>\n <div className='DatasetHero__title-container'>\n <h1>{name}</h1>\n <p>{description}</p>\n </div>\n <div className='DatasetHero__meta-container'>\n {govDeliverySubscriptionLink && onSubscribe && (\n <button onClick={onSubscribe} className='DatasetHero__subscribe-button'>\n <SubscribeIcon />\n <span>Subscribe</span>\n </button>\n )}\n <div className='DatasetHero__meta'>\n <span>Data update frequency</span>\n <span>\n <div className='DatasetHero__updateFrequency'>\n {updateFrequency}\n <DatasetVersionIcon tooltip={getTooltipBasedOnFrequency(updateFrequency)} icon='filledIn' />\n </div>\n </span>\n </div>\n <div className='DatasetHero__meta'>\n <span>Latest data available</span>\n <span>{formatLatestVersion(updateFrequency, latestVersion, retired)}</span>\n </div>\n <div className='DatasetHero__meta'>\n <span>Data source</span>\n <span>{dataSource}</span>\n </div>\n\n </div>\n </div>\n </Container>\n </div>\n )\n}\n\nexport const formatLastUpdatedDate = (lastUpdatedDate) => {\n return dayjs(lastUpdatedDate).format('MMMM D, YYYY')\n}\n\nexport const formatLatestVersion = (updateFrequency, latestVersion, retired) => {\n const version = getDatasetVersionText(retired ? 'retired' : latestVersion.fieldReReleaseSelect)\n return (\n <div>\n {version.display\n ? <><div>{datasetVersionFormatter(updateFrequency, getDatasetVersionValue(latestVersion))}</div><div className='spacer'> | </div><div>{version.label} <DatasetVersionIcon tooltip={version?.tooltip} icon='filledIn' /></div></>\n : <div>{datasetVersionFormatter(updateFrequency, getDatasetVersionValue(latestVersion))} </div>}\n </div>\n )\n}\n\nDatasetHero.propTypes = {\n dataSource: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n govDeliverySubscriptionLink: PropTypes.string,\n id: PropTypes.string,\n name: PropTypes.string.isRequired,\n navInfo: PropTypes.shape({\n category: PropTypes.string.isRequired,\n subtopic: PropTypes.shape({\n name: PropTypes.string,\n slug: PropTypes.string\n }).isRequired,\n topic: PropTypes.shape({\n name: PropTypes.string.isRequired,\n slug: PropTypes.string.isRequired\n }).isRequired\n }).isRequired,\n onSubscribe: PropTypes.func,\n updateFrequency: PropTypes.string.isRequired,\n latestVersion: PropTypes.object,\n retired: PropTypes.bool\n}\n\nexport default DatasetHero\n","import React from 'react'\n\nconst DataIcon = () => (\n <span className='DataIcon SvgIcon'>\n <svg xmlns='http://www.w3.org/2000/svg' xmlnsXlink='http://www.w3.org/1999/xlink' width='24' height='14'>\n <defs>\n <path id='a' d='M0 0h24v24H0z' />\n </defs>\n <g fill='none' fillRule='evenodd' transform='translate(0 -5)'>\n <mask id='b' fill='#fff'>\n <use xlinkHref='#a' />\n </mask>\n <path fill='currentColor' d='M24 7.2a2.2 2.2 0 0 1-2.7 2l-4 4 .2.5a2.2 2.2 0 1 1-4.3-.6l-2.8-2.7a2 2 0 0 1-.6 0 2 2 0 0 1-.5 0l-5 5v.5c0 1.2-1 2.2-2.1 2.2a2.2 2.2 0 1 1 .6-4.3l5-5-.2-.5a2.2 2.2 0 1 1 4.3.6l2.8 2.7h1.1l4-3.9-.2-.5a2.2 2.2 0 1 1 4.4 0z' mask='url(#b)' />\n </g>\n </svg>\n </span>\n)\n\nexport default DataIcon\n","import React from 'react'\n\nconst AccessIcon = () => (\n <span className='AccessIcon SvgIcon'>\n <svg xmlns='http://www.w3.org/2000/svg' width='24' height='12' version='1'>\n <g fill='none' fillRule='evenodd'>\n <path d='M0-6h24v24H0z' />\n <path fill='currentColor' d='M2 6c0-2 2-4 4-4h5V0H6a6 6 0 0 0 0 12h5v-2H6c-2 0-4-2-4-4zm5 1h10V5H7v2zm11-7h-5v2h5a4 4 0 0 1 0 8h-5v2h5a6 6 0 0 0 0-12z' />\n </g>\n </svg>\n </span>\n)\n\nexport default AccessIcon\n","var _path;\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nfunction SvgList(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 512 512\",\n fill: \"currentColor\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M40 48C26.7 48 16 58.7 16 72v48c0 13.3 10.7 24 24 24H88c13.3 0 24-10.7 24-24V72c0-13.3-10.7-24-24-24H40zM192 64c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zm0 160c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zm0 160c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H192zM16 232v48c0 13.3 10.7 24 24 24H88c13.3 0 24-10.7 24-24V232c0-13.3-10.7-24-24-24H40c-13.3 0-24 10.7-24 24zM40 368c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24H88c13.3 0 24-10.7 24-24V392c0-13.3-10.7-24-24-24H40z\"\n })));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgList);\nexport default __webpack_public_path__ + \"static/media/list.2077b1a46f37ad712404f42d1b21b5e4.svg\";\nexport { ForwardRef as ReactComponent };","import React, { forwardRef } from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport Button from 'react-bootstrap/Button'\nimport Dropdown from 'react-bootstrap/Dropdown'\nimport DataIcon from '../../icons/DataIcon'\nimport AccessIcon from '../../icons/AccessIcon'\nimport { ReactComponent as SortDownIcon } from '../../../assets/fontawesome/solid/sort-down.svg'\nimport { ReactComponent as DownToLineIcon } from '../../../assets/fontawesome/solid/down-to-line.svg'\nimport { ReactComponent as ListIcon } from '../../../assets/fontawesome/solid/list.svg'\n\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport { trackIntendedDownloadClick, trackDataBarClick } from '../../../utilities/analyticsEventHelpers'\nimport './DataBar.scss'\n\nconst handlerValues = {\n onViewDataClick: 'View Data',\n onVisualizeDataClick: 'Visualize Data',\n onAccessApiClick: 'Access API',\n onDownloadClick: 'Download'\n}\n\nconst handlerIcons = {\n onViewDataClick: <ListIcon className='ListIcon' />,\n onVisualizeDataClick: <DataIcon />,\n onAccessApiClick: <AccessIcon />,\n onDownloadClick: <DownToLineIcon className='DownToLineIcon' />\n}\n\nconst DataBar = (props) => {\n const {\n thisRef,\n isMobile\n } = props\n\n const buttonHandlers = {\n onViewDataClick: props.onViewDataClick,\n onVisualizeDataClick: props.onVisualizeDataClick,\n onAccessApiClick: props.onAccessApiClick,\n onDownloadClick: props.onDownloadClick\n }\n\n const {\n onViewDataClick,\n onVisualizeDataClick,\n onAccessApiClick,\n onDownloadClick\n } = buttonHandlers\n\n // create objects that represent buttons for determining single button/mobile display\n const buttonObjects = Object.keys(buttonHandlers).reduce((collection, handlerKey) => {\n if (buttonHandlers[handlerKey]) {\n collection.push({\n onClick: buttonHandlers[handlerKey],\n value: handlerValues[handlerKey],\n icon: handlerIcons[handlerKey]\n })\n }\n\n return collection\n }, [])\n\n const isSingleButton = buttonObjects.length === 1\n const colProps = { lg: isSingleButton ? 6 : 12 }\n\n return (\n <Container\n className={cx('DataBar', { singleButton: isSingleButton })}\n ref={thisRef}\n >\n {!isMobile && (\n <Row>\n <Col {...colProps} className='DataBar__inner'>\n {onViewDataClick && (\n <div className='DataBar__button-container DataBar__button-container--dark'>\n <Button variant='light' size='lg' onClick={() => { onViewDataClick(); trackDataBarClick('view-data', window.utag) }}>\n {handlerIcons.onViewDataClick}\n <span className='DataBar__button-text'>{handlerValues.onViewDataClick}</span>\n </Button>\n </div>\n )}\n {onVisualizeDataClick && (\n <div className='DataBar__button-container DataBar__button-container--outline'>\n <Button variant='outline-light' size='lg' onClick={() => { onVisualizeDataClick(); trackDataBarClick('view-visual', window.utag) }}>\n {handlerIcons.onVisualizeDataClick}\n <span className='DataBar__button-text'>{handlerValues.onVisualizeDataClick}</span>\n </Button>\n </div>\n )}\n {onAccessApiClick && (\n <div className='DataBar__button-container DataBar__button-container--link'>\n <Button variant='link' size='lg' onClick={() => { onAccessApiClick(); trackDataBarClick('access-api', window.utag) }}>\n {handlerIcons.onAccessApiClick}\n <span className='DataBar__button-text'>{handlerValues.onAccessApiClick}</span>\n </Button>\n </div>\n )}\n {onDownloadClick && (\n <div className='DataBar__button-container DataBar__button-container--link download'>\n <Button variant='link' size='lg' onClick={(e) => { onDownloadClick(); trackIntendedDownloadClick(e.target.innerHTML, window.utag) }}>\n {handlerIcons.onDownloadClick}\n <span className='DataBar__button-text'>{handlerValues.onDownloadClick}</span>\n </Button>\n </div>\n )}\n </Col>\n </Row>\n )}\n\n {isMobile && (\n <Dropdown>\n <Dropdown.Toggle\n as={DropdownToggle}\n value='Select an Action'\n />\n <Dropdown.Menu drop='down' flip={false}>\n {onViewDataClick && (\n <Dropdown.Item onClick={onViewDataClick}>\n <span className='icon'>{handlerIcons.onViewDataClick}</span>\n <span className='DataBar__button-text'>{handlerValues.onViewDataClick}</span>\n </Dropdown.Item>\n )}\n {onVisualizeDataClick && (\n <Dropdown.Item onClick={onVisualizeDataClick}>\n <span className='icon'>{handlerIcons.onVisualizeDataClick}</span>\n <span className='DataBar__button-text'>{handlerValues.onVisualizeDataClick}</span>\n </Dropdown.Item>\n )}\n {onAccessApiClick && (\n <Dropdown.Item onClick={onAccessApiClick}>\n <span className='icon'>{handlerIcons.onAccessApiClick}</span>\n <span className='DataBar__button-text'>{handlerValues.onAccessApiClick}</span>\n </Dropdown.Item>\n )}\n {onDownloadClick && (\n <Dropdown.Item onClick={onDownloadClick}>\n <span className='icon'>{handlerIcons.onDownloadClick}</span>\n <span className='DataBar__button-text'>{handlerValues.onDownloadClick}</span>\n </Dropdown.Item>\n )}\n </Dropdown.Menu>\n </Dropdown>\n )}\n </Container>\n )\n}\n\nDataBar.propTypes = {\n onDownloadClick: PropTypes.func,\n onViewDataClick: PropTypes.func,\n onAccessApiClick: PropTypes.func,\n onVisualizeDataClick: PropTypes.func,\n thisRef: PropTypes.object,\n isMobile: PropTypes.bool\n}\n\nDataBar.defaultProps = {\n isMobile: false\n}\n\nexport const DropdownToggle = forwardRef((props, ref) => {\n const {\n onClick,\n value\n } = props\n\n const isOpen = props['aria-expanded']\n\n return (\n <div\n ref={ref}\n className={cx('DataBar__dropdownToggle', { open: isOpen })}\n onClick={e => {\n e.preventDefault()\n onClick(e)\n }}\n >\n <span className='left'>\n <span>{value}</span>\n </span>\n <span className='right'>\n <span className='bar'>|</span>\n <span><SortDownIcon /></span>\n </span>\n </div>\n )\n})\n\nDropdownToggle.propTypes = {\n value: PropTypes.string,\n onClick: PropTypes.func,\n 'aria-expanded': PropTypes.bool\n}\n\nexport default (props) => {\n const { isMobile } = useDisplayContext()\n\n return (\n <DataBar\n {...props}\n isMobile={isMobile}\n />\n )\n}\n\nexport { DataBar }\n","import React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport ComponentShell from '../ComponentShell/ComponentShell'\nimport get from 'lodash/get'\nimport { getLookupToolData } from '../../../services/api.js'\nimport parser from '../../../utilities/formulaParser'\n\nimport './DynamicNumberCallouts.scss'\n\nconst Callout = ({ dataId, description, dataViewerParams, config }) => {\n const [value, setValue] = useState()\n const [calloutSuffix, setCalloutSuffix] = useState(null)\n useEffect(() => {\n const fetchData = async () => {\n const res = await getLookupToolData(dataId, dataViewerParams)\n const data = get(res, 'data[0]')\n let formula = get(config, 'formula')\n\n if (formula) {\n const regex = /&\"([^\"]+)\"/g\n const match = regex.exec(formula)\n if (match) {\n const result = match[1]\n formula = formula.replace(match[0], '')\n setCalloutSuffix(result)\n }\n setValue(parser.parse(formula)({ data: data }))\n } else {\n setValue(parser.parse('FORMAT_NUMBER(data, 0)')({ data: data }))\n }\n }\n fetchData()\n }, [dataId, dataViewerParams, config])\n return (\n <div className='DynamicNumberCallouts__callout'>\n <div className='DynamicNumberCallouts__callout-value-container'>\n <p className='DynamicNumberCallouts__callout-value'>{value}\n {calloutSuffix ? <span className='DynamicNumberCallouts__callout-suffix'>{calloutSuffix}</span> : ''}\n </p>\n </div>\n <p className='DynamicNumberCallouts__callout-title'>{description}</p>\n </div>\n )\n}\n\nconst DynamicNumberCallouts = ({ callouts }) => {\n return (\n <div className='DynamicNumberCallouts'>\n <ComponentShell>\n <p className='DynamicNumberCallouts__title'>By the numbers</p>\n <div className='DynamicNumberCallouts__callouts'>\n {\n callouts && callouts.map((data, i) => {\n return (\n <Callout\n key={i}\n dataId={get(data, 'module.id')}\n description={get(data, 'description')}\n dataViewerParams={get(data, 'module.dataSourceConfig.dataViewerParams[0]')}\n config={get(data, 'module.config')}\n />)\n }\n )\n }\n </div>\n </ComponentShell>\n </div>\n )\n}\n\nCallout.propTypes = {\n dataId: PropTypes.string,\n description: PropTypes.string,\n dataViewerParams: PropTypes.object,\n config: PropTypes.object\n}\n\nDynamicNumberCallouts.propTypes = {\n callouts: PropTypes.arrayOf(PropTypes.object)\n}\n\nexport { Callout }\nexport default DynamicNumberCallouts\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { getContactHref } from '../../../utilities/linkHelpers'\n\nimport './HelpDeskContact.scss'\n\nconst HelpDeskContact = ({\n header,\n value: contactLink,\n subjectLine,\n title,\n shortDescription\n}) => {\n const contactHref = getContactHref(contactLink, subjectLine)\n\n return (\n <div className='HelpDeskContact'>\n <h1>{shortDescription}</h1>\n\n <div className='HelpDeskContact__contact-option'>\n <label>{header}</label>\n <h2>{title}</h2>\n <a href={contactHref}>{contactLink}</a>\n </div>\n </div>\n )\n}\n\nHelpDeskContact.propTypes = {\n header: PropTypes.string,\n value: PropTypes.string,\n subjectLine: PropTypes.string,\n title: PropTypes.string,\n shortDescription: PropTypes.string\n}\n\nHelpDeskContact.defaultProps = {\n header: 'Contact email',\n value: 'example@example.com',\n title: 'Contact Title',\n subjectLine: '',\n shortDescription: 'Didn’t find the answer you were looking for?'\n}\n\nexport default HelpDeskContact\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport get from 'lodash/get'\nimport isEmpty from 'lodash/isEmpty'\nimport take from 'lodash/take'\nimport dayjs from 'dayjs'\nimport config from '../../../config'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\nimport DatasetCard from '../../common/Resource/DatasetCard'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport ResourceSmallCarousel from '../../common/Resource/ResourceSmallCarousel'\n\nimport './DatasetRelated.scss'\n\nconst {\n datasetRelatedParentLabel,\n datasetRelatedGrandparentLabel,\n datasetRelatedDisplayLimit\n} = config\n\n// extract data for each card, excluding the current page if exists\nfunction buildCardData (data) {\n const cardsToDisplay = take(data, datasetRelatedDisplayLimit)\n\n return cardsToDisplay.map(item => {\n const label = get(item, 'name')\n const date = get(item, 'last_updated')\n const slug = get(item, 'slug')\n\n return {\n label,\n date,\n slug\n }\n })\n}\n\n/**\n * Compare two dataset version last updated dates for descending sort\n * Use alphabetical to break ties.\n * @param {Object} a\n * @param {string} a.last_updated primary sort field\n * @param {string} a.name secondary sort field\n * @param {Object} b\n * @param {string} b.last_updated primary sort field\n * @param {string} b.name secondary sort field\n */\nfunction compareDates (a, b) {\n if (a.last_updated === b.last_updated) return a.name > b.name ? 1 : -1\n\n return a.last_updated > b.last_updated ? -1 : 1\n}\n\n// return clean data for display sorted by viewing stats, desc\nfunction getTopViewed (data) {\n const shallowClone = [...data].sort((a, b) => b.views - a.views).slice(0, datasetRelatedDisplayLimit)\n const sorted = shallowClone.sort((a, b) => compareDates(a, b))\n\n return buildCardData(sorted)\n}\n\n// return clean data for display sorted by last updated date, desc\nfunction getLastUpdated (data) {\n const shallowClone = [...data]\n const sorted = shallowClone.sort((a, b) => compareDates(a, b))\n\n return buildCardData(sorted)\n}\n\nfunction renderSectionItems (items) {\n return items.map(({ date, label, slug }, i) => (\n <DatasetCard\n key={i}\n footer={dayjs(date).format('MMMM D, YYYY')}\n heading={label}\n slug={slug}\n />\n ))\n}\n\nconst DatasetRelated = ({ topicHierarchy, data }) => {\n const subtopic = get(topicHierarchy, 'subtopic')\n const topic = get(topicHierarchy, 'topic')\n const { subtopics, topics } = data\n const viewAllRouterData = { pageReferrer: 'DATASET' }\n\n const { isMobile } = useDisplayContext()\n\n const sections = [\n {\n name: subtopic.name,\n slug: subtopic.slug,\n hasMoreToView: subtopics.length > datasetRelatedDisplayLimit,\n heading: datasetRelatedParentLabel,\n items: getTopViewed(subtopics),\n searchSort: 'Relevancy'\n },\n {\n name: topic.name,\n slug: topic.slug,\n hasMoreToView: topics.length > datasetRelatedDisplayLimit,\n heading: datasetRelatedGrandparentLabel,\n items: getLastUpdated(topics),\n searchSort: 'Last updated'\n }\n ]\n\n return (\n <div className='DatasetRelated'>\n {!isEmpty(sections) &&\n sections.map(({\n heading,\n name,\n slug,\n items = [],\n hasMoreToView\n }, i) => {\n const renderedItems = renderSectionItems(items)\n\n return (\n !isEmpty(items) &&\n <section key={i} className='DatasetRelated__section'>\n <div className='DatasetRelated__section-header'>\n <div>\n <h2>{heading}:</h2>\n <h3>{name}</h3>\n </div>\n <div>\n {hasMoreToView &&\n <LinkHandler\n href={slug}\n label='View All'\n routerData={viewAllRouterData}\n />}\n </div>\n </div>\n <div className='DatasetRelated__section-items'>\n {isMobile && (\n <ResourceSmallCarousel\n isDatasetCarousel\n renderedResources={renderedItems}\n />\n )}\n {!isMobile && renderedItems}\n </div>\n </section>\n )\n })}\n </div>\n )\n}\n\nDatasetRelated.propTypes = {\n topicHierarchy: PropTypes.shape({\n subtopic: PropTypes.shape({\n name: PropTypes.string,\n slug: PropTypes.string\n }),\n topic: PropTypes.shape({\n name: PropTypes.string,\n slug: PropTypes.string\n })\n }),\n data: PropTypes.shape({\n subtopics: PropTypes.array,\n topics: PropTypes.array\n })\n}\n\nexport default DatasetRelated\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport dayjs from 'dayjs'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport { ReactComponent as CircleInfoIcon } from '../../../assets/fontawesome/solid/circle-info.svg'\nimport isEmpty from 'lodash/isEmpty'\nimport config from '../../../config'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\nimport { encodeSearchPageQueryString } from '../../../utilities/searchPageHelpers'\nimport { getSearchPagePath } from '../../../utilities/routeHelpers'\nimport withDisplayContext from '../../../hocs/withDisplayContext/withDisplayContext'\nimport Text from '../../common/Text/Text'\nimport { getContactHref } from '../../../utilities/linkHelpers'\n\nimport './DatasetDetails.scss'\n\nconst { changelogParam, datasetPrivacyLevelDictionary } = config\n\nfunction DatasetDetails (props) {\n const {\n created,\n currentSlug,\n lastUpdated,\n email,\n privacyLevel,\n tags,\n renderedVersions,\n hideChangeLogLink,\n isMobile,\n datasetName\n } = props\n\n /*\n API returns multiple facets for each requested, some of which are empty\n deserializer in turn fills these arrays with null values; handle here\n */\n const allTagsList = Object.keys(tags).reduce((acc, tagParent) => {\n const tagsWithFilter = tags[tagParent]\n .filter(tag => !!tag)\n .map(tag => ({ ...tag, filter: tagParent }))\n\n return [...acc, ...tagsWithFilter]\n }, [])\n\n const createdDateString = dayjs(created).format('MMMM D, YYYY')\n const changeLogLink = `${currentSlug}/${changelogParam}`\n const updatedDateString = dayjs(lastUpdated).format('MMMM D, YYYY')\n const friendlyPrivacyLevel = datasetPrivacyLevelDictionary[privacyLevel]\n\n return (\n <div className='DatasetDetails'>\n <Row>\n <Col className='DatasetDetails__left'>\n <div className='DatasetDetails__meta'>\n <span className='DatasetDetails__label'>Page last modified</span>\n <Text typeFace={isMobile ? '02 H2/Mobile/Black' : '02 H2/Black/L'}>\n {updatedDateString}\n </Text>\n {!hideChangeLogLink && (\n <div className='DatasetDetails__changelog'>\n <CircleInfoIcon className='CircleInfoIcon' />\n <LinkHandler href={changeLogLink} label='What has changed?' />\n </div>\n )}\n </div>\n <div className='DatasetDetails__meta'>\n <span className='DatasetDetails__label'>Date created</span>\n <span>{createdDateString}</span>\n </div>\n <div className='DatasetDetails__meta'>\n <span className='DatasetDetails__label'>Contact email</span>\n <span className='DatasetDetails__email'>\n <a\n href={getContactHref(email, `Question on ${datasetName}`)}\n target='_blank'\n rel='noopener noreferrer'\n className='ErrorPage__ContactButton'\n >\n {email}\n </a>\n </span>\n </div>\n {\n !isEmpty(allTagsList) &&\n <div className='DatasetDetails__meta'>\n <span className='DatasetDetails__label'>Tags</span>\n <ul className='DatasetDetails__tags'>\n {\n allTagsList.map((tag, index) => {\n return (\n <li key={index} className='DatasetDetails__tag-wrapper'>\n <LinkHandler\n key={index}\n className='DatasetDetails__tag'\n href={getSearchPagePath()}\n routerData={{ search: encodeSearchPageQueryString({ keywords: tag.name }) }}\n label={tag.name}\n title='Search CMS data with this tag'\n />\n </li>\n )\n })\n }\n </ul>\n </div>\n }\n </Col>\n <Col className='DatasetDetails__right'>\n <div className='DatasetDetails__meta'>\n <span className='DatasetDetails__label'>Privacy level</span>\n <Text\n className='DatasetDetails__license'\n typeFace={isMobile ? '05 H5/Mobile/Regular/Black' : '05 H3/Black/Regular/L'}\n >\n {friendlyPrivacyLevel}\n </Text>\n </div>\n {renderedVersions}\n </Col>\n </Row>\n </div>\n )\n}\n\nDatasetDetails.propTypes = {\n created: PropTypes.string.isRequired,\n currentSlug: PropTypes.string.isRequired,\n lastUpdated: PropTypes.string.isRequired,\n email: PropTypes.string.isRequired,\n privacyLevel: PropTypes.string.isRequired,\n tags: PropTypes.object,\n renderedVersions: PropTypes.element,\n hideChangeLogLink: PropTypes.bool,\n isMobile: PropTypes.bool,\n datasetName: PropTypes.string\n}\n\nDatasetDetails.defaultProps = {\n tags: {},\n renderVersions: <div />\n}\n\nexport default withDisplayContext(DatasetDetails)\n\nexport { DatasetDetails }\n","import React, { PureComponent } from 'react'\nimport PropTypes from 'prop-types'\nimport Button from 'react-bootstrap/Button'\nimport SimpleBar from 'simplebar-react'\nimport cx from 'classnames'\nimport take from 'lodash/take'\nimport config from '../../../config'\nimport { isDatasetVersionInteractive, getDatasetVersionText, getSortedDatasetVersions } from '../../../utilities/datasetHelpers'\nimport OverlayTrigger from 'react-bootstrap/OverlayTrigger'\nimport Tooltip from 'react-bootstrap/Tooltip'\nimport { ReactComponent as InfoIconFilledIn } from '../../../assets/fontawesome/custom/circle-info-filled-in.svg'\n\nimport './DatasetDetailsVersions.scss'\n\n// pull max version to display on screen from config\nconst { datasetVersionDisplayLimit } = config\n\nclass DatasetDetailsVersions extends PureComponent {\n state = {\n allVersionsDisplayed: false,\n moreAreAvailable: true,\n versions: []\n }\n\n componentDidMount () {\n const { versions: raw } = this.props\n const formattedVersions = this.buildFormattedVersionList(raw)\n\n this.setState({\n allVersionsDisplayed: raw.length <= datasetVersionDisplayLimit,\n moreAreAvailable: raw.length > datasetVersionDisplayLimit,\n versions: formattedVersions\n })\n }\n\n // return a list item link or plain text based on uuid of current screen\n buildListLink (item, index) {\n const {\n getVersionUrl,\n onVersionLinkClick\n } = this.props\n\n const isInteractive = isDatasetVersionInteractive(item.versionObj)\n\n return isInteractive\n ? <li key={index} className={`list__item ${index === 0 ? 'first-list-item' : ''}`}><a href={getVersionUrl(item.versionObj)} onClick={e => onVersionLinkClick(e, item.versionObj)}> {item.version} </a>{item.icon}</li>\n : <li key={index} className={`list__item-disabled ${index === 0 ? 'first-list-item' : ''}`}>{item.version}</li>\n }\n\n // given [] of versions, will return two arrays for the two columns in UI\n buildListColumns (allVersionsDisplayed, versions) {\n const leftColumn = []\n const rightColumn = []\n const versionsToDisplay = allVersionsDisplayed ? versions : take(versions, datasetVersionDisplayLimit)\n const mappedVersion = versionsToDisplay?.map(i => i.versionObj)\n\n // Create a mapping of versionObj to its index\n const versionObjToIndex = {}\n versionsToDisplay.forEach((obj, index) => {\n versionObjToIndex[obj.versionObj] = index\n })\n\n // Get sorted version just from the versionObj\n const sortedVersions = getSortedDatasetVersions(mappedVersion)\n\n // Populate with IDs so we can restore original format\n const versionObjMap = {}\n versionsToDisplay.forEach(obj => {\n versionObjMap[obj.versionObj?.id] = obj\n })\n\n // Put sorted versions back into original format\n const sortedObjects = sortedVersions.map(sortedVersion => versionObjMap[sortedVersion?.id])\n\n sortedObjects?.forEach((version, index) => {\n index % 2 === 0\n ? leftColumn.push(version)\n : rightColumn.push(version)\n })\n\n return {\n leftColumn,\n rightColumn\n }\n }\n\n buildMouseOver = (message) => {\n const buildToolTip = (tooltipProps) => {\n return (\n <Tooltip\n {...tooltipProps}\n bsPrefix='DatasetPageDetailsVersions__tooltip'\n arrowProps={{ style: { display: 'none' } }}\n >\n {message}\n </Tooltip>\n )\n }\n return (\n <OverlayTrigger\n flip\n placement='bottom'\n overlay={e => buildToolTip(e)}\n trigger={['hover']}\n >\n <InfoIconFilledIn />\n </OverlayTrigger>\n )\n }\n\n // return an ordered list sorted by date, descending\n buildFormattedVersionList = (raw) => {\n return raw.map(version => {\n const tooltip = getDatasetVersionText(version.fieldReReleaseSelect)\n const formattedVersion = (\n <>\n {version.fieldDatasetVersionCombined}\n {(version.fieldDatasetVersionSuffix && version.fieldDatasetVersionSuffix.length > 0)}\n </>\n )\n return {\n id: version.id,\n version: formattedVersion,\n hasFile: !!version.fieldRefPrimaryDataFile,\n versionObj: version,\n icon: version.fieldDatasetVersionSuffix ? <div>{this.buildMouseOver(tooltip.tooltip)}</div> : ''\n }\n })\n }\n\n handleToggleVersions = () => {\n this.setState({\n allVersionsDisplayed: !this.state.allVersionsDisplayed\n })\n }\n\n render () {\n const { allVersionsDisplayed, moreAreAvailable, versions } = this.state\n const { leftColumn, rightColumn } = this.buildListColumns(allVersionsDisplayed, versions)\n return (\n <div className='DatasetDetails__meta'>\n <span className='DatasetDetails__label'>All data available</span>\n <div className={`DatasetDetailsVersions ${!allVersionsDisplayed || (allVersionsDisplayed && !moreAreAvailable) ? 'VersionsCollapsed' : ''}`}>\n <div className='ScrollArea__Versions__Container'>\n <SimpleBar forceVisible='y' autoHide={false} className='data-wrapper'>\n <div className='DatasetDetailsVersions__list-container'>\n <ul className='list-container__list'>\n {\n leftColumn.map((item, index) => {\n return this.buildListLink(item, index)\n })\n }\n </ul>\n <ul className={cx('list-container__list', 'list-container__list-right')}>\n {\n rightColumn.map((item, index) => {\n return this.buildListLink(item, index)\n })\n }\n </ul>\n </div>\n </SimpleBar>\n </div>\n {\n moreAreAvailable &&\n <Button\n className='DatasetDetailsVersions__button'\n variant='link'\n onClick={this.handleToggleVersions}\n >\n {\n allVersionsDisplayed ? 'Show less' : 'Show more'\n }\n </Button>\n }\n </div>\n </div>\n )\n }\n}\n\nDatasetDetailsVersions.propTypes = {\n versions: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string.isRequired,\n fieldDatasetVersion: PropTypes.string.isRequired\n })),\n onVersionLinkClick: PropTypes.func,\n getVersionUrl: PropTypes.func\n}\n\nDatasetDetailsVersions.defaultProps = {\n getVersionUrl: version => { return '/' }\n}\n\nexport default DatasetDetailsVersions\n","import React, { PureComponent, createRef } from 'react'\nimport PropTypes from 'prop-types'\nimport isEmpty from 'lodash/isEmpty'\nimport get from 'lodash/get'\nimport memoizeOne from 'memoize-one'\nimport Button from 'react-bootstrap/Button'\nimport Container from 'react-bootstrap/Container'\nimport DatasetHero from '../../dataset/DatasetHero/DatasetHero'\nimport DataBar from '../../dataset/DataBar/DataBar'\nimport RichTextField from '../../common/RichTextField/RichTextField'\nimport DynamicNumberCallouts from '../../common/NumberCallouts/DynamicNumberCallouts'\nimport NumberCallouts from '../../common/NumberCallouts/NumberCallouts'\nimport HelpDeskContact from '../../common/HelpDeskContact/HelpDeskContact'\nimport DatasetRelated from '../../dataset/DatasetRelated/DatasetRelated'\nimport FaqsList from '../../common/FaqsList/FaqsList'\nimport SmallBanner from '../../common/SmallBanner/SmallBanner'\nimport DatasetResources from '../../dataset/DatasetResources/DatasetResources'\nimport DatasetDetails from '../../dataset/DatasetDetails/DatasetDetails'\nimport VisualizationList from '../../common/VisualizationList/VisualizationList'\nimport DatasetDetailsVersions from '../../dataset/DatasetDetails/DatasetDetailsVersions'\nimport ContentPageLayout from '../../common/ContentPageLayout/ContentPageLayout'\nimport ContentPageNav from '../../common/ContentPageLayout/ContentPageNav'\nimport BackToTopBtn from '../../common/BackToTopBtn/BackToTopBtn'\nimport MetaHead from '../../layout/MetaHead/MetaHead'\nimport Footer from '../../layout/Footer/Footer'\nimport config from '../../../config'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\nimport {\n formatVisualizationList,\n getDatasetFrequency,\n getNewestDatasetVersion as _getNewestDatasetVersion,\n getDatasetVersionPrimaryDataFile,\n getDatasetName,\n getDatasetResourcesHeader,\n getDatasetResourcesDescription,\n getDatasetCreationDate,\n getDatasetLastUpdatedDate,\n getVersionLabelUrl,\n parseRelatedDatasets,\n hasVisualization,\n getNavigationalHierarchy,\n getAllTags,\n getDatasetUuid as getDatasetTypeUuid,\n formatDynamicCallouts\n} from '../../../utilities/datasetHelpers'\nimport { getDefaultSubjectLineForContent } from '../../../utilities/linkHelpers'\nimport { formatMetaTags } from '../../../services/formatters/global'\nimport { logDatasetView } from '../../../services/api'\nimport circleBackground from '../../../assets/circleBackground.svg'\nimport visualizationBackground from '../../../assets/visualizationBg.svg'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\n\nimport './DatasetPage.scss'\n\nconst {\n interactiveDatasetParam,\n metaOrganizationName,\n apiSite\n} = config\n\nconst getNewestDatasetVersion = memoizeOne(_getNewestDatasetVersion)\nconst memoizedGetNavigationalHierarchy = memoizeOne(getNavigationalHierarchy)\nconst memoizedParseRelatedDatasets = memoizeOne(parseRelatedDatasets)\nconst memoizedGetAllTags = memoizeOne(getAllTags, ([oldTags], [newTags]) => {\n return JSON.stringify(oldTags) === JSON.stringify(newTags)\n})\nconst memoizedFormatVisualizations = memoizeOne(formatVisualizationList)\n\nclass DatasetPage extends PureComponent {\n state = {\n viewDataRef: createRef(),\n datasetPageRef: createRef(),\n visualizationRef: createRef()\n }\n\n startRef = createRef()\n stopRef = createRef()\n\n get hasDataFileInNewestVersion () {\n const { versions = [] } = this.props\n\n if (versions.length === 0) {\n return false\n } else {\n const newestVersion = getNewestDatasetVersion(versions)\n const primaryDataFile = getDatasetVersionPrimaryDataFile(newestVersion)\n return !!(primaryDataFile)\n }\n }\n\n get newestVersionIsStatic () {\n const { versions = [] } = this.props\n\n if (versions.length === 0) {\n return false\n } else {\n const newestVersion = getNewestDatasetVersion(versions)\n const primaryDataFile = getDatasetVersionPrimaryDataFile(newestVersion)\n const isStatic = get(primaryDataFile, 'isStatic')\n return isStatic\n }\n }\n\n get hasFaqs () {\n const { data } = this.props\n const { fieldParaFaq } = data\n return !isEmpty(fieldParaFaq)\n }\n\n componentDidMount () {\n const { data } = this.props\n const datasetTypeUuid = getDatasetTypeUuid(data)\n logDatasetView(datasetTypeUuid)\n }\n\n handleScrollToDataBar = () => {\n const { viewDataRef } = this.state\n const { offsetTop } = viewDataRef.current\n\n window.scroll({\n top: offsetTop,\n left: 0,\n behavior: 'smooth'\n })\n }\n\n handleOnSubscribe = () => {\n const { data } = this.props\n const subscriptionLink = get(data, 'fieldDatasetType.fieldSubscriptionService.fieldExternalSubscriptionLink.uri')\n\n if (subscriptionLink) {\n const subscriptionWindow = window.open(subscriptionLink)\n subscriptionWindow.focus()\n }\n }\n\n isLatestVersion = (version) => {\n const { versions = [] } = this.props\n const latestVersion = getNewestDatasetVersion(versions)\n return latestVersion.id === version.id\n }\n\n getVersionUrl = (version) => {\n const { data, datasetUrlPath } = this.props\n\n if (this.isLatestVersion(version)) {\n return `${datasetUrlPath}/${interactiveDatasetParam}`\n }\n\n const versionLabelUrl = getVersionLabelUrl(version, getDatasetFrequency(data))\n return `${datasetUrlPath}/${interactiveDatasetParam}/${versionLabelUrl}`\n }\n\n // extract navigational relationships for this dataset\n buildNavigationalHierarchy = () => {\n const { data } = this.props\n const rawNavInfo = get(data, 'fieldDatasetType.fieldRefNavTopic')\n\n return memoizedGetNavigationalHierarchy(rawNavInfo)\n }\n\n // build the related datasets section\n get parsedRelatedDatasets () {\n const { allDatasets, data } = this.props\n const name = get(data, 'fieldDatasetType.name')\n const topicHierarchy = this.buildNavigationalHierarchy()\n\n // if no topic or subtopic then no related\n if (isEmpty(topicHierarchy.topic) && isEmpty(topicHierarchy.subtopic)) {\n return { shouldDisplay: false }\n }\n\n // future state when all datasets endpoint can be parameterized\n const parsed = memoizedParseRelatedDatasets(name, topicHierarchy, allDatasets)\n const result = {\n shouldDisplay: !isEmpty(parsed.subtopics) || !isEmpty(parsed.topics),\n topicHierarchy,\n data: { ...parsed }\n }\n\n return result\n }\n\n get hasResources () {\n const { resources } = this.props\n return !isEmpty(resources)\n }\n\n get pageSections () {\n const { data, isMobile } = this.props\n\n return [\n {\n id: 'summary',\n label: 'Summary',\n // different scroll targets for desktop and mobile\n ...!isMobile && { onClick: this.handleScrollToDataBar }\n },\n ...(this.hasResources ? [{\n id: 'resources',\n label: 'Resources'\n }] : []),\n ...(hasVisualization(data) ? [{\n id: 'visualization',\n label: 'Visualization',\n className: 'DatasetPage__section-inverse',\n style: { backgroundImage: `url(${visualizationBackground})` }\n }] : []),\n {\n id: 'details',\n label: 'Details'\n },\n ...(this.hasFaqs ? [{\n id: 'faqs',\n label: 'FAQs'\n }] : []),\n ...(this.parsedRelatedDatasets.shouldDisplay ? [{\n id: 'related',\n label: 'Related',\n className: 'DatasetPage__section-inverse',\n style: { backgroundImage: `url(${circleBackground})` }\n }] : []),\n {\n id: 'contact',\n label: 'Contact'\n }\n ]\n }\n\n getRenderedVersions = () => {\n const { data, versions, onVersionLinkClick } = this.props\n\n return (\n <DatasetDetailsVersions\n fieldUpdateFrequency={getDatasetFrequency(data)}\n versions={versions}\n onVersionLinkClick={onVersionLinkClick}\n getVersionUrl={this.getVersionUrl}\n />\n )\n }\n\n renderDatasetSection = (section) => {\n const {\n data,\n included,\n versions,\n resources\n } = this.props\n\n const sectionId = section.id\n\n const fieldSummary = get(data, 'fieldSummary.value')\n const fieldPrivacyLevel = get(data, 'fieldDatasetType.fieldPrivacyLevel')\n const currentSlug = get(data, 'fieldDatasetType.path.alias')\n const allTags = memoizedGetAllTags(data)\n const {\n fieldPgDataCallouts,\n fieldContactHeader,\n fieldContactDepartmentName,\n fieldRefContactEmail,\n fieldParaFaq,\n fieldLatestChangeItem,\n fieldContactShortDescription\n } = data\n const hasSubscriptionLink = !!(get(data, 'fieldDatasetType.fieldSubscriptionService.fieldExternalSubscriptionLink.uri'))\n const lastUpdated = getDatasetLastUpdatedDate(data)\n const hideChangeLogLink = isEmpty(fieldLatestChangeItem)\n const visualizationListProps = memoizedFormatVisualizations(data, included)\n const toolsCallout = get(data, 'fieldDatasetType.fieldRefToolCallout')\n const hasToolsCallout = !!(toolsCallout)\n const toolsDescription = get(toolsCallout, 'fieldToolCardDescription')\n const toolsTitle = get(toolsCallout, 'fieldComponentTitle')\n const toolsCtaText = get(toolsCallout, 'fieldCallToActionText')\n const toolsCtaLink = get(toolsCallout, 'fieldInternalPage.path.alias')\n const customToolImage = this.props.isMobile\n ? toolsCallout?.fieldInternalPage?.fieldRefBackgroundImage?.fieldMobileImage?.uri?.url\n : toolsCallout?.fieldInternalPage?.fieldRefBackgroundImage?.fieldCalloutImage?.uri?.url\n const customToolImageActive = customToolImage && apiSite + customToolImage\n const toolsImage = hasToolsCallout && customToolImageActive\n\n const hasStaticCallouts = fieldPgDataCallouts && !isEmpty(fieldPgDataCallouts.fieldRefNumberCallout)\n const hasDynamicCallouts = fieldPgDataCallouts && !isEmpty(fieldPgDataCallouts.fieldPgDataCalloutWrapper)\n const dynamicCallouts = hasDynamicCallouts\n ? formatDynamicCallouts(fieldPgDataCallouts.fieldPgDataCalloutWrapper, included)\n : []\n\n switch (sectionId) {\n case 'summary':\n return (\n <Container className='DatasetPage__section-content'>\n {fieldSummary && (\n <RichTextField\n className='DatasetPage__summary-field-summary-container'\n content={fieldSummary}\n />\n )}\n {hasStaticCallouts && (\n <NumberCallouts callouts={fieldPgDataCallouts.fieldRefNumberCallout} />\n )}\n {hasDynamicCallouts && (\n <DynamicNumberCallouts callouts={dynamicCallouts} />\n )}\n {\n hasToolsCallout &&\n <SmallBanner\n bgImgPath={toolsImage}\n title={toolsTitle}\n text={toolsDescription}\n btnText={toolsCtaText}\n >\n <LinkHandler\n size='lg'\n variant='light'\n href={toolsCtaLink}\n >\n {toolsCtaText}\n </LinkHandler>\n </SmallBanner>\n }\n </Container>\n )\n\n case 'resources':\n if (this.hasResources) {\n return (\n <Container className='DatasetPage__section-content'>\n <DatasetResources\n header={getDatasetResourcesHeader(data)}\n description={getDatasetResourcesDescription(data)}\n resources={resources}\n showAdditionalResources\n />\n </Container>\n )\n } else {\n return null\n }\n\n case 'visualization':\n return (\n <Container className='DatasetPage__section-content' ref={this.state.visualizationRef}>\n <VisualizationList\n isMobile={this.props.isMobile}\n isLargeHeaderFont\n isNestedComponent\n {...visualizationListProps}\n />\n </Container>\n )\n\n case 'details':\n return (\n <Container className='DatasetPage__section-content'>\n <DatasetDetails\n created={getDatasetCreationDate(data)}\n currentSlug={currentSlug}\n versions={versions}\n lastUpdated={lastUpdated}\n email={fieldRefContactEmail.fieldContactEmail}\n privacyLevel={fieldPrivacyLevel}\n tags={allTags}\n hideChangeLogLink={hideChangeLogLink}\n renderedVersions={this.getRenderedVersions()}\n datasetName={getDatasetName(data)}\n />\n {\n hasSubscriptionLink &&\n <SmallBanner\n bgImgPath={circleBackground}\n >\n <Button\n size='lg'\n onClick={this.handleOnSubscribe}\n >\n Subscribe\n </Button>\n </SmallBanner>\n }\n </Container>\n )\n\n case 'faqs':\n if (this.hasFaqs) {\n return (\n <Container className='DatasetPage__section-content'>\n <FaqsList faqs={fieldParaFaq} />\n </Container>\n )\n } else {\n return null\n }\n\n case 'related':\n if (this.parsedRelatedDatasets.shouldDisplay) {\n return (\n <Container className='DatasetPage__section-content'>\n <DatasetRelated {...this.parsedRelatedDatasets} />\n </Container>\n )\n } else {\n return null\n }\n\n case 'contact':\n return (\n <Container className='DatasetPage__section-content'>\n <HelpDeskContact\n subjectLine={getDefaultSubjectLineForContent(getDatasetName(data))}\n header={fieldContactHeader}\n value={fieldRefContactEmail.fieldContactEmail}\n title={fieldContactDepartmentName}\n shortDescription={fieldContactShortDescription}\n />\n </Container>\n )\n\n default:\n return null\n }\n }\n\n renderNav = ({ sections, sectionRefs, currentSectionId }) => {\n return (\n <ContentPageNav\n currentSectionId={currentSectionId}\n sections={sections}\n inverseRefs={[\n sectionRefs.visualization,\n sectionRefs.related\n ]}\n />\n )\n }\n\n onVisualizationClick = () => {\n this.state.visualizationRef.current.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n\n render () {\n const { viewDataRef, datasetPageRef } = this.state\n const {\n data,\n versions,\n onDownloadClick,\n onAccessApiClick,\n onViewDataClick\n } = this.props\n\n const fieldDescription = get(data, 'fieldDescription')\n const navInfo = this.buildNavigationalHierarchy()\n\n const pageTitle = getDatasetName(data)\n const dataSourceName = get(data, 'fieldDatasetType.fieldRefDataSource.name', '')\n const subscriptionLink = get(data, 'fieldDatasetType.fieldSubscriptionService.fieldExternalSubscriptionLink.uri')\n const metaTags = formatMetaTags(get(data, 'metatagNormalized'))\n const retired = get(data, 'fieldDatasetType.fieldTermRetired')\n\n return (\n <div className='DatasetPage pageAnimation' ref={datasetPageRef} id='DatasetPage'>\n <MetaHead metaTags={metaTags}>\n <title>{`${pageTitle}${metaOrganizationName}`}</title>\n </MetaHead>\n <BackToTopBtn\n startRef={this.startRef}\n stopRef={this.stopRef}\n />\n <div className='DatasetPage__inner'>\n <DatasetHero\n id='DatasetHero'\n onSubscribe={this.handleOnSubscribe}\n lastUpdatedDate={getDatasetLastUpdatedDate(data)}\n description={fieldDescription}\n name={getDatasetName(data)}\n updateFrequency={getDatasetFrequency(data)}\n navInfo={navInfo}\n dataSource={dataSourceName}\n govDeliverySubscriptionLink={subscriptionLink}\n latestVersion={getNewestDatasetVersion(versions)}\n retired={retired}\n />\n <DataBar\n thisRef={viewDataRef}\n onDownloadClick={onDownloadClick}\n onViewDataClick={(!this.newestVersionIsStatic && this.hasDataFileInNewestVersion) ? onViewDataClick : null}\n onAccessApiClick={(!this.newestVersionIsStatic && this.hasDataFileInNewestVersion) ? onAccessApiClick : null}\n onVisualizeDataClick={hasVisualization(data) ? this.onVisualizationClick : null}\n />\n <div ref={this.startRef} />\n <ContentPageLayout\n className='DatasetPage__lower'\n sections={this.pageSections}\n renderSection={this.renderDatasetSection}\n renderNav={this.renderNav}\n />\n <div ref={this.stopRef} />\n </div>\n <Footer />\n </div>\n )\n }\n}\n\nDatasetPage.propTypes = {\n data: PropTypes.object,\n versions: PropTypes.array,\n included: PropTypes.array,\n onDownloadClick: PropTypes.func,\n onAccessApiClick: PropTypes.func,\n onViewDataClick: PropTypes.func,\n resources: PropTypes.arrayOf(PropTypes.object),\n onVersionLinkClick: PropTypes.func,\n allDatasets: PropTypes.array,\n isMobile: PropTypes.bool,\n datasetUrlPath: PropTypes.string.isRequired\n}\n\nexport { DatasetPage }\n\nexport default function DatasetPageEnhanced (props) {\n const { isMobile } = useDisplayContext()\n\n return (\n <DatasetPage\n {...props}\n isMobile={isMobile}\n />\n )\n}\n","import React, { forwardRef, PureComponent } from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport Dropdown from 'react-bootstrap/Dropdown'\nimport { getSortedDatasetVersions, excludeNonInteractiveDatasetVersions } from '../../../utilities/datasetHelpers'\nimport { ReactComponent as SortDownIcon } from '../../../assets/fontawesome/solid/sort-down.svg'\n\nimport './DatasetVersionDropdown.scss'\n\nclass DatasetVersionDropdown extends PureComponent {\n handleSelectVersion = (version, isSelected) => {\n const { onSelectVersion } = this.props\n if (isSelected) {\n return\n }\n\n onSelectVersion(version)\n }\n\n render () {\n const {\n versions,\n currentVersion\n } = this.props\n\n const sortedVersions = getSortedDatasetVersions(versions, 'desc')\n const filteredVersions = excludeNonInteractiveDatasetVersions(sortedVersions)\n\n const renderedVersionOptions = filteredVersions.map((version) => {\n const versionLabel = version?.fieldDatasetVersionCombined\n const isSelected = !!(currentVersion.id === version.id)\n\n return (\n <Dropdown.Item\n key={version.id}\n eventKey={version.id}\n active={isSelected}\n onClick={(e) => {\n e.preventDefault()\n this.handleSelectVersion(version, isSelected)\n }}\n >\n {versionLabel}\n </Dropdown.Item>\n )\n })\n\n const hasMultipleVersions = renderedVersionOptions.length > 1\n\n return (\n <Dropdown className='DatasetVersionDropdown'>\n <Dropdown.Toggle\n as={VersionDropdownToggle}\n id='interactive-dataset-version-dropdown'\n disabled={!hasMultipleVersions}\n value={currentVersion.fieldDatasetVersionCombined}\n\n />\n {hasMultipleVersions &&\n <Dropdown.Menu>\n {renderedVersionOptions}\n </Dropdown.Menu>}\n </Dropdown>\n )\n }\n}\n\nDatasetVersionDropdown.propTypes = {\n versions: PropTypes.array,\n onSelectVersion: PropTypes.func,\n currentVersion: PropTypes.object.isRequired\n}\n\nDatasetVersionDropdown.defaultProps = {\n versions: [],\n onSelectVersion: () => { }\n}\n\nconst VersionDropdownToggle = forwardRef((props, ref) => {\n const {\n onClick,\n value,\n disabled\n } = props\n const isOpen = props['aria-expanded']\n\n return (\n <div\n ref={ref}\n className={cx('VersionDropdownToggle', { open: isOpen, disabled: disabled })}\n onClick={e => {\n e.preventDefault()\n onClick(e)\n }}\n >\n <span>{value}</span>\n <span><SortDownIcon className='VersionDropdownIcon' /></span>\n </div>\n )\n})\n\nVersionDropdownToggle.propTypes = {\n onClick: PropTypes.func,\n value: PropTypes.string,\n disabled: PropTypes.bool,\n 'aria-expanded': PropTypes.bool\n}\n\nexport default DatasetVersionDropdown\n\nexport { VersionDropdownToggle }\n","import React, { useState, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport Button from 'react-bootstrap/Button'\nimport Overlay from 'react-bootstrap/Overlay'\nimport Tooltip from 'react-bootstrap/Tooltip'\n\nconst ClipboardCopyBtn = (props) => {\n const { label: defaultLabel, value, confOpts, btnOpts, onClick } = props\n const [label, setLabel] = useState(defaultLabel)\n const [isTooltipVisible, setIsTooltipVisible] = useState(false)\n const target = useRef(null)\n const timer = useRef(null)\n\n function handleOnClick () {\n navigator.clipboard.writeText(value).then(() => {\n // Clear current timer, if any.\n if (timer.current !== null) {\n clearTimeout(timer.current)\n }\n // On success.\n if (confOpts.type === 'label') {\n setLabel(confOpts.msg)\n timer.current = setTimeout(() => {\n setLabel(defaultLabel)\n }, (confOpts.duration * 1000))\n } else if (confOpts.type === 'tooltip') {\n setIsTooltipVisible(true)\n timer.current = setTimeout(() => {\n setIsTooltipVisible(false)\n }, (confOpts.duration * 1000))\n }\n })\n if (onClick !== undefined) {\n onClick()\n }\n }\n\n return (\n <>\n <Button {...btnOpts} ref={target} onClick={(e) => handleOnClick()}>\n <span className='label'>{label}</span>\n </Button>\n <Overlay\n target={target.current}\n show={isTooltipVisible}\n placement='top'\n rootCloseEvent='click'\n rootClose\n onHide={() => setIsTooltipVisible(false)}\n >\n <Tooltip id={confOpts.tooltipId}> {confOpts.msg} </Tooltip>\n </Overlay>\n </>\n )\n}\n\nClipboardCopyBtn.defaultProps = {\n label: 'Copy',\n confOpts: {\n type: 'tooltip',\n msg: 'Copied',\n duration: 5,\n tooltipId: 'ClipboardCopyBtn_tooltip'\n },\n btnOpts: {}\n}\n\nClipboardCopyBtn.propTypes = {\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n // Confirmation options.\n confOpts: PropTypes.shape({\n type: PropTypes.oneOf(['tooltip', 'label']).isRequired,\n msg: PropTypes.string.isRequired,\n // How long in seconds the confirmation message should be displayed.\n duration: PropTypes.number,\n tooltipId: PropTypes.string\n }),\n // Refer to Bootstrap Button options\n btnOpts: PropTypes.object,\n onClick: PropTypes.func\n}\n\nexport default ClipboardCopyBtn\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Container from 'react-bootstrap/Container'\nimport { LoadingSpinner } from '../../common/LoadingCover/LoadingCover'\nimport { FEATURED_RESOURCE_TYPES, DatasetResources } from '../DatasetResources/DatasetResources'\n\nfunction InteractiveDataResources ({ resources = [], isLoading, error }) {\n // Using a function since resources may be undefined the first few times we enter.\n function hasDisplayableResources () {\n const featuredResourceTypes = Object.values(FEATURED_RESOURCE_TYPES)\n const featuredResources = resources\n .filter(resource => featuredResourceTypes.includes(resource.type))\n return featuredResources.some((resource) => {\n return resource.showOnResourcesSection\n })\n }\n\n // If there are no displayable resources, do not create a resources section.\n return (!isLoading && !error && !hasDisplayableResources()) ? null\n : (\n <div className='DatasetInteractivePage__resources'>\n <Container>\n {isLoading && (\n <LoadingSpinner />\n )}\n {error && (\n <h3 style={{ textAlign: 'center' }}>Sorry, there was an error loading the related resources</h3>\n )}\n {hasDisplayableResources && (\n <DatasetResources\n featuredTitle='Resources'\n resources={resources}\n showAdditionalResources={false}\n />\n )}\n </Container>\n </div>\n )\n}\n\nInteractiveDataResources.propTypes = {\n isLoading: PropTypes.bool,\n resources: PropTypes.arrayOf(PropTypes.object),\n error: PropTypes.any\n}\n\nexport default InteractiveDataResources\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport pick from 'lodash/pick'\n\nconst shallowCompare = (obj1, obj2) =>\n Object.keys(obj1).length === Object.keys(obj2).length &&\n Object.keys(obj1).every(key =>\n obj2.hasOwnProperty(key) && obj1[key] === obj2[key]\n )\n\nconst automaticReloadProps = [\n 'limit',\n 'offset',\n 'sort',\n 'filters',\n 'keywords',\n 'datasetVersionId'\n]\n\nfunction automaticReloadTriggered (previousProps, nextProps) {\n const prev = pick(previousProps, automaticReloadProps)\n const next = pick(nextProps, automaticReloadProps)\n // trigger reload if any of the automaticReloadProps have changed\n return !shallowCompare(next, prev)\n}\n\nfunction checkForStatsUpdateTrigger (previousProps, nextProps) {\n const prev = pick(previousProps, ['filters', 'keywords', 'datasetVersionId'])\n const next = pick(nextProps, ['filters', 'keywords', 'datasetVersionId'])\n return !shallowCompare(next, prev)\n}\n\nclass DataReloadTrigger extends React.PureComponent {\n componentDidMount () {\n const { onReloadTriggered } = this.props\n\n onReloadTriggered({\n shouldRequestStats: true,\n isInitialLoad: true\n })\n }\n\n componentDidUpdate (previousProps) {\n const { onReloadTriggered } = this.props\n\n // keeping if/else format for debugging while this is being developed\n if (automaticReloadTriggered(previousProps, this.props)) {\n onReloadTriggered({\n shouldRequestStats: checkForStatsUpdateTrigger(previousProps, this.props),\n isInitialLoad: previousProps.datasetVersionId !== this.props.datasetVersionId\n })\n }\n }\n\n render () {\n return null\n }\n}\n\nDataReloadTrigger.propTypes = {\n // eslint-disable-next-line react/no-unused-prop-types\n limit: PropTypes.number,\n // eslint-disable-next-line react/no-unused-prop-types\n offset: PropTypes.number,\n // eslint-disable-next-line react/no-unused-prop-types\n sort: PropTypes.any,\n // eslint-disable-next-line react/no-unused-prop-types\n filters: PropTypes.any,\n // eslint-disable-next-line react/no-unused-prop-types\n keywords: PropTypes.string,\n // eslint-disable-next-line react/no-unused-prop-types\n visibleColumns: PropTypes.any,\n // eslint-disable-next-line react/no-unused-prop-types\n datasetVersionId: PropTypes.string,\n onReloadTriggered: PropTypes.func\n}\n\nexport default DataReloadTrigger\n","var _path;\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nfunction SvgMagnifyingGlass(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 512 512\",\n fill: \"currentColor\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z\"\n })));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgMagnifyingGlass);\nexport default __webpack_public_path__ + \"static/media/magnifying-glass.73cf8e93ea281d5022aa79bd529cdff3.svg\";\nexport { ForwardRef as ReactComponent };","var _path;\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nfunction SvgSort(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 320 512\",\n fill: \"currentColor\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l128 128c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H32c-12.9 0-24.6-7.8-29.6-19.8s-2.2-25.7 6.9-34.9l128-128zm0 429.3l-128-128c-9.2-9.2-11.9-22.9-6.9-34.9s16.6-19.8 29.6-19.8H288c12.9 0 24.6 7.8 29.6 19.8s2.2 25.7-6.9 34.9l-128 128c-12.5 12.5-32.8 12.5-45.3 0z\"\n })));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgSort);\nexport default __webpack_public_path__ + \"static/media/sort.4093064ed84941a6652c1127c450df9a.svg\";\nexport { ForwardRef as ReactComponent };","import React, { useState, useMemo } from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport every from 'lodash/every'\nimport some from 'lodash/some'\nimport isEmpty from 'lodash/isEmpty'\nimport cloneDeep from 'lodash/cloneDeep'\nimport isEqual from 'lodash/isEqual'\nimport Button from 'react-bootstrap/Button'\nimport Modal from 'react-bootstrap/Modal'\nimport Checkbox from '../../common/Checkbox/Checkbox'\nimport { ReactComponent as SortIcon } from '../../../assets/fontawesome/solid/sort.svg'\nimport { ReactComponent as MagnifyingGlassIcon } from '../../../assets/fontawesome/solid/magnifying-glass.svg'\nimport { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd'\nimport ModalCloseButton from '../../common/ModalCloseButton/ModalCloseButton'\n\nimport './ColumnConfigurator.scss'\n\n/**\n *\n * @param {any[]} array - array that the move is being operated on\n * @param {number} sourceIndex - array index of item being moved\n * @param {number} destinationIndex - array index of where the item will be moved to\n * @returns {array} updated/re-ordered copy of the array\n */\nexport function moveItemInArray (array, sourceIndex, destinationIndex) {\n const updated = [...array]\n // remove the source item (ie, the item being dragged) while saving reference to it\n const removed = updated.splice(sourceIndex, 1)[0]\n // splice it into the destination slot\n updated.splice(destinationIndex, 0, removed)\n return updated\n}\n\nconst ColumnConfigurator = (props) => {\n const {\n originalColumns,\n initialColumns: _initialColumns,\n onApply,\n schemaLookUp\n } = props\n // clone the initial columns so that we don't directly mutate the props\n const initialColumns = useMemo(() => {\n return cloneDeep(_initialColumns)\n }, [_initialColumns])\n\n const [columns, setColumns] = useState(initialColumns)\n const [searchInputValue, setSearchInputValue] = useState('')\n const filteredColumns = useMemo(() => {\n if (isEmpty(searchInputValue)) {\n return columns\n }\n\n const formattedInputValue = searchInputValue.trim().toLowerCase()\n\n return columns.filter(column => {\n const formattedColumnValue = column.Header.trim().toLowerCase()\n return formattedColumnValue.indexOf(formattedInputValue) > -1\n })\n }, [columns, searchInputValue])\n\n // for 'Select All' checkbox; based on filtered columns\n const isAllSelected = useMemo(() => {\n return every(filteredColumns, column => column.isVisible)\n }, [filteredColumns])\n\n // for 'Select All' checkbox; based on filtered columns\n const isSomeSelected = useMemo(() => {\n // based on filtered columns\n return some(filteredColumns, column => column.isVisible)\n }, [filteredColumns])\n\n // for Apply button disabled state; based on overall visible columns\n const isNoneSelected = useMemo(() => {\n const visibleColumns = columns.filter(column => column.isVisible)\n return visibleColumns.length === 0\n }, [columns])\n\n const resetColumns = originalColumns.map(col => {\n return {\n ...col,\n isVisible: true\n }\n })\n\n const hasChanged = () => {\n const originalColumns = resetColumns.map(column => ({ id: column.id, isVisible: column.isVisible }))\n const updatedColumns = columns.map(column => ({ id: column.id, isVisible: column.isVisible }))\n return !isEqual(originalColumns, updatedColumns)\n }\n\n function handleDragEnd (result) {\n const { source, destination } = result\n const sourceIndex = source.index\n const destinationIndex = destination.index\n const updatedColumns = moveItemInArray(columns, sourceIndex, destinationIndex)\n setColumns(updatedColumns)\n }\n\n function handleSearchInputChange (e) {\n setSearchInputValue(e.target.value)\n }\n\n function handleToggleSelectAll () {\n const filteredColumnIds = filteredColumns.map(column => column.id)\n // assuming allSelected toggle should only apply to filtered columns; will confirm\n const updatedColumns = columns.map(column => {\n const isFilteredColumn = filteredColumnIds.includes(column.id)\n return isFilteredColumn\n ? { ...column, isVisible: !isAllSelected }\n : column\n })\n\n setColumns(updatedColumns)\n }\n\n function handleColumnVisibleToggle (e) {\n const idToUpdate = e.target.dataset.id\n\n const updatedColumns = columns.map(column => {\n return column.id === idToUpdate\n ? { ...column, isVisible: e.target.checked }\n : column\n })\n\n setColumns(updatedColumns)\n }\n\n function handleApplyClick () {\n onApply(columns)\n }\n\n function handleResetClick () {\n setColumns(resetColumns)\n }\n\n function renderSearch () {\n return (\n <div className='ColumnConfigurator__searchBox'>\n <input\n className='ColumnConfigurator__searchInput'\n placeholder='Search Columns'\n value={searchInputValue}\n onChange={e => handleSearchInputChange(e)}\n />\n <button aria-label='Search columns' className='ColumnConfigurator__searchIcon'>\n <MagnifyingGlassIcon />\n </button>\n </div>\n )\n }\n\n function renderSelectAll () {\n const isIndeterminate = !!(\n isAllSelected === false &&\n isSomeSelected === true\n )\n\n return (\n <div className='ColumnConfigurator__selectAll'>\n <Checkbox\n containerClassName='ColumnConfigurator__selectAllInput'\n type='checkbox'\n id='ColumnConfigurator__selectAll'\n checked={isAllSelected}\n // not used yet\n indeterminate={isIndeterminate.toString()}\n onChange={e => handleToggleSelectAll(e)}\n />\n <label htmlFor='ColumnConfigurator__selectAll'>Select All</label>\n </div>\n )\n }\n\n function renderColumns () {\n return filteredColumns.map((column, index) => {\n return (\n <Draggable\n draggableId={column.id}\n index={index}\n key={column.id}\n >\n {(provided, snapshot) => {\n return (\n <div\n className={cx('ColumnConfigurator__column', { isDragging: snapshot.isDragging })}\n ref={provided.innerRef} style={provided?.draggableProps?.style}\n onTransitionEnd={provided?.draggableProps?.onTransitionEnd}\n data-rbd-draggable-context-id={provided?.draggableProps['data-rbd-draggable-context-id']}\n data-rbd-draggable-id={provided?.draggableProps['data-rbd-draggable-id']}\n tabIndex={provided?.dragHandleProps?.tabIndex} role={provided?.dragHandleProps?.role}\n aria-describedby={provided?.dragHandleProps['aria-describedby']}\n data-rbd-drag-handle-draggable-id={provided?.dragHandleProps['data-rbd-drag-handle-draggable-id']}\n data-rbd-drag-handle-context-id={provided?.dragHandleProps['data-rbd-drag-handle-context-id']}\n draggable={provided?.dragHandleProps?.draggable}\n >\n <Checkbox\n containerClassName='input cell'\n type='checkbox'\n id={column.id}\n data-id={column.id}\n checked={column.isVisible}\n onChange={e => handleColumnVisibleToggle(e)}\n />\n <label className='text cell'>{schemaLookUp && schemaLookUp[column.Header]?.title ? schemaLookUp[column.Header].title : column.Header}</label>\n <span className='icon cell'><SortIcon /></span>\n </div>\n )\n }}\n </Draggable>\n )\n })\n }\n\n return (\n <DragDropContext onDragEnd={e => handleDragEnd(e)}>\n <div className='ColumnConfigurator'>\n {/* Header */}\n <div className='ColumnConfigurator__header'>\n <h4>Manage Columns</h4>\n </div>\n {/* Search */}\n {renderSearch()}\n {/* Select All toggle */}\n {renderSelectAll()}\n {/* column visibility/re-ordering area */}\n <Droppable droppableId='columns'>\n {(provided, snapshot) => {\n return (\n <div\n className={cx('ColumnConfigurator__columns', { draggingOver: snapshot.isDraggingOver })}\n ref={provided.innerRef}\n {...provided.droppableProps}\n >\n {/* placeholder required to create space when draggable is picked up; UX seems better without it */}\n <div style={{ display: 'none' }}>{provided.placeholder}</div>\n {/* columns */}\n {renderColumns()}\n </div>\n )\n }}\n </Droppable>\n {/* Footer */}\n <div className='ColumnConfigurator__footer'>\n {hasChanged() &&\n <Button\n className='reset-btn'\n variant='default'\n onClick={e => handleResetClick(e)}\n >\n Reset\n </Button>}\n <Button\n className='apply-btn'\n variant='primary'\n disabled={isNoneSelected}\n onClick={e => handleApplyClick(e)}\n >\n Apply\n </Button>\n </div>\n </div>\n </DragDropContext>\n )\n}\n\nColumnConfigurator.propTypes = {\n initialColumns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n Header: PropTypes.string,\n isVisible: PropTypes.bool\n })),\n originalColumns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string,\n Header: PropTypes.string\n })),\n onApply: PropTypes.func,\n schemaLookUp: PropTypes.object\n}\n\nexport const ColumnConfiguratorModal = (props) => {\n const {\n isOpen,\n onRequestClose,\n ...configuratorProps\n } = props\n\n return (\n <Modal\n className='ColumnConfiguratorModal'\n size='lg'\n show={isOpen}\n onHide={onRequestClose}\n >\n <Modal.Body>\n <div className='ColumnConfiguratorModal__close-btn'>\n <ModalCloseButton onClick={onRequestClose} />\n </div>\n <ColumnConfigurator\n {...configuratorProps}\n />\n </Modal.Body>\n </Modal>\n )\n}\n\nColumnConfiguratorModal.propTypes = {\n isOpen: PropTypes.bool,\n onRequestClose: PropTypes.func,\n ...ColumnConfigurator.propTypes\n}\n\nexport default ColumnConfigurator\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport Alert from 'react-bootstrap/Alert'\nimport ModalCloseButton from '../../common/ModalCloseButton/ModalCloseButton'\nimport Text from '../../common/Text/Text'\nimport { ReactComponent as DownToLineIcon } from '../../../assets/fontawesome/solid/down-to-line.svg'\nimport Button from 'react-bootstrap/Button'\nimport Modal from 'react-bootstrap/Modal'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport { formatBytes, getTrimmedDownIdsExportUrls } from '../../common/DownloadModal/downloadModalHelpers'\nimport { trackExportInteractiveData } from '../../../utilities/analyticsEventHelpers'\n\nimport './DataExportModal.scss'\n\nconst DataExportModal = ({ name, showModal, onToggleClick, onExportClick, exportUrls, csvFileSize, maxURLParamsLength }) => {\n const [isCsvSelected, setIsCsvSelected] = useState(true)\n const { isMobileDevice } = useDisplayContext()\n const trimmedDownExportUrls = getTrimmedDownIdsExportUrls(exportUrls, maxURLParamsLength)\n\n const renderDataExport = () => {\n return (\n <>\n <Modal.Body className='DataExportModal__modal-body'>\n {\n !trimmedDownExportUrls.message ? (\n <Text typeFace='Body/16pt/Black/L'>\n Export includes your data modifications.\n </Text>\n ) : (\n <Alert variant='danger'><small>{trimmedDownExportUrls.message}</small></Alert>\n )\n }\n <Text typeFace='06 H6/Black' role='label'>\n File type\n </Text>\n <div className='ExportModal__file-selection' role='listbox'>\n <div className={isCsvSelected ? 'selected' : 'unselected'} onClick={() => setIsCsvSelected(true)} role='option' aria-selected={isCsvSelected}>\n <Text typeFace='03 H3/Black/L'>CSV</Text>\n </div>\n <p>OR</p>\n <div className={isCsvSelected ? 'unselected' : 'selected'} onClick={() => setIsCsvSelected(false)} role='option' aria-selected={!isCsvSelected}>\n <Text typeFace='03 H3/Black/L'>CSV for Excel</Text>\n </div>\n </div>\n </Modal.Body>\n <Modal.Footer className='DataExportModal__modal-footer'>\n <Text typeFace='Body/16pt/Black/L'>\n For better experience, use Google Chrome or Mozilla Firefox. Use of a database or statistical software may be required for large files.\n </Text>\n <Button\n className='export_btn'\n onClick={e => {\n onExportClick(e, isCsvSelected ? trimmedDownExportUrls.csv : trimmedDownExportUrls.csvExcel)\n trackExportInteractiveData(isCsvSelected ? 'click-csv' : 'click-excel', isCsvSelected ? trimmedDownExportUrls.csv : trimmedDownExportUrls.csvExcel, window.utag)\n }}\n >\n <DownToLineIcon />\n <span className='export_btn_text'>Export</span>\n </Button>\n <Text typeFace='Body/16pt/Black/L'>{`Original file size: ${formatBytes(csvFileSize)}`}</Text>\n </Modal.Footer>\n </>\n )\n }\n\n const renderMobileWarning = () => {\n return (\n <>\n <Modal.Body className='DataExportModal__modal-body'>\n <Text typeFace='Body/18pt/Black/L'>\n You are not able to download this dataset on a mobile device. Download this file on a desktop machine to view more information.\n </Text>\n </Modal.Body>\n <Modal.Footer className='DataExportModal__modal-footer'>\n <Button variant='primary' onClick={() => onToggleClick(false)}>\n <span>Close</span>\n </Button>\n </Modal.Footer>\n </>\n )\n }\n\n return (\n <Modal\n className='DataExportModal'\n size={isMobileDevice ? 'sm' : 'lg'}\n show={showModal}\n onHide={() => onToggleClick(false)}\n centered\n >\n <Modal.Header className='DataExportModal__modal-header'>\n <Modal.Title>\n <Text typeFace='02 H2/Black/L'>Export {name}</Text>\n </Modal.Title>\n <ModalCloseButton onClick={() => onToggleClick(false)} />\n </Modal.Header>\n {isMobileDevice ? renderMobileWarning() : renderDataExport()}\n </Modal>\n )\n}\n\nexport default DataExportModal\n\nDataExportModal.propTypes = {\n name: PropTypes.string,\n showModal: PropTypes.bool,\n onToggleClick: PropTypes.func,\n onExportClick: PropTypes.func,\n exportUrls: PropTypes.shape({\n csv: PropTypes.string,\n csvExcel: PropTypes.string\n }),\n csvFileSize: PropTypes.number,\n maxURLParamsLength: PropTypes.number\n}\n","import React, { useState, useMemo, useEffect } from 'react'\nimport cx from 'classnames'\nimport PropTypes from 'prop-types'\nimport Button from 'react-bootstrap/Button'\nimport Container from 'react-bootstrap/Container'\nimport FormLabel from 'react-bootstrap/FormLabel'\nimport FormControl from 'react-bootstrap/FormControl'\nimport { ReactComponent as MagnifyingGlassIcon } from '../../../assets/fontawesome/solid/magnifying-glass.svg'\nimport { ReactComponent as FilterIcon } from '../../../assets/fontawesome/solid/bars-filter.svg'\nimport { ReactComponent as DownToLineIcon } from '../../../assets/fontawesome/solid/down-to-line.svg'\nimport { ReactComponent as ListIcon } from '../../../assets/fontawesome/solid/list.svg'\nimport { ColumnConfiguratorModal } from './ColumnConfigurator'\nimport DataExportModal from './DataExportModal'\nimport { getInteractiveDataApiPath, logDatasetDownload } from '../../../services/api'\nimport { buildInteractiveDataQueryString } from '../../../utilities/datasetHelpers'\nimport config from '../../../config'\nimport { trackDownloadExportClick, trackInteractiveDataClick, trackInteractiveDataSearch } from '../../../utilities/analyticsEventHelpers'\nimport './DataTableToolbar.scss'\n\nconst { apiSite } = config\nfunction generateExportUrl (datasetVersionId, options) {\n const datasetUrl = `${apiSite}${getInteractiveDataApiPath(datasetVersionId)}`\n const queryString = buildInteractiveDataQueryString(options)\n const url = `${datasetUrl}${queryString}`\n return url\n}\n\nconst DataTableToolbar = (props) => {\n const {\n datasetName,\n datasetTypeUuid,\n datasetVersionId,\n setColumnOrder,\n setHiddenColumns,\n columns,\n headers,\n filters,\n sort,\n visibleColumns,\n onColumnConfigChange,\n keywords,\n onRequestSearch,\n isFilterOpen,\n onFilterClick,\n setFilterButtonRef,\n isFullScreen,\n children,\n csvFileSize,\n maxURLParamsLength,\n onUserInputChange,\n schemaLookUp\n } = props\n const filtersList = filters.list || []\n // set the initial inputKeywords to props.keywords\n const [inputKeywords, setInputKeywords] = useState(keywords)\n const [isInvalid, setInvalid] = useState(false)\n const [isDataExportModalOpen, setDataExportModalOpen] = useState(false)\n const [isConfiguratorModalOpen, setConfiguratorModalOpen] = useState(false)\n\n /**\n Although we are using a key to reset this component when the dataset version\n changes, we need this useEffect to clear any old search keywords.\n In line 53 of this file we are using props.keywords as our initial\n keywords state. The useEffect action in the DatasetInteractivePage sets\n state after datasetVersionId changes, so the reset keyword prop is coming\n in on the next cycle and not being taken up by this component.\n */\n useEffect(() => {\n setInputKeywords(keywords)\n }, [keywords])\n\n function handleApplyColumnConfig (updatedColumns) {\n const updatedColumnOrderIds = updatedColumns.map(column => column.id)\n const updatedHiddenColumnIds = updatedColumns.filter(column => !column.isVisible).map(column => column.id)\n setColumnOrder(updatedColumnOrderIds)\n setHiddenColumns(updatedHiddenColumnIds)\n setConfiguratorModalOpen(false)\n // Pass only the visible columns.\n onColumnConfigChange(updatedColumnOrderIds.filter(item => !updatedHiddenColumnIds.includes(item)))\n }\n\n function handleOpenConfiguratorModal () {\n setConfiguratorModalOpen(true)\n }\n\n function handleCloseConfiguratorModal () {\n setConfiguratorModalOpen(false)\n }\n\n function handleInputChange (e) {\n setInvalid(false)\n const keyword = e.target.value\n setInputKeywords(keyword)\n onUserInputChange(keyword)\n const regex = /^[a-z\\d\\s]+$/i\n if (keyword.trim().length && !keyword.match(regex)) {\n setInvalid(true)\n }\n }\n\n function handleSearch () {\n onRequestSearch(inputKeywords)\n trackInteractiveDataSearch('keyword-searched', inputKeywords, window.utag)\n }\n\n function handleInputKeyPress (e) {\n if (e.key === 'Enter') {\n handleSearch()\n }\n }\n\n const areFiltersActive = useMemo(() => {\n return !!(filtersList.length)\n }, [filtersList])\n\n const activeFilterCount = useMemo(() => (\n filtersList.reduce((prev, curr) => {\n return prev + curr.conditions.length\n }, 0)\n ), [filtersList])\n\n // the columns prop is order-agnostic\n const originalColumnIdsSting = columns.map(column => column.id).toString()\n const visibleColumnIds = visibleColumns.map(column => column.id)\n\n // the headers prop reflects the modified column order\n const userModifiedColumnIdsString = headers.reduce((cols, column) => {\n if (visibleColumnIds.includes(column.id)) {\n cols.push(column.id)\n }\n return cols\n }, []).toString()\n\n const isColumnsDisplayAltered = originalColumnIdsSting !== userModifiedColumnIdsString\n\n const isModifiedExportAvailable = !!(\n !!(activeFilterCount) ||\n !!(keywords.length) ||\n isColumnsDisplayAltered ||\n (sort.sortBy && sort.sortOrder)\n )\n\n // only include columns in export url if they are altered\n const columnsParamValue = isColumnsDisplayAltered\n ? headers.filter(column => column.isVisible).map(column => column.Header)\n : []\n\n // only include filter/sort etc. params if necessary\n const exportUrlParams = isModifiedExportAvailable\n ? { filters, sort, keywords, columns: columnsParamValue }\n : {}\n\n const exportUrls = {\n csv: generateExportUrl(datasetVersionId, { ...exportUrlParams, format: 'csv' }),\n csvExcel: generateExportUrl(datasetVersionId, { ...exportUrlParams, format: 'csv_for_excel' })\n }\n\n const filterCountLabel = areFiltersActive ? `(${activeFilterCount})` : ''\n\n function handleExportClick (e, downloadUrl) {\n e.preventDefault()\n logDatasetDownload(datasetTypeUuid)\n trackDownloadExportClick(e.target.innerText, datasetName, window.utag)\n window.open(downloadUrl, '_self')\n }\n const invalidMessage = 'Special characters are not supported in this search field. To search with special characters, click on \"Filter.\"'\n return (\n <Container fluid={isFullScreen}>\n <div className='DataTableToolbar'>\n <div className='DataTableToolbar__container'>\n <div className='DataTableToolbar__tool search'>\n <FormLabel visuallyHidden>Search</FormLabel>\n <FormControl\n className={`search_input ${isInvalid ? ' invalid' : ''}`}\n type='text'\n placeholder='Search'\n value={inputKeywords}\n onChange={e => handleInputChange(e)}\n onKeyPress={e => handleInputKeyPress(e)}\n />\n <MagnifyingGlassIcon onClick={e => handleSearch(e)} className='search_icon' />\n </div>\n {isInvalid && <div className='invalid_message'>{invalidMessage}</div>}\n </div>\n\n <Button\n variant='default'\n className={cx(\n 'DataTableToolbar__tool',\n 'btn-inverse',\n 'columns_btn',\n { isActive: isColumnsDisplayAltered }\n )}\n onClick={e => { handleOpenConfiguratorModal(e); trackInteractiveDataClick('columns-cta', window.utag) }}\n >\n <ListIcon className='ListIcon' />\n <span>Manage Columns</span>\n </Button>\n <Button\n className={cx(\n 'DataTableToolbar__tool',\n 'btn-inverse',\n { isActive: isFilterOpen || areFiltersActive }\n )}\n variant='outline-primary'\n onClick={() => { onFilterClick(); trackInteractiveDataClick('filter-clicked', window.utag) }}\n ref={setFilterButtonRef}\n >\n <FilterIcon className='FilterIcon' />\n <span>{`Filter ${filterCountLabel}`}</span>\n </Button>\n {/* on mobile the filters form component interjects itself here */}\n {\n children\n }\n <div className={cx('DataTableToolbar__tool', 'export')}>\n <Button className='open_export_btn' onClick={() => { setDataExportModalOpen(true); trackInteractiveDataClick('export-clicked', window.utag) }}>\n <DownToLineIcon className='DownToLineIcon' />\n <span className='export_btn_text'>Export</span>\n </Button>\n\n <DataExportModal\n name={datasetName}\n showModal={isDataExportModalOpen}\n onToggleClick={setDataExportModalOpen}\n onExportClick={(e, downloadUrl) => handleExportClick(e, downloadUrl)}\n exportUrls={exportUrls}\n csvFileSize={csvFileSize}\n maxURLParamsLength={maxURLParamsLength}\n />\n </div>\n\n <ColumnConfiguratorModal\n schemaLookUp={schemaLookUp}\n isOpen={isConfiguratorModalOpen}\n onRequestClose={e => handleCloseConfiguratorModal(e)}\n initialColumns={headers}\n originalColumns={columns}\n onApply={e => { handleApplyColumnConfig(e); trackInteractiveDataClick('columns-applied', window.utag, e.filter(el => el.isVisible).map(el => el.Header).reduce((a, b) => a + ', ' + b)) }}\n />\n </div>\n </Container>\n )\n}\n\nDataTableToolbar.propTypes = {\n datasetName: PropTypes.string,\n datasetTypeUuid: PropTypes.string,\n datasetVersionId: PropTypes.string,\n keywords: PropTypes.string,\n sort: PropTypes.shape({\n sortBy: PropTypes.string,\n sortOrder: PropTypes.string\n }),\n onRequestSearch: PropTypes.func,\n setColumnOrder: PropTypes.func,\n setHiddenColumns: PropTypes.func,\n isFilterOpen: PropTypes.bool.isRequired,\n onFilterClick: PropTypes.func.isRequired,\n setFilterButtonRef: PropTypes.func.isRequired,\n // order-agnostic (i.e., original order) list of columns\n columns: PropTypes.arrayOf(PropTypes.shape({\n Header: PropTypes.string,\n id: PropTypes.string\n })),\n // this is same as columns, but ordered\n headers: PropTypes.arrayOf(PropTypes.shape({\n Header: PropTypes.string,\n id: PropTypes.string\n })),\n visibleColumns: PropTypes.arrayOf(PropTypes.object),\n onColumnConfigChange: PropTypes.func,\n isFullScreen: PropTypes.bool,\n filters: PropTypes.shape({\n rootConjunction: PropTypes.object,\n list: PropTypes.array\n }),\n // on mobile the FilterForm component is a child here\n children: PropTypes.oneOfType([\n PropTypes.element,\n PropTypes.bool\n ]),\n csvFileSize: PropTypes.number,\n maxURLParamsLength: PropTypes.number,\n onUserInputChange: PropTypes.func,\n schemaLookUp: PropTypes.object\n}\n\nexport default DataTableToolbar\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport CreatableSelect from 'react-select/creatable'\n\nconst components = {\n DropdownIndicator: null\n}\n\nconst createOption = (label) => ({\n label,\n value: label\n})\n\nexport default class MultiValueTextInput extends React.Component {\n constructor (props) {\n super(props)\n this.state = {\n inputValue: '',\n value: this.props.defaultValue.map(item => createOption(item)),\n showMenu: false\n }\n this.handleChange = this.handleChange.bind(this)\n this.handleInputChange = this.handleInputChange.bind(this)\n this.handleKeyDown = this.handleKeyDown.bind(this)\n }\n\n getStyles = () => {\n return {\n menuPortal: (provided) => ({ ...provided, zIndex: 99999 }),\n menu: (provided) => {\n return {\n ...provided,\n zIndex: 99999,\n marginTop: '0',\n marginBottom: '0',\n // Dynamically show or hide the dropdown menu using CSS.\n display: this.state.showMenu ? 'block' : 'none'\n }\n },\n placeholder: (provided) => {\n return {\n ...provided,\n lineHeight: 'initial'\n }\n }\n }\n }\n\n handleChange = (value, actionMeta) => {\n this.setState({ value }, () => {\n const safeValue = this.state.value || []\n this.props.onChange([...safeValue.map(item => item.value)])\n })\n }\n\n handleInputChange = (inputValue) => {\n this.setState({\n inputValue,\n showMenu: true\n })\n }\n\n handleKeyDown = (event) => {\n const { inputValue, value } = this.state\n\n if (!inputValue) {\n if (this.props?.handleTextboxCustomKeydown) {\n this.props?.handleTextboxCustomKeydown(event)\n }\n return\n }\n\n switch (event.key) {\n case 'Enter':\n case 'Tab':\n this.setState({\n inputValue: '',\n value: [...(value || []), createOption(inputValue)],\n showMenu: false\n }, () => {\n this.props.onChange([...this.state.value.map(item => item.value)])\n })\n event.preventDefault()\n break\n default:\n // Do nothing.\n }\n }\n\n render () {\n const { inputValue, value } = this.state\n\n return (\n <CreatableSelect\n inputValue={inputValue}\n onChange={this.handleChange}\n onInputChange={this.handleInputChange}\n onKeyDown={this.handleKeyDown}\n placeholder='Add and hit enter for each value'\n value={value}\n formatCreateLabel={(val) => 'Add item: ' + val}\n isMulti\n components={components}\n isClearable={false}\n classNamePrefix={this.props.classNamePrefix}\n styles={this.getStyles()}\n menuPlacement={this.props.menuPlacement}\n menuPortalTarget={this.props.menuPortalTarget}\n />\n )\n }\n}\n\nMultiValueTextInput.propTypes = {\n defaultValue: PropTypes.arrayOf(PropTypes.string),\n onChange: PropTypes.func.isRequired,\n classNamePrefix: PropTypes.string,\n menuPlacement: PropTypes.string,\n menuPortalTarget: PropTypes.object,\n handleTextboxCustomKeydown: PropTypes.func\n}\n\nMultiValueTextInput.defaultProps = {\n defaultValue: []\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport FormGroup from 'react-bootstrap/FormGroup'\nimport FormLabel from 'react-bootstrap/FormLabel'\nimport Select from 'react-select'\nimport { ReactComponent as SortDownIcon } from '../../../assets/fontawesome/solid/sort-down.svg'\nimport config from '../../../config'\n\nimport './FilterFormConjunctionDropdown.scss'\n\nconst DropdownIndicator = () => {\n return (\n <span className='FilterForm__conjunction__indicator-wrapper'>\n <SortDownIcon />\n </span>\n )\n}\n\nconst commonSelectProps = {\n classNamePrefix: 'FilterForm__conjunction',\n components: { DropdownIndicator },\n isMulti: false\n}\n\nconst {\n filterFormConjunctions: conjunctions,\n filterFormPlaceholders: placeholders\n} = config\n\nfunction FilterFormConjunctionDropdown (props) {\n const { isDisabled, onChange, value } = props\n\n return (\n <FormGroup>\n <FormLabel visuallyHidden>{placeholders.conjunction}</FormLabel>\n <Select\n {...commonSelectProps}\n className='FilterForm__conjunction'\n value={value}\n placeholder=''\n options={conjunctions}\n onChange={onChange}\n isDisabled={isDisabled}\n />\n </FormGroup>\n )\n}\n\nFilterFormConjunctionDropdown.propTypes = {\n isDisabled: PropTypes.bool.isRequired,\n onChange: PropTypes.func.isRequired,\n value: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n })\n}\n\nexport default FilterFormConjunctionDropdown\n","import React, { useCallback, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport Button from 'react-bootstrap/Button'\nimport FormGroup from 'react-bootstrap/FormGroup'\nimport FormLabel from 'react-bootstrap/FormLabel'\nimport FormControl from 'react-bootstrap/FormControl'\nimport Select from 'react-select'\nimport MultiValueTextInput from '../../common/MultiValueTextInput/MultiValueTextInput'\nimport CloseIcon from '../../icons/CloseIcon'\nimport { ReactComponent as SortDownIcon } from '../../../assets/fontawesome/solid/sort-down.svg'\nimport FilterFormConjunctionDropdown from './FilterFormConjunctionDropdown'\nimport isEmpty from 'lodash/isEmpty'\nimport get from 'lodash/get'\nimport cx from 'classnames'\nimport config from '../../../config'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport DatePicker from 'react-datepicker'\n\nimport './FilterRow.scss'\nimport '../../../scss/common.scss'\nimport 'react-datepicker/dist/react-datepicker.css'\n\nconst DropdownIndicator = () => {\n return (\n <span className='FilterRow__indicator-wrapper'>\n <SortDownIcon />\n </span>\n )\n}\n\nconst commonSelectProps = {\n classNamePrefix: 'FilterRow__select',\n components: { DropdownIndicator },\n isMulti: false,\n // for proper display within modal, we need to have the menus rendered into the body\n // and allow the menus to flip up if need be to prevent body overflow\n menuPortalTarget: document.body,\n styles: {\n menuPortal: (provided) => ({ ...provided, zIndex: 99999 }),\n menu: (provided) => ({\n ...provided,\n zIndex: 99999,\n marginTop: '0px',\n marginBottom: '0px'\n }),\n option: (provided, state) => ({\n ...provided,\n minWidth: '100%',\n width: 'max-content'\n })\n },\n menuPlacement: 'auto'\n}\n\nconst {\n filterFormComparators: comparatorsOrig,\n filterFormInputsDisabledByComparator: inputsDisabledByComparator,\n filterFormPlaceholders: placeholders,\n filterFormInputsMultiValue: multivalueComparators,\n filterFormInputRangeValue: rangeValueComparators\n} = config\n\nconst comparators = comparatorsOrig\n\nfunction FilterRow (props) {\n const {\n columnSelectList,\n conjunction,\n data,\n hasMultipleFilters,\n isGroup,\n onChange,\n onClearFilterClick,\n onInnerConjunctionChange,\n rowIndex,\n handleTextboxCustomKeydown\n } = props\n\n const {\n key,\n column,\n comparator,\n filterValue\n } = data\n\n const { isMobile } = useDisplayContext()\n const isRemoveVisible = (column || comparator || filterValue) || hasMultipleFilters\n\n const memoizedClearFilterClick = useCallback(() => {\n onClearFilterClick(key)\n }, [onClearFilterClick, key])\n\n const [startDate, setStartDate] = useState()\n const [endDate, setEndDate] = useState()\n const noTextInputRequired = inputsDisabledByComparator.includes(get(comparator, 'value'))\n const isTextInputDisabled = noTextInputRequired || isEmpty(comparator)\n const isBasicMobileDividerShowing = isMobile && hasMultipleFilters && !isGroup\n const isMultiValueField = multivalueComparators?.includes(comparator?.value)\n const isRangeValueField = rangeValueComparators?.includes(comparator?.value)\n\n /**\n * Curried change handler which intercepts all child onChange\n * events and creates uniform data structure to send to parents\n * @param {String} name of the field to update\n * @returns {function (change)} a function which accepts the change value to apply to name\n */\n const localChangeHandler = name => change => {\n const current = {\n key,\n column,\n comparator,\n filterValue\n }\n\n let changeValue = change\n if (name?.includes('filterRangeValue')) {\n if (current?.filterValue instanceof Array) {\n if (name === 'filterRangeValue1') {\n changeValue = [change, current?.filterValue?.[1]]\n }\n if (name === 'filterRangeValue2') {\n changeValue = [current?.filterValue?.[0], change]\n }\n }\n }\n // filterValue needs to be an array.\n const update = {\n ...current,\n ...{\n [name?.includes('filterRangeValue') ? 'filterValue' : name]: name === 'filterValue' && !isMultiValueField ? [changeValue] : changeValue\n }\n }\n\n // invoke parent call\n onChange(update)\n }\n\n const renderDatePicker = (dateObject, isEndDate) => {\n const onChange = (date) => {\n if (isEndDate) {\n setEndDate(date)\n localChangeHandler('filterRangeValue2')(date?.toISOString())\n } else {\n setStartDate(date)\n localChangeHandler('filterRangeValue1')(date?.toISOString())\n }\n }\n\n let dateString = null\n if (isEndDate) {\n if (filterValue?.length === 2) {\n dateString = filterValue[1]\n }\n } else {\n if (filterValue?.length >= 1) {\n dateString = filterValue[0]\n }\n }\n\n // filterValue[isEndDate ? 1 : 0]\n const selectedValue = dateObject ?? (dateString ? new Date(dateString) : null)\n return (\n <DatePicker\n selected={selectedValue}\n onChange={onChange}\n className='FilterRow__text__value datepicker'\n dateFormat='MM/dd/yyyy'\n placeholderText={isEndDate ? 'End Date' : 'Start Date'}\n yearItemNumber={9}\n formatWeekDay={(nameOfDay) => nameOfDay.charAt(0)}\n showMonthDropdown\n showYearDropdown\n showDisabledMonthNavigation\n />\n )\n }\n\n const isDateType = (column) => {\n if (column?.type?.toLowerCase() === 'date') {\n return true\n }\n // If not, try and match it up with the select options to get the type pulled from API\n const columnInDropdown = columnSelectList?.find(c => c?.value === column?.value)\n if (columnInDropdown) {\n return columnInDropdown?.type?.toLowerCase() === 'date'\n } else {\n return false\n }\n }\n const typeIsDate = isDateType(column)\n return (\n <div className={cx('FilterRow', { isGroup })}>\n {\n isGroup && rowIndex !== 0 &&\n <FilterFormConjunctionDropdown\n isDisabled={rowIndex > 1}\n onChange={onInnerConjunctionChange}\n value={conjunction}\n />\n }\n <FormGroup className='form-group'>\n <FormLabel visuallyHidden>{placeholders.column}</FormLabel>\n <Select\n {...commonSelectProps}\n className={cx('FilterRow__column', rowIndex > 0 ? 'shortenedColumn' : '')}\n value={column}\n options={columnSelectList}\n placeholder={placeholders.column}\n onChange={localChangeHandler('column')}\n />\n </FormGroup>\n <FormGroup className='form-group'>\n <FormLabel visuallyHidden>{placeholders.comparator}</FormLabel>\n <Select\n {...commonSelectProps}\n className='FilterRow__comparator'\n value={comparator}\n options={comparators}\n placeholder={placeholders.comparator}\n onChange={localChangeHandler('comparator')}\n isDisabled={isEmpty(column)}\n />\n </FormGroup>\n <FormGroup className={cx('form-group', 'FilterRow__value-container')}>\n <FormLabel visuallyHidden>{placeholders.input}</FormLabel>\n {\n isRangeValueField && !isMultiValueField &&\n <div className='betweenFilter'>\n {typeIsDate ? (\n <>\n {renderDatePicker(startDate, false)}\n {isMobile ? '' : <span>to</span>}\n {renderDatePicker(endDate, true)}\n </>)\n : (\n <>\n <FormControl\n className={cx('FilterRow__text__value', { isDisabled: isTextInputDisabled })}\n type='text'\n name={`FilterRow__text__value-${key}`}\n placeholder={typeIsDate ? 'Start Date' : 'Start Value'}\n disabled={isTextInputDisabled}\n value={filterValue?.[0]}\n onChange={({ target }) => localChangeHandler('filterRangeValue1')(target.value)}\n onKeyDown={e => { if (handleTextboxCustomKeydown !== undefined) { handleTextboxCustomKeydown(e) } }}\n />\n {isMobile ? '' : <span>to</span>}\n <FormControl\n className={cx('FilterRow__text__value', { isDisabled: isTextInputDisabled })}\n type='text'\n name={`FilterRow__text__value-${key}`}\n placeholder={typeIsDate ? 'End Date' : 'End Value'}\n disabled={isTextInputDisabled}\n value={filterValue?.[1]}\n onChange={({ target }) => localChangeHandler('filterRangeValue2')(target.value)}\n onKeyDown={e => { if (handleTextboxCustomKeydown !== undefined) { handleTextboxCustomKeydown(e) } }}\n />\n </>\n )}\n </div>\n\n }\n {\n isMultiValueField && !isRangeValueField &&\n <MultiValueTextInput\n defaultValue={filterValue || []}\n onChange={(value) => localChangeHandler('filterValue')(value)}\n classNamePrefix={commonSelectProps.classNamePrefix}\n menuPlacement={commonSelectProps.menuPlacement}\n menuPortalTarget={commonSelectProps.menuPortalTarget}\n handleTextboxCustomKeydown={handleTextboxCustomKeydown}\n />\n }\n {\n !isMultiValueField && !isRangeValueField &&\n <FormControl\n className={cx('FilterRow__text__value', { isDisabled: isTextInputDisabled })}\n type='text'\n name={`FilterRow__text__value-${key}`}\n placeholder={noTextInputRequired ? '' : placeholders.filterValue}\n disabled={isTextInputDisabled}\n value={filterValue}\n onChange={({ target }) => localChangeHandler('filterValue')(target.value)}\n onKeyDown={e => { if (handleTextboxCustomKeydown !== undefined) { handleTextboxCustomKeydown(e) } }}\n />\n }\n\n </FormGroup>\n {isRemoveVisible && !isMobile &&\n <span\n className='FilterRow__remove'\n onClick={memoizedClearFilterClick}\n >\n <CloseIcon size={22} strokeWidth={4} />\n </span>}\n\n {isRemoveVisible && isMobile &&\n <Button\n className='FilterRow__remove--mobile'\n onClick={memoizedClearFilterClick}\n variant='outline-secondary'\n >\n Remove filter\n </Button>}\n {isBasicMobileDividerShowing && <hr className='FilterRow__mobile-divider' />}\n </div>\n )\n}\n\nFilterRow.propTypes = {\n columnSelectList: PropTypes.arrayOf(PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n })).isRequired,\n /* group compare operator */\n conjunction: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n }),\n data: PropTypes.shape({\n /* id the row for onChange handler */\n key: PropTypes.string.isRequired,\n /* db column name */\n column: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n type: PropTypes.string\n }),\n /* compare operator */\n comparator: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n }),\n /* value to query column by */\n filterValue: PropTypes.arrayOf(PropTypes.string)\n }),\n /* if multiple exist allow user to clear */\n hasMultipleFilters: PropTypes.bool.isRequired,\n /* indicates whether is part of a filter group which has diff styling */\n isGroup: PropTypes.bool,\n /* field change handler */\n onChange: PropTypes.func.isRequired,\n /* clear an entire filter conditon */\n onClearFilterClick: PropTypes.func.isRequired,\n /* change filter group conjunction */\n onInnerConjunctionChange: PropTypes.func,\n /* aid in determining how to display dynamic filter group elements */\n rowIndex: PropTypes.number,\n handleTextboxCustomKeydown: PropTypes.func\n}\n\nexport default FilterRow\n\nexport { comparators }\n","import React, { useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport Button from 'react-bootstrap/Button'\nimport FilterRow from './FilterRow'\nimport FilterFormConjunctionDropdown from './FilterFormConjunctionDropdown'\nimport { ReactComponent as PlusIcon } from '../../../assets/fontawesome/solid/plus.svg'\nimport isEmpty from 'lodash/isEmpty'\n\nimport './FilterGroup.scss'\n\n// subcomponent implementing a filter group\nconst FilterGroup = (props) => {\n const {\n group,\n groupKey,\n groupNumber,\n handleAddFilter,\n handleChange,\n handleRemoveFilterGroup,\n handleChangeConjunction,\n handleChangeRootConjunction,\n handleClearFilter,\n hasMultipleFilterGroups,\n isLastGroup,\n rootConjunction,\n selectList,\n handleTextboxCustomKeydown\n } = props\n const { conjunction, conditions } = group\n const hasMultipleFilters = conditions.length > 1\n\n const handleAddFilterClick = useCallback(() => {\n handleAddFilter(groupKey)\n }, [groupKey, handleAddFilter])\n\n const handleInnerConjunctionChange = useCallback((update) => {\n handleChangeConjunction(groupKey, update)\n }, [groupKey, handleChangeConjunction])\n\n const handleOuterConjunctionChange = useCallback((update) => {\n handleChangeRootConjunction(update)\n }, [handleChangeRootConjunction])\n\n // curried function to change a filter row (FilterRow sends the update)\n const handleGroupChange = useCallback((update) => {\n handleChange(groupKey, update)\n }, [groupKey, handleChange])\n\n const handleRemoveFilterGroupClick = useCallback(() => {\n handleRemoveFilterGroup(groupKey)\n }, [groupKey, handleRemoveFilterGroup])\n\n // curried function to remove a filter row (FilterRow sends the condition row uuid)\n const handleRemoveFilterRowClick = useCallback((conditionKey) => {\n handleClearFilter(groupKey, conditionKey)\n }, [groupKey, handleClearFilter])\n\n // if any input has data, remove filter group needs to show\n const groupIsDirty = conditions.some(condition => {\n const { column, comparator, filterValue } = condition\n\n return !!(column || comparator || filterValue)\n })\n\n return (\n !isEmpty(conditions) &&\n <>\n <div className='FilterGroup'>\n {\n conditions.map((condition, i) => (\n <FilterRow\n key={condition.key}\n columnSelectList={selectList}\n conjunction={conjunction}\n data={condition}\n hasMultipleFilters={hasMultipleFilters}\n isGroup\n onChange={handleGroupChange}\n onClearFilterClick={handleRemoveFilterRowClick}\n onInnerConjunctionChange={handleInnerConjunctionChange}\n onOuterConjunctionChange={handleOuterConjunctionChange}\n rowIndex={i}\n handleTextboxCustomKeydown={handleTextboxCustomKeydown}\n />\n ))\n }\n <div className='FilterForm__buttons'>\n <Button\n className='FilterForm__buttons__new isAdvanced'\n onClick={handleAddFilterClick}\n variant='outline-primary'\n >\n <PlusIcon className='PlusIcon' />\n Add filter condition\n </Button>\n {(hasMultipleFilters || hasMultipleFilterGroups || groupIsDirty) &&\n <Button\n className='FilterForm__buttons__clear-group'\n onClick={handleRemoveFilterGroupClick}\n variant='outline-secondary'\n >\n Remove filter group\n </Button>}\n </div>\n </div>\n {(hasMultipleFilterGroups && !isLastGroup) &&\n <div className='FilterGroup__conjunction'>\n <FilterFormConjunctionDropdown\n isDisabled={groupNumber >= 1}\n onChange={handleOuterConjunctionChange}\n value={rootConjunction}\n />\n </div>}\n </>\n )\n}\n\nFilterGroup.propTypes = {\n groupNumber: PropTypes.number.isRequired,\n handleAddFilter: PropTypes.func.isRequired,\n handleChange: PropTypes.func.isRequired,\n handleRemoveFilterGroup: PropTypes.func.isRequired,\n handleChangeConjunction: PropTypes.func.isRequired,\n handleChangeRootConjunction: PropTypes.func.isRequired,\n handleClearFilter: PropTypes.func.isRequired,\n group: PropTypes.shape({\n conjunction: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n }),\n conditions: PropTypes.array\n }),\n groupKey: PropTypes.string.isRequired,\n hasMultipleFilterGroups: PropTypes.bool.isRequired,\n isLastGroup: PropTypes.bool.isRequired,\n selectList: PropTypes.array,\n handleTextboxCustomKeydown: PropTypes.func,\n rootConjunction: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n })\n}\n\nexport default FilterGroup\n","import React, { useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport Button from 'react-bootstrap/Button'\nimport FilterGroup from './FilterGroup'\nimport { ReactComponent as PlusIcon } from '../../../assets/fontawesome/solid/plus.svg'\nimport cloneDeep from 'lodash/cloneDeep'\nimport get from 'lodash/get'\nimport isEmpty from 'lodash/isEmpty'\nimport { newAdvancedFilterGroup, newBasicFilter } from '../../../utilities/datasetHelpers'\nimport config from '../../../config'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\n\nconst {\n filterFormInputsDisabledByComparator: inputsDisabledByComparator\n} = config\n\nconst commonPropTypes = {\n filters: PropTypes.shape({\n key: PropTypes.shape({\n conjunction: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n }).isRequired,\n conditions: PropTypes.arrayOf(PropTypes.shape({\n key: PropTypes.string.isRequired,\n column: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n }),\n comparator: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n }),\n filterValue: PropTypes.arrayOf(PropTypes.string)\n }))\n })\n }),\n\n onUpdate: PropTypes.func.isRequired,\n onClearAll: PropTypes.func.isRequired,\n rootConjunction: PropTypes.shape({\n label: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired\n }),\n onApplyFiltersClick: PropTypes.func.isRequired\n}\n\n// hook for common usage of calculated props and methods\nfunction useCommon (props) {\n const {\n onClearAll,\n onUpdate,\n filters\n } = props\n\n // remove all filters, execute a new search, and add a blank input row\n const handleClearAllClick = useCallback(() => {\n // send empty filters up hierarchy\n onClearAll()\n // ensure one filter available in form at all times\n onUpdate(newAdvancedFilterGroup())\n }, [onClearAll, onUpdate])\n\n // pre-render data formatting\n const filterKeys = Object.keys(filters)\n const hasMultipleFilterGroups = filterKeys.length > 1\n\n return {\n handleClearAllClick,\n filterKeys,\n hasMultipleFilterGroups\n }\n}\n\nfunction FilterFormAdvanced (props) {\n const {\n filters,\n rootConjunction,\n selectList,\n onUpdate,\n onConjunctionChange,\n onApplyFiltersClick\n\n } = props\n\n const { handleClearAllClick, filterKeys, hasMultipleFilterGroups } = useCommon(props)\n\n // add a new filter condition to an existing group\n function handleAddFilter (groupKey) {\n const { filters } = props\n const newFilterState = cloneDeep(filters)\n newFilterState[groupKey].conditions.push(newBasicFilter())\n\n onUpdate(newFilterState)\n }\n\n // handle change events for conditions within a group\n function handleChange (groupKey, update) {\n const { filters } = props\n const newFilters = cloneDeep(filters)\n const targetGroup = newFilters[groupKey]\n // find & update condition\n const targetIndex = targetGroup.conditions.findIndex(condition => condition.key === update.key)\n targetGroup.conditions[targetIndex] = update\n\n onUpdate(newFilters)\n }\n\n // handle change of the group level conjunction\n function handleChangeConjunction (groupKey, update) {\n const { filters } = props\n const newFilterState = cloneDeep(filters)\n const newTargetGroup = newFilterState[groupKey]\n newTargetGroup.conjunction = update\n\n onUpdate(newFilterState)\n }\n\n // remove single filter row & determine whether to fetch a new search\n function handleClearFilter (groupKey, conditionKey) {\n /*\n Business rules:\n - if only one filter & one group exists then clear filter & refetch the data\n - if more than one filter exists remove the clicked row but do not refetch the data\n */\n const { filters } = props\n const newFilterState = cloneDeep(filters)\n const newTargetGroup = newFilterState[groupKey]\n const filterGroupLength = Object.keys(filters).length\n\n if (filterGroupLength === 1 && newTargetGroup.conditions.length === 1) {\n handleClearAllClick()\n } else {\n newTargetGroup.conditions = newTargetGroup.conditions.filter(condition => condition.key !== conditionKey)\n\n onUpdate(newFilterState)\n }\n }\n\n // remove an entire filter group while ensuring at least one group remains\n function handleRemoveFilterGroup (groupKey) {\n const { filters } = props\n const groupCount = Object.keys(filters).length\n\n if (groupCount === 1) {\n handleClearAllClick()\n } else {\n const newFilterState = cloneDeep(filters)\n delete newFilterState[groupKey]\n\n onUpdate(newFilterState)\n }\n }\n\n const handleTextboxCustomKeydown = (e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n onApplyFiltersClick()\n }\n }\n\n return (\n <div className='FilterFormAdvanced'>\n {!isEmpty(filterKeys) &&\n filterKeys.map((filter, i) => (\n <FilterGroup\n key={i}\n group={filters[filter]}\n groupKey={filter}\n groupNumber={i}\n hasMultipleFilterGroups={hasMultipleFilterGroups}\n handleAddFilter={e => handleAddFilter(e)}\n handleChange={(groupKey, update) => handleChange(groupKey, update)}\n handleChangeConjunction={(groupKey, update) => handleChangeConjunction(groupKey, update)}\n handleChangeRootConjunction={onConjunctionChange}\n handleRemoveFilterGroup={e => handleRemoveFilterGroup(e)}\n handleClearFilter={(groupKey, conditionKey) => handleClearFilter(groupKey, conditionKey)}\n isLastGroup={i === filterKeys.length - 1}\n rootConjunction={rootConjunction}\n selectList={selectList}\n handleTextboxCustomKeydown={e => handleTextboxCustomKeydown(e)}\n />\n ))}\n </div>\n )\n}\n\nFilterFormAdvanced.propTypes = {\n ...commonPropTypes,\n selectList: PropTypes.array.isRequired,\n onConjunctionChange: PropTypes.func.isRequired\n}\n\nexport function FilterFormAdvancedButtons (props) {\n const {\n filters,\n onApplyFiltersClick,\n onUpdate\n } = props\n const { isMobile } = useDisplayContext()\n const { handleClearAllClick, filterKeys, hasMultipleFilterGroups } = useCommon(props)\n\n // add a new top-level filter group\n function handleAddFilterGroupClick () {\n const { filters } = props\n const newFilterState = {\n ...filters,\n ...newAdvancedFilterGroup()\n }\n\n onUpdate(newFilterState)\n }\n\n // button is type=submit for ux\n // stop page refresh before calling parent method\n function handleApplyClick (e) {\n e.preventDefault()\n onApplyFiltersClick()\n }\n\n const hasMultipleFiltersInAGroup = filterKeys.some(filter => filters[filter].conditions.length > 1)\n\n // initial handling is to prevent user from submitting if any partial data exists\n const isAllDataPresent = filterKeys.every(filter => {\n const { conditions } = filters[filter]\n\n return conditions.every(condition => {\n const { column, comparator, filterValue } = condition\n\n if (inputsDisabledByComparator.includes(get(comparator, 'value'))) {\n return !isEmpty(column) && !isEmpty(comparator)\n }\n\n return !isEmpty(column) && !isEmpty(comparator) && !!filterValue\n })\n })\n\n const renderDesktopButtons = () => (\n <>\n <Button\n className='FilterForm__buttons__new isAdvanced'\n onClick={e => handleAddFilterGroupClick(e)}\n variant='outline-primary'\n >\n <PlusIcon className='PlusIcon' />\n Add filter group\n </Button>\n {(hasMultipleFilterGroups || hasMultipleFiltersInAGroup) &&\n <Button\n className='FilterForm__buttons__clear-all'\n onClick={handleClearAllClick}\n variant='outline-secondary'\n >\n Clear all filters\n </Button>}\n <Button\n className='FilterForm__buttons__apply'\n disabled={!isAllDataPresent}\n onClick={e => handleApplyClick(e)}\n type='submit'\n variant='primary'\n >\n Apply filters\n </Button>\n </>\n )\n\n const renderMobileButtons = () => (\n <>\n <Button\n className='FilterForm__buttons__new isAdvanced'\n onClick={e => handleAddFilterGroupClick(e)}\n variant='outline-primary'\n >\n <PlusIcon className='PlusIcon' />\n Add filter group\n </Button>\n <Button\n className='FilterForm__buttons__apply'\n disabled={!isAllDataPresent}\n onClick={e => handleApplyClick(e)}\n type='submit'\n variant='primary'\n >\n Apply filters\n </Button>\n {(hasMultipleFilterGroups || hasMultipleFiltersInAGroup) &&\n <Button\n className='FilterForm__buttons__clear-all'\n onClick={handleClearAllClick}\n variant='outline-secondary'\n >\n Clear all filters\n </Button>}\n </>\n )\n\n return (\n <div className='FilterForm__buttons'>\n {isMobile ? renderMobileButtons() : renderDesktopButtons()}\n </div>\n )\n}\n\nFilterFormAdvancedButtons.propTypes = {\n ...commonPropTypes\n}\n\nexport default FilterFormAdvanced\n","import React, { useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport Button from 'react-bootstrap/Button'\nimport FilterRow from './FilterRow'\nimport isEmpty from 'lodash/isEmpty'\nimport get from 'lodash/get'\nimport { ReactComponent as PlusIcon } from '../../../assets/fontawesome/solid/plus.svg'\nimport cloneDeep from 'lodash/cloneDeep'\nimport { newBasicFilter } from '../../../utilities/datasetHelpers'\nimport config from '../../../config'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\n\nconst {\n filterFormInputsDisabledByComparator: inputsDisabledByComparator\n} = config\n\nconst commonPropTypes = {\n filters: PropTypes.arrayOf(PropTypes.shape({\n key: PropTypes.string.isRequired,\n column: PropTypes.object,\n comparator: PropTypes.object,\n filterValue: PropTypes.arrayOf(PropTypes.string)\n })),\n onUpdate: PropTypes.func.isRequired,\n onClearAll: PropTypes.func.isRequired\n}\n\n// hook for common usage of calculated props and methods\nfunction useCommon (props) {\n const {\n onClearAll,\n onUpdate,\n filters\n } = props\n\n // remove all filters, execute a new search, and add a blank input row\n const handleClearAllClick = useCallback(() => {\n // send empty filters up hierarchy\n onClearAll()\n // ensure one filter available in form at all times\n onUpdate([newBasicFilter()])\n }, [onClearAll, onUpdate])\n\n const hasMultipleFilters = filters.length > 1\n\n return {\n handleClearAllClick,\n hasMultipleFilters\n }\n}\n\nfunction FilterFormBasic (props) {\n const {\n filters,\n selectList,\n onUpdate\n } = props\n\n /**\n * Update a basic filter condition\n * @param {Object} update the updated data structure to apply\n * @param {String} update.key uuid row identifier\n * @param {String} update.column\n * @param {String} update.comparator\n * @param {String[]} update.filterValue\n */\n function handleChange (update) {\n const { filters } = props\n const targetIndex = filters.findIndex(f => f.key === update.key)\n const newBasic = cloneDeep(filters)\n newBasic[targetIndex] = update\n\n onUpdate(newBasic)\n }\n\n const { handleClearAllClick, hasMultipleFilters } = useCommon(props)\n\n // remove single filter row & determine whether to fetch a new search\n function handleClearFilterClick (uuid) {\n const { filters } = props\n\n /*\n Business rules:\n - if only one filter exists then clear filter & refetch the data\n - if more than one filter exists remove the clicked row but do not refetch the data\n */\n if (filters.length === 1) {\n handleClearAllClick()\n } else {\n const newBasic = filters.filter(f => f.key !== uuid)\n\n onUpdate(newBasic)\n }\n }\n\n return (\n <div className='FilterFormBasic'>\n {!isEmpty(filters) &&\n filters.map((filter, i) => (\n <FilterRow\n key={filter.key}\n columnSelectList={selectList}\n data={filter}\n hasMultipleFilters={hasMultipleFilters}\n onChange={e => handleChange(e)}\n onClearFilterClick={e => handleClearFilterClick(e)}\n />\n ))}\n </div>\n )\n}\n\nFilterFormBasic.propTypes = {\n ...commonPropTypes,\n selectList: PropTypes.array.isRequired\n}\n\nexport function FilterFormBasicButtons (props) {\n const {\n onApplyFiltersClick,\n onUpdate,\n filters\n } = props\n\n const { isMobile } = useDisplayContext()\n const { handleClearAllClick, hasMultipleFilters } = useCommon(props)\n\n // add a new filter condition\n function handleAddNewFilter () {\n const { filters } = props\n const newFilterState = [\n ...filters,\n newBasicFilter()\n ]\n\n onUpdate(newFilterState)\n }\n\n // button is type=submit for ux\n // stop page refresh before calling parent method\n function handleApplyClick (e) {\n e.preventDefault()\n\n onApplyFiltersClick()\n }\n\n const isAllDataPresent = filters.every(filter => {\n const { column, comparator, filterValue } = filter\n\n if (inputsDisabledByComparator.includes(get(comparator, 'value'))) {\n return !isEmpty(column) && !isEmpty(comparator)\n }\n\n if (Array.isArray(filterValue)) {\n return !isEmpty(column) && !isEmpty(comparator) && filterValue.every(value => value !== undefined && value !== null)\n } else {\n return !isEmpty(column) && !isEmpty(comparator) && !!filterValue\n }\n })\n\n const renderDesktopButtons = () => (\n <>\n <Button\n variant='outline-primary'\n className='FilterForm__buttons__new'\n onClick={e => handleAddNewFilter(e)}\n >\n <PlusIcon className='PlusIcon' />\n Add filter condition\n </Button>\n {hasMultipleFilters &&\n <Button\n variant='outline-secondary'\n className='FilterForm__buttons__clear-all'\n onClick={handleClearAllClick}\n >\n Clear all filters\n </Button>}\n <Button\n className='FilterForm__buttons__apply'\n disabled={!isAllDataPresent}\n onClick={e => handleApplyClick(e)}\n type='submit'\n variant='primary'\n >\n Apply filters\n </Button>\n </>\n )\n\n const renderMobileButtons = () => (\n <>\n <Button\n variant='outline-primary'\n className='FilterForm__buttons__new'\n onClick={e => handleAddNewFilter(e)}\n >\n <PlusIcon className='PlusIcon' />\n Add filter condition\n </Button>\n <Button\n className='FilterForm__buttons__apply'\n disabled={!isAllDataPresent}\n onClick={e => handleApplyClick(e)}\n type='submit'\n variant='primary'\n >\n Apply filters\n </Button>\n {hasMultipleFilters &&\n <Button\n variant='outline-secondary'\n className='FilterForm__buttons__clear-all'\n onClick={handleClearAllClick}\n >\n Clear all filters\n </Button>}\n </>\n )\n\n return (\n <div className='FilterForm__buttons'>\n {isMobile ? renderMobileButtons() : renderDesktopButtons()}\n </div>\n )\n}\n\nFilterFormBasicButtons.propTypes = {\n ...commonPropTypes,\n onApplyFiltersClick: PropTypes.func.isRequired\n}\n\nexport default FilterFormBasic\n","import React, { useMemo, useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport cloneDeep from 'lodash/cloneDeep'\nimport Modal from 'react-bootstrap/Modal'\nimport Tab from 'react-bootstrap/Tab'\nimport Nav from 'react-bootstrap/Nav'\nimport Container from 'react-bootstrap/Container'\nimport Select from 'react-select'\nimport { ReactComponent as SortDownIcon } from '../../../assets/fontawesome/solid/sort-down.svg'\nimport FilterFormAdvanced, { FilterFormAdvancedButtons } from './FilterFormAdvanced'\nimport FilterFormBasic, { FilterFormBasicButtons } from './FilterFormBasic'\nimport { newAdvancedFilterGroup, newBasicFilter, areFiltersEmpty } from '../../../utilities/datasetHelpers'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport config from '../../../config'\nimport { trackInteractiveFiltersClick } from '../../../utilities/analyticsEventHelpers'\n\nimport './FiltersForm.scss'\n\nconst { filterFormConjunctions } = config\n\nconst mobileFilterOptions = [\n { label: 'Basic Filtering', value: 'basic' },\n { label: 'Advanced Filtering', value: 'advanced' }\n]\n\nconst DropdownIndicator = () => {\n return (\n <span className='FilterForm__indicator-wrapper'>\n <SortDownIcon />\n </span>\n )\n}\n\nfunction FiltersForm (props) {\n const {\n headers,\n isFilterOpen,\n isFullScreen,\n onApplyFiltersClick,\n onRequestClose,\n initialFilters,\n onUserInputChange,\n schemaLookUp\n } = props\n const { isDesktop, isMobile, windowWidth } = useDisplayContext()\n const isFiltersDisplayedInModal = isFullScreen && isDesktop\n\n // filters are temporary until they are applied at parent\n const [formState, setFormState] = useState({\n ...initialFilters\n })\n\n useEffect(() => {\n // Ensure that formState is reset when initialFilters\n // contains are empty as in the case where the Reset\n // button is pressed on a parent component.\n if (areFiltersEmpty(initialFilters) && !areFiltersEmpty(formState)) {\n setFormState(state => ({\n ...initialFilters\n }))\n }\n }, [initialFilters])\n\n useEffect(() => {\n if (!isFilterOpen) {\n setFormState(state => ({\n ...state,\n activeFilter: state.appliedTab || 'basic'\n }))\n }\n }, [isFilterOpen])\n\n useEffect(() => {\n // Check that form isn't 'empty'\n onUserInputChange(formState)\n }, [formState])\n\n // column names for dropdowns\n const columnSelectList = useMemo(() => {\n // sort is in place, so clone to avoid causing issues elsewhere\n const headersCopy = cloneDeep(headers)\n\n return headersCopy\n .sort((a, b) => {\n if (a.Header < b.Header) {\n return -1\n }\n if (a.Header > b.Header) {\n return 1\n }\n\n return 0\n })\n .map(headerCell => (\n {\n label: schemaLookUp && schemaLookUp[headerCell.Header]?.title ? schemaLookUp[headerCell.Header].title : headerCell.Header,\n value: headerCell.Header,\n type: schemaLookUp && schemaLookUp[headerCell.Header]?.type ? schemaLookUp[headerCell.Header]?.type : 'Unknown type'\n }))\n }, [headers])\n\n function handleConjunctionChange (update) {\n setFormState(state => ({\n ...state,\n rootConjunction: update\n }))\n }\n\n /**\n * Update param filter data to current activeFilter\n * @param {Object[]} update the updated data structure to apply\n */\n function handleUpdate (update) {\n const { activeFilter } = formState\n\n setFormState(state => ({\n ...state,\n [activeFilter]: update\n }))\n }\n\n // toggle ui between basic & advanced filter form\n function handleFilterTypeSelect (tab, e) {\n // desktop tabs are a tags with # refs; prevent autoscroll to top\n if (e) { e.stopPropagation() }\n\n setFormState(state => ({\n ...state,\n activeFilter: tab\n }))\n }\n\n const handleTabSelectBasic = (e) => handleFilterTypeSelect('basic', e)\n const handleTabSelectAdvanced = (e) => handleFilterTypeSelect('advanced', e)\n\n const handleMobileSelectChange = selection => {\n const { value } = selection\n\n handleFilterTypeSelect(value)\n }\n\n // clean up our data before sending to parent\n // as of now child form components will not send empty data\n function onAdvancedApplyFiltersClick () {\n const { advanced, rootConjunction } = formState\n const advancedKeys = Object.keys(advanced)\n // convert structure to top-level expected array\n const advancedList = advancedKeys.map(key => (\n advanced[key]\n ))\n\n const filters = {\n selected_filters: Object.keys(advanced).map(el => advanced[el].conditions.map(el => el.comparator.label).join(',')).join(','),\n selected_manage_columns: Object.keys(advanced).map(el => advanced[el].conditions.map(el => el.column.label).join(',')).join(',')\n }\n trackInteractiveFiltersClick('filter-applied', filters, window.utag)\n\n setFormState(state => ({\n ...state,\n advanced,\n basic: [newBasicFilter()],\n appliedTab: 'advanced'\n }))\n\n // pass query generator ready data structure to parent\n const queryReadyFilters = {\n rootConjunction: rootConjunction,\n list: advancedList\n }\n\n onApplyFiltersClick(queryReadyFilters)\n\n // close modal upon Apply click\n if (isFiltersDisplayedInModal) {\n onRequestClose()\n }\n }\n\n // clean up our data before sending to parent\n // as of now child form components will not send empty data\n function onBasicApplyFiltersClick () {\n const { basic } = formState\n\n setFormState(state => ({\n ...state,\n advanced: { ...newAdvancedFilterGroup() },\n basic,\n appliedTab: 'basic'\n }))\n\n // pass query generator ready data structure to parent\n const queryReadyFilters = {\n rootConjunction: filterFormConjunctions[0],\n list: [\n {\n conditions: basic\n }\n ]\n }\n\n onApplyFiltersClick(queryReadyFilters)\n\n // close modal upon Apply click\n if (isFiltersDisplayedInModal) {\n onRequestClose()\n }\n const filters = {\n selected_filters: queryReadyFilters.list[0].conditions.map(el => el.comparator.label).join(','),\n selected_manage_columns: queryReadyFilters.list[0].conditions.map(el => el.column.label).join(',')\n }\n trackInteractiveFiltersClick('filter-applied', filters, window.utag)\n }\n\n // bypass async setState issues and clear all filters here\n function handleClearAll () {\n const { activeFilter } = formState\n\n setFormState(state => ({\n ...state,\n [activeFilter]: [],\n appliedTab: 'basic'\n }))\n\n const queryReadyFilters = {\n rootConjunction: filterFormConjunctions[0],\n list: []\n }\n\n onApplyFiltersClick(queryReadyFilters)\n }\n\n const { activeFilter, advanced, basic, rootConjunction } = formState\n\n const basicFilterProps = {\n filters: basic,\n selectList: columnSelectList,\n onUpdate: handleUpdate,\n onApplyFiltersClick: onBasicApplyFiltersClick,\n onClearAll: handleClearAll\n }\n\n const advancedFilterProps = {\n filters: advanced,\n rootConjunction,\n selectList: columnSelectList,\n onApplyFiltersClick: onAdvancedApplyFiltersClick,\n onClearAll: handleClearAll,\n onConjunctionChange: handleConjunctionChange,\n onUpdate: handleUpdate\n }\n\n // form arrow position tied to middle of filter button\n function determineArrowPosition () {\n const { filterButtonRef } = props\n\n if (filterButtonRef) {\n const { x, width } = filterButtonRef.getBoundingClientRect()\n const coreCalculation = (width / 2) - 14\n const desktopOffset = x\n\n return isMobile ? coreCalculation : coreCalculation + desktopOffset\n }\n }\n\n const isBasicActive = activeFilter === 'basic'\n const isAdvancedActive = activeFilter === 'advanced'\n\n function renderHeader () {\n return (\n <div className='FiltersForm__header'>\n {isMobile && (\n <div className='FilterForm__mobile-selector'>\n <Select\n classNamePrefix='FilterForm__mobile-select'\n components={{ DropdownIndicator }}\n isMulti={false}\n isSearchable={false}\n value={mobileFilterOptions.filter(f => f.value === activeFilter)}\n options={mobileFilterOptions}\n onChange={handleMobileSelectChange}\n />\n </div>\n )}\n {!isMobile && (\n <Nav variant='tabs'>\n <Nav.Item>\n <Nav.Link\n onClick={handleTabSelectBasic}\n active={isBasicActive}\n title='Basic Filtering'\n >\n Basic Filtering\n </Nav.Link>\n </Nav.Item>\n <Nav.Item>\n <Nav.Link\n onClick={handleTabSelectAdvanced}\n active={isAdvancedActive}\n title='Advanced Filtering'\n >\n Advanced Filtering\n </Nav.Link>\n </Nav.Item>\n </Nav>\n )}\n </div>\n )\n }\n\n function renderBody () {\n return (\n <Tab.Content className='FiltersForm__body'>\n <Tab.Pane active={isBasicActive}>\n <FilterFormBasic {...basicFilterProps} />\n </Tab.Pane>\n <Tab.Pane active={isAdvancedActive}>\n <FilterFormAdvanced {...advancedFilterProps} />\n </Tab.Pane>\n </Tab.Content>\n )\n }\n\n function renderFooter () {\n return (\n <Tab.Content className='FiltersForm__footer'>\n <Tab.Pane active={isBasicActive}>\n <FilterFormBasicButtons {...basicFilterProps} />\n </Tab.Pane>\n <Tab.Pane active={isAdvancedActive}>\n <FilterFormAdvancedButtons {...advancedFilterProps} />\n </Tab.Pane>\n </Tab.Content>\n )\n }\n\n function renderContent () {\n return (\n <form className='FiltersForm'>\n <Tab.Container activeKey={activeFilter}>\n {renderHeader()}\n {renderBody()}\n {renderFooter()}\n </Tab.Container>\n </form>\n )\n }\n\n if (isFiltersDisplayedInModal) {\n return (\n <Modal\n className='FiltersFormModal'\n show={isFilterOpen}\n onHide={onRequestClose}\n >\n {renderContent()}\n {/* this element sits behind the FiltersForm and is used to trigger closing\n when the FiltersForm does not take up 100% of the available height */}\n <div className='gutter' onClick={onRequestClose} />\n </Modal>\n )\n }\n\n // on mobile, override bs container margins\n const mobileFiltersFormStyle = {\n width: '100vw',\n position: 'relative',\n left: '50%',\n right: '50%',\n marginLeft: '-50vw',\n marginRight: '-50vw'\n }\n\n const arrowTopStyles = {\n left: determineArrowPosition(),\n top: windowWidth <= 768 ? 247 : 138\n }\n\n return (\n <>\n <div\n className={cx(\n 'FiltersForm-container__arrow',\n { 'FiltersForm-isOpen': isFilterOpen }\n )}\n style={arrowTopStyles}\n />\n <div\n className={cx(\n 'FiltersForm-container',\n {\n 'no-gutters': isDesktop,\n 'FiltersForm-isOpen': isFilterOpen\n }\n )}\n style={isMobile ? { ...mobileFiltersFormStyle } : {}}\n >\n <Container>\n {renderContent()}\n </Container>\n </div>\n </>\n )\n}\n\nFiltersForm.propTypes = {\n isFullScreen: PropTypes.bool,\n onRequestClose: PropTypes.func,\n filterButtonRef: PropTypes.object,\n headers: PropTypes.arrayOf(PropTypes.shape({\n Header: PropTypes.string.isRequired\n })),\n isFilterOpen: PropTypes.bool.isRequired,\n onApplyFiltersClick: PropTypes.func.isRequired,\n initialFilters: PropTypes.object.isRequired,\n onUserInputChange: PropTypes.func,\n schemaLookUp: PropTypes.object\n}\n\nexport default FiltersForm\n","import { useCallback, useEffect, useState } from 'react'\nimport {\n getDatasetVersionResources\n} from '../services/api'\n\nfunction useLoadDatasetVersionResources (datasetVersionId) {\n const [{ isLoading, resources, error }, setState] = useState({\n isLoading: true,\n resources: [],\n error: null\n })\n\n const loadResources = useCallback(async () => {\n setState({ isLoading: true })\n\n try {\n const resources = await getDatasetVersionResources(datasetVersionId)\n\n setState({\n isLoading: false,\n resources: resources,\n error: null\n })\n } catch (error) {\n setState({\n isLoading: false,\n resources: [],\n error: error\n })\n }\n }, [datasetVersionId])\n\n useEffect(() => {\n loadResources()\n }, [loadResources])\n\n return {\n isLoading,\n resources,\n error\n }\n}\n\nexport default useLoadDatasetVersionResources\n","import { getOrigin } from '../utilities/linkHelpers'\n/**\n * Generate open graph/twitter meta tags for dynamic pages which\n * do not have a corresponding backend form to enter the data.\n * At present this encompasses change log & interactive dataset pages.\n * @param {('changelog' | 'interactiveDataset')} type\n */\nexport const generateHardCodedOpenGraphTags = (type, pageTitle = '') => {\n const origin = getOrigin()\n\n const titles = {\n changelog: 'Change Log',\n interactiveDataset: pageTitle\n }\n\n const descriptions = {\n changelog: 'A change and updates log for Medicare & Medicaid datasets.',\n interactiveDataset: 'An interactive page where you can sort, filter and export Medicare & Medicaid datasets.'\n }\n\n return [\n {\n property: 'og:title',\n content: titles[type]\n },\n {\n property: 'og:url',\n content: window.location.href\n },\n {\n property: 'og:image',\n content: `${origin}/sites/default/files/2020-06/data-cms-gov-og-card_1.jpg`\n },\n {\n property: 'og:image:alt',\n content: 'Medicare & Medicaid healthcare data resources'\n },\n {\n property: 'og:type',\n content: 'website'\n },\n {\n property: 'og:description',\n content: descriptions[type]\n },\n {\n property: 'og:site_name',\n content: 'Centers for Medicare & Medicaid Data'\n },\n {\n name: 'twitter:card',\n content: 'summary'\n },\n {\n name: 'twitter:site',\n content: '@CMSGov'\n },\n {\n name: 'twitter:title',\n content: titles[type]\n },\n {\n name: 'twitter:description',\n content: descriptions[type]\n },\n {\n name: 'twitter:image:alt',\n content: 'Medicare & Medicaid healthcare data resources'\n },\n {\n name: 'twitter:image',\n content: `${origin}/sites/default/files/2020-06/data-cms-gov-twitter-card_1.jpg`\n }\n ]\n}\n","import React, { useState, useEffect, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport get from 'lodash/get'\nimport isEqual from 'lodash/isEqual'\nimport isEmpty from 'lodash/isEmpty'\nimport cloneDeep from 'lodash/cloneDeep'\nimport queryString from 'query-string'\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport Alert from 'react-bootstrap/Alert'\nimport Button from 'react-bootstrap/Button'\nimport { ReactComponent as TriangleExclamationIcon } from '../../../assets/fontawesome/solid/triangle-exclamation.svg'\nimport Text from '../../common/Text/Text'\nimport DatasetVersionDropdown from '../../dataset/DatasetVersionDropdown/DatasetVersionDropdown'\nimport CarouselArrow from '../../icons/CarouselArrow'\nimport ContactBanner from '../../common/ContactBanner/ContactBanner'\nimport LoadingCover from '../../common/LoadingCover/LoadingCover'\nimport ClipboardCopyBtn from '../../common/ClipboardCopyBtn/ClipboardCopyBtn'\nimport InputPagination from '../../common/InputPagination/InputPagination'\nimport DataTable, { useReactTableProps } from '../../dataset/DataTable/DataTable'\nimport MetaHead from '../../layout/MetaHead/MetaHead'\nimport config from '../../../config'\nimport InteractiveDataResources from '../../dataset/DataTable/InteractiveDataResources'\nimport DataReloadTrigger from '../../dataset/DataTable/DataReloadTrigger'\nimport DataTableToolbar from '../../dataset/DataTable/DataTableToolbar'\nimport DataTableStatusBar from '../../dataset/DataTable/DataTableStatusBar'\nimport DataTableFiltersForm from '../../dataset/DataTable/FiltersForm'\nimport Footer from '../../layout/Footer/Footer'\nimport {\n getInteractiveDataApiPath,\n getInteractiveData,\n getInteractiveDataStats,\n getCancelToken,\n isCancellationError\n} from '../../../services/api'\nimport {\n getDatasetUuid as getDatasetTypeUuid,\n getContactLink,\n getDatasetName,\n getDatasetFrequency,\n buildInteractiveDataQueryString,\n optimizeFiltersForIdsQueryString,\n areFiltersEmpty,\n convertFilterParamsToFormState,\n newAdvancedFilterGroup,\n newBasicFilter,\n areColumnNamesInSearchParamsValid,\n getNewestDatasetVersion,\n isDatasetVersionInteractive,\n getDatasetVersionText\n} from '../../../utilities/datasetHelpers'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport useLoadDatasetVersionResources from '../../../hooks/useLoadDatasetVersionResources'\nimport { getDefaultSubjectLineForContent, getOrigin } from '../../../utilities/linkHelpers'\nimport { getAdjustedOffset } from '../../../utilities/searchPageHelpers'\nimport { generateHardCodedOpenGraphTags } from '../../../utilities/openGraph'\nimport { convertDataToObjectArray } from '../../../services/formatters/lookupTool'\nimport {\n trackInteractiveDataCopyFilteredView,\n trackInteractiveDataResetView\n} from '../../../utilities/analyticsEventHelpers'\nimport DatasetVersionIcon from '../../common/DatasetVersionIcon/DatasetVersionIcon'\n\nimport './DatasetInteractivePage.scss'\n\nconst {\n metaOrganizationName,\n filterFormConjunctions,\n apiSite\n} = config\n\nconst defaultQueryParams = {\n limit: 10,\n offset: 0,\n sort: {\n sortBy: null,\n sortOrder: null\n },\n keywords: '',\n filters: {\n rootConjunction: filterFormConjunctions[0],\n list: []\n },\n columns: []\n}\n\nconst initialSearchParams = {\n params: cloneDeep(defaultQueryParams),\n isMalformed: false\n}\n\nconst initialUserSelection = {\n ...cloneDeep(defaultQueryParams),\n isFullScreen: false,\n isFilterOpen: false,\n filterButtonRef: null\n}\n\nconst initialUrlError = {\n isError: false,\n errorMsg: '',\n errorType: ''\n}\n\nconst initialFiltersFormState = {\n activeFilter: 'basic',\n appliedTab: null,\n advanced: { ...newAdvancedFilterGroup() },\n basic: [newBasicFilter()],\n rootConjunction: { ...filterFormConjunctions[0] }\n}\n\nconst DatasetInteractivePage = (props) => {\n const {\n data,\n versions,\n currentVersion,\n onVersionChange,\n onBackClick,\n datasetUrlPath,\n maxUrlLength = 8000,\n history,\n location\n } = props\n const [prevDatasetVersionId, setPrevDatasetVersionId] = useState(currentVersion?.id)\n const [colChangedCounter, setColChangedCounter] = useState(0)\n const statsRequestToken = useRef(getCancelToken())\n const resultsRequestToken = useRef(getCancelToken())\n const tableSectionRef = useRef(null)\n const { isDesktop, isMobile } = useDisplayContext()\n const contactLink = getContactLink(data)\n const datasetFrequency = getDatasetFrequency(data)\n const datasetName = getDatasetName(data)\n const datasetVersionId = currentVersion?.id\n const metaTags = generateHardCodedOpenGraphTags('interactiveDataset', datasetName)\n const fieldCsvMetadata = get(currentVersion, 'fieldRefPrimaryDataFile.fieldCsvMetadata')\n const csvFileSize = fieldCsvMetadata && get(JSON.parse(fieldCsvMetadata), 'csvFileSize')\n\n const {\n isLoading: isLoadingResources,\n resources,\n error: resourcesError\n } = useLoadDatasetVersionResources(datasetVersionId)\n\n const [searchParams, setSearchParams] = useState({ ...getParsedQueryParams('init') })\n const [userSelections, setUserSelections] = useState({ ...initialUserSelection, ...searchParams.params })\n const { limit, sort, offset, filters, keywords, isFilterOpen, isFullScreen, filterButtonRef, columns: selectedColumns } = userSelections\n\n const [dataState, setDataState] = useState({\n isLoading: true,\n isLoadingStats: true,\n interactiveData: null,\n interactiveDataMeta: null,\n interactiveDataStats: {},\n error: null\n })\n\n const { isLoading, isLoadingStats, interactiveData, interactiveDataMeta, interactiveDataStats, error } = dataState\n\n const dataHeaders = get(interactiveDataMeta, 'headers')\n const columnTypes = get(interactiveDataMeta, 'data_file_meta_data.csvColumnTypes')\n const columnFormatting = get(interactiveDataMeta, 'data_file_meta_data.csvDisplayFormatting') // legacy formatting\n const tableSchema = get(interactiveDataMeta, 'data_file_meta_data.tableSchema.descriptor.fields') || [] // table schema\n const schemaLookUp = {} // quick lookup for table schema\n for (let i = 0; i < tableSchema.length; i++) {\n schemaLookUp[tableSchema[i]?.name] = tableSchema[i]\n }\n const dataRows = interactiveData || []\n const numOfTotalResults = parseInt(get(interactiveDataStats, 'total_rows', 0), 10)\n const numOfFoundResults = parseInt(get(interactiveDataStats, 'found_rows', 0), 10)\n const reactTableProps = useReactTableProps({ dataHeaders, dataRows, isMobile })\n const {\n visibleColumns,\n setColumnOrder,\n setHiddenColumns,\n columns,\n headerGroups,\n getTableProps,\n getTableBodyProps,\n rows,\n headers,\n prepareRow\n } = reactTableProps\n\n const isInitiallyLoading = !!(isLoading && !interactiveDataMeta)\n const isRefreshingData = !!(isLoading && interactiveDataMeta)\n const shouldDisplayError = !!(!isLoading && error)\n\n const [urlError, setUrlError] = useState({ ...initialUrlError })\n\n // Keywords entered but not necessarily submitted.\n const [currentKeywords, setCurrentKeywords] = useState(keywords)\n\n // Filters entered but not necessarily submitted.\n const [currentFiltersFormState, setCurrentFiltersFormState] = useState({\n ...initialFiltersFormState,\n ...convertFilterParamsToFormState(filters)\n })\n\n // Whether or not the form can be reset. This is used to enabled\n // or disabled the Reset View button.\n const [isResettable, setIsResettable] = useState(false)\n\n const [isUrlParamsLocked, setIsUrlParamsLocked] = useState(false)\n\n const handleVersionChange = (version) => {\n handleOnReset()\n onVersionChange(version)\n }\n\n /**\n * Grabs the query parameter from URL, parses them,\n * validates column names, and returns parsed parameters\n * along with an error flag.\n *\n * @returns {{params: object, isMalformed: boolean}}\n */\n function getParsedQueryParams () {\n const search = get(location, 'search', '')\n const fallbackParams = cloneDeep(defaultQueryParams)\n let params = {}\n let isMalformed = false\n\n // Parse JSON stringified params in URL.\n try {\n const rawParams = queryString.parse(search)\n params = (rawParams?.query !== undefined) ? JSON.parse(rawParams.query) : fallbackParams\n } catch (error) {\n isMalformed = true\n }\n\n // Validate column names.\n if (!isMalformed && fieldCsvMetadata) {\n const metadata = JSON.parse(fieldCsvMetadata)\n const validColumns = Object.keys(metadata.csvColumnTypes)\n if (!areColumnNamesInSearchParamsValid(params, validColumns)) {\n params = initialSearchParams.params\n isMalformed = true\n }\n }\n\n return { params, isMalformed }\n }\n\n function handleUrlUpdate (params) {\n const searchParams = queryString.parse(window.location.search)\n\n if (isUrlParamsLocked) {\n // Don't update the URL if the data was refreshed\n // via browser back button.\n console.debug('params are locked')\n setIsUrlParamsLocked(false)\n } else if (isEqual(params, defaultQueryParams)) {\n // Clean the URL when params are the same as default values.\n console.debug('params are the same as default')\n const newHistory = isEmpty(searchParams.accessToken) ? { search: '' } : { search: `?accessToken=${searchParams.accessToken}` }\n history.push(newHistory)\n\n setIsResettable(isFormResettable())\n } else {\n // If the search parameters are different from default values,\n // Update the url query string and save the user selections\n // through the history API.\n console.debug('params are going to be updated')\n history.push({\n search: queryString.stringify({\n query: JSON.stringify(params),\n ...(!isEmpty(searchParams.accessToken) ? { accessToken: searchParams.accessToken } : {})\n })\n }, {\n userSelections: {\n ...params,\n isFullScreen: userSelections.isFullScreen,\n isFilterOpen: userSelections.isFilterOpen\n },\n currentFiltersFormState: {\n ...currentFiltersFormState\n },\n currentKeywords: currentKeywords\n })\n setSearchParams(state => ({\n isMalformed: state.isMalformed,\n params: {\n ...params\n }\n }))\n }\n }\n\n function handleSetLimit (updatedLimit) {\n setUserSelections(state => ({\n ...state,\n limit: updatedLimit,\n offset: getAdjustedOffset(updatedLimit, state.offset)\n }))\n }\n\n function handleSetSort (updatedSort) {\n setUserSelections(state => ({\n ...state,\n sort: updatedSort\n }))\n }\n\n function handleColumnConfigChange (columnIds) {\n const params = {\n filters,\n keywords,\n offset,\n limit,\n sort,\n columns: columnIds\n }\n handleUrlUpdate(params)\n setUserSelections(state => ({\n ...state,\n columns: columnIds\n }))\n }\n\n function handleRequestSearch (updatedKeywords) {\n setUserSelections(state => ({\n ...state,\n // reset page when applying new keywords\n offset: 0,\n keywords: updatedKeywords\n }))\n }\n\n // apply user created filters to state\n function handleSetFilters (updatedFilters) {\n setUserSelections(state => ({\n ...state,\n // reset page when applying new filters\n offset: 0,\n filters: updatedFilters\n }))\n }\n\n function handleUpdateOffset (updatedOffset) {\n setUserSelections(state => ({\n ...state,\n offset: updatedOffset\n }))\n\n const currentScrollTop = window.pageYOffset\n const top = tableSectionRef.current.getBoundingClientRect().top\n\n // scroll to top of table section after changing pages\n window.scrollTo({\n top: top + currentScrollTop,\n behavior: 'smooth'\n })\n }\n\n function isFormResettable () {\n // Note: location.search and history.location.search don't always\n // hold the same value. It appears that the latter is more up-to-date\n // with recent history.push() calls.\n const accessToken = queryString.parse(window.location.search)?.accessToken\n const paramCount = Array.from(new URLSearchParams(window.location.search))?.length\n\n return ((\n // There are query parameters in the URL and\n // search params aren't default values (not counting accesstoken in preview mode).\n (get(history, 'location.search', '') !== '' && !accessToken) ||\n // This is a preview URL with an access token and there is more than one param\n (accessToken && paramCount > 1) ||\n // There are keywords.\n (currentKeywords !== '') ||\n // There are filters.\n !areFiltersEmpty(currentFiltersFormState) ||\n // There are selected columns.\n (visibleColumns.length !== columns.length) ||\n // The order of the columns is different from default.\n (!isEqual(columns.map(column => column.id), visibleColumns.map(column => column.id))) ||\n // There is an error.\n urlError.isError\n ) && !isLoading)\n }\n\n function isLinkCopyable () {\n const accessToken = queryString.parse(window.location.search)?.accessToken\n const paramCount = Array.from(new URLSearchParams(window.location.search))?.length\n const locationNotEmpty = get(location, 'search', '') !== ''\n\n // When access token exists, have isLinkCopyable acts the same as isFormResettable\n const queryStringNotEmpty = isEmpty(accessToken) ? locationNotEmpty : (paramCount > 1)\n\n return (\n // The query string isn't empty AND\n queryStringNotEmpty &&\n // there's no errors AND\n !urlError.isError &&\n // the data isn't loading.\n !isLoading\n )\n }\n\n function getUrlDataViewerRequestLength (options) {\n const url = apiSite + getInteractiveDataApiPath(datasetVersionId) + buildInteractiveDataQueryString(options)\n return url.length\n }\n\n function getMaxApiParamsLength () {\n // Subtracting 1 in case the \"?\" is not accounted for down the line.\n return maxUrlLength - (apiSite + getInteractiveDataApiPath(datasetVersionId)).length - 1\n }\n\n function handleOnReset () {\n setUserSelections(state => ({\n ...initialUserSelection\n }))\n setHiddenColumns([])\n setColumnOrder(columns.map(column => column.id))\n setCurrentKeywords('')\n setCurrentFiltersFormState({ ...initialFiltersFormState })\n setSearchParams({ ...initialSearchParams })\n setUrlError({ ...initialUrlError })\n handleUrlUpdate(defaultQueryParams)\n trackInteractiveDataResetView(window.utag)\n }\n\n function toggleFilterForm () {\n setUserSelections(state => ({\n ...state,\n isFilterOpen: !state.isFilterOpen\n }))\n }\n\n function closeFilterForm () {\n setUserSelections(state => ({\n ...state,\n isFilterOpen: false\n }))\n }\n\n function handleSetFullScreen (updatedIsFullScreen) {\n setUserSelections(state => ({\n ...state,\n isFullScreen: updatedIsFullScreen\n }))\n }\n\n function handleBackButtonClick (event) {\n const savedUserSelections = get(event, 'state.state.userSelections', {})\n const savedKeywords = get(event, 'state.state.currentKeywords', '')\n const savedFiltersFormState = get(event, 'state.state.currentFiltersFormState', { ...initialFiltersFormState })\n setIsUrlParamsLocked(true)\n setUserSelections(selection => ({\n ...initialUserSelection,\n ...savedUserSelections,\n filterButtonRef: selection?.filterButtonRef\n }))\n setCurrentKeywords(savedKeywords)\n setCurrentFiltersFormState(savedFiltersFormState)\n setIsResettable(isFormResettable())\n }\n\n // Add event listener to detect browser back button clicks on component mount.\n useEffect(() => {\n window.addEventListener('popstate', handleBackButtonClick)\n return () => window.removeEventListener('popstate', handleBackButtonClick)\n }, [])\n\n // Reset user selection when changing dataset version.\n useEffect(() => {\n setUserSelections(selection => ({\n ...initialUserSelection,\n ...searchParams.params,\n filterButtonRef: selection.filterButtonRef\n }))\n }, [datasetVersionId])\n\n // Toggle full screen.\n useEffect(() => {\n if (isFullScreen) {\n document.body.classList.add('dataset-full-screen')\n } else {\n document.body.classList.remove('dataset-full-screen')\n }\n }, [isFullScreen])\n\n // Display warning/errors on the page as necessary.\n useEffect(() => {\n const queryStringParams = {\n filters,\n keywords,\n offset,\n limit,\n sort\n }\n const apiRequestLength = getUrlDataViewerRequestLength(queryStringParams)\n\n if ((apiRequestLength > maxUrlLength) || (window.location.href.length > maxUrlLength)) {\n setUrlError({\n isError: true,\n errorMsg: 'The current filter selections exceed the limit; the filtered link will not copy. Please reset or choose fewer options to copy the link.',\n errorType: 'warning'\n })\n } else if (shouldDisplayError) {\n setUrlError({\n isError: true,\n errorMsg: 'There was an issue processing your request. Please try again or contact support.',\n errorType: 'danger'\n })\n } else if (searchParams.isMalformed) {\n setUrlError({\n isError: true,\n errorMsg: 'The URL you provided no longer exists. Please reset and start your search over.',\n errorType: 'warning'\n })\n } else {\n setUrlError({ ...initialUrlError })\n }\n }, [filters, keywords, offset, limit, sort, selectedColumns, searchParams.isMalformed])\n\n // Check if form is resettable whenever any of the below parameters change.\n useEffect(() => {\n setIsResettable(isFormResettable())\n }, [currentKeywords, currentFiltersFormState, visibleColumns, searchParams, isLoading])\n\n useEffect(() => {\n if (!isDatasetVersionInteractive(currentVersion) || (!currentVersion && !prevDatasetVersionId)) {\n handleVersionChange(getNewestDatasetVersion(versions))\n }\n }, [currentVersion])\n\n // Update managed column setting.\n useEffect(() => {\n if (!isEmpty(selectedColumns) && !isEmpty(columns)) {\n updateColumnSelection(selectedColumns)\n } else {\n setColChangedCounter(colChangedCounter + 1)\n }\n }, [columns])\n\n useEffect(() => {\n setColumnOrder(columns.map(column => column.id))\n }, [colChangedCounter])\n\n /**\n * refresh only the rows of the data table\n * @param {boolean} isInitialLoad\n */\n async function refreshTableRows (isInitialLoad) {\n setDataState(state => ({\n ...state,\n isLoading: true\n }))\n\n const params = {\n filters,\n keywords,\n offset,\n limit,\n sort\n }\n\n try {\n resultsRequestToken.current.cancel()\n resultsRequestToken.current = getCancelToken()\n const response = await getInteractiveData(datasetVersionId, params, resultsRequestToken.current.token)\n\n const { meta: updatedMeta } = response\n setDataState(state => ({\n ...state,\n isLoading: false,\n // always retain original headers, unless isInitiaLoad since BE will send back only visible column headers\n interactiveDataMeta: isInitialLoad || prevDatasetVersionId !== currentVersion.id ? updatedMeta : state.interactiveDataMeta,\n // format response if not initialLoad (see formatResponseData description)\n interactiveData: convertDataToObjectArray(response),\n error: null\n }))\n setPrevDatasetVersionId(currentVersion.id)\n } catch (e) {\n if (!isCancellationError(e)) {\n console.error('error refreshing IDS table', e)\n setDataState(state => ({\n ...state,\n isLoading: false,\n error: e\n }))\n }\n }\n }\n\n /**\n * refresh only the stats for data table (informs paging and stats display)\n * @param {boolean} isInitialLoad\n */\n async function refreshStats () {\n setDataState(state => ({\n ...state,\n isLoadingStats: true\n }))\n\n const params = {\n filters,\n keywords\n }\n\n try {\n statsRequestToken.current.cancel()\n statsRequestToken.current = getCancelToken()\n const { data: updatedStats } = await getInteractiveDataStats(datasetVersionId, params, statsRequestToken.current.token)\n\n setDataState(state => ({\n ...state,\n isLoadingStats: false,\n interactiveDataStats: updatedStats,\n error: null\n }))\n } catch (e) {\n if (!isCancellationError(e)) {\n console.error('error refreshing IDS stats', e)\n setDataState(state => ({\n ...state,\n isLoadingStats: false,\n error: e\n }))\n }\n }\n }\n\n /**\n * Refreshes data and meta (same endpoint). The isInitialLoad option, if false, prevents\n * existing headers from being overwritten; this way, after initial load, no matter the\n * column visibility selections, we'll always have the full list of columns available\n * @param {object} options\n * @param {boolean} options.isInitialLoad\n * @param {boolean} options.shouldRequestStats\n */\n async function refreshResults (options = {}) {\n const {\n isInitialLoad = false,\n shouldRequestStats = false\n } = options\n\n const params = {\n filters,\n keywords,\n offset,\n limit,\n sort\n }\n\n // keep the request from following through if the query string is too long for akamai\n const apiRequestLength = getUrlDataViewerRequestLength(params)\n\n if (apiRequestLength > maxUrlLength && !isInitiallyLoading) {\n return\n }\n\n refreshTableRows(isInitialLoad)\n\n if (shouldRequestStats) {\n refreshStats()\n }\n\n // Update URL.\n handleUrlUpdate({\n ...params,\n columns: selectedColumns,\n filters: optimizeFiltersForIdsQueryString(filters)\n })\n }\n\n function updateColumnSelection (items) {\n const allColumnIds = columns.map(column => column.id)\n const hiddenColumnIds = allColumnIds.filter(id => !items.includes(id))\n const orederedColumns = [...items, ...hiddenColumnIds]\n\n setColumnOrder(orederedColumns)\n setHiddenColumns(hiddenColumnIds)\n }\n\n function setFilterButtonRef (node) {\n const { filterButtonRef } = userSelections\n\n if (!filterButtonRef && node) {\n setUserSelections(state => ({\n ...state,\n filterButtonRef: node\n }))\n }\n }\n\n /**\n * renderHeaderSection\n * header section consists of back navigation, title and version dropdown\n */\n function renderHeaderSection () {\n const currentDropdownVersion = currentVersion || getNewestDatasetVersion(versions)\n const tooltip = getDatasetVersionText(currentVersion.fieldReReleaseSelect)\n\n return (\n <Container className='DatasetInteractivePage__headerSection'>\n <div className='DatasetInteractivePage__back' onClick={onBackClick}>\n <span><CarouselArrow size='small' direction='left' /></span>\n <span>Back to dataset overview</span>\n </div>\n <DatasetVersionDropdown\n versions={versions}\n currentVersion={currentDropdownVersion}\n datasetFrequency={datasetFrequency}\n onSelectVersion={handleVersionChange}\n />\n {(currentVersion.fieldDatasetVersionSuffix && currentVersion.fieldDatasetVersionSuffix.length > 0) && <div className='DatasetInteractivePage__versioning'>{tooltip.label} <DatasetVersionIcon tooltip={tooltip.tooltip} icon='filledIn' /> </div>}\n <Row className='DatasetInteractivePage__headerRow'>\n <Col className='DatasetInteractivePage__header' lg={8}>\n <Text typeFace='00 Display/Black'>\n {datasetName}\n </Text>\n </Col>\n </Row>\n </Container>\n )\n }\n\n /**\n * renderBodySection\n * body section consists of 3 sub-sections: toolbar/status bar, datatable, and pagination\n */\n function renderBodySection () {\n return (\n <div className='DatasetInteractivePage__body'>\n <div className='DatasetInteractivePage__toolsSection'>\n <DataTableStatusBar\n numOfTotalResults={numOfTotalResults}\n numOfFoundResults={numOfFoundResults}\n offset={offset}\n limit={limit}\n keywords={keywords}\n filters={filters.list}\n onSetLimit={e => handleSetLimit(e)}\n onSetFullScreen={e => handleSetFullScreen(e)}\n isFullScreen={isFullScreen}\n isLoading={isLoadingStats}\n />\n <DataTableToolbar\n schemaLookUp={schemaLookUp}\n key={`toolbar-${datasetVersionId}`} /* Using a key to reset component when version changes. */\n datasetName={datasetName}\n datasetVersionId={datasetVersionId}\n datasetTypeUuid={getDatasetTypeUuid(data)}\n setColumnOrder={setColumnOrder}\n setHiddenColumns={setHiddenColumns}\n headers={headers}\n columns={columns}\n visibleColumns={visibleColumns}\n onColumnConfigChange={e => handleColumnConfigChange(e)}\n keywords={currentKeywords}\n sort={sort}\n onRequestSearch={e => handleRequestSearch(e)}\n filters={filters}\n isLoading={isRefreshingData}\n isFilterOpen={isFilterOpen}\n onFilterClick={e => toggleFilterForm(e)}\n setFilterButtonRef={e => setFilterButtonRef(e)}\n isFullScreen={isFullScreen}\n csvFileSize={csvFileSize}\n maxURLParamsLength={getMaxApiParamsLength()}\n onUserInputChange={(input) => setCurrentKeywords(input)}\n >\n {!isDesktop &&\n <DataTableFiltersForm\n schemaLookUp={schemaLookUp}\n key={`mobileFiltersForm-${datasetVersionId}`} /* Using a key to reset component when version changes. */\n isFullScreen={isFullScreen}\n headers={headers}\n isFilterOpen={isFilterOpen}\n onFilterClick={e => toggleFilterForm(e)}\n filterButtonRef={filterButtonRef}\n onApplyFiltersClick={e => handleSetFilters(e)}\n onRequestClose={e => closeFilterForm(e)}\n initialFilters={currentFiltersFormState}\n onUserInputChange={(input) => setCurrentFiltersFormState(input)}\n />}\n </DataTableToolbar>\n {isDesktop &&\n <DataTableFiltersForm\n schemaLookUp={schemaLookUp}\n key={`filtersForm-${datasetVersionId}`} /* Using a key to reset component when version changes. */\n isFullScreen={isFullScreen}\n headers={headers}\n isFilterOpen={isFilterOpen}\n onFilterClick={e => toggleFilterForm(e)}\n filterButtonRef={filterButtonRef}\n onApplyFiltersClick={e => handleSetFilters(e)}\n onRequestClose={e => closeFilterForm(e)}\n initialFilters={currentFiltersFormState}\n onUserInputChange={(input) => setCurrentFiltersFormState(input)}\n />}\n {renderLowerToolbarButtons()}\n </div>\n {urlError.isError &&\n <Container className='DatasetInteractivePage__columnWarning' fluid={isFullScreen}>\n <Alert variant={urlError.errorType}><Alert.Heading><span className='alert-icon'><TriangleExclamationIcon /></span>Warning</Alert.Heading><div className='alert-body'>{urlError.errorMsg}</div></Alert>\n </Container>}\n <div className='DatasetInteractivePage__tableSection' ref={tableSectionRef}>\n <DataTable\n headerGroups={headerGroups}\n columns={columns}\n getTableProps={getTableProps}\n getTableBodyProps={getTableBodyProps}\n rows={rows}\n prepareRow={prepareRow}\n meta={interactiveDataMeta}\n sort={sort}\n onSetSort={e => handleSetSort(e)}\n isFullScreen={isFullScreen}\n isLoading={isRefreshingData}\n columnTypes={columnTypes}\n columnFormatting={columnFormatting}\n schemaLookUp={schemaLookUp}\n />\n </div>\n {numOfFoundResults > 0 && (\n <div className='DatasetInteractivePage__paginationSection'>\n <InputPagination\n isLoading={isLoadingStats}\n limit={limit}\n total={numOfFoundResults}\n offset={offset}\n onUpdateOffset={e => handleUpdateOffset(e)}\n />\n </div>\n )}\n </div>\n )\n }\n\n function renderLowerToolbarButtons () {\n return (\n <Container fluid={isFullScreen}>\n <Row>\n <Col className='DatasetInteractivePage__LowerToolbarButtons'>\n <Button\n className='DatasetInteractivePage__reset-all-btn'\n variant='link'\n onClick={() => handleOnReset()}\n disabled={!isResettable}\n >Reset view\n </Button>\n <ClipboardCopyBtn\n confOpts={{\n type: 'tooltip',\n msg: 'Link copied to clipboard',\n duration: 3,\n tooltipId: 'DatasetInteractivePage__copy-link-tooltip'\n }}\n btnOpts={{\n variant: 'outline-primary',\n className: 'DatasetInteractivePage__copy-link-btn',\n disabled: !isLinkCopyable()\n }}\n label='Copy link to filtered view'\n value={window.location.href}\n onClick={() => { trackInteractiveDataCopyFilteredView(window.utag) }}\n />\n </Col>\n </Row>\n </Container>\n )\n }\n\n function renderAdditionalContents () {\n return (\n <>\n <InteractiveDataResources\n isLoading={isLoadingResources}\n resources={resources}\n error={resourcesError}\n />\n <ContactBanner\n className='DatasetInteractivePage__contactBanner'\n contactLink={contactLink}\n subjectLine={getDefaultSubjectLineForContent(getDatasetName(data))}\n />\n </>\n )\n }\n\n return (\n <div className={cx('DatasetInteractivePage pageAnimation', { fullScreen: isFullScreen, initialLoading: isInitiallyLoading })}>\n <MetaHead noCrawl metaTags={metaTags}>\n <title>{`${datasetName}${metaOrganizationName}`}</title>\n <link rel='canonical' href={`${getOrigin()}${datasetUrlPath}`} />\n </MetaHead>\n <DataReloadTrigger\n limit={limit}\n offset={offset}\n sort={sort}\n filters={filters.list}\n keywords={keywords}\n visibleColumns={visibleColumns}\n datasetVersionId={currentVersion?.id}\n onReloadTriggered={e => refreshResults(e)}\n interactiveDataMeta={interactiveDataMeta}\n />\n {renderHeaderSection()}\n {isInitiallyLoading && (\n <div className='DatasetInteractivePage__loading'>\n <LoadingCover />\n </div>\n )}\n {!isInitiallyLoading && (\n <>\n {!isFullScreen && <hr />}\n {/* toolbar/status bar, datatable, and pagination */}\n {renderBodySection()}\n {/* related resources and contact */}\n {renderAdditionalContents()}\n <Footer />\n </>\n )}\n </div>\n )\n}\n\nDatasetInteractivePage.propTypes = {\n data: PropTypes.object,\n versions: PropTypes.array,\n currentVersion: PropTypes.object,\n onVersionChange: PropTypes.func.isRequired,\n onBackClick: PropTypes.func.isRequired,\n datasetUrlPath: PropTypes.string.isRequired,\n maxUrlLength: PropTypes.number,\n history: PropTypes.shape({\n goBack: PropTypes.func,\n location: PropTypes.shape({\n pathname: PropTypes.string,\n state: PropTypes.object\n }),\n push: PropTypes.func,\n replace: PropTypes.func\n }),\n location: PropTypes.object\n}\n\nexport default DatasetInteractivePage\n","import React, { PureComponent, createRef } from 'react'\nimport dayjs from 'dayjs'\nimport advancedFormat from 'dayjs/plugin/advancedFormat'\nimport PropTypes from 'prop-types'\nimport cx from 'classnames'\nimport Button from 'react-bootstrap/Button'\nimport Text from '../../common/Text/Text'\nimport RichTextField from '../../common/RichTextField/RichTextField'\nimport withDisplayContext from '../../../hocs/withDisplayContext/withDisplayContext'\n\nimport './ChangelogSection.scss'\ndayjs.extend(advancedFormat)\n\nconst ChangeLogItem = ({ description, isMobile, summary }) => {\n const hasSummary = summary && summary !== ''\n\n return (\n <>\n <div className={cx('ChangelogSection__itemHeader', { hasNoSummary: !hasSummary })}>\n <div className='ChangelogSection__itemHeader-disc' />\n <Text\n className='ChangelogSection__itemHeader-text'\n typeFace={isMobile ? '05 H5/Mobile/Regular/Dark Blue' : '05 H5/Regular/Dark Blue'}\n >\n {description}\n </Text>\n </div>\n {hasSummary && (\n <div className='ChangelogSection__itemBody'>\n <hr />\n <RichTextField content={summary} />\n </div>\n )}\n </>\n )\n}\n\nChangeLogItem.propTypes = {\n description: PropTypes.string.isRequired,\n isMobile: PropTypes.bool,\n summary: PropTypes.string\n}\n\nclass ChangelogSection extends PureComponent {\n state = {\n expanded: false,\n expandable: false\n }\n\n listRef = createRef()\n\n componentDidMount () {\n const height = this.listRef.current.clientHeight\n if (height > 450) {\n this.setState({\n expandable: true\n })\n }\n }\n\n handleExpansionToggle = () => {\n this.setState({ expanded: !this.state.expanded })\n }\n\n render () {\n const {\n label,\n groupedItems,\n index,\n isMobile\n } = this.props\n\n const { expanded, expandable } = this.state\n const groupKeys = Object.keys(groupedItems)\n\n return (\n <div className={cx('ChangelogSection', { 'is-head': index === 0 })}>\n <div className='ChangelogSection__body'>\n <div className='ChangelogSection__header'>\n <Text\n className='ChangelogSection__header-label'\n typeFace={isMobile ? '02 H2/Mobile/Black' : '02 H2/Black/L'}\n >\n {label}\n </Text>\n </div>\n <hr />\n <div className={cx('ChangelogSection__list', { expanded, expandable })} ref={this.listRef}>\n {groupKeys.map((groupKey, i) => (\n <div className='ChangelogSection__item' key={i}>\n {/* group date eyebrow */}\n <Text\n className='ChangelogSection__header-release'\n typeFace='Small Text/MedGray'\n >\n Released {dayjs(groupKeys[i]).format('MMMM Do, YYYY')}\n </Text>\n {/* group items */}\n {\n groupedItems[groupKey].map((item, i) => (\n <ChangeLogItem {...item} key={i} />\n ))\n }\n </div>\n ))}\n </div>\n </div>\n {expandable && (\n <div className='ChangelogSection__footer'>\n <Button role='button' onClick={this.handleExpansionToggle}>View {expanded ? 'Less' : 'More'}</Button>\n </div>\n )}\n </div>\n )\n }\n}\n\nexport default withDisplayContext(ChangelogSection)\n\nexport { ChangelogSection, ChangeLogItem }\n\nexport const ChangelogSectionLoading = () => (\n <div className='ChangelogSectionLoading' data-testid='ChangelogSectionLoading'>\n <div>\n <div className='skeleton-box' data-testid='skeleton-box' />\n <div className='skeleton-box' data-testid='skeleton-box' />\n </div>\n <hr />\n <ul>\n {Array(4).fill({}).map((v, i) => (\n <li key={i}>\n <div className='skeleton-box' data-testid='skeleton-box' />\n </li>\n ))}\n </ul>\n </div>\n)\n\nChangelogSection.propTypes = {\n label: PropTypes.string,\n groupedItems: PropTypes.object,\n index: PropTypes.number,\n isMobile: PropTypes.bool.isRequired\n}\n","import React, { useEffect, useState, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport get from 'lodash/get'\nimport groupBy from 'lodash/groupBy'\nimport Container from 'react-bootstrap/Container'\nimport dayjs from 'dayjs'\nimport compose from '../../../hocs/compose'\nimport withBoundary from '../../../hocs/withBoundary/withBoundary'\nimport MetaHead from '../../layout/MetaHead/MetaHead'\nimport ContactBanner from '../../common/ContactBanner/ContactBanner'\nimport ResourceHero, { ResourceHeroLoading } from '../../common/Resource/ResourceHero'\nimport { getChangelog, getDatasetInfo } from '../../../services/api'\nimport ChangelogSection, { ChangelogSectionLoading } from '../../changelog/ChangelogSection/ChangelogSection'\nimport config from '../../../config'\nimport ComponentShell from '../../common/ComponentShell/ComponentShell'\nimport ContentPageLayout from '../../common/ContentPageLayout/ContentPageLayout'\nimport ContentPageNav, { ContentPageNavLoading } from '../../common/ContentPageLayout/ContentPageNav'\nimport BackToTopBtn from '../../common/BackToTopBtn/BackToTopBtn'\nimport Footer from '../../layout/Footer/Footer'\nimport { getDefaultSubjectLineForContent } from '../../../utilities/linkHelpers'\nimport { generateHardCodedOpenGraphTags } from '../../../utilities/openGraph'\n\nimport './ChangelogPage.scss'\n\nconst { metaOrganizationName } = config\n\nconst ChangelogPage = (props) => {\n // Deconstruct props\n const {\n slugResolveData\n } = props\n\n // Get dataset id from the slug resolve data\n const name = slugResolveData.name\n const datasetVersionId = slugResolveData.uuid\n const datasetTypeId = get(slugResolveData, 'current_dataset.uuid')\n\n // generate meta data\n const metaTags = generateHardCodedOpenGraphTags('changelog')\n\n // Create new state to hold changelog data\n const [changelog, setChangelog] = useState({\n data: [],\n contactInfo: {},\n datasetCard: {},\n isLoading: true,\n error: null\n })\n\n // This will only run once\n useEffect(() => {\n const getData = () => {\n try {\n Promise\n .all([getChangelogData(), getChangelogDetails()])\n .then(results => {\n const [data, contact] = results\n const { contactInfo, datasetCard } = contact\n\n setChangelog({ isLoading: false, error: null, data, contactInfo, datasetCard })\n })\n } catch (error) {\n setChangelog({ isLoading: false, error })\n }\n }\n\n // core data\n const getChangelogData = () => {\n return getChangelog(datasetVersionId, {})\n }\n\n // get datasetCard and contactInfo info via parent dataset data\n const getChangelogDetails = async () => {\n const { contactInfo, data: { fieldLastUpdatedDate, fieldDatasetType } } = await getDatasetInfo(datasetTypeId)\n const datasetCard = {\n type: 'Dataset',\n heading: name,\n date: fieldLastUpdatedDate,\n slug: fieldDatasetType.path.alias\n }\n return { contactInfo, datasetCard }\n }\n\n // initialize data\n getData()\n }, [datasetTypeId, datasetVersionId, name])\n\n // Deconstruct Changelog Object\n const {\n data,\n datasetCard,\n contactInfo,\n isLoading\n } = changelog\n // Sort all items\n const sorted = data.sort((a, b) => {\n a = new Date(a.changeDate)\n b = new Date(b.changeDate)\n return a > b ? -1 : a < b ? 1 : 0\n })\n\n // Group items by year\n const grouped = groupBy(sorted, ({ changeDate }) => {\n return dayjs(changeDate).format('YYYY')\n })\n\n /**\n * Within a grouped year, all change items are also grouped by their change date\n * Returns an object with each date as key & associated items as an array\n * @param {[]} items\n */\n const groupEntriesByChangeDate = (items) => {\n return items.reduce((aggregate, changeItem) => {\n const {\n uuid,\n changeDate: changed,\n shortDescription: description,\n changeSummary: summary\n } = changeItem\n\n if (!Object.keys(aggregate).includes(changed)) {\n aggregate[changed] = []\n }\n\n aggregate[changed].push({\n uuid,\n changed,\n description,\n summary\n })\n\n return aggregate\n }, {})\n }\n\n // Turn items into sections and reverse order of grouped years to make all data newest to oldest\n const sections = Object.keys(grouped).map((year) => {\n return {\n label: `${year} Updates`,\n year,\n id: year,\n scrollTopOffset: 83,\n items: groupEntriesByChangeDate(grouped[year])\n }\n }).reverse()\n\n const lastUpdated = get(data, '[0].changeDate', '')\n const pageTitle = `${name}: Changes and Updates Log`\n\n const startRef = useRef(null)\n const stopRef = useRef(null)\n return (\n <div className='ChangelogPage'>\n {isLoading && (\n <>\n <ResourceHeroLoading />\n <Container className='ChangelogPage__loadingContentContainer'>\n <div>\n <ContentPageNavLoading />\n </div>\n <div>\n <ChangelogSectionLoading />\n <ChangelogSectionLoading />\n </div>\n </Container>\n </>\n\n )}\n {!isLoading && (\n <>\n <MetaHead noCrawl metaTags={metaTags}>\n <title>{`${pageTitle}${metaOrganizationName}`}</title>\n </MetaHead>\n <BackToTopBtn\n startRef={startRef}\n stopRef={stopRef}\n />\n <ResourceHero\n topic={'What\\'s new'}\n header={pageTitle}\n lastUpdated={lastUpdated}\n resources={[datasetCard]}\n />\n <div ref={startRef} />\n <ContentPageLayout\n sections={sections}\n renderNav={({ currentSectionId, sections }) => (\n <ContentPageNav\n sections={sections}\n currentSectionId={currentSectionId}\n />\n )}\n renderSection={section => {\n return (\n <div ref={section.ref}>\n <ComponentShell leftColOffset={3}>\n <ChangelogSection\n index={section.index}\n label={section.label}\n groupedItems={section.items}\n release={section.released}\n />\n </ComponentShell>\n </div>\n )\n }}\n />\n <div ref={stopRef} />\n <ContactBanner\n {...contactInfo}\n // business requirement to hardcode header and description\n header='Contact us'\n description={'Didn\\'t find the answer you were looking for?'}\n subjectLine={getDefaultSubjectLineForContent(pageTitle)}\n />\n <Footer />\n </>\n )}\n </div>\n )\n}\n\nChangelogPage.propTypes = {\n slugResolveData: PropTypes.object.isRequired\n}\n\nexport default compose(withBoundary)(ChangelogPage)\n","import React, { useEffect, useMemo, useState, Suspense } from 'react'\nimport PropTypes from 'prop-types'\nimport get from 'lodash/get'\nimport Table from 'react-bootstrap/Table'\nimport Form from 'react-bootstrap/Form'\nimport Container from 'react-bootstrap/Container'\nimport Row from 'react-bootstrap/Row'\nimport Col from 'react-bootstrap/Col'\nimport LoadingCover from '../../common/LoadingCover/LoadingCover'\nimport ErrorPage from '../ErrorPage/ErrorPage'\nimport MetaHead from '../../layout/MetaHead/MetaHead'\nimport LinkHandler from '../../common/LinkHandler/LinkHandler'\nimport {\n getNewestDatasetVersion,\n excludeNonInteractiveDatasetVersions,\n getDatasetVersionValue,\n getDatasetLastUpdatedDate,\n getTooltipBasedOnFrequency,\n getDatasetVersionText\n} from '../../../utilities/datasetHelpers'\nimport { formatLastUpdatedDate } from '../../dataset/DatasetHero/DatasetHero'\nimport datasetVersionFormatter from '../../../utilities/datasetVersionFormatter'\nimport { getApiDocsInfo } from '../../../services/api'\nimport ApiDocsHero from '../../common/ApiDocsHero/ApiDocsHero'\nimport Footer from '../../layout/Footer/Footer'\nimport config from '../../../config'\nimport { numberWithCommas } from '../../../utilities/searchPageHelpers'\nimport { getOrigin } from '../../../utilities/linkHelpers'\nimport { ReactComponent as InfoIconFilledIn } from '../../../assets/fontawesome/custom/circle-info-filled-in.svg'\nimport useDisplayContext from '../../../hooks/useDisplayContext'\nimport OverlayTrigger from 'react-bootstrap/OverlayTrigger'\nimport Tooltip from 'react-bootstrap/Tooltip'\n\nimport './DatasetApiDocsPage.scss'\n\nconst SwaggerUI = React.lazy(() => import('swagger-ui-react'))\n\nconst {\n metaOrganizationName\n} = config\n\nconst DatasetApiDocsPage = (props) => {\n const {\n name,\n description,\n frequency,\n creationDate,\n dataSource,\n versions,\n datasetPath,\n metaTags,\n latestUuid,\n history,\n retired\n } = props\n\n const [apiSpecs, setApiSpecs] = useState(null)\n const [{ isLoading, error }, setUiState] = useState({ isLoading: false, error: null })\n const filteredVersions = excludeNonInteractiveDatasetVersions(versions)\n const newestVersion = getNewestDatasetVersion(filteredVersions)\n const [selectedVersionId, setSelectedVersionId] = useState(newestVersion.id)\n const selectedVersion = useMemo(() => {\n return versions.find(version => version.id === selectedVersionId)\n }, [selectedVersionId, versions])\n const { isMobile } = useDisplayContext()\n\n useEffect(() => {\n setUiState({ isLoading: true, error: null })\n\n getApiDocsInfo()\n .then(data => {\n setApiSpecs(data)\n setUiState({ isLoading: false, error: null })\n })\n .catch(err => {\n console.error('Error loading API spec', err)\n setUiState({ isLoading: false, error: err })\n })\n }, [])\n\n function renderVersionDropdown () {\n const dropdownOptions = filteredVersions.map(version => ({\n value: version.id,\n label: version?.fieldDatasetVersionCombined\n }))\n\n return (\n <Container>\n <Row>\n <Col><p><LinkHandler href={datasetPath} routerData={{ search: history?.location?.search }} noBs>Back to dataset</LinkHandler></p></Col>\n </Row>\n <Row>\n <Col><p>{description}</p></Col>\n </Row>\n <Row>\n <Form.Group as={Col} lg={6} className='form-group'>\n <Form.Label>Select Version:</Form.Label>\n <Form.Control\n as='select'\n name='version-select'\n custom\n value={selectedVersionId}\n onChange={(e) => setSelectedVersionId(e.target.value)}\n >\n {dropdownOptions.map(option => (\n <option key={option.value} value={option.value}>{option.label}</option>\n ))}\n </Form.Control>\n </Form.Group>\n </Row>\n </Container>\n )\n }\n\n function buildToolTip (tooltipProps, message) {\n return (\n <Tooltip\n {...tooltipProps}\n bsPrefix='DatasetApiDocs__tooltip'\n arrowProps={{ style: { display: 'none' } }}\n >\n {message}\n </Tooltip>\n )\n }\n\n function frequencyElement (datasetFrequency) {\n return (\n <div className='TooltipMouseOver'>\n <OverlayTrigger\n flip\n placement='bottom'\n overlay={e => buildToolTip(e, getTooltipBasedOnFrequency(datasetFrequency))}\n trigger={['hover', 'focus']}\n >\n <div>{datasetFrequency}<InfoIconFilledIn /></div>\n </OverlayTrigger>\n </div>\n )\n }\n\n function latestDataAvailableElement (datasetFrequency, newestVersion, selectedVersion, retired) {\n function buildElementWithTooltip (version) {\n return (\n <OverlayTrigger\n flip\n placement='bottom'\n overlay={e => buildToolTip(e, version.tooltip)}\n trigger={['hover', 'focus']}\n >\n <div className='TooltipMouseOver'>\n <div>{datasetVersionFormatter(datasetFrequency, getDatasetVersionValue(newestVersion))}</div>\n <div className='spacer'>|</div>\n <div>{version.label}<InfoIconFilledIn /></div>\n </div>\n </OverlayTrigger>\n )\n }\n const version = getDatasetVersionText(retired ? 'retired' : selectedVersion.fieldReReleaseSelect)\n return (\n <div>\n {version.display\n ? buildElementWithTooltip(version)\n : <div>{datasetVersionFormatter(datasetFrequency, getDatasetVersionValue(newestVersion))} </div>}\n </div>\n )\n }\n\n function renderDatasetMeta () {\n const datasetInformation = [\n { label: 'Dataset Type Identifier', value: latestUuid },\n { label: 'Dataset Version Identifier', value: selectedVersionId },\n { label: 'Data source', value: dataSource },\n { label: 'Frequency', value: frequencyElement(frequency) },\n { label: 'Latest data available', value: latestDataAvailableElement(frequency, newestVersion, selectedVersion, retired) },\n { label: 'Rows', value: numberWithCommas(get(selectedVersion, 'fieldRefPrimaryDataFile.fieldNumRows', '')) },\n { label: 'Columns', value: numberWithCommas(get(selectedVersion, 'fieldRefPrimaryDataFile.fieldNumColumns', '')) },\n { label: 'Created date', value: formatLastUpdatedDate(creationDate) },\n { label: 'Last updated date', value: formatLastUpdatedDate(getDatasetLastUpdatedDate(selectedVersion)) }\n ]\n\n return (\n <Container>\n <Row>\n <Col>\n <h3>Dataset Information</h3>\n <Table size='sm' bordered>\n <tbody>\n {datasetInformation.map(({ label, value }) => {\n return (\n <tr key={label}>\n <th>{label}</th>\n <td>{value}</td>\n </tr>\n )\n })}\n </tbody>\n </Table>\n </Col>\n </Row>\n </Container>\n )\n }\n\n function renderDatasetVersions () {\n return (\n <Container>\n <Row>\n <Col>\n <h3>Dataset Versions</h3>\n <Table size='sm' bordered>\n <thead>\n <tr>\n <th>Version</th>\n <th>UUID</th>\n </tr>\n </thead>\n <tbody>\n {filteredVersions.map((version, i) => {\n return (\n <tr key={i}>\n <td>{version?.fieldDatasetVersionCombined}</td>\n <td>{version.id}</td>\n </tr>\n )\n })}\n </tbody>\n </Table>\n </Col>\n </Row>\n </Container>\n )\n }\n\n function renderDatasetColumns () {\n const csvMeta = JSON.parse(get(selectedVersion, 'fieldRefPrimaryDataFile.fieldCsvMetadata', '{}'))\n const columns = csvMeta.csvColumnTypes || {}\n\n return (\n <Container>\n <Row>\n <Col>\n <h3>Dataset Columns</h3>\n <Table size='sm' bordered>\n <thead>\n <tr>\n <th>Column</th>\n <th>Type</th>\n </tr>\n </thead>\n <tbody>\n {Object.keys(columns).map(column => {\n return (\n <tr key={column}>\n <td className='columnNames'>{column}</td>\n <td>{columns[column]}</td>\n </tr>\n )\n })}\n </tbody>\n </Table>\n </Col>\n </Row>\n </Container>\n )\n }\n\n function renderSwagger (isMobile) {\n if (!apiSpecs) {\n return null\n }\n\n if (isMobile) {\n return null\n }\n\n const resultsApiPath = '/dataset/{uuid}/data'\n const apiPathSpec = apiSpecs.paths[resultsApiPath]\n\n const resultsApiComponentName = 'InteractiveDatasetParamUuidPath'\n const apiComponents = { ...apiSpecs.components }\n apiComponents.parameters[resultsApiComponentName].schema.example = selectedVersionId\n\n const datasetResultsSpec = {\n ...apiSpecs,\n components: apiComponents,\n paths: {\n [resultsApiPath]: apiPathSpec\n }\n }\n\n return (\n <Container>\n {isLoading && <LoadingCover />}\n {!isLoading && (\n <Row>\n <Col>\n <h3>Try the API</h3>\n <Suspense fallback={<LoadingCover />}>\n <SwaggerUI\n docExpansion='list'\n spec={datasetResultsSpec}\n />\n </Suspense>\n </Col>\n </Row>\n )}\n </Container>\n )\n }\n\n if (error) {\n return <ErrorPage error={error} />\n }\n\n return (\n <div className='DatasetApiDocsPage'>\n <MetaHead noCrawl metaTags={metaTags}>\n <title>{`${name}${metaOrganizationName}`}</title>\n <link rel='canonical' href={`${getOrigin()}${datasetPath}`} />\n </MetaHead>\n <ApiDocsHero\n header={`Access API for ${name}`}\n apiUrl={apiSpecs ? apiSpecs.servers[0].url : null}\n version={apiSpecs ? apiSpecs.info.version : null}\n oas={apiSpecs ? `OAS${apiSpecs.openapi.split('.')[0]}` : null}\n />\n {renderVersionDropdown()}\n <div className='DatasetApiDocsPage__content'>\n {renderDatasetMeta()}\n {renderDatasetVersions()}\n {renderDatasetColumns()}\n {renderSwagger(isMobile)}\n </div>\n <Footer />\n </div>\n )\n}\n\nDatasetApiDocsPage.propTypes = {\n versions: PropTypes.arrayOf(PropTypes.object),\n name: PropTypes.string,\n description: PropTypes.string,\n frequency: PropTypes.string,\n creationDate: PropTypes.string,\n dataSource: PropTypes.string,\n datasetPath: PropTypes.string,\n metaTags: PropTypes.array,\n latestUuid: PropTypes.string,\n history: PropTypes.object,\n retired: PropTypes.bool\n}\n\nexport default DatasetApiDocsPage\n","import React, { PureComponent } from 'react'\nimport { Route, Switch } from 'react-router-dom'\nimport PropTypes from 'prop-types'\nimport get from 'lodash/get'\nimport compose from '../../../hocs/compose'\nimport withBoundary from '../../../hocs/withBoundary/withBoundary'\nimport withAllDatasets from '../../../hocs/withAllDatasets/withAllDatasets'\nimport LoadingCover from '../../common/LoadingCover/LoadingCover'\nimport ErrorPage from '../ErrorPage/ErrorPage'\nimport DatasetPageModals from './DatasetPageModals'\nimport DatasetPage from './DatasetPage'\nimport DatasetInteractivePage from './DatasetInteractivePage'\nimport ChangelogPage from '../../pages/ChangelogPage/ChangelogPage'\nimport DatasetApiDocsPage from './DatasetApiDocsPage'\nimport {\n getDatasetById,\n getDatasetVersionsPages,\n getDownloadResources,\n getDatasetVersionResources\n} from '../../../services/api'\nimport { formatMetaTags } from '../../../services/formatters/global'\nimport {\n getDatasetUuid as getDatasetTypeUuid,\n getDatasetFrequency,\n getNewestDatasetVersion,\n urlEncodeFormattedVersionLabel,\n getCurrentVersionFromUrlString,\n backToDatasetOverview,\n getDatasetName,\n getDatasetDescription,\n getDatasetDataSource,\n getDatasetCreationDate\n} from '../../../utilities/datasetHelpers'\nimport { retainAccessToken } from '../../../utilities/linkHelpers'\nimport formatDatasetVersionDate from '../../../utilities/datasetVersionFormatter'\nimport config from '../../../config'\n\nconst { interactiveDatasetParam, changelogParam, apiDocsParam } = config\n\nclass DatasetPageContainer extends PureComponent {\n constructor (props) {\n super(props)\n\n this.state = {\n isLoading: true,\n data: null,\n versions: [],\n downloadResources: [],\n interactiveDataVersion: null,\n error: null\n }\n }\n\n get latestUuid () {\n const { slugResolveData } = this.props\n const uuid = get(slugResolveData, 'uuid')\n return uuid\n }\n\n get datasetUuid () {\n const { slugResolveData } = this.props\n const uuid = get(slugResolveData, 'current_dataset.uuid')\n return uuid\n }\n\n get datasetName () {\n const { slugResolveData } = this.props\n return get(slugResolveData, 'name')\n }\n\n get datasetPath () {\n const { match: { path } } = this.props\n return path\n }\n\n get datasetPageModalProps () {\n const {\n data,\n versions,\n downloadResources\n } = this.state\n\n const {\n history,\n match\n } = this.props\n\n return {\n data,\n versions,\n currentVersion: this.getSelectedVersion({ match }),\n downloadResources,\n history\n }\n }\n\n getSelectedVersion (routerProps) {\n const { versions } = this.state\n const { match: { params } } = routerProps\n const { version } = params\n\n let selectedVersion\n\n if (!version) {\n // use newest version if param is absent\n selectedVersion = getNewestDatasetVersion(versions)\n } else {\n // otherwise, calculate the selected version from the version url param\n selectedVersion = getCurrentVersionFromUrlString(version, versions)\n }\n\n return selectedVersion\n }\n\n isLatestVersion (version) {\n const { versions } = this.state\n const latestVersion = getNewestDatasetVersion(versions)\n return version.id === latestVersion.id\n }\n\n componentDidMount () {\n this.loadInitialData()\n }\n\n /**\n * Handles user navigating from interactive dataset back to overview page;\n * using history.replace() over .push() to avoid browser back button\n * on DatasetPage going back to InteractiveDatasetPage\n **/\n handleBackClick = () => {\n const datasetPath = this.datasetPath\n const { history } = this.props\n backToDatasetOverview(history, datasetPath)\n }\n\n // the user changed a version in the dropdown on the interactive page\n // fetch the new value's interactive data\n handleInteractiveVersionChange = (version) => {\n const { history } = this.props\n let updatedUrl\n\n if (this.isLatestVersion(version)) {\n updatedUrl = `${this.datasetPath}/${interactiveDatasetParam}`\n } else {\n const versionLabel = version.fieldDatasetVersionCombined\n const urlFormattedLabel = urlEncodeFormattedVersionLabel(versionLabel)\n updatedUrl = `${this.datasetPath}/${interactiveDatasetParam}/${urlFormattedLabel}`\n }\n\n updatedUrl = retainAccessToken(updatedUrl)\n\n // only fetch if a change was made\n if (updatedUrl !== history.location.pathname) {\n // preserve location state to maintain pageReferrer\n history.replace(updatedUrl, history.location.state)\n this.setState({\n ...this.state\n })\n }\n }\n\n async loadInitialData () {\n this.setState({\n data: null,\n isLoading: true,\n error: null\n })\n\n try {\n const [res, versions, resources] = await Promise.all([\n getDatasetById(this.datasetUuid),\n getDatasetVersionsPages(this.datasetName),\n getDatasetVersionResources(this.datasetUuid)\n ])\n\n while (versions.next) {\n let page = {}\n page = await getDatasetVersionsPages(this.datasetName, versions.next)\n versions.versionsWithTypes = [...versions.versionsWithTypes, ...page.versionsWithTypes]\n versions.next = page.next\n }\n const [data, included] = res\n versions.versionsWithTypes = versions.versionsWithTypes.map(version => {\n version.fieldDatasetVersionSuffix = ''\n if (version.fieldReReleaseSelect === 'off-cycle') {\n version.fieldDatasetVersionSuffix = ' oc' + version.fieldReReleaseVersion\n } else if (version.fieldReReleaseSelect === 'amended') {\n version.fieldDatasetVersionSuffix = ' a' + version.fieldReReleaseVersion\n }\n const datasetFrequency = getDatasetFrequency(data)\n version.fieldDatasetVersionCombined = formatDatasetVersionDate(datasetFrequency, version?.fieldDatasetVersion) + version?.fieldDatasetVersionSuffix\n\n return version\n })\n\n const datasetTypeUuid = getDatasetTypeUuid(data)\n const downloadResources = await getDownloadResources(datasetTypeUuid)\n\n this.setState({\n data: data,\n included: included,\n versions: versions.versionsWithTypes,\n resources: resources,\n downloadResources: downloadResources,\n isLoading: false,\n error: null\n })\n } catch (error) {\n this.setState({\n isLoading: false,\n error: error\n })\n }\n }\n\n renderDatasetOverview = (routerProps) => {\n const { allDatasets } = this.props\n const {\n data,\n included,\n versions,\n resources\n } = this.state\n\n // ensure proper label displays in modal by nullifying currentVersion\n const modalProps = {\n ...this.datasetPageModalProps,\n currentVersion: null\n }\n\n return (\n <DatasetPageModals {...modalProps}>\n <DatasetPage\n data={data}\n included={included}\n resources={resources}\n versions={versions}\n history={routerProps.history}\n allDatasets={allDatasets}\n datasetUrlPath={this.datasetPath}\n />\n </DatasetPageModals>\n )\n }\n\n renderInteractiveDataset = (routerProps) => {\n const {\n data,\n versions\n } = this.state\n\n const selectedVersion = this.getSelectedVersion(routerProps)\n\n return (\n <DatasetPageModals {...this.datasetPageModalProps}>\n <DatasetInteractivePage\n currentVersion={selectedVersion}\n data={data}\n versions={versions}\n onVersionChange={this.handleInteractiveVersionChange}\n onBackClick={this.handleBackClick}\n datasetUrlPath={this.datasetPath}\n onReset={this.handleResetClick}\n history={this.props.history}\n location={this.props.location}\n />\n </DatasetPageModals>\n )\n }\n\n renderChangelog = () => {\n const { slugResolveData } = this.props\n\n return (\n <ChangelogPage slugResolveData={slugResolveData} />\n )\n }\n\n renderApiDocs = () => {\n const {\n data,\n versions\n } = this.state\n\n const retired = get(data, 'fieldDatasetType.fieldTermRetired')\n\n const props = {\n versions,\n name: getDatasetName(data),\n description: getDatasetDescription(data),\n frequency: getDatasetFrequency(data),\n creationDate: getDatasetCreationDate(data),\n datasetPath: this.datasetPath,\n dataSource: getDatasetDataSource(data),\n metaTags: formatMetaTags(get(data, 'metatagNormalized', [])),\n latestUuid: this.latestUuid,\n history: this.props.history,\n retired\n }\n return (\n <DatasetApiDocsPage {...props} />\n )\n }\n\n render () {\n const {\n isLoading,\n error\n } = this.state\n\n if (error) {\n return <ErrorPage error={error} />\n } else if (isLoading) {\n return <LoadingCover />\n }\n\n const datasetPath = this.datasetPath\n\n return (\n <Switch>\n <Route\n exact\n path={datasetPath}\n render={this.renderDatasetOverview}\n />\n <Route\n exact\n path={`${datasetPath}/${changelogParam}`}\n render={this.renderChangelog}\n />\n <Route\n exact\n path={[\n `${datasetPath}/${interactiveDatasetParam}`,\n `${datasetPath}/${interactiveDatasetParam}/:version`\n ]}\n render={this.renderInteractiveDataset}\n />\n <Route\n exact\n path={`${datasetPath}/${apiDocsParam}`}\n render={this.renderApiDocs}\n />\n </Switch>\n )\n }\n}\n\nDatasetPageContainer.propTypes = {\n slugResolveData: PropTypes.object,\n history: PropTypes.shape({\n goBack: PropTypes.func,\n location: PropTypes.shape({\n pathname: PropTypes.string,\n state: PropTypes.object\n }),\n push: PropTypes.func,\n replace: PropTypes.func\n }),\n location: PropTypes.object,\n match: PropTypes.object,\n allDatasets: PropTypes.array\n}\n\nexport default compose(\n withBoundary,\n withAllDatasets\n)(DatasetPageContainer)\n"],"names":["_ref","header","apiUrl","leftColOffset","version","oas","showApiButton","isMobile","useDisplayContext","_jsx","className","children","_jsxs","ComponentShell","Text","typeFace","extractRelativePath","NumberCallouts","_ref2","callouts","cleanCallouts","map","fieldNumCalloutDatatype","suffix","fieldNumCalloutNumber","value","fieldNumCalloutShortDesc","title","fieldNumCalloutIsDollarAmt","isDollar","getCallouts","_ref3","i","prefix","defaultProps","ResourceHero","props","resources","topic","fileDownloadUrl","lastUpdated","hasResources","isEmpty","isMultiResourceDisplay","length","renderDownloadButton","LinkHandler","variant","href","target","DownToLineIcon","renderUpdatedDateDisplay","cx","ResourceHero__updated","hasButtonSibling","bottomMargin","_Fragment","dayjs","format","renderInnerRightContent","DatasetCard","heading","footer","date","slug","renderCarouselControls","carouselData","numOfVisibleSlides","ButtonBack","CarouselArrow","size","direction","DotGroup","showAsSelectedForCurrentSlideOnly","renderDots","numOfSlides","step","Array","Math","ceil","fill","v","slide","Dot","ButtonNext","ResourceHero__multi_resource","domElement","ResourceSmallCarousel","isDatasetCarousel","useVisibleSlidesAsStep","renderControls","controls","renderedResources","resource","ResourceHeroLoading","SmallBanner","text","bgImgPath","cssClassOverride","style","backgroundImage","Container","fluid","Row","Col","md","apiSite","apiDocsParam","config","commonSelectProps","classNamePrefix","components","DropdownIndicator","SortDownIcon","isClearable","isSearchable","isMulti","AccessApiModal","React","constructor","super","inputRef","memoizedExcludedDatasetVersions","memoize","excludeNonInteractiveDatasetVersions","handleShowModal","this","selectInitialVersion","handleSelectVersion","setState","selectedVersion","handleCopyClick","current","select","document","execCommand","state","uuid","isLatest","datasetUuid","id","versions","index","versionOptions","label","fieldDatasetVersionCombined","versionDropdownTitle","selectedVersionValue","componentDidUpdate","prevProps","prevState","currentVersion","getNewestDatasetVersion","renderVersionDropdown","FormLabel","Select","options","onChange","renderApiEndpointInputGroup","JSONvalue","ref","readOnly","CopyButton","onClick","render","_history$location","show","onHide","datasetName","datasetUrlPath","isDesktop","isMobileDevice","history","linkUrl","isPreviewUrl","Modal","onShow","centered","Header","Title","ModalCloseButton","Body","lg","routerData","search","location","isClicked","setIsClicked","useState","useEffect","clicked","e","handleClick","datasetFrequency","DatasetPageModals","PureComponent","arguments","doIfAgreed","async","getUserAgreementStatus","data","getDatasetUuid","licenseAgreement","getDatasetLicenceAgreement","hasAgreed","callback","handleViewDataClick","goToLatestVersion","handleVersionLinkClick","preventDefault","goToVersion","isLatestVersion","getDatasetFrequency","versionLabelUrl","getVersionLabelUrl","urlString","pathname","retainAccessToken","push","pageReferrer","DATASET_PAGE_REFERRER","handleDownloadClick","openDatasetDownloadModal","showMobileDownloadModal","downloadResources","dataset","handleAccessApiClick","openAccessApiModal","newestVersion","additionalProps","onDownloadClick","onAccessApiClick","onViewDataClick","onVersionLinkClick","child","compose","withDisplayContext","withUserAgreementModal","Component","WrappedComponent","WithApiAccessModal","isOpen","payload","closeAccessApiModal","handleCloseAccessApiModal","getDatasetName","getDatasetUrlPath","withAccessApiModal","withDatasetDownloadModal","SubscribeIcon","xmlns","width","height","fillRule","d","formatLastUpdatedDate","lastUpdatedDate","formatLatestVersion","updateFrequency","latestVersion","retired","getDatasetVersionText","fieldReReleaseSelect","display","datasetVersionFormatter","getDatasetVersionValue","DatasetVersionIcon","tooltip","icon","dataSource","description","govDeliverySubscriptionLink","name","navInfo","onSubscribe","category","subtopic","circleBackground","Breadcrumb","Item","active","CaretLeftRightIcon","color","getTooltipBasedOnFrequency","DataIcon","xmlnsXlink","transform","xlinkHref","mask","AccessIcon","_path","Object","assign","source","key","prototype","hasOwnProperty","call","apply","SvgList","svgRef","titleId","viewBox","handlerValues","onVisualizeDataClick","handlerIcons","ListIcon","DataBar","thisRef","buttonHandlers","isSingleButton","keys","reduce","collection","handlerKey","colProps","singleButton","Button","trackDataBarClick","window","utag","trackIntendedDownloadClick","innerHTML","Dropdown","Toggle","as","DropdownToggle","Menu","drop","flip","forwardRef","open","Callout","dataId","dataViewerParams","setValue","calloutSuffix","setCalloutSuffix","res","getLookupToolData","get","formula","match","exec","result","replace","parser","parse","fetchData","HelpDeskContact","contactLink","subjectLine","shortDescription","contactHref","getContactHref","datasetRelatedParentLabel","datasetRelatedGrandparentLabel","datasetRelatedDisplayLimit","buildCardData","take","item","compareDates","a","b","last_updated","getTopViewed","sort","views","slice","getLastUpdated","topicHierarchy","subtopics","topics","viewAllRouterData","sections","hasMoreToView","items","searchSort","renderedItems","renderSectionItems","changelogParam","datasetPrivacyLevelDictionary","DatasetDetails","created","currentSlug","email","privacyLevel","tags","renderedVersions","hideChangeLogLink","allTagsList","acc","tagParent","filter","tag","createdDateString","changeLogLink","updatedDateString","friendlyPrivacyLevel","CircleInfoIcon","rel","getSearchPagePath","encodeSearchPageQueryString","keywords","renderVersions","datasetVersionDisplayLimit","DatasetDetailsVersions","allVersionsDisplayed","moreAreAvailable","buildMouseOver","message","OverlayTrigger","placement","overlay","buildToolTip","tooltipProps","Tooltip","bsPrefix","arrowProps","trigger","InfoIconFilledIn","buildFormattedVersionList","raw","formattedVersion","fieldDatasetVersionSuffix","hasFile","fieldRefPrimaryDataFile","versionObj","handleToggleVersions","componentDidMount","formattedVersions","buildListLink","getVersionUrl","isDatasetVersionInteractive","buildListColumns","leftColumn","rightColumn","versionsToDisplay","mappedVersion","versionObjToIndex","forEach","obj","sortedVersions","getSortedDatasetVersions","versionObjMap","_obj$versionObj","sortedObjects","sortedVersion","SimpleBar","forceVisible","autoHide","interactiveDatasetParam","metaOrganizationName","memoizeOne","_getNewestDatasetVersion","memoizedGetNavigationalHierarchy","getNavigationalHierarchy","memoizedParseRelatedDatasets","parseRelatedDatasets","memoizedGetAllTags","getAllTags","oldTags","newTags","JSON","stringify","memoizedFormatVisualizations","formatVisualizationList","DatasetPage","viewDataRef","createRef","datasetPageRef","visualizationRef","startRef","stopRef","handleScrollToDataBar","offsetTop","scroll","top","left","behavior","handleOnSubscribe","subscriptionLink","focus","buildNavigationalHierarchy","rawNavInfo","getRenderedVersions","fieldUpdateFrequency","renderDatasetSection","section","_toolsCallout$fieldIn","_toolsCallout$fieldIn2","_toolsCallout$fieldIn3","_toolsCallout$fieldIn4","_toolsCallout$fieldIn5","_toolsCallout$fieldIn6","_toolsCallout$fieldIn7","_toolsCallout$fieldIn8","included","sectionId","fieldSummary","fieldPrivacyLevel","allTags","fieldPgDataCallouts","fieldContactHeader","fieldContactDepartmentName","fieldRefContactEmail","fieldParaFaq","fieldLatestChangeItem","fieldContactShortDescription","hasSubscriptionLink","getDatasetLastUpdatedDate","visualizationListProps","toolsCallout","hasToolsCallout","toolsDescription","toolsTitle","toolsCtaText","toolsCtaLink","customToolImage","fieldInternalPage","fieldRefBackgroundImage","fieldMobileImage","uri","url","fieldCalloutImage","toolsImage","hasStaticCallouts","fieldRefNumberCallout","hasDynamicCallouts","fieldPgDataCalloutWrapper","dynamicCallouts","formatDynamicCallouts","RichTextField","content","DynamicNumberCallouts","btnText","DatasetResources","getDatasetResourcesHeader","getDatasetResourcesDescription","showAdditionalResources","VisualizationList","isLargeHeaderFont","isNestedComponent","getDatasetCreationDate","fieldContactEmail","hasFaqs","FaqsList","faqs","parsedRelatedDatasets","shouldDisplay","DatasetRelated","getDefaultSubjectLineForContent","renderNav","sectionRefs","currentSectionId","ContentPageNav","inverseRefs","visualization","related","onVisualizationClick","scrollIntoView","block","hasDataFileInNewestVersion","getDatasetVersionPrimaryDataFile","newestVersionIsStatic","primaryDataFile","datasetTypeUuid","getDatasetTypeUuid","logDatasetView","allDatasets","parsed","pageSections","hasVisualization","visualizationBackground","fieldDescription","pageTitle","dataSourceName","metaTags","formatMetaTags","MetaHead","BackToTopBtn","DatasetHero","ContentPageLayout","renderSection","Footer","DatasetPageEnhanced","DatasetVersionDropdown","isSelected","onSelectVersion","renderedVersionOptions","versionLabel","eventKey","hasMultipleVersions","VersionDropdownToggle","disabled","ClipboardCopyBtn","defaultLabel","confOpts","btnOpts","setLabel","isTooltipVisible","setIsTooltipVisible","useRef","timer","navigator","clipboard","writeText","then","clearTimeout","type","msg","setTimeout","duration","undefined","Overlay","rootCloseEvent","rootClose","tooltipId","isLoading","error","hasDisplayableResources","featuredResourceTypes","values","FEATURED_RESOURCE_TYPES","includes","some","showOnResourcesSection","LoadingSpinner","textAlign","featuredTitle","shallowCompare","obj1","obj2","every","automaticReloadProps","checkForStatsUpdateTrigger","previousProps","nextProps","prev","pick","next","DataReloadTrigger","onReloadTriggered","shouldRequestStats","isInitialLoad","automaticReloadTriggered","datasetVersionId","SvgMagnifyingGlass","SvgSort","ColumnConfigurator","originalColumns","initialColumns","_initialColumns","onApply","schemaLookUp","useMemo","cloneDeep","columns","setColumns","searchInputValue","setSearchInputValue","filteredColumns","formattedInputValue","trim","toLowerCase","column","indexOf","isAllSelected","isVisible","isSomeSelected","isNoneSelected","resetColumns","col","renderColumns","Draggable","draggableId","provided","snapshot","_provided$draggablePr","_provided$draggablePr2","_provided$dragHandleP","_provided$dragHandleP2","_provided$dragHandleP3","_schemaLookUp$column$","isDragging","innerRef","draggableProps","onTransitionEnd","tabIndex","dragHandleProps","role","draggable","Checkbox","containerClassName","checked","idToUpdate","updatedColumns","handleColumnVisibleToggle","SortIcon","DragDropContext","onDragEnd","destination","sourceIndex","destinationIndex","array","updated","removed","splice","moveItemInArray","handleDragEnd","placeholder","handleSearchInputChange","MagnifyingGlassIcon","isIndeterminate","indeterminate","toString","filteredColumnIds","handleToggleSelectAll","htmlFor","renderSelectAll","Droppable","droppableId","draggingOver","isDraggingOver","droppableProps","hasChanged","isEqual","ColumnConfiguratorModal","onRequestClose","configuratorProps","showModal","onToggleClick","onExportClick","exportUrls","csvFileSize","maxURLParamsLength","isCsvSelected","setIsCsvSelected","trimmedDownExportUrls","getTrimmedDownIdsExportUrls","Alert","csv","csvExcel","trackExportInteractiveData","formatBytes","generateExportUrl","getInteractiveDataApiPath","buildInteractiveDataQueryString","setColumnOrder","setHiddenColumns","headers","filters","visibleColumns","onColumnConfigChange","onRequestSearch","isFilterOpen","onFilterClick","setFilterButtonRef","isFullScreen","onUserInputChange","filtersList","list","inputKeywords","setInputKeywords","isInvalid","setInvalid","isDataExportModalOpen","setDataExportModalOpen","isConfiguratorModalOpen","setConfiguratorModalOpen","handleSearch","trackInteractiveDataSearch","areFiltersActive","activeFilterCount","curr","conditions","originalColumnIdsSting","visibleColumnIds","isColumnsDisplayAltered","cols","isModifiedExportAvailable","sortBy","sortOrder","columnsParamValue","exportUrlParams","filterCountLabel","visuallyHidden","FormControl","keyword","handleInputChange","onKeyPress","handleInputKeyPress","isActive","trackInteractiveDataClick","FilterIcon","DataExportModal","downloadUrl","logDatasetDownload","trackDownloadExportClick","innerText","handleExportClick","updatedColumnOrderIds","updatedHiddenColumnIds","handleApplyColumnConfig","el","createOption","MultiValueTextInput","getStyles","menuPortal","zIndex","menu","marginTop","marginBottom","showMenu","lineHeight","handleChange","actionMeta","safeValue","inputValue","handleKeyDown","event","_this$props","_this$props2","handleTextboxCustomKeydown","defaultValue","bind","CreatableSelect","onInputChange","onKeyDown","formatCreateLabel","val","styles","menuPlacement","menuPortalTarget","filterFormConjunctions","conjunctions","filterFormPlaceholders","placeholders","isDisabled","FormGroup","conjunction","body","option","minWidth","filterFormComparators","comparatorsOrig","filterFormInputsDisabledByComparator","inputsDisabledByComparator","filterFormInputsMultiValue","multivalueComparators","filterFormInputRangeValue","rangeValueComparators","comparators","columnSelectList","hasMultipleFilters","isGroup","onClearFilterClick","onInnerConjunctionChange","rowIndex","comparator","filterValue","isRemoveVisible","memoizedClearFilterClick","useCallback","startDate","setStartDate","endDate","setEndDate","noTextInputRequired","isTextInputDisabled","isBasicMobileDividerShowing","isMultiValueField","isRangeValueField","localChangeHandler","change","changeValue","_current$filterValue","_current$filterValue2","update","renderDatePicker","dateObject","isEndDate","dateString","selectedValue","Date","DatePicker","selected","toISOString","dateFormat","placeholderText","yearItemNumber","formatWeekDay","nameOfDay","charAt","showMonthDropdown","showYearDropdown","showDisabledMonthNavigation","typeIsDate","_column$type","columnInDropdown","find","c","_columnInDropdown$typ","isDateType","FilterFormConjunctionDropdown","input","CloseIcon","strokeWidth","group","groupKey","groupNumber","handleAddFilter","handleRemoveFilterGroup","handleChangeConjunction","handleChangeRootConjunction","handleClearFilter","hasMultipleFilterGroups","isLastGroup","rootConjunction","selectList","handleAddFilterClick","handleInnerConjunctionChange","handleOuterConjunctionChange","handleGroupChange","handleRemoveFilterGroupClick","handleRemoveFilterRowClick","conditionKey","groupIsDirty","condition","FilterRow","onOuterConjunctionChange","PlusIcon","useCommon","onClearAll","onUpdate","handleClearAllClick","newAdvancedFilterGroup","filterKeys","FilterFormAdvancedButtons","onApplyFiltersClick","handleAddFilterGroupClick","newFilterState","handleApplyClick","hasMultipleFiltersInAGroup","isAllDataPresent","onConjunctionChange","FilterGroup","newBasicFilter","newFilters","targetGroup","targetIndex","findIndex","newTargetGroup","FilterFormBasicButtons","handleAddNewFilter","isArray","f","newBasic","handleClearFilterClick","mobileFilterOptions","initialFilters","windowWidth","isFiltersDisplayedInModal","formState","setFormState","areFiltersEmpty","activeFilter","appliedTab","headerCell","_schemaLookUp$headerC","_schemaLookUp$headerC2","_schemaLookUp$headerC3","handleUpdate","handleFilterTypeSelect","tab","stopPropagation","handleTabSelectBasic","handleTabSelectAdvanced","handleMobileSelectChange","selection","handleClearAll","queryReadyFilters","advanced","basic","basicFilterProps","selected_filters","join","selected_manage_columns","trackInteractiveFiltersClick","advancedFilterProps","advancedList","isBasicActive","isAdvancedActive","renderContent","Tab","activeKey","Nav","Link","Content","Pane","FilterFormBasic","FilterFormAdvanced","arrowTopStyles","filterButtonRef","x","getBoundingClientRect","coreCalculation","determineArrowPosition","position","right","marginLeft","marginRight","loadResources","getDatasetVersionResources","generateHardCodedOpenGraphTags","origin","getOrigin","titles","changelog","interactiveDataset","descriptions","property","defaultQueryParams","limit","offset","initialSearchParams","params","isMalformed","initialUserSelection","initialUrlError","isError","errorMsg","errorType","initialFiltersFormState","onVersionChange","onBackClick","maxUrlLength","prevDatasetVersionId","setPrevDatasetVersionId","colChangedCounter","setColChangedCounter","statsRequestToken","getCancelToken","resultsRequestToken","tableSectionRef","getContactLink","fieldCsvMetadata","isLoadingResources","resourcesError","useLoadDatasetVersionResources","searchParams","setSearchParams","fallbackParams","rawParams","queryString","query","metadata","validColumns","csvColumnTypes","areColumnNamesInSearchParamsValid","getParsedQueryParams","userSelections","setUserSelections","selectedColumns","dataState","setDataState","isLoadingStats","interactiveData","interactiveDataMeta","interactiveDataStats","dataHeaders","columnTypes","columnFormatting","tableSchema","_tableSchema$i","dataRows","numOfTotalResults","parseInt","numOfFoundResults","reactTableProps","useReactTableProps","headerGroups","getTableProps","getTableBodyProps","rows","prepareRow","isInitiallyLoading","isRefreshingData","shouldDisplayError","urlError","setUrlError","currentKeywords","setCurrentKeywords","currentFiltersFormState","setCurrentFiltersFormState","convertFilterParamsToFormState","isResettable","setIsResettable","isUrlParamsLocked","setIsUrlParamsLocked","handleVersionChange","handleOnReset","handleUrlUpdate","console","debug","newHistory","accessToken","isFormResettable","handleSetFilters","updatedFilters","_queryString$parse","_Array$from","paramCount","from","URLSearchParams","isLinkCopyable","_queryString$parse2","_Array$from2","locationNotEmpty","getUrlDataViewerRequestLength","trackInteractiveDataResetView","toggleFilterForm","closeFilterForm","handleBackButtonClick","savedUserSelections","savedKeywords","savedFiltersFormState","refreshResults","cancel","response","getInteractiveData","token","meta","updatedMeta","convertDataToObjectArray","isCancellationError","refreshTableRows","updatedStats","getInteractiveDataStats","refreshStats","optimizeFiltersForIdsQueryString","addEventListener","removeEventListener","classList","add","remove","hiddenColumnIds","orederedColumns","updateColumnSelection","fullScreen","initialLoading","noCrawl","currentDropdownVersion","renderHeaderSection","LoadingCover","DataTableStatusBar","onSetLimit","handleSetLimit","updatedLimit","getAdjustedOffset","onSetFullScreen","handleSetFullScreen","updatedIsFullScreen","DataTableToolbar","handleColumnConfigChange","columnIds","handleRequestSearch","updatedKeywords","node","DataTableFiltersForm","trackInteractiveDataCopyFilteredView","Heading","TriangleExclamationIcon","DataTable","onSetSort","handleSetSort","updatedSort","InputPagination","total","onUpdateOffset","updatedOffset","currentScrollTop","pageYOffset","scrollTo","handleUpdateOffset","InteractiveDataResources","ContactBanner","advancedFormat","ChangeLogItem","summary","hasSummary","hasNoSummary","ChangelogSection","expanded","expandable","listRef","handleExpansionToggle","clientHeight","groupedItems","groupKeys","_createElement","ChangelogSectionLoading","withBoundary","slugResolveData","datasetTypeId","setChangelog","contactInfo","datasetCard","getChangelogData","getChangelog","getChangelogDetails","fieldLastUpdatedDate","fieldDatasetType","getDatasetInfo","path","alias","getData","Promise","all","results","contact","sorted","changeDate","grouped","groupBy","year","scrollTopOffset","aggregate","changeItem","changed","changeSummary","reverse","ContentPageNavLoading","release","released","SwaggerUI","frequency","creationDate","datasetPath","latestUuid","apiSpecs","setApiSpecs","setUiState","filteredVersions","selectedVersionId","setSelectedVersionId","latestDataAvailableElement","buildElementWithTooltip","getApiDocsInfo","catch","err","ErrorPage","ApiDocsHero","servers","info","openapi","split","dropdownOptions","noBs","Form","Group","Label","Control","custom","datasetInformation","numberWithCommas","Table","bordered","renderDatasetMeta","renderDatasetColumns","resultsApiPath","apiPathSpec","paths","apiComponents","parameters","schema","example","datasetResultsSpec","Suspense","fallback","docExpansion","spec","renderSwagger","DatasetPageContainer","handleBackClick","backToDatasetOverview","handleInteractiveVersionChange","updatedUrl","urlFormattedLabel","urlEncodeFormattedVersionLabel","renderDatasetOverview","routerProps","modalProps","datasetPageModalProps","renderInteractiveDataset","getSelectedVersion","DatasetInteractivePage","onReset","handleResetClick","renderChangelog","ChangelogPage","renderApiDocs","getDatasetDescription","getDatasetDataSource","DatasetApiDocsPage","interactiveDataVersion","getCurrentVersionFromUrlString","loadInitialData","getDatasetById","getDatasetVersionsPages","page","versionsWithTypes","fieldReReleaseVersion","formatDatasetVersionDate","fieldDatasetVersion","getDownloadResources","Switch","Route","exact","withAllDatasets"],"sourceRoot":""}