tsondb 0.5.19 → 0.6.1

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.
Files changed (223) hide show
  1. package/dist/src/bin/tsondb.js +1 -1
  2. package/dist/src/index.d.ts +1 -1
  3. package/dist/src/node/config.d.ts +20 -0
  4. package/dist/src/node/config.js +5 -0
  5. package/dist/src/node/index.d.ts +3 -2
  6. package/dist/src/node/index.js +13 -8
  7. package/dist/src/node/renderers/jsonschema/render.d.ts +1 -1
  8. package/dist/src/node/renderers/jsonschema/render.js +12 -7
  9. package/dist/src/node/renderers/ts/render.d.ts +1 -1
  10. package/dist/src/node/renderers/ts/render.js +12 -6
  11. package/dist/src/node/schema/Node.d.ts +100 -29
  12. package/dist/src/node/schema/Node.js +268 -61
  13. package/dist/src/node/schema/Schema.js +96 -1
  14. package/dist/src/node/schema/TypeParameter.d.ts +7 -9
  15. package/dist/src/node/schema/TypeParameter.js +7 -5
  16. package/dist/src/node/schema/declarations/Declaration.d.ts +10 -28
  17. package/dist/src/node/schema/declarations/Declaration.js +8 -110
  18. package/dist/src/node/schema/declarations/EntityDecl.d.ts +48 -48
  19. package/dist/src/node/schema/declarations/EntityDecl.js +15 -12
  20. package/dist/src/node/schema/declarations/EnumDecl.d.ts +14 -17
  21. package/dist/src/node/schema/declarations/EnumDecl.js +12 -12
  22. package/dist/src/node/schema/declarations/TypeAliasDecl.d.ts +8 -14
  23. package/dist/src/node/schema/declarations/TypeAliasDecl.js +10 -11
  24. package/dist/src/node/schema/index.d.ts +0 -2
  25. package/dist/src/node/schema/index.js +0 -1
  26. package/dist/src/node/schema/types/Type.d.ts +19 -42
  27. package/dist/src/node/schema/types/Type.js +29 -167
  28. package/dist/src/node/schema/types/generic/ArrayType.d.ts +5 -14
  29. package/dist/src/node/schema/types/generic/ArrayType.js +15 -20
  30. package/dist/src/node/schema/types/generic/EnumType.d.ts +5 -17
  31. package/dist/src/node/schema/types/generic/EnumType.js +12 -20
  32. package/dist/src/node/schema/types/generic/ObjectType.d.ts +5 -19
  33. package/dist/src/node/schema/types/generic/ObjectType.js +11 -15
  34. package/dist/src/node/schema/types/primitives/BooleanType.d.ts +7 -8
  35. package/dist/src/node/schema/types/primitives/BooleanType.js +5 -4
  36. package/dist/src/node/schema/types/primitives/DateType.d.ts +6 -8
  37. package/dist/src/node/schema/types/primitives/DateType.js +5 -4
  38. package/dist/src/node/schema/types/primitives/FloatType.d.ts +9 -21
  39. package/dist/src/node/schema/types/primitives/FloatType.js +5 -4
  40. package/dist/src/node/schema/types/primitives/IntegerType.d.ts +9 -21
  41. package/dist/src/node/schema/types/primitives/IntegerType.js +5 -4
  42. package/dist/src/node/schema/types/primitives/StringType.d.ts +6 -10
  43. package/dist/src/node/schema/types/primitives/StringType.js +5 -4
  44. package/dist/src/node/schema/types/references/ChildEntitiesType.d.ts +18 -0
  45. package/dist/src/node/schema/types/references/ChildEntitiesType.js +18 -0
  46. package/dist/src/node/schema/types/references/IncludeIdentifierType.d.ts +7 -13
  47. package/dist/src/node/schema/types/references/IncludeIdentifierType.js +12 -12
  48. package/dist/src/node/schema/types/references/NestedEntityMapType.d.ts +7 -17
  49. package/dist/src/node/schema/types/references/NestedEntityMapType.js +11 -13
  50. package/dist/src/node/schema/types/references/ReferenceIdentifierType.d.ts +4 -10
  51. package/dist/src/node/schema/types/references/ReferenceIdentifierType.js +3 -5
  52. package/dist/src/node/schema/types/references/TypeArgumentType.d.ts +5 -10
  53. package/dist/src/node/schema/types/references/TypeArgumentType.js +10 -5
  54. package/dist/src/node/server/api/declarations.js +24 -6
  55. package/dist/src/node/server/api/index.js +11 -0
  56. package/dist/src/node/server/api/instances.js +9 -6
  57. package/dist/src/node/server/index.d.ts +6 -1
  58. package/dist/src/node/server/index.js +7 -3
  59. package/dist/src/node/server/init.d.ts +2 -1
  60. package/dist/src/node/server/init.js +11 -11
  61. package/dist/src/node/server/utils/childInstances.d.ts +4 -0
  62. package/dist/src/node/server/utils/childInstances.js +41 -0
  63. package/dist/src/node/server/utils/instanceOperations.d.ts +8 -0
  64. package/dist/src/node/server/utils/instanceOperations.js +107 -0
  65. package/dist/src/node/server/utils/locales.d.ts +2 -0
  66. package/dist/src/node/server/utils/locales.js +8 -0
  67. package/dist/src/node/utils/childInstances.d.ts +32 -0
  68. package/dist/src/node/utils/childInstances.js +164 -0
  69. package/dist/src/node/utils/displayName.d.ts +2 -1
  70. package/dist/src/node/utils/displayName.js +5 -4
  71. package/dist/src/node/utils/files.d.ts +5 -0
  72. package/dist/src/node/utils/files.js +9 -0
  73. package/dist/src/node/utils/instanceOperations.d.ts +14 -0
  74. package/dist/src/node/utils/instanceOperations.js +88 -0
  75. package/dist/src/node/utils/instances.d.ts +1 -1
  76. package/dist/src/node/utils/instances.js +12 -6
  77. package/dist/src/node/utils/references.d.ts +3 -1
  78. package/dist/src/node/utils/references.js +43 -18
  79. package/dist/src/node/utils/referencesWorker.d.ts +5 -0
  80. package/dist/src/node/utils/referencesWorker.js +22 -0
  81. package/dist/src/node/utils/workers.d.ts +15 -0
  82. package/dist/src/node/utils/workers.js +90 -0
  83. package/dist/src/shared/api.d.ts +14 -1
  84. package/dist/src/shared/schema/Node.d.ts +63 -0
  85. package/dist/src/shared/schema/Node.js +128 -0
  86. package/dist/src/shared/schema/TypeParameter.d.ts +9 -0
  87. package/dist/src/shared/schema/TypeParameter.js +2 -0
  88. package/dist/src/shared/schema/declarations/Declaration.d.ts +21 -0
  89. package/dist/src/shared/schema/declarations/Declaration.js +4 -0
  90. package/dist/src/shared/schema/declarations/EntityDecl.d.ts +32 -0
  91. package/dist/src/shared/schema/declarations/EntityDecl.js +8 -0
  92. package/dist/src/shared/schema/declarations/EnumDecl.d.ts +11 -0
  93. package/dist/src/shared/schema/declarations/EnumDecl.js +9 -0
  94. package/dist/src/shared/schema/declarations/TypeAliasDecl.d.ts +11 -0
  95. package/dist/src/shared/schema/declarations/TypeAliasDecl.js +7 -0
  96. package/dist/src/shared/schema/types/ArrayType.d.ts +11 -0
  97. package/dist/src/shared/schema/types/ArrayType.js +8 -0
  98. package/dist/src/shared/schema/types/BooleanType.d.ts +7 -0
  99. package/dist/src/shared/schema/types/BooleanType.js +2 -0
  100. package/dist/src/shared/schema/types/ChildEntitiesType.d.ts +8 -0
  101. package/dist/src/shared/schema/types/ChildEntitiesType.js +2 -0
  102. package/dist/src/shared/schema/types/DateType.d.ts +8 -0
  103. package/dist/src/shared/schema/types/DateType.js +2 -0
  104. package/dist/src/shared/schema/types/EnumType.d.ts +14 -0
  105. package/dist/src/shared/schema/types/EnumType.js +28 -0
  106. package/dist/src/shared/schema/types/FloatType.d.ts +11 -0
  107. package/dist/src/shared/schema/types/FloatType.js +2 -0
  108. package/dist/src/shared/schema/types/IncludeIdentifierType.d.ts +11 -0
  109. package/dist/src/shared/schema/types/IncludeIdentifierType.js +13 -0
  110. package/dist/src/shared/schema/types/IntegerType.d.ts +11 -0
  111. package/dist/src/shared/schema/types/IntegerType.js +2 -0
  112. package/dist/src/shared/schema/types/NestedEntityMapType.d.ts +17 -0
  113. package/dist/src/shared/schema/types/NestedEntityMapType.js +14 -0
  114. package/dist/src/shared/schema/types/ObjectType.d.ts +19 -0
  115. package/dist/src/shared/schema/types/ObjectType.js +14 -0
  116. package/dist/src/shared/schema/types/ReferenceIdentifierType.d.ts +8 -0
  117. package/dist/src/shared/schema/types/ReferenceIdentifierType.js +2 -0
  118. package/dist/src/shared/schema/types/StringType.d.ts +10 -0
  119. package/dist/src/shared/schema/types/StringType.js +2 -0
  120. package/dist/src/shared/schema/types/Type.d.ts +20 -0
  121. package/dist/src/shared/schema/types/TypeArgumentType.d.ts +12 -0
  122. package/dist/src/shared/schema/types/TypeArgumentType.js +7 -0
  123. package/dist/src/shared/utils/array.d.ts +4 -0
  124. package/dist/src/shared/utils/array.js +30 -0
  125. package/dist/src/shared/utils/async.d.ts +8 -0
  126. package/dist/src/shared/utils/async.js +35 -0
  127. package/dist/src/shared/utils/compare.js +3 -3
  128. package/dist/src/shared/utils/displayName.d.ts +6 -2
  129. package/dist/src/shared/utils/displayName.js +21 -8
  130. package/dist/src/shared/utils/instances.d.ts +2 -3
  131. package/dist/src/shared/utils/instances.js +3 -1
  132. package/dist/src/shared/utils/markdown.d.ts +4 -0
  133. package/dist/src/shared/utils/markdown.js +91 -4
  134. package/dist/src/shared/utils/object.d.ts +2 -0
  135. package/dist/src/shared/utils/object.js +2 -0
  136. package/dist/src/shared/utils/result.d.ts +8 -2
  137. package/dist/src/shared/utils/result.js +1 -1
  138. package/dist/src/web/api/declarations.d.ts +26 -0
  139. package/dist/src/web/api/declarations.js +51 -0
  140. package/dist/src/web/api/git.d.ts +14 -0
  141. package/dist/src/web/api/git.js +20 -0
  142. package/dist/src/web/api/index.d.ts +1 -0
  143. package/dist/src/web/api/index.js +2 -0
  144. package/dist/src/web/api/instances.d.ts +2 -0
  145. package/dist/src/web/api/instances.js +2 -0
  146. package/dist/src/web/components/Git.js +19 -16
  147. package/dist/src/web/components/InstanceRouteSkeleton.d.ts +42 -0
  148. package/dist/src/web/components/InstanceRouteSkeleton.js +114 -0
  149. package/dist/src/web/components/Layout.js +3 -2
  150. package/dist/src/web/components/ModalDialog.d.ts +2 -0
  151. package/dist/src/web/components/ModalDialog.js +16 -0
  152. package/dist/src/web/components/Select.d.ts +1 -2
  153. package/dist/src/web/components/Settings.d.ts +2 -0
  154. package/dist/src/web/components/Settings.js +47 -0
  155. package/dist/src/web/components/typeInputs/ArrayTypeInput.d.ts +3 -11
  156. package/dist/src/web/components/typeInputs/ArrayTypeInput.js +5 -4
  157. package/dist/src/web/components/typeInputs/BooleanTypeInput.d.ts +3 -6
  158. package/dist/src/web/components/typeInputs/BooleanTypeInput.js +2 -2
  159. package/dist/src/web/components/typeInputs/ChildEntitiesTypeInput.d.ts +6 -0
  160. package/dist/src/web/components/typeInputs/ChildEntitiesTypeInput.js +27 -0
  161. package/dist/src/web/components/typeInputs/DateTypeInput.d.ts +3 -6
  162. package/dist/src/web/components/typeInputs/DateTypeInput.js +2 -2
  163. package/dist/src/web/components/typeInputs/EnumTypeInput.d.ts +3 -11
  164. package/dist/src/web/components/typeInputs/EnumTypeInput.js +55 -22
  165. package/dist/src/web/components/typeInputs/FloatTypeInput.d.ts +3 -6
  166. package/dist/src/web/components/typeInputs/FloatTypeInput.js +2 -2
  167. package/dist/src/web/components/typeInputs/GenericTypeArgumentIdentifierTypeInput.d.ts +3 -4
  168. package/dist/src/web/components/typeInputs/IncludeIdentifierTypeInput.d.ts +3 -11
  169. package/dist/src/web/components/typeInputs/IncludeIdentifierTypeInput.js +3 -2
  170. package/dist/src/web/components/typeInputs/IntegerTypeInput.d.ts +3 -6
  171. package/dist/src/web/components/typeInputs/IntegerTypeInput.js +2 -2
  172. package/dist/src/web/components/typeInputs/NestedEntityMapTypeInput.d.ts +3 -11
  173. package/dist/src/web/components/typeInputs/NestedEntityMapTypeInput.js +5 -4
  174. package/dist/src/web/components/typeInputs/ObjectTypeInput.d.ts +3 -11
  175. package/dist/src/web/components/typeInputs/ObjectTypeInput.js +8 -5
  176. package/dist/src/web/components/typeInputs/ReferenceIdentifierTypeInput.d.ts +3 -8
  177. package/dist/src/web/components/typeInputs/ReferenceIdentifierTypeInput.js +2 -2
  178. package/dist/src/web/components/typeInputs/StringTypeInput.d.ts +3 -6
  179. package/dist/src/web/components/typeInputs/StringTypeInput.js +3 -3
  180. package/dist/src/web/components/typeInputs/TypeInput.d.ts +12 -4
  181. package/dist/src/web/components/typeInputs/TypeInput.js +22 -17
  182. package/dist/src/web/components/typeInputs/utils/ValidationErrors.d.ts +1 -0
  183. package/dist/src/web/components/typeInputs/utils/ValidationErrors.js +1 -3
  184. package/dist/src/web/context/config.d.ts +11 -0
  185. package/dist/src/web/context/config.js +6 -0
  186. package/dist/src/web/context/entities.d.ts +8 -5
  187. package/dist/src/web/context/entities.js +1 -1
  188. package/dist/src/web/context/settings.d.ts +8 -0
  189. package/dist/src/web/context/settings.js +10 -0
  190. package/dist/src/web/hooks/useEntityFromRoute.d.ts +1 -1
  191. package/dist/src/web/hooks/useEntityFromRoute.js +2 -2
  192. package/dist/src/web/hooks/useInstanceNamesByEntity.d.ts +1 -1
  193. package/dist/src/web/hooks/useInstanceNamesByEntity.js +4 -2
  194. package/dist/src/web/hooks/useMappedAPIResource.js +2 -4
  195. package/dist/src/web/hooks/useSecondaryDeclarations.d.ts +1 -1
  196. package/dist/src/web/hooks/useSecondaryDeclarations.js +8 -4
  197. package/dist/src/web/hooks/useSettings.d.ts +10 -0
  198. package/dist/src/web/hooks/useSettings.js +51 -0
  199. package/dist/src/web/index.js +11 -5
  200. package/dist/src/web/routes/CreateInstance.js +40 -79
  201. package/dist/src/web/routes/Entity.js +42 -19
  202. package/dist/src/web/routes/Home.js +24 -5
  203. package/dist/src/web/routes/Instance.js +34 -85
  204. package/dist/src/web/utils/InlineMarkdown.d.ts +1 -1
  205. package/dist/src/web/utils/InlineMarkdown.js +13 -1
  206. package/dist/src/web/utils/api.d.ts +25 -0
  207. package/dist/src/web/utils/api.js +34 -0
  208. package/dist/src/web/utils/typeSkeleton.d.ts +1 -1
  209. package/dist/src/web/utils/typeSkeleton.js +2 -0
  210. package/package.json +14 -13
  211. package/public/css/styles.css +171 -12
  212. package/dist/src/node/schema/types/primitives/NumericType.d.ts +0 -6
  213. package/dist/src/node/schema/types/primitives/NumericType.js +0 -2
  214. package/dist/src/node/schema/types/primitives/PrimitiveType.d.ts +0 -6
  215. package/dist/src/node/schema/validation/type.d.ts +0 -4
  216. package/dist/src/node/schema/validation/type.js +0 -1
  217. package/dist/src/node/server/api/instanceOperations.d.ts +0 -6
  218. package/dist/src/node/server/api/instanceOperations.js +0 -93
  219. package/dist/src/shared/config.d.ts +0 -11
  220. package/dist/src/shared/config.js +0 -1
  221. package/dist/src/web/api.d.ts +0 -24
  222. package/dist/src/web/api.js +0 -201
  223. /package/dist/src/{node/schema/types/primitives/PrimitiveType.js → shared/schema/types/Type.js} +0 -0
@@ -1,8 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
2
  import { useLocation } from "preact-iso";
3
- import { useEffect, useState } from "preact/hooks";
3
+ import { useCallback, useEffect, useState } from "preact/hooks";
4
4
  import { getGitStatusForDisplay, getLabelForGitStatus, isChangedInIndex, isChangedInWorkingDir, } from "../../shared/utils/git.js";
5
- import { commitStagedFiles, createBranch, getAllEntities, getBranches, getGitStatus, pullCommits, pushCommits, stageAllFiles, stageFileOfEntity, switchBranch, unstageAllFiles, unstageFileOfEntity, } from "../api.js";
5
+ import { getAllEntities } from "../api/declarations.js";
6
+ import { commitStagedFiles, createBranch, getBranches, getStatus, pullCommits, pushCommits, stageAllFiles, stageFileOfEntity, switchBranch, unstageAllFiles, unstageFileOfEntity, } from "../api/git.js";
7
+ import { useSetting } from "../hooks/useSettings.js";
6
8
  const filterFilesForDisplay = (predicate, entities, data) => Object.entries(data.instances)
7
9
  .map(([entityName, instances]) => [
8
10
  entityName,
@@ -17,9 +19,10 @@ const GitFileList = ({ filesByEntity, onFile, isIndex = false }) => filesByEntit
17
19
  const gitStatusForDisplay = getGitStatusForDisplay(instance.gitStatus);
18
20
  return (_jsxs("li", { class: "git-instance-list-item", children: [_jsx("span", { class: "title", children: instance.displayName }), _jsx("span", { class: `git-status git-status--${gitStatusForDisplay ?? ""}`, title: getLabelForGitStatus(gitStatusForDisplay), children: gitStatusForDisplay }), _jsx("button", { onClick: () => {
19
21
  onFile(entityName, instance);
20
- }, children: isIndex ? "Unstage" : "Stage" })] }, instance.fileName));
22
+ }, children: isIndex ? "Unstage" : "Stage" })] }, instance.id));
21
23
  }) })] }, entityName))) }));
22
24
  export const Git = () => {
25
+ const [locales] = useSetting("displayedLocales");
23
26
  const [isOpen, setIsOpen] = useState(false);
24
27
  const [commitsAhead, setCommitsAhead] = useState(0);
25
28
  const [commitsBehind, setCommitsBehind] = useState(0);
@@ -29,17 +32,17 @@ export const Git = () => {
29
32
  const [entities, setEntities] = useState([]);
30
33
  const [allBranches, setAllBranches] = useState([]);
31
34
  const [currentBranch, setCurrentBranch] = useState("");
32
- const updateGitStatus = (localEntities) => Promise.all([getGitStatus(), getBranches()]).then(([statusData, branchesData]) => {
35
+ const updateGitStatus = useCallback((localEntities) => Promise.all([getStatus(locales), getBranches(locales)]).then(([statusData, branchesData]) => {
33
36
  setIndexFiles(filterFilesForDisplay(isChangedInIndex, localEntities, statusData));
34
37
  setWorkingTreeFiles(filterFilesForDisplay(isChangedInWorkingDir, localEntities, statusData));
35
38
  setCommitsAhead(statusData.commitsAhead);
36
39
  setCommitsBehind(statusData.commitsBehind);
37
40
  setAllBranches(branchesData.allBranches);
38
41
  setCurrentBranch(branchesData.currentBranch);
39
- });
42
+ }), [locales]);
40
43
  const location = useLocation();
41
44
  useEffect(() => {
42
- getAllEntities()
45
+ getAllEntities(locales)
43
46
  .then(async (data) => {
44
47
  const entitiesFromServer = data.declarations.map(decl => decl.declaration);
45
48
  setEntities(entitiesFromServer);
@@ -50,9 +53,9 @@ export const Git = () => {
50
53
  console.error("Error fetching entities:", error.toString());
51
54
  }
52
55
  });
53
- }, [location.path]);
56
+ }, [location.path, locales, updateGitStatus]);
54
57
  const stage = (entityName, instance) => {
55
- stageFileOfEntity(entityName, instance.id)
58
+ stageFileOfEntity(locales, entityName, instance.id)
56
59
  .then(() => updateGitStatus(entities))
57
60
  .catch((error) => {
58
61
  if (error instanceof Error) {
@@ -61,7 +64,7 @@ export const Git = () => {
61
64
  });
62
65
  };
63
66
  const stageAll = () => {
64
- stageAllFiles()
67
+ stageAllFiles(locales)
65
68
  .then(() => updateGitStatus(entities))
66
69
  .catch((error) => {
67
70
  if (error instanceof Error) {
@@ -70,7 +73,7 @@ export const Git = () => {
70
73
  });
71
74
  };
72
75
  const unstage = (entityName, instance) => {
73
- unstageFileOfEntity(entityName, instance.id)
76
+ unstageFileOfEntity(locales, entityName, instance.id)
74
77
  .then(() => updateGitStatus(entities))
75
78
  .catch((error) => {
76
79
  if (error instanceof Error) {
@@ -79,7 +82,7 @@ export const Git = () => {
79
82
  });
80
83
  };
81
84
  const unstageAll = () => {
82
- unstageAllFiles()
85
+ unstageAllFiles(locales)
83
86
  .then(() => updateGitStatus(entities))
84
87
  .catch((error) => {
85
88
  if (error instanceof Error) {
@@ -91,7 +94,7 @@ export const Git = () => {
91
94
  if (commitMessage.length > 0 &&
92
95
  indexFiles.length > 0 &&
93
96
  confirm("Do you want to commit all staged files?")) {
94
- commitStagedFiles(commitMessage)
97
+ commitStagedFiles(locales, commitMessage)
95
98
  .then(() => {
96
99
  setCommitMessage("");
97
100
  return updateGitStatus(entities);
@@ -104,7 +107,7 @@ export const Git = () => {
104
107
  }
105
108
  };
106
109
  const push = () => {
107
- pushCommits()
110
+ pushCommits(locales)
108
111
  .then(() => {
109
112
  alert("Pushed commits successfully");
110
113
  return updateGitStatus(entities);
@@ -114,7 +117,7 @@ export const Git = () => {
114
117
  });
115
118
  };
116
119
  const pull = () => {
117
- pullCommits()
120
+ pullCommits(locales)
118
121
  .then(() => {
119
122
  alert("Pulled commits successfully");
120
123
  return updateGitStatus(entities);
@@ -133,7 +136,7 @@ export const Git = () => {
133
136
  alert("Branch name already exists");
134
137
  return;
135
138
  }
136
- createBranch(newBranchName)
139
+ createBranch(locales, newBranchName)
137
140
  .then(() => {
138
141
  return updateGitStatus(entities);
139
142
  })
@@ -144,7 +147,7 @@ export const Git = () => {
144
147
  });
145
148
  };
146
149
  const onSwitchBranch = (event) => {
147
- switchBranch(event.currentTarget.value)
150
+ switchBranch(locales, event.currentTarget.value)
148
151
  .then(() => {
149
152
  return updateGitStatus(entities);
150
153
  })
@@ -0,0 +1,42 @@
1
+ import type { FunctionalComponent } from "preact";
2
+ import { type LocationHook } from "preact-iso";
3
+ import type { SetStateAction } from "preact/compat";
4
+ import { type Dispatch } from "preact/hooks";
5
+ import type { UnsafeEntityTaggedInstanceContainerWithChildInstances } from "../../node/utils/childInstances.ts";
6
+ import type { SerializedEntityDecl } from "../../shared/schema/declarations/EntityDecl.ts";
7
+ import { type GetDeclFromDeclName } from "../hooks/useSecondaryDeclarations.ts";
8
+ export type InstanceRouteSkeletonInitializer = (values: {
9
+ locales: string[];
10
+ entity: SerializedEntityDecl;
11
+ instanceId: string | undefined;
12
+ setInstanceContent: Dispatch<SetStateAction<unknown>>;
13
+ getDeclFromDeclName: GetDeclFromDeclName;
14
+ }) => Promise<void>;
15
+ export type InstanceRouteSkeletonOnSubmitHandler = (values: {
16
+ locales: string[];
17
+ entity: SerializedEntityDecl;
18
+ instanceId: string | undefined;
19
+ instanceContent: unknown;
20
+ buttonName: string | undefined;
21
+ customId: string;
22
+ isLocaleEntity: boolean | undefined;
23
+ childInstances: UnsafeEntityTaggedInstanceContainerWithChildInstances[];
24
+ route: LocationHook["route"];
25
+ setInstanceContent: Dispatch<SetStateAction<unknown>>;
26
+ setCustomId: Dispatch<SetStateAction<string>>;
27
+ getDeclFromDeclName: GetDeclFromDeclName;
28
+ }) => Promise<void>;
29
+ export type InstanceRouteSkeletonTitleBuilder = (values: {
30
+ locales: string[];
31
+ entity: SerializedEntityDecl;
32
+ instanceId: string | undefined;
33
+ instanceContent: unknown;
34
+ }) => string | undefined;
35
+ type Props = {
36
+ mode: "create" | "edit";
37
+ init: InstanceRouteSkeletonInitializer;
38
+ titleBuilder: InstanceRouteSkeletonTitleBuilder;
39
+ onSubmit: InstanceRouteSkeletonOnSubmitHandler;
40
+ };
41
+ export declare const InstanceRouteSkeleton: FunctionalComponent<Props>;
42
+ export {};
@@ -0,0 +1,114 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { useLocation, useRoute } from "preact-iso";
3
+ import { useCallback, useEffect, useState } from "preact/hooks";
4
+ import { removeAt } from "../../shared/utils/array.js";
5
+ import { getSerializedDisplayNameFromEntityInstance } from "../../shared/utils/displayName.js";
6
+ import { toTitleCase } from "../../shared/utils/string.js";
7
+ import { validateLocaleIdentifier } from "../../shared/validation/identifier.js";
8
+ import { deleteInstanceByEntityNameAndId, getChildInstancesForInstanceByEntityName, } from "../api/declarations.js";
9
+ import { useEntityFromRoute } from "../hooks/useEntityFromRoute.js";
10
+ import { useInstanceNamesByEntity } from "../hooks/useInstanceNamesByEntity.js";
11
+ import { useGetDeclFromDeclName, } from "../hooks/useSecondaryDeclarations.js";
12
+ import { useSetting } from "../hooks/useSettings.js";
13
+ import { homeTitle } from "../routes/Home.js";
14
+ import { NotFound } from "../routes/NotFound.js";
15
+ import { Layout } from "./Layout.js";
16
+ import { TypeInput } from "./typeInputs/TypeInput.js";
17
+ import { ValidationErrors } from "./typeInputs/utils/ValidationErrors.js";
18
+ export const InstanceRouteSkeleton = ({ mode, init, titleBuilder, onSubmit, }) => {
19
+ const { params: { name, id }, } = useRoute();
20
+ const [locales] = useSetting("displayedLocales");
21
+ const [getDeclFromDeclName, declsLoaded] = useGetDeclFromDeclName();
22
+ const { declaration: entity, isLocaleEntity } = useEntityFromRoute() ?? {};
23
+ const [instanceNamesByEntity] = useInstanceNamesByEntity();
24
+ const [instanceContent, setInstanceContent] = useState();
25
+ const [childInstances, setChildInstances] = useState([]);
26
+ const [customId, setCustomId] = useState("");
27
+ const { route } = useLocation();
28
+ useEffect(() => {
29
+ document.title =
30
+ (entity && titleBuilder({ locales, entity, instanceContent, instanceId: id })) ??
31
+ "Not found — TSONDB";
32
+ }, [entity, id, instanceContent, locales, titleBuilder]);
33
+ useEffect(() => {
34
+ if (entity && instanceContent === undefined) {
35
+ init({ locales, entity, instanceId: id, setInstanceContent, getDeclFromDeclName })
36
+ .then(() => id
37
+ ? getChildInstancesForInstanceByEntityName(locales, entity.name, id).then(result => {
38
+ setChildInstances(result.instances);
39
+ })
40
+ : Promise.resolve())
41
+ .catch((error) => {
42
+ console.error("Error initializing instance route skeleton:", error);
43
+ });
44
+ }
45
+ }, [entity, getDeclFromDeclName, id, init, instanceContent, locales, name]);
46
+ const handleSubmit = (event) => {
47
+ event.preventDefault();
48
+ if (entity && instanceContent !== undefined) {
49
+ const buttonName = event.submitter?.getAttribute("name") ?? undefined;
50
+ onSubmit({
51
+ locales,
52
+ entity,
53
+ instanceId: id,
54
+ instanceContent,
55
+ buttonName,
56
+ route,
57
+ customId,
58
+ getDeclFromDeclName,
59
+ isLocaleEntity,
60
+ setCustomId,
61
+ setInstanceContent,
62
+ childInstances,
63
+ }).catch((error) => {
64
+ console.error("Error submitting instance data:", error);
65
+ });
66
+ }
67
+ };
68
+ const handleOnChildChange = useCallback((index, value) => {
69
+ setChildInstances(old => old[index] ? old.with(index, { ...old[index], content: value }) : old);
70
+ }, []);
71
+ const handleOnChildAdd = useCallback((entityName, value) => {
72
+ setChildInstances(old => [
73
+ ...old,
74
+ { entityName, childInstances: [], id: undefined, content: value },
75
+ ]);
76
+ }, []);
77
+ const handleOnChildRemove = useCallback((index) => {
78
+ setChildInstances(old => removeAt(old, index));
79
+ }, []);
80
+ if (!name || (mode === "edit" && !id)) {
81
+ return _jsx(NotFound, {});
82
+ }
83
+ if (!entity || instanceContent === undefined || !instanceNamesByEntity || !declsLoaded) {
84
+ return (_jsxs(Layout, { breadcrumbs: [
85
+ { url: "/", label: homeTitle },
86
+ {
87
+ url: `/entities/${name}`,
88
+ label: entity ? toTitleCase(entity.namePlural) : name,
89
+ },
90
+ ], children: [_jsxs("div", { class: "header-with-btns", children: [_jsxs("h1", { class: "empty-name", children: [_jsx("span", { children: id }), " ", id && (_jsx("span", { class: "id", "aria-hidden": true, children: id }))] }), _jsx("button", { class: "destructive", disabled: true, children: "Delete" })] }), _jsx("p", { class: "loading", children: "Loading \u2026" })] }));
91
+ }
92
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Already checked for NotFound above
93
+ const defaultName = mode === "edit" ? id : customId || `New ${toTitleCase(entity.name)}`;
94
+ const instanceName = getSerializedDisplayNameFromEntityInstance(entity, instanceContent, defaultName, locales).name;
95
+ const idErrors = mode === "create" && isLocaleEntity ? validateLocaleIdentifier(customId) : [];
96
+ return (_jsxs(Layout, { breadcrumbs: [
97
+ { url: "/", label: homeTitle },
98
+ { url: `/entities/${name}`, label: toTitleCase(entity.namePlural) },
99
+ ], children: [_jsxs("div", { class: "header-with-btns", children: [_jsxs("h1", { class: instanceName.length === 0 ? "empty-name" : undefined, children: [_jsx("span", { children: instanceName || defaultName }), " ", id && (_jsx("span", { class: "id", "aria-hidden": true, children: id }))] }), id && (_jsx("button", { class: "destructive", onClick: () => {
100
+ if (confirm("Are you sure you want to delete this instance?")) {
101
+ deleteInstanceByEntityNameAndId(locales, entity.name, id)
102
+ .then(() => {
103
+ route(`/entities/${name}`);
104
+ })
105
+ .catch((error) => {
106
+ if (error instanceof Error) {
107
+ alert("Error deleting instance:\n\n" + error.toString());
108
+ }
109
+ });
110
+ }
111
+ }, children: "Delete" }))] }), !id && isLocaleEntity && (_jsxs("div", { class: "field field--id", children: [_jsx("label", { htmlFor: "id", children: "ID" }), _jsx("p", { className: "comment", children: "The instance\u2019s identifier. An IETF language tag (BCP47)." }), _jsx("input", { type: "text", id: "id", value: customId, required: true, pattern: "[a-z]{2,3}(-[A-Z]{2,3})?", placeholder: "en-US, de-DE, \u2026", onInput: event => {
112
+ setCustomId(event.currentTarget.value);
113
+ }, "aria-invalid": idErrors.length > 0 }), _jsx(ValidationErrors, { errors: idErrors })] })), _jsxs("form", { onSubmit: handleSubmit, children: [_jsx(TypeInput, { type: entity.type, value: instanceContent, path: undefined, instanceNamesByEntity: instanceNamesByEntity, childInstances: childInstances, getDeclFromDeclName: getDeclFromDeclName, onChange: setInstanceContent, onChildChange: handleOnChildChange, onChildAdd: handleOnChildAdd, onChildRemove: handleOnChildRemove }), _jsx("div", { class: "form-footer btns", children: _jsx("button", { type: "submit", name: "save", class: "primary", children: "Save" }) })] })] }));
114
+ };
@@ -1,4 +1,5 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "preact/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "preact/jsx-runtime";
2
+ import { Settings } from "./Settings.js";
2
3
  export const Layout = ({ breadcrumbs, children }) => {
3
- return (_jsxs(_Fragment, { children: [_jsx("header", { children: _jsx("nav", { children: _jsx("ol", { children: breadcrumbs.map(({ url, label }) => (_jsx("li", { children: _jsx("a", { href: url, children: label }) }, url))) }) }) }), _jsx("main", { children: children })] }));
4
+ return (_jsxs(_Fragment, { children: [_jsxs("header", { children: [_jsx("nav", { children: _jsx("ol", { children: breadcrumbs.map(({ url, label }) => (_jsx("li", { children: _jsx("a", { href: url, children: label }) }, url))) }) }), _jsx(Settings, {})] }), _jsx("main", { children: children })] }));
4
5
  };
@@ -0,0 +1,2 @@
1
+ import type { FunctionComponent } from "preact";
2
+ export declare const ModalDialog: FunctionComponent<preact.DialogHTMLAttributes>;
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "preact/jsx-runtime";
2
+ import { useEffect, useRef } from "preact/hooks";
3
+ export const ModalDialog = props => {
4
+ const ref = useRef(null);
5
+ useEffect(() => {
6
+ if (ref.current) {
7
+ if (props.open && !ref.current.open) {
8
+ ref.current.showModal();
9
+ }
10
+ else if (!props.open && ref.current.open) {
11
+ ref.current.close();
12
+ }
13
+ }
14
+ }, [props.open]);
15
+ return _jsx("dialog", { ...props, open: undefined, ref: ref });
16
+ };
@@ -1,3 +1,2 @@
1
1
  import type { FunctionalComponent } from "preact";
2
- import type { SelectHTMLAttributes } from "preact/compat";
3
- export declare const Select: FunctionalComponent<SelectHTMLAttributes>;
2
+ export declare const Select: FunctionalComponent<preact.SelectHTMLAttributes>;
@@ -0,0 +1,2 @@
1
+ import type { FunctionComponent } from "preact";
2
+ export declare const Settings: FunctionComponent;
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "preact/jsx-runtime";
2
+ import { useContext, useState } from "preact/hooks";
3
+ import { removeAt, reorder } from "../../shared/utils/array.js";
4
+ import { getLocaleInstances } from "../api/declarations.js";
5
+ import { ConfigContext } from "../context/config.js";
6
+ import { useMappedAPIResource } from "../hooks/useMappedAPIResource.js";
7
+ import { useSetting } from "../hooks/useSettings.js";
8
+ import { ModalDialog } from "./ModalDialog.js";
9
+ import { Select } from "./Select.js";
10
+ const localeMapper = (result) => result.instances;
11
+ export const Settings = () => {
12
+ const [locales, setLocales] = useSetting("displayedLocales");
13
+ const [enumDisplay, setEnumDisplay] = useSetting("enumDisplay");
14
+ const [isSettingsOpen, setIsSettingsOpen] = useState(false);
15
+ const config = useContext(ConfigContext);
16
+ const [localeInstances] = useMappedAPIResource(getLocaleInstances, localeMapper, locales, config.localeEntityName);
17
+ const [newLocale, setNewLocale] = useState("");
18
+ return (_jsxs(_Fragment, { children: [_jsx("button", { class: "settings-toggle", onClick: () => {
19
+ setIsSettingsOpen(true);
20
+ }, children: "Settings" }), _jsxs(ModalDialog, { open: isSettingsOpen, class: "settings", closedBy: "any", onClose: () => {
21
+ setIsSettingsOpen(false);
22
+ }, children: [_jsxs("header", { children: [_jsx("h2", { children: "Settings" }), _jsx("button", { class: "close", onClick: () => {
23
+ setIsSettingsOpen(false);
24
+ }, children: "Close" })] }), _jsx("h3", { children: "Display Name Locales" }), _jsx("p", { class: "description", children: "Define the locales you want to see instances displayed in. Multiple locales can be specified as fallback locales. The instances will be grouped by the locale they are available in, in the order the locales are specified in." }), _jsxs("ol", { children: [locales.length === 0 && (_jsx("li", { class: "empty", "aria-hidden": true, children: "No locales selected" })), locales.map((locale, index) => (_jsx("li", { children: _jsxs("div", { class: "locale-content", children: [_jsx("span", { children: localeInstances?.find(instance => instance.id === locale)?.displayName ?? locale }), _jsx("button", { onClick: () => {
25
+ setLocales(locales => reorder(locales, index, index - 1));
26
+ }, disabled: index === 0, children: "Move Up" }), _jsx("button", { onClick: () => {
27
+ setLocales(locales => reorder(locales, index, index + 1));
28
+ }, disabled: index === locales.length - 1, children: "Move Down" }), _jsx("button", { onClick: () => {
29
+ setLocales(locales => removeAt(locales, index));
30
+ }, disabled: locales.length < 2, children: "Remove" })] }) }, locale)))] }), _jsxs("div", { class: "add-item-container", children: [_jsxs(Select, { value: newLocale, onInput: event => {
31
+ setNewLocale(event.currentTarget.value);
32
+ }, disabled: !localeInstances || localeInstances.length === 0, children: [_jsx("option", { value: "", disabled: true, children: !localeInstances || localeInstances.length === 0
33
+ ? "No instances available"
34
+ : "No selected instance" }), localeInstances
35
+ ?.filter(instance => !locales.includes(instance.id))
36
+ .map(instance => (_jsx("option", { value: instance.id, children: instance.displayName }, instance.id)))] }), _jsxs("button", { onClick: () => {
37
+ setLocales(locales => [...locales, newLocale]);
38
+ setNewLocale("");
39
+ }, disabled: newLocale === "", children: ["Add", " ", newLocale === ""
40
+ ? "new locale"
41
+ : (localeInstances?.find(instance => instance.id === newLocale)?.displayName ??
42
+ newLocale)] })] }), _jsx("h3", { children: "Enum Display Mode" }), _jsx("p", { class: "description", children: "Choose how enumeration types are displayed." }), _jsxs("div", { className: "field--option", children: [_jsx("input", { type: "radio", name: "enum-display", id: "enum-display-select", value: "select", checked: enumDisplay === "select", onChange: () => {
43
+ setEnumDisplay("select");
44
+ } }), _jsx("label", { htmlFor: "enum-display-select", children: "Compact (Dropdowns)" })] }), _jsxs("div", { className: "field--option", children: [_jsx("input", { type: "radio", name: "enum-display", id: "enum-display-radio", value: "radio", checked: enumDisplay === "radio", onChange: () => {
45
+ setEnumDisplay("radio");
46
+ } }), _jsx("label", { htmlFor: "enum-display-radio", children: "Expanded (all nested form fields in radio lists)" })] })] })] }));
47
+ };
@@ -1,14 +1,6 @@
1
1
  import type { FunctionComponent } from "preact";
2
- import type { SerializedArrayType } from "../../../node/schema/types/generic/ArrayType.ts";
3
- import type { InstanceNamesByEntity } from "../../hooks/useInstanceNamesByEntity.ts";
4
- import type { GetDeclFromDeclName } from "../../hooks/useSecondaryDeclarations.ts";
5
- type Props = {
6
- type: SerializedArrayType;
7
- path: string | undefined;
8
- value: unknown;
9
- instanceNamesByEntity: InstanceNamesByEntity;
10
- getDeclFromDeclName: GetDeclFromDeclName;
11
- onChange: (value: unknown[]) => void;
12
- };
2
+ import type { SerializedArrayType } from "../../../shared/schema/types/ArrayType.ts";
3
+ import { type TypeInputProps } from "./TypeInput.tsx";
4
+ type Props = TypeInputProps<SerializedArrayType, unknown[]>;
13
5
  export declare const ArrayTypeInput: FunctionComponent<Props>;
14
6
  export {};
@@ -5,17 +5,18 @@ import { createTypeSkeleton } from "../../utils/typeSkeleton.js";
5
5
  import { TypeInput } from "./TypeInput.js";
6
6
  import { MismatchingTypeError } from "./utils/MismatchingTypeError.js";
7
7
  import { ValidationErrors } from "./utils/ValidationErrors.js";
8
- export const ArrayTypeInput = ({ type, path, value, instanceNamesByEntity, getDeclFromDeclName, onChange, }) => {
8
+ export const ArrayTypeInput = props => {
9
+ const { type, path, value, disabled, getDeclFromDeclName, onChange } = props;
9
10
  if (!Array.isArray(value)) {
10
11
  return _jsx(MismatchingTypeError, { expected: "array", actual: value });
11
12
  }
12
13
  const errors = validateArrayConstraints(type, value);
13
14
  const isTuple = typeof type.minItems === "number" && type.minItems === type.maxItems;
14
- return (_jsxs("div", { class: "field field--container field--array", children: [value.length > 0 && (_jsx("ol", { children: value.map((item, i) => (_jsxs("li", { class: "container-item array-item", children: [isTuple ? null : (_jsxs("div", { className: "container-item-header", children: [_jsxs("div", { className: "container-item-title", children: [i + 1, "."] }), _jsxs("button", { class: "destructive", onClick: () => {
15
+ return (_jsxs("div", { class: "field field--container field--array" + (disabled ? " field--disabled" : ""), children: [value.length > 0 && (_jsx("ol", { children: value.map((item, i) => (_jsxs("li", { class: "container-item array-item", children: [isTuple ? null : (_jsxs("div", { className: "container-item-header", children: [_jsxs("div", { className: "container-item-title", children: [i + 1, "."] }), _jsxs("button", { class: "destructive", onClick: () => {
15
16
  onChange(removeAt(value, i));
16
- }, disabled: type.minItems !== undefined && value.length <= type.minItems, children: ["Delete Item #", i + 1] })] })), _jsx(TypeInput, { type: type.items, path: path === undefined ? `[${i.toString()}]` : `${path}[${i.toString()}]`, value: item, instanceNamesByEntity: instanceNamesByEntity, getDeclFromDeclName: getDeclFromDeclName, onChange: newItem => {
17
+ }, disabled: disabled || (type.minItems !== undefined && value.length <= type.minItems), children: ["Delete Item #", i + 1] })] })), _jsx(TypeInput, { ...props, parentKey: undefined, type: type.items, path: path === undefined ? `[${i.toString()}]` : `${path}[${i.toString()}]`, value: item, onChange: newItem => {
17
18
  onChange(value.with(i, newItem));
18
19
  } })] }, i))) })), isTuple ? null : (_jsx("div", { class: "add-item-container", children: _jsxs("button", { onClick: () => {
19
20
  onChange([...value, createTypeSkeleton(getDeclFromDeclName, type.items)]);
20
- }, disabled: type.maxItems !== undefined && value.length >= type.maxItems, children: ["Add Item #", value.length + 1] }) })), _jsx(ValidationErrors, { errors: errors })] }));
21
+ }, disabled: disabled || (type.maxItems !== undefined && value.length >= type.maxItems), children: ["Add Item #", value.length + 1] }) })), _jsx(ValidationErrors, { disabled: disabled, errors: errors })] }));
21
22
  };
@@ -1,9 +1,6 @@
1
1
  import type { FunctionComponent } from "preact";
2
- import type { SerializedBooleanType } from "../../../node/schema/types/primitives/BooleanType.ts";
3
- type Props = {
4
- type: SerializedBooleanType;
5
- value: unknown;
6
- onChange: (value: boolean) => void;
7
- };
2
+ import type { SerializedBooleanType } from "../../../shared/schema/types/BooleanType.ts";
3
+ import type { TypeInputProps } from "./TypeInput.tsx";
4
+ type Props = TypeInputProps<SerializedBooleanType, boolean>;
8
5
  export declare const BooleanTypeInput: FunctionComponent<Props>;
9
6
  export {};
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx } from "preact/jsx-runtime";
2
2
  import { MismatchingTypeError } from "./utils/MismatchingTypeError.js";
3
- export const BooleanTypeInput = ({ value, onChange }) => {
3
+ export const BooleanTypeInput = ({ value, disabled, onChange }) => {
4
4
  if (typeof value !== "boolean") {
5
5
  return _jsx(MismatchingTypeError, { expected: "boolean", actual: value });
6
6
  }
7
7
  return (_jsx("div", { class: "field", children: _jsx("input", { type: "checkbox", checked: value, onInput: event => {
8
8
  onChange(event.currentTarget.checked);
9
- } }) }));
9
+ }, disabled: disabled }) }));
10
10
  };
@@ -0,0 +1,6 @@
1
+ import type { FunctionComponent } from "preact";
2
+ import type { SerializedChildEntitiesType } from "../../../shared/schema/types/ChildEntitiesType.ts";
3
+ import { type TypeInputProps } from "./TypeInput.tsx";
4
+ type Props = TypeInputProps<SerializedChildEntitiesType>;
5
+ export declare const ChildEntitiesTypeInput: FunctionComponent<Props>;
6
+ export {};
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
+ import { isSerializedEntityDecl } from "../../../shared/schema/declarations/EntityDecl.js";
3
+ import { createTypeSkeleton } from "../../utils/typeSkeleton.js";
4
+ import { TypeInput } from "./TypeInput.js";
5
+ export const ChildEntitiesTypeInput = props => {
6
+ const { type, path, childInstances, disabled, getDeclFromDeclName, onChildAdd, onChildChange, onChildRemove, } = props;
7
+ const childEntity = getDeclFromDeclName(type.entity);
8
+ const childInstancesForEntity = childInstances
9
+ .map((childInstance, index) => [
10
+ childInstance,
11
+ index,
12
+ ])
13
+ .filter(([childInstance]) => childInstance.entityName === type.entity);
14
+ if (childEntity === undefined || !isSerializedEntityDecl(childEntity)) {
15
+ return (_jsxs("div", { role: "alert", children: ["Unresolved entity declaration identifier ", _jsx("code", { children: type.entity })] }));
16
+ }
17
+ if (path === undefined) {
18
+ return _jsx("div", { role: "alert", children: "A child entities type cannot be the root type of a document." });
19
+ }
20
+ return (_jsxs("div", { class: "field field--container field--array", children: [childInstancesForEntity.length > 0 ? (_jsx("ol", { children: childInstancesForEntity.map(([item, originalIndex], i) => (_jsxs("li", { class: "container-item array-item", children: [_jsxs("div", { className: "container-item-header", children: [_jsxs("div", { className: "container-item-title", children: [i + 1, "."] }), _jsx("button", { class: "destructive", onClick: () => {
21
+ onChildRemove(i);
22
+ }, disabled: disabled, children: "Delete Item" })] }), _jsx(TypeInput, { ...props, type: childEntity.type, value: item.content, parentKey: childEntity.parentReferenceKey, onChange: newItem => {
23
+ onChildChange(originalIndex, newItem);
24
+ } })] }, i))) })) : (_jsx("p", { class: "empty", children: "No child entities" })), _jsx("div", { class: "add-item-container", children: _jsx("button", { onClick: () => {
25
+ onChildAdd(type.entity, createTypeSkeleton(getDeclFromDeclName, childEntity.type));
26
+ }, disabled: disabled, children: "Add Item" }) })] }));
27
+ };
@@ -1,9 +1,6 @@
1
1
  import type { FunctionComponent } from "preact";
2
- import type { SerializedDateType } from "../../../node/schema/types/primitives/DateType.ts";
3
- type Props = {
4
- type: SerializedDateType;
5
- value: unknown;
6
- onChange: (value: string) => void;
7
- };
2
+ import type { SerializedDateType } from "../../../shared/schema/types/DateType.ts";
3
+ import type { TypeInputProps } from "./TypeInput.tsx";
4
+ type Props = TypeInputProps<SerializedDateType, string>;
8
5
  export declare const DateTypeInput: FunctionComponent<Props>;
9
6
  export {};
@@ -2,12 +2,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime";
2
2
  import { validateDateConstraints } from "../../../shared/validation/date.js";
3
3
  import { MismatchingTypeError } from "./utils/MismatchingTypeError.js";
4
4
  import { ValidationErrors } from "./utils/ValidationErrors.js";
5
- export const DateTypeInput = ({ type, value, onChange }) => {
5
+ export const DateTypeInput = ({ type, value, disabled, onChange }) => {
6
6
  if (typeof value !== "string") {
7
7
  return _jsx(MismatchingTypeError, { expected: "date string", actual: value });
8
8
  }
9
9
  const errors = validateDateConstraints(type, value);
10
10
  return (_jsxs("div", { class: "field", children: [_jsx("input", { type: "date", value: value, onInput: event => {
11
11
  onChange(event.currentTarget.value);
12
- } }), _jsx(ValidationErrors, { errors: errors })] }));
12
+ }, disabled: disabled }), _jsx(ValidationErrors, { disabled: disabled, errors: errors })] }));
13
13
  };
@@ -1,14 +1,6 @@
1
1
  import type { FunctionComponent } from "preact";
2
- import type { SerializedEnumType } from "../../../node/schema/types/generic/EnumType.ts";
3
- import type { InstanceNamesByEntity } from "../../hooks/useInstanceNamesByEntity.ts";
4
- import type { GetDeclFromDeclName } from "../../hooks/useSecondaryDeclarations.ts";
5
- type Props = {
6
- type: SerializedEnumType;
7
- path: string | undefined;
8
- value: unknown;
9
- instanceNamesByEntity: InstanceNamesByEntity;
10
- getDeclFromDeclName: GetDeclFromDeclName;
11
- onChange: (value: unknown) => void;
12
- };
2
+ import type { SerializedEnumType } from "../../../shared/schema/types/EnumType.ts";
3
+ import { type TypeInputProps } from "./TypeInput.tsx";
4
+ type Props = TypeInputProps<SerializedEnumType>;
13
5
  export declare const EnumTypeInput: FunctionComponent<Props>;
14
6
  export {};