@dxos/plugin-space 0.7.5-main.e9bb01b → 0.7.5-staging.2ff1350
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/{app-graph-builder-J4NX44Y4.mjs → app-graph-builder-MGK5HWPZ.mjs} +21 -100
- package/dist/lib/browser/app-graph-builder-MGK5HWPZ.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-QF7VVRCV.mjs → app-graph-serializer-FOWFLYGU.mjs} +4 -4
- package/dist/lib/browser/{chunk-6UIFMVVI.mjs → chunk-23RVI5FZ.mjs} +16 -5
- package/dist/lib/browser/chunk-23RVI5FZ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-RLZQJD47.mjs → chunk-NU7WDVGN.mjs} +2 -1
- package/dist/lib/browser/chunk-NU7WDVGN.mjs.map +7 -0
- package/dist/lib/browser/{chunk-XZ2NH3CP.mjs → chunk-POARSSRI.mjs} +306 -210
- package/dist/lib/browser/chunk-POARSSRI.mjs.map +7 -0
- package/dist/lib/browser/{chunk-SDK7RZI3.mjs → chunk-UDWHTKB5.mjs} +6 -3
- package/dist/lib/browser/chunk-UDWHTKB5.mjs.map +7 -0
- package/dist/lib/browser/{chunk-XPZ6IIXF.mjs → chunk-ULA2UQJ4.mjs} +15 -1
- package/dist/lib/browser/chunk-ULA2UQJ4.mjs.map +7 -0
- package/dist/lib/browser/{identity-created-25TK5XNO.mjs → identity-created-FYGS6TBH.mjs} +2 -2
- package/dist/lib/browser/index.mjs +55 -21
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-IEDVV74T.mjs → intent-resolver-E2UU3DAS.mjs} +86 -54
- package/dist/lib/browser/intent-resolver-E2UU3DAS.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-root-6VRPRLQR.mjs → react-root-STUND2SO.mjs} +5 -5
- package/dist/lib/browser/{react-surface-DMNDXLZ7.mjs → react-surface-P7CKFNJR.mjs} +16 -22
- package/dist/lib/browser/react-surface-P7CKFNJR.mjs.map +7 -0
- package/dist/lib/browser/schema-5W3DSY2E.mjs +24 -0
- package/dist/lib/browser/schema-5W3DSY2E.mjs.map +7 -0
- package/dist/lib/browser/{settings-K4JPYYEM.mjs → settings-PHPCXX33.mjs} +2 -2
- package/dist/lib/browser/{spaces-ready-2MUWWVVO.mjs → spaces-ready-K47RR7N2.mjs} +4 -4
- package/dist/lib/browser/{state-6DCY5YJP.mjs → state-INJ63O57.mjs} +2 -2
- package/dist/lib/browser/types/index.mjs +5 -3
- package/dist/lib/node/{app-graph-builder-ZOPG4MOS.cjs → app-graph-builder-ZIUBXRPA.cjs} +45 -124
- package/dist/lib/node/app-graph-builder-ZIUBXRPA.cjs.map +7 -0
- package/dist/lib/node/{app-graph-serializer-QE2G4MWB.cjs → app-graph-serializer-VQOGHKXL.cjs} +20 -20
- package/dist/lib/node/{chunk-3QWZCN6L.cjs → chunk-OVGKWJOC.cjs} +51 -40
- package/dist/lib/node/chunk-OVGKWJOC.cjs.map +7 -0
- package/dist/lib/node/{chunk-SZEIQGQU.cjs → chunk-RHYA4XUB.cjs} +367 -270
- package/dist/lib/node/chunk-RHYA4XUB.cjs.map +7 -0
- package/dist/lib/node/{chunk-D6BFKOXY.cjs → chunk-U6DYXAR3.cjs} +10 -7
- package/dist/lib/node/chunk-U6DYXAR3.cjs.map +7 -0
- package/dist/lib/node/{chunk-6MEOP3DH.cjs → chunk-WAJKBO3J.cjs} +21 -6
- package/dist/lib/node/chunk-WAJKBO3J.cjs.map +7 -0
- package/dist/lib/node/{chunk-UX3U4RU2.cjs → chunk-YZKNRFHU.cjs} +5 -4
- package/dist/lib/node/chunk-YZKNRFHU.cjs.map +7 -0
- package/dist/lib/node/{identity-created-7G5U7R36.cjs → identity-created-AXI64BLE.cjs} +6 -6
- package/dist/lib/node/index.cjs +108 -75
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-N2W2L6OL.cjs → intent-resolver-TJ5DFPZP.cjs} +136 -105
- package/dist/lib/node/intent-resolver-TJ5DFPZP.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-root-YD35W3VU.cjs → react-root-WQGBCJ2K.cjs} +10 -10
- package/dist/lib/node/{react-surface-QPLXK7DT.cjs → react-surface-GSEV6XCR.cjs} +49 -57
- package/dist/lib/node/react-surface-GSEV6XCR.cjs.map +7 -0
- package/dist/lib/node/schema-YN7WVFRX.cjs +40 -0
- package/dist/lib/node/schema-YN7WVFRX.cjs.map +7 -0
- package/dist/lib/node/{settings-TEELGWS4.cjs → settings-5QYFWNH7.cjs} +6 -6
- package/dist/lib/node/{spaces-ready-PZZQWS6T.cjs → spaces-ready-FQNAKR7G.cjs} +13 -13
- package/dist/lib/node/{state-WPZC4JXB.cjs → state-57UE3DYE.cjs} +6 -6
- package/dist/lib/node/types/index.cjs +18 -16
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/{app-graph-builder-TKGLOK22.mjs → app-graph-builder-TERVM2SL.mjs} +21 -100
- package/dist/lib/node-esm/app-graph-builder-TERVM2SL.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-HLX2JRNF.mjs → app-graph-serializer-GZRSWHEN.mjs} +4 -4
- package/dist/lib/node-esm/{chunk-4UX5WGKJ.mjs → chunk-2TQ2AJEZ.mjs} +6 -3
- package/dist/lib/node-esm/chunk-2TQ2AJEZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LGL4A5B5.mjs → chunk-6RSVVEPS.mjs} +2 -1
- package/dist/lib/node-esm/chunk-6RSVVEPS.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-N6EAOMIS.mjs → chunk-ONKFX23L.mjs} +306 -210
- package/dist/lib/node-esm/chunk-ONKFX23L.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LA45TPAN.mjs → chunk-PGH5L7MV.mjs} +16 -5
- package/dist/lib/node-esm/chunk-PGH5L7MV.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-AAQRELDK.mjs → chunk-TRNZQEEN.mjs} +15 -1
- package/dist/lib/node-esm/chunk-TRNZQEEN.mjs.map +7 -0
- package/dist/lib/node-esm/{identity-created-7THGZ7EW.mjs → identity-created-3CGEXNPO.mjs} +2 -2
- package/dist/lib/node-esm/index.mjs +55 -21
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-L2TKJU4I.mjs → intent-resolver-7NJCJ3FA.mjs} +86 -54
- package/dist/lib/node-esm/intent-resolver-7NJCJ3FA.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-root-Q5MFDXZE.mjs → react-root-OLYAEMP5.mjs} +5 -5
- package/dist/lib/node-esm/{react-surface-RQQZ5BOG.mjs → react-surface-6IFC6ZMN.mjs} +16 -22
- package/dist/lib/node-esm/react-surface-6IFC6ZMN.mjs.map +7 -0
- package/dist/lib/node-esm/schema-LOR2EVGY.mjs +25 -0
- package/dist/lib/node-esm/schema-LOR2EVGY.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-KXYUZBLN.mjs → settings-H6MXTEQM.mjs} +2 -2
- package/dist/lib/node-esm/{spaces-ready-MWNP3WBX.mjs → spaces-ready-HKAQG5SA.mjs} +4 -4
- package/dist/lib/node-esm/{state-5GH2D5U4.mjs → state-VYA6OFHD.mjs} +2 -2
- package/dist/lib/node-esm/types/index.mjs +5 -3
- package/dist/types/src/SpacePlugin.d.ts +5 -1
- package/dist/types/src/SpacePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +2 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +2 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +2 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/schema.d.ts +4 -0
- package/dist/types/src/capabilities/schema.d.ts.map +1 -0
- package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts +1 -2
- package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +1 -1
- package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts +1 -2
- package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +1 -1
- package/dist/types/src/components/AwaitingObject.d.ts +1 -2
- package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
- package/dist/types/src/components/BaseObjectSettings.d.ts +1 -2
- package/dist/types/src/components/BaseObjectSettings.d.ts.map +1 -1
- package/dist/types/src/components/CollectionMain.d.ts +1 -2
- package/dist/types/src/components/CollectionMain.d.ts.map +1 -1
- package/dist/types/src/components/CollectionSection.d.ts +1 -2
- package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +2 -4
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +5 -7
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -2
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/components/JoinDialog.d.ts +1 -2
- package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/components/MenuFooter.d.ts +1 -2
- package/dist/types/src/components/MenuFooter.d.ts.map +1 -1
- package/dist/types/src/components/PersistenceStatus.d.ts +1 -2
- package/dist/types/src/components/PersistenceStatus.d.ts.map +1 -1
- package/dist/types/src/components/PopoverAddSpace.d.ts +3 -0
- package/dist/types/src/components/PopoverAddSpace.d.ts.map +1 -0
- package/dist/types/src/components/PopoverRenameObject.d.ts +1 -2
- package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
- package/dist/types/src/components/PopoverRenameSpace.d.ts +1 -2
- package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
- package/dist/types/src/components/ShareSpaceButton.d.ts +2 -3
- package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -1
- package/dist/types/src/components/SpacePluginSettings.d.ts +1 -2
- package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.d.ts +4 -5
- package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.stories.d.ts +2 -3
- package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +1 -2
- package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +3 -5
- package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.stories.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts +1 -2
- package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/Space.d.ts +2 -3
- package/dist/types/src/components/SyncStatus/Space.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts +3 -4
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/events.d.ts +4 -0
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +9 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +26 -1
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +2 -1
- package/dist/types/src/util.d.ts.map +1 -1
- package/package.json +41 -39
- package/src/SpacePlugin.tsx +41 -12
- package/src/capabilities/app-graph-builder.ts +15 -90
- package/src/capabilities/capabilities.ts +3 -1
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +93 -46
- package/src/capabilities/react-surface.tsx +12 -28
- package/src/capabilities/schema.ts +27 -0
- package/src/components/BaseObjectSettings.tsx +7 -0
- package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +1 -3
- package/src/components/CreateDialog/CreateObjectDialog.tsx +29 -21
- package/src/components/CreateDialog/CreateObjectPanel.tsx +41 -44
- package/src/components/CreateDialog/CreateSpaceDialog.tsx +8 -1
- package/src/components/PopoverAddSpace.tsx +46 -0
- package/src/components/SpacePresence.stories.tsx +2 -2
- package/src/components/SpaceSettings/SpaceSettingsPanel.stories.tsx +5 -1
- package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +27 -4
- package/src/components/index.ts +1 -0
- package/src/events.ts +6 -0
- package/src/index.ts +1 -1
- package/src/translations.ts +3 -0
- package/src/types/types.ts +21 -1
- package/src/util.tsx +8 -2
- package/dist/lib/browser/app-graph-builder-J4NX44Y4.mjs.map +0 -7
- package/dist/lib/browser/chunk-6UIFMVVI.mjs.map +0 -7
- package/dist/lib/browser/chunk-RLZQJD47.mjs.map +0 -7
- package/dist/lib/browser/chunk-SDK7RZI3.mjs.map +0 -7
- package/dist/lib/browser/chunk-XPZ6IIXF.mjs.map +0 -7
- package/dist/lib/browser/chunk-XZ2NH3CP.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-IEDVV74T.mjs.map +0 -7
- package/dist/lib/browser/react-surface-DMNDXLZ7.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-ZOPG4MOS.cjs.map +0 -7
- package/dist/lib/node/chunk-3QWZCN6L.cjs.map +0 -7
- package/dist/lib/node/chunk-6MEOP3DH.cjs.map +0 -7
- package/dist/lib/node/chunk-D6BFKOXY.cjs.map +0 -7
- package/dist/lib/node/chunk-SZEIQGQU.cjs.map +0 -7
- package/dist/lib/node/chunk-UX3U4RU2.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-N2W2L6OL.cjs.map +0 -7
- package/dist/lib/node/react-surface-QPLXK7DT.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-TKGLOK22.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4UX5WGKJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AAQRELDK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LA45TPAN.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-N6EAOMIS.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-L2TKJU4I.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-RQQZ5BOG.mjs.map +0 -7
- /package/dist/lib/browser/{app-graph-serializer-QF7VVRCV.mjs.map → app-graph-serializer-FOWFLYGU.mjs.map} +0 -0
- /package/dist/lib/browser/{identity-created-25TK5XNO.mjs.map → identity-created-FYGS6TBH.mjs.map} +0 -0
- /package/dist/lib/browser/{react-root-6VRPRLQR.mjs.map → react-root-STUND2SO.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-K4JPYYEM.mjs.map → settings-PHPCXX33.mjs.map} +0 -0
- /package/dist/lib/browser/{spaces-ready-2MUWWVVO.mjs.map → spaces-ready-K47RR7N2.mjs.map} +0 -0
- /package/dist/lib/browser/{state-6DCY5YJP.mjs.map → state-INJ63O57.mjs.map} +0 -0
- /package/dist/lib/node/{app-graph-serializer-QE2G4MWB.cjs.map → app-graph-serializer-VQOGHKXL.cjs.map} +0 -0
- /package/dist/lib/node/{identity-created-7G5U7R36.cjs.map → identity-created-AXI64BLE.cjs.map} +0 -0
- /package/dist/lib/node/{react-root-YD35W3VU.cjs.map → react-root-WQGBCJ2K.cjs.map} +0 -0
- /package/dist/lib/node/{settings-TEELGWS4.cjs.map → settings-5QYFWNH7.cjs.map} +0 -0
- /package/dist/lib/node/{spaces-ready-PZZQWS6T.cjs.map → spaces-ready-FQNAKR7G.cjs.map} +0 -0
- /package/dist/lib/node/{state-WPZC4JXB.cjs.map → state-57UE3DYE.cjs.map} +0 -0
- /package/dist/lib/node-esm/{app-graph-serializer-HLX2JRNF.mjs.map → app-graph-serializer-GZRSWHEN.mjs.map} +0 -0
- /package/dist/lib/node-esm/{identity-created-7THGZ7EW.mjs.map → identity-created-3CGEXNPO.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-root-Q5MFDXZE.mjs.map → react-root-OLYAEMP5.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-KXYUZBLN.mjs.map → settings-H6MXTEQM.mjs.map} +0 -0
- /package/dist/lib/node-esm/{spaces-ready-MWNP3WBX.mjs.map → spaces-ready-HKAQG5SA.mjs.map} +0 -0
- /package/dist/lib/node-esm/{state-5GH2D5U4.mjs.map → state-VYA6OFHD.mjs.map} +0 -0
package/src/SpacePlugin.tsx
CHANGED
|
@@ -12,10 +12,12 @@ import {
|
|
|
12
12
|
Events,
|
|
13
13
|
oneOf,
|
|
14
14
|
} from '@dxos/app-framework';
|
|
15
|
+
import { S } from '@dxos/echo-schema';
|
|
15
16
|
import { RefArray } from '@dxos/live-object';
|
|
16
17
|
import { AttentionEvents } from '@dxos/plugin-attention';
|
|
17
|
-
import {
|
|
18
|
-
import { DeckCapabilities } from '@dxos/plugin-deck';
|
|
18
|
+
import { ClientEvents } from '@dxos/plugin-client';
|
|
19
|
+
import { DeckCapabilities, DeckEvents } from '@dxos/plugin-deck';
|
|
20
|
+
import { isEchoObject, getSpace } from '@dxos/react-client/echo';
|
|
19
21
|
import { osTranslations } from '@dxos/shell/react';
|
|
20
22
|
|
|
21
23
|
import {
|
|
@@ -25,6 +27,8 @@ import {
|
|
|
25
27
|
IntentResolver,
|
|
26
28
|
ReactRoot,
|
|
27
29
|
ReactSurface,
|
|
30
|
+
Schema,
|
|
31
|
+
SpaceCapabilities,
|
|
28
32
|
SpaceSettings,
|
|
29
33
|
SpacesReady,
|
|
30
34
|
SpaceState,
|
|
@@ -32,7 +36,7 @@ import {
|
|
|
32
36
|
import { SpaceEvents } from './events';
|
|
33
37
|
import { meta, SPACE_PLUGIN } from './meta';
|
|
34
38
|
import translations from './translations';
|
|
35
|
-
import { CollectionAction, CollectionType } from './types';
|
|
39
|
+
import { CollectionAction, CollectionType, defineObjectForm } from './types';
|
|
36
40
|
|
|
37
41
|
export type SpacePluginOptions = {
|
|
38
42
|
/**
|
|
@@ -44,11 +48,17 @@ export type SpacePluginOptions = {
|
|
|
44
48
|
* Query parameter for the invitation code.
|
|
45
49
|
*/
|
|
46
50
|
invitationParam?: string;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Whether to send observability events.
|
|
54
|
+
*/
|
|
55
|
+
observability?: boolean;
|
|
47
56
|
};
|
|
48
57
|
|
|
49
58
|
export const SpacePlugin = ({
|
|
50
59
|
invitationUrl = window.location.origin,
|
|
51
60
|
invitationParam = 'spaceInvitationCode',
|
|
61
|
+
observability = true,
|
|
52
62
|
}: SpacePluginOptions = {}) => {
|
|
53
63
|
const createInvitationUrl = (invitationCode: string) => {
|
|
54
64
|
const baseUrl = new URL(invitationUrl);
|
|
@@ -59,7 +69,10 @@ export const SpacePlugin = ({
|
|
|
59
69
|
return definePlugin(meta, [
|
|
60
70
|
defineModule({
|
|
61
71
|
id: `${meta.id}/module/state`,
|
|
62
|
-
|
|
72
|
+
// TODO(wittjosiah): Does not integrate with settings store.
|
|
73
|
+
// Should this be a different event?
|
|
74
|
+
// Should settings store be renamed to be more generic?
|
|
75
|
+
activatesOn: oneOf(Events.SetupSettings, Events.SetupAppGraph),
|
|
63
76
|
activatesAfter: [SpaceEvents.StateReady],
|
|
64
77
|
activate: SpaceState,
|
|
65
78
|
}),
|
|
@@ -80,7 +93,6 @@ export const SpacePlugin = ({
|
|
|
80
93
|
contributes(Capabilities.Metadata, {
|
|
81
94
|
id: CollectionType.typename,
|
|
82
95
|
metadata: {
|
|
83
|
-
createObject: (props: { name?: string }) => createIntent(CollectionAction.Create, props),
|
|
84
96
|
placeholder: ['unnamed collection label', { ns: SPACE_PLUGIN }],
|
|
85
97
|
icon: 'ph--cards-three--regular',
|
|
86
98
|
// TODO(wittjosiah): Move out of metadata.
|
|
@@ -89,20 +101,35 @@ export const SpacePlugin = ({
|
|
|
89
101
|
},
|
|
90
102
|
}),
|
|
91
103
|
}),
|
|
104
|
+
defineModule({
|
|
105
|
+
id: `${meta.id}/module/object-form`,
|
|
106
|
+
activatesOn: ClientEvents.SetupSchema,
|
|
107
|
+
activate: () =>
|
|
108
|
+
contributes(
|
|
109
|
+
SpaceCapabilities.ObjectForm,
|
|
110
|
+
defineObjectForm({
|
|
111
|
+
objectSchema: CollectionType,
|
|
112
|
+
formSchema: S.Struct({ name: S.optional(S.String) }),
|
|
113
|
+
getIntent: (props) => createIntent(CollectionAction.Create, props),
|
|
114
|
+
}),
|
|
115
|
+
),
|
|
116
|
+
}),
|
|
92
117
|
defineModule({
|
|
93
118
|
id: `${meta.id}/module/complementary-panel`,
|
|
94
|
-
activatesOn:
|
|
119
|
+
activatesOn: DeckEvents.SetupComplementaryPanels,
|
|
95
120
|
activate: () =>
|
|
96
121
|
contributes(DeckCapabilities.ComplementaryPanel, {
|
|
97
122
|
id: 'settings',
|
|
98
123
|
label: ['settings panel label', { ns: SPACE_PLUGIN }],
|
|
99
124
|
icon: 'ph--sliders--regular',
|
|
125
|
+
filter: (node) => isEchoObject(node.data) && !!getSpace(node.data),
|
|
100
126
|
}),
|
|
101
127
|
}),
|
|
102
128
|
defineModule({
|
|
103
129
|
id: `${meta.id}/module/schema`,
|
|
104
|
-
activatesOn: ClientEvents.
|
|
105
|
-
|
|
130
|
+
activatesOn: ClientEvents.ClientReady,
|
|
131
|
+
activatesBefore: [ClientEvents.SetupSchema],
|
|
132
|
+
activate: Schema,
|
|
106
133
|
}),
|
|
107
134
|
defineModule({
|
|
108
135
|
id: `${meta.id}/module/react-root`,
|
|
@@ -111,13 +138,15 @@ export const SpacePlugin = ({
|
|
|
111
138
|
}),
|
|
112
139
|
defineModule({
|
|
113
140
|
id: `${meta.id}/module/react-surface`,
|
|
114
|
-
activatesOn: Events.
|
|
141
|
+
activatesOn: Events.SetupReactSurface,
|
|
142
|
+
// TODO(wittjosiah): Should occur before the settings dialog is loaded when surfaces activation is more granular.
|
|
143
|
+
activatesBefore: [SpaceEvents.SetupSettingsPanel],
|
|
115
144
|
activate: () => ReactSurface({ createInvitationUrl }),
|
|
116
145
|
}),
|
|
117
146
|
defineModule({
|
|
118
147
|
id: `${meta.id}/module/intent-resolver`,
|
|
119
|
-
activatesOn: Events.
|
|
120
|
-
activate: (context) => IntentResolver({ createInvitationUrl, context }),
|
|
148
|
+
activatesOn: Events.SetupIntentResolver,
|
|
149
|
+
activate: (context) => IntentResolver({ createInvitationUrl, context, observability }),
|
|
121
150
|
}),
|
|
122
151
|
defineModule({
|
|
123
152
|
id: `${meta.id}/module/app-graph-builder`,
|
|
@@ -127,7 +156,7 @@ export const SpacePlugin = ({
|
|
|
127
156
|
// TODO(wittjosiah): This could probably be deferred.
|
|
128
157
|
defineModule({
|
|
129
158
|
id: `${meta.id}/module/app-graph-serializer`,
|
|
130
|
-
activatesOn: Events.
|
|
159
|
+
activatesOn: Events.AppGraphReady,
|
|
131
160
|
activate: AppGraphSerializer,
|
|
132
161
|
}),
|
|
133
162
|
defineModule({
|
|
@@ -11,17 +11,16 @@ import {
|
|
|
11
11
|
isEchoObject,
|
|
12
12
|
isSpace,
|
|
13
13
|
OBJECT_ID_LENGTH,
|
|
14
|
-
parseId,
|
|
15
14
|
type ReactiveEchoObject,
|
|
16
15
|
SPACE_ID_LENGTH,
|
|
17
16
|
SpaceState,
|
|
18
17
|
type Space,
|
|
19
18
|
} from '@dxos/client/echo';
|
|
20
|
-
import {
|
|
19
|
+
import { isDeleted } from '@dxos/live-object';
|
|
21
20
|
import { log } from '@dxos/log';
|
|
22
21
|
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
23
|
-
import { createExtension, toSignal, type Node } from '@dxos/plugin-graph';
|
|
24
|
-
import {
|
|
22
|
+
import { createExtension, toSignal, type Node, type InvokeParams } from '@dxos/plugin-graph';
|
|
23
|
+
import { isNonNullable } from '@dxos/util';
|
|
25
24
|
|
|
26
25
|
import { SpaceCapabilities } from './capabilities';
|
|
27
26
|
import { SPACE_PLUGIN } from '../meta';
|
|
@@ -85,29 +84,17 @@ export default (context: PluginsContext) => {
|
|
|
85
84
|
filter: (node): node is Node<null> => node.id === 'root',
|
|
86
85
|
actions: () => [
|
|
87
86
|
{
|
|
88
|
-
id: SpaceAction.
|
|
89
|
-
data: async () => {
|
|
87
|
+
id: SpaceAction.AddSpace._tag,
|
|
88
|
+
data: async (params: InvokeParams) => {
|
|
90
89
|
const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
|
|
91
|
-
await dispatch(createIntent(SpaceAction.
|
|
90
|
+
await dispatch(createIntent(SpaceAction.AddSpace));
|
|
92
91
|
},
|
|
93
92
|
properties: {
|
|
94
|
-
label: ['
|
|
93
|
+
label: ['add space label', { ns: SPACE_PLUGIN }],
|
|
95
94
|
icon: 'ph--plus--regular',
|
|
96
|
-
testId: 'spacePlugin.
|
|
97
|
-
disposition: 'item',
|
|
98
|
-
},
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
id: SpaceAction.Join._tag,
|
|
102
|
-
data: async () => {
|
|
103
|
-
const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
|
|
104
|
-
await dispatch(createIntent(SpaceAction.Join));
|
|
105
|
-
},
|
|
106
|
-
properties: {
|
|
107
|
-
label: ['join space label', { ns: SPACE_PLUGIN }],
|
|
108
|
-
icon: 'ph--sign-in--regular',
|
|
109
|
-
testId: 'spacePlugin.joinSpace',
|
|
95
|
+
testId: 'spacePlugin.addSpace',
|
|
110
96
|
disposition: 'item',
|
|
97
|
+
position: 'fallback',
|
|
111
98
|
},
|
|
112
99
|
},
|
|
113
100
|
],
|
|
@@ -197,6 +184,8 @@ export default (context: PluginsContext) => {
|
|
|
197
184
|
|
|
198
185
|
if (space.state.get() === SpaceState.SPACE_INACTIVE) {
|
|
199
186
|
return false;
|
|
187
|
+
} else if (space.state.get() !== SpaceState.SPACE_READY) {
|
|
188
|
+
return undefined;
|
|
200
189
|
} else {
|
|
201
190
|
const state = context.requestCapability(SpaceCapabilities.State);
|
|
202
191
|
return constructSpaceNode({
|
|
@@ -252,9 +241,9 @@ export default (context: PluginsContext) => {
|
|
|
252
241
|
|
|
253
242
|
return collection.objects
|
|
254
243
|
.map((object) => object.target)
|
|
255
|
-
.filter(
|
|
244
|
+
.filter(isNonNullable)
|
|
256
245
|
.map((object) => createObjectNode({ object, space, resolve, navigable: state.navigableCollections }))
|
|
257
|
-
.filter(
|
|
246
|
+
.filter(isNonNullable);
|
|
258
247
|
},
|
|
259
248
|
}),
|
|
260
249
|
|
|
@@ -273,9 +262,9 @@ export default (context: PluginsContext) => {
|
|
|
273
262
|
|
|
274
263
|
return collection.objects
|
|
275
264
|
.map((object) => object.target)
|
|
276
|
-
.filter(
|
|
265
|
+
.filter(isNonNullable)
|
|
277
266
|
.map((object) => createObjectNode({ object, space, resolve, navigable: state.navigableCollections }))
|
|
278
|
-
.filter(
|
|
267
|
+
.filter(isNonNullable);
|
|
279
268
|
},
|
|
280
269
|
resolver: ({ id }) => {
|
|
281
270
|
if (id.length !== FQ_ID_LENGTH) {
|
|
@@ -326,69 +315,5 @@ export default (context: PluginsContext) => {
|
|
|
326
315
|
return constructObjectActions({ node, dispatch, navigable: state.navigableCollections });
|
|
327
316
|
},
|
|
328
317
|
}),
|
|
329
|
-
|
|
330
|
-
// Create nodes for object settings.
|
|
331
|
-
createExtension({
|
|
332
|
-
id: `${SPACE_PLUGIN}/settings-for-subject`,
|
|
333
|
-
resolver: ({ id }) => {
|
|
334
|
-
// TODO(Zan): Find util (or make one).
|
|
335
|
-
if (!id.endsWith('~settings')) {
|
|
336
|
-
return;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
const type = 'orphan-settings-for-subject';
|
|
340
|
-
const icon = 'ph--gear--regular';
|
|
341
|
-
|
|
342
|
-
const [subjectId] = id.split('~');
|
|
343
|
-
const { spaceId, objectId } = parseId(subjectId);
|
|
344
|
-
const client = context.requestCapability(ClientCapabilities.Client);
|
|
345
|
-
const spaces = toSignal(
|
|
346
|
-
(onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,
|
|
347
|
-
() => client.spaces.get(),
|
|
348
|
-
);
|
|
349
|
-
const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);
|
|
350
|
-
if (!objectId) {
|
|
351
|
-
const label = space
|
|
352
|
-
? space.properties.name || ['unnamed space label', { ns: SPACE_PLUGIN }]
|
|
353
|
-
: ['unnamed object settings label', { ns: SPACE_PLUGIN }];
|
|
354
|
-
|
|
355
|
-
// TODO(wittjosiah): Support comments for arbitrary subjects.
|
|
356
|
-
// This is to ensure that the comments panel is not stuck on an old object.
|
|
357
|
-
return {
|
|
358
|
-
id,
|
|
359
|
-
type,
|
|
360
|
-
data: null,
|
|
361
|
-
properties: {
|
|
362
|
-
icon,
|
|
363
|
-
label,
|
|
364
|
-
showResolvedThreads: false,
|
|
365
|
-
object: null,
|
|
366
|
-
space,
|
|
367
|
-
},
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
const [object] = memoizeQuery(space, { id: objectId });
|
|
372
|
-
if (!object || !subjectId) {
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
const meta = resolve(getTypename(object) ?? '');
|
|
377
|
-
const label = meta.label?.(object) ||
|
|
378
|
-
object.name ||
|
|
379
|
-
meta.placeholder || ['unnamed object settings label', { ns: SPACE_PLUGIN }];
|
|
380
|
-
|
|
381
|
-
return {
|
|
382
|
-
id,
|
|
383
|
-
type,
|
|
384
|
-
data: null,
|
|
385
|
-
properties: {
|
|
386
|
-
icon,
|
|
387
|
-
label,
|
|
388
|
-
object,
|
|
389
|
-
},
|
|
390
|
-
};
|
|
391
|
-
},
|
|
392
|
-
}),
|
|
393
318
|
]);
|
|
394
319
|
};
|
|
@@ -6,7 +6,7 @@ import { defineCapability, type Label } from '@dxos/app-framework';
|
|
|
6
6
|
import { type DeepReadonly } from '@dxos/util';
|
|
7
7
|
|
|
8
8
|
import { SPACE_PLUGIN } from '../meta';
|
|
9
|
-
import { type PluginState } from '../types';
|
|
9
|
+
import { type ObjectForm, type PluginState } from '../types';
|
|
10
10
|
|
|
11
11
|
export namespace SpaceCapabilities {
|
|
12
12
|
export const State = defineCapability<DeepReadonly<PluginState>>(`${SPACE_PLUGIN}/capability/state`);
|
|
@@ -14,6 +14,8 @@ export namespace SpaceCapabilities {
|
|
|
14
14
|
|
|
15
15
|
export type SpaceSettingsPanel = { id: string; label: Label };
|
|
16
16
|
export const SettingsPanel = defineCapability<SpaceSettingsPanel>(`${SPACE_PLUGIN}/capability/settings-panel`);
|
|
17
|
+
|
|
18
|
+
export const ObjectForm = defineCapability<ObjectForm<any>>(`${SPACE_PLUGIN}/capability/object-form`);
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
// TODO(wittjosiah): Factor out.
|
|
@@ -10,6 +10,7 @@ export const IdentityCreated = lazy(() => import('./identity-created'));
|
|
|
10
10
|
export const IntentResolver = lazy(() => import('./intent-resolver'));
|
|
11
11
|
export const ReactRoot = lazy(() => import('./react-root'));
|
|
12
12
|
export const ReactSurface = lazy(() => import('./react-surface'));
|
|
13
|
+
export const Schema = lazy(() => import('./schema'));
|
|
13
14
|
export const SpaceSettings = lazy(() => import('./settings'));
|
|
14
15
|
export const SpaceState = lazy(() => import('./state'));
|
|
15
16
|
export const SpacesReady = lazy(() => import('./spaces-ready'));
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
CREATE_OBJECT_DIALOG,
|
|
32
32
|
type CreateObjectDialogProps,
|
|
33
33
|
POPOVER_RENAME_OBJECT,
|
|
34
|
+
POPOVER_ADD_SPACE,
|
|
34
35
|
} from '../components';
|
|
35
36
|
import { SPACE_PLUGIN } from '../meta';
|
|
36
37
|
import { CollectionAction, CollectionType, SpaceAction } from '../types';
|
|
@@ -42,9 +43,10 @@ const SPACE_MAX_OBJECTS = 500;
|
|
|
42
43
|
type IntentResolverOptions = {
|
|
43
44
|
createInvitationUrl: (invitationCode: string) => string;
|
|
44
45
|
context: PluginsContext;
|
|
46
|
+
observability?: boolean;
|
|
45
47
|
};
|
|
46
48
|
|
|
47
|
-
export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
49
|
+
export default ({ createInvitationUrl, context, observability }: IntentResolverOptions) => {
|
|
48
50
|
const resolve = (typename: string) =>
|
|
49
51
|
context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
|
|
50
52
|
|
|
@@ -86,12 +88,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
|
86
88
|
space,
|
|
87
89
|
},
|
|
88
90
|
intents: [
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
...(observability
|
|
92
|
+
? [
|
|
93
|
+
createIntent(ObservabilityAction.SendEvent, {
|
|
94
|
+
name: 'space.create',
|
|
95
|
+
properties: {
|
|
96
|
+
spaceId: space.id,
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
]
|
|
100
|
+
: []),
|
|
95
101
|
],
|
|
96
102
|
};
|
|
97
103
|
},
|
|
@@ -136,12 +142,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
|
136
142
|
} satisfies Partial<SpaceSettingsDialogProps>,
|
|
137
143
|
},
|
|
138
144
|
}),
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
+
...(observability
|
|
146
|
+
? [
|
|
147
|
+
createIntent(ObservabilityAction.SendEvent, {
|
|
148
|
+
name: 'space.share',
|
|
149
|
+
properties: {
|
|
150
|
+
space: space.id,
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
]
|
|
154
|
+
: []),
|
|
145
155
|
],
|
|
146
156
|
};
|
|
147
157
|
},
|
|
@@ -152,12 +162,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
|
152
162
|
space.properties[COMPOSER_SPACE_LOCK] = true;
|
|
153
163
|
return {
|
|
154
164
|
intents: [
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
165
|
+
...(observability
|
|
166
|
+
? [
|
|
167
|
+
createIntent(ObservabilityAction.SendEvent, {
|
|
168
|
+
name: 'space.lock',
|
|
169
|
+
properties: {
|
|
170
|
+
spaceId: space.id,
|
|
171
|
+
},
|
|
172
|
+
}),
|
|
173
|
+
]
|
|
174
|
+
: []),
|
|
161
175
|
],
|
|
162
176
|
};
|
|
163
177
|
},
|
|
@@ -168,12 +182,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
|
168
182
|
space.properties[COMPOSER_SPACE_LOCK] = false;
|
|
169
183
|
return {
|
|
170
184
|
intents: [
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
185
|
+
...(observability
|
|
186
|
+
? [
|
|
187
|
+
createIntent(ObservabilityAction.SendEvent, {
|
|
188
|
+
name: 'space.unlock',
|
|
189
|
+
properties: {
|
|
190
|
+
spaceId: space.id,
|
|
191
|
+
},
|
|
192
|
+
}),
|
|
193
|
+
]
|
|
194
|
+
: []),
|
|
177
195
|
],
|
|
178
196
|
};
|
|
179
197
|
},
|
|
@@ -195,6 +213,23 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
|
195
213
|
};
|
|
196
214
|
},
|
|
197
215
|
}),
|
|
216
|
+
createResolver({
|
|
217
|
+
intent: SpaceAction.AddSpace,
|
|
218
|
+
resolve: () => {
|
|
219
|
+
return {
|
|
220
|
+
intents: [
|
|
221
|
+
createIntent(LayoutAction.UpdatePopover, {
|
|
222
|
+
part: 'popover',
|
|
223
|
+
subject: POPOVER_ADD_SPACE,
|
|
224
|
+
options: {
|
|
225
|
+
anchorId: SpaceAction.AddSpace._tag,
|
|
226
|
+
side: 'right',
|
|
227
|
+
},
|
|
228
|
+
}),
|
|
229
|
+
],
|
|
230
|
+
};
|
|
231
|
+
},
|
|
232
|
+
}),
|
|
198
233
|
createResolver({
|
|
199
234
|
intent: SpaceAction.OpenSettings,
|
|
200
235
|
resolve: ({ space }) => {
|
|
@@ -242,13 +277,17 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
|
242
277
|
return {
|
|
243
278
|
data: result,
|
|
244
279
|
intents: [
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
280
|
+
...(observability
|
|
281
|
+
? [
|
|
282
|
+
createIntent(ObservabilityAction.SendEvent, {
|
|
283
|
+
name: 'space.migrate',
|
|
284
|
+
properties: {
|
|
285
|
+
spaceId: space.id,
|
|
286
|
+
version,
|
|
287
|
+
},
|
|
288
|
+
}),
|
|
289
|
+
]
|
|
290
|
+
: []),
|
|
252
291
|
],
|
|
253
292
|
};
|
|
254
293
|
},
|
|
@@ -301,12 +340,16 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
|
301
340
|
onAction: () => space.db.coreDatabase.unlinkDeletedObjects(),
|
|
302
341
|
},
|
|
303
342
|
}),
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
343
|
+
...(observability
|
|
344
|
+
? [
|
|
345
|
+
createIntent(ObservabilityAction.SendEvent, {
|
|
346
|
+
name: 'space.limit',
|
|
347
|
+
properties: {
|
|
348
|
+
spaceId: space.id,
|
|
349
|
+
},
|
|
350
|
+
}),
|
|
351
|
+
]
|
|
352
|
+
: []),
|
|
310
353
|
],
|
|
311
354
|
};
|
|
312
355
|
}
|
|
@@ -331,14 +374,18 @@ export default ({ createInvitationUrl, context }: IntentResolverOptions) => {
|
|
|
331
374
|
object: object as HasId,
|
|
332
375
|
},
|
|
333
376
|
intents: [
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
377
|
+
...(observability
|
|
378
|
+
? [
|
|
379
|
+
createIntent(ObservabilityAction.SendEvent, {
|
|
380
|
+
name: 'space.object.add',
|
|
381
|
+
properties: {
|
|
382
|
+
spaceId: space.id,
|
|
383
|
+
objectId: object.id,
|
|
384
|
+
typename: getTypename(object),
|
|
385
|
+
},
|
|
386
|
+
}),
|
|
387
|
+
]
|
|
388
|
+
: []),
|
|
342
389
|
],
|
|
343
390
|
};
|
|
344
391
|
},
|
|
@@ -2,19 +2,10 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React
|
|
5
|
+
import React from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
Capabilities,
|
|
9
|
-
contributes,
|
|
10
|
-
createSurface,
|
|
11
|
-
Surface,
|
|
12
|
-
useCapability,
|
|
13
|
-
useCapabilities,
|
|
14
|
-
usePluginManager,
|
|
15
|
-
} from '@dxos/app-framework';
|
|
7
|
+
import { Capabilities, contributes, createSurface, Surface, useCapability } from '@dxos/app-framework';
|
|
16
8
|
import { SettingsStore } from '@dxos/local-storage';
|
|
17
|
-
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
18
9
|
import {
|
|
19
10
|
getSpace,
|
|
20
11
|
isEchoObject,
|
|
@@ -53,6 +44,8 @@ import {
|
|
|
53
44
|
SyncStatus,
|
|
54
45
|
type CreateObjectDialogProps,
|
|
55
46
|
type SpaceSettingsDialogProps,
|
|
47
|
+
POPOVER_ADD_SPACE,
|
|
48
|
+
PopoverAddSpace,
|
|
56
49
|
} from '../components';
|
|
57
50
|
import { SPACE_PLUGIN } from '../meta';
|
|
58
51
|
import { CollectionType, type SpaceSettingsProps } from '../types';
|
|
@@ -126,23 +119,8 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
126
119
|
createSurface({
|
|
127
120
|
id: CREATE_OBJECT_DIALOG,
|
|
128
121
|
role: 'dialog',
|
|
129
|
-
filter: (data): data is { props:
|
|
130
|
-
component: ({ data }) => {
|
|
131
|
-
const schemas = useCapabilities(ClientCapabilities.Schema).flat();
|
|
132
|
-
const manager = usePluginManager();
|
|
133
|
-
|
|
134
|
-
const resolve = useCallback(
|
|
135
|
-
(typename: string) => {
|
|
136
|
-
return (
|
|
137
|
-
manager.context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ??
|
|
138
|
-
{}
|
|
139
|
-
);
|
|
140
|
-
},
|
|
141
|
-
[manager],
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
return <CreateObjectDialog schemas={schemas} resolve={resolve} {...data.props} />;
|
|
145
|
-
},
|
|
122
|
+
filter: (data): data is { props: CreateObjectDialogProps } => data.component === CREATE_OBJECT_DIALOG,
|
|
123
|
+
component: ({ data }) => <CreateObjectDialog {...data.props} />,
|
|
146
124
|
}),
|
|
147
125
|
createSurface({
|
|
148
126
|
id: POPOVER_RENAME_SPACE,
|
|
@@ -157,6 +135,12 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
157
135
|
data.component === POPOVER_RENAME_OBJECT && isReactiveObject(data.props),
|
|
158
136
|
component: ({ data }) => <PopoverRenameObject object={data.props} />,
|
|
159
137
|
}),
|
|
138
|
+
createSurface({
|
|
139
|
+
id: POPOVER_ADD_SPACE,
|
|
140
|
+
role: 'popover',
|
|
141
|
+
filter: (data): data is any => data.component === POPOVER_ADD_SPACE,
|
|
142
|
+
component: () => <PopoverAddSpace />,
|
|
143
|
+
}),
|
|
160
144
|
createSurface({
|
|
161
145
|
id: `${SPACE_PLUGIN}/navtree-presence`,
|
|
162
146
|
role: 'navtree-item-end',
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { effect } from '@preact/signals-core';
|
|
6
|
+
|
|
7
|
+
import { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';
|
|
8
|
+
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
9
|
+
|
|
10
|
+
import { SpaceCapabilities } from './capabilities';
|
|
11
|
+
import { type ObjectForm } from '../types';
|
|
12
|
+
|
|
13
|
+
export default (context: PluginsContext) => {
|
|
14
|
+
const client = context.requestCapability(ClientCapabilities.Client);
|
|
15
|
+
|
|
16
|
+
// TODO(wittjosiah): Unregister schemas when they are disabled.
|
|
17
|
+
let previous: ObjectForm[] = [];
|
|
18
|
+
const unsubscribe = effect(() => {
|
|
19
|
+
const forms = Array.from(new Set(context.requestCapabilities(SpaceCapabilities.ObjectForm)));
|
|
20
|
+
// TODO(wittjosiah): Filter out schemas which the client has already registered.
|
|
21
|
+
const newSchemas = forms.filter((form) => !previous.includes(form)).map((form) => form.objectSchema);
|
|
22
|
+
previous = forms;
|
|
23
|
+
client.addTypes(newSchemas);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
return contributes(Capabilities.Null, null, () => unsubscribe());
|
|
27
|
+
};
|
|
@@ -15,17 +15,24 @@ export type BaseObjectSettingsProps = {
|
|
|
15
15
|
|
|
16
16
|
export const BaseObjectSettings = ({ object }: BaseObjectSettingsProps) => {
|
|
17
17
|
const { t } = useTranslation(SPACE_PLUGIN);
|
|
18
|
+
const inputRef = React.useRef<HTMLInputElement>(null);
|
|
18
19
|
// TODO(burdon): Standardize forms.
|
|
19
20
|
return (
|
|
20
21
|
<div role='form' className='flex flex-col w-full p-2 gap-1'>
|
|
21
22
|
<Input.Root>
|
|
22
23
|
<Input.Label>{t('name label')}</Input.Label>
|
|
23
24
|
<Input.TextInput
|
|
25
|
+
ref={inputRef}
|
|
24
26
|
placeholder={t('name placeholder')}
|
|
25
27
|
value={object.name ?? ''}
|
|
26
28
|
onChange={(event) => {
|
|
27
29
|
object.name = event.target.value;
|
|
28
30
|
}}
|
|
31
|
+
onKeyDown={(event) => {
|
|
32
|
+
if (event.key === 'Enter') {
|
|
33
|
+
inputRef.current?.blur();
|
|
34
|
+
}
|
|
35
|
+
}}
|
|
29
36
|
/>
|
|
30
37
|
</Input.Root>
|
|
31
38
|
</div>
|