terriajs
Version:
Geospatial data visualization platform.
283 lines (263 loc) • 10.1 kB
JSX
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.
*/
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);