import { action } from "mobx"; import { observer } from "mobx-react"; import { FC, useEffect, useMemo } from "react"; import { useTranslation } from "react-i18next"; import ChartView from "../../../Charts/ChartView"; import Result from "../../../Core/Result"; import MappableMixin from "../../../ModelMixins/MappableMixin"; import Icon from "../../../Styled/Icon"; import { useViewState } from "../../Context"; import Loader from "../../Loader"; import { BottomDockChart } from "./BottomDockChart"; import Styles from "./chart-panel.scss"; import { ChartPanelDownloadButton } from "./ChartPanelDownloadButton"; const CHART_PANEL_HEIGHT = 300; const CHART_LEGEND_HEIGHT = 34; interface ChartPanelProps { onHeightChange?: () => void; } const ChartPanel: FC = observer(({ onHeightChange }) => { const { t } = useTranslation(); const viewState = useViewState(); const chartView = useMemo( () => new ChartView(viewState.terria), [viewState.terria] ); useEffect(() => { // Required so that components like the splitter that depend on screen // height will re-adjust. viewState.triggerResizeEvent(); if (onHeightChange) { onHeightChange(); } }, [onHeightChange, viewState]); useEffect(() => { // Repaint on every render viewState.terria.currentViewer.notifyRepaintRequired(); }); const closePanel = action(() => { chartView.chartItems.forEach((chartItem) => { chartItem.updateIsSelectedInWorkbench(false); }); }); const chartableCatalogItems = chartView.chartableItems; const chartItems = chartView.chartItems.filter((c) => c.showInChartPanel); const xAxis = chartView.xAxis!; // Guaranteed by non-empty chartItems with showInChartPanel=true const isLoading = false; // const isLoading = // chartableItems.length > 0 && // chartableItems[chartableItems.length - 1].isLoading; const chart = useMemo(() => { const items = viewState.terria.workbench.items; if (items.length === 0) return; // Load all items Promise.all( items .filter((item) => MappableMixin.isMixedInto(item)) .map((item) => item.loadMapItems()) ).then((results) => Result.combine(results, { message: "Failed to load chart items", importance: -1 }).raiseError(viewState.terria) ); return ( ); }, [chartItems, xAxis, viewState.terria]); if (chartItems.length === 0) { return null; } return (
{chart}
); }); ChartPanel.displayName = "ChartPanel"; export default ChartPanel;