UNPKG

terriajs

Version:

Geospatial data visualization platform.

139 lines (125 loc) 4.19 kB
import createReactClass from "create-react-class"; import dateFormat from "dateformat"; import { observer } from "mobx-react"; import PropTypes from "prop-types"; import React from "react"; import { withTranslation } from "react-i18next"; import defined from "terriajs-cesium/Source/Core/defined"; import JulianDate from "terriajs-cesium/Source/Core/JulianDate"; import CommonStrata from "../../../Models/Definition/CommonStrata"; import withControlledVisibility from "../../HOCs/withControlledVisibility"; import CesiumTimeline from "./CesiumTimeline"; import { formatDateTime } from "./DateFormats"; import DateTimePicker from "./DateTimePicker"; import Styles from "./timeline.scss"; import TimelineControls from "./TimelineControls"; export const Timeline = observer( createReactClass({ displayName: "Timeline", propTypes: { terria: PropTypes.object.isRequired, locale: PropTypes.object, t: PropTypes.func.isRequired }, getInitialState() { return { isPickerOpen: false }; }, componentDidMount() { this.props.terria.timelineStack.activate(); }, componentWillUnmount() { this.props.terria.timelineStack.deactivate(); }, changeDateTime(time) { this.props.terria.timelineClock.currentTime = JulianDate.fromDate( new Date(time) ); this.props.terria.timelineStack.syncToClock(CommonStrata.user); this.props.terria.currentViewer.notifyRepaintRequired(); }, onOpenPicker() { this.setState({ isPickerOpen: true }); }, onClosePicker() { this.setState({ isPickerOpen: false }); }, render() { const terria = this.props.terria; const catalogItem = terria.timelineStack.top; if ( !defined(catalogItem) || !defined(catalogItem.currentTimeAsJulianDate) ) { return null; } const { t } = this.props; const jsDate = JulianDate.toDate(catalogItem.currentTimeAsJulianDate); const timelineStack = this.props.terria.timelineStack; let currentTime; if (defined(timelineStack.top) && defined(timelineStack.top.dateFormat)) { currentTime = dateFormat( jsDate, this.props.terria.timelineStack.top.dateFormat ); } else { currentTime = formatDateTime(jsDate, this.props.locale); } const discreteTimes = catalogItem.discreteTimesAsSortedJulianDates; const objectifiedDates = catalogItem.objectifiedDates; const currentDiscreteJulianDate = catalogItem.currentDiscreteJulianDate; return ( <div className={Styles.timeline}> <div className={Styles.textRow} css={` background: ${(p) => p.theme.dark}; `} > <div className={Styles.textCell} title={t("dateTime.timeline.textCell")} > <div className={Styles.layerNameTruncated}> {catalogItem.name} </div> {currentTime} </div> </div> <div className={Styles.controlsRow}> <TimelineControls clock={terria.timelineClock} analytics={terria.analytics} currentViewer={terria.currentViewer} /> <If condition={ defined(discreteTimes) && discreteTimes.length !== 0 && defined(currentDiscreteJulianDate) } > <DateTimePicker currentDate={JulianDate.toDate(currentDiscreteJulianDate)} dates={objectifiedDates} onChange={this.changeDateTime} openDirection="up" isOpen={this.state.isPickerOpen} onOpen={this.onOpenPicker} onClose={this.onClosePicker} dateFormat={catalogItem.dateFormat} /> </If> <CesiumTimeline terria={terria} /> </div> </div> ); } }) ); export default withControlledVisibility(withTranslation()(Timeline));