import React from 'react'; import Chart from 'react-chartjs-2'; import _ from 'lodash'; import styled from 'styled-components'; import useTheme from '../theme/useTheme'; import useDimensions from '../utility/useDimensions'; import { HorizontalSplitter } from '../widgets/Splitter'; import WidgetColumnBar, { WidgetColumnBarItem } from '../widgets/WidgetColumnBar'; import { FormCheckboxField, FormSelectField, FormTextField } from '../utility/forms'; import DataChart from './DataChart'; import { FormProviderCore } from '../utility/FormProvider'; import { loadChartData, loadChartStructure } from './chartDataLoader'; import useExtensions from '../utility/useExtensions'; import { getConnectionInfo } from '../utility/metadataLoaders'; import { findEngineDriver } from 'dbgate-tools'; import { FormFieldTemplateTiny } from '../utility/formStyle'; import { ManagerInnerContainer } from '../datagrid/ManagerStyles'; import { presetPrimaryColors } from '@ant-design/colors'; import ErrorInfo from '../widgets/ErrorInfo'; const LeftContainer = styled.div` background-color: ${(props) => props.theme.manager_background}; display: flex; flex: 1; `; export default function ChartEditor({ data, config, setConfig, sql, conid, database }) { const [managerSize, setManagerSize] = React.useState(0); const theme = useTheme(); const extensions = useExtensions(); const [error, setError] = React.useState(null); const [availableColumnNames, setAvailableColumnNames] = React.useState([]); const [loadedData, setLoadedData] = React.useState(null); const getDriver = async () => { const conn = await getConnectionInfo({ conid }); if (!conn) return; const driver = findEngineDriver(conn, extensions); return driver; }; const handleLoadColumns = async () => { const driver = await getDriver(); if (!driver) return; try { const columns = await loadChartStructure(driver, conid, database, sql); setAvailableColumnNames(columns); } catch (err) { setError(err.message); } }; const handleLoadData = async () => { const driver = await getDriver(); if (!driver) return; const loaded = await loadChartData(driver, conid, database, sql, config); if (!loaded) return; const { columns, rows } = loaded; setLoadedData({ structure: columns, rows, }); }; React.useEffect(() => { if (sql && conid && database) { handleLoadColumns(); } }, [sql, conid, database, extensions]); React.useEffect(() => { if (data) { setAvailableColumnNames(data ? data.structure.columns.map((x) => x.columnName) : []); } }, [data]); React.useEffect(() => { if (config.labelColumn && sql && conid && database) { handleLoadData(); } }, [config, sql, conid, database, availableColumnNames]); if (error) { return (
); } return ( {/* */} {/* */} {availableColumnNames.length > 0 && ( {availableColumnNames.map((col) => ( ))} )} {availableColumnNames.map((col) => ( {config[`dataColumn_${col}`] && ( {_.keys(presetPrimaryColors).map((color) => ( ))} )} ))} ); }