@dxos/plugin-space 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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 (357) 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/ObjectDetailsPanel-ACGHWPDX.mjs +141 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-ACGHWPDX.mjs.map +7 -0
  5. package/dist/lib/browser/ObjectSettings-U3IH7BMV.mjs +144 -0
  6. package/dist/lib/browser/ObjectSettings-U3IH7BMV.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-HABMCWAI.mjs +517 -0
  10. package/dist/lib/browser/app-graph-builder-HABMCWAI.mjs.map +7 -0
  11. package/dist/lib/browser/{app-graph-serializer-3A6KBYWT.mjs → app-graph-serializer-G3VFEGTN.mjs} +19 -19
  12. package/dist/lib/browser/app-graph-serializer-G3VFEGTN.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-6A3NWBB6.mjs +392 -0
  14. package/dist/lib/browser/chunk-6A3NWBB6.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-DCY3W36E.mjs → chunk-GJOZILGC.mjs} +210 -142
  18. package/dist/lib/browser/chunk-GJOZILGC.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-J6YZG77T.mjs → chunk-KCZ527AM.mjs} +641 -500
  20. package/dist/lib/browser/chunk-KCZ527AM.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-ELJDGQTO.mjs → chunk-P25R3AOK.mjs} +35 -5
  22. package/dist/lib/browser/chunk-P25R3AOK.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-WAXS2ZVX.mjs → chunk-POFUXISV.mjs} +69 -62
  24. package/dist/lib/browser/chunk-POFUXISV.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-WJXU4GKV.mjs +19 -0
  28. package/dist/lib/browser/chunk-WJXU4GKV.mjs.map +7 -0
  29. package/dist/lib/browser/{identity-created-T6ZNVE7S.mjs → identity-created-NAXTPQXE.mjs} +5 -5
  30. package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +88 -131
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-7E3IZIJS.mjs → intent-resolver-RZEWNJ2K.mjs} +105 -100
  34. package/dist/lib/browser/intent-resolver-RZEWNJ2K.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/react-root-JCRD74GI.mjs +30 -0
  37. package/dist/lib/browser/react-root-JCRD74GI.mjs.map +7 -0
  38. package/dist/lib/browser/{react-surface-GL4CE2F4.mjs → react-surface-VOETEAG3.mjs} +91 -111
  39. package/dist/lib/browser/react-surface-VOETEAG3.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-B6MMHLPS.mjs → settings-TRLI52I5.mjs} +5 -5
  43. package/dist/lib/browser/{settings-B6MMHLPS.mjs.map → settings-TRLI52I5.mjs.map} +1 -1
  44. package/dist/lib/browser/{spaces-ready-QVABOCO3.mjs → spaces-ready-OHGCWZHQ.mjs} +22 -15
  45. package/dist/lib/browser/spaces-ready-OHGCWZHQ.mjs.map +7 -0
  46. package/dist/lib/browser/{state-2RGW7FQG.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/ObjectDetailsPanel-6OFTT3GG.mjs +142 -0
  52. package/dist/lib/node-esm/ObjectDetailsPanel-6OFTT3GG.mjs.map +7 -0
  53. package/dist/lib/node-esm/ObjectSettings-YXPJQMJ5.mjs +145 -0
  54. package/dist/lib/node-esm/ObjectSettings-YXPJQMJ5.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-T6VJKIOA.mjs +518 -0
  58. package/dist/lib/node-esm/app-graph-builder-T6VJKIOA.mjs.map +7 -0
  59. package/dist/lib/node-esm/{app-graph-serializer-M45TH5LR.mjs → app-graph-serializer-2NLWWFUB.mjs} +19 -19
  60. package/dist/lib/node-esm/app-graph-serializer-2NLWWFUB.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-Q6AAQLQG.mjs → chunk-7EV4SN47.mjs} +34 -5
  62. package/dist/lib/node-esm/chunk-7EV4SN47.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-HYIZVPOA.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-AUQ3SKL2.mjs → chunk-I6FZP42D.mjs} +210 -142
  70. package/dist/lib/node-esm/chunk-I6FZP42D.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-ZCEH2VYE.mjs → chunk-JAMGJUFU.mjs} +641 -500
  72. package/dist/lib/node-esm/chunk-JAMGJUFU.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-X34VDVMY.mjs +393 -0
  76. package/dist/lib/node-esm/chunk-X34VDVMY.mjs.map +7 -0
  77. package/dist/lib/node-esm/{identity-created-AL7NNCKH.mjs → identity-created-OXLKCJE3.mjs} +5 -5
  78. package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
  79. package/dist/lib/node-esm/index.mjs +88 -131
  80. package/dist/lib/node-esm/index.mjs.map +3 -3
  81. package/dist/lib/node-esm/{intent-resolver-UVO4MKWX.mjs → intent-resolver-4PHJWDXW.mjs} +105 -100
  82. package/dist/lib/node-esm/intent-resolver-4PHJWDXW.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/{react-root-5EKYI66P.mjs → react-root-O5I5CDJ7.mjs} +13 -12
  85. package/dist/lib/node-esm/react-root-O5I5CDJ7.mjs.map +7 -0
  86. package/dist/lib/node-esm/{react-surface-IOC6YSVQ.mjs → react-surface-J3XDMU2D.mjs} +91 -111
  87. package/dist/lib/node-esm/react-surface-J3XDMU2D.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-IOFU6EAS.mjs → settings-MNQTKHL7.mjs} +5 -5
  91. package/dist/lib/node-esm/{settings-IOFU6EAS.mjs.map → settings-MNQTKHL7.mjs.map} +1 -1
  92. package/dist/lib/node-esm/{spaces-ready-MS6GHPFR.mjs → spaces-ready-ZPU24DA2.mjs} +22 -15
  93. package/dist/lib/node-esm/spaces-ready-ZPU24DA2.mjs.map +7 -0
  94. package/dist/lib/node-esm/{state-7VBVBGNS.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.map +1 -1
  100. package/dist/types/src/capabilities/capabilities.d.ts +13 -7
  101. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/index.d.ts +1 -1
  103. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/repair.d.ts +4 -0
  108. package/dist/types/src/capabilities/repair.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
  110. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  111. package/dist/types/src/components/CollectionArticle.d.ts +6 -0
  112. package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
  113. package/dist/types/src/components/CollectionSection.d.ts +3 -4
  114. package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
  115. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +1 -1
  116. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  117. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +218 -215
  118. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +16 -9
  120. package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
  121. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
  122. package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
  123. package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +1 -1
  124. package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
  125. package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
  126. package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
  127. package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
  128. package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1591 -0
  129. package/dist/types/src/components/{MembersContainer.stories.d.ts.map → MembersContainer/MembersContainer.stories.d.ts.map} +1 -1
  130. package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
  131. package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
  132. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +9 -0
  133. package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -0
  134. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts +10 -0
  135. package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -0
  136. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts +3 -0
  137. package/dist/types/src/components/ObjectDetailsPanel/index.d.ts.map +1 -0
  138. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
  139. package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
  140. package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
  141. package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
  142. package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
  143. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +2 -2
  144. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
  145. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +1424 -0
  146. package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +3 -3
  148. package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +1 -1
  149. package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
  150. package/dist/types/src/components/ObjectSettings/index.d.ts +2 -1
  151. package/dist/types/src/components/ObjectSettings/index.d.ts.map +1 -1
  152. package/dist/types/src/components/RecordArticle.d.ts +5 -0
  153. package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
  154. package/dist/types/src/components/{MembersContainer.stories.d.ts → RecordArticle.stories.d.ts} +219 -216
  155. package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
  156. package/dist/types/src/components/SchemaContainer.d.ts +2 -2
  157. package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
  158. package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
  159. package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +6 -5
  160. package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
  161. package/dist/types/src/components/{SpacePresence.stories.d.ts → SpacePresence/SpacePresence.stories.d.ts} +220 -217
  162. package/dist/types/src/components/{SpacePresence.stories.d.ts.map → SpacePresence/SpacePresence.stories.d.ts.map} +1 -1
  163. package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
  164. package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
  165. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
  166. package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
  167. package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
  168. package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
  169. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
  170. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +218 -215
  171. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  172. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
  173. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +219 -216
  174. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  175. package/dist/types/src/components/ViewEditor.d.ts +3 -4
  176. package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
  177. package/dist/types/src/components/index.d.ts +10 -17
  178. package/dist/types/src/components/index.d.ts.map +1 -1
  179. package/dist/types/src/events.d.ts.map +1 -1
  180. package/dist/types/src/helpers/index.d.ts +2 -0
  181. package/dist/types/src/helpers/index.d.ts.map +1 -0
  182. package/dist/types/src/helpers/query.d.ts +8 -0
  183. package/dist/types/src/helpers/query.d.ts.map +1 -0
  184. package/dist/types/src/helpers/query.test.d.ts +2 -0
  185. package/dist/types/src/helpers/query.test.d.ts.map +1 -0
  186. package/dist/types/src/hooks/index.d.ts +1 -0
  187. package/dist/types/src/hooks/index.d.ts.map +1 -1
  188. package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
  189. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +1 -1
  190. package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
  191. package/dist/types/src/hooks/usePath.d.ts +1 -1
  192. package/dist/types/src/hooks/usePath.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
  194. package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
  195. package/dist/types/src/index.d.ts +1 -0
  196. package/dist/types/src/index.d.ts.map +1 -1
  197. package/dist/types/src/meta.d.ts +0 -1
  198. package/dist/types/src/meta.d.ts.map +1 -1
  199. package/dist/types/src/translations.d.ts +1261 -67
  200. package/dist/types/src/translations.d.ts.map +1 -1
  201. package/dist/types/src/types/form.d.ts +24 -0
  202. package/dist/types/src/types/form.d.ts.map +1 -0
  203. package/dist/types/src/types/index.d.ts +1 -0
  204. package/dist/types/src/types/index.d.ts.map +1 -1
  205. package/dist/types/src/types/types.d.ts +82 -142
  206. package/dist/types/src/types/types.d.ts.map +1 -1
  207. package/dist/types/src/util.d.ts +21 -34
  208. package/dist/types/src/util.d.ts.map +1 -1
  209. package/dist/types/tsconfig.tsbuildinfo +1 -1
  210. package/package.json +68 -59
  211. package/src/SpacePlugin.ts +181 -215
  212. package/src/capabilities/app-graph-builder.ts +205 -267
  213. package/src/capabilities/app-graph-serializer.ts +12 -12
  214. package/src/capabilities/capabilities.ts +26 -16
  215. package/src/capabilities/identity-created.ts +2 -2
  216. package/src/capabilities/index.ts +1 -1
  217. package/src/capabilities/intent-resolver.ts +78 -75
  218. package/src/capabilities/react-root.tsx +4 -3
  219. package/src/capabilities/react-surface.tsx +95 -145
  220. package/src/capabilities/repair.ts +57 -0
  221. package/src/capabilities/spaces-ready.ts +15 -6
  222. package/src/capabilities/state.ts +2 -2
  223. package/src/components/AwaitingObject.tsx +12 -14
  224. package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
  225. package/src/components/CollectionSection.tsx +8 -6
  226. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +11 -11
  227. package/src/components/CreateDialog/CreateObjectDialog.tsx +63 -43
  228. package/src/components/CreateDialog/CreateObjectPanel.tsx +38 -31
  229. package/src/components/CreateDialog/CreateSpaceDialog.tsx +30 -11
  230. package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
  231. package/src/components/JoinDialog/index.ts +5 -0
  232. package/src/components/{MembersContainer.stories.tsx → MembersContainer/MembersContainer.stories.tsx} +7 -6
  233. package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +16 -14
  234. package/src/components/MembersContainer/index.ts +5 -0
  235. package/src/components/MenuFooter.tsx +2 -2
  236. package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +51 -0
  237. package/src/components/ObjectDetailsPanel/ObjectForm.tsx +72 -0
  238. package/src/components/ObjectDetailsPanel/index.ts +7 -0
  239. package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +6 -6
  240. package/src/components/ObjectRenamePopover/index.ts +5 -0
  241. package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +6 -7
  242. package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +63 -0
  243. package/src/components/ObjectSettings/BaseObjectSettings.tsx +90 -26
  244. package/src/components/ObjectSettings/ForeignKeys.tsx +8 -8
  245. package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +4 -3
  246. package/src/components/ObjectSettings/index.ts +3 -1
  247. package/src/components/RecordArticle.stories.tsx +115 -0
  248. package/src/components/RecordArticle.tsx +114 -0
  249. package/src/components/SchemaContainer.tsx +24 -27
  250. package/src/components/SpacePluginSettings.tsx +10 -4
  251. package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +23 -25
  252. package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +16 -11
  253. package/src/components/SpacePresence/index.ts +5 -0
  254. package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
  255. package/src/components/SpaceRenamePopover/index.ts +5 -0
  256. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +9 -4
  257. package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +63 -23
  258. package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
  259. package/src/components/SyncStatus/SyncStatus.stories.tsx +4 -5
  260. package/src/components/SyncStatus/SyncStatus.tsx +107 -11
  261. package/src/components/ViewEditor.tsx +57 -23
  262. package/src/components/index.ts +7 -8
  263. package/src/events.ts +6 -6
  264. package/src/helpers/index.ts +5 -0
  265. package/src/helpers/query.test.ts +24 -0
  266. package/src/helpers/query.ts +158 -0
  267. package/src/hooks/index.ts +1 -0
  268. package/src/hooks/useActiveSpace.ts +2 -1
  269. package/src/hooks/useInputSurfaceLookup.tsx +8 -3
  270. package/src/hooks/usePath.ts +1 -1
  271. package/src/hooks/useTypeOptions.ts +27 -0
  272. package/src/index.ts +1 -0
  273. package/src/meta.ts +6 -3
  274. package/src/translations.ts +68 -58
  275. package/src/types/form.ts +75 -0
  276. package/src/types/index.ts +1 -0
  277. package/src/types/types.ts +44 -50
  278. package/src/util.tsx +216 -143
  279. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +0 -7
  280. package/dist/lib/browser/ObjectDetailsPanel-SY6FYTYC.mjs +0 -88
  281. package/dist/lib/browser/ObjectDetailsPanel-SY6FYTYC.mjs.map +0 -7
  282. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs +0 -68
  283. package/dist/lib/browser/RecordMain-TEBGAVSL.mjs.map +0 -7
  284. package/dist/lib/browser/app-graph-builder-FLF7XMQO.mjs +0 -516
  285. package/dist/lib/browser/app-graph-builder-FLF7XMQO.mjs.map +0 -7
  286. package/dist/lib/browser/app-graph-serializer-3A6KBYWT.mjs.map +0 -7
  287. package/dist/lib/browser/chunk-CBYL62HG.mjs +0 -19
  288. package/dist/lib/browser/chunk-CBYL62HG.mjs.map +0 -7
  289. package/dist/lib/browser/chunk-DCY3W36E.mjs.map +0 -7
  290. package/dist/lib/browser/chunk-ELJDGQTO.mjs.map +0 -7
  291. package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
  292. package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
  293. package/dist/lib/browser/chunk-J6YZG77T.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-RQVV4XVF.mjs +0 -343
  295. package/dist/lib/browser/chunk-RQVV4XVF.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-TUQZO5P4.mjs +0 -20
  297. package/dist/lib/browser/chunk-TUQZO5P4.mjs.map +0 -7
  298. package/dist/lib/browser/chunk-WAXS2ZVX.mjs.map +0 -7
  299. package/dist/lib/browser/identity-created-T6ZNVE7S.mjs.map +0 -7
  300. package/dist/lib/browser/intent-resolver-7E3IZIJS.mjs.map +0 -7
  301. package/dist/lib/browser/react-root-RWMT2RCK.mjs +0 -29
  302. package/dist/lib/browser/react-root-RWMT2RCK.mjs.map +0 -7
  303. package/dist/lib/browser/react-surface-GL4CE2F4.mjs.map +0 -7
  304. package/dist/lib/browser/schema-defs-YDPFZELA.mjs +0 -26
  305. package/dist/lib/browser/schema-defs-YDPFZELA.mjs.map +0 -7
  306. package/dist/lib/browser/spaces-ready-QVABOCO3.mjs.map +0 -7
  307. package/dist/lib/browser/state-2RGW7FQG.mjs.map +0 -7
  308. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +0 -7
  309. package/dist/lib/node-esm/ObjectDetailsPanel-3MYLTMXN.mjs +0 -89
  310. package/dist/lib/node-esm/ObjectDetailsPanel-3MYLTMXN.mjs.map +0 -7
  311. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs +0 -70
  312. package/dist/lib/node-esm/RecordMain-WLYJMYER.mjs.map +0 -7
  313. package/dist/lib/node-esm/app-graph-builder-D5YPOJS5.mjs +0 -517
  314. package/dist/lib/node-esm/app-graph-builder-D5YPOJS5.mjs.map +0 -7
  315. package/dist/lib/node-esm/app-graph-serializer-M45TH5LR.mjs.map +0 -7
  316. package/dist/lib/node-esm/chunk-AUQ3SKL2.mjs.map +0 -7
  317. package/dist/lib/node-esm/chunk-FJZNSJC4.mjs +0 -20
  318. package/dist/lib/node-esm/chunk-FJZNSJC4.mjs.map +0 -7
  319. package/dist/lib/node-esm/chunk-HC677WUJ.mjs +0 -21
  320. package/dist/lib/node-esm/chunk-HC677WUJ.mjs.map +0 -7
  321. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
  322. package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-HYIZVPOA.mjs.map +0 -7
  324. package/dist/lib/node-esm/chunk-Q6AAQLQG.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-WKQTO37U.mjs +0 -344
  326. package/dist/lib/node-esm/chunk-WKQTO37U.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-ZCEH2VYE.mjs.map +0 -7
  328. package/dist/lib/node-esm/identity-created-AL7NNCKH.mjs.map +0 -7
  329. package/dist/lib/node-esm/intent-resolver-UVO4MKWX.mjs.map +0 -7
  330. package/dist/lib/node-esm/react-root-5EKYI66P.mjs.map +0 -7
  331. package/dist/lib/node-esm/react-surface-IOC6YSVQ.mjs.map +0 -7
  332. package/dist/lib/node-esm/schema-defs-OYBCWKAS.mjs +0 -27
  333. package/dist/lib/node-esm/schema-defs-OYBCWKAS.mjs.map +0 -7
  334. package/dist/lib/node-esm/spaces-ready-MS6GHPFR.mjs.map +0 -7
  335. package/dist/lib/node-esm/state-7VBVBGNS.mjs.map +0 -7
  336. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  337. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  338. package/dist/types/src/components/CollectionMain.d.ts +0 -7
  339. package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
  340. package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
  341. package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
  342. package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
  343. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
  344. package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
  345. package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
  346. package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
  347. package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
  348. package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
  349. package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
  350. package/dist/types/src/components/RecordMain.d.ts +0 -7
  351. package/dist/types/src/components/RecordMain.d.ts.map +0 -1
  352. package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
  353. package/src/capabilities/schema-defs.ts +0 -31
  354. package/src/components/ObjectDetailsPanel.tsx +0 -77
  355. package/src/components/PersistenceStatus.tsx +0 -83
  356. package/src/components/RecordMain.tsx +0 -43
  357. /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 { SPACE_PLUGIN } 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';
@@ -47,7 +49,7 @@ export type MembersContainerProps = {
47
49
  };
48
50
 
49
51
  export const MembersContainer = ({ space, createInvitationUrl }: MembersContainerProps) => {
50
- const { t } = useTranslation(SPACE_PLUGIN);
52
+ const { t } = useTranslation(meta.id);
51
53
  const config = useConfig();
52
54
  const { dispatchPromise: dispatch } = useIntentDispatcher();
53
55
  const invitations = useSpaceInvitations(space.key);
@@ -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(() => {
@@ -75,7 +77,7 @@ export const MembersContainer = ({ space, createInvitationUrl }: MembersContaine
75
77
  inviteOne: {
76
78
  label: t('invite one label', { ns: 'os' }),
77
79
  description: t('invite one description', { ns: 'os' }),
78
- icon: () => <Icon icon='ph--user-plus--regular' size={5} />,
80
+ icon: 'ph--user-plus--regular',
79
81
  testId: 'membersContainer.inviteOne',
80
82
  onClick: async () => {
81
83
  const { data: invitation } = await dispatch(
@@ -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') {
@@ -97,7 +99,7 @@ export const MembersContainer = ({ space, createInvitationUrl }: MembersContaine
97
99
  inviteMany: {
98
100
  label: t('invite many label', { ns: 'os' }),
99
101
  description: t('invite many description', { ns: 'os' }),
100
- icon: () => <Icon icon='ph--users-three--regular' size={5} />,
102
+ icon: 'ph--users-three--regular',
101
103
  testId: 'membersContainer.inviteMany',
102
104
  onClick: async () => {
103
105
  const { data: invitation } = await dispatch(
@@ -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') {
@@ -130,7 +132,7 @@ export const MembersContainer = ({ space, createInvitationUrl }: MembersContaine
130
132
 
131
133
  return (
132
134
  <Clipboard.Provider>
133
- <StackItem.Content classNames='block overflow-y-auto'>
135
+ <StackItem.Content scrollable>
134
136
  <ControlPage>
135
137
  <ControlSection title={t('members verbose label')} description={t('members description')}>
136
138
  <ControlFrame>
@@ -230,7 +232,7 @@ const InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel
230
232
  const emoji = hexToEmoji(id);
231
233
  return (
232
234
  <>
233
- <p className='text-description'>{t('qr code description', { ns: SPACE_PLUGIN })}</p>
235
+ <p className='text-description'>{t('qr code description', { ns: meta.id })}</p>
234
236
  <div role='group' className='grid grid-cols-[1fr_min-content] mlb-2 gap-2'>
235
237
  <div role='none' className='is-full aspect-square relative text-description'>
236
238
  <QR
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './MembersContainer';
@@ -9,11 +9,11 @@ import { type Obj } from '@dxos/echo';
9
9
  import { useClient } from '@dxos/react-client';
10
10
  import { DropdownMenu, Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
11
 
12
- import { SPACE_PLUGIN } from '../meta';
12
+ import { meta } from '../meta';
13
13
  import { getSpaceDisplayName } from '../util';
14
14
 
15
15
  export const MenuFooter = ({ object }: { object: Obj.Any }) => {
16
- const { t } = useTranslation(SPACE_PLUGIN);
16
+ const { t } = useTranslation(meta.id);
17
17
  const client = useClient();
18
18
  const space = getSpace(object);
19
19
  const spaceName = space ? getSpaceDisplayName(space, { personal: client.spaces.default === space }) : '';
@@ -0,0 +1,51 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { useClient } from '@dxos/react-client';
8
+ import { Filter, getSpace, useQuery, useSchema } from '@dxos/react-client/echo';
9
+ import { Callout, useTranslation } from '@dxos/react-ui';
10
+ import { useSelected } from '@dxos/react-ui-attention';
11
+ import { type View, getTypenameFromQuery } from '@dxos/schema';
12
+ import { isNonNullable } from '@dxos/util';
13
+
14
+ import { meta } from '../../meta';
15
+
16
+ import { ObjectForm } from './ObjectForm';
17
+
18
+ type RowDetailsPanelProps = { objectId: string; view: View.View };
19
+
20
+ export const ObjectDetailsPanel = ({ objectId, view }: RowDetailsPanelProps) => {
21
+ const { t } = useTranslation(meta.id);
22
+ const client = useClient();
23
+ const space = getSpace(view);
24
+ const typename = view.query ? getTypenameFromQuery(view.query.ast) : undefined;
25
+ const schema = useSchema(client, space, typename);
26
+
27
+ const queriedObjects = useQuery(space, schema ? Filter.type(schema) : Filter.nothing());
28
+ const selectedRows = useSelected(objectId, 'multi');
29
+ const selectedObjects = selectedRows.map((id) => queriedObjects.find((obj) => obj.id === id)).filter(isNonNullable);
30
+
31
+ if (selectedObjects.length === 0) {
32
+ return (
33
+ <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>
34
+ <Callout.Root classNames='is-full'>
35
+ <Callout.Title>{t('row details no selection label')}</Callout.Title>
36
+ </Callout.Root>
37
+ </div>
38
+ );
39
+ }
40
+
41
+ return (
42
+ <div role='none' className='bs-full is-full flex flex-col p-2 gap-1 overflow-y-auto'>
43
+ {schema &&
44
+ selectedObjects.map((object) => (
45
+ <div key={object.id} className='border border-separator rounded'>
46
+ <ObjectForm object={object} schema={schema} />
47
+ </div>
48
+ ))}
49
+ </div>
50
+ );
51
+ };
@@ -0,0 +1,72 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import React, { useCallback, useMemo } from 'react';
7
+
8
+ import { DXN, Obj, type Ref, Tag, Type } from '@dxos/echo';
9
+ import { type JsonPath, setValue } from '@dxos/echo/internal';
10
+ import { invariant } from '@dxos/invariant';
11
+ import { getSpace } from '@dxos/react-client/echo';
12
+ import { Form, useRefQueryLookupHandler } from '@dxos/react-ui-form';
13
+ import { isNonNullable } from '@dxos/util';
14
+
15
+ import { meta as pluginMeta } from '../../meta';
16
+
17
+ const TagSchema = Tag.Tag.pipe(Schema.omit('id'));
18
+
19
+ type ObjectFormProps = { object: Obj.Any; schema: Schema.Schema.AnyNoContext };
20
+
21
+ export const ObjectForm = ({ object, schema }: ObjectFormProps) => {
22
+ const space = getSpace(object);
23
+ const handleRefQueryLookup = useRefQueryLookupHandler({ space });
24
+
25
+ const formSchema = useMemo(
26
+ () => Schema.Struct({ tags: Schema.Array(Type.Ref(Tag.Tag)).pipe(Schema.optional) }).pipe(Schema.extend(schema)),
27
+ [schema],
28
+ );
29
+
30
+ const meta = Obj.getMeta(object);
31
+ const tags = (meta.tags ?? []).map((tag) => space?.db.makeRef(DXN.parse(tag))).filter(isNonNullable);
32
+ const values = useMemo(() => ({ tags, ...object }), [object, tags]);
33
+
34
+ const handleCreateTag = useCallback((values: Schema.Schema.Type<typeof TagSchema>) => {
35
+ invariant(space);
36
+ const tag = space.db.add(Tag.make(values));
37
+ const meta = Obj.getMeta(object);
38
+ meta.tags = [...(meta.tags ?? []), Obj.getDXN(tag).toString()];
39
+ }, []);
40
+
41
+ const handleSave = useCallback(
42
+ ({ tags, ...values }: any, { changed }: { changed: Record<JsonPath, boolean> }) => {
43
+ const changedPaths = Object.keys(changed).filter((path) => changed[path as JsonPath]) as JsonPath[];
44
+ for (const path of changedPaths) {
45
+ if (path === 'tags') {
46
+ const meta = Obj.getMeta(object);
47
+ meta.tags = tags?.map((tag: Ref.Ref<Tag.Tag>) => tag.dxn.toString()) ?? [];
48
+ continue;
49
+ }
50
+
51
+ const value = values[path];
52
+ setValue(object, path, value);
53
+ }
54
+ },
55
+ [object],
56
+ );
57
+
58
+ return (
59
+ <Form
60
+ autoSave
61
+ schema={formSchema}
62
+ values={values}
63
+ createSchema={TagSchema}
64
+ createOptionIcon='ph--plus--regular'
65
+ createOptionLabel={['add tag label', { ns: pluginMeta.id }]}
66
+ createInitialValuePath='label'
67
+ onCreate={handleCreateTag}
68
+ onSave={handleSave}
69
+ onQueryRefOptions={handleRefQueryLookup}
70
+ />
71
+ );
72
+ };
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { ObjectDetailsPanel } from './ObjectDetailsPanel';
6
+
7
+ export default ObjectDetailsPanel;
@@ -4,18 +4,18 @@
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 { SPACE_PLUGIN } from '../meta';
13
+ import { meta } from '../../meta';
14
14
 
15
- export const POPOVER_RENAME_OBJECT = `${SPACE_PLUGIN}/PopoverRenameObject`;
15
+ export const OBJECT_RENAME_POPOVER = `${meta.id}/ObjectRenamePopover`;
16
16
 
17
- export const PopoverRenameObject = ({ object }: { object: Live<any> }) => {
18
- const { t } = useTranslation(SPACE_PLUGIN);
17
+ export const ObjectRenamePopover = ({ object }: { object: Obj.Any }) => {
18
+ const { t } = useTranslation(meta.id);
19
19
  const doneButton = useRef<HTMLButtonElement>(null);
20
20
  const [name, setName] = useState(Obj.getLabel(object));
21
21
  const { dispatchPromise: dispatch } = useIntentDispatcher();
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './ObjectRenamePopover';
@@ -4,12 +4,11 @@
4
4
 
5
5
  import React, { useCallback, useState } from 'react';
6
6
 
7
- import { Obj } from '@dxos/echo';
8
- import { ForeignKey } from '@dxos/echo-schema';
7
+ import { Key, Obj } from '@dxos/echo';
9
8
  import { IconButton, useTranslation } from '@dxos/react-ui';
10
9
  import { Form } from '@dxos/react-ui-form';
11
10
 
12
- import { SPACE_PLUGIN } from '../../meta';
11
+ import { meta } from '../../meta';
13
12
 
14
13
  import { ForeignKeys } from './ForeignKeys';
15
14
 
@@ -23,14 +22,14 @@ export type AdvancedObjectSettingsProps = {
23
22
  };
24
23
 
25
24
  export const AdvancedObjectSettings = ({ object }: AdvancedObjectSettingsProps) => {
26
- const { t } = useTranslation(SPACE_PLUGIN);
25
+ const { t } = useTranslation(meta.id);
27
26
  const [adding, setAdding] = useState(false);
28
27
  const { keys } = Obj.getMeta(object);
29
28
 
30
29
  const handleNew = useCallback(() => setAdding(true), []);
31
30
  const handleCancel = useCallback(() => setAdding(false), []);
32
31
  const handleSave = useCallback(
33
- (key: ForeignKey) => {
32
+ (key: Key.ForeignKey) => {
34
33
  const index = keys.findIndex(({ source, id }) => source === key.source && id === key.id);
35
34
  if (index === -1) {
36
35
  keys.push(key);
@@ -40,7 +39,7 @@ export const AdvancedObjectSettings = ({ object }: AdvancedObjectSettingsProps)
40
39
  [keys],
41
40
  );
42
41
  const handleDelete = useCallback(
43
- (key: ForeignKey) => {
42
+ (key: Key.ForeignKey) => {
44
43
  const index = keys.findIndex(({ source, id }) => source === key.source && id === key.id);
45
44
  if (index !== -1) {
46
45
  keys.splice(index, 1);
@@ -70,7 +69,7 @@ export const AdvancedObjectSettings = ({ object }: AdvancedObjectSettingsProps)
70
69
  {adding && (
71
70
  <Form
72
71
  outerSpacing={false}
73
- schema={ForeignKey}
72
+ schema={Key.ForeignKey}
74
73
  values={initialValues}
75
74
  onSave={handleSave}
76
75
  onCancel={handleCancel}
@@ -0,0 +1,63 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useEffect, useState } from 'react';
7
+
8
+ import { type Obj, Tag } from '@dxos/echo';
9
+ import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
10
+ import { withTheme } from '@dxos/react-ui/testing';
11
+ import { render } from '@dxos/storybook-utils';
12
+ import { Project } from '@dxos/types';
13
+
14
+ import { translations } from '../../translations';
15
+
16
+ import { BaseObjectSettings } from './BaseObjectSettings';
17
+
18
+ const DefaultStory = () => {
19
+ const { space } = useClientProvider();
20
+ const [object, setObject] = useState<Obj.Any>();
21
+
22
+ useEffect(() => {
23
+ if (space && !object) {
24
+ const object = space.db.add(Project.make());
25
+ setObject(object as Obj.Any);
26
+ }
27
+ }, [space, object]);
28
+
29
+ if (!object) {
30
+ return null;
31
+ }
32
+
33
+ return <BaseObjectSettings object={object} classNames='is-[20rem]' />;
34
+ };
35
+
36
+ const meta = {
37
+ title: 'plugins/plugin-space/BaseObjectSettings',
38
+ component: BaseObjectSettings as any,
39
+ render: render(DefaultStory),
40
+ decorators: [
41
+ withTheme,
42
+ withClientProvider({
43
+ createIdentity: true,
44
+ createSpace: true,
45
+ types: [Project.Project, Tag.Tag],
46
+ onCreateSpace: async ({ space }) => {
47
+ space.db.add(Tag.make({ label: 'Tag 1' }));
48
+ space.db.add(Tag.make({ label: 'Tag 2' }));
49
+ space.db.add(Tag.make({ label: 'Tag 3' }));
50
+ },
51
+ }),
52
+ ],
53
+ parameters: {
54
+ layout: 'centered',
55
+ translations,
56
+ },
57
+ } satisfies Meta<typeof DefaultStory>;
58
+
59
+ export default meta;
60
+
61
+ type Story = StoryObj<typeof meta>;
62
+
63
+ export const Default: Story = {};
@@ -2,12 +2,29 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { type PropsWithChildren, useRef } from 'react';
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';
6
10
 
7
- import { type Obj } from '@dxos/echo';
8
- import { Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';
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, useRefQueryLookupHandler } from '@dxos/react-ui-form';
17
+ import { isNonNullable } from '@dxos/util';
9
18
 
10
- import { meta } from '../../meta';
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'));
11
28
 
12
29
  export type BaseObjectSettingsProps = ThemedClassName<
13
30
  PropsWithChildren<{
@@ -15,32 +32,79 @@ export type BaseObjectSettingsProps = ThemedClassName<
15
32
  }>
16
33
  >;
17
34
 
35
+ // TODO(wittjosiah): Reconcile w/ ObjectDetailsPanel.
18
36
  export const BaseObjectSettings = ({ classNames, children, object }: BaseObjectSettingsProps) => {
19
- const { t } = useTranslation(meta.id);
20
- const inputRef = useRef<HTMLInputElement>(null);
37
+ const space = getSpace(object);
38
+ const handleRefQueryLookup = useRefQueryLookupHandler({ 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
+ const handleSave = useCallback(
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
+ }
79
+
80
+ const value = values[path];
81
+ setValue(object, path, value);
82
+ }
83
+ });
84
+ },
85
+ [object],
86
+ );
87
+
88
+ if (!formSchema) {
89
+ return null;
90
+ }
21
91
 
22
- // TODO(wittjosiah): This should be a form based on the schema of the object.
23
- // The form should only include fields with a specific settings annotation.
24
- // Perhaps also including the field of the title annotation as well.
25
92
  return (
26
93
  <>
27
- <Input.Root>
28
- <Input.Label>{t('name label')}</Input.Label>
29
- <Input.TextInput
30
- ref={inputRef}
31
- placeholder={t('name placeholder')}
32
- // TODO(burdon): Use annotation to get the name field.
33
- value={(object as any).name ?? ''}
34
- onChange={(event) => {
35
- (object as any).name = event.target.value;
36
- }}
37
- onKeyDown={(event) => {
38
- if (event.key === 'Enter') {
39
- inputRef.current?.blur();
40
- }
41
- }}
42
- />
43
- </Input.Root>
94
+ <Form
95
+ classNames={classNames}
96
+ outerSpacing={false}
97
+ autoSave
98
+ schema={formSchema}
99
+ values={values}
100
+ createSchema={TagSchema}
101
+ createOptionIcon='ph--plus--regular'
102
+ createOptionLabel={['add tag label', { ns: pluginMeta.id }]}
103
+ createInitialValuePath='label'
104
+ onCreate={handleCreateTag}
105
+ onSave={handleSave}
106
+ onQueryRefOptions={handleRefQueryLookup}
107
+ />
44
108
  {children}
45
109
  </>
46
110
  );
@@ -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>
@@ -4,9 +4,9 @@
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
- import { Clipboard } from '@dxos/react-ui';
9
+ import { Clipboard, Toolbar } from '@dxos/react-ui';
10
10
  import { StackItem } from '@dxos/react-ui-stack';
11
11
 
12
12
  import { BaseObjectSettings } from './BaseObjectSettings';
@@ -21,7 +21,8 @@ export const ObjectSettingsContainer = ({ object, role }: ObjectSettingsContaine
21
21
 
22
22
  return (
23
23
  <Clipboard.Provider>
24
- <StackItem.Content toolbar={false}>
24
+ <StackItem.Content toolbar>
25
+ <Toolbar.Root></Toolbar.Root>
25
26
  <div role='none' className='overflow-y-auto pli-cardSpacingInline plb-cardSpacingBlock'>
26
27
  <BaseObjectSettings object={object}>
27
28
  <Surface role='base-object-settings' data={data} />
@@ -2,4 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './ObjectSettingsContainer';
5
+ import { ObjectSettingsContainer } from './ObjectSettingsContainer';
6
+
7
+ export default ObjectSettingsContainer;