Skip to content

Commit 1d3f6bb

Browse files
committed
Added undo/redo functionality
1 parent 4998143 commit 1d3f6bb

File tree

3 files changed

+237
-126
lines changed

3 files changed

+237
-126
lines changed

packages/firecms_core/src/form/EntityForm.tsx

+26-3
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ export function EntityForm<M extends Record<string, any>>({
131131
entityId: entityIdProp,
132132
collection,
133133
path,
134-
values: valuesToBeSaved,
134+
values: valuesToBeSaved
135135
});
136136
}, false, 2000);
137137

@@ -222,6 +222,29 @@ export function EntityForm<M extends Record<string, any>>({
222222
}
223223
});
224224

225+
226+
useEffect(() => {
227+
228+
const handleKeyDown = (e: KeyboardEvent) => {
229+
const isUndo = (e.metaKey || e.ctrlKey) && !e.shiftKey && e.key.toLowerCase() === "z";
230+
const isRedo =
231+
((e.metaKey || e.ctrlKey) && e.shiftKey && e.key.toLowerCase() === "z") ||
232+
((e.metaKey || e.ctrlKey) && !e.shiftKey && e.key.toLowerCase() === "y");
233+
234+
if (isUndo && formex.canUndo) {
235+
e.preventDefault();
236+
formex.undo();
237+
} else if (isRedo && formex.canRedo) {
238+
e.preventDefault();
239+
formex.redo();
240+
}
241+
};
242+
243+
window.addEventListener("keydown", handleKeyDown);
244+
return () => window.removeEventListener("keydown", handleKeyDown);
245+
246+
}, [formex]);
247+
225248
const resolvedCollection = useMemo(() => resolveCollection<M>({
226249
collection,
227250
path,
@@ -349,7 +372,7 @@ export function EntityForm<M extends Record<string, any>>({
349372
path,
350373
entityId,
351374
values,
352-
previousValues,
375+
previousValues
353376
});
354377
}
355378
};
@@ -656,7 +679,7 @@ export function EntityForm<M extends Record<string, any>>({
656679
<form
657680
onSubmit={formContext.formex.handleSubmit}
658681
onReset={() => formex.resetForm({
659-
values: getInitialEntityValues(collection, path, status, entity, customizationController.propertyConfigs) as M,
682+
values: getInitialEntityValues(collection, path, status, entity, customizationController.propertyConfigs) as M
660683
})}
661684
noValidate
662685
className={cls("flex-1 flex flex-row w-full overflow-y-auto justify-center", className)}>

packages/formex/src/types.ts

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ export type FormexController<T extends object> = {
2828
version: number;
2929

3030
debugId?: string;
31+
32+
undo: () => void;
33+
redo: () => void;
34+
35+
canUndo: boolean;
36+
canRedo: boolean;
3137
}
3238

3339
export type FormexResetProps<T extends object> = {

0 commit comments

Comments
 (0)