mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 18:16:00 +00:00
save chart to editor data
This commit is contained in:
@@ -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 (
|
||||
<FormProvider initialValues={{ chartType: 'bar' }}>
|
||||
<FormProviderCore values={config} setValues={setConfig}>
|
||||
<HorizontalSplitter initialValue="300px" size={managerSize} setSize={setManagerSize}>
|
||||
<LeftContainer theme={theme}>
|
||||
<WidgetColumnBar>
|
||||
@@ -49,6 +49,6 @@ export default function ChartEditor({ data }) {
|
||||
|
||||
<DataChart data={data} />
|
||||
</HorizontalSplitter>
|
||||
</FormProvider>
|
||||
</FormProviderCore>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -356,6 +356,7 @@ export default function DataGridCore(props) {
|
||||
},
|
||||
{
|
||||
data: getSelectedFreeData(),
|
||||
config: { chartType: 'bar' },
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
@@ -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 <LoadingInfo wrapper message="Loading data" />;
|
||||
}
|
||||
@@ -40,7 +50,11 @@ export default function ChartTab({ tabVisible, toolbarPortalRef, tabid }) {
|
||||
|
||||
return (
|
||||
<>
|
||||
<ChartEditor data={modelState.value && modelState.value.data} />
|
||||
<ChartEditor
|
||||
data={modelState.value && modelState.value.data}
|
||||
config={modelState.value ? modelState.value.config || {} : {}}
|
||||
setConfig={setConfig}
|
||||
/>
|
||||
<SaveTabModal
|
||||
modalState={saveFileModalState}
|
||||
data={modelState.value}
|
||||
|
||||
@@ -5,6 +5,14 @@ const FormContext = React.createContext(null);
|
||||
|
||||
export function FormProvider({ children, initialValues = {} }) {
|
||||
const [values, setValues] = React.useState(initialValues);
|
||||
return (
|
||||
<FormProviderCore values={values} setValues={setValues}>
|
||||
{children}
|
||||
</FormProviderCore>
|
||||
);
|
||||
}
|
||||
|
||||
export function FormProviderCore({ children, values, setValues }) {
|
||||
const [submitAction, setSubmitAction] = React.useState(null);
|
||||
const handleEnter = React.useCallback(
|
||||
(e) => {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user