@dxos/plugin-search 0.8.4-main.fd6878d → 0.8.4-main.fffef41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{app-graph-builder-D2QQTIIR.mjs → app-graph-builder-HQR6P4C7.mjs} +17 -16
- package/dist/lib/browser/app-graph-builder-HQR6P4C7.mjs.map +7 -0
- package/dist/lib/browser/chunk-GN2FSWTM.mjs +22 -0
- package/dist/lib/browser/chunk-GN2FSWTM.mjs.map +7 -0
- package/dist/lib/browser/{chunk-JVMYGOKS.mjs → chunk-TCVYYI44.mjs} +5 -5
- package/dist/lib/browser/chunk-TCVYYI44.mjs.map +7 -0
- package/dist/lib/browser/{chunk-VKV5ZDB4.mjs → chunk-ZEP4O5SU.mjs} +111 -10
- package/dist/lib/browser/chunk-ZEP4O5SU.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +11 -11
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/{intent-resolver-NXFDPFHC.mjs → intent-resolver-UYQA6UUQ.mjs} +5 -5
- package/dist/lib/browser/{intent-resolver-NXFDPFHC.mjs.map → intent-resolver-UYQA6UUQ.mjs.map} +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-surface-LV7ZVI2K.mjs +293 -0
- package/dist/lib/browser/react-surface-LV7ZVI2K.mjs.map +7 -0
- package/dist/types/src/SearchPlugin.d.ts +1 -1
- package/dist/types/src/SearchPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +3 -3
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.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/components/Search.stories.d.ts +13 -12
- package/dist/types/src/components/Search.stories.d.ts.map +1 -1
- package/dist/types/src/components/SearchDialog.d.ts +1 -1
- package/dist/types/src/components/SearchDialog.d.ts.map +1 -1
- package/dist/types/src/components/SearchMain.d.ts +4 -5
- package/dist/types/src/components/SearchMain.d.ts.map +1 -1
- package/dist/types/src/components/SearchResults/SearchResults.d.ts +9 -9
- package/dist/types/src/components/SearchResults/SearchResults.d.ts.map +1 -1
- package/dist/types/src/components/SearchResults/SearchResults.stories.d.ts +12 -8
- package/dist/types/src/components/SearchResults/SearchResults.stories.d.ts.map +1 -1
- package/dist/types/src/components/Searchbar/Searchbar.d.ts +5 -9
- package/dist/types/src/components/Searchbar/Searchbar.d.ts.map +1 -1
- package/dist/types/src/components/Searchbar/Searchbar.stories.d.ts +10 -8
- package/dist/types/src/components/Searchbar/Searchbar.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/sync.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/search/exa.d.ts +1 -1
- package/dist/types/src/search/exa.d.ts.map +1 -1
- package/dist/types/src/types/action.d.ts +3 -3
- package/dist/types/src/types/action.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +39 -39
- package/src/SearchPlugin.tsx +41 -42
- package/src/capabilities/app-graph-builder.ts +14 -13
- package/src/capabilities/react-surface.tsx +0 -3
- package/src/components/Search.stories.tsx +11 -14
- package/src/components/SearchDialog.tsx +23 -11
- package/src/components/SearchMain.tsx +17 -26
- package/src/components/SearchResults/SearchResults.stories.tsx +18 -17
- package/src/components/SearchResults/SearchResults.tsx +46 -49
- package/src/components/Searchbar/Searchbar.stories.tsx +8 -8
- package/src/components/Searchbar/Searchbar.tsx +26 -45
- package/src/hooks/index.ts +2 -0
- package/src/hooks/sync.ts +5 -4
- package/src/hooks/useSearchResults.ts +4 -4
- package/src/hooks/useWebSearch.ts +1 -1
- package/src/meta.ts +8 -5
- package/src/search/exa.test.ts +8 -10
- package/src/search/exa.ts +7 -5
- package/src/types/action.tsx +3 -3
- package/dist/lib/browser/app-graph-builder-D2QQTIIR.mjs.map +0 -7
- package/dist/lib/browser/chunk-JVMYGOKS.mjs.map +0 -7
- package/dist/lib/browser/chunk-KNS62YL2.mjs +0 -20
- package/dist/lib/browser/chunk-KNS62YL2.mjs.map +0 -7
- package/dist/lib/browser/chunk-VKV5ZDB4.mjs.map +0 -7
- package/dist/lib/browser/react-surface-B2XYD6JN.mjs +0 -468
- package/dist/lib/browser/react-surface-B2XYD6JN.mjs.map +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-search",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.fffef41",
|
|
4
4
|
"description": "Braneframe sketch plugin",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -27,50 +27,50 @@
|
|
|
27
27
|
"@preact-signals/safe-react": "^0.9.0",
|
|
28
28
|
"exa-js": "^1.5.12",
|
|
29
29
|
"main-thread-scheduling": "^14.1.1",
|
|
30
|
-
"@dxos/ai": "0.8.4-main.
|
|
31
|
-
"@dxos/app-framework": "0.8.4-main.
|
|
32
|
-
"@dxos/assistant": "0.8.4-main.
|
|
33
|
-
"@dxos/blueprints": "0.8.4-main.
|
|
34
|
-
"@dxos/debug": "0.8.4-main.
|
|
35
|
-
"@dxos/echo": "0.8.4-main.
|
|
36
|
-
"@dxos/
|
|
37
|
-
"@dxos/
|
|
38
|
-
"@dxos/
|
|
39
|
-
"@dxos/
|
|
40
|
-
"@dxos/log": "0.8.4-main.
|
|
41
|
-
"@dxos/plugin-client": "0.8.4-main.
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/plugin-
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/react-
|
|
46
|
-
"@dxos/plugin-
|
|
47
|
-
"@dxos/react-ui-stack": "0.8.4-main.
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/
|
|
30
|
+
"@dxos/ai": "0.8.4-main.fffef41",
|
|
31
|
+
"@dxos/app-framework": "0.8.4-main.fffef41",
|
|
32
|
+
"@dxos/assistant": "0.8.4-main.fffef41",
|
|
33
|
+
"@dxos/blueprints": "0.8.4-main.fffef41",
|
|
34
|
+
"@dxos/debug": "0.8.4-main.fffef41",
|
|
35
|
+
"@dxos/echo-protocol": "0.8.4-main.fffef41",
|
|
36
|
+
"@dxos/effect": "0.8.4-main.fffef41",
|
|
37
|
+
"@dxos/invariant": "0.8.4-main.fffef41",
|
|
38
|
+
"@dxos/echo": "0.8.4-main.fffef41",
|
|
39
|
+
"@dxos/live-object": "0.8.4-main.fffef41",
|
|
40
|
+
"@dxos/log": "0.8.4-main.fffef41",
|
|
41
|
+
"@dxos/plugin-client": "0.8.4-main.fffef41",
|
|
42
|
+
"@dxos/plugin-graph": "0.8.4-main.fffef41",
|
|
43
|
+
"@dxos/plugin-space": "0.8.4-main.fffef41",
|
|
44
|
+
"@dxos/react-client": "0.8.4-main.fffef41",
|
|
45
|
+
"@dxos/react-ui-searchlist": "0.8.4-main.fffef41",
|
|
46
|
+
"@dxos/plugin-deck": "0.8.4-main.fffef41",
|
|
47
|
+
"@dxos/react-ui-stack": "0.8.4-main.fffef41",
|
|
48
|
+
"@dxos/types": "0.8.4-main.fffef41",
|
|
49
|
+
"@dxos/util": "0.8.4-main.fffef41",
|
|
50
|
+
"@dxos/schema": "0.8.4-main.fffef41"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@effect-
|
|
54
|
-
"@effect/platform": "0.
|
|
55
|
-
"@types/react": "~
|
|
56
|
-
"@types/react-dom": "~
|
|
57
|
-
"effect": "3.
|
|
58
|
-
"react": "~
|
|
59
|
-
"react-dom": "~
|
|
60
|
-
"vite": "
|
|
61
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
62
|
-
"@dxos/
|
|
63
|
-
"@dxos/
|
|
64
|
-
"@dxos/
|
|
53
|
+
"@effect-atom/atom-react": "^0.3.4",
|
|
54
|
+
"@effect/platform": "0.92.1",
|
|
55
|
+
"@types/react": "~19.2.2",
|
|
56
|
+
"@types/react-dom": "~19.2.2",
|
|
57
|
+
"effect": "3.18.3",
|
|
58
|
+
"react": "~19.2.0",
|
|
59
|
+
"react-dom": "~19.2.0",
|
|
60
|
+
"vite": "7.1.9",
|
|
61
|
+
"@dxos/react-ui": "0.8.4-main.fffef41",
|
|
62
|
+
"@dxos/react-ui-theme": "0.8.4-main.fffef41",
|
|
63
|
+
"@dxos/storybook-utils": "0.8.4-main.fffef41",
|
|
64
|
+
"@dxos/random": "0.8.4-main.fffef41"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@effect-
|
|
67
|
+
"@effect-atom/atom-react": "^0.3.4",
|
|
68
68
|
"@effect/platform": "^0.80.12",
|
|
69
69
|
"effect": "^3.13.3",
|
|
70
|
-
"react": "
|
|
71
|
-
"react-dom": "
|
|
72
|
-
"@dxos/react-ui": "0.8.4-main.
|
|
73
|
-
"@dxos/react-ui-theme": "0.8.4-main.
|
|
70
|
+
"react": "^19.0.0",
|
|
71
|
+
"react-dom": "^19.0.0",
|
|
72
|
+
"@dxos/react-ui": "0.8.4-main.fffef41",
|
|
73
|
+
"@dxos/react-ui-theme": "0.8.4-main.fffef41"
|
|
74
74
|
},
|
|
75
75
|
"publishConfig": {
|
|
76
76
|
"access": "public"
|
package/src/SearchPlugin.tsx
CHANGED
|
@@ -9,46 +9,45 @@ import { SEARCH_RESULT, meta } from './meta';
|
|
|
9
9
|
import { translations } from './translations';
|
|
10
10
|
import { type SearchResult } from './types';
|
|
11
11
|
|
|
12
|
-
export const SearchPlugin = () =>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
},
|
|
12
|
+
export const SearchPlugin = definePlugin(meta, () => [
|
|
13
|
+
defineModule({
|
|
14
|
+
id: `${meta.id}/module/translations`,
|
|
15
|
+
activatesOn: Events.SetupTranslations,
|
|
16
|
+
activate: () => contributes(Capabilities.Translations, translations),
|
|
17
|
+
}),
|
|
18
|
+
defineModule({
|
|
19
|
+
id: `${meta.id}/module/metadata`,
|
|
20
|
+
activatesOn: Events.SetupMetadata,
|
|
21
|
+
activate: () =>
|
|
22
|
+
contributes(Capabilities.Metadata, {
|
|
23
|
+
id: SEARCH_RESULT,
|
|
24
|
+
metadata: {
|
|
25
|
+
parse: (item: SearchResult, type: string) => {
|
|
26
|
+
switch (type) {
|
|
27
|
+
case 'node':
|
|
28
|
+
return { id: item.id, label: item.label, data: item.object };
|
|
29
|
+
case 'object':
|
|
30
|
+
return item.object;
|
|
31
|
+
case 'view-object':
|
|
32
|
+
return item;
|
|
33
|
+
}
|
|
36
34
|
},
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
35
|
+
},
|
|
36
|
+
}),
|
|
37
|
+
}),
|
|
38
|
+
defineModule({
|
|
39
|
+
id: `${meta.id}/module/app-graph-builder`,
|
|
40
|
+
activatesOn: Events.SetupAppGraph,
|
|
41
|
+
activate: AppGraphBuilder,
|
|
42
|
+
}),
|
|
43
|
+
defineModule({
|
|
44
|
+
id: `${meta.id}/module/intent-resolver`,
|
|
45
|
+
activatesOn: Events.SetupIntentResolver,
|
|
46
|
+
activate: IntentResolver,
|
|
47
|
+
}),
|
|
48
|
+
defineModule({
|
|
49
|
+
id: `${meta.id}/module/react-surface`,
|
|
50
|
+
activatesOn: Events.SetupReactSurface,
|
|
51
|
+
activate: ReactSurface,
|
|
52
|
+
}),
|
|
53
|
+
]);
|
|
@@ -2,29 +2,30 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
5
|
+
import { Atom } from '@effect-atom/atom-react';
|
|
6
|
+
import * as Function from 'effect/Function';
|
|
7
|
+
import * as Option from 'effect/Option';
|
|
7
8
|
|
|
8
9
|
import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
|
|
9
10
|
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
10
11
|
import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
|
|
11
|
-
import { ROOT_ID,
|
|
12
|
+
import { ROOT_ID, atomFromSignal, createExtension } from '@dxos/plugin-graph';
|
|
12
13
|
import { parseId } from '@dxos/react-client/echo';
|
|
13
14
|
|
|
14
|
-
import {
|
|
15
|
+
import { meta } from '../meta';
|
|
15
16
|
import { SearchAction } from '../types';
|
|
16
17
|
|
|
17
18
|
export default (context: PluginContext) =>
|
|
18
19
|
contributes(Capabilities.AppGraphBuilder, [
|
|
19
20
|
createExtension({
|
|
20
|
-
id: `${
|
|
21
|
+
id: `${meta.id}/space-search`,
|
|
21
22
|
connector: (node) =>
|
|
22
|
-
|
|
23
|
-
pipe(
|
|
23
|
+
Atom.make((get) =>
|
|
24
|
+
Function.pipe(
|
|
24
25
|
get(node),
|
|
25
26
|
Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
|
|
26
27
|
Option.map((node) => {
|
|
27
|
-
const workspace = get(
|
|
28
|
+
const workspace = get(atomFromSignal(() => context.getCapability(Capabilities.Layout).workspace));
|
|
28
29
|
const client = context.getCapability(ClientCapabilities.Client);
|
|
29
30
|
const { spaceId } = parseId(workspace);
|
|
30
31
|
const space = spaceId ? client.spaces.get(spaceId) : null;
|
|
@@ -35,7 +36,7 @@ export default (context: PluginContext) =>
|
|
|
35
36
|
type: DECK_COMPANION_TYPE,
|
|
36
37
|
data: space,
|
|
37
38
|
properties: {
|
|
38
|
-
label: ['search label', { ns:
|
|
39
|
+
label: ['search label', { ns: meta.id }],
|
|
39
40
|
icon: 'ph--magnifying-glass--regular',
|
|
40
41
|
disposition: 'hidden',
|
|
41
42
|
},
|
|
@@ -47,10 +48,10 @@ export default (context: PluginContext) =>
|
|
|
47
48
|
),
|
|
48
49
|
}),
|
|
49
50
|
createExtension({
|
|
50
|
-
id:
|
|
51
|
+
id: meta.id,
|
|
51
52
|
actions: (node) =>
|
|
52
|
-
|
|
53
|
-
pipe(
|
|
53
|
+
Atom.make((get) =>
|
|
54
|
+
Function.pipe(
|
|
54
55
|
get(node),
|
|
55
56
|
Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
|
|
56
57
|
Option.map(() => {
|
|
@@ -62,7 +63,7 @@ export default (context: PluginContext) =>
|
|
|
62
63
|
await dispatch(createIntent(SearchAction.OpenSearch));
|
|
63
64
|
},
|
|
64
65
|
properties: {
|
|
65
|
-
label: ['search action label', { ns:
|
|
66
|
+
label: ['search action label', { ns: meta.id }],
|
|
66
67
|
icon: 'ph--magnifying-glass--regular',
|
|
67
68
|
keyBinding: {
|
|
68
69
|
macos: 'shift+meta+f',
|
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
7
|
-
import { type Decorator, type Meta, type StoryFn } from '@storybook/react-vite';
|
|
5
|
+
import { type Decorator, type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
6
|
import React, { useState } from 'react';
|
|
9
7
|
|
|
10
8
|
import { faker } from '@dxos/random';
|
|
11
|
-
import { withLayout, withTheme } from '@dxos/
|
|
9
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
12
10
|
|
|
13
11
|
import { SearchContextProvider, useGlobalSearch, useGlobalSearchResults } from '../hooks';
|
|
14
12
|
|
|
@@ -28,7 +26,7 @@ const DefaultStory = ({ objects, ...props }: StoryProps) => {
|
|
|
28
26
|
|
|
29
27
|
return (
|
|
30
28
|
<div className='flex grow justify-center overflow-hidden'>
|
|
31
|
-
<div className='flex flex-col
|
|
29
|
+
<div className='flex flex-col is-[300px] m-4 overflow-hidden'>
|
|
32
30
|
<Searchbar variant='subdued' placeholder='Enter regular expression...' onChange={setMatch} {...props} />
|
|
33
31
|
<SearchResults items={filteredItems} selected={selected} onSelect={setSelected} />
|
|
34
32
|
</div>
|
|
@@ -36,15 +34,15 @@ const DefaultStory = ({ objects, ...props }: StoryProps) => {
|
|
|
36
34
|
);
|
|
37
35
|
};
|
|
38
36
|
|
|
39
|
-
const
|
|
40
|
-
return (Story
|
|
37
|
+
const withSearchContext = (): Decorator => {
|
|
38
|
+
return (Story) => (
|
|
41
39
|
<SearchContextProvider>
|
|
42
40
|
<Story />
|
|
43
41
|
</SearchContextProvider>
|
|
44
42
|
);
|
|
45
43
|
};
|
|
46
44
|
|
|
47
|
-
export const Default = {
|
|
45
|
+
export const Default: Story = {
|
|
48
46
|
args: {
|
|
49
47
|
objects: Array.from({ length: 8 }).map(() => ({
|
|
50
48
|
id: faker.string.uuid(),
|
|
@@ -54,14 +52,13 @@ export const Default = {
|
|
|
54
52
|
},
|
|
55
53
|
};
|
|
56
54
|
|
|
57
|
-
const meta
|
|
55
|
+
const meta = {
|
|
58
56
|
title: 'plugins/plugin-search/Search',
|
|
59
57
|
component: Searchbar,
|
|
60
58
|
render: DefaultStory,
|
|
61
|
-
decorators: [withTheme, withLayout({
|
|
62
|
-
|
|
63
|
-
layout: 'fullscreen',
|
|
64
|
-
},
|
|
65
|
-
};
|
|
59
|
+
decorators: [withTheme, withLayout({ container: 'column' }), withSearchContext()],
|
|
60
|
+
} satisfies Meta<typeof Searchbar>;
|
|
66
61
|
|
|
67
62
|
export default meta;
|
|
63
|
+
|
|
64
|
+
type Story = StoryObj<typeof meta>;
|
|
@@ -2,28 +2,30 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Option from 'effect/Option';
|
|
6
6
|
import React, { forwardRef, useCallback, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import { LayoutAction, createIntent
|
|
8
|
+
import { LayoutAction, createIntent } from '@dxos/app-framework';
|
|
9
|
+
import { useAppGraph, useIntentDispatcher, useLayout } from '@dxos/app-framework/react';
|
|
10
|
+
import { Obj } from '@dxos/echo';
|
|
9
11
|
import { type Node } from '@dxos/plugin-graph';
|
|
10
12
|
import { useClient } from '@dxos/react-client';
|
|
11
|
-
import { Filter,
|
|
13
|
+
import { Filter, useQuery } from '@dxos/react-client/echo';
|
|
12
14
|
import { Button, Dialog, Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
13
15
|
import { SearchList, type SearchListItemProps } from '@dxos/react-ui-searchlist';
|
|
14
16
|
import { descriptionText, mx } from '@dxos/react-ui-theme';
|
|
15
17
|
|
|
16
18
|
import { useSearchResults } from '../hooks';
|
|
17
|
-
import {
|
|
19
|
+
import { meta } from '../meta';
|
|
18
20
|
|
|
19
|
-
export const SEARCH_DIALOG = `${
|
|
21
|
+
export const SEARCH_DIALOG = `${meta.id}/SearchDialog`;
|
|
20
22
|
|
|
21
23
|
type SearchListResultProps = {
|
|
22
24
|
node: Node;
|
|
23
25
|
} & Pick<SearchListItemProps, 'onSelect'>;
|
|
24
26
|
|
|
25
27
|
const SearchListResult = forwardRef<HTMLDivElement, SearchListResultProps>(({ node, onSelect }, forwardedRef) => {
|
|
26
|
-
const { t } = useTranslation(
|
|
28
|
+
const { t } = useTranslation(meta.id);
|
|
27
29
|
const label = toLocalizedString(node?.properties.label ?? 'never', t);
|
|
28
30
|
return (
|
|
29
31
|
<SearchList.Item
|
|
@@ -44,7 +46,7 @@ export type SearchDialogProps = {
|
|
|
44
46
|
};
|
|
45
47
|
|
|
46
48
|
export const SearchDialog = ({ pivotId }: SearchDialogProps) => {
|
|
47
|
-
const { t } = useTranslation(
|
|
49
|
+
const { t } = useTranslation(meta.id);
|
|
48
50
|
const { graph } = useAppGraph();
|
|
49
51
|
const layout = useLayout();
|
|
50
52
|
const closed = (Array.isArray(layout.inactive) ? layout.inactive : [layout.inactive])
|
|
@@ -59,12 +61,22 @@ export const SearchDialog = ({ pivotId }: SearchDialogProps) => {
|
|
|
59
61
|
|
|
60
62
|
const handleSelect = useCallback(
|
|
61
63
|
async (nodeId: string) => {
|
|
62
|
-
await dispatch(
|
|
64
|
+
await dispatch(
|
|
65
|
+
createIntent(LayoutAction.UpdateDialog, {
|
|
66
|
+
part: 'dialog',
|
|
67
|
+
options: { state: false },
|
|
68
|
+
}),
|
|
69
|
+
);
|
|
63
70
|
|
|
64
71
|
// If node is already present in the active parts, scroll to it and close the dialog.
|
|
65
72
|
const index = layout.active.findIndex((id) => id === nodeId);
|
|
66
73
|
if (index !== -1) {
|
|
67
|
-
await dispatch(
|
|
74
|
+
await dispatch(
|
|
75
|
+
createIntent(LayoutAction.ScrollIntoView, {
|
|
76
|
+
part: 'current',
|
|
77
|
+
subject: nodeId,
|
|
78
|
+
}),
|
|
79
|
+
);
|
|
68
80
|
} else {
|
|
69
81
|
await dispatch(
|
|
70
82
|
createIntent(LayoutAction.Open, {
|
|
@@ -91,13 +103,13 @@ export const SearchDialog = ({ pivotId }: SearchDialogProps) => {
|
|
|
91
103
|
setQueryString(nextValue);
|
|
92
104
|
}}
|
|
93
105
|
placeholder={t('search placeholder')}
|
|
94
|
-
classNames='
|
|
106
|
+
classNames='pli-1 my-2'
|
|
95
107
|
/>
|
|
96
108
|
<SearchList.Content classNames='max-bs-[24rem] overflow-auto'>
|
|
97
109
|
{queryString.length > 0 ? (
|
|
98
110
|
resultObjects.length > 0 ? (
|
|
99
111
|
resultObjects
|
|
100
|
-
.map((object) => graph.getNode(
|
|
112
|
+
.map((object) => graph.getNode(Obj.getDXN(object).toString()))
|
|
101
113
|
.filter(Option.isSome)
|
|
102
114
|
.map((node) => <SearchListResult key={node.value.id} node={node.value} onSelect={handleSelect} />)
|
|
103
115
|
) : (
|
|
@@ -2,67 +2,58 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, {
|
|
5
|
+
import React, { useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import { log } from '@dxos/log';
|
|
8
7
|
import { useClient } from '@dxos/react-client';
|
|
9
8
|
import { Filter, type Space, useQuery } from '@dxos/react-client/echo';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
9
|
+
import { useTranslation } from '@dxos/react-ui';
|
|
10
|
+
import { StackItem } from '@dxos/react-ui-stack';
|
|
11
|
+
import { mx } from '@dxos/react-ui-theme';
|
|
12
12
|
|
|
13
|
-
import { useGlobalSearch, useGlobalSearchResults } from '../hooks';
|
|
14
|
-
import {
|
|
15
|
-
import { SEARCH_PLUGIN } from '../meta';
|
|
13
|
+
import { useGlobalSearch, useGlobalSearchResults, useWebSearch } from '../hooks';
|
|
14
|
+
import { meta } from '../meta';
|
|
16
15
|
|
|
17
16
|
import { Searchbar } from './Searchbar';
|
|
18
17
|
import { SearchResults } from './SearchResults';
|
|
19
18
|
|
|
20
|
-
export const SearchMain
|
|
21
|
-
const { t } = useTranslation(
|
|
19
|
+
export const SearchMain = ({ space }: { space?: Space }) => {
|
|
20
|
+
const { t } = useTranslation(meta.id);
|
|
22
21
|
const client = useClient();
|
|
23
22
|
const { setMatch } = useGlobalSearch();
|
|
24
23
|
const [query, setQuery] = useState<string>();
|
|
25
|
-
// TODO(burdon):
|
|
24
|
+
// TODO(burdon): Option to search across spaces.
|
|
26
25
|
const allSpaces = false;
|
|
27
|
-
|
|
28
|
-
// TODO(burdon): Returns ALL objects (e.g., incl. Text objects that are fields of parent objects).
|
|
29
26
|
const objects = useQuery(allSpaces ? client.spaces : space, Filter.everything());
|
|
30
27
|
const results = useGlobalSearchResults(objects);
|
|
31
28
|
|
|
32
|
-
const {
|
|
33
|
-
runSearch,
|
|
34
|
-
results: webResults,
|
|
35
|
-
isLoading,
|
|
36
|
-
} = useWebSearch({
|
|
37
|
-
query,
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const [selected, setSelected] = useState<string>();
|
|
29
|
+
const { runSearch, results: webResults } = useWebSearch({ query });
|
|
41
30
|
|
|
42
31
|
// TODO(burdon): Activate and/or filter current main (set context).
|
|
32
|
+
const [selected, setSelected] = useState<string>();
|
|
43
33
|
const handleSelect = (id: string) => {
|
|
44
34
|
setSelected((selected) => (selected === id ? undefined : id));
|
|
45
35
|
};
|
|
46
36
|
|
|
47
37
|
const allResults = [...results, ...webResults];
|
|
48
|
-
log.info('results', { results, webResults });
|
|
49
38
|
|
|
50
39
|
return (
|
|
51
|
-
<
|
|
40
|
+
<StackItem.Content toolbar>
|
|
52
41
|
<Searchbar
|
|
42
|
+
classNames='pli-2'
|
|
53
43
|
placeholder={t('search placeholder')}
|
|
44
|
+
delay={300}
|
|
54
45
|
onChange={(text) => {
|
|
55
46
|
setQuery(text);
|
|
56
47
|
setMatch?.(text);
|
|
57
48
|
}}
|
|
58
49
|
onSubmit={runSearch}
|
|
59
50
|
/>
|
|
60
|
-
|
|
51
|
+
|
|
61
52
|
{allResults.length > 0 && (
|
|
62
|
-
<div className={mx('flex flex-col
|
|
53
|
+
<div className={mx('flex flex-col bs-full overflow-hidden')}>
|
|
63
54
|
<SearchResults items={allResults} selected={selected} onSelect={handleSelect} />
|
|
64
55
|
</div>
|
|
65
56
|
)}
|
|
66
|
-
</
|
|
57
|
+
</StackItem.Content>
|
|
67
58
|
);
|
|
68
59
|
};
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
7
|
-
import { type Meta } from '@storybook/react-vite';
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
6
|
import React, { useState } from 'react';
|
|
9
7
|
|
|
8
|
+
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
10
9
|
import { faker } from '@dxos/random';
|
|
11
|
-
import {
|
|
10
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
12
11
|
|
|
13
12
|
import { filterObjectsSync } from '../../hooks';
|
|
14
13
|
|
|
@@ -16,13 +15,13 @@ import { SearchResults, type SearchResultsProps } from './SearchResults';
|
|
|
16
15
|
|
|
17
16
|
faker.seed(1);
|
|
18
17
|
|
|
19
|
-
const DefaultStory = (
|
|
18
|
+
const DefaultStory = (props: SearchResultsProps) => {
|
|
20
19
|
const [selected, setSelected] = useState<string>();
|
|
21
20
|
|
|
22
21
|
return (
|
|
23
22
|
<div className='flex grow justify-center overflow-hidden'>
|
|
24
|
-
<div className='flex
|
|
25
|
-
<SearchResults {...
|
|
23
|
+
<div className='flex is-[300px] m-4 overflow-hidden'>
|
|
24
|
+
<SearchResults {...props} selected={selected} onSelect={setSelected} />
|
|
26
25
|
</div>
|
|
27
26
|
</div>
|
|
28
27
|
);
|
|
@@ -38,21 +37,23 @@ const objects = Array.from({ length: 100 }).map((_, i) => ({
|
|
|
38
37
|
|
|
39
38
|
const match = new RegExp(word, 'i');
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
args: {
|
|
43
|
-
items: filterObjectsSync(objects, match),
|
|
44
|
-
match,
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const meta: Meta<typeof SearchResults> = {
|
|
40
|
+
const meta = {
|
|
49
41
|
title: 'plugins/plugin-search/SearchResults',
|
|
50
42
|
component: SearchResults,
|
|
51
43
|
render: DefaultStory,
|
|
52
|
-
decorators: [withTheme,
|
|
44
|
+
decorators: [withTheme, withPluginManager({ plugins: [] })],
|
|
53
45
|
parameters: {
|
|
54
46
|
layout: 'fullscreen',
|
|
55
47
|
},
|
|
56
|
-
}
|
|
48
|
+
} satisfies Meta<typeof SearchResults>;
|
|
57
49
|
|
|
58
50
|
export default meta;
|
|
51
|
+
|
|
52
|
+
type Story = StoryObj<typeof meta>;
|
|
53
|
+
|
|
54
|
+
export const Default: Story = {
|
|
55
|
+
args: {
|
|
56
|
+
items: filterObjectsSync(objects, match),
|
|
57
|
+
match,
|
|
58
|
+
},
|
|
59
|
+
};
|