@dxos/react-ui-form 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8

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 (318) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +0 -1
  3. package/dist/lib/browser/index.mjs +4054 -2217
  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 +87 -0
  7. package/dist/lib/browser/translations.mjs.map +7 -0
  8. package/dist/lib/node-esm/index.mjs +4054 -2217
  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 +89 -0
  12. package/dist/lib/node-esm/translations.mjs.map +7 -0
  13. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +8 -8
  14. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
  15. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts +89 -5
  16. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Form/Form.d.ts +135 -25
  18. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  19. package/dist/types/src/components/Form/Form.stories.d.ts +207 -56
  20. package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Form/FormField.d.ts +52 -0
  22. package/dist/types/src/components/Form/FormField.d.ts.map +1 -0
  23. package/dist/types/src/components/Form/FormFieldComponent.d.ts +98 -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 +26 -0
  28. package/dist/types/src/components/Form/FormFieldSet.d.ts.map +1 -0
  29. package/dist/types/src/components/Form/FormTooltipsContext.d.ts +19 -0
  30. package/dist/types/src/components/Form/FormTooltipsContext.d.ts.map +1 -0
  31. package/dist/types/src/components/Form/Layout/FormLayout.d.ts +50 -0
  32. package/dist/types/src/components/Form/Layout/FormLayout.d.ts.map +1 -0
  33. package/dist/types/src/components/Form/Layout/FormLayout.stories.d.ts +123 -0
  34. package/dist/types/src/components/Form/Layout/FormLayout.stories.d.ts.map +1 -0
  35. package/dist/types/src/components/Form/Layout/FormLayout.stories.test.d.ts +2 -0
  36. package/dist/types/src/components/Form/Layout/FormLayout.stories.test.d.ts.map +1 -0
  37. package/dist/types/src/components/Form/Layout/FormLayout.test.d.ts +2 -0
  38. package/dist/types/src/components/Form/Layout/FormLayout.test.d.ts.map +1 -0
  39. package/dist/types/src/components/Form/Layout/annotation.d.ts +30 -0
  40. package/dist/types/src/components/Form/Layout/annotation.d.ts.map +1 -0
  41. package/dist/types/src/components/Form/Layout/index.d.ts +4 -0
  42. package/dist/types/src/components/Form/Layout/index.d.ts.map +1 -0
  43. package/dist/types/src/components/Form/Layout/parser.d.ts +31 -0
  44. package/dist/types/src/components/Form/Layout/parser.d.ts.map +1 -0
  45. package/dist/types/src/components/Form/Layout/parser.test.d.ts +2 -0
  46. package/dist/types/src/components/Form/Layout/parser.test.d.ts.map +1 -0
  47. package/dist/types/src/components/Form/fields/ArrayField.d.ts +18 -0
  48. package/dist/types/src/components/Form/fields/ArrayField.d.ts.map +1 -0
  49. package/dist/types/src/components/Form/fields/BooleanField.d.ts +4 -0
  50. package/dist/types/src/components/Form/fields/BooleanField.d.ts.map +1 -0
  51. package/dist/types/src/components/Form/fields/DateField.d.ts +4 -0
  52. package/dist/types/src/components/Form/fields/DateField.d.ts.map +1 -0
  53. package/dist/types/src/components/Form/fields/GeoPointField.d.ts +5 -0
  54. package/dist/types/src/components/Form/fields/GeoPointField.d.ts.map +1 -0
  55. package/dist/types/src/components/Form/fields/InlineRefField.d.ts +13 -0
  56. package/dist/types/src/components/Form/fields/InlineRefField.d.ts.map +1 -0
  57. package/dist/types/src/components/Form/fields/MarkdownField.d.ts +11 -0
  58. package/dist/types/src/components/Form/fields/MarkdownField.d.ts.map +1 -0
  59. package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts +89 -0
  60. package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts.map +1 -0
  61. package/dist/types/src/components/Form/fields/NumberField.d.ts +4 -0
  62. package/dist/types/src/components/Form/fields/NumberField.d.ts.map +1 -0
  63. package/dist/types/src/components/Form/fields/RefField.d.ts +34 -0
  64. package/dist/types/src/components/Form/fields/RefField.d.ts.map +1 -0
  65. package/dist/types/src/components/Form/fields/RefField.test.d.ts +2 -0
  66. package/dist/types/src/components/Form/fields/RefField.test.d.ts.map +1 -0
  67. package/dist/types/src/components/Form/fields/SelectField.d.ts +13 -0
  68. package/dist/types/src/components/Form/fields/SelectField.d.ts.map +1 -0
  69. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts +5 -0
  70. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts.map +1 -0
  71. package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts +89 -0
  72. package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/Form/fields/TextAreaField.d.ts +4 -0
  74. package/dist/types/src/components/Form/fields/TextAreaField.d.ts.map +1 -0
  75. package/dist/types/src/components/Form/fields/TextField.d.ts +4 -0
  76. package/dist/types/src/components/Form/fields/TextField.d.ts.map +1 -0
  77. package/dist/types/src/components/Form/fields/TupleField.d.ts +6 -0
  78. package/dist/types/src/components/Form/fields/TupleField.d.ts.map +1 -0
  79. package/dist/types/src/components/Form/fields/index.d.ts +14 -0
  80. package/dist/types/src/components/Form/fields/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Form/index.d.ts +5 -4
  82. package/dist/types/src/components/Form/index.d.ts.map +1 -1
  83. package/dist/types/src/components/Form/meta-tags.d.ts +30 -0
  84. package/dist/types/src/components/Form/meta-tags.d.ts.map +1 -0
  85. package/dist/types/src/components/Form/meta-tags.test.d.ts +2 -0
  86. package/dist/types/src/components/Form/meta-tags.test.d.ts.map +1 -0
  87. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts +8 -0
  88. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts.map +1 -0
  89. package/dist/types/src/components/ObjectForm/ObjectForm.stories.d.ts +87 -0
  90. package/dist/types/src/components/ObjectForm/ObjectForm.stories.d.ts.map +1 -0
  91. package/dist/types/src/components/ObjectForm/index.d.ts +2 -0
  92. package/dist/types/src/components/ObjectForm/index.d.ts.map +1 -0
  93. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts +68 -0
  94. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -0
  95. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts +92 -0
  96. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -0
  97. package/dist/types/src/components/ObjectPicker/index.d.ts +2 -0
  98. package/dist/types/src/components/ObjectPicker/index.d.ts.map +1 -0
  99. package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts +9 -0
  100. package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts.map +1 -0
  101. package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts +132 -0
  102. package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts.map +1 -0
  103. package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts +2 -0
  104. package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts.map +1 -0
  105. package/dist/types/src/components/ObjectProperties/index.d.ts +2 -0
  106. package/dist/types/src/components/ObjectProperties/index.d.ts.map +1 -0
  107. package/dist/types/src/components/ObjectTree/ObjectTree.d.ts +9 -0
  108. package/dist/types/src/components/ObjectTree/ObjectTree.d.ts.map +1 -0
  109. package/dist/types/src/components/ObjectTree/ObjectTree.stories.d.ts +91 -0
  110. package/dist/types/src/components/ObjectTree/ObjectTree.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/ObjectTree/index.d.ts +2 -0
  112. package/dist/types/src/components/ObjectTree/index.d.ts.map +1 -0
  113. package/dist/types/src/components/RefEditor/RefEditor.d.ts +73 -0
  114. package/dist/types/src/components/RefEditor/RefEditor.d.ts.map +1 -0
  115. package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts +92 -0
  116. package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts.map +1 -0
  117. package/dist/types/src/components/RefEditor/index.d.ts +3 -0
  118. package/dist/types/src/components/RefEditor/index.d.ts.map +1 -0
  119. package/dist/types/src/components/RefEditor/ref-editor-extension.d.ts +47 -0
  120. package/dist/types/src/components/RefEditor/ref-editor-extension.d.ts.map +1 -0
  121. package/dist/types/src/components/Settings/Settings.d.ts +51 -0
  122. package/dist/types/src/components/Settings/Settings.d.ts.map +1 -0
  123. package/dist/types/src/components/Settings/Settings.stories.d.ts +89 -0
  124. package/dist/types/src/components/Settings/Settings.stories.d.ts.map +1 -0
  125. package/dist/types/src/components/Settings/SettingsFieldSet.d.ts +43 -0
  126. package/dist/types/src/components/Settings/SettingsFieldSet.d.ts.map +1 -0
  127. package/dist/types/src/components/Settings/SettingsItem.d.ts +16 -0
  128. package/dist/types/src/components/Settings/SettingsItem.d.ts.map +1 -0
  129. package/dist/types/src/components/Settings/SettingsSelectField.d.ts +18 -0
  130. package/dist/types/src/components/Settings/SettingsSelectField.d.ts.map +1 -0
  131. package/dist/types/src/components/Settings/index.d.ts +4 -0
  132. package/dist/types/src/components/Settings/index.d.ts.map +1 -0
  133. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +21 -11
  134. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  135. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +91 -9
  136. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
  137. package/dist/types/src/components/index.d.ts +6 -2
  138. package/dist/types/src/components/index.d.ts.map +1 -1
  139. package/dist/types/src/components/testing.d.ts +14 -4
  140. package/dist/types/src/components/testing.d.ts.map +1 -1
  141. package/dist/types/src/hooks/index.d.ts +2 -3
  142. package/dist/types/src/hooks/index.d.ts.map +1 -1
  143. package/dist/types/src/hooks/useFormHandler.d.ts +82 -0
  144. package/dist/types/src/hooks/useFormHandler.d.ts.map +1 -0
  145. package/dist/types/src/hooks/useKeyHandler.d.ts +7 -0
  146. package/dist/types/src/hooks/useKeyHandler.d.ts.map +1 -0
  147. package/dist/types/src/index.d.ts +0 -2
  148. package/dist/types/src/index.d.ts.map +1 -1
  149. package/dist/types/src/translations.d.ts +70 -55
  150. package/dist/types/src/translations.d.ts.map +1 -1
  151. package/dist/types/src/util/field-type.d.ts +19 -0
  152. package/dist/types/src/util/field-type.d.ts.map +1 -0
  153. package/dist/types/src/util/field.d.ts +3 -3
  154. package/dist/types/src/util/field.d.ts.map +1 -1
  155. package/dist/types/src/util/formatting.d.ts +2 -2
  156. package/dist/types/src/util/formatting.d.ts.map +1 -1
  157. package/dist/types/src/util/index.d.ts +2 -1
  158. package/dist/types/src/util/index.d.ts.map +1 -1
  159. package/dist/types/src/util/properties.d.ts +35 -0
  160. package/dist/types/src/util/properties.d.ts.map +1 -0
  161. package/dist/types/src/util/properties.test.d.ts +2 -0
  162. package/dist/types/src/util/properties.test.d.ts.map +1 -0
  163. package/dist/types/src/util/refs.d.ts +3 -3
  164. package/dist/types/src/util/refs.d.ts.map +1 -1
  165. package/dist/types/tsconfig.tsbuildinfo +1 -1
  166. package/package.json +64 -47
  167. package/src/components/FieldEditor/FieldEditor.stories.tsx +49 -31
  168. package/src/components/FieldEditor/FieldEditor.test.tsx +4 -2
  169. package/src/components/FieldEditor/FieldEditor.tsx +100 -97
  170. package/src/components/Form/AUDIT.md +17 -0
  171. package/src/components/Form/Form.stories.tsx +151 -221
  172. package/src/components/Form/Form.tsx +461 -95
  173. package/src/components/Form/FormField.tsx +345 -0
  174. package/src/components/Form/FormFieldComponent.stories.tsx +65 -0
  175. package/src/components/Form/FormFieldComponent.tsx +253 -0
  176. package/src/components/Form/FormFieldSet.tsx +213 -0
  177. package/src/components/Form/FormTooltipsContext.ts +25 -0
  178. package/src/components/Form/Layout/FormLayout.stories.test.tsx +51 -0
  179. package/src/components/Form/Layout/FormLayout.stories.tsx +422 -0
  180. package/src/components/Form/Layout/FormLayout.test.ts +59 -0
  181. package/src/components/Form/Layout/FormLayout.tsx +251 -0
  182. package/src/components/Form/Layout/annotation.ts +38 -0
  183. package/src/components/Form/Layout/index.ts +7 -0
  184. package/src/components/Form/Layout/parser.test.ts +120 -0
  185. package/src/components/Form/Layout/parser.ts +167 -0
  186. package/src/components/Form/README.md +3 -0
  187. package/src/components/Form/fields/ArrayField.tsx +173 -0
  188. package/src/components/Form/fields/BooleanField.tsx +22 -0
  189. package/src/components/Form/fields/DateField.tsx +101 -0
  190. package/src/components/Form/fields/GeoPointField.tsx +124 -0
  191. package/src/components/Form/fields/InlineRefField.tsx +138 -0
  192. package/src/components/Form/fields/MarkdownField.stories.tsx +206 -0
  193. package/src/components/Form/fields/MarkdownField.tsx +167 -0
  194. package/src/components/Form/fields/NumberField.tsx +76 -0
  195. package/src/components/Form/fields/RefField.test.ts +45 -0
  196. package/src/components/Form/fields/RefField.tsx +266 -0
  197. package/src/components/Form/fields/SelectField.tsx +77 -0
  198. package/src/components/Form/fields/SelectOptionField.stories.tsx +66 -0
  199. package/src/components/Form/{custom/SelectOptionsInput.tsx → fields/SelectOptionField.tsx} +39 -32
  200. package/src/components/Form/fields/TextAreaField.tsx +38 -0
  201. package/src/components/Form/fields/TextField.tsx +38 -0
  202. package/src/components/Form/fields/TupleField.tsx +55 -0
  203. package/src/components/Form/fields/index.ts +17 -0
  204. package/src/components/Form/index.ts +6 -4
  205. package/src/components/Form/meta-tags.test.ts +47 -0
  206. package/src/components/Form/meta-tags.ts +33 -0
  207. package/src/components/ObjectForm/ObjectForm.stories.tsx +62 -0
  208. package/src/components/ObjectForm/ObjectForm.tsx +111 -0
  209. package/src/components/{ControlSection → ObjectForm}/index.ts +1 -1
  210. package/src/components/ObjectPicker/ObjectPicker.stories.tsx +212 -0
  211. package/src/components/ObjectPicker/ObjectPicker.tsx +202 -0
  212. package/src/components/ObjectPicker/index.ts +5 -0
  213. package/src/components/ObjectProperties/ObjectProperties.stories.tsx +350 -0
  214. package/src/components/ObjectProperties/ObjectProperties.test.tsx +111 -0
  215. package/src/components/ObjectProperties/ObjectProperties.tsx +146 -0
  216. package/src/components/ObjectProperties/index.ts +5 -0
  217. package/src/components/ObjectTree/ObjectTree.stories.tsx +134 -0
  218. package/src/components/ObjectTree/ObjectTree.tsx +190 -0
  219. package/src/components/ObjectTree/index.ts +5 -0
  220. package/src/components/RefEditor/RefEditor.stories.tsx +148 -0
  221. package/src/components/RefEditor/RefEditor.tsx +275 -0
  222. package/src/components/RefEditor/index.ts +6 -0
  223. package/src/components/RefEditor/ref-editor-extension.ts +254 -0
  224. package/src/components/Settings/AUDIT.md +51 -0
  225. package/src/components/Settings/Settings.stories.tsx +104 -0
  226. package/src/components/Settings/Settings.tsx +81 -0
  227. package/src/components/Settings/SettingsFieldSet.tsx +257 -0
  228. package/src/components/Settings/SettingsItem.tsx +58 -0
  229. package/src/components/Settings/SettingsSelectField.tsx +59 -0
  230. package/src/components/Settings/index.ts +7 -0
  231. package/src/components/ViewEditor/ViewEditor.stories.tsx +132 -64
  232. package/src/components/ViewEditor/ViewEditor.test.tsx +23 -22
  233. package/src/components/ViewEditor/ViewEditor.tsx +378 -216
  234. package/src/components/index.ts +6 -3
  235. package/src/components/testing.tsx +31 -12
  236. package/src/hooks/index.ts +2 -3
  237. package/src/hooks/useFormHandler.ts +380 -0
  238. package/src/hooks/useKeyHandler.tsx +37 -0
  239. package/src/index.ts +0 -4
  240. package/src/translations.ts +76 -59
  241. package/src/util/field-type.ts +60 -0
  242. package/src/util/field.ts +33 -43
  243. package/src/util/formatting.ts +22 -22
  244. package/src/util/index.ts +2 -1
  245. package/src/util/properties.test.ts +153 -0
  246. package/src/util/properties.ts +100 -0
  247. package/src/util/refs.ts +20 -19
  248. package/src/vite-env.d.ts +10 -0
  249. package/dist/types/src/components/ControlSection/ControlSection.d.ts +0 -23
  250. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +0 -1
  251. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts +0 -8
  252. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +0 -1
  253. package/dist/types/src/components/ControlSection/index.d.ts +0 -2
  254. package/dist/types/src/components/ControlSection/index.d.ts.map +0 -1
  255. package/dist/types/src/components/Form/ArrayField.d.ts +0 -16
  256. package/dist/types/src/components/Form/ArrayField.d.ts.map +0 -1
  257. package/dist/types/src/components/Form/Defaults.d.ts +0 -14
  258. package/dist/types/src/components/Form/Defaults.d.ts.map +0 -1
  259. package/dist/types/src/components/Form/FormActions.d.ts +0 -9
  260. package/dist/types/src/components/Form/FormActions.d.ts.map +0 -1
  261. package/dist/types/src/components/Form/FormContent.d.ts +0 -57
  262. package/dist/types/src/components/Form/FormContent.d.ts.map +0 -1
  263. package/dist/types/src/components/Form/FormContext.d.ts +0 -23
  264. package/dist/types/src/components/Form/FormContext.d.ts.map +0 -1
  265. package/dist/types/src/components/Form/Input.d.ts +0 -26
  266. package/dist/types/src/components/Form/Input.d.ts.map +0 -1
  267. package/dist/types/src/components/Form/RefField.d.ts +0 -12
  268. package/dist/types/src/components/Form/RefField.d.ts.map +0 -1
  269. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +0 -4
  270. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +0 -1
  271. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +0 -4
  272. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +0 -1
  273. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts +0 -7
  274. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +0 -1
  275. package/dist/types/src/components/Form/custom/TupleInput.d.ts +0 -6
  276. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +0 -1
  277. package/dist/types/src/components/Form/custom/index.d.ts +0 -4
  278. package/dist/types/src/components/Form/custom/index.d.ts.map +0 -1
  279. package/dist/types/src/components/Form/factory.d.ts +0 -8
  280. package/dist/types/src/components/Form/factory.d.ts.map +0 -1
  281. package/dist/types/src/components/deprecated/Form.d.ts +0 -15
  282. package/dist/types/src/components/deprecated/Form.d.ts.map +0 -1
  283. package/dist/types/src/components/deprecated/Form.stories.d.ts +0 -13
  284. package/dist/types/src/components/deprecated/Form.stories.d.ts.map +0 -1
  285. package/dist/types/src/components/deprecated/FormInput.d.ts +0 -16
  286. package/dist/types/src/components/deprecated/FormInput.d.ts.map +0 -1
  287. package/dist/types/src/components/deprecated/index.d.ts +0 -2
  288. package/dist/types/src/components/deprecated/index.d.ts.map +0 -1
  289. package/dist/types/src/hooks/useForm.d.ts +0 -67
  290. package/dist/types/src/hooks/useForm.d.ts.map +0 -1
  291. package/dist/types/src/hooks/useQueryRefOptions.d.ts +0 -23
  292. package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +0 -1
  293. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +0 -8
  294. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +0 -1
  295. package/dist/types/src/util/schema.d.ts +0 -3
  296. package/dist/types/src/util/schema.d.ts.map +0 -1
  297. package/src/components/ControlSection/ControlSection.stories.tsx +0 -42
  298. package/src/components/ControlSection/ControlSection.tsx +0 -139
  299. package/src/components/Form/ArrayField.tsx +0 -125
  300. package/src/components/Form/Defaults.tsx +0 -204
  301. package/src/components/Form/FormActions.tsx +0 -54
  302. package/src/components/Form/FormContent.tsx +0 -241
  303. package/src/components/Form/FormContext.tsx +0 -110
  304. package/src/components/Form/Input.tsx +0 -51
  305. package/src/components/Form/RefField.tsx +0 -214
  306. package/src/components/Form/custom/GeoPointInput.tsx +0 -72
  307. package/src/components/Form/custom/SelectOptionsInput.stories.tsx +0 -62
  308. package/src/components/Form/custom/TupleInput.tsx +0 -47
  309. package/src/components/Form/custom/index.ts +0 -7
  310. package/src/components/Form/factory.tsx +0 -31
  311. package/src/components/deprecated/Form.stories.tsx +0 -63
  312. package/src/components/deprecated/Form.tsx +0 -119
  313. package/src/components/deprecated/FormInput.tsx +0 -71
  314. package/src/components/deprecated/index.ts +0 -5
  315. package/src/hooks/useForm.ts +0 -293
  316. package/src/hooks/useQueryRefOptions.ts +0 -53
  317. package/src/hooks/useRefQueryLookupHandler.ts +0 -39
  318. package/src/util/schema.ts +0 -14
@@ -2,266 +2,196 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
- import { Schema } from 'effect';
6
+ import * as Schema from 'effect/Schema';
9
7
  import React, { useCallback, useState } from 'react';
10
8
 
11
- import { ContactType } from '@dxos/client/testing';
12
- import { type BaseObject, Expando, Format, Ref, type TypeAnnotation, getObjectDXN } from '@dxos/echo-schema';
13
- import { live } from '@dxos/live-object';
14
- import { withSurfaceVariantsLayout } from '@dxos/react-ui/testing';
15
- import { Testing } from '@dxos/schema/testing';
16
- import { withLayout, withTheme } from '@dxos/storybook-utils';
17
-
18
- import { translations } from '../../translations';
19
- import { TestLayout, TestPanel } from '../testing';
9
+ import { DXN, Annotation, Format, Obj, Ref, Tag, Type } from '@dxos/echo';
10
+ import { type AnyProperties } from '@dxos/echo/internal';
11
+ import { log } from '@dxos/log';
12
+ import { useSpaces } from '@dxos/react-client/echo';
13
+ import { withClientProvider } from '@dxos/react-client/testing';
14
+ import { Tooltip } from '@dxos/react-ui';
15
+ import { Loading, withLayout, withTheme } from '@dxos/react-ui/testing';
20
16
 
21
- import { SelectInput } from './Defaults';
22
- import { Form, type FormProps } from './Form';
23
-
24
- const AddressSchema = Schema.Struct({
25
- street: Schema.optional(Schema.String.annotations({ title: 'Street' })),
26
- city: Schema.optional(Schema.String.annotations({ title: 'City' })),
27
- zip: Schema.optional(Schema.String.pipe(Schema.pattern(/^\d{5}(-\d{4})?$/)).annotations({ title: 'ZIP' })),
28
- location: Schema.optional(Format.GeoPoint.annotations({ title: 'Location' })),
29
- }).annotations({ title: 'Address' });
17
+ import { translations } from '#translations';
30
18
 
31
- // TODO(burdon): Translations?
32
- const TestSchema = Schema.Struct({
33
- name: Schema.optional(Schema.String.annotations({ title: 'Name' })),
34
- active: Schema.optional(Schema.Boolean.annotations({ title: 'Active' })),
35
- rank: Schema.optional(Schema.Number.annotations({ title: 'Rank' })),
36
- website: Schema.optional(Format.URL.annotations({ title: 'Website' })),
37
- address: Schema.optional(AddressSchema),
38
- }).pipe(Schema.mutable);
19
+ import { TestLayout } from '../testing';
20
+ import { type ExcludeId, Form, type FormRootProps, omitId } from './Form';
39
21
 
40
- type TestType = Schema.Schema.Type<typeof TestSchema>;
22
+ const Organization = Schema.Struct({
23
+ name: Schema.String.pipe(Schema.minLength(1)).annotations({ title: 'Full name' }),
24
+ }).pipe(Type.makeObject(DXN.make('com.example.type.organization', '0.1.0')));
41
25
 
42
- type StoryProps<T extends BaseObject> = { schema: Schema.Schema<T> } & FormProps<T>;
26
+ export type Organization = Type.InstanceType<typeof Organization>;
43
27
 
44
- const DefaultStory = <T extends BaseObject>({ schema, values: initialValues, ...props }: StoryProps<T>) => {
45
- const [values, setValues] = useState(initialValues);
46
- const handleSave = useCallback<NonNullable<FormProps<T>['onSave']>>((values) => {
28
+ const Person = Schema.Struct({
29
+ name: Schema.String.pipe(Schema.minLength(1)).annotations({ title: 'Full name' }),
30
+ ignore: Schema.String.pipe(Annotation.FormInputAnnotation.set(false), Schema.optional),
31
+ active: Schema.optional(Schema.Boolean.annotations({ title: 'Active' })),
32
+ address: Schema.optional(
33
+ Schema.Struct({
34
+ street: Schema.String,
35
+ city: Schema.String,
36
+ // TODO(burdon): Constrain input control.
37
+ state: Schema.String.pipe(Schema.minLength(2), Schema.maxLength(2)).annotations({
38
+ title: 'State',
39
+ description: 'State code',
40
+ }),
41
+ zip: Schema.Number.annotations({ title: 'ZIP Code' }),
42
+ }).annotations({ title: 'Address' }),
43
+ ),
44
+ employer: Schema.optional(Ref.Ref(Organization).annotations({ title: 'Employer' })),
45
+ tags: Schema.optional(Schema.Array(Ref.Ref(Tag.Tag)).annotations({ title: 'Tags' })),
46
+ status: Schema.optional(Schema.Literal('active', 'inactive').annotations({ title: 'Status' })),
47
+ notes: Schema.optional(Format.Text.annotations({ title: 'Notes' })),
48
+ location: Schema.optional(Format.GeoPoint.annotations({ title: 'Location' })),
49
+ birthday: Schema.optional(Format.DateOnly.annotations({ title: 'Birthday' })),
50
+ meetingAt: Schema.optional(Format.DateTime.annotations({ title: 'Next meeting' })),
51
+ reminderAt: Schema.optional(Format.TimeOnly.annotations({ title: 'Reminder time' })),
52
+ tasks: Schema.optional(Schema.Array(Schema.String).annotations({ title: 'Tasks' })),
53
+ locations: Schema.optional(Schema.Array(Format.GeoPoint).annotations({ title: 'Locations' })),
54
+ identities: Schema.optional(
55
+ Schema.Array(
56
+ Schema.Struct({
57
+ type: Schema.String.annotations({ title: 'Type' }),
58
+ value: Schema.String.annotations({ title: 'Value' }),
59
+ }).annotations({ title: 'Identities' }),
60
+ ).annotations({
61
+ title: 'Identities',
62
+ }),
63
+ ),
64
+ }).pipe(Type.makeObject(DXN.make('org.dxos.type.person', '0.1.0')));
65
+
66
+ export type Person = Type.InstanceType<typeof Person>;
67
+
68
+ type DefaultStoryProps<T extends AnyProperties> = {
69
+ schema?: Schema.Schema<T>;
70
+ } & FormRootProps<T>;
71
+
72
+ const DefaultStory = <T extends AnyProperties = AnyProperties>({
73
+ schema,
74
+ values: valuesProp,
75
+ ...props
76
+ }: DefaultStoryProps<T>) => {
77
+ const [values, setValues] = useState<Partial<T>>(valuesProp ?? {});
78
+ const spaces = useSpaces();
79
+ const space = spaces[0];
80
+ const handleSave = useCallback<NonNullable<FormRootProps<T>['onSave']>>((values) => {
81
+ log.info('save', { values, meta });
47
82
  setValues(values);
48
83
  }, []);
49
84
 
50
- return <Form<T> schema={schema} values={values} onSave={handleSave} {...props} />;
51
- };
52
-
53
- const DebugStory = <T extends BaseObject>({ schema, values: initialValues, ...props }: StoryProps<T>) => {
54
- const [values, setValues] = useState(initialValues);
55
- const handleSave = useCallback<NonNullable<FormProps<T>['onSave']>>((values) => {
56
- setValues(values);
85
+ const handleCancel = useCallback<NonNullable<FormRootProps<T>['onCancel']>>(() => {
86
+ log.info('cancel');
87
+ setValues(valuesProp ?? {});
57
88
  }, []);
58
89
 
90
+ if (!space) {
91
+ return <Loading />;
92
+ }
93
+
59
94
  return (
60
- <TestLayout json={{ values, schema: schema.ast.toJSON() }}>
61
- <TestPanel>
62
- <Form<T> schema={schema} values={values} onSave={handleSave} {...props} />
63
- </TestPanel>
64
- </TestLayout>
95
+ <Tooltip.Provider>
96
+ <TestLayout json={{ values, schema: schema?.ast }}>
97
+ <Form.Root
98
+ schema={schema}
99
+ defaultValues={values}
100
+ db={space.db}
101
+ onSave={handleSave}
102
+ onCancel={handleCancel}
103
+ {...props}
104
+ >
105
+ <Form.Viewport scroll>
106
+ <Form.Content>
107
+ <Form.Section label='Section' description='This is a section' />
108
+ <Form.FieldSet />
109
+ <Form.Actions />
110
+ </Form.Content>
111
+ </Form.Viewport>
112
+ </Form.Root>
113
+ </TestLayout>
114
+ </Tooltip.Provider>
65
115
  );
66
116
  };
67
117
 
68
- const meta: Meta<StoryProps<any>> = {
118
+ const meta = {
69
119
  title: 'ui/react-ui-form/Form',
70
- component: Form<any>,
71
- render: DebugStory,
72
- decorators: [withLayout({ fullscreen: true }), withTheme],
120
+ component: Form.Root,
121
+ render: DefaultStory,
122
+ decorators: [
123
+ withTheme(),
124
+ withLayout({ layout: 'fullscreen' }),
125
+ withClientProvider({
126
+ createIdentity: true,
127
+ createSpace: true,
128
+ types: [Tag.Tag, Organization, Person],
129
+ onCreateSpace: ({ space }) => {
130
+ [
131
+ ...Array.from({ length: 3 }).map((_, i) => Obj.make(Tag.Tag, { label: `Tag ${i}` })),
132
+ ...Array.from({ length: 50 }).map((_, i) => Obj.make(Organization, { name: `Organization ${i}` })),
133
+ ].map((obj) => space.db.add(obj));
134
+ },
135
+ }),
136
+ ],
73
137
  parameters: {
138
+ layout: 'fullscreen',
74
139
  translations,
75
140
  },
76
- argTypes: {
77
- readonly: {
78
- control: 'boolean',
79
- description: 'Readonly',
80
- },
81
- },
82
- };
141
+ } satisfies Meta<DefaultStoryProps<any>>;
83
142
 
84
143
  export default meta;
85
144
 
86
- type Story<T extends BaseObject> = StoryObj<StoryProps<T>>;
145
+ type Story<T extends AnyProperties> = StoryObj<DefaultStoryProps<T>>;
87
146
 
88
- export const Default: Story<TestType> = {
89
- render: DefaultStory,
90
- decorators: [withSurfaceVariantsLayout(), withTheme],
91
- args: {
92
- schema: TestSchema,
93
- values: {
94
- name: 'DXOS',
95
- active: true,
96
- address: {
97
- zip: '11205',
98
- },
99
- },
100
- readonly: false,
101
- },
102
- };
147
+ const PersonSchema = Type.getSchema(Person);
103
148
 
104
- export const Organization: Story<Schema.Schema.Type<typeof Testing.OrganizationSchema>> = {
105
- args: {
106
- schema: Testing.OrganizationSchema,
107
- values: {
108
- name: 'DXOS',
109
- website: 'https://dxos.org',
110
- },
111
- readonly: false,
112
- },
149
+ const values: Partial<Person> = {
150
+ name: 'Alice',
151
+ location: [40.7128, -74.006],
152
+ tasks: ['task 1', 'task 2'],
153
+ birthday: '1990-05-12',
154
+ meetingAt: '2026-06-01T15:30:00.000Z',
155
+ reminderAt: '09:00:00',
113
156
  };
114
157
 
115
- export const OrganizationAutoSave: Story<Schema.Schema.Type<typeof Testing.OrganizationSchema>> = {
158
+ /**
159
+ * Build a data-entry surface by handing an Effect schema to `Form.Root` — the form derives its fields,
160
+ * types, validation, and selects from the schema, so you don't hand-wire one control per property.
161
+ * Customize individual fields with `fieldMap` (keyed by JSON path), render discriminated unions
162
+ * conditionally via the discriminator, and label ref-picker options by their parent object with
163
+ * `ParentLabelAnnotation`.
164
+ *
165
+ * @idiom org.dxos.react-ui-form.schemaForm
166
+ * applies: Any data-entry section bound to an Effect schema — settings, object/article editors, create dialogs
167
+ * instead-of: Hand-wiring Input/Select/Switch controls per field in bespoke React
168
+ * uses: {@link Form.Root}, {@link Form.FieldSet}
169
+ * related: org.dxos.react-ui-menu.toolbarMenu
170
+ */
171
+ export const Default: Story<ExcludeId<typeof PersonSchema>> = {
116
172
  args: {
117
- schema: Testing.OrganizationSchema,
118
- values: {
119
- name: 'DXOS',
120
- website: 'https://dxos.org',
121
- },
173
+ schema: omitId(PersonSchema),
174
+ values,
122
175
  autoSave: true,
123
- readonly: false,
124
- },
125
- };
126
-
127
- // TODO(burdon): Type issue with employer reference.
128
- // TODO(burdon): Test table/form with compound values (e.g., address).
129
- // export const Contact: Story<Testing.ContactSchemaType> = {
130
- // args: {
131
- // // Property name is missing in type EncodedReference but required in type
132
- // schema: Testing.ContactSchema,
133
- // values: {
134
- // name: 'Bot',
135
- // },
136
- // },
137
- // };
138
-
139
- const ShapeSchema = Schema.Struct({
140
- shape: Schema.optional(
141
- Schema.Union(
142
- Schema.Struct({
143
- type: Schema.Literal('circle').annotations({ title: 'Type' }),
144
- radius: Schema.optional(Schema.Number.annotations({ title: 'Radius' })),
145
- }),
146
- Schema.Struct({
147
- type: Schema.Literal('square').annotations({ title: 'Type' }),
148
- size: Schema.optional(Schema.Number.pipe(Schema.nonNegative()).annotations({ title: 'Size' })),
149
- }),
150
- ).annotations({ title: 'Shape' }),
151
- ),
152
- }).pipe(Schema.mutable);
153
-
154
- type ShapeType = Schema.Schema.Type<typeof ShapeSchema>;
155
-
156
- export const DiscriminatedShape: Story<ShapeType> = {
157
- args: {
158
- schema: ShapeSchema,
159
- readonly: false,
160
- values: {
161
- shape: {
162
- type: 'circle',
163
- radius: 5,
164
- },
165
- },
166
- Custom: {
167
- ['shape.type' as const]: (props) => (
168
- <SelectInput
169
- {...props}
170
- options={['circle', 'square'].map((value) => ({
171
- value,
172
- label: value,
173
- }))}
174
- />
175
- ),
176
- },
177
176
  },
178
177
  };
179
178
 
180
- const ArraysSchema = Schema.Struct({
181
- names: Schema.Array(Schema.String.pipe(Schema.nonEmptyString())),
182
- addresses: Schema.Array(AddressSchema),
183
- }).pipe(Schema.mutable);
184
-
185
- type ArraysType = Schema.Schema.Type<typeof ArraysSchema>;
186
-
187
- export const Arrays: StoryObj<FormProps<ArraysType>> = {
179
+ export const Readonly: Story<ExcludeId<typeof PersonSchema>> = {
188
180
  args: {
189
- schema: ArraysSchema,
190
- readonly: false,
191
- values: {
192
- names: ['Alice', 'Bob'],
193
- addresses: [],
194
- },
181
+ schema: omitId(PersonSchema),
182
+ values,
183
+ readonly: true,
195
184
  },
196
185
  };
197
186
 
198
- const ColorSchema = Schema.Struct({
199
- color: Schema.Union(Schema.Literal('red'), Schema.Literal('green'), Schema.Literal('blue')).annotations({
200
- title: 'Color',
201
- }),
202
- }).pipe(Schema.mutable);
203
-
204
- type ColorType = Schema.Schema.Type<typeof ColorSchema>;
205
-
206
- export const Enum: StoryObj<FormProps<ColorType>> = {
187
+ export const Static: Story<ExcludeId<typeof PersonSchema>> = {
207
188
  args: {
208
- schema: ColorSchema,
209
- readonly: false,
210
- values: {
211
- color: 'red',
212
- },
189
+ schema: omitId(PersonSchema),
190
+ values,
191
+ layout: 'static',
213
192
  },
214
193
  };
215
194
 
216
- const RefSchema = Schema.Struct({
217
- contact: Ref(ContactType).annotations({ title: 'Contact Reference' }),
218
- optionalContact: Schema.optional(Ref(ContactType).annotations({ title: 'Optional Contact Reference' })),
219
- refArray: Schema.optional(Schema.Array(Ref(ContactType))),
220
- unknownExpando: Schema.optional(Ref(Expando).annotations({ title: 'Optional Ref to an Expando (DXN Input)' })),
221
- });
222
-
223
- const contact1 = live(ContactType, { identifiers: [] });
224
- const contact2 = live(ContactType, { identifiers: [] });
225
-
226
- const RefStory = ({ values: initialValues, readonly }: FormProps<any>) => {
227
- const [values, setValues] = useState(initialValues);
228
- const handleSave = useCallback<NonNullable<FormProps<any>['onSave']>>((values) => {
229
- setValues(values);
230
- }, []);
231
-
232
- const onQueryRefOptions = useCallback((typeInfo: TypeAnnotation) => {
233
- switch (typeInfo.typename) {
234
- case ContactType.typename:
235
- return [
236
- { dxn: getObjectDXN(contact1)!, label: 'John Coltraine' },
237
- { dxn: getObjectDXN(contact2)!, label: 'Erykah Badu' },
238
- ];
239
- default:
240
- return [];
241
- }
242
- }, []);
243
-
244
- return (
245
- <TestLayout json={{ values, schema: RefSchema.ast.toJSON() }}>
246
- <TestPanel>
247
- <Form
248
- schema={RefSchema}
249
- values={values}
250
- readonly={readonly}
251
- onSave={handleSave}
252
- onQueryRefOptions={onQueryRefOptions}
253
- />
254
- </TestPanel>
255
- </TestLayout>
256
- );
257
- };
258
-
259
- export const Refs: StoryObj<FormProps<ContactType>> = {
260
- render: RefStory,
261
- args: {
262
- readonly: false,
263
- values: {
264
- refArray: [Ref.make(contact1), Ref.make(contact2)],
265
- } as any,
266
- },
195
+ export const Empty: Story<ExcludeId<typeof PersonSchema>> = {
196
+ args: {},
267
197
  };