@dxos/plugin-space 0.8.4-main.f9ba587 → 0.8.4-main.fffef41

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 (361) hide show
  1. package/dist/lib/browser/CollectionArticle-WTHWY4YS.mjs +31 -0
  2. package/dist/lib/browser/CollectionArticle-WTHWY4YS.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectDetailsPanel-2BRUBHP6.mjs +141 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-2BRUBHP6.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectSettings-5LLWCVEK.mjs +144 -0
  6. package/dist/lib/browser/ObjectSettings-5LLWCVEK.mjs.map +7 -0
  7. package/dist/lib/browser/RecordArticle-SXDRWTTU.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-SXDRWTTU.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-DTM7BJ6D.mjs +528 -0
  10. package/dist/lib/browser/app-graph-builder-DTM7BJ6D.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-UKYMBX4O.mjs → app-graph-serializer-TIKXF43P.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-TIKXF43P.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-AFUOMLX6.mjs +167 -0
  14. package/dist/lib/browser/chunk-AFUOMLX6.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-GVTXQCIW.mjs → chunk-CKACGS7T.mjs} +714 -571
  16. package/dist/lib/browser/chunk-CKACGS7T.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-K5J7ZB5P.mjs +20 -0
  18. package/dist/lib/browser/chunk-K5J7ZB5P.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-WBSEOLEM.mjs → chunk-KFUMADZF.mjs} +301 -73
  20. package/dist/lib/browser/chunk-KFUMADZF.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-6VLSHG4A.mjs → chunk-VGKOXAPE.mjs} +87 -12
  22. package/dist/lib/browser/chunk-VGKOXAPE.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
  24. package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-WJXU4GKV.mjs +19 -0
  26. package/dist/lib/browser/chunk-WJXU4GKV.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-S6NY637J.mjs → chunk-ZQMSGD5J.mjs} +95 -19
  28. package/dist/lib/browser/chunk-ZQMSGD5J.mjs.map +7 -0
  29. package/dist/lib/browser/{identity-created-23XJJV2N.mjs → identity-created-NAXTPQXE.mjs} +6 -6
  30. package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +148 -59
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-WK5WYFH3.mjs → intent-resolver-3FNTO3VW.mjs} +236 -68
  34. package/dist/lib/browser/intent-resolver-3FNTO3VW.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-Q7VBWBES.mjs +30 -0
  37. package/dist/lib/browser/react-root-Q7VBWBES.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-6C3YJNDK.mjs → react-surface-TTHS332A.mjs} +98 -100
  39. package/dist/lib/browser/react-surface-TTHS332A.mjs.map +7 -0
  40. package/dist/lib/browser/{schema-defs-K3B3OAH4.mjs → schema-defs-QPI2JU3X.mjs} +6 -6
  41. package/dist/lib/browser/schema-defs-QPI2JU3X.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-XNWYRWNM.mjs → settings-45PGPO2V.mjs} +5 -5
  43. package/dist/lib/browser/{settings-XNWYRWNM.mjs.map → settings-45PGPO2V.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-K7NSNBHM.mjs → spaces-ready-QCND4DVY.mjs} +21 -18
  45. package/dist/lib/browser/spaces-ready-QCND4DVY.mjs.map +7 -0
  46. package/dist/lib/browser/{state-522XTUR4.mjs → state-Q7YRE5KG.mjs} +7 -7
  47. package/dist/lib/browser/state-Q7YRE5KG.mjs.map +7 -0
  48. package/dist/lib/browser/types/index.mjs +2 -2
  49. package/dist/lib/node-esm/CollectionArticle-KHXYT3SH.mjs +32 -0
  50. package/dist/lib/node-esm/CollectionArticle-KHXYT3SH.mjs.map +7 -0
  51. package/dist/lib/node-esm/ObjectDetailsPanel-6PZQIQG3.mjs +142 -0
  52. package/dist/lib/node-esm/ObjectDetailsPanel-6PZQIQG3.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectSettings-OQSBOH7K.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectSettings-OQSBOH7K.mjs.map +7 -0
  55. package/dist/lib/node-esm/RecordArticle-NACBH42P.mjs +117 -0
  56. package/dist/lib/node-esm/RecordArticle-NACBH42P.mjs.map +7 -0
  57. package/dist/lib/node-esm/app-graph-builder-FBJFWI4H.mjs +529 -0
  58. package/dist/lib/node-esm/app-graph-builder-FBJFWI4H.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-LA3IZDXJ.mjs → app-graph-serializer-BESQZAYU.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-BESQZAYU.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-2THX6G4C.mjs → chunk-6VEONPNZ.mjs} +95 -19
  62. package/dist/lib/node-esm/chunk-6VEONPNZ.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-6ZQGZBEP.mjs +168 -0
  64. package/dist/lib/node-esm/chunk-6ZQGZBEP.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-HJJHLWKY.mjs → chunk-OK2L7N2F.mjs} +301 -73
  70. package/dist/lib/node-esm/chunk-OK2L7N2F.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-SXD6T2N4.mjs → chunk-QBRPYAEL.mjs} +87 -12
  72. package/dist/lib/node-esm/chunk-QBRPYAEL.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-OUBADVJE.mjs → chunk-XGAMJC5C.mjs} +714 -571
  74. package/dist/lib/node-esm/chunk-XGAMJC5C.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-Z7BB6HC2.mjs +21 -0
  76. package/dist/lib/node-esm/chunk-Z7BB6HC2.mjs.map +7 -0
  77. package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs → identity-created-OXLKCJE3.mjs} +6 -6
  78. package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
  79. package/dist/lib/node-esm/index.mjs +148 -59
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-HSR27ME4.mjs → intent-resolver-6O5FSB7Z.mjs} +236 -68
  82. package/dist/lib/node-esm/intent-resolver-6O5FSB7Z.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-HUK3ANLV.mjs → react-root-K66W3FMA.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-K66W3FMA.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-AGAWX7DD.mjs → react-surface-Y7FTEIDF.mjs} +98 -100
  87. package/dist/lib/node-esm/react-surface-Y7FTEIDF.mjs.map +7 -0
  88. package/dist/lib/node-esm/{schema-defs-4MCDG4DV.mjs → schema-defs-ZS2D47XW.mjs} +6 -6
  89. package/dist/lib/node-esm/schema-defs-ZS2D47XW.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-YGKHGFPH.mjs → settings-6FO65BA6.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-YGKHGFPH.mjs.map → settings-6FO65BA6.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-UM2P3DCR.mjs → spaces-ready-P7CKVXBE.mjs} +21 -18
  93. package/dist/lib/node-esm/spaces-ready-P7CKVXBE.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-C4IOXPZP.mjs → state-362I5BMK.mjs} +7 -7
  95. package/dist/lib/node-esm/state-362I5BMK.mjs.map +7 -0
  96. package/dist/lib/node-esm/types/index.mjs +2 -2
  97. package/dist/types/src/SpacePlugin.d.ts +1 -1
  98. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  100. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  102. package/dist/types/src/capabilities/capabilities.d.ts +14 -7
  103. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/identity-created.d.ts +1 -1
  105. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/index.d.ts +11 -12
  107. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  109. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  110. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  111. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  112. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  113. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  114. package/dist/types/src/capabilities/schema-defs.d.ts +1 -1
  115. package/dist/types/src/capabilities/schema-defs.d.ts.map +1 -1
  116. package/dist/types/src/capabilities/settings.d.ts +1 -1
  117. package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
  118. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/state.d.ts +1 -1
  120. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  121. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  122. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  123. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  124. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  125. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  126. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +5 -4
  127. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  128. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1704 -4
  129. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +7 -5
  131. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  132. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
  133. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  134. package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +1 -1
  135. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  136. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  137. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  138. package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +3 -2
  139. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  140. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1707 -0
  141. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts.map +1 -0
  142. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  143. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  144. package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
  145. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +9 -0
  146. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -0
  147. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts +10 -0
  148. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -0
  149. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts +3 -0
  150. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts.map +1 -0
  151. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  152. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  153. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  154. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  155. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  156. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +2 -2
  157. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  158. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +1540 -0
  159. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -0
  160. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +1 -1
  161. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +1 -1
  162. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
  163. package/dist/types/src/components/ObjectSettings/index.d.ts +2 -1
  164. package/dist/types/src/components/ObjectSettings/index.d.ts.map +1 -1
  165. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  166. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  167. package/dist/types/src/components/RecordArticle.stories.d.ts +1707 -0
  168. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  169. package/dist/types/src/components/SchemaContainer.d.ts +1 -1
  170. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  171. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  172. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +4 -3
  173. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  174. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts +1537 -0
  175. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts.map +1 -0
  176. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  177. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  178. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  179. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  180. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  181. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  182. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  183. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1537 -4
  184. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  185. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +1 -1
  186. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  187. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1538 -5
  188. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  189. package/dist/types/src/components/SyncStatus/status.d.ts +5 -5
  190. package/dist/types/src/components/ViewEditor.d.ts +7 -0
  191. package/dist/types/src/components/ViewEditor.d.ts.map +1 -0
  192. package/dist/types/src/components/index.d.ts +11 -5
  193. package/dist/types/src/components/index.d.ts.map +1 -1
  194. package/dist/types/src/events.d.ts +1 -0
  195. package/dist/types/src/events.d.ts.map +1 -1
  196. package/dist/types/src/helpers/index.d.ts +2 -0
  197. package/dist/types/src/helpers/index.d.ts.map +1 -0
  198. package/dist/types/src/helpers/query.d.ts +8 -0
  199. package/dist/types/src/helpers/query.d.ts.map +1 -0
  200. package/dist/types/src/helpers/query.test.d.ts +2 -0
  201. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  202. package/dist/types/src/hooks/index.d.ts +1 -0
  203. package/dist/types/src/hooks/index.d.ts.map +1 -1
  204. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  205. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +1 -1
  206. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  207. package/dist/types/src/hooks/usePath.d.ts +1 -1
  208. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  209. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  210. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  211. package/dist/types/src/index.d.ts +1 -0
  212. package/dist/types/src/index.d.ts.map +1 -1
  213. package/dist/types/src/meta.d.ts +0 -1
  214. package/dist/types/src/meta.d.ts.map +1 -1
  215. package/dist/types/src/translations.d.ts +1382 -11
  216. package/dist/types/src/translations.d.ts.map +1 -1
  217. package/dist/types/src/types/types.d.ts +141 -66
  218. package/dist/types/src/types/types.d.ts.map +1 -1
  219. package/dist/types/src/util.d.ts +40 -10
  220. package/dist/types/src/util.d.ts.map +1 -1
  221. package/dist/types/tsconfig.tsbuildinfo +1 -1
  222. package/package.json +67 -61
  223. package/src/SpacePlugin.ts +232 -139
  224. package/src/capabilities/app-graph-builder.ts +335 -88
  225. package/src/capabilities/app-graph-serializer.ts +12 -12
  226. package/src/capabilities/capabilities.ts +21 -10
  227. package/src/capabilities/identity-created.ts +3 -3
  228. package/src/capabilities/index.ts +0 -1
  229. package/src/capabilities/intent-resolver.ts +191 -54
  230. package/src/capabilities/react-root.tsx +6 -4
  231. package/src/capabilities/react-surface.tsx +94 -119
  232. package/src/capabilities/schema-defs.ts +4 -3
  233. package/src/capabilities/spaces-ready.ts +16 -10
  234. package/src/capabilities/state.ts +5 -4
  235. package/src/components/AwaitingObject.tsx +16 -20
  236. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +8 -5
  237. package/src/components/CollectionSection.tsx +8 -6
  238. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +17 -16
  239. package/src/components/CreateDialog/CreateObjectDialog.tsx +76 -54
  240. package/src/components/CreateDialog/CreateObjectPanel.tsx +24 -13
  241. package/src/components/CreateDialog/CreateSpaceDialog.tsx +30 -11
  242. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  243. package/src/components/JoinDialog/index.ts +5 -0
  244. package/src/components/MembersContainer/MembersContainer.stories.tsx +56 -0
  245. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +27 -24
  246. package/src/components/MembersContainer/index.ts +5 -0
  247. package/src/components/MenuFooter.tsx +4 -5
  248. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +51 -0
  249. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +72 -0
  250. package/src/components/ObjectDetailsPanel/index.ts +7 -0
  251. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +11 -17
  252. package/src/components/ObjectRenamePopover/index.ts +5 -0
  253. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +4 -3
  254. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +63 -0
  255. package/src/components/ObjectSettings/BaseObjectSettings.tsx +90 -26
  256. package/src/components/ObjectSettings/ForeignKeys.tsx +4 -4
  257. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +4 -3
  258. package/src/components/ObjectSettings/index.ts +3 -1
  259. package/src/components/RecordArticle.stories.tsx +115 -0
  260. package/src/components/RecordArticle.tsx +114 -0
  261. package/src/components/SchemaContainer.tsx +25 -28
  262. package/src/components/SpacePluginSettings.tsx +16 -11
  263. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +24 -23
  264. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +22 -17
  265. package/src/components/SpacePresence/index.ts +5 -0
  266. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
  267. package/src/components/SpaceRenamePopover/index.ts +5 -0
  268. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +17 -9
  269. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +49 -28
  270. package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
  271. package/src/components/SyncStatus/SyncStatus.stories.tsx +9 -9
  272. package/src/components/SyncStatus/SyncStatus.tsx +110 -13
  273. package/src/components/SyncStatus/status.ts +4 -4
  274. package/src/components/ViewEditor.tsx +92 -0
  275. package/src/components/index.ts +10 -5
  276. package/src/events.ts +7 -6
  277. package/src/helpers/index.ts +5 -0
  278. package/src/helpers/query.test.ts +24 -0
  279. package/src/helpers/query.ts +158 -0
  280. package/src/hooks/index.ts +1 -0
  281. package/src/hooks/useActiveSpace.ts +3 -2
  282. package/src/hooks/useInputSurfaceLookup.tsx +8 -3
  283. package/src/hooks/usePath.ts +1 -1
  284. package/src/hooks/useTypeOptions.ts +59 -0
  285. package/src/index.ts +1 -0
  286. package/src/meta.ts +6 -3
  287. package/src/translations.ts +85 -7
  288. package/src/types/types.ts +94 -22
  289. package/src/util.tsx +297 -75
  290. package/dist/lib/browser/app-graph-builder-PMDF6PJV.mjs +0 -363
  291. package/dist/lib/browser/app-graph-builder-PMDF6PJV.mjs.map +0 -7
  292. package/dist/lib/browser/app-graph-serializer-UKYMBX4O.mjs.map +0 -7
  293. package/dist/lib/browser/chunk-6VLSHG4A.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-C7KGJTAL.mjs +0 -18
  295. package/dist/lib/browser/chunk-C7KGJTAL.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  297. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-GVTXQCIW.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-S6NY637J.mjs.map +0 -7
  300. package/dist/lib/browser/chunk-VLBRSGJ2.mjs +0 -94
  301. package/dist/lib/browser/chunk-VLBRSGJ2.mjs.map +0 -7
  302. package/dist/lib/browser/chunk-WBSEOLEM.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-XXIPJLJF.mjs +0 -19
  304. package/dist/lib/browser/chunk-XXIPJLJF.mjs.map +0 -7
  305. package/dist/lib/browser/identity-created-23XJJV2N.mjs.map +0 -7
  306. package/dist/lib/browser/intent-resolver-WK5WYFH3.mjs.map +0 -7
  307. package/dist/lib/browser/react-root-7S6FIC5G.mjs +0 -29
  308. package/dist/lib/browser/react-root-7S6FIC5G.mjs.map +0 -7
  309. package/dist/lib/browser/react-surface-6C3YJNDK.mjs.map +0 -7
  310. package/dist/lib/browser/schema-defs-K3B3OAH4.mjs.map +0 -7
  311. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs +0 -124
  312. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
  313. package/dist/lib/browser/spaces-ready-K7NSNBHM.mjs.map +0 -7
  314. package/dist/lib/browser/state-522XTUR4.mjs.map +0 -7
  315. package/dist/lib/node-esm/app-graph-builder-TO72W6MI.mjs +0 -364
  316. package/dist/lib/node-esm/app-graph-builder-TO72W6MI.mjs.map +0 -7
  317. package/dist/lib/node-esm/app-graph-serializer-LA3IZDXJ.mjs.map +0 -7
  318. package/dist/lib/node-esm/chunk-2THX6G4C.mjs.map +0 -7
  319. package/dist/lib/node-esm/chunk-72QMMRKC.mjs +0 -19
  320. package/dist/lib/node-esm/chunk-72QMMRKC.mjs.map +0 -7
  321. package/dist/lib/node-esm/chunk-AT7LGFER.mjs +0 -20
  322. package/dist/lib/node-esm/chunk-AT7LGFER.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-HJJHLWKY.mjs.map +0 -7
  324. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  325. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  326. package/dist/lib/node-esm/chunk-OUBADVJE.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-SSLBYZEY.mjs +0 -96
  328. package/dist/lib/node-esm/chunk-SSLBYZEY.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-SXD6T2N4.mjs.map +0 -7
  330. package/dist/lib/node-esm/identity-created-IJQO6GCR.mjs.map +0 -7
  331. package/dist/lib/node-esm/intent-resolver-HSR27ME4.mjs.map +0 -7
  332. package/dist/lib/node-esm/react-root-HUK3ANLV.mjs.map +0 -7
  333. package/dist/lib/node-esm/react-surface-AGAWX7DD.mjs.map +0 -7
  334. package/dist/lib/node-esm/schema-defs-4MCDG4DV.mjs.map +0 -7
  335. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs +0 -126
  336. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
  337. package/dist/lib/node-esm/spaces-ready-UM2P3DCR.mjs.map +0 -7
  338. package/dist/lib/node-esm/state-C4IOXPZP.mjs.map +0 -7
  339. package/dist/types/src/capabilities/schema-tool.test.d.ts +0 -2
  340. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +0 -1
  341. package/dist/types/src/capabilities/schema-tools.d.ts +0 -13
  342. package/dist/types/src/capabilities/schema-tools.d.ts.map +0 -1
  343. package/dist/types/src/components/CollectionMain.d.ts +0 -6
  344. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  345. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  346. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  347. package/dist/types/src/components/MembersContainer.stories.d.ts +0 -8
  348. package/dist/types/src/components/MembersContainer.stories.d.ts.map +0 -1
  349. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  350. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  351. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  352. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  353. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  354. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  355. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  356. package/dist/types/src/components/SpacePresence.stories.d.ts +0 -9
  357. package/dist/types/src/components/SpacePresence.stories.d.ts.map +0 -1
  358. package/src/capabilities/schema-tool.test.ts +0 -44
  359. package/src/capabilities/schema-tools.ts +0 -125
  360. package/src/components/MembersContainer.stories.tsx +0 -30
  361. package/src/components/PersistenceStatus.tsx +0 -84
@@ -2,36 +2,42 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import { Array, Option, pipe } from 'effect';
7
-
8
- import { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';
9
- import { getSpace, SpaceState, type Space, isSpace, type QueryResult } from '@dxos/client/echo';
10
- import { Filter, Obj, Query, Type } from '@dxos/echo';
5
+ import { Atom } from '@effect-atom/atom-react';
6
+ import * as Array from 'effect/Array';
7
+ import * as Function from 'effect/Function';
8
+ import * as Option from 'effect/Option';
9
+ import * as Schema from 'effect/Schema';
10
+
11
+ import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
12
+ import { type QueryResult, type Space, SpaceState, getSpace, isSpace } from '@dxos/client/echo';
13
+ import { DXN, Filter, Obj, Query, Type } from '@dxos/echo';
11
14
  import { log } from '@dxos/log';
12
15
  import { ClientCapabilities } from '@dxos/plugin-client';
13
- import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';
14
- import { createExtension, rxFromObservable, ROOT_ID, rxFromSignal } from '@dxos/plugin-graph';
15
- import { DataType } from '@dxos/schema';
16
+ import { ATTENDABLE_PATH_SEPARATOR, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
17
+ import { ROOT_ID, atomFromObservable, atomFromSignal, createExtension } from '@dxos/plugin-graph';
18
+ import { Collection, StoredSchema, View, getTypenameFromQuery } from '@dxos/schema';
16
19
  import { isNonNullable } from '@dxos/util';
17
20
 
18
- import { SpaceCapabilities } from './capabilities';
19
21
  import { getActiveSpace } from '../hooks';
20
- import { SPACE_PLUGIN } from '../meta';
22
+ import { meta } from '../meta';
21
23
  import { SPACE_TYPE, SpaceAction, type SpaceSettingsProps } from '../types';
22
24
  import {
25
+ SHARED,
26
+ SPACES,
27
+ atomFromQuery,
23
28
  constructObjectActions,
24
29
  constructSpaceActions,
25
30
  constructSpaceNode,
26
31
  createObjectNode,
27
- rxFromQuery,
28
- SHARED,
29
- SPACES,
32
+ createStaticSchemaActions,
33
+ createStaticSchemaNode,
30
34
  } from '../util';
31
35
 
36
+ import { SpaceCapabilities } from './capabilities';
37
+
32
38
  export default (context: PluginContext) => {
33
- // TODO(wittjosiah): Make reactive.
34
- const resolve = (typename: string) =>
39
+ // TODO(wittjosiah): Using `get` and being reactive seems to cause a bug with Atom where disposed atoms are accessed.
40
+ const resolve = (get: Atom.Context) => (typename: string) =>
35
41
  context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
36
42
 
37
43
  const spacesNode = {
@@ -39,7 +45,7 @@ export default (context: PluginContext) => {
39
45
  type: SPACES,
40
46
  cacheable: ['label', 'role'],
41
47
  properties: {
42
- label: ['spaces label', { ns: SPACE_PLUGIN }],
48
+ label: ['spaces label', { ns: meta.id }],
43
49
  icon: 'ph--planet--regular',
44
50
  testId: 'spacePlugin.spaces',
45
51
  role: 'branch',
@@ -74,11 +80,11 @@ export default (context: PluginContext) => {
74
80
  return contributes(Capabilities.AppGraphBuilder, [
75
81
  // Primary actions.
76
82
  createExtension({
77
- id: `${SPACE_PLUGIN}/primary-actions`,
83
+ id: `${meta.id}/primary-actions`,
78
84
  position: 'hoist',
79
85
  actions: (node) =>
80
- Rx.make((get) =>
81
- pipe(
86
+ Atom.make((get) =>
87
+ Function.pipe(
82
88
  get(node),
83
89
  Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
84
90
  Option.map(() => [
@@ -89,7 +95,7 @@ export default (context: PluginContext) => {
89
95
  await dispatch(createIntent(SpaceAction.OpenCreateSpace));
90
96
  },
91
97
  properties: {
92
- label: ['create space label', { ns: SPACE_PLUGIN }],
98
+ label: ['create space label', { ns: meta.id }],
93
99
  icon: 'ph--plus--regular',
94
100
  testId: 'spacePlugin.createSpace',
95
101
  disposition: 'menu',
@@ -102,7 +108,7 @@ export default (context: PluginContext) => {
102
108
  await dispatch(createIntent(SpaceAction.Join));
103
109
  },
104
110
  properties: {
105
- label: ['join space label', { ns: SPACE_PLUGIN }],
111
+ label: ['join space label', { ns: meta.id }],
106
112
  icon: 'ph--sign-in--regular',
107
113
  testId: 'spacePlugin.joinSpace',
108
114
  disposition: 'menu',
@@ -117,7 +123,7 @@ export default (context: PluginContext) => {
117
123
  await dispatch(createIntent(SpaceAction.OpenMembers, { space }));
118
124
  },
119
125
  properties: {
120
- label: ['share space label', { ns: SPACE_PLUGIN }],
126
+ label: ['share space label', { ns: meta.id }],
121
127
  icon: 'ph--users--regular',
122
128
  testId: 'spacePlugin.shareSpace',
123
129
  keyBinding: {
@@ -135,7 +141,7 @@ export default (context: PluginContext) => {
135
141
  await dispatch(createIntent(SpaceAction.OpenSettings, { space }));
136
142
  },
137
143
  properties: {
138
- label: ['open current space settings label', { ns: SPACE_PLUGIN }],
144
+ label: ['open current space settings label', { ns: meta.id }],
139
145
  icon: 'ph--faders--regular',
140
146
  keyBinding: {
141
147
  macos: 'meta+shift+,',
@@ -151,11 +157,11 @@ export default (context: PluginContext) => {
151
157
 
152
158
  // Create spaces group node.
153
159
  createExtension({
154
- id: `${SPACE_PLUGIN}/root`,
160
+ id: `${meta.id}/root`,
155
161
  position: 'hoist',
156
162
  connector: (node) =>
157
- Rx.make((get) =>
158
- pipe(
163
+ Atom.make((get) =>
164
+ Function.pipe(
159
165
  get(node),
160
166
  Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
161
167
  Option.map(() => [spacesNode]),
@@ -170,25 +176,25 @@ export default (context: PluginContext) => {
170
176
  id: SPACES,
171
177
  connector: (node) => {
172
178
  let query: QueryResult<Type.Expando> | undefined;
173
- return Rx.make((get) =>
174
- pipe(
179
+ return Atom.make((get) =>
180
+ Function.pipe(
175
181
  get(node),
176
182
  Option.flatMap((node) => (node.id === SPACES ? Option.some(node) : Option.none())),
177
183
  Option.map(() => {
178
184
  const state = context.getCapability(SpaceCapabilities.State);
179
185
  const client = context.getCapability(ClientCapabilities.Client);
180
- const spacesRx = rxFromObservable(client.spaces);
181
- const isReadyRx = rxFromObservable(client.spaces.isReady);
186
+ const spacesAtom = atomFromObservable(client.spaces);
187
+ const isReadyAtom = atomFromObservable(client.spaces.isReady);
182
188
 
183
- const spaces = get(spacesRx);
184
- const isReady = get(isReadyRx);
189
+ const spaces = get(spacesAtom);
190
+ const isReady = get(isReadyAtom);
185
191
 
186
192
  if (!spaces || !isReady) {
187
193
  return [];
188
194
  }
189
195
 
190
196
  const settings = get(context.capabilities(Capabilities.SettingsStore))[0]?.getStore<SpaceSettingsProps>(
191
- SPACE_PLUGIN,
197
+ meta.id,
192
198
  )?.value;
193
199
 
194
200
  // TODO(wittjosiah): During client reset, accessing default space throws.
@@ -196,9 +202,9 @@ export default (context: PluginContext) => {
196
202
  if (!query) {
197
203
  query = client.spaces.default.db.query(Filter.type(Type.Expando, { key: SHARED }));
198
204
  }
199
- const [spacesOrder] = get(rxFromQuery(query));
205
+ const [spacesOrder] = get(atomFromQuery(query));
200
206
  return get(
201
- rxFromSignal(() => {
207
+ atomFromSignal(() => {
202
208
  const order: string[] = spacesOrder?.order ?? [];
203
209
  const orderMap = new Map(order.map((id, index) => [id, index]));
204
210
  return [
@@ -216,7 +222,7 @@ export default (context: PluginContext) => {
216
222
  navigable: state.navigableCollections,
217
223
  personal: space === client.spaces.default,
218
224
  namesCache: state.spaceNames,
219
- resolve,
225
+ resolve: resolve(get),
220
226
  }),
221
227
  );
222
228
  }),
@@ -273,10 +279,10 @@ export default (context: PluginContext) => {
273
279
 
274
280
  // Create space actions.
275
281
  createExtension({
276
- id: `${SPACE_PLUGIN}/actions`,
282
+ id: `${meta.id}/actions`,
277
283
  actions: (node) =>
278
- Rx.make((get) =>
279
- pipe(
284
+ Atom.make((get) =>
285
+ Function.pipe(
280
286
  get(node),
281
287
  Option.flatMap((node) =>
282
288
  node.type === SPACE_TYPE && isSpace(node.data) ? Option.some(node.data) : Option.none(),
@@ -305,24 +311,24 @@ export default (context: PluginContext) => {
305
311
 
306
312
  // Create nodes for objects in the root collection of a space.
307
313
  createExtension({
308
- id: `${SPACE_PLUGIN}/root-collection`,
314
+ id: `${meta.id}/root-collection`,
309
315
  connector: (node) =>
310
- Rx.make((get) =>
311
- pipe(
316
+ Atom.make((get) =>
317
+ Function.pipe(
312
318
  get(node),
313
319
  Option.flatMap((node) =>
314
320
  node.type === SPACE_TYPE && isSpace(node.data) ? Option.some(node.data) : Option.none(),
315
321
  ),
316
322
  Option.map((space) => {
317
323
  const state = context.getCapability(SpaceCapabilities.State);
318
- const spaceState = get(rxFromObservable(space.state));
324
+ const spaceState = get(atomFromObservable(space.state));
319
325
  if (spaceState !== SpaceState.SPACE_READY) {
320
326
  return [];
321
327
  }
322
328
 
323
329
  const collection = get(
324
- rxFromSignal(
325
- () => space.properties[DataType.Collection.typename]?.target as DataType.Collection | undefined,
330
+ atomFromSignal(
331
+ () => space.properties[Collection.Collection.typename]?.target as Collection.Collection | undefined,
326
332
  ),
327
333
  );
328
334
  if (!collection) {
@@ -330,8 +336,8 @@ export default (context: PluginContext) => {
330
336
  }
331
337
 
332
338
  return get(
333
- rxFromSignal(() =>
334
- pipe(
339
+ atomFromSignal(() =>
340
+ Function.pipe(
335
341
  collection.objects,
336
342
  Array.map((object) => object.target),
337
343
  Array.filter(isNonNullable),
@@ -339,7 +345,7 @@ export default (context: PluginContext) => {
339
345
  createObjectNode({
340
346
  space,
341
347
  object,
342
- resolve,
348
+ resolve: resolve(get),
343
349
  navigable: state.navigableCollections,
344
350
  }),
345
351
  ),
@@ -355,27 +361,33 @@ export default (context: PluginContext) => {
355
361
 
356
362
  // Create nodes for objects in a collection or by its fully qualified id.
357
363
  createExtension({
358
- id: `${SPACE_PLUGIN}/objects`,
364
+ id: `${meta.id}/objects`,
359
365
  connector: (node) =>
360
- Rx.make((get) =>
361
- pipe(
366
+ Atom.make((get) =>
367
+ Function.pipe(
362
368
  get(node),
363
369
  Option.flatMap((node) =>
364
- Obj.instanceOf(DataType.Collection, node.data) ? Option.some(node.data) : Option.none(),
370
+ Obj.instanceOf(Collection.Collection, node.data) ? Option.some(node.data) : Option.none(),
365
371
  ),
366
372
  Option.map((collection) => {
367
373
  const state = context.getCapability(SpaceCapabilities.State);
368
374
  const space = getSpace(collection);
369
375
 
370
376
  return get(
371
- rxFromSignal(() =>
372
- pipe(
377
+ atomFromSignal(() =>
378
+ Function.pipe(
373
379
  collection.objects,
374
380
  Array.map((object) => object.target),
375
381
  Array.filter(isNonNullable),
376
382
  Array.map(
377
383
  (object) =>
378
- space && createObjectNode({ object, space, resolve, navigable: state.navigableCollections }),
384
+ space &&
385
+ createObjectNode({
386
+ object,
387
+ space,
388
+ resolve: resolve(get),
389
+ navigable: state.navigableCollections,
390
+ }),
379
391
  ),
380
392
  Array.filter(isNonNullable),
381
393
  ),
@@ -426,20 +438,19 @@ export default (context: PluginContext) => {
426
438
 
427
439
  // Create nodes for objects in a query collection.
428
440
  createExtension({
429
- id: `${SPACE_PLUGIN}/query-collection-objects`,
441
+ id: `${meta.id}/query-collection-objects`,
430
442
  connector: (node) => {
431
443
  let query: QueryResult<Type.Expando> | undefined;
432
- return Rx.make((get) =>
433
- pipe(
444
+ return Atom.make((get) =>
445
+ Function.pipe(
434
446
  get(node),
435
447
  Option.flatMap((node) =>
436
- Obj.instanceOf(DataType.QueryCollection, node.data) ? Option.some(node.data) : Option.none(),
448
+ Obj.instanceOf(Collection.QueryCollection, node.data) ? Option.some(node.data) : Option.none(),
437
449
  ),
438
450
  Option.flatMap((collection) => {
439
451
  const space = getSpace(collection);
440
- return collection.query.typename && space
441
- ? Option.some({ typename: collection.query.typename, space })
442
- : Option.none();
452
+ const typename = getTypenameFromQuery(collection.query);
453
+ return typename && space ? Option.some({ typename, space }) : Option.none();
443
454
  }),
444
455
  Option.map(({ typename, space }) => {
445
456
  const state = context.getCapability(SpaceCapabilities.State);
@@ -451,26 +462,62 @@ export default (context: PluginContext) => {
451
462
  // It will return all objects in the collection, not just the ones of the given type.
452
463
  // However this works fine for now because this query is only used for exclusions.
453
464
  Query.select(Filter.typename(typename))
454
- .referencedBy(DataType.Collection, 'objects')
465
+ .referencedBy(Collection.Collection, 'objects')
455
466
  .reference('objects'),
456
467
  ),
457
468
  );
458
469
  }
459
- return get(rxFromQuery(query))
460
- .map((object) =>
461
- get(
462
- rxFromSignal(() =>
463
- createObjectNode({
464
- object,
465
- space,
466
- resolve,
467
- droppable: false, // Cannot rearrange query collections.
468
- navigable: state.navigableCollections,
469
- }),
470
+ return (
471
+ get(atomFromQuery(query))
472
+ // TODO(wittjosiah): This should be the default sort order.
473
+ .toSorted((a, b) => a.id.localeCompare(b.id))
474
+ .map((object) =>
475
+ get(
476
+ atomFromSignal(() =>
477
+ createObjectNode({
478
+ object,
479
+ space,
480
+ resolve: resolve(get),
481
+ droppable: false, // Cannot rearrange query collections.
482
+ navigable: state.navigableCollections,
483
+ }),
484
+ ),
470
485
  ),
471
- ),
486
+ )
487
+ .filter(isNonNullable)
488
+ );
489
+ }),
490
+ Option.getOrElse(() => []),
491
+ ),
492
+ );
493
+ },
494
+ }),
495
+
496
+ // Static schema records.
497
+ createExtension({
498
+ id: `${meta.id}/static-schemas`,
499
+ connector: (node) => {
500
+ const client = context.getCapability(ClientCapabilities.Client);
501
+ return Atom.make((get) =>
502
+ Function.pipe(
503
+ get(node),
504
+ Option.flatMap((node) =>
505
+ Obj.instanceOf(Collection.QueryCollection, node.data) &&
506
+ getTypenameFromQuery(node.data.query) === StoredSchema.typename
507
+ ? Option.some(node.data)
508
+ : Option.none(),
509
+ ),
510
+ Option.flatMap((collection) => {
511
+ const space = getSpace(collection);
512
+ return space?.properties.staticRecords ? Option.some(space) : Option.none();
513
+ }),
514
+ Option.map((space) => {
515
+ return get(atomFromSignal(() => (space.properties.staticRecords ?? []) as string[]))
516
+ .map((typename) =>
517
+ client.graph.schemaRegistry.schemas.find((schema) => Type.getTypename(schema) === typename),
472
518
  )
473
- .filter(isNonNullable);
519
+ .filter(isNonNullable)
520
+ .map((schema) => createStaticSchemaNode({ schema, space }));
474
521
  }),
475
522
  Option.getOrElse(() => []),
476
523
  ),
@@ -478,15 +525,188 @@ export default (context: PluginContext) => {
478
525
  },
479
526
  }),
480
527
 
528
+ // Create static schema actions.
529
+ createExtension({
530
+ id: `${meta.id}/static-schema-actions`,
531
+ actions: (node) => {
532
+ let query: QueryResult<View.View> | undefined;
533
+ return Atom.make((get) =>
534
+ Function.pipe(
535
+ get(node),
536
+ Option.flatMap((node) => {
537
+ const space = isSpace(node.properties.space) ? node.properties.space : undefined;
538
+ return space && Schema.isSchema(node.data) ? Option.some({ space, schema: node.data }) : Option.none();
539
+ }),
540
+ Option.map(({ space, schema }) => {
541
+ if (!query) {
542
+ // TODO(wittjosiah): Support filtering by nested properties (e.g. `query.typename`).
543
+ query = space.db.query(Filter.type(View.View));
544
+ }
545
+
546
+ const views = get(atomFromQuery(query));
547
+ const filteredViews = get(
548
+ atomFromSignal(() =>
549
+ // TODO(wittjosiah): Remove cast.
550
+ views.filter(
551
+ (view) => getTypenameFromQuery(view.query.ast) === Type.getTypename(schema as Type.Obj.Any),
552
+ ),
553
+ ),
554
+ );
555
+ const deletable = filteredViews.length === 0;
556
+
557
+ const [dispatcher] = get(context.capabilities(Capabilities.IntentDispatcher));
558
+ if (!dispatcher) {
559
+ return [];
560
+ }
561
+
562
+ // TODO(wittjosiah): Remove cast.
563
+ return createStaticSchemaActions({
564
+ schema: schema as Type.Obj.Any,
565
+ space,
566
+ dispatch: dispatcher.dispatchPromise,
567
+ deletable,
568
+ });
569
+ }),
570
+ Option.getOrElse(() => []),
571
+ ),
572
+ );
573
+ },
574
+ }),
575
+
576
+ // Create nodes for schema views.
577
+ createExtension({
578
+ id: `${meta.id}/schema-views`,
579
+ connector: (node) => {
580
+ let query: QueryResult<View.View> | undefined;
581
+ return Atom.make((get) =>
582
+ Function.pipe(
583
+ get(node),
584
+ Option.flatMap((node) => {
585
+ const space = getSpace(node.data) ?? (isSpace(node.properties.space) ? node.properties.space : undefined);
586
+ return space && (Obj.instanceOf(StoredSchema, node.data) || Schema.isSchema(node.data))
587
+ ? Option.some({ space, schema: node.data })
588
+ : Option.none();
589
+ }),
590
+ Option.map(({ space, schema }) => {
591
+ if (!query) {
592
+ // TODO(wittjosiah): Support filtering by nested properties (e.g. `query.typename`).
593
+ query = space.db.query(Filter.type(View.View));
594
+ }
595
+
596
+ // TODO(wittjosiah): Remove cast.
597
+ const typename = Schema.isSchema(schema) ? Type.getTypename(schema as Type.Obj.Any) : schema.typename;
598
+ return (
599
+ get(atomFromQuery(query))
600
+ .filter((view) => getTypenameFromQuery(view.query.ast) === typename)
601
+ // Filter out Collection views from Projects.
602
+ .filter((view) =>
603
+ get(
604
+ atomFromSignal(() => {
605
+ const presentation = view.presentation.target;
606
+ if (presentation) {
607
+ const typename = Obj.getTypename(presentation);
608
+ return typename !== Collection.Collection.typename;
609
+ } else {
610
+ return false;
611
+ }
612
+ }),
613
+ ),
614
+ )
615
+ .map((view) =>
616
+ get(
617
+ atomFromSignal(() =>
618
+ createObjectNode({
619
+ object: view,
620
+ space,
621
+ resolve: resolve(get),
622
+ droppable: false,
623
+ }),
624
+ ),
625
+ ),
626
+ )
627
+ .filter(isNonNullable)
628
+ );
629
+ }),
630
+ Option.getOrElse(() => []),
631
+ ),
632
+ );
633
+ },
634
+ }),
635
+
636
+ // Create record nodes.
637
+ createExtension({
638
+ id: `${meta.id}/records`,
639
+ resolver: (id) => {
640
+ let query: QueryResult<Type.Expando> | undefined;
641
+ return Atom.make((get) => {
642
+ const client = context.getCapability(ClientCapabilities.Client);
643
+ const dxn = DXN.tryParse(id)?.asEchoDXN();
644
+ if (!dxn || !dxn.spaceId) {
645
+ return null;
646
+ }
647
+
648
+ const space = client.spaces.get(dxn.spaceId);
649
+ if (!space) {
650
+ return null;
651
+ }
652
+
653
+ if (!query) {
654
+ query = space.db.query(Filter.ids(dxn.echoId));
655
+ }
656
+
657
+ const object = get(atomFromQuery(query)).at(0);
658
+ if (!object) {
659
+ return null;
660
+ }
661
+
662
+ return createObjectNode({
663
+ object,
664
+ space,
665
+ resolve: resolve(get),
666
+ disposition: 'hidden',
667
+ });
668
+ });
669
+ },
670
+ }),
671
+
481
672
  // Create collection actions and action groups.
482
673
  createExtension({
483
- id: `${SPACE_PLUGIN}/object-actions`,
484
- actions: (node) =>
485
- Rx.make((get) =>
486
- pipe(
674
+ id: `${meta.id}/object-actions`,
675
+ actions: (node) => {
676
+ let query: QueryResult<View.View> | undefined;
677
+ return Atom.make((get) =>
678
+ Function.pipe(
487
679
  get(node),
488
- Option.flatMap((node) => (Obj.isObject(node.data) ? Option.some(node.data) : Option.none())),
489
- Option.flatMap((object) => {
680
+ Option.flatMap((node) => {
681
+ const space = getSpace(node.data);
682
+ return space && Obj.isObject(node.data) && Obj.getTypename(node.data) === node.type
683
+ ? Option.some({ space, object: node.data })
684
+ : Option.none();
685
+ }),
686
+ Option.flatMap(({ space, object }) => {
687
+ const isSchema = Obj.instanceOf(StoredSchema, object);
688
+ if (!query && isSchema) {
689
+ // TODO(wittjosiah): Support filtering by nested properties (e.g. `query.typename`).
690
+ query = space.db.query(Filter.type(View.View));
691
+ }
692
+
693
+ let deletable =
694
+ !isSchema &&
695
+ // Don't allow the Records smart collection to be deleted.
696
+ !(
697
+ Obj.instanceOf(Collection.QueryCollection, object) &&
698
+ getTypenameFromQuery(object.query) === StoredSchema.typename
699
+ );
700
+ if (isSchema && query) {
701
+ const views = get(atomFromQuery(query));
702
+ const filteredViews = get(
703
+ atomFromSignal(() =>
704
+ views.filter((view) => getTypenameFromQuery(view.query.ast) === object.typename),
705
+ ),
706
+ );
707
+ deletable = filteredViews.length === 0;
708
+ }
709
+
490
710
  const [dispatcher] = get(context.capabilities(Capabilities.IntentDispatcher));
491
711
  const [appGraph] = get(context.capabilities(Capabilities.AppGraph));
492
712
  const [state] = get(context.capabilities(SpaceCapabilities.State));
@@ -500,22 +720,49 @@ export default (context: PluginContext) => {
500
720
  graph: appGraph.graph,
501
721
  dispatch: dispatcher.dispatchPromise,
502
722
  objectForms,
503
- navigable: get(rxFromSignal(() => state.navigableCollections)),
723
+ deletable,
724
+ navigable: get(atomFromSignal(() => state.navigableCollections)),
504
725
  });
505
726
  }
506
727
  }),
507
728
  Option.map((params) => constructObjectActions(params)),
508
729
  Option.getOrElse(() => []),
509
730
  ),
731
+ );
732
+ },
733
+ }),
734
+
735
+ // View selected objects.
736
+ createExtension({
737
+ id: `${meta.id}/selected-objects`,
738
+ connector: (node) =>
739
+ Atom.make((get) =>
740
+ Function.pipe(
741
+ get(node),
742
+ Option.flatMap((node) => (Obj.instanceOf(View.View, node.data) ? Option.some(node) : Option.none())),
743
+ Option.map((node) => [
744
+ {
745
+ id: [node.id, 'selected-objects'].join(ATTENDABLE_PATH_SEPARATOR),
746
+ type: PLANK_COMPANION_TYPE,
747
+ data: 'selected-objects',
748
+ properties: {
749
+ label: ['companion selected objects label', { ns: meta.id }],
750
+ icon: 'ph--tree-view--regular',
751
+ disposition: 'hidden',
752
+ },
753
+ },
754
+ ]),
755
+ Option.getOrElse(() => []),
756
+ ),
510
757
  ),
511
758
  }),
512
759
 
513
760
  // Object settings plank companion.
514
761
  createExtension({
515
- id: `${SPACE_PLUGIN}/settings`,
762
+ id: `${meta.id}/settings`,
516
763
  connector: (node) =>
517
- Rx.make((get) =>
518
- pipe(
764
+ Atom.make((get) =>
765
+ Function.pipe(
519
766
  get(node),
520
767
  Option.flatMap((node) => (Obj.isObject(node.data) ? Option.some(node) : Option.none())),
521
768
  Option.map((node) => [
@@ -524,7 +771,7 @@ export default (context: PluginContext) => {
524
771
  type: PLANK_COMPANION_TYPE,
525
772
  data: 'settings',
526
773
  properties: {
527
- label: ['object settings label', { ns: SPACE_PLUGIN }],
774
+ label: ['object settings label', { ns: meta.id }],
528
775
  icon: 'ph--sliders--regular',
529
776
  disposition: 'hidden',
530
777
  position: 'fallback',