@dxos/plugin-space 0.8.4-main.5ea62a8 → 0.8.4-main.72ec0f3

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 (338) hide show
  1. package/dist/lib/browser/{CollectionMain-D2B75XBS.mjs → CollectionArticle-WTHWY4YS.mjs} +10 -10
  2. package/dist/lib/browser/CollectionArticle-WTHWY4YS.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectDetailsPanel-2BRUBHP6.mjs +141 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-2BRUBHP6.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectSettings-5LLWCVEK.mjs +144 -0
  6. package/dist/lib/browser/ObjectSettings-5LLWCVEK.mjs.map +7 -0
  7. package/dist/lib/browser/RecordArticle-SXDRWTTU.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-SXDRWTTU.mjs.map +7 -0
  9. package/dist/lib/browser/{app-graph-builder-FLF7XMQO.mjs → app-graph-builder-VQAB3GCQ.mjs} +109 -97
  10. package/dist/lib/browser/app-graph-builder-VQAB3GCQ.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-3A6KBYWT.mjs → app-graph-serializer-KSLKMEPP.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-KSLKMEPP.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-DCY3W36E.mjs → chunk-ERQMHU7L.mjs} +71 -61
  14. package/dist/lib/browser/chunk-ERQMHU7L.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-J6YZG77T.mjs → chunk-J2BUK5E6.mjs} +554 -481
  16. package/dist/lib/browser/chunk-J2BUK5E6.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-K5J7ZB5P.mjs +20 -0
  18. package/dist/lib/browser/chunk-K5J7ZB5P.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-RQVV4XVF.mjs → chunk-M2Z6D4ZI.mjs} +27 -21
  20. package/dist/lib/browser/chunk-M2Z6D4ZI.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-WAXS2ZVX.mjs → chunk-OLBBSOVI.mjs} +26 -13
  22. package/dist/lib/browser/chunk-OLBBSOVI.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-PU5IOFMG.mjs +167 -0
  24. package/dist/lib/browser/chunk-PU5IOFMG.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
  26. package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-WJXU4GKV.mjs +19 -0
  28. package/dist/lib/browser/chunk-WJXU4GKV.mjs.map +7 -0
  29. package/dist/lib/browser/{identity-created-T6ZNVE7S.mjs → identity-created-NAXTPQXE.mjs} +5 -5
  30. package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +89 -85
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-7E3IZIJS.mjs → intent-resolver-Q2XWHAVA.mjs} +78 -84
  34. package/dist/lib/browser/intent-resolver-Q2XWHAVA.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-MM4HADPE.mjs +30 -0
  37. package/dist/lib/browser/react-root-MM4HADPE.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-GL4CE2F4.mjs → react-surface-SGZC3Y4U.mjs} +71 -105
  39. package/dist/lib/browser/react-surface-SGZC3Y4U.mjs.map +7 -0
  40. package/dist/lib/browser/{schema-defs-YDPFZELA.mjs → schema-defs-QPI2JU3X.mjs} +6 -6
  41. package/dist/lib/browser/schema-defs-QPI2JU3X.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-B6MMHLPS.mjs → settings-WKLGKUHQ.mjs} +5 -5
  43. package/dist/lib/browser/{settings-B6MMHLPS.mjs.map → settings-WKLGKUHQ.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-QVABOCO3.mjs → spaces-ready-C5QC2UFL.mjs} +15 -14
  45. package/dist/lib/browser/spaces-ready-C5QC2UFL.mjs.map +7 -0
  46. package/dist/lib/browser/{state-2RGW7FQG.mjs → state-Q7YRE5KG.mjs} +7 -7
  47. package/dist/lib/browser/state-Q7YRE5KG.mjs.map +7 -0
  48. package/dist/lib/browser/types/index.mjs +2 -2
  49. package/dist/lib/node-esm/{CollectionMain-ZJIFCWKZ.mjs → CollectionArticle-KHXYT3SH.mjs} +10 -10
  50. package/dist/lib/node-esm/CollectionArticle-KHXYT3SH.mjs.map +7 -0
  51. package/dist/lib/node-esm/ObjectDetailsPanel-6PZQIQG3.mjs +142 -0
  52. package/dist/lib/node-esm/ObjectDetailsPanel-6PZQIQG3.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectSettings-OQSBOH7K.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectSettings-OQSBOH7K.mjs.map +7 -0
  55. package/dist/lib/node-esm/RecordArticle-NACBH42P.mjs +117 -0
  56. package/dist/lib/node-esm/RecordArticle-NACBH42P.mjs.map +7 -0
  57. package/dist/lib/node-esm/{app-graph-builder-D5YPOJS5.mjs → app-graph-builder-24JCLJPX.mjs} +109 -97
  58. package/dist/lib/node-esm/app-graph-builder-24JCLJPX.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-M45TH5LR.mjs → app-graph-serializer-R723K764.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-R723K764.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-WKQTO37U.mjs → chunk-2PN7QNGV.mjs} +27 -21
  62. package/dist/lib/node-esm/chunk-2PN7QNGV.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  64. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-H4JILUJK.mjs +20 -0
  66. package/dist/lib/node-esm/chunk-H4JILUJK.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-ZCEH2VYE.mjs → chunk-ITQFSFQ3.mjs} +554 -481
  68. package/dist/lib/node-esm/chunk-ITQFSFQ3.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-TJPQDQNI.mjs +168 -0
  70. package/dist/lib/node-esm/chunk-TJPQDQNI.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-AUQ3SKL2.mjs → chunk-VH2EBZEV.mjs} +71 -61
  72. package/dist/lib/node-esm/chunk-VH2EBZEV.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-HYIZVPOA.mjs → chunk-WC4VBFMA.mjs} +26 -13
  74. package/dist/lib/node-esm/chunk-WC4VBFMA.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-Z7BB6HC2.mjs +21 -0
  76. package/dist/lib/node-esm/chunk-Z7BB6HC2.mjs.map +7 -0
  77. package/dist/lib/node-esm/{identity-created-AL7NNCKH.mjs → identity-created-OXLKCJE3.mjs} +5 -5
  78. package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
  79. package/dist/lib/node-esm/index.mjs +89 -85
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-UVO4MKWX.mjs → intent-resolver-YK4ESSET.mjs} +78 -84
  82. package/dist/lib/node-esm/intent-resolver-YK4ESSET.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-5EKYI66P.mjs → react-root-5ANDLQMX.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-5ANDLQMX.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-IOC6YSVQ.mjs → react-surface-V7J2QB44.mjs} +71 -105
  87. package/dist/lib/node-esm/react-surface-V7J2QB44.mjs.map +7 -0
  88. package/dist/lib/node-esm/{schema-defs-OYBCWKAS.mjs → schema-defs-ZS2D47XW.mjs} +6 -6
  89. package/dist/lib/node-esm/schema-defs-ZS2D47XW.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-IOFU6EAS.mjs → settings-RBB5633M.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-IOFU6EAS.mjs.map → settings-RBB5633M.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-MS6GHPFR.mjs → spaces-ready-SJCXV6YH.mjs} +15 -14
  93. package/dist/lib/node-esm/spaces-ready-SJCXV6YH.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-7VBVBGNS.mjs → state-362I5BMK.mjs} +7 -7
  95. package/dist/lib/node-esm/state-362I5BMK.mjs.map +7 -0
  96. package/dist/lib/node-esm/types/index.mjs +2 -2
  97. package/dist/types/src/SpacePlugin.d.ts +1 -1
  98. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/capabilities.d.ts +6 -5
  101. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  106. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  107. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  108. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  109. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  110. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  111. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +1 -1
  112. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  113. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +110 -1
  114. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  115. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +3 -3
  116. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  117. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
  118. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  119. package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +1 -1
  120. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  121. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  122. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  123. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  124. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1697 -0
  125. package/dist/types/src/components/{MembersContainer.stories.d.ts.map → MembersContainer/MembersContainer.stories.d.ts.map} +1 -1
  126. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  127. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  128. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +9 -0
  129. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -0
  130. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts +10 -0
  131. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -0
  132. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts +3 -0
  133. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts.map +1 -0
  134. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  135. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  136. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  137. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  138. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +2 -2
  139. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  140. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +1530 -0
  141. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -0
  142. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +1 -1
  143. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +1 -1
  144. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
  145. package/dist/types/src/components/ObjectSettings/index.d.ts +2 -1
  146. package/dist/types/src/components/ObjectSettings/index.d.ts.map +1 -1
  147. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  148. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  149. package/dist/types/src/components/{MembersContainer.stories.d.ts → RecordArticle.stories.d.ts} +111 -2
  150. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  151. package/dist/types/src/components/SchemaContainer.d.ts +1 -1
  152. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  153. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  154. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +4 -3
  155. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  156. package/dist/types/src/components/{SpacePresence.stories.d.ts → SpacePresence/SpacePresence.stories.d.ts} +112 -3
  157. package/dist/types/src/components/{SpacePresence.stories.d.ts.map → SpacePresence/SpacePresence.stories.d.ts.map} +1 -1
  158. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  159. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  160. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  161. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  162. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  163. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  164. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  165. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +110 -1
  166. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  167. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  168. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +111 -2
  169. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  171. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  172. package/dist/types/src/components/index.d.ts +10 -17
  173. package/dist/types/src/components/index.d.ts.map +1 -1
  174. package/dist/types/src/events.d.ts.map +1 -1
  175. package/dist/types/src/helpers/index.d.ts +2 -0
  176. package/dist/types/src/helpers/index.d.ts.map +1 -0
  177. package/dist/types/src/helpers/query.d.ts +8 -0
  178. package/dist/types/src/helpers/query.d.ts.map +1 -0
  179. package/dist/types/src/helpers/query.test.d.ts +2 -0
  180. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  181. package/dist/types/src/hooks/index.d.ts +1 -0
  182. package/dist/types/src/hooks/index.d.ts.map +1 -1
  183. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  184. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +1 -1
  185. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  186. package/dist/types/src/hooks/usePath.d.ts +1 -1
  187. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  188. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  189. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  190. package/dist/types/src/index.d.ts +1 -0
  191. package/dist/types/src/index.d.ts.map +1 -1
  192. package/dist/types/src/meta.d.ts +0 -1
  193. package/dist/types/src/meta.d.ts.map +1 -1
  194. package/dist/types/src/translations.d.ts +1322 -22
  195. package/dist/types/src/translations.d.ts.map +1 -1
  196. package/dist/types/src/types/types.d.ts +59 -76
  197. package/dist/types/src/types/types.d.ts.map +1 -1
  198. package/dist/types/src/util.d.ts +10 -7
  199. package/dist/types/src/util.d.ts.map +1 -1
  200. package/dist/types/tsconfig.tsbuildinfo +1 -1
  201. package/package.json +64 -59
  202. package/src/SpacePlugin.ts +228 -212
  203. package/src/capabilities/app-graph-builder.ts +158 -123
  204. package/src/capabilities/app-graph-serializer.ts +12 -12
  205. package/src/capabilities/capabilities.ts +16 -11
  206. package/src/capabilities/identity-created.ts +2 -2
  207. package/src/capabilities/intent-resolver.ts +68 -61
  208. package/src/capabilities/react-root.tsx +4 -3
  209. package/src/capabilities/react-surface.tsx +65 -141
  210. package/src/capabilities/schema-defs.ts +1 -1
  211. package/src/capabilities/spaces-ready.ts +8 -5
  212. package/src/capabilities/state.ts +2 -2
  213. package/src/components/AwaitingObject.tsx +12 -14
  214. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
  215. package/src/components/CollectionSection.tsx +8 -6
  216. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +11 -11
  217. package/src/components/CreateDialog/CreateObjectDialog.tsx +38 -28
  218. package/src/components/CreateDialog/CreateObjectPanel.tsx +8 -8
  219. package/src/components/CreateDialog/CreateSpaceDialog.tsx +30 -11
  220. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  221. package/src/components/JoinDialog/index.ts +5 -0
  222. package/src/components/{MembersContainer.stories.tsx → MembersContainer/MembersContainer.stories.tsx} +7 -6
  223. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +16 -14
  224. package/src/components/MembersContainer/index.ts +5 -0
  225. package/src/components/MenuFooter.tsx +2 -2
  226. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +51 -0
  227. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +72 -0
  228. package/src/components/ObjectDetailsPanel/index.ts +7 -0
  229. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +6 -6
  230. package/src/components/ObjectRenamePopover/index.ts +5 -0
  231. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +3 -3
  232. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +63 -0
  233. package/src/components/ObjectSettings/BaseObjectSettings.tsx +90 -26
  234. package/src/components/ObjectSettings/ForeignKeys.tsx +4 -4
  235. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +4 -3
  236. package/src/components/ObjectSettings/index.ts +3 -1
  237. package/src/components/RecordArticle.stories.tsx +115 -0
  238. package/src/components/RecordArticle.tsx +114 -0
  239. package/src/components/SchemaContainer.tsx +23 -26
  240. package/src/components/SpacePluginSettings.tsx +10 -4
  241. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +23 -25
  242. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +16 -11
  243. package/src/components/SpacePresence/index.ts +5 -0
  244. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
  245. package/src/components/SpaceRenamePopover/index.ts +5 -0
  246. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +9 -4
  247. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +44 -23
  248. package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
  249. package/src/components/SyncStatus/SyncStatus.stories.tsx +4 -5
  250. package/src/components/SyncStatus/SyncStatus.tsx +107 -11
  251. package/src/components/ViewEditor.tsx +51 -23
  252. package/src/components/index.ts +7 -8
  253. package/src/events.ts +6 -6
  254. package/src/helpers/index.ts +5 -0
  255. package/src/helpers/query.test.ts +24 -0
  256. package/src/helpers/query.ts +158 -0
  257. package/src/hooks/index.ts +1 -0
  258. package/src/hooks/useActiveSpace.ts +2 -1
  259. package/src/hooks/useInputSurfaceLookup.tsx +8 -3
  260. package/src/hooks/usePath.ts +1 -1
  261. package/src/hooks/useTypeOptions.ts +59 -0
  262. package/src/index.ts +1 -0
  263. package/src/meta.ts +6 -3
  264. package/src/translations.ts +25 -10
  265. package/src/types/types.ts +26 -22
  266. package/src/util.tsx +79 -64
  267. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +0 -7
  268. package/dist/lib/browser/ObjectDetailsPanel-SY6FYTYC.mjs +0 -88
  269. package/dist/lib/browser/ObjectDetailsPanel-SY6FYTYC.mjs.map +0 -7
  270. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs +0 -68
  271. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs.map +0 -7
  272. package/dist/lib/browser/app-graph-builder-FLF7XMQO.mjs.map +0 -7
  273. package/dist/lib/browser/app-graph-serializer-3A6KBYWT.mjs.map +0 -7
  274. package/dist/lib/browser/chunk-CBYL62HG.mjs +0 -19
  275. package/dist/lib/browser/chunk-CBYL62HG.mjs.map +0 -7
  276. package/dist/lib/browser/chunk-DCY3W36E.mjs.map +0 -7
  277. package/dist/lib/browser/chunk-ELJDGQTO.mjs +0 -94
  278. package/dist/lib/browser/chunk-ELJDGQTO.mjs.map +0 -7
  279. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  280. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  281. package/dist/lib/browser/chunk-J6YZG77T.mjs.map +0 -7
  282. package/dist/lib/browser/chunk-RQVV4XVF.mjs.map +0 -7
  283. package/dist/lib/browser/chunk-TUQZO5P4.mjs +0 -20
  284. package/dist/lib/browser/chunk-TUQZO5P4.mjs.map +0 -7
  285. package/dist/lib/browser/chunk-WAXS2ZVX.mjs.map +0 -7
  286. package/dist/lib/browser/identity-created-T6ZNVE7S.mjs.map +0 -7
  287. package/dist/lib/browser/intent-resolver-7E3IZIJS.mjs.map +0 -7
  288. package/dist/lib/browser/react-root-RWMT2RCK.mjs +0 -29
  289. package/dist/lib/browser/react-root-RWMT2RCK.mjs.map +0 -7
  290. package/dist/lib/browser/react-surface-GL4CE2F4.mjs.map +0 -7
  291. package/dist/lib/browser/schema-defs-YDPFZELA.mjs.map +0 -7
  292. package/dist/lib/browser/spaces-ready-QVABOCO3.mjs.map +0 -7
  293. package/dist/lib/browser/state-2RGW7FQG.mjs.map +0 -7
  294. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +0 -7
  295. package/dist/lib/node-esm/ObjectDetailsPanel-3MYLTMXN.mjs +0 -89
  296. package/dist/lib/node-esm/ObjectDetailsPanel-3MYLTMXN.mjs.map +0 -7
  297. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs +0 -70
  298. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs.map +0 -7
  299. package/dist/lib/node-esm/app-graph-builder-D5YPOJS5.mjs.map +0 -7
  300. package/dist/lib/node-esm/app-graph-serializer-M45TH5LR.mjs.map +0 -7
  301. package/dist/lib/node-esm/chunk-AUQ3SKL2.mjs.map +0 -7
  302. package/dist/lib/node-esm/chunk-FJZNSJC4.mjs +0 -20
  303. package/dist/lib/node-esm/chunk-FJZNSJC4.mjs.map +0 -7
  304. package/dist/lib/node-esm/chunk-HC677WUJ.mjs +0 -21
  305. package/dist/lib/node-esm/chunk-HC677WUJ.mjs.map +0 -7
  306. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  307. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  308. package/dist/lib/node-esm/chunk-HYIZVPOA.mjs.map +0 -7
  309. package/dist/lib/node-esm/chunk-Q6AAQLQG.mjs +0 -96
  310. package/dist/lib/node-esm/chunk-Q6AAQLQG.mjs.map +0 -7
  311. package/dist/lib/node-esm/chunk-WKQTO37U.mjs.map +0 -7
  312. package/dist/lib/node-esm/chunk-ZCEH2VYE.mjs.map +0 -7
  313. package/dist/lib/node-esm/identity-created-AL7NNCKH.mjs.map +0 -7
  314. package/dist/lib/node-esm/intent-resolver-UVO4MKWX.mjs.map +0 -7
  315. package/dist/lib/node-esm/react-root-5EKYI66P.mjs.map +0 -7
  316. package/dist/lib/node-esm/react-surface-IOC6YSVQ.mjs.map +0 -7
  317. package/dist/lib/node-esm/schema-defs-OYBCWKAS.mjs.map +0 -7
  318. package/dist/lib/node-esm/spaces-ready-MS6GHPFR.mjs.map +0 -7
  319. package/dist/lib/node-esm/state-7VBVBGNS.mjs.map +0 -7
  320. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  321. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  322. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  323. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  324. package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
  325. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
  326. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  327. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  328. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  329. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  330. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  331. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  332. package/dist/types/src/components/RecordMain.d.ts +0 -7
  333. package/dist/types/src/components/RecordMain.d.ts.map +0 -1
  334. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  335. package/src/components/ObjectDetailsPanel.tsx +0 -77
  336. package/src/components/PersistenceStatus.tsx +0 -83
  337. package/src/components/RecordMain.tsx +0 -43
  338. /package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +0 -0
@@ -2,42 +2,67 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React, { useCallback, useMemo } from 'react';
5
+ import * as Schema from 'effect/Schema';
6
+ import React, { useCallback, useState } from 'react';
6
7
 
7
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
- import { Type } from '@dxos/echo';
9
- import { invariant } from '@dxos/invariant';
8
+ import { createIntent } from '@dxos/app-framework';
9
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
10
+ import { DXN, Filter, Obj, Query, type QueryAST, Tag, Type } from '@dxos/echo';
10
11
  import { useClient } from '@dxos/react-client';
11
- import { Filter, getSpace, useQuery, useSchema } from '@dxos/react-client/echo';
12
- import { ViewEditor as NativeViewEditor } from '@dxos/react-ui-form';
13
- import { DataType } from '@dxos/schema';
12
+ import { getSpace, useQuery } from '@dxos/react-client/echo';
13
+ import { useAsyncEffect } from '@dxos/react-ui';
14
+ import { ViewEditor as NaturalViewEditor } from '@dxos/react-ui-form';
15
+ import { View } from '@dxos/schema';
14
16
 
17
+ import { resolveSchemaWithClientAndSpace } from '../helpers';
18
+ import { useTypeOptions } from '../hooks';
15
19
  import { SpaceAction } from '../types';
16
20
 
17
- type ViewEditorProps = { view: DataType.View };
21
+ export type ViewEditorProps = { view: View.View };
18
22
 
19
23
  export const ViewEditor = ({ view }: ViewEditorProps) => {
20
24
  const { dispatchPromise: dispatch } = useIntentDispatcher();
21
25
  const client = useClient();
22
26
  const space = getSpace(view);
23
- const schema = useSchema(client, space, view.query.typename);
27
+ const [schema, setSchema] = useState<Schema.Schema.AnyNoContext>(() => Schema.Struct({}));
28
+ const tags = useQuery(space, Filter.type(Tag.Tag));
29
+ const types = useTypeOptions({ space, annotation: ['dynamic', 'limited-static', 'object-form'] });
24
30
 
25
- const views = useQuery(space, Filter.type(DataType.View));
26
- const currentTypename = useMemo(() => view.query?.typename, [view.query?.typename]);
31
+ useAsyncEffect(async () => {
32
+ if (!view?.query || !space) {
33
+ return;
34
+ }
27
35
 
28
- const handleUpdateTypename = useCallback(
29
- (typename: string) => {
30
- invariant(schema);
31
- invariant(Type.isMutable(schema));
36
+ const foundSchema = await resolveSchemaWithClientAndSpace(client, space, view.query.ast);
37
+ if (foundSchema && foundSchema !== schema) {
38
+ setSchema(() => foundSchema);
39
+ }
40
+ }, [client, space, view, schema]);
32
41
 
33
- const matchingViews = views.filter((view) => view.query.typename === currentTypename);
34
- for (const view of matchingViews) {
35
- view.query.typename = typename;
42
+ const handleQueryChanged = useCallback(
43
+ async (newQuery: QueryAST.Query, target?: string) => {
44
+ if (!view || !space) {
45
+ return;
36
46
  }
37
47
 
38
- schema.updateTypename(typename);
48
+ const queue = target && DXN.tryParse(target) ? target : undefined;
49
+ const query = queue ? Query.fromAst(newQuery).options({ queues: [queue] }) : Query.fromAst(newQuery);
50
+ view.query.ast = query.ast;
51
+ const newSchema = await resolveSchemaWithClientAndSpace(client, space, query.ast);
52
+ if (!newSchema) {
53
+ return;
54
+ }
55
+
56
+ const newView = View.make({
57
+ query,
58
+ jsonSchema: Type.toJsonSchema(newSchema),
59
+ presentation: Obj.make(Type.Expando, {}),
60
+ });
61
+ view.projection = Obj.getSnapshot(newView).projection;
62
+
63
+ setSchema(() => newSchema);
39
64
  },
40
- [views, schema],
65
+ [view, schema],
41
66
  );
42
67
 
43
68
  const handleDelete = useCallback(
@@ -52,13 +77,16 @@ export const ViewEditor = ({ view }: ViewEditorProps) => {
52
77
  }
53
78
 
54
79
  return (
55
- <NativeViewEditor
80
+ <NaturalViewEditor
56
81
  registry={space.db.schemaRegistry}
57
82
  schema={schema}
58
83
  view={view}
59
- onTypenameChanged={Type.isMutable(schema) ? handleUpdateTypename : undefined}
60
- onDelete={Type.isMutable(schema) ? handleDelete : undefined}
84
+ mode='query'
61
85
  outerSpacing={false}
86
+ tags={tags}
87
+ types={types}
88
+ onQueryChanged={handleQueryChanged}
89
+ onDelete={Type.isMutable(schema) ? handleDelete : undefined}
62
90
  />
63
91
  );
64
92
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { lazy } from 'react';
5
+ import { type ComponentType, lazy } from 'react';
6
6
 
7
7
  export * from './AwaitingObject';
8
8
  export * from './CreateDialog';
@@ -10,10 +10,8 @@ export * from './CollectionSection';
10
10
  export * from './JoinDialog';
11
11
  export * from './MembersContainer';
12
12
  export * from './MenuFooter';
13
- export * from './ObjectSettings';
14
- export * from './PersistenceStatus';
15
- export * from './PopoverRenameObject';
16
- export * from './PopoverRenameSpace';
13
+ export * from './ObjectRenamePopover';
14
+ export * from './SpaceRenamePopover';
17
15
  export * from './SchemaContainer';
18
16
  export * from './SpacePresence';
19
17
  export * from './SpacePluginSettings';
@@ -21,6 +19,7 @@ export * from './SpaceSettings';
21
19
  export * from './SyncStatus';
22
20
  export * from './ViewEditor';
23
21
 
24
- export const CollectionMain = lazy(() => import('./CollectionMain'));
25
- export const ObjectDetailsPanel = lazy(() => import('./ObjectDetailsPanel'));
26
- export const RecordMain = lazy(() => import('./RecordMain'));
22
+ export const CollectionArticle = lazy(() => import('./CollectionArticle'));
23
+ export const ObjectDetailsPanel: ComponentType<any> = lazy(() => import('./ObjectDetailsPanel'));
24
+ export const ObjectSettingsContainer = lazy(() => import('./ObjectSettings'));
25
+ export const RecordArticle = lazy(() => import('./RecordArticle'));
package/src/events.ts CHANGED
@@ -4,12 +4,12 @@
4
4
 
5
5
  import { Events, defineEvent } from '@dxos/app-framework';
6
6
 
7
- import { SPACE_PLUGIN } from './meta';
7
+ import { meta } from './meta';
8
8
 
9
9
  export namespace SpaceEvents {
10
- export const StateReady = Events.createStateEvent(`${SPACE_PLUGIN}/event/state-ready`);
11
- export const SetupSettingsPanel = defineEvent(`${SPACE_PLUGIN}/event/setup-settings-panel`);
12
- export const DefaultSpaceReady = defineEvent(`${SPACE_PLUGIN}/event/default-space-ready`);
13
- export const SpaceCreated = defineEvent(`${SPACE_PLUGIN}/event/space-created`);
14
- export const SchemaAdded = defineEvent(`${SPACE_PLUGIN}/event/schema-added`);
10
+ export const StateReady = Events.createStateEvent(`${meta.id}/event/state-ready`);
11
+ export const SetupSettingsPanel = defineEvent(`${meta.id}/event/setup-settings-panel`);
12
+ export const DefaultSpaceReady = defineEvent(`${meta.id}/event/default-space-ready`);
13
+ export const SpaceCreated = defineEvent(`${meta.id}/event/space-created`);
14
+ export const SchemaAdded = defineEvent(`${meta.id}/event/schema-added`);
15
15
  }
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './query';
@@ -0,0 +1,24 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, it } from 'vitest';
6
+
7
+ import { evalQuery } from './query';
8
+
9
+ describe('evalQuery', () => {
10
+ it('should evaluate a query string', () => {
11
+ const query = evalQuery('Query.select(Filter.type(Person.Person))');
12
+ expect(query.ast).toMatchInlineSnapshot(`
13
+ {
14
+ "filter": {
15
+ "id": undefined,
16
+ "props": {},
17
+ "type": "object",
18
+ "typename": "dxn:type:dxos.org/type/Person:0.1.0",
19
+ },
20
+ "type": "select",
21
+ }
22
+ `);
23
+ });
24
+ });
@@ -0,0 +1,158 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Array from 'effect/Array';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as EffectFunction from 'effect/Function';
8
+ import * as Match from 'effect/Match';
9
+ import * as Option from 'effect/Option';
10
+ import type * as Schema from 'effect/Schema';
11
+ import * as SchemaAST from 'effect/SchemaAST';
12
+
13
+ import { DXN, Filter, Query, type QueryAST } from '@dxos/echo';
14
+ import {
15
+ ReferenceAnnotationId,
16
+ type ReferenceAnnotationValue,
17
+ getTypeAnnotation,
18
+ unwrapOptional,
19
+ } from '@dxos/echo/internal';
20
+ import { log } from '@dxos/log';
21
+ import { type Client } from '@dxos/react-client';
22
+ import { type Space } from '@dxos/react-client/echo';
23
+ import { Person } from '@dxos/types';
24
+
25
+ // TODO(wittjosiah): Factor out and add tests.
26
+ // TODO(wittjosiah): Support arbitrary type imports.
27
+ export const evalQuery = (queryString: string): Query.Any => {
28
+ const globals = { Query, Filter, Person };
29
+ try {
30
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
31
+ return new Function(...Object.keys(globals), `return ${queryString}`)(...Object.values(globals));
32
+ } catch (err) {
33
+ log.catch(err);
34
+ return Query.select(Filter.nothing());
35
+ }
36
+ };
37
+
38
+ export const resolveSchemaWithClientAndSpace = (client: Client, space: Space, query: QueryAST.Query) => {
39
+ const resolve = Effect.fn(function* (dxn: string) {
40
+ const typename = DXN.parse(dxn).asTypeDXN()?.type;
41
+ if (!typename) {
42
+ return Option.none();
43
+ }
44
+
45
+ const staticSchema = client.graph.schemaRegistry.getSchema(typename);
46
+ if (staticSchema) {
47
+ return Option.some(staticSchema);
48
+ }
49
+
50
+ const query = space.db.schemaRegistry.query({ typename });
51
+ const schemas = yield* Effect.promise(() => query.run());
52
+ return Array.head(schemas).pipe(Option.map((schema) => schema.snapshot));
53
+ });
54
+
55
+ return resolveSchema(query, resolve).pipe(
56
+ Effect.map((schema) => Option.getOrUndefined(schema)),
57
+ Effect.runPromise,
58
+ );
59
+ };
60
+
61
+ const resolveSchema = (
62
+ query: QueryAST.Query,
63
+ resolve: (dxn: string) => Effect.Effect<Option.Option<Schema.Schema.AnyNoContext>>,
64
+ ): Effect.Effect<Option.Option<Schema.Schema.AnyNoContext>> => {
65
+ return Match.value(query).pipe(
66
+ Match.withReturnType<Effect.Effect<Option.Option<Schema.Schema.AnyNoContext>>>(),
67
+ // TODO(wittjosiah): Reconcile with filter match?
68
+ Match.when({ type: 'select' }, ({ filter }) =>
69
+ typenameFromFilter(filter).pipe(
70
+ Option.map((typename) => resolve(typename)),
71
+ Option.getOrElse(() => Effect.succeed(Option.none<Schema.Schema.AnyNoContext>())),
72
+ ),
73
+ ),
74
+ Match.when({ type: 'filter' }, ({ filter }) =>
75
+ typenameFromFilter(filter).pipe(
76
+ Option.map((typename) => resolve(typename)),
77
+ Option.getOrElse(() => Effect.succeed(Option.none<Schema.Schema.AnyNoContext>())),
78
+ ),
79
+ ),
80
+ Match.when({ type: 'reference-traversal' }, ({ anchor, property }) =>
81
+ resolveSchema(anchor, resolve).pipe(
82
+ Effect.map((base) =>
83
+ base.pipe(
84
+ Option.map((schema) => SchemaAST.getPropertySignatures(schema.ast)),
85
+ Option.flatMap((properties) => Array.findFirst(properties, (p) => p.name === property)),
86
+ Option.flatMap((property) =>
87
+ SchemaAST.getAnnotation<ReferenceAnnotationValue>(ReferenceAnnotationId)(unwrapOptional(property)),
88
+ ),
89
+ Option.map((annotation) => annotation.typename),
90
+ ),
91
+ ),
92
+ Effect.flatMap(
93
+ Option.match({
94
+ onNone: () => Effect.succeed(Option.none()),
95
+ onSome: (typename) => resolve(DXN.fromTypename(typename).toString()),
96
+ }),
97
+ ),
98
+ ),
99
+ ),
100
+ Match.when({ type: 'relation', filter: Match.defined }, ({ filter }) =>
101
+ typenameFromFilter(filter).pipe(
102
+ Option.map((typename) => resolve(typename)),
103
+ Option.getOrElse(() => Effect.succeed(Option.none<Schema.Schema.AnyNoContext>())),
104
+ ),
105
+ ),
106
+ Match.when({ type: 'relation-traversal' }, ({ anchor, direction }) =>
107
+ resolveSchema(anchor, resolve).pipe(
108
+ Effect.map((base) =>
109
+ base.pipe(
110
+ Option.map((schema) => getTypeAnnotation(schema)),
111
+ Option.flatMap((annotation) =>
112
+ Option.fromNullable(direction === 'source' ? annotation?.sourceSchema : annotation?.targetSchema),
113
+ ),
114
+ ),
115
+ ),
116
+ Effect.flatMap(
117
+ Option.match({
118
+ onNone: () => Effect.succeed(Option.none()),
119
+ onSome: (typename) => resolve(typename),
120
+ }),
121
+ ),
122
+ ),
123
+ ),
124
+ Match.when({ type: 'options' }, ({ query }) => resolveSchema(query, resolve)),
125
+ Match.orElse((_q) => {
126
+ // TODO(wittjosiah): Implement other cases.
127
+ return Effect.succeed(Option.none());
128
+ }),
129
+ );
130
+ };
131
+
132
+ const typenameFromFilter = (filter: QueryAST.Filter): Option.Option<string> =>
133
+ Match.value(filter).pipe(
134
+ Match.withReturnType<Option.Option<string>>(),
135
+ Match.when({ type: 'object' }, ({ typename }) => Option.fromNullable(typename)),
136
+ Match.when({ type: 'and' }, ({ filters }) =>
137
+ EffectFunction.pipe(filters, Array.map(typenameFromFilter), Array.findFirst(Option.isSome), Option.flatten),
138
+ ),
139
+ Match.when({ type: 'or' }, ({ filters }) =>
140
+ EffectFunction.pipe(filters, Array.map(typenameFromFilter), Array.findFirst(Option.isSome), Option.flatten),
141
+ ),
142
+ Match.orElse(() => Option.none()),
143
+ );
144
+
145
+ // TODO(wittjosiah): Currently assumes options is at the top-level of the ast.
146
+ export const getQueryTarget = (query: QueryAST.Query, space?: Space) => {
147
+ return Match.value(query).pipe(
148
+ Match.when({ type: 'options' }, ({ options }) => {
149
+ return Option.fromNullable(options.queues).pipe(
150
+ Option.flatMap((queues) => Array.head(queues)),
151
+ Option.flatMap((queueDxn) => Option.fromNullable(DXN.tryParse(queueDxn))),
152
+ Option.flatMap((queueDxn) => Option.fromNullable(space?.queues.get(queueDxn))),
153
+ Option.getOrElse(() => space),
154
+ );
155
+ }),
156
+ Match.orElse(() => space),
157
+ );
158
+ };
@@ -5,3 +5,4 @@
5
5
  export * from './useActiveSpace';
6
6
  export * from './useInputSurfaceLookup';
7
7
  export * from './usePath';
8
+ export * from './useTypeOptions';
@@ -2,7 +2,8 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, type PluginContext, useLayout } from '@dxos/app-framework';
5
+ import { Capabilities, type PluginContext } from '@dxos/app-framework';
6
+ import { useLayout } from '@dxos/app-framework/react';
6
7
  import { ClientCapabilities } from '@dxos/plugin-client';
7
8
  import { parseId, useSpace } from '@dxos/react-client/echo';
8
9
 
@@ -2,10 +2,10 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Schema } from 'effect';
5
+ import type * as Schema from 'effect/Schema';
6
6
  import React, { useCallback } from 'react';
7
7
 
8
- import { Surface, isSurfaceAvailable, usePluginManager } from '@dxos/app-framework';
8
+ import { Surface, isSurfaceAvailable, usePluginManager } from '@dxos/app-framework/react';
9
9
  import { type InputProps } from '@dxos/react-ui-form';
10
10
 
11
11
  // TODO(ZaymonFC): Move this if you find yourself needing it elsewhere.
@@ -20,7 +20,12 @@ export const useInputSurfaceLookup = (baseData?: Record<string, any>) => {
20
20
  return useCallback(
21
21
  ({ prop, schema, inputProps }: { prop: string; schema: Schema.Schema<any>; inputProps: InputProps }) => {
22
22
  const composedData = { prop, schema, ...baseData };
23
- if (!isSurfaceAvailable(pluginManager.context, { role: 'form-input', data: composedData })) {
23
+ if (
24
+ !isSurfaceAvailable(pluginManager.context, {
25
+ role: 'form-input',
26
+ data: composedData,
27
+ })
28
+ ) {
24
29
  return undefined;
25
30
  }
26
31
 
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Option } from 'effect';
5
+ import * as Option from 'effect/Option';
6
6
  import { useEffect, useState } from 'react';
7
7
 
8
8
  import { type ReadableGraph } from '@dxos/plugin-graph';
@@ -0,0 +1,59 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useMemo } from 'react';
6
+
7
+ import { useCapabilities } from '@dxos/app-framework/react';
8
+ import { Type } from '@dxos/echo';
9
+ import { ClientCapabilities } from '@dxos/plugin-client';
10
+ import { useClient } from '@dxos/react-client';
11
+ import { type Space } from '@dxos/react-client/echo';
12
+ import { useTranslation } from '@dxos/react-ui';
13
+ import { Collection, type TypenameAnnotation, getTypenames } from '@dxos/schema';
14
+
15
+ import { SpaceCapabilities } from '../capabilities';
16
+
17
+ const OMIT = [Collection.Collection.typename, Type.getTypename(Collection.QueryCollection)];
18
+
19
+ export const useTypeOptions = ({ space, annotation }: { space?: Space; annotation: TypenameAnnotation[] }) => {
20
+ const { t } = useTranslation();
21
+ const client = useClient();
22
+
23
+ const schemaWhitelists = useCapabilities(ClientCapabilities.SchemaWhiteList);
24
+ const whitelistedTypenames = useMemo(
25
+ () => new Set(schemaWhitelists.flatMap((typeArray) => typeArray.map((type) => Type.getTypename(type)))),
26
+ [schemaWhitelists],
27
+ );
28
+
29
+ const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
30
+ const objectFormTypenames = useMemo(
31
+ () =>
32
+ new Set(
33
+ objectForms
34
+ .map((form) => Type.getTypename(form.objectSchema))
35
+ // TODO(wittjosiah): Remove.
36
+ .filter((typename) => !OMIT.includes(typename) && !typename.endsWith('View')),
37
+ ),
38
+ [objectForms],
39
+ );
40
+
41
+ const typenames = getTypenames({
42
+ annotation,
43
+ whitelistedTypenames,
44
+ objectFormTypenames,
45
+ space,
46
+ client,
47
+ });
48
+
49
+ return useMemo(
50
+ () =>
51
+ typenames
52
+ .map((typename) => ({
53
+ value: typename,
54
+ label: t('typename label', { ns: typename, defaultValue: typename }),
55
+ }))
56
+ .toSorted((a, b) => a.label.localeCompare(b.label)),
57
+ [t, typenames],
58
+ );
59
+ };
package/src/index.ts CHANGED
@@ -6,6 +6,7 @@ export { SpaceCapabilities } from './capabilities';
6
6
  export { SpaceEvents } from './events';
7
7
 
8
8
  export * from './components';
9
+ export * from './helpers';
9
10
  export * from './hooks';
10
11
  export * from './meta';
11
12
  export * from './SpacePlugin';
package/src/meta.ts CHANGED
@@ -3,11 +3,14 @@
3
3
  //
4
4
 
5
5
  import { type PluginMeta } from '@dxos/app-framework';
6
-
7
- export const SPACE_PLUGIN = 'dxos.org/plugin/space';
6
+ import { trim } from '@dxos/util';
8
7
 
9
8
  export const meta: PluginMeta = {
10
- id: SPACE_PLUGIN,
9
+ id: 'dxos.org/plugin/space',
11
10
  name: 'Spaces',
11
+ description: trim`
12
+ Core workspace container system for organizing and sharing collaborative environments.
13
+ Create, manage, and share spaces with granular access control and invitation management.
14
+ `,
12
15
  icon: 'ph--planet--regular',
13
16
  };
@@ -2,9 +2,11 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { StoredSchema } from '@dxos/echo-schema';
5
+ import { Type } from '@dxos/echo';
6
+ import { StoredSchema } from '@dxos/echo/internal';
6
7
  import { type Resource } from '@dxos/react-ui';
7
- import { DataType } from '@dxos/schema';
8
+ import { Collection, View } from '@dxos/schema';
9
+ import { Event, Organization, Person, Project, Task } from '@dxos/types';
8
10
 
9
11
  import { meta } from './meta';
10
12
 
@@ -12,7 +14,7 @@ import { meta } from './meta';
12
14
  export const translations = [
13
15
  {
14
16
  'en-US': {
15
- [DataType.Collection.typename]: {
17
+ [Collection.Collection.typename]: {
16
18
  'typename label': 'Collection',
17
19
  'typename label_zero': 'Collections',
18
20
  'typename label_one': 'Collection',
@@ -21,7 +23,7 @@ export const translations = [
21
23
  'rename object label': 'Rename collection',
22
24
  'delete object label': 'Delete collection',
23
25
  },
24
- [DataType.QueryCollection.typename]: {
26
+ [Type.getTypename(Collection.QueryCollection)]: {
25
27
  'typename label': 'Smart Collection',
26
28
  'typename label_zero': 'Smart Collections',
27
29
  'typename label_one': 'Smart Collection',
@@ -39,7 +41,7 @@ export const translations = [
39
41
  'rename object label': 'Rename record type',
40
42
  'delete object label': 'Delete record type',
41
43
  },
42
- [DataType.View.typename]: {
44
+ [Type.getTypename(View.View)]: {
43
45
  'typename label': 'View',
44
46
  'typename label_zero': 'Views',
45
47
  'typename label_one': 'View',
@@ -48,35 +50,35 @@ export const translations = [
48
50
  'rename object label': 'Rename view',
49
51
  'delete object label': 'Delete view',
50
52
  },
51
- [DataType.Event.typename]: {
53
+ [Event.Event.typename]: {
52
54
  'typename label': 'Event',
53
55
  'typename label_zero': 'Events',
54
56
  'typename label_one': 'Event',
55
57
  'typename label_other': 'Events',
56
58
  'object name placeholder': 'New event',
57
59
  },
58
- [DataType.Organization.typename]: {
60
+ [Organization.Organization.typename]: {
59
61
  'typename label': 'Organization',
60
62
  'typename label_zero': 'Organizations',
61
63
  'typename label_one': 'Organization',
62
64
  'typename label_other': 'Organizations',
63
65
  'object name placeholder': 'New organization',
64
66
  },
65
- [DataType.Person.typename]: {
67
+ [Person.Person.typename]: {
66
68
  'typename label': 'Person',
67
69
  'typename label_zero': 'People',
68
70
  'typename label_one': 'Person',
69
71
  'typename label_other': 'People',
70
72
  'object name placeholder': 'New person',
71
73
  },
72
- [DataType.Project.typename]: {
74
+ [Project.Project.typename]: {
73
75
  'typename label': 'Project',
74
76
  'typename label_zero': 'Projects',
75
77
  'typename label_one': 'Project',
76
78
  'typename label_other': 'Projects',
77
79
  'object name placeholder': 'New project',
78
80
  },
79
- [DataType.Task.typename]: {
81
+ [Task.Task.typename]: {
80
82
  'typename label': 'Task',
81
83
  'typename label_zero': 'Tasks',
82
84
  'typename label_one': 'Task',
@@ -189,10 +191,12 @@ export const translations = [
189
191
  'creating in collection label': 'In Collection',
190
192
  'clear input label': 'Clear',
191
193
  'expose object label': 'Expose in navtree',
194
+ 'add tag label': 'Add tag',
192
195
  'advanced settings label': 'Advanced',
193
196
  'foreign keys': 'Foreign Keys',
194
197
  'add key': 'Add Key',
195
198
  'open space settings label': 'Open settings',
199
+ 'related objects label': 'Related Items',
196
200
 
197
201
  'row details no selection label': 'No objects selected',
198
202
  'companion selected objects label': 'Selected',
@@ -227,7 +231,18 @@ export const translations = [
227
231
  'archive space description':
228
232
  'Archiving a space will remove it from the sidebar and stop replicating updates, but will not delete the data. You can unarchive it by enabling archived spaces in the app settings.',
229
233
  'archive space label': 'Archive',
234
+ 'backup space label': 'Backup',
235
+ 'backup space description':
236
+ 'Download a backup of the space. Contains all data in the space in an unencrypted format.',
237
+ 'download backup': 'Download backup',
230
238
  'unarchive space label': 'Unarchive',
239
+
240
+ 'sync edge connected label': 'Edge connected',
241
+ 'sync edge disconnected label': 'Edge disconnected',
242
+ 'sync no connection label': 'No connection to edge service',
243
+ 'sync latency label': 'Latency',
244
+ 'sync upload label': 'Upload',
245
+ 'sync download label': 'Download',
231
246
  },
232
247
  },
233
248
  },