tsondb 0.7.9 → 0.7.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
2
  import { useLocation, useRoute } from "preact-iso";
3
3
  import { useCallback, useContext, useEffect, useState } from "preact/hooks";
4
4
  import { removeAt } from "../../shared/utils/array.js";
5
+ import { deepEqual } from "../../shared/utils/compare.js";
5
6
  import { getSerializedDisplayNameFromEntityInstance } from "../../shared/utils/displayName.js";
6
7
  import { toTitleCase } from "../../shared/utils/string.js";
7
8
  import { validateLocaleIdentifier } from "../../shared/validation/identifier.js";
@@ -17,6 +18,11 @@ import { runWithLoading } from "../signals/loading.js";
17
18
  import { Layout } from "./Layout.js";
18
19
  import { TypeInput } from "./typeInputs/TypeInput.js";
19
20
  import { ValidationErrors } from "./typeInputs/utils/ValidationErrors.js";
21
+ const onBeforeUnload = (event) => {
22
+ event.preventDefault();
23
+ // eslint-disable-next-line @typescript-eslint/no-deprecated -- best practice according to MDN
24
+ event.returnValue = "unsaved changes";
25
+ };
20
26
  export const InstanceRouteSkeleton = ({ mode, buttons, init, titleBuilder, onSubmit, }) => {
21
27
  const { params: { name, id }, } = useRoute();
22
28
  const [locales] = useSetting("displayedLocales");
@@ -24,10 +30,22 @@ export const InstanceRouteSkeleton = ({ mode, buttons, init, titleBuilder, onSub
24
30
  const { declaration: entity, isLocaleEntity } = useEntityFromRoute() ?? {};
25
31
  const [instanceNamesByEntity] = useInstanceNamesByEntity();
26
32
  const [instanceContent, setInstanceContent] = useState();
33
+ const [savedInstanceContent, setSavedInstanceContent] = useState();
27
34
  const [childInstances, setChildInstances] = useState([]);
28
35
  const [customId, setCustomId] = useState("");
29
36
  const client = useContext(GitClientContext);
30
37
  const { route } = useLocation();
38
+ useEffect(() => {
39
+ if (deepEqual(instanceContent, savedInstanceContent)) {
40
+ window.removeEventListener("beforeunload", onBeforeUnload);
41
+ }
42
+ else {
43
+ window.addEventListener("beforeunload", onBeforeUnload);
44
+ }
45
+ return () => {
46
+ window.removeEventListener("beforeunload", onBeforeUnload);
47
+ };
48
+ }, [instanceContent, savedInstanceContent]);
31
49
  useEffect(() => {
32
50
  document.title =
33
51
  (entity && titleBuilder({ locales, entity, instanceContent, instanceId: id })) ??
@@ -35,7 +53,16 @@ export const InstanceRouteSkeleton = ({ mode, buttons, init, titleBuilder, onSub
35
53
  }, [entity, id, instanceContent, locales, titleBuilder]);
36
54
  useEffect(() => {
37
55
  if (entity && instanceContent === undefined && declsLoaded) {
38
- runWithLoading(() => init({ locales, entity, instanceId: id, setInstanceContent, getDeclFromDeclName }))
56
+ runWithLoading(() => init({
57
+ locales,
58
+ entity,
59
+ instanceId: id,
60
+ setInstanceContent: value => {
61
+ setInstanceContent(value);
62
+ setSavedInstanceContent(value);
63
+ },
64
+ getDeclFromDeclName,
65
+ }))
39
66
  .then(() => id
40
67
  ? getChildInstancesForInstanceByEntityName(locales, entity.name, id).then(result => {
41
68
  setChildInstances(result.instances);
@@ -61,7 +88,10 @@ export const InstanceRouteSkeleton = ({ mode, buttons, init, titleBuilder, onSub
61
88
  getDeclFromDeclName,
62
89
  isLocaleEntity,
63
90
  setCustomId,
64
- setInstanceContent,
91
+ setInstanceContent: value => {
92
+ setInstanceContent(value);
93
+ setSavedInstanceContent(value);
94
+ },
65
95
  childInstances,
66
96
  updateLocalGitState: client?.updateLocalState,
67
97
  })).catch((error) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tsondb",
3
- "version": "0.7.9",
3
+ "version": "0.7.10",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "Lukas Obermann",