From e0a5fa0787ac9788e3b3cbbc4f9e983666fb0b60 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 9 Jan 2026 18:19:44 -0600 Subject: [PATCH] feat: add `beforeunload` event see https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event --- .../js_src/lib/components/Forms/ResourceView.tsx | 10 ++++++++++ specifyweb/specify/models_utils/relationships.py | 4 +--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Forms/ResourceView.tsx b/specifyweb/frontend/js_src/lib/components/Forms/ResourceView.tsx index d6e482ef971..9040a03f656 100644 --- a/specifyweb/frontend/js_src/lib/components/Forms/ResourceView.tsx +++ b/specifyweb/frontend/js_src/lib/components/Forms/ResourceView.tsx @@ -157,6 +157,16 @@ export function ResourceView({ const isModified = useIsModified(resource); + React.useEffect(() => { + if (!isModified) return; + const handleBeforeUnload = (event: BeforeUnloadEvent): void => { + event.preventDefault(); + event.returnValue = ''; + }; + window.addEventListener('beforeunload', handleBeforeUnload); + return () => window.removeEventListener('beforeunload', handleBeforeUnload); + }, [isModified]); + const [showUnloadProtect, setShowUnloadProtect] = React.useState(false); const [makeFormDialogsModal] = userPreferences.use( diff --git a/specifyweb/specify/models_utils/relationships.py b/specifyweb/specify/models_utils/relationships.py index a07ffff173f..c2be37dcbe8 100644 --- a/specifyweb/specify/models_utils/relationships.py +++ b/specifyweb/specify/models_utils/relationships.py @@ -209,7 +209,6 @@ def _handle_remote_fk_field(obj, field, value, read_checker): elif isinstance(value, field.related_model): # The related value was patched into the data by a parent object. - setattr(obj, field_name, value) rel_data = _obj_to_data(value, read_checker) new_related_id = value.id @@ -218,7 +217,6 @@ def _handle_remote_fk_field(obj, field, value, read_checker): assert not dependent, f"didn't get inline data for dependent field {field_name} in {obj}: {value!r}" fk_model, fk_id = strict_uri_to_model(value, field.related_model.__name__) rel_obj = get_object_or_404(fk_model, id=fk_id) - setattr(obj, field_name, rel_obj) rel_data = _obj_to_data(rel_obj, read_checker) new_related_id = rel_obj.pk @@ -234,7 +232,7 @@ def _handle_remote_fk_field(obj, field, value, read_checker): if str(old_related_id) != str(new_related_id): dirty.append(FieldChangeInfo(field_name=field_name, old_value=old_related_id, new_value=new_related_id)) - if not rel_data is None: + if rel_data is not None: remote_to_ones.append((field.remote_field, rel_data, dependent)) return dependents_to_delete, dirty, remote_to_ones