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

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 (228) hide show
  1. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs +31 -0
  2. package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +7 -0
  3. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs +88 -0
  4. package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs.map +7 -0
  5. package/dist/lib/browser/{app-graph-builder-M2RH72VL.mjs → app-graph-builder-7CZZJS3S.mjs} +143 -27
  6. package/dist/lib/browser/app-graph-builder-7CZZJS3S.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-F7ISRRBV.mjs → app-graph-serializer-H6AW7KGS.mjs} +13 -13
  8. package/dist/lib/browser/app-graph-serializer-H6AW7KGS.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-BXNL6SDI.mjs → chunk-CEFHNVU7.mjs} +4 -3
  10. package/dist/lib/browser/chunk-CEFHNVU7.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-PTKYMZWO.mjs → chunk-FBCGT5YY.mjs} +2 -2
  12. package/dist/lib/browser/{chunk-YMCZR6EZ.mjs → chunk-JS3MMC42.mjs} +4 -3
  13. package/dist/lib/browser/{chunk-YMCZR6EZ.mjs.map → chunk-JS3MMC42.mjs.map} +3 -3
  14. package/dist/lib/browser/{chunk-4ZKSFDXM.mjs → chunk-QACNNDOT.mjs} +73 -12
  15. package/dist/lib/browser/chunk-QACNNDOT.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-TW7O2EPP.mjs → chunk-SGTQ52SU.mjs} +59 -5
  17. package/dist/lib/browser/chunk-SGTQ52SU.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-NFUKCRGE.mjs → chunk-V7MJSSBQ.mjs} +392 -324
  19. package/dist/lib/browser/chunk-V7MJSSBQ.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-7Y4M7GXO.mjs → chunk-VLBRSGJ2.mjs} +4 -4
  21. package/dist/lib/browser/{chunk-V24VASAJ.mjs → chunk-XUYKJUU7.mjs} +128 -25
  22. package/dist/lib/browser/chunk-XUYKJUU7.mjs.map +7 -0
  23. package/dist/lib/browser/{identity-created-PI7TKANR.mjs → identity-created-23XJJV2N.mjs} +4 -4
  24. package/dist/lib/browser/identity-created-23XJJV2N.mjs.map +7 -0
  25. package/dist/lib/browser/index.mjs +105 -16
  26. package/dist/lib/browser/index.mjs.map +3 -3
  27. package/dist/lib/browser/{intent-resolver-RWU6ZE4H.mjs → intent-resolver-TIXVDYN7.mjs} +171 -21
  28. package/dist/lib/browser/intent-resolver-TIXVDYN7.mjs.map +7 -0
  29. package/dist/lib/browser/meta.json +1 -1
  30. package/dist/lib/browser/{react-root-QIKHSNT2.mjs → react-root-N2J7TDRX.mjs} +8 -8
  31. package/dist/lib/browser/{react-surface-W56UD53I.mjs → react-surface-TPNLWJJH.mjs} +42 -21
  32. package/dist/lib/browser/react-surface-TPNLWJJH.mjs.map +7 -0
  33. package/dist/lib/browser/{schema-defs-WREJNMIC.mjs → schema-defs-Z6FC4AHC.mjs} +4 -4
  34. package/dist/lib/browser/{schema-tools-ILTVSSS3.mjs → schema-tools-BNP4JTD7.mjs} +3 -3
  35. package/dist/lib/browser/{settings-K54STC5A.mjs → settings-4IMP5RYT.mjs} +4 -4
  36. package/dist/lib/browser/{spaces-ready-3PDRDHPC.mjs → spaces-ready-TOPG6IV4.mjs} +7 -7
  37. package/dist/lib/browser/{state-HRZ4VRXU.mjs → state-QYZAB45H.mjs} +4 -4
  38. package/dist/lib/browser/types/index.mjs +2 -2
  39. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs +32 -0
  40. package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +7 -0
  41. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs +89 -0
  42. package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs.map +7 -0
  43. package/dist/lib/node-esm/{app-graph-builder-BCHVZ4OM.mjs → app-graph-builder-KGIGWC72.mjs} +143 -27
  44. package/dist/lib/node-esm/app-graph-builder-KGIGWC72.mjs.map +7 -0
  45. package/dist/lib/node-esm/{app-graph-serializer-TXRGGNP2.mjs → app-graph-serializer-2ICUGQQT.mjs} +13 -13
  46. package/dist/lib/node-esm/app-graph-serializer-2ICUGQQT.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-HO7AIKQS.mjs → chunk-4AOMYKDE.mjs} +128 -25
  48. package/dist/lib/node-esm/chunk-4AOMYKDE.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-3CP67AYY.mjs → chunk-5HHYE264.mjs} +4 -3
  50. package/dist/lib/node-esm/{chunk-3CP67AYY.mjs.map → chunk-5HHYE264.mjs.map} +3 -3
  51. package/dist/lib/node-esm/{chunk-BSLREHIX.mjs → chunk-5T3ZH23B.mjs} +4 -3
  52. package/dist/lib/node-esm/chunk-5T3ZH23B.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-LA6AVVH6.mjs → chunk-6X5DLJM5.mjs} +392 -324
  54. package/dist/lib/node-esm/chunk-6X5DLJM5.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-MSWEFAPD.mjs → chunk-HWNG4MEU.mjs} +2 -2
  56. package/dist/lib/node-esm/{chunk-D4QMPPS7.mjs → chunk-JH6F4C3I.mjs} +59 -5
  57. package/dist/lib/node-esm/chunk-JH6F4C3I.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-JBQKU4K5.mjs → chunk-P442DOQ3.mjs} +73 -12
  59. package/dist/lib/node-esm/chunk-P442DOQ3.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-GH2FGJXH.mjs → chunk-SSLBYZEY.mjs} +4 -4
  61. package/dist/lib/node-esm/{identity-created-35CTAQWI.mjs → identity-created-IJQO6GCR.mjs} +4 -4
  62. package/dist/lib/node-esm/identity-created-IJQO6GCR.mjs.map +7 -0
  63. package/dist/lib/node-esm/index.mjs +105 -16
  64. package/dist/lib/node-esm/index.mjs.map +3 -3
  65. package/dist/lib/node-esm/{intent-resolver-JO6L2VXC.mjs → intent-resolver-MHGHRGDT.mjs} +171 -21
  66. package/dist/lib/node-esm/intent-resolver-MHGHRGDT.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/{react-root-YFGL3B4J.mjs → react-root-KW3TGJGY.mjs} +8 -8
  69. package/dist/lib/node-esm/{react-surface-CVAPDLEZ.mjs → react-surface-UUIUUD6P.mjs} +42 -21
  70. package/dist/lib/node-esm/react-surface-UUIUUD6P.mjs.map +7 -0
  71. package/dist/lib/node-esm/{schema-defs-4MEJETVX.mjs → schema-defs-WHJM7UZE.mjs} +4 -4
  72. package/dist/lib/node-esm/{schema-tools-SRLCRZ3B.mjs → schema-tools-KWW5PTML.mjs} +3 -3
  73. package/dist/lib/node-esm/{settings-TD76LTQS.mjs → settings-SAOBPND3.mjs} +4 -4
  74. package/dist/lib/node-esm/{spaces-ready-FJMGPAVV.mjs → spaces-ready-HIUKNDZK.mjs} +7 -7
  75. package/dist/lib/node-esm/{state-XQNDCN37.mjs → state-ZVEHQ4BJ.mjs} +4 -4
  76. package/dist/lib/node-esm/types/index.mjs +2 -2
  77. package/dist/types/src/SpacePlugin.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/capabilities.d.ts +9 -3
  81. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  85. package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
  86. package/dist/types/src/components/CollectionMain.d.ts +1 -0
  87. package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
  88. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +3 -2
  89. package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
  90. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1 -1
  91. package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/MembersContainer.d.ts.map +1 -1
  93. package/dist/types/src/components/MembersContainer.stories.d.ts +1 -1
  94. package/dist/types/src/components/MembersContainer.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
  96. package/dist/types/src/components/ObjectDetailsPanel.d.ts +9 -0
  97. package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +1 -0
  98. package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
  99. package/dist/types/src/components/SpacePresence.stories.d.ts +1 -1
  100. package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1 -1
  102. package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +1 -1
  104. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1 -1
  105. package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
  106. package/dist/types/src/components/SyncStatus/status.d.ts +5 -5
  107. package/dist/types/src/components/ViewEditor.d.ts +8 -0
  108. package/dist/types/src/components/ViewEditor.d.ts.map +1 -0
  109. package/dist/types/src/components/index.d.ts +8 -1
  110. package/dist/types/src/components/index.d.ts.map +1 -1
  111. package/dist/types/src/events.d.ts +1 -0
  112. package/dist/types/src/events.d.ts.map +1 -1
  113. package/dist/types/src/translations.d.ts +212 -410
  114. package/dist/types/src/translations.d.ts.map +1 -1
  115. package/dist/types/src/types/types.d.ts +82 -2
  116. package/dist/types/src/types/types.d.ts.map +1 -1
  117. package/dist/types/src/util.d.ts +27 -2
  118. package/dist/types/src/util.d.ts.map +1 -1
  119. package/dist/types/tsconfig.tsbuildinfo +1 -1
  120. package/package.json +50 -52
  121. package/src/SpacePlugin.ts +90 -7
  122. package/src/capabilities/app-graph-builder.ts +166 -7
  123. package/src/capabilities/app-graph-serializer.ts +6 -6
  124. package/src/capabilities/capabilities.ts +8 -3
  125. package/src/capabilities/identity-created.ts +2 -4
  126. package/src/capabilities/intent-resolver.ts +117 -8
  127. package/src/capabilities/react-surface.tsx +50 -13
  128. package/src/components/AwaitingObject.tsx +4 -6
  129. package/src/components/CollectionMain.tsx +2 -0
  130. package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +4 -4
  131. package/src/components/CreateDialog/CreateObjectDialog.tsx +29 -25
  132. package/src/components/MembersContainer.stories.tsx +4 -4
  133. package/src/components/MembersContainer.tsx +6 -5
  134. package/src/components/MenuFooter.tsx +2 -3
  135. package/src/components/ObjectDetailsPanel.tsx +77 -0
  136. package/src/components/PersistenceStatus.tsx +5 -6
  137. package/src/components/PopoverRenameObject.tsx +2 -2
  138. package/src/components/SpacePresence.stories.tsx +2 -2
  139. package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +2 -2
  140. package/src/components/SyncStatus/SyncStatus.stories.tsx +8 -15
  141. package/src/components/SyncStatus/SyncStatus.tsx +1 -1
  142. package/src/components/SyncStatus/save-tracker.ts +3 -3
  143. package/src/components/SyncStatus/status.ts +4 -4
  144. package/src/components/ViewEditor.tsx +64 -0
  145. package/src/components/index.ts +6 -1
  146. package/src/events.ts +1 -0
  147. package/src/translations.ts +71 -7
  148. package/src/types/types.ts +56 -3
  149. package/src/util.tsx +116 -21
  150. package/dist/lib/browser/app-graph-builder-M2RH72VL.mjs.map +0 -7
  151. package/dist/lib/browser/app-graph-serializer-F7ISRRBV.mjs.map +0 -7
  152. package/dist/lib/browser/chunk-4ZKSFDXM.mjs.map +0 -7
  153. package/dist/lib/browser/chunk-BXNL6SDI.mjs.map +0 -7
  154. package/dist/lib/browser/chunk-NFUKCRGE.mjs.map +0 -7
  155. package/dist/lib/browser/chunk-TW7O2EPP.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-V24VASAJ.mjs.map +0 -7
  157. package/dist/lib/browser/identity-created-PI7TKANR.mjs.map +0 -7
  158. package/dist/lib/browser/intent-resolver-RWU6ZE4H.mjs.map +0 -7
  159. package/dist/lib/browser/react-surface-W56UD53I.mjs.map +0 -7
  160. package/dist/lib/node/app-graph-builder-6LK5HLLE.cjs +0 -364
  161. package/dist/lib/node/app-graph-builder-6LK5HLLE.cjs.map +0 -7
  162. package/dist/lib/node/app-graph-serializer-HKHBNHA3.cjs +0 -89
  163. package/dist/lib/node/app-graph-serializer-HKHBNHA3.cjs.map +0 -7
  164. package/dist/lib/node/chunk-3X4EA4XL.cjs +0 -37
  165. package/dist/lib/node/chunk-3X4EA4XL.cjs.map +0 -7
  166. package/dist/lib/node/chunk-5WLAXYE3.cjs +0 -125
  167. package/dist/lib/node/chunk-5WLAXYE3.cjs.map +0 -7
  168. package/dist/lib/node/chunk-6P2DB4QQ.cjs +0 -36
  169. package/dist/lib/node/chunk-6P2DB4QQ.cjs.map +0 -7
  170. package/dist/lib/node/chunk-DOC5XEZ4.cjs +0 -184
  171. package/dist/lib/node/chunk-DOC5XEZ4.cjs.map +0 -7
  172. package/dist/lib/node/chunk-NCHF433F.cjs +0 -1921
  173. package/dist/lib/node/chunk-NCHF433F.cjs.map +0 -7
  174. package/dist/lib/node/chunk-NL5Y4EDX.cjs +0 -38
  175. package/dist/lib/node/chunk-NL5Y4EDX.cjs.map +0 -7
  176. package/dist/lib/node/chunk-ULJZPATP.cjs +0 -312
  177. package/dist/lib/node/chunk-ULJZPATP.cjs.map +0 -7
  178. package/dist/lib/node/chunk-XHWVT7LW.cjs +0 -572
  179. package/dist/lib/node/chunk-XHWVT7LW.cjs.map +0 -7
  180. package/dist/lib/node/identity-created-FF4WZ2WY.cjs +0 -42
  181. package/dist/lib/node/identity-created-FF4WZ2WY.cjs.map +0 -7
  182. package/dist/lib/node/index.cjs +0 -278
  183. package/dist/lib/node/index.cjs.map +0 -7
  184. package/dist/lib/node/intent-resolver-AV4CMM3Z.cjs +0 -609
  185. package/dist/lib/node/intent-resolver-AV4CMM3Z.cjs.map +0 -7
  186. package/dist/lib/node/meta.json +0 -1
  187. package/dist/lib/node/react-root-RQUU3A45.cjs +0 -51
  188. package/dist/lib/node/react-root-RQUU3A45.cjs.map +0 -7
  189. package/dist/lib/node/react-surface-AZFJLE72.cjs +0 -351
  190. package/dist/lib/node/react-surface-AZFJLE72.cjs.map +0 -7
  191. package/dist/lib/node/schema-defs-OB2X2HBH.cjs +0 -42
  192. package/dist/lib/node/schema-defs-OB2X2HBH.cjs.map +0 -7
  193. package/dist/lib/node/schema-tools-IYREN4IH.cjs +0 -147
  194. package/dist/lib/node/schema-tools-IYREN4IH.cjs.map +0 -7
  195. package/dist/lib/node/settings-P2EQ7VKQ.cjs +0 -38
  196. package/dist/lib/node/settings-P2EQ7VKQ.cjs.map +0 -7
  197. package/dist/lib/node/spaces-ready-DXPOHYV7.cjs +0 -210
  198. package/dist/lib/node/spaces-ready-DXPOHYV7.cjs.map +0 -7
  199. package/dist/lib/node/state-M35DK75Z.cjs +0 -61
  200. package/dist/lib/node/state-M35DK75Z.cjs.map +0 -7
  201. package/dist/lib/node/types/index.cjs +0 -48
  202. package/dist/lib/node/types/index.cjs.map +0 -7
  203. package/dist/lib/node-esm/app-graph-builder-BCHVZ4OM.mjs.map +0 -7
  204. package/dist/lib/node-esm/app-graph-serializer-TXRGGNP2.mjs.map +0 -7
  205. package/dist/lib/node-esm/chunk-BSLREHIX.mjs.map +0 -7
  206. package/dist/lib/node-esm/chunk-D4QMPPS7.mjs.map +0 -7
  207. package/dist/lib/node-esm/chunk-HO7AIKQS.mjs.map +0 -7
  208. package/dist/lib/node-esm/chunk-JBQKU4K5.mjs.map +0 -7
  209. package/dist/lib/node-esm/chunk-LA6AVVH6.mjs.map +0 -7
  210. package/dist/lib/node-esm/identity-created-35CTAQWI.mjs.map +0 -7
  211. package/dist/lib/node-esm/intent-resolver-JO6L2VXC.mjs.map +0 -7
  212. package/dist/lib/node-esm/react-surface-CVAPDLEZ.mjs.map +0 -7
  213. /package/dist/lib/browser/{chunk-PTKYMZWO.mjs.map → chunk-FBCGT5YY.mjs.map} +0 -0
  214. /package/dist/lib/browser/{chunk-7Y4M7GXO.mjs.map → chunk-VLBRSGJ2.mjs.map} +0 -0
  215. /package/dist/lib/browser/{react-root-QIKHSNT2.mjs.map → react-root-N2J7TDRX.mjs.map} +0 -0
  216. /package/dist/lib/browser/{schema-defs-WREJNMIC.mjs.map → schema-defs-Z6FC4AHC.mjs.map} +0 -0
  217. /package/dist/lib/browser/{schema-tools-ILTVSSS3.mjs.map → schema-tools-BNP4JTD7.mjs.map} +0 -0
  218. /package/dist/lib/browser/{settings-K54STC5A.mjs.map → settings-4IMP5RYT.mjs.map} +0 -0
  219. /package/dist/lib/browser/{spaces-ready-3PDRDHPC.mjs.map → spaces-ready-TOPG6IV4.mjs.map} +0 -0
  220. /package/dist/lib/browser/{state-HRZ4VRXU.mjs.map → state-QYZAB45H.mjs.map} +0 -0
  221. /package/dist/lib/node-esm/{chunk-MSWEFAPD.mjs.map → chunk-HWNG4MEU.mjs.map} +0 -0
  222. /package/dist/lib/node-esm/{chunk-GH2FGJXH.mjs.map → chunk-SSLBYZEY.mjs.map} +0 -0
  223. /package/dist/lib/node-esm/{react-root-YFGL3B4J.mjs.map → react-root-KW3TGJGY.mjs.map} +0 -0
  224. /package/dist/lib/node-esm/{schema-defs-4MEJETVX.mjs.map → schema-defs-WHJM7UZE.mjs.map} +0 -0
  225. /package/dist/lib/node-esm/{schema-tools-SRLCRZ3B.mjs.map → schema-tools-KWW5PTML.mjs.map} +0 -0
  226. /package/dist/lib/node-esm/{settings-TD76LTQS.mjs.map → settings-SAOBPND3.mjs.map} +0 -0
  227. /package/dist/lib/node-esm/{spaces-ready-FJMGPAVV.mjs.map → spaces-ready-HIUKNDZK.mjs.map} +0 -0
  228. /package/dist/lib/node-esm/{state-XQNDCN37.mjs.map → state-ZVEHQ4BJ.mjs.map} +0 -0
@@ -0,0 +1,77 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback } from 'react';
6
+
7
+ import { type JsonPath, setValue } from '@dxos/echo-schema';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { useClient } from '@dxos/react-client';
10
+ import { getSpace, Filter, useQuery, useSchema } from '@dxos/react-client/echo';
11
+ import { Callout, useTranslation } from '@dxos/react-ui';
12
+ import { useSelected } from '@dxos/react-ui-attention';
13
+ import { Form, useRefQueryLookupHandler } from '@dxos/react-ui-form';
14
+ import { type DataType } from '@dxos/schema';
15
+ import { isNonNullable } from '@dxos/util';
16
+
17
+ import { SPACE_PLUGIN } from '../meta';
18
+
19
+ type RowDetailsPanelProps = { objectId: string; view: DataType.View };
20
+
21
+ const ObjectDetailsPanel = ({ objectId, view }: RowDetailsPanelProps) => {
22
+ const { t } = useTranslation(SPACE_PLUGIN);
23
+ const client = useClient();
24
+ const space = getSpace(view);
25
+ const schema = useSchema(client, space, view.query?.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
+ const handleRefQueryLookup = useRefQueryLookupHandler({ space });
32
+
33
+ const handleSave = useCallback(
34
+ (values: any, { changed }: { changed: Record<JsonPath, boolean> }) => {
35
+ const id = values.id;
36
+ invariant(typeof id === 'string');
37
+ const object = queriedObjects.find((obj) => obj.id === id);
38
+ invariant(object);
39
+
40
+ const changedPaths = Object.keys(changed).filter((path) => changed[path as JsonPath]) as JsonPath[];
41
+ for (const path of changedPaths) {
42
+ const value = values[path];
43
+ setValue(object, path, value);
44
+ }
45
+ },
46
+ [queriedObjects],
47
+ );
48
+
49
+ if (selectedObjects.length === 0) {
50
+ return (
51
+ <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>
52
+ <Callout.Root classNames='is-full'>
53
+ <Callout.Title>{t('row details no selection label')}</Callout.Title>
54
+ </Callout.Root>
55
+ </div>
56
+ );
57
+ }
58
+
59
+ return (
60
+ <div role='none' className='bs-full is-full flex flex-col p-2 gap-1 overflow-y-auto'>
61
+ {schema &&
62
+ selectedObjects.map((object) => (
63
+ <div key={object.id} className='border border-separator rounded'>
64
+ <Form
65
+ autoSave
66
+ schema={schema}
67
+ values={object}
68
+ onSave={handleSave}
69
+ onQueryRefOptions={handleRefQueryLookup}
70
+ />
71
+ </div>
72
+ ))}
73
+ </div>
74
+ );
75
+ };
76
+
77
+ export default ObjectDetailsPanel;
@@ -2,13 +2,12 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { ArrowsCounterClockwise, CheckCircle, Warning } from '@phosphor-icons/react';
6
5
  import React, { useEffect, useState } from 'react';
7
6
 
8
7
  import { debounce } from '@dxos/async';
9
8
  import { type EchoDatabase } from '@dxos/react-client/echo';
10
- import { Tooltip, useTranslation } from '@dxos/react-ui';
11
- import { getSize, mx, staticPlaceholderText, warningText } from '@dxos/react-ui-theme';
9
+ import { Icon, Tooltip, useTranslation } from '@dxos/react-ui';
10
+ import { mx, staticPlaceholderText, warningText } from '@dxos/react-ui-theme';
12
11
 
13
12
  import { SPACE_PLUGIN } from '../meta';
14
13
 
@@ -54,14 +53,14 @@ export const PersistenceStatus = ({ db }: { db: EchoDatabase }) => {
54
53
  case Status.ERROR:
55
54
  return (
56
55
  <div className='flex items-center'>
57
- <Warning className={mx(getSize(4), 'me-1')} />
56
+ <Icon icon='ph--warning--regular' size={4} classNames='me-1' />
58
57
  <span className={mx('text-sm', warningText)}>{t('persistence error label')}</span>
59
58
  </div>
60
59
  );
61
60
  case Status.PENDING:
62
61
  return (
63
62
  <div className='flex items-center'>
64
- <ArrowsCounterClockwise className={mx(getSize(4), 'me-1')} />
63
+ <Icon icon='ph--arrows-counter-clockwise--regular' size={4} classNames='me-1' />
65
64
  <span className={mx('text-sm', staticPlaceholderText)}>{t('persistence pending label')}</span>
66
65
  </div>
67
66
  );
@@ -74,7 +73,7 @@ export const PersistenceStatus = ({ db }: { db: EchoDatabase }) => {
74
73
  content={t('persisted locally message')}
75
74
  className='flex items-center'
76
75
  >
77
- <CheckCircle className={mx(getSize(4), 'me-1')} />
76
+ <Icon icon='ph--check-circle--regular' size={4} classNames='me-1' />
78
77
  {displayMessage && (
79
78
  <span className={mx('text-sm', staticPlaceholderText)}>{t('persisted locally label')}</span>
80
79
  )}
@@ -25,10 +25,10 @@ export const PopoverRenameObject = ({ object: obj }: { object: Live<any> }) => {
25
25
  const handleDone = useCallback(() => {
26
26
  try {
27
27
  object.name = name;
28
- } catch {
28
+ } catch (err) {
29
29
  try {
30
30
  object.title = name;
31
- } catch (err) {
31
+ } catch {
32
32
  log.error('Failed to rename object', { err });
33
33
  }
34
34
  }
@@ -4,7 +4,7 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta } from '@storybook/react';
7
+ import { type Meta } from '@storybook/react-vite';
8
8
  import React from 'react';
9
9
 
10
10
  import { IdentityDid, PublicKey } from '@dxos/keys';
@@ -12,7 +12,7 @@ import { HaloSpaceMember, SpaceMember } from '@dxos/react-client/echo';
12
12
  import { withLayout, withTheme } from '@dxos/storybook-utils';
13
13
 
14
14
  import { FullPresence, type MemberPresenceProps, SmallPresence, type Member } from './SpacePresence';
15
- import translations from '../translations';
15
+ import { translations } from '../translations';
16
16
 
17
17
  const nViewers = (n: number, currentlyAttended = true): Member[] =>
18
18
  Array.from({ length: n }, () => ({
@@ -4,14 +4,14 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta, type StoryObj } from '@storybook/react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React from 'react';
9
9
 
10
10
  import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
11
11
  import { withTheme } from '@dxos/storybook-utils';
12
12
 
13
13
  import { SpaceSettingsContainer, type SpaceSettingsContainerProps } from './SpaceSettingsContainer';
14
- import translations from '../../translations';
14
+ import { translations } from '../../translations';
15
15
 
16
16
  const Story = (args: Partial<SpaceSettingsContainerProps>) => {
17
17
  const { space } = useClientProvider();
@@ -4,28 +4,21 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta, type StoryObj } from '@storybook/react';
8
- import React from 'react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
9
8
 
10
- import { withTheme, withLayout } from '@dxos/storybook-utils';
9
+ import { withTheme } from '@dxos/storybook-utils';
11
10
 
12
11
  import { SyncStatusIndicator } from './SyncStatus';
13
- import translations from '../../translations';
14
-
15
- const DefaultStory = (props: any) => {
16
- return (
17
- <div className='flex flex-col-reverse p-4'>
18
- <SyncStatusIndicator {...props} />
19
- </div>
20
- );
21
- };
12
+ import { translations } from '../../translations';
22
13
 
23
14
  const meta: Meta = {
24
15
  title: 'plugins/plugin-space/SyncStatusIndicator',
25
16
  component: SyncStatusIndicator,
26
- render: DefaultStory,
27
- decorators: [withTheme, withLayout({ fullscreen: true })],
28
- parameters: { translations },
17
+ decorators: [withTheme],
18
+ parameters: {
19
+ translations,
20
+ layout: 'centered',
21
+ },
29
22
  };
30
23
 
31
24
  export default meta;
@@ -29,7 +29,7 @@ export const SyncStatus = () => {
29
29
  return <SyncStatusIndicator state={state} saved={saved} />;
30
30
  };
31
31
 
32
- export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap; saved: Boolean }) => {
32
+ export const SyncStatusIndicator = ({ state, saved }: { state: SpaceSyncStateMap; saved: boolean }) => {
33
33
  const { t } = useTranslation(SPACE_PLUGIN);
34
34
  const summary = getSyncSummary(state);
35
35
  const offline = Object.values(state).length === 0;
@@ -46,15 +46,15 @@ const createSpaceSaveTracker = (space: Space, cb: (state: 'saved' | 'saving') =>
46
46
 
47
47
  let hasUnsavedChanges = false;
48
48
  let lastFlushPromise: Promise<void> | undefined;
49
- space.crud.saveStateChanged.on(ctx, ({ unsavedDocuments }) => {
49
+ space.db.saveStateChanged.on(ctx, ({ unsavedDocuments }) => {
50
50
  hasUnsavedChanges = unsavedDocuments.length > 0;
51
51
  });
52
- space.crud.saveStateChanged.debounce(500).on(ctx, () => {
52
+ space.db.saveStateChanged.debounce(500).on(ctx, () => {
53
53
  if (hasUnsavedChanges) {
54
54
  lastFlushPromise = undefined;
55
55
  cb('saving');
56
56
  } else {
57
- const flushPromise = space.crud.flush();
57
+ const flushPromise = space.db.flush();
58
58
  lastFlushPromise = flushPromise;
59
59
  void flushPromise.then(() => {
60
60
  if (lastFlushPromise === flushPromise) {
@@ -10,10 +10,10 @@ export const getStatus = ({
10
10
  needsToUpload,
11
11
  needsToDownload,
12
12
  }: {
13
- offline: Boolean;
14
- saved: Boolean;
15
- needsToUpload: Boolean;
16
- needsToDownload: Boolean;
13
+ offline: boolean;
14
+ saved: boolean;
15
+ needsToUpload: boolean;
16
+ needsToDownload: boolean;
17
17
  }): Status => {
18
18
  if (!saved) {
19
19
  return 'saving locally';
@@ -0,0 +1,64 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useMemo } from 'react';
6
+
7
+ import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { Type } from '@dxos/echo';
9
+ import { invariant } from '@dxos/invariant';
10
+ import { useClient } from '@dxos/react-client';
11
+ import { Filter, getSpace, useQuery, useSchema } from '@dxos/react-client/echo';
12
+ import { ViewEditor as NativeViewEditor } from '@dxos/react-ui-form';
13
+ import { DataType } from '@dxos/schema';
14
+
15
+ import { SpaceAction } from '../types';
16
+
17
+ type ViewEditorProps = { view: DataType.View };
18
+
19
+ export const ViewEditor = ({ view }: ViewEditorProps) => {
20
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
21
+ const client = useClient();
22
+ const space = getSpace(view);
23
+ const schema = useSchema(client, space, view.query.typename);
24
+
25
+ const views = useQuery(space, Filter.type(DataType.View));
26
+ const currentTypename = useMemo(() => view.query?.typename, [view.query?.typename]);
27
+
28
+ const handleUpdateTypename = useCallback(
29
+ (typename: string) => {
30
+ invariant(schema);
31
+ invariant(Type.isMutable(schema));
32
+
33
+ const matchingViews = views.filter((view) => view.query.typename === currentTypename);
34
+ for (const view of matchingViews) {
35
+ view.query.typename = typename;
36
+ }
37
+
38
+ schema.updateTypename(typename);
39
+ },
40
+ [views, schema],
41
+ );
42
+
43
+ const handleDelete = useCallback(
44
+ (fieldId: string) => {
45
+ void dispatch(createIntent(SpaceAction.DeleteField, { view, fieldId }));
46
+ },
47
+ [dispatch, view],
48
+ );
49
+
50
+ if (!space || !schema) {
51
+ return null;
52
+ }
53
+
54
+ return (
55
+ <NativeViewEditor
56
+ registry={space.db.schemaRegistry}
57
+ schema={schema}
58
+ view={view}
59
+ onTypenameChanged={Type.isMutable(schema) ? handleUpdateTypename : undefined}
60
+ onDelete={Type.isMutable(schema) ? handleDelete : undefined}
61
+ outerSpacing={false}
62
+ />
63
+ );
64
+ };
@@ -2,9 +2,10 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { lazy } from 'react';
6
+
5
7
  export * from './AwaitingObject';
6
8
  export * from './CreateDialog';
7
- export * from './CollectionMain';
8
9
  export * from './CollectionSection';
9
10
  export * from './JoinDialog';
10
11
  export * from './MembersContainer';
@@ -18,3 +19,7 @@ export * from './SpacePresence';
18
19
  export * from './SpacePluginSettings';
19
20
  export * from './SpaceSettings';
20
21
  export * from './SyncStatus';
22
+ export * from './ViewEditor';
23
+
24
+ export const CollectionMain = lazy(() => import('./CollectionMain'));
25
+ export const ObjectDetailsPanel = lazy(() => import('./ObjectDetailsPanel'));
package/src/events.ts CHANGED
@@ -11,4 +11,5 @@ export namespace SpaceEvents {
11
11
  export const SetupSettingsPanel = defineEvent(`${SPACE_PLUGIN}/event/setup-settings-panel`);
12
12
  export const DefaultSpaceReady = defineEvent(`${SPACE_PLUGIN}/event/default-space-ready`);
13
13
  export const SpaceCreated = defineEvent(`${SPACE_PLUGIN}/event/space-created`);
14
+ export const SchemaAdded = defineEvent(`${SPACE_PLUGIN}/event/schema-added`);
14
15
  }
@@ -2,29 +2,88 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Type } from '@dxos/echo';
5
+ import { StoredSchema } from '@dxos/echo-schema';
6
+ import { type Resource } from '@dxos/react-ui';
6
7
  import { DataType } from '@dxos/schema';
7
8
 
8
- import { SPACE_PLUGIN } from './meta';
9
+ import { meta } from './meta';
9
10
 
10
- export default [
11
+ // TODO(burdon): Change to single Resource?
12
+ export const translations = [
11
13
  {
12
14
  'en-US': {
13
- [Type.getTypename(DataType.Collection)]: {
15
+ [DataType.Collection.typename]: {
14
16
  'typename label': 'Collection',
15
17
  'typename label_zero': 'Collections',
16
18
  'typename label_one': 'Collection',
17
19
  'typename label_other': 'Collections',
18
20
  'object name placeholder': 'New collection',
21
+ 'rename object label': 'Rename collection',
22
+ 'delete object label': 'Delete collection',
19
23
  },
20
- [Type.getTypename(DataType.QueryCollection)]: {
24
+ [DataType.QueryCollection.typename]: {
21
25
  'typename label': 'Smart Collection',
22
26
  'typename label_zero': 'Smart Collections',
23
27
  'typename label_one': 'Smart Collection',
24
28
  'typename label_other': 'Smart Collections',
25
29
  'object name placeholder': 'New smart collection',
30
+ 'rename object label': 'Rename smart collection',
31
+ 'delete object label': 'Delete smart collection',
26
32
  },
27
- [SPACE_PLUGIN]: {
33
+ [StoredSchema.typename]: {
34
+ 'typename label': 'Record',
35
+ 'typename label_zero': 'Records',
36
+ 'typename label_one': 'Record',
37
+ 'typename label_other': 'Records',
38
+ 'object name placeholder': 'New record type',
39
+ 'rename object label': 'Rename record type',
40
+ 'delete object label': 'Delete record type',
41
+ },
42
+ [DataType.View.typename]: {
43
+ 'typename label': 'View',
44
+ 'typename label_zero': 'Views',
45
+ 'typename label_one': 'View',
46
+ 'typename label_other': 'Views',
47
+ 'object name placeholder': 'New view',
48
+ 'rename object label': 'Rename view',
49
+ 'delete object label': 'Delete view',
50
+ },
51
+ [DataType.Event.typename]: {
52
+ 'typename label': 'Event',
53
+ 'typename label_zero': 'Events',
54
+ 'typename label_one': 'Event',
55
+ 'typename label_other': 'Events',
56
+ 'object name placeholder': 'New event',
57
+ },
58
+ [DataType.Organization.typename]: {
59
+ 'typename label': 'Organization',
60
+ 'typename label_zero': 'Organizations',
61
+ 'typename label_one': 'Organization',
62
+ 'typename label_other': 'Organizations',
63
+ 'object name placeholder': 'New organization',
64
+ },
65
+ [DataType.Person.typename]: {
66
+ 'typename label': 'Person',
67
+ 'typename label_zero': 'People',
68
+ 'typename label_one': 'Person',
69
+ 'typename label_other': 'People',
70
+ 'object name placeholder': 'New person',
71
+ },
72
+ [DataType.Project.typename]: {
73
+ 'typename label': 'Project',
74
+ 'typename label_zero': 'Projects',
75
+ 'typename label_one': 'Project',
76
+ 'typename label_other': 'Projects',
77
+ 'object name placeholder': 'New project',
78
+ },
79
+ [DataType.Task.typename]: {
80
+ 'typename label': 'Task',
81
+ 'typename label_zero': 'Tasks',
82
+ 'typename label_one': 'Task',
83
+ 'typename label_other': 'Tasks',
84
+ 'object name placeholder': 'New task',
85
+ },
86
+ [meta.id]: {
28
87
  'plugin name': 'Spaces',
29
88
  'first run message': 'Nothing selected.',
30
89
  'create space label': 'Create space',
@@ -51,6 +110,7 @@ export default [
51
110
  'confirm restore title': 'Overwrite files in this space?',
52
111
  'confirm restore body': 'Restoring from a backup will overwrite the contents of any documents that match.',
53
112
  'upload file message': 'Drag file here or click to browse',
113
+ 'object name placeholder': 'Object',
54
114
  'object placeholder': 'Type a title here…',
55
115
  'personal space label': 'Personal Space',
56
116
  'spaces label': 'Spaces',
@@ -134,6 +194,10 @@ export default [
134
194
  'add key': 'Add Key',
135
195
  'open space settings label': 'Open settings',
136
196
 
197
+ 'row details no selection label': 'No objects selected',
198
+ 'companion selected objects label': 'Selected',
199
+ 'field deleted label': 'Field deleted',
200
+
137
201
  'members panel label': 'Members',
138
202
  'members verbose label': 'Manage space members',
139
203
  'members description': 'You can view the current status of space members here as well as invite new members.',
@@ -167,4 +231,4 @@ export default [
167
231
  },
168
232
  },
169
233
  },
170
- ];
234
+ ] as const satisfies Resource[];
@@ -5,13 +5,13 @@
5
5
  import { Schema } from 'effect';
6
6
 
7
7
  import { type AnyIntentChain } from '@dxos/app-framework';
8
- import { Type, type Obj } from '@dxos/echo';
9
- import { type BaseObject, type TypedObject } from '@dxos/echo-schema';
8
+ import { type Obj, Type } from '@dxos/echo';
9
+ import { EchoSchema, StoredSchema, type TypedObject, type BaseObject } from '@dxos/echo-schema';
10
10
  import { type PublicKey } from '@dxos/react-client';
11
11
  // TODO(wittjosiah): This pulls in full client.
12
12
  import { EchoObjectSchema, ReactiveObjectSchema, type Space, SpaceSchema } from '@dxos/react-client/echo';
13
13
  import { CancellableInvitationObservable, Invitation } from '@dxos/react-client/invitations';
14
- import { DataType, TypenameAnnotationId } from '@dxos/schema';
14
+ import { DataType, FieldSchema, TypenameAnnotationId } from '@dxos/schema';
15
15
  import { type ComplexMap } from '@dxos/util';
16
16
 
17
17
  import { SPACE_PLUGIN } from '../meta';
@@ -217,11 +217,63 @@ export namespace SpaceAction {
217
217
  output: Schema.Boolean,
218
218
  }) {}
219
219
 
220
+ export const StoredSchemaForm = Schema.Struct({
221
+ name: Schema.optional(Schema.String),
222
+ typename: Schema.optional(
223
+ Schema.String.annotations({
224
+ [TypenameAnnotationId]: ['unused-static'],
225
+ }),
226
+ ),
227
+ });
228
+
229
+ export class UseStaticSchema extends Schema.TaggedClass<UseStaticSchema>()(`${SPACE_ACTION}/use-static-schema`, {
230
+ input: Schema.Struct({
231
+ space: SpaceSchema,
232
+ typename: Schema.String,
233
+ }),
234
+ output: Schema.Struct({}),
235
+ }) {}
236
+
237
+ export class AddSchema extends Schema.TaggedClass<AddSchema>()(`${SPACE_ACTION}/add-schema`, {
238
+ input: Schema.Struct({
239
+ space: SpaceSchema,
240
+ name: Schema.optional(Schema.String),
241
+ // TODO(wittjosiah): Schema for schema?
242
+ schema: Schema.Any,
243
+ }),
244
+ output: Schema.Struct({
245
+ // TODO(wittjosiah): ObjectId.
246
+ id: Schema.String,
247
+ object: StoredSchema,
248
+ schema: Schema.instanceOf(EchoSchema),
249
+ }),
250
+ }) {}
251
+
252
+ export class DeleteField extends Schema.TaggedClass<DeleteField>()(`${SPACE_ACTION}/delete-field`, {
253
+ input: Schema.Struct({
254
+ view: DataType.View,
255
+ fieldId: Schema.String,
256
+ // TODO(wittjosiah): Separate fields for undo data?
257
+ deletionData: Schema.optional(
258
+ Schema.Struct({
259
+ field: FieldSchema,
260
+ // TODO(wittjosiah): This creates a type error.
261
+ // props: PropertySchema,
262
+ props: Schema.Any,
263
+ index: Schema.Number,
264
+ }),
265
+ ),
266
+ }),
267
+ output: Schema.Void,
268
+ }) {}
269
+
220
270
  export class OpenCreateObject extends Schema.TaggedClass<OpenCreateObject>()(`${SPACE_ACTION}/open-create-object`, {
221
271
  input: Schema.Struct({
222
272
  target: Schema.Union(SpaceSchema, DataType.Collection),
223
273
  typename: Schema.optional(Schema.String),
224
274
  navigable: Schema.optional(Schema.Boolean),
275
+ // TODO(wittjosiah): This is a function, is there a better way to handle this?
276
+ onCreateObject: Schema.optional(Schema.Any),
225
277
  }),
226
278
  output: Schema.Void,
227
279
  }) {}
@@ -233,6 +285,7 @@ export namespace SpaceAction {
233
285
  hidden: Schema.optional(Schema.Boolean),
234
286
  }),
235
287
  output: Schema.Struct({
288
+ // TODO(wittjosiah): ObjectId.
236
289
  id: Schema.String,
237
290
  subject: Schema.Array(Schema.String),
238
291
  object: EchoObjectSchema,