@dxos/plugin-space 0.8.4-main.c85a9c8dae → 0.8.4-main.d05673bc65
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-WASDM637.mjs → CollectionArticle-WPLUW5HF.mjs} +5 -36
- package/dist/lib/browser/CollectionArticle-WPLUW5HF.mjs.map +7 -0
- package/dist/lib/browser/{CollectionSection-LK4O6QDD.mjs → CollectionSection-H2MBNI63.mjs} +2 -2
- package/dist/lib/browser/{CreateObjectDialog-MA6DPYMD.mjs → CreateObjectDialog-YUBUWSEL.mjs} +17 -21
- package/dist/lib/browser/CreateObjectDialog-YUBUWSEL.mjs.map +7 -0
- package/dist/lib/browser/{CreateSpaceDialog-WCEICWIE.mjs → CreateSpaceDialog-3M2LAWV6.mjs} +7 -7
- package/dist/lib/browser/CreateSpaceDialog-3M2LAWV6.mjs.map +7 -0
- package/dist/lib/browser/{InlineSyncStatus-BT7BRBCO.mjs → InlineSyncStatus-K5MZ3YMZ.mjs} +9 -18
- package/dist/lib/browser/InlineSyncStatus-K5MZ3YMZ.mjs.map +7 -0
- package/dist/lib/browser/{JoinDialog-PMCAIRCU.mjs → JoinDialog-PBK2RE5F.mjs} +8 -10
- package/dist/lib/browser/JoinDialog-PBK2RE5F.mjs.map +7 -0
- package/dist/lib/browser/{MembersContainer-MMFCXLVZ.mjs → MembersContainer-OGYV2L4M.mjs} +4 -4
- package/dist/lib/browser/{MenuFooter-HYBTNOBT.mjs → MenuFooter-XCBDK7WP.mjs} +3 -4
- package/dist/lib/{node-esm/MenuFooter-2QB3453Y.mjs.map → browser/MenuFooter-XCBDK7WP.mjs.map} +1 -1
- package/dist/lib/browser/{ObjectCardStack-CHWNLUYQ.mjs → ObjectCardStack-OMXF2DSG.mjs} +6 -6
- package/dist/lib/browser/{ObjectDetails-YUGVDNSA.mjs → ObjectDetails-QFTQQN4W.mjs} +6 -6
- package/dist/lib/browser/{ObjectRenamePopover-RQUOVPFH.mjs → ObjectRenamePopover-JNPJIFIR.mjs} +3 -3
- package/dist/lib/browser/{ObjectRenamePopover-RQUOVPFH.mjs.map → ObjectRenamePopover-JNPJIFIR.mjs.map} +1 -1
- package/dist/lib/browser/{RecordArticle-ONWKYM3Z.mjs → RecordArticle-BO2XHBFN.mjs} +2 -2
- package/dist/lib/browser/{SchemaContainer-62AJXKAF.mjs → SchemaContainer-QWCSIZBS.mjs} +2 -2
- package/dist/lib/browser/SmallPresenceLive-AHHLBAUP.mjs +9 -0
- package/dist/lib/browser/{SpacePluginSettings-BRJTADV5.mjs → SpacePluginSettings-QGZKNQLK.mjs} +4 -4
- package/dist/lib/browser/SpacePresence-JIWLBUWO.mjs +12 -0
- package/dist/lib/browser/{SpaceRenamePopover-SAKMPDLX.mjs → SpaceRenamePopover-ZL6RRZ2B.mjs} +3 -3
- package/dist/lib/browser/{SpaceRenamePopover-SAKMPDLX.mjs.map → SpaceRenamePopover-ZL6RRZ2B.mjs.map} +1 -1
- package/dist/lib/browser/{SpaceSettingsContainer-UBMVKUPR.mjs → SpaceSettingsContainer-MIOOT63N.mjs} +5 -5
- package/dist/lib/browser/SpaceSettingsContainer-MIOOT63N.mjs.map +7 -0
- package/dist/lib/browser/{SyncStatus-5UQ7CIII.mjs → SyncStatus-6N7JJ7XF.mjs} +6 -6
- package/dist/lib/browser/{ViewEditor-F74RR542.mjs → ViewEditor-3FX5HDRT.mjs} +4 -7
- package/dist/lib/browser/ViewEditor-3FX5HDRT.mjs.map +7 -0
- package/dist/lib/browser/app-graph-builder-JORZZE3P.mjs +1203 -0
- package/dist/lib/browser/app-graph-builder-JORZZE3P.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-KTQOBYUF.mjs → app-graph-serializer-UZWWGLGY.mjs} +5 -5
- package/dist/lib/browser/{chunk-RWOK4F4G.mjs → chunk-2WHUSAHE.mjs} +17 -14
- package/dist/lib/browser/chunk-2WHUSAHE.mjs.map +7 -0
- package/dist/lib/browser/{chunk-USN5QKRV.mjs → chunk-6IT5IBB5.mjs} +54 -86
- package/dist/lib/browser/chunk-6IT5IBB5.mjs.map +7 -0
- package/dist/lib/browser/chunk-6OA75CWN.mjs +77 -0
- package/dist/lib/browser/chunk-6OA75CWN.mjs.map +7 -0
- package/dist/lib/browser/{chunk-PXVKN4LU.mjs → chunk-AUX3RRLY.mjs} +34 -9
- package/dist/lib/browser/chunk-AUX3RRLY.mjs.map +7 -0
- package/dist/lib/browser/{chunk-HSMQFM57.mjs → chunk-CBWGVOJE.mjs} +2 -2
- package/dist/lib/browser/{chunk-HSMQFM57.mjs.map → chunk-CBWGVOJE.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-XIIYC7P5.mjs → chunk-ICXESMDI.mjs} +6 -6
- package/dist/lib/browser/chunk-ICXESMDI.mjs.map +7 -0
- package/dist/lib/browser/chunk-RJUOHI3B.mjs +19 -0
- package/dist/lib/browser/{chunk-ASV6DYFH.mjs.map → chunk-RJUOHI3B.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-J5F4LUJD.mjs → chunk-SSTUPFZ2.mjs} +3 -3
- package/dist/lib/browser/{chunk-ABCDB5YC.mjs → chunk-UYOJYBGW.mjs} +7 -16
- package/dist/lib/browser/chunk-UYOJYBGW.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +8 -17
- package/dist/lib/browser/cli/index.mjs.map +3 -3
- package/dist/lib/browser/{identity-created-VKLIZOXJ.mjs → identity-created-ETXNQYR6.mjs} +4 -4
- package/dist/lib/browser/{identity-created-VKLIZOXJ.mjs.map → identity-created-ETXNQYR6.mjs.map} +3 -3
- package/dist/lib/browser/index.mjs +33 -53
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{operation-resolver-Y3HYRXX7.mjs → operation-resolver-D4LHB4D4.mjs} +64 -88
- package/dist/lib/browser/operation-resolver-D4LHB4D4.mjs.map +7 -0
- package/dist/lib/browser/{react-root-UYBW5RE7.mjs → react-root-OD2HP63B.mjs} +6 -6
- package/dist/lib/browser/{react-surface-NJ23NZFF.mjs → react-surface-E4TAFED5.mjs} +57 -79
- package/dist/lib/browser/react-surface-E4TAFED5.mjs.map +7 -0
- package/dist/lib/browser/repair-NUVEV4AK.mjs +31 -0
- package/dist/lib/browser/repair-NUVEV4AK.mjs.map +7 -0
- package/dist/lib/browser/{settings-2ELVUFDR.mjs → settings-RUDP2Q56.mjs} +3 -3
- package/dist/lib/browser/{spaces-ready-Q6JASPT4.mjs → spaces-ready-B2GYL5IN.mjs} +6 -6
- package/dist/lib/browser/spaces-ready-B2GYL5IN.mjs.map +7 -0
- package/dist/lib/browser/{state-CTX4WQOM.mjs → state-I6JDZCDE.mjs} +5 -5
- package/dist/lib/browser/{state-CTX4WQOM.mjs.map → state-I6JDZCDE.mjs.map} +2 -2
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node-esm/{CollectionArticle-A6GGG73Z.mjs → CollectionArticle-JGVNBX66.mjs} +5 -36
- package/dist/lib/node-esm/CollectionArticle-JGVNBX66.mjs.map +7 -0
- package/dist/lib/node-esm/{CollectionSection-WWKDOAAT.mjs → CollectionSection-BI66Y34F.mjs} +2 -2
- package/dist/lib/node-esm/{CreateObjectDialog-4WEFNDDF.mjs → CreateObjectDialog-B6OLP5VQ.mjs} +17 -21
- package/dist/lib/node-esm/CreateObjectDialog-B6OLP5VQ.mjs.map +7 -0
- package/dist/lib/node-esm/{CreateSpaceDialog-P7QCPB5J.mjs → CreateSpaceDialog-J47M5FPQ.mjs} +7 -7
- package/dist/lib/node-esm/CreateSpaceDialog-J47M5FPQ.mjs.map +7 -0
- package/dist/lib/node-esm/{InlineSyncStatus-3PCXU7NX.mjs → InlineSyncStatus-BLD57LB5.mjs} +9 -18
- package/dist/lib/node-esm/InlineSyncStatus-BLD57LB5.mjs.map +7 -0
- package/dist/lib/node-esm/{JoinDialog-XEOLJZVN.mjs → JoinDialog-XCOYKSHA.mjs} +8 -10
- package/dist/lib/node-esm/JoinDialog-XCOYKSHA.mjs.map +7 -0
- package/dist/lib/node-esm/{MembersContainer-UQZLW3YA.mjs → MembersContainer-4PV3Z4BA.mjs} +4 -4
- package/dist/lib/node-esm/{MenuFooter-2QB3453Y.mjs → MenuFooter-PXG2GV6A.mjs} +3 -4
- package/dist/lib/node-esm/{ObjectCardStack-UXEWG6RV.mjs → ObjectCardStack-457SNNVF.mjs} +6 -6
- package/dist/lib/node-esm/{ObjectDetails-26PVHUQL.mjs → ObjectDetails-OLF7HSM4.mjs} +6 -6
- package/dist/lib/node-esm/{ObjectRenamePopover-EHTP76G7.mjs → ObjectRenamePopover-BRPKVNVF.mjs} +3 -3
- package/dist/lib/node-esm/{ObjectRenamePopover-EHTP76G7.mjs.map → ObjectRenamePopover-BRPKVNVF.mjs.map} +1 -1
- package/dist/lib/node-esm/{RecordArticle-APY2WKUW.mjs → RecordArticle-XUIT25PP.mjs} +2 -2
- package/dist/lib/node-esm/{SchemaContainer-XR2D6MYX.mjs → SchemaContainer-5G4R3Z6O.mjs} +2 -2
- package/dist/lib/node-esm/SmallPresenceLive-4K7RJS74.mjs +10 -0
- package/dist/lib/node-esm/SmallPresenceLive-4K7RJS74.mjs.map +7 -0
- package/dist/lib/node-esm/{SpacePluginSettings-VEB5IGG7.mjs → SpacePluginSettings-PENV4GHL.mjs} +4 -4
- package/dist/lib/node-esm/SpacePresence-H3VZWFJV.mjs +13 -0
- package/dist/lib/node-esm/SpacePresence-H3VZWFJV.mjs.map +7 -0
- package/dist/lib/node-esm/{SpaceRenamePopover-WHM632OT.mjs → SpaceRenamePopover-XEMTI4PU.mjs} +3 -3
- package/dist/lib/node-esm/{SpaceRenamePopover-WHM632OT.mjs.map → SpaceRenamePopover-XEMTI4PU.mjs.map} +1 -1
- package/dist/lib/node-esm/{SpaceSettingsContainer-Y62J2L65.mjs → SpaceSettingsContainer-WI4D7RWA.mjs} +5 -5
- package/dist/lib/node-esm/SpaceSettingsContainer-WI4D7RWA.mjs.map +7 -0
- package/dist/lib/node-esm/{SyncStatus-XTJAVHPN.mjs → SyncStatus-YEBGTNSD.mjs} +6 -6
- package/dist/lib/node-esm/{ViewEditor-B2BLYF5U.mjs → ViewEditor-CUQVNM2H.mjs} +4 -7
- package/dist/lib/node-esm/ViewEditor-CUQVNM2H.mjs.map +7 -0
- package/dist/lib/node-esm/app-graph-builder-WTM6SSX7.mjs +1204 -0
- package/dist/lib/node-esm/app-graph-builder-WTM6SSX7.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-GXQYSQAZ.mjs → app-graph-serializer-RT2RQTV2.mjs} +5 -5
- package/dist/lib/node-esm/{chunk-OSFH2XKO.mjs → chunk-2OLR2ZKH.mjs} +6 -6
- package/dist/lib/node-esm/chunk-2OLR2ZKH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-5KTTTTEX.mjs +20 -0
- package/dist/lib/node-esm/{chunk-CVXULIYC.mjs.map → chunk-5KTTTTEX.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-SL4BJSUG.mjs → chunk-63N5JJXI.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-SL4BJSUG.mjs.map → chunk-63N5JJXI.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-UJQUBDQS.mjs → chunk-EDC2RUJU.mjs} +7 -16
- package/dist/lib/node-esm/chunk-EDC2RUJU.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-3DWZCVVQ.mjs → chunk-EVNSLSQS.mjs} +54 -86
- package/dist/lib/node-esm/chunk-EVNSLSQS.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GEGWQVZX.mjs +78 -0
- package/dist/lib/node-esm/chunk-GEGWQVZX.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-P2AVANDG.mjs → chunk-RYQQXNI7.mjs} +34 -9
- package/dist/lib/node-esm/chunk-RYQQXNI7.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-GWUPFA7J.mjs → chunk-S5BQUCL4.mjs} +17 -14
- package/dist/lib/node-esm/chunk-S5BQUCL4.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-S2IELCDF.mjs → chunk-XYLDAH5C.mjs} +3 -3
- package/dist/lib/node-esm/cli/index.mjs +8 -17
- package/dist/lib/node-esm/cli/index.mjs.map +3 -3
- package/dist/lib/node-esm/{identity-created-EGSTETJ5.mjs → identity-created-U5LGULVL.mjs} +4 -4
- package/dist/lib/node-esm/{identity-created-EGSTETJ5.mjs.map → identity-created-U5LGULVL.mjs.map} +3 -3
- package/dist/lib/node-esm/index.mjs +33 -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-IRQ2NVUQ.mjs → operation-resolver-IL2AHNPN.mjs} +64 -88
- package/dist/lib/node-esm/operation-resolver-IL2AHNPN.mjs.map +7 -0
- package/dist/lib/node-esm/{react-root-UEN3LLJD.mjs → react-root-RILC5MBD.mjs} +6 -6
- package/dist/lib/node-esm/{react-surface-UDO3PGH6.mjs → react-surface-SWKRVK4S.mjs} +57 -79
- package/dist/lib/node-esm/react-surface-SWKRVK4S.mjs.map +7 -0
- package/dist/lib/node-esm/repair-LRZHFPSJ.mjs +32 -0
- package/dist/lib/node-esm/repair-LRZHFPSJ.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-DCTVM2BV.mjs → settings-3EKSEAAG.mjs} +3 -3
- package/dist/lib/node-esm/{spaces-ready-XLGRTJV2.mjs → spaces-ready-QK3EHBOS.mjs} +6 -6
- package/dist/lib/node-esm/spaces-ready-QK3EHBOS.mjs.map +7 -0
- package/dist/lib/node-esm/{state-G74V3WZG.mjs → state-W36RRYUO.mjs} +5 -5
- package/dist/lib/node-esm/{state-G74V3WZG.mjs.map → state-W36RRYUO.mjs.map} +2 -2
- package/dist/lib/node-esm/types/index.mjs +2 -2
- package/dist/types/src/SpacePlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -2
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts +33 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts +19 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/index.d.ts +6 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts +12 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts +57 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/shared.test.d.ts +2 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/shared.test.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts +24 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/types.d.ts +38 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/types.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/repair/repair.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 +0 -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/AwaitingObject.d.ts.map +1 -0
- package/dist/types/src/components/AwaitingObject/index.d.ts +2 -0
- package/dist/types/src/components/AwaitingObject/index.d.ts.map +1 -0
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts +0 -1
- package/dist/types/src/components/CreateDialog/CreateObjectPanel.d.ts.map +1 -1
- package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts +68 -14
- package/dist/types/src/components/ObjectDetails/BaseObjectSettings.stories.d.ts.map +1 -1
- package/dist/types/src/components/ObjectForm/ObjectForm.d.ts.map +1 -1
- package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts +1 -2
- package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts.map +1 -1
- package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts +2 -1
- package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts.map +1 -1
- package/dist/types/src/containers/CreateObjectDialog/index.d.ts +2 -2
- package/dist/types/src/containers/CreateObjectDialog/index.d.ts.map +1 -1
- package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/index.d.ts +2 -2
- package/dist/types/src/containers/JoinDialog/index.d.ts.map +1 -1
- package/dist/types/src/containers/ObjectDetails/ObjectDetails.d.ts +1 -0
- package/dist/types/src/containers/ObjectDetails/ObjectDetails.d.ts.map +1 -1
- package/dist/types/src/containers/SmallPresenceLive/index.d.ts +1 -1
- package/dist/types/src/containers/SmallPresenceLive/index.d.ts.map +1 -1
- package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts.map +1 -1
- package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts +67 -13
- package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts.map +1 -1
- package/dist/types/src/containers/SpacePresence/index.d.ts +2 -2
- package/dist/types/src/containers/SpacePresence/index.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts +67 -13
- package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts +67 -13
- package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +1 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +67 -13
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/form.d.ts +0 -2
- package/dist/types/src/types/form.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +29 -46
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +4 -161
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +57 -57
- package/src/SpacePlugin.ts +14 -22
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +14 -657
- package/src/capabilities/app-graph-builder/extensions/collections.ts +351 -0
- package/src/capabilities/app-graph-builder/extensions/companions.ts +80 -0
- package/src/capabilities/app-graph-builder/extensions/index.ts +9 -0
- package/src/capabilities/app-graph-builder/extensions/settings.ts +60 -0
- package/src/capabilities/app-graph-builder/extensions/shared.test.ts +112 -0
- package/src/capabilities/app-graph-builder/extensions/shared.ts +171 -0
- package/src/capabilities/app-graph-builder/extensions/spaces.ts +338 -0
- package/src/capabilities/app-graph-builder/extensions/types.ts +421 -0
- package/src/capabilities/identity-created/identity-created.ts +3 -3
- package/src/capabilities/operation-resolver/operation-resolver.ts +65 -73
- package/src/capabilities/react-surface/react-surface.tsx +33 -58
- package/src/capabilities/repair/repair.ts +3 -32
- package/src/capabilities/spaces-ready/spaces-ready.ts +2 -2
- package/src/capabilities/state/state.ts +4 -2
- package/src/cli/commands/database/add.ts +0 -1
- package/src/cli/commands/space/close/close.ts +1 -1
- package/src/cli/commands/space/create/create.ts +1 -1
- package/src/cli/commands/space/join/join.ts +1 -1
- package/src/cli/commands/space/open/open.ts +1 -1
- package/src/cli/plugin.ts +0 -1
- package/src/components/{AwaitingObject.tsx → AwaitingObject/AwaitingObject.tsx} +2 -2
- package/src/components/AwaitingObject/index.ts +5 -0
- package/src/components/CreateDialog/CreateObjectPanel.tsx +5 -2
- package/src/components/ObjectDetails/BaseObjectSettings.stories.tsx +4 -4
- package/src/components/ObjectDetails/BaseObjectSettings.tsx +4 -4
- package/src/components/ObjectForm/ObjectForm.tsx +6 -4
- package/src/constants.ts +5 -5
- package/src/containers/CollectionArticle/CollectionArticle.tsx +7 -54
- package/src/containers/CreateObjectDialog/CreateObjectDialog.tsx +10 -10
- package/src/containers/CreateObjectDialog/index.ts +2 -3
- package/src/containers/CreateSpaceDialog/CreateSpaceDialog.tsx +5 -3
- package/src/containers/InlineSyncStatus/InlineSyncStatus.tsx +7 -18
- package/src/containers/JoinDialog/JoinDialog.tsx +4 -4
- package/src/containers/JoinDialog/index.ts +2 -3
- package/src/containers/ObjectRenamePopover/ObjectRenamePopover.tsx +1 -1
- package/src/containers/SmallPresenceLive/index.ts +1 -1
- package/src/containers/SpacePresence/SpacePresence.tsx +4 -16
- package/src/containers/SpacePresence/index.ts +2 -3
- package/src/containers/SpaceRenamePopover/SpaceRenamePopover.tsx +1 -1
- package/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.tsx +2 -2
- package/src/containers/ViewEditor/ViewEditor.tsx +0 -1
- package/src/containers/index.ts +1 -1
- package/src/helpers/query.test.ts +1 -1
- package/src/hooks/useActiveSpace.ts +4 -4
- package/src/meta.ts +1 -1
- package/src/translations.ts +27 -1
- package/src/types/capabilities.ts +7 -7
- package/src/types/events.ts +5 -5
- package/src/types/form.ts +1 -8
- package/src/types/types.ts +36 -58
- package/src/util.ts +82 -0
- package/dist/lib/browser/CollectionArticle-WASDM637.mjs.map +0 -7
- package/dist/lib/browser/CreateObjectDialog-MA6DPYMD.mjs.map +0 -7
- package/dist/lib/browser/CreateSpaceDialog-WCEICWIE.mjs.map +0 -7
- package/dist/lib/browser/InlineSyncStatus-BT7BRBCO.mjs.map +0 -7
- package/dist/lib/browser/JoinDialog-PMCAIRCU.mjs.map +0 -7
- package/dist/lib/browser/SmallPresenceLive-LZD2NGKK.mjs +0 -10
- package/dist/lib/browser/SpacePresence-MLU576L6.mjs +0 -13
- package/dist/lib/browser/SpacePresence-MLU576L6.mjs.map +0 -7
- package/dist/lib/browser/SpaceSettingsContainer-UBMVKUPR.mjs.map +0 -7
- package/dist/lib/browser/ViewEditor-F74RR542.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-VFYFI7CD.mjs +0 -593
- package/dist/lib/browser/app-graph-builder-VFYFI7CD.mjs.map +0 -7
- package/dist/lib/browser/chunk-ABCDB5YC.mjs.map +0 -7
- package/dist/lib/browser/chunk-ASV6DYFH.mjs +0 -19
- package/dist/lib/browser/chunk-PXVKN4LU.mjs.map +0 -7
- package/dist/lib/browser/chunk-RWOK4F4G.mjs.map +0 -7
- package/dist/lib/browser/chunk-TPZUQ5DC.mjs +0 -749
- package/dist/lib/browser/chunk-TPZUQ5DC.mjs.map +0 -7
- package/dist/lib/browser/chunk-USN5QKRV.mjs.map +0 -7
- package/dist/lib/browser/chunk-XIIYC7P5.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-Y3HYRXX7.mjs.map +0 -7
- package/dist/lib/browser/react-surface-NJ23NZFF.mjs.map +0 -7
- package/dist/lib/browser/repair-N2I4DR2Z.mjs +0 -50
- package/dist/lib/browser/repair-N2I4DR2Z.mjs.map +0 -7
- package/dist/lib/browser/spaces-ready-Q6JASPT4.mjs.map +0 -7
- package/dist/lib/node-esm/CollectionArticle-A6GGG73Z.mjs.map +0 -7
- package/dist/lib/node-esm/CreateObjectDialog-4WEFNDDF.mjs.map +0 -7
- package/dist/lib/node-esm/CreateSpaceDialog-P7QCPB5J.mjs.map +0 -7
- package/dist/lib/node-esm/InlineSyncStatus-3PCXU7NX.mjs.map +0 -7
- package/dist/lib/node-esm/JoinDialog-XEOLJZVN.mjs.map +0 -7
- package/dist/lib/node-esm/SmallPresenceLive-K4243KXR.mjs +0 -11
- package/dist/lib/node-esm/SpacePresence-HC2XGQ54.mjs +0 -14
- package/dist/lib/node-esm/SpacePresence-HC2XGQ54.mjs.map +0 -7
- package/dist/lib/node-esm/SpaceSettingsContainer-Y62J2L65.mjs.map +0 -7
- package/dist/lib/node-esm/ViewEditor-B2BLYF5U.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-N37ED6UI.mjs +0 -594
- package/dist/lib/node-esm/app-graph-builder-N37ED6UI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3DWZCVVQ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CVXULIYC.mjs +0 -20
- package/dist/lib/node-esm/chunk-GWUPFA7J.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-OSFH2XKO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-P2AVANDG.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UJQUBDQS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-WW6YYBRG.mjs +0 -750
- package/dist/lib/node-esm/chunk-WW6YYBRG.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-IRQ2NVUQ.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-UDO3PGH6.mjs.map +0 -7
- package/dist/lib/node-esm/repair-P6ND7ZRU.mjs +0 -51
- package/dist/lib/node-esm/repair-P6ND7ZRU.mjs.map +0 -7
- package/dist/lib/node-esm/spaces-ready-XLGRTJV2.mjs.map +0 -7
- package/dist/types/src/components/AwaitingObject.d.ts.map +0 -1
- package/src/util.tsx +0 -956
- /package/dist/lib/browser/{CollectionSection-LK4O6QDD.mjs.map → CollectionSection-H2MBNI63.mjs.map} +0 -0
- /package/dist/lib/browser/{MembersContainer-MMFCXLVZ.mjs.map → MembersContainer-OGYV2L4M.mjs.map} +0 -0
- /package/dist/lib/browser/{ObjectCardStack-CHWNLUYQ.mjs.map → ObjectCardStack-OMXF2DSG.mjs.map} +0 -0
- /package/dist/lib/browser/{ObjectDetails-YUGVDNSA.mjs.map → ObjectDetails-QFTQQN4W.mjs.map} +0 -0
- /package/dist/lib/browser/{RecordArticle-ONWKYM3Z.mjs.map → RecordArticle-BO2XHBFN.mjs.map} +0 -0
- /package/dist/lib/browser/{SchemaContainer-62AJXKAF.mjs.map → SchemaContainer-QWCSIZBS.mjs.map} +0 -0
- /package/dist/lib/browser/{SmallPresenceLive-LZD2NGKK.mjs.map → SmallPresenceLive-AHHLBAUP.mjs.map} +0 -0
- /package/dist/lib/browser/{SpacePluginSettings-BRJTADV5.mjs.map → SpacePluginSettings-QGZKNQLK.mjs.map} +0 -0
- /package/dist/lib/{node-esm/SmallPresenceLive-K4243KXR.mjs.map → browser/SpacePresence-JIWLBUWO.mjs.map} +0 -0
- /package/dist/lib/browser/{SyncStatus-5UQ7CIII.mjs.map → SyncStatus-6N7JJ7XF.mjs.map} +0 -0
- /package/dist/lib/browser/{app-graph-serializer-KTQOBYUF.mjs.map → app-graph-serializer-UZWWGLGY.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-J5F4LUJD.mjs.map → chunk-SSTUPFZ2.mjs.map} +0 -0
- /package/dist/lib/browser/{react-root-UYBW5RE7.mjs.map → react-root-OD2HP63B.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-2ELVUFDR.mjs.map → settings-RUDP2Q56.mjs.map} +0 -0
- /package/dist/lib/node-esm/{CollectionSection-WWKDOAAT.mjs.map → CollectionSection-BI66Y34F.mjs.map} +0 -0
- /package/dist/lib/node-esm/{MembersContainer-UQZLW3YA.mjs.map → MembersContainer-4PV3Z4BA.mjs.map} +0 -0
- /package/dist/lib/{browser/MenuFooter-HYBTNOBT.mjs.map → node-esm/MenuFooter-PXG2GV6A.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ObjectCardStack-UXEWG6RV.mjs.map → ObjectCardStack-457SNNVF.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ObjectDetails-26PVHUQL.mjs.map → ObjectDetails-OLF7HSM4.mjs.map} +0 -0
- /package/dist/lib/node-esm/{RecordArticle-APY2WKUW.mjs.map → RecordArticle-XUIT25PP.mjs.map} +0 -0
- /package/dist/lib/node-esm/{SchemaContainer-XR2D6MYX.mjs.map → SchemaContainer-5G4R3Z6O.mjs.map} +0 -0
- /package/dist/lib/node-esm/{SpacePluginSettings-VEB5IGG7.mjs.map → SpacePluginSettings-PENV4GHL.mjs.map} +0 -0
- /package/dist/lib/node-esm/{SyncStatus-XTJAVHPN.mjs.map → SyncStatus-YEBGTNSD.mjs.map} +0 -0
- /package/dist/lib/node-esm/{app-graph-serializer-GXQYSQAZ.mjs.map → app-graph-serializer-RT2RQTV2.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-S2IELCDF.mjs.map → chunk-XYLDAH5C.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-root-UEN3LLJD.mjs.map → react-root-RILC5MBD.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-DCTVM2BV.mjs.map → settings-3EKSEAAG.mjs.map} +0 -0
- /package/dist/types/src/components/{AwaitingObject.d.ts → AwaitingObject/AwaitingObject.d.ts} +0 -0
package/src/util.tsx
DELETED
|
@@ -1,956 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { type Instruction } from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item';
|
|
6
|
-
import * as Effect from 'effect/Effect';
|
|
7
|
-
import * as Match from 'effect/Match';
|
|
8
|
-
import * as Option from 'effect/Option';
|
|
9
|
-
|
|
10
|
-
import { type CapabilityManager } from '@dxos/app-framework';
|
|
11
|
-
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
12
|
-
import { type Space, SpaceState, isSpace } from '@dxos/client/echo';
|
|
13
|
-
import { type Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Type } from '@dxos/echo';
|
|
14
|
-
import { Collection } from '@dxos/echo';
|
|
15
|
-
import { invariant } from '@dxos/invariant';
|
|
16
|
-
import { Migrations } from '@dxos/migrations';
|
|
17
|
-
import { Operation } from '@dxos/operation';
|
|
18
|
-
import { Graph, Node } from '@dxos/plugin-graph';
|
|
19
|
-
import { ATTENDABLE_PATH_SEPARATOR } from '@dxos/react-ui-attention/types';
|
|
20
|
-
import { type TreeData } from '@dxos/react-ui-list';
|
|
21
|
-
import { Expando, ManagedCollection } from '@dxos/schema';
|
|
22
|
-
import { type Label } from '@dxos/ui-types';
|
|
23
|
-
import { createFilename } from '@dxos/util';
|
|
24
|
-
|
|
25
|
-
import { meta } from './meta';
|
|
26
|
-
import { SPACE_TYPE, SpaceOperation } from './types';
|
|
27
|
-
|
|
28
|
-
//
|
|
29
|
-
// Constants
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
const CACHEABLE_PROPS: string[] = ['label', 'icon', 'role'];
|
|
33
|
-
const ACCEPT_ECHO_CLASS: Set<string> = new Set(['echo']);
|
|
34
|
-
|
|
35
|
-
/** Shared translation namespace descriptor. */
|
|
36
|
-
const META_NS: { ns: string } = { ns: meta.id };
|
|
37
|
-
|
|
38
|
-
/** Static label tuples (translation key + namespace). */
|
|
39
|
-
const PERSONAL_SPACE_LABEL: Label = ['personal space label', META_NS];
|
|
40
|
-
const UNNAMED_SPACE_LABEL: Label = ['unnamed space label', META_NS];
|
|
41
|
-
const SETTINGS_PANEL_LABEL: Label = ['settings panel label', META_NS];
|
|
42
|
-
const MIGRATE_SPACE_LABEL: Label = ['migrate space label', META_NS];
|
|
43
|
-
const CREATE_OBJECT_IN_SPACE_LABEL: Label = ['create object in space label', META_NS];
|
|
44
|
-
const RENAME_SPACE_LABEL: Label = ['rename space label', META_NS];
|
|
45
|
-
const ADD_VIEW_TO_SCHEMA_LABEL: Label = ['add view to schema label', META_NS];
|
|
46
|
-
const SNAPSHOT_BY_SCHEMA_LABEL: Label = ['snapshot by schema label', META_NS];
|
|
47
|
-
const CREATE_OBJECT_IN_COLLECTION_LABEL: Label = ['create object in collection label', META_NS];
|
|
48
|
-
const CREATE_OBJECT_IN_SYSTEM_COLLECTION_LABEL: Label = ['create object in system collection label', META_NS];
|
|
49
|
-
const COPY_LINK_LABEL: Label = ['copy link label', META_NS];
|
|
50
|
-
const EXPOSE_OBJECT_LABEL: Label = ['expose object label', META_NS];
|
|
51
|
-
|
|
52
|
-
/** Stable callback constants (no closed-over state). */
|
|
53
|
-
const CAN_DROP_FALSE = () => false;
|
|
54
|
-
const CAN_DROP_SPACE = (source: TreeData) => Obj.isObject(source.item.data) || isSpace(source.item.data);
|
|
55
|
-
const CAN_DROP_OBJECT = (source: TreeData) => Node.isGraphNode(source.item) && Obj.isObject(source.item.data);
|
|
56
|
-
|
|
57
|
-
export const SPACES = `${meta.id}-spaces`;
|
|
58
|
-
export const COMPOSER_SPACE_LOCK = `${meta.id}/lock`;
|
|
59
|
-
// TODO(wittjosiah): Remove.
|
|
60
|
-
export const SHARED = 'shared-spaces';
|
|
61
|
-
|
|
62
|
-
const SCHEMA_GRAPH_NODE_PARTIALS = {
|
|
63
|
-
role: 'branch',
|
|
64
|
-
canDrop: CAN_DROP_FALSE,
|
|
65
|
-
} as const;
|
|
66
|
-
|
|
67
|
-
const getSchemaGraphNodePartials = () => SCHEMA_GRAPH_NODE_PARTIALS;
|
|
68
|
-
|
|
69
|
-
//
|
|
70
|
-
// Caching Infrastructure
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
/** Creates a string-keyed memoized factory. Returns the same instance for the same key. */
|
|
74
|
-
// TODO(wittjosiah): Factor out as app-graph utility.
|
|
75
|
-
function createFactory<T>(create: (key: string) => T): (key: string) => T;
|
|
76
|
-
function createFactory<TArgs extends any[], T>(
|
|
77
|
-
create: (...args: TArgs) => T,
|
|
78
|
-
keyFn: (...args: TArgs) => string,
|
|
79
|
-
): (...args: TArgs) => T;
|
|
80
|
-
function createFactory<TArgs extends any[], T>(
|
|
81
|
-
create: (...args: TArgs) => T,
|
|
82
|
-
keyFn?: (...args: TArgs) => string,
|
|
83
|
-
): (...args: TArgs) => T {
|
|
84
|
-
const cache = new Map<string, T>();
|
|
85
|
-
return (...args: TArgs) => {
|
|
86
|
-
const key = keyFn ? keyFn(...args) : (args[0] as string);
|
|
87
|
-
if (cache.has(key)) {
|
|
88
|
-
return cache.get(key)!;
|
|
89
|
-
}
|
|
90
|
-
const value = create(...args);
|
|
91
|
-
cache.set(key, value);
|
|
92
|
-
return value;
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/** Stable Set instances keyed by spaceId. */
|
|
97
|
-
const getAcceptPersistenceKey = createFactory((spaceId: string) => new Set([spaceId]));
|
|
98
|
-
|
|
99
|
-
/** Caches for closures that capture ECHO objects, keyed by DXN/ID string. */
|
|
100
|
-
const rearrangeCache = new Map<string, (nextOrder: unknown[]) => void>();
|
|
101
|
-
const blockInstructionCache = new Map<string, (source: TreeData, instruction: Instruction) => boolean>();
|
|
102
|
-
const spaceRearrangeCache = new Map<string, (nextOrder: Space[]) => void>();
|
|
103
|
-
const collectionPartialsCache = new Map<string, ReturnType<typeof buildCollectionPartials>>();
|
|
104
|
-
const systemCollectionPartialsCache = new Map<
|
|
105
|
-
string,
|
|
106
|
-
{
|
|
107
|
-
label: Label;
|
|
108
|
-
icon?: string;
|
|
109
|
-
iconHue?: string;
|
|
110
|
-
acceptPersistenceClass: Set<string>;
|
|
111
|
-
acceptPersistenceKey: Set<string>;
|
|
112
|
-
role: string;
|
|
113
|
-
}
|
|
114
|
-
>();
|
|
115
|
-
const spaceActionsCache = new Map<
|
|
116
|
-
string,
|
|
117
|
-
{
|
|
118
|
-
state: SpaceState;
|
|
119
|
-
hasPendingMigration: boolean;
|
|
120
|
-
migrating: boolean;
|
|
121
|
-
actions: Node.NodeArg<Node.ActionData<Operation.Service>>[];
|
|
122
|
-
}
|
|
123
|
-
>();
|
|
124
|
-
|
|
125
|
-
/** Dynamic label tuples keyed by composite key string. */
|
|
126
|
-
const getDynamicLabel = createFactory(
|
|
127
|
-
(key: string, ns: string, extra?: Record<string, any>): Label => [key, { ns, ...extra }],
|
|
128
|
-
(key: string, ns: string, extra?: Record<string, any>) => `${key}\0${ns}${extra ? `\0${JSON.stringify(extra)}` : ''}`,
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
//
|
|
132
|
-
// Node Constructors
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Builds an app-graph node for a space (workspace), including settings children and optional rearrange handler.
|
|
137
|
-
*
|
|
138
|
-
* @param space - Space to wrap as a graph node.
|
|
139
|
-
* @param navigable - Whether the space node is navigable; affects disabled state.
|
|
140
|
-
* @param personal - Passed to display name resolution (e.g. "Personal space" fallback).
|
|
141
|
-
* @param namesCache - Optional cache of space id to display name.
|
|
142
|
-
* @param resolve - Metadata resolver for typename.
|
|
143
|
-
* @param graph - Optional expandable graph for sorting edges on rearrange.
|
|
144
|
-
* @param spacesOrder - Optional ECHO object holding workspace order; used with graph for persist on rearrange.
|
|
145
|
-
* @returns A graph node for the space.
|
|
146
|
-
*/
|
|
147
|
-
export const constructSpaceNode = ({
|
|
148
|
-
space,
|
|
149
|
-
navigable = false,
|
|
150
|
-
personal,
|
|
151
|
-
namesCache,
|
|
152
|
-
resolve,
|
|
153
|
-
graph,
|
|
154
|
-
spacesOrder,
|
|
155
|
-
}: {
|
|
156
|
-
space: Space;
|
|
157
|
-
navigable?: boolean;
|
|
158
|
-
personal?: boolean;
|
|
159
|
-
namesCache?: Record<string, string>;
|
|
160
|
-
resolve: (typename: string) => Record<string, any>;
|
|
161
|
-
/** Graph for sorting edges on rearrange. */
|
|
162
|
-
graph?: Graph.ExpandableGraph;
|
|
163
|
-
// TODO(wittjosiah): Should be Type.Expando but it doesn't work with the AtomQuery result type.
|
|
164
|
-
/** Spaces order object for persisting workspace order. */
|
|
165
|
-
spacesOrder?: Obj.Any;
|
|
166
|
-
}) => {
|
|
167
|
-
const hasPendingMigration = checkPendingMigration(space);
|
|
168
|
-
const collection =
|
|
169
|
-
space.state.get() === SpaceState.SPACE_READY && space.properties[Collection.Collection.typename]?.target;
|
|
170
|
-
const partials =
|
|
171
|
-
space.state.get() === SpaceState.SPACE_READY && Obj.instanceOf(Collection.Collection, collection)
|
|
172
|
-
? getCollectionGraphNodePartials({ collection, db: space.db, resolve })
|
|
173
|
-
: {};
|
|
174
|
-
|
|
175
|
-
let onRearrange: ((nextOrder: Space[]) => void) | undefined;
|
|
176
|
-
if (graph && spacesOrder) {
|
|
177
|
-
onRearrange = spaceRearrangeCache.get(space.id);
|
|
178
|
-
if (!onRearrange) {
|
|
179
|
-
onRearrange = (nextOrder: Space[]) => {
|
|
180
|
-
// NOTE: This is needed to ensure order is updated by next animation frame.
|
|
181
|
-
Graph.sortEdges(
|
|
182
|
-
graph,
|
|
183
|
-
Node.RootId,
|
|
184
|
-
'outbound',
|
|
185
|
-
nextOrder.map(({ id }) => id),
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
// Persist order to database.
|
|
189
|
-
Obj.change(spacesOrder, (mutableOrder: any) => {
|
|
190
|
-
mutableOrder.order = nextOrder.map(({ id }) => id);
|
|
191
|
-
});
|
|
192
|
-
};
|
|
193
|
-
spaceRearrangeCache.set(space.id, onRearrange);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return {
|
|
198
|
-
id: space.id,
|
|
199
|
-
type: SPACE_TYPE,
|
|
200
|
-
cacheable: CACHEABLE_PROPS,
|
|
201
|
-
data: space,
|
|
202
|
-
properties: {
|
|
203
|
-
...partials,
|
|
204
|
-
label: getSpaceDisplayName(space, { personal, namesCache }),
|
|
205
|
-
description: space.state.get() === SpaceState.SPACE_READY && space.properties.description,
|
|
206
|
-
hue: space.state.get() === SpaceState.SPACE_READY && space.properties.hue,
|
|
207
|
-
icon:
|
|
208
|
-
space.state.get() === SpaceState.SPACE_READY && space.properties.icon
|
|
209
|
-
? `ph--${space.properties.icon}--regular`
|
|
210
|
-
: undefined,
|
|
211
|
-
iconHue: space.state.get() === SpaceState.SPACE_READY && space.properties.iconHue,
|
|
212
|
-
disabled: !navigable || space.state.get() !== SpaceState.SPACE_READY || hasPendingMigration,
|
|
213
|
-
disposition: 'workspace',
|
|
214
|
-
testId: 'spacePlugin.space',
|
|
215
|
-
onRearrange,
|
|
216
|
-
// TODO(wittjosiah): Find a way to only allow space as source for rearranging.
|
|
217
|
-
canDrop: CAN_DROP_SPACE,
|
|
218
|
-
},
|
|
219
|
-
nodes: [
|
|
220
|
-
{
|
|
221
|
-
id: `settings${ATTENDABLE_PATH_SEPARATOR}${space.id}`,
|
|
222
|
-
type: `${meta.id}/settings`,
|
|
223
|
-
data: null,
|
|
224
|
-
properties: {
|
|
225
|
-
label: SETTINGS_PANEL_LABEL,
|
|
226
|
-
icon: 'ph--faders--regular',
|
|
227
|
-
disposition: 'alternate-tree',
|
|
228
|
-
},
|
|
229
|
-
},
|
|
230
|
-
],
|
|
231
|
-
};
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Builds an app-graph node for an ECHO object (collection, managed feed, schema, or generic object).
|
|
236
|
-
*
|
|
237
|
-
* @param db - Database for the object's space.
|
|
238
|
-
* @param object - ECHO object to wrap.
|
|
239
|
-
* @param disposition - Optional UI disposition.
|
|
240
|
-
* @param droppable - Whether the node accepts drops.
|
|
241
|
-
* @param navigable - Whether the node is navigable.
|
|
242
|
-
* @param managedCollectionChild - Whether the object is a managed collection child (affects blockInstruction).
|
|
243
|
-
* @param resolve - Metadata resolver for typename.
|
|
244
|
-
* @param parentCollection - Parent collection for rearranging objects.
|
|
245
|
-
* @returns A graph node or null if the object has no typename.
|
|
246
|
-
*/
|
|
247
|
-
export const createObjectNode = ({
|
|
248
|
-
db,
|
|
249
|
-
object,
|
|
250
|
-
disposition,
|
|
251
|
-
droppable = true,
|
|
252
|
-
navigable = false,
|
|
253
|
-
managedCollectionChild = false,
|
|
254
|
-
resolve,
|
|
255
|
-
parentCollection,
|
|
256
|
-
}: {
|
|
257
|
-
db: Database.Database;
|
|
258
|
-
object: Obj.Unknown;
|
|
259
|
-
disposition?: string;
|
|
260
|
-
droppable?: boolean;
|
|
261
|
-
navigable?: boolean;
|
|
262
|
-
managedCollectionChild?: boolean;
|
|
263
|
-
resolve: (typename: string) => Record<string, any>;
|
|
264
|
-
/** Parent collection for rearranging objects. */
|
|
265
|
-
parentCollection?: Collection.Collection;
|
|
266
|
-
}) => {
|
|
267
|
-
const type = Obj.getTypename(object);
|
|
268
|
-
if (!type) {
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// For feeds, use the kind property for metadata lookup instead of the generic Feed typename.
|
|
273
|
-
const metadataKey = Obj.instanceOf(Feed.Feed, object) ? (object.kind ?? type) : type;
|
|
274
|
-
const metadata = resolve(metadataKey);
|
|
275
|
-
const partials = Obj.instanceOf(Collection.Collection, object)
|
|
276
|
-
? getCollectionGraphNodePartials({ collection: object, db, resolve })
|
|
277
|
-
: Obj.instanceOf(ManagedCollection.ManagedCollection, object)
|
|
278
|
-
? getSystemCollectionNodePartials({ collection: object, db, resolve })
|
|
279
|
-
: Obj.instanceOf(Type.PersistentType, object)
|
|
280
|
-
? getSchemaGraphNodePartials()
|
|
281
|
-
: metadata.graphProps;
|
|
282
|
-
|
|
283
|
-
// TODO(wittjosiah): Obj.getLabel isn't triggering reactivity in some cases.
|
|
284
|
-
// e.g., create new collection with no name and rename it.
|
|
285
|
-
const label =
|
|
286
|
-
(object as any).name ||
|
|
287
|
-
Obj.getLabel(object) ||
|
|
288
|
-
// TODO(wittjosiah): Remove metadata labels.
|
|
289
|
-
metadata.label?.(object) ||
|
|
290
|
-
getDynamicLabel('object name placeholder', metadataKey, { default: 'New item' });
|
|
291
|
-
|
|
292
|
-
const selectable =
|
|
293
|
-
(!Obj.instanceOf(Type.PersistentType, object) &&
|
|
294
|
-
!Obj.instanceOf(ManagedCollection.ManagedCollection, object) &&
|
|
295
|
-
!Obj.instanceOf(Collection.Collection, object)) ||
|
|
296
|
-
(navigable && Obj.instanceOf(Collection.Collection, object));
|
|
297
|
-
|
|
298
|
-
let onRearrange: ((nextOrder: unknown[]) => void) | undefined;
|
|
299
|
-
if (parentCollection) {
|
|
300
|
-
const collectionId = Obj.getDXN(parentCollection).toString();
|
|
301
|
-
onRearrange = rearrangeCache.get(collectionId);
|
|
302
|
-
if (!onRearrange) {
|
|
303
|
-
onRearrange = (nextOrder: unknown[]) => {
|
|
304
|
-
Obj.change(parentCollection, (c) => {
|
|
305
|
-
c.objects = nextOrder.filter(Obj.isObject).map(Ref.make);
|
|
306
|
-
});
|
|
307
|
-
};
|
|
308
|
-
rearrangeCache.set(collectionId, onRearrange);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
const objectId = Obj.getDXN(object).toString();
|
|
313
|
-
const blockInstructionKey = `${objectId}:${managedCollectionChild}`;
|
|
314
|
-
let blockInstruction = blockInstructionCache.get(blockInstructionKey);
|
|
315
|
-
if (!blockInstruction) {
|
|
316
|
-
blockInstruction = (source: TreeData, instruction: Instruction) => {
|
|
317
|
-
if (source.item.properties.managedCollectionChild) {
|
|
318
|
-
return true;
|
|
319
|
-
}
|
|
320
|
-
if (Obj.instanceOf(ManagedCollection.ManagedCollection, object)) {
|
|
321
|
-
return !instruction.type.startsWith('reorder');
|
|
322
|
-
}
|
|
323
|
-
return managedCollectionChild;
|
|
324
|
-
};
|
|
325
|
-
blockInstructionCache.set(blockInstructionKey, blockInstruction);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
const canDrop = droppable ? CAN_DROP_OBJECT : CAN_DROP_FALSE;
|
|
329
|
-
|
|
330
|
-
return {
|
|
331
|
-
id: Obj.getDXN(object).toString(),
|
|
332
|
-
type,
|
|
333
|
-
cacheable: CACHEABLE_PROPS,
|
|
334
|
-
data: object,
|
|
335
|
-
properties: {
|
|
336
|
-
label,
|
|
337
|
-
icon: metadata.icon ?? 'ph--placeholder--regular',
|
|
338
|
-
iconHue: metadata.iconHue,
|
|
339
|
-
disposition,
|
|
340
|
-
testId: 'spacePlugin.object',
|
|
341
|
-
persistenceClass: 'echo',
|
|
342
|
-
persistenceKey: db.spaceId,
|
|
343
|
-
selectable,
|
|
344
|
-
managedCollectionChild,
|
|
345
|
-
onRearrange,
|
|
346
|
-
blockInstruction,
|
|
347
|
-
canDrop,
|
|
348
|
-
...partials,
|
|
349
|
-
},
|
|
350
|
-
};
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* Builds a static schema node for the app graph.
|
|
355
|
-
*
|
|
356
|
-
* @param schema - ECHO schema entity.
|
|
357
|
-
* @param space - Space that owns the schema.
|
|
358
|
-
* @returns A graph node for the schema.
|
|
359
|
-
*/
|
|
360
|
-
export const createStaticSchemaNode = ({ schema, space }: { schema: Type.AnyEntity; space: Space }): Node.Node => {
|
|
361
|
-
return {
|
|
362
|
-
id: `${space.id}/${Type.getTypename(schema)}`,
|
|
363
|
-
type: `${meta.id}/static-schema`,
|
|
364
|
-
data: schema,
|
|
365
|
-
properties: {
|
|
366
|
-
label: getDynamicLabel('typename label', Type.getTypename(schema), {
|
|
367
|
-
count: 2,
|
|
368
|
-
default: Type.getTypename(schema),
|
|
369
|
-
}),
|
|
370
|
-
icon: 'ph--database--regular',
|
|
371
|
-
iconHue: 'green',
|
|
372
|
-
role: 'branch',
|
|
373
|
-
selectable: false,
|
|
374
|
-
canDrop: CAN_DROP_FALSE,
|
|
375
|
-
space,
|
|
376
|
-
},
|
|
377
|
-
};
|
|
378
|
-
};
|
|
379
|
-
|
|
380
|
-
//
|
|
381
|
-
// Action Constructors
|
|
382
|
-
//
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Builds the action list for a space node (migrate, create object, rename).
|
|
386
|
-
* Results are cached by space id and state flags.
|
|
387
|
-
*
|
|
388
|
-
* @param space - Space to build actions for.
|
|
389
|
-
* @param migrating - When true, treats the space as currently migrating (disables migrate action).
|
|
390
|
-
* @returns Array of graph action descriptors for the space.
|
|
391
|
-
*/
|
|
392
|
-
export const constructSpaceActions = ({ space, migrating }: { space: Space; migrating?: boolean }) => {
|
|
393
|
-
const state = space.state.get();
|
|
394
|
-
const hasPendingMigration = checkPendingMigration(space);
|
|
395
|
-
const isMigrating = migrating || Migrations.running(space);
|
|
396
|
-
|
|
397
|
-
const cached = spaceActionsCache.get(space.id);
|
|
398
|
-
if (
|
|
399
|
-
cached &&
|
|
400
|
-
cached.state === state &&
|
|
401
|
-
cached.hasPendingMigration === hasPendingMigration &&
|
|
402
|
-
cached.migrating === isMigrating
|
|
403
|
-
) {
|
|
404
|
-
return cached.actions;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
const getId = (id: string) => `${id}/${space.id}`;
|
|
408
|
-
const actions: Node.NodeArg<Node.ActionData<Operation.Service>>[] = [];
|
|
409
|
-
|
|
410
|
-
if (hasPendingMigration) {
|
|
411
|
-
actions.push({
|
|
412
|
-
id: getId(SpaceOperation.Migrate.meta.key),
|
|
413
|
-
type: Node.ActionGroupType,
|
|
414
|
-
data: () => Operation.invoke(SpaceOperation.Migrate, { space }),
|
|
415
|
-
properties: {
|
|
416
|
-
label: MIGRATE_SPACE_LABEL,
|
|
417
|
-
icon: 'ph--database--regular',
|
|
418
|
-
disposition: 'list-item-primary',
|
|
419
|
-
disabled: isMigrating,
|
|
420
|
-
},
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if (state === SpaceState.SPACE_READY && !hasPendingMigration) {
|
|
425
|
-
actions.push(
|
|
426
|
-
{
|
|
427
|
-
id: getId(SpaceOperation.OpenCreateObject.meta.key),
|
|
428
|
-
type: Node.ActionType,
|
|
429
|
-
data: () => Operation.invoke(SpaceOperation.OpenCreateObject, { target: space.db }),
|
|
430
|
-
properties: {
|
|
431
|
-
label: CREATE_OBJECT_IN_SPACE_LABEL,
|
|
432
|
-
icon: 'ph--plus--regular',
|
|
433
|
-
disposition: 'list-item-primary',
|
|
434
|
-
testId: 'spacePlugin.createObject',
|
|
435
|
-
},
|
|
436
|
-
},
|
|
437
|
-
{
|
|
438
|
-
id: getId(SpaceOperation.Rename.meta.key),
|
|
439
|
-
type: Node.ActionType,
|
|
440
|
-
data: (params?: Node.InvokeProps) => Operation.invoke(SpaceOperation.Rename, { space, caller: params?.caller }),
|
|
441
|
-
properties: {
|
|
442
|
-
label: RENAME_SPACE_LABEL,
|
|
443
|
-
icon: 'ph--pencil-simple-line--regular',
|
|
444
|
-
keyBinding: {
|
|
445
|
-
macos: 'shift+F6',
|
|
446
|
-
windows: 'shift+F6',
|
|
447
|
-
},
|
|
448
|
-
},
|
|
449
|
-
},
|
|
450
|
-
);
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
spaceActionsCache.set(space.id, { state, hasPendingMigration, migrating: isMigrating, actions });
|
|
454
|
-
return actions;
|
|
455
|
-
};
|
|
456
|
-
|
|
457
|
-
/**
|
|
458
|
-
* Builds the action list for a static schema node (add view, rename, delete, snapshot).
|
|
459
|
-
*
|
|
460
|
-
* @param schema - ECHO schema entity (e.g. static record type).
|
|
461
|
-
* @param space - Space that owns the schema.
|
|
462
|
-
* @param deletable - Whether the delete/snapshot actions are enabled.
|
|
463
|
-
* @returns Array of graph action descriptors for the schema.
|
|
464
|
-
*/
|
|
465
|
-
export const createStaticSchemaActions = ({
|
|
466
|
-
schema,
|
|
467
|
-
space,
|
|
468
|
-
deletable,
|
|
469
|
-
}: {
|
|
470
|
-
schema: Type.AnyObj;
|
|
471
|
-
space: Space;
|
|
472
|
-
deletable: boolean;
|
|
473
|
-
}) => {
|
|
474
|
-
const getId = (id: string) => `${space.id}/${Type.getTypename(schema)}/${id}`;
|
|
475
|
-
|
|
476
|
-
const actions: Node.NodeArg<Node.ActionData<Operation.Service>>[] = [
|
|
477
|
-
{
|
|
478
|
-
id: getId(SpaceOperation.AddObject.meta.key),
|
|
479
|
-
type: Node.ActionType,
|
|
480
|
-
data: () =>
|
|
481
|
-
Operation.invoke(SpaceOperation.OpenCreateObject, {
|
|
482
|
-
target: space.db,
|
|
483
|
-
views: true,
|
|
484
|
-
initialFormValues: { typename: Type.getTypename(schema) },
|
|
485
|
-
}),
|
|
486
|
-
properties: {
|
|
487
|
-
label: ADD_VIEW_TO_SCHEMA_LABEL,
|
|
488
|
-
icon: 'ph--plus--regular',
|
|
489
|
-
disposition: 'list-item-primary',
|
|
490
|
-
testId: 'spacePlugin.addViewToSchema',
|
|
491
|
-
},
|
|
492
|
-
},
|
|
493
|
-
{
|
|
494
|
-
id: getId(SpaceOperation.RenameObject.meta.key),
|
|
495
|
-
type: Node.ActionType,
|
|
496
|
-
data: () => Effect.fail(new Error('Not implemented')),
|
|
497
|
-
properties: {
|
|
498
|
-
label: getDynamicLabel('rename object label', Type.getTypename(Type.PersistentType)),
|
|
499
|
-
icon: 'ph--pencil-simple-line--regular',
|
|
500
|
-
disabled: true,
|
|
501
|
-
disposition: 'list-item',
|
|
502
|
-
testId: 'spacePlugin.renameObject',
|
|
503
|
-
},
|
|
504
|
-
},
|
|
505
|
-
{
|
|
506
|
-
id: getId(SpaceOperation.RemoveObjects.meta.key),
|
|
507
|
-
type: Node.ActionType,
|
|
508
|
-
data: () =>
|
|
509
|
-
Effect.sync(() => {
|
|
510
|
-
const index = space.properties.staticRecords.findIndex(
|
|
511
|
-
(typename: string) => typename === Type.getTypename(schema),
|
|
512
|
-
);
|
|
513
|
-
if (index > -1) {
|
|
514
|
-
Obj.change(space.properties, (p) => {
|
|
515
|
-
p.staticRecords.splice(index, 1);
|
|
516
|
-
});
|
|
517
|
-
}
|
|
518
|
-
}),
|
|
519
|
-
properties: {
|
|
520
|
-
label: getDynamicLabel('delete object label', Type.getTypename(Type.PersistentType)),
|
|
521
|
-
icon: 'ph--trash--regular',
|
|
522
|
-
disposition: 'list-item',
|
|
523
|
-
disabled: !deletable,
|
|
524
|
-
testId: 'spacePlugin.deleteObject',
|
|
525
|
-
},
|
|
526
|
-
},
|
|
527
|
-
{
|
|
528
|
-
id: getId(SpaceOperation.Snapshot.meta.key),
|
|
529
|
-
type: Node.ActionType,
|
|
530
|
-
data: Effect.fnUntraced(function* () {
|
|
531
|
-
const result = yield* Operation.invoke(SpaceOperation.Snapshot, {
|
|
532
|
-
db: space.db,
|
|
533
|
-
query: Query.select(Filter.type(schema)).ast,
|
|
534
|
-
});
|
|
535
|
-
if (result.snapshot) {
|
|
536
|
-
yield* Effect.tryPromise(() =>
|
|
537
|
-
downloadBlob(result.snapshot, createFilename({ parts: [space.id, Type.getTypename(schema)], ext: 'json' })),
|
|
538
|
-
);
|
|
539
|
-
}
|
|
540
|
-
}),
|
|
541
|
-
properties: {
|
|
542
|
-
label: SNAPSHOT_BY_SCHEMA_LABEL,
|
|
543
|
-
icon: 'ph--camera--regular',
|
|
544
|
-
disposition: 'list-item',
|
|
545
|
-
},
|
|
546
|
-
},
|
|
547
|
-
];
|
|
548
|
-
|
|
549
|
-
return actions;
|
|
550
|
-
};
|
|
551
|
-
|
|
552
|
-
/**
|
|
553
|
-
* Builds the action list for an ECHO object node (create, rename, delete, copy link, etc.).
|
|
554
|
-
*
|
|
555
|
-
* @param object - ECHO object to build actions for.
|
|
556
|
-
* @param graph - Readable app graph (used for action wiring).
|
|
557
|
-
* @param resolve - Metadata resolver for typename.
|
|
558
|
-
* @param capabilities - Capability manager for feature checks.
|
|
559
|
-
* @param shareableLinkOrigin - Origin URL for shareable links.
|
|
560
|
-
* @param deletable - Whether delete action is included. Defaults to true.
|
|
561
|
-
* @param navigable - Whether the object is navigable (affects available actions). Defaults to false.
|
|
562
|
-
* @returns Array of graph action descriptors for the object.
|
|
563
|
-
*/
|
|
564
|
-
export const constructObjectActions = ({
|
|
565
|
-
object,
|
|
566
|
-
graph,
|
|
567
|
-
resolve,
|
|
568
|
-
capabilities,
|
|
569
|
-
deletable = true,
|
|
570
|
-
navigable = false,
|
|
571
|
-
shareableLinkOrigin,
|
|
572
|
-
}: {
|
|
573
|
-
object: Obj.Unknown;
|
|
574
|
-
graph: Graph.ReadableGraph;
|
|
575
|
-
resolve: (typename: string) => Record<string, any>;
|
|
576
|
-
capabilities: CapabilityManager.CapabilityManager;
|
|
577
|
-
shareableLinkOrigin: string;
|
|
578
|
-
deletable?: boolean;
|
|
579
|
-
navigable?: boolean;
|
|
580
|
-
}) => {
|
|
581
|
-
const db = Obj.getDatabase(object);
|
|
582
|
-
invariant(db, 'Database not found');
|
|
583
|
-
const typename = Obj.getTypename(object);
|
|
584
|
-
invariant(typename, 'Object has no typename');
|
|
585
|
-
|
|
586
|
-
const getId = (id: string) => `${id}/${Obj.getDXN(object).toString()}`;
|
|
587
|
-
|
|
588
|
-
const metadataKey = Match.value(object).pipe(
|
|
589
|
-
Match.when(Obj.instanceOf(Feed.Feed), (feed: Feed.Feed) => feed.kind ?? Obj.getTypename(feed)!),
|
|
590
|
-
Match.when(Obj.instanceOf(ManagedCollection.ManagedCollection), (managed) => {
|
|
591
|
-
const [, feedKind] = managed.key.split('~') ?? [];
|
|
592
|
-
return feedKind ?? managed.key;
|
|
593
|
-
}),
|
|
594
|
-
Match.orElse((obj) => Obj.getTypename(obj)!),
|
|
595
|
-
);
|
|
596
|
-
const managedCollection = Option.some(object).pipe(
|
|
597
|
-
Option.filter(Obj.instanceOf(ManagedCollection.ManagedCollection)),
|
|
598
|
-
Option.getOrUndefined,
|
|
599
|
-
);
|
|
600
|
-
const metadata = metadataKey ? resolve(metadataKey) : {};
|
|
601
|
-
const createObject = metadata.createObject;
|
|
602
|
-
const inputSchema = metadata.inputSchema;
|
|
603
|
-
|
|
604
|
-
const actions: Node.NodeArg<Node.ActionData<Operation.Service>>[] = [
|
|
605
|
-
...(Obj.instanceOf(Collection.Collection, object)
|
|
606
|
-
? [
|
|
607
|
-
{
|
|
608
|
-
id: getId(SpaceOperation.OpenCreateObject.meta.key),
|
|
609
|
-
type: Node.ActionType,
|
|
610
|
-
data: () => Operation.invoke(SpaceOperation.OpenCreateObject, { target: object }),
|
|
611
|
-
properties: {
|
|
612
|
-
label: CREATE_OBJECT_IN_COLLECTION_LABEL,
|
|
613
|
-
icon: 'ph--plus--regular',
|
|
614
|
-
disposition: 'list-item-primary',
|
|
615
|
-
testId: 'spacePlugin.createObject',
|
|
616
|
-
},
|
|
617
|
-
},
|
|
618
|
-
]
|
|
619
|
-
: []),
|
|
620
|
-
...(Obj.instanceOf(Type.PersistentType, object)
|
|
621
|
-
? [
|
|
622
|
-
{
|
|
623
|
-
id: getId(SpaceOperation.AddObject.meta.key),
|
|
624
|
-
type: Node.ActionType,
|
|
625
|
-
data: () =>
|
|
626
|
-
Operation.invoke(SpaceOperation.OpenCreateObject, {
|
|
627
|
-
target: db,
|
|
628
|
-
views: true,
|
|
629
|
-
initialFormValues: { typename: object.typename },
|
|
630
|
-
}),
|
|
631
|
-
properties: {
|
|
632
|
-
label: ADD_VIEW_TO_SCHEMA_LABEL,
|
|
633
|
-
icon: 'ph--plus--regular',
|
|
634
|
-
disposition: 'list-item-primary',
|
|
635
|
-
testId: 'spacePlugin.addViewToSchema',
|
|
636
|
-
},
|
|
637
|
-
},
|
|
638
|
-
{
|
|
639
|
-
id: getId(SpaceOperation.Snapshot.meta.key),
|
|
640
|
-
type: Node.ActionType,
|
|
641
|
-
data: Effect.fnUntraced(function* () {
|
|
642
|
-
const result = yield* Operation.invoke(SpaceOperation.Snapshot, {
|
|
643
|
-
db,
|
|
644
|
-
query: Query.select(Filter.type(JsonSchema.toEffectSchema(object.jsonSchema))).ast,
|
|
645
|
-
});
|
|
646
|
-
if (result.snapshot) {
|
|
647
|
-
yield* Effect.promise(() =>
|
|
648
|
-
downloadBlob(result.snapshot, createFilename({ parts: [db.spaceId, object.typename], ext: 'json' })),
|
|
649
|
-
);
|
|
650
|
-
}
|
|
651
|
-
}),
|
|
652
|
-
properties: {
|
|
653
|
-
label: SNAPSHOT_BY_SCHEMA_LABEL,
|
|
654
|
-
icon: 'ph--camera--regular',
|
|
655
|
-
disposition: 'list-item',
|
|
656
|
-
},
|
|
657
|
-
},
|
|
658
|
-
]
|
|
659
|
-
: []),
|
|
660
|
-
...(createObject && managedCollection
|
|
661
|
-
? [
|
|
662
|
-
{
|
|
663
|
-
id: getId(SpaceOperation.OpenCreateObject.meta.key),
|
|
664
|
-
type: Node.ActionType,
|
|
665
|
-
data: Effect.fnUntraced(function* () {
|
|
666
|
-
if (inputSchema) {
|
|
667
|
-
yield* Operation.invoke(SpaceOperation.OpenCreateObject, {
|
|
668
|
-
target: db,
|
|
669
|
-
typename: managedCollection ? metadataKey : undefined,
|
|
670
|
-
});
|
|
671
|
-
} else {
|
|
672
|
-
const createdObject = yield* createObject({}, { db, capabilities }) as Effect.Effect<
|
|
673
|
-
Obj.Unknown,
|
|
674
|
-
Error,
|
|
675
|
-
never
|
|
676
|
-
>;
|
|
677
|
-
const addResult = yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
678
|
-
target: db,
|
|
679
|
-
hidden: true,
|
|
680
|
-
object: createdObject,
|
|
681
|
-
});
|
|
682
|
-
if (addResult.id) {
|
|
683
|
-
yield* Operation.invoke(LayoutOperation.Open, { subject: [addResult.id] });
|
|
684
|
-
}
|
|
685
|
-
}
|
|
686
|
-
}),
|
|
687
|
-
properties: {
|
|
688
|
-
label: CREATE_OBJECT_IN_SYSTEM_COLLECTION_LABEL,
|
|
689
|
-
icon: 'ph--plus--regular',
|
|
690
|
-
disposition: 'list-item-primary',
|
|
691
|
-
testId: 'spacePlugin.createObject',
|
|
692
|
-
},
|
|
693
|
-
},
|
|
694
|
-
]
|
|
695
|
-
: []),
|
|
696
|
-
...(managedCollection
|
|
697
|
-
? []
|
|
698
|
-
: [
|
|
699
|
-
{
|
|
700
|
-
id: getId(SpaceOperation.RenameObject.meta.key),
|
|
701
|
-
type: Node.ActionType,
|
|
702
|
-
data: (params?: Node.InvokeProps) =>
|
|
703
|
-
Operation.invoke(SpaceOperation.RenameObject, { object, caller: params?.caller }),
|
|
704
|
-
properties: {
|
|
705
|
-
label: getDynamicLabel('rename object label', metadataKey),
|
|
706
|
-
icon: 'ph--pencil-simple-line--regular',
|
|
707
|
-
disposition: 'list-item',
|
|
708
|
-
// TODO(wittjosiah): Not working.
|
|
709
|
-
// keyBinding: {
|
|
710
|
-
// macos: 'shift+F6',
|
|
711
|
-
// },
|
|
712
|
-
testId: 'spacePlugin.renameObject',
|
|
713
|
-
},
|
|
714
|
-
},
|
|
715
|
-
{
|
|
716
|
-
id: getId(SpaceOperation.RemoveObjects.meta.key),
|
|
717
|
-
type: Node.ActionType,
|
|
718
|
-
data: Effect.fnUntraced(function* () {
|
|
719
|
-
const collection = Graph.getConnections(
|
|
720
|
-
graph,
|
|
721
|
-
Obj.getDXN(object).toString(),
|
|
722
|
-
Node.childRelation('inbound'),
|
|
723
|
-
).find((node: Node.Node): node is Node.Node<Collection.Collection> =>
|
|
724
|
-
Obj.instanceOf(Collection.Collection, node.data),
|
|
725
|
-
)?.data;
|
|
726
|
-
yield* Operation.invoke(SpaceOperation.RemoveObjects, { objects: [object], target: collection });
|
|
727
|
-
}),
|
|
728
|
-
properties: {
|
|
729
|
-
label: getDynamicLabel('delete object label', metadataKey),
|
|
730
|
-
icon: 'ph--trash--regular',
|
|
731
|
-
disposition: 'list-item',
|
|
732
|
-
disabled: !deletable,
|
|
733
|
-
// TODO(wittjosiah): This is a browser shortcut.
|
|
734
|
-
// keyBinding: object instanceof CollectionType ? undefined : 'shift+meta+Backspace',
|
|
735
|
-
testId: 'spacePlugin.deleteObject',
|
|
736
|
-
},
|
|
737
|
-
},
|
|
738
|
-
]),
|
|
739
|
-
...(navigable ||
|
|
740
|
-
(!Obj.instanceOf(Collection.Collection, object) &&
|
|
741
|
-
!Obj.instanceOf(ManagedCollection.ManagedCollection, object) &&
|
|
742
|
-
!Obj.instanceOf(Type.PersistentType, object))
|
|
743
|
-
? [
|
|
744
|
-
{
|
|
745
|
-
id: getId('copy-link'),
|
|
746
|
-
type: Node.ActionType,
|
|
747
|
-
data: () =>
|
|
748
|
-
Effect.promise(async () => {
|
|
749
|
-
const url = `${shareableLinkOrigin}/${db.spaceId}/${Obj.getDXN(object).toString()}`;
|
|
750
|
-
await navigator.clipboard.writeText(url);
|
|
751
|
-
}),
|
|
752
|
-
properties: {
|
|
753
|
-
label: COPY_LINK_LABEL,
|
|
754
|
-
icon: 'ph--link--regular',
|
|
755
|
-
disposition: 'list-item',
|
|
756
|
-
testId: 'spacePlugin.copyLink',
|
|
757
|
-
},
|
|
758
|
-
},
|
|
759
|
-
]
|
|
760
|
-
: []),
|
|
761
|
-
// TODO(wittjosiah): Factor out and apply to all nodes.
|
|
762
|
-
{
|
|
763
|
-
id: getId(LayoutOperation.Expose.meta.key),
|
|
764
|
-
type: Node.ActionType,
|
|
765
|
-
data: () => Operation.invoke(LayoutOperation.Expose, { subject: Obj.getDXN(object).toString() }),
|
|
766
|
-
properties: {
|
|
767
|
-
label: EXPOSE_OBJECT_LABEL,
|
|
768
|
-
icon: 'ph--eye--regular',
|
|
769
|
-
disposition: 'heading-list-item',
|
|
770
|
-
testId: 'spacePlugin.exposeObject',
|
|
771
|
-
},
|
|
772
|
-
},
|
|
773
|
-
];
|
|
774
|
-
|
|
775
|
-
return actions;
|
|
776
|
-
};
|
|
777
|
-
|
|
778
|
-
//
|
|
779
|
-
// Helpers
|
|
780
|
-
//
|
|
781
|
-
|
|
782
|
-
const checkPendingMigration = (space: Space) => {
|
|
783
|
-
return (
|
|
784
|
-
space.state.get() === SpaceState.SPACE_REQUIRES_MIGRATION ||
|
|
785
|
-
(space.state.get() === SpaceState.SPACE_READY &&
|
|
786
|
-
!!Migrations.versionProperty &&
|
|
787
|
-
space.properties[Migrations.versionProperty] !== Migrations.targetVersion)
|
|
788
|
-
);
|
|
789
|
-
};
|
|
790
|
-
|
|
791
|
-
/**
|
|
792
|
-
* Returns the display label for a space (name, namesCache entry, or fallback).
|
|
793
|
-
*
|
|
794
|
-
* @param space - Space to label.
|
|
795
|
-
* @param options.personal - If true, use personal-space fallback when unnamed.
|
|
796
|
-
* @param options.namesCache - Optional cache of space id to display name.
|
|
797
|
-
* @returns Label tuple (translation key or string, and namespace).
|
|
798
|
-
*/
|
|
799
|
-
// TODO(wittjosiah): Factor out? Exposer via capability?
|
|
800
|
-
export const getSpaceDisplayName = (
|
|
801
|
-
space: Space,
|
|
802
|
-
{ personal, namesCache = {} }: { personal?: boolean; namesCache?: Record<string, string> } = {},
|
|
803
|
-
): Label => {
|
|
804
|
-
return space.state.get() === SpaceState.SPACE_READY && (space.properties.name?.length ?? 0) > 0
|
|
805
|
-
? space.properties.name!
|
|
806
|
-
: namesCache[space.id]
|
|
807
|
-
? namesCache[space.id]
|
|
808
|
-
: personal
|
|
809
|
-
? PERSONAL_SPACE_LABEL
|
|
810
|
-
: UNNAMED_SPACE_LABEL;
|
|
811
|
-
};
|
|
812
|
-
|
|
813
|
-
// TODO(wittjosiah): Factor out.
|
|
814
|
-
const downloadBlob = async (blob: Blob, filename: string) => {
|
|
815
|
-
const url = URL.createObjectURL(blob);
|
|
816
|
-
const a = document.createElement('a');
|
|
817
|
-
a.href = url;
|
|
818
|
-
a.download = filename;
|
|
819
|
-
|
|
820
|
-
document.body.appendChild(a);
|
|
821
|
-
a.click();
|
|
822
|
-
|
|
823
|
-
document.body.removeChild(a);
|
|
824
|
-
URL.revokeObjectURL(url);
|
|
825
|
-
};
|
|
826
|
-
|
|
827
|
-
const buildCollectionPartials = (
|
|
828
|
-
collection: Collection.Collection,
|
|
829
|
-
db: Database.Database,
|
|
830
|
-
resolve: (typename: string) => Record<string, any>,
|
|
831
|
-
) => ({
|
|
832
|
-
acceptPersistenceClass: ACCEPT_ECHO_CLASS,
|
|
833
|
-
acceptPersistenceKey: getAcceptPersistenceKey(db.spaceId),
|
|
834
|
-
role: 'branch' as const,
|
|
835
|
-
onTransferStart: (child: Node.Node<Obj.Unknown>, index?: number) => {
|
|
836
|
-
Obj.change(collection, (c) => {
|
|
837
|
-
if (!c.objects.find((object) => object.target === child.data)) {
|
|
838
|
-
if (typeof index !== 'undefined') {
|
|
839
|
-
c.objects.splice(index, 0, Ref.make(child.data));
|
|
840
|
-
} else {
|
|
841
|
-
c.objects.push(Ref.make(child.data));
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
});
|
|
845
|
-
},
|
|
846
|
-
onTransferEnd: (child: Node.Node<Obj.Unknown>, _destination: Node.Node) => {
|
|
847
|
-
Obj.change(collection, (c) => {
|
|
848
|
-
const index = c.objects.findIndex((object) => object.target === child.data);
|
|
849
|
-
if (index > -1) {
|
|
850
|
-
c.objects.splice(index, 1);
|
|
851
|
-
}
|
|
852
|
-
});
|
|
853
|
-
},
|
|
854
|
-
onCopy: async (child: Node.Node<Obj.Unknown>, index?: number) => {
|
|
855
|
-
const newObject = await cloneObject(child.data, resolve, db);
|
|
856
|
-
db.add(newObject);
|
|
857
|
-
Obj.change(collection, (c) => {
|
|
858
|
-
if (typeof index !== 'undefined') {
|
|
859
|
-
c.objects.splice(index, 0, Ref.make(newObject));
|
|
860
|
-
} else {
|
|
861
|
-
c.objects.push(Ref.make(newObject));
|
|
862
|
-
}
|
|
863
|
-
});
|
|
864
|
-
},
|
|
865
|
-
});
|
|
866
|
-
|
|
867
|
-
const getCollectionGraphNodePartials = ({
|
|
868
|
-
collection,
|
|
869
|
-
db,
|
|
870
|
-
resolve,
|
|
871
|
-
}: {
|
|
872
|
-
collection: Collection.Collection;
|
|
873
|
-
db: Database.Database;
|
|
874
|
-
resolve: (typename: string) => Record<string, any>;
|
|
875
|
-
}) => {
|
|
876
|
-
const id = Obj.getDXN(collection).toString();
|
|
877
|
-
let cached = collectionPartialsCache.get(id);
|
|
878
|
-
if (!cached) {
|
|
879
|
-
cached = buildCollectionPartials(collection, db, resolve);
|
|
880
|
-
collectionPartialsCache.set(id, cached);
|
|
881
|
-
}
|
|
882
|
-
return cached;
|
|
883
|
-
};
|
|
884
|
-
|
|
885
|
-
const getSystemCollectionNodePartials = ({
|
|
886
|
-
collection,
|
|
887
|
-
db,
|
|
888
|
-
resolve,
|
|
889
|
-
}: {
|
|
890
|
-
collection: ManagedCollection.ManagedCollection;
|
|
891
|
-
db: Database.Database;
|
|
892
|
-
resolve: (typename: string) => Record<string, any>;
|
|
893
|
-
}) => {
|
|
894
|
-
const cacheKey = `${db.spaceId}:${collection.key}`;
|
|
895
|
-
let cached = systemCollectionPartialsCache.get(cacheKey);
|
|
896
|
-
if (!cached) {
|
|
897
|
-
const [, feedKind] = collection.key.split('~');
|
|
898
|
-
const metadataKey = feedKind ?? collection.key;
|
|
899
|
-
const metadata = resolve(metadataKey);
|
|
900
|
-
cached = {
|
|
901
|
-
label: getDynamicLabel('typename label', metadataKey, { count: 2 }),
|
|
902
|
-
icon: metadata.icon,
|
|
903
|
-
iconHue: metadata.iconHue,
|
|
904
|
-
acceptPersistenceClass: ACCEPT_ECHO_CLASS,
|
|
905
|
-
acceptPersistenceKey: getAcceptPersistenceKey(db.spaceId),
|
|
906
|
-
role: 'branch',
|
|
907
|
-
};
|
|
908
|
-
systemCollectionPartialsCache.set(cacheKey, cached);
|
|
909
|
-
}
|
|
910
|
-
return cached;
|
|
911
|
-
};
|
|
912
|
-
|
|
913
|
-
//
|
|
914
|
-
// Deprecated
|
|
915
|
-
//
|
|
916
|
-
|
|
917
|
-
/**
|
|
918
|
-
* @deprecated This is a temporary solution.
|
|
919
|
-
*/
|
|
920
|
-
export const getNestedObjects = async (
|
|
921
|
-
object: Obj.Unknown,
|
|
922
|
-
resolve: (typename: string) => Record<string, any>,
|
|
923
|
-
): Promise<Obj.Unknown[]> => {
|
|
924
|
-
const type = Obj.getTypename(object);
|
|
925
|
-
if (!type) {
|
|
926
|
-
return [];
|
|
927
|
-
}
|
|
928
|
-
|
|
929
|
-
const metadata = resolve(type);
|
|
930
|
-
const loadReferences = metadata?.loadReferences;
|
|
931
|
-
if (typeof loadReferences !== 'function') {
|
|
932
|
-
return [];
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
const objects: Obj.Unknown[] = await loadReferences(object);
|
|
936
|
-
const nested = await Promise.all(objects.map((object) => getNestedObjects(object, resolve)));
|
|
937
|
-
return [...objects, ...nested.flat()];
|
|
938
|
-
};
|
|
939
|
-
|
|
940
|
-
/**
|
|
941
|
-
* @deprecated Workaround for ECHO not supporting clone.
|
|
942
|
-
*/
|
|
943
|
-
// TODO(burdon): Remove.
|
|
944
|
-
export const cloneObject = async (
|
|
945
|
-
object: Obj.Unknown,
|
|
946
|
-
resolve: (typename: string) => Record<string, any>,
|
|
947
|
-
newDb: Database.Database,
|
|
948
|
-
): Promise<Obj.Unknown> => {
|
|
949
|
-
const schema = Obj.getSchema(object);
|
|
950
|
-
const typename = schema ? (Type.getTypename(schema) ?? Expando.Expando.typename) : Expando.Expando.typename;
|
|
951
|
-
const metadata = resolve(typename);
|
|
952
|
-
const serializer = metadata.serializer;
|
|
953
|
-
invariant(serializer, `No serializer for type: ${typename}`);
|
|
954
|
-
const content = await serializer.serialize({ object });
|
|
955
|
-
return serializer.deserialize({ content, db: newDb, newId: true });
|
|
956
|
-
};
|