@dxos/plugin-space 0.7.5-labs.e27f9b9 → 0.7.5-main.2567c87
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 → app-graph-builder-F6XSETHX.mjs} +8 -10
- package/dist/lib/browser/app-graph-builder-F6XSETHX.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-ZGM5NDXE.mjs → app-graph-serializer-FYJE23GN.mjs} +5 -5
- package/dist/lib/browser/{chunk-S5IGZNXJ.mjs → chunk-IZ7QKQ2E.mjs} +9 -14
- package/dist/lib/browser/chunk-IZ7QKQ2E.mjs.map +7 -0
- package/dist/lib/browser/{chunk-PQXZCNAU.mjs → chunk-SOXNANA6.mjs} +2 -3
- package/dist/lib/browser/{chunk-PQXZCNAU.mjs.map → chunk-SOXNANA6.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-H2AR4OLP.mjs → chunk-SSJ772GK.mjs} +5 -9
- package/dist/lib/browser/chunk-SSJ772GK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ENRYFGYE.mjs → chunk-T36CIHPG.mjs} +3 -3
- package/dist/lib/browser/{chunk-RLZQJD47.mjs → chunk-UH5P4UL3.mjs} +2 -3
- package/dist/lib/browser/chunk-UH5P4UL3.mjs.map +7 -0
- package/dist/lib/browser/{chunk-YB3JWCPY.mjs → chunk-XXD33C4E.mjs} +250 -291
- package/dist/lib/browser/chunk-XXD33C4E.mjs.map +7 -0
- package/dist/lib/browser/{identity-created-VICTPQX7.mjs → identity-created-4Q4PFIC5.mjs} +3 -3
- package/dist/lib/browser/index.mjs +13 -14
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/intent-resolver-XRZYCXXX.mjs +459 -0
- package/dist/lib/browser/intent-resolver-XRZYCXXX.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-root-YUF4IL5W.mjs → react-root-BDOPFJGJ.mjs} +6 -6
- package/dist/lib/browser/{react-surface-YIPKS26R.mjs → react-surface-EGOL2JBL.mjs} +33 -26
- package/dist/lib/browser/react-surface-EGOL2JBL.mjs.map +7 -0
- package/dist/lib/browser/{settings-HN5UIYQO.mjs → settings-WF67QZSD.mjs} +3 -3
- package/dist/lib/browser/{spaces-ready-F57ITJDR.mjs → spaces-ready-WVU7US3C.mjs} +32 -31
- package/dist/lib/browser/spaces-ready-WVU7US3C.mjs.map +7 -0
- package/dist/lib/browser/{state-6DCY5YJP.mjs → state-MS4KYJWI.mjs} +3 -3
- package/dist/lib/browser/types/index.mjs +2 -4
- package/dist/lib/node/{app-graph-builder-6N4TEVHH.cjs → app-graph-builder-GKLVZ4PM.cjs} +56 -58
- package/dist/lib/node/app-graph-builder-GKLVZ4PM.cjs.map +7 -0
- package/dist/lib/node/{app-graph-serializer-AWKVTYAB.cjs → app-graph-serializer-RMTU5YSC.cjs} +21 -21
- package/dist/lib/node/{chunk-UX3U4RU2.cjs → chunk-56NGXG2A.cjs} +8 -9
- package/dist/lib/node/chunk-56NGXG2A.cjs.map +7 -0
- package/dist/lib/node/{chunk-MMXP2NHE.cjs → chunk-5D4RWKTV.cjs} +60 -65
- package/dist/lib/node/chunk-5D4RWKTV.cjs.map +7 -0
- package/dist/lib/node/{chunk-HFBC3X66.cjs → chunk-AJRP7AD6.cjs} +251 -292
- package/dist/lib/node/chunk-AJRP7AD6.cjs.map +7 -0
- package/dist/lib/node/{chunk-WZR6OAN3.cjs → chunk-AO4EW2RX.cjs} +5 -6
- package/dist/lib/node/{chunk-WZR6OAN3.cjs.map → chunk-AO4EW2RX.cjs.map} +3 -3
- package/dist/lib/node/{chunk-I2LRRRMV.cjs → chunk-UENH2YBM.cjs} +8 -8
- package/dist/lib/node/{chunk-SPCSJ2CY.cjs → chunk-YCBBGTFD.cjs} +9 -14
- package/dist/lib/node/chunk-YCBBGTFD.cjs.map +7 -0
- package/dist/lib/node/{identity-created-JNDKMFKI.cjs → identity-created-QQWX7WX3.cjs} +7 -7
- package/dist/lib/node/index.cjs +92 -93
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/intent-resolver-3NI6AUAI.cjs +458 -0
- package/dist/lib/node/intent-resolver-3NI6AUAI.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-root-2WARZU2P.cjs → react-root-ZTR2J2I3.cjs} +12 -12
- package/dist/lib/node/{react-surface-QUY7D43M.cjs → react-surface-75KRPQYT.cjs} +76 -72
- package/dist/lib/node/react-surface-75KRPQYT.cjs.map +7 -0
- package/dist/lib/node/{settings-RBBL22DJ.cjs → settings-KOVSPA3S.cjs} +8 -8
- package/dist/lib/node/{spaces-ready-WHU4J6E5.cjs → spaces-ready-ILVGUHJH.cjs} +40 -39
- package/dist/lib/node/spaces-ready-ILVGUHJH.cjs.map +7 -0
- package/dist/lib/node/{state-WPZC4JXB.cjs → state-4UIOUKLJ.cjs} +8 -8
- package/dist/lib/node/types/index.cjs +16 -18
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/{app-graph-builder-MS6BI5EW.mjs → app-graph-builder-NEHQ5Z63.mjs} +8 -10
- package/dist/lib/node-esm/app-graph-builder-NEHQ5Z63.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-AWAWDSCM.mjs → app-graph-serializer-UWWS5OVC.mjs} +5 -5
- package/dist/lib/node-esm/{chunk-LGL4A5B5.mjs → chunk-375RB3CZ.mjs} +2 -3
- package/dist/lib/node-esm/chunk-375RB3CZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-77RE7Y5J.mjs → chunk-5QMAPAZD.mjs} +9 -14
- package/dist/lib/node-esm/chunk-5QMAPAZD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ICCM4YRJ.mjs → chunk-7FUVU45N.mjs} +2 -3
- package/dist/lib/node-esm/{chunk-ICCM4YRJ.mjs.map → chunk-7FUVU45N.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-ESWV7ICX.mjs → chunk-E5DWIQ3N.mjs} +3 -3
- package/dist/lib/node-esm/{chunk-TIFAXTJ5.mjs → chunk-GVOPDPS2.mjs} +250 -291
- package/dist/lib/node-esm/chunk-GVOPDPS2.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-S6VAU6VJ.mjs → chunk-HTBGWQEU.mjs} +5 -9
- package/dist/lib/node-esm/chunk-HTBGWQEU.mjs.map +7 -0
- package/dist/lib/node-esm/{identity-created-3AUSSVEK.mjs → identity-created-HMNY2MPB.mjs} +3 -3
- package/dist/lib/node-esm/index.mjs +13 -14
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/intent-resolver-P5EVBOGP.mjs +460 -0
- package/dist/lib/node-esm/intent-resolver-P5EVBOGP.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-root-R3FZKA2B.mjs → react-root-OUPJA4RY.mjs} +6 -6
- package/dist/lib/node-esm/{react-surface-RH57RBYI.mjs → react-surface-7EVWCKIP.mjs} +33 -26
- package/dist/lib/node-esm/react-surface-7EVWCKIP.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-VBAUB37B.mjs → settings-EDK6WI3V.mjs} +3 -3
- package/dist/lib/node-esm/{spaces-ready-ABADUX2P.mjs → spaces-ready-CH3W7OGN.mjs} +32 -31
- package/dist/lib/node-esm/spaces-ready-CH3W7OGN.mjs.map +7 -0
- package/dist/lib/node-esm/{state-5GH2D5U4.mjs → state-BMISGQ2O.mjs} +3 -3
- package/dist/lib/node-esm/types/index.mjs +2 -4
- package/dist/types/src/SpacePlugin.d.ts +1 -5
- package/dist/types/src/SpacePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +22 -22
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +0 -6
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +33 -34
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -2
- 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/spaces-ready.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +3 -4
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
- package/dist/types/src/components/CreateDialog/CreateSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/components/SpacePresence.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsDialog.d.ts.map +1 -1
- package/dist/types/src/components/SpaceSettings/SpaceSettingsPanel.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/SyncStatus.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +0 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +2 -5
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts.map +1 -1
- package/package.json +38 -39
- package/src/SpacePlugin.tsx +6 -11
- package/src/capabilities/app-graph-builder.ts +3 -4
- package/src/capabilities/capabilities.ts +1 -4
- package/src/capabilities/intent-resolver.ts +312 -410
- package/src/capabilities/react-surface.tsx +30 -22
- package/src/capabilities/spaces-ready.ts +21 -20
- package/src/components/AwaitingObject.tsx +5 -5
- package/src/components/CreateDialog/CreateObjectDialog.tsx +15 -15
- package/src/components/CreateDialog/CreateObjectPanel.tsx +114 -114
- package/src/components/CreateDialog/CreateSpaceDialog.tsx +8 -10
- package/src/components/JoinDialog.tsx +19 -27
- package/src/components/SpacePluginSettings.tsx +3 -3
- package/src/components/SpacePresence.stories.tsx +2 -2
- package/src/components/SpacePresence.tsx +3 -2
- package/src/components/SpaceSettings/SpaceSettingsDialog.tsx +1 -16
- package/src/components/SpaceSettings/SpaceSettingsPanel.tsx +4 -3
- package/src/components/SyncStatus/InlineSyncStatus.tsx +2 -2
- package/src/components/SyncStatus/SyncStatus.tsx +1 -2
- package/src/meta.ts +0 -1
- package/src/types/types.ts +3 -7
- package/src/util.tsx +4 -8
- package/dist/lib/browser/app-graph-builder-TTM2YZVS.mjs.map +0 -7
- package/dist/lib/browser/chunk-H2AR4OLP.mjs.map +0 -7
- package/dist/lib/browser/chunk-RLZQJD47.mjs.map +0 -7
- package/dist/lib/browser/chunk-S5IGZNXJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-YB3JWCPY.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-SYYO26PR.mjs +0 -537
- package/dist/lib/browser/intent-resolver-SYYO26PR.mjs.map +0 -7
- package/dist/lib/browser/react-surface-YIPKS26R.mjs.map +0 -7
- package/dist/lib/browser/spaces-ready-F57ITJDR.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-6N4TEVHH.cjs.map +0 -7
- package/dist/lib/node/chunk-HFBC3X66.cjs.map +0 -7
- package/dist/lib/node/chunk-MMXP2NHE.cjs.map +0 -7
- package/dist/lib/node/chunk-SPCSJ2CY.cjs.map +0 -7
- package/dist/lib/node/chunk-UX3U4RU2.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-2MFJV5A7.cjs +0 -536
- package/dist/lib/node/intent-resolver-2MFJV5A7.cjs.map +0 -7
- package/dist/lib/node/react-surface-QUY7D43M.cjs.map +0 -7
- package/dist/lib/node/spaces-ready-WHU4J6E5.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-MS6BI5EW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-77RE7Y5J.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LGL4A5B5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-S6VAU6VJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-TIFAXTJ5.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-UKXKZN2V.mjs +0 -538
- package/dist/lib/node-esm/intent-resolver-UKXKZN2V.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-RH57RBYI.mjs.map +0 -7
- package/dist/lib/node-esm/spaces-ready-ABADUX2P.mjs.map +0 -7
- /package/dist/lib/browser/{app-graph-serializer-ZGM5NDXE.mjs.map → app-graph-serializer-FYJE23GN.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-ENRYFGYE.mjs.map → chunk-T36CIHPG.mjs.map} +0 -0
- /package/dist/lib/browser/{identity-created-VICTPQX7.mjs.map → identity-created-4Q4PFIC5.mjs.map} +0 -0
- /package/dist/lib/browser/{react-root-YUF4IL5W.mjs.map → react-root-BDOPFJGJ.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-HN5UIYQO.mjs.map → settings-WF67QZSD.mjs.map} +0 -0
- /package/dist/lib/browser/{state-6DCY5YJP.mjs.map → state-MS4KYJWI.mjs.map} +0 -0
- /package/dist/lib/node/{app-graph-serializer-AWKVTYAB.cjs.map → app-graph-serializer-RMTU5YSC.cjs.map} +0 -0
- /package/dist/lib/node/{chunk-I2LRRRMV.cjs.map → chunk-UENH2YBM.cjs.map} +0 -0
- /package/dist/lib/node/{identity-created-JNDKMFKI.cjs.map → identity-created-QQWX7WX3.cjs.map} +0 -0
- /package/dist/lib/node/{react-root-2WARZU2P.cjs.map → react-root-ZTR2J2I3.cjs.map} +0 -0
- /package/dist/lib/node/{settings-RBBL22DJ.cjs.map → settings-KOVSPA3S.cjs.map} +0 -0
- /package/dist/lib/node/{state-WPZC4JXB.cjs.map → state-4UIOUKLJ.cjs.map} +0 -0
- /package/dist/lib/node-esm/{app-graph-serializer-AWAWDSCM.mjs.map → app-graph-serializer-UWWS5OVC.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-ESWV7ICX.mjs.map → chunk-E5DWIQ3N.mjs.map} +0 -0
- /package/dist/lib/node-esm/{identity-created-3AUSSVEK.mjs.map → identity-created-HMNY2MPB.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-root-R3FZKA2B.mjs.map → react-root-OUPJA4RY.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-VBAUB37B.mjs.map → settings-EDK6WI3V.mjs.map} +0 -0
- /package/dist/lib/node-esm/{state-5GH2D5U4.mjs.map → state-BMISGQ2O.mjs.map} +0 -0
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
useCapabilities,
|
|
14
14
|
usePluginManager,
|
|
15
15
|
} from '@dxos/app-framework';
|
|
16
|
-
import { SettingsStore } from '@dxos/local-storage';
|
|
17
16
|
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
18
17
|
import {
|
|
19
18
|
getSpace,
|
|
@@ -44,6 +43,7 @@ import {
|
|
|
44
43
|
POPOVER_RENAME_SPACE,
|
|
45
44
|
PopoverRenameObject,
|
|
46
45
|
PopoverRenameSpace,
|
|
46
|
+
ShareSpaceButton,
|
|
47
47
|
SmallPresenceLive,
|
|
48
48
|
SPACE_SETTINGS_DIALOG,
|
|
49
49
|
SpacePluginSettings,
|
|
@@ -56,6 +56,7 @@ import {
|
|
|
56
56
|
} from '../components';
|
|
57
57
|
import { SPACE_PLUGIN } from '../meta';
|
|
58
58
|
import { CollectionType, type SpaceSettingsProps } from '../types';
|
|
59
|
+
import { COMPOSER_SPACE_LOCK } from '../util';
|
|
59
60
|
|
|
60
61
|
type ReactSurfaceOptions = {
|
|
61
62
|
createInvitationUrl: (invitationCode: string) => string;
|
|
@@ -80,7 +81,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
80
81
|
createSurface({
|
|
81
82
|
id: `${SPACE_PLUGIN}/collection-fallback`,
|
|
82
83
|
role: 'article',
|
|
83
|
-
|
|
84
|
+
disposition: 'fallback',
|
|
84
85
|
filter: (data): data is { subject: CollectionType } => data.subject instanceof CollectionType,
|
|
85
86
|
component: ({ data }) => <CollectionMain collection={data.subject} />,
|
|
86
87
|
}),
|
|
@@ -94,28 +95,28 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
94
95
|
createSurface({
|
|
95
96
|
id: `${SPACE_PLUGIN}/object-settings-base-panel`,
|
|
96
97
|
role: 'complementary--settings',
|
|
97
|
-
|
|
98
|
+
disposition: 'hoist',
|
|
98
99
|
filter: (data): data is { subject: ReactiveEchoObject<any> } => isEchoObject(data.subject),
|
|
99
100
|
component: ({ data }) => <BaseObjectSettings object={data.subject} />,
|
|
100
101
|
}),
|
|
101
102
|
createSurface({
|
|
102
103
|
id: `${SPACE_PLUGIN}/object-settings-advanced-panel`,
|
|
103
104
|
role: 'complementary--settings',
|
|
104
|
-
|
|
105
|
+
disposition: 'fallback',
|
|
105
106
|
filter: (data): data is { subject: ReactiveEchoObject<any> } => isEchoObject(data.subject),
|
|
106
107
|
component: ({ data }) => <AdvancedObjectSettings object={data.subject} />,
|
|
107
108
|
}),
|
|
108
109
|
createSurface({
|
|
109
110
|
id: SPACE_SETTINGS_DIALOG,
|
|
110
111
|
role: 'dialog',
|
|
111
|
-
filter: (data): data is {
|
|
112
|
-
component: ({ data }) => <SpaceSettingsDialog {...data.
|
|
112
|
+
filter: (data): data is { subject: SpaceSettingsDialogProps } => data.component === SPACE_SETTINGS_DIALOG,
|
|
113
|
+
component: ({ data }) => <SpaceSettingsDialog {...data.subject} createInvitationUrl={createInvitationUrl} />,
|
|
113
114
|
}),
|
|
114
115
|
createSurface({
|
|
115
116
|
id: JOIN_DIALOG,
|
|
116
117
|
role: 'dialog',
|
|
117
|
-
filter: (data): data is {
|
|
118
|
-
component: ({ data }) => <JoinDialog {...data.
|
|
118
|
+
filter: (data): data is { subject: JoinPanelProps } => data.component === JOIN_DIALOG,
|
|
119
|
+
component: ({ data }) => <JoinDialog {...data.subject} />,
|
|
119
120
|
}),
|
|
120
121
|
createSurface({
|
|
121
122
|
id: CREATE_SPACE_DIALOG,
|
|
@@ -126,7 +127,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
126
127
|
createSurface({
|
|
127
128
|
id: CREATE_OBJECT_DIALOG,
|
|
128
129
|
role: 'dialog',
|
|
129
|
-
filter: (data): data is {
|
|
130
|
+
filter: (data): data is { subject: Partial<CreateObjectDialogProps> } => data.component === CREATE_OBJECT_DIALOG,
|
|
130
131
|
component: ({ data }) => {
|
|
131
132
|
const schemas = useCapabilities(ClientCapabilities.Schema).flat();
|
|
132
133
|
const manager = usePluginManager();
|
|
@@ -141,21 +142,21 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
141
142
|
[manager],
|
|
142
143
|
);
|
|
143
144
|
|
|
144
|
-
return <CreateObjectDialog schemas={schemas} resolve={resolve} {...data.
|
|
145
|
+
return <CreateObjectDialog schemas={schemas} resolve={resolve} {...data.subject} />;
|
|
145
146
|
},
|
|
146
147
|
}),
|
|
147
148
|
createSurface({
|
|
148
149
|
id: POPOVER_RENAME_SPACE,
|
|
149
150
|
role: 'popover',
|
|
150
|
-
filter: (data): data is {
|
|
151
|
-
component: ({ data }) => <PopoverRenameSpace space={data.
|
|
151
|
+
filter: (data): data is { subject: Space } => data.component === POPOVER_RENAME_SPACE && isSpace(data.subject),
|
|
152
|
+
component: ({ data }) => <PopoverRenameSpace space={data.subject} />,
|
|
152
153
|
}),
|
|
153
154
|
createSurface({
|
|
154
155
|
id: POPOVER_RENAME_OBJECT,
|
|
155
156
|
role: 'popover',
|
|
156
|
-
filter: (data): data is {
|
|
157
|
-
data.component === POPOVER_RENAME_OBJECT && isReactiveObject(data.
|
|
158
|
-
component: ({ data }) => <PopoverRenameObject object={data.
|
|
157
|
+
filter: (data): data is { subject: ReactiveEchoObject<any> } =>
|
|
158
|
+
data.component === POPOVER_RENAME_OBJECT && isReactiveObject(data.subject),
|
|
159
|
+
component: ({ data }) => <PopoverRenameObject object={data.subject} />,
|
|
159
160
|
}),
|
|
160
161
|
createSurface({
|
|
161
162
|
id: `${SPACE_PLUGIN}/navtree-presence`,
|
|
@@ -172,7 +173,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
172
173
|
// TODO(wittjosiah): Attention glyph for non-echo items should be handled elsewhere.
|
|
173
174
|
id: `${SPACE_PLUGIN}/navtree-presence-fallback`,
|
|
174
175
|
role: 'navtree-item-end',
|
|
175
|
-
|
|
176
|
+
disposition: 'fallback',
|
|
176
177
|
filter: (data): data is { id: string; open?: boolean } => typeof data.id === 'string',
|
|
177
178
|
component: ({ data }) => <SmallPresenceLive id={data.id} open={data.open} />,
|
|
178
179
|
}),
|
|
@@ -185,7 +186,7 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
185
186
|
createSurface({
|
|
186
187
|
id: `${SPACE_PLUGIN}/navbar-presence`,
|
|
187
188
|
role: 'navbar-end',
|
|
188
|
-
|
|
189
|
+
disposition: 'hoist',
|
|
189
190
|
filter: (data): data is { subject: Space | ReactiveEchoObject<any> } =>
|
|
190
191
|
isSpace(data.subject) || isEchoObject(data.subject),
|
|
191
192
|
component: ({ data }) => {
|
|
@@ -196,7 +197,12 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
196
197
|
: undefined
|
|
197
198
|
: data.subject;
|
|
198
199
|
|
|
199
|
-
return
|
|
200
|
+
return space && object ? (
|
|
201
|
+
<>
|
|
202
|
+
<SpacePresence object={object} />
|
|
203
|
+
{space.properties[COMPOSER_SPACE_LOCK] ? null : <ShareSpaceButton space={space} />}
|
|
204
|
+
</>
|
|
205
|
+
) : null;
|
|
200
206
|
},
|
|
201
207
|
}),
|
|
202
208
|
createSurface({
|
|
@@ -207,10 +213,12 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
|
|
|
207
213
|
}),
|
|
208
214
|
createSurface({
|
|
209
215
|
id: `${SPACE_PLUGIN}/settings`,
|
|
210
|
-
role: '
|
|
211
|
-
filter: (data): data is
|
|
212
|
-
|
|
213
|
-
|
|
216
|
+
role: 'settings',
|
|
217
|
+
filter: (data): data is any => data.subject === SPACE_PLUGIN,
|
|
218
|
+
component: () => {
|
|
219
|
+
const settings = useCapability(Capabilities.SettingsStore).getStore<SpaceSettingsProps>(SPACE_PLUGIN)!.value;
|
|
220
|
+
return <SpacePluginSettings settings={settings} />;
|
|
221
|
+
},
|
|
214
222
|
}),
|
|
215
223
|
createSurface({
|
|
216
224
|
id: `${SPACE_PLUGIN}/menu-footer`,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { contributes, createIntent, type PluginsContext, Capabilities
|
|
5
|
+
import { contributes, createIntent, openIds, type PluginsContext, Capabilities } from '@dxos/app-framework';
|
|
6
6
|
import { EventSubscriptions } from '@dxos/async';
|
|
7
7
|
import { Expando } from '@dxos/echo-schema';
|
|
8
8
|
import { scheduledEffect } from '@dxos/echo-signals/core';
|
|
@@ -10,7 +10,6 @@ import { create } from '@dxos/live-object';
|
|
|
10
10
|
import { log } from '@dxos/log';
|
|
11
11
|
import { AttentionCapabilities } from '@dxos/plugin-attention';
|
|
12
12
|
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
13
|
-
import { DeckCapabilities } from '@dxos/plugin-deck';
|
|
14
13
|
import { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';
|
|
15
14
|
import { PublicKey } from '@dxos/react-client';
|
|
16
15
|
import { Filter, FQ_ID_LENGTH, parseFullyQualifiedId, SpaceState } from '@dxos/react-client/echo';
|
|
@@ -30,7 +29,7 @@ export default async (context: PluginsContext) => {
|
|
|
30
29
|
const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
|
|
31
30
|
const { graph } = context.requestCapability(Capabilities.AppGraph);
|
|
32
31
|
const layout = context.requestCapability(Capabilities.Layout);
|
|
33
|
-
const
|
|
32
|
+
const location = context.requestCapability(Capabilities.Location);
|
|
34
33
|
const attention = context.requestCapability(AttentionCapabilities.Attention);
|
|
35
34
|
const state = context.requestCapability(SpaceCapabilities.MutableState);
|
|
36
35
|
const client = context.requestCapability(ClientCapabilities.Client);
|
|
@@ -38,10 +37,6 @@ export default async (context: PluginsContext) => {
|
|
|
38
37
|
const defaultSpace = client.spaces.default;
|
|
39
38
|
await defaultSpace.waitUntilReady();
|
|
40
39
|
|
|
41
|
-
if (deck.activeDeck === 'default') {
|
|
42
|
-
await dispatch(createIntent(LayoutAction.SwitchWorkspace, { part: 'workspace', subject: defaultSpace.id }));
|
|
43
|
-
}
|
|
44
|
-
|
|
45
40
|
// Initialize space sharing lock in default space.
|
|
46
41
|
if (typeof defaultSpace.properties[COMPOSER_SPACE_LOCK] !== 'boolean') {
|
|
47
42
|
defaultSpace.properties[COMPOSER_SPACE_LOCK] = true;
|
|
@@ -59,18 +54,21 @@ export default async (context: PluginsContext) => {
|
|
|
59
54
|
// Await missing objects.
|
|
60
55
|
subscriptions.add(
|
|
61
56
|
scheduledEffect(
|
|
62
|
-
() => ({
|
|
63
|
-
|
|
64
|
-
|
|
57
|
+
() => ({
|
|
58
|
+
layoutMode: layout.layoutMode,
|
|
59
|
+
soloPart: location.active.solo?.[0],
|
|
60
|
+
}),
|
|
61
|
+
({ layoutMode, soloPart }) => {
|
|
62
|
+
if (layoutMode !== 'solo' || !soloPart) {
|
|
65
63
|
return;
|
|
66
64
|
}
|
|
67
65
|
|
|
68
|
-
const node = graph.findNode(
|
|
69
|
-
if (!node &&
|
|
66
|
+
const node = graph.findNode(soloPart.id);
|
|
67
|
+
if (!node && soloPart.id.length === FQ_ID_LENGTH) {
|
|
70
68
|
const timeout = setTimeout(async () => {
|
|
71
|
-
const node = graph.findNode(
|
|
69
|
+
const node = graph.findNode(soloPart.id);
|
|
72
70
|
if (!node) {
|
|
73
|
-
await dispatch(createIntent(SpaceAction.WaitForObject, { id:
|
|
71
|
+
await dispatch(createIntent(SpaceAction.WaitForObject, { id: soloPart.id }));
|
|
74
72
|
}
|
|
75
73
|
}, WAIT_FOR_OBJECT_TIMEOUT);
|
|
76
74
|
|
|
@@ -104,14 +102,17 @@ export default async (context: PluginsContext) => {
|
|
|
104
102
|
// Broadcast active node to other peers in the space.
|
|
105
103
|
subscriptions.add(
|
|
106
104
|
scheduledEffect(
|
|
107
|
-
() => ({
|
|
108
|
-
|
|
105
|
+
() => ({
|
|
106
|
+
open: openIds(location.active, layout.layoutMode === 'solo' ? ['solo'] : ['main']),
|
|
107
|
+
closed: [...location.closed],
|
|
108
|
+
}),
|
|
109
|
+
({ open, closed }) => {
|
|
109
110
|
const send = () => {
|
|
110
111
|
const spaces = client.spaces.get();
|
|
111
112
|
const identity = client.halo.identity.get();
|
|
112
|
-
if (identity) {
|
|
113
|
+
if (identity && location.active) {
|
|
113
114
|
// Group parts by space for efficient messaging.
|
|
114
|
-
const idsBySpace = reduceGroupBy(
|
|
115
|
+
const idsBySpace = reduceGroupBy(open, (id) => {
|
|
115
116
|
try {
|
|
116
117
|
const [spaceId] = parseFullyQualifiedId(id);
|
|
117
118
|
return spaceId;
|
|
@@ -120,7 +121,7 @@ export default async (context: PluginsContext) => {
|
|
|
120
121
|
}
|
|
121
122
|
});
|
|
122
123
|
|
|
123
|
-
const removedBySpace = reduceGroupBy(
|
|
124
|
+
const removedBySpace = reduceGroupBy(closed, (id) => {
|
|
124
125
|
try {
|
|
125
126
|
const [spaceId] = parseFullyQualifiedId(id);
|
|
126
127
|
return spaceId;
|
|
@@ -146,7 +147,7 @@ export default async (context: PluginsContext) => {
|
|
|
146
147
|
void space
|
|
147
148
|
.postMessage('viewing', {
|
|
148
149
|
identityKey: identity.identityKey.toHex(),
|
|
149
|
-
attended: current,
|
|
150
|
+
attended: attention.current ? [...attention.current] : [],
|
|
150
151
|
added,
|
|
151
152
|
removed,
|
|
152
153
|
})
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { CheckCircle, CircleDashed, CircleNotch } from '@phosphor-icons/react';
|
|
6
6
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { NavigationAction, useIntentDispatcher, createIntent, useCapability, Capabilities } 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';
|
|
@@ -23,7 +23,7 @@ export const AwaitingObject = ({ id }: { id: string }) => {
|
|
|
23
23
|
const [found, setFound] = useState(false);
|
|
24
24
|
const { t } = useTranslation(SPACE_PLUGIN);
|
|
25
25
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
26
|
-
const
|
|
26
|
+
const location = useCapability(Capabilities.Location);
|
|
27
27
|
|
|
28
28
|
const client = useClient();
|
|
29
29
|
const objects = useQuery(client.spaces, Filter.all());
|
|
@@ -44,11 +44,11 @@ export const AwaitingObject = ({ id }: { id: string }) => {
|
|
|
44
44
|
if (objects.findIndex((object) => fullyQualifiedId(object) === id) > -1) {
|
|
45
45
|
setFound(true);
|
|
46
46
|
|
|
47
|
-
if (
|
|
47
|
+
if (location.active.solo?.[0].id === id) {
|
|
48
48
|
setOpen(false);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
}, [id, objects,
|
|
51
|
+
}, [id, objects, location]);
|
|
52
52
|
|
|
53
53
|
const handleClose = useCallback(
|
|
54
54
|
async () => dispatch(createIntent(SpaceAction.WaitForObject, { id: undefined })),
|
|
@@ -56,7 +56,7 @@ export const AwaitingObject = ({ id }: { id: string }) => {
|
|
|
56
56
|
);
|
|
57
57
|
|
|
58
58
|
const handleNavigate = useCallback(() => {
|
|
59
|
-
void dispatch(createIntent(
|
|
59
|
+
void dispatch(createIntent(NavigationAction.Open, { activeParts: { main: [id] } }));
|
|
60
60
|
void handleClose();
|
|
61
61
|
}, [id, handleClose, dispatch]);
|
|
62
62
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { pipe } from 'effect';
|
|
6
6
|
import React, { useCallback, useRef } from 'react';
|
|
7
7
|
|
|
8
|
-
import { chain, createIntent,
|
|
8
|
+
import { chain, createIntent, NavigationAction, useIntentDispatcher } from '@dxos/app-framework';
|
|
9
9
|
import { useClient } from '@dxos/react-client';
|
|
10
10
|
import {
|
|
11
11
|
getSpace,
|
|
@@ -71,7 +71,7 @@ export const CreateObjectDialog = ({
|
|
|
71
71
|
const addObjectIntent = createIntent(SpaceAction.AddObject, { target, object });
|
|
72
72
|
const shouldNavigate = _shouldNavigate ?? (() => true);
|
|
73
73
|
if (shouldNavigate(object)) {
|
|
74
|
-
await dispatch(pipe(addObjectIntent, chain(
|
|
74
|
+
await dispatch(pipe(addObjectIntent, chain(NavigationAction.Open, {})));
|
|
75
75
|
} else {
|
|
76
76
|
await dispatch(addObjectIntent);
|
|
77
77
|
}
|
|
@@ -83,7 +83,7 @@ export const CreateObjectDialog = ({
|
|
|
83
83
|
return (
|
|
84
84
|
// TODO(wittjosiah): The tablist dialog pattern is copied from @dxos/plugin-manager.
|
|
85
85
|
// Consider factoring it out to the tabs package.
|
|
86
|
-
<Dialog.Content classNames='p-0 bs-content max-bs-full md:max-is-[40rem] overflow-hidden'>
|
|
86
|
+
<Dialog.Content classNames='p-0 bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
|
|
87
87
|
<div role='none' className='flex justify-between pbs-2 pis-2 pie-2 @md:pbs-4 @md:pis-4 @md:pie-4'>
|
|
88
88
|
<Dialog.Title>{t('create object dialog title')}</Dialog.Title>
|
|
89
89
|
<Dialog.Close asChild>
|
|
@@ -92,18 +92,18 @@ export const CreateObjectDialog = ({
|
|
|
92
92
|
</Button>
|
|
93
93
|
</Dialog.Close>
|
|
94
94
|
</div>
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
95
|
+
<div className='p-4'>
|
|
96
|
+
<CreateObjectPanel
|
|
97
|
+
schemas={schemas}
|
|
98
|
+
spaces={spaces}
|
|
99
|
+
target={target}
|
|
100
|
+
typename={typename}
|
|
101
|
+
name={name}
|
|
102
|
+
defaultSpaceId={client.spaces.default.id}
|
|
103
|
+
resolve={resolve}
|
|
104
|
+
onCreateObject={handleCreateObject}
|
|
105
|
+
/>
|
|
106
|
+
</div>
|
|
107
107
|
</Dialog.Content>
|
|
108
108
|
);
|
|
109
109
|
};
|
|
@@ -5,18 +5,32 @@
|
|
|
5
5
|
import React, { useCallback, useMemo, useState } from 'react';
|
|
6
6
|
|
|
7
7
|
import { Surface, isSurfaceAvailable, usePluginManager } from '@dxos/app-framework';
|
|
8
|
-
import { type TypedObject, getObjectAnnotation,
|
|
9
|
-
import { type SpaceId, type Space } from '@dxos/react-client/echo';
|
|
10
|
-
import { Icon,
|
|
11
|
-
import { Form, type InputProps } from '@dxos/react-ui-form';
|
|
8
|
+
import { type TypedObject, getObjectAnnotation, S } from '@dxos/echo-schema';
|
|
9
|
+
import { type SpaceId, type Space, isSpace } from '@dxos/react-client/echo';
|
|
10
|
+
import { Icon, IconButton, Input, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
11
|
+
import { Form, InputHeader, type InputProps } from '@dxos/react-ui-form';
|
|
12
12
|
import { SearchList } from '@dxos/react-ui-searchlist';
|
|
13
|
-
import { mx } from '@dxos/react-ui-theme';
|
|
14
13
|
import { nonNullable, type MaybePromise } from '@dxos/util';
|
|
15
14
|
|
|
16
15
|
import { SPACE_PLUGIN } from '../../meta';
|
|
17
16
|
import { type CollectionType } from '../../types';
|
|
18
17
|
import { getSpaceDisplayName } from '../../util';
|
|
19
18
|
|
|
19
|
+
export type CreateObjectPanelProps = {
|
|
20
|
+
schemas: TypedObject[];
|
|
21
|
+
spaces: Space[];
|
|
22
|
+
typename?: string;
|
|
23
|
+
target?: Space | CollectionType;
|
|
24
|
+
name?: string;
|
|
25
|
+
defaultSpaceId?: SpaceId;
|
|
26
|
+
resolve?: (typename: string) => Record<string, any>;
|
|
27
|
+
onCreateObject?: (params: {
|
|
28
|
+
schema: TypedObject;
|
|
29
|
+
target: Space | CollectionType;
|
|
30
|
+
data: Record<string, any>;
|
|
31
|
+
}) => MaybePromise<void>;
|
|
32
|
+
};
|
|
33
|
+
|
|
20
34
|
// TODO(ZaymonFC): Move this if you find yourself needing it elsewhere.
|
|
21
35
|
/**
|
|
22
36
|
* Creates a surface input component based on plugin context.
|
|
@@ -27,7 +41,7 @@ const useInputSurfaceLookup = (baseData?: Record<string, any>) => {
|
|
|
27
41
|
const pluginManager = usePluginManager();
|
|
28
42
|
|
|
29
43
|
return useCallback(
|
|
30
|
-
({ prop, schema, inputProps }: { prop: string; schema: S.Schema<any>; inputProps: InputProps }) => {
|
|
44
|
+
({ prop, schema, inputProps }: { prop: string; schema: S.Schema<any>; inputProps: InputProps<any> }) => {
|
|
31
45
|
const composedData = { prop, schema, ...baseData };
|
|
32
46
|
|
|
33
47
|
if (!isSurfaceAvailable(pluginManager.context, { role: 'form-input', data: composedData })) {
|
|
@@ -40,23 +54,7 @@ const useInputSurfaceLookup = (baseData?: Record<string, any>) => {
|
|
|
40
54
|
);
|
|
41
55
|
};
|
|
42
56
|
|
|
43
|
-
export type CreateObjectPanelProps = ThemedClassName<{
|
|
44
|
-
schemas: TypedObject[];
|
|
45
|
-
spaces: Space[];
|
|
46
|
-
typename?: string;
|
|
47
|
-
target?: Space | CollectionType;
|
|
48
|
-
name?: string;
|
|
49
|
-
defaultSpaceId?: SpaceId;
|
|
50
|
-
resolve?: (typename: string) => Record<string, any>;
|
|
51
|
-
onCreateObject?: (params: {
|
|
52
|
-
schema: TypedObject;
|
|
53
|
-
target: Space | CollectionType;
|
|
54
|
-
data: Record<string, any>;
|
|
55
|
-
}) => MaybePromise<void>;
|
|
56
|
-
}>;
|
|
57
|
-
|
|
58
57
|
export const CreateObjectPanel = ({
|
|
59
|
-
classNames,
|
|
60
58
|
schemas,
|
|
61
59
|
spaces,
|
|
62
60
|
typename: initialTypename,
|
|
@@ -70,14 +68,10 @@ export const CreateObjectPanel = ({
|
|
|
70
68
|
const [typename, setTypename] = useState<string | undefined>(initialTypename);
|
|
71
69
|
const [target, setTarget] = useState<Space | CollectionType | undefined>(initialTarget);
|
|
72
70
|
const schema = schemas.find((schema) => getObjectAnnotation(schema)?.typename === typename);
|
|
73
|
-
const options
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const nameA = t('typename label', { ns: a.typename, defaultValue: a.typename });
|
|
78
|
-
const nameB = t('typename label', { ns: b.typename, defaultValue: b.typename });
|
|
79
|
-
return nameA.localeCompare(nameB);
|
|
80
|
-
});
|
|
71
|
+
const options = schemas.map(getObjectAnnotation).filter(nonNullable);
|
|
72
|
+
|
|
73
|
+
const handleClearSchema = useCallback(() => setTypename(undefined), []);
|
|
74
|
+
const handleClearTarget = useCallback(() => setTarget(undefined), []);
|
|
81
75
|
|
|
82
76
|
const handleCreateObject = useCallback(
|
|
83
77
|
async (props: Record<string, any>) => {
|
|
@@ -96,89 +90,8 @@ export const CreateObjectPanel = ({
|
|
|
96
90
|
return resolve?.(typename);
|
|
97
91
|
}, [resolve, typename]);
|
|
98
92
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const form = useMemo(() => {
|
|
102
|
-
// TODO(ZaymonFC): Move this default object creation schema somewhere?
|
|
103
|
-
const schema = (metadata?.creationSchema ?? S.Struct({ name: S.optional(S.String) })) as S.Schema<any>;
|
|
104
|
-
|
|
105
|
-
return (
|
|
106
|
-
<Form
|
|
107
|
-
classNames='!p-0'
|
|
108
|
-
autoFocus
|
|
109
|
-
values={{ name: initialName }}
|
|
110
|
-
schema={schema}
|
|
111
|
-
testId='create-object-form'
|
|
112
|
-
onSave={handleCreateObject}
|
|
113
|
-
lookupComponent={inputSurfaceLookup}
|
|
114
|
-
/>
|
|
115
|
-
);
|
|
116
|
-
}, [initialName, handleCreateObject, metadata]);
|
|
117
|
-
|
|
118
|
-
// TODO(wittjosiah): These inputs should be rolled into a `Form` once it supports the necessary variants.
|
|
119
|
-
return (
|
|
120
|
-
<div role='form' className={mx('flex flex-col gap-2', classNames)}>
|
|
121
|
-
{!schema ? (
|
|
122
|
-
<SelectSchema options={options} resolve={resolve} onChange={setTypename} />
|
|
123
|
-
) : !target ? (
|
|
124
|
-
<SelectSpace spaces={spaces} defaultSpaceId={defaultSpaceId} onChange={setTarget} />
|
|
125
|
-
) : (
|
|
126
|
-
form
|
|
127
|
-
)}
|
|
128
|
-
</div>
|
|
129
|
-
);
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
const SelectSpace = ({
|
|
133
|
-
spaces,
|
|
134
|
-
defaultSpaceId,
|
|
135
|
-
onChange,
|
|
136
|
-
}: { onChange: (space: Space) => void } & Pick<CreateObjectPanelProps, 'spaces' | 'defaultSpaceId'>) => {
|
|
137
|
-
const { t } = useTranslation(SPACE_PLUGIN);
|
|
138
|
-
|
|
139
|
-
return (
|
|
140
|
-
<SearchList.Root label={t('space input label')} classNames='flex flex-col grow overflow-hidden'>
|
|
141
|
-
<SearchList.Input
|
|
142
|
-
autoFocus
|
|
143
|
-
data-testid='create-object-form.space-input'
|
|
144
|
-
placeholder={t('space input placeholder')}
|
|
145
|
-
classNames='px-1 my-2'
|
|
146
|
-
/>
|
|
147
|
-
<SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
|
|
148
|
-
{spaces
|
|
149
|
-
.sort((a, b) => {
|
|
150
|
-
const aName = toLocalizedString(getSpaceDisplayName(a, { personal: a.id === defaultSpaceId }), t);
|
|
151
|
-
const bName = toLocalizedString(getSpaceDisplayName(b, { personal: b.id === defaultSpaceId }), t);
|
|
152
|
-
return aName.localeCompare(bName);
|
|
153
|
-
})
|
|
154
|
-
.map((space) => (
|
|
155
|
-
<SearchList.Item
|
|
156
|
-
key={space.id}
|
|
157
|
-
value={toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
|
|
158
|
-
onSelect={() => onChange(space)}
|
|
159
|
-
classNames='flex items-center gap-2'
|
|
160
|
-
>
|
|
161
|
-
<span className='grow truncate'>
|
|
162
|
-
{toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
|
|
163
|
-
</span>
|
|
164
|
-
</SearchList.Item>
|
|
165
|
-
))}
|
|
166
|
-
</SearchList.Content>
|
|
167
|
-
</SearchList.Root>
|
|
168
|
-
);
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
const SelectSchema = ({
|
|
172
|
-
options,
|
|
173
|
-
resolve,
|
|
174
|
-
onChange,
|
|
175
|
-
}: {
|
|
176
|
-
options: ObjectAnnotation[];
|
|
177
|
-
onChange: (type: string) => void;
|
|
178
|
-
} & Pick<CreateObjectPanelProps, 'resolve'>) => {
|
|
179
|
-
const { t } = useTranslation(SPACE_PLUGIN);
|
|
180
|
-
|
|
181
|
-
return (
|
|
93
|
+
// TODO(wittjosiah): All of these inputs should be rolled into a `Form` once it supports the necessary variants.
|
|
94
|
+
const schemaInput = (
|
|
182
95
|
<SearchList.Root label={t('schema input label')} classNames='flex flex-col grow overflow-hidden'>
|
|
183
96
|
<SearchList.Input
|
|
184
97
|
autoFocus
|
|
@@ -191,7 +104,7 @@ const SelectSchema = ({
|
|
|
191
104
|
<SearchList.Item
|
|
192
105
|
key={option.typename}
|
|
193
106
|
value={t('typename label', { ns: option.typename, defaultValue: option.typename })}
|
|
194
|
-
onSelect={() =>
|
|
107
|
+
onSelect={() => setTypename(option.typename)}
|
|
195
108
|
classNames='flex items-center gap-2'
|
|
196
109
|
>
|
|
197
110
|
<span className='flex gap-2 items-center grow truncate'>
|
|
@@ -203,4 +116,91 @@ const SelectSchema = ({
|
|
|
203
116
|
</SearchList.Content>
|
|
204
117
|
</SearchList.Root>
|
|
205
118
|
);
|
|
119
|
+
|
|
120
|
+
const spaceInput = (
|
|
121
|
+
<SearchList.Root label={t('space input label')} classNames='flex flex-col grow overflow-hidden'>
|
|
122
|
+
<SearchList.Input
|
|
123
|
+
autoFocus
|
|
124
|
+
data-testid='create-object-form.space-input'
|
|
125
|
+
placeholder={t('space input placeholder')}
|
|
126
|
+
classNames='px-1 my-2'
|
|
127
|
+
/>
|
|
128
|
+
<SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
|
|
129
|
+
{spaces.map((space) => (
|
|
130
|
+
<SearchList.Item
|
|
131
|
+
key={space.id}
|
|
132
|
+
value={toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
|
|
133
|
+
onSelect={() => setTarget(space)}
|
|
134
|
+
classNames='flex items-center gap-2'
|
|
135
|
+
>
|
|
136
|
+
<span className='grow truncate'>
|
|
137
|
+
{toLocalizedString(getSpaceDisplayName(space, { personal: space.id === defaultSpaceId }), t)}
|
|
138
|
+
</span>
|
|
139
|
+
</SearchList.Item>
|
|
140
|
+
))}
|
|
141
|
+
</SearchList.Content>
|
|
142
|
+
</SearchList.Root>
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const inputSurfaceLookup = useInputSurfaceLookup({ target });
|
|
146
|
+
|
|
147
|
+
const form = useMemo(() => {
|
|
148
|
+
// TODO(ZaymonFC): Move this default object creation schema somewhere?
|
|
149
|
+
const schema = (metadata?.creationSchema ?? S.Struct({ name: S.optional(S.String) })) as S.Schema<any>;
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<Form
|
|
153
|
+
autoFocus
|
|
154
|
+
values={{ name: initialName }}
|
|
155
|
+
schema={schema}
|
|
156
|
+
testId='create-object-form'
|
|
157
|
+
onSave={handleCreateObject}
|
|
158
|
+
lookupComponent={inputSurfaceLookup}
|
|
159
|
+
/>
|
|
160
|
+
);
|
|
161
|
+
}, [initialName, handleCreateObject, metadata]);
|
|
162
|
+
|
|
163
|
+
return (
|
|
164
|
+
<div role='form' className='flex flex-col gap-2'>
|
|
165
|
+
{target && (
|
|
166
|
+
<div role='none'>
|
|
167
|
+
<Input.Root>
|
|
168
|
+
<InputHeader>
|
|
169
|
+
<Input.Label>
|
|
170
|
+
{t(isSpace(target) ? 'creating in space label' : 'creating in collection label')}
|
|
171
|
+
</Input.Label>
|
|
172
|
+
</InputHeader>
|
|
173
|
+
<div role='none' className='flex gap-2'>
|
|
174
|
+
<Input.TextInput
|
|
175
|
+
disabled
|
|
176
|
+
value={
|
|
177
|
+
isSpace(target)
|
|
178
|
+
? toLocalizedString(getSpaceDisplayName(target, { personal: target.id === defaultSpaceId }), t)
|
|
179
|
+
: target.name || t('unnamed collection label')
|
|
180
|
+
}
|
|
181
|
+
/>
|
|
182
|
+
<IconButton iconOnly icon='ph--x--regular' label={t('clear input label')} onClick={handleClearTarget} />
|
|
183
|
+
</div>
|
|
184
|
+
</Input.Root>
|
|
185
|
+
</div>
|
|
186
|
+
)}
|
|
187
|
+
{schema && (
|
|
188
|
+
<div role='none'>
|
|
189
|
+
<Input.Root>
|
|
190
|
+
<InputHeader>
|
|
191
|
+
<Input.Label>{t('creating object type label')}</Input.Label>
|
|
192
|
+
</InputHeader>
|
|
193
|
+
<div role='none' className='flex gap-2'>
|
|
194
|
+
<Input.TextInput
|
|
195
|
+
disabled
|
|
196
|
+
value={t('typename label', { ns: schema.typename, defaultValue: schema.typename })}
|
|
197
|
+
/>
|
|
198
|
+
<IconButton iconOnly icon='ph--x--regular' label={t('clear input label')} onClick={handleClearSchema} />
|
|
199
|
+
</div>
|
|
200
|
+
</Input.Root>
|
|
201
|
+
</div>
|
|
202
|
+
)}
|
|
203
|
+
{!schema ? schemaInput : !target ? spaceInput : form}
|
|
204
|
+
</div>
|
|
205
|
+
);
|
|
206
206
|
};
|