diff --git a/frontend/src/components/DetailView/Context/DetailContext.tsx b/frontend/src/components/DetailView/Context/DetailContext.tsx index 6bc0499a..f606a130 100755 --- a/frontend/src/components/DetailView/Context/DetailContext.tsx +++ b/frontend/src/components/DetailView/Context/DetailContext.tsx @@ -139,6 +139,7 @@ export type DetailContextType = { setFieldsWithErrors: SetFieldsWithErrorsType isDirty: boolean resetEditData: () => void + markEditDataClean?: (editData?: unknown) => void } export type SetEditDataType = (editData: EditDataType) => void @@ -191,6 +192,14 @@ export const DetailContextProvider = ({ setEditData(cloneDeep(initialEditData)) setIsDirty(false) } + + const markEditDataClean = (nextEditData?: unknown) => { + const cleanEditData = cloneDeep((nextEditData as EditDataType | undefined) ?? editData) + setInitialEditData(cleanEditData) + setEditData(cloneDeep(cleanEditData)) + setIsDirty(false) + } + return ( ({ setEditData: handleSetEditData, isDirty, resetEditData, + markEditDataClean, validator: (editData: unknown, fieldName: keyof EditDataType) => contextState.validator(editData as EditDataType, fieldName), }} diff --git a/frontend/src/components/DetailView/DetailView.tsx b/frontend/src/components/DetailView/DetailView.tsx index c04250dd..1a6c1d2d 100755 --- a/frontend/src/components/DetailView/DetailView.tsx +++ b/frontend/src/components/DetailView/DetailView.tsx @@ -118,7 +118,11 @@ export const DetailView = ({ }: { tabs: TabType[] data: T - onWrite?: (editData: EditDataType, setEditData: (editData: EditDataType) => void) => Promise + onWrite?: ( + editData: EditDataType, + setEditData: (editData: EditDataType) => void, + markEditDataClean?: (editData?: EditDataType) => void + ) => Promise validator: (editData: EditDataType, field: keyof EditDataType) => ValidationObject isNew?: boolean isUserPage?: boolean diff --git a/frontend/src/components/DetailView/components.tsx b/frontend/src/components/DetailView/components.tsx index 6c1f3535..9e012922 100755 --- a/frontend/src/components/DetailView/components.tsx +++ b/frontend/src/components/DetailView/components.tsx @@ -23,13 +23,27 @@ export const WriteButton = ({ hasStagingMode = false, disabled = false, }: { - onWrite: (editData: EditDataType, setEditData: (editData: EditDataType) => void) => Promise + onWrite: ( + editData: EditDataType, + setEditData: (editData: EditDataType) => void, + markEditDataClean?: (editData?: EditDataType) => void + ) => Promise taxonomy?: boolean hasStagingMode?: boolean disabled?: boolean }) => { - const { data, editData, setEditData, mode, setMode, validator, fieldsWithErrors, setFieldsWithErrors, isDirty } = - useDetailContext() + const { + data, + editData, + setEditData, + mode, + setMode, + validator, + fieldsWithErrors, + setFieldsWithErrors, + isDirty, + markEditDataClean, + } = useDetailContext() const user = useUser() const [loading, setLoading] = useState(false) const { notify } = useNotify() @@ -173,7 +187,7 @@ export const WriteButton = ({ } } - await onWrite((speciesEditData as EditDataType) ?? editData, setEditData) + await onWrite((speciesEditData as EditDataType) ?? editData, setEditData, markEditDataClean) setMode('read') } @@ -193,7 +207,7 @@ export const WriteButton = ({ } setLoading(true) - await onWrite(editData, setEditData) + await onWrite(editData, setEditData, markEditDataClean) setLoading(false) setMode('read') } diff --git a/frontend/src/components/TimeUnit/TimeUnitDetails.tsx b/frontend/src/components/TimeUnit/TimeUnitDetails.tsx index a30d4255..54aa8219 100755 --- a/frontend/src/components/TimeUnit/TimeUnitDetails.tsx +++ b/frontend/src/components/TimeUnit/TimeUnitDetails.tsx @@ -53,11 +53,16 @@ export const TimeUnitDetails = ({ const onWrite = async ( editData: EditDataType, - setEditData: (editData: EditDataType) => void + setEditData: (editData: EditDataType) => void, + markEditDataClean?: (editData?: EditDataType) => void ) => { try { const normalizedEditData = normalizeRank(editData) const { tu_name } = await editTimeUnitRequest(normalizedEditData).unwrap() + markEditDataClean?.({ + ...normalizedEditData, + tu_name, + }) unsavedChanges?.setDirty(false) setTimeout(() => navigate(`/time-unit/${tu_name}`), 15) notify('Edited item successfully.')