@dxos/plugin-space 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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 (357) 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-ACGHWPDX.mjs +141 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-ACGHWPDX.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectSettings-U3IH7BMV.mjs +144 -0
  6. package/dist/lib/browser/ObjectSettings-U3IH7BMV.mjs.map +7 -0
  7. package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-HABMCWAI.mjs +517 -0
  10. package/dist/lib/browser/app-graph-builder-HABMCWAI.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-3A6KBYWT.mjs → app-graph-serializer-G3VFEGTN.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-G3VFEGTN.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-6A3NWBB6.mjs +392 -0
  14. package/dist/lib/browser/chunk-6A3NWBB6.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-C6DAPIFF.mjs +20 -0
  16. package/dist/lib/browser/chunk-C6DAPIFF.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-DCY3W36E.mjs → chunk-GJOZILGC.mjs} +210 -142
  18. package/dist/lib/browser/chunk-GJOZILGC.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-J6YZG77T.mjs → chunk-KCZ527AM.mjs} +641 -500
  20. package/dist/lib/browser/chunk-KCZ527AM.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-ELJDGQTO.mjs → chunk-P25R3AOK.mjs} +35 -5
  22. package/dist/lib/browser/chunk-P25R3AOK.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-WAXS2ZVX.mjs → chunk-POFUXISV.mjs} +69 -62
  24. package/dist/lib/browser/chunk-POFUXISV.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 +88 -131
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-7E3IZIJS.mjs → intent-resolver-RZEWNJ2K.mjs} +105 -100
  34. package/dist/lib/browser/intent-resolver-RZEWNJ2K.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-JCRD74GI.mjs +30 -0
  37. package/dist/lib/browser/react-root-JCRD74GI.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-GL4CE2F4.mjs → react-surface-VOETEAG3.mjs} +91 -111
  39. package/dist/lib/browser/react-surface-VOETEAG3.mjs.map +7 -0
  40. package/dist/lib/browser/repair-CNLE35NF.mjs +44 -0
  41. package/dist/lib/browser/repair-CNLE35NF.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-B6MMHLPS.mjs → settings-TRLI52I5.mjs} +5 -5
  43. package/dist/lib/browser/{settings-B6MMHLPS.mjs.map → settings-TRLI52I5.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-QVABOCO3.mjs → spaces-ready-OHGCWZHQ.mjs} +22 -15
  45. package/dist/lib/browser/spaces-ready-OHGCWZHQ.mjs.map +7 -0
  46. package/dist/lib/browser/{state-2RGW7FQG.mjs → state-C7N6EDDZ.mjs} +7 -7
  47. package/dist/lib/browser/state-C7N6EDDZ.mjs.map +7 -0
  48. package/dist/lib/browser/types/index.mjs +10 -4
  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-6OFTT3GG.mjs +142 -0
  52. package/dist/lib/node-esm/ObjectDetailsPanel-6OFTT3GG.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectSettings-YXPJQMJ5.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectSettings-YXPJQMJ5.mjs.map +7 -0
  55. package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs +117 -0
  56. package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs.map +7 -0
  57. package/dist/lib/node-esm/app-graph-builder-T6VJKIOA.mjs +518 -0
  58. package/dist/lib/node-esm/app-graph-builder-T6VJKIOA.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-M45TH5LR.mjs → app-graph-serializer-2NLWWFUB.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-2NLWWFUB.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-Q6AAQLQG.mjs → chunk-7EV4SN47.mjs} +34 -5
  62. package/dist/lib/node-esm/chunk-7EV4SN47.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-HYIZVPOA.mjs → chunk-AX3UGL5D.mjs} +69 -62
  64. package/dist/lib/node-esm/chunk-AX3UGL5D.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  66. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-H4JILUJK.mjs +20 -0
  68. package/dist/lib/node-esm/chunk-H4JILUJK.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-AUQ3SKL2.mjs → chunk-I6FZP42D.mjs} +210 -142
  70. package/dist/lib/node-esm/chunk-I6FZP42D.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-ZCEH2VYE.mjs → chunk-JAMGJUFU.mjs} +641 -500
  72. package/dist/lib/node-esm/chunk-JAMGJUFU.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-WWGV5FJM.mjs +21 -0
  74. package/dist/lib/node-esm/chunk-WWGV5FJM.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-X34VDVMY.mjs +393 -0
  76. package/dist/lib/node-esm/chunk-X34VDVMY.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 +88 -131
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-UVO4MKWX.mjs → intent-resolver-4PHJWDXW.mjs} +105 -100
  82. package/dist/lib/node-esm/intent-resolver-4PHJWDXW.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-O5I5CDJ7.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-O5I5CDJ7.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-IOC6YSVQ.mjs → react-surface-J3XDMU2D.mjs} +91 -111
  87. package/dist/lib/node-esm/react-surface-J3XDMU2D.mjs.map +7 -0
  88. package/dist/lib/node-esm/repair-EHZS6MFY.mjs +45 -0
  89. package/dist/lib/node-esm/repair-EHZS6MFY.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-IOFU6EAS.mjs → settings-MNQTKHL7.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-IOFU6EAS.mjs.map → settings-MNQTKHL7.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-MS6GHPFR.mjs → spaces-ready-ZPU24DA2.mjs} +22 -15
  93. package/dist/lib/node-esm/spaces-ready-ZPU24DA2.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-7VBVBGNS.mjs → state-45TXZQJ6.mjs} +7 -7
  95. package/dist/lib/node-esm/state-45TXZQJ6.mjs.map +7 -0
  96. package/dist/lib/node-esm/types/index.mjs +10 -4
  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 +13 -7
  101. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/index.d.ts +1 -1
  103. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/repair.d.ts +4 -0
  108. package/dist/types/src/capabilities/repair.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  110. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  111. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  112. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  113. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  114. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  115. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +1 -1
  116. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  117. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +218 -215
  118. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +16 -9
  120. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  121. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
  122. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  123. package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +1 -1
  124. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  125. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  126. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  127. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  128. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1591 -0
  129. package/dist/types/src/components/{MembersContainer.stories.d.ts.map → MembersContainer/MembersContainer.stories.d.ts.map} +1 -1
  130. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  131. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  132. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +9 -0
  133. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -0
  134. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts +10 -0
  135. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -0
  136. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts +3 -0
  137. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts.map +1 -0
  138. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  139. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  140. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  141. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  142. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  143. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +2 -2
  144. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  145. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +1424 -0
  146. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +3 -3
  148. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +1 -1
  149. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
  150. package/dist/types/src/components/ObjectSettings/index.d.ts +2 -1
  151. package/dist/types/src/components/ObjectSettings/index.d.ts.map +1 -1
  152. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  153. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  154. package/dist/types/src/components/{MembersContainer.stories.d.ts → RecordArticle.stories.d.ts} +219 -216
  155. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  156. package/dist/types/src/components/SchemaContainer.d.ts +2 -2
  157. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  158. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  159. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +6 -5
  160. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  161. package/dist/types/src/components/{SpacePresence.stories.d.ts → SpacePresence/SpacePresence.stories.d.ts} +220 -217
  162. package/dist/types/src/components/{SpacePresence.stories.d.ts.map → SpacePresence/SpacePresence.stories.d.ts.map} +1 -1
  163. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  164. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  165. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  166. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  167. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  168. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  169. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  170. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +218 -215
  171. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  172. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  173. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +219 -216
  174. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  175. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  176. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  177. package/dist/types/src/components/index.d.ts +10 -17
  178. package/dist/types/src/components/index.d.ts.map +1 -1
  179. package/dist/types/src/events.d.ts.map +1 -1
  180. package/dist/types/src/helpers/index.d.ts +2 -0
  181. package/dist/types/src/helpers/index.d.ts.map +1 -0
  182. package/dist/types/src/helpers/query.d.ts +8 -0
  183. package/dist/types/src/helpers/query.d.ts.map +1 -0
  184. package/dist/types/src/helpers/query.test.d.ts +2 -0
  185. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  186. package/dist/types/src/hooks/index.d.ts +1 -0
  187. package/dist/types/src/hooks/index.d.ts.map +1 -1
  188. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  189. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +1 -1
  190. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  191. package/dist/types/src/hooks/usePath.d.ts +1 -1
  192. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  194. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  195. package/dist/types/src/index.d.ts +1 -0
  196. package/dist/types/src/index.d.ts.map +1 -1
  197. package/dist/types/src/meta.d.ts +0 -1
  198. package/dist/types/src/meta.d.ts.map +1 -1
  199. package/dist/types/src/translations.d.ts +1261 -67
  200. package/dist/types/src/translations.d.ts.map +1 -1
  201. package/dist/types/src/types/form.d.ts +24 -0
  202. package/dist/types/src/types/form.d.ts.map +1 -0
  203. package/dist/types/src/types/index.d.ts +1 -0
  204. package/dist/types/src/types/index.d.ts.map +1 -1
  205. package/dist/types/src/types/types.d.ts +82 -142
  206. package/dist/types/src/types/types.d.ts.map +1 -1
  207. package/dist/types/src/util.d.ts +21 -34
  208. package/dist/types/src/util.d.ts.map +1 -1
  209. package/dist/types/tsconfig.tsbuildinfo +1 -1
  210. package/package.json +68 -59
  211. package/src/SpacePlugin.ts +181 -215
  212. package/src/capabilities/app-graph-builder.ts +205 -267
  213. package/src/capabilities/app-graph-serializer.ts +12 -12
  214. package/src/capabilities/capabilities.ts +26 -16
  215. package/src/capabilities/identity-created.ts +2 -2
  216. package/src/capabilities/index.ts +1 -1
  217. package/src/capabilities/intent-resolver.ts +78 -75
  218. package/src/capabilities/react-root.tsx +4 -3
  219. package/src/capabilities/react-surface.tsx +95 -145
  220. package/src/capabilities/repair.ts +57 -0
  221. package/src/capabilities/spaces-ready.ts +15 -6
  222. package/src/capabilities/state.ts +2 -2
  223. package/src/components/AwaitingObject.tsx +12 -14
  224. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
  225. package/src/components/CollectionSection.tsx +8 -6
  226. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +11 -11
  227. package/src/components/CreateDialog/CreateObjectDialog.tsx +63 -43
  228. package/src/components/CreateDialog/CreateObjectPanel.tsx +38 -31
  229. package/src/components/CreateDialog/CreateSpaceDialog.tsx +30 -11
  230. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  231. package/src/components/JoinDialog/index.ts +5 -0
  232. package/src/components/{MembersContainer.stories.tsx → MembersContainer/MembersContainer.stories.tsx} +7 -6
  233. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +16 -14
  234. package/src/components/MembersContainer/index.ts +5 -0
  235. package/src/components/MenuFooter.tsx +2 -2
  236. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +51 -0
  237. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +72 -0
  238. package/src/components/ObjectDetailsPanel/index.ts +7 -0
  239. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +6 -6
  240. package/src/components/ObjectRenamePopover/index.ts +5 -0
  241. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +6 -7
  242. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +63 -0
  243. package/src/components/ObjectSettings/BaseObjectSettings.tsx +90 -26
  244. package/src/components/ObjectSettings/ForeignKeys.tsx +8 -8
  245. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +4 -3
  246. package/src/components/ObjectSettings/index.ts +3 -1
  247. package/src/components/RecordArticle.stories.tsx +115 -0
  248. package/src/components/RecordArticle.tsx +114 -0
  249. package/src/components/SchemaContainer.tsx +24 -27
  250. package/src/components/SpacePluginSettings.tsx +10 -4
  251. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +23 -25
  252. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +16 -11
  253. package/src/components/SpacePresence/index.ts +5 -0
  254. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
  255. package/src/components/SpaceRenamePopover/index.ts +5 -0
  256. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +9 -4
  257. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +63 -23
  258. package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
  259. package/src/components/SyncStatus/SyncStatus.stories.tsx +4 -5
  260. package/src/components/SyncStatus/SyncStatus.tsx +107 -11
  261. package/src/components/ViewEditor.tsx +57 -23
  262. package/src/components/index.ts +7 -8
  263. package/src/events.ts +6 -6
  264. package/src/helpers/index.ts +5 -0
  265. package/src/helpers/query.test.ts +24 -0
  266. package/src/helpers/query.ts +158 -0
  267. package/src/hooks/index.ts +1 -0
  268. package/src/hooks/useActiveSpace.ts +2 -1
  269. package/src/hooks/useInputSurfaceLookup.tsx +8 -3
  270. package/src/hooks/usePath.ts +1 -1
  271. package/src/hooks/useTypeOptions.ts +27 -0
  272. package/src/index.ts +1 -0
  273. package/src/meta.ts +6 -3
  274. package/src/translations.ts +68 -58
  275. package/src/types/form.ts +75 -0
  276. package/src/types/index.ts +1 -0
  277. package/src/types/types.ts +44 -50
  278. package/src/util.tsx +216 -143
  279. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +0 -7
  280. package/dist/lib/browser/ObjectDetailsPanel-SY6FYTYC.mjs +0 -88
  281. package/dist/lib/browser/ObjectDetailsPanel-SY6FYTYC.mjs.map +0 -7
  282. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs +0 -68
  283. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs.map +0 -7
  284. package/dist/lib/browser/app-graph-builder-FLF7XMQO.mjs +0 -516
  285. package/dist/lib/browser/app-graph-builder-FLF7XMQO.mjs.map +0 -7
  286. package/dist/lib/browser/app-graph-serializer-3A6KBYWT.mjs.map +0 -7
  287. package/dist/lib/browser/chunk-CBYL62HG.mjs +0 -19
  288. package/dist/lib/browser/chunk-CBYL62HG.mjs.map +0 -7
  289. package/dist/lib/browser/chunk-DCY3W36E.mjs.map +0 -7
  290. package/dist/lib/browser/chunk-ELJDGQTO.mjs.map +0 -7
  291. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  292. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  293. package/dist/lib/browser/chunk-J6YZG77T.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-RQVV4XVF.mjs +0 -343
  295. package/dist/lib/browser/chunk-RQVV4XVF.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-TUQZO5P4.mjs +0 -20
  297. package/dist/lib/browser/chunk-TUQZO5P4.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-WAXS2ZVX.mjs.map +0 -7
  299. package/dist/lib/browser/identity-created-T6ZNVE7S.mjs.map +0 -7
  300. package/dist/lib/browser/intent-resolver-7E3IZIJS.mjs.map +0 -7
  301. package/dist/lib/browser/react-root-RWMT2RCK.mjs +0 -29
  302. package/dist/lib/browser/react-root-RWMT2RCK.mjs.map +0 -7
  303. package/dist/lib/browser/react-surface-GL4CE2F4.mjs.map +0 -7
  304. package/dist/lib/browser/schema-defs-YDPFZELA.mjs +0 -26
  305. package/dist/lib/browser/schema-defs-YDPFZELA.mjs.map +0 -7
  306. package/dist/lib/browser/spaces-ready-QVABOCO3.mjs.map +0 -7
  307. package/dist/lib/browser/state-2RGW7FQG.mjs.map +0 -7
  308. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +0 -7
  309. package/dist/lib/node-esm/ObjectDetailsPanel-3MYLTMXN.mjs +0 -89
  310. package/dist/lib/node-esm/ObjectDetailsPanel-3MYLTMXN.mjs.map +0 -7
  311. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs +0 -70
  312. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs.map +0 -7
  313. package/dist/lib/node-esm/app-graph-builder-D5YPOJS5.mjs +0 -517
  314. package/dist/lib/node-esm/app-graph-builder-D5YPOJS5.mjs.map +0 -7
  315. package/dist/lib/node-esm/app-graph-serializer-M45TH5LR.mjs.map +0 -7
  316. package/dist/lib/node-esm/chunk-AUQ3SKL2.mjs.map +0 -7
  317. package/dist/lib/node-esm/chunk-FJZNSJC4.mjs +0 -20
  318. package/dist/lib/node-esm/chunk-FJZNSJC4.mjs.map +0 -7
  319. package/dist/lib/node-esm/chunk-HC677WUJ.mjs +0 -21
  320. package/dist/lib/node-esm/chunk-HC677WUJ.mjs.map +0 -7
  321. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  322. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-HYIZVPOA.mjs.map +0 -7
  324. package/dist/lib/node-esm/chunk-Q6AAQLQG.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-WKQTO37U.mjs +0 -344
  326. package/dist/lib/node-esm/chunk-WKQTO37U.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-ZCEH2VYE.mjs.map +0 -7
  328. package/dist/lib/node-esm/identity-created-AL7NNCKH.mjs.map +0 -7
  329. package/dist/lib/node-esm/intent-resolver-UVO4MKWX.mjs.map +0 -7
  330. package/dist/lib/node-esm/react-root-5EKYI66P.mjs.map +0 -7
  331. package/dist/lib/node-esm/react-surface-IOC6YSVQ.mjs.map +0 -7
  332. package/dist/lib/node-esm/schema-defs-OYBCWKAS.mjs +0 -27
  333. package/dist/lib/node-esm/schema-defs-OYBCWKAS.mjs.map +0 -7
  334. package/dist/lib/node-esm/spaces-ready-MS6GHPFR.mjs.map +0 -7
  335. package/dist/lib/node-esm/state-7VBVBGNS.mjs.map +0 -7
  336. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  337. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  338. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  339. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  340. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  341. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  342. package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
  343. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
  344. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  345. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  346. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  347. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  348. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  349. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  350. package/dist/types/src/components/RecordMain.d.ts +0 -7
  351. package/dist/types/src/components/RecordMain.d.ts.map +0 -1
  352. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  353. package/src/capabilities/schema-defs.ts +0 -31
  354. package/src/components/ObjectDetailsPanel.tsx +0 -77
  355. package/src/components/PersistenceStatus.tsx +0 -83
  356. package/src/components/RecordMain.tsx +0 -43
  357. /package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +0 -0
@@ -2,15 +2,17 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Schema, pipe } from 'effect';
5
+ import * as Function from 'effect/Function';
6
+ import * as Schema from 'effect/Schema';
6
7
  import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
8
 
8
- import { LayoutAction, chain, createIntent, useIntentDispatcher } from '@dxos/app-framework';
9
+ import { LayoutAction, chain, createIntent } from '@dxos/app-framework';
10
+ import { useCapabilities, useIntentDispatcher } from '@dxos/app-framework/react';
9
11
  import { log } from '@dxos/log';
10
12
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
11
13
  import { useClient } from '@dxos/react-client';
12
14
  import { type Space, SpaceState } from '@dxos/react-client/echo';
13
- import { Button, Input, useMulticastObservable, useTranslation } from '@dxos/react-ui';
15
+ import { Button, Input, useFileDownload, useMulticastObservable, useTranslation } from '@dxos/react-ui';
14
16
  import {
15
17
  ControlItem,
16
18
  ControlItemInput,
@@ -22,11 +24,16 @@ import {
22
24
  import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
23
25
  import { StackItem } from '@dxos/react-ui-stack';
24
26
 
25
- import { SPACE_PLUGIN } from '../../meta';
27
+ import { SpaceCapabilities } from '../../capabilities';
28
+ import { meta } from '../../meta';
26
29
  import { SpaceAction, SpaceForm } from '../../types';
27
30
 
28
31
  const FormSchema = SpaceForm.pipe(
29
- Schema.extend(Schema.Struct({ archived: Schema.Boolean.annotations({ title: 'Archive space' }) })),
32
+ Schema.extend(
33
+ Schema.Struct({
34
+ archived: Schema.Boolean.annotations({ title: 'Archive Space' }),
35
+ }),
36
+ ),
30
37
  );
31
38
 
32
39
  export type SpaceSettingsContainerProps = {
@@ -35,7 +42,7 @@ export type SpaceSettingsContainerProps = {
35
42
 
36
43
  // TODO(wittjosiah): Handle space migrations here?
37
44
  export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) => {
38
- const { t } = useTranslation(SPACE_PLUGIN);
45
+ const { t } = useTranslation(meta.id);
39
46
  const { dispatchPromise: dispatch } = useIntentDispatcher();
40
47
  const client = useClient();
41
48
  const archived = useMulticastObservable(space.state) === SpaceState.SPACE_INACTIVE;
@@ -69,9 +76,12 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
69
76
  }
70
77
  if (properties.archived && !archived) {
71
78
  void dispatch(
72
- pipe(
79
+ Function.pipe(
73
80
  createIntent(SpaceAction.Close, { space }),
74
- chain(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: client.spaces.default.id }),
81
+ chain(LayoutAction.SwitchWorkspace, {
82
+ part: 'workspace',
83
+ subject: client.spaces.default.id,
84
+ }),
75
85
  ),
76
86
  );
77
87
  } else if (!properties.archived && archived) {
@@ -111,31 +121,25 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
111
121
  );
112
122
  },
113
123
  icon: ({ type, label, getValue, onValueChange }) => {
114
- const handleChange = useCallback((nextEmoji: string) => onValueChange(type, nextEmoji), [onValueChange, type]);
115
- const handleEmojiReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
124
+ const handleChange = useCallback((icon: string) => onValueChange(type, icon), [onValueChange, type]);
125
+ const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
116
126
  return (
117
127
  <ControlItem title={label} description={t('icon description')}>
118
128
  <IconPicker
119
129
  value={getValue()}
120
130
  onChange={handleChange}
121
- onReset={handleEmojiReset}
131
+ onReset={handleReset}
122
132
  classNames='justify-self-end'
123
- iconSize={5}
124
133
  />
125
134
  </ControlItem>
126
135
  );
127
136
  },
128
137
  hue: ({ type, label, getValue, onValueChange }) => {
129
138
  const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);
130
- const handleHueReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
139
+ const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
131
140
  return (
132
141
  <ControlItem title={label} description={t('hue description')}>
133
- <HuePicker
134
- value={getValue()}
135
- onChange={handleChange}
136
- onReset={handleHueReset}
137
- classNames='[--hue-preview-size:1.25rem] justify-self-end'
138
- />
142
+ <HuePicker value={getValue()} onChange={handleChange} onReset={handleReset} classNames='justify-self-end' />
139
143
  </ControlItem>
140
144
  );
141
145
  },
@@ -151,7 +155,11 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
151
155
  const handleChange = useCallback(() => onValueChange(type, !getValue()), [onValueChange, type, getValue]);
152
156
  return (
153
157
  <ControlItemInput title={label} description={t('archive space description')}>
154
- <Button disabled={space === client.spaces.default} onClick={handleChange}>
158
+ <Button
159
+ disabled={space === client.spaces.default}
160
+ variant={getValue() ? 'default' : 'destructive'}
161
+ onClick={handleChange}
162
+ >
155
163
  {getValue() ? t('unarchive space label') : t('archive space label')}
156
164
  </Button>
157
165
  </ControlItemInput>
@@ -161,12 +169,25 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
161
169
  [t, space],
162
170
  );
163
171
 
172
+ const download = useFileDownload();
173
+ const handleBackup = useCallback(async () => {
174
+ const archive = await space.internal.export();
175
+ download(new Blob([archive.contents as Uint8Array<ArrayBuffer>]), archive.filename);
176
+ }, [space, download]);
177
+
178
+ const repairs = useCapabilities(SpaceCapabilities.Repair);
179
+ const handleRepair = useCallback(async () => {
180
+ await Promise.all(repairs.map((repair) => repair({ space, isDefault: client.spaces.default === space })));
181
+ }, [client, space, repairs]);
182
+
164
183
  return (
165
- <StackItem.Content classNames='block overflow-y-auto'>
184
+ <StackItem.Content scrollable>
166
185
  <ControlPage>
167
186
  <ControlSection
168
- title={t('space properties settings verbose label', { ns: SPACE_PLUGIN })}
169
- description={t('space properties settings description', { ns: SPACE_PLUGIN })}
187
+ title={t('space properties settings verbose label', { ns: meta.id })}
188
+ description={t('space properties settings description', {
189
+ ns: meta.id,
190
+ })}
170
191
  >
171
192
  <Form
172
193
  schema={FormSchema}
@@ -178,6 +199,25 @@ export const SpaceSettingsContainer = ({ space }: SpaceSettingsContainerProps) =
178
199
  classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]'
179
200
  />
180
201
  </ControlSection>
202
+ <ControlSection
203
+ title={t('space controls title', { ns: meta.id })}
204
+ description={t('space controls description', { ns: meta.id })}
205
+ >
206
+ <div role='none' className='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]'>
207
+ <ControlItemInput
208
+ title={t('backup space title', { ns: meta.id })}
209
+ description={t('backup space description', { ns: meta.id })}
210
+ >
211
+ <Button onClick={handleBackup}>{t('download backup label')}</Button>
212
+ </ControlItemInput>
213
+ <ControlItemInput
214
+ title={t('repair space title', { ns: meta.id })}
215
+ description={t('repair space description', { ns: meta.id })}
216
+ >
217
+ <Button onClick={handleRepair}>{t('repair space label')}</Button>
218
+ </ControlItemInput>
219
+ </div>
220
+ </ControlSection>
181
221
  </ControlPage>
182
222
  </StackItem.Content>
183
223
  );
@@ -2,10 +2,10 @@
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 React, { useEffect, useState } from 'react';
7
7
 
8
- import { useAppGraph } from '@dxos/app-framework';
8
+ import { useAppGraph } from '@dxos/app-framework/react';
9
9
  import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
10
10
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
11
11
  import { useClient } from '@dxos/react-client';
@@ -14,14 +14,14 @@ import { Tooltip, useTranslation } from '@dxos/react-ui';
14
14
  import { AttentionGlyph, useAttended, useAttention } from '@dxos/react-ui-attention';
15
15
 
16
16
  import { usePath } from '../../hooks';
17
- import { SPACE_PLUGIN } from '../../meta';
17
+ import { meta } from '../../meta';
18
18
 
19
- const useEdgeStatus = (): EdgeStatus => {
20
- const [status, setStatus] = useState(EdgeStatus.NOT_CONNECTED);
19
+ const useEdgeStatus = (): EdgeStatus.ConnectionState => {
20
+ const [status, setStatus] = useState(EdgeStatus.ConnectionState.NOT_CONNECTED);
21
21
  const client = useClient();
22
22
  useEffect(() => {
23
23
  client.services.services.EdgeAgentService?.queryEdgeStatus().subscribe(({ status }) => {
24
- setStatus(status);
24
+ setStatus(status.state);
25
25
  });
26
26
  }, [client]);
27
27
 
@@ -29,7 +29,7 @@ const useEdgeStatus = (): EdgeStatus => {
29
29
  };
30
30
 
31
31
  export const InlineSyncStatus = ({ space, open }: { space: Space; open?: boolean }) => {
32
- const { t } = useTranslation(SPACE_PLUGIN);
32
+ const { t } = useTranslation(meta.id);
33
33
  const id = space.id;
34
34
  const { hasAttention, isAncestor, isRelated } = useAttention(id);
35
35
  const isAttended = hasAttention || isAncestor || isRelated;
@@ -43,7 +43,7 @@ export const InlineSyncStatus = ({ space, open }: { space: Space; open?: boolean
43
43
  const path = usePath(graph, startOfAttention);
44
44
  const containsAttended = !open && !isAttended && id && Option.isSome(path) ? path.value.includes(id) : false;
45
45
 
46
- const connectedToEdge = useEdgeStatus() === EdgeStatus.CONNECTED;
46
+ const connectedToEdge = useEdgeStatus() === EdgeStatus.ConnectionState.CONNECTED;
47
47
  // TODO(wittjosiah): This is not reactive.
48
48
  const edgeSyncEnabled = space.internal.data.edgeReplication === EdgeReplicationSetting.ENABLED;
49
49
  const syncState = useSpaceSyncState(space);
@@ -2,11 +2,10 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
 
9
- import { withTheme } from '@dxos/storybook-utils';
7
+ import { withClientProvider } from '@dxos/react-client/testing';
8
+ import { withTheme } from '@dxos/react-ui/testing';
10
9
 
11
10
  import { translations } from '../../translations';
12
11
 
@@ -15,10 +14,10 @@ import { SyncStatusIndicator } from './SyncStatus';
15
14
  const meta = {
16
15
  title: 'plugins/plugin-space/SyncStatusIndicator',
17
16
  component: SyncStatusIndicator,
18
- decorators: [withTheme],
17
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
19
18
  parameters: {
20
- translations,
21
19
  layout: 'centered',
20
+ translations,
22
21
  },
23
22
  } satisfies Meta<typeof SyncStatusIndicator>;
24
23
 
@@ -5,11 +5,16 @@
5
5
  import React, { useEffect, useState } from 'react';
6
6
 
7
7
  import { StatusBar } from '@dxos/plugin-status-bar';
8
+ import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
9
+ import { type QueryEdgeStatusResponse } from '@dxos/protocols/proto/dxos/client/services';
8
10
  import { useClient } from '@dxos/react-client';
11
+ import { useStream } from '@dxos/react-client/devtools';
9
12
  import { type SpaceSyncStateMap, getSyncSummary, useSyncState } from '@dxos/react-client/echo';
10
- import { Icon, useTranslation } from '@dxos/react-ui';
13
+ import { Icon, Popover, useTranslation } from '@dxos/react-ui';
14
+ import { mx } from '@dxos/react-ui-theme';
15
+ import { Unit, type UnitFormat } from '@dxos/util';
11
16
 
12
- import { SPACE_PLUGIN } from '../../meta';
17
+ import { meta } from '../../meta';
13
18
 
14
19
  import { createClientSaveTracker } from './save-tracker';
15
20
  import { getIcon, getStatus } from './status';
@@ -20,18 +25,13 @@ export const SyncStatus = () => {
20
25
  const client = useClient();
21
26
  const state = useSyncState();
22
27
  const [saved, setSaved] = useState(true);
23
-
24
- useEffect(() => {
25
- return createClientSaveTracker(client, (state) => {
26
- setSaved(state === 'saved');
27
- });
28
- }, []);
28
+ useEffect(() => createClientSaveTracker(client, (state) => setSaved(state === 'saved')), []);
29
29
 
30
30
  return <SyncStatusIndicator state={state} saved={saved} />;
31
31
  };
32
32
 
33
33
  export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap; saved: boolean }) => {
34
- const { t } = useTranslation(SPACE_PLUGIN);
34
+ const { t } = useTranslation(meta.id);
35
35
  const summary = getSyncSummary(state);
36
36
  const offline = Object.values(state).length === 0;
37
37
  const needsToUpload = summary.differentDocuments > 0 || summary.missingOnRemote > 0;
@@ -53,7 +53,103 @@ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap
53
53
  }, [offline, needsToUpload, needsToDownload]);
54
54
 
55
55
  const title = t(`${status} label`);
56
- const icon = <Icon icon={getIcon(status)} size={4} classNames={classNames} />;
56
+ const icon = <Icon icon={getIcon(status)} classNames={classNames} />;
57
+
58
+ return (
59
+ <Popover.Root>
60
+ <Popover.Trigger asChild>
61
+ <StatusBar.Item title={title}>{icon}</StatusBar.Item>
62
+ </Popover.Trigger>
63
+ <Popover.Portal>
64
+ <Popover.Content>
65
+ <EdgeConnectionPopover />
66
+ <Popover.Arrow />
67
+ </Popover.Content>
68
+ </Popover.Portal>
69
+ </Popover.Root>
70
+ );
71
+ };
72
+
73
+ const useEdgeStatus = (): EdgeStatus | undefined => {
74
+ const client = useClient();
75
+ const { status } = useStream(
76
+ () => client.services.services.EdgeAgentService!.queryEdgeStatus(),
77
+ {} as QueryEdgeStatusResponse,
78
+ );
79
+ return status;
80
+ };
81
+
82
+ const EdgeConnectionPopover = () => {
83
+ const status = useEdgeStatus();
84
+ const { t } = useTranslation(meta.id);
85
+
86
+ const isConnected = status?.state === EdgeStatus.ConnectionState.CONNECTED;
87
+
88
+ return (
89
+ <div className='min-is-[240px] p-2'>
90
+ {/* Connection Status Header */}
91
+ <div className='flex items-center gap-2 mbe-2'>
92
+ <Icon
93
+ icon={isConnected ? 'ph--check-circle--regular' : 'ph--warning-circle--regular'}
94
+ classNames={mx(isConnected ? 'text-successText' : 'text-errorText animate-pulse')}
95
+ />
96
+ <span className='font-medium text-sm'>
97
+ {isConnected ? t('sync edge connected label') : t('sync edge disconnected label')}
98
+ </span>
99
+ </div>
100
+
101
+ {/* Connection Details */}
102
+ {status?.state === EdgeStatus.ConnectionState.NOT_CONNECTED && (
103
+ <div className='flex items-center gap-2 text-sm text-description'>
104
+ <Icon icon='ph--cloud-x--regular' />
105
+ <span>{t('sync no connection label')}</span>
106
+ </div>
107
+ )}
108
+
109
+ {status?.state === EdgeStatus.ConnectionState.CONNECTED && (
110
+ <div className='space-y-2'>
111
+ {/* Latency */}
112
+ <div className='flex items-center justify-between text-sm'>
113
+ <div className='flex items-center gap-2 text-description'>
114
+ <Icon icon='ph--timer--regular' />
115
+ <span>{t('sync latency label')}</span>
116
+ </div>
117
+ <UnitValue value={status.rtt} format={Unit.Millisecond} />
118
+ </div>
119
+
120
+ {/* Upload Speed */}
121
+ <div className='flex items-center justify-between text-sm'>
122
+ <div className='flex items-center gap-2 text-description'>
123
+ <Icon icon='ph--arrow-up--regular' />
124
+ <span>{t('sync upload label')}</span>
125
+ </div>
126
+ <UnitValue value={status.rateBytesUp} format={Unit.Kilobyte} suffix='/s' />
127
+ </div>
128
+
129
+ {/* Download Speed */}
130
+ <div className='flex items-center justify-between text-sm'>
131
+ <div className='flex items-center gap-2 text-sm text-description'>
132
+ <Icon icon='ph--arrow-down--regular' />
133
+ <span>{t('sync download label')}</span>
134
+ </div>
135
+ <UnitValue value={status.rateBytesDown} format={Unit.Kilobyte} suffix='/s' />
136
+ </div>
137
+ </div>
138
+ )}
139
+ </div>
140
+ );
141
+ };
57
142
 
58
- return <StatusBar.Item title={title}>{icon}</StatusBar.Item>;
143
+ // TODO(burdon): Factor out.
144
+ const UnitValue = ({ value: input, format, suffix }: { value: number; format: UnitFormat; suffix?: string }) => {
145
+ const { formattedValue, unit } = format(input);
146
+ return (
147
+ <span className='font-mono'>
148
+ {formattedValue}
149
+ <span className='mis-1 text-subdued'>
150
+ {unit.symbol}
151
+ {suffix}
152
+ </span>
153
+ </span>
154
+ );
59
155
  };
@@ -2,42 +2,73 @@
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({
30
+ space,
31
+ annotation: {
32
+ location: ['database', 'runtime'],
33
+ kind: ['user'],
34
+ registered: ['registered'],
35
+ },
36
+ });
37
+
38
+ useAsyncEffect(async () => {
39
+ if (!view?.query || !space) {
40
+ return;
41
+ }
24
42
 
25
- const views = useQuery(space, Filter.type(DataType.View));
26
- const currentTypename = useMemo(() => view.query?.typename, [view.query?.typename]);
43
+ const foundSchema = await resolveSchemaWithClientAndSpace(client, space, view.query.ast);
44
+ if (foundSchema && foundSchema !== schema) {
45
+ setSchema(() => foundSchema);
46
+ }
47
+ }, [client, space, view, schema]);
27
48
 
28
- const handleUpdateTypename = useCallback(
29
- (typename: string) => {
30
- invariant(schema);
31
- invariant(Type.isMutable(schema));
49
+ const handleQueryChanged = useCallback(
50
+ async (newQuery: QueryAST.Query, target?: string) => {
51
+ if (!view || !space) {
52
+ return;
53
+ }
32
54
 
33
- const matchingViews = views.filter((view) => view.query.typename === currentTypename);
34
- for (const view of matchingViews) {
35
- view.query.typename = typename;
55
+ const queue = target && DXN.tryParse(target) ? target : undefined;
56
+ const query = queue ? Query.fromAst(newQuery).options({ queues: [queue] }) : Query.fromAst(newQuery);
57
+ view.query.ast = query.ast;
58
+ const newSchema = await resolveSchemaWithClientAndSpace(client, space, query.ast);
59
+ if (!newSchema) {
60
+ return;
36
61
  }
37
62
 
38
- schema.updateTypename(typename);
63
+ const newView = View.make({
64
+ query,
65
+ jsonSchema: Type.toJsonSchema(newSchema),
66
+ });
67
+ view.projection = Obj.getSnapshot(newView).projection;
68
+
69
+ setSchema(() => newSchema);
39
70
  },
40
- [views, schema],
71
+ [view, schema],
41
72
  );
42
73
 
43
74
  const handleDelete = useCallback(
@@ -52,13 +83,16 @@ export const ViewEditor = ({ view }: ViewEditorProps) => {
52
83
  }
53
84
 
54
85
  return (
55
- <NativeViewEditor
86
+ <NaturalViewEditor
56
87
  registry={space.db.schemaRegistry}
57
88
  schema={schema}
58
89
  view={view}
59
- onTypenameChanged={Type.isMutable(schema) ? handleUpdateTypename : undefined}
60
- onDelete={Type.isMutable(schema) ? handleDelete : undefined}
90
+ mode='tag'
61
91
  outerSpacing={false}
92
+ tags={tags}
93
+ types={types}
94
+ onQueryChanged={handleQueryChanged}
95
+ onDelete={Type.isMutable(schema) ? handleDelete : undefined}
62
96
  />
63
97
  );
64
98
  };
@@ -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
+ });