@dxos/plugin-space 0.7.4 → 0.7.5-labs.071a3e2
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-TTM2YZVS.mjs +367 -0
- package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs.map +7 -0
- package/dist/lib/browser/app-graph-serializer-ZGM5NDXE.mjs +80 -0
- package/dist/lib/browser/app-graph-serializer-ZGM5NDXE.mjs.map +7 -0
- package/dist/lib/browser/chunk-2NMUVDMZ.mjs +1715 -0
- package/dist/lib/browser/chunk-2NMUVDMZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-ENRYFGYE.mjs +133 -0
- package/dist/lib/browser/chunk-ENRYFGYE.mjs.map +7 -0
- package/dist/lib/browser/chunk-H2AR4OLP.mjs +316 -0
- package/dist/lib/browser/chunk-H2AR4OLP.mjs.map +7 -0
- package/dist/lib/browser/chunk-PQXZCNAU.mjs +13 -0
- package/dist/lib/browser/chunk-PQXZCNAU.mjs.map +7 -0
- package/dist/lib/browser/chunk-RLZQJD47.mjs +22 -0
- package/dist/lib/browser/chunk-RLZQJD47.mjs.map +7 -0
- package/dist/lib/browser/chunk-S5IGZNXJ.mjs +528 -0
- package/dist/lib/browser/chunk-S5IGZNXJ.mjs.map +7 -0
- package/dist/lib/browser/identity-created-VICTPQX7.mjs +28 -0
- package/dist/lib/browser/identity-created-VICTPQX7.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +193 -3521
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/intent-resolver-A5274MUR.mjs +537 -0
- package/dist/lib/browser/intent-resolver-A5274MUR.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-root-N6QTWYCV.mjs +28 -0
- package/dist/lib/browser/react-root-N6QTWYCV.mjs.map +7 -0
- package/dist/lib/browser/react-surface-STMNA7W7.mjs +231 -0
- package/dist/lib/browser/react-surface-STMNA7W7.mjs.map +7 -0
- package/dist/lib/browser/settings-HN5UIYQO.mjs +24 -0
- package/dist/lib/browser/settings-HN5UIYQO.mjs.map +7 -0
- package/dist/lib/browser/spaces-ready-F57ITJDR.mjs +199 -0
- package/dist/lib/browser/spaces-ready-F57ITJDR.mjs.map +7 -0
- package/dist/lib/browser/state-6DCY5YJP.mjs +47 -0
- package/dist/lib/browser/state-6DCY5YJP.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +14 -5
- package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs +370 -0
- package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs.map +7 -0
- package/dist/lib/node/app-graph-serializer-AWKVTYAB.cjs +88 -0
- package/dist/lib/node/app-graph-serializer-AWKVTYAB.cjs.map +7 -0
- package/dist/lib/node/chunk-2RCJT3P2.cjs +1712 -0
- package/dist/lib/node/chunk-2RCJT3P2.cjs.map +7 -0
- package/dist/lib/node/chunk-I2LRRRMV.cjs +150 -0
- package/dist/lib/node/chunk-I2LRRRMV.cjs.map +7 -0
- package/dist/lib/node/chunk-MMXP2NHE.cjs +556 -0
- package/dist/lib/node/chunk-MMXP2NHE.cjs.map +7 -0
- package/dist/lib/node/chunk-SPCSJ2CY.cjs +345 -0
- package/dist/lib/node/chunk-SPCSJ2CY.cjs.map +7 -0
- package/dist/lib/node/chunk-UX3U4RU2.cjs +42 -0
- package/dist/lib/node/chunk-UX3U4RU2.cjs.map +7 -0
- package/dist/lib/node/{meta.cjs → chunk-WZR6OAN3.cjs} +13 -13
- package/dist/lib/node/chunk-WZR6OAN3.cjs.map +7 -0
- package/dist/lib/node/identity-created-JNDKMFKI.cjs +44 -0
- package/dist/lib/node/identity-created-JNDKMFKI.cjs.map +7 -0
- package/dist/lib/node/index.cjs +176 -3506
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/intent-resolver-NVTAESKB.cjs +536 -0
- package/dist/lib/node/intent-resolver-NVTAESKB.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/react-root-YCHSAYQE.cjs +50 -0
- package/dist/lib/node/react-root-YCHSAYQE.cjs.map +7 -0
- package/dist/lib/node/react-surface-ANSZ4FKK.cjs +229 -0
- package/dist/lib/node/react-surface-ANSZ4FKK.cjs.map +7 -0
- package/dist/lib/node/settings-RBBL22DJ.cjs +38 -0
- package/dist/lib/node/settings-RBBL22DJ.cjs.map +7 -0
- package/dist/lib/node/spaces-ready-WHU4J6E5.cjs +210 -0
- package/dist/lib/node/spaces-ready-WHU4J6E5.cjs.map +7 -0
- package/dist/lib/node/state-WPZC4JXB.cjs +61 -0
- package/dist/lib/node/state-WPZC4JXB.cjs.map +7 -0
- package/dist/lib/node/types/index.cjs +23 -14
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs +368 -0
- package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs.map +7 -0
- package/dist/lib/node-esm/app-graph-serializer-AWAWDSCM.mjs +81 -0
- package/dist/lib/node-esm/app-graph-serializer-AWAWDSCM.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4HICD7AU.mjs +1716 -0
- package/dist/lib/node-esm/chunk-4HICD7AU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-77RE7Y5J.mjs +529 -0
- package/dist/lib/node-esm/chunk-77RE7Y5J.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ESWV7ICX.mjs +134 -0
- package/dist/lib/node-esm/chunk-ESWV7ICX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ICCM4YRJ.mjs +15 -0
- package/dist/lib/node-esm/chunk-ICCM4YRJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-LGL4A5B5.mjs +23 -0
- package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs +317 -0
- package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs.map +7 -0
- package/dist/lib/node-esm/identity-created-3AUSSVEK.mjs +29 -0
- package/dist/lib/node-esm/identity-created-3AUSSVEK.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +193 -3521
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/intent-resolver-KJ67TU34.mjs +538 -0
- package/dist/lib/node-esm/intent-resolver-KJ67TU34.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-root-NBQQKAZD.mjs +29 -0
- package/dist/lib/node-esm/react-root-NBQQKAZD.mjs.map +7 -0
- package/dist/lib/node-esm/react-surface-G2H5T2D2.mjs +232 -0
- package/dist/lib/node-esm/react-surface-G2H5T2D2.mjs.map +7 -0
- package/dist/lib/node-esm/settings-VBAUB37B.mjs +25 -0
- package/dist/lib/node-esm/settings-VBAUB37B.mjs.map +7 -0
- package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs +200 -0
- package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs.map +7 -0
- package/dist/lib/node-esm/state-5GH2D5U4.mjs +48 -0
- package/dist/lib/node-esm/state-5GH2D5U4.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +14 -5
- package/dist/types/src/SpacePlugin.d.ts +3 -22
- package/dist/types/src/SpacePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +181 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +4 -0
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -0
- package/dist/types/src/capabilities/capabilities.d.ts +21 -0
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
- package/dist/types/src/capabilities/identity-created.d.ts +4 -0
- package/dist/types/src/capabilities/identity-created.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +196 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts +9 -0
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-root.d.ts +7 -0
- package/dist/types/src/capabilities/react-root.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface.d.ts +7 -0
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/settings.d.ts +4 -0
- package/dist/types/src/capabilities/settings.d.ts.map +1 -0
- package/dist/types/src/capabilities/spaces-ready.d.ts +4 -0
- package/dist/types/src/capabilities/spaces-ready.d.ts.map +1 -0
- package/dist/types/src/capabilities/state.d.ts +5 -0
- package/dist/types/src/capabilities/state.d.ts.map +1 -0
- package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts +7 -0
- package/dist/types/src/components/AdvancedObjectSettings/AdvancedObjectSettings.d.ts.map +1 -0
- package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts +8 -0
- package/dist/types/src/components/AdvancedObjectSettings/ForeignKeys.d.ts.map +1 -0
- package/dist/types/src/components/AdvancedObjectSettings/index.d.ts +2 -0
- package/dist/types/src/components/AdvancedObjectSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/AwaitingObject.d.ts.map +1 -1
- package/dist/types/src/components/BaseObjectSettings.d.ts +7 -0
- package/dist/types/src/components/BaseObjectSettings.d.ts.map +1 -0
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts +5 -4
- package/dist/types/src/components/CreateDialog/CreateObjectDialog.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +9 -9
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts +1 -0
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/components/JoinDialog.d.ts +1 -0
- package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/components/PopoverRenameObject.d.ts +1 -0
- package/dist/types/src/components/PopoverRenameObject.d.ts.map +1 -1
- package/dist/types/src/components/PopoverRenameSpace.d.ts +1 -0
- package/dist/types/src/components/PopoverRenameSpace.d.ts.map +1 -1
- package/dist/types/src/components/ShareSpaceButton.d.ts.map +1 -1
- package/dist/types/src/components/SpacePluginSettings.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.d.ts +9 -6
- package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.stories.d.ts +1 -1
- package/dist/types/src/components/SpacePresence.stories.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts +1 -0
- package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts +4 -3
- 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 +3 -3
- package/dist/types/src/components/SyncStatus/InlineSyncStatus.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts +2 -2
- package/dist/types/src/components/SyncStatus/SyncStatusDetail.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/events.d.ts +5 -0
- package/dist/types/src/events.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/hooks/usePath.d.ts +11 -0
- package/dist/types/src/hooks/usePath.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +3 -5
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -27
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +18 -3
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/collection.d.ts +8 -12
- package/dist/types/src/types/collection.d.ts.map +1 -1
- package/dist/types/src/types/thread.d.ts +180 -186
- package/dist/types/src/types/thread.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +228 -16
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +9 -8
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +39 -46
- package/src/SpacePlugin.tsx +121 -1538
- package/src/capabilities/app-graph-builder.ts +393 -0
- package/src/capabilities/app-graph-serializer.ts +73 -0
- package/src/capabilities/capabilities.ts +26 -0
- package/src/capabilities/identity-created.ts +26 -0
- package/src/capabilities/index.ts +17 -0
- package/src/capabilities/intent-resolver.ts +518 -0
- package/src/capabilities/react-root.tsx +20 -0
- package/src/capabilities/react-surface.tsx +226 -0
- package/src/capabilities/settings.ts +17 -0
- package/src/capabilities/spaces-ready.ts +230 -0
- package/src/capabilities/state.ts +45 -0
- package/src/components/AdvancedObjectSettings/AdvancedObjectSettings.tsx +72 -0
- package/src/components/AdvancedObjectSettings/ForeignKeys.tsx +51 -0
- package/src/components/AdvancedObjectSettings/index.ts +5 -0
- package/src/components/AwaitingObject.tsx +15 -19
- package/src/components/{DefaultObjectSettings.tsx → BaseObjectSettings.tsx} +2 -2
- package/src/components/CreateDialog/CreateObjectDialog.tsx +49 -38
- package/src/components/CreateDialog/CreateObjectPanel.tsx +137 -101
- package/src/components/CreateDialog/CreateSpaceDialog.tsx +22 -17
- package/src/components/JoinDialog.tsx +40 -48
- package/src/components/PersistenceStatus.tsx +1 -1
- package/src/components/PopoverRenameObject.tsx +2 -0
- package/src/components/PopoverRenameSpace.tsx +2 -0
- package/src/components/ShareSpaceButton.tsx +5 -4
- package/src/components/SpacePluginSettings.tsx +5 -16
- package/src/components/SpacePresence.stories.tsx +27 -19
- package/src/components/SpacePresence.tsx +41 -21
- package/src/components/SpaceSettings/SpaceSettingsDialog.stories.tsx +2 -3
- package/src/components/SpaceSettings/SpaceSettingsDialog.tsx +19 -2
- package/src/components/SpaceSettings/SpaceSettingsPanel.stories.tsx +7 -5
- package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +7 -7
- package/src/components/SyncStatus/InlineSyncStatus.tsx +37 -27
- package/src/components/SyncStatus/SyncStatus.tsx +2 -1
- package/src/components/SyncStatus/SyncStatusDetail.stories.tsx +55 -51
- package/src/components/index.ts +2 -1
- package/src/events.ts +12 -0
- package/src/hooks/index.ts +5 -0
- package/src/hooks/usePath.ts +44 -0
- package/src/index.ts +3 -7
- package/src/meta.ts +2 -29
- package/src/translations.ts +7 -2
- package/src/types/collection.ts +3 -3
- package/src/types/thread.ts +6 -6
- package/src/types/types.ts +177 -42
- package/src/util.tsx +82 -65
- package/dist/lib/browser/chunk-FTKV32QZ.mjs +0 -43
- package/dist/lib/browser/chunk-FTKV32QZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-MWKXNS5S.mjs +0 -124
- package/dist/lib/browser/chunk-MWKXNS5S.mjs.map +0 -7
- package/dist/lib/browser/meta.mjs +0 -15
- package/dist/lib/browser/meta.mjs.map +0 -7
- package/dist/lib/node/chunk-6SNOZF7Y.cjs +0 -152
- package/dist/lib/node/chunk-6SNOZF7Y.cjs.map +0 -7
- package/dist/lib/node/chunk-QNVEU2UD.cjs +0 -69
- package/dist/lib/node/chunk-QNVEU2UD.cjs.map +0 -7
- package/dist/lib/node/meta.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-OHEAWSCA.mjs +0 -126
- package/dist/lib/node-esm/chunk-OHEAWSCA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UMV7XREB.mjs +0 -45
- package/dist/lib/node-esm/chunk-UMV7XREB.mjs.map +0 -7
- package/dist/lib/node-esm/meta.mjs +0 -16
- package/dist/lib/node-esm/meta.mjs.map +0 -7
- package/dist/types/src/components/DefaultObjectSettings.d.ts +0 -7
- package/dist/types/src/components/DefaultObjectSettings.d.ts.map +0 -1
- package/dist/types/src/components/SyncStatus/InlineSyncStatus.stories.d.ts +0 -6
- package/dist/types/src/components/SyncStatus/InlineSyncStatus.stories.d.ts.map +0 -1
- package/src/components/SyncStatus/InlineSyncStatus.stories.tsx +0 -57
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { CheckCircle, CircleDashed, CircleNotch } from '@phosphor-icons/react';
|
|
6
|
-
import React, { useEffect, useState } from 'react';
|
|
6
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { createIntent, LayoutAction, useIntentDispatcher, useLayout } from '@dxos/app-framework';
|
|
9
9
|
import { useClient } from '@dxos/react-client';
|
|
10
10
|
import { Filter, fullyQualifiedId, useQuery } from '@dxos/react-client/echo';
|
|
11
11
|
import { Button, Toast, useTranslation } from '@dxos/react-ui';
|
|
12
12
|
import { getSize, mx } from '@dxos/react-ui-theme';
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import { SPACE_PLUGIN } from '../meta';
|
|
15
|
+
import { SpaceAction } from '../types';
|
|
15
16
|
|
|
16
17
|
const WAIT_FOR_OBJECT_TIMEOUT = 180e3; // 3 minutes
|
|
17
18
|
const TOAST_TIMEOUT = 240e3; // 4 minutes
|
|
@@ -21,8 +22,8 @@ export const AwaitingObject = ({ id }: { id: string }) => {
|
|
|
21
22
|
const [waiting, setWaiting] = useState(true);
|
|
22
23
|
const [found, setFound] = useState(false);
|
|
23
24
|
const { t } = useTranslation(SPACE_PLUGIN);
|
|
24
|
-
const
|
|
25
|
-
const
|
|
25
|
+
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
26
|
+
const layout = useLayout();
|
|
26
27
|
|
|
27
28
|
const client = useClient();
|
|
28
29
|
const objects = useQuery(client.spaces, Filter.all());
|
|
@@ -43,26 +44,21 @@ export const AwaitingObject = ({ id }: { id: string }) => {
|
|
|
43
44
|
if (objects.findIndex((object) => fullyQualifiedId(object) === id) > -1) {
|
|
44
45
|
setFound(true);
|
|
45
46
|
|
|
46
|
-
if (
|
|
47
|
+
if (layout.active.includes(id)) {
|
|
47
48
|
setOpen(false);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
|
-
}, [id, objects,
|
|
51
|
+
}, [id, objects, layout]);
|
|
51
52
|
|
|
52
|
-
const handleClose =
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
data: { id: undefined },
|
|
57
|
-
});
|
|
53
|
+
const handleClose = useCallback(
|
|
54
|
+
async () => dispatch(createIntent(SpaceAction.WaitForObject, { id: undefined })),
|
|
55
|
+
[dispatch],
|
|
56
|
+
);
|
|
58
57
|
|
|
59
|
-
const handleNavigate = () => {
|
|
60
|
-
void
|
|
61
|
-
action: NavigationAction.OPEN,
|
|
62
|
-
data: { activeParts: { main: [id] } },
|
|
63
|
-
});
|
|
58
|
+
const handleNavigate = useCallback(() => {
|
|
59
|
+
void dispatch(createIntent(LayoutAction.Open, { part: 'main', subject: [id] }));
|
|
64
60
|
void handleClose();
|
|
65
|
-
};
|
|
61
|
+
}, [id, handleClose, dispatch]);
|
|
66
62
|
|
|
67
63
|
return (
|
|
68
64
|
<Toast.Root open={open} duration={TOAST_TIMEOUT} onOpenChange={setOpen}>
|
|
@@ -9,11 +9,11 @@ import { Input, useTranslation } from '@dxos/react-ui';
|
|
|
9
9
|
|
|
10
10
|
import { SPACE_PLUGIN } from '../meta';
|
|
11
11
|
|
|
12
|
-
export type
|
|
12
|
+
export type BaseObjectSettingsProps = {
|
|
13
13
|
object: ReactiveEchoObject<any>;
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
export const
|
|
16
|
+
export const BaseObjectSettings = ({ object }: BaseObjectSettingsProps) => {
|
|
17
17
|
const { t } = useTranslation(SPACE_PLUGIN);
|
|
18
18
|
// TODO(burdon): Standardize forms.
|
|
19
19
|
return (
|
|
@@ -2,20 +2,30 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { pipe } from 'effect';
|
|
5
6
|
import React, { useCallback, useRef } from 'react';
|
|
6
7
|
|
|
7
|
-
import {
|
|
8
|
+
import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
|
|
8
9
|
import { useClient } from '@dxos/react-client';
|
|
9
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
getSpace,
|
|
12
|
+
isReactiveObject,
|
|
13
|
+
isSpace,
|
|
14
|
+
type ReactiveObject,
|
|
15
|
+
type TypedObject,
|
|
16
|
+
useSpaces,
|
|
17
|
+
} from '@dxos/react-client/echo';
|
|
10
18
|
import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
|
|
11
19
|
|
|
12
20
|
import { CreateObjectPanel, type CreateObjectPanelProps } from './CreateObjectPanel';
|
|
13
|
-
import { SPACE_PLUGIN
|
|
14
|
-
import { CollectionType } from '../../types';
|
|
21
|
+
import { SPACE_PLUGIN } from '../../meta';
|
|
22
|
+
import { CollectionType, SpaceAction } from '../../types';
|
|
23
|
+
|
|
24
|
+
export const CREATE_OBJECT_DIALOG = `${SPACE_PLUGIN}/CreateObjectDialog`;
|
|
15
25
|
|
|
16
26
|
export type CreateObjectDialogProps = Pick<CreateObjectPanelProps, 'schemas' | 'target' | 'typename' | 'name'> & {
|
|
17
|
-
resolve?:
|
|
18
|
-
|
|
27
|
+
resolve?: (typename: string) => Record<string, any>;
|
|
28
|
+
shouldNavigate?: (object: ReactiveObject<any>) => boolean;
|
|
19
29
|
};
|
|
20
30
|
|
|
21
31
|
export const CreateObjectDialog = ({
|
|
@@ -23,28 +33,30 @@ export const CreateObjectDialog = ({
|
|
|
23
33
|
target,
|
|
24
34
|
typename,
|
|
25
35
|
name,
|
|
26
|
-
|
|
36
|
+
shouldNavigate: _shouldNavigate,
|
|
27
37
|
resolve,
|
|
28
38
|
}: CreateObjectDialogProps) => {
|
|
29
39
|
const closeRef = useRef<HTMLButtonElement | null>(null);
|
|
30
40
|
const { t } = useTranslation(SPACE_PLUGIN);
|
|
31
41
|
const client = useClient();
|
|
32
42
|
const spaces = useSpaces();
|
|
33
|
-
const dispatch = useIntentDispatcher();
|
|
43
|
+
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
34
44
|
|
|
35
45
|
const handleCreateObject = useCallback(
|
|
36
46
|
async ({
|
|
37
47
|
schema,
|
|
38
48
|
target: _target,
|
|
39
|
-
|
|
49
|
+
data,
|
|
40
50
|
}: {
|
|
41
|
-
schema:
|
|
51
|
+
schema: TypedObject;
|
|
42
52
|
target: CreateObjectPanelProps['target'];
|
|
43
|
-
|
|
53
|
+
data?: Record<string, any>;
|
|
44
54
|
}) => {
|
|
45
|
-
const target = isSpace(_target)
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
const target = isSpace(_target)
|
|
56
|
+
? (_target.properties[CollectionType.typename]?.target as CollectionType | undefined)
|
|
57
|
+
: _target;
|
|
58
|
+
const createObjectIntent = resolve?.(schema.typename)?.createObject;
|
|
59
|
+
if (!createObjectIntent || !target) {
|
|
48
60
|
// TODO(wittjosiah): UI feedback.
|
|
49
61
|
return;
|
|
50
62
|
}
|
|
@@ -53,17 +65,16 @@ export const CreateObjectDialog = ({
|
|
|
53
65
|
closeRef.current?.click();
|
|
54
66
|
|
|
55
67
|
const space = isSpace(target) ? target : getSpace(target);
|
|
56
|
-
const result = await dispatch(
|
|
57
|
-
const object = result?.
|
|
68
|
+
const result = await dispatch(createObjectIntent(data, { space }));
|
|
69
|
+
const object = result.data?.object;
|
|
58
70
|
if (isReactiveObject(object)) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
]);
|
|
71
|
+
const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object });
|
|
72
|
+
const shouldNavigate = _shouldNavigate ?? (() => true);
|
|
73
|
+
if (shouldNavigate(object)) {
|
|
74
|
+
await dispatch(pipe(addObjectIntent, chain(LayoutAction.Open, { part: 'main' })));
|
|
75
|
+
} else {
|
|
76
|
+
await dispatch(addObjectIntent);
|
|
77
|
+
}
|
|
67
78
|
}
|
|
68
79
|
},
|
|
69
80
|
[dispatch, resolve],
|
|
@@ -72,8 +83,8 @@ export const CreateObjectDialog = ({
|
|
|
72
83
|
return (
|
|
73
84
|
// TODO(wittjosiah): The tablist dialog pattern is copied from @dxos/plugin-manager.
|
|
74
85
|
// Consider factoring it out to the tabs package.
|
|
75
|
-
<Dialog.Content classNames='p-0 bs-content
|
|
76
|
-
<div role='none' className='flex justify-between pbs-
|
|
86
|
+
<Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>
|
|
87
|
+
<div role='none' className='flex justify-between pbs-2 pis-2 pie-2 @md:pbs-4 @md:pis-4 @md:pie-4'>
|
|
77
88
|
<Dialog.Title>{t('create object dialog title')}</Dialog.Title>
|
|
78
89
|
<Dialog.Close asChild>
|
|
79
90
|
<Button ref={closeRef} density='fine' variant='ghost' autoFocus>
|
|
@@ -81,18 +92,18 @@ export const CreateObjectDialog = ({
|
|
|
81
92
|
</Button>
|
|
82
93
|
</Dialog.Close>
|
|
83
94
|
</div>
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
95
|
+
|
|
96
|
+
<CreateObjectPanel
|
|
97
|
+
classNames='p-4'
|
|
98
|
+
schemas={schemas}
|
|
99
|
+
spaces={spaces}
|
|
100
|
+
target={target}
|
|
101
|
+
typename={typename}
|
|
102
|
+
name={name}
|
|
103
|
+
defaultSpaceId={client.spaces.default.id}
|
|
104
|
+
resolve={resolve}
|
|
105
|
+
onCreateObject={handleCreateObject}
|
|
106
|
+
/>
|
|
96
107
|
</Dialog.Content>
|
|
97
108
|
);
|
|
98
109
|
};
|
|
@@ -2,36 +2,60 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, { useCallback, useState } from 'react';
|
|
5
|
+
import React, { useCallback, useMemo, useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import { type
|
|
9
|
-
import { type SpaceId, type Space
|
|
10
|
-
import { Icon,
|
|
11
|
-
import { Form,
|
|
7
|
+
import { Surface, isSurfaceAvailable, usePluginManager } from '@dxos/app-framework';
|
|
8
|
+
import { type TypedObject, getObjectAnnotation, type ObjectAnnotation, S } from '@dxos/echo-schema';
|
|
9
|
+
import { type SpaceId, type Space } from '@dxos/react-client/echo';
|
|
10
|
+
import { Icon, type ThemedClassName, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
11
|
+
import { Form, type InputProps } from '@dxos/react-ui-form';
|
|
12
12
|
import { SearchList } from '@dxos/react-ui-searchlist';
|
|
13
|
+
import { mx } from '@dxos/react-ui-theme';
|
|
13
14
|
import { nonNullable, type MaybePromise } from '@dxos/util';
|
|
14
15
|
|
|
15
16
|
import { SPACE_PLUGIN } from '../../meta';
|
|
16
17
|
import { type CollectionType } from '../../types';
|
|
17
18
|
import { getSpaceDisplayName } from '../../util';
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
// TODO(ZaymonFC): Move this if you find yourself needing it elsewhere.
|
|
21
|
+
/**
|
|
22
|
+
* Creates a surface input component based on plugin context.
|
|
23
|
+
* @param baseData Additional data that will be merged with form data and passed to the surface.
|
|
24
|
+
* This allows providing more context to the surface than what's available from the form itself.
|
|
25
|
+
*/
|
|
26
|
+
const useInputSurfaceLookup = (baseData?: Record<string, any>) => {
|
|
27
|
+
const pluginManager = usePluginManager();
|
|
28
|
+
|
|
29
|
+
return useCallback(
|
|
30
|
+
({ prop, schema, inputProps }: { prop: string; schema: S.Schema<any>; inputProps: InputProps }) => {
|
|
31
|
+
const composedData = { prop, schema, ...baseData };
|
|
32
|
+
if (!isSurfaceAvailable(pluginManager.context, { role: 'form-input', data: composedData })) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return <Surface role='form-input' data={composedData} {...inputProps} />;
|
|
37
|
+
},
|
|
38
|
+
[pluginManager, baseData],
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type CreateObjectPanelProps = ThemedClassName<{
|
|
43
|
+
schemas: TypedObject[];
|
|
21
44
|
spaces: Space[];
|
|
22
45
|
typename?: string;
|
|
23
46
|
target?: Space | CollectionType;
|
|
24
47
|
name?: string;
|
|
25
48
|
defaultSpaceId?: SpaceId;
|
|
26
|
-
resolve?:
|
|
49
|
+
resolve?: (typename: string) => Record<string, any>;
|
|
27
50
|
onCreateObject?: (params: {
|
|
28
|
-
schema:
|
|
51
|
+
schema: TypedObject;
|
|
29
52
|
target: Space | CollectionType;
|
|
30
|
-
|
|
53
|
+
data: Record<string, any>;
|
|
31
54
|
}) => MaybePromise<void>;
|
|
32
|
-
}
|
|
55
|
+
}>;
|
|
33
56
|
|
|
34
57
|
export const CreateObjectPanel = ({
|
|
58
|
+
classNames,
|
|
35
59
|
schemas,
|
|
36
60
|
spaces,
|
|
37
61
|
typename: initialTypename,
|
|
@@ -45,125 +69,137 @@ export const CreateObjectPanel = ({
|
|
|
45
69
|
const [typename, setTypename] = useState<string | undefined>(initialTypename);
|
|
46
70
|
const [target, setTarget] = useState<Space | CollectionType | undefined>(initialTarget);
|
|
47
71
|
const schema = schemas.find((schema) => getObjectAnnotation(schema)?.typename === typename);
|
|
48
|
-
const options = schemas
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
72
|
+
const options: ObjectAnnotation[] = schemas
|
|
73
|
+
.map(getObjectAnnotation)
|
|
74
|
+
.filter(nonNullable)
|
|
75
|
+
.sort((a, b) => {
|
|
76
|
+
const nameA = t('typename label', { ns: a.typename, defaultValue: a.typename });
|
|
77
|
+
const nameB = t('typename label', { ns: b.typename, defaultValue: b.typename });
|
|
78
|
+
return nameA.localeCompare(nameB);
|
|
79
|
+
});
|
|
52
80
|
|
|
53
81
|
const handleCreateObject = useCallback(
|
|
54
|
-
async (
|
|
82
|
+
async (props: Record<string, any>) => {
|
|
55
83
|
if (!schema || !target) {
|
|
56
84
|
return;
|
|
57
85
|
}
|
|
58
|
-
|
|
59
|
-
await onCreateObject?.({ schema, target, name });
|
|
86
|
+
await onCreateObject?.({ schema, target, data: props });
|
|
60
87
|
},
|
|
61
88
|
[onCreateObject, schema, target],
|
|
62
89
|
);
|
|
63
90
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
91
|
+
const metadata = useMemo(() => {
|
|
92
|
+
if (!typename) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
return resolve?.(typename);
|
|
96
|
+
}, [resolve, typename]);
|
|
97
|
+
|
|
98
|
+
const inputSurfaceLookup = useInputSurfaceLookup({ target });
|
|
99
|
+
|
|
100
|
+
const form = useMemo(() => {
|
|
101
|
+
// TODO(ZaymonFC): Move this default object creation schema somewhere?
|
|
102
|
+
const schema = (metadata?.creationSchema ?? S.Struct({ name: S.optional(S.String) })) as S.Schema<any>;
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<Form
|
|
106
|
+
classNames='!p-0'
|
|
107
|
+
autoFocus
|
|
108
|
+
values={{ name: initialName }}
|
|
109
|
+
schema={schema}
|
|
110
|
+
testId='create-object-form'
|
|
111
|
+
onSave={handleCreateObject}
|
|
112
|
+
lookupComponent={inputSurfaceLookup}
|
|
113
|
+
/>
|
|
114
|
+
);
|
|
115
|
+
}, [initialName, handleCreateObject, metadata]);
|
|
116
|
+
|
|
117
|
+
// TODO(wittjosiah): These inputs should be rolled into a `Form` once it supports the necessary variants.
|
|
118
|
+
return (
|
|
119
|
+
<div role='form' className={mx('flex flex-col gap-2', classNames)}>
|
|
120
|
+
{!schema ? (
|
|
121
|
+
<SelectSchema options={options} resolve={resolve} onChange={setTypename} />
|
|
122
|
+
) : !target ? (
|
|
123
|
+
<SelectSpace spaces={spaces} defaultSpaceId={defaultSpaceId} onChange={setTarget} />
|
|
124
|
+
) : (
|
|
125
|
+
form
|
|
126
|
+
)}
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const SelectSpace = ({
|
|
132
|
+
spaces,
|
|
133
|
+
defaultSpaceId,
|
|
134
|
+
onChange,
|
|
135
|
+
}: { onChange: (space: Space) => void } & Pick<CreateObjectPanelProps, 'spaces' | 'defaultSpaceId'>) => {
|
|
136
|
+
const { t } = useTranslation(SPACE_PLUGIN);
|
|
137
|
+
|
|
138
|
+
return (
|
|
139
|
+
<SearchList.Root label={t('space input label')} classNames='flex flex-col grow overflow-hidden'>
|
|
67
140
|
<SearchList.Input
|
|
68
141
|
autoFocus
|
|
69
|
-
data-testid='create-object-form.
|
|
70
|
-
placeholder={t('
|
|
142
|
+
data-testid='create-object-form.space-input'
|
|
143
|
+
placeholder={t('space input placeholder')}
|
|
71
144
|
classNames='px-1 my-2'
|
|
72
145
|
/>
|
|
73
146
|
<SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
|
|
74
|
-
{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
<
|
|
82
|
-
|
|
83
|
-
{
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
147
|
+
{spaces
|
|
148
|
+
.sort((a, b) => {
|
|
149
|
+
const aName = toLocalizedString(getSpaceDisplayName(a, { personal: a.id === defaultSpaceId }), t);
|
|
150
|
+
const bName = toLocalizedString(getSpaceDisplayName(b, { personal: b.id === defaultSpaceId }), t);
|
|
151
|
+
return aName.localeCompare(bName);
|
|
152
|
+
})
|
|
153
|
+
.map((space) => (
|
|
154
|
+
<SearchList.Item
|
|
155
|
+
key={space.id}
|
|
156
|
+
value={toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
|
|
157
|
+
onSelect={() => onChange(space)}
|
|
158
|
+
classNames='flex items-center gap-2'
|
|
159
|
+
>
|
|
160
|
+
<span className='grow truncate'>
|
|
161
|
+
{toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
|
|
162
|
+
</span>
|
|
163
|
+
</SearchList.Item>
|
|
164
|
+
))}
|
|
87
165
|
</SearchList.Content>
|
|
88
166
|
</SearchList.Root>
|
|
89
167
|
);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const SelectSchema = ({
|
|
171
|
+
options,
|
|
172
|
+
resolve,
|
|
173
|
+
onChange,
|
|
174
|
+
}: {
|
|
175
|
+
options: ObjectAnnotation[];
|
|
176
|
+
onChange: (type: string) => void;
|
|
177
|
+
} & Pick<CreateObjectPanelProps, 'resolve'>) => {
|
|
178
|
+
const { t } = useTranslation(SPACE_PLUGIN);
|
|
90
179
|
|
|
91
|
-
|
|
92
|
-
<SearchList.Root label={t('
|
|
180
|
+
return (
|
|
181
|
+
<SearchList.Root label={t('schema input label')} classNames='flex flex-col grow overflow-hidden'>
|
|
93
182
|
<SearchList.Input
|
|
94
183
|
autoFocus
|
|
95
|
-
data-testid='create-object-form.
|
|
96
|
-
placeholder={t('
|
|
184
|
+
data-testid='create-object-form.schema-input'
|
|
185
|
+
placeholder={t('schema input placeholder')}
|
|
97
186
|
classNames='px-1 my-2'
|
|
98
187
|
/>
|
|
99
188
|
<SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
|
|
100
|
-
{
|
|
189
|
+
{options.map((option) => (
|
|
101
190
|
<SearchList.Item
|
|
102
|
-
key={
|
|
103
|
-
value={
|
|
104
|
-
onSelect={() =>
|
|
191
|
+
key={option.typename}
|
|
192
|
+
value={t('typename label', { ns: option.typename, defaultValue: option.typename })}
|
|
193
|
+
onSelect={() => onChange(option.typename)}
|
|
105
194
|
classNames='flex items-center gap-2'
|
|
106
195
|
>
|
|
107
|
-
<span className='grow truncate'>
|
|
108
|
-
{
|
|
196
|
+
<span className='flex gap-2 items-center grow truncate'>
|
|
197
|
+
<Icon icon={resolve?.(option.typename).icon ?? 'ph--placeholder--regular'} size={5} />
|
|
198
|
+
{t('typename label', { ns: option.typename, defaultValue: option.typename })}
|
|
109
199
|
</span>
|
|
110
200
|
</SearchList.Item>
|
|
111
201
|
))}
|
|
112
202
|
</SearchList.Content>
|
|
113
203
|
</SearchList.Root>
|
|
114
204
|
);
|
|
115
|
-
|
|
116
|
-
const form = (
|
|
117
|
-
<Form
|
|
118
|
-
autoFocus
|
|
119
|
-
values={{ name: initialName }}
|
|
120
|
-
schema={S.Struct({ name: S.optional(S.String) })}
|
|
121
|
-
testId='create-object-form'
|
|
122
|
-
onSave={handleCreateObject}
|
|
123
|
-
/>
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
return (
|
|
127
|
-
<div role='form' className='flex flex-col gap-2'>
|
|
128
|
-
{target && (
|
|
129
|
-
<div role='none' className='px-2'>
|
|
130
|
-
<Input.Root>
|
|
131
|
-
<InputHeader>
|
|
132
|
-
<Input.Label>
|
|
133
|
-
{t(isSpace(target) ? 'creating in space label' : 'creating in collection label')}
|
|
134
|
-
</Input.Label>
|
|
135
|
-
</InputHeader>
|
|
136
|
-
<div role='none' className='flex gap-2'>
|
|
137
|
-
<Input.TextInput
|
|
138
|
-
disabled
|
|
139
|
-
value={
|
|
140
|
-
isSpace(target)
|
|
141
|
-
? toLocalizedString(getSpaceDisplayName(target, { personal: target.id === defaultSpaceId }), t)
|
|
142
|
-
: target.name || t('unnamed collection label')
|
|
143
|
-
}
|
|
144
|
-
/>
|
|
145
|
-
<IconButton iconOnly icon='ph--x--regular' label={t('clear input label')} onClick={handleClearTarget} />
|
|
146
|
-
</div>
|
|
147
|
-
</Input.Root>
|
|
148
|
-
</div>
|
|
149
|
-
)}
|
|
150
|
-
{schema && (
|
|
151
|
-
<div role='none' className='px-2'>
|
|
152
|
-
<Input.Root>
|
|
153
|
-
<InputHeader>
|
|
154
|
-
<Input.Label>{t('creating object type label')}</Input.Label>
|
|
155
|
-
</InputHeader>
|
|
156
|
-
<div role='none' className='flex gap-2'>
|
|
157
|
-
<Input.TextInput
|
|
158
|
-
disabled
|
|
159
|
-
value={t('typename label', { ns: schema.typename, defaultValue: schema.typename })}
|
|
160
|
-
/>
|
|
161
|
-
<IconButton iconOnly icon='ph--x--regular' label={t('clear input label')} onClick={handleClearSchema} />
|
|
162
|
-
</div>
|
|
163
|
-
</Input.Root>
|
|
164
|
-
</div>
|
|
165
|
-
)}
|
|
166
|
-
{!schema ? schemaInput : !target ? spaceInput : form}
|
|
167
|
-
</div>
|
|
168
|
-
);
|
|
169
205
|
};
|
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { Effect } from 'effect';
|
|
5
6
|
import React, { useCallback, useRef } from 'react';
|
|
6
7
|
|
|
7
|
-
import { useIntentDispatcher } from '@dxos/app-framework';
|
|
8
|
+
import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
|
|
8
9
|
import { type S } from '@dxos/echo-schema';
|
|
9
10
|
import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
|
|
10
11
|
import { Form } from '@dxos/react-ui-form';
|
|
11
12
|
|
|
12
|
-
import { SPACE_PLUGIN
|
|
13
|
-
import { SpaceForm } from '../../types';
|
|
13
|
+
import { SPACE_PLUGIN } from '../../meta';
|
|
14
|
+
import { SpaceAction, SpaceForm } from '../../types';
|
|
15
|
+
|
|
16
|
+
export const CREATE_SPACE_DIALOG = `${SPACE_PLUGIN}/CreateSpaceDialog`;
|
|
14
17
|
|
|
15
18
|
type FormValues = S.Schema.Type<typeof SpaceForm>;
|
|
16
19
|
const initialValues: FormValues = { edgeReplication: true };
|
|
@@ -18,21 +21,16 @@ const initialValues: FormValues = { edgeReplication: true };
|
|
|
18
21
|
export const CreateSpaceDialog = () => {
|
|
19
22
|
const closeRef = useRef<HTMLButtonElement | null>(null);
|
|
20
23
|
const { t } = useTranslation(SPACE_PLUGIN);
|
|
21
|
-
const dispatch = useIntentDispatcher();
|
|
24
|
+
const { dispatch } = useIntentDispatcher();
|
|
22
25
|
|
|
23
26
|
const handleCreateSpace = useCallback(
|
|
24
27
|
async (data: FormValues) => {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
const program = Effect.gen(function* () {
|
|
29
|
+
const { space } = yield* dispatch(createIntent(SpaceAction.Create, data));
|
|
30
|
+
yield* dispatch(createIntent(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: space.id }));
|
|
31
|
+
yield* dispatch(createIntent(SpaceAction.OpenCreateObject, { target: space }));
|
|
28
32
|
});
|
|
29
|
-
|
|
30
|
-
if (target) {
|
|
31
|
-
await dispatch({
|
|
32
|
-
action: SpaceAction.OPEN_CREATE_OBJECT,
|
|
33
|
-
data: { target },
|
|
34
|
-
});
|
|
35
|
-
}
|
|
33
|
+
await Effect.runPromise(program);
|
|
36
34
|
},
|
|
37
35
|
[dispatch],
|
|
38
36
|
);
|
|
@@ -40,8 +38,8 @@ export const CreateSpaceDialog = () => {
|
|
|
40
38
|
return (
|
|
41
39
|
// TODO(wittjosiah): The tablist dialog pattern is copied from @dxos/plugin-manager.
|
|
42
40
|
// Consider factoring it out to the tabs package.
|
|
43
|
-
<Dialog.Content classNames='p-0 bs-content min-bs-[
|
|
44
|
-
<div role='none' className='flex justify-between pbs-
|
|
41
|
+
<Dialog.Content classNames='p-0 bs-content min-bs-[16rem] max-bs-full md:max-is-[32rem] overflow-hidden'>
|
|
42
|
+
<div role='none' className='flex justify-between pbs-2 pis-2 pie-2 @md:pbs-4 @md:pis-4 @md:pie-4'>
|
|
45
43
|
<Dialog.Title>{t('create space dialog title')}</Dialog.Title>
|
|
46
44
|
<Dialog.Close asChild>
|
|
47
45
|
<Button ref={closeRef} density='fine' variant='ghost' autoFocus>
|
|
@@ -50,7 +48,14 @@ export const CreateSpaceDialog = () => {
|
|
|
50
48
|
</Dialog.Close>
|
|
51
49
|
</div>
|
|
52
50
|
<div className='p-4'>
|
|
53
|
-
<Form
|
|
51
|
+
<Form
|
|
52
|
+
testId='create-space-form'
|
|
53
|
+
classNames='!p-0'
|
|
54
|
+
autoFocus
|
|
55
|
+
values={initialValues}
|
|
56
|
+
schema={SpaceForm}
|
|
57
|
+
onSave={handleCreateSpace}
|
|
58
|
+
/>
|
|
54
59
|
</div>
|
|
55
60
|
</Dialog.Content>
|
|
56
61
|
);
|