@dxos/plugin-space 0.8.4-main.67995b8 → 0.8.4-main.70d3990
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.
- package/dist/lib/browser/{CollectionMain-D2B75XBS.mjs → CollectionArticle-WTHWY4YS.mjs} +10 -10
- package/dist/lib/browser/CollectionArticle-WTHWY4YS.mjs.map +7 -0
- package/dist/lib/browser/ObjectDetailsPanel-ACGHWPDX.mjs +141 -0
- package/dist/lib/browser/ObjectDetailsPanel-ACGHWPDX.mjs.map +7 -0
- package/dist/lib/browser/ObjectSettings-U3IH7BMV.mjs +144 -0
- package/dist/lib/browser/ObjectSettings-U3IH7BMV.mjs.map +7 -0
- package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs +116 -0
- package/dist/lib/browser/RecordArticle-2PFEBPXY.mjs.map +7 -0
- package/dist/lib/browser/app-graph-builder-HABMCWAI.mjs +517 -0
- package/dist/lib/browser/app-graph-builder-HABMCWAI.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-H6AW7KGS.mjs → app-graph-serializer-G3VFEGTN.mjs} +19 -19
- package/dist/lib/browser/app-graph-serializer-G3VFEGTN.mjs.map +7 -0
- package/dist/lib/browser/chunk-6A3NWBB6.mjs +392 -0
- package/dist/lib/browser/chunk-6A3NWBB6.mjs.map +7 -0
- package/dist/lib/browser/chunk-C6DAPIFF.mjs +20 -0
- package/dist/lib/browser/chunk-C6DAPIFF.mjs.map +7 -0
- package/dist/lib/browser/{chunk-XUYKJUU7.mjs → chunk-GJOZILGC.mjs} +262 -143
- package/dist/lib/browser/chunk-GJOZILGC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-FBJEXW54.mjs → chunk-KCZ527AM.mjs} +667 -525
- package/dist/lib/browser/chunk-KCZ527AM.mjs.map +7 -0
- package/dist/lib/browser/{chunk-VLBRSGJ2.mjs → chunk-P25R3AOK.mjs} +36 -6
- package/dist/lib/browser/chunk-P25R3AOK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-QACNNDOT.mjs → chunk-POFUXISV.mjs} +69 -62
- package/dist/lib/browser/chunk-POFUXISV.mjs.map +7 -0
- package/dist/lib/browser/chunk-VZBIIYFM.mjs +16 -0
- package/dist/lib/browser/chunk-VZBIIYFM.mjs.map +7 -0
- package/dist/lib/browser/chunk-WJXU4GKV.mjs +19 -0
- package/dist/lib/browser/chunk-WJXU4GKV.mjs.map +7 -0
- package/dist/lib/browser/{identity-created-23XJJV2N.mjs → identity-created-NAXTPQXE.mjs} +6 -6
- package/dist/lib/browser/identity-created-NAXTPQXE.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +88 -135
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-XHGD73WZ.mjs → intent-resolver-RZEWNJ2K.mjs} +114 -101
- package/dist/lib/browser/intent-resolver-RZEWNJ2K.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-root-JCRD74GI.mjs +30 -0
- package/dist/lib/browser/react-root-JCRD74GI.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-YWZZQF7H.mjs → react-surface-VOETEAG3.mjs} +101 -111
- package/dist/lib/browser/react-surface-VOETEAG3.mjs.map +7 -0
- package/dist/lib/browser/repair-CNLE35NF.mjs +44 -0
- package/dist/lib/browser/repair-CNLE35NF.mjs.map +7 -0
- package/dist/lib/browser/{settings-4IMP5RYT.mjs → settings-TRLI52I5.mjs} +5 -5
- package/dist/lib/browser/{settings-4IMP5RYT.mjs.map → settings-TRLI52I5.mjs.map} +1 -1
- package/dist/lib/browser/{spaces-ready-TOPG6IV4.mjs → spaces-ready-OHGCWZHQ.mjs} +28 -19
- package/dist/lib/browser/spaces-ready-OHGCWZHQ.mjs.map +7 -0
- package/dist/lib/browser/{state-QYZAB45H.mjs → state-C7N6EDDZ.mjs} +7 -7
- package/dist/lib/browser/state-C7N6EDDZ.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +10 -4
- package/dist/lib/node-esm/{CollectionMain-ZJIFCWKZ.mjs → CollectionArticle-KHXYT3SH.mjs} +10 -10
- package/dist/lib/node-esm/CollectionArticle-KHXYT3SH.mjs.map +7 -0
- package/dist/lib/node-esm/ObjectDetailsPanel-6OFTT3GG.mjs +142 -0
- package/dist/lib/node-esm/ObjectDetailsPanel-6OFTT3GG.mjs.map +7 -0
- package/dist/lib/node-esm/ObjectSettings-YXPJQMJ5.mjs +145 -0
- package/dist/lib/node-esm/ObjectSettings-YXPJQMJ5.mjs.map +7 -0
- package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs +117 -0
- package/dist/lib/node-esm/RecordArticle-SSJ7PULS.mjs.map +7 -0
- package/dist/lib/node-esm/app-graph-builder-T6VJKIOA.mjs +518 -0
- package/dist/lib/node-esm/app-graph-builder-T6VJKIOA.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-2ICUGQQT.mjs → app-graph-serializer-2NLWWFUB.mjs} +19 -19
- package/dist/lib/node-esm/app-graph-serializer-2NLWWFUB.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SSLBYZEY.mjs → chunk-7EV4SN47.mjs} +35 -6
- package/dist/lib/node-esm/chunk-7EV4SN47.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-P442DOQ3.mjs → chunk-AX3UGL5D.mjs} +69 -62
- package/dist/lib/node-esm/chunk-AX3UGL5D.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-BDEFTL6K.mjs +18 -0
- package/dist/lib/node-esm/chunk-BDEFTL6K.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-H4JILUJK.mjs +20 -0
- package/dist/lib/node-esm/chunk-H4JILUJK.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-4AOMYKDE.mjs → chunk-I6FZP42D.mjs} +262 -143
- package/dist/lib/node-esm/chunk-I6FZP42D.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-2A3VBXBP.mjs → chunk-JAMGJUFU.mjs} +667 -525
- package/dist/lib/node-esm/chunk-JAMGJUFU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WWGV5FJM.mjs +21 -0
- package/dist/lib/node-esm/chunk-WWGV5FJM.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-X34VDVMY.mjs +393 -0
- package/dist/lib/node-esm/chunk-X34VDVMY.mjs.map +7 -0
- package/dist/lib/node-esm/{identity-created-IJQO6GCR.mjs → identity-created-OXLKCJE3.mjs} +6 -6
- package/dist/lib/node-esm/identity-created-OXLKCJE3.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +88 -135
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-LEANKSKZ.mjs → intent-resolver-4PHJWDXW.mjs} +114 -101
- package/dist/lib/node-esm/intent-resolver-4PHJWDXW.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-root-5Y7LJRX6.mjs → react-root-O5I5CDJ7.mjs} +13 -12
- package/dist/lib/node-esm/react-root-O5I5CDJ7.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-YQFNIKYT.mjs → react-surface-J3XDMU2D.mjs} +101 -111
- package/dist/lib/node-esm/react-surface-J3XDMU2D.mjs.map +7 -0
- package/dist/lib/node-esm/repair-EHZS6MFY.mjs +45 -0
- package/dist/lib/node-esm/repair-EHZS6MFY.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-SAOBPND3.mjs → settings-MNQTKHL7.mjs} +5 -5
- package/dist/lib/node-esm/{settings-SAOBPND3.mjs.map → settings-MNQTKHL7.mjs.map} +1 -1
- package/dist/lib/node-esm/{spaces-ready-HIUKNDZK.mjs → spaces-ready-ZPU24DA2.mjs} +28 -19
- package/dist/lib/node-esm/spaces-ready-ZPU24DA2.mjs.map +7 -0
- package/dist/lib/node-esm/{state-ZVEHQ4BJ.mjs → state-45TXZQJ6.mjs} +7 -7
- package/dist/lib/node-esm/state-45TXZQJ6.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +10 -4
- package/dist/types/src/SpacePlugin.d.ts +1 -1
- package/dist/types/src/SpacePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +14 -8
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/identity-created.d.ts +1 -1
- package/dist/types/src/capabilities/identity-created.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +11 -12
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-root.d.ts +2 -2
- package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/repair.d.ts +4 -0
- package/dist/types/src/capabilities/repair.d.ts.map +1 -0
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
- package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
- package/dist/types/src/components/CollectionArticle.d.ts +6 -0
- package/dist/types/src/components/CollectionArticle.d.ts.map +1 -0
- package/dist/types/src/components/CollectionSection.d.ts +3 -4
- package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +3 -3
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1588 -4
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +18 -9
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -1
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/components/{JoinDialog.d.ts → JoinDialog/JoinDialog.d.ts} +1 -1
- package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -0
- package/dist/types/src/components/JoinDialog/index.d.ts +2 -0
- package/dist/types/src/components/JoinDialog/index.d.ts.map +1 -0
- package/dist/types/src/components/{MembersContainer.d.ts → MembersContainer/MembersContainer.d.ts} +3 -2
- package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -0
- package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1591 -0
- package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts.map +1 -0
- package/dist/types/src/components/MembersContainer/index.d.ts +2 -0
- package/dist/types/src/components/MembersContainer/index.d.ts.map +1 -0
- package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts +9 -0
- package/dist/types/src/components/ObjectDetailsPanel/ObjectDetailsPanel.d.ts.map +1 -0
- package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts +10 -0
- package/dist/types/src/components/ObjectDetailsPanel/ObjectForm.d.ts.map +1 -0
- package/dist/types/src/components/ObjectDetailsPanel/index.d.ts +3 -0
- package/dist/types/src/components/ObjectDetailsPanel/index.d.ts.map +1 -0
- package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts +7 -0
- package/dist/types/src/components/ObjectRenamePopover/ObjectRenamePopover.d.ts.map +1 -0
- package/dist/types/src/components/ObjectRenamePopover/index.d.ts +2 -0
- package/dist/types/src/components/ObjectRenamePopover/index.d.ts.map +1 -0
- package/dist/types/src/components/ObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
- package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts +2 -2
- package/dist/types/src/components/ObjectSettings/BaseObjectSettings.d.ts.map +1 -1
- package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts +1424 -0
- package/dist/types/src/components/ObjectSettings/BaseObjectSettings.stories.d.ts.map +1 -0
- package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts +3 -3
- package/dist/types/src/components/ObjectSettings/ForeignKeys.d.ts.map +1 -1
- package/dist/types/src/components/ObjectSettings/ObjectSettingsContainer.d.ts.map +1 -1
- package/dist/types/src/components/ObjectSettings/index.d.ts +2 -1
- package/dist/types/src/components/ObjectSettings/index.d.ts.map +1 -1
- package/dist/types/src/components/RecordArticle.d.ts +5 -0
- package/dist/types/src/components/RecordArticle.d.ts.map +1 -0
- package/dist/types/src/components/RecordArticle.stories.d.ts +1591 -0
- package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -0
- package/dist/types/src/components/SchemaContainer.d.ts +2 -2
- package/dist/types/src/components/SchemaContainer.d.ts.map +1 -1
- package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
- package/dist/types/src/components/{SpacePresence.d.ts → SpacePresence/SpacePresence.d.ts} +6 -5
- package/dist/types/src/components/SpacePresence/SpacePresence.d.ts.map +1 -0
- package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts +1421 -0
- package/dist/types/src/components/SpacePresence/SpacePresence.stories.d.ts.map +1 -0
- package/dist/types/src/components/SpacePresence/index.d.ts +2 -0
- package/dist/types/src/components/SpacePresence/index.d.ts.map +1 -0
- package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts +7 -0
- package/dist/types/src/components/SpaceRenamePopover/SpaceRenamePopover.d.ts.map +1 -0
- package/dist/types/src/components/SpaceRenamePopover/index.d.ts +2 -0
- package/dist/types/src/components/SpaceRenamePopover/index.d.ts.map +1 -0
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +1421 -4
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts +1422 -5
- package/dist/types/src/components/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
- package/dist/types/src/components/ViewEditor.d.ts +3 -4
- package/dist/types/src/components/ViewEditor.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +10 -11
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/helpers/index.d.ts +2 -0
- package/dist/types/src/helpers/index.d.ts.map +1 -0
- package/dist/types/src/helpers/query.d.ts +8 -0
- package/dist/types/src/helpers/query.d.ts.map +1 -0
- package/dist/types/src/helpers/query.test.d.ts +2 -0
- package/dist/types/src/helpers/query.test.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
- package/dist/types/src/hooks/useInputSurfaceLookup.d.ts +1 -1
- package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
- package/dist/types/src/hooks/usePath.d.ts +1 -1
- package/dist/types/src/hooks/usePath.d.ts.map +1 -1
- package/dist/types/src/hooks/useTypeOptions.d.ts +10 -0
- package/dist/types/src/hooks/useTypeOptions.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +0 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +1261 -67
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/form.d.ts +24 -0
- package/dist/types/src/types/form.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +1 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +94 -155
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +25 -36
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +72 -63
- package/src/SpacePlugin.ts +182 -222
- package/src/capabilities/app-graph-builder.ts +221 -237
- package/src/capabilities/app-graph-serializer.ts +12 -12
- package/src/capabilities/capabilities.ts +28 -17
- package/src/capabilities/identity-created.ts +3 -3
- package/src/capabilities/index.ts +1 -2
- package/src/capabilities/intent-resolver.ts +91 -79
- package/src/capabilities/react-root.tsx +6 -4
- package/src/capabilities/react-surface.tsx +108 -149
- package/src/capabilities/repair.ts +57 -0
- package/src/capabilities/spaces-ready.ts +23 -11
- package/src/capabilities/state.ts +5 -4
- package/src/components/AwaitingObject.tsx +12 -14
- package/src/components/{CollectionMain.tsx → CollectionArticle.tsx} +7 -6
- package/src/components/CollectionSection.tsx +8 -6
- package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +17 -16
- package/src/components/CreateDialog/CreateObjectDialog.tsx +74 -46
- package/src/components/CreateDialog/CreateObjectPanel.tsx +51 -33
- package/src/components/CreateDialog/CreateSpaceDialog.tsx +30 -11
- package/src/components/{JoinDialog.tsx → JoinDialog/JoinDialog.tsx} +26 -10
- package/src/components/JoinDialog/index.ts +5 -0
- package/src/components/MembersContainer/MembersContainer.stories.tsx +56 -0
- package/src/components/{MembersContainer.tsx → MembersContainer/MembersContainer.tsx} +22 -21
- package/src/components/MembersContainer/index.ts +5 -0
- package/src/components/MenuFooter.tsx +2 -2
- package/src/components/ObjectDetailsPanel/ObjectDetailsPanel.tsx +51 -0
- package/src/components/ObjectDetailsPanel/ObjectForm.tsx +72 -0
- package/src/components/ObjectDetailsPanel/index.ts +7 -0
- package/src/components/{PopoverRenameObject.tsx → ObjectRenamePopover/ObjectRenamePopover.tsx} +10 -16
- package/src/components/ObjectRenamePopover/index.ts +5 -0
- package/src/components/ObjectSettings/AdvancedObjectSettings.tsx +7 -7
- package/src/components/ObjectSettings/BaseObjectSettings.stories.tsx +63 -0
- package/src/components/ObjectSettings/BaseObjectSettings.tsx +90 -26
- package/src/components/ObjectSettings/ForeignKeys.tsx +8 -8
- package/src/components/ObjectSettings/ObjectSettingsContainer.tsx +4 -3
- package/src/components/ObjectSettings/index.ts +3 -1
- package/src/components/RecordArticle.stories.tsx +115 -0
- package/src/components/RecordArticle.tsx +114 -0
- package/src/components/SchemaContainer.tsx +26 -29
- package/src/components/SpacePluginSettings.tsx +16 -11
- package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx} +24 -23
- package/src/components/{SpacePresence.tsx → SpacePresence/SpacePresence.tsx} +22 -17
- package/src/components/SpacePresence/index.ts +5 -0
- package/src/components/{PopoverRenameSpace.tsx → SpaceRenamePopover/SpaceRenamePopover.tsx} +7 -6
- package/src/components/SpaceRenamePopover/index.ts +5 -0
- package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +17 -9
- package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +68 -28
- package/src/components/SyncStatus/InlineSyncStatus.tsx +8 -8
- package/src/components/SyncStatus/SyncStatus.stories.tsx +9 -9
- package/src/components/SyncStatus/SyncStatus.tsx +109 -12
- package/src/components/ViewEditor.tsx +57 -23
- package/src/components/index.ts +7 -7
- package/src/events.ts +7 -7
- package/src/helpers/index.ts +5 -0
- package/src/helpers/query.test.ts +24 -0
- package/src/helpers/query.ts +158 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useActiveSpace.ts +3 -2
- package/src/hooks/useInputSurfaceLookup.tsx +8 -3
- package/src/hooks/usePath.ts +1 -1
- package/src/hooks/useTypeOptions.ts +27 -0
- package/src/index.ts +1 -0
- package/src/meta.ts +6 -3
- package/src/translations.ts +68 -58
- package/src/types/form.ts +75 -0
- package/src/types/index.ts +1 -0
- package/src/types/types.ts +49 -50
- package/src/util.tsx +268 -145
- package/dist/lib/browser/CollectionMain-D2B75XBS.mjs.map +0 -7
- package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs +0 -88
- package/dist/lib/browser/ObjectDetailsPanel-YPTDQKMG.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-V3MP3CDK.mjs +0 -480
- package/dist/lib/browser/app-graph-builder-V3MP3CDK.mjs.map +0 -7
- package/dist/lib/browser/app-graph-serializer-H6AW7KGS.mjs.map +0 -7
- package/dist/lib/browser/chunk-CEFHNVU7.mjs +0 -20
- package/dist/lib/browser/chunk-CEFHNVU7.mjs.map +0 -7
- package/dist/lib/browser/chunk-FBCGT5YY.mjs +0 -13
- package/dist/lib/browser/chunk-FBCGT5YY.mjs.map +0 -7
- package/dist/lib/browser/chunk-FBJEXW54.mjs.map +0 -7
- package/dist/lib/browser/chunk-JS3MMC42.mjs +0 -19
- package/dist/lib/browser/chunk-JS3MMC42.mjs.map +0 -7
- package/dist/lib/browser/chunk-QACNNDOT.mjs.map +0 -7
- package/dist/lib/browser/chunk-SGTQ52SU.mjs +0 -338
- package/dist/lib/browser/chunk-SGTQ52SU.mjs.map +0 -7
- package/dist/lib/browser/chunk-VLBRSGJ2.mjs.map +0 -7
- package/dist/lib/browser/chunk-XUYKJUU7.mjs.map +0 -7
- package/dist/lib/browser/identity-created-23XJJV2N.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-XHGD73WZ.mjs.map +0 -7
- package/dist/lib/browser/react-root-CMWOGJG5.mjs +0 -29
- package/dist/lib/browser/react-root-CMWOGJG5.mjs.map +0 -7
- package/dist/lib/browser/react-surface-YWZZQF7H.mjs.map +0 -7
- package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs +0 -26
- package/dist/lib/browser/schema-defs-Z6FC4AHC.mjs.map +0 -7
- package/dist/lib/browser/schema-tools-BNP4JTD7.mjs +0 -124
- package/dist/lib/browser/schema-tools-BNP4JTD7.mjs.map +0 -7
- package/dist/lib/browser/spaces-ready-TOPG6IV4.mjs.map +0 -7
- package/dist/lib/browser/state-QYZAB45H.mjs.map +0 -7
- package/dist/lib/node-esm/CollectionMain-ZJIFCWKZ.mjs.map +0 -7
- package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs +0 -89
- package/dist/lib/node-esm/ObjectDetailsPanel-QKZEDSZK.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-SG4VECBB.mjs +0 -481
- package/dist/lib/node-esm/app-graph-builder-SG4VECBB.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-serializer-2ICUGQQT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2A3VBXBP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4AOMYKDE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5HHYE264.mjs +0 -20
- package/dist/lib/node-esm/chunk-5HHYE264.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5T3ZH23B.mjs +0 -21
- package/dist/lib/node-esm/chunk-5T3ZH23B.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HWNG4MEU.mjs +0 -15
- package/dist/lib/node-esm/chunk-HWNG4MEU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JH6F4C3I.mjs +0 -339
- package/dist/lib/node-esm/chunk-JH6F4C3I.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-P442DOQ3.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SSLBYZEY.mjs.map +0 -7
- package/dist/lib/node-esm/identity-created-IJQO6GCR.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-LEANKSKZ.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-5Y7LJRX6.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-YQFNIKYT.mjs.map +0 -7
- package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs +0 -27
- package/dist/lib/node-esm/schema-defs-WHJM7UZE.mjs.map +0 -7
- package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs +0 -126
- package/dist/lib/node-esm/schema-tools-KWW5PTML.mjs.map +0 -7
- package/dist/lib/node-esm/spaces-ready-HIUKNDZK.mjs.map +0 -7
- package/dist/lib/node-esm/state-ZVEHQ4BJ.mjs.map +0 -7
- package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
- package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
- package/dist/types/src/capabilities/schema-tool.test.d.ts +0 -2
- package/dist/types/src/capabilities/schema-tool.test.d.ts.map +0 -1
- package/dist/types/src/capabilities/schema-tools.d.ts +0 -13
- package/dist/types/src/capabilities/schema-tools.d.ts.map +0 -1
- package/dist/types/src/components/CollectionMain.d.ts +0 -7
- package/dist/types/src/components/CollectionMain.d.ts.map +0 -1
- package/dist/types/src/components/JoinDialog.d.ts.map +0 -1
- package/dist/types/src/components/MembersContainer.d.ts.map +0 -1
- package/dist/types/src/components/MembersContainer.stories.d.ts +0 -8
- package/dist/types/src/components/MembersContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/ObjectDetailsPanel.d.ts +0 -9
- package/dist/types/src/components/ObjectDetailsPanel.d.ts.map +0 -1
- package/dist/types/src/components/PersistenceStatus.d.ts +0 -6
- package/dist/types/src/components/PersistenceStatus.d.ts.map +0 -1
- package/dist/types/src/components/PopoverRenameObject.d.ts +0 -7
- package/dist/types/src/components/PopoverRenameObject.d.ts.map +0 -1
- package/dist/types/src/components/PopoverRenameSpace.d.ts +0 -7
- package/dist/types/src/components/PopoverRenameSpace.d.ts.map +0 -1
- package/dist/types/src/components/SpacePresence.d.ts.map +0 -1
- package/dist/types/src/components/SpacePresence.stories.d.ts +0 -9
- package/dist/types/src/components/SpacePresence.stories.d.ts.map +0 -1
- package/src/capabilities/schema-defs.ts +0 -30
- package/src/capabilities/schema-tool.test.ts +0 -44
- package/src/capabilities/schema-tools.ts +0 -125
- package/src/components/MembersContainer.stories.tsx +0 -30
- package/src/components/ObjectDetailsPanel.tsx +0 -77
- package/src/components/PersistenceStatus.tsx +0 -83
|
@@ -2,12 +2,29 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
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 {
|
|
8
|
-
import {
|
|
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
|
|
20
|
-
const
|
|
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
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
7
|
+
import { type Key } from '@dxos/echo';
|
|
8
8
|
import { IconButton, List, ListItem, useTranslation } from '@dxos/react-ui';
|
|
9
9
|
|
|
10
|
-
import {
|
|
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(
|
|
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='
|
|
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
|
|
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} />
|
|
@@ -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, {
|
|
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 {
|
|
10
|
+
import { ControlPage, ControlSection, controlItemClasses } from '@dxos/react-ui-form';
|
|
11
11
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
12
12
|
|
|
13
|
-
import {
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
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 {
|
|
11
|
-
import {
|
|
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 {
|
|
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(
|
|
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
|
-
<
|
|
28
|
-
<
|
|
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
|
-
</
|
|
34
|
-
</
|
|
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(
|
|
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'
|
package/src/components/{SpacePresence.stories.tsx → SpacePresence/SpacePresence.stories.tsx}
RENAMED
|
@@ -2,19 +2,18 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@dxos-theme';
|
|
6
|
-
|
|
7
5
|
import { type Meta } from '@storybook/react-vite';
|
|
8
6
|
import React from 'react';
|
|
9
7
|
|
|
10
8
|
import { IdentityDid, PublicKey } from '@dxos/keys';
|
|
11
9
|
import { HaloSpaceMember, SpaceMember } from '@dxos/react-client/echo';
|
|
12
|
-
import {
|
|
10
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
11
|
+
|
|
12
|
+
import { translations } from '../../translations';
|
|
13
13
|
|
|
14
|
-
import { FullPresence, type MemberPresenceProps, SmallPresence
|
|
15
|
-
import { translations } from '../translations';
|
|
14
|
+
import { FullPresence, type Member, type MemberPresenceProps, SmallPresence } from './SpacePresence';
|
|
16
15
|
|
|
17
|
-
const
|
|
16
|
+
const viewers = (n: number, currentlyAttended = true): Member[] =>
|
|
18
17
|
Array.from({ length: n }, () => ({
|
|
19
18
|
role: HaloSpaceMember.Role.ADMIN,
|
|
20
19
|
identity: { did: IdentityDid.random(), identityKey: PublicKey.random() },
|
|
@@ -23,6 +22,16 @@ const nViewers = (n: number, currentlyAttended = true): Member[] =>
|
|
|
23
22
|
currentlyAttended,
|
|
24
23
|
}));
|
|
25
24
|
|
|
25
|
+
const meta = {
|
|
26
|
+
title: 'plugins/plugin-space/SpacePresence',
|
|
27
|
+
decorators: [withTheme],
|
|
28
|
+
parameters: {
|
|
29
|
+
translations,
|
|
30
|
+
},
|
|
31
|
+
} satisfies Meta<typeof IdentityDid>;
|
|
32
|
+
|
|
33
|
+
export default meta;
|
|
34
|
+
|
|
26
35
|
export const Full = (props: MemberPresenceProps) => {
|
|
27
36
|
const p: MemberPresenceProps = {
|
|
28
37
|
...props,
|
|
@@ -31,31 +40,31 @@ export const Full = (props: MemberPresenceProps) => {
|
|
|
31
40
|
return (
|
|
32
41
|
<div className='p-4'>
|
|
33
42
|
<div className='p-3'>
|
|
34
|
-
<FullPresence members={
|
|
43
|
+
<FullPresence members={viewers(1)} {...p} />
|
|
35
44
|
</div>
|
|
36
45
|
<div className='p-3'>
|
|
37
|
-
<FullPresence members={
|
|
46
|
+
<FullPresence members={viewers(2)} {...p} />
|
|
38
47
|
</div>
|
|
39
48
|
<div className='p-3'>
|
|
40
|
-
<FullPresence members={
|
|
49
|
+
<FullPresence members={viewers(3)} {...p} />
|
|
41
50
|
</div>
|
|
42
51
|
<div className='p-3'>
|
|
43
|
-
<FullPresence members={
|
|
52
|
+
<FullPresence members={viewers(3, false)} {...p} />
|
|
44
53
|
</div>
|
|
45
54
|
<div className='p-3'>
|
|
46
|
-
<FullPresence members={
|
|
55
|
+
<FullPresence members={viewers(4)} {...p} />
|
|
47
56
|
</div>
|
|
48
57
|
<div className='p-3'>
|
|
49
|
-
<FullPresence members={
|
|
58
|
+
<FullPresence members={viewers(5)} {...p} />
|
|
50
59
|
</div>
|
|
51
60
|
<div className='p-3'>
|
|
52
|
-
<FullPresence members={
|
|
61
|
+
<FullPresence members={viewers(5, false)} {...p} />
|
|
53
62
|
</div>
|
|
54
63
|
<div className='p-3'>
|
|
55
|
-
<FullPresence members={
|
|
64
|
+
<FullPresence members={viewers(10)} {...p} />
|
|
56
65
|
</div>
|
|
57
66
|
<div className='p-3'>
|
|
58
|
-
<FullPresence members={
|
|
67
|
+
<FullPresence members={viewers(100)} {...p} />
|
|
59
68
|
</div>
|
|
60
69
|
</div>
|
|
61
70
|
);
|
|
@@ -97,11 +106,3 @@ export const Small = () => {
|
|
|
97
106
|
</div>
|
|
98
107
|
);
|
|
99
108
|
};
|
|
100
|
-
|
|
101
|
-
const meta: Meta = {
|
|
102
|
-
title: 'plugins/plugin-space/SpacePresence',
|
|
103
|
-
decorators: [withTheme, withLayout()],
|
|
104
|
-
parameters: { translations },
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
export default meta;
|