@dxos/plugin-space 0.8.4-main.406dc2a → 0.8.4-main.548089c

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 (293) hide show
  1. package/dist/lib/browser/{CollectionMain-AX7KKXWP.mjs → CollectionArticle-ABGFK4VO.mjs} +8 -8
  2. package/dist/lib/browser/CollectionArticle-ABGFK4VO.mjs.map +7 -0
  3. package/dist/lib/browser/{ObjectDetailsPanel-MQBHG666.mjs → ObjectDetailsPanel-2BRUBHP6.mjs} +16 -20
  4. package/dist/lib/browser/ObjectDetailsPanel-2BRUBHP6.mjs.map +7 -0
  5. package/dist/lib/browser/{ObjectSettings-KNUZFCGS.mjs → ObjectSettings-5LLWCVEK.mjs} +33 -40
  6. package/dist/lib/browser/ObjectSettings-5LLWCVEK.mjs.map +7 -0
  7. package/dist/lib/browser/RecordArticle-G4BCSFFA.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-G4BCSFFA.mjs.map +7 -0
  9. package/dist/lib/browser/{app-graph-builder-3R5GGT46.mjs → app-graph-builder-FFPJHWFB.mjs} +53 -45
  10. package/dist/lib/browser/app-graph-builder-FFPJHWFB.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-25Z5BG22.mjs → app-graph-serializer-QMWE2YE4.mjs} +10 -10
  12. package/dist/lib/browser/app-graph-serializer-QMWE2YE4.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-OV6D543A.mjs → chunk-I4W2BHA2.mjs} +36 -30
  14. package/dist/lib/browser/chunk-I4W2BHA2.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-RLI2IAHK.mjs → chunk-K5J7ZB5P.mjs} +2 -2
  16. package/dist/lib/browser/chunk-K5J7ZB5P.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-7XOTWRZ3.mjs → chunk-K6TOP4E6.mjs} +19 -18
  18. package/dist/lib/browser/chunk-K6TOP4E6.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-WS2PJDES.mjs → chunk-M2Z6D4ZI.mjs} +12 -11
  20. package/dist/lib/browser/chunk-M2Z6D4ZI.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-522KZGQF.mjs → chunk-MHXNG2X2.mjs} +487 -381
  22. package/dist/lib/browser/chunk-MHXNG2X2.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-PTGRQQ6J.mjs → chunk-OLBBSOVI.mjs} +23 -13
  24. package/dist/lib/browser/chunk-OLBBSOVI.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
  26. package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-EIXZABXD.mjs → chunk-WJXU4GKV.mjs} +2 -2
  28. package/dist/lib/browser/{identity-created-PW2BA46S.mjs → identity-created-NAXTPQXE.mjs} +3 -3
  29. package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
  30. package/dist/lib/browser/index.mjs +63 -46
  31. package/dist/lib/browser/index.mjs.map +3 -3
  32. package/dist/lib/browser/{intent-resolver-ICGUSVH6.mjs → intent-resolver-WLFWCHDH.mjs} +53 -58
  33. package/dist/lib/browser/intent-resolver-WLFWCHDH.mjs.map +7 -0
  34. package/dist/lib/browser/meta.json +1 -1
  35. package/dist/lib/browser/{react-root-H56QN474.mjs → react-root-BPPTUFLV.mjs} +9 -8
  36. package/dist/lib/browser/react-root-BPPTUFLV.mjs.map +7 -0
  37. package/dist/lib/browser/{react-surface-VOE2ILKO.mjs → react-surface-3KTOA5PM.mjs} +37 -40
  38. package/dist/lib/browser/react-surface-3KTOA5PM.mjs.map +7 -0
  39. package/dist/lib/browser/{schema-defs-7R7RKCAE.mjs → schema-defs-XCNOO2WT.mjs} +3 -3
  40. package/dist/lib/browser/{settings-OBFJ67ZG.mjs → settings-WKLGKUHQ.mjs} +3 -3
  41. package/dist/lib/browser/{spaces-ready-MFIVK6I6.mjs → spaces-ready-XVW7I5MQ.mjs} +12 -11
  42. package/dist/lib/browser/spaces-ready-XVW7I5MQ.mjs.map +7 -0
  43. package/dist/lib/browser/{state-LSPRFIRO.mjs → state-Q7YRE5KG.mjs} +3 -3
  44. package/dist/lib/browser/types/index.mjs +2 -2
  45. package/dist/lib/node-esm/{CollectionMain-EU57SRYK.mjs → CollectionArticle-G3V4QXPI.mjs} +8 -8
  46. package/dist/lib/node-esm/CollectionArticle-G3V4QXPI.mjs.map +7 -0
  47. package/dist/lib/node-esm/{ObjectDetailsPanel-NABA2S56.mjs → ObjectDetailsPanel-6PZQIQG3.mjs} +16 -20
  48. package/dist/lib/node-esm/ObjectDetailsPanel-6PZQIQG3.mjs.map +7 -0
  49. package/dist/lib/node-esm/{ObjectSettings-GXGTITF5.mjs → ObjectSettings-OQSBOH7K.mjs} +33 -40
  50. package/dist/lib/node-esm/ObjectSettings-OQSBOH7K.mjs.map +7 -0
  51. package/dist/lib/node-esm/RecordArticle-PBMLYY5K.mjs +117 -0
  52. package/dist/lib/node-esm/RecordArticle-PBMLYY5K.mjs.map +7 -0
  53. package/dist/lib/node-esm/{app-graph-builder-VGRMD5TP.mjs → app-graph-builder-3BTVV7LE.mjs} +53 -45
  54. package/dist/lib/node-esm/app-graph-builder-3BTVV7LE.mjs.map +7 -0
  55. package/dist/lib/node-esm/{app-graph-serializer-U4GHXWRG.mjs → app-graph-serializer-BU7KO2G5.mjs} +10 -10
  56. package/dist/lib/node-esm/app-graph-serializer-BU7KO2G5.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-4F25JKVT.mjs → chunk-2PN7QNGV.mjs} +12 -11
  58. package/dist/lib/node-esm/chunk-2PN7QNGV.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  60. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-PAAWJ4RE.mjs → chunk-FAWIRIP4.mjs} +19 -18
  62. package/dist/lib/node-esm/chunk-FAWIRIP4.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-SVFKU7EW.mjs → chunk-H4JILUJK.mjs} +2 -2
  64. package/dist/lib/node-esm/{chunk-TNUWML33.mjs → chunk-HQMFTMJE.mjs} +36 -30
  65. package/dist/lib/node-esm/chunk-HQMFTMJE.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-DG5YEEPZ.mjs → chunk-MI4A5XUX.mjs} +487 -381
  67. package/dist/lib/node-esm/chunk-MI4A5XUX.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-HAKW2RFD.mjs → chunk-WC4VBFMA.mjs} +23 -13
  69. package/dist/lib/node-esm/chunk-WC4VBFMA.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-H5UPFRRH.mjs → chunk-Z7BB6HC2.mjs} +2 -2
  71. package/dist/lib/node-esm/chunk-Z7BB6HC2.mjs.map +7 -0
  72. package/dist/lib/node-esm/{identity-created-MWTLGQRU.mjs → identity-created-OXLKCJE3.mjs} +3 -3
  73. package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
  74. package/dist/lib/node-esm/index.mjs +63 -46
  75. package/dist/lib/node-esm/index.mjs.map +3 -3
  76. package/dist/lib/node-esm/{intent-resolver-KVB2A4YC.mjs → intent-resolver-QHH5SXLC.mjs} +53 -58
  77. package/dist/lib/node-esm/intent-resolver-QHH5SXLC.mjs.map +7 -0
  78. package/dist/lib/node-esm/meta.json +1 -1
  79. package/dist/lib/node-esm/{react-root-56PGW5PH.mjs → react-root-QRONKFKI.mjs} +9 -8
  80. package/dist/lib/node-esm/react-root-QRONKFKI.mjs.map +7 -0
  81. package/dist/lib/node-esm/{react-surface-NYEQ23A4.mjs → react-surface-OZBWNTW2.mjs} +37 -40
  82. package/dist/lib/node-esm/react-surface-OZBWNTW2.mjs.map +7 -0
  83. package/dist/lib/node-esm/{schema-defs-RYG5DSUE.mjs → schema-defs-5TDB7T5J.mjs} +3 -3
  84. package/dist/lib/node-esm/{settings-QGWWNMMZ.mjs → settings-RBB5633M.mjs} +3 -3
  85. package/dist/lib/node-esm/{spaces-ready-TC27M7MP.mjs → spaces-ready-J6RWPI2X.mjs} +12 -11
  86. package/dist/lib/node-esm/spaces-ready-J6RWPI2X.mjs.map +7 -0
  87. package/dist/lib/node-esm/{state-TCGOPLRO.mjs → state-362I5BMK.mjs} +3 -3
  88. package/dist/lib/node-esm/types/index.mjs +2 -2
  89. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  92. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  97. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  98. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  99. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  100. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  101. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  102. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  103. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +91 -1
  104. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +2 -2
  106. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  107. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  108. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  109. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  110. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  111. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  112. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1697 -0
  113. package/dist/types/src/components/{MembersContainer.stories.d.ts.map → MembersContainer/MembersContainer.stories.d.ts.map} +1 -1
  114. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  115. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  116. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +2 -2
  117. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -1
  118. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -1
  119. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  120. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  121. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  122. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  123. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +1 -1
  124. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  125. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +91 -1
  126. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  128. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  129. package/dist/types/src/components/{MembersContainer.stories.d.ts → RecordArticle.stories.d.ts} +92 -2
  130. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  131. package/dist/types/src/components/SchemaContainer.d.ts +1 -1
  132. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  133. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  134. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +4 -3
  135. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  136. package/dist/types/src/components/{SpacePresence.stories.d.ts → SpacePresence/SpacePresence.stories.d.ts} +91 -1
  137. package/dist/types/src/components/{SpacePresence.stories.d.ts.map → SpacePresence/SpacePresence.stories.d.ts.map} +1 -1
  138. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  139. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  140. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  141. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  142. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  143. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  144. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  145. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +91 -1
  146. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  147. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  148. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +92 -2
  149. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  150. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  151. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  152. package/dist/types/src/components/index.d.ts +9 -16
  153. package/dist/types/src/components/index.d.ts.map +1 -1
  154. package/dist/types/src/helpers/index.d.ts +2 -0
  155. package/dist/types/src/helpers/index.d.ts.map +1 -0
  156. package/dist/types/src/helpers/query.d.ts +8 -0
  157. package/dist/types/src/helpers/query.d.ts.map +1 -0
  158. package/dist/types/src/helpers/query.test.d.ts +2 -0
  159. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  160. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  161. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  162. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -1
  163. package/dist/types/src/index.d.ts +1 -0
  164. package/dist/types/src/index.d.ts.map +1 -1
  165. package/dist/types/src/meta.d.ts.map +1 -1
  166. package/dist/types/src/translations.d.ts +91 -1
  167. package/dist/types/src/translations.d.ts.map +1 -1
  168. package/dist/types/src/types/types.d.ts +2 -2
  169. package/dist/types/src/types/types.d.ts.map +1 -1
  170. package/dist/types/src/util.d.ts +6 -4
  171. package/dist/types/src/util.d.ts.map +1 -1
  172. package/dist/types/tsconfig.tsbuildinfo +1 -1
  173. package/package.json +53 -51
  174. package/src/SpacePlugin.ts +49 -25
  175. package/src/capabilities/app-graph-builder.ts +86 -60
  176. package/src/capabilities/app-graph-serializer.ts +5 -5
  177. package/src/capabilities/capabilities.ts +2 -2
  178. package/src/capabilities/identity-created.ts +2 -2
  179. package/src/capabilities/intent-resolver.ts +46 -41
  180. package/src/capabilities/react-root.tsx +2 -1
  181. package/src/capabilities/react-surface.tsx +35 -40
  182. package/src/capabilities/spaces-ready.ts +7 -4
  183. package/src/components/AwaitingObject.tsx +11 -13
  184. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +5 -4
  185. package/src/components/CollectionSection.tsx +6 -4
  186. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +6 -6
  187. package/src/components/CreateDialog/CreateObjectDialog.tsx +29 -22
  188. package/src/components/CreateDialog/CreateObjectPanel.tsx +2 -2
  189. package/src/components/CreateDialog/CreateSpaceDialog.tsx +25 -7
  190. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +21 -5
  191. package/src/components/JoinDialog/index.ts +5 -0
  192. package/src/components/{MembersContainer.stories.tsx → MembersContainer/MembersContainer.stories.tsx} +1 -1
  193. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +11 -9
  194. package/src/components/MembersContainer/index.ts +5 -0
  195. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +2 -3
  196. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +9 -12
  197. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +5 -5
  198. package/src/components/ObjectRenamePopover/index.ts +5 -0
  199. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +6 -6
  200. package/src/components/ObjectSettings/BaseObjectSettings.tsx +34 -40
  201. package/src/components/ObjectSettings/ForeignKeys.tsx +1 -1
  202. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +1 -1
  203. package/src/components/RecordArticle.stories.tsx +115 -0
  204. package/src/components/RecordArticle.tsx +114 -0
  205. package/src/components/SchemaContainer.tsx +21 -24
  206. package/src/components/SpacePluginSettings.tsx +8 -2
  207. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +1 -1
  208. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +14 -9
  209. package/src/components/SpacePresence/index.ts +5 -0
  210. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +6 -5
  211. package/src/components/SpaceRenamePopover/index.ts +5 -0
  212. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +33 -13
  213. package/src/components/SyncStatus/InlineSyncStatus.tsx +1 -1
  214. package/src/components/SyncStatus/SyncStatus.stories.tsx +3 -2
  215. package/src/components/SyncStatus/SyncStatus.tsx +45 -36
  216. package/src/components/ViewEditor.tsx +51 -17
  217. package/src/components/index.ts +6 -7
  218. package/src/helpers/index.ts +5 -0
  219. package/src/helpers/query.test.ts +24 -0
  220. package/src/helpers/query.ts +158 -0
  221. package/src/hooks/useActiveSpace.ts +2 -1
  222. package/src/hooks/useInputSurfaceLookup.tsx +7 -2
  223. package/src/hooks/useTypeOptions.ts +3 -3
  224. package/src/index.ts +1 -0
  225. package/src/meta.ts +5 -0
  226. package/src/translations.ts +22 -10
  227. package/src/types/types.ts +11 -10
  228. package/src/util.tsx +44 -36
  229. package/dist/lib/browser/CollectionMain-AX7KKXWP.mjs.map +0 -7
  230. package/dist/lib/browser/ObjectDetailsPanel-MQBHG666.mjs.map +0 -7
  231. package/dist/lib/browser/ObjectSettings-KNUZFCGS.mjs.map +0 -7
  232. package/dist/lib/browser/RecordMain-H4DVHICS.mjs +0 -116
  233. package/dist/lib/browser/RecordMain-H4DVHICS.mjs.map +0 -7
  234. package/dist/lib/browser/app-graph-builder-3R5GGT46.mjs.map +0 -7
  235. package/dist/lib/browser/app-graph-serializer-25Z5BG22.mjs.map +0 -7
  236. package/dist/lib/browser/chunk-522KZGQF.mjs.map +0 -7
  237. package/dist/lib/browser/chunk-7XOTWRZ3.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-IRKDREHY.mjs +0 -11
  239. package/dist/lib/browser/chunk-IRKDREHY.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-OV6D543A.mjs.map +0 -7
  241. package/dist/lib/browser/chunk-PTGRQQ6J.mjs.map +0 -7
  242. package/dist/lib/browser/chunk-RLI2IAHK.mjs.map +0 -7
  243. package/dist/lib/browser/chunk-WS2PJDES.mjs.map +0 -7
  244. package/dist/lib/browser/identity-created-PW2BA46S.mjs.map +0 -7
  245. package/dist/lib/browser/intent-resolver-ICGUSVH6.mjs.map +0 -7
  246. package/dist/lib/browser/react-root-H56QN474.mjs.map +0 -7
  247. package/dist/lib/browser/react-surface-VOE2ILKO.mjs.map +0 -7
  248. package/dist/lib/browser/spaces-ready-MFIVK6I6.mjs.map +0 -7
  249. package/dist/lib/node-esm/CollectionMain-EU57SRYK.mjs.map +0 -7
  250. package/dist/lib/node-esm/ObjectDetailsPanel-NABA2S56.mjs.map +0 -7
  251. package/dist/lib/node-esm/ObjectSettings-GXGTITF5.mjs.map +0 -7
  252. package/dist/lib/node-esm/RecordMain-MYFTAQ2U.mjs +0 -117
  253. package/dist/lib/node-esm/RecordMain-MYFTAQ2U.mjs.map +0 -7
  254. package/dist/lib/node-esm/app-graph-builder-VGRMD5TP.mjs.map +0 -7
  255. package/dist/lib/node-esm/app-graph-serializer-U4GHXWRG.mjs.map +0 -7
  256. package/dist/lib/node-esm/chunk-4F25JKVT.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-DG5YEEPZ.mjs.map +0 -7
  258. package/dist/lib/node-esm/chunk-H5UPFRRH.mjs.map +0 -7
  259. package/dist/lib/node-esm/chunk-HAKW2RFD.mjs.map +0 -7
  260. package/dist/lib/node-esm/chunk-MWNATOXL.mjs +0 -13
  261. package/dist/lib/node-esm/chunk-MWNATOXL.mjs.map +0 -7
  262. package/dist/lib/node-esm/chunk-PAAWJ4RE.mjs.map +0 -7
  263. package/dist/lib/node-esm/chunk-TNUWML33.mjs.map +0 -7
  264. package/dist/lib/node-esm/identity-created-MWTLGQRU.mjs.map +0 -7
  265. package/dist/lib/node-esm/intent-resolver-KVB2A4YC.mjs.map +0 -7
  266. package/dist/lib/node-esm/react-root-56PGW5PH.mjs.map +0 -7
  267. package/dist/lib/node-esm/react-surface-NYEQ23A4.mjs.map +0 -7
  268. package/dist/lib/node-esm/spaces-ready-TC27M7MP.mjs.map +0 -7
  269. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  270. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  271. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  272. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  273. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  274. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  275. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  276. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  277. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  278. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  279. package/dist/types/src/components/RecordMain.d.ts +0 -7
  280. package/dist/types/src/components/RecordMain.d.ts.map +0 -1
  281. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  282. package/src/components/PersistenceStatus.tsx +0 -83
  283. package/src/components/RecordMain.tsx +0 -87
  284. /package/dist/lib/browser/{chunk-EIXZABXD.mjs.map → chunk-WJXU4GKV.mjs.map} +0 -0
  285. /package/dist/lib/browser/{schema-defs-7R7RKCAE.mjs.map → schema-defs-XCNOO2WT.mjs.map} +0 -0
  286. /package/dist/lib/browser/{settings-OBFJ67ZG.mjs.map → settings-WKLGKUHQ.mjs.map} +0 -0
  287. /package/dist/lib/browser/{state-LSPRFIRO.mjs.map → state-Q7YRE5KG.mjs.map} +0 -0
  288. /package/dist/lib/node-esm/{chunk-SVFKU7EW.mjs.map → chunk-H4JILUJK.mjs.map} +0 -0
  289. /package/dist/lib/node-esm/{schema-defs-RYG5DSUE.mjs.map → schema-defs-5TDB7T5J.mjs.map} +0 -0
  290. /package/dist/lib/node-esm/{settings-QGWWNMMZ.mjs.map → settings-RBB5633M.mjs.map} +0 -0
  291. /package/dist/lib/node-esm/{state-TCGOPLRO.mjs.map → state-362I5BMK.mjs.map} +0 -0
  292. /package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +0 -0
  293. /package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +0 -0
@@ -5,15 +5,17 @@
5
5
  import React, { type Dispatch, type SetStateAction, useCallback, useMemo, useState } from 'react';
6
6
  import { QR } from 'react-qr-rounded';
7
7
 
8
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { createIntent } from '@dxos/app-framework';
9
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
10
+ import { Obj } from '@dxos/echo';
9
11
  import { log } from '@dxos/log';
10
12
  import { useConfig } from '@dxos/react-client';
11
- import { type Space, fullyQualifiedId, useSpaceInvitations } from '@dxos/react-client/echo';
13
+ import { type Space, useSpaceInvitations } from '@dxos/react-client/echo';
12
14
  import { type CancellableInvitationObservable, Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
13
15
  import { Button, Clipboard, Icon, Input, useId, useTranslation } from '@dxos/react-ui';
14
16
  import { ControlFrame, ControlFrameItem, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';
15
17
  import { StackItem } from '@dxos/react-ui-stack';
16
- import { DataType } from '@dxos/schema';
18
+ import { Collection } from '@dxos/schema';
17
19
  import {
18
20
  type ActionMenuItem,
19
21
  AuthCode,
@@ -26,9 +28,9 @@ import {
26
28
  } from '@dxos/shell/react';
27
29
  import { hexToEmoji } from '@dxos/util';
28
30
 
29
- import { meta } from '../meta';
30
- import { SpaceAction } from '../types';
31
- import { COMPOSER_SPACE_LOCK } from '../util';
31
+ import { meta } from '../../meta';
32
+ import { SpaceAction } from '../../types';
33
+ import { COMPOSER_SPACE_LOCK } from '../../util';
32
34
 
33
35
  // TODO(wittjosiah): Copied from Shell.
34
36
  const activeActionKey = 'dxos:react-shell/space-manager/active-action';
@@ -63,7 +65,7 @@ export const MembersContainer = ({ space, createInvitationUrl }: MembersContaine
63
65
  };
64
66
 
65
67
  // TODO(wittjosiah): Track which was the most recently viewed object.
66
- const target = space.properties[DataType.Collection.typename]?.target?.objects[0]?.target;
68
+ const target = space.properties[Collection.Collection.typename]?.target?.objects[0]?.target;
67
69
 
68
70
  const locked = space.properties[COMPOSER_SPACE_LOCK];
69
71
  const handleChangeLocked = useCallback(() => {
@@ -84,7 +86,7 @@ export const MembersContainer = ({ space, createInvitationUrl }: MembersContaine
84
86
  type: Invitation.Type.INTERACTIVE,
85
87
  authMethod: Invitation.AuthMethod.SHARED_SECRET,
86
88
  multiUse: false,
87
- target: target && fullyQualifiedId(target),
89
+ target: target && Obj.getDXN(target).toString(),
88
90
  }),
89
91
  );
90
92
  if (invitation && config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {
@@ -106,7 +108,7 @@ export const MembersContainer = ({ space, createInvitationUrl }: MembersContaine
106
108
  type: Invitation.Type.DELEGATED,
107
109
  authMethod: Invitation.AuthMethod.KNOWN_PUBLIC_KEY,
108
110
  multiUse: true,
109
- target: target && fullyQualifiedId(target),
111
+ target: target && Obj.getDXN(target).toString(),
110
112
  }),
111
113
  );
112
114
  if (invitation && config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './MembersContainer';
@@ -8,15 +8,14 @@ import { useClient } from '@dxos/react-client';
8
8
  import { Filter, getSpace, useQuery, useSchema } from '@dxos/react-client/echo';
9
9
  import { Callout, useTranslation } from '@dxos/react-ui';
10
10
  import { useSelected } from '@dxos/react-ui-attention';
11
- import { type DataType } from '@dxos/schema';
12
- import { getTypenameFromQuery } from '@dxos/schema';
11
+ import { type View, getTypenameFromQuery } from '@dxos/schema';
13
12
  import { isNonNullable } from '@dxos/util';
14
13
 
15
14
  import { meta } from '../../meta';
16
15
 
17
16
  import { ObjectForm } from './ObjectForm';
18
17
 
19
- type RowDetailsPanelProps = { objectId: string; view: DataType.View };
18
+ type RowDetailsPanelProps = { objectId: string; view: View.View };
20
19
 
21
20
  export const ObjectDetailsPanel = ({ objectId, view }: RowDetailsPanelProps) => {
22
21
  const { t } = useTranslation(meta.id);
@@ -5,11 +5,12 @@
5
5
  import * as Schema from 'effect/Schema';
6
6
  import React, { useCallback, useMemo } from 'react';
7
7
 
8
- import { DXN, Obj, Tag, Type } from '@dxos/echo';
8
+ import { DXN, Obj, type Ref, Tag, Type } from '@dxos/echo';
9
9
  import { type JsonPath, setValue } from '@dxos/echo/internal';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { getSpace } from '@dxos/react-client/echo';
12
12
  import { Form, useRefQueryLookupHandler } from '@dxos/react-ui-form';
13
+ import { isNonNullable } from '@dxos/util';
13
14
 
14
15
  import { meta as pluginMeta } from '../../meta';
15
16
 
@@ -22,32 +23,28 @@ export const ObjectForm = ({ object, schema }: ObjectFormProps) => {
22
23
  const handleRefQueryLookup = useRefQueryLookupHandler({ space });
23
24
 
24
25
  const formSchema = useMemo(
25
- () => Schema.Struct({ tag: Type.Ref(Tag.Tag).pipe(Schema.optional) }).pipe(Schema.extend(schema)),
26
+ () => Schema.Struct({ tags: Schema.Array(Type.Ref(Tag.Tag)).pipe(Schema.optional) }).pipe(Schema.extend(schema)),
26
27
  [schema],
27
28
  );
28
29
 
29
30
  const meta = Obj.getMeta(object);
30
- const tag = meta.tags?.[0] ? space?.db.ref(DXN.parse(meta.tags?.[0])) : undefined;
31
- const values = useMemo(() => ({ tag, ...object }), [object, tag]);
31
+ const tags = (meta.tags ?? []).map((tag) => space?.db.ref(DXN.parse(tag))).filter(isNonNullable);
32
+ const values = useMemo(() => ({ tags, ...object }), [object, tags]);
32
33
 
33
34
  const handleCreateTag = useCallback((values: Schema.Schema.Type<typeof TagSchema>) => {
34
35
  invariant(space);
35
36
  const tag = space.db.add(Tag.make(values));
36
37
  const meta = Obj.getMeta(object);
37
- meta.tags = [Obj.getDXN(tag).toString()];
38
+ meta.tags = [...(meta.tags ?? []), Obj.getDXN(tag).toString()];
38
39
  }, []);
39
40
 
40
41
  const handleSave = useCallback(
41
- (values: any, { changed }: { changed: Record<JsonPath, boolean> }) => {
42
+ ({ tags, ...values }: any, { changed }: { changed: Record<JsonPath, boolean> }) => {
42
43
  const changedPaths = Object.keys(changed).filter((path) => changed[path as JsonPath]) as JsonPath[];
43
44
  for (const path of changedPaths) {
44
- if (path === 'tag') {
45
- const tag = values[path];
45
+ if (path === 'tags') {
46
46
  const meta = Obj.getMeta(object);
47
- const currentTag = meta.tags?.[0];
48
- if (currentTag !== tag?.dxn.toString()) {
49
- meta.tags = tag ? [tag.dxn.toString()] : [];
50
- }
47
+ meta.tags = tags?.map((tag: Ref.Ref<Tag.Tag>) => tag.dxn.toString()) ?? [];
51
48
  continue;
52
49
  }
53
50
 
@@ -4,17 +4,17 @@
4
4
 
5
5
  import React, { useCallback, useRef, useState } from 'react';
6
6
 
7
- import { LayoutAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
8
9
  import { Obj } from '@dxos/echo';
9
- import { type Live } from '@dxos/live-object';
10
10
  import { log } from '@dxos/log';
11
11
  import { Button, Input, useTranslation } from '@dxos/react-ui';
12
12
 
13
- import { meta } from '../meta';
13
+ import { meta } from '../../meta';
14
14
 
15
- export const POPOVER_RENAME_OBJECT = `${meta.id}/PopoverRenameObject`;
15
+ export const OBJECT_RENAME_POPOVER = `${meta.id}/ObjectRenamePopover`;
16
16
 
17
- export const PopoverRenameObject = ({ object }: { object: Live<any> }) => {
17
+ export const ObjectRenamePopover = ({ object }: { object: Obj.Any }) => {
18
18
  const { t } = useTranslation(meta.id);
19
19
  const doneButton = useRef<HTMLButtonElement>(null);
20
20
  const [name, setName] = useState(Obj.getLabel(object));
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './ObjectRenamePopover';
@@ -5,11 +5,11 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useEffect, useState } from 'react';
7
7
 
8
- import { Obj, Tag } from '@dxos/echo';
9
- import { Expando } from '@dxos/react-client/echo';
8
+ import { type Obj, Tag } from '@dxos/echo';
10
9
  import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
11
10
  import { withTheme } from '@dxos/react-ui/testing';
12
11
  import { render } from '@dxos/storybook-utils';
12
+ import { Project } from '@dxos/types';
13
13
 
14
14
  import { translations } from '../../translations';
15
15
 
@@ -21,7 +21,7 @@ const DefaultStory = () => {
21
21
 
22
22
  useEffect(() => {
23
23
  if (space && !object) {
24
- const object = space.db.add(Obj.make(Expando, {}));
24
+ const object = space.db.add(Project.make());
25
25
  setObject(object as Obj.Any);
26
26
  }
27
27
  }, [space, object]);
@@ -30,7 +30,7 @@ const DefaultStory = () => {
30
30
  return null;
31
31
  }
32
32
 
33
- return <BaseObjectSettings object={object} />;
33
+ return <BaseObjectSettings object={object} classNames='is-[20rem]' />;
34
34
  };
35
35
 
36
36
  const meta = {
@@ -42,7 +42,7 @@ const meta = {
42
42
  withClientProvider({
43
43
  createIdentity: true,
44
44
  createSpace: true,
45
- types: [Tag.Tag],
45
+ types: [Project.Project, Tag.Tag],
46
46
  onCreateSpace: async ({ space }) => {
47
47
  space.db.add(Tag.make({ label: 'Tag 1' }));
48
48
  space.db.add(Tag.make({ label: 'Tag 2' }));
@@ -51,7 +51,7 @@ const meta = {
51
51
  }),
52
52
  ],
53
53
  parameters: {
54
- layout: 'fullscreen',
54
+ layout: 'centered',
55
55
  translations,
56
56
  },
57
57
  } satisfies Meta<typeof DefaultStory>;
@@ -2,31 +2,25 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { batch } from '@preact/signals-core';
5
6
  import * as Function from 'effect/Function';
6
7
  import * as Option from 'effect/Option';
7
8
  import * as Schema from 'effect/Schema';
8
9
  import React, { type PropsWithChildren, useCallback, useMemo } from 'react';
9
10
 
10
- import { DXN, Obj, Tag, Type } from '@dxos/echo';
11
- import { DescriptionAnnotation } from '@dxos/echo/internal';
11
+ import { DXN, Obj, type Ref, Tag, Type } from '@dxos/echo';
12
+ import { type JsonPath, setValue } from '@dxos/echo/internal';
12
13
  import { invariant } from '@dxos/invariant';
13
14
  import { getSpace } from '@dxos/react-client/echo';
14
15
  import { type ThemedClassName } from '@dxos/react-ui';
15
16
  import { Form, useRefQueryLookupHandler } from '@dxos/react-ui-form';
17
+ import { isNonNullable } from '@dxos/util';
16
18
 
17
19
  import { meta as pluginMeta } from '../../meta';
18
20
 
21
+ // TODO(wittjosiah): Would be nice to control order when extending so this isn't always first/last.
19
22
  const BaseSchema = Schema.Struct({
20
- label: Schema.String.pipe(Schema.optional),
21
- // TODO(wittjosiah): Support multiple tags.
22
- tag: Type.Ref(Tag.Tag).pipe(Schema.optional),
23
- });
24
-
25
- // TODO(wittjosiah): Use extend but need to be able to control order of fields.
26
- const BaseSchemaWithDescription = Schema.Struct({
27
- label: Schema.String.pipe(Schema.optional),
28
- description: Schema.String.pipe(Schema.optional),
29
- tag: Type.Ref(Tag.Tag).pipe(Schema.optional),
23
+ tags: Schema.Array(Type.Ref(Tag.Tag)).pipe(Schema.optional),
30
24
  });
31
25
 
32
26
  // TODO(wittjosiah): Better way to support validation of object schemas?
@@ -44,61 +38,61 @@ export const BaseObjectSettings = ({ classNames, children, object }: BaseObjectS
44
38
  const handleRefQueryLookup = useRefQueryLookupHandler({ space });
45
39
 
46
40
  const formSchema = useMemo(() => {
47
- const description = Function.pipe(
41
+ return Function.pipe(
48
42
  Obj.getSchema(object),
49
43
  Option.fromNullable,
50
- Option.flatMap((schema) => DescriptionAnnotation.get(schema)),
44
+ Option.map((schema) => BaseSchema.pipe(Schema.extend(schema))),
51
45
  Option.getOrUndefined,
52
46
  );
53
- if (description) {
54
- return BaseSchemaWithDescription;
55
- } else {
56
- return BaseSchema;
57
- }
58
47
  }, [object]);
59
48
 
60
49
  const meta = Obj.getMeta(object);
61
- const tag = meta.tags?.[0] ? space?.db.ref(DXN.parse(meta.tags?.[0])) : undefined;
50
+ const tags = (meta.tags ?? []).map((tag) => space?.db.ref(DXN.parse(tag))).filter(isNonNullable);
62
51
  const values = useMemo(
63
52
  () => ({
64
- label: Obj.getLabel(object),
65
- description: Obj.getDescription(object),
66
- tag,
53
+ tags,
54
+ ...object,
67
55
  }),
68
- [object, tag],
56
+ [object, tags],
69
57
  );
70
58
 
71
59
  const handleCreateTag = useCallback((values: Schema.Schema.Type<typeof TagSchema>) => {
72
60
  invariant(space);
73
61
  const tag = space.db.add(Tag.make(values));
74
62
  const meta = Obj.getMeta(object);
75
- meta.tags = [Obj.getDXN(tag).toString()];
63
+ meta.tags = [...(meta.tags ?? []), Obj.getDXN(tag).toString()];
76
64
  }, []);
77
65
 
78
66
  const handleSave = useCallback(
79
- (values: Schema.Schema.Type<typeof BaseSchemaWithDescription>) => {
80
- if (values.label !== undefined && Obj.getLabel(object) !== values.label) {
81
- Obj.setLabel(object, values.label);
82
- }
67
+ (
68
+ { tags, ...values }: Schema.Schema.Type<typeof formSchema>,
69
+ { changed }: { changed: Record<JsonPath, boolean> },
70
+ ) => {
71
+ const changedPaths = Object.keys(changed).filter((path) => changed[path as JsonPath]) as JsonPath[];
72
+ batch(() => {
73
+ for (const path of changedPaths) {
74
+ if (path === 'tags') {
75
+ const meta = Obj.getMeta(object);
76
+ meta.tags = tags?.map((tag: Ref.Ref<Tag.Tag>) => tag.dxn.toString()) ?? [];
77
+ continue;
78
+ }
83
79
 
84
- if (values.description !== undefined && Obj.getDescription(object) !== values.description) {
85
- Obj.setDescription(object, values.description);
86
- }
87
-
88
- const meta = Obj.getMeta(object);
89
- const currentTag = meta.tags?.[0];
90
- if (values.tag !== undefined && currentTag !== values.tag?.dxn.toString()) {
91
- meta.tags = [values.tag.dxn.toString()];
92
- }
80
+ const value = values[path];
81
+ setValue(object, path, value);
82
+ }
83
+ });
93
84
  },
94
85
  [object],
95
86
  );
96
87
 
97
- // TODO(wittjosiah): The schema for this form should be based on the schema of the object.
98
- // Perhaps with fields filtered down to only those with a specific settings annotation.
88
+ if (!formSchema) {
89
+ return null;
90
+ }
91
+
99
92
  return (
100
93
  <>
101
94
  <Form
95
+ classNames={classNames}
102
96
  outerSpacing={false}
103
97
  autoSave
104
98
  schema={formSchema}
@@ -38,7 +38,7 @@ const KeyItem = ({ forignKey, onDelete }: KeyItemProps) => {
38
38
  }, [forignKey, onDelete]);
39
39
 
40
40
  return (
41
- <ListItem.Root classNames='px-2'>
41
+ <ListItem.Root classNames='pli-2'>
42
42
  <ListItem.Heading classNames='flex flex-col grow truncate'>
43
43
  <div>{forignKey.source}</div>
44
44
  <div className='text-description text-sm truncate'>{forignKey.id}</div>
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { useMemo } from 'react';
6
6
 
7
- import { Surface } from '@dxos/app-framework';
7
+ import { Surface } from '@dxos/app-framework/react';
8
8
  import { type Obj } from '@dxos/echo';
9
9
  import { Clipboard, Toolbar } from '@dxos/react-ui';
10
10
  import { StackItem } from '@dxos/react-ui-stack';
@@ -0,0 +1,115 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { Capabilities, contributes, createSurface } from '@dxos/app-framework';
9
+ import { withPluginManager } from '@dxos/app-framework/testing';
10
+ import { Filter, Obj, Ref, Relation, type Type } from '@dxos/echo';
11
+ import { faker } from '@dxos/random';
12
+ import { useQuery } from '@dxos/react-client/echo';
13
+ import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
14
+ import { withTheme } from '@dxos/react-ui/testing';
15
+ import { Card } from '@dxos/react-ui-stack';
16
+ import { Json } from '@dxos/react-ui-syntax-highlighter';
17
+ import { type ValueGenerator, createAsyncGenerator } from '@dxos/schema/testing';
18
+ import { translations as shellTranslations } from '@dxos/shell/react';
19
+ import { render } from '@dxos/storybook-utils';
20
+ import { HasSubject, Organization, Person, Task } from '@dxos/types';
21
+
22
+ import { translations } from '../translations';
23
+
24
+ import { RecordArticle } from './RecordArticle';
25
+
26
+ faker.seed(1);
27
+ const generator: ValueGenerator = faker as any;
28
+
29
+ const DefaultStory = () => {
30
+ const { space } = useClientProvider();
31
+ const [object] = useQuery(space, Filter.type(Organization.Organization));
32
+ if (!object) {
33
+ return null;
34
+ }
35
+
36
+ return <RecordArticle object={object} />;
37
+ };
38
+
39
+ const meta = {
40
+ title: 'plugins/plugin-space/RecordArticle',
41
+ component: RecordArticle as any,
42
+ render: render(DefaultStory),
43
+ decorators: [
44
+ withTheme,
45
+ // TODO(wittjosiah): Try to write story which does not depend on plugin manager.
46
+ withPluginManager({
47
+ capabilities: [
48
+ contributes(Capabilities.ReactSurface, [
49
+ createSurface({
50
+ id: 'section',
51
+ role: 'section',
52
+ component: ({ data }) => (
53
+ <Card.SurfaceRoot>
54
+ <Json classNames='text-sm' data={data} />
55
+ </Card.SurfaceRoot>
56
+ ),
57
+ }),
58
+ createSurface({
59
+ id: 'card',
60
+ role: 'card',
61
+ component: ({ data }) => (
62
+ <Card.SurfaceRoot>
63
+ <Json classNames='text-sm' data={data} />
64
+ </Card.SurfaceRoot>
65
+ ),
66
+ }),
67
+ ]),
68
+ ],
69
+ }),
70
+ // TODO(burdon): Use plugin.
71
+ withClientProvider({
72
+ createIdentity: true,
73
+ createSpace: true,
74
+ types: [Organization.Organization, Person.Person, Task.Task, HasSubject.HasSubject],
75
+ onCreateSpace: async ({ space }) => {
76
+ const org = space.db.add(
77
+ Obj.make(Organization.Organization, {
78
+ name: 'DXOS',
79
+ }),
80
+ );
81
+ const task = space.db.add(
82
+ Obj.make(Task.Task, {
83
+ title: 'Task',
84
+ }),
85
+ );
86
+ space.db.add(
87
+ Relation.make(HasSubject.HasSubject, {
88
+ [Relation.Source]: task,
89
+ [Relation.Target]: org,
90
+ completedAt: new Date().toISOString(),
91
+ }),
92
+ );
93
+ const objectGenerator = createAsyncGenerator(generator, Person.Person as Type.Obj.Any, {
94
+ db: space?.db,
95
+ force: true,
96
+ });
97
+ await objectGenerator.createObjects(3).then((objects) => {
98
+ objects.forEach((object) => {
99
+ object.organization = Ref.make(org);
100
+ });
101
+ });
102
+ },
103
+ }),
104
+ ],
105
+ parameters: {
106
+ layout: 'fullscreen',
107
+ translations: [...translations, ...shellTranslations],
108
+ },
109
+ } satisfies Meta<typeof DefaultStory>;
110
+
111
+ export default meta;
112
+
113
+ type Story = StoryObj<typeof meta>;
114
+
115
+ export const Default: Story = {};
@@ -0,0 +1,114 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { useMemo } from 'react';
6
+
7
+ import { Surface } from '@dxos/app-framework/react';
8
+ import { type SurfaceComponentProps } from '@dxos/app-framework/react';
9
+ import { Filter, type Obj, Ref, Relation } from '@dxos/echo';
10
+ import { type Space, getSpace, useQuery } from '@dxos/react-client/echo';
11
+ import { useTranslation } from '@dxos/react-ui';
12
+ import { Masonry } from '@dxos/react-ui-masonry';
13
+ import { StackItem } from '@dxos/react-ui-stack';
14
+ import { mx } from '@dxos/react-ui-theme';
15
+ import { isNonNullable } from '@dxos/util';
16
+
17
+ import { meta } from '../meta';
18
+
19
+ export const RecordArticle = ({ object }: SurfaceComponentProps) => {
20
+ const { t } = useTranslation(meta.id);
21
+ const space = getSpace(object);
22
+ const data = useMemo(() => ({ subject: object }), [object]);
23
+ const related = useRelatedObjects(space, object, {
24
+ references: true,
25
+ relations: true,
26
+ });
27
+ const singleColumn = related.length === 1;
28
+
29
+ return (
30
+ <StackItem.Content>
31
+ <div role='none' className={mx('flex flex-col gap-4 p-4 is-full overflow-y-auto')}>
32
+ <div role='none' className={mx('flex is-full card-max-width')}>
33
+ <Surface role='section' data={data} limit={1} />
34
+ </div>
35
+
36
+ {related.length > 0 && (
37
+ <div role='none' className={mx('flex flex-col gap-1', singleColumn ? 'card-max-width' : 'is-full')}>
38
+ <label className='mbs-2 text-sm text-description'>{t('related objects label')}</label>
39
+ <Masonry.Root<Obj.Any>
40
+ items={related}
41
+ render={Card}
42
+ columnCount={singleColumn ? 1 : undefined}
43
+ intrinsicHeight
44
+ />
45
+ </div>
46
+ )}
47
+ </div>
48
+ </StackItem.Content>
49
+ );
50
+ };
51
+
52
+ const Card = ({ data: subject }: { data: Obj.Any }) => {
53
+ const data = useMemo(() => ({ subject }), [subject]);
54
+ return <Surface role='card' data={data} limit={1} />;
55
+ };
56
+
57
+ // TODO(wittjosiah): This is a hack. ECHO needs to have a back reference index to easily query for related objects.
58
+ const useRelatedObjects = (
59
+ space?: Space,
60
+ record?: Obj.Any,
61
+ options: { references?: boolean; relations?: boolean } = {},
62
+ ) => {
63
+ const objects = useQuery(space, Filter.everything());
64
+ return useMemo(() => {
65
+ if (!record) {
66
+ return [];
67
+ }
68
+
69
+ const related: Obj.Any[] = [];
70
+
71
+ // TODO(burdon): Change Person => Organization to relations.
72
+ if (options.references) {
73
+ const getReferences = (obj: Obj.Any): Ref.Any[] => {
74
+ return Object.getOwnPropertyNames(obj)
75
+ .map((name) => obj[name as keyof Obj.Any])
76
+ .filter((value) => Ref.isRef(value)) as Ref.Any[];
77
+ };
78
+
79
+ const references = getReferences(record);
80
+ const referenceTargets = references.map((ref) => ref.target).filter(isNonNullable);
81
+ const referenceSources = objects.filter((obj) => {
82
+ const refs = getReferences(obj);
83
+ return refs.some((ref) => ref.target === record);
84
+ });
85
+
86
+ related.push(...referenceTargets, ...referenceSources);
87
+ }
88
+
89
+ if (options.relations) {
90
+ // TODO(dmaretskyi): Workaround until https://github.com/dxos/dxos/pull/10100 lands.
91
+ const isValidRelation = (obj: Obj.Any) => {
92
+ try {
93
+ return Relation.isRelation(obj) && Relation.getSource(obj) && Relation.getTarget(obj);
94
+ } catch {
95
+ return false;
96
+ }
97
+ };
98
+
99
+ const relations = objects.filter((obj) => Relation.isRelation(obj)).filter((obj) => isValidRelation(obj));
100
+ const targetObjects = relations
101
+ .filter((relation) => Relation.getTarget(relation) === record)
102
+ .map((relation) => Relation.getSource(relation));
103
+ const sourceObjects = relations
104
+ .filter((relation) => Relation.getSource(relation) === record)
105
+ .map((relation) => Relation.getTarget(relation));
106
+
107
+ related.push(...targetObjects, ...sourceObjects);
108
+ }
109
+
110
+ return related;
111
+ }, [record, objects]);
112
+ };
113
+
114
+ export default RecordArticle;
@@ -14,32 +14,11 @@ import { meta } from '../meta';
14
14
 
15
15
  type SchemaPanelProps = { space: Space };
16
16
 
17
- // TODO(ZaymonFC):
18
- // - Support deleting Schema. This should tie in to some sort of
19
- // 'DangerZone™️' / 'Are you really sure?' / 'this might have consequences' component.
20
-
21
- /**
22
- * Subscribe to and retrieve all schemas from a space's schema registry.
23
- */
24
- export const useQuerySpaceSchemas = (space: Space): Type.Schema[] => {
25
- const [schemas, setSchemas] = useState<Type.Schema[]>([]);
26
-
27
- useEffect(() => {
28
- const query = space.db.schemaRegistry.query();
29
- const initialResults = query.runSync();
30
- setSchemas(initialResults);
31
-
32
- const unsubscribe = query.subscribe(() => setSchemas(query.results));
33
- return () => unsubscribe();
34
- }, [space]);
35
-
36
- return schemas;
37
- };
38
-
39
17
  export const SchemaContainer = ({ space }: SchemaPanelProps) => {
40
18
  const { t } = useTranslation(meta.id);
41
19
  const schemas = useQuerySpaceSchemas(space);
42
20
 
21
+ // TODO(ZaymonFC): Support deleting Schema (DangerZone section).
43
22
  return (
44
23
  <StackItem.Content scrollable>
45
24
  <ControlPage>
@@ -47,8 +26,8 @@ export const SchemaContainer = ({ space }: SchemaPanelProps) => {
47
26
  <div role='none' className={controlItemClasses}>
48
27
  {schemas.length === 0 && <div className='text-center plb-4'>{t('no schemas found message')}</div>}
49
28
  {schemas.map((schema) => (
50
- <div key={schema.id}>
51
- <div>{schema.typename}</div>
29
+ <div role='none' key={schema.id}>
30
+ {schema.typename}
52
31
  </div>
53
32
  ))}
54
33
  </div>
@@ -57,3 +36,21 @@ export const SchemaContainer = ({ space }: SchemaPanelProps) => {
57
36
  </StackItem.Content>
58
37
  );
59
38
  };
39
+
40
+ /**
41
+ * Subscribe to and retrieve all schemas from a space's schema registry.
42
+ */
43
+ export const useQuerySpaceSchemas = (space: Space): Type.Schema[] => {
44
+ const [schemas, setSchemas] = useState<Type.Schema[]>([]);
45
+
46
+ useEffect(() => {
47
+ const query = space.db.schemaRegistry.query();
48
+ const initialResults = query.runSync();
49
+ setSchemas(initialResults);
50
+
51
+ const unsubscribe = query.subscribe(() => setSchemas(query.results));
52
+ return () => unsubscribe();
53
+ }, [space]);
54
+
55
+ return schemas;
56
+ };