import { observer } from 'mobx-react'; import * as React from 'react'; import { Doc } from '../../../../fields/Doc'; import { action, computed, observable } from 'mobx'; import { NumCast, StrCast } from '../../../../fields/Types'; import { LineChart } from './components/LineChart'; import { Chart, ChartData } from './ChartInterface'; export interface ChartBoxProps { rootDoc: Doc; dataDoc: Doc; pairs: { x: number; y: number }[]; setChartBox: (chartBox: ChartBox) => void; getAnchor: () => Doc; } export interface DataPoint { x: number; y: number; } @observer export class ChartBox extends React.Component { @observable private _chartData: ChartData | undefined = undefined; private currChart: Chart | undefined; @computed get currView() { if (this.props.rootDoc._dataVizView) { return StrCast(this.props.rootDoc._currChartView); } else { return 'table'; } } constructor(props: any) { super(props); if (!this.props.rootDoc._currChartView) { this.props.rootDoc._currChartView = 'bar'; } } setCurrChart = (chart: Chart) => { this.currChart = chart; }; @action generateChartData() { if (this.props.rootDoc._chartData) { this._chartData = JSON.parse(StrCast(this.props.rootDoc._chartData)); return; } const data: ChartData = { xLabel: '', yLabel: '', data: [[]], }; if (this.props.pairs && this.props.pairs.length > 0) { data.xLabel = 'x'; data.yLabel = 'y'; this.props.pairs.forEach(pair => { // TODO: nda - add actual support for multiple sets of data data.data[0].push({ x: pair.x, y: pair.y }); }); } this._chartData = data; this.props.rootDoc._chartData = JSON.stringify(data); } componentDidMount = () => { this.generateChartData(); // setting timeout to allow rerender cycle of the actual chart tof inish // setTimeout(() => { this.props.setChartBox(this); // }); // this.props.setChartBox(this); }; @action onClickChangeChart = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); console.log(e.currentTarget.value); this.props.rootDoc._currChartView = e.currentTarget.value.toLowerCase(); }; scrollFocus(doc: Doc, smooth: boolean): number | undefined { // if x and y exist on this // then highlight/focus the x and y position (datapoint) // highlight for a few seconds and then remove (set a timer to unhighlight after a period of time, // to be consistent, use 5 seconds and highlight color is orange) // if x and y don't exist => link to whole doc => dash will take care of focusing on the entire doc // return value is how long this action takes // undefined => immediately, 0 => introduces a timeout // number in ms => won't do any of the focus or call the automated highlighting thing until this timeout expires // in this case probably number in ms doesn't matter // for now could just update the currSelected in linechart to be what doc.x and doc.y if (this.currChart && doc.x && doc.y) { // update curr selected this.currChart.setCurrSelected(Number(doc.x), Number(doc.y)); } return 0; } _getAnchor() { return this.currChart?._getAnchor(); } render() { if (this.props.pairs && this._chartData) { let width = NumCast(this.props.rootDoc._width); width = width * 0.7; let height = NumCast(this.props.rootDoc._height); height = height * 0.7; console.log(width, height); const margin = { top: 50, right: 50, bottom: 50, left: 50 }; return (
{/*{this.props.rootDoc._currChartView == 'line' ? ( this.onClick(e)} /> ) : ( this.onClick(e)} /> )} */} {/* {this.reLineChart} */}
); } else { return
; } } }