@dxos/plugin-space 0.8.4-main.21d9917 → 0.8.4-main.2244d791bb
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/CollectionArticle-LKTAABXP.mjs +128 -0
- package/dist/lib/browser/CollectionArticle-LKTAABXP.mjs.map +7 -0
- package/dist/lib/browser/{ObjectCardStack-TWHN6C2Y.mjs → ObjectCardStack-CXNBCSMR.mjs} +2 -2
- package/dist/lib/browser/ObjectCardStack-CXNBCSMR.mjs.map +7 -0
- package/dist/lib/browser/{ObjectDetails-GEDIISKK.mjs → ObjectDetails-HXV4IQEM.mjs} +6 -5
- package/dist/lib/browser/ObjectDetails-HXV4IQEM.mjs.map +7 -0
- package/dist/lib/browser/{RecordArticle-W57QE7QV.mjs → RecordArticle-36LDKFWF.mjs} +11 -10
- package/dist/lib/browser/RecordArticle-36LDKFWF.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-builder-SJHTZXZF.mjs → app-graph-builder-GLV46QSI.mjs} +26 -19
- package/dist/lib/browser/app-graph-builder-GLV46QSI.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-7AT7QMSK.mjs → app-graph-serializer-VOLRDNVE.mjs} +9 -8
- package/dist/lib/browser/app-graph-serializer-VOLRDNVE.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ZT2VPYRM.mjs → chunk-7D63MVRS.mjs} +3 -3
- package/dist/lib/browser/chunk-7D63MVRS.mjs.map +7 -0
- package/dist/lib/browser/{chunk-4WZUGLQQ.mjs → chunk-A7ZCVQGZ.mjs} +10 -9
- package/dist/lib/browser/chunk-A7ZCVQGZ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-CCRSHECL.mjs → chunk-KGLWYGIF.mjs} +4 -3
- package/dist/lib/browser/chunk-KGLWYGIF.mjs.map +7 -0
- package/dist/lib/browser/{chunk-AWVAX26X.mjs → chunk-NF3ZFAB4.mjs} +2 -2
- package/dist/lib/browser/{chunk-SUI34XSA.mjs → chunk-WAOJLA2S.mjs} +12 -12
- package/dist/lib/browser/chunk-WAOJLA2S.mjs.map +7 -0
- package/dist/lib/browser/{chunk-3X2EA2OA.mjs → chunk-XRTOZE23.mjs} +128 -137
- package/dist/lib/browser/chunk-XRTOZE23.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +31 -29
- package/dist/lib/browser/cli/index.mjs.map +3 -3
- package/dist/lib/browser/index.mjs +58 -53
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{operation-resolver-SIRQT36Z.mjs → operation-resolver-PJJ3PCM7.mjs} +45 -42
- package/dist/lib/browser/operation-resolver-PJJ3PCM7.mjs.map +7 -0
- package/dist/lib/browser/{react-root-PI7VTZUZ.mjs → react-root-MRIDHLHH.mjs} +8 -8
- package/dist/lib/browser/react-root-MRIDHLHH.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-BPE7VWI7.mjs → react-surface-ARZZ343H.mjs} +38 -37
- package/dist/lib/browser/react-surface-ARZZ343H.mjs.map +7 -0
- package/dist/lib/browser/{repair-CJG26D52.mjs → repair-DKU4TUD2.mjs} +2 -2
- package/dist/lib/browser/{settings-ZS2AQ73E.mjs → settings-M2DMD2ZA.mjs} +5 -4
- package/dist/lib/browser/settings-M2DMD2ZA.mjs.map +7 -0
- package/dist/lib/browser/{spaces-ready-OQDGWUOS.mjs → spaces-ready-XWJUJ43N.mjs} +13 -12
- package/dist/lib/browser/spaces-ready-XWJUJ43N.mjs.map +7 -0
- package/dist/lib/browser/{state-7YZQB2KY.mjs → state-V637BLIM.mjs} +5 -5
- package/dist/lib/browser/state-V637BLIM.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node-esm/CollectionArticle-ONQMZ7BQ.mjs +129 -0
- package/dist/lib/node-esm/CollectionArticle-ONQMZ7BQ.mjs.map +7 -0
- package/dist/lib/node-esm/{ObjectCardStack-C5ZXRKP7.mjs → ObjectCardStack-EHXPNRQW.mjs} +2 -2
- package/dist/lib/node-esm/ObjectCardStack-EHXPNRQW.mjs.map +7 -0
- package/dist/lib/node-esm/{ObjectDetails-6ZLDRKCO.mjs → ObjectDetails-N73UI4ZL.mjs} +6 -5
- package/dist/lib/node-esm/ObjectDetails-N73UI4ZL.mjs.map +7 -0
- package/dist/lib/node-esm/{RecordArticle-SSV74Z46.mjs → RecordArticle-CMEXNNOZ.mjs} +11 -10
- package/dist/lib/node-esm/RecordArticle-CMEXNNOZ.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-HZ3XXDFZ.mjs → app-graph-builder-KCEHEKVS.mjs} +26 -19
- package/dist/lib/node-esm/app-graph-builder-KCEHEKVS.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-WJ2TIQG6.mjs → app-graph-serializer-7C4MV5NB.mjs} +9 -8
- package/dist/lib/node-esm/app-graph-serializer-7C4MV5NB.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-2SW6S2BB.mjs → chunk-5N3YIAXD.mjs} +3 -3
- package/dist/lib/node-esm/chunk-5N3YIAXD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-JOBIWCBC.mjs → chunk-A5A7M37T.mjs} +10 -9
- package/dist/lib/node-esm/chunk-A5A7M37T.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-7KMYUWSR.mjs → chunk-FB5YNROS.mjs} +12 -12
- package/dist/lib/node-esm/chunk-FB5YNROS.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-MPL6NHQX.mjs → chunk-NYSDQPNM.mjs} +4 -3
- package/dist/lib/node-esm/chunk-NYSDQPNM.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-HREWB23G.mjs → chunk-PG7DNOEX.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-EYS3L2NO.mjs → chunk-QDIOQTXY.mjs} +128 -137
- package/dist/lib/node-esm/chunk-QDIOQTXY.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +31 -29
- package/dist/lib/node-esm/cli/index.mjs.map +3 -3
- package/dist/lib/node-esm/index.mjs +58 -53
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{operation-resolver-ZE3XJL5J.mjs → operation-resolver-2K7N4KYC.mjs} +45 -42
- package/dist/lib/node-esm/operation-resolver-2K7N4KYC.mjs.map +7 -0
- package/dist/lib/node-esm/{react-root-KUXM33JI.mjs → react-root-LKSSWFGF.mjs} +8 -8
- package/dist/lib/node-esm/react-root-LKSSWFGF.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-STCQKUZ4.mjs → react-surface-QG5RNBPD.mjs} +38 -37
- package/dist/lib/node-esm/react-surface-QG5RNBPD.mjs.map +7 -0
- package/dist/lib/node-esm/{repair-G3ZW3VG3.mjs → repair-C2H6JQCL.mjs} +2 -2
- package/dist/lib/node-esm/{settings-PVI2VG56.mjs → settings-VCPCNBOY.mjs} +5 -4
- package/dist/lib/node-esm/settings-VCPCNBOY.mjs.map +7 -0
- package/dist/lib/node-esm/{spaces-ready-R744OHQG.mjs → spaces-ready-5JOGEWON.mjs} +13 -12
- package/dist/lib/node-esm/spaces-ready-5JOGEWON.mjs.map +7 -0
- package/dist/lib/node-esm/{state-XE5YGPHM.mjs → state-5MCEPWN3.mjs} +5 -5
- package/dist/lib/node-esm/state-5MCEPWN3.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/SpacePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +2 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts +2 -2
- package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-serializer/index.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-serializer/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings/index.d.ts +1 -1
- package/dist/types/src/capabilities/settings/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings/settings.d.ts +3 -2
- package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/spaces-ready/spaces-ready.d.ts.map +1 -1
- package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
- package/dist/types/src/cli/commands/database/add.d.ts.map +1 -1
- package/dist/types/src/cli/plugin.d.ts.map +1 -1
- package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
- package/dist/types/src/components/CollectionArticle.d.ts +2 -2
- package/dist/types/src/components/CollectionArticle.d.ts.map +1 -1
- package/dist/types/src/components/CollectionSection.d.ts +1 -1
- package/dist/types/src/components/CollectionSection.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.stories.d.ts +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +4 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
- package/dist/types/src/components/JoinDialog/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/components/MembersContainer/MembersContainer.d.ts.map +1 -1
- package/dist/types/src/components/MembersContainer/MembersContainer.stories.d.ts +1 -1
- package/dist/types/src/components/ObjectDetails/ObjectDetails.d.ts +1 -1
- package/dist/types/src/components/ObjectDetails/ObjectDetails.d.ts.map +1 -1
- package/dist/types/src/components/RecordArticle.d.ts +1 -1
- package/dist/types/src/components/RecordArticle.d.ts.map +1 -1
- package/dist/types/src/components/RecordArticle.stories.d.ts +1 -1
- package/dist/types/src/components/RecordArticle.stories.d.ts.map +1 -1
- 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/SpacePresence.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts +4 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts +4 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +3 -3
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useActiveSpace.d.ts.map +1 -1
- package/dist/types/src/types/events.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +18 -12
- 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/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +66 -65
- package/src/SpacePlugin.ts +59 -40
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +17 -13
- package/src/capabilities/app-graph-serializer/app-graph-serializer.ts +5 -4
- package/src/capabilities/operation-resolver/operation-resolver.ts +31 -29
- package/src/capabilities/react-root/react-root.tsx +3 -3
- package/src/capabilities/react-surface/react-surface.tsx +34 -32
- package/src/capabilities/settings/settings.ts +3 -2
- package/src/capabilities/spaces-ready/spaces-ready.ts +8 -7
- package/src/capabilities/state/state.ts +3 -3
- package/src/cli/commands/database/add.ts +7 -8
- package/src/cli/commands/database/query/query.ts +1 -1
- package/src/cli/commands/database/remove.ts +2 -2
- package/src/cli/commands/database/stats.ts +1 -1
- package/src/cli/plugin.ts +33 -26
- package/src/components/AwaitingObject.tsx +4 -3
- package/src/components/CollectionArticle.tsx +71 -72
- package/src/components/CollectionSection.tsx +1 -1
- package/src/components/CreateDialog/CreateObjectDialog.stories.tsx +1 -1
- package/src/components/CreateDialog/CreateObjectDialog.tsx +20 -17
- package/src/components/CreateDialog/CreateObjectPanel.tsx +38 -39
- package/src/components/CreateDialog/CreateSpaceDialog.tsx +21 -21
- package/src/components/JoinDialog/JoinDialog.tsx +8 -7
- package/src/components/MembersContainer/MembersContainer.stories.tsx +1 -1
- package/src/components/MembersContainer/MembersContainer.tsx +45 -48
- package/src/components/ObjectCardStack/ObjectCardStack.tsx +1 -1
- package/src/components/ObjectDetails/BaseObjectSettings.stories.tsx +4 -4
- package/src/components/ObjectDetails/ObjectDetails.tsx +6 -5
- package/src/components/ObjectRenamePopover/ObjectRenamePopover.tsx +3 -3
- package/src/components/RecordArticle.stories.tsx +6 -5
- package/src/components/RecordArticle.tsx +23 -21
- package/src/components/SchemaContainer.tsx +20 -17
- package/src/components/SpacePluginSettings.tsx +34 -31
- package/src/components/SpacePresence/SpacePresence.stories.tsx +1 -1
- package/src/components/SpacePresence/SpacePresence.tsx +2 -1
- package/src/components/SpaceRenamePopover/SpaceRenamePopover.tsx +3 -3
- package/src/components/SpaceSettings/SpaceSettingsContainer.stories.tsx +1 -1
- package/src/components/SpaceSettings/SpaceSettingsContainer.tsx +161 -179
- package/src/components/SyncStatus/InlineSyncStatus.tsx +1 -1
- package/src/components/SyncStatus/SyncStatus.stories.tsx +1 -1
- package/src/components/ViewEditor.tsx +1 -1
- package/src/hooks/useActiveSpace.ts +5 -4
- package/src/hooks/useInputSurfaceLookup.tsx +3 -3
- package/src/translations.ts +2 -2
- package/src/types/events.ts +3 -2
- package/src/types/types.ts +10 -3
- package/src/util.tsx +9 -6
- package/dist/lib/browser/CollectionArticle-XPNA6EHZ.mjs +0 -129
- package/dist/lib/browser/CollectionArticle-XPNA6EHZ.mjs.map +0 -7
- package/dist/lib/browser/ObjectCardStack-TWHN6C2Y.mjs.map +0 -7
- package/dist/lib/browser/ObjectDetails-GEDIISKK.mjs.map +0 -7
- package/dist/lib/browser/RecordArticle-W57QE7QV.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-SJHTZXZF.mjs.map +0 -7
- package/dist/lib/browser/app-graph-serializer-7AT7QMSK.mjs.map +0 -7
- package/dist/lib/browser/chunk-3X2EA2OA.mjs.map +0 -7
- package/dist/lib/browser/chunk-4WZUGLQQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-CCRSHECL.mjs.map +0 -7
- package/dist/lib/browser/chunk-SUI34XSA.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZT2VPYRM.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-SIRQT36Z.mjs.map +0 -7
- package/dist/lib/browser/react-root-PI7VTZUZ.mjs.map +0 -7
- package/dist/lib/browser/react-surface-BPE7VWI7.mjs.map +0 -7
- package/dist/lib/browser/settings-ZS2AQ73E.mjs.map +0 -7
- package/dist/lib/browser/spaces-ready-OQDGWUOS.mjs.map +0 -7
- package/dist/lib/browser/state-7YZQB2KY.mjs.map +0 -7
- package/dist/lib/node-esm/CollectionArticle-WGHNZNO2.mjs +0 -130
- package/dist/lib/node-esm/CollectionArticle-WGHNZNO2.mjs.map +0 -7
- package/dist/lib/node-esm/ObjectCardStack-C5ZXRKP7.mjs.map +0 -7
- package/dist/lib/node-esm/ObjectDetails-6ZLDRKCO.mjs.map +0 -7
- package/dist/lib/node-esm/RecordArticle-SSV74Z46.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-HZ3XXDFZ.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-serializer-WJ2TIQG6.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2SW6S2BB.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-7KMYUWSR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-EYS3L2NO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JOBIWCBC.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MPL6NHQX.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-ZE3XJL5J.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-KUXM33JI.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-STCQKUZ4.mjs.map +0 -7
- package/dist/lib/node-esm/settings-PVI2VG56.mjs.map +0 -7
- package/dist/lib/node-esm/spaces-ready-R744OHQG.mjs.map +0 -7
- package/dist/lib/node-esm/state-XE5YGPHM.mjs.map +0 -7
- /package/dist/lib/browser/{chunk-AWVAX26X.mjs.map → chunk-NF3ZFAB4.mjs.map} +0 -0
- /package/dist/lib/browser/{repair-CJG26D52.mjs.map → repair-DKU4TUD2.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-HREWB23G.mjs.map → chunk-PG7DNOEX.mjs.map} +0 -0
- /package/dist/lib/node-esm/{repair-G3ZW3VG3.mjs.map → repair-C2H6JQCL.mjs.map} +0 -0
package/src/cli/plugin.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { ActivationEvents, Capability, Plugin } from '@dxos/app-framework';
|
|
8
|
+
import { AppPlugin } from '@dxos/app-toolkit';
|
|
8
9
|
import { Tag } from '@dxos/echo';
|
|
9
10
|
import { ClientEvents } from '@dxos/plugin-client/types';
|
|
10
11
|
import { Collection, DataTypes } from '@dxos/schema';
|
|
@@ -17,7 +18,7 @@ import {
|
|
|
17
18
|
HasSubject,
|
|
18
19
|
Organization,
|
|
19
20
|
Person,
|
|
20
|
-
|
|
21
|
+
Pipeline,
|
|
21
22
|
Task,
|
|
22
23
|
} from '@dxos/types';
|
|
23
24
|
|
|
@@ -31,10 +32,19 @@ import { database, queue, space } from './commands';
|
|
|
31
32
|
|
|
32
33
|
export const SpacePlugin = Plugin.define<SpacePluginOptions>(meta).pipe(
|
|
33
34
|
// TODO(wittjosiah): Could some of these commands make use of operations?
|
|
34
|
-
|
|
35
|
+
AppPlugin.addCommandModule({
|
|
35
36
|
commands: [database, queue, space],
|
|
36
37
|
}),
|
|
37
|
-
|
|
38
|
+
AppPlugin.addMetadataModule({
|
|
39
|
+
metadata: {
|
|
40
|
+
id: Collection.Collection.typename,
|
|
41
|
+
metadata: {
|
|
42
|
+
createObject: ((props) => Effect.sync(() => Collection.make(props))) satisfies CreateObject,
|
|
43
|
+
addToCollectionOnCreate: true,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
}),
|
|
47
|
+
AppPlugin.addSchemaModule({
|
|
38
48
|
schema: [
|
|
39
49
|
...DataTypes,
|
|
40
50
|
AnchoredTo.AnchoredTo,
|
|
@@ -45,33 +55,30 @@ export const SpacePlugin = Plugin.define<SpacePluginOptions>(meta).pipe(
|
|
|
45
55
|
HasSubject.HasSubject,
|
|
46
56
|
Organization.Organization,
|
|
47
57
|
Person.Person,
|
|
48
|
-
|
|
58
|
+
Pipeline.Pipeline,
|
|
49
59
|
Tag.Tag,
|
|
50
60
|
Task.Task,
|
|
51
61
|
],
|
|
52
62
|
}),
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const baseUrl = new URL(invitationUrl);
|
|
65
|
-
baseUrl.searchParams.set(invitationProp, invitationCode);
|
|
66
|
-
return baseUrl.toString();
|
|
67
|
-
};
|
|
63
|
+
Plugin.addModule(
|
|
64
|
+
({
|
|
65
|
+
shareableLinkOrigin = 'http://localhost:5173',
|
|
66
|
+
invitationPath = '/',
|
|
67
|
+
invitationProp = 'spaceInvitationCode',
|
|
68
|
+
}) => {
|
|
69
|
+
const createInvitationUrl = (invitationCode: string) => {
|
|
70
|
+
const baseUrl = new URL(invitationPath || '/', shareableLinkOrigin);
|
|
71
|
+
baseUrl.searchParams.set(invitationProp, invitationCode);
|
|
72
|
+
return baseUrl.toString();
|
|
73
|
+
};
|
|
68
74
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
+
return {
|
|
76
|
+
id: Capability.getModuleTag(OperationResolver),
|
|
77
|
+
activatesOn: ActivationEvents.SetupOperationResolver,
|
|
78
|
+
activate: () => OperationResolver({ createInvitationUrl, observability: false }),
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
),
|
|
75
82
|
Plugin.addModule({
|
|
76
83
|
activatesOn: ClientEvents.IdentityCreated,
|
|
77
84
|
activatesAfter: [SpaceEvents.DefaultSpaceReady],
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
8
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
9
|
+
import { useLayout } from '@dxos/app-toolkit/ui';
|
|
9
10
|
import { Obj } from '@dxos/echo';
|
|
10
11
|
import { useClient } from '@dxos/react-client';
|
|
11
12
|
import { Filter, useQuery } from '@dxos/react-client/echo';
|
|
@@ -53,7 +54,7 @@ export const AwaitingObject = ({ id }: { id: string }) => {
|
|
|
53
54
|
);
|
|
54
55
|
|
|
55
56
|
const handleNavigate = useCallback(() => {
|
|
56
|
-
void invokePromise(
|
|
57
|
+
void invokePromise(LayoutOperation.Open, { subject: [id] });
|
|
57
58
|
void handleClose();
|
|
58
59
|
}, [id, handleClose, invokePromise]);
|
|
59
60
|
|
|
@@ -2,27 +2,37 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, { useMemo } from 'react';
|
|
5
|
+
import React, { useCallback, useMemo } from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
8
|
+
import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
|
|
9
|
+
import { type SurfaceComponentProps } from '@dxos/app-toolkit/ui';
|
|
9
10
|
import { Filter, Obj } from '@dxos/echo';
|
|
10
|
-
import { Graph, Node, useActionRunner, useConnections } from '@dxos/plugin-graph';
|
|
11
11
|
import { useClient } from '@dxos/react-client';
|
|
12
12
|
import { getSpace, useQuery } from '@dxos/react-client/echo';
|
|
13
|
-
import { Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
14
|
-
import { Card,
|
|
13
|
+
import { Layout, ScrollArea, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
14
|
+
import { Card, Mosaic, type MosaicStackTileComponent } from '@dxos/react-ui-mosaic';
|
|
15
15
|
import { SearchList, useSearchListResults } from '@dxos/react-ui-searchlist';
|
|
16
16
|
import { Collection } from '@dxos/schema';
|
|
17
|
+
import { getStyles } from '@dxos/ui-theme';
|
|
17
18
|
|
|
18
19
|
import { meta } from '../meta';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
|
-
*
|
|
22
|
+
* Hook to resolve metadata (icon, iconHue, etc.) for objects based on their typename.
|
|
23
|
+
*/
|
|
24
|
+
const useMetadataResolver = () => {
|
|
25
|
+
const allMetadata = useCapabilities(AppCapabilities.Metadata);
|
|
26
|
+
return useCallback((typename: string) => allMetadata.find((m) => m.id === typename)?.metadata ?? {}, [allMetadata]);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Article view for collections.
|
|
22
31
|
*/
|
|
23
32
|
export const CollectionArticle = ({ subject }: SurfaceComponentProps<Collection.Collection | Collection.Managed>) => {
|
|
24
33
|
const { t } = useTranslation(meta.id);
|
|
25
|
-
const
|
|
34
|
+
const resolveMetadata = useMetadataResolver();
|
|
35
|
+
const { items, handleSearch } = useCollectionItems(subject, resolveMetadata);
|
|
26
36
|
|
|
27
37
|
return (
|
|
28
38
|
<Layout.Main toolbar>
|
|
@@ -32,9 +42,11 @@ export const CollectionArticle = ({ subject }: SurfaceComponentProps<Collection.
|
|
|
32
42
|
</Toolbar.Root>
|
|
33
43
|
<SearchList.Content>
|
|
34
44
|
<Mosaic.Container asChild>
|
|
35
|
-
<
|
|
36
|
-
<
|
|
37
|
-
|
|
45
|
+
<ScrollArea.Root orientation='vertical'>
|
|
46
|
+
<ScrollArea.Viewport classNames='p-2'>
|
|
47
|
+
<Mosaic.Stack items={items} getId={(item) => item.id} Tile={ObjectTile} />
|
|
48
|
+
</ScrollArea.Viewport>
|
|
49
|
+
</ScrollArea.Root>
|
|
38
50
|
</Mosaic.Container>
|
|
39
51
|
</SearchList.Content>
|
|
40
52
|
</SearchList.Root>
|
|
@@ -42,32 +54,32 @@ export const CollectionArticle = ({ subject }: SurfaceComponentProps<Collection.
|
|
|
42
54
|
);
|
|
43
55
|
};
|
|
44
56
|
|
|
45
|
-
|
|
57
|
+
type ObjectItem = {
|
|
58
|
+
id: string;
|
|
59
|
+
object: Obj.Unknown;
|
|
60
|
+
icon: string;
|
|
61
|
+
iconHue?: string;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const ObjectTile: MosaicStackTileComponent<ObjectItem> = (props) => {
|
|
65
|
+
const item = props.data;
|
|
46
66
|
const { t } = useTranslation(meta.id);
|
|
47
|
-
const { graph } = useAppGraph();
|
|
48
67
|
const { invokeSync } = useOperationInvoker();
|
|
49
|
-
const runAction = useActionRunner();
|
|
50
68
|
|
|
51
|
-
const
|
|
52
|
-
const
|
|
69
|
+
const typename = Obj.getTypename(item.object) ?? '';
|
|
70
|
+
const label =
|
|
71
|
+
Obj.getLabel(item.object) ??
|
|
72
|
+
toLocalizedString(['object name placeholder', { ns: typename, defaultValue: item.id }], t);
|
|
73
|
+
const styles = item.iconHue ? getStyles(item.iconHue) : undefined;
|
|
53
74
|
|
|
54
75
|
const handleClick = () => {
|
|
55
|
-
|
|
56
|
-
// Run action if this is an action node.
|
|
57
|
-
const [parent] = Graph.getConnections(graph, node.id, 'inbound');
|
|
58
|
-
if (parent) {
|
|
59
|
-
void runAction(node, { parent });
|
|
60
|
-
}
|
|
61
|
-
} else {
|
|
62
|
-
// Navigate to the node.
|
|
63
|
-
invokeSync(Common.LayoutOperation.Open, { subject: [node.id] });
|
|
64
|
-
}
|
|
76
|
+
invokeSync(LayoutOperation.Open, { subject: [item.id] });
|
|
65
77
|
};
|
|
66
78
|
|
|
67
79
|
return (
|
|
68
80
|
<Card.Root fullWidth>
|
|
69
81
|
<Card.Toolbar>
|
|
70
|
-
<Card.ToolbarIconButton variant='ghost' label={label} icon={icon} />
|
|
82
|
+
<Card.ToolbarIconButton variant='ghost' label={label} icon={item.icon} iconOnly iconClassNames={styles?.icon} />
|
|
71
83
|
<Card.Title onClick={handleClick}>{label}</Card.Title>
|
|
72
84
|
<Card.Menu />
|
|
73
85
|
</Card.Toolbar>
|
|
@@ -78,32 +90,19 @@ const NodeTile: StackTileComponent<Node.Node> = ({ data: node }) => {
|
|
|
78
90
|
export default CollectionArticle;
|
|
79
91
|
|
|
80
92
|
/**
|
|
81
|
-
* Hook to get items from a regular collection
|
|
93
|
+
* Hook to get items from a regular collection.
|
|
82
94
|
*/
|
|
83
|
-
const useRegularCollectionItems = (collection: Collection.Collection) => {
|
|
84
|
-
const { graph } = useAppGraph();
|
|
85
|
-
const collectionId = Obj.getDXN(collection).toString();
|
|
86
|
-
const children = useConnections(graph, collectionId, 'outbound');
|
|
87
|
-
|
|
88
|
-
// Filter children to those which are objects or actions with disposition 'item'.
|
|
95
|
+
const useRegularCollectionItems = (collection: Collection.Collection): Obj.Unknown[] => {
|
|
89
96
|
return useMemo(
|
|
90
|
-
() =>
|
|
91
|
-
|
|
92
|
-
// Include regular objects.
|
|
93
|
-
if (Obj.isObject(node.data)) {
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
// Include actions with disposition 'item'.
|
|
97
|
-
return Node.isAction(node) && node.properties.disposition === 'item';
|
|
98
|
-
}),
|
|
99
|
-
[children],
|
|
97
|
+
() => (collection.objects ?? []).map((ref) => ref.target).filter((obj): obj is Obj.Unknown => Obj.isObject(obj)),
|
|
98
|
+
[collection.objects],
|
|
100
99
|
);
|
|
101
100
|
};
|
|
102
101
|
|
|
103
102
|
/**
|
|
104
103
|
* Hook to get items from a managed collection by querying the space.
|
|
105
104
|
*/
|
|
106
|
-
const useManagedCollectionItems = (collection: Collection.Managed) => {
|
|
105
|
+
const useManagedCollectionItems = (collection: Collection.Managed): Obj.Unknown[] => {
|
|
107
106
|
const client = useClient();
|
|
108
107
|
const space = getSpace(collection);
|
|
109
108
|
|
|
@@ -112,46 +111,46 @@ const useManagedCollectionItems = (collection: Collection.Managed) => {
|
|
|
112
111
|
[client, collection],
|
|
113
112
|
);
|
|
114
113
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
// Convert objects to node-like items for consistent rendering.
|
|
118
|
-
return useMemo(
|
|
119
|
-
() =>
|
|
120
|
-
objects.map(
|
|
121
|
-
(obj) =>
|
|
122
|
-
({
|
|
123
|
-
id: Obj.getDXN(obj).toString(),
|
|
124
|
-
type: 'managed-object',
|
|
125
|
-
data: obj,
|
|
126
|
-
properties: {
|
|
127
|
-
label: Obj.getLabel(obj) ?? obj.id,
|
|
128
|
-
icon: 'ph--placeholder--regular',
|
|
129
|
-
},
|
|
130
|
-
}) as Node.Node,
|
|
131
|
-
),
|
|
132
|
-
[objects],
|
|
133
|
-
);
|
|
114
|
+
return useQuery(space?.db, schema ? Filter.type(schema) : Filter.nothing());
|
|
134
115
|
};
|
|
135
116
|
|
|
117
|
+
type MetadataResolver = (typename: string) => { icon?: string; iconHue?: string };
|
|
118
|
+
|
|
136
119
|
/**
|
|
137
120
|
* Combined hook to get collection items with search/filter support.
|
|
138
121
|
*/
|
|
139
|
-
const useCollectionItems = (
|
|
122
|
+
const useCollectionItems = (
|
|
123
|
+
collection: Collection.Collection | Collection.Managed,
|
|
124
|
+
resolveMetadata: MetadataResolver,
|
|
125
|
+
) => {
|
|
140
126
|
const isManaged = Obj.instanceOf(Collection.Managed, collection);
|
|
141
127
|
|
|
142
128
|
// Call both hooks unconditionally to satisfy React's rules of hooks.
|
|
143
|
-
const
|
|
144
|
-
const
|
|
129
|
+
const regularObjects = useRegularCollectionItems(collection as Collection.Collection);
|
|
130
|
+
const managedObjects = useManagedCollectionItems(collection as Collection.Managed);
|
|
145
131
|
|
|
146
|
-
const
|
|
132
|
+
const objects = isManaged ? managedObjects : regularObjects;
|
|
133
|
+
|
|
134
|
+
// Convert objects to items with resolved metadata.
|
|
135
|
+
const items = useMemo(
|
|
136
|
+
() =>
|
|
137
|
+
objects.map((obj) => {
|
|
138
|
+
const typename = Obj.getTypename(obj);
|
|
139
|
+
const metadata = typename ? resolveMetadata(typename) : {};
|
|
140
|
+
return {
|
|
141
|
+
id: Obj.getDXN(obj).toString(),
|
|
142
|
+
object: obj,
|
|
143
|
+
icon: metadata.icon ?? 'ph--placeholder--regular',
|
|
144
|
+
iconHue: metadata.iconHue,
|
|
145
|
+
} satisfies ObjectItem;
|
|
146
|
+
}),
|
|
147
|
+
[objects, resolveMetadata],
|
|
148
|
+
);
|
|
147
149
|
|
|
148
150
|
// Use searchlist results for filtering.
|
|
149
151
|
const { results, handleSearch } = useSearchListResults({
|
|
150
152
|
items,
|
|
151
|
-
extract: (
|
|
152
|
-
const label = node.properties.label;
|
|
153
|
-
return typeof label === 'string' ? label : (label?.en ?? node.id);
|
|
154
|
-
},
|
|
153
|
+
extract: (item) => Obj.getLabel(item.object) ?? item.id,
|
|
155
154
|
});
|
|
156
155
|
|
|
157
156
|
return { items: results, handleSearch };
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
|
-
import { type SurfaceComponentProps } from '@dxos/app-
|
|
7
|
+
import { type SurfaceComponentProps } from '@dxos/app-toolkit/ui';
|
|
8
8
|
import { useTranslation } from '@dxos/react-ui';
|
|
9
9
|
import { type Collection } from '@dxos/schema';
|
|
10
10
|
|
|
@@ -35,7 +35,7 @@ const meta = {
|
|
|
35
35
|
component: CreateObjectDialog,
|
|
36
36
|
render: DefaultStory,
|
|
37
37
|
decorators: [
|
|
38
|
-
withTheme, // TODO(wittjosiah): Try to write story which does not depend on plugin manager.
|
|
38
|
+
withTheme(), // TODO(wittjosiah): Try to write story which does not depend on plugin manager.
|
|
39
39
|
withPluginManager({
|
|
40
40
|
plugins: [RuntimePlugin(), OperationPlugin()],
|
|
41
41
|
}),
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import { Capability
|
|
9
|
-
import { useOperationInvoker, usePluginManager } from '@dxos/app-framework/
|
|
8
|
+
import { Capability } from '@dxos/app-framework';
|
|
9
|
+
import { useOperationInvoker, usePluginManager } from '@dxos/app-framework/ui';
|
|
10
|
+
import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
|
|
10
11
|
import { Database, Obj, Type } from '@dxos/echo';
|
|
11
12
|
import { EntityKind, getTypeAnnotation } from '@dxos/echo/internal';
|
|
12
13
|
import { runAndForwardErrors } from '@dxos/effect';
|
|
@@ -52,7 +53,7 @@ export const CreateObjectDialog = ({
|
|
|
52
53
|
const resolve = useCallback<NonNullable<CreateObjectPanelProps['resolve']>>(
|
|
53
54
|
(typename) => {
|
|
54
55
|
const metadata = manager.capabilities
|
|
55
|
-
.getAll(
|
|
56
|
+
.getAll(AppCapabilities.Metadata)
|
|
56
57
|
.find(({ id }) => id === typename)?.metadata;
|
|
57
58
|
return metadata?.createObject ? (metadata as Metadata) : undefined;
|
|
58
59
|
},
|
|
@@ -95,7 +96,7 @@ export const CreateObjectDialog = ({
|
|
|
95
96
|
const shouldNavigate = _shouldNavigate ?? (() => true);
|
|
96
97
|
if (shouldNavigate(object)) {
|
|
97
98
|
yield* Effect.promise(() =>
|
|
98
|
-
operationInvoker.invokePromise(
|
|
99
|
+
operationInvoker.invokePromise(LayoutOperation.Open, {
|
|
99
100
|
subject: [Obj.getDXN(object).toString()],
|
|
100
101
|
}),
|
|
101
102
|
);
|
|
@@ -126,19 +127,21 @@ export const CreateObjectDialog = ({
|
|
|
126
127
|
<Dialog.CloseIconButton ref={closeRef} />
|
|
127
128
|
</Dialog.Close>
|
|
128
129
|
</Dialog.Header>
|
|
129
|
-
<
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
130
|
+
<Dialog.Body>
|
|
131
|
+
<CreateObjectPanel
|
|
132
|
+
schemas={userSchemas}
|
|
133
|
+
spaces={spaces}
|
|
134
|
+
target={target}
|
|
135
|
+
views={views}
|
|
136
|
+
typename={typename}
|
|
137
|
+
initialFormValues={initialFormValues}
|
|
138
|
+
defaultSpaceId={client.spaces.default.id}
|
|
139
|
+
resolve={resolve}
|
|
140
|
+
onTargetChange={setTarget}
|
|
141
|
+
onTypenameChange={setTypename}
|
|
142
|
+
onCreateObject={handleCreateObject}
|
|
143
|
+
/>
|
|
144
|
+
</Dialog.Body>
|
|
142
145
|
</Dialog.Content>
|
|
143
146
|
);
|
|
144
147
|
};
|
|
@@ -128,6 +128,8 @@ export const CreateObjectPanel = ({
|
|
|
128
128
|
) : null;
|
|
129
129
|
};
|
|
130
130
|
|
|
131
|
+
CreateObjectPanel.displayName = 'CreateObjectPanel';
|
|
132
|
+
|
|
131
133
|
const SelectSpace = ({
|
|
132
134
|
spaces,
|
|
133
135
|
defaultSpaceId,
|
|
@@ -166,33 +168,32 @@ const SelectSpace = ({
|
|
|
166
168
|
),
|
|
167
169
|
});
|
|
168
170
|
|
|
171
|
+
// TODO(burdon): Replace with Combobox.
|
|
169
172
|
return (
|
|
170
173
|
<SearchList.Root onSearch={handleSearch}>
|
|
171
|
-
<
|
|
174
|
+
<SearchList.Content>
|
|
172
175
|
<SearchList.Input
|
|
173
176
|
autoFocus
|
|
174
177
|
data-testid='create-object-form.space-input'
|
|
175
178
|
placeholder={t('space input placeholder')}
|
|
176
179
|
/>
|
|
177
|
-
<SearchList.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
</SearchList.Content>
|
|
195
|
-
</div>
|
|
180
|
+
<SearchList.Viewport>
|
|
181
|
+
{results.map((space) => (
|
|
182
|
+
<SearchList.Item
|
|
183
|
+
key={space.id}
|
|
184
|
+
value={space.id}
|
|
185
|
+
label={toLocalizedString(
|
|
186
|
+
getSpaceDisplayName(space, {
|
|
187
|
+
personal: space.id === defaultSpaceId,
|
|
188
|
+
}),
|
|
189
|
+
t,
|
|
190
|
+
)}
|
|
191
|
+
onSelect={() => onChange?.(space.db)}
|
|
192
|
+
classNames='flex items-center gap-2'
|
|
193
|
+
/>
|
|
194
|
+
))}
|
|
195
|
+
</SearchList.Viewport>
|
|
196
|
+
</SearchList.Content>
|
|
196
197
|
</SearchList.Root>
|
|
197
198
|
);
|
|
198
199
|
};
|
|
@@ -218,30 +219,28 @@ const SelectSchema = ({
|
|
|
218
219
|
|
|
219
220
|
return (
|
|
220
221
|
<SearchList.Root onSearch={handleSearch}>
|
|
221
|
-
<
|
|
222
|
+
<SearchList.Content>
|
|
222
223
|
<SearchList.Input
|
|
223
224
|
autoFocus
|
|
224
225
|
data-testid='create-object-form.schema-input'
|
|
225
226
|
placeholder={t('schema input placeholder')}
|
|
226
227
|
/>
|
|
227
|
-
<SearchList.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
</SearchList.Content>
|
|
244
|
-
</div>
|
|
228
|
+
<SearchList.Viewport>
|
|
229
|
+
{results.map((option) => (
|
|
230
|
+
<SearchList.Item
|
|
231
|
+
key={option.typename}
|
|
232
|
+
value={option.typename}
|
|
233
|
+
label={t('typename label', {
|
|
234
|
+
ns: option.typename,
|
|
235
|
+
defaultValue: option.typename,
|
|
236
|
+
})}
|
|
237
|
+
icon={resolve?.(option.typename)?.icon ?? 'ph--placeholder--regular'}
|
|
238
|
+
onSelect={() => onChange(option.typename)}
|
|
239
|
+
classNames='flex items-center gap-2'
|
|
240
|
+
/>
|
|
241
|
+
))}
|
|
242
|
+
</SearchList.Viewport>
|
|
243
|
+
</SearchList.Content>
|
|
245
244
|
</SearchList.Root>
|
|
246
245
|
);
|
|
247
246
|
};
|
|
@@ -6,8 +6,8 @@ import * as Effect from 'effect/Effect';
|
|
|
6
6
|
import type * as Schema from 'effect/Schema';
|
|
7
7
|
import React, { useCallback, useRef } from 'react';
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
10
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
11
11
|
import { runAndForwardErrors } from '@dxos/effect';
|
|
12
12
|
import { Dialog, useTranslation } from '@dxos/react-ui';
|
|
13
13
|
import { Form } from '@dxos/react-ui-form';
|
|
@@ -33,10 +33,8 @@ export const CreateSpaceDialog = () => {
|
|
|
33
33
|
const program = Effect.gen(function* () {
|
|
34
34
|
const { data: result } = yield* Effect.promise(() => invokePromise(SpaceOperation.Create, data));
|
|
35
35
|
if (result?.space) {
|
|
36
|
-
yield* Effect.promise(() =>
|
|
37
|
-
|
|
38
|
-
);
|
|
39
|
-
yield* Effect.promise(() => invokePromise(Common.LayoutOperation.UpdateDialog, { state: false }));
|
|
36
|
+
yield* Effect.promise(() => invokePromise(LayoutOperation.SwitchWorkspace, { subject: result.space.id }));
|
|
37
|
+
yield* Effect.promise(() => invokePromise(LayoutOperation.UpdateDialog, { state: false }));
|
|
40
38
|
}
|
|
41
39
|
});
|
|
42
40
|
await runAndForwardErrors(program);
|
|
@@ -52,21 +50,23 @@ export const CreateSpaceDialog = () => {
|
|
|
52
50
|
<Dialog.CloseIconButton ref={closeRef} />
|
|
53
51
|
</Dialog.Close>
|
|
54
52
|
</Dialog.Header>
|
|
55
|
-
<
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
<Form.
|
|
65
|
-
<Form.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
53
|
+
<Dialog.Body>
|
|
54
|
+
<Form.Root
|
|
55
|
+
testId='create-space-form'
|
|
56
|
+
autoFocus
|
|
57
|
+
schema={SpaceForm}
|
|
58
|
+
values={initialValues}
|
|
59
|
+
fieldProvider={inputSurfaceLookup}
|
|
60
|
+
onSave={handleCreateSpace}
|
|
61
|
+
>
|
|
62
|
+
<Form.Viewport>
|
|
63
|
+
<Form.Content>
|
|
64
|
+
<Form.FieldSet />
|
|
65
|
+
<Form.Submit />
|
|
66
|
+
</Form.Content>
|
|
67
|
+
</Form.Viewport>
|
|
68
|
+
</Form.Root>
|
|
69
|
+
</Dialog.Body>
|
|
70
70
|
</Dialog.Content>
|
|
71
71
|
);
|
|
72
72
|
};
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { useCallback } from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
8
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
9
|
+
import { useAppGraph } from '@dxos/app-toolkit/ui';
|
|
9
10
|
import { Trigger } from '@dxos/async';
|
|
10
11
|
import { Graph } from '@dxos/plugin-graph';
|
|
11
12
|
import { ObservabilityOperation } from '@dxos/plugin-observability/types';
|
|
@@ -38,13 +39,13 @@ export const JoinDialog = ({ navigableCollections, onDone, ...props }: JoinDialo
|
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
await Promise.all([
|
|
41
|
-
invokePromise(
|
|
42
|
+
invokePromise(LayoutOperation.AddToast, {
|
|
42
43
|
id: `${meta.id}/join-success`,
|
|
43
44
|
duration: 5_000,
|
|
44
45
|
title: ['join success label', { ns: meta.id }],
|
|
45
46
|
closeLabel: ['dismiss label', { ns: meta.id }],
|
|
46
47
|
}),
|
|
47
|
-
invokePromise(
|
|
48
|
+
invokePromise(LayoutOperation.UpdateDialog, { state: false }),
|
|
48
49
|
]);
|
|
49
50
|
|
|
50
51
|
let space = client.spaces.get(spaceKey);
|
|
@@ -60,7 +61,7 @@ export const JoinDialog = ({ navigableCollections, onDone, ...props }: JoinDialo
|
|
|
60
61
|
space = await trigger.wait();
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
await invokePromise(
|
|
64
|
+
await invokePromise(LayoutOperation.SwitchWorkspace, { subject: space.id });
|
|
64
65
|
|
|
65
66
|
// TODO(wittjosiah): If navigableCollections is false and there's no target,
|
|
66
67
|
// should try to navigate to the first object of the space replicates.
|
|
@@ -71,8 +72,8 @@ export const JoinDialog = ({ navigableCollections, onDone, ...props }: JoinDialo
|
|
|
71
72
|
// If the target has not yet replicated, this will trigger a loading toast.
|
|
72
73
|
await Graph.waitForPath(graph, { target }).catch(() => {});
|
|
73
74
|
await Promise.all([
|
|
74
|
-
invokePromise(
|
|
75
|
-
invokePromise(
|
|
75
|
+
invokePromise(LayoutOperation.Open, { subject: [target] }),
|
|
76
|
+
invokePromise(LayoutOperation.Expose, { subject: target }),
|
|
76
77
|
]);
|
|
77
78
|
}
|
|
78
79
|
|
|
@@ -36,7 +36,7 @@ const meta = {
|
|
|
36
36
|
component: MembersContainer as any,
|
|
37
37
|
render: render(DefaultStory),
|
|
38
38
|
decorators: [
|
|
39
|
-
withTheme, // TODO(wittjosiah): Try to write story which does not depend on plugin manager.
|
|
39
|
+
withTheme(), // TODO(wittjosiah): Try to write story which does not depend on plugin manager.
|
|
40
40
|
withPluginManager({ plugins: [OperationPlugin()] }),
|
|
41
41
|
withClientProvider({
|
|
42
42
|
createIdentity: true,
|