@dxos/plugin-space 0.10.0 → 0.11.1
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/PLUGIN.mdl +11 -0
- package/dist/lib/SpacePlugin.mjs +2 -0
- package/dist/lib/SpacePlugin.node.mjs +628 -0
- package/dist/lib/SpacePlugin.node.mjs.map +1 -0
- package/dist/lib/SpacePlugin.workerd.mjs +26 -0
- package/dist/lib/SpacePlugin.workerd.mjs.map +1 -0
- package/dist/lib/capabilities/node.mjs +10 -0
- package/dist/lib/capabilities/node.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +24 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-CollectionArticle.mjs +90 -0
- package/dist/lib/chunk-CollectionArticle.mjs.map +1 -0
- package/dist/lib/chunk-CollectionSection.mjs +21 -0
- package/dist/lib/chunk-CollectionSection.mjs.map +1 -0
- package/dist/lib/chunk-CreateObjectDialog.mjs +178 -0
- package/dist/lib/chunk-CreateObjectDialog.mjs.map +1 -0
- package/dist/lib/chunk-CreateSpaceDialog.mjs +68 -0
- package/dist/lib/chunk-CreateSpaceDialog.mjs.map +1 -0
- package/dist/lib/chunk-DefaultProperties.mjs +59 -0
- package/dist/lib/chunk-DefaultProperties.mjs.map +1 -0
- package/dist/lib/chunk-ImportSpaceDialog.mjs +58 -0
- package/dist/lib/chunk-ImportSpaceDialog.mjs.map +1 -0
- package/dist/lib/chunk-InlineSyncStatus.mjs +37 -0
- package/dist/lib/chunk-InlineSyncStatus.mjs.map +1 -0
- package/dist/lib/chunk-JoinDialog.mjs +65 -0
- package/dist/lib/chunk-JoinDialog.mjs.map +1 -0
- package/dist/lib/chunk-MembersContainer.mjs +263 -0
- package/dist/lib/chunk-MembersContainer.mjs.map +1 -0
- package/dist/lib/chunk-MergePreview.mjs +91 -0
- package/dist/lib/chunk-MergePreview.mjs.map +1 -0
- package/dist/lib/chunk-ObjectCardStack.mjs +68 -0
- package/dist/lib/chunk-ObjectCardStack.mjs.map +1 -0
- package/dist/lib/chunk-RecordArticle.mjs +106 -0
- package/dist/lib/chunk-RecordArticle.mjs.map +1 -0
- package/dist/lib/chunk-RelatedArticle.mjs +71 -0
- package/dist/lib/chunk-RelatedArticle.mjs.map +1 -0
- package/dist/lib/chunk-RenamePopover.mjs +94 -0
- package/dist/lib/chunk-RenamePopover.mjs.map +1 -0
- package/dist/lib/chunk-SchemaContainer.mjs +53 -0
- package/dist/lib/chunk-SchemaContainer.mjs.map +1 -0
- package/dist/lib/chunk-SmallPresenceLive.mjs +2 -0
- package/dist/lib/chunk-SpaceHomeArticle.mjs +82 -0
- package/dist/lib/chunk-SpaceHomeArticle.mjs.map +1 -0
- package/dist/lib/chunk-SpaceHomeDashboard.mjs +96 -0
- package/dist/lib/chunk-SpaceHomeDashboard.mjs.map +1 -0
- package/dist/lib/chunk-SpaceHomeRecent.mjs +79 -0
- package/dist/lib/chunk-SpaceHomeRecent.mjs.map +1 -0
- package/dist/lib/chunk-SpacePlugin.mjs +97 -0
- package/dist/lib/chunk-SpacePlugin.mjs.map +1 -0
- package/dist/lib/chunk-SpacePresence.mjs +155 -0
- package/dist/lib/chunk-SpacePresence.mjs.map +1 -0
- package/dist/lib/chunk-SpaceSettings.mjs +63 -0
- package/dist/lib/chunk-SpaceSettings.mjs.map +1 -0
- package/dist/lib/chunk-SpaceSettingsContainer.mjs +278 -0
- package/dist/lib/chunk-SpaceSettingsContainer.mjs.map +1 -0
- package/dist/lib/chunk-SyncStatus.mjs +166 -0
- package/dist/lib/chunk-SyncStatus.mjs.map +1 -0
- package/dist/lib/chunk-TypeArticle.mjs +469 -0
- package/dist/lib/chunk-TypeArticle.mjs.map +1 -0
- package/dist/lib/chunk-ViewEditor.mjs +78 -0
- package/dist/lib/chunk-ViewEditor.mjs.map +1 -0
- package/dist/lib/chunk-add-object.mjs +74 -0
- package/dist/lib/chunk-add-object.mjs.map +1 -0
- package/dist/lib/chunk-add-relation.mjs +16 -0
- package/dist/lib/chunk-add-relation.mjs.map +1 -0
- package/dist/lib/chunk-add-type.mjs +41 -0
- package/dist/lib/chunk-add-type.mjs.map +1 -0
- package/dist/lib/chunk-app-graph-builder.mjs +1056 -0
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
- package/dist/lib/chunk-close.mjs +11 -0
- package/dist/lib/chunk-close.mjs.map +1 -0
- package/dist/lib/chunk-collection-path.mjs +65 -0
- package/dist/lib/chunk-collection-path.mjs.map +1 -0
- package/dist/lib/chunk-create-object.mjs +80 -0
- package/dist/lib/chunk-create-object.mjs.map +1 -0
- package/dist/lib/chunk-create.mjs +62 -0
- package/dist/lib/chunk-create.mjs.map +1 -0
- package/dist/lib/chunk-definitions.mjs +466 -0
- package/dist/lib/chunk-definitions.mjs.map +1 -0
- package/dist/lib/chunk-delete-field.mjs +52 -0
- package/dist/lib/chunk-delete-field.mjs.map +1 -0
- package/dist/lib/chunk-delete.mjs +11 -0
- package/dist/lib/chunk-delete.mjs.map +1 -0
- package/dist/lib/chunk-duplicate-object.mjs +11 -0
- package/dist/lib/chunk-duplicate-object.mjs.map +1 -0
- package/dist/lib/chunk-errors.mjs +10 -0
- package/dist/lib/chunk-errors.mjs.map +1 -0
- package/dist/lib/chunk-export-space.mjs +24 -0
- package/dist/lib/chunk-export-space.mjs.map +1 -0
- package/dist/lib/chunk-find-duplicates.mjs +19 -0
- package/dist/lib/chunk-find-duplicates.mjs.map +1 -0
- package/dist/lib/chunk-get-share-link.mjs +29 -0
- package/dist/lib/chunk-get-share-link.mjs.map +1 -0
- package/dist/lib/chunk-helpers.mjs +14 -0
- package/dist/lib/chunk-helpers.mjs.map +1 -0
- package/dist/lib/chunk-identity-created.mjs +26 -0
- package/dist/lib/chunk-identity-created.mjs.map +1 -0
- package/dist/lib/chunk-import-space.mjs +16 -0
- package/dist/lib/chunk-import-space.mjs.map +1 -0
- package/dist/lib/chunk-join.mjs +35 -0
- package/dist/lib/chunk-join.mjs.map +1 -0
- package/dist/lib/chunk-merge-duplicates.mjs +62 -0
- package/dist/lib/chunk-merge-duplicates.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-5ZZS3KMK.mjs → chunk-meta.mjs} +15 -24
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-migrate.mjs +45 -0
- package/dist/lib/chunk-migrate.mjs.map +1 -0
- package/dist/lib/chunk-navigation-handler.mjs +63 -0
- package/dist/lib/chunk-navigation-handler.mjs.map +1 -0
- package/dist/lib/chunk-navigation-target-resolver.mjs +79 -0
- package/dist/lib/chunk-navigation-target-resolver.mjs.map +1 -0
- package/dist/lib/chunk-open-create-object.mjs +32 -0
- package/dist/lib/chunk-open-create-object.mjs.map +1 -0
- package/dist/lib/chunk-open-create-space.mjs +16 -0
- package/dist/lib/chunk-open-create-space.mjs.map +1 -0
- package/dist/lib/chunk-open-import-space.mjs +16 -0
- package/dist/lib/chunk-open-import-space.mjs.map +1 -0
- package/dist/lib/chunk-open-members.mjs +15 -0
- package/dist/lib/chunk-open-members.mjs.map +1 -0
- package/dist/lib/chunk-open-settings.mjs +15 -0
- package/dist/lib/chunk-open-settings.mjs.map +1 -0
- package/dist/lib/chunk-open.mjs +11 -0
- package/dist/lib/chunk-open.mjs.map +1 -0
- package/dist/lib/chunk-operation-handler.mjs +13 -0
- package/dist/lib/chunk-operation-handler.mjs.map +1 -0
- package/dist/lib/chunk-react-root.mjs +20 -0
- package/dist/lib/chunk-react-root.mjs.map +1 -0
- package/dist/lib/chunk-react-surface.mjs +384 -0
- package/dist/lib/chunk-react-surface.mjs.map +1 -0
- package/dist/lib/chunk-remove-objects.mjs +83 -0
- package/dist/lib/chunk-remove-objects.mjs.map +1 -0
- package/dist/lib/chunk-rename-object.mjs +18 -0
- package/dist/lib/chunk-rename-object.mjs.map +1 -0
- package/dist/lib/chunk-rename.mjs +18 -0
- package/dist/lib/chunk-rename.mjs.map +1 -0
- package/dist/lib/chunk-repair.mjs +28 -0
- package/dist/lib/chunk-repair.mjs.map +1 -0
- package/dist/lib/chunk-restore-field.mjs +50 -0
- package/dist/lib/chunk-restore-field.mjs.map +1 -0
- package/dist/lib/chunk-restore-objects.mjs +33 -0
- package/dist/lib/chunk-restore-objects.mjs.map +1 -0
- package/dist/lib/chunk-settings.mjs +23 -0
- package/dist/lib/chunk-settings.mjs.map +1 -0
- package/dist/lib/chunk-share.mjs +23 -0
- package/dist/lib/chunk-share.mjs.map +1 -0
- package/dist/lib/chunk-snapshot.mjs +24 -0
- package/dist/lib/chunk-snapshot.mjs.map +1 -0
- package/dist/lib/chunk-spaces-ready.mjs +242 -0
- package/dist/lib/chunk-spaces-ready.mjs.map +1 -0
- package/dist/lib/chunk-state.mjs +48 -0
- package/dist/lib/chunk-state.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +56 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/chunk-undo-mappings.mjs +40 -0
- package/dist/lib/chunk-undo-mappings.mjs.map +1 -0
- package/dist/lib/chunk-util.mjs +34 -0
- package/dist/lib/chunk-util.mjs.map +1 -0
- package/dist/lib/chunk-wait-for-object.mjs +16 -0
- package/dist/lib/chunk-wait-for-object.mjs.map +1 -0
- package/dist/lib/components.mjs +329 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-C2ULK22J.mjs → constants.mjs} +5 -10
- package/dist/lib/constants.mjs.map +1 -0
- package/dist/lib/containers.mjs +31 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/hooks.mjs +185 -0
- package/dist/lib/hooks.mjs.map +1 -0
- package/dist/lib/index.mjs +7 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/operations.mjs +8 -0
- package/dist/lib/operations.mjs.map +1 -0
- package/dist/lib/plugin.mjs +9 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/testing.mjs +2 -0
- package/dist/lib/translations.mjs +350 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +60 -0
- package/dist/lib/types.mjs.map +1 -0
- package/dist/types/src/SpacePlugin.workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/SpaceFormFields.d.ts +10 -0
- package/dist/types/src/capabilities/SpaceFormFields.d.ts.map +1 -0
- package/dist/types/src/capabilities/SpaceSurfaces.d.ts +50 -0
- package/dist/types/src/capabilities/SpaceSurfaces.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts +6 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/collections.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/companions.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/database.d.ts +7 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/database.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts +2 -7
- package/dist/types/src/capabilities/app-graph-builder/extensions/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts +3 -2
- package/dist/types/src/capabilities/app-graph-builder/extensions/shared.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts +5 -0
- package/dist/types/src/capabilities/app-graph-builder/extensions/spaces.d.ts.map +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -1
- package/dist/types/src/capabilities/identity-created.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts +3 -1
- package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts.map +1 -1
- package/dist/types/src/capabilities/navigation-target-resolver.d.ts +5 -0
- package/dist/types/src/capabilities/navigation-target-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/react-root.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/repair.d.ts +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/spaces-ready.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts +1 -1
- package/dist/types/src/capabilities/try-get-view.d.ts +7 -0
- package/dist/types/src/capabilities/try-get-view.d.ts.map +1 -0
- package/dist/types/src/capabilities/undo-mappings.d.ts +1 -1
- package/dist/types/src/collection-path.d.ts +28 -0
- package/dist/types/src/collection-path.d.ts.map +1 -0
- package/dist/types/src/collection-path.test.d.ts +2 -0
- package/dist/types/src/collection-path.test.d.ts.map +1 -0
- package/dist/types/src/commands/space/export/export.d.ts +23 -0
- package/dist/types/src/commands/space/export/export.d.ts.map +1 -0
- package/dist/types/src/commands/space/export/export.test.d.ts +2 -0
- package/dist/types/src/commands/space/export/export.test.d.ts.map +1 -0
- package/dist/types/src/commands/space/export/index.d.ts +2 -0
- package/dist/types/src/commands/space/export/index.d.ts.map +1 -0
- package/dist/types/src/commands/space/import/import.d.ts +17 -0
- package/dist/types/src/commands/space/import/import.d.ts.map +1 -0
- package/dist/types/src/commands/space/import/import.test.d.ts +2 -0
- package/dist/types/src/commands/space/import/import.test.d.ts.map +1 -0
- package/dist/types/src/commands/space/import/index.d.ts +2 -0
- package/dist/types/src/commands/space/import/index.d.ts.map +1 -0
- package/dist/types/src/commands/space/index.d.ts +8 -1
- package/dist/types/src/commands/space/index.d.ts.map +1 -1
- package/dist/types/src/components/AwaitingObject/AwaitingObject.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/status.d.ts +7 -4
- package/dist/types/src/components/SyncStatus/status.d.ts.map +1 -1
- package/dist/types/src/components/SyncStatus/status.test.d.ts +2 -0
- package/dist/types/src/components/SyncStatus/status.test.d.ts.map +1 -0
- package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts +4 -4
- package/dist/types/src/containers/CollectionArticle/CollectionArticle.d.ts.map +1 -1
- package/dist/types/src/containers/CollectionSection/CollectionSection.d.ts +4 -1
- package/dist/types/src/containers/CollectionSection/CollectionSection.d.ts.map +1 -1
- package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts +4 -1
- package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.d.ts.map +1 -1
- package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.stories.d.ts +420 -9
- package/dist/types/src/containers/CreateObjectDialog/CreateObjectDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts +4 -1
- package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.stories.d.ts +423 -10
- package/dist/types/src/containers/CreateSpaceDialog/CreateSpaceDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ImportSpaceDialog/ImportSpaceDialog.d.ts +4 -1
- package/dist/types/src/containers/ImportSpaceDialog/ImportSpaceDialog.d.ts.map +1 -1
- package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts +5 -2
- package/dist/types/src/containers/InlineSyncStatus/InlineSyncStatus.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts +4 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts +423 -10
- package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/MembersContainer/MembersContainer.d.ts +4 -1
- package/dist/types/src/containers/MembersContainer/MembersContainer.d.ts.map +1 -1
- package/dist/types/src/containers/MergePreview/MergePreview.d.ts +16 -0
- package/dist/types/src/containers/MergePreview/MergePreview.d.ts.map +1 -0
- package/dist/types/src/containers/MergePreview/index.d.ts +2 -0
- package/dist/types/src/containers/MergePreview/index.d.ts.map +1 -0
- package/dist/types/src/containers/ObjectCardStack/ObjectCardStack.d.ts +3 -2
- package/dist/types/src/containers/ObjectCardStack/ObjectCardStack.d.ts.map +1 -1
- package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts +4 -1
- package/dist/types/src/containers/RecordArticle/RecordArticle.d.ts.map +1 -1
- package/dist/types/src/containers/RecordArticle/RecordArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/RelatedArticle/RelatedArticle.d.ts +4 -1
- package/dist/types/src/containers/RelatedArticle/RelatedArticle.d.ts.map +1 -1
- package/dist/types/src/containers/RenamePopover/RenamePopover.d.ts +4 -4
- package/dist/types/src/containers/RenamePopover/RenamePopover.d.ts.map +1 -1
- package/dist/types/src/containers/SchemaContainer/SchemaContainer.d.ts +4 -7
- package/dist/types/src/containers/SchemaContainer/SchemaContainer.d.ts.map +1 -1
- package/dist/types/src/containers/SchemaContainer/use-query-space-types.d.ts +7 -0
- package/dist/types/src/containers/SchemaContainer/use-query-space-types.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.d.ts +4 -11
- package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.d.ts +14 -0
- package/dist/types/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.d.ts +15 -0
- package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.d.ts +20 -0
- package/dist/types/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeDashboard/index.d.ts +2 -0
- package/dist/types/src/containers/SpaceHomeDashboard/index.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts +5 -8
- package/dist/types/src/containers/SpaceHomeRecent/SpaceHomeRecent.d.ts.map +1 -1
- package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts +7 -4
- package/dist/types/src/containers/SpacePresence/SpacePresence.d.ts.map +1 -1
- package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts +419 -9
- package/dist/types/src/containers/SpacePresence/SpacePresence.stories.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceSettings/SpaceSettings.d.ts +4 -1
- package/dist/types/src/containers/SpaceSettings/SpaceSettings.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceSettings/SpaceSettings.stories.d.ts +423 -10
- package/dist/types/src/containers/SpaceSettings/SpaceSettings.stories.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts +419 -9
- package/dist/types/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/SyncStatus/SyncStatus.d.ts +7 -2
- package/dist/types/src/containers/SyncStatus/SyncStatus.d.ts.map +1 -1
- package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts +434 -11
- package/dist/types/src/containers/SyncStatus/SyncStatus.stories.d.ts.map +1 -1
- package/dist/types/src/containers/TypeArticle/TypeArticle.d.ts +14 -0
- package/dist/types/src/containers/TypeArticle/TypeArticle.d.ts.map +1 -0
- package/dist/types/src/containers/TypeArticle/TypeArticle.stories.d.ts +45 -0
- package/dist/types/src/containers/TypeArticle/TypeArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/TypeArticle/duplicatesGroup.d.ts +19 -0
- package/dist/types/src/containers/TypeArticle/duplicatesGroup.d.ts.map +1 -0
- package/dist/types/src/containers/TypeArticle/index.d.ts +2 -0
- package/dist/types/src/containers/TypeArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/TypeArticle/useDuplicates.d.ts +34 -0
- package/dist/types/src/containers/TypeArticle/useDuplicates.d.ts.map +1 -0
- package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts +4 -1
- package/dist/types/src/containers/ViewEditor/ViewEditor.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +3 -2
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +30 -0
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useEdgeStatus.d.ts +6 -0
- package/dist/types/src/hooks/useEdgeStatus.d.ts.map +1 -0
- package/dist/types/src/hooks/useInputSurfaceLookup.d.ts.map +1 -1
- package/dist/types/src/hooks/useStalled.d.ts +13 -0
- package/dist/types/src/hooks/useStalled.d.ts.map +1 -0
- package/dist/types/src/operations/create.d.ts.map +1 -1
- package/dist/types/src/operations/definitions.d.ts +29 -1
- package/dist/types/src/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/operations/find-duplicates.d.ts +5 -0
- package/dist/types/src/operations/find-duplicates.d.ts.map +1 -0
- package/dist/types/src/operations/helpers.d.ts +3 -0
- package/dist/types/src/operations/helpers.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/join.d.ts.map +1 -1
- package/dist/types/src/operations/merge-duplicates.d.ts +5 -0
- package/dist/types/src/operations/merge-duplicates.d.ts.map +1 -0
- package/dist/types/src/operations/open-settings.d.ts.map +1 -1
- package/dist/types/src/operations/remove-objects.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +419 -9
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/type-section-path.d.ts +22 -0
- package/dist/types/src/type-section-path.d.ts.map +1 -0
- package/dist/types/src/type-section-path.test.d.ts +2 -0
- package/dist/types/src/type-section-path.test.d.ts.map +1 -0
- package/dist/types/src/types/capabilities.d.ts +22 -2
- package/dist/types/src/types/capabilities.d.ts.map +1 -1
- package/dist/types/src/types/surface.d.ts +4 -4
- package/dist/types/src/types/surface.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +6 -0
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +87 -72
- package/src/SpacePlugin.ts +6 -6
- package/src/SpacePlugin.workerd.ts +3 -1
- package/src/capabilities/SpaceFormFields.tsx +72 -0
- package/src/capabilities/SpaceSurfaces.tsx +219 -0
- package/src/capabilities/app-graph-builder/extensions/collections.ts +74 -21
- package/src/capabilities/app-graph-builder/extensions/companions.ts +10 -5
- package/src/capabilities/app-graph-builder/extensions/database.ts +64 -57
- package/src/capabilities/app-graph-builder/extensions/settings.ts +23 -13
- package/src/capabilities/app-graph-builder/extensions/shared.ts +3 -2
- package/src/capabilities/app-graph-builder/extensions/spaces.ts +6 -7
- package/src/capabilities/create-object.ts +1 -14
- package/src/capabilities/index.ts +4 -1
- package/src/capabilities/navigation-handler/navigation-handler.ts +27 -7
- package/src/capabilities/navigation-target-resolver.ts +77 -0
- package/src/capabilities/react-surface.ts +274 -0
- package/src/capabilities/spaces-ready.ts +31 -18
- package/src/capabilities/state.ts +3 -1
- package/src/capabilities/try-get-view.ts +24 -0
- package/src/collection-path.test.ts +161 -0
- package/src/collection-path.ts +97 -0
- package/src/commands/space/export/export.test.ts +68 -0
- package/src/commands/space/export/export.ts +118 -0
- package/src/commands/space/export/index.ts +5 -0
- package/src/commands/space/import/import.test.ts +80 -0
- package/src/commands/space/import/import.ts +65 -0
- package/src/commands/space/import/index.ts +5 -0
- package/src/commands/space/index.ts +16 -1
- package/src/components/AwaitingObject/AwaitingObject.tsx +10 -4
- package/src/components/CreateObjectPanel/CreateObjectPanel.tsx +16 -18
- package/src/components/SyncStatus/status.test.ts +49 -0
- package/src/components/SyncStatus/status.ts +25 -12
- package/src/containers/CollectionArticle/CollectionArticle.tsx +5 -3
- package/src/containers/CollectionSection/CollectionSection.tsx +2 -0
- package/src/containers/CreateObjectDialog/CreateObjectDialog.stories.tsx +18 -4
- package/src/containers/CreateObjectDialog/CreateObjectDialog.tsx +13 -17
- package/src/containers/CreateSpaceDialog/CreateSpaceDialog.tsx +28 -19
- package/src/containers/DefaultProperties/DefaultProperties.tsx +4 -2
- package/src/containers/ImportSpaceDialog/ImportSpaceDialog.tsx +4 -2
- package/src/containers/InlineSyncStatus/InlineSyncStatus.tsx +7 -17
- package/src/containers/JoinDialog/JoinDialog.tsx +5 -3
- package/src/containers/MembersContainer/MembersContainer.tsx +2 -0
- package/src/containers/MergePreview/MergePreview.tsx +90 -0
- package/src/containers/MergePreview/index.ts +5 -0
- package/src/containers/ObjectCardStack/ObjectCardStack.tsx +46 -43
- package/src/containers/RecordArticle/RecordArticle.stories.tsx +2 -1
- package/src/containers/RecordArticle/RecordArticle.tsx +8 -4
- package/src/containers/RelatedArticle/RelatedArticle.tsx +7 -3
- package/src/containers/RenamePopover/RenamePopover.tsx +2 -0
- package/src/containers/SchemaContainer/SchemaContainer.tsx +4 -17
- package/src/containers/SchemaContainer/use-query-space-types.ts +28 -0
- package/src/containers/SpaceHomeArticle/SpaceHomeArticle.stories.tsx +116 -0
- package/src/containers/SpaceHomeArticle/SpaceHomeArticle.tsx +6 -5
- package/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.stories.tsx +99 -0
- package/src/containers/SpaceHomeDashboard/SpaceHomeDashboard.tsx +109 -0
- package/src/containers/SpaceHomeDashboard/index.ts +5 -0
- package/src/containers/SpaceHomeRecent/SpaceHomeRecent.tsx +17 -15
- package/src/containers/SpacePresence/SpacePresence.stories.tsx +4 -4
- package/src/containers/SpacePresence/SpacePresence.tsx +37 -36
- package/src/containers/SpaceSettings/SpaceSettings.tsx +3 -1
- package/src/containers/SpaceSettingsContainer/SpaceSettingsContainer.tsx +7 -2
- package/src/containers/SyncStatus/SyncStatus.stories.tsx +80 -1
- package/src/containers/SyncStatus/SyncStatus.tsx +36 -46
- package/src/containers/TypeArticle/TypeArticle.stories.tsx +249 -0
- package/src/containers/TypeArticle/TypeArticle.tsx +362 -0
- package/src/containers/TypeArticle/duplicatesGroup.tsx +150 -0
- package/src/containers/TypeArticle/index.ts +5 -0
- package/src/containers/TypeArticle/useDuplicates.ts +119 -0
- package/src/containers/ViewEditor/ViewEditor.tsx +3 -1
- package/src/containers/index.ts +3 -2
- package/src/errors.ts +6 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useEdgeStatus.ts +40 -0
- package/src/hooks/useInputSurfaceLookup.tsx +5 -4
- package/src/hooks/useRelatedObjects.ts +1 -1
- package/src/hooks/useStalled.ts +39 -0
- package/src/operations/add-object.ts +7 -7
- package/src/operations/create.ts +11 -3
- package/src/operations/definitions.ts +54 -1
- package/src/operations/find-duplicates.ts +33 -0
- package/src/operations/get-share-link.ts +1 -1
- package/src/operations/helpers.ts +11 -0
- package/src/operations/index.ts +2 -0
- package/src/operations/join.ts +6 -5
- package/src/operations/merge-duplicates.ts +51 -0
- package/src/operations/open-members.ts +3 -3
- package/src/operations/open-settings.ts +5 -3
- package/src/operations/remove-objects.ts +42 -3
- package/src/translations.ts +52 -11
- package/src/type-section-path.test.ts +48 -0
- package/src/type-section-path.ts +39 -0
- package/src/types/capabilities.ts +26 -2
- package/src/types/surface.ts +4 -8
- package/src/types/types.ts +7 -0
- package/dist/lib/neutral/CollectionArticle-BMH7SZ7Q.mjs +0 -93
- package/dist/lib/neutral/CollectionArticle-BMH7SZ7Q.mjs.map +0 -7
- package/dist/lib/neutral/CollectionSection-BLYTGOKH.mjs +0 -19
- package/dist/lib/neutral/CollectionSection-BLYTGOKH.mjs.map +0 -7
- package/dist/lib/neutral/CreateObjectDialog-5454N3FJ.mjs +0 -221
- package/dist/lib/neutral/CreateObjectDialog-5454N3FJ.mjs.map +0 -7
- package/dist/lib/neutral/CreateSpaceDialog-WWNUTLVK.mjs +0 -61
- package/dist/lib/neutral/CreateSpaceDialog-WWNUTLVK.mjs.map +0 -7
- package/dist/lib/neutral/DefaultProperties-5SAWQC6I.mjs +0 -58
- package/dist/lib/neutral/DefaultProperties-5SAWQC6I.mjs.map +0 -7
- package/dist/lib/neutral/ImportSpaceDialog-CSSRTFAO.mjs +0 -64
- package/dist/lib/neutral/ImportSpaceDialog-CSSRTFAO.mjs.map +0 -7
- package/dist/lib/neutral/InlineSyncStatus-UOUTAPCU.mjs +0 -49
- package/dist/lib/neutral/InlineSyncStatus-UOUTAPCU.mjs.map +0 -7
- package/dist/lib/neutral/JoinDialog-ATNUCNL2.mjs +0 -97
- package/dist/lib/neutral/JoinDialog-ATNUCNL2.mjs.map +0 -7
- package/dist/lib/neutral/MembersContainer-C4ZTP6ZW.mjs +0 -231
- package/dist/lib/neutral/MembersContainer-C4ZTP6ZW.mjs.map +0 -7
- package/dist/lib/neutral/MenuFooter-FWE5LFM4.mjs +0 -33
- package/dist/lib/neutral/MenuFooter-FWE5LFM4.mjs.map +0 -7
- package/dist/lib/neutral/ObjectCardStack-DHVDRNRK.mjs +0 -55
- package/dist/lib/neutral/ObjectCardStack-DHVDRNRK.mjs.map +0 -7
- package/dist/lib/neutral/RecordArticle-JSORXRAA.mjs +0 -102
- package/dist/lib/neutral/RecordArticle-JSORXRAA.mjs.map +0 -7
- package/dist/lib/neutral/RelatedArticle-Z777WVDW.mjs +0 -69
- package/dist/lib/neutral/RelatedArticle-Z777WVDW.mjs.map +0 -7
- package/dist/lib/neutral/RenamePopover-AZT2KPOF.mjs +0 -104
- package/dist/lib/neutral/RenamePopover-AZT2KPOF.mjs.map +0 -7
- package/dist/lib/neutral/SchemaContainer-4GJKQBXM.mjs +0 -53
- package/dist/lib/neutral/SchemaContainer-4GJKQBXM.mjs.map +0 -7
- package/dist/lib/neutral/SmallPresenceLive-FW3AMEY5.mjs +0 -8
- package/dist/lib/neutral/SmallPresenceLive-FW3AMEY5.mjs.map +0 -7
- package/dist/lib/neutral/SpaceHomeArticle-Y47TLZ72.mjs +0 -78
- package/dist/lib/neutral/SpaceHomeArticle-Y47TLZ72.mjs.map +0 -7
- package/dist/lib/neutral/SpaceHomeRecent-S57AO3EV.mjs +0 -89
- package/dist/lib/neutral/SpaceHomeRecent-S57AO3EV.mjs.map +0 -7
- package/dist/lib/neutral/SpacePlugin.mjs +0 -10
- package/dist/lib/neutral/SpacePlugin.mjs.map +0 -7
- package/dist/lib/neutral/SpacePlugin.node.mjs +0 -838
- package/dist/lib/neutral/SpacePlugin.node.mjs.map +0 -7
- package/dist/lib/neutral/SpacePlugin.workerd.mjs +0 -34
- package/dist/lib/neutral/SpacePlugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/SpacePresence-T37WH43Y.mjs +0 -11
- package/dist/lib/neutral/SpacePresence-T37WH43Y.mjs.map +0 -7
- package/dist/lib/neutral/SpaceSettings-6CZF7GEO.mjs +0 -60
- package/dist/lib/neutral/SpaceSettings-6CZF7GEO.mjs.map +0 -7
- package/dist/lib/neutral/SpaceSettingsContainer-72CJWELM.mjs +0 -279
- package/dist/lib/neutral/SpaceSettingsContainer-72CJWELM.mjs.map +0 -7
- package/dist/lib/neutral/SyncStatus-J7CHLO5O.mjs +0 -147
- package/dist/lib/neutral/SyncStatus-J7CHLO5O.mjs.map +0 -7
- package/dist/lib/neutral/TypeCollectionArticle-W76ADS2G.mjs +0 -143
- package/dist/lib/neutral/TypeCollectionArticle-W76ADS2G.mjs.map +0 -7
- package/dist/lib/neutral/ViewEditor-QXRUOKXR.mjs +0 -101
- package/dist/lib/neutral/ViewEditor-QXRUOKXR.mjs.map +0 -7
- package/dist/lib/neutral/add-object-H2N4AOQJ.mjs +0 -77
- package/dist/lib/neutral/add-object-H2N4AOQJ.mjs.map +0 -7
- package/dist/lib/neutral/add-relation-BGTLART5.mjs +0 -26
- package/dist/lib/neutral/add-relation-BGTLART5.mjs.map +0 -7
- package/dist/lib/neutral/add-type-JIDLRANR.mjs +0 -57
- package/dist/lib/neutral/add-type-JIDLRANR.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-7H2KOD4B.mjs +0 -1332
- package/dist/lib/neutral/app-graph-builder-7H2KOD4B.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/index.mjs +0 -46
- package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/node.mjs +0 -15
- package/dist/lib/neutral/capabilities/node.mjs.map +0 -7
- package/dist/lib/neutral/chunk-52ASDNRA.mjs +0 -41
- package/dist/lib/neutral/chunk-52ASDNRA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-5ZZS3KMK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-C2ULK22J.mjs.map +0 -7
- package/dist/lib/neutral/chunk-F5KLUP2P.mjs +0 -115
- package/dist/lib/neutral/chunk-F5KLUP2P.mjs.map +0 -7
- package/dist/lib/neutral/chunk-G2KHP7FX.mjs +0 -8
- package/dist/lib/neutral/chunk-G2KHP7FX.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-LMUG6PEJ.mjs +0 -572
- package/dist/lib/neutral/chunk-LMUG6PEJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-RAAHDTVF.mjs +0 -167
- package/dist/lib/neutral/chunk-RAAHDTVF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-SPWAMXNR.mjs +0 -131
- package/dist/lib/neutral/chunk-SPWAMXNR.mjs.map +0 -7
- package/dist/lib/neutral/chunk-U5WTDOMV.mjs +0 -8
- package/dist/lib/neutral/chunk-U5WTDOMV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-V7JALUM3.mjs +0 -9
- package/dist/lib/neutral/chunk-V7JALUM3.mjs.map +0 -7
- package/dist/lib/neutral/close-5WEQZRNK.mjs +0 -17
- package/dist/lib/neutral/close-5WEQZRNK.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -401
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/constants.mjs +0 -16
- package/dist/lib/neutral/constants.mjs.map +0 -7
- package/dist/lib/neutral/containers/index.mjs +0 -55
- package/dist/lib/neutral/containers/index.mjs.map +0 -7
- package/dist/lib/neutral/create-QZ47FHQU.mjs +0 -75
- package/dist/lib/neutral/create-QZ47FHQU.mjs.map +0 -7
- package/dist/lib/neutral/create-object-ZU6FZW5X.mjs +0 -96
- package/dist/lib/neutral/create-object-ZU6FZW5X.mjs.map +0 -7
- package/dist/lib/neutral/delete-SPCU2VFM.mjs +0 -17
- package/dist/lib/neutral/delete-SPCU2VFM.mjs.map +0 -7
- package/dist/lib/neutral/delete-field-TAKJVEAD.mjs +0 -42
- package/dist/lib/neutral/delete-field-TAKJVEAD.mjs.map +0 -7
- package/dist/lib/neutral/duplicate-object-BUPZOO6S.mjs +0 -17
- package/dist/lib/neutral/duplicate-object-BUPZOO6S.mjs.map +0 -7
- package/dist/lib/neutral/export-space-S5SCAL4M.mjs +0 -34
- package/dist/lib/neutral/export-space-S5SCAL4M.mjs.map +0 -7
- package/dist/lib/neutral/get-share-link-CLM5IQRL.mjs +0 -41
- package/dist/lib/neutral/get-share-link-CLM5IQRL.mjs.map +0 -7
- package/dist/lib/neutral/hooks/index.mjs +0 -133
- package/dist/lib/neutral/hooks/index.mjs.map +0 -7
- package/dist/lib/neutral/identity-created-BEYMLBK4.mjs +0 -32
- package/dist/lib/neutral/identity-created-BEYMLBK4.mjs.map +0 -7
- package/dist/lib/neutral/import-space-LJQK3KT7.mjs +0 -28
- package/dist/lib/neutral/import-space-LJQK3KT7.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -62
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/join-FSODYIOC.mjs +0 -54
- package/dist/lib/neutral/join-FSODYIOC.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -8
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/migrate-WHM6LU7L.mjs +0 -52
- package/dist/lib/neutral/migrate-WHM6LU7L.mjs.map +0 -7
- package/dist/lib/neutral/navigation-handler-ZF7MV2HL.mjs +0 -44
- package/dist/lib/neutral/navigation-handler-ZF7MV2HL.mjs.map +0 -7
- package/dist/lib/neutral/navigation-resolver-KBESOSWU.mjs +0 -82
- package/dist/lib/neutral/navigation-resolver-KBESOSWU.mjs.map +0 -7
- package/dist/lib/neutral/open-JCXTL3SK.mjs +0 -17
- package/dist/lib/neutral/open-JCXTL3SK.mjs.map +0 -7
- package/dist/lib/neutral/open-create-object-WAIAU7TA.mjs +0 -42
- package/dist/lib/neutral/open-create-object-WAIAU7TA.mjs.map +0 -7
- package/dist/lib/neutral/open-create-space-VU47FWPZ.mjs +0 -24
- package/dist/lib/neutral/open-create-space-VU47FWPZ.mjs.map +0 -7
- package/dist/lib/neutral/open-import-space-GUHIEWYB.mjs +0 -24
- package/dist/lib/neutral/open-import-space-GUHIEWYB.mjs.map +0 -7
- package/dist/lib/neutral/open-members-MLLBHKUU.mjs +0 -23
- package/dist/lib/neutral/open-members-MLLBHKUU.mjs.map +0 -7
- package/dist/lib/neutral/open-settings-DTPZF4U4.mjs +0 -23
- package/dist/lib/neutral/open-settings-DTPZF4U4.mjs.map +0 -7
- package/dist/lib/neutral/operation-handler-YPIRQOH2.mjs +0 -13
- package/dist/lib/neutral/operation-handler-YPIRQOH2.mjs.map +0 -7
- package/dist/lib/neutral/operations/index.mjs +0 -13
- package/dist/lib/neutral/operations/index.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -18
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/react-root-YLYRCSAZ.mjs +0 -23
- package/dist/lib/neutral/react-root-YLYRCSAZ.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-LRA7GIFN.mjs +0 -367
- package/dist/lib/neutral/react-surface-LRA7GIFN.mjs.map +0 -7
- package/dist/lib/neutral/remove-objects-WEO66EDS.mjs +0 -55
- package/dist/lib/neutral/remove-objects-WEO66EDS.mjs.map +0 -7
- package/dist/lib/neutral/rename-Q6UNCBIM.mjs +0 -26
- package/dist/lib/neutral/rename-Q6UNCBIM.mjs.map +0 -7
- package/dist/lib/neutral/rename-object-2UCEGU7U.mjs +0 -26
- package/dist/lib/neutral/rename-object-2UCEGU7U.mjs.map +0 -7
- package/dist/lib/neutral/repair-HMH476U3.mjs +0 -32
- package/dist/lib/neutral/repair-HMH476U3.mjs.map +0 -7
- package/dist/lib/neutral/restore-field-6CQAFOXY.mjs +0 -40
- package/dist/lib/neutral/restore-field-6CQAFOXY.mjs.map +0 -7
- package/dist/lib/neutral/restore-objects-3VINLP7C.mjs +0 -39
- package/dist/lib/neutral/restore-objects-3VINLP7C.mjs.map +0 -7
- package/dist/lib/neutral/settings-5IBSYBVU.mjs +0 -28
- package/dist/lib/neutral/settings-5IBSYBVU.mjs.map +0 -7
- package/dist/lib/neutral/share-A4WPILNF.mjs +0 -31
- package/dist/lib/neutral/share-A4WPILNF.mjs.map +0 -7
- package/dist/lib/neutral/snapshot-HBYMAPA7.mjs +0 -30
- package/dist/lib/neutral/snapshot-HBYMAPA7.mjs.map +0 -7
- package/dist/lib/neutral/spaces-ready-GWMSU72V.mjs +0 -281
- package/dist/lib/neutral/spaces-ready-GWMSU72V.mjs.map +0 -7
- package/dist/lib/neutral/state-KMH2NUAL.mjs +0 -55
- package/dist/lib/neutral/state-KMH2NUAL.mjs.map +0 -7
- package/dist/lib/neutral/testing.mjs +0 -8
- package/dist/lib/neutral/testing.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -315
- package/dist/lib/neutral/translations.mjs.map +0 -7
- package/dist/lib/neutral/types/index.mjs +0 -40
- package/dist/lib/neutral/types/index.mjs.map +0 -7
- package/dist/lib/neutral/undo-mappings-P43EAUGI.mjs +0 -68
- package/dist/lib/neutral/undo-mappings-P43EAUGI.mjs.map +0 -7
- package/dist/lib/neutral/wait-for-object-U6P2NNWY.mjs +0 -23
- package/dist/lib/neutral/wait-for-object-U6P2NNWY.mjs.map +0 -7
- package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
- package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
- package/dist/types/src/containers/MenuFooter/MenuFooter.d.ts +0 -6
- package/dist/types/src/containers/MenuFooter/MenuFooter.d.ts.map +0 -1
- package/dist/types/src/containers/MenuFooter/index.d.ts +0 -2
- package/dist/types/src/containers/MenuFooter/index.d.ts.map +0 -1
- package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.d.ts +0 -16
- package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.d.ts.map +0 -1
- package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.d.ts +0 -21
- package/dist/types/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.d.ts.map +0 -1
- package/dist/types/src/containers/TypeCollectionArticle/index.d.ts +0 -2
- package/dist/types/src/containers/TypeCollectionArticle/index.d.ts.map +0 -1
- package/src/capabilities/navigation-resolver.ts +0 -94
- package/src/capabilities/react-surface.tsx +0 -395
- package/src/containers/MenuFooter/MenuFooter.tsx +0 -33
- package/src/containers/MenuFooter/index.ts +0 -5
- package/src/containers/TypeCollectionArticle/TypeCollectionArticle.stories.tsx +0 -116
- package/src/containers/TypeCollectionArticle/TypeCollectionArticle.tsx +0 -162
- package/src/containers/TypeCollectionArticle/index.ts +0 -5
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import { SpaceCapabilities } from "./types.mjs";
|
|
2
|
+
import { n as SpaceOperation } from "./chunk-definitions.mjs";
|
|
3
|
+
import "./operations.mjs";
|
|
4
|
+
import { meta } from "#meta";
|
|
5
|
+
import { GraphPath, LayoutOperation } from "@dxos/app-toolkit";
|
|
6
|
+
import { Filter, Obj, Type } from "@dxos/echo";
|
|
7
|
+
import { CardAnnotation } from "@dxos/schema";
|
|
8
|
+
import * as Option from "effect/Option";
|
|
9
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
10
|
+
import { Surface, useAtomCapability, useAtomCapabilityState, useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
11
|
+
import { AppSurface } from "@dxos/app-toolkit/ui";
|
|
12
|
+
import { useObject, useQuery } from "@dxos/echo-react";
|
|
13
|
+
import { Card, Focus, Icon, Panel, useTranslation } from "@dxos/react-ui";
|
|
14
|
+
import { getStyles, mx } from "@dxos/ui-theme";
|
|
15
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
|
+
import { Empty } from "@dxos/react-ui-list";
|
|
17
|
+
import { SearchList, useSearchListResults } from "@dxos/react-ui-search";
|
|
18
|
+
import { useSelection, useSelectionActions } from "@dxos/react-ui-attention";
|
|
19
|
+
import { Masonry } from "@dxos/react-ui-masonry";
|
|
20
|
+
import { Menu, MenuBuilder, useMenuBuilder } from "@dxos/react-ui-menu";
|
|
21
|
+
import { DynamicTable } from "@dxos/react-ui-table";
|
|
22
|
+
import { Tabs } from "@dxos/react-ui-tabs";
|
|
23
|
+
import { planMerge } from "@dxos/extractor";
|
|
24
|
+
//#region src/containers/TypeArticle/useDuplicates.ts
|
|
25
|
+
/**
|
|
26
|
+
* Drives the duplicates review: runs `FindDuplicates` for the type, then walks the returned groups
|
|
27
|
+
* one at a time. Groups are held as ids and resolved against the live query on every render, so a
|
|
28
|
+
* merged-away member disappears from the current group without a rescan.
|
|
29
|
+
*/
|
|
30
|
+
var useDuplicates = ({ space, type, objects, enabled }) => {
|
|
31
|
+
const { invokePromise } = useOperationInvoker();
|
|
32
|
+
const specs = useCapabilities(SpaceCapabilities.IdentitySpec);
|
|
33
|
+
const typename = Type.getTypename(type);
|
|
34
|
+
const spec = useMemo(() => specs.find((candidate) => Type.getTypename(candidate.type) === typename), [specs, typename]);
|
|
35
|
+
const [groups, setGroups] = useState([]);
|
|
36
|
+
const [index, setIndex] = useState(0);
|
|
37
|
+
const [scanning, setScanning] = useState(false);
|
|
38
|
+
const request = useRef(0);
|
|
39
|
+
const { lastMergeAt } = useAtomCapability(SpaceCapabilities.EphemeralState);
|
|
40
|
+
const refresh = useCallback(() => {
|
|
41
|
+
if (!spec) return;
|
|
42
|
+
setScanning(true);
|
|
43
|
+
const current = ++request.current;
|
|
44
|
+
invokePromise(SpaceOperation.FindDuplicates, { typename }, { spaceId: space.id }).then(({ data }) => {
|
|
45
|
+
if (current !== request.current) return;
|
|
46
|
+
setGroups(data?.groups ?? []);
|
|
47
|
+
setIndex(0);
|
|
48
|
+
}).finally(() => {
|
|
49
|
+
if (current === request.current) setScanning(false);
|
|
50
|
+
});
|
|
51
|
+
}, [
|
|
52
|
+
invokePromise,
|
|
53
|
+
spec,
|
|
54
|
+
typename,
|
|
55
|
+
space.id
|
|
56
|
+
]);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (enabled) refresh();
|
|
59
|
+
}, [
|
|
60
|
+
enabled,
|
|
61
|
+
refresh,
|
|
62
|
+
lastMergeAt
|
|
63
|
+
]);
|
|
64
|
+
const byId = useMemo(() => new Map(objects.map((object) => [object.id, object])), [objects]);
|
|
65
|
+
return {
|
|
66
|
+
spec,
|
|
67
|
+
current: useMemo(() => {
|
|
68
|
+
const group = groups[index];
|
|
69
|
+
return group ? group.objectIds.flatMap((id) => byId.get(id) ?? []) : [];
|
|
70
|
+
}, [
|
|
71
|
+
groups,
|
|
72
|
+
index,
|
|
73
|
+
byId
|
|
74
|
+
]),
|
|
75
|
+
position: groups.length === 0 ? 0 : index + 1,
|
|
76
|
+
total: groups.length,
|
|
77
|
+
scanning,
|
|
78
|
+
next: useCallback(() => setIndex((value) => Math.min(value + 1, Math.max(groups.length - 1, 0))), [groups.length]),
|
|
79
|
+
previous: useCallback(() => setIndex((value) => Math.max(value - 1, 0)), []),
|
|
80
|
+
refresh
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
/** Builds the detached preview for the group under review; `undefined` when there is nothing to merge. */
|
|
84
|
+
var buildMergePreview = (spec, objects) => {
|
|
85
|
+
if (!spec || objects.length < 2) return;
|
|
86
|
+
const { preview } = planMerge(spec, {
|
|
87
|
+
keys: [],
|
|
88
|
+
objects
|
|
89
|
+
});
|
|
90
|
+
return Obj.isObject(preview) ? preview : void 0;
|
|
91
|
+
};
|
|
92
|
+
//#endregion
|
|
93
|
+
//#region src/containers/TypeArticle/duplicatesGroup.tsx
|
|
94
|
+
/**
|
|
95
|
+
* Toolbar subgraph for the duplicates review: Merge stages a preview into the companion, Skip and
|
|
96
|
+
* the arrows walk the groups, and the trailing gap separator pushes whatever follows (the layout
|
|
97
|
+
* toggle) to the far end. Merge never writes — it stages a detached preview the companion confirms,
|
|
98
|
+
* so backing out of a review leaves the space untouched.
|
|
99
|
+
*
|
|
100
|
+
* Compose via `MenuBuilder.subgraph(...)` so the whole toolbar is one action graph rather than
|
|
101
|
+
* several nested `Toolbar.Root`s.
|
|
102
|
+
*/
|
|
103
|
+
var useDuplicatesGroup = ({ typeUri, typename, duplicates }) => {
|
|
104
|
+
const [, updateEphemeral] = useAtomCapabilityState(SpaceCapabilities.EphemeralState);
|
|
105
|
+
const { spec, current, position, total, scanning, next, previous, refresh } = duplicates;
|
|
106
|
+
const clearPreview = useCallback(() => updateEphemeral((state) => ({
|
|
107
|
+
...state,
|
|
108
|
+
mergePreview: void 0
|
|
109
|
+
})), [updateEphemeral]);
|
|
110
|
+
const handleMerge = useCallback(() => {
|
|
111
|
+
const preview = buildMergePreview(spec, current);
|
|
112
|
+
if (!preview) return;
|
|
113
|
+
updateEphemeral((state) => ({
|
|
114
|
+
...state,
|
|
115
|
+
mergePreview: {
|
|
116
|
+
typeUri,
|
|
117
|
+
typename,
|
|
118
|
+
objectIds: current.map((object) => object.id),
|
|
119
|
+
preview
|
|
120
|
+
}
|
|
121
|
+
}));
|
|
122
|
+
}, [
|
|
123
|
+
updateEphemeral,
|
|
124
|
+
spec,
|
|
125
|
+
current,
|
|
126
|
+
typeUri,
|
|
127
|
+
typename
|
|
128
|
+
]);
|
|
129
|
+
const handleAdvance = useCallback(() => {
|
|
130
|
+
clearPreview();
|
|
131
|
+
next();
|
|
132
|
+
}, [clearPreview, next]);
|
|
133
|
+
const handlePrevious = useCallback(() => {
|
|
134
|
+
clearPreview();
|
|
135
|
+
previous();
|
|
136
|
+
}, [clearPreview, previous]);
|
|
137
|
+
const handleRefresh = useCallback(() => {
|
|
138
|
+
clearPreview();
|
|
139
|
+
refresh();
|
|
140
|
+
}, [clearPreview, refresh]);
|
|
141
|
+
return useMemo(() => (builder) => {
|
|
142
|
+
builder.action("merge", {
|
|
143
|
+
label: ["merge-duplicates.label", { ns: meta.profile.key }],
|
|
144
|
+
icon: "ph--arrows-merge--regular",
|
|
145
|
+
variant: "primary",
|
|
146
|
+
iconOnly: false,
|
|
147
|
+
disabled: current.length < 2
|
|
148
|
+
}, handleMerge).action("skip", {
|
|
149
|
+
label: ["skip-duplicates.label", { ns: meta.profile.key }],
|
|
150
|
+
iconOnly: false,
|
|
151
|
+
disabled: position >= total
|
|
152
|
+
}, handleAdvance).action("rescan", {
|
|
153
|
+
label: ["rescan-duplicates.label", { ns: meta.profile.key }],
|
|
154
|
+
icon: "ph--arrows-clockwise--regular",
|
|
155
|
+
disabled: scanning,
|
|
156
|
+
spin: scanning
|
|
157
|
+
}, handleRefresh).subgraph((builder) => total === 0 ? [] : builder.action("previous", {
|
|
158
|
+
label: ["previous-duplicate.label", { ns: meta.profile.key }],
|
|
159
|
+
icon: "ph--caret-left--regular",
|
|
160
|
+
disabled: position <= 1
|
|
161
|
+
}, handlePrevious).action("position", {
|
|
162
|
+
variant: "custom",
|
|
163
|
+
label: ["duplicates-position.label", { ns: meta.profile.key }],
|
|
164
|
+
render: () => /* @__PURE__ */ jsxs("span", {
|
|
165
|
+
className: "text-description text-sm tabular-nums",
|
|
166
|
+
children: [
|
|
167
|
+
position,
|
|
168
|
+
" / ",
|
|
169
|
+
total
|
|
170
|
+
]
|
|
171
|
+
})
|
|
172
|
+
}, () => {}).action("next", {
|
|
173
|
+
label: ["next-duplicate.label", { ns: meta.profile.key }],
|
|
174
|
+
icon: "ph--caret-right--regular",
|
|
175
|
+
disabled: position >= total
|
|
176
|
+
}, handleAdvance)).separator();
|
|
177
|
+
}, [
|
|
178
|
+
current.length,
|
|
179
|
+
position,
|
|
180
|
+
total,
|
|
181
|
+
scanning,
|
|
182
|
+
handleMerge,
|
|
183
|
+
handleAdvance,
|
|
184
|
+
handlePrevious,
|
|
185
|
+
handleRefresh
|
|
186
|
+
]);
|
|
187
|
+
};
|
|
188
|
+
//#endregion
|
|
189
|
+
//#region src/containers/TypeArticle/TypeArticle.tsx
|
|
190
|
+
var LAYOUTS = [
|
|
191
|
+
{
|
|
192
|
+
value: "masonry",
|
|
193
|
+
icon: "ph--squares-four--regular"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
value: "table",
|
|
197
|
+
icon: "ph--table--regular"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
value: "duplicates",
|
|
201
|
+
icon: "ph--copy--regular"
|
|
202
|
+
}
|
|
203
|
+
];
|
|
204
|
+
/**
|
|
205
|
+
* List view rendered when a type node is selected: a toolbar with a Masonry/Table layout switch and a
|
|
206
|
+
* text filter over every object of the type. Selecting an item opens it as a sibling plank.
|
|
207
|
+
*
|
|
208
|
+
* Objects are not enumerated in the nav tree; each navigated object becomes a hidden child of the
|
|
209
|
+
* type node resolved on demand.
|
|
210
|
+
*/
|
|
211
|
+
var TypeArticle = ({ role, space, type, attendableId }) => {
|
|
212
|
+
const { t } = useTranslation(meta.profile.key);
|
|
213
|
+
const { invokePromise } = useOperationInvoker();
|
|
214
|
+
const [layout, setLayout] = useState("masonry");
|
|
215
|
+
const typeUri = Type.getURI(type);
|
|
216
|
+
const objects = useQuery(space.db, Filter.type(typeUri));
|
|
217
|
+
const { results, handleSearch } = useSearchListResults({
|
|
218
|
+
items: objects,
|
|
219
|
+
extract: (object) => Obj.getLabel(object) ?? ""
|
|
220
|
+
});
|
|
221
|
+
const selectedIds = useSelection(typeUri, "multi");
|
|
222
|
+
const { multi: setSelectedObjects, toggle: toggleSelected } = useSelectionActions(typeUri);
|
|
223
|
+
const duplicates = useDuplicates({
|
|
224
|
+
space,
|
|
225
|
+
type,
|
|
226
|
+
objects,
|
|
227
|
+
enabled: layout === "duplicates"
|
|
228
|
+
});
|
|
229
|
+
const duplicatesGroup = useDuplicatesGroup({
|
|
230
|
+
typeUri,
|
|
231
|
+
typename: Type.getTypename(type),
|
|
232
|
+
duplicates
|
|
233
|
+
});
|
|
234
|
+
const layouts = useMemo(() => LAYOUTS.filter(({ value }) => value !== "duplicates" || duplicates.spec), [duplicates.spec]);
|
|
235
|
+
const handleOpen = useCallback((object) => {
|
|
236
|
+
const id = Obj.getURI(object);
|
|
237
|
+
invokePromise(LayoutOperation.Select, {
|
|
238
|
+
contextId: attendableId,
|
|
239
|
+
subject: {
|
|
240
|
+
mode: "single",
|
|
241
|
+
id
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
invokePromise(LayoutOperation.Open, {
|
|
245
|
+
subject: [GraphPath.getCollectionObjectPath(attendableId, object.id)],
|
|
246
|
+
pivotId: attendableId,
|
|
247
|
+
disposition: "add",
|
|
248
|
+
navigation: "immediate"
|
|
249
|
+
});
|
|
250
|
+
}, [attendableId, invokePromise]);
|
|
251
|
+
const handleDelete = useCallback((object) => {
|
|
252
|
+
Obj.getDatabase(object)?.remove(object);
|
|
253
|
+
}, []);
|
|
254
|
+
const handleDeleteSelected = useCallback(() => {
|
|
255
|
+
const selected = objects.filter((object) => selectedIds.includes(object.id));
|
|
256
|
+
if (selected.length > 0) {
|
|
257
|
+
invokePromise(SpaceOperation.RemoveObjects, { objects: selected }, { spaceId: space.id });
|
|
258
|
+
setSelectedObjects([]);
|
|
259
|
+
}
|
|
260
|
+
}, [
|
|
261
|
+
objects,
|
|
262
|
+
selectedIds,
|
|
263
|
+
invokePromise,
|
|
264
|
+
space.id,
|
|
265
|
+
setSelectedObjects
|
|
266
|
+
]);
|
|
267
|
+
const tableFeatures = useMemo(() => ({
|
|
268
|
+
selection: {
|
|
269
|
+
enabled: true,
|
|
270
|
+
mode: "multiple"
|
|
271
|
+
},
|
|
272
|
+
dataEditable: true,
|
|
273
|
+
schemaEditable: false,
|
|
274
|
+
pinColumns: 1
|
|
275
|
+
}), []);
|
|
276
|
+
const rowActions = useMemo(() => [{
|
|
277
|
+
id: "open",
|
|
278
|
+
label: ["open-object.label", { ns: meta.profile.key }]
|
|
279
|
+
}], []);
|
|
280
|
+
const handleRowAction = useCallback((actionId, object) => {
|
|
281
|
+
if (actionId === "open") handleOpen(object);
|
|
282
|
+
}, [handleOpen]);
|
|
283
|
+
const menuActions = useMenuBuilder(() => MenuBuilder.make().subgraph(layout === "duplicates" && duplicatesGroup).subgraph(layout === "table" && selectedIds.length > 0 && ((builder) => {
|
|
284
|
+
builder.action("delete-selected", {
|
|
285
|
+
label: ["delete-selected.label", {
|
|
286
|
+
ns: meta.profile.key,
|
|
287
|
+
count: selectedIds.length
|
|
288
|
+
}],
|
|
289
|
+
icon: "ph--trash--regular"
|
|
290
|
+
}, handleDeleteSelected);
|
|
291
|
+
})).separator().group("layout", {
|
|
292
|
+
variant: "toggleGroup",
|
|
293
|
+
selectCardinality: "single",
|
|
294
|
+
value: layout,
|
|
295
|
+
label: ["layout.label", { ns: meta.profile.key }]
|
|
296
|
+
}, (group) => {
|
|
297
|
+
layouts.forEach(({ value, icon }) => {
|
|
298
|
+
group.action(value, {
|
|
299
|
+
label: [`layout-${value}.label`, { ns: meta.profile.key }],
|
|
300
|
+
icon
|
|
301
|
+
}, () => setLayout(value));
|
|
302
|
+
});
|
|
303
|
+
}).build(), [
|
|
304
|
+
layout,
|
|
305
|
+
layouts,
|
|
306
|
+
selectedIds.length,
|
|
307
|
+
duplicatesGroup,
|
|
308
|
+
handleDeleteSelected
|
|
309
|
+
]);
|
|
310
|
+
const tiles = layout === "duplicates" ? duplicates.current : results;
|
|
311
|
+
const tileItems = useMemo(() => tiles.map((object) => ({
|
|
312
|
+
object,
|
|
313
|
+
current: selectedIds.includes(object.id),
|
|
314
|
+
onSelect: toggleSelected,
|
|
315
|
+
onOpen: handleOpen,
|
|
316
|
+
onDelete: Obj.getParent(object) ? void 0 : handleDelete
|
|
317
|
+
})), [
|
|
318
|
+
tiles,
|
|
319
|
+
selectedIds,
|
|
320
|
+
toggleSelected,
|
|
321
|
+
handleOpen,
|
|
322
|
+
handleDelete
|
|
323
|
+
]);
|
|
324
|
+
const noObjects = objects.length === 0 ? t("type-collection-empty.message") : void 0;
|
|
325
|
+
const noResults = noObjects ?? (results.length === 0 ? t("search-no-results.message") : void 0);
|
|
326
|
+
const noDuplicates = noObjects ?? (duplicates.current.length === 0 ? duplicates.scanning ? t("duplicates-scanning.message") : t("duplicates-none.message") : void 0);
|
|
327
|
+
return /* @__PURE__ */ jsx(SearchList.Root, {
|
|
328
|
+
onSearch: handleSearch,
|
|
329
|
+
children: /* @__PURE__ */ jsx(Tabs.Root, {
|
|
330
|
+
asChild: true,
|
|
331
|
+
value: layout,
|
|
332
|
+
onValueChange: (value) => setLayout(value),
|
|
333
|
+
children: /* @__PURE__ */ jsxs(Panel.Root, {
|
|
334
|
+
role,
|
|
335
|
+
children: [
|
|
336
|
+
/* @__PURE__ */ jsxs(Panel.Toolbar, {
|
|
337
|
+
classNames: mx("grid", layout !== "duplicates" && "grid-cols-[1fr_auto]"),
|
|
338
|
+
children: [layout !== "duplicates" && /* @__PURE__ */ jsx(SearchList.Input, { placeholder: t("search-placeholder.label") }), /* @__PURE__ */ jsx(Menu.Root, {
|
|
339
|
+
...menuActions,
|
|
340
|
+
attendableId,
|
|
341
|
+
alwaysActive: true,
|
|
342
|
+
children: /* @__PURE__ */ jsx(Menu.Toolbar, {})
|
|
343
|
+
})]
|
|
344
|
+
}),
|
|
345
|
+
/* @__PURE__ */ jsxs(Panel.Content, { children: [
|
|
346
|
+
/* @__PURE__ */ jsx(LayoutPanel, {
|
|
347
|
+
value: "masonry",
|
|
348
|
+
empty: noResults,
|
|
349
|
+
children: /* @__PURE__ */ jsx(Masonry.Root, {
|
|
350
|
+
Tile: TileAdapter,
|
|
351
|
+
children: /* @__PURE__ */ jsx(Masonry.Content, { children: /* @__PURE__ */ jsx(Masonry.Viewport, {
|
|
352
|
+
cacheKey: typeUri,
|
|
353
|
+
getId: (data) => Obj.getURI(data.object),
|
|
354
|
+
items: tileItems
|
|
355
|
+
}) })
|
|
356
|
+
})
|
|
357
|
+
}),
|
|
358
|
+
/* @__PURE__ */ jsx(LayoutPanel, {
|
|
359
|
+
value: "table",
|
|
360
|
+
empty: noResults,
|
|
361
|
+
children: /* @__PURE__ */ jsx(DynamicTable, {
|
|
362
|
+
type,
|
|
363
|
+
rows: results,
|
|
364
|
+
features: tableFeatures,
|
|
365
|
+
rowActions,
|
|
366
|
+
selection: selectedIds,
|
|
367
|
+
onRowAction: handleRowAction,
|
|
368
|
+
onSelectionChanged: setSelectedObjects
|
|
369
|
+
})
|
|
370
|
+
}),
|
|
371
|
+
duplicates.spec && /* @__PURE__ */ jsx(LayoutPanel, {
|
|
372
|
+
value: "duplicates",
|
|
373
|
+
empty: noDuplicates,
|
|
374
|
+
children: /* @__PURE__ */ jsx(Masonry.Root, {
|
|
375
|
+
Tile: TileAdapter,
|
|
376
|
+
children: /* @__PURE__ */ jsx(Masonry.Content, { children: /* @__PURE__ */ jsx(Masonry.Viewport, {
|
|
377
|
+
cacheKey: typeUri,
|
|
378
|
+
getId: (data) => Obj.getURI(data.object),
|
|
379
|
+
items: tileItems
|
|
380
|
+
}) })
|
|
381
|
+
})
|
|
382
|
+
})
|
|
383
|
+
] }),
|
|
384
|
+
/* @__PURE__ */ jsx(Panel.Statusbar, {
|
|
385
|
+
classNames: "flex items-center p-1 border-t border-subdued-separator",
|
|
386
|
+
children: t("item-count.label", { count: tileItems.length })
|
|
387
|
+
})
|
|
388
|
+
]
|
|
389
|
+
})
|
|
390
|
+
})
|
|
391
|
+
});
|
|
392
|
+
};
|
|
393
|
+
/** One layout's content, or the message standing in for it when the layout has nothing to show. */
|
|
394
|
+
var LayoutPanel = ({ value, empty, children }) => /* @__PURE__ */ jsx(Tabs.Panel, {
|
|
395
|
+
value,
|
|
396
|
+
classNames: "contents",
|
|
397
|
+
children: empty ? /* @__PURE__ */ jsx(Empty, {
|
|
398
|
+
classNames: "h-full",
|
|
399
|
+
label: empty
|
|
400
|
+
}) : children
|
|
401
|
+
});
|
|
402
|
+
var TileAdapter = ({ data }) => {
|
|
403
|
+
if (!data?.object) return null;
|
|
404
|
+
return /* @__PURE__ */ jsx(ObjectTile, { ...data });
|
|
405
|
+
};
|
|
406
|
+
/** Selectable header-only card for a single object. */
|
|
407
|
+
var ObjectTile = ({ object, current, onSelect, onOpen, onDelete }) => {
|
|
408
|
+
const { t } = useTranslation(meta.profile.key);
|
|
409
|
+
const [live] = useObject(object);
|
|
410
|
+
const typename = Obj.getTypename(live);
|
|
411
|
+
const label = Obj.getLabel(live) || t("object-name.placeholder", {
|
|
412
|
+
ns: typename ?? meta.profile.key,
|
|
413
|
+
defaultValue: t("object-name.placeholder")
|
|
414
|
+
});
|
|
415
|
+
const iconAnnotation = Obj.getIcon(live);
|
|
416
|
+
const icon = iconAnnotation?.icon ?? "ph--circle-dashed--regular";
|
|
417
|
+
const iconStyles = iconAnnotation?.hue ? getStyles(iconAnnotation.hue) : void 0;
|
|
418
|
+
const type = Obj.getType(object);
|
|
419
|
+
const showCardContent = !!type && Option.getOrElse(CardAnnotation.get(Type.getSchema(type)), () => false);
|
|
420
|
+
const cardData = useMemo(() => ({ subject: object }), [object]);
|
|
421
|
+
const handleCurrentChange = useCallback(() => onSelect(object.id), [onSelect, object]);
|
|
422
|
+
const menuItems = useMemo(() => [{
|
|
423
|
+
icon: "ph--arrow-square-out--regular",
|
|
424
|
+
label: t("open-object.label", {
|
|
425
|
+
ns: typename ?? meta.profile.key,
|
|
426
|
+
defaultValue: t("open-object.label")
|
|
427
|
+
}),
|
|
428
|
+
onClick: () => onOpen(object)
|
|
429
|
+
}, ...onDelete ? [{
|
|
430
|
+
icon: "ph--trash--regular",
|
|
431
|
+
label: t("delete-object.label", {
|
|
432
|
+
ns: typename ?? meta.profile.key,
|
|
433
|
+
defaultValue: t("delete-object.label")
|
|
434
|
+
}),
|
|
435
|
+
onClick: () => onDelete(object)
|
|
436
|
+
}] : []], [
|
|
437
|
+
t,
|
|
438
|
+
typename,
|
|
439
|
+
onOpen,
|
|
440
|
+
onDelete,
|
|
441
|
+
object
|
|
442
|
+
]);
|
|
443
|
+
return /* @__PURE__ */ jsx(Focus.Item, {
|
|
444
|
+
asChild: true,
|
|
445
|
+
current,
|
|
446
|
+
onCurrentChange: handleCurrentChange,
|
|
447
|
+
children: /* @__PURE__ */ jsxs(Card.Root, {
|
|
448
|
+
fullWidth: true,
|
|
449
|
+
classNames: ["dx-hover cursor-pointer", current && "dx-current"],
|
|
450
|
+
children: [/* @__PURE__ */ jsxs(Card.Header, { children: [
|
|
451
|
+
/* @__PURE__ */ jsx(Card.Block, { children: /* @__PURE__ */ jsx(Icon, {
|
|
452
|
+
icon,
|
|
453
|
+
classNames: iconStyles?.text
|
|
454
|
+
}) }),
|
|
455
|
+
/* @__PURE__ */ jsx(Card.Title, { children: label }),
|
|
456
|
+
menuItems.length > 0 && /* @__PURE__ */ jsx(Card.Menu, { items: menuItems })
|
|
457
|
+
] }), showCardContent && /* @__PURE__ */ jsx(Surface.Surface, {
|
|
458
|
+
type: AppSurface.CardContent,
|
|
459
|
+
data: cardData,
|
|
460
|
+
limit: 1
|
|
461
|
+
})]
|
|
462
|
+
})
|
|
463
|
+
});
|
|
464
|
+
};
|
|
465
|
+
TypeArticle.displayName = "TypeArticle";
|
|
466
|
+
//#endregion
|
|
467
|
+
export { TypeArticle as default };
|
|
468
|
+
|
|
469
|
+
//# sourceMappingURL=chunk-TypeArticle.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-TypeArticle.mjs","names":[],"sources":["../../src/containers/TypeArticle/useDuplicates.ts","../../src/containers/TypeArticle/duplicatesGroup.tsx","../../src/containers/TypeArticle/TypeArticle.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useAtomCapability, useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { Obj, Type } from '@dxos/echo';\nimport { type IdentitySpec, planMerge } from '@dxos/extractor';\nimport { type Space } from '@dxos/react-client/echo';\n\nimport { SpaceOperation } from '../../operations/definitions';\nimport { SpaceCapabilities } from '../../types';\n\nexport type UseDuplicatesProps = {\n space: Space;\n type: Type.AnyEntity;\n /** Live query results, so a group resolves to reactive objects rather than the scan's snapshots. */\n objects: readonly Obj.Unknown[];\n /** Scan only while the duplicates layout is showing. */\n enabled: boolean;\n};\n\nexport type UseDuplicatesResult = {\n /** `undefined` when no plugin registered an identity rule for this type — the tab is then hidden. */\n spec: IdentitySpec<any> | undefined;\n /** Members of the group under review, or `[]` when the review is finished. */\n current: Obj.Unknown[];\n /** 1-based position of the current group, for the toolbar counter. */\n position: number;\n total: number;\n scanning: boolean;\n next: () => void;\n previous: () => void;\n /** Re-runs the scan (after a merge, or when re-entering the tab). */\n refresh: () => void;\n};\n\n/**\n * Drives the duplicates review: runs `FindDuplicates` for the type, then walks the returned groups\n * one at a time. Groups are held as ids and resolved against the live query on every render, so a\n * merged-away member disappears from the current group without a rescan.\n */\nexport const useDuplicates = ({ space, type, objects, enabled }: UseDuplicatesProps): UseDuplicatesResult => {\n const { invokePromise } = useOperationInvoker();\n const specs = useCapabilities(SpaceCapabilities.IdentitySpec);\n const typename = Type.getTypename(type);\n const spec = useMemo(\n () => specs.find((candidate) => Type.getTypename(candidate.type) === typename),\n [specs, typename],\n );\n\n const [groups, setGroups] = useState<readonly SpaceOperation.DuplicateGroupResult[]>([]);\n const [index, setIndex] = useState(0);\n const [scanning, setScanning] = useState(false);\n // Rescan is a button a user can hit repeatedly, and a merge triggers its own refresh, so responses\n // can land out of order; only the newest request is allowed to write.\n const request = useRef(0);\n const { lastMergeAt } = useAtomCapability(SpaceCapabilities.EphemeralState);\n\n const refresh = useCallback(() => {\n if (!spec) {\n return;\n }\n setScanning(true);\n const current = ++request.current;\n void invokePromise(SpaceOperation.FindDuplicates, { typename }, { spaceId: space.id })\n .then(({ data }) => {\n if (current !== request.current) {\n return;\n }\n setGroups(data?.groups ?? []);\n setIndex(0);\n })\n .finally(() => {\n if (current === request.current) {\n setScanning(false);\n }\n });\n }, [invokePromise, spec, typename, space.id]);\n\n // `lastMergeAt` is a dependency, not a read: a committed merge invalidates the scan.\n useEffect(() => {\n if (enabled) {\n refresh();\n }\n }, [enabled, refresh, lastMergeAt]);\n\n const byId = useMemo(() => new Map(objects.map((object) => [object.id, object])), [objects]);\n const current = useMemo(() => {\n const group = groups[index];\n return group ? group.objectIds.flatMap((id) => byId.get(id) ?? []) : [];\n }, [groups, index, byId]);\n\n return {\n spec,\n current,\n position: groups.length === 0 ? 0 : index + 1,\n total: groups.length,\n scanning,\n // Clamp at the last valid index, not at `groups.length`: `position` is `index + 1`, so one past\n // the end rendered an impossible counter (\"4 / 3\") when Skip was pressed on the last group.\n next: useCallback(() => setIndex((value) => Math.min(value + 1, Math.max(groups.length - 1, 0))), [groups.length]),\n previous: useCallback(() => setIndex((value) => Math.max(value - 1, 0)), []),\n refresh,\n };\n};\n\n/** Builds the detached preview for the group under review; `undefined` when there is nothing to merge. */\nexport const buildMergePreview = (\n spec: IdentitySpec<any> | undefined,\n objects: readonly Obj.Unknown[],\n): Obj.Unknown | undefined => {\n if (!spec || objects.length < 2) {\n return undefined;\n }\n const { preview } = planMerge(spec, { keys: [], objects });\n return Obj.isObject(preview) ? preview : undefined;\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { useAtomCapabilityState } from '@dxos/app-framework/ui';\nimport { type ActionGroupBuilderFn } from '@dxos/react-ui-menu';\n\nimport { meta } from '#meta';\n\nimport { SpaceCapabilities } from '../../types';\nimport { type UseDuplicatesResult, buildMergePreview } from './useDuplicates';\n\nexport type UseDuplicatesGroupOptions = {\n /** URI of the type under review; scopes the staged preview to this article. */\n typeUri: string;\n typename: string;\n duplicates: UseDuplicatesResult;\n};\n\n/**\n * Toolbar subgraph for the duplicates review: Merge stages a preview into the companion, Skip and\n * the arrows walk the groups, and the trailing gap separator pushes whatever follows (the layout\n * toggle) to the far end. Merge never writes — it stages a detached preview the companion confirms,\n * so backing out of a review leaves the space untouched.\n *\n * Compose via `MenuBuilder.subgraph(...)` so the whole toolbar is one action graph rather than\n * several nested `Toolbar.Root`s.\n */\nexport const useDuplicatesGroup = ({\n typeUri,\n typename,\n duplicates,\n}: UseDuplicatesGroupOptions): ActionGroupBuilderFn => {\n const [, updateEphemeral] = useAtomCapabilityState(SpaceCapabilities.EphemeralState);\n const { spec, current, position, total, scanning, next, previous, refresh } = duplicates;\n\n // Every control that changes which group is under review drops the staged preview: it belongs to\n // the group it was raised from, and leaving it up would show the companion previewing one group\n // while the article shows another.\n const clearPreview = useCallback(\n () => updateEphemeral((state) => ({ ...state, mergePreview: undefined })),\n [updateEphemeral],\n );\n\n const handleMerge = useCallback(() => {\n const preview = buildMergePreview(spec, current);\n if (!preview) {\n return;\n }\n updateEphemeral((state) => ({\n ...state,\n mergePreview: { typeUri, typename, objectIds: current.map((object) => object.id), preview },\n }));\n }, [updateEphemeral, spec, current, typeUri, typename]);\n\n // Skip and the next arrow are the same move — advance past the group without writing.\n const handleAdvance = useCallback(() => {\n clearPreview();\n next();\n }, [clearPreview, next]);\n\n const handlePrevious = useCallback(() => {\n clearPreview();\n previous();\n }, [clearPreview, previous]);\n\n const handleRefresh = useCallback(() => {\n clearPreview();\n refresh();\n }, [clearPreview, refresh]);\n\n return useMemo(\n () => (builder) => {\n builder\n .action(\n 'merge',\n {\n label: ['merge-duplicates.label', { ns: meta.profile.key }],\n icon: 'ph--arrows-merge--regular',\n variant: 'primary',\n iconOnly: false,\n disabled: current.length < 2,\n },\n handleMerge,\n )\n .action(\n 'skip',\n {\n label: ['skip-duplicates.label', { ns: meta.profile.key }],\n iconOnly: false,\n // Same bound as the next arrow: skipping past the last group left the counter out of range.\n disabled: position >= total,\n },\n handleAdvance,\n )\n .action(\n 'rescan',\n {\n label: ['rescan-duplicates.label', { ns: meta.profile.key }],\n icon: 'ph--arrows-clockwise--regular',\n disabled: scanning,\n spin: scanning,\n },\n handleRefresh,\n )\n .subgraph((builder) =>\n total === 0\n ? []\n : builder\n .action(\n 'previous',\n {\n label: ['previous-duplicate.label', { ns: meta.profile.key }],\n icon: 'ph--caret-left--regular',\n disabled: position <= 1,\n },\n handlePrevious,\n )\n .action(\n 'position',\n {\n // The group counter is not an action; `custom` lets the graph carry it so the toolbar stays\n // a single menu rather than a menu plus a hand-rolled toolbar for one label.\n variant: 'custom',\n label: ['duplicates-position.label', { ns: meta.profile.key }],\n render: () => (\n <span className='text-description text-sm tabular-nums'>\n {position} / {total}\n </span>\n ),\n },\n () => {},\n )\n .action(\n 'next',\n {\n label: ['next-duplicate.label', { ns: meta.profile.key }],\n icon: 'ph--caret-right--regular',\n disabled: position >= total,\n },\n handleAdvance,\n ),\n )\n .separator();\n },\n [current.length, position, total, scanning, handleMerge, handleAdvance, handlePrevious, handleRefresh],\n );\n};\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport React, { type PropsWithChildren, useCallback, useMemo, useState } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { GraphPath, LayoutOperation } from '@dxos/app-toolkit';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { Filter, Obj, Type } from '@dxos/echo';\nimport { useObject, useQuery } from '@dxos/echo-react';\nimport { type Space } from '@dxos/react-client/echo';\nimport { Card, Focus, Icon, Panel, useTranslation } from '@dxos/react-ui';\nimport { useSelection, useSelectionActions } from '@dxos/react-ui-attention';\nimport { Empty } from '@dxos/react-ui-list';\nimport { Masonry } from '@dxos/react-ui-masonry';\nimport { Menu, MenuBuilder, useMenuBuilder } from '@dxos/react-ui-menu';\nimport { SearchList, useSearchListResults } from '@dxos/react-ui-search';\nimport { DynamicTable, type TableRowAction } from '@dxos/react-ui-table';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { CardAnnotation } from '@dxos/schema';\nimport { getStyles, mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { SpaceOperation } from '../../operations';\nimport { useDuplicatesGroup } from './duplicatesGroup';\nimport { useDuplicates } from './useDuplicates';\n\n/** Sidebar layout modes for a type article. */\ntype Layout = 'masonry' | 'table' | 'duplicates';\n\nconst LAYOUTS: { value: Layout; icon: string }[] = [\n {\n value: 'masonry',\n icon: 'ph--squares-four--regular',\n },\n {\n value: 'table',\n icon: 'ph--table--regular',\n },\n {\n value: 'duplicates',\n icon: 'ph--copy--regular',\n },\n];\n\nexport type TypeArticleProps = {\n role?: string;\n space: Space;\n type: Type.AnyEntity;\n attendableId: string;\n};\n\n/**\n * List view rendered when a type node is selected: a toolbar with a Masonry/Table layout switch and a\n * text filter over every object of the type. Selecting an item opens it as a sibling plank.\n *\n * Objects are not enumerated in the nav tree; each navigated object becomes a hidden child of the\n * type node resolved on demand.\n */\nexport const TypeArticle = ({ role, space, type, attendableId }: TypeArticleProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const [layout, setLayout] = useState<Layout>('masonry');\n const typeUri = Type.getURI(type);\n const objects = useQuery(space.db, Filter.type(typeUri));\n\n // Text filter over the object labels; feeds both the masonry tiles and the table rows.\n const { results, handleSearch } = useSearchListResults<Obj.Unknown>({\n items: objects,\n extract: (object) => Obj.getLabel(object) ?? '',\n });\n\n // Selection is keyed by the type's own URI — the same id the 'selected-objects' companion resolves\n // from its `companionTo` (see react-surface.tsx), so cards, table rows and the companion agree.\n const selectedIds = useSelection(typeUri, 'multi');\n const { multi: setSelectedObjects, toggle: toggleSelected } = useSelectionActions(typeUri);\n\n // TODO(burdon): Factor out as an aspect?\n const duplicates = useDuplicates({ space, type, objects, enabled: layout === 'duplicates' });\n const duplicatesGroup = useDuplicatesGroup({\n typeUri,\n typename: Type.getTypename(type),\n duplicates,\n });\n\n // Duplicates is offered only for types some plugin registered an identity rule for:\n // there is nothing to scan otherwise.\n const layouts = useMemo(\n () => LAYOUTS.filter(({ value }) => value !== 'duplicates' || duplicates.spec),\n [duplicates.spec],\n );\n\n const handleOpen = useCallback(\n (object: Obj.Unknown) => {\n const id = Obj.getURI(object);\n void invokePromise(LayoutOperation.Select, { contextId: attendableId, subject: { mode: 'single', id } });\n void invokePromise(LayoutOperation.Open, {\n // Open under the node being viewed rather than the object's canonical type path, so an object\n // reached from a type section opens within that section. Identical for a database type node,\n // whose object path already is `<typeNode>/<id>`.\n subject: [GraphPath.getCollectionObjectPath(attendableId, object.id)],\n pivotId: attendableId,\n disposition: 'add',\n navigation: 'immediate',\n });\n },\n [attendableId, invokePromise],\n );\n\n const handleDelete = useCallback((object: Obj.Unknown) => {\n Obj.getDatabase(object)?.remove(object);\n }, []);\n\n // Undoable removal of every checked row, so a mis-click on a multi-row delete is recoverable.\n const handleDeleteSelected = useCallback(() => {\n const selected = objects.filter((object) => selectedIds.includes(object.id));\n if (selected.length > 0) {\n void invokePromise(SpaceOperation.RemoveObjects, { objects: selected }, { spaceId: space.id });\n setSelectedObjects([]);\n }\n }, [objects, selectedIds, invokePromise, space.id, setSelectedObjects]);\n\n // Stable identity: `DynamicTable` rebuilds its model whenever `features` changes, so an inline\n // literal here would discard and re-seed the table's selection on every render.\n const tableFeatures = useMemo(\n () => ({\n selection: { enabled: true, mode: 'multiple' as const },\n dataEditable: true,\n schemaEditable: false,\n pinColumns: 1,\n }),\n [],\n );\n\n // Table rows are editable, so opening a row is a deliberate row action rather than `onRowClick`\n // (which would fire on every cell click and fight with in-cell editing).\n const rowActions = useMemo(\n (): TableRowAction[] => [{ id: 'open', label: ['open-object.label', { ns: meta.profile.key }] }],\n [],\n );\n\n const handleRowAction = useCallback(\n (actionId: string, object: Obj.Unknown) => {\n if (actionId === 'open') {\n handleOpen(object);\n }\n },\n [handleOpen],\n );\n\n // One action graph for the whole toolbar: the mode-specific actions first, then the layout toggle.\n // Composing several `Toolbar.Root`s instead would each need their own roving-focus group and would\n // fight over the row's width.\n const menuActions = useMenuBuilder(\n () =>\n MenuBuilder.make()\n .subgraph(layout === 'duplicates' && duplicatesGroup)\n .subgraph(\n layout === 'table' &&\n selectedIds.length > 0 &&\n ((builder) => {\n builder.action(\n 'delete-selected',\n {\n label: ['delete-selected.label', { ns: meta.profile.key, count: selectedIds.length }],\n icon: 'ph--trash--regular',\n },\n handleDeleteSelected,\n );\n }),\n )\n .separator()\n .group(\n 'layout',\n {\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value: layout,\n label: ['layout.label', { ns: meta.profile.key }],\n },\n (group) => {\n layouts.forEach(({ value, icon }) => {\n group.action(value, { label: [`layout-${value}.label`, { ns: meta.profile.key }], icon }, () =>\n setLayout(value),\n );\n });\n },\n )\n .build(),\n [layout, layouts, selectedIds.length, duplicatesGroup, handleDeleteSelected],\n );\n\n // The card grid backs two layouts — every object for `masonry`, only the group under review for\n // `duplicates` — so the items are resolved here and the grid itself is declared once.\n const tiles = layout === 'duplicates' ? duplicates.current : results;\n const tileItems = useMemo<TileData[]>(\n () =>\n tiles.map((object) => ({\n object,\n current: selectedIds.includes(object.id),\n onSelect: toggleSelected,\n onOpen: handleOpen,\n onDelete: Obj.getParent(object) ? undefined : handleDelete,\n })),\n [tiles, selectedIds, toggleSelected, handleOpen, handleDelete],\n );\n\n // A type with no objects at all has nothing for any layout to show; past that each layout says\n // when it is empty for its own reason.\n const noObjects = objects.length === 0 ? t('type-collection-empty.message') : undefined;\n const noResults = noObjects ?? (results.length === 0 ? t('search-no-results.message') : undefined);\n const noDuplicates =\n noObjects ??\n (duplicates.current.length === 0\n ? duplicates.scanning\n ? t('duplicates-scanning.message')\n : t('duplicates-none.message')\n : undefined);\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <Tabs.Root asChild value={layout} onValueChange={(value) => setLayout(value as Layout)}>\n <Panel.Root role={role}>\n <Panel.Toolbar classNames={mx('grid', layout !== 'duplicates' && 'grid-cols-[1fr_auto]')}>\n {layout !== 'duplicates' && <SearchList.Input placeholder={t('search-placeholder.label')} />}\n <Menu.Root {...menuActions} attendableId={attendableId} alwaysActive>\n <Menu.Toolbar />\n </Menu.Root>\n </Panel.Toolbar>\n <Panel.Content>\n <LayoutPanel value='masonry' empty={noResults}>\n <Masonry.Root Tile={TileAdapter}>\n <Masonry.Content>\n <Masonry.Viewport cacheKey={typeUri} getId={(data) => Obj.getURI(data.object)} items={tileItems} />\n </Masonry.Content>\n </Masonry.Root>\n </LayoutPanel>\n <LayoutPanel value='table' empty={noResults}>\n <DynamicTable\n type={type}\n rows={results}\n features={tableFeatures}\n rowActions={rowActions}\n // Seed from the shared selection so switching card → table keeps what was selected;\n // the table otherwise starts from its own empty model.\n selection={selectedIds}\n onRowAction={handleRowAction}\n onSelectionChanged={setSelectedObjects}\n />\n </LayoutPanel>\n {duplicates.spec && (\n <LayoutPanel value='duplicates' empty={noDuplicates}>\n <Masonry.Root Tile={TileAdapter}>\n <Masonry.Content>\n <Masonry.Viewport cacheKey={typeUri} getId={(data) => Obj.getURI(data.object)} items={tileItems} />\n </Masonry.Content>\n </Masonry.Root>\n </LayoutPanel>\n )}\n </Panel.Content>\n <Panel.Statusbar classNames='flex items-center p-1 border-t border-subdued-separator'>\n {t('item-count.label', { count: tileItems.length })}\n </Panel.Statusbar>\n </Panel.Root>\n </Tabs.Root>\n </SearchList.Root>\n );\n};\n\n/** One layout's content, or the message standing in for it when the layout has nothing to show. */\nconst LayoutPanel = ({ value, empty, children }: PropsWithChildren<{ value: Layout; empty?: string }>) => (\n <Tabs.Panel value={value} classNames='contents'>\n {empty ? <Empty classNames='h-full' label={empty} /> : children}\n </Tabs.Panel>\n);\n\ntype TileData = {\n object: Obj.Unknown;\n current: boolean;\n onSelect: (id: string) => void;\n onOpen: (object: Obj.Unknown) => void;\n onDelete?: (object: Obj.Unknown) => void;\n};\n\nconst TileAdapter = ({ data }: { data: TileData | undefined; index: number }) => {\n if (!data?.object) {\n return null;\n }\n\n return <ObjectTile {...data} />;\n};\n\n/** Selectable header-only card for a single object. */\nconst ObjectTile = ({ object, current, onSelect, onOpen, onDelete }: TileData) => {\n const { t } = useTranslation(meta.profile.key);\n // Subscribe so the label re-renders when the object changes.\n const [live] = useObject(object);\n const typename = Obj.getTypename(live);\n const label =\n Obj.getLabel(live) ||\n t('object-name.placeholder', { ns: typename ?? meta.profile.key, defaultValue: t('object-name.placeholder') });\n\n const iconAnnotation = Obj.getIcon(live);\n const icon = iconAnnotation?.icon ?? 'ph--circle-dashed--regular';\n const iconStyles = iconAnnotation?.hue ? getStyles(iconAnnotation.hue) : undefined;\n\n // Render a content preview body only for types that opt in via `CardAnnotation`.\n const type = Obj.getType(object);\n const showCardContent = !!type && Option.getOrElse(CardAnnotation.get(Type.getSchema(type)), () => false);\n const cardData = useMemo<AppSurface.ObjectCardData>(() => ({ subject: object }), [object]);\n\n // `Focus.Item` calls `onCurrentChange` on click and on Enter. A card click toggles selection —\n // the companion follows the selection, so navigating away on every click would fight the review\n // workflow; opening stays available from the card menu.\n const handleCurrentChange = useCallback(() => onSelect(object.id), [onSelect, object]);\n\n const menuItems = useMemo(\n () => [\n {\n icon: 'ph--arrow-square-out--regular',\n label: t('open-object.label', {\n ns: typename ?? meta.profile.key,\n defaultValue: t('open-object.label'),\n }),\n onClick: () => onOpen(object),\n },\n ...(onDelete\n ? [\n {\n icon: 'ph--trash--regular',\n label: t('delete-object.label', {\n ns: typename ?? meta.profile.key,\n defaultValue: t('delete-object.label'),\n }),\n onClick: () => onDelete(object),\n },\n ]\n : []),\n ],\n [t, typename, onOpen, onDelete, object],\n );\n\n return (\n <Focus.Item asChild current={current} onCurrentChange={handleCurrentChange}>\n <Card.Root fullWidth classNames={['dx-hover cursor-pointer', current && 'dx-current']}>\n <Card.Header>\n <Card.Block>\n <Icon icon={icon} classNames={iconStyles?.text} />\n </Card.Block>\n <Card.Title>{label}</Card.Title>\n {menuItems.length > 0 && <Card.Menu items={menuItems} />}\n </Card.Header>\n {showCardContent && <Surface.Surface type={AppSurface.CardContent} data={cardData} limit={1} />}\n </Card.Root>\n </Focus.Item>\n );\n};\n\nTypeArticle.displayName = 'TypeArticle';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Filter, Obj, Query, Scope, Tag, Type } from "@dxos/echo";
|
|
2
|
+
import { SpaceOperation } from "#operations";
|
|
3
|
+
import { ViewModel } from "@dxos/schema";
|
|
4
|
+
import { useCallback, useState } from "react";
|
|
5
|
+
import { useOperationInvoker } from "@dxos/app-framework/ui";
|
|
6
|
+
import { useTypeOptions } from "@dxos/app-toolkit/ui";
|
|
7
|
+
import { useQuery } from "@dxos/echo-react";
|
|
8
|
+
import { useClient } from "@dxos/react-client";
|
|
9
|
+
import { useAsyncEffect } from "@dxos/react-ui";
|
|
10
|
+
import { jsx } from "react/jsx-runtime";
|
|
11
|
+
import { ViewEditor as ViewEditor$1 } from "@dxos/react-ui-form";
|
|
12
|
+
import { resolveSchemaWithRegistry } from "@dxos/app-toolkit/query";
|
|
13
|
+
//#region src/containers/ViewEditor/ViewEditor.tsx
|
|
14
|
+
var ViewEditor = ({ view }) => {
|
|
15
|
+
const { invokePromise } = useOperationInvoker();
|
|
16
|
+
const client = useClient();
|
|
17
|
+
const db = Obj.getDatabase(view);
|
|
18
|
+
const [type, setType] = useState();
|
|
19
|
+
const tags = useQuery(db, Filter.type(Tag.Tag));
|
|
20
|
+
const types = useTypeOptions({
|
|
21
|
+
db,
|
|
22
|
+
annotation: {
|
|
23
|
+
location: ["database", "runtime"],
|
|
24
|
+
kind: ["user"]
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
useAsyncEffect(async () => {
|
|
28
|
+
if (!view?.query || !db) return;
|
|
29
|
+
const foundType = await resolveSchemaWithRegistry(db, view.query.ast);
|
|
30
|
+
if (foundType && foundType !== type) setType(() => foundType);
|
|
31
|
+
}, [
|
|
32
|
+
client,
|
|
33
|
+
db,
|
|
34
|
+
view,
|
|
35
|
+
type
|
|
36
|
+
]);
|
|
37
|
+
const handleQueryChanged = useCallback(async (newQuery, target) => {
|
|
38
|
+
if (!view || !db) return;
|
|
39
|
+
const queue = target;
|
|
40
|
+
const query = queue ? Query.fromAst(newQuery).from([Scope.feed(queue)]) : Query.fromAst(newQuery);
|
|
41
|
+
Obj.update(view, (view) => {
|
|
42
|
+
view.query.ast = query.ast;
|
|
43
|
+
});
|
|
44
|
+
const newType = await resolveSchemaWithRegistry(db, query.ast);
|
|
45
|
+
if (!newType) return;
|
|
46
|
+
const newView = ViewModel.make({
|
|
47
|
+
query,
|
|
48
|
+
jsonSchema: newType.jsonSchema
|
|
49
|
+
});
|
|
50
|
+
Obj.update(view, (view) => {
|
|
51
|
+
view.projection = Obj.getSnapshot(newView).projection;
|
|
52
|
+
});
|
|
53
|
+
setType(() => newType);
|
|
54
|
+
}, [view, type]);
|
|
55
|
+
const handleDelete = useCallback((fieldId) => {
|
|
56
|
+
invokePromise(SpaceOperation.DeleteField, {
|
|
57
|
+
view,
|
|
58
|
+
fieldId
|
|
59
|
+
});
|
|
60
|
+
}, [invokePromise, view]);
|
|
61
|
+
if (!db || !type) return null;
|
|
62
|
+
return /* @__PURE__ */ jsx(ViewEditor$1, {
|
|
63
|
+
registry: db.graph.registry,
|
|
64
|
+
type,
|
|
65
|
+
view,
|
|
66
|
+
mode: "tag",
|
|
67
|
+
db,
|
|
68
|
+
tags,
|
|
69
|
+
types,
|
|
70
|
+
onQueryChanged: handleQueryChanged,
|
|
71
|
+
onDelete: Type.getDatabase(type) != null ? handleDelete : void 0
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
ViewEditor.displayName = "ViewEditor";
|
|
75
|
+
//#endregion
|
|
76
|
+
export { ViewEditor as default };
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=chunk-ViewEditor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-ViewEditor.mjs","names":[],"sources":["../../src/containers/ViewEditor/ViewEditor.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useState } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';\nimport { useTypeOptions } from '@dxos/app-toolkit/ui';\nimport { EID, Filter, Obj, Query, type QueryAST, Scope, Tag, Type, type View } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { type Mutable } from '@dxos/echo/Obj';\nimport { useClient } from '@dxos/react-client';\nimport { useAsyncEffect } from '@dxos/react-ui';\nimport { ViewEditor as NaturalViewEditor } from '@dxos/react-ui-form';\nimport { ViewModel } from '@dxos/schema';\n\nimport { SpaceOperation } from '#operations';\n\nexport type ViewEditorProps = { view: View.View };\n\nexport const ViewEditor = ({ view }: ViewEditorProps) => {\n const { invokePromise } = useOperationInvoker();\n const client = useClient();\n const db = Obj.getDatabase(view);\n const [type, setType] = useState<Type.AnyEntity>();\n const tags = useQuery(db, Filter.type(Tag.Tag));\n const types = useTypeOptions({\n db,\n annotation: {\n location: ['database', 'runtime'],\n kind: ['user'],\n },\n });\n\n useAsyncEffect(async () => {\n if (!view?.query || !db) {\n return;\n }\n\n const foundType = await resolveSchemaWithRegistry(db, view.query.ast);\n if (foundType && foundType !== type) {\n setType(() => foundType);\n }\n }, [client, db, view, type]);\n\n const handleQueryChanged = useCallback(\n async (newQuery: QueryAST.Query, target?: EID.EID) => {\n if (!view || !db) {\n return;\n }\n\n const queue = target;\n const query = queue ? Query.fromAst(newQuery).from([Scope.feed(queue)]) : Query.fromAst(newQuery);\n Obj.update(view, (view) => {\n view.query.ast = query.ast as Mutable<typeof query.ast>;\n });\n const newType = await resolveSchemaWithRegistry(db, query.ast);\n if (!newType) {\n return;\n }\n\n const newView = ViewModel.make({\n query,\n jsonSchema: newType.jsonSchema,\n });\n Obj.update(view, (view) => {\n view.projection = Obj.getSnapshot(newView).projection as Mutable<typeof view.projection>;\n });\n\n setType(() => newType);\n },\n [view, type],\n );\n\n const handleDelete = useCallback(\n (fieldId: string) => {\n void invokePromise(SpaceOperation.DeleteField, { view, fieldId });\n },\n [invokePromise, view],\n );\n\n if (!db || !type) {\n return null;\n }\n\n return (\n <NaturalViewEditor\n registry={db.graph.registry}\n type={type}\n view={view}\n mode='tag'\n db={db}\n tags={tags}\n types={types}\n onQueryChanged={handleQueryChanged}\n onDelete={Type.getDatabase(type) != null ? handleDelete : undefined}\n />\n );\n};\n\nViewEditor.displayName = 'ViewEditor';\n"],"mappings":";;;;;;;;;;;;;AAqBA,IAAa,cAAc,EAAE,WAA4B;CACvD,MAAM,EAAE,kBAAkB,oBAAoB;CAC9C,MAAM,SAAS,UAAU;CACzB,MAAM,KAAK,IAAI,YAAY,IAAI;CAC/B,MAAM,CAAC,MAAM,WAAW,SAAyB;CACjD,MAAM,OAAO,SAAS,IAAI,OAAO,KAAK,IAAI,GAAG,CAAC;CAC9C,MAAM,QAAQ,eAAe;EAC3B;EACA,YAAY;GACV,UAAU,CAAC,YAAY,SAAS;GAChC,MAAM,CAAC,MAAM;EACf;CACF,CAAC;CAED,eAAe,YAAY;EACzB,IAAI,CAAC,MAAM,SAAS,CAAC,IACnB;EAGF,MAAM,YAAY,MAAM,0BAA0B,IAAI,KAAK,MAAM,GAAG;EACpE,IAAI,aAAa,cAAc,MAC7B,cAAc,SAAS;CAE3B,GAAG;EAAC;EAAQ;EAAI;EAAM;CAAI,CAAC;CAE3B,MAAM,qBAAqB,YACzB,OAAO,UAA0B,WAAqB;EACpD,IAAI,CAAC,QAAQ,CAAC,IACZ;EAGF,MAAM,QAAQ;EACd,MAAM,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,QAAQ,QAAQ;EAChG,IAAI,OAAO,OAAO,SAAS;GACzB,KAAK,MAAM,MAAM,MAAM;EACzB,CAAC;EACD,MAAM,UAAU,MAAM,0BAA0B,IAAI,MAAM,GAAG;EAC7D,IAAI,CAAC,SACH;EAGF,MAAM,UAAU,UAAU,KAAK;GAC7B;GACA,YAAY,QAAQ;EACtB,CAAC;EACD,IAAI,OAAO,OAAO,SAAS;GACzB,KAAK,aAAa,IAAI,YAAY,OAAO,CAAC,CAAC;EAC7C,CAAC;EAED,cAAc,OAAO;CACvB,GACA,CAAC,MAAM,IAAI,CACb;CAEA,MAAM,eAAe,aAClB,YAAoB;EACnB,cAAmB,eAAe,aAAa;GAAE;GAAM;EAAQ,CAAC;CAClE,GACA,CAAC,eAAe,IAAI,CACtB;CAEA,IAAI,CAAC,MAAM,CAAC,MACV,OAAO;CAGT,OACE,oBAAC,cAAD;EACE,UAAU,GAAG,MAAM;EACb;EACA;EACN,MAAK;EACD;EACE;EACC;EACP,gBAAgB;EAChB,UAAU,KAAK,YAAY,IAAI,KAAK,OAAO,eAAe,KAAA;CAC3D,CAAA;AAEL;AAEA,WAAW,cAAc"}
|