@dxos/react-ui-form 0.8.4-main.c4373fc → 0.8.4-main.d05539e30a

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 (234) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +0 -1
  3. package/dist/lib/browser/index.mjs +2747 -2324
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/translations.mjs +82 -0
  7. package/dist/lib/browser/translations.mjs.map +7 -0
  8. package/dist/lib/node-esm/index.mjs +2747 -2324
  9. package/dist/lib/node-esm/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/meta.json +1 -1
  11. package/dist/lib/node-esm/translations.mjs +84 -0
  12. package/dist/lib/node-esm/translations.mjs.map +7 -0
  13. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +8 -7
  14. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
  15. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts +68 -60
  16. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Form/Form.d.ts +109 -26
  18. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  19. package/dist/types/src/components/Form/Form.stories.d.ts +114 -137
  20. package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Form/FormField.d.ts +43 -0
  22. package/dist/types/src/components/Form/FormField.d.ts.map +1 -0
  23. package/dist/types/src/components/Form/FormFieldComponent.d.ts +79 -0
  24. package/dist/types/src/components/Form/FormFieldComponent.d.ts.map +1 -0
  25. package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts +9 -0
  26. package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts.map +1 -0
  27. package/dist/types/src/components/Form/FormFieldSet.d.ts +15 -0
  28. package/dist/types/src/components/Form/FormFieldSet.d.ts.map +1 -0
  29. package/dist/types/src/components/Form/fields/ArrayField.d.ts +18 -0
  30. package/dist/types/src/components/Form/fields/ArrayField.d.ts.map +1 -0
  31. package/dist/types/src/components/Form/fields/BooleanField.d.ts +4 -0
  32. package/dist/types/src/components/Form/fields/BooleanField.d.ts.map +1 -0
  33. package/dist/types/src/components/Form/fields/GeoPointField.d.ts +5 -0
  34. package/dist/types/src/components/Form/fields/GeoPointField.d.ts.map +1 -0
  35. package/dist/types/src/components/Form/fields/MarkdownField.d.ts +11 -0
  36. package/dist/types/src/components/Form/fields/MarkdownField.d.ts.map +1 -0
  37. package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts +84 -0
  38. package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts.map +1 -0
  39. package/dist/types/src/components/Form/fields/NumberField.d.ts +4 -0
  40. package/dist/types/src/components/Form/fields/NumberField.d.ts.map +1 -0
  41. package/dist/types/src/components/Form/fields/RefField.d.ts +22 -0
  42. package/dist/types/src/components/Form/fields/RefField.d.ts.map +1 -0
  43. package/dist/types/src/components/Form/fields/SelectField.d.ts +10 -0
  44. package/dist/types/src/components/Form/fields/SelectField.d.ts.map +1 -0
  45. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts +5 -0
  46. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts.map +1 -0
  47. package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts +84 -0
  48. package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts.map +1 -0
  49. package/dist/types/src/components/Form/fields/TextAreaField.d.ts +4 -0
  50. package/dist/types/src/components/Form/fields/TextAreaField.d.ts.map +1 -0
  51. package/dist/types/src/components/Form/fields/TextField.d.ts +4 -0
  52. package/dist/types/src/components/Form/fields/TextField.d.ts.map +1 -0
  53. package/dist/types/src/components/Form/fields/TupleField.d.ts +6 -0
  54. package/dist/types/src/components/Form/fields/TupleField.d.ts.map +1 -0
  55. package/dist/types/src/components/Form/fields/index.d.ts +12 -0
  56. package/dist/types/src/components/Form/fields/index.d.ts.map +1 -0
  57. package/dist/types/src/components/Form/index.d.ts +2 -4
  58. package/dist/types/src/components/Form/index.d.ts.map +1 -1
  59. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts +9 -0
  60. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts.map +1 -0
  61. package/dist/types/src/components/ObjectForm/index.d.ts +2 -0
  62. package/dist/types/src/components/ObjectForm/index.d.ts.map +1 -0
  63. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts +37 -10
  64. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -1
  65. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts +65 -59
  66. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -1
  67. package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts +9 -0
  68. package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts.map +1 -0
  69. package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts +127 -0
  70. package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts.map +1 -0
  71. package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts +2 -0
  72. package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts.map +1 -0
  73. package/dist/types/src/components/ObjectProperties/index.d.ts +2 -0
  74. package/dist/types/src/components/ObjectProperties/index.d.ts.map +1 -0
  75. package/dist/types/src/components/Settings/Settings.d.ts +51 -0
  76. package/dist/types/src/components/Settings/Settings.d.ts.map +1 -0
  77. package/dist/types/src/components/Settings/Settings.stories.d.ts +84 -0
  78. package/dist/types/src/components/Settings/Settings.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Settings/SettingsFieldSet.d.ts +43 -0
  80. package/dist/types/src/components/Settings/SettingsFieldSet.d.ts.map +1 -0
  81. package/dist/types/src/components/Settings/SettingsItem.d.ts +16 -0
  82. package/dist/types/src/components/Settings/SettingsItem.d.ts.map +1 -0
  83. package/dist/types/src/components/Settings/SettingsSelectField.d.ts +18 -0
  84. package/dist/types/src/components/Settings/SettingsSelectField.d.ts.map +1 -0
  85. package/dist/types/src/components/Settings/index.d.ts +4 -0
  86. package/dist/types/src/components/Settings/index.d.ts.map +1 -0
  87. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +15 -16
  88. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  89. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +70 -64
  90. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
  91. package/dist/types/src/components/index.d.ts +3 -1
  92. package/dist/types/src/components/index.d.ts.map +1 -1
  93. package/dist/types/src/components/testing.d.ts +4 -6
  94. package/dist/types/src/components/testing.d.ts.map +1 -1
  95. package/dist/types/src/hooks/index.d.ts +2 -3
  96. package/dist/types/src/hooks/index.d.ts.map +1 -1
  97. package/dist/types/src/hooks/useFormHandler.d.ts +82 -0
  98. package/dist/types/src/hooks/useFormHandler.d.ts.map +1 -0
  99. package/dist/types/src/hooks/useKeyHandler.d.ts +7 -0
  100. package/dist/types/src/hooks/useKeyHandler.d.ts.map +1 -0
  101. package/dist/types/src/index.d.ts +0 -2
  102. package/dist/types/src/index.d.ts.map +1 -1
  103. package/dist/types/src/translations.d.ts +65 -60
  104. package/dist/types/src/translations.d.ts.map +1 -1
  105. package/dist/types/src/util/field-type.d.ts +19 -0
  106. package/dist/types/src/util/field-type.d.ts.map +1 -0
  107. package/dist/types/src/util/field.d.ts +3 -3
  108. package/dist/types/src/util/field.d.ts.map +1 -1
  109. package/dist/types/src/util/formatting.d.ts +2 -2
  110. package/dist/types/src/util/formatting.d.ts.map +1 -1
  111. package/dist/types/src/util/index.d.ts +2 -1
  112. package/dist/types/src/util/index.d.ts.map +1 -1
  113. package/dist/types/src/util/properties.d.ts +13 -0
  114. package/dist/types/src/util/properties.d.ts.map +1 -0
  115. package/dist/types/src/util/properties.test.d.ts +2 -0
  116. package/dist/types/src/util/properties.test.d.ts.map +1 -0
  117. package/dist/types/src/util/refs.d.ts +2 -2
  118. package/dist/types/src/util/refs.d.ts.map +1 -1
  119. package/dist/types/tsconfig.tsbuildinfo +1 -1
  120. package/package.json +57 -51
  121. package/src/components/FieldEditor/FieldEditor.stories.tsx +44 -25
  122. package/src/components/FieldEditor/FieldEditor.test.tsx +0 -1
  123. package/src/components/FieldEditor/FieldEditor.tsx +76 -79
  124. package/src/components/Form/AUDIT.md +17 -0
  125. package/src/components/Form/Form.stories.tsx +139 -251
  126. package/src/components/Form/Form.tsx +375 -106
  127. package/src/components/Form/FormField.tsx +306 -0
  128. package/src/components/Form/FormFieldComponent.stories.tsx +65 -0
  129. package/src/components/Form/FormFieldComponent.tsx +174 -0
  130. package/src/components/Form/FormFieldSet.tsx +144 -0
  131. package/src/components/Form/README.md +3 -0
  132. package/src/components/Form/fields/ArrayField.tsx +155 -0
  133. package/src/components/Form/fields/BooleanField.tsx +22 -0
  134. package/src/components/Form/fields/GeoPointField.tsx +121 -0
  135. package/src/components/Form/fields/MarkdownField.stories.tsx +206 -0
  136. package/src/components/Form/fields/MarkdownField.tsx +168 -0
  137. package/src/components/Form/fields/NumberField.tsx +39 -0
  138. package/src/components/Form/fields/RefField.tsx +229 -0
  139. package/src/components/Form/fields/SelectField.tsx +65 -0
  140. package/src/components/Form/{custom/SelectOptionsInput.stories.tsx → fields/SelectOptionField.stories.tsx} +23 -18
  141. package/src/components/Form/{custom/SelectOptionsInput.tsx → fields/SelectOptionField.tsx} +30 -24
  142. package/src/components/Form/fields/TextAreaField.tsx +38 -0
  143. package/src/components/Form/fields/TextField.tsx +38 -0
  144. package/src/components/Form/{custom/TupleInput.tsx → fields/TupleField.tsx} +16 -9
  145. package/src/components/Form/fields/index.ts +15 -0
  146. package/src/components/Form/index.ts +3 -4
  147. package/src/components/ObjectForm/ObjectForm.tsx +114 -0
  148. package/src/components/{ControlSection → ObjectForm}/index.ts +1 -1
  149. package/src/components/ObjectPicker/ObjectPicker.stories.tsx +50 -45
  150. package/src/components/ObjectPicker/ObjectPicker.tsx +127 -86
  151. package/src/components/ObjectProperties/ObjectProperties.stories.tsx +362 -0
  152. package/src/components/ObjectProperties/ObjectProperties.test.tsx +101 -0
  153. package/src/components/ObjectProperties/ObjectProperties.tsx +148 -0
  154. package/src/components/ObjectProperties/index.ts +5 -0
  155. package/src/components/Settings/AUDIT.md +51 -0
  156. package/src/components/Settings/Settings.stories.tsx +104 -0
  157. package/src/components/Settings/Settings.tsx +80 -0
  158. package/src/components/Settings/SettingsFieldSet.tsx +257 -0
  159. package/src/components/Settings/SettingsItem.tsx +58 -0
  160. package/src/components/Settings/SettingsSelectField.tsx +59 -0
  161. package/src/components/Settings/index.ts +7 -0
  162. package/src/components/ViewEditor/ViewEditor.stories.tsx +73 -54
  163. package/src/components/ViewEditor/ViewEditor.test.tsx +8 -7
  164. package/src/components/ViewEditor/ViewEditor.tsx +304 -269
  165. package/src/components/index.ts +3 -1
  166. package/src/components/testing.tsx +24 -11
  167. package/src/hooks/index.ts +2 -3
  168. package/src/hooks/useFormHandler.ts +380 -0
  169. package/src/hooks/useKeyHandler.tsx +37 -0
  170. package/src/index.ts +0 -4
  171. package/src/translations.ts +70 -65
  172. package/src/util/field-type.ts +60 -0
  173. package/src/util/field.ts +25 -25
  174. package/src/util/formatting.ts +22 -22
  175. package/src/util/index.ts +2 -1
  176. package/src/util/properties.test.ts +63 -0
  177. package/src/util/properties.ts +29 -0
  178. package/src/util/refs.ts +16 -18
  179. package/dist/types/src/components/ControlSection/ControlSection.d.ts +0 -23
  180. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +0 -1
  181. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts +0 -84
  182. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +0 -1
  183. package/dist/types/src/components/ControlSection/index.d.ts +0 -2
  184. package/dist/types/src/components/ControlSection/index.d.ts.map +0 -1
  185. package/dist/types/src/components/Form/ArrayField.d.ts +0 -16
  186. package/dist/types/src/components/Form/ArrayField.d.ts.map +0 -1
  187. package/dist/types/src/components/Form/Defaults.d.ts +0 -14
  188. package/dist/types/src/components/Form/Defaults.d.ts.map +0 -1
  189. package/dist/types/src/components/Form/FormActions.d.ts +0 -9
  190. package/dist/types/src/components/Form/FormActions.d.ts.map +0 -1
  191. package/dist/types/src/components/Form/FormContent.d.ts +0 -63
  192. package/dist/types/src/components/Form/FormContent.d.ts.map +0 -1
  193. package/dist/types/src/components/Form/FormContext.d.ts +0 -23
  194. package/dist/types/src/components/Form/FormContext.d.ts.map +0 -1
  195. package/dist/types/src/components/Form/Input.d.ts +0 -29
  196. package/dist/types/src/components/Form/Input.d.ts.map +0 -1
  197. package/dist/types/src/components/Form/RefField.d.ts +0 -21
  198. package/dist/types/src/components/Form/RefField.d.ts.map +0 -1
  199. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +0 -4
  200. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +0 -1
  201. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +0 -4
  202. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +0 -1
  203. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts +0 -79
  204. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +0 -1
  205. package/dist/types/src/components/Form/custom/TupleInput.d.ts +0 -6
  206. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +0 -1
  207. package/dist/types/src/components/Form/custom/index.d.ts +0 -4
  208. package/dist/types/src/components/Form/custom/index.d.ts.map +0 -1
  209. package/dist/types/src/components/Form/factory.d.ts +0 -8
  210. package/dist/types/src/components/Form/factory.d.ts.map +0 -1
  211. package/dist/types/src/hooks/useForm.d.ts +0 -67
  212. package/dist/types/src/hooks/useForm.d.ts.map +0 -1
  213. package/dist/types/src/hooks/useQueryRefOptions.d.ts +0 -28
  214. package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +0 -1
  215. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +0 -8
  216. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +0 -1
  217. package/dist/types/src/util/schema.d.ts +0 -3
  218. package/dist/types/src/util/schema.d.ts.map +0 -1
  219. package/src/components/ControlSection/ControlSection.stories.tsx +0 -38
  220. package/src/components/ControlSection/ControlSection.tsx +0 -153
  221. package/src/components/Form/ArrayField.tsx +0 -125
  222. package/src/components/Form/Defaults.tsx +0 -205
  223. package/src/components/Form/FormActions.tsx +0 -54
  224. package/src/components/Form/FormContent.tsx +0 -322
  225. package/src/components/Form/FormContext.tsx +0 -110
  226. package/src/components/Form/Input.tsx +0 -54
  227. package/src/components/Form/RefField.tsx +0 -269
  228. package/src/components/Form/custom/GeoPointInput.tsx +0 -80
  229. package/src/components/Form/custom/index.ts +0 -7
  230. package/src/components/Form/factory.tsx +0 -31
  231. package/src/hooks/useForm.ts +0 -295
  232. package/src/hooks/useQueryRefOptions.ts +0 -59
  233. package/src/hooks/useRefQueryLookupHandler.ts +0 -39
  234. package/src/util/schema.ts +0 -12
package/package.json CHANGED
@@ -1,81 +1,87 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-form",
3
- "version": "0.8.4-main.c4373fc",
3
+ "version": "0.8.4-main.d05539e30a",
4
4
  "description": "Data components.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
- "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/dxos/dxos"
10
+ },
11
+ "license": "FSL-1.1-Apache-2.0",
8
12
  "author": "DXOS.org",
9
13
  "type": "module",
14
+ "imports": {
15
+ "#translations": "./src/translations.ts"
16
+ },
10
17
  "exports": {
11
18
  ".": {
12
19
  "source": "./src/index.ts",
13
20
  "types": "./dist/types/src/index.d.ts",
14
21
  "browser": "./dist/lib/browser/index.mjs",
15
22
  "node": "./dist/lib/node-esm/index.mjs"
23
+ },
24
+ "./translations": {
25
+ "source": "./src/translations.ts",
26
+ "types": "./dist/types/src/translations.d.ts",
27
+ "browser": "./dist/lib/browser/translations.mjs",
28
+ "node": "./dist/lib/node-esm/translations.mjs"
16
29
  }
17
30
  },
18
31
  "types": "dist/types/src/index.d.ts",
19
- "typesVersions": {
20
- "*": {}
21
- },
22
32
  "files": [
23
33
  "dist",
24
34
  "src"
25
35
  ],
26
36
  "dependencies": {
27
- "@atlaskit/pragmatic-drag-and-drop": "^1.4.0",
28
- "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
29
- "@fluentui/react-tabster": "^9.24.2",
30
- "@preact-signals/safe-react": "^0.9.0",
31
- "@preact/signals-react": "^3.2.0",
37
+ "@effect-atom/atom-react": "^0.5.0",
38
+ "@fluentui/react-tabster": "9.26.11",
32
39
  "@radix-ui/react-context": "1.1.1",
33
- "date-fns": "^3.3.1",
34
- "jsonpath": "^1.1.1",
35
- "@dxos/async": "0.8.4-main.c4373fc",
36
- "@dxos/debug": "0.8.4-main.c4373fc",
37
- "@dxos/echo": "0.8.4-main.c4373fc",
38
- "@dxos/echo-db": "0.8.4-main.c4373fc",
39
- "@dxos/echo-query": "0.8.4-main.c4373fc",
40
- "@dxos/effect": "0.8.4-main.c4373fc",
41
- "@dxos/invariant": "0.8.4-main.c4373fc",
42
- "@dxos/keys": "0.8.4-main.c4373fc",
43
- "@dxos/lit-ui": "0.8.4-main.c4373fc",
44
- "@dxos/live-object": "0.8.4-main.c4373fc",
45
- "@dxos/log": "0.8.4-main.c4373fc",
46
- "@dxos/react-ui-editor": "0.8.4-main.c4373fc",
47
- "@dxos/react-ui-components": "0.8.4-main.c4373fc",
48
- "@dxos/react-ui-list": "0.8.4-main.c4373fc",
49
- "@dxos/react-ui-pickers": "0.8.4-main.c4373fc",
50
- "@dxos/react-client": "0.8.4-main.c4373fc",
51
- "@dxos/react-ui-stack": "0.8.4-main.c4373fc",
52
- "@dxos/react-ui-searchlist": "0.8.4-main.c4373fc",
53
- "@dxos/schema": "0.8.4-main.c4373fc",
54
- "@dxos/react-ui-types": "0.8.4-main.c4373fc",
55
- "@dxos/util": "0.8.4-main.c4373fc"
40
+ "@radix-ui/react-use-controllable-state": "1.1.0",
41
+ "date-fns": "^3.6.0",
42
+ "tabster": "^8.5.5",
43
+ "@dxos/async": "0.8.4-main.d05539e30a",
44
+ "@dxos/echo": "0.8.4-main.d05539e30a",
45
+ "@dxos/echo-db": "0.8.4-main.d05539e30a",
46
+ "@dxos/echo-atom": "0.8.4-main.d05539e30a",
47
+ "@dxos/keys": "0.8.4-main.d05539e30a",
48
+ "@dxos/echo-react": "0.8.4-main.d05539e30a",
49
+ "@dxos/lit-ui": "0.8.4-main.d05539e30a",
50
+ "@dxos/log": "0.8.4-main.d05539e30a",
51
+ "@dxos/react-client": "0.8.4-main.d05539e30a",
52
+ "@dxos/react-ui-editor": "0.8.4-main.d05539e30a",
53
+ "@dxos/react-ui-list": "0.8.4-main.d05539e30a",
54
+ "@dxos/react-ui-components": "0.8.4-main.d05539e30a",
55
+ "@dxos/react-ui-pickers": "0.8.4-main.d05539e30a",
56
+ "@dxos/schema": "0.8.4-main.d05539e30a",
57
+ "@dxos/react-ui-search": "0.8.4-main.d05539e30a",
58
+ "@dxos/types": "0.8.4-main.d05539e30a",
59
+ "@dxos/ui-editor": "0.8.4-main.d05539e30a",
60
+ "@dxos/util": "0.8.4-main.d05539e30a",
61
+ "@dxos/effect": "0.8.4-main.d05539e30a",
62
+ "@dxos/invariant": "0.8.4-main.d05539e30a"
56
63
  },
57
64
  "devDependencies": {
58
- "@types/jsonpath": "^0.2.4",
59
- "@types/react": "~19.2.2",
60
- "@types/react-dom": "~19.2.1",
61
- "effect": "3.18.3",
65
+ "@types/react": "~19.2.7",
66
+ "@types/react-dom": "~19.2.3",
67
+ "effect": "3.20.0",
62
68
  "fast-check": "^3.19.0",
63
- "react": "~19.2.0",
64
- "react-dom": "~19.2.0",
65
- "vite": "7.1.9",
66
- "@dxos/random": "0.8.4-main.c4373fc",
67
- "@dxos/react-ui": "0.8.4-main.c4373fc",
68
- "@dxos/echo-signals": "0.8.4-main.c4373fc",
69
- "@dxos/storybook-utils": "0.8.4-main.c4373fc",
70
- "@dxos/react-ui-syntax-highlighter": "0.8.4-main.c4373fc",
71
- "@dxos/react-ui-theme": "0.8.4-main.c4373fc"
69
+ "react": "~19.2.3",
70
+ "react-dom": "~19.2.3",
71
+ "vite": "^8.0.13",
72
+ "@dxos/random": "0.8.4-main.d05539e30a",
73
+ "@dxos/react-client": "0.8.4-main.d05539e30a",
74
+ "@dxos/react-ui": "0.8.4-main.d05539e30a",
75
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.d05539e30a",
76
+ "@dxos/ui-theme": "0.8.4-main.d05539e30a",
77
+ "@dxos/storybook-utils": "0.8.4-main.d05539e30a"
72
78
  },
73
79
  "peerDependencies": {
74
- "effect": "^3.13.3",
75
- "react": "^19.0.0",
76
- "react-dom": "^19.0.0",
77
- "@dxos/react-ui": "0.8.4-main.c4373fc",
78
- "@dxos/react-ui-theme": "0.8.4-main.c4373fc"
80
+ "effect": "3.20.0",
81
+ "react": "~19.2.3",
82
+ "react-dom": "~19.2.3",
83
+ "@dxos/ui-theme": "0.8.4-main.d05539e30a",
84
+ "@dxos/react-ui": "0.8.4-main.d05539e30a"
79
85
  },
80
86
  "publishConfig": {
81
87
  "access": "public"
@@ -5,51 +5,73 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useEffect, useMemo } from 'react';
7
7
 
8
+ import { Filter, Query } from '@dxos/echo';
8
9
  import { createEchoSchema } from '@dxos/echo/testing';
9
10
  import { log } from '@dxos/log';
10
- import { withTheme } from '@dxos/react-ui/testing';
11
- import { ProjectionModel } from '@dxos/schema';
12
- import { TestSchema, testView } from '@dxos/schema/testing';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
+ import { ProjectionModel, ViewModel, createEchoChangeCallback } from '@dxos/schema';
13
+ import { Example } from '@dxos/schema/testing';
13
14
 
14
- import { translations } from '../../translations';
15
- import { FIELD_EDITOR_DEBUG_SYMBOL, TestLayout, TestPanel } from '../testing';
15
+ import { translations } from '#translations';
16
16
 
17
+ import { FIELD_EDITOR_DEBUG_SYMBOL, TestLayout } from '../testing';
17
18
  import { FieldEditor, type FieldEditorProps } from './FieldEditor';
18
19
 
19
- // Type definition for debug objects exposed to tests.
20
20
  export type FieldEditorDebugObjects = {
21
21
  props: FieldEditorProps;
22
22
  projection: ProjectionModel;
23
23
  };
24
24
 
25
- const DefaultStory = (props: FieldEditorProps) => {
25
+ const useTestProjection = () => {
26
+ return useMemo(() => {
27
+ const schema = createEchoSchema(Example);
28
+ const view = ViewModel.make({
29
+ name: 'Test',
30
+ query: Query.select(Filter.type(Example)),
31
+ jsonSchema: schema.jsonSchema,
32
+ });
33
+ const projection = new ProjectionModel({
34
+ view,
35
+ baseSchema: schema.jsonSchema,
36
+ change: createEchoChangeCallback(view, schema),
37
+ });
38
+ projection.normalizeView();
39
+ return { view, projection };
40
+ }, []);
41
+ };
42
+
43
+ const DefaultStory = () => {
44
+ const { view, projection } = useTestProjection();
45
+
26
46
  const handleComplete: FieldEditorProps['onSave'] = () => {
27
- log.info('onClose', { props });
47
+ log.info('onClose');
48
+ };
49
+
50
+ const props: FieldEditorProps = {
51
+ projection,
52
+ field: view.projection.fields[0],
53
+ onSave: handleComplete,
28
54
  };
29
55
 
30
56
  // Expose objects on window for test access.
31
57
  useEffect(() => {
32
- props.projection.normalizeView();
33
-
34
58
  if (typeof window !== 'undefined') {
35
59
  (window as any)[FIELD_EDITOR_DEBUG_SYMBOL] = {
36
60
  props,
37
- projection: props.projection,
61
+ projection,
38
62
  } satisfies FieldEditorDebugObjects;
39
63
  }
40
- }, [props, props.projection]);
64
+ }, [props, projection]);
41
65
 
42
66
  // NOTE(ZaymonFC): This looks awkward but it resolves an infinite parsing issue with sb.
43
67
  const json = useMemo(
44
- () => JSON.parse(JSON.stringify({ props, projection: props.projection })),
45
- [JSON.stringify(props), JSON.stringify(props.projection)],
68
+ () => JSON.parse(JSON.stringify({ props, projection })),
69
+ [JSON.stringify(props), JSON.stringify(projection)],
46
70
  );
47
71
 
48
72
  return (
49
73
  <TestLayout json={json}>
50
- <TestPanel>
51
- <FieldEditor {...props} onSave={handleComplete} />
52
- </TestPanel>
74
+ <FieldEditor {...props} />
53
75
  </TestLayout>
54
76
  );
55
77
  };
@@ -58,10 +80,13 @@ const meta = {
58
80
  title: 'ui/react-ui-form/FieldEditor',
59
81
  component: FieldEditor as any,
60
82
  render: DefaultStory,
61
- decorators: [withTheme],
83
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
62
84
  parameters: {
63
85
  layout: 'fullscreen',
64
86
  translations,
87
+ controls: {
88
+ disabled: true,
89
+ },
65
90
  },
66
91
  } satisfies Meta<typeof DefaultStory>;
67
92
 
@@ -69,10 +94,4 @@ export default meta;
69
94
 
70
95
  type Story = StoryObj<typeof meta>;
71
96
 
72
- export const Default: Story = {
73
- args: {
74
- projection: new ProjectionModel(createEchoSchema(TestSchema).jsonSchema, testView.projection),
75
- field: testView.projection.fields[0],
76
- },
77
- parameters: { controls: { disabled: true } },
78
- };
97
+ export const Default: Story = {};
@@ -9,7 +9,6 @@ import { afterEach, describe, expect, test } from 'vitest';
9
9
  import { ProjectionModel } from '@dxos/schema';
10
10
 
11
11
  import { FIELD_EDITOR_DEBUG_SYMBOL } from '../testing';
12
-
13
12
  import * as stories from './FieldEditor.stories';
14
13
  import { type FieldEditorDebugObjects } from './FieldEditor.stories';
15
14
 
@@ -4,44 +4,36 @@
4
4
 
5
5
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
6
6
 
7
- import { type EchoSchema, FormatEnum, FormatEnums, formatToType } from '@dxos/echo/internal';
8
- import { type SchemaRegistry } from '@dxos/echo-db';
7
+ import { Obj, type SchemaRegistry, type View } from '@dxos/echo';
8
+ import { type EchoSchema, Format, FormatEnums, formatToType } from '@dxos/echo/internal';
9
+ import { type SchemaProperty } from '@dxos/effect';
9
10
  import { log } from '@dxos/log';
10
11
  import { useAsyncEffect, useTranslation } from '@dxos/react-ui';
11
12
  import {
12
- type FieldType,
13
13
  type ProjectionModel,
14
14
  type PropertyType,
15
- type SchemaProperty,
16
15
  formatToAdditionalPropertyAttributes,
17
16
  getFormatSchema,
18
- getSchemaProperties,
19
- sortProperties,
20
17
  } from '@dxos/schema';
21
18
 
22
- import { translationKey } from '../../translations';
23
- import { Form, type FormProps, type InputComponent, SelectInput, SelectOptionInput } from '../Form';
19
+ import { translationKey } from '#translations';
20
+
21
+ import { getFormProperties } from '../../util';
22
+ import { Form, type FormFieldMap, type FormRootProps, SelectField, SelectOptionField } from '../Form';
24
23
 
25
24
  export type FieldEditorProps = {
26
25
  projection: ProjectionModel;
27
- field: FieldType;
28
- registry?: SchemaRegistry;
26
+ field: View.FieldType;
27
+ registry?: SchemaRegistry.SchemaRegistry;
28
+ view?: Obj.Unknown;
29
29
  onSave: () => void;
30
30
  onCancel?: () => void;
31
- } & Pick<FormProps<any>, 'outerSpacing' | 'readonly'>;
31
+ } & Pick<FormRootProps<any>, 'readonly'>;
32
32
 
33
33
  /**
34
34
  * Displays a Form representing the metadata for a given `Field` and `View`.
35
35
  */
36
- export const FieldEditor = ({
37
- readonly,
38
- projection,
39
- field,
40
- registry,
41
- onSave,
42
- onCancel,
43
- outerSpacing,
44
- }: FieldEditorProps) => {
36
+ export const FieldEditor = ({ readonly, projection, field, registry, view, onSave, onCancel }: FieldEditorProps) => {
45
37
  const { t } = useTranslation(translationKey);
46
38
  const [props, setProps] = useState<PropertyType>(projection.getFieldProjection(field.id).props);
47
39
  useEffect(() => setProps(projection.getFieldProjection(field.id).props), [field, projection]);
@@ -70,11 +62,47 @@ export const FieldEditor = ({
70
62
  // Class constructor SchemaClass cannot be invoked without 'new'.
71
63
  const [{ fieldSchema }, setFieldSchema] = useState({ fieldSchema: getFormatSchema(props?.format) });
72
64
 
73
- const handleValuesChanged = useCallback<NonNullable<FormProps<PropertyType>['onValuesChanged']>>(
65
+ const fieldMap = useMemo<FormFieldMap>(
66
+ () => ({
67
+ ['format' satisfies keyof PropertyType]: (props) => (
68
+ <SelectField
69
+ {...props}
70
+ options={FormatEnums.filter((value) => value !== Format.TypeFormat.None).map((value) => ({
71
+ value,
72
+ label: t(`format.${value}.label`),
73
+ }))}
74
+ />
75
+ ),
76
+ ['referenceSchema' satisfies keyof PropertyType]: (props) => (
77
+ <SelectField
78
+ {...props}
79
+ options={schemas.map((schema) => ({
80
+ value: schema.typename,
81
+ }))}
82
+ />
83
+ ),
84
+ ['referencePath' satisfies keyof PropertyType]: (props) => (
85
+ <SelectField
86
+ {...props}
87
+ options={
88
+ referenceSchema
89
+ ? getFormProperties(referenceSchema.ast)
90
+ .sort((a, b) => a.name.toString().localeCompare(b.name.toString()))
91
+ .map((p) => ({ value: p.name.toString() }))
92
+ : []
93
+ }
94
+ />
95
+ ),
96
+ ['options' satisfies keyof PropertyType]: (props) => <SelectOptionField {...props} />,
97
+ }),
98
+ [t, schemas, referenceSchema],
99
+ );
100
+
101
+ const propIsNotType = useCallback((props: SchemaProperty[]) => props.filter((prop) => prop.name !== 'type'), []);
102
+
103
+ const handleValuesChanged = useCallback<NonNullable<FormRootProps<PropertyType>['onValuesChanged']>>(
74
104
  (_props) => {
75
- // TODO(burdon): Callback should pass `changed` to indicate which fields have changed.
76
- // TODO(Zaymon): Workout why old and new format values are the same sometimes even when
77
- // selecting novel format values.
105
+ // TODO(Zaymon): Workout why old and new format values are the same sometimes even when selecting novel format values.
78
106
  setFieldSchema((prev) => {
79
107
  const fieldSchema = getFormatSchema(_props.format);
80
108
  if (prev.fieldSchema === fieldSchema) {
@@ -107,9 +135,9 @@ export const FieldEditor = ({
107
135
  [schemas, props.format, props.referenceSchema],
108
136
  );
109
137
 
110
- const handleValidate = useCallback<NonNullable<FormProps<PropertyType>['onValidate']>>(
138
+ const handleValidate = useCallback<NonNullable<FormRootProps<PropertyType>['onValidate']>>(
111
139
  ({ property }) => {
112
- if (property && projection.fields.find((f) => f.path === property && f.path !== field.path)) {
140
+ if (property && projection.getFields().find((f) => f.path === property && f.path !== field.path)) {
113
141
  return [
114
142
  {
115
143
  path: 'property',
@@ -118,84 +146,53 @@ export const FieldEditor = ({
118
146
  ];
119
147
  }
120
148
  },
121
- [projection.fields, field],
149
+ [projection.getFields(), field],
122
150
  );
123
151
 
124
- const handleSave = useCallback<NonNullable<FormProps<PropertyType>['onSave']>>(
152
+ const handleSave = useCallback<NonNullable<FormRootProps<PropertyType>['onSave']>>(
125
153
  (props) => {
126
- projection.setFieldProjection({ field, props });
154
+ if (view) {
155
+ Obj.update(view, () => {
156
+ projection.setFieldProjection({ field, props });
157
+ });
158
+ } else {
159
+ projection.setFieldProjection({ field, props });
160
+ }
127
161
  onSave();
128
162
  },
129
- [projection, field, onSave],
163
+ [projection, field, view, onSave],
130
164
  );
131
165
 
132
- const handleCancel = useCallback<NonNullable<FormProps<PropertyType>['onCancel']>>(() => {
166
+ const handleCancel = useCallback<NonNullable<FormRootProps<PropertyType>['onCancel']>>(() => {
167
+ onSave();
133
168
  // Need to defer to allow form to close.
134
169
  requestAnimationFrame(() => onCancel?.());
135
- onSave();
136
170
  }, [onSave]);
137
171
 
138
- const custom: Partial<Record<string, InputComponent>> = useMemo(
139
- () => ({
140
- ['format' satisfies keyof PropertyType]: (props) => (
141
- <SelectInput
142
- {...props}
143
- options={FormatEnums.filter((value) => value !== FormatEnum.None).map((value) => ({
144
- value,
145
- label: t(`format ${value}`),
146
- }))}
147
- />
148
- ),
149
- ['referenceSchema' satisfies keyof PropertyType]: (props) => (
150
- <SelectInput
151
- {...props}
152
- options={schemas.map((schema) => ({
153
- value: schema.typename,
154
- }))}
155
- />
156
- ),
157
- ['referencePath' satisfies keyof PropertyType]: (props) => (
158
- <SelectInput
159
- {...props}
160
- options={
161
- referenceSchema
162
- ? getSchemaProperties(referenceSchema.ast)
163
- .sort(sortProperties)
164
- .map((p) => ({ value: p.name }))
165
- : []
166
- }
167
- />
168
- ),
169
- ['options' satisfies keyof PropertyType]: (props) => <SelectOptionInput {...props} />,
170
- }),
171
- [t, schemas, referenceSchema],
172
- );
173
-
174
- const propIsNotType = useCallback(
175
- (props: SchemaProperty<PropertyType>[]) => props.filter((p) => p.name !== 'type'),
176
- [],
177
- );
178
-
179
172
  if (!fieldSchema) {
180
173
  log.warn('invalid format', { props });
181
174
  return null;
182
175
  }
183
176
 
184
177
  return (
185
- <Form<PropertyType>
178
+ <Form.Root<PropertyType>
186
179
  key={field.id}
180
+ fieldMap={fieldMap}
187
181
  autoFocus
188
182
  readonly={readonly}
189
- values={props}
190
183
  schema={fieldSchema}
191
- filter={propIsNotType}
184
+ values={props}
185
+ exclude={propIsNotType}
192
186
  sort={['property', 'format']}
193
187
  onValuesChanged={handleValuesChanged}
194
188
  onValidate={handleValidate}
195
189
  onSave={handleSave}
196
190
  onCancel={handleCancel}
197
- Custom={custom}
198
- outerSpacing={outerSpacing}
199
- />
191
+ >
192
+ <Form.Content>
193
+ <Form.FieldSet />
194
+ <Form.Actions />
195
+ </Form.Content>
196
+ </Form.Root>
200
197
  );
201
198
  };
@@ -0,0 +1,17 @@
1
+ # Form
2
+
3
+ ## New features/polish
4
+
5
+ - [x] Unify readonly/inline modes.
6
+ - [x] Refs
7
+ - [x] Single-select (fix popover)
8
+ - [x] Multi-select (array)
9
+ - [ ] auto save doesn't work for combobox + select due to only firing on blur (workaround is to use onValuesChanged).
10
+ - [ ] Don't call save/autoSave if value hasn't changed.
11
+ - [ ] Fix onCancel (restore values).
12
+ - [ ] Fix useSchema Type.AnyObj cast.
13
+ - [ ] TableCellEditor (handleEnter/ModalController).
14
+ - [ ] Use FormFieldWrapper uniformly
15
+ - [ ] Inline tables.
16
+ - [ ] Defer query until popover.
17
+ - [ ] Omit id from sub properties (tune Omit)