@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
package/src/util.tsx CHANGED
@@ -2,42 +2,42 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
6
- import { pipe } from 'effect';
5
+ import { Atom } from '@effect-atom/atom-react';
6
+ import * as Function from 'effect/Function';
7
7
 
8
- import { chain, createIntent, LayoutAction, type PromiseIntentDispatcher } from '@dxos/app-framework';
9
- import { Obj, Ref, Type } from '@dxos/echo';
10
- import { EXPANDO_TYPENAME } from '@dxos/echo-schema';
8
+ import { LayoutAction, type PromiseIntentDispatcher, chain, createIntent } from '@dxos/app-framework';
9
+ import { Filter, Obj, Query, Ref, Type } from '@dxos/echo';
10
+ import { type AnyEchoObject, EXPANDO_TYPENAME } from '@dxos/echo/internal';
11
11
  import { invariant } from '@dxos/invariant';
12
12
  import { Migrations } from '@dxos/migrations';
13
13
  import {
14
14
  ACTION_GROUP_TYPE,
15
15
  ACTION_TYPE,
16
- type ReadableGraph,
17
16
  type ActionData,
18
17
  type InvokeParams,
19
18
  type Node,
20
19
  type NodeArg,
20
+ type ReadableGraph,
21
21
  isGraphNode,
22
22
  } from '@dxos/plugin-graph';
23
- import { fullyQualifiedId, getSpace, type QueryResult, SpaceState, type Space, isSpace } from '@dxos/react-client/echo';
23
+ import { type QueryResult, type Space, SpaceState, getSpace, isSpace } from '@dxos/react-client/echo';
24
24
  import { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention';
25
25
  import { type TreeData } from '@dxos/react-ui-list';
26
- import { DataType } from '@dxos/schema';
26
+ import { Collection, StoredSchema, View, getTypenameFromQuery } from '@dxos/schema';
27
27
 
28
- import { SPACE_PLUGIN } from './meta';
29
- import { SpaceAction, SPACE_TYPE, type ObjectForm } from './types';
28
+ import { meta } from './meta';
29
+ import { type ObjectForm, SPACE_TYPE, SpaceAction } from './types';
30
30
 
31
- export const SPACES = `${SPACE_PLUGIN}-spaces`;
32
- export const COMPOSER_SPACE_LOCK = 'dxos.org/plugin/space/lock';
31
+ export const SPACES = `${meta.id}-spaces`;
32
+ export const COMPOSER_SPACE_LOCK = `${meta.id}/lock`;
33
33
  // TODO(wittjosiah): Remove.
34
34
  export const SHARED = 'shared-spaces';
35
35
 
36
36
  /**
37
- * Convert a query result to an Rx value of the objects.
37
+ * Convert a query result to an Atom value of the objects.
38
38
  */
39
- export const rxFromQuery = <T extends Obj.Any>(query: QueryResult<T>): Rx.Rx<T[]> => {
40
- return Rx.make((get) => {
39
+ export const atomFromQuery = <T extends AnyEchoObject>(query: QueryResult<T>): Atom.Atom<T[]> => {
40
+ return Atom.make((get) => {
41
41
  const unsubscribe = query.subscribe((result) => {
42
42
  get.setSelf(result.objects);
43
43
  });
@@ -57,8 +57,8 @@ export const getSpaceDisplayName = (
57
57
  : namesCache[space.id]
58
58
  ? namesCache[space.id]
59
59
  : personal
60
- ? ['personal space label', { ns: SPACE_PLUGIN }]
61
- : ['unnamed space label', { ns: SPACE_PLUGIN }];
60
+ ? ['personal space label', { ns: meta.id }]
61
+ : ['unnamed space label', { ns: meta.id }];
62
62
  };
63
63
 
64
64
  const getCollectionGraphNodePartials = ({
@@ -66,7 +66,7 @@ const getCollectionGraphNodePartials = ({
66
66
  space,
67
67
  resolve,
68
68
  }: {
69
- collection: DataType.Collection;
69
+ collection: Collection.Collection;
70
70
  space: Space;
71
71
  resolve: (typename: string) => Record<string, any>;
72
72
  }) => {
@@ -141,20 +141,21 @@ const getQueryCollectionNodePartials = ({
141
141
  space,
142
142
  resolve,
143
143
  }: {
144
- collection: DataType.QueryCollection;
144
+ collection: Collection.QueryCollection;
145
145
  space: Space;
146
146
  resolve: (typename: string) => Record<string, any>;
147
147
  }) => {
148
+ const typename = getTypenameFromQuery(collection.query);
149
+ const metadata = typename ? resolve(typename) : {};
148
150
  return {
149
- icon: collection.query.typename && resolve(collection.query.typename)?.icon,
151
+ icon: metadata.icon,
152
+ iconHue: metadata.iconHue,
150
153
  acceptPersistenceClass: new Set(['echo']),
151
154
  acceptPersistenceKey: new Set([space.id]),
152
155
  role: 'branch',
153
156
  canDrop: (source: TreeData) => {
154
157
  return (
155
- isGraphNode(source.item) &&
156
- Obj.isObject(source.item.data) &&
157
- Obj.getTypename(source.item.data) === collection.query.typename
158
+ isGraphNode(source.item) && Obj.isObject(source.item.data) && Obj.getTypename(source.item.data) === typename
158
159
  );
159
160
  },
160
161
  onTransferStart: (child: Node<Obj.Any>, index?: number) => {
@@ -166,6 +167,32 @@ const getQueryCollectionNodePartials = ({
166
167
  };
167
168
  };
168
169
 
170
+ const getSchemaGraphNodePartials = () => {
171
+ return {
172
+ role: 'branch',
173
+ canDrop: () => false,
174
+ };
175
+ };
176
+
177
+ const getViewGraphNodePartials = ({
178
+ view,
179
+ resolve,
180
+ }: {
181
+ view: View.View;
182
+ resolve: (typename: string) => Record<string, any>;
183
+ }) => {
184
+ const presentation = view.presentation.target;
185
+ const typename = presentation ? Obj.getTypename(presentation) : undefined;
186
+ const metadata = typename ? resolve(typename) : {};
187
+
188
+ return {
189
+ label: view.name || ['object name placeholder', { ns: typename, default: 'New view' }],
190
+ icon: metadata.icon,
191
+ iconHue: metadata.iconHue,
192
+ canDrop: () => false,
193
+ };
194
+ };
195
+
169
196
  const checkPendingMigration = (space: Space) => {
170
197
  return (
171
198
  space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION ||
@@ -190,9 +217,9 @@ export const constructSpaceNode = ({
190
217
  }) => {
191
218
  const hasPendingMigration = checkPendingMigration(space);
192
219
  const collection =
193
- space.state.get() === SpaceState.SPACE_READY && space.properties[DataType.Collection.typename]?.target;
220
+ space.state.get() === SpaceState.SPACE_READY && space.properties[Collection.Collection.typename]?.target;
194
221
  const partials =
195
- space.state.get() === SpaceState.SPACE_READY && Obj.instanceOf(DataType.Collection, collection)
222
+ space.state.get() === SpaceState.SPACE_READY && Obj.instanceOf(Collection.Collection, collection)
196
223
  ? getCollectionGraphNodePartials({ collection, space, resolve })
197
224
  : {};
198
225
 
@@ -210,6 +237,7 @@ export const constructSpaceNode = ({
210
237
  space.state.get() === SpaceState.SPACE_READY && space.properties.icon
211
238
  ? `ph--${space.properties.icon}--regular`
212
239
  : undefined,
240
+ iconHue: space.state.get() === SpaceState.SPACE_READY && space.properties.iconHue,
213
241
  disabled: !navigable || space.state.get() !== SpaceState.SPACE_READY || hasPendingMigration,
214
242
  testId: 'spacePlugin.space',
215
243
  canDrop: (source: TreeData) => {
@@ -220,40 +248,40 @@ export const constructSpaceNode = ({
220
248
  nodes: [
221
249
  {
222
250
  id: `settings${ATTENDABLE_PATH_SEPARATOR}${space.id}`,
223
- type: `${SPACE_PLUGIN}/settings`,
251
+ type: `${meta.id}/settings`,
224
252
  data: null,
225
253
  properties: {
226
- label: ['settings panel label', { ns: SPACE_PLUGIN }],
254
+ label: ['settings panel label', { ns: meta.id }],
227
255
  icon: 'ph--faders--regular',
228
256
  disposition: 'alternate-tree',
229
257
  },
230
258
  nodes: [
231
259
  {
232
260
  id: `properties-settings${ATTENDABLE_PATH_SEPARATOR}${space.id}`,
233
- type: `${SPACE_PLUGIN}/properties`,
234
- data: `${SPACE_PLUGIN}/properties`,
261
+ type: `${meta.id}/properties`,
262
+ data: `${meta.id}/properties`,
235
263
  properties: {
236
- label: ['space settings properties label', { ns: SPACE_PLUGIN }],
264
+ label: ['space settings properties label', { ns: meta.id }],
237
265
  icon: 'ph--sliders--regular',
238
266
  position: 'hoist',
239
267
  },
240
268
  },
241
269
  {
242
270
  id: `members-settings${ATTENDABLE_PATH_SEPARATOR}${space.id}`,
243
- type: `${SPACE_PLUGIN}/members`,
244
- data: `${SPACE_PLUGIN}/members`,
271
+ type: `${meta.id}/members`,
272
+ data: `${meta.id}/members`,
245
273
  properties: {
246
- label: ['members panel label', { ns: SPACE_PLUGIN }],
274
+ label: ['members panel label', { ns: meta.id }],
247
275
  icon: 'ph--users--regular',
248
276
  position: 'hoist',
249
277
  },
250
278
  },
251
279
  {
252
280
  id: `schema-settings${ATTENDABLE_PATH_SEPARATOR}${space.id}`,
253
- type: `${SPACE_PLUGIN}/schema`,
254
- data: `${SPACE_PLUGIN}/schema`,
281
+ type: `${meta.id}/schema`,
282
+ data: `${meta.id}/schema`,
255
283
  properties: {
256
- label: ['space settings schema label', { ns: SPACE_PLUGIN }],
284
+ label: ['space settings schema label', { ns: meta.id }],
257
285
  icon: 'ph--shapes--regular',
258
286
  },
259
287
  },
@@ -287,7 +315,7 @@ export const constructSpaceActions = ({
287
315
  await dispatch(createIntent(SpaceAction.Migrate, { space }));
288
316
  },
289
317
  properties: {
290
- label: ['migrate space label', { ns: SPACE_PLUGIN }],
318
+ label: ['migrate space label', { ns: meta.id }],
291
319
  icon: 'ph--database--regular',
292
320
  disposition: 'list-item-primary',
293
321
  disabled: migrating || Migrations.running(space),
@@ -304,7 +332,7 @@ export const constructSpaceActions = ({
304
332
  await dispatch(createIntent(SpaceAction.OpenCreateObject, { target: space }));
305
333
  },
306
334
  properties: {
307
- label: ['create object in space label', { ns: SPACE_PLUGIN }],
335
+ label: ['create object in space label', { ns: meta.id }],
308
336
  icon: 'ph--plus--regular',
309
337
  disposition: 'item',
310
338
  testId: 'spacePlugin.createObject',
@@ -317,7 +345,7 @@ export const constructSpaceActions = ({
317
345
  await dispatch(createIntent(SpaceAction.Rename, { space, caller: params?.caller }));
318
346
  },
319
347
  properties: {
320
- label: ['rename space label', { ns: SPACE_PLUGIN }],
348
+ label: ['rename space label', { ns: meta.id }],
321
349
  icon: 'ph--pencil-simple-line--regular',
322
350
  keyBinding: {
323
351
  macos: 'shift+F6',
@@ -331,48 +359,176 @@ export const constructSpaceActions = ({
331
359
  return actions;
332
360
  };
333
361
 
362
+ export const createStaticSchemaNode = ({ schema, space }: { schema: Type.Obj.Any; space: Space }) => {
363
+ return {
364
+ id: `${space.id}/${Type.getTypename(schema)}`,
365
+ type: `${meta.id}/static-schema`,
366
+ data: schema,
367
+ properties: {
368
+ label: ['typename label', { ns: Type.getTypename(schema), default: Type.getTypename(schema) }],
369
+ icon: 'ph--database--regular',
370
+ iconHue: 'green',
371
+ role: 'branch',
372
+ selectable: false,
373
+ canDrop: () => false,
374
+ space,
375
+ },
376
+ };
377
+ };
378
+
379
+ export const createStaticSchemaActions = ({
380
+ schema,
381
+ space,
382
+ dispatch,
383
+ deletable,
384
+ }: {
385
+ schema: Type.Obj.Any;
386
+ space: Space;
387
+ dispatch: PromiseIntentDispatcher;
388
+ deletable: boolean;
389
+ }) => {
390
+ const getId = (id: string) => `${space.id}/${Type.getTypename(schema)}/${id}`;
391
+
392
+ const actions: NodeArg<ActionData>[] = [
393
+ {
394
+ id: getId(SpaceAction.AddObject._tag),
395
+ type: ACTION_TYPE,
396
+ data: async () => {
397
+ await dispatch(
398
+ createIntent(SpaceAction.OpenCreateObject, {
399
+ target: space,
400
+ views: true,
401
+ initialFormValues: { typename: Type.getTypename(schema) },
402
+ }),
403
+ );
404
+ },
405
+ properties: {
406
+ label: ['add view to schema label', { ns: Type.getTypename(StoredSchema) }],
407
+ icon: 'ph--plus--regular',
408
+ disposition: 'list-item-primary',
409
+ testId: 'spacePlugin.addViewToSchema',
410
+ },
411
+ },
412
+ {
413
+ id: getId(SpaceAction.RenameObject._tag),
414
+ type: ACTION_TYPE,
415
+ data: async (params?: InvokeParams) => {
416
+ throw new Error('Not implemented');
417
+ },
418
+ properties: {
419
+ label: ['rename object label', { ns: Type.getTypename(StoredSchema) }],
420
+ icon: 'ph--pencil-simple-line--regular',
421
+ disabled: true,
422
+ disposition: 'list-item',
423
+ testId: 'spacePlugin.renameObject',
424
+ },
425
+ },
426
+ {
427
+ id: getId(SpaceAction.RemoveObjects._tag),
428
+ type: ACTION_TYPE,
429
+ data: async () => {
430
+ const index = space.properties.staticRecords.findIndex(
431
+ (typename: string) => typename === Type.getTypename(schema),
432
+ );
433
+ if (index > -1) {
434
+ space.properties.staticRecords.splice(index, 1);
435
+ }
436
+ },
437
+ properties: {
438
+ label: ['delete object label', { ns: Type.getTypename(StoredSchema) }],
439
+ icon: 'ph--trash--regular',
440
+ disposition: 'list-item',
441
+ disabled: !deletable,
442
+ testId: 'spacePlugin.deleteObject',
443
+ },
444
+ },
445
+ {
446
+ id: getId(SpaceAction.Snapshot._tag),
447
+ type: ACTION_TYPE,
448
+ data: async () => {
449
+ const result = await dispatch(
450
+ createIntent(SpaceAction.Snapshot, {
451
+ space,
452
+ query: Query.select(Filter.type(schema)).ast,
453
+ }),
454
+ );
455
+ if (result.data?.snapshot) {
456
+ await downloadBlob(
457
+ result.data.snapshot,
458
+ // TODO(wittjosiah): Factor out file name construction.
459
+ `${new Date().toISOString()}-${space.id}-${Type.getTypename(schema)}.json`,
460
+ );
461
+ }
462
+ },
463
+ properties: {
464
+ label: ['snapshot by schema label', { ns: meta.id }],
465
+ icon: 'ph--camera--regular',
466
+ disposition: 'list-item',
467
+ },
468
+ },
469
+ ];
470
+
471
+ return actions;
472
+ };
473
+
334
474
  export const createObjectNode = ({
335
475
  space,
336
476
  object,
477
+ disposition,
337
478
  droppable = true,
338
479
  navigable = false,
339
480
  resolve,
340
481
  }: {
341
482
  space: Space;
342
483
  object: Obj.Any;
484
+ disposition?: string;
343
485
  droppable?: boolean;
344
486
  navigable?: boolean;
345
487
  resolve: (typename: string) => Record<string, any>;
346
488
  }) => {
347
489
  const type = Obj.getTypename(object);
348
490
  if (!type) {
349
- return undefined;
491
+ return null;
350
492
  }
351
493
 
352
494
  const metadata = resolve(type);
353
- if (Object.keys(metadata).length === 0) {
354
- return undefined;
355
- }
356
-
357
- const partials = Obj.instanceOf(DataType.Collection, object)
495
+ const partials = Obj.instanceOf(Collection.Collection, object)
358
496
  ? getCollectionGraphNodePartials({ collection: object, space, resolve })
359
- : Obj.instanceOf(DataType.QueryCollection, object)
497
+ : Obj.instanceOf(Collection.QueryCollection, object)
360
498
  ? getQueryCollectionNodePartials({ collection: object, space, resolve })
361
- : metadata.graphProps;
499
+ : Obj.instanceOf(StoredSchema, object)
500
+ ? getSchemaGraphNodePartials()
501
+ : Obj.instanceOf(View.View, object)
502
+ ? getViewGraphNodePartials({ view: object, resolve })
503
+ : metadata.graphProps;
504
+
505
+ // TODO(wittjosiah): Obj.getLabel isn't triggering reactivity in some cases.
506
+ // e.g., create new collection with no name and rename it.
507
+ const label = (object as any).name ||
508
+ Obj.getLabel(object) ||
509
+ // TODO(wittjosiah): Remove metadata labels.
510
+ metadata.label?.(object) || ['object name placeholder', { ns: type, default: 'New item' }];
511
+
512
+ const selectable =
513
+ (!Obj.instanceOf(StoredSchema, object) &&
514
+ !Obj.instanceOf(Collection.QueryCollection, object) &&
515
+ !Obj.instanceOf(Collection.Collection, object)) ||
516
+ (navigable && Obj.instanceOf(Collection.Collection, object));
362
517
 
363
518
  return {
364
- id: fullyQualifiedId(object),
519
+ id: Obj.getDXN(object).toString(),
365
520
  type,
366
521
  cacheable: ['label', 'icon', 'role'],
367
522
  data: object,
368
523
  properties: {
369
- // TODO(burdon): Use annotation to get the name field.
370
- label: metadata.label?.(object) ||
371
- (object as any).name || ['object name placeholder', { ns: type, default: 'New object' }],
524
+ label,
372
525
  icon: metadata.icon ?? 'ph--placeholder--regular',
526
+ iconHue: metadata.iconHue,
527
+ disposition,
373
528
  testId: 'spacePlugin.object',
374
529
  persistenceClass: 'echo',
375
530
  persistenceKey: space?.id,
531
+ selectable,
376
532
  canDrop: (source: TreeData) => {
377
533
  return droppable && isGraphNode(source.item) && Obj.isObject(source.item.data);
378
534
  },
@@ -386,25 +542,30 @@ export const constructObjectActions = ({
386
542
  graph,
387
543
  dispatch,
388
544
  objectForms,
545
+ deletable = true,
389
546
  navigable = false,
390
547
  }: {
391
548
  object: Obj.Any;
392
549
  graph: ReadableGraph;
393
550
  dispatch: PromiseIntentDispatcher;
394
551
  objectForms: ObjectForm<any>[];
552
+ deletable?: boolean;
395
553
  navigable?: boolean;
396
554
  }) => {
397
555
  const space = getSpace(object);
398
556
  invariant(space, 'Space not found');
399
- const getId = (id: string) => `${id}/${fullyQualifiedId(object)}`;
557
+ const typename = Obj.getTypename(object);
558
+ invariant(typename, 'Object has no typename');
559
+
560
+ const getId = (id: string) => `${id}/${Obj.getDXN(object).toString()}`;
400
561
 
401
- const queryCollection = Obj.instanceOf(DataType.QueryCollection, object) ? object : undefined;
562
+ const queryCollection = Obj.instanceOf(Collection.QueryCollection, object) ? object : undefined;
402
563
  const matchingObjectForm = queryCollection
403
- ? objectForms.find((form) => Type.getTypename(form.objectSchema) === queryCollection.query.typename)
564
+ ? objectForms.find((form) => Type.getTypename(form.objectSchema) === getTypenameFromQuery(queryCollection.query))
404
565
  : undefined;
405
566
 
406
567
  const actions: NodeArg<ActionData>[] = [
407
- ...(Obj.instanceOf(DataType.Collection, object)
568
+ ...(Obj.instanceOf(Collection.Collection, object)
408
569
  ? [
409
570
  {
410
571
  id: getId(SpaceAction.OpenCreateObject._tag),
@@ -413,7 +574,7 @@ export const constructObjectActions = ({
413
574
  await dispatch(createIntent(SpaceAction.OpenCreateObject, { target: object }));
414
575
  },
415
576
  properties: {
416
- label: ['create object in collection label', { ns: SPACE_PLUGIN }],
577
+ label: ['create object in collection label', { ns: meta.id }],
417
578
  icon: 'ph--plus--regular',
418
579
  disposition: 'list-item-primary',
419
580
  testId: 'spacePlugin.createObject',
@@ -421,6 +582,53 @@ export const constructObjectActions = ({
421
582
  },
422
583
  ]
423
584
  : []),
585
+ ...(Obj.instanceOf(StoredSchema, object)
586
+ ? [
587
+ {
588
+ id: getId(SpaceAction.AddObject._tag),
589
+ type: ACTION_TYPE,
590
+ data: async () => {
591
+ await dispatch(
592
+ createIntent(SpaceAction.OpenCreateObject, {
593
+ target: space,
594
+ views: true,
595
+ initialFormValues: { typename: object.typename },
596
+ }),
597
+ );
598
+ },
599
+ properties: {
600
+ label: ['add view to schema label', { ns: Type.getTypename(StoredSchema) }],
601
+ icon: 'ph--plus--regular',
602
+ disposition: 'list-item-primary',
603
+ testId: 'spacePlugin.addViewToSchema',
604
+ },
605
+ },
606
+ {
607
+ id: getId(SpaceAction.Snapshot._tag),
608
+ type: ACTION_TYPE,
609
+ data: async () => {
610
+ const result = await dispatch(
611
+ createIntent(SpaceAction.Snapshot, {
612
+ space,
613
+ query: Query.select(Filter.type(Type.toEffectSchema(object.jsonSchema))).ast,
614
+ }),
615
+ );
616
+ if (result.data?.snapshot) {
617
+ await downloadBlob(
618
+ result.data.snapshot,
619
+ // TODO(wittjosiah): Factor out file name construction.
620
+ `${new Date().toISOString()}-${space.id}-${object.typename}.json`,
621
+ );
622
+ }
623
+ },
624
+ properties: {
625
+ label: ['snapshot by schema label', { ns: meta.id }],
626
+ icon: 'ph--camera--regular',
627
+ disposition: 'list-item',
628
+ },
629
+ },
630
+ ]
631
+ : []),
424
632
  ...(matchingObjectForm
425
633
  ? [
426
634
  {
@@ -431,12 +639,12 @@ export const constructObjectActions = ({
431
639
  await dispatch(
432
640
  createIntent(SpaceAction.OpenCreateObject, {
433
641
  target: space,
434
- typename: queryCollection?.query.typename,
642
+ typename: queryCollection ? getTypenameFromQuery(queryCollection.query) : undefined,
435
643
  }),
436
644
  );
437
645
  } else {
438
646
  await dispatch(
439
- pipe(
647
+ Function.pipe(
440
648
  matchingObjectForm.getIntent({}, { space }),
441
649
  chain(SpaceAction.AddObject, { target: space, hidden: true }),
442
650
  chain(LayoutAction.Open, { part: 'main' }),
@@ -445,7 +653,7 @@ export const constructObjectActions = ({
445
653
  }
446
654
  },
447
655
  properties: {
448
- label: ['create object in smart collection label', { ns: SPACE_PLUGIN }],
656
+ label: ['create object in smart collection label', { ns: meta.id }],
449
657
  icon: 'ph--plus--regular',
450
658
  disposition: 'list-item-primary',
451
659
  testId: 'spacePlugin.createObject',
@@ -460,10 +668,7 @@ export const constructObjectActions = ({
460
668
  await dispatch(createIntent(SpaceAction.RenameObject, { object, caller: params?.caller }));
461
669
  },
462
670
  properties: {
463
- label: [
464
- Obj.instanceOf(DataType.Collection, object) ? 'rename collection label' : 'rename object label',
465
- { ns: SPACE_PLUGIN },
466
- ],
671
+ label: ['rename object label', { ns: typename }],
467
672
  icon: 'ph--pencil-simple-line--regular',
468
673
  disposition: 'list-item',
469
674
  // TODO(wittjosiah): Not working.
@@ -478,33 +683,34 @@ export const constructObjectActions = ({
478
683
  type: ACTION_TYPE,
479
684
  data: async () => {
480
685
  const collection = graph
481
- .getConnections(fullyQualifiedId(object), 'inbound')
482
- .find(({ data }) => Obj.instanceOf(DataType.Collection, data))?.data;
686
+ .getConnections(Obj.getDXN(object).toString(), 'inbound')
687
+ .find(({ data }) => Obj.instanceOf(Collection.Collection, data))?.data;
483
688
  await dispatch(createIntent(SpaceAction.RemoveObjects, { objects: [object], target: collection }));
484
689
  },
485
690
  properties: {
486
- label: [
487
- Obj.instanceOf(DataType.Collection, object) ? 'delete collection label' : 'delete object label',
488
- { ns: SPACE_PLUGIN },
489
- ],
691
+ label: ['delete object label', { ns: typename }],
490
692
  icon: 'ph--trash--regular',
491
693
  disposition: 'list-item',
694
+ disabled: !deletable,
492
695
  // TODO(wittjosiah): This is a browser shortcut.
493
696
  // keyBinding: object instanceof CollectionType ? undefined : 'shift+meta+Backspace',
494
697
  testId: 'spacePlugin.deleteObject',
495
698
  },
496
699
  },
497
- ...(navigable || (!Obj.instanceOf(DataType.Collection, object) && !Obj.instanceOf(DataType.QueryCollection, object))
700
+ ...(navigable ||
701
+ (!Obj.instanceOf(Collection.Collection, object) &&
702
+ !Obj.instanceOf(Collection.QueryCollection, object) &&
703
+ !Obj.instanceOf(StoredSchema, object))
498
704
  ? [
499
705
  {
500
706
  id: getId('copy-link'),
501
707
  type: ACTION_TYPE,
502
708
  data: async () => {
503
- const url = `${window.location.origin}/${space.id}/${fullyQualifiedId(object)}`;
709
+ const url = `${window.location.origin}/${space.id}/${Obj.getDXN(object).toString()}`;
504
710
  await navigator.clipboard.writeText(url);
505
711
  },
506
712
  properties: {
507
- label: ['copy link label', { ns: SPACE_PLUGIN }],
713
+ label: ['copy link label', { ns: meta.id }],
508
714
  icon: 'ph--link--regular',
509
715
  disposition: 'list-item',
510
716
  testId: 'spacePlugin.copyLink',
@@ -517,10 +723,12 @@ export const constructObjectActions = ({
517
723
  id: getId(LayoutAction.Expose._tag),
518
724
  type: ACTION_TYPE,
519
725
  data: async () => {
520
- await dispatch(createIntent(LayoutAction.Expose, { part: 'navigation', subject: fullyQualifiedId(object) }));
726
+ await dispatch(
727
+ createIntent(LayoutAction.Expose, { part: 'navigation', subject: Obj.getDXN(object).toString() }),
728
+ );
521
729
  },
522
730
  properties: {
523
- label: ['expose object label', { ns: SPACE_PLUGIN }],
731
+ label: ['expose object label', { ns: meta.id }],
524
732
  icon: 'ph--eye--regular',
525
733
  disposition: 'heading-list-item',
526
734
  testId: 'spacePlugin.exposeObject',
@@ -531,6 +739,20 @@ export const constructObjectActions = ({
531
739
  return actions;
532
740
  };
533
741
 
742
+ // TODO(wittjosiah): Factor out.
743
+ const downloadBlob = async (blob: Blob, filename: string) => {
744
+ const url = URL.createObjectURL(blob);
745
+ const a = document.createElement('a');
746
+ a.href = url;
747
+ a.download = filename;
748
+
749
+ document.body.appendChild(a);
750
+ a.click();
751
+
752
+ document.body.removeChild(a);
753
+ URL.revokeObjectURL(url);
754
+ };
755
+
534
756
  /**
535
757
  * @deprecated This is a temporary solution.
536
758
  */
@@ -564,7 +786,7 @@ export const cloneObject = async (
564
786
  newSpace: Space,
565
787
  ): Promise<Type.Expando> => {
566
788
  const schema = Obj.getSchema(object);
567
- const typename = schema ? Type.getTypename(schema) ?? EXPANDO_TYPENAME : EXPANDO_TYPENAME;
789
+ const typename = schema ? (Type.getTypename(schema) ?? EXPANDO_TYPENAME) : EXPANDO_TYPENAME;
568
790
  const metadata = resolve(typename);
569
791
  const serializer = metadata.serializer;
570
792
  invariant(serializer, `No serializer for type: ${typename}`);