diff --git a/packages/web/src/charts/ChartEditor.js b/packages/web/src/charts/ChartEditor.js index 4ed6b439d..38b288203 100644 --- a/packages/web/src/charts/ChartEditor.js +++ b/packages/web/src/charts/ChartEditor.js @@ -7,7 +7,7 @@ import { HorizontalSplitter } from '../widgets/Splitter'; import WidgetColumnBar, { WidgetColumnBarItem } from '../widgets/WidgetColumnBar'; import { FormCheckboxField, FormSelectField } from '../utility/forms'; import DataChart from './DataChart'; -import { FormProvider } from '../utility/FormProvider'; +import { FormProviderCore } from '../utility/FormProvider'; const LeftContainer = styled.div` background-color: ${(props) => props.theme.manager_background}; @@ -15,13 +15,13 @@ const LeftContainer = styled.div` flex: 1; `; -export default function ChartEditor({ data }) { +export default function ChartEditor({ data, config, setConfig }) { const [managerSize, setManagerSize] = React.useState(0); const theme = useTheme(); const availableColumnNames = data ? data.structure.columns.map((x) => x.columnName) : []; return ( - + @@ -49,6 +49,6 @@ export default function ChartEditor({ data }) { - + ); } diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index 15aadf5d1..e6630165c 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -356,6 +356,7 @@ export default function DataGridCore(props) { }, { data: getSelectedFreeData(), + config: { chartType: 'bar' }, } ); }; diff --git a/packages/web/src/tabs/ChartTab.js b/packages/web/src/tabs/ChartTab.js index 6348c2521..a7c5ea9c6 100644 --- a/packages/web/src/tabs/ChartTab.js +++ b/packages/web/src/tabs/ChartTab.js @@ -1,4 +1,5 @@ import React from 'react'; +import _ from 'lodash'; import { createFreeTableModel } from 'dbgate-datalib'; import useUndoReducer from '../utility/useUndoReducer'; import { useSetOpenedTabs } from '../utility/globalState'; @@ -15,7 +16,6 @@ import SaveTabModal from '../modals/SaveTabModal'; import ChartEditor from '../charts/ChartEditor'; export default function ChartTab({ tabVisible, toolbarPortalRef, tabid }) { - const [config, setConfig] = useGridConfig(tabid); const [modelState, dispatchModel] = useUndoReducer(createFreeTableModel()); const saveFileModalState = useModalState(); const { initialData, setEditorData, errorMessage, isLoading } = useEditorData({ @@ -31,6 +31,16 @@ export default function ChartTab({ tabVisible, toolbarPortalRef, tabid }) { setEditorData(modelState.value); }, [modelState]); + const setConfig = React.useCallback( + (config) => + // @ts-ignore + dispatchModel({ + type: 'compute', + compute: (v) => ({ ...v, config: _.isFunction(config) ? config(v.config) : config }), + }), + [dispatchModel] + ); + if (isLoading) { return ; } @@ -40,7 +50,11 @@ export default function ChartTab({ tabVisible, toolbarPortalRef, tabid }) { return ( <> - + + {children} + + ); +} + +export function FormProviderCore({ children, values, setValues }) { const [submitAction, setSubmitAction] = React.useState(null); const handleEnter = React.useCallback( (e) => { diff --git a/packages/web/src/utility/useUndoReducer.js b/packages/web/src/utility/useUndoReducer.js index c4c787149..5a996cb3d 100644 --- a/packages/web/src/utility/useUndoReducer.js +++ b/packages/web/src/utility/useUndoReducer.js @@ -1,9 +1,9 @@ +import _ from 'lodash'; import React from 'react'; function reducer(state, action) { switch (action.type) { case 'set': - // console.log('SET', state.history, action.value); return { history: [...state.history.slice(0, state.current + 1), action.value], current: state.current + 1, @@ -11,6 +11,16 @@ function reducer(state, action) { canUndo: true, canRedo: false, }; + case 'compute': { + const newValue = action.compute(state.history[state.current]); + return { + history: [...state.history.slice(0, state.current + 1), newValue], + current: state.current + 1, + value: newValue, + canUndo: true, + canRedo: false, + }; + } case 'undo': if (state.current > 0) return {