UNPKG

terriajs

Version:

Geospatial data visualization platform.

283 lines (263 loc) 10.1 kB
import { observer } from "mobx-react"; import PropTypes from "prop-types"; import { Component, Fragment } from "react"; import { Trans, withTranslation } from "react-i18next"; import defined from "terriajs-cesium/Source/Core/defined"; import Box from "../../Styled/Box"; import Button from "../../Styled/Button"; import Collapsible from "../Custom/Collapsible/Collapsible"; import parseCustomMarkdownToReact from "../Custom/parseCustomMarkdownToReact"; import DataPreviewSections from "./DataPreviewSections"; import ExportData from "./ExportData"; import Styles from "./mappable-preview.scss"; import MetadataTable from "./MetadataTable"; import WarningBox from "./WarningBox"; /** * CatalogItem description. */ @observer class Description extends Component { static propTypes = { item: PropTypes.object.isRequired, printView: PropTypes.bool, t: PropTypes.func.isRequired }; renderDescription(catalogItem) { if (catalogItem.type === "wms") { return ( <p key="wms-description"> <Trans i18nKey="description.wms"> This is a <a href="https://en.wikipedia.org/wiki/Web_Map_Service" target="_blank" rel="noopener noreferrer" > WMS service </a> , which generates map images on request. It can be used in GIS software with this URL: </Trans> </p> ); } else if (catalogItem.type === "wfs") { return ( <p key="wfs-description"> <Trans i18nKey="description.wfs"> This is a <a href="https://en.wikipedia.org/wiki/Web_Feature_Service" target="_blank" rel="noopener noreferrer" > WFS service </a> , which transfers raw spatial data on request. It can be used in GIS software with this URL: </Trans> </p> ); } return null; } render() { const { t } = this.props; const catalogItem = this.props.item; // Make sure all data and metadata URLs have `url` set const metadataUrls = catalogItem.metadataUrls?.filter((m) => m.url); const dataUrls = catalogItem.dataUrls?.filter((m) => m.url); return ( <div className={Styles.description} css={` a, a:visited { color: ${(p) => p.theme.colorPrimary}; } `} > {catalogItem.isExperiencingIssues && ( <WarningBox>{t("preview.mayBeExperiencingIssues")}</WarningBox> )} {catalogItem.description && catalogItem.description.length > 0 && ( <div> <h4 className={Styles.h4}>{t("description.name")}</h4> {parseCustomMarkdownToReact(catalogItem.description, { catalogItem: catalogItem })} </div> )} {catalogItem.hasLocalData && <p>{t("description.dataLocal")}</p>} {!catalogItem.hasLocalData && !catalogItem.hasDescription && !catalogItem.hideDefaultDescription && ( <p>{t("description.dataNotLocal")}</p> )} {metadataUrls && metadataUrls.length > 0 && ( <> <h4 className={Styles.h4}>{t("description.metadataUrls")}</h4> {metadataUrls.map((metadataUrl, _i) => ( <Box paddedVertically key={metadataUrl.url}> <a href={metadataUrl.url} target="_blank" rel="noopener noreferrer" className={`${Styles.link} description-metadataUrls`} css={` color: ${(p) => p.theme.colorPrimary}; `} > {metadataUrl.title && ( <Button primary>{metadataUrl.title}</Button> )} {!metadataUrl.title ? metadataUrl.url : null} </a> </Box> ))} </> )} <DataPreviewSections metadataItem={catalogItem} /> {catalogItem.dataCustodian && catalogItem.dataCustodian.length > 0 && ( <div> <h4 className={Styles.h4}>{t("description.dataCustodian")}</h4> {parseCustomMarkdownToReact(catalogItem.dataCustodian, { catalogItem: catalogItem })} </div> )} {!catalogItem.hideSource && ( <> {catalogItem.url && ( <> <h4 className={Styles.h4}>{catalogItem.typeName} URL</h4> {this.renderDescription(catalogItem)} {this.props.printView ? ( <code>{catalogItem.url}</code> ) : ( <input readOnly className={Styles.field} type="text" value={catalogItem.url} onClick={(e) => e.target.select()} /> )} {catalogItem.type === "wms" || (catalogItem.type === "esri-mapServer" && defined(catalogItem.layers) && ( <p key="wms-layers"> {t("description.layerName")} {(catalogItem.layers || "").split(",").length > 1 ? "s" : ""} : {catalogItem.layers} </p> ))} {catalogItem.type === "wfs" && ( <p key="wfs-typeNames"> {t("description.typeName")} {(catalogItem.typeNames || "").split(",").length > 1 ? "s" : ""} : {catalogItem.typeNames} </p> )} </> )} {dataUrls && dataUrls.length > 0 && ( <> <h4 className={Styles.h4}>{t("description.dataUrl")}</h4> {dataUrls.map( (dataUrl, _i) => (dataUrl.type?.startsWith("wfs") || dataUrl.type?.startsWith("wcs")) && ( <Fragment key={dataUrl.url}> {dataUrl.type?.startsWith("wfs") && parseCustomMarkdownToReact( t("description.useLinkBelow", { link: ` <a href="http://docs.geoserver.org/latest/en/user/services/wfs/reference.html" target="_blank" rel="noopener noreferrer" key="wfs" > Web Feature Service (WFS) documentation </a> ` }) )} {dataUrl.type?.startsWith("wcs") && parseCustomMarkdownToReact( t("description.useLinkBelow", { link: ` <a href="http://docs.geoserver.org/latest/en/user/services/wcs/reference.html" target="_blank" rel="noopener noreferrer" key="wms" > Web Coverage Service (WCS) documentation </a> ` }) )} <Box paddedVertically key={dataUrl.url}> <a href={dataUrl.url} target="_blank" rel="noopener noreferrer" className={`${Styles.link} description-dataUrls`} css={` color: ${(p) => p.theme.colorPrimary}; `} > {dataUrl.title && ( <Button primary>{dataUrl.title}</Button> )} {!dataUrl.title ? dataUrl.url : null} </a> </Box>{" "} </Fragment> ) )} </> )} {!this.props.printView && defined(catalogItem.metadata) && ( <> {defined(catalogItem.metadata.dataSourceMetadata) && catalogItem.metadata.dataSourceMetadata.items.length > 0 && ( <div className={Styles.metadata}> <Collapsible title={t("description.dataSourceDetails")} isInverse > <MetadataTable metadataItem={catalogItem.metadata.dataSourceMetadata} /> </Collapsible> </div> )} {defined(catalogItem.metadata.dataSourceMetadata) && catalogItem.metadata.dataSourceMetadata.items.length > 0 && ( <div className={Styles.metadata}> <Collapsible title={t("description.dataServiceDetails")} isInverse > <MetadataTable metadataItem={catalogItem.metadata.serviceMetadata} /> </Collapsible> </div> )} </> )} </> )} {!this.props.printView ? <ExportData item={catalogItem} /> : null} </div> ); } } export default withTranslation()(Description);