@dxos/plugin-search 0.8.4-main.c4373fc → 0.8.4-main.c85a9c8dae
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/README.md +0 -1
- package/dist/lib/browser/SearchDialog-E6336HCX.mjs +110 -0
- package/dist/lib/browser/SearchDialog-E6336HCX.mjs.map +7 -0
- package/dist/lib/browser/SearchMain-24ZNJB24.mjs +100 -0
- package/dist/lib/browser/SearchMain-24ZNJB24.mjs.map +7 -0
- package/dist/lib/browser/SpaceMain-IGCYHL7R.mjs +154 -0
- package/dist/lib/browser/SpaceMain-IGCYHL7R.mjs.map +7 -0
- package/dist/lib/browser/app-graph-builder-NUJ2FOVQ.mjs +82 -0
- package/dist/lib/browser/app-graph-builder-NUJ2FOVQ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5N6LDSFF.mjs → chunk-HRIWTRJV.mjs} +6 -2
- package/dist/lib/browser/chunk-HRIWTRJV.mjs.map +7 -0
- package/dist/lib/browser/chunk-I7YWQSUZ.mjs +26 -0
- package/dist/lib/browser/chunk-I7YWQSUZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-NB4JZIOE.mjs +282 -0
- package/dist/lib/browser/chunk-NB4JZIOE.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +52 -57
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/operation-resolver-QEGN4ZKN.mjs +26 -0
- package/dist/lib/browser/operation-resolver-QEGN4ZKN.mjs.map +7 -0
- package/dist/lib/browser/react-surface-FLO4YTFP.mjs +73 -0
- package/dist/lib/browser/react-surface-FLO4YTFP.mjs.map +7 -0
- package/dist/types/src/SearchPlugin.d.ts +2 -1
- package/dist/types/src/SearchPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
- 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/operation-resolver/index.d.ts +3 -0
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +0 -3
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/constants.d.ts +2 -0
- package/dist/types/src/constants.d.ts.map +1 -0
- package/dist/types/src/{components → containers/SearchDialog}/SearchDialog.d.ts +0 -1
- package/dist/types/src/containers/SearchDialog/SearchDialog.d.ts.map +1 -0
- package/dist/types/src/containers/SearchDialog/index.d.ts +3 -0
- package/dist/types/src/containers/SearchDialog/index.d.ts.map +1 -0
- package/dist/types/src/containers/SearchMain/SearchMain.d.ts +6 -0
- package/dist/types/src/containers/SearchMain/SearchMain.d.ts.map +1 -0
- package/dist/types/src/containers/SearchMain/index.d.ts +3 -0
- package/dist/types/src/containers/SearchMain/index.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceMain/SpaceMain.d.ts +6 -0
- package/dist/types/src/containers/SpaceMain/SpaceMain.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceMain/index.d.ts +3 -0
- package/dist/types/src/containers/SpaceMain/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +6 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- 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 +3 -2
- package/dist/types/src/hooks/sync.d.ts.map +1 -1
- package/dist/types/src/hooks/useGlobalSearch.d.ts +7 -3
- package/dist/types/src/hooks/useGlobalSearch.d.ts.map +1 -1
- package/dist/types/src/hooks/useSearchResults.d.ts +3 -2
- package/dist/types/src/hooks/useSearchResults.d.ts.map +1 -1
- package/dist/types/src/hooks/useWebSearch.d.ts +6 -3
- package/dist/types/src/hooks/useWebSearch.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/search/exa.d.ts +3 -1
- package/dist/types/src/search/exa.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +1 -1
- package/dist/types/src/types/action.d.ts +13 -10
- package/dist/types/src/types/action.d.ts.map +1 -1
- package/dist/types/src/types/search.d.ts +3 -7
- package/dist/types/src/types/search.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +56 -46
- package/src/SearchPlugin.tsx +25 -42
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +71 -0
- package/src/capabilities/app-graph-builder/index.ts +7 -0
- package/src/capabilities/index.ts +3 -5
- package/src/capabilities/operation-resolver/index.ts +7 -0
- package/src/capabilities/operation-resolver/operation-resolver.ts +24 -0
- package/src/capabilities/react-surface/index.ts +7 -0
- package/src/capabilities/react-surface/react-surface.tsx +72 -0
- package/src/components/index.ts +0 -4
- package/src/constants.ts +7 -0
- package/src/containers/SearchDialog/SearchDialog.tsx +120 -0
- package/src/containers/SearchDialog/index.ts +7 -0
- package/src/containers/SearchMain/SearchMain.tsx +103 -0
- package/src/containers/SearchMain/index.ts +7 -0
- package/src/containers/SpaceMain/SpaceMain.tsx +180 -0
- package/src/containers/SpaceMain/index.ts +7 -0
- package/src/containers/index.ts +11 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/sync.test.ts +6 -4
- package/src/hooks/sync.ts +25 -30
- package/src/hooks/useGlobalSearch.tsx +31 -12
- package/src/hooks/useSearchResults.ts +7 -4
- package/src/hooks/useWebSearch.ts +20 -9
- package/src/meta.ts +7 -3
- package/src/search/exa.test.ts +9 -11
- package/src/search/exa.ts +6 -5
- package/src/translations.ts +1 -1
- package/src/types/action.tsx +8 -6
- package/src/types/command-score.d.ts +16 -0
- package/src/types/search.ts +3 -9
- package/dist/lib/browser/app-graph-builder-YME7SN7O.mjs +0 -78
- package/dist/lib/browser/app-graph-builder-YME7SN7O.mjs.map +0 -7
- package/dist/lib/browser/chunk-5N6LDSFF.mjs.map +0 -7
- package/dist/lib/browser/chunk-WN3TVQLV.mjs +0 -190
- package/dist/lib/browser/chunk-WN3TVQLV.mjs.map +0 -7
- package/dist/lib/browser/chunk-YJGHPWUO.mjs +0 -21
- package/dist/lib/browser/chunk-YJGHPWUO.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-XNVR4XRX.mjs +0 -22
- package/dist/lib/browser/intent-resolver-XNVR4XRX.mjs.map +0 -7
- package/dist/lib/browser/react-surface-YOGLADC4.mjs +0 -470
- package/dist/lib/browser/react-surface-YOGLADC4.mjs.map +0 -7
- package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface.d.ts +0 -4
- package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
- package/dist/types/src/components/Search.stories.d.ts +0 -19
- package/dist/types/src/components/Search.stories.d.ts.map +0 -1
- package/dist/types/src/components/SearchDialog.d.ts.map +0 -1
- package/dist/types/src/components/SearchMain.d.ts +0 -7
- package/dist/types/src/components/SearchMain.d.ts.map +0 -1
- package/dist/types/src/components/SearchResults/SearchResults.d.ts +0 -20
- package/dist/types/src/components/SearchResults/SearchResults.d.ts.map +0 -1
- package/dist/types/src/components/SearchResults/SearchResults.stories.d.ts +0 -16
- package/dist/types/src/components/SearchResults/SearchResults.stories.d.ts.map +0 -1
- package/dist/types/src/components/SearchResults/index.d.ts +0 -2
- package/dist/types/src/components/SearchResults/index.d.ts.map +0 -1
- package/dist/types/src/components/Searchbar/Searchbar.d.ts +0 -14
- package/dist/types/src/components/Searchbar/Searchbar.d.ts.map +0 -1
- package/dist/types/src/components/Searchbar/Searchbar.stories.d.ts +0 -13
- package/dist/types/src/components/Searchbar/Searchbar.stories.d.ts.map +0 -1
- package/dist/types/src/components/Searchbar/index.d.ts +0 -2
- package/dist/types/src/components/Searchbar/index.d.ts.map +0 -1
- package/src/capabilities/app-graph-builder.ts +0 -80
- package/src/capabilities/intent-resolver.ts +0 -18
- package/src/capabilities/react-surface.tsx +0 -59
- package/src/components/Search.stories.tsx +0 -67
- package/src/components/SearchDialog.tsx +0 -124
- package/src/components/SearchMain.tsx +0 -68
- package/src/components/SearchResults/SearchResults.stories.tsx +0 -58
- package/src/components/SearchResults/SearchResults.tsx +0 -86
- package/src/components/SearchResults/index.ts +0 -5
- package/src/components/Searchbar/Searchbar.stories.tsx +0 -28
- package/src/components/Searchbar/Searchbar.tsx +0 -67
- package/src/components/Searchbar/index.ts +0 -5
package/README.md
CHANGED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useSearchResults
|
|
3
|
+
} from "./chunk-NB4JZIOE.mjs";
|
|
4
|
+
import {
|
|
5
|
+
meta
|
|
6
|
+
} from "./chunk-HRIWTRJV.mjs";
|
|
7
|
+
|
|
8
|
+
// src/containers/SearchDialog/SearchDialog.tsx
|
|
9
|
+
import * as Option from "effect/Option";
|
|
10
|
+
import React, { forwardRef, useCallback, useState } from "react";
|
|
11
|
+
import { useOperationInvoker } from "@dxos/app-framework/ui";
|
|
12
|
+
import { LayoutOperation } from "@dxos/app-toolkit";
|
|
13
|
+
import { useAppGraph, useLayout } from "@dxos/app-toolkit/ui";
|
|
14
|
+
import { Obj } from "@dxos/echo";
|
|
15
|
+
import { Graph } from "@dxos/plugin-graph";
|
|
16
|
+
import { useClient } from "@dxos/react-client";
|
|
17
|
+
import { Filter, useQuery } from "@dxos/react-client/echo";
|
|
18
|
+
import { Button, Dialog, toLocalizedString, useTranslation } from "@dxos/react-ui";
|
|
19
|
+
import { SearchList } from "@dxos/react-ui-searchlist";
|
|
20
|
+
import { mx, osTranslations } from "@dxos/ui-theme";
|
|
21
|
+
var SearchListResult = /* @__PURE__ */ forwardRef(({ node, onSelect }, forwardedRef) => {
|
|
22
|
+
const { t } = useTranslation(meta.id);
|
|
23
|
+
const label = toLocalizedString(node?.properties.label ?? "never", t);
|
|
24
|
+
const handleSelect = useCallback(() => {
|
|
25
|
+
onSelect?.(node.id);
|
|
26
|
+
}, [
|
|
27
|
+
node,
|
|
28
|
+
onSelect
|
|
29
|
+
]);
|
|
30
|
+
return /* @__PURE__ */ React.createElement(SearchList.Item, {
|
|
31
|
+
value: node.id,
|
|
32
|
+
label,
|
|
33
|
+
icon: node?.properties.icon,
|
|
34
|
+
classNames: "flex gap-2 items-center px-2",
|
|
35
|
+
onSelect: handleSelect,
|
|
36
|
+
ref: forwardedRef
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
var SearchDialog = ({ pivotId }) => {
|
|
40
|
+
const { t } = useTranslation(meta.id);
|
|
41
|
+
const { graph } = useAppGraph();
|
|
42
|
+
const layout = useLayout();
|
|
43
|
+
const closed = (Array.isArray(layout.inactive) ? layout.inactive : [
|
|
44
|
+
layout.inactive
|
|
45
|
+
]).map((id) => graph ? Graph.getNode(graph, id) : Option.none()).filter(Boolean);
|
|
46
|
+
const [queryString, setQueryString] = useState("");
|
|
47
|
+
const client = useClient();
|
|
48
|
+
const dangerouslyLoadAllObjects = useQuery(client.spaces, Filter.everything());
|
|
49
|
+
const [pending, results] = useSearchResults(queryString, dangerouslyLoadAllObjects);
|
|
50
|
+
const resultObjects = Array.from(results.keys());
|
|
51
|
+
const { invokePromise } = useOperationInvoker();
|
|
52
|
+
const handleSelect = useCallback(async (nodeId) => {
|
|
53
|
+
await invokePromise(LayoutOperation.UpdateDialog, {
|
|
54
|
+
state: false
|
|
55
|
+
});
|
|
56
|
+
const index = layout.active.findIndex((id) => id === nodeId);
|
|
57
|
+
if (index !== -1) {
|
|
58
|
+
await invokePromise(LayoutOperation.ScrollIntoView, {
|
|
59
|
+
subject: nodeId
|
|
60
|
+
});
|
|
61
|
+
} else {
|
|
62
|
+
await invokePromise(LayoutOperation.Open, {
|
|
63
|
+
subject: [
|
|
64
|
+
nodeId
|
|
65
|
+
],
|
|
66
|
+
pivotId,
|
|
67
|
+
positioning: "end"
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}, [
|
|
71
|
+
pivotId,
|
|
72
|
+
invokePromise,
|
|
73
|
+
layout
|
|
74
|
+
]);
|
|
75
|
+
const handleSearch = useCallback((query) => {
|
|
76
|
+
setQueryString(query);
|
|
77
|
+
}, []);
|
|
78
|
+
return /* @__PURE__ */ React.createElement(Dialog.Content, null, /* @__PURE__ */ React.createElement(Dialog.Title, null, t("search dialog title")), /* @__PURE__ */ React.createElement(SearchList.Root, {
|
|
79
|
+
onSearch: handleSearch
|
|
80
|
+
}, /* @__PURE__ */ React.createElement(SearchList.Content, {
|
|
81
|
+
classNames: "max-h-[24rem] overflow-auto"
|
|
82
|
+
}, /* @__PURE__ */ React.createElement(SearchList.Input, {
|
|
83
|
+
placeholder: t("search placeholder")
|
|
84
|
+
}), /* @__PURE__ */ React.createElement(SearchList.Viewport, null, queryString.length > 0 ? resultObjects.length > 0 ? resultObjects.map((object) => Graph.getNode(graph, Obj.getDXN(object).toString())).filter(Option.isSome).map((node) => /* @__PURE__ */ React.createElement(SearchListResult, {
|
|
85
|
+
key: node.value.id,
|
|
86
|
+
node: node.value,
|
|
87
|
+
onSelect: handleSelect
|
|
88
|
+
})) : /* @__PURE__ */ React.createElement("p", {
|
|
89
|
+
className: "px-1"
|
|
90
|
+
}, t(pending ? "pending results message" : "empty results message")) : /* @__PURE__ */ React.createElement(React.Fragment, null, closed.length > 0 && /* @__PURE__ */ React.createElement("h2", {
|
|
91
|
+
className: mx("my-1", "text-description")
|
|
92
|
+
}, t("recently closed heading")), closed.filter(Option.isSome).map((node) => /* @__PURE__ */ React.createElement(SearchListResult, {
|
|
93
|
+
key: node.value.id,
|
|
94
|
+
node: node.value,
|
|
95
|
+
onSelect: handleSelect
|
|
96
|
+
})))))), /* @__PURE__ */ React.createElement(Dialog.Close, {
|
|
97
|
+
asChild: true
|
|
98
|
+
}, /* @__PURE__ */ React.createElement(Button, {
|
|
99
|
+
variant: "primary"
|
|
100
|
+
}, t("close label", {
|
|
101
|
+
ns: osTranslations
|
|
102
|
+
}))));
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// src/containers/SearchDialog/index.ts
|
|
106
|
+
var SearchDialog_default = SearchDialog;
|
|
107
|
+
export {
|
|
108
|
+
SearchDialog_default as default
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=SearchDialog-E6336HCX.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/SearchDialog/SearchDialog.tsx", "../../../src/containers/SearchDialog/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Option from 'effect/Option';\nimport React, { forwardRef, useCallback, useState } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph, useLayout } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { Graph, type Node } from '@dxos/plugin-graph';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, useQuery } from '@dxos/react-client/echo';\nimport { Button, Dialog, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { SearchList } from '@dxos/react-ui-searchlist';\nimport { mx, osTranslations } from '@dxos/ui-theme';\n\nimport { useSearchResults } from '../../hooks';\nimport { meta } from '../../meta';\n\ntype SearchListResultProps = {\n node: Node.Node;\n onSelect?: (nodeId: string) => void;\n};\n\nconst SearchListResult = forwardRef<HTMLDivElement, SearchListResultProps>(({ node, onSelect }, forwardedRef) => {\n const { t } = useTranslation(meta.id);\n const label = toLocalizedString(node?.properties.label ?? 'never', t);\n const handleSelect = useCallback(() => {\n onSelect?.(node!.id);\n }, [node, onSelect]);\n return (\n <SearchList.Item\n value={node!.id}\n label={label}\n icon={node?.properties.icon}\n classNames='flex gap-2 items-center px-2'\n onSelect={handleSelect}\n ref={forwardedRef}\n />\n );\n});\n\nexport type SearchDialogProps = {\n pivotId: string;\n};\n\nexport const SearchDialog = ({ pivotId }: SearchDialogProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const layout = useLayout();\n const closed = (Array.isArray(layout.inactive) ? layout.inactive : [layout.inactive])\n .map((id) => (graph ? Graph.getNode(graph, id) : Option.none()))\n .filter(Boolean);\n const [queryString, setQueryString] = useState('');\n const client = useClient();\n const dangerouslyLoadAllObjects = useQuery(client.spaces, Filter.everything());\n const [pending, results] = useSearchResults(queryString, dangerouslyLoadAllObjects);\n const resultObjects = Array.from(results.keys());\n const { invokePromise } = useOperationInvoker();\n\n const handleSelect = useCallback(\n async (nodeId: string) => {\n await invokePromise(LayoutOperation.UpdateDialog, { state: false });\n\n // If node is already present in the active parts, scroll to it and close the dialog.\n const index = layout.active.findIndex((id) => id === nodeId);\n if (index !== -1) {\n await invokePromise(LayoutOperation.ScrollIntoView, { subject: nodeId });\n } else {\n await invokePromise(LayoutOperation.Open, {\n subject: [nodeId],\n pivotId,\n positioning: 'end',\n });\n }\n },\n [pivotId, invokePromise, layout],\n );\n\n const handleSearch = useCallback((query: string) => {\n setQueryString(query);\n }, []);\n\n return (\n <Dialog.Content>\n <Dialog.Title>{t('search dialog title')}</Dialog.Title>\n <SearchList.Root onSearch={handleSearch}>\n <SearchList.Content classNames='max-h-[24rem] overflow-auto'>\n <SearchList.Input placeholder={t('search placeholder')} />\n <SearchList.Viewport>\n {queryString.length > 0 ? (\n resultObjects.length > 0 ? (\n resultObjects\n .map((object) => Graph.getNode(graph, Obj.getDXN(object).toString()))\n .filter(Option.isSome)\n .map((node) => <SearchListResult key={node.value.id} node={node.value} onSelect={handleSelect} />)\n ) : (\n <p className='px-1'>{t(pending ? 'pending results message' : 'empty results message')}</p>\n )\n ) : (\n <>\n {closed.length > 0 && (\n <h2 className={mx('my-1', 'text-description')}>{t('recently closed heading')}</h2>\n )}\n {closed.filter(Option.isSome).map((node) => (\n <SearchListResult key={node.value.id} node={node.value} onSelect={handleSelect} />\n ))}\n </>\n )}\n </SearchList.Viewport>\n </SearchList.Content>\n </SearchList.Root>\n <Dialog.Close asChild>\n <Button variant='primary'>{t('close label', { ns: osTranslations })}</Button>\n </Dialog.Close>\n </Dialog.Content>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SearchDialog } from './SearchDialog';\n\nexport default SearchDialog;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Option", "React", "forwardRef", "useCallback", "useState", "useOperationInvoker", "LayoutOperation", "useAppGraph", "useLayout", "Obj", "Graph", "useClient", "Filter", "useQuery", "Button", "Dialog", "toLocalizedString", "useTranslation", "SearchList", "mx", "osTranslations", "SearchListResult", "forwardRef", "node", "onSelect", "forwardedRef", "t", "useTranslation", "meta", "id", "label", "toLocalizedString", "properties", "handleSelect", "useCallback", "SearchList", "Item", "value", "icon", "classNames", "ref", "SearchDialog", "pivotId", "graph", "useAppGraph", "layout", "useLayout", "closed", "Array", "isArray", "inactive", "map", "Graph", "getNode", "none", "filter", "Boolean", "queryString", "setQueryString", "useState", "client", "useClient", "dangerouslyLoadAllObjects", "useQuery", "spaces", "Filter", "everything", "pending", "results", "useSearchResults", "resultObjects", "from", "keys", "invokePromise", "useOperationInvoker", "nodeId", "LayoutOperation", "UpdateDialog", "state", "index", "active", "findIndex", "ScrollIntoView", "subject", "Open", "positioning", "handleSearch", "query", "Dialog", "Content", "Title", "Root", "onSearch", "Input", "placeholder", "Viewport", "length", "object", "Obj", "getDXN", "toString", "isSome", "key", "p", "className", "h2", "mx", "Close", "asChild", "Button", "variant", "ns", "osTranslations", "SearchDialog"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useGlobalSearch,
|
|
3
|
+
useGlobalSearchResults,
|
|
4
|
+
useWebSearch
|
|
5
|
+
} from "./chunk-NB4JZIOE.mjs";
|
|
6
|
+
import {
|
|
7
|
+
meta
|
|
8
|
+
} from "./chunk-HRIWTRJV.mjs";
|
|
9
|
+
|
|
10
|
+
// src/containers/SearchMain/SearchMain.tsx
|
|
11
|
+
import React, { useCallback, useMemo, useState } from "react";
|
|
12
|
+
import { Surface } from "@dxos/app-framework/ui";
|
|
13
|
+
import { useObjectMenuItems, useObjectNavigate } from "@dxos/app-toolkit/ui";
|
|
14
|
+
import { Entity, Query } from "@dxos/echo";
|
|
15
|
+
import { Filter, useQuery } from "@dxos/react-client/echo";
|
|
16
|
+
import { Card, Panel, ScrollArea, Toolbar, useTranslation } from "@dxos/react-ui";
|
|
17
|
+
import { Menu } from "@dxos/react-ui-menu";
|
|
18
|
+
import { Mosaic } from "@dxos/react-ui-mosaic";
|
|
19
|
+
import { SearchList } from "@dxos/react-ui-searchlist";
|
|
20
|
+
import { Text } from "@dxos/schema";
|
|
21
|
+
var SearchMain = ({ space }) => {
|
|
22
|
+
const { t } = useTranslation(meta.id);
|
|
23
|
+
const { setMatch } = useGlobalSearch();
|
|
24
|
+
const [query, setQuery] = useState();
|
|
25
|
+
const objects = useQuery(space?.db, query === void 0 ? Query.select(Filter.nothing()) : Query.all(Query.select(Filter.text(query, {
|
|
26
|
+
type: "full-text"
|
|
27
|
+
})).select(Filter.not(Filter.type(Text.Text))), Query.select(Filter.text(query, {
|
|
28
|
+
type: "full-text"
|
|
29
|
+
})).select(Filter.type(Text.Text)).referencedBy("dxos.org/type/Document", "content")));
|
|
30
|
+
const results = useGlobalSearchResults(objects);
|
|
31
|
+
const { results: webResults } = useWebSearch({
|
|
32
|
+
query
|
|
33
|
+
});
|
|
34
|
+
const allResults = useMemo(() => [
|
|
35
|
+
...results,
|
|
36
|
+
...webResults
|
|
37
|
+
].filter(({ object }) => object && Entity.getLabel(object)), [
|
|
38
|
+
results,
|
|
39
|
+
webResults
|
|
40
|
+
]);
|
|
41
|
+
const handleSearch = useCallback((text) => {
|
|
42
|
+
setQuery(text);
|
|
43
|
+
setMatch?.(text);
|
|
44
|
+
}, [
|
|
45
|
+
setMatch
|
|
46
|
+
]);
|
|
47
|
+
return /* @__PURE__ */ React.createElement(SearchList.Root, {
|
|
48
|
+
onSearch: handleSearch
|
|
49
|
+
}, /* @__PURE__ */ React.createElement(Panel.Root, {
|
|
50
|
+
className: "dx-article"
|
|
51
|
+
}, /* @__PURE__ */ React.createElement(Panel.Toolbar, {
|
|
52
|
+
asChild: true
|
|
53
|
+
}, /* @__PURE__ */ React.createElement(Toolbar.Root, null, /* @__PURE__ */ React.createElement(SearchList.Input, {
|
|
54
|
+
placeholder: t("search placeholder")
|
|
55
|
+
}))), /* @__PURE__ */ React.createElement(Panel.Content, {
|
|
56
|
+
asChild: true
|
|
57
|
+
}, /* @__PURE__ */ React.createElement(SearchList.Content, null, /* @__PURE__ */ React.createElement(Mosaic.Container, {
|
|
58
|
+
asChild: true
|
|
59
|
+
}, /* @__PURE__ */ React.createElement(ScrollArea.Root, {
|
|
60
|
+
orientation: "vertical"
|
|
61
|
+
}, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React.createElement(Mosaic.Stack, {
|
|
62
|
+
items: allResults,
|
|
63
|
+
getId: (result) => result.object.id,
|
|
64
|
+
Tile: SearchResultTile
|
|
65
|
+
})))), allResults.length === 0 && /* @__PURE__ */ React.createElement(SearchList.Empty, null, t("empty results message"))))));
|
|
66
|
+
};
|
|
67
|
+
var SearchResultTile = (props) => {
|
|
68
|
+
const data = props.data;
|
|
69
|
+
const object = data.object;
|
|
70
|
+
const objectMenuItems = useObjectMenuItems(object);
|
|
71
|
+
const handleNavigate = useObjectNavigate(object);
|
|
72
|
+
return /* @__PURE__ */ React.createElement(Menu.Root, null, /* @__PURE__ */ React.createElement(Card.Root, {
|
|
73
|
+
key: data.id
|
|
74
|
+
}, /* @__PURE__ */ React.createElement(Card.Toolbar, null, /* @__PURE__ */ React.createElement(Card.DragHandle, null), /* @__PURE__ */ React.createElement(Card.Title, {
|
|
75
|
+
onClick: handleNavigate
|
|
76
|
+
}, data.label ?? (data.object && Entity.getLabel(data.object))), /* @__PURE__ */ React.createElement(Menu.Trigger, {
|
|
77
|
+
asChild: true,
|
|
78
|
+
disabled: !objectMenuItems?.length
|
|
79
|
+
}, /* @__PURE__ */ React.createElement(Toolbar.IconButton, {
|
|
80
|
+
iconOnly: true,
|
|
81
|
+
variant: "ghost",
|
|
82
|
+
icon: "ph--dots-three-vertical--regular",
|
|
83
|
+
label: "Actions"
|
|
84
|
+
})), /* @__PURE__ */ React.createElement(Menu.Content, {
|
|
85
|
+
items: objectMenuItems
|
|
86
|
+
})), /* @__PURE__ */ React.createElement(Surface.Surface, {
|
|
87
|
+
role: "card--content",
|
|
88
|
+
data: {
|
|
89
|
+
subject: data.object
|
|
90
|
+
},
|
|
91
|
+
limit: 1
|
|
92
|
+
})));
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// src/containers/SearchMain/index.ts
|
|
96
|
+
var SearchMain_default = SearchMain;
|
|
97
|
+
export {
|
|
98
|
+
SearchMain_default as default
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=SearchMain-24ZNJB24.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/SearchMain/SearchMain.tsx", "../../../src/containers/SearchMain/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { useObjectMenuItems, useObjectNavigate } from '@dxos/app-toolkit/ui';\nimport { Entity, Query } from '@dxos/echo';\nimport { Filter, type Space, useQuery } from '@dxos/react-client/echo';\nimport { Card, Panel, ScrollArea, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { Menu } from '@dxos/react-ui-menu';\nimport { Mosaic, type MosaicStackTileComponent } from '@dxos/react-ui-mosaic';\nimport { SearchList } from '@dxos/react-ui-searchlist';\nimport { Text } from '@dxos/schema';\n\nimport { useGlobalSearch, useGlobalSearchResults, useWebSearch } from '../../hooks';\nimport { meta } from '../../meta';\nimport { type SearchResult } from '../../types';\n\nexport const SearchMain = ({ space }: { space?: Space }) => {\n const { t } = useTranslation(meta.id);\n const { setMatch } = useGlobalSearch();\n const [query, setQuery] = useState<string>();\n // TODO(burdon): Option to search across spaces.\n const objects = useQuery(\n space?.db,\n query === undefined\n ? Query.select(Filter.nothing())\n : // TODO(dmaretskyi): Final version would walk the ancestry of the object until we find a non-system type.\n Query.all(\n Query.select(Filter.text(query, { type: 'full-text' })).select(Filter.not(Filter.type(Text.Text))),\n Query.select(Filter.text(query, { type: 'full-text' }))\n .select(Filter.type(Text.Text))\n .referencedBy('dxos.org/type/Document', 'content'),\n ),\n );\n\n const results = useGlobalSearchResults(objects);\n const { results: webResults } = useWebSearch({ query });\n const allResults = useMemo(\n () => [...results, ...webResults].filter(({ object }) => object && Entity.getLabel(object)),\n [results, webResults],\n );\n\n const handleSearch = useCallback(\n (text: string) => {\n setQuery(text);\n setMatch?.(text);\n },\n [setMatch],\n );\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <Panel.Root className='dx-article'>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} />\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport>\n <Mosaic.Stack items={allResults} getId={(result) => result.object!.id} Tile={SearchResultTile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n {allResults.length === 0 && <SearchList.Empty>{t('empty results message')}</SearchList.Empty>}\n </SearchList.Content>\n </Panel.Content>\n </Panel.Root>\n </SearchList.Root>\n );\n};\n\nconst SearchResultTile: MosaicStackTileComponent<SearchResult> = (props) => {\n const data = props.data;\n const object = data.object!;\n const objectMenuItems = useObjectMenuItems(object);\n const handleNavigate = useObjectNavigate(object);\n\n return (\n <Menu.Root>\n <Card.Root key={data.id}>\n <Card.Toolbar>\n <Card.DragHandle />\n <Card.Title onClick={handleNavigate}>\n {data.label ?? (data.object && Entity.getLabel(data.object))}\n </Card.Title>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Menu.Trigger asChild disabled={!objectMenuItems?.length}>\n <Toolbar.IconButton iconOnly variant='ghost' icon='ph--dots-three-vertical--regular' label='Actions' />\n </Menu.Trigger>\n <Menu.Content items={objectMenuItems} />\n </Card.Toolbar>\n <Surface.Surface role='card--content' data={{ subject: data.object }} limit={1} />\n </Card.Root>\n </Menu.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SearchMain } from './SearchMain';\n\nexport default SearchMain;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useCallback", "useMemo", "useState", "Surface", "useObjectMenuItems", "useObjectNavigate", "Entity", "Query", "Filter", "useQuery", "Card", "Panel", "ScrollArea", "Toolbar", "useTranslation", "Menu", "Mosaic", "SearchList", "Text", "SearchMain", "space", "t", "useTranslation", "meta", "id", "setMatch", "useGlobalSearch", "query", "setQuery", "useState", "objects", "useQuery", "db", "undefined", "Query", "select", "Filter", "nothing", "all", "text", "type", "not", "Text", "referencedBy", "results", "useGlobalSearchResults", "webResults", "useWebSearch", "allResults", "useMemo", "filter", "object", "Entity", "getLabel", "handleSearch", "useCallback", "SearchList", "Root", "onSearch", "Panel", "className", "Toolbar", "asChild", "Input", "placeholder", "Content", "Mosaic", "Container", "ScrollArea", "orientation", "Viewport", "Stack", "items", "getId", "result", "Tile", "SearchResultTile", "length", "Empty", "props", "data", "objectMenuItems", "useObjectMenuItems", "handleNavigate", "useObjectNavigate", "Menu", "Card", "key", "DragHandle", "Title", "onClick", "label", "Trigger", "disabled", "IconButton", "iconOnly", "variant", "icon", "Surface", "role", "subject", "limit", "SearchMain"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import {
|
|
2
|
+
meta
|
|
3
|
+
} from "./chunk-HRIWTRJV.mjs";
|
|
4
|
+
|
|
5
|
+
// src/containers/SpaceMain/SpaceMain.tsx
|
|
6
|
+
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
|
7
|
+
import { useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
8
|
+
import { AppCapabilities, LayoutOperation } from "@dxos/app-toolkit";
|
|
9
|
+
import { useAppGraph } from "@dxos/app-toolkit/ui";
|
|
10
|
+
import { Filter, Obj, Query } from "@dxos/echo";
|
|
11
|
+
import { Graph, Node, useActionRunner, useConnections } from "@dxos/plugin-graph";
|
|
12
|
+
import { useQuery } from "@dxos/react-client/echo";
|
|
13
|
+
import { ScrollArea, Toolbar, toLocalizedString, useTranslation } from "@dxos/react-ui";
|
|
14
|
+
import { Card, Panel } from "@dxos/react-ui";
|
|
15
|
+
import { Mosaic } from "@dxos/react-ui-mosaic";
|
|
16
|
+
import { SearchList } from "@dxos/react-ui-searchlist";
|
|
17
|
+
import { Text } from "@dxos/schema";
|
|
18
|
+
import { getStyles } from "@dxos/ui-theme";
|
|
19
|
+
var SpaceMain = ({ space }) => {
|
|
20
|
+
const { t } = useTranslation(meta.id);
|
|
21
|
+
const { items, handleSearch } = useSpaceItems(space);
|
|
22
|
+
return /* @__PURE__ */ React.createElement(SearchList.Root, {
|
|
23
|
+
onSearch: handleSearch
|
|
24
|
+
}, /* @__PURE__ */ React.createElement(Panel.Root, {
|
|
25
|
+
className: "dx-article"
|
|
26
|
+
}, /* @__PURE__ */ React.createElement(Panel.Toolbar, {
|
|
27
|
+
asChild: true
|
|
28
|
+
}, /* @__PURE__ */ React.createElement(Toolbar.Root, null, /* @__PURE__ */ React.createElement(SearchList.Input, {
|
|
29
|
+
placeholder: t("search placeholder")
|
|
30
|
+
}))), /* @__PURE__ */ React.createElement(Panel.Content, {
|
|
31
|
+
asChild: true
|
|
32
|
+
}, /* @__PURE__ */ React.createElement(SearchList.Content, null, /* @__PURE__ */ React.createElement(Mosaic.Container, {
|
|
33
|
+
asChild: true
|
|
34
|
+
}, /* @__PURE__ */ React.createElement(ScrollArea.Root, {
|
|
35
|
+
orientation: "vertical"
|
|
36
|
+
}, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, {
|
|
37
|
+
classNames: "p-2"
|
|
38
|
+
}, /* @__PURE__ */ React.createElement(Mosaic.Stack, {
|
|
39
|
+
items,
|
|
40
|
+
getId: (node) => node.id,
|
|
41
|
+
Tile: NodeTile
|
|
42
|
+
}))))))));
|
|
43
|
+
};
|
|
44
|
+
var NodeTile = (props) => {
|
|
45
|
+
const node = props.data;
|
|
46
|
+
const { t } = useTranslation(meta.id);
|
|
47
|
+
const { graph } = useAppGraph();
|
|
48
|
+
const { invokeSync } = useOperationInvoker();
|
|
49
|
+
const runAction = useActionRunner();
|
|
50
|
+
const label = toLocalizedString(node.properties.label, t);
|
|
51
|
+
const icon = node.properties.icon ?? "ph--placeholder--regular";
|
|
52
|
+
const iconHue = node.properties.iconHue;
|
|
53
|
+
const styles = iconHue ? getStyles(iconHue) : void 0;
|
|
54
|
+
const handleClick = () => {
|
|
55
|
+
if (Node.isAction(node)) {
|
|
56
|
+
const [parent] = Graph.getConnections(graph, node.id, Node.childRelation("inbound"));
|
|
57
|
+
if (parent) {
|
|
58
|
+
void runAction(node, {
|
|
59
|
+
parent
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
invokeSync(LayoutOperation.Open, {
|
|
64
|
+
subject: [
|
|
65
|
+
node.id
|
|
66
|
+
]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
return /* @__PURE__ */ React.createElement(Card.Root, {
|
|
71
|
+
fullWidth: true
|
|
72
|
+
}, /* @__PURE__ */ React.createElement(Card.Toolbar, null, /* @__PURE__ */ React.createElement(Card.ToolbarIconButton, {
|
|
73
|
+
variant: "ghost",
|
|
74
|
+
label,
|
|
75
|
+
icon,
|
|
76
|
+
iconOnly: true,
|
|
77
|
+
iconClassNames: styles?.surfaceText
|
|
78
|
+
}), /* @__PURE__ */ React.createElement(Card.Title, {
|
|
79
|
+
onClick: handleClick
|
|
80
|
+
}, label), /* @__PURE__ */ React.createElement(Card.Menu, null)));
|
|
81
|
+
};
|
|
82
|
+
var useMetadataResolver = () => {
|
|
83
|
+
const allMetadata = useCapabilities(AppCapabilities.Metadata);
|
|
84
|
+
return useCallback((typename) => allMetadata.find((m) => m.id === typename)?.metadata ?? {}, [
|
|
85
|
+
allMetadata
|
|
86
|
+
]);
|
|
87
|
+
};
|
|
88
|
+
var useSpaceItems = (space) => {
|
|
89
|
+
const { graph } = useAppGraph();
|
|
90
|
+
const [query, setQuery] = useState();
|
|
91
|
+
const resolveMetadata = useMetadataResolver();
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
const frame = requestAnimationFrame(() => {
|
|
94
|
+
Graph.expand(graph, space.id, "child");
|
|
95
|
+
});
|
|
96
|
+
return () => cancelAnimationFrame(frame);
|
|
97
|
+
}, [
|
|
98
|
+
graph,
|
|
99
|
+
space.id
|
|
100
|
+
]);
|
|
101
|
+
const children = useConnections(graph, space.id, "child");
|
|
102
|
+
const handleSearch = useCallback((text) => {
|
|
103
|
+
setQuery(text);
|
|
104
|
+
}, []);
|
|
105
|
+
const results = useQuery(space.db, query === void 0 ? Query.select(Filter.nothing()) : Query.all(Query.select(Filter.text(query, {
|
|
106
|
+
type: "full-text"
|
|
107
|
+
})).select(Filter.not(Filter.type(Text.Text))), Query.select(Filter.text(query, {
|
|
108
|
+
type: "full-text"
|
|
109
|
+
})).select(Filter.type(Text.Text)).referencedBy("dxos.org/type/Document", "content")));
|
|
110
|
+
const isQueryEmpty = !query?.trim();
|
|
111
|
+
const filteredChildren = useMemo(() => children.filter((node) => {
|
|
112
|
+
if (Obj.isObject(node.data)) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
return Node.isAction(node) && node.properties.disposition === "item";
|
|
116
|
+
}), [
|
|
117
|
+
children
|
|
118
|
+
]);
|
|
119
|
+
const items = useMemo(() => {
|
|
120
|
+
if (isQueryEmpty) {
|
|
121
|
+
return filteredChildren;
|
|
122
|
+
}
|
|
123
|
+
return results.map((obj) => {
|
|
124
|
+
const typename = Obj.getTypename(obj);
|
|
125
|
+
const metadata = typename ? resolveMetadata(typename) : {};
|
|
126
|
+
return {
|
|
127
|
+
id: obj.id,
|
|
128
|
+
type: "search-result",
|
|
129
|
+
data: obj,
|
|
130
|
+
properties: {
|
|
131
|
+
label: Obj.getLabel(obj) ?? obj.id,
|
|
132
|
+
icon: metadata.icon ?? "ph--placeholder--regular",
|
|
133
|
+
iconHue: metadata.iconHue
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
}, [
|
|
138
|
+
isQueryEmpty,
|
|
139
|
+
filteredChildren,
|
|
140
|
+
results,
|
|
141
|
+
resolveMetadata
|
|
142
|
+
]);
|
|
143
|
+
return {
|
|
144
|
+
items,
|
|
145
|
+
handleSearch
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// src/containers/SpaceMain/index.ts
|
|
150
|
+
var SpaceMain_default = SpaceMain;
|
|
151
|
+
export {
|
|
152
|
+
SpaceMain_default as default
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=SpaceMain-IGCYHL7R.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/containers/SpaceMain/SpaceMain.tsx", "../../../src/containers/SpaceMain/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { Filter, Obj, Query } from '@dxos/echo';\nimport { Graph, Node, useActionRunner, useConnections } from '@dxos/plugin-graph';\nimport { type Space, useQuery } from '@dxos/react-client/echo';\nimport { ScrollArea, Toolbar, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { Card, Panel } from '@dxos/react-ui';\nimport { Mosaic, type MosaicStackTileComponent } from '@dxos/react-ui-mosaic';\nimport { SearchList } from '@dxos/react-ui-searchlist';\nimport { Text } from '@dxos/schema';\nimport { getStyles } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nexport const SpaceMain = ({ space }: { space: Space }) => {\n const { t } = useTranslation(meta.id);\n const { items, handleSearch } = useSpaceItems(space);\n\n return (\n <SearchList.Root onSearch={handleSearch}>\n <Panel.Root className='dx-article'>\n <Panel.Toolbar asChild>\n <Toolbar.Root>\n <SearchList.Input placeholder={t('search placeholder')} />\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <SearchList.Content>\n <Mosaic.Container asChild>\n <ScrollArea.Root orientation='vertical'>\n <ScrollArea.Viewport classNames='p-2'>\n <Mosaic.Stack items={items} getId={(node) => node.id} Tile={NodeTile} />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Mosaic.Container>\n </SearchList.Content>\n </Panel.Content>\n </Panel.Root>\n </SearchList.Root>\n );\n};\n\nconst NodeTile: MosaicStackTileComponent<Node.Node> = (props) => {\n const node = props.data;\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const { invokeSync } = useOperationInvoker();\n const runAction = useActionRunner();\n\n const label = toLocalizedString(node.properties.label, t);\n const icon = node.properties.icon ?? 'ph--placeholder--regular';\n const iconHue = node.properties.iconHue;\n const styles = iconHue ? getStyles(iconHue) : undefined;\n\n const handleClick = () => {\n if (Node.isAction(node)) {\n // Run action if this is an action node.\n const [parent] = Graph.getConnections(graph, node.id, Node.childRelation('inbound'));\n if (parent) {\n void runAction(node, { parent });\n }\n } else {\n // Navigate to the node.\n invokeSync(LayoutOperation.Open, { subject: [node.id] });\n }\n };\n\n return (\n <Card.Root fullWidth>\n <Card.Toolbar>\n <Card.ToolbarIconButton\n variant='ghost'\n label={label}\n icon={icon}\n iconOnly\n iconClassNames={styles?.surfaceText}\n />\n <Card.Title onClick={handleClick}>{label}</Card.Title>\n <Card.Menu />\n </Card.Toolbar>\n </Card.Root>\n );\n};\n\n/**\n * Hook to resolve metadata (icon, iconHue, etc.) for objects based on their typename.\n */\n// TODO(wittjosiah): Factor out.\nconst useMetadataResolver = () => {\n const allMetadata = useCapabilities(AppCapabilities.Metadata);\n return useCallback((typename: string) => allMetadata.find((m) => m.id === typename)?.metadata ?? {}, [allMetadata]);\n};\n\n/**\n * Hook to get space items with search/filter support.\n * Returns direct children when no query, or full-text search results when searching.\n */\nconst useSpaceItems = (space: Space) => {\n const { graph } = useAppGraph();\n const [query, setQuery] = useState<string>();\n const resolveMetadata = useMetadataResolver();\n\n // Expand the space node to load its children (needed when navigating directly to a space URL).\n useEffect(() => {\n const frame = requestAnimationFrame(() => {\n Graph.expand(graph, space.id, 'child');\n });\n return () => cancelAnimationFrame(frame);\n }, [graph, space.id]);\n\n // Get direct children of the space node for the default view.\n const children = useConnections(graph, space.id, 'child');\n\n const handleSearch = useCallback((text: string) => {\n setQuery(text);\n }, []);\n\n // TODO(dmaretskyi): Switch back to QueryEditor once query builder is ready for production.\n // Query results using full-text search.\n const results = useQuery(\n space.db,\n query === undefined\n ? Query.select(Filter.nothing())\n : Query.all(\n Query.select(Filter.text(query, { type: 'full-text' })).select(Filter.not(Filter.type(Text.Text))),\n Query.select(Filter.text(query, { type: 'full-text' }))\n .select(Filter.type(Text.Text))\n .referencedBy('dxos.org/type/Document', 'content'),\n ),\n );\n\n // Determine if query is empty (show default view).\n const isQueryEmpty = !query?.trim();\n\n // Filter children to those which are objects, actions with disposition 'item', or alternate-tree nodes.\n const filteredChildren = useMemo(\n () =>\n children.filter((node) => {\n // Include regular objects.\n if (Obj.isObject(node.data)) {\n return true;\n }\n // Include actions with disposition 'item'.\n return Node.isAction(node) && node.properties.disposition === 'item';\n }),\n [children],\n );\n\n // When showing default view, use nodes (which may include actions).\n // When showing search results, wrap objects in a compatible shape with resolved metadata.\n const items = useMemo(() => {\n if (isQueryEmpty) {\n return filteredChildren;\n }\n // Wrap query results as pseudo-nodes for consistent rendering.\n return results.map((obj) => {\n const typename = Obj.getTypename(obj);\n const metadata = typename ? resolveMetadata(typename) : {};\n return {\n id: obj.id,\n type: 'search-result',\n data: obj,\n properties: {\n label: Obj.getLabel(obj) ?? obj.id,\n icon: metadata.icon ?? 'ph--placeholder--regular',\n iconHue: metadata.iconHue,\n },\n } as Node.Node;\n });\n }, [isQueryEmpty, filteredChildren, results, resolveMetadata]);\n\n return { items, handleSearch };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SpaceMain } from './SpaceMain';\n\nexport default SpaceMain;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useCallback", "useEffect", "useMemo", "useState", "useCapabilities", "useOperationInvoker", "AppCapabilities", "LayoutOperation", "useAppGraph", "Filter", "Obj", "Query", "Graph", "Node", "useActionRunner", "useConnections", "useQuery", "ScrollArea", "Toolbar", "toLocalizedString", "useTranslation", "Card", "Panel", "Mosaic", "SearchList", "Text", "getStyles", "SpaceMain", "space", "t", "useTranslation", "meta", "id", "items", "handleSearch", "useSpaceItems", "SearchList", "Root", "onSearch", "Panel", "className", "Toolbar", "asChild", "Input", "placeholder", "Content", "Mosaic", "Container", "ScrollArea", "orientation", "Viewport", "classNames", "Stack", "getId", "node", "Tile", "NodeTile", "props", "data", "graph", "useAppGraph", "invokeSync", "useOperationInvoker", "runAction", "useActionRunner", "label", "toLocalizedString", "properties", "icon", "iconHue", "styles", "getStyles", "undefined", "handleClick", "Node", "isAction", "parent", "Graph", "getConnections", "childRelation", "LayoutOperation", "Open", "subject", "Card", "fullWidth", "ToolbarIconButton", "variant", "iconOnly", "iconClassNames", "surfaceText", "Title", "onClick", "Menu", "useMetadataResolver", "allMetadata", "useCapabilities", "AppCapabilities", "Metadata", "useCallback", "typename", "find", "m", "metadata", "query", "setQuery", "useState", "resolveMetadata", "useEffect", "frame", "requestAnimationFrame", "expand", "cancelAnimationFrame", "children", "useConnections", "text", "results", "useQuery", "db", "Query", "select", "Filter", "nothing", "all", "type", "not", "Text", "referencedBy", "isQueryEmpty", "trim", "filteredChildren", "useMemo", "filter", "Obj", "isObject", "disposition", "map", "obj", "getTypename", "getLabel", "SpaceMain"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SearchOperation
|
|
3
|
+
} from "./chunk-I7YWQSUZ.mjs";
|
|
4
|
+
import {
|
|
5
|
+
meta
|
|
6
|
+
} from "./chunk-HRIWTRJV.mjs";
|
|
7
|
+
|
|
8
|
+
// src/capabilities/app-graph-builder/app-graph-builder.ts
|
|
9
|
+
import * as Effect from "effect/Effect";
|
|
10
|
+
import { Capability } from "@dxos/app-framework";
|
|
11
|
+
import { AppCapabilities } from "@dxos/app-toolkit";
|
|
12
|
+
import { Operation } from "@dxos/operation";
|
|
13
|
+
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
14
|
+
import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from "@dxos/plugin-deck/types";
|
|
15
|
+
import { GraphBuilder, NodeMatcher } from "@dxos/plugin-graph";
|
|
16
|
+
import { parseId } from "@dxos/react-client/echo";
|
|
17
|
+
var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
18
|
+
const extensions = yield* Effect.all([
|
|
19
|
+
GraphBuilder.createExtension({
|
|
20
|
+
id: `${meta.id}/space-search`,
|
|
21
|
+
match: NodeMatcher.whenRoot,
|
|
22
|
+
connector: Effect.fnUntraced(function* (node, get) {
|
|
23
|
+
const client = yield* Capability.get(ClientCapabilities.Client);
|
|
24
|
+
const layoutAtom = get(yield* Capability.atom(AppCapabilities.Layout))[0];
|
|
25
|
+
const layout = layoutAtom ? get(layoutAtom) : void 0;
|
|
26
|
+
const { spaceId } = parseId(layout?.workspace);
|
|
27
|
+
const space = spaceId ? client.spaces.get(spaceId) : null;
|
|
28
|
+
return [
|
|
29
|
+
{
|
|
30
|
+
id: [
|
|
31
|
+
node.id,
|
|
32
|
+
"search"
|
|
33
|
+
].join(ATTENDABLE_PATH_SEPARATOR),
|
|
34
|
+
type: DECK_COMPANION_TYPE,
|
|
35
|
+
data: space,
|
|
36
|
+
properties: {
|
|
37
|
+
label: [
|
|
38
|
+
"search label",
|
|
39
|
+
{
|
|
40
|
+
ns: meta.id
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
icon: "ph--magnifying-glass--regular",
|
|
44
|
+
disposition: "hidden"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
];
|
|
48
|
+
})
|
|
49
|
+
}),
|
|
50
|
+
GraphBuilder.createExtension({
|
|
51
|
+
id: meta.id,
|
|
52
|
+
match: NodeMatcher.whenRoot,
|
|
53
|
+
actions: () => Effect.succeed([
|
|
54
|
+
{
|
|
55
|
+
id: SearchOperation.OpenSearch.meta.key,
|
|
56
|
+
data: Effect.fnUntraced(function* () {
|
|
57
|
+
yield* Operation.invoke(SearchOperation.OpenSearch);
|
|
58
|
+
return false;
|
|
59
|
+
}),
|
|
60
|
+
properties: {
|
|
61
|
+
label: [
|
|
62
|
+
"search action label",
|
|
63
|
+
{
|
|
64
|
+
ns: meta.id
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
icon: "ph--magnifying-glass--regular",
|
|
68
|
+
keyBinding: {
|
|
69
|
+
macos: "shift+meta+f",
|
|
70
|
+
windows: "shift+alt+f"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
])
|
|
75
|
+
})
|
|
76
|
+
]);
|
|
77
|
+
return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);
|
|
78
|
+
}));
|
|
79
|
+
export {
|
|
80
|
+
app_graph_builder_default as default
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=app-graph-builder-NUJ2FOVQ.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/app-graph-builder/app-graph-builder.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/operation';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';\nimport { parseId } from '@dxos/react-client/echo';\n\nimport { meta } from '../../meta';\nimport { SearchOperation } from '../../types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* Effect.all([\n GraphBuilder.createExtension({\n id: `${meta.id}/space-search`,\n match: NodeMatcher.whenRoot,\n connector: Effect.fnUntraced(function* (node, get) {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const layoutAtom = get(yield* Capability.atom(AppCapabilities.Layout))[0];\n const layout = layoutAtom ? get(layoutAtom) : undefined;\n const { spaceId } = parseId(layout?.workspace);\n const space = spaceId ? client.spaces.get(spaceId) : null;\n\n return [\n {\n id: [node.id, 'search'].join(ATTENDABLE_PATH_SEPARATOR),\n type: DECK_COMPANION_TYPE,\n data: space,\n properties: {\n label: ['search label', { ns: meta.id }],\n icon: 'ph--magnifying-glass--regular',\n disposition: 'hidden',\n },\n },\n ];\n }),\n }),\n GraphBuilder.createExtension({\n id: meta.id,\n match: NodeMatcher.whenRoot,\n actions: () =>\n Effect.succeed([\n {\n id: SearchOperation.OpenSearch.meta.key,\n data: Effect.fnUntraced(function* () {\n yield* Operation.invoke(SearchOperation.OpenSearch);\n return false;\n }),\n properties: {\n label: ['search action label', { ns: meta.id }],\n icon: 'ph--magnifying-glass--regular',\n keyBinding: {\n macos: 'shift+meta+f',\n windows: 'shift+alt+f',\n },\n },\n },\n ]),\n }),\n ]);\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,iBAAiB;AAC1B,SAASC,0BAA0B;AACnC,SAASC,2BAA2BC,2BAA2B;AAC/D,SAASC,cAAcC,mBAAmB;AAC1C,SAASC,eAAe;AAKxB,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,aAAa,OAAcC,WAAI;IACnCC,aAAaC,gBAAgB;MAC3BC,IAAI,GAAGC,KAAKD,EAAE;MACdE,OAAOC,YAAYC;MACnBC,WAAkBV,kBAAW,WAAWW,MAAMC,KAAG;AAC/C,cAAMC,SAAS,OAAOf,WAAWc,IAAIE,mBAAmBC,MAAM;AAC9D,cAAMC,aAAaJ,IAAI,OAAOd,WAAWmB,KAAKC,gBAAgBC,MAAM,CAAA,EAAG,CAAA;AACvE,cAAMC,SAASJ,aAAaJ,IAAII,UAAAA,IAAcK;AAC9C,cAAM,EAAEC,QAAO,IAAKC,QAAQH,QAAQI,SAAAA;AACpC,cAAMC,QAAQH,UAAUT,OAAOa,OAAOd,IAAIU,OAAAA,IAAW;AAErD,eAAO;UACL;YACEjB,IAAI;cAACM,KAAKN;cAAI;cAAUsB,KAAKC,yBAAAA;YAC7BC,MAAMC;YACNC,MAAMN;YACNO,YAAY;cACVC,OAAO;gBAAC;gBAAgB;kBAAEC,IAAI5B,KAAKD;gBAAG;;cACtC8B,MAAM;cACNC,aAAa;YACf;UACF;;MAEJ,CAAA;IACF,CAAA;IACAjC,aAAaC,gBAAgB;MAC3BC,IAAIC,KAAKD;MACTE,OAAOC,YAAYC;MACnB4B,SAAS,MACAC,eAAQ;QACb;UACEjC,IAAIkC,gBAAgBC,WAAWlC,KAAKmC;UACpCV,MAAa/B,kBAAW,aAAA;AACtB,mBAAO0C,UAAUC,OAAOJ,gBAAgBC,UAAU;AAClD,mBAAO;UACT,CAAA;UACAR,YAAY;YACVC,OAAO;cAAC;cAAuB;gBAAEC,IAAI5B,KAAKD;cAAG;;YAC7C8B,MAAM;YACNS,YAAY;cACVC,OAAO;cACPC,SAAS;YACX;UACF;QACF;OACD;IACL,CAAA;GACD;AAED,SAAOhD,WAAWiD,YAAY7B,gBAAgB8B,iBAAiB/C,UAAAA;AACjE,CAAA,CAAA;",
|
|
6
|
+
"names": ["Effect", "Capability", "AppCapabilities", "Operation", "ClientCapabilities", "ATTENDABLE_PATH_SEPARATOR", "DECK_COMPANION_TYPE", "GraphBuilder", "NodeMatcher", "parseId", "Capability", "makeModule", "fnUntraced", "extensions", "all", "GraphBuilder", "createExtension", "id", "meta", "match", "NodeMatcher", "whenRoot", "connector", "node", "get", "client", "ClientCapabilities", "Client", "layoutAtom", "atom", "AppCapabilities", "Layout", "layout", "undefined", "spaceId", "parseId", "workspace", "space", "spaces", "join", "ATTENDABLE_PATH_SEPARATOR", "type", "DECK_COMPANION_TYPE", "data", "properties", "label", "ns", "icon", "disposition", "actions", "succeed", "SearchOperation", "OpenSearch", "key", "Operation", "invoke", "keyBinding", "macos", "windows", "contributes", "AppGraphBuilder"]
|
|
7
|
+
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
// src/meta.ts
|
|
2
|
+
import { trim } from "@dxos/util";
|
|
2
3
|
var meta = {
|
|
3
4
|
id: "dxos.org/plugin/search",
|
|
4
5
|
name: "Search",
|
|
5
|
-
description:
|
|
6
|
+
description: trim`
|
|
7
|
+
Full-text search engine for finding content across all spaces and object types.
|
|
8
|
+
Quickly locate documents, tables, and other objects with instant results and relevance ranking.
|
|
9
|
+
`,
|
|
6
10
|
icon: "ph--magnifying-glass--regular",
|
|
7
11
|
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-search",
|
|
8
12
|
tags: [
|
|
@@ -15,4 +19,4 @@ export {
|
|
|
15
19
|
meta,
|
|
16
20
|
SEARCH_RESULT
|
|
17
21
|
};
|
|
18
|
-
//# sourceMappingURL=chunk-
|
|
22
|
+
//# sourceMappingURL=chunk-HRIWTRJV.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/meta.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'dxos.org/plugin/search',\n name: 'Search',\n description: trim`\n Full-text search engine for finding content across all spaces and object types.\n Quickly locate documents, tables, and other objects with instant results and relevance ranking.\n `,\n icon: 'ph--magnifying-glass--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-search',\n tags: ['labs'],\n};\n\nexport const SEARCH_RESULT = `${meta.id}/result`;\n"],
|
|
5
|
+
"mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;AACT;AAEO,IAAMC,gBAAgB,GAAGR,KAAKC,EAAE;",
|
|
6
|
+
"names": ["trim", "meta", "id", "name", "description", "trim", "icon", "source", "tags", "SEARCH_RESULT"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {
|
|
2
|
+
meta
|
|
3
|
+
} from "./chunk-HRIWTRJV.mjs";
|
|
4
|
+
|
|
5
|
+
// src/types/action.tsx
|
|
6
|
+
import * as Schema from "effect/Schema";
|
|
7
|
+
import { Operation } from "@dxos/operation";
|
|
8
|
+
var SEARCH_OPERATION = `${meta.id}/operation`;
|
|
9
|
+
(function(SearchOperation2) {
|
|
10
|
+
SearchOperation2.OpenSearch = Operation.make({
|
|
11
|
+
meta: {
|
|
12
|
+
key: `${SEARCH_OPERATION}/open-search`,
|
|
13
|
+
name: "Open Search"
|
|
14
|
+
},
|
|
15
|
+
schema: {
|
|
16
|
+
input: Schema.Void,
|
|
17
|
+
output: Schema.Void
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
})(SearchOperation || (SearchOperation = {}));
|
|
21
|
+
var SearchOperation;
|
|
22
|
+
|
|
23
|
+
export {
|
|
24
|
+
SearchOperation
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=chunk-I7YWQSUZ.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types/action.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Operation } from '@dxos/operation';\n\nimport { meta } from '../meta';\n\nconst SEARCH_OPERATION = `${meta.id}/operation`;\n\nexport namespace SearchOperation {\n export const OpenSearch = Operation.make({\n meta: { key: `${SEARCH_OPERATION}/open-search`, name: 'Open Search' },\n schema: { input: Schema.Void, output: Schema.Void },\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,iBAAiB;AAI1B,IAAMC,mBAAmB,GAAGC,KAAKC,EAAE;UAElBC,kBAAAA;mBACFC,aAAaC,UAAUC,KAAK;IACvCL,MAAM;MAAEM,KAAK,GAAGP,gBAAAA;MAAgCQ,MAAM;IAAc;IACpEC,QAAQ;MAAEC,OAAcC;MAAMC,QAAeD;IAAK;EACpD,CAAA;AACF,GALiBR,oBAAAA,kBAAAA,CAAAA,EAAAA;;",
|
|
6
|
+
"names": ["Schema", "Operation", "SEARCH_OPERATION", "meta", "id", "SearchOperation", "OpenSearch", "Operation", "make", "key", "name", "schema", "input", "Void", "output"]
|
|
7
|
+
}
|