@dxos/plugin-space 0.8.4-main.84f28bd → 0.8.4-main.a4bbb77

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 (269) hide show
  1. package/dist/lib/browser/CollectionMain-AX7KKXWP.mjs +31 -0
  2. package/dist/lib/browser/CollectionMain-AX7KKXWP.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectDetailsPanel-ETI5YBTH.mjs +90 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-ETI5YBTH.mjs.map +7 -0
  5. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs +68 -0
  6. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-builder-PMDF6PJV.mjs → app-graph-builder-W7RVDAUA.mjs} +202 -48
  8. package/dist/lib/browser/app-graph-builder-W7RVDAUA.mjs.map +7 -0
  9. package/dist/lib/browser/{app-graph-serializer-UKYMBX4O.mjs → app-graph-serializer-VLHVTDX4.mjs} +14 -14
  10. package/dist/lib/browser/app-graph-serializer-VLHVTDX4.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-GVTXQCIW.mjs → chunk-2BFVC5K6.mjs} +431 -373
  12. package/dist/lib/browser/chunk-2BFVC5K6.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-E2I747A7.mjs +20 -0
  14. package/dist/lib/browser/chunk-E2I747A7.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-EIXZABXD.mjs +19 -0
  16. package/dist/lib/browser/chunk-EIXZABXD.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-VLBRSGJ2.mjs → chunk-ELJDGQTO.mjs} +3 -3
  18. package/dist/lib/browser/{chunk-VLBRSGJ2.mjs.map → chunk-ELJDGQTO.mjs.map} +3 -3
  19. package/dist/lib/browser/chunk-IRKDREHY.mjs +11 -0
  20. package/dist/lib/browser/chunk-IRKDREHY.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-S6NY637J.mjs → chunk-JCHSUOPF.mjs} +70 -10
  22. package/dist/lib/browser/chunk-JCHSUOPF.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-WBSEOLEM.mjs → chunk-PN27K4I7.mjs} +209 -54
  24. package/dist/lib/browser/chunk-PN27K4I7.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-6VLSHG4A.mjs → chunk-ZIZ2JLW6.mjs} +71 -9
  26. package/dist/lib/browser/chunk-ZIZ2JLW6.mjs.map +7 -0
  27. package/dist/lib/browser/{identity-created-23XJJV2N.mjs → identity-created-PW2BA46S.mjs} +4 -4
  28. package/dist/lib/browser/{identity-created-23XJJV2N.mjs.map → identity-created-PW2BA46S.mjs.map} +3 -3
  29. package/dist/lib/browser/index.mjs +95 -26
  30. package/dist/lib/browser/index.mjs.map +3 -3
  31. package/dist/lib/browser/{intent-resolver-WK5WYFH3.mjs → intent-resolver-HA7DPAUE.mjs} +185 -30
  32. package/dist/lib/browser/intent-resolver-HA7DPAUE.mjs.map +7 -0
  33. package/dist/lib/browser/meta.json +1 -1
  34. package/dist/lib/browser/{react-root-7S6FIC5G.mjs → react-root-YQUJU64P.mjs} +11 -11
  35. package/dist/lib/browser/react-root-YQUJU64P.mjs.map +7 -0
  36. package/dist/lib/browser/{react-surface-6C3YJNDK.mjs → react-surface-HTXYMRSW.mjs} +78 -46
  37. package/dist/lib/browser/react-surface-HTXYMRSW.mjs.map +7 -0
  38. package/dist/lib/browser/{schema-defs-K3B3OAH4.mjs → schema-defs-R56ZDBZ7.mjs} +5 -5
  39. package/dist/lib/browser/schema-defs-R56ZDBZ7.mjs.map +7 -0
  40. package/dist/lib/browser/{settings-XNWYRWNM.mjs → settings-5XPQMSPO.mjs} +5 -5
  41. package/dist/lib/browser/{settings-XNWYRWNM.mjs.map → settings-5XPQMSPO.mjs.map} +1 -1
  42. package/dist/lib/browser/{spaces-ready-K7NSNBHM.mjs → spaces-ready-YY77ANIF.mjs} +17 -15
  43. package/dist/lib/browser/spaces-ready-YY77ANIF.mjs.map +7 -0
  44. package/dist/lib/browser/{state-522XTUR4.mjs → state-Y4RVCG4A.mjs} +7 -7
  45. package/dist/lib/browser/state-Y4RVCG4A.mjs.map +7 -0
  46. package/dist/lib/browser/types/index.mjs +2 -2
  47. package/dist/lib/node-esm/CollectionMain-EU57SRYK.mjs +32 -0
  48. package/dist/lib/node-esm/CollectionMain-EU57SRYK.mjs.map +7 -0
  49. package/dist/lib/node-esm/ObjectDetailsPanel-TQ5GN4QJ.mjs +91 -0
  50. package/dist/lib/node-esm/ObjectDetailsPanel-TQ5GN4QJ.mjs.map +7 -0
  51. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs +70 -0
  52. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs.map +7 -0
  53. package/dist/lib/node-esm/{app-graph-builder-TO72W6MI.mjs → app-graph-builder-5ZJJUMQI.mjs} +202 -48
  54. package/dist/lib/node-esm/app-graph-builder-5ZJJUMQI.mjs.map +7 -0
  55. package/dist/lib/node-esm/{app-graph-serializer-LA3IZDXJ.mjs → app-graph-serializer-EZJSGJUT.mjs} +14 -14
  56. package/dist/lib/node-esm/app-graph-serializer-EZJSGJUT.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-SXD6T2N4.mjs → chunk-5XRYHWL7.mjs} +71 -9
  58. package/dist/lib/node-esm/chunk-5XRYHWL7.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-2THX6G4C.mjs → chunk-6WNZW6KT.mjs} +70 -10
  60. package/dist/lib/node-esm/chunk-6WNZW6KT.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-OUBADVJE.mjs → chunk-BLPXWPLB.mjs} +431 -373
  62. package/dist/lib/node-esm/chunk-BLPXWPLB.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-IJVBBVCL.mjs +21 -0
  64. package/dist/lib/node-esm/chunk-IJVBBVCL.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-HWNG4MEU.mjs → chunk-MWNATOXL.mjs} +2 -4
  66. package/dist/lib/node-esm/chunk-MWNATOXL.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs → chunk-Q6AAQLQG.mjs} +3 -3
  68. package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs.map → chunk-Q6AAQLQG.mjs.map} +3 -3
  69. package/dist/lib/node-esm/chunk-SVFKU7EW.mjs +20 -0
  70. package/dist/lib/node-esm/chunk-SVFKU7EW.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-HJJHLWKY.mjs → chunk-XDQXUZMK.mjs} +209 -54
  72. package/dist/lib/node-esm/chunk-XDQXUZMK.mjs.map +7 -0
  73. package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs → identity-created-MWTLGQRU.mjs} +4 -4
  74. package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs.map → identity-created-MWTLGQRU.mjs.map} +3 -3
  75. package/dist/lib/node-esm/index.mjs +95 -26
  76. package/dist/lib/node-esm/index.mjs.map +3 -3
  77. package/dist/lib/node-esm/{intent-resolver-HSR27ME4.mjs → intent-resolver-LQNHMPIX.mjs} +185 -30
  78. package/dist/lib/node-esm/intent-resolver-LQNHMPIX.mjs.map +7 -0
  79. package/dist/lib/node-esm/meta.json +1 -1
  80. package/dist/lib/node-esm/{react-root-HUK3ANLV.mjs → react-root-UTLJEIKE.mjs} +11 -11
  81. package/dist/lib/node-esm/react-root-UTLJEIKE.mjs.map +7 -0
  82. package/dist/lib/node-esm/{react-surface-AGAWX7DD.mjs → react-surface-LYDYON3U.mjs} +78 -46
  83. package/dist/lib/node-esm/react-surface-LYDYON3U.mjs.map +7 -0
  84. package/dist/lib/node-esm/{schema-defs-4MCDG4DV.mjs → schema-defs-7IMJPIWS.mjs} +5 -5
  85. package/dist/lib/node-esm/schema-defs-7IMJPIWS.mjs.map +7 -0
  86. package/dist/lib/node-esm/{settings-YGKHGFPH.mjs → settings-XBSK5KHH.mjs} +5 -5
  87. package/dist/lib/node-esm/{settings-YGKHGFPH.mjs.map → settings-XBSK5KHH.mjs.map} +1 -1
  88. package/dist/lib/node-esm/{spaces-ready-UM2P3DCR.mjs → spaces-ready-YX4IHT4P.mjs} +17 -15
  89. package/dist/lib/node-esm/spaces-ready-YX4IHT4P.mjs.map +7 -0
  90. package/dist/lib/node-esm/{state-C4IOXPZP.mjs → state-HOHAVPUO.mjs} +7 -7
  91. package/dist/lib/node-esm/state-HOHAVPUO.mjs.map +7 -0
  92. package/dist/lib/node-esm/types/index.mjs +2 -2
  93. package/dist/types/src/SpacePlugin.d.ts +1 -1
  94. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  96. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  98. package/dist/types/src/capabilities/capabilities.d.ts +11 -5
  99. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/identity-created.d.ts +1 -1
  101. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/index.d.ts +11 -12
  103. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  105. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  107. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  109. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/schema-defs.d.ts +1 -1
  111. package/dist/types/src/capabilities/schema-defs.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/settings.d.ts +1 -1
  113. package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
  114. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/state.d.ts +1 -1
  116. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  117. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  118. package/dist/types/src/components/CollectionMain.d.ts +1 -0
  119. package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
  120. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +5 -4
  121. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  122. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1584 -4
  123. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  124. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +5 -3
  125. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  126. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
  127. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  128. package/dist/types/src/components/JoinDialog.d.ts +1 -1
  129. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  130. package/dist/types/src/components/MembersContainer.d.ts +3 -2
  131. package/dist/types/src/components/MembersContainer.d.ts.map +1 -1
  132. package/dist/types/src/components/MembersContainer.stories.d.ts +1584 -5
  133. package/dist/types/src/components/MembersContainer.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
  135. package/dist/types/src/components/ObjectDetailsPanel.d.ts +9 -0
  136. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +1 -0
  137. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  138. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
  139. package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
  140. package/dist/types/src/components/PopoverRenameObject.d.ts +2 -2
  141. package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
  142. package/dist/types/src/components/PopoverRenameSpace.d.ts +1 -1
  143. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
  144. package/dist/types/src/components/RecordMain.d.ts +7 -0
  145. package/dist/types/src/components/RecordMain.d.ts.map +1 -0
  146. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  147. package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
  148. package/dist/types/src/components/SpacePresence.stories.d.ts +1412 -4
  149. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  151. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1417 -4
  152. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +1 -1
  154. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  155. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1418 -5
  156. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  157. package/dist/types/src/components/SyncStatus/status.d.ts +5 -5
  158. package/dist/types/src/components/ViewEditor.d.ts +8 -0
  159. package/dist/types/src/components/ViewEditor.d.ts.map +1 -0
  160. package/dist/types/src/components/index.d.ts +14 -1
  161. package/dist/types/src/components/index.d.ts.map +1 -1
  162. package/dist/types/src/events.d.ts +1 -0
  163. package/dist/types/src/events.d.ts.map +1 -1
  164. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  165. package/dist/types/src/meta.d.ts +0 -1
  166. package/dist/types/src/meta.d.ts.map +1 -1
  167. package/dist/types/src/translations.d.ts +1262 -11
  168. package/dist/types/src/translations.d.ts.map +1 -1
  169. package/dist/types/src/types/types.d.ts +124 -64
  170. package/dist/types/src/types/types.d.ts.map +1 -1
  171. package/dist/types/src/util.d.ts +34 -7
  172. package/dist/types/src/util.d.ts.map +1 -1
  173. package/dist/types/tsconfig.tsbuildinfo +1 -1
  174. package/package.json +61 -60
  175. package/src/SpacePlugin.ts +205 -137
  176. package/src/capabilities/app-graph-builder.ts +249 -36
  177. package/src/capabilities/app-graph-serializer.ts +7 -7
  178. package/src/capabilities/capabilities.ts +15 -9
  179. package/src/capabilities/identity-created.ts +1 -1
  180. package/src/capabilities/index.ts +0 -1
  181. package/src/capabilities/intent-resolver.ts +140 -19
  182. package/src/capabilities/react-root.tsx +4 -3
  183. package/src/capabilities/react-surface.tsx +93 -42
  184. package/src/capabilities/schema-defs.ts +3 -2
  185. package/src/capabilities/spaces-ready.ts +10 -7
  186. package/src/capabilities/state.ts +5 -4
  187. package/src/components/AwaitingObject.tsx +7 -9
  188. package/src/components/CollectionMain.tsx +4 -2
  189. package/src/components/CollectionSection.tsx +2 -2
  190. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +11 -10
  191. package/src/components/CreateDialog/CreateObjectDialog.tsx +50 -36
  192. package/src/components/CreateDialog/CreateObjectPanel.tsx +22 -11
  193. package/src/components/CreateDialog/CreateSpaceDialog.tsx +4 -4
  194. package/src/components/JoinDialog.tsx +7 -7
  195. package/src/components/MembersContainer.stories.tsx +36 -10
  196. package/src/components/MembersContainer.tsx +17 -16
  197. package/src/components/MenuFooter.tsx +4 -5
  198. package/src/components/ObjectDetailsPanel.tsx +79 -0
  199. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +3 -2
  200. package/src/components/ObjectSettings/ForeignKeys.tsx +2 -2
  201. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +3 -2
  202. package/src/components/PersistenceStatus.tsx +7 -8
  203. package/src/components/PopoverRenameObject.tsx +10 -16
  204. package/src/components/PopoverRenameSpace.tsx +4 -4
  205. package/src/components/RecordMain.tsx +43 -0
  206. package/src/components/SchemaContainer.tsx +4 -4
  207. package/src/components/SpacePluginSettings.tsx +8 -9
  208. package/src/components/SpacePresence.stories.tsx +23 -22
  209. package/src/components/SpacePresence.tsx +9 -9
  210. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +17 -9
  211. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +17 -17
  212. package/src/components/SyncStatus/InlineSyncStatus.tsx +2 -2
  213. package/src/components/SyncStatus/SyncStatus.stories.tsx +6 -7
  214. package/src/components/SyncStatus/SyncStatus.tsx +5 -4
  215. package/src/components/SyncStatus/status.ts +4 -4
  216. package/src/components/ViewEditor.tsx +59 -0
  217. package/src/components/index.ts +7 -1
  218. package/src/events.ts +7 -6
  219. package/src/hooks/useActiveSpace.ts +2 -2
  220. package/src/hooks/useInputSurfaceLookup.tsx +1 -1
  221. package/src/meta.ts +1 -3
  222. package/src/translations.ts +68 -5
  223. package/src/types/types.ts +70 -12
  224. package/src/util.tsx +199 -55
  225. package/dist/lib/browser/app-graph-builder-PMDF6PJV.mjs.map +0 -7
  226. package/dist/lib/browser/app-graph-serializer-UKYMBX4O.mjs.map +0 -7
  227. package/dist/lib/browser/chunk-6VLSHG4A.mjs.map +0 -7
  228. package/dist/lib/browser/chunk-C7KGJTAL.mjs +0 -18
  229. package/dist/lib/browser/chunk-C7KGJTAL.mjs.map +0 -7
  230. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  231. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  232. package/dist/lib/browser/chunk-GVTXQCIW.mjs.map +0 -7
  233. package/dist/lib/browser/chunk-S6NY637J.mjs.map +0 -7
  234. package/dist/lib/browser/chunk-WBSEOLEM.mjs.map +0 -7
  235. package/dist/lib/browser/chunk-XXIPJLJF.mjs +0 -19
  236. package/dist/lib/browser/chunk-XXIPJLJF.mjs.map +0 -7
  237. package/dist/lib/browser/intent-resolver-WK5WYFH3.mjs.map +0 -7
  238. package/dist/lib/browser/react-root-7S6FIC5G.mjs.map +0 -7
  239. package/dist/lib/browser/react-surface-6C3YJNDK.mjs.map +0 -7
  240. package/dist/lib/browser/schema-defs-K3B3OAH4.mjs.map +0 -7
  241. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs +0 -124
  242. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
  243. package/dist/lib/browser/spaces-ready-K7NSNBHM.mjs.map +0 -7
  244. package/dist/lib/browser/state-522XTUR4.mjs.map +0 -7
  245. package/dist/lib/node-esm/app-graph-builder-TO72W6MI.mjs.map +0 -7
  246. package/dist/lib/node-esm/app-graph-serializer-LA3IZDXJ.mjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-2THX6G4C.mjs.map +0 -7
  248. package/dist/lib/node-esm/chunk-72QMMRKC.mjs +0 -19
  249. package/dist/lib/node-esm/chunk-72QMMRKC.mjs.map +0 -7
  250. package/dist/lib/node-esm/chunk-AT7LGFER.mjs +0 -20
  251. package/dist/lib/node-esm/chunk-AT7LGFER.mjs.map +0 -7
  252. package/dist/lib/node-esm/chunk-HJJHLWKY.mjs.map +0 -7
  253. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  254. package/dist/lib/node-esm/chunk-OUBADVJE.mjs.map +0 -7
  255. package/dist/lib/node-esm/chunk-SXD6T2N4.mjs.map +0 -7
  256. package/dist/lib/node-esm/intent-resolver-HSR27ME4.mjs.map +0 -7
  257. package/dist/lib/node-esm/react-root-HUK3ANLV.mjs.map +0 -7
  258. package/dist/lib/node-esm/react-surface-AGAWX7DD.mjs.map +0 -7
  259. package/dist/lib/node-esm/schema-defs-4MCDG4DV.mjs.map +0 -7
  260. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs +0 -126
  261. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
  262. package/dist/lib/node-esm/spaces-ready-UM2P3DCR.mjs.map +0 -7
  263. package/dist/lib/node-esm/state-C4IOXPZP.mjs.map +0 -7
  264. package/dist/types/src/capabilities/schema-tool.test.d.ts +0 -2
  265. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +0 -1
  266. package/dist/types/src/capabilities/schema-tools.d.ts +0 -13
  267. package/dist/types/src/capabilities/schema-tools.d.ts.map +0 -1
  268. package/src/capabilities/schema-tool.test.ts +0 -44
  269. package/src/capabilities/schema-tools.ts +0 -125
@@ -12,31 +12,32 @@ import {
12
12
  createIntent,
13
13
  createResolver,
14
14
  } from '@dxos/app-framework';
15
- import { Obj, Ref, Relation, type Type } from '@dxos/echo';
15
+ import { Filter, Obj, Query, Ref, Relation, Type } from '@dxos/echo';
16
16
  import { invariant } from '@dxos/invariant';
17
17
  import { Migrations } from '@dxos/migrations';
18
18
  import { ClientCapabilities } from '@dxos/plugin-client';
19
19
  import { ObservabilityAction } from '@dxos/plugin-observability/types';
20
20
  import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
21
- import { isSpace, getSpace, SpaceState, fullyQualifiedId } from '@dxos/react-client/echo';
21
+ import { SpaceState, fullyQualifiedId, getSpace, isSpace } from '@dxos/react-client/echo';
22
22
  import { Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
23
23
  import { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';
24
- import { DataType } from '@dxos/schema';
24
+ import { DataType, ProjectionModel, typenameFromQuery } from '@dxos/schema';
25
25
 
26
- import { SpaceCapabilities } from './capabilities';
27
26
  import {
28
27
  CREATE_OBJECT_DIALOG,
29
28
  CREATE_SPACE_DIALOG,
29
+ type CreateObjectDialogProps,
30
30
  JOIN_DIALOG,
31
+ type JoinDialogProps,
31
32
  POPOVER_RENAME_OBJECT,
32
33
  POPOVER_RENAME_SPACE,
33
- type CreateObjectDialogProps,
34
- type JoinDialogProps,
35
34
  } from '../components';
36
35
  import { SpaceEvents } from '../events';
37
- import { SPACE_PLUGIN } from '../meta';
36
+ import { meta } from '../meta';
38
37
  import { CollectionAction, SpaceAction } from '../types';
39
- import { cloneObject, COMPOSER_SPACE_LOCK, getNestedObjects } from '../util';
38
+ import { COMPOSER_SPACE_LOCK, cloneObject, getNestedObjects } from '../util';
39
+
40
+ import { SpaceCapabilities } from './capabilities';
40
41
 
41
42
  // TODO(wittjosiah): Remove.
42
43
  const SPACE_MAX_OBJECTS = 500;
@@ -75,17 +76,27 @@ export default ({ context, observability, createInvitationUrl }: IntentResolverO
75
76
  await space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED);
76
77
  }
77
78
  await space.waitUntilReady();
79
+
80
+ // Create root collection.
78
81
  const collection = Obj.make(DataType.Collection, { objects: [] });
79
82
  space.properties[DataType.Collection.typename] = Ref.make(collection);
80
83
 
84
+ // Set current migration version.
81
85
  if (Migrations.versionProperty) {
82
86
  space.properties[Migrations.versionProperty] = Migrations.targetVersion;
83
87
  }
84
88
 
89
+ // Create records smart collection.
90
+ const records = Obj.make(DataType.QueryCollection, {
91
+ query: Query.select(Filter.typename(DataType.StoredSchema.typename)).ast,
92
+ });
93
+ collection.objects.push(Ref.make(records));
94
+
95
+ // Allow other plugins to add default content.
85
96
  await context.activatePromise(SpaceEvents.SpaceCreated);
86
- const onSpaceCreatedCallbacks = context.getCapabilities(SpaceCapabilities.OnSpaceCreated);
87
- await Promise.all(
88
- onSpaceCreatedCallbacks.map((onSpaceCreated) => onSpaceCreated({ space, rootCollection: collection })),
97
+ const onCreateSpaceCallbacks = context.getCapabilities(SpaceCapabilities.onCreateSpace);
98
+ const spaceCreatedIntents = onCreateSpaceCallbacks.map((onCreateSpace) =>
99
+ onCreateSpace({ space, rootCollection: collection }),
89
100
  );
90
101
 
91
102
  return {
@@ -95,6 +106,7 @@ export default ({ context, observability, createInvitationUrl }: IntentResolverO
95
106
  space,
96
107
  },
97
108
  intents: [
109
+ ...spaceCreatedIntents,
98
110
  ...(observability
99
111
  ? [
100
112
  createIntent(ObservabilityAction.SendEvent, {
@@ -309,9 +321,113 @@ export default ({ context, observability, createInvitationUrl }: IntentResolverO
309
321
  };
310
322
  },
311
323
  }),
324
+ createResolver({
325
+ intent: SpaceAction.UseStaticSchema,
326
+ resolve: async ({ space, typename }) => {
327
+ const client = context.getCapability(ClientCapabilities.Client);
328
+ const schema = client.graph.schemaRegistry.schemas.find((schema) => Type.getTypename(schema) === typename);
329
+ invariant(schema, `Schema not found: ${typename}`);
330
+
331
+ if (!space.properties.staticRecords) {
332
+ space.properties.staticRecords = [];
333
+ }
334
+
335
+ if (!space.properties.staticRecords.includes(typename)) {
336
+ space.properties.staticRecords.push(typename);
337
+ }
338
+
339
+ await context.activatePromise(SpaceEvents.SchemaAdded);
340
+ const onSchemaAdded = context.getCapabilities(SpaceCapabilities.OnSchemaAdded);
341
+ const schemaAddedIntents = onSchemaAdded.map((onSchemaAdded) => onSchemaAdded({ space, schema }));
342
+
343
+ return {
344
+ data: {},
345
+ intents: [
346
+ ...schemaAddedIntents,
347
+ ...(observability
348
+ ? [
349
+ createIntent(ObservabilityAction.SendEvent, {
350
+ name: 'space.schema.use',
351
+ properties: {
352
+ spaceId: space.id,
353
+ typename: Type.getTypename(schema),
354
+ },
355
+ }),
356
+ ]
357
+ : []),
358
+ ],
359
+ };
360
+ },
361
+ }),
362
+ createResolver({
363
+ intent: SpaceAction.AddSchema,
364
+ resolve: async ({ space, name, typename, version, schema: schemaInput }) => {
365
+ const [schema] = await space.db.schemaRegistry.register([schemaInput]);
366
+ if (name) {
367
+ schema.storedSchema.name = name;
368
+ }
369
+ if (typename) {
370
+ schema.storedSchema.typename = typename;
371
+ }
372
+ if (version) {
373
+ schema.storedSchema.version = version;
374
+ }
375
+
376
+ await context.activatePromise(SpaceEvents.SchemaAdded);
377
+ const onSchemaAdded = context.getCapabilities(SpaceCapabilities.OnSchemaAdded);
378
+ const schemaAddedIntents = onSchemaAdded.map((onSchemaAdded) => onSchemaAdded({ space, schema }));
379
+
380
+ return {
381
+ data: {
382
+ id: schema.id,
383
+ object: schema.storedSchema,
384
+ schema,
385
+ },
386
+ intents: [
387
+ ...schemaAddedIntents,
388
+ ...(observability
389
+ ? [
390
+ createIntent(ObservabilityAction.SendEvent, {
391
+ name: 'space.schema.add',
392
+ properties: {
393
+ spaceId: space.id,
394
+ objectId: schema.id,
395
+ typename: schema.typename,
396
+ },
397
+ }),
398
+ ]
399
+ : []),
400
+ ],
401
+ };
402
+ },
403
+ }),
404
+ createResolver({
405
+ intent: SpaceAction.DeleteField,
406
+ resolve: async ({ view, fieldId, deletionData }, undo) => {
407
+ const space = getSpace(view);
408
+ invariant(space);
409
+ const typename = typenameFromQuery(view.query.ast);
410
+ invariant(typename);
411
+ const schema = await space.db.schemaRegistry.query({ typename }).firstOrUndefined();
412
+ invariant(schema);
413
+ const projection = new ProjectionModel(schema.jsonSchema, view.projection);
414
+ if (!undo) {
415
+ const { deleted, index } = projection.deleteFieldProjection(fieldId);
416
+ return {
417
+ undoable: {
418
+ message: ['field deleted label', { ns: meta.id }],
419
+ data: { deletionData: { ...deleted, index } },
420
+ },
421
+ };
422
+ } else if (undo && deletionData) {
423
+ const { field, props, index } = deletionData;
424
+ projection.setFieldProjection({ field, props }, index);
425
+ }
426
+ },
427
+ }),
312
428
  createResolver({
313
429
  intent: SpaceAction.OpenCreateObject,
314
- resolve: ({ target, typename, navigable = true }) => {
430
+ resolve: ({ target, views, typename, initialFormValues, navigable = true, onCreateObject }) => {
315
431
  const state = context.getCapability(SpaceCapabilities.State);
316
432
 
317
433
  return {
@@ -323,7 +439,10 @@ export default ({ context, observability, createInvitationUrl }: IntentResolverO
323
439
  blockAlign: 'start',
324
440
  props: {
325
441
  target,
442
+ views,
326
443
  typename,
444
+ initialFormValues,
445
+ onCreateObject,
327
446
  shouldNavigate: navigable
328
447
  ? (object: Obj.Any) => {
329
448
  const isCollection = Obj.instanceOf(DataType.Collection, object);
@@ -351,13 +470,13 @@ export default ({ context, observability, createInvitationUrl }: IntentResolverO
351
470
  createIntent(LayoutAction.AddToast, {
352
471
  part: 'toast',
353
472
  subject: {
354
- id: `${SPACE_PLUGIN}/space-limit`,
355
- title: ['space limit label', { ns: SPACE_PLUGIN }],
356
- description: ['space limit description', { ns: SPACE_PLUGIN }],
473
+ id: `${meta.id}/space-limit`,
474
+ title: ['space limit label', { ns: meta.id }],
475
+ description: ['space limit description', { ns: meta.id }],
357
476
  duration: 5_000,
358
477
  icon: 'ph--warning--regular',
359
- actionLabel: ['remove deleted objects label', { ns: SPACE_PLUGIN }],
360
- actionAlt: ['remove deleted objects alt', { ns: SPACE_PLUGIN }],
478
+ actionLabel: ['remove deleted objects label', { ns: meta.id }],
479
+ actionAlt: ['remove deleted objects alt', { ns: meta.id }],
361
480
  closeLabel: ['close label', { ns: 'os' }],
362
481
  onAction: () => space.db.coreDatabase.unlinkDeletedObjects(),
363
482
  },
@@ -486,7 +605,7 @@ export default ({ context, observability, createInvitationUrl }: IntentResolverO
486
605
  return {
487
606
  undoable: {
488
607
  // TODO(ZaymonFC): Pluralize if more than one object.
489
- message: [undoMessageKey, { ns: SPACE_PLUGIN }],
608
+ message: [undoMessageKey, { ns: meta.id }],
490
609
  data: { deletionData },
491
610
  },
492
611
  intents:
@@ -578,7 +697,9 @@ export default ({ context, observability, createInvitationUrl }: IntentResolverO
578
697
  createResolver({
579
698
  intent: CollectionAction.CreateQueryCollection,
580
699
  resolve: async ({ name, typename }) => ({
581
- data: { object: Obj.make(DataType.QueryCollection, { name, query: { typename } }) },
700
+ data: {
701
+ object: Obj.make(DataType.QueryCollection, { name, query: Query.select(Filter.typename(typename)).ast }),
702
+ },
582
703
  }),
583
704
  }),
584
705
  ]);
@@ -6,13 +6,14 @@ import React from 'react';
6
6
 
7
7
  import { Capabilities, contributes, useCapability } from '@dxos/app-framework';
8
8
 
9
- import { SpaceCapabilities } from './capabilities';
10
9
  import { AwaitingObject } from '../components';
11
- import { SPACE_PLUGIN } from '../meta';
10
+ import { meta } from '../meta';
11
+
12
+ import { SpaceCapabilities } from './capabilities';
12
13
 
13
14
  export default () =>
14
15
  contributes(Capabilities.ReactRoot, {
15
- id: SPACE_PLUGIN,
16
+ id: meta.id,
16
17
  root: () => {
17
18
  const state = useCapability(SpaceCapabilities.State);
18
19
  return state.awaiting ? <AwaitingObject id={state.awaiting} /> : null;
@@ -7,9 +7,9 @@ import React, { useCallback, useMemo } from 'react';
7
7
 
8
8
  import {
9
9
  Capabilities,
10
+ Surface,
10
11
  contributes,
11
12
  createSurface,
12
- Surface,
13
13
  useCapabilities,
14
14
  useCapability,
15
15
  useLayout,
@@ -19,52 +19,65 @@ import { findAnnotation } from '@dxos/effect';
19
19
  import { SettingsStore } from '@dxos/local-storage';
20
20
  import { ClientCapabilities } from '@dxos/plugin-client';
21
21
  import { useClient } from '@dxos/react-client';
22
- import { getSpace, isLiveObject, isSpace, parseId, SpaceState, useSpace, type Space } from '@dxos/react-client/echo';
22
+ import {
23
+ type Space,
24
+ SpaceState,
25
+ fullyQualifiedId,
26
+ getSpace,
27
+ isLiveObject,
28
+ isSpace,
29
+ parseId,
30
+ useSpace,
31
+ } from '@dxos/react-client/echo';
23
32
  import { Input, useTranslation } from '@dxos/react-ui';
24
33
  import { type InputProps, SelectInput } from '@dxos/react-ui-form';
25
34
  import { HuePicker, IconPicker } from '@dxos/react-ui-pickers';
26
35
  import { DataType, type TypenameAnnotation, TypenameAnnotationId } from '@dxos/schema';
27
36
  import { type JoinPanelProps } from '@dxos/shell/react';
28
37
 
29
- import { SpaceCapabilities } from './capabilities';
30
38
  import {
31
- CollectionMain,
32
- CollectionSection,
33
39
  CREATE_OBJECT_DIALOG,
34
40
  CREATE_SPACE_DIALOG,
41
+ CollectionMain,
42
+ CollectionSection,
35
43
  CreateObjectDialog,
44
+ type CreateObjectDialogProps,
36
45
  CreateSpaceDialog,
37
46
  InlineSyncStatus,
38
47
  JOIN_DIALOG,
39
48
  JoinDialog,
40
49
  MembersContainer,
41
50
  MenuFooter,
51
+ ObjectDetailsPanel,
42
52
  ObjectSettingsContainer,
43
53
  POPOVER_RENAME_OBJECT,
44
54
  POPOVER_RENAME_SPACE,
45
55
  PopoverRenameObject,
46
56
  PopoverRenameSpace,
57
+ RecordMain,
47
58
  SchemaContainer,
48
59
  SmallPresenceLive,
49
60
  SpacePluginSettings,
50
61
  SpacePresence,
51
62
  SpaceSettingsContainer,
52
63
  SyncStatus,
53
- type CreateObjectDialogProps,
64
+ ViewEditor,
54
65
  } from '../components';
55
- import { SPACE_PLUGIN } from '../meta';
66
+ import { meta } from '../meta';
56
67
  import { HueAnnotationId, IconAnnotationId, type SpaceSettingsProps } from '../types';
57
68
 
69
+ import { SpaceCapabilities } from './capabilities';
70
+
58
71
  type ReactSurfaceOptions = {
59
72
  createInvitationUrl: (invitationCode: string) => string;
60
73
  };
61
74
 
62
- const OMIT = [DataType.Collection.typename, DataType.QueryCollection.typename];
75
+ const OMIT = [DataType.Collection.typename, Type.getTypename(DataType.QueryCollection)];
63
76
 
64
77
  export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
65
78
  contributes(Capabilities.ReactSurface, [
66
79
  createSurface({
67
- id: `${SPACE_PLUGIN}/article`,
80
+ id: `${meta.id}/article`,
68
81
  role: 'article',
69
82
  filter: (data): data is { subject: Space } =>
70
83
  // TODO(wittjosiah): Need to avoid shotgun parsing space state everywhere.
@@ -81,29 +94,36 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
81
94
  ),
82
95
  }),
83
96
  createSurface({
84
- id: `${SPACE_PLUGIN}/collection-fallback`,
97
+ id: `${meta.id}/record-article`,
98
+ role: 'article',
99
+ position: 'fallback',
100
+ filter: (data): data is { subject: Obj.Any } => Obj.isObject(data.subject),
101
+ component: ({ data }) => <RecordMain record={data.subject} />,
102
+ }),
103
+ createSurface({
104
+ id: `${meta.id}/collection-fallback`,
85
105
  role: 'article',
86
106
  position: 'fallback',
87
107
  filter: (data): data is { subject: DataType.Collection } => Obj.instanceOf(DataType.Collection, data.subject),
88
108
  component: ({ data }) => <CollectionMain collection={data.subject} />,
89
109
  }),
90
110
  createSurface({
91
- id: `${SPACE_PLUGIN}/plugin-settings`,
111
+ id: `${meta.id}/plugin-settings`,
92
112
  role: 'article',
93
113
  filter: (data): data is { subject: SettingsStore<SpaceSettingsProps> } =>
94
- data.subject instanceof SettingsStore && data.subject.prefix === SPACE_PLUGIN,
114
+ data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
95
115
  component: ({ data: { subject } }) => <SpacePluginSettings settings={subject.value} />,
96
116
  }),
97
117
  createSurface({
98
- id: `${SPACE_PLUGIN}/companion/object-settings`,
118
+ id: `${meta.id}/companion/object-settings`,
99
119
  role: 'article',
100
120
  filter: (data): data is { companionTo: Obj.Any } => Obj.isObject(data.companionTo) && data.subject === 'settings',
101
121
  component: ({ data, role }) => <ObjectSettingsContainer object={data.companionTo} role={role} />,
102
122
  }),
103
123
  createSurface({
104
- id: `${SPACE_PLUGIN}/space-settings-properties`,
124
+ id: `${meta.id}/space-settings-properties`,
105
125
  role: 'article',
106
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/properties`,
126
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/properties`,
107
127
  component: () => {
108
128
  const layout = useLayout();
109
129
  const { spaceId } = parseId(layout.workspace);
@@ -116,10 +136,10 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
116
136
  },
117
137
  }),
118
138
  createSurface({
119
- id: `${SPACE_PLUGIN}/space-settings-members`,
139
+ id: `${meta.id}/space-settings-members`,
120
140
  role: 'article',
121
141
  position: 'hoist',
122
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/members`,
142
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/members`,
123
143
  component: () => {
124
144
  const layout = useLayout();
125
145
  const { spaceId } = parseId(layout.workspace);
@@ -132,9 +152,9 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
132
152
  },
133
153
  }),
134
154
  createSurface({
135
- id: `${SPACE_PLUGIN}/space-settings-schema`,
155
+ id: `${meta.id}/space-settings-schema`,
136
156
  role: 'article',
137
- filter: (data): data is { subject: string } => data.subject === `${SPACE_PLUGIN}/schema`,
157
+ filter: (data): data is { subject: string } => data.subject === `${meta.id}/schema`,
138
158
  component: () => {
139
159
  const layout = useLayout();
140
160
  const { spaceId } = parseId(layout.workspace);
@@ -146,6 +166,19 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
146
166
  return <SchemaContainer space={space} />;
147
167
  },
148
168
  }),
169
+ createSurface({
170
+ id: `${meta.id}/selected-objects`,
171
+ role: 'article',
172
+ filter: (data): data is { companionTo: DataType.View; subject: 'selected-objects' } =>
173
+ Obj.instanceOf(DataType.View, data.companionTo) && data.subject === 'selected-objects',
174
+ component: ({ data }) => (
175
+ <ObjectDetailsPanel
176
+ key={fullyQualifiedId(data.companionTo)}
177
+ objectId={fullyQualifiedId(data.companionTo)}
178
+ view={data.companionTo}
179
+ />
180
+ ),
181
+ }),
149
182
  createSurface({
150
183
  id: JOIN_DIALOG,
151
184
  role: 'dialog',
@@ -165,45 +198,45 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
165
198
  component: ({ data }) => <CreateObjectDialog {...data.props} />,
166
199
  }),
167
200
  createSurface({
168
- id: `${SPACE_PLUGIN}/create-initial-space-form-[hue]`,
201
+ id: `${meta.id}/create-initial-space-form-[hue]`,
169
202
  role: 'form-input',
170
203
  filter: (data): data is { prop: string; schema: Schema.Schema<any> } => {
171
204
  const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, HueAnnotationId);
172
205
  return !!annotation;
173
206
  },
174
207
  component: ({ data: _, ...inputProps }) => {
175
- const { label, disabled, type, getValue, onValueChange } = inputProps as any as InputProps;
208
+ const { label, readonly, type, getValue, onValueChange } = inputProps as any as InputProps;
176
209
  const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange]);
177
210
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange]);
178
211
  return (
179
212
  <Input.Root>
180
213
  <Input.Label>{label}</Input.Label>
181
- <HuePicker disabled={disabled} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
214
+ <HuePicker disabled={!!readonly} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
182
215
  </Input.Root>
183
216
  );
184
217
  },
185
218
  }),
186
219
  createSurface({
187
- id: `${SPACE_PLUGIN}/create-initial-space-form-[icon]`,
220
+ id: `${meta.id}/create-initial-space-form-[icon]`,
188
221
  role: 'form-input',
189
222
  filter: (data): data is { prop: string; schema: Schema.Schema<any> } => {
190
223
  const annotation = findAnnotation<boolean>((data.schema as Schema.Schema.All).ast, IconAnnotationId);
191
224
  return !!annotation;
192
225
  },
193
226
  component: ({ data: _, ...inputProps }) => {
194
- const { label, disabled, type, getValue, onValueChange } = inputProps as any as InputProps;
227
+ const { label, readonly, type, getValue, onValueChange } = inputProps as any as InputProps;
195
228
  const handleChange = useCallback((nextIcon: string) => onValueChange(type, nextIcon), [onValueChange]);
196
229
  const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange]);
197
230
  return (
198
231
  <Input.Root>
199
232
  <Input.Label>{label}</Input.Label>
200
- <IconPicker disabled={disabled} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
233
+ <IconPicker disabled={!!readonly} value={getValue() ?? ''} onChange={handleChange} onReset={handleReset} />
201
234
  </Input.Root>
202
235
  );
203
236
  },
204
237
  }),
205
238
  createSurface({
206
- id: `${SPACE_PLUGIN}/typename-form-input`,
239
+ id: `${meta.id}/typename-form-input`,
207
240
  role: 'form-input',
208
241
  filter: (
209
242
  data,
@@ -228,7 +261,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
228
261
 
229
262
  const schemaWhitelists = useCapabilities(ClientCapabilities.SchemaWhiteList);
230
263
  const whitelistedTypenames = useMemo(
231
- () => new Set(schemaWhitelists.flatMap((typeArray) => typeArray.map((type) => type.typename))),
264
+ () => new Set(schemaWhitelists.flatMap((typeArray) => typeArray.map((type) => Type.getTypename(type)))),
232
265
  [schemaWhitelists],
233
266
  );
234
267
 
@@ -239,7 +272,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
239
272
  objectForms
240
273
  .map((form) => Type.getTypename(form.objectSchema))
241
274
  // TODO(wittjosiah): Remove.
242
- .filter((typename) => !OMIT.includes(typename)),
275
+ .filter((typename) => !OMIT.includes(typename) && !typename.endsWith('View')),
243
276
  ),
244
277
  [objectForms],
245
278
  );
@@ -247,13 +280,23 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
247
280
  const fixed = client.graph.schemaRegistry.schemas.filter((schema) => {
248
281
  const limitedStatic =
249
282
  annotation.includes('limited-static') && whitelistedTypenames.has(Type.getTypename(schema));
283
+ const unusedStatic =
284
+ annotation.includes('unused-static') &&
285
+ whitelistedTypenames.has(Type.getTypename(schema)) &&
286
+ !space.properties.staticRecords?.includes(Type.getTypename(schema));
287
+ const usedStatic =
288
+ annotation.includes('used-static') &&
289
+ whitelistedTypenames.has(Type.getTypename(schema)) &&
290
+ space.properties.staticRecords?.includes(Type.getTypename(schema));
250
291
  const objectForm = annotation.includes('object-form') && objectFormTypenames.has(Type.getTypename(schema));
251
- return annotation.includes('static') || limitedStatic || objectForm;
292
+ return annotation.includes('static') || limitedStatic || unusedStatic || usedStatic || objectForm;
252
293
  });
253
294
  const dynamic = space?.db.schemaRegistry.query().runSync();
254
295
  const typenames = Array.from(
255
296
  new Set<string>([
256
297
  ...(annotation.includes('limited-static') ||
298
+ annotation.includes('unused-static') ||
299
+ annotation.includes('used-static') ||
257
300
  annotation.includes('static') ||
258
301
  annotation.includes('object-form')
259
302
  ? fixed.map((schema) => Type.getTypename(schema))
@@ -264,37 +307,45 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
264
307
 
265
308
  const options = useMemo(
266
309
  () =>
267
- typenames.map((typename) => ({
268
- value: typename,
269
- label: t('typename label', { ns: typename, defaultValue: typename }),
270
- })),
310
+ typenames
311
+ .map((typename) => ({
312
+ value: typename,
313
+ label: t('typename label', { ns: typename, defaultValue: typename }),
314
+ }))
315
+ .toSorted((a, b) => a.label.localeCompare(b.label)),
271
316
  [t, typenames],
272
317
  );
273
318
 
274
319
  return <SelectInput {...props} options={options} />;
275
320
  },
276
321
  }),
322
+ createSurface({
323
+ id: `${meta.id}/object-settings`,
324
+ role: 'object-settings',
325
+ filter: (data): data is { subject: DataType.View } => Obj.instanceOf(DataType.View, data.subject),
326
+ component: ({ data }) => <ViewEditor view={data.subject} />,
327
+ }),
277
328
  createSurface({
278
329
  id: POPOVER_RENAME_SPACE,
279
- role: 'popover',
330
+ role: 'card--popover',
280
331
  filter: (data): data is { props: Space } => data.component === POPOVER_RENAME_SPACE && isSpace(data.props),
281
332
  component: ({ data }) => <PopoverRenameSpace space={data.props} />,
282
333
  }),
283
334
  createSurface({
284
335
  id: POPOVER_RENAME_OBJECT,
285
- role: 'popover',
336
+ role: 'card--popover',
286
337
  filter: (data): data is { props: Obj.Any } =>
287
338
  data.component === POPOVER_RENAME_OBJECT && isLiveObject(data.props),
288
339
  component: ({ data }) => <PopoverRenameObject object={data.props} />,
289
340
  }),
290
341
  createSurface({
291
- id: `${SPACE_PLUGIN}/menu-footer`,
342
+ id: `${meta.id}/menu-footer`,
292
343
  role: 'menu-footer',
293
344
  filter: (data): data is { subject: Obj.Any } => Obj.isObject(data.subject),
294
345
  component: ({ data }) => <MenuFooter object={data.subject} />,
295
346
  }),
296
347
  createSurface({
297
- id: `${SPACE_PLUGIN}/navtree-presence`,
348
+ id: `${meta.id}/navtree-presence`,
298
349
  role: 'navtree-item-end',
299
350
  filter: (data): data is { id: string; subject: Obj.Any; open?: boolean } =>
300
351
  typeof data.id === 'string' && Obj.isObject(data.subject),
@@ -306,7 +357,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
306
357
  }),
307
358
  // TODO(wittjosiah): Attention glyph for non-echo items should be handled elsewhere.
308
359
  createSurface({
309
- id: `${SPACE_PLUGIN}/navtree-presence-fallback`,
360
+ id: `${meta.id}/navtree-presence-fallback`,
310
361
  role: 'navtree-item-end',
311
362
  position: 'fallback',
312
363
  filter: (data): data is { id: string; open?: boolean } => typeof data.id === 'string',
@@ -314,13 +365,13 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
314
365
  }),
315
366
  // TODO(wittjosiah): Broken?
316
367
  createSurface({
317
- id: `${SPACE_PLUGIN}/navtree-sync-status`,
368
+ id: `${meta.id}/navtree-sync-status`,
318
369
  role: 'navtree-item-end',
319
370
  filter: (data): data is { subject: Space; open?: boolean } => isSpace(data.subject),
320
371
  component: ({ data }) => <InlineSyncStatus space={data.subject} open={data.open} />,
321
372
  }),
322
373
  createSurface({
323
- id: `${SPACE_PLUGIN}/navbar-presence`,
374
+ id: `${meta.id}/navbar-presence`,
324
375
  role: 'navbar-end',
325
376
  position: 'hoist',
326
377
  filter: (data): data is { subject: Space | Obj.Any } => isSpace(data.subject) || Obj.isObject(data.subject),
@@ -336,13 +387,13 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
336
387
  },
337
388
  }),
338
389
  createSurface({
339
- id: `${SPACE_PLUGIN}/collection-section`,
390
+ id: `${meta.id}/collection-section`,
340
391
  role: 'section',
341
392
  filter: (data): data is { subject: DataType.Collection } => Obj.instanceOf(DataType.Collection, data.subject),
342
393
  component: ({ data }) => <CollectionSection collection={data.subject} />,
343
394
  }),
344
395
  createSurface({
345
- id: `${SPACE_PLUGIN}/status`,
396
+ id: `${meta.id}/status`,
346
397
  role: 'status',
347
398
  component: () => <SyncStatus />,
348
399
  }),
@@ -2,12 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';
5
+ import { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';
6
6
  import { ClientCapabilities } from '@dxos/plugin-client';
7
7
 
8
- import { SpaceCapabilities } from './capabilities';
9
8
  import { type ObjectForm } from '../types';
10
9
 
10
+ import { SpaceCapabilities } from './capabilities';
11
+
11
12
  export default (context: PluginContext) => {
12
13
  const registry = context.getCapability(Capabilities.RxRegistry);
13
14
  const client = context.getCapability(ClientCapabilities.Client);