@dxos/react-ui-form 0.8.4-main.fffef41 → 0.9.0

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 (301) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +0 -1
  3. package/dist/lib/browser/index.mjs +4005 -2402
  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 +4005 -2402
  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 -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 +73 -59
  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 -27
  18. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  19. package/dist/types/src/components/Form/Form.stories.d.ts +192 -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 +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 +39 -12
  94. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -1
  95. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts +69 -58
  96. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -1
  97. package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts +9 -0
  98. package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts.map +1 -0
  99. package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts +132 -0
  100. package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts.map +1 -0
  101. package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts +2 -0
  102. package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts.map +1 -0
  103. package/dist/types/src/components/ObjectProperties/index.d.ts +2 -0
  104. package/dist/types/src/components/ObjectProperties/index.d.ts.map +1 -0
  105. package/dist/types/src/components/ObjectTree/ObjectTree.d.ts +9 -0
  106. package/dist/types/src/components/ObjectTree/ObjectTree.d.ts.map +1 -0
  107. package/dist/types/src/components/ObjectTree/ObjectTree.stories.d.ts +91 -0
  108. package/dist/types/src/components/ObjectTree/ObjectTree.stories.d.ts.map +1 -0
  109. package/dist/types/src/components/ObjectTree/index.d.ts +2 -0
  110. package/dist/types/src/components/ObjectTree/index.d.ts.map +1 -0
  111. package/dist/types/src/components/RefEditor/RefEditor.d.ts +73 -0
  112. package/dist/types/src/components/RefEditor/RefEditor.d.ts.map +1 -0
  113. package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts +92 -0
  114. package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts.map +1 -0
  115. package/dist/types/src/components/RefEditor/index.d.ts +3 -0
  116. package/dist/types/src/components/RefEditor/index.d.ts.map +1 -0
  117. package/dist/types/src/components/RefEditor/ref-editor-extension.d.ts +47 -0
  118. package/dist/types/src/components/RefEditor/ref-editor-extension.d.ts.map +1 -0
  119. package/dist/types/src/components/Settings/Settings.d.ts +51 -0
  120. package/dist/types/src/components/Settings/Settings.d.ts.map +1 -0
  121. package/dist/types/src/components/Settings/Settings.stories.d.ts +89 -0
  122. package/dist/types/src/components/Settings/Settings.stories.d.ts.map +1 -0
  123. package/dist/types/src/components/Settings/SettingsFieldSet.d.ts +43 -0
  124. package/dist/types/src/components/Settings/SettingsFieldSet.d.ts.map +1 -0
  125. package/dist/types/src/components/Settings/SettingsItem.d.ts +16 -0
  126. package/dist/types/src/components/Settings/SettingsItem.d.ts.map +1 -0
  127. package/dist/types/src/components/Settings/SettingsSelectField.d.ts +18 -0
  128. package/dist/types/src/components/Settings/SettingsSelectField.d.ts.map +1 -0
  129. package/dist/types/src/components/Settings/index.d.ts +4 -0
  130. package/dist/types/src/components/Settings/index.d.ts.map +1 -0
  131. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +15 -19
  132. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  133. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +75 -64
  134. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/index.d.ts +5 -1
  136. package/dist/types/src/components/index.d.ts.map +1 -1
  137. package/dist/types/src/components/testing.d.ts +13 -6
  138. package/dist/types/src/components/testing.d.ts.map +1 -1
  139. package/dist/types/src/hooks/index.d.ts +2 -3
  140. package/dist/types/src/hooks/index.d.ts.map +1 -1
  141. package/dist/types/src/hooks/useFormHandler.d.ts +82 -0
  142. package/dist/types/src/hooks/useFormHandler.d.ts.map +1 -0
  143. package/dist/types/src/hooks/useKeyHandler.d.ts +7 -0
  144. package/dist/types/src/hooks/useKeyHandler.d.ts.map +1 -0
  145. package/dist/types/src/index.d.ts +0 -2
  146. package/dist/types/src/index.d.ts.map +1 -1
  147. package/dist/types/src/translations.d.ts +70 -59
  148. package/dist/types/src/translations.d.ts.map +1 -1
  149. package/dist/types/src/util/field-type.d.ts +19 -0
  150. package/dist/types/src/util/field-type.d.ts.map +1 -0
  151. package/dist/types/src/util/field.d.ts +3 -3
  152. package/dist/types/src/util/field.d.ts.map +1 -1
  153. package/dist/types/src/util/formatting.d.ts +2 -2
  154. package/dist/types/src/util/formatting.d.ts.map +1 -1
  155. package/dist/types/src/util/index.d.ts +2 -1
  156. package/dist/types/src/util/index.d.ts.map +1 -1
  157. package/dist/types/src/util/properties.d.ts +35 -0
  158. package/dist/types/src/util/properties.d.ts.map +1 -0
  159. package/dist/types/src/util/properties.test.d.ts +2 -0
  160. package/dist/types/src/util/properties.test.d.ts.map +1 -0
  161. package/dist/types/src/util/refs.d.ts +2 -2
  162. package/dist/types/src/util/refs.d.ts.map +1 -1
  163. package/dist/types/tsconfig.tsbuildinfo +1 -1
  164. package/package.json +64 -52
  165. package/src/components/FieldEditor/FieldEditor.stories.tsx +44 -25
  166. package/src/components/FieldEditor/FieldEditor.test.tsx +4 -2
  167. package/src/components/FieldEditor/FieldEditor.tsx +91 -86
  168. package/src/components/Form/AUDIT.md +17 -0
  169. package/src/components/Form/Form.stories.tsx +147 -252
  170. package/src/components/Form/Form.tsx +461 -108
  171. package/src/components/Form/FormField.tsx +345 -0
  172. package/src/components/Form/FormFieldComponent.stories.tsx +65 -0
  173. package/src/components/Form/FormFieldComponent.tsx +253 -0
  174. package/src/components/Form/FormFieldSet.tsx +213 -0
  175. package/src/components/Form/FormTooltipsContext.ts +25 -0
  176. package/src/components/Form/Layout/FormLayout.stories.test.tsx +51 -0
  177. package/src/components/Form/Layout/FormLayout.stories.tsx +422 -0
  178. package/src/components/Form/Layout/FormLayout.test.ts +59 -0
  179. package/src/components/Form/Layout/FormLayout.tsx +251 -0
  180. package/src/components/Form/Layout/annotation.ts +38 -0
  181. package/src/components/Form/Layout/index.ts +7 -0
  182. package/src/components/Form/Layout/parser.test.ts +120 -0
  183. package/src/components/Form/Layout/parser.ts +167 -0
  184. package/src/components/Form/README.md +3 -0
  185. package/src/components/Form/fields/ArrayField.tsx +173 -0
  186. package/src/components/Form/fields/BooleanField.tsx +22 -0
  187. package/src/components/Form/fields/DateField.tsx +101 -0
  188. package/src/components/Form/fields/GeoPointField.tsx +124 -0
  189. package/src/components/Form/fields/InlineRefField.tsx +138 -0
  190. package/src/components/Form/fields/MarkdownField.stories.tsx +206 -0
  191. package/src/components/Form/fields/MarkdownField.tsx +167 -0
  192. package/src/components/Form/fields/NumberField.tsx +76 -0
  193. package/src/components/Form/fields/RefField.test.ts +45 -0
  194. package/src/components/Form/fields/RefField.tsx +266 -0
  195. package/src/components/Form/fields/SelectField.tsx +77 -0
  196. package/src/components/Form/{custom/SelectOptionsInput.stories.tsx → fields/SelectOptionField.stories.tsx} +23 -18
  197. package/src/components/Form/{custom/SelectOptionsInput.tsx → fields/SelectOptionField.tsx} +33 -26
  198. package/src/components/Form/fields/TextAreaField.tsx +38 -0
  199. package/src/components/Form/fields/TextField.tsx +38 -0
  200. package/src/components/Form/{custom/TupleInput.tsx → fields/TupleField.tsx} +17 -9
  201. package/src/components/Form/fields/index.ts +17 -0
  202. package/src/components/Form/index.ts +6 -4
  203. package/src/components/Form/meta-tags.test.ts +47 -0
  204. package/src/components/Form/meta-tags.ts +33 -0
  205. package/src/components/ObjectForm/ObjectForm.stories.tsx +62 -0
  206. package/src/components/ObjectForm/ObjectForm.tsx +111 -0
  207. package/src/components/{ControlSection → ObjectForm}/index.ts +1 -1
  208. package/src/components/ObjectPicker/ObjectPicker.stories.tsx +26 -21
  209. package/src/components/ObjectPicker/ObjectPicker.tsx +123 -82
  210. package/src/components/ObjectProperties/ObjectProperties.stories.tsx +350 -0
  211. package/src/components/ObjectProperties/ObjectProperties.test.tsx +111 -0
  212. package/src/components/ObjectProperties/ObjectProperties.tsx +146 -0
  213. package/src/components/ObjectProperties/index.ts +5 -0
  214. package/src/components/ObjectTree/ObjectTree.stories.tsx +134 -0
  215. package/src/components/ObjectTree/ObjectTree.tsx +190 -0
  216. package/src/components/ObjectTree/index.ts +5 -0
  217. package/src/components/RefEditor/RefEditor.stories.tsx +148 -0
  218. package/src/components/RefEditor/RefEditor.tsx +275 -0
  219. package/src/components/RefEditor/index.ts +6 -0
  220. package/src/components/RefEditor/ref-editor-extension.ts +254 -0
  221. package/src/components/Settings/AUDIT.md +51 -0
  222. package/src/components/Settings/Settings.stories.tsx +104 -0
  223. package/src/components/Settings/Settings.tsx +81 -0
  224. package/src/components/Settings/SettingsFieldSet.tsx +257 -0
  225. package/src/components/Settings/SettingsItem.tsx +58 -0
  226. package/src/components/Settings/SettingsSelectField.tsx +59 -0
  227. package/src/components/Settings/index.ts +7 -0
  228. package/src/components/ViewEditor/ViewEditor.stories.tsx +70 -76
  229. package/src/components/ViewEditor/ViewEditor.test.tsx +17 -13
  230. package/src/components/ViewEditor/ViewEditor.tsx +340 -226
  231. package/src/components/index.ts +5 -1
  232. package/src/components/testing.tsx +24 -11
  233. package/src/hooks/index.ts +2 -3
  234. package/src/hooks/useFormHandler.ts +380 -0
  235. package/src/hooks/useKeyHandler.tsx +37 -0
  236. package/src/index.ts +0 -4
  237. package/src/translations.ts +76 -64
  238. package/src/util/field-type.ts +60 -0
  239. package/src/util/field.ts +25 -25
  240. package/src/util/formatting.ts +22 -22
  241. package/src/util/index.ts +2 -1
  242. package/src/util/properties.test.ts +153 -0
  243. package/src/util/properties.ts +100 -0
  244. package/src/util/refs.ts +16 -15
  245. package/src/vite-env.d.ts +10 -0
  246. package/dist/types/src/components/ControlSection/ControlSection.d.ts +0 -23
  247. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +0 -1
  248. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts +0 -83
  249. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +0 -1
  250. package/dist/types/src/components/ControlSection/index.d.ts +0 -2
  251. package/dist/types/src/components/ControlSection/index.d.ts.map +0 -1
  252. package/dist/types/src/components/Form/ArrayField.d.ts +0 -16
  253. package/dist/types/src/components/Form/ArrayField.d.ts.map +0 -1
  254. package/dist/types/src/components/Form/Defaults.d.ts +0 -14
  255. package/dist/types/src/components/Form/Defaults.d.ts.map +0 -1
  256. package/dist/types/src/components/Form/FormActions.d.ts +0 -9
  257. package/dist/types/src/components/Form/FormActions.d.ts.map +0 -1
  258. package/dist/types/src/components/Form/FormContent.d.ts +0 -63
  259. package/dist/types/src/components/Form/FormContent.d.ts.map +0 -1
  260. package/dist/types/src/components/Form/FormContext.d.ts +0 -23
  261. package/dist/types/src/components/Form/FormContext.d.ts.map +0 -1
  262. package/dist/types/src/components/Form/Input.d.ts +0 -29
  263. package/dist/types/src/components/Form/Input.d.ts.map +0 -1
  264. package/dist/types/src/components/Form/RefField.d.ts +0 -22
  265. package/dist/types/src/components/Form/RefField.d.ts.map +0 -1
  266. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +0 -4
  267. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +0 -1
  268. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +0 -4
  269. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +0 -1
  270. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts +0 -78
  271. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +0 -1
  272. package/dist/types/src/components/Form/custom/TupleInput.d.ts +0 -6
  273. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +0 -1
  274. package/dist/types/src/components/Form/custom/index.d.ts +0 -4
  275. package/dist/types/src/components/Form/custom/index.d.ts.map +0 -1
  276. package/dist/types/src/components/Form/factory.d.ts +0 -8
  277. package/dist/types/src/components/Form/factory.d.ts.map +0 -1
  278. package/dist/types/src/hooks/useForm.d.ts +0 -67
  279. package/dist/types/src/hooks/useForm.d.ts.map +0 -1
  280. package/dist/types/src/hooks/useQueryRefOptions.d.ts +0 -29
  281. package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +0 -1
  282. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +0 -8
  283. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +0 -1
  284. package/dist/types/src/util/schema.d.ts +0 -3
  285. package/dist/types/src/util/schema.d.ts.map +0 -1
  286. package/src/components/ControlSection/ControlSection.stories.tsx +0 -38
  287. package/src/components/ControlSection/ControlSection.tsx +0 -153
  288. package/src/components/Form/ArrayField.tsx +0 -125
  289. package/src/components/Form/Defaults.tsx +0 -205
  290. package/src/components/Form/FormActions.tsx +0 -54
  291. package/src/components/Form/FormContent.tsx +0 -362
  292. package/src/components/Form/FormContext.tsx +0 -110
  293. package/src/components/Form/Input.tsx +0 -54
  294. package/src/components/Form/RefField.tsx +0 -283
  295. package/src/components/Form/custom/GeoPointInput.tsx +0 -80
  296. package/src/components/Form/custom/index.ts +0 -7
  297. package/src/components/Form/factory.tsx +0 -31
  298. package/src/hooks/useForm.ts +0 -296
  299. package/src/hooks/useQueryRefOptions.ts +0 -62
  300. package/src/hooks/useRefQueryLookupHandler.ts +0 -39
  301. package/src/util/schema.ts +0 -12
@@ -6,44 +6,45 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import * as Schema from 'effect/Schema';
7
7
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
8
 
9
- import { DXN, Filter, Obj, Query, type QueryAST, Tag, Type } from '@dxos/echo';
10
- import { type EchoSchema, Format } from '@dxos/echo/internal';
9
+ import { DXN, EID, Filter, JsonSchema, Obj, Query, type QueryAST, Scope, Tag, Type, type View } from '@dxos/echo';
10
+ import { Format } from '@dxos/echo/Format';
11
+ import { type Mutable } from '@dxos/echo/Obj';
11
12
  import { useQuery } from '@dxos/react-client/echo';
12
- import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
13
+ import { useClientStory, withClientProvider } from '@dxos/react-client/testing';
13
14
  import { useAsyncEffect } from '@dxos/react-ui';
14
- import { withTheme } from '@dxos/react-ui/testing';
15
- import { type ProjectionModel, View, getTypenameFromQuery } from '@dxos/schema';
16
- import { Employer, Organization, Person, Project } from '@dxos/types';
15
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
16
+ import { type ProjectionModel, ViewModel, getTypeURIFromQuery } from '@dxos/schema';
17
+ import { Employer, Organization, Person, Pipeline } from '@dxos/types';
17
18
 
18
- import { translations } from '../../translations';
19
- import { TestLayout, TestPanel, VIEW_EDITOR_DEBUG_SYMBOL } from '../testing';
19
+ import { translations } from '#translations';
20
20
 
21
+ import { TestLayout, VIEW_EDITOR_DEBUG_SYMBOL } from '../testing';
21
22
  import { ViewEditor, type ViewEditorProps } from './ViewEditor';
22
23
 
23
24
  const types = [
24
25
  // TODO(burdon): Get label from annotation.
25
- { value: Organization.Organization.typename, label: 'Organization' },
26
- { value: Person.Person.typename, label: 'Person' },
27
- { value: Type.getTypename(Project.Project), label: 'Project' },
28
- { value: Employer.Employer.typename, label: 'Employer' },
26
+ { value: Type.getURI(Organization.Organization), label: 'Organization' },
27
+ { value: Type.getURI(Person.Person), label: 'Person' },
28
+ { value: Type.getURI(Pipeline.Pipeline), label: 'Project' },
29
+ { value: Type.getURI(Employer.Employer), label: 'Employer' },
29
30
  ];
30
31
 
31
32
  // Type definition for debug objects exposed to tests.
32
33
  export type ViewEditorDebugObjects = {
33
- schema: EchoSchema;
34
+ type: Type.AnyEntity;
34
35
  view: View.View;
35
36
  projection: ProjectionModel;
36
37
  };
37
38
 
38
- type StoryProps = Pick<ViewEditorProps, 'readonly' | 'mode'>;
39
+ type DefaultStoryProps = Pick<ViewEditorProps, 'readonly' | 'mode'>;
39
40
 
40
- const DefaultStory = (props: StoryProps) => {
41
- const { space } = useClientProvider();
42
- const [schema, setSchema] = useState<EchoSchema>();
41
+ const DefaultStory = (props: DefaultStoryProps) => {
42
+ const { space } = useClientStory();
43
+ const [type, setType] = useState<Type.AnyEntity>();
43
44
  const [view, setView] = useState<View.View>();
44
45
  const projectionRef = useRef<ProjectionModel>(null);
45
46
 
46
- const tags = useQuery(space, Filter.type(Tag.Tag));
47
+ const tags = useQuery(space?.db, Filter.type(Tag.Tag));
47
48
 
48
49
  useAsyncEffect(async () => {
49
50
  if (space) {
@@ -51,68 +52,62 @@ const DefaultStory = (props: StoryProps) => {
51
52
  name: Schema.String,
52
53
  email: Format.Email,
53
54
  salary: Format.Currency(),
54
- }).pipe(
55
- Type.Obj({
56
- typename: 'example.com/type/Test',
57
- version: '0.1.0',
58
- }),
59
- );
55
+ }).pipe(Type.makeObject(DXN.make('com.example.type.test', '0.1.0')));
60
56
 
61
57
  const AlternateSchema = Schema.Struct({
62
58
  title: Schema.String,
63
59
  description: Schema.String,
64
60
  completed: Schema.Boolean,
65
- }).pipe(
66
- Type.Obj({
67
- typename: 'example.com/type/Alternate',
68
- version: '0.1.0',
69
- }),
70
- );
71
-
72
- const [testSchema] = await space.db.schemaRegistry.register([TestSchema, AlternateSchema]);
73
- const view = View.make({
61
+ }).pipe(Type.makeObject(DXN.make('com.example.type.alternate', '0.1.0')));
62
+
63
+ const testType = await space.db.addType(TestSchema);
64
+ await space.db.addType(AlternateSchema);
65
+ const view = ViewModel.make({
74
66
  name: 'Test',
75
67
  query: Query.select(Filter.type(TestSchema)),
76
- jsonSchema: Type.toJsonSchema(TestSchema),
77
- presentation: Obj.make(Type.Expando, {}),
68
+ jsonSchema: JsonSchema.toJsonSchema(TestSchema),
78
69
  });
79
70
 
80
- setSchema(testSchema);
71
+ setType(testType);
81
72
  setView(view);
82
73
  }
83
74
  }, [space]);
84
75
 
85
76
  const updateViewQuery = useCallback(
86
- async (newQuery: QueryAST.Query, target?: string) => {
87
- if (!schema || !view || !space) {
77
+ async (newQuery: QueryAST.Query, target?: EID.EID) => {
78
+ if (!type || !view || !space) {
88
79
  return;
89
80
  }
90
81
 
91
- if (props.mode === 'query') {
92
- const queue = target && DXN.tryParse(target) ? target : undefined;
93
- const query = queue ? Query.fromAst(newQuery).options({ queues: [queue] }) : Query.fromAst(newQuery);
94
- view.query.ast = query.ast;
82
+ if (props.mode === 'tag') {
83
+ const queue = target;
84
+ const query = queue ? Query.fromAst(newQuery).from([Scope.feed(queue)]) : Query.fromAst(newQuery);
85
+ Obj.update(view, (view) => {
86
+ view.query.ast = query.ast as Mutable<typeof query.ast>;
87
+ });
95
88
 
96
- const typename = getTypenameFromQuery(query.ast);
97
- const [newSchema] = await space.db.schemaRegistry.query({ typename }).run();
89
+ const typeUri = getTypeURIFromQuery(query.ast);
90
+ const allTypes = space.db.graph.registry.list().filter(Type.isType);
91
+ const newSchema = allTypes.find((t) => Type.getURI(t) === typeUri);
98
92
  if (!newSchema) {
99
93
  return;
100
94
  }
101
95
 
102
- const newView = View.make({
96
+ const newView = ViewModel.make({
103
97
  query,
104
- jsonSchema: newSchema.jsonSchema,
105
- presentation: Obj.make(Type.Expando, {}),
98
+ jsonSchema: JsonSchema.toJsonSchema(newSchema),
106
99
  });
107
- view.projection = Obj.getSnapshot(newView).projection;
108
- setSchema(() => newSchema);
100
+ Obj.update(view, (view) => {
101
+ view.projection = Obj.getSnapshot(newView).projection as Mutable<typeof view.projection>;
102
+ });
103
+ setType(() => newSchema);
109
104
  } else {
110
- console.log('updateViewQuery', { newQuery });
111
- view.query.ast = newQuery;
112
- schema.updateTypename(getTypenameFromQuery(newQuery));
105
+ Obj.update(view, (view) => {
106
+ view.query.ast = newQuery as Mutable<typeof newQuery>;
107
+ });
113
108
  }
114
109
  },
115
- [view, schema],
110
+ [view, type],
116
111
  );
117
112
 
118
113
  const handleDelete = useCallback(
@@ -122,41 +117,39 @@ const DefaultStory = (props: StoryProps) => {
122
117
 
123
118
  // Expose objects on window for test access.
124
119
  useEffect(() => {
125
- if (typeof window !== 'undefined' && schema && view && projectionRef.current) {
120
+ if (typeof window !== 'undefined' && type && view && projectionRef.current) {
126
121
  (window as any)[VIEW_EDITOR_DEBUG_SYMBOL] = {
127
- schema,
122
+ type,
128
123
  view,
129
124
  projection: projectionRef.current,
130
125
  } satisfies ViewEditorDebugObjects;
131
126
  }
132
- }, [schema, view]);
127
+ }, [type, view]);
133
128
 
134
129
  // NOTE(ZaymonFC): This looks awkward but it resolves an infinite parsing issue with sb.
135
130
  const json = useMemo(
136
- () => JSON.parse(JSON.stringify({ schema, view, projection: projectionRef.current })),
137
- [JSON.stringify(schema), JSON.stringify(view)],
131
+ () => JSON.parse(JSON.stringify({ schema: type, view, projection: projectionRef.current })),
132
+ [JSON.stringify(type), JSON.stringify(view)],
138
133
  );
139
134
 
140
- if (!schema || !view) {
135
+ if (!type || !view) {
141
136
  return <div />;
142
137
  }
143
138
 
144
139
  return (
145
140
  <TestLayout json={json}>
146
- <TestPanel>
147
- <ViewEditor
148
- ref={projectionRef}
149
- schema={schema}
150
- view={view}
151
- registry={space?.db.schemaRegistry}
152
- mode={props.mode}
153
- readonly={props.readonly}
154
- types={types}
155
- tags={tags}
156
- onQueryChanged={updateViewQuery}
157
- onDelete={handleDelete}
158
- />
159
- </TestPanel>
141
+ <ViewEditor
142
+ ref={projectionRef}
143
+ type={type}
144
+ view={view}
145
+ registry={space?.db.graph.registry}
146
+ mode={props.mode}
147
+ readonly={props.readonly}
148
+ types={types}
149
+ tags={tags}
150
+ onQueryChanged={updateViewQuery}
151
+ onDelete={handleDelete}
152
+ />
160
153
  </TestLayout>
161
154
  );
162
155
  };
@@ -174,7 +167,8 @@ const meta = {
174
167
  space.db.add(Tag.make({ label: 'New' }));
175
168
  },
176
169
  }),
177
- withTheme,
170
+ withTheme(),
171
+ withLayout({ layout: 'fullscreen' }),
178
172
  ],
179
173
  parameters: {
180
174
  layout: 'fullscreen',
@@ -194,8 +188,8 @@ export const Readonly: Story = {
194
188
  },
195
189
  };
196
190
 
197
- export const QueryMode: Story = {
191
+ export const TagQueryMode: Story = {
198
192
  args: {
199
- mode: 'query',
193
+ mode: 'tag',
200
194
  },
201
195
  };
@@ -3,14 +3,14 @@
3
3
  //
4
4
 
5
5
  import { composeStories } from '@storybook/react';
6
- import { cleanup, fireEvent, screen, waitFor } from '@testing-library/react';
6
+ import { act, cleanup, fireEvent, screen, waitFor } from '@testing-library/react';
7
7
  import { afterEach, describe, expect, test } from 'vitest';
8
8
 
9
- import { EchoSchema, isInstanceOf } from '@dxos/echo/internal';
10
- import { ProjectionModel, View } from '@dxos/schema';
9
+ import { Type, View } from '@dxos/echo';
10
+ import { instanceOf as isInstanceOf } from '@dxos/echo/Obj';
11
+ import { ProjectionModel } from '@dxos/schema';
11
12
 
12
13
  import { VIEW_EDITOR_DEBUG_SYMBOL } from '../testing';
13
-
14
14
  import * as stories from './ViewEditor.stories';
15
15
  import { type ViewEditorDebugObjects } from './ViewEditor.stories';
16
16
 
@@ -19,7 +19,7 @@ const { Default } = composeStories(stories);
19
19
  const getViewEditorDebugObjects = (): ViewEditorDebugObjects => {
20
20
  const debugObjects = (window as any)[VIEW_EDITOR_DEBUG_SYMBOL] as ViewEditorDebugObjects;
21
21
  expect(debugObjects).toBeDefined();
22
- expect(debugObjects.schema).toBeInstanceOf(EchoSchema);
22
+ expect(Type.isType(debugObjects.type)).toBe(true);
23
23
  expect(isInstanceOf(View.View, debugObjects.view)).toBeTruthy();
24
24
  expect(debugObjects.projection).toBeInstanceOf(ProjectionModel);
25
25
  return debugObjects;
@@ -35,8 +35,12 @@ const waitForViewEditor = async () => {
35
35
  };
36
36
 
37
37
  describe('ViewEditor', () => {
38
- afterEach(() => {
39
- cleanup();
38
+ afterEach(async () => {
39
+ // Wrap cleanup in async act() so React fully drains the scheduler
40
+ // (including setImmediate callbacks) before happy-dom tears down window.
41
+ await act(async () => {
42
+ cleanup();
43
+ });
40
44
  });
41
45
 
42
46
  test('renders view editor', async () => {
@@ -54,7 +58,7 @@ describe('ViewEditor', () => {
54
58
  const nameField = screen.getByText('name');
55
59
  fireEvent.click(nameField);
56
60
 
57
- const fieldInput = screen.getByPlaceholderText('Field name.');
61
+ const fieldInput = screen.getByPlaceholderText('Property name');
58
62
  fireEvent.change(fieldInput, { target: { value: 'new_property' } });
59
63
 
60
64
  fireEvent.click(screen.getByTestId('save-button'));
@@ -68,7 +72,7 @@ describe('ViewEditor', () => {
68
72
  const debugObjects = getViewEditorDebugObjects();
69
73
 
70
74
  // Check schema contains new_property.
71
- const schemaProperties = debugObjects.schema.jsonSchema.properties;
75
+ const schemaProperties = debugObjects.type.jsonSchema.properties;
72
76
  expect(schemaProperties).toBeDefined();
73
77
  expect(schemaProperties!.new_property).toBeDefined();
74
78
  expect(schemaProperties!.name).toBeUndefined();
@@ -89,12 +93,12 @@ describe('ViewEditor', () => {
89
93
  await Default.run();
90
94
  await waitForViewEditor();
91
95
 
92
- // Click the add property button.
96
+ // Click the add property button. The new field is auto-expanded by handleAdd.
93
97
  const addButton = screen.getByText('Add property');
94
98
  fireEvent.click(addButton);
95
99
 
96
100
  // Fill out the property field.
97
- const fieldInput = screen.getByPlaceholderText('Field name.');
101
+ const fieldInput = screen.getByPlaceholderText('Property name');
98
102
  fireEvent.change(fieldInput, { target: { value: 'added_property' } });
99
103
 
100
104
  // Click the format combo box and select the first option.
@@ -116,7 +120,7 @@ describe('ViewEditor', () => {
116
120
  const debugObjects = getViewEditorDebugObjects();
117
121
 
118
122
  // Check schema contains added_property.
119
- const schemaProperties = debugObjects.schema.jsonSchema.properties;
123
+ const schemaProperties = debugObjects.type.jsonSchema.properties;
120
124
  expect(schemaProperties).toBeDefined();
121
125
  expect(schemaProperties!.added_property).toBeDefined();
122
126
 
@@ -160,7 +164,7 @@ describe('ViewEditor', () => {
160
164
  const debugObjects = getViewEditorDebugObjects();
161
165
 
162
166
  // Check schema no longer contains the name property.
163
- const schemaProperties = debugObjects.schema.jsonSchema.properties;
167
+ const schemaProperties = debugObjects.type.jsonSchema.properties;
164
168
  expect(schemaProperties).toBeDefined();
165
169
  expect(schemaProperties!.name).toBeUndefined();
166
170