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':