@dxos/plugin-space 0.8.4-main.2e9d522 → 0.8.4-main.3c1ae3b

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 (389) hide show
  1. package/dist/lib/browser/{CollectionMain-D2B75XBS.mjs → CollectionArticle-WTHWY4YS.mjs} +10 -10
  2. package/dist/lib/browser/CollectionArticle-WTHWY4YS.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectCardStack-TE7AWPMH.mjs +144 -0
  4. package/dist/lib/browser/ObjectCardStack-TE7AWPMH.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectDetails-666IBRHE.mjs +144 -0
  6. package/dist/lib/browser/ObjectDetails-666IBRHE.mjs.map +7 -0
  7. package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs +116 -0
  8. package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-USKWFIDK.mjs +551 -0
  10. package/dist/lib/browser/app-graph-builder-USKWFIDK.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-H6AW7KGS.mjs → app-graph-serializer-SXIQ425K.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-SXIQ425K.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-VLBRSGJ2.mjs → chunk-5CSSKOWR.mjs} +42 -16
  14. package/dist/lib/browser/chunk-5CSSKOWR.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-C6DAPIFF.mjs +20 -0
  16. package/dist/lib/browser/chunk-C6DAPIFF.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-E4BEMEZ3.mjs +399 -0
  18. package/dist/lib/browser/chunk-E4BEMEZ3.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-XUYKJUU7.mjs → chunk-IJCMB5B5.mjs} +269 -145
  20. package/dist/lib/browser/chunk-IJCMB5B5.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-QACNNDOT.mjs → chunk-POFUXISV.mjs} +69 -62
  22. package/dist/lib/browser/chunk-POFUXISV.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-V7MJSSBQ.mjs → chunk-XKQCDLXX.mjs} +734 -615
  28. package/dist/lib/browser/chunk-XKQCDLXX.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 +92 -139
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-TIXVDYN7.mjs → intent-resolver-QEIM7NQT.mjs} +118 -109
  34. package/dist/lib/browser/intent-resolver-QEIM7NQT.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-T6ZETLD2.mjs +30 -0
  37. package/dist/lib/browser/react-root-T6ZETLD2.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-TPNLWJJH.mjs → react-surface-MLN5BZ2G.mjs} +120 -120
  39. package/dist/lib/browser/react-surface-MLN5BZ2G.mjs.map +7 -0
  40. package/dist/lib/browser/repair-CNLE35NF.mjs +44 -0
  41. package/dist/lib/browser/repair-CNLE35NF.mjs.map +7 -0
  42. package/dist/lib/browser/{settings-4IMP5RYT.mjs → settings-EGTCHS7U.mjs} +5 -5
  43. package/dist/lib/browser/{settings-4IMP5RYT.mjs.map → settings-EGTCHS7U.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-TOPG6IV4.mjs → spaces-ready-YS4BBZXW.mjs} +29 -20
  45. package/dist/lib/browser/spaces-ready-YS4BBZXW.mjs.map +7 -0
  46. package/dist/lib/browser/{state-QYZAB45H.mjs → state-C7N6EDDZ.mjs} +7 -7
  47. package/dist/lib/browser/state-C7N6EDDZ.mjs.map +7 -0
  48. package/dist/lib/browser/types/index.mjs +10 -4
  49. package/dist/lib/node-esm/{CollectionMain-ZJIFCWKZ.mjs → CollectionArticle-KHXYT3SH.mjs} +10 -10
  50. package/dist/lib/node-esm/CollectionArticle-KHXYT3SH.mjs.map +7 -0
  51. package/dist/lib/node-esm/ObjectCardStack-AAKMAQ6T.mjs +145 -0
  52. package/dist/lib/node-esm/ObjectCardStack-AAKMAQ6T.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectDetails-TZ5YKXGN.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectDetails-TZ5YKXGN.mjs.map +7 -0
  55. package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs +117 -0
  56. package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs.map +7 -0
  57. package/dist/lib/node-esm/app-graph-builder-QRQ5EQLB.mjs +552 -0
  58. package/dist/lib/node-esm/app-graph-builder-QRQ5EQLB.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-2ICUGQQT.mjs → app-graph-serializer-P2X4W7LI.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-P2X4W7LI.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-4AOMYKDE.mjs → chunk-3D4NGZPW.mjs} +269 -145
  62. package/dist/lib/node-esm/chunk-3D4NGZPW.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-P442DOQ3.mjs → chunk-AX3UGL5D.mjs} +69 -62
  64. package/dist/lib/node-esm/chunk-AX3UGL5D.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
  66. package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-H4JILUJK.mjs +20 -0
  68. package/dist/lib/node-esm/chunk-H4JILUJK.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-QQQE2ZCX.mjs +400 -0
  70. package/dist/lib/node-esm/chunk-QQQE2ZCX.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs → chunk-UMZ7G6G4.mjs} +41 -16
  72. package/dist/lib/node-esm/chunk-UMZ7G6G4.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-WWGV5FJM.mjs +21 -0
  74. package/dist/lib/node-esm/chunk-WWGV5FJM.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-6X5DLJM5.mjs → chunk-XD532BVR.mjs} +734 -615
  76. package/dist/lib/node-esm/chunk-XD532BVR.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 +92 -139
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-MHGHRGDT.mjs → intent-resolver-ZWCBVABN.mjs} +118 -109
  82. package/dist/lib/node-esm/intent-resolver-ZWCBVABN.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-KW3TGJGY.mjs → react-root-SKB4UJ4K.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-SKB4UJ4K.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-UUIUUD6P.mjs → react-surface-BVZGNSBB.mjs} +120 -120
  87. package/dist/lib/node-esm/react-surface-BVZGNSBB.mjs.map +7 -0
  88. package/dist/lib/node-esm/repair-EHZS6MFY.mjs +45 -0
  89. package/dist/lib/node-esm/repair-EHZS6MFY.mjs.map +7 -0
  90. package/dist/lib/node-esm/{settings-SAOBPND3.mjs → settings-N3F6JCIR.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-SAOBPND3.mjs.map → settings-N3F6JCIR.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-HIUKNDZK.mjs → spaces-ready-U2K5P4LB.mjs} +29 -20
  93. package/dist/lib/node-esm/spaces-ready-U2K5P4LB.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-ZVEHQ4BJ.mjs → state-45TXZQJ6.mjs} +7 -7
  95. package/dist/lib/node-esm/state-45TXZQJ6.mjs.map +7 -0
  96. package/dist/lib/node-esm/types/index.mjs +10 -4
  97. package/dist/types/src/SpacePlugin.d.ts +1 -1
  98. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder.d.ts +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 -8
  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/repair.d.ts +4 -0
  115. package/dist/types/src/capabilities/repair.d.ts.map +1 -0
  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 +3 -3
  127. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  128. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1588 -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 +18 -9
  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 +1591 -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/ObjectCardStack/ObjectCardStack.d.ts +8 -0
  145. package/dist/types/src/components/ObjectCardStack/ObjectCardStack.d.ts.map +1 -0
  146. package/dist/types/src/components/ObjectCardStack/ObjectForm.d.ts +9 -0
  147. package/dist/types/src/components/ObjectCardStack/ObjectForm.d.ts.map +1 -0
  148. package/dist/types/src/components/ObjectCardStack/index.d.ts +3 -0
  149. package/dist/types/src/components/ObjectCardStack/index.d.ts.map +1 -0
  150. package/dist/types/src/components/{ObjectSettings → ObjectDetails}/BaseObjectSettings.d.ts +2 -2
  151. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.d.ts.map +1 -0
  152. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts +1424 -0
  153. package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts.map +1 -0
  154. package/dist/types/src/components/ObjectDetails/ForeignKeys.d.ts +8 -0
  155. package/dist/types/src/components/ObjectDetails/ForeignKeys.d.ts.map +1 -0
  156. package/dist/types/src/components/ObjectDetails/ObjectDetails.d.ts +8 -0
  157. package/dist/types/src/components/ObjectDetails/ObjectDetails.d.ts.map +1 -0
  158. package/dist/types/src/components/ObjectDetails/index.d.ts +3 -0
  159. package/dist/types/src/components/ObjectDetails/index.d.ts.map +1 -0
  160. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  161. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  162. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  163. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  164. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  165. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  166. package/dist/types/src/components/RecordArticle.stories.d.ts +1591 -0
  167. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  168. package/dist/types/src/components/SchemaContainer.d.ts +2 -2
  169. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  170. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  171. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +6 -5
  172. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  173. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts +1421 -0
  174. package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts.map +1 -0
  175. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  176. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  177. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  178. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  179. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  180. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  181. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +1 -1
  182. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  183. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1421 -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.map +1 -1
  186. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1422 -5
  187. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  188. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  189. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  190. package/dist/types/src/components/index.d.ts +10 -12
  191. package/dist/types/src/components/index.d.ts.map +1 -1
  192. package/dist/types/src/events.d.ts.map +1 -1
  193. package/dist/types/src/helpers/index.d.ts +2 -0
  194. package/dist/types/src/helpers/index.d.ts.map +1 -0
  195. package/dist/types/src/helpers/query.d.ts +7 -0
  196. package/dist/types/src/helpers/query.d.ts.map +1 -0
  197. package/dist/types/src/helpers/query.test.d.ts +2 -0
  198. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  199. package/dist/types/src/hooks/index.d.ts +1 -0
  200. package/dist/types/src/hooks/index.d.ts.map +1 -1
  201. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  202. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +2 -8
  203. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  204. package/dist/types/src/hooks/usePath.d.ts +1 -1
  205. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  206. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  207. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  208. package/dist/types/src/index.d.ts +1 -0
  209. package/dist/types/src/index.d.ts.map +1 -1
  210. package/dist/types/src/meta.d.ts +0 -1
  211. package/dist/types/src/meta.d.ts.map +1 -1
  212. package/dist/types/src/translations.d.ts +1261 -67
  213. package/dist/types/src/translations.d.ts.map +1 -1
  214. package/dist/types/src/types/form.d.ts +22 -0
  215. package/dist/types/src/types/form.d.ts.map +1 -0
  216. package/dist/types/src/types/index.d.ts +1 -0
  217. package/dist/types/src/types/index.d.ts.map +1 -1
  218. package/dist/types/src/types/types.d.ts +96 -157
  219. package/dist/types/src/types/types.d.ts.map +1 -1
  220. package/dist/types/src/util.d.ts +25 -36
  221. package/dist/types/src/util.d.ts.map +1 -1
  222. package/dist/types/tsconfig.tsbuildinfo +1 -1
  223. package/package.json +70 -59
  224. package/src/SpacePlugin.ts +182 -222
  225. package/src/capabilities/app-graph-builder.ts +271 -246
  226. package/src/capabilities/app-graph-serializer.ts +12 -12
  227. package/src/capabilities/capabilities.ts +28 -17
  228. package/src/capabilities/identity-created.ts +3 -3
  229. package/src/capabilities/index.ts +1 -2
  230. package/src/capabilities/intent-resolver.ts +92 -81
  231. package/src/capabilities/react-root.tsx +6 -4
  232. package/src/capabilities/react-surface.tsx +127 -155
  233. package/src/capabilities/repair.ts +57 -0
  234. package/src/capabilities/spaces-ready.ts +38 -17
  235. package/src/capabilities/state.ts +5 -4
  236. package/src/components/AwaitingObject.tsx +12 -14
  237. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
  238. package/src/components/CollectionSection.tsx +8 -6
  239. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +17 -16
  240. package/src/components/CreateDialog/CreateObjectDialog.tsx +74 -46
  241. package/src/components/CreateDialog/CreateObjectPanel.tsx +65 -43
  242. package/src/components/CreateDialog/CreateSpaceDialog.tsx +45 -22
  243. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  244. package/src/components/JoinDialog/index.ts +5 -0
  245. package/src/components/MembersContainer/MembersContainer.stories.tsx +56 -0
  246. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +22 -21
  247. package/src/components/MembersContainer/index.ts +5 -0
  248. package/src/components/MenuFooter.tsx +2 -2
  249. package/src/components/ObjectCardStack/ObjectCardStack.tsx +64 -0
  250. package/src/components/ObjectCardStack/ObjectForm.tsx +90 -0
  251. package/src/components/ObjectCardStack/index.ts +7 -0
  252. package/src/components/ObjectDetails/BaseObjectSettings.stories.tsx +63 -0
  253. package/src/components/ObjectDetails/BaseObjectSettings.tsx +118 -0
  254. package/src/components/{ObjectSettings → ObjectDetails}/ForeignKeys.tsx +8 -8
  255. package/src/components/ObjectDetails/ObjectDetails.tsx +35 -0
  256. package/src/components/ObjectDetails/index.ts +7 -0
  257. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +10 -16
  258. package/src/components/ObjectRenamePopover/index.ts +5 -0
  259. package/src/components/RecordArticle.stories.tsx +115 -0
  260. package/src/components/RecordArticle.tsx +114 -0
  261. package/src/components/SchemaContainer.tsx +26 -29
  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 +190 -155
  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 +109 -12
  273. package/src/components/ViewEditor.tsx +56 -23
  274. package/src/components/index.ts +7 -7
  275. package/src/events.ts +7 -7
  276. package/src/helpers/index.ts +5 -0
  277. package/src/helpers/query.test.ts +24 -0
  278. package/src/helpers/query.ts +152 -0
  279. package/src/hooks/index.ts +1 -0
  280. package/src/hooks/useActiveSpace.ts +3 -2
  281. package/src/hooks/useInputSurfaceLookup.tsx +9 -13
  282. package/src/hooks/usePath.ts +1 -1
  283. package/src/hooks/useTypeOptions.ts +25 -0
  284. package/src/index.ts +1 -0
  285. package/src/meta.ts +6 -3
  286. package/src/translations.ts +68 -58
  287. package/src/types/form.ts +69 -0
  288. package/src/types/index.ts +1 -0
  289. package/src/types/types.ts +51 -52
  290. package/src/util.tsx +269 -147
  291. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +0 -7
  292. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs +0 -88
  293. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs.map +0 -7
  294. package/dist/lib/browser/app-graph-builder-7CZZJS3S.mjs +0 -479
  295. package/dist/lib/browser/app-graph-builder-7CZZJS3S.mjs.map +0 -7
  296. package/dist/lib/browser/app-graph-serializer-H6AW7KGS.mjs.map +0 -7
  297. package/dist/lib/browser/chunk-CEFHNVU7.mjs +0 -20
  298. package/dist/lib/browser/chunk-CEFHNVU7.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  300. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  301. package/dist/lib/browser/chunk-JS3MMC42.mjs +0 -19
  302. package/dist/lib/browser/chunk-JS3MMC42.mjs.map +0 -7
  303. package/dist/lib/browser/chunk-QACNNDOT.mjs.map +0 -7
  304. package/dist/lib/browser/chunk-SGTQ52SU.mjs +0 -338
  305. package/dist/lib/browser/chunk-SGTQ52SU.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-V7MJSSBQ.mjs.map +0 -7
  307. package/dist/lib/browser/chunk-VLBRSGJ2.mjs.map +0 -7
  308. package/dist/lib/browser/chunk-XUYKJUU7.mjs.map +0 -7
  309. package/dist/lib/browser/identity-created-23XJJV2N.mjs.map +0 -7
  310. package/dist/lib/browser/intent-resolver-TIXVDYN7.mjs.map +0 -7
  311. package/dist/lib/browser/react-root-N2J7TDRX.mjs +0 -29
  312. package/dist/lib/browser/react-root-N2J7TDRX.mjs.map +0 -7
  313. package/dist/lib/browser/react-surface-TPNLWJJH.mjs.map +0 -7
  314. package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs +0 -26
  315. package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs.map +0 -7
  316. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs +0 -124
  317. package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
  318. package/dist/lib/browser/spaces-ready-TOPG6IV4.mjs.map +0 -7
  319. package/dist/lib/browser/state-QYZAB45H.mjs.map +0 -7
  320. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +0 -7
  321. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs +0 -89
  322. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs.map +0 -7
  323. package/dist/lib/node-esm/app-graph-builder-KGIGWC72.mjs +0 -480
  324. package/dist/lib/node-esm/app-graph-builder-KGIGWC72.mjs.map +0 -7
  325. package/dist/lib/node-esm/app-graph-serializer-2ICUGQQT.mjs.map +0 -7
  326. package/dist/lib/node-esm/chunk-4AOMYKDE.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-5HHYE264.mjs +0 -20
  328. package/dist/lib/node-esm/chunk-5HHYE264.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs +0 -21
  330. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-6X5DLJM5.mjs.map +0 -7
  332. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  333. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-JH6F4C3I.mjs +0 -339
  335. package/dist/lib/node-esm/chunk-JH6F4C3I.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-P442DOQ3.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-SSLBYZEY.mjs.map +0 -7
  338. package/dist/lib/node-esm/identity-created-IJQO6GCR.mjs.map +0 -7
  339. package/dist/lib/node-esm/intent-resolver-MHGHRGDT.mjs.map +0 -7
  340. package/dist/lib/node-esm/react-root-KW3TGJGY.mjs.map +0 -7
  341. package/dist/lib/node-esm/react-surface-UUIUUD6P.mjs.map +0 -7
  342. package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs +0 -27
  343. package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs.map +0 -7
  344. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs +0 -126
  345. package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
  346. package/dist/lib/node-esm/spaces-ready-HIUKNDZK.mjs.map +0 -7
  347. package/dist/lib/node-esm/state-ZVEHQ4BJ.mjs.map +0 -7
  348. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  349. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  350. package/dist/types/src/capabilities/schema-tool.test.d.ts +0 -2
  351. package/dist/types/src/capabilities/schema-tool.test.d.ts.map +0 -1
  352. package/dist/types/src/capabilities/schema-tools.d.ts +0 -13
  353. package/dist/types/src/capabilities/schema-tools.d.ts.map +0 -1
  354. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  355. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  356. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  357. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  358. package/dist/types/src/components/MembersContainer.stories.d.ts +0 -8
  359. package/dist/types/src/components/MembersContainer.stories.d.ts.map +0 -1
  360. package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
  361. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
  362. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts +0 -7
  363. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +0 -1
  364. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +0 -1
  365. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +0 -8
  366. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +0 -1
  367. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts +0 -8
  368. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +0 -1
  369. package/dist/types/src/components/ObjectSettings/index.d.ts +0 -2
  370. package/dist/types/src/components/ObjectSettings/index.d.ts.map +0 -1
  371. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  372. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  373. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  374. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  375. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  376. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  377. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  378. package/dist/types/src/components/SpacePresence.stories.d.ts +0 -9
  379. package/dist/types/src/components/SpacePresence.stories.d.ts.map +0 -1
  380. package/src/capabilities/schema-defs.ts +0 -30
  381. package/src/capabilities/schema-tool.test.ts +0 -44
  382. package/src/capabilities/schema-tools.ts +0 -125
  383. package/src/components/MembersContainer.stories.tsx +0 -30
  384. package/src/components/ObjectDetailsPanel.tsx +0 -77
  385. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +0 -80
  386. package/src/components/ObjectSettings/BaseObjectSettings.tsx +0 -47
  387. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +0 -36
  388. package/src/components/ObjectSettings/index.ts +0 -5
  389. package/src/components/PersistenceStatus.tsx +0 -83
@@ -0,0 +1,118 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { batch } from '@preact/signals-core';
6
+ import * as Function from 'effect/Function';
7
+ import * as Option from 'effect/Option';
8
+ import * as Schema from 'effect/Schema';
9
+ import React, { type PropsWithChildren, useCallback, useMemo } from 'react';
10
+
11
+ import { DXN, Obj, type Ref, Tag, Type } from '@dxos/echo';
12
+ import { type JsonPath, setValue } from '@dxos/echo/internal';
13
+ import { invariant } from '@dxos/invariant';
14
+ import { getSpace } from '@dxos/react-client/echo';
15
+ import { type ThemedClassName } from '@dxos/react-ui';
16
+ import { Form, omitId, useRefQueryOptions } from '@dxos/react-ui-form';
17
+ import { isNonNullable } from '@dxos/util';
18
+
19
+ import { meta as pluginMeta } from '../../meta';
20
+
21
+ // TODO(wittjosiah): Would be nice to control order when extending so this isn't always first/last.
22
+ const BaseSchema = Schema.Struct({
23
+ tags: Schema.Array(Type.Ref(Tag.Tag)).pipe(Schema.optional),
24
+ });
25
+
26
+ // TODO(wittjosiah): Better way to support validation of object schemas?
27
+ const TagSchema = Tag.Tag.pipe(Schema.omit('id'));
28
+
29
+ export type BaseObjectSettingsProps = ThemedClassName<
30
+ PropsWithChildren<{
31
+ object: Obj.Any;
32
+ }>
33
+ >;
34
+
35
+ // TODO(wittjosiah): Reconcile w/ ObjectDetailsPanel.
36
+ export const BaseObjectSettings = ({ classNames, children, object }: BaseObjectSettingsProps) => {
37
+ const space = getSpace(object);
38
+ const handleRefQueryLookup = useRefQueryOptions({ space });
39
+
40
+ const formSchema = useMemo(() => {
41
+ return Function.pipe(
42
+ Obj.getSchema(object),
43
+ Option.fromNullable,
44
+ Option.map((schema) => BaseSchema.pipe(Schema.extend(schema))),
45
+ Option.getOrUndefined,
46
+ );
47
+ }, [object]);
48
+
49
+ const meta = Obj.getMeta(object);
50
+ const tags = (meta.tags ?? []).map((tag) => space?.db.makeRef(DXN.parse(tag))).filter(isNonNullable);
51
+ const values = useMemo(
52
+ () => ({
53
+ tags,
54
+ ...object,
55
+ }),
56
+ [object, tags],
57
+ );
58
+
59
+ const handleCreateTag = useCallback((values: Schema.Schema.Type<typeof TagSchema>) => {
60
+ invariant(space);
61
+ const tag = space.db.add(Tag.make(values));
62
+ const meta = Obj.getMeta(object);
63
+ meta.tags = [...(meta.tags ?? []), Obj.getDXN(tag).toString()];
64
+ }, []);
65
+
66
+ // TODO(wittjosiah): Use FormRootProps type.
67
+ const handleChange = useCallback(
68
+ (
69
+ { tags, ...values }: Schema.Schema.Type<typeof formSchema>,
70
+ { isValid, changed }: { isValid: boolean; changed: Record<JsonPath, boolean> },
71
+ ) => {
72
+ if (!isValid) {
73
+ return;
74
+ }
75
+
76
+ const changedPaths = Object.keys(changed).filter((path) => changed[path as JsonPath]) as JsonPath[];
77
+ batch(() => {
78
+ for (const path of changedPaths) {
79
+ // TODO(wittjosiah): This doesn't handle array paths well.
80
+ if (path.startsWith('tags')) {
81
+ const meta = Obj.getMeta(object);
82
+ meta.tags = tags?.map((tag: Ref.Ref<Tag.Tag>) => tag.dxn.toString()) ?? [];
83
+ continue;
84
+ }
85
+
86
+ const value = values[path];
87
+ setValue(object, path, value);
88
+ }
89
+ });
90
+ },
91
+ [object],
92
+ );
93
+
94
+ if (!formSchema) {
95
+ return null;
96
+ }
97
+
98
+ return (
99
+ <Form.Root
100
+ schema={omitId(formSchema)}
101
+ values={values}
102
+ createSchema={TagSchema}
103
+ createOptionIcon='ph--plus--regular'
104
+ createOptionLabel={['add tag label', { ns: pluginMeta.id }]}
105
+ createInitialValuePath='label'
106
+ onValuesChanged={handleChange}
107
+ onCreate={handleCreateTag}
108
+ onQueryRefOptions={handleRefQueryLookup}
109
+ >
110
+ <Form.Viewport>
111
+ <Form.Content classNames={classNames}>
112
+ <Form.FieldSet />
113
+ {children}
114
+ </Form.Content>
115
+ </Form.Viewport>
116
+ </Form.Root>
117
+ );
118
+ };
@@ -4,14 +4,14 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { type ForeignKey } from '@dxos/echo-schema';
7
+ import { type Key } from '@dxos/echo';
8
8
  import { IconButton, List, ListItem, useTranslation } from '@dxos/react-ui';
9
9
 
10
- import { SPACE_PLUGIN } from '../../meta';
10
+ import { meta } from '../../meta';
11
11
 
12
12
  export type ForeignKeysProps = {
13
- keys: ForeignKey[];
14
- onDelete?: (key: ForeignKey) => void;
13
+ keys: Key.ForeignKey[];
14
+ onDelete?: (key: Key.ForeignKey) => void;
15
15
  };
16
16
 
17
17
  // TODO(wittjosiah): This is a clone of `TokenManager`. Consider a form variant for arrays of read-only objects.
@@ -26,19 +26,19 @@ export const ForeignKeys = ({ keys, onDelete }: ForeignKeysProps) => {
26
26
  };
27
27
 
28
28
  type KeyItemProps = {
29
- forignKey: ForeignKey;
30
- onDelete?: (key: ForeignKey) => void;
29
+ forignKey: Key.ForeignKey;
30
+ onDelete?: (key: Key.ForeignKey) => void;
31
31
  };
32
32
 
33
33
  const KeyItem = ({ forignKey, onDelete }: KeyItemProps) => {
34
- const { t } = useTranslation(SPACE_PLUGIN);
34
+ const { t } = useTranslation(meta.id);
35
35
 
36
36
  const handleDelete = useCallback(() => {
37
37
  onDelete?.(forignKey);
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>
@@ -0,0 +1,35 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { forwardRef, useMemo } from 'react';
6
+
7
+ import { Surface } from '@dxos/app-framework/react';
8
+ import { type Obj } from '@dxos/echo';
9
+ import { Toolbar } from '@dxos/react-ui';
10
+ import { StackItem } from '@dxos/react-ui-stack';
11
+
12
+ import { BaseObjectSettings } from './BaseObjectSettings';
13
+
14
+ export type ObjectDetailsProps = {
15
+ object: Obj.Any;
16
+ role: string;
17
+ };
18
+
19
+ export const ObjectDetails = forwardRef<HTMLDivElement, ObjectDetailsProps>(
20
+ ({ object }: ObjectDetailsProps, forwardedRef) => {
21
+ const data = useMemo(() => ({ subject: object }), [object]);
22
+
23
+ return (
24
+ <StackItem.Content ref={forwardedRef} toolbar>
25
+ <Toolbar.Root />
26
+ <BaseObjectSettings object={object}>
27
+ <Surface role='base-object-settings' data={data} />
28
+ <Surface role='object-settings' data={data} />
29
+ {/* TODO(wittjosiah): Remove (or add as surface)? */}
30
+ {/* <AdvancedObjectSettings object={object} /> */}
31
+ </BaseObjectSettings>
32
+ </StackItem.Content>
33
+ );
34
+ },
35
+ );
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { ObjectDetails } from './ObjectDetails';
6
+
7
+ export default ObjectDetails;
@@ -4,33 +4,27 @@
4
4
 
5
5
  import React, { useCallback, useRef, useState } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
- import { type Live } from '@dxos/live-object';
7
+ import { LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
9
+ import { Obj } from '@dxos/echo';
9
10
  import { log } from '@dxos/log';
10
11
  import { Button, Input, useTranslation } from '@dxos/react-ui';
11
12
 
12
- import { SPACE_PLUGIN } from '../meta';
13
+ import { meta } from '../../meta';
13
14
 
14
- export const POPOVER_RENAME_OBJECT = `${SPACE_PLUGIN}/PopoverRenameObject`;
15
+ export const OBJECT_RENAME_POPOVER = `${meta.id}/ObjectRenamePopover`;
15
16
 
16
- export const PopoverRenameObject = ({ object: obj }: { object: Live<any> }) => {
17
- const { t } = useTranslation(SPACE_PLUGIN);
17
+ export const ObjectRenamePopover = ({ object }: { object: Obj.Any }) => {
18
+ const { t } = useTranslation(meta.id);
18
19
  const doneButton = useRef<HTMLButtonElement>(null);
19
- // TODO(wittjosiah): Use schema here.
20
- const object = obj as any;
21
- // TODO(burdon): Field should not be hardcoded field.
22
- const [name, setName] = useState(object.name || object.title || '');
20
+ const [name, setName] = useState(Obj.getLabel(object));
23
21
  const { dispatchPromise: dispatch } = useIntentDispatcher();
24
22
 
25
23
  const handleDone = useCallback(() => {
26
24
  try {
27
- object.name = name;
25
+ name && Obj.setLabel(object, name);
28
26
  } catch (err) {
29
- try {
30
- object.title = name;
31
- } catch {
32
- log.error('Failed to rename object', { err });
33
- }
27
+ log.error('Failed to rename object', { err });
34
28
  }
35
29
  void dispatch(
36
30
  createIntent(LayoutAction.UpdatePopover, {
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './ObjectRenamePopover';
@@ -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 subject={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 { type Entity, 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 = ({ subject }: SurfaceComponentProps) => {
20
+ const { t } = useTranslation(meta.id);
21
+ const space = getSpace(subject);
22
+ const data = useMemo(() => ({ subject }), [subject]);
23
+ const related = useRelatedObjects(space, subject, {
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<Entity.Unknown>
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: Entity.Unknown }) => {
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: Entity.Unknown[] = [];
70
+
71
+ // TODO(burdon): Change Person => Organization to relations.
72
+ if (options.references) {
73
+ const getReferences = (obj: Entity.Unknown): 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: Relation.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;
@@ -2,53 +2,32 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useState, useEffect } from 'react';
5
+ import React, { useEffect, useState } from 'react';
6
6
 
7
7
  import { type Type } from '@dxos/echo';
8
8
  import { type Space } from '@dxos/react-client/echo';
9
9
  import { useTranslation } from '@dxos/react-ui';
10
- import { controlItemClasses, ControlPage, ControlSection } from '@dxos/react-ui-form';
10
+ import { ControlPage, ControlSection, controlItemClasses } from '@dxos/react-ui-form';
11
11
  import { StackItem } from '@dxos/react-ui-stack';
12
12
 
13
- import { SPACE_PLUGIN } from '../meta';
13
+ 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
- const { t } = useTranslation(SPACE_PLUGIN);
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
- <StackItem.Content classNames='block overflow-y-auto'>
23
+ <StackItem.Content scrollable>
45
24
  <ControlPage>
46
25
  <ControlSection title={t('schema verbose label')} description={t('schema description')}>
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.RuntimeType[] => {
44
+ const [schemas, setSchemas] = useState<Type.RuntimeType[]>([]);
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
+ };
@@ -4,40 +4,45 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
8
9
  import { useClient } from '@dxos/react-client';
9
10
  import { useSpaces } from '@dxos/react-client/echo';
10
- import { Input, toLocalizedString, useTranslation, List, ListItem, IconButton } from '@dxos/react-ui';
11
- import { controlItemClasses, ControlPage, ControlSection, DeprecatedFormInput } from '@dxos/react-ui-form';
11
+ import { IconButton, Input, List, ListItem, toLocalizedString, useTranslation } from '@dxos/react-ui';
12
+ import { ControlGroup, ControlItemInput, ControlPage, ControlSection, controlItemClasses } from '@dxos/react-ui-form';
12
13
 
13
- import { SPACE_PLUGIN } from '../meta';
14
+ import { meta } from '../meta';
14
15
  import { SpaceAction, type SpaceSettingsProps } from '../types';
15
16
  import { getSpaceDisplayName } from '../util';
16
17
 
17
18
  export const SpacePluginSettings = ({ settings }: { settings: SpaceSettingsProps }) => {
18
- const { t } = useTranslation(SPACE_PLUGIN);
19
+ const { t } = useTranslation(meta.id);
19
20
  const client = useClient();
20
21
  const spaces = useSpaces({ all: settings.showHidden });
21
22
  const { dispatchPromise: dispatch } = useIntentDispatcher();
22
23
 
23
- // TODO(wittjosiah): Migrate to new form container.
24
24
  return (
25
25
  <ControlPage>
26
26
  <ControlSection title={t('space settings label')} description={t('space settings description')}>
27
- <div className='pli-trimMd container-max-width'>
28
- <DeprecatedFormInput label={t('show hidden spaces label')}>
27
+ <ControlGroup>
28
+ <ControlItemInput title={t('show hidden spaces label')}>
29
29
  <Input.Switch
30
30
  checked={settings.showHidden}
31
31
  onCheckedChange={(checked) => (settings.showHidden = !!checked)}
32
32
  />
33
- </DeprecatedFormInput>
34
- </div>
33
+ </ControlItemInput>
34
+ </ControlGroup>
35
35
  <List classNames={[controlItemClasses, 'flex flex-col gap-trimSm']}>
36
36
  {spaces.map((space) => (
37
37
  <ListItem.Root key={space.id} classNames='is-full items-center'>
38
38
  {/* TODO(burdon): Should auto center and truncate; NOTE truncate doesn't work with flex grow. */}
39
39
  <ListItem.Heading classNames='grow truncate !min-bs-0'>
40
- {toLocalizedString(getSpaceDisplayName(space, { personal: space === client.spaces.default }), t)}
40
+ {toLocalizedString(
41
+ getSpaceDisplayName(space, {
42
+ personal: space === client.spaces.default,
43
+ }),
44
+ t,
45
+ )}
41
46
  </ListItem.Heading>
42
47
  <IconButton
43
48
  icon='ph--faders--regular'