diff --git a/packages/datalib/src/ChangeSet.ts b/packages/datalib/src/ChangeSet.ts index 033d97e0d..58fd89b89 100644 --- a/packages/datalib/src/ChangeSet.ts +++ b/packages/datalib/src/ChangeSet.ts @@ -304,3 +304,7 @@ export function changeSetInsertNewRow(changeSet: ChangeSet, name?: NamedObjectIn ], }; } + +export function changeSetContainsChanges(changeSet: ChangeSet) { + return changeSet.deletes.length > 0 || changeSet.updates.length > 0 || changeSet.inserts.length > 0; +} diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index 846f5481c..1b4daa7f4 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -510,6 +510,10 @@ export default function DataGridCore(props) { setChangeSet(updatedChangeSet); } + function revertAllChanges() { + setChangeSet(createChangeSet()); + } + function deleteCurrentRow() { const updatedChangeSet = getSelectedRowDefinitions().reduce((chs, row) => deleteChangeSetRows(chs, row), changeSet); setChangeSet(updatedChangeSet); @@ -910,7 +914,16 @@ export default function DataGridCore(props) { /> {props.toolbarPortalRef && tabVisible && - ReactDOM.createPortal(, props.toolbarPortalRef.current)} + ReactDOM.createPortal( + , + props.toolbarPortalRef.current + )} ); } diff --git a/packages/web/src/datagrid/DataGridToolbar.js b/packages/web/src/datagrid/DataGridToolbar.js index 67dc1d3aa..ae5aaad83 100644 --- a/packages/web/src/datagrid/DataGridToolbar.js +++ b/packages/web/src/datagrid/DataGridToolbar.js @@ -1,6 +1,19 @@ import React from 'react'; import { ToolbarButton } from '../widgets/Toolbar'; +import { changeSetContainsChanges } from '@dbgate/datalib'; -export default function DataGridToolbar({ reload }) { - return Refresh; +export default function DataGridToolbar({ reload, changeSetState, dispatchChangeSet, save, revert }) { + return ( + <> + {changeSetState.canUndo && ( + dispatchChangeSet({ type: 'undo' })}>Undo + )} + {changeSetState.canRedo && ( + dispatchChangeSet({ type: 'redo' })}>Redo + )} + {changeSetContainsChanges(changeSetState.value) && Save} + {changeSetContainsChanges(changeSetState.value) && Revert} + Refresh + + ); } diff --git a/packages/web/src/utility/useUndoReducer.js b/packages/web/src/utility/useUndoReducer.js index c1ead534e..c4c787149 100644 --- a/packages/web/src/utility/useUndoReducer.js +++ b/packages/web/src/utility/useUndoReducer.js @@ -8,6 +8,8 @@ function reducer(state, action) { history: [...state.history.slice(0, state.current + 1), action.value], current: state.current + 1, value: action.value, + canUndo: true, + canRedo: false, }; case 'undo': if (state.current > 0) @@ -15,6 +17,8 @@ function reducer(state, action) { history: state.history, current: state.current - 1, value: state.history[state.current - 1], + canUndo: state.current > 1, + canRedo: true, }; return state; case 'redo': @@ -23,6 +27,8 @@ function reducer(state, action) { history: state.history, current: state.current + 1, value: state.history[state.current + 1], + canUndo: true, + canRedo: state.current < state.history.length - 2, }; return state; case 'reset':