@dxos/plugin-search 0.8.4-main.c85a9c8dae → 0.8.4-main.d9fc60f731

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.
Files changed (199) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +291 -0
  3. package/dist/lib/neutral/SearchArticle-CQMZ46ZS.mjs +51 -0
  4. package/dist/lib/neutral/SearchArticle-CQMZ46ZS.mjs.map +7 -0
  5. package/dist/lib/neutral/SearchDialog-IFMA5UP5.mjs +76 -0
  6. package/dist/lib/neutral/SearchDialog-IFMA5UP5.mjs.map +7 -0
  7. package/dist/lib/neutral/SearchPlugin.mjs +10 -0
  8. package/dist/lib/neutral/SearchPlugin.mjs.map +7 -0
  9. package/dist/lib/{browser/app-graph-builder-NUJ2FOVQ.mjs → neutral/app-graph-builder-ADB5LBS5.mjs} +23 -34
  10. package/dist/lib/neutral/app-graph-builder-ADB5LBS5.mjs.map +7 -0
  11. package/dist/lib/neutral/capabilities/index.mjs +13 -0
  12. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  13. package/dist/lib/neutral/chunk-2XHA22US.mjs +9 -0
  14. package/dist/lib/neutral/chunk-2XHA22US.mjs.map +7 -0
  15. package/dist/lib/neutral/chunk-BST37VRI.mjs +34 -0
  16. package/dist/lib/neutral/chunk-BST37VRI.mjs.map +7 -0
  17. package/dist/lib/{browser/chunk-NB4JZIOE.mjs → neutral/chunk-CZU523NP.mjs} +22 -22
  18. package/dist/lib/neutral/chunk-CZU523NP.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-GT3AGVU6.mjs +28 -0
  20. package/dist/lib/neutral/chunk-GT3AGVU6.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-Q2F6YOOZ.mjs +41 -0
  24. package/dist/lib/neutral/chunk-Q2F6YOOZ.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-TN4G3MZZ.mjs +8 -0
  26. package/dist/lib/neutral/chunk-TN4G3MZZ.mjs.map +7 -0
  27. package/dist/lib/neutral/components/index.mjs +97 -0
  28. package/dist/lib/neutral/components/index.mjs.map +7 -0
  29. package/dist/lib/neutral/containers/index.mjs +11 -0
  30. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  31. package/dist/lib/neutral/hooks/index.mjs +30 -0
  32. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  33. package/dist/lib/neutral/index.mjs +40 -0
  34. package/dist/lib/neutral/index.mjs.map +7 -0
  35. package/dist/lib/neutral/meta.json +1 -0
  36. package/dist/lib/neutral/meta.mjs +10 -0
  37. package/dist/lib/neutral/meta.mjs.map +7 -0
  38. package/dist/lib/neutral/open-search-Y6OUELN3.mjs +23 -0
  39. package/dist/lib/neutral/open-search-Y6OUELN3.mjs.map +7 -0
  40. package/dist/lib/neutral/operation-handler-DY624P2R.mjs +13 -0
  41. package/dist/lib/neutral/operation-handler-DY624P2R.mjs.map +7 -0
  42. package/dist/lib/neutral/operations/index.mjs +8 -0
  43. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  44. package/dist/lib/neutral/plugin.mjs +16 -0
  45. package/dist/lib/neutral/plugin.mjs.map +7 -0
  46. package/dist/lib/neutral/react-surface-3IXL3EOJ.mjs +61 -0
  47. package/dist/lib/neutral/react-surface-3IXL3EOJ.mjs.map +7 -0
  48. package/dist/lib/neutral/testing.mjs +8 -0
  49. package/dist/lib/neutral/testing.mjs.map +7 -0
  50. package/dist/lib/neutral/translations.mjs +25 -0
  51. package/dist/lib/neutral/translations.mjs.map +7 -0
  52. package/dist/lib/neutral/types/index.mjs +8 -0
  53. package/dist/lib/neutral/types/index.mjs.map +7 -0
  54. package/dist/types/src/SearchPlugin.d.ts +1 -0
  55. package/dist/types/src/SearchPlugin.d.ts.map +1 -1
  56. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  57. package/dist/types/src/capabilities/index.d.ts +5 -3
  58. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  59. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  60. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  62. package/dist/types/src/components/SearchResultStack/SearchResultStack.d.ts +9 -0
  63. package/dist/types/src/components/SearchResultStack/SearchResultStack.d.ts.map +1 -0
  64. package/dist/types/src/components/SearchResultStack/index.d.ts +2 -0
  65. package/dist/types/src/components/SearchResultStack/index.d.ts.map +1 -0
  66. package/dist/types/src/components/index.d.ts +1 -0
  67. package/dist/types/src/components/index.d.ts.map +1 -1
  68. package/dist/types/src/constants.d.ts +2 -1
  69. package/dist/types/src/constants.d.ts.map +1 -1
  70. package/dist/types/src/containers/SearchArticle/SearchArticle.d.ts +4 -0
  71. package/dist/types/src/containers/SearchArticle/SearchArticle.d.ts.map +1 -0
  72. package/dist/types/src/containers/SearchArticle/SearchArticle.stories.d.ts +14 -0
  73. package/dist/types/src/containers/SearchArticle/SearchArticle.stories.d.ts.map +1 -0
  74. package/dist/types/src/containers/SearchArticle/index.d.ts +2 -0
  75. package/dist/types/src/containers/SearchArticle/index.d.ts.map +1 -0
  76. package/dist/types/src/containers/SearchDialog/SearchDialog.d.ts +5 -4
  77. package/dist/types/src/containers/SearchDialog/SearchDialog.d.ts.map +1 -1
  78. package/dist/types/src/containers/SearchDialog/SearchDialog.stories.d.ts +16 -0
  79. package/dist/types/src/containers/SearchDialog/SearchDialog.stories.d.ts.map +1 -0
  80. package/dist/types/src/containers/SearchDialog/index.d.ts +1 -2
  81. package/dist/types/src/containers/SearchDialog/index.d.ts.map +1 -1
  82. package/dist/types/src/containers/index.d.ts +1 -3
  83. package/dist/types/src/containers/index.d.ts.map +1 -1
  84. package/dist/types/src/hooks/sync.d.ts +2 -2
  85. package/dist/types/src/hooks/sync.d.ts.map +1 -1
  86. package/dist/types/src/hooks/useGlobalSearch.d.ts +2 -2
  87. package/dist/types/src/hooks/useGlobalSearch.d.ts.map +1 -1
  88. package/dist/types/src/hooks/useSearchResults.d.ts.map +1 -1
  89. package/dist/types/src/hooks/useWebSearch.d.ts +1 -1
  90. package/dist/types/src/hooks/useWebSearch.d.ts.map +1 -1
  91. package/dist/types/src/index.d.ts +0 -1
  92. package/dist/types/src/index.d.ts.map +1 -1
  93. package/dist/types/src/meta.d.ts +1 -1
  94. package/dist/types/src/meta.d.ts.map +1 -1
  95. package/dist/types/src/operations/index.d.ts +3 -0
  96. package/dist/types/src/operations/index.d.ts.map +1 -0
  97. package/dist/types/src/operations/open-search.d.ts +5 -0
  98. package/dist/types/src/operations/open-search.d.ts.map +1 -0
  99. package/dist/types/src/plugin.d.ts +4 -0
  100. package/dist/types/src/plugin.d.ts.map +1 -0
  101. package/dist/types/src/search/exa.d.ts +4 -5
  102. package/dist/types/src/search/exa.d.ts.map +1 -1
  103. package/dist/types/src/testing.d.ts +2 -0
  104. package/dist/types/src/testing.d.ts.map +1 -0
  105. package/dist/types/src/translations.d.ts +15 -10
  106. package/dist/types/src/translations.d.ts.map +1 -1
  107. package/dist/types/src/types/SearchOperation.d.ts +3 -0
  108. package/dist/types/src/types/SearchOperation.d.ts.map +1 -0
  109. package/dist/types/src/types/index.d.ts +1 -1
  110. package/dist/types/src/types/index.d.ts.map +1 -1
  111. package/dist/types/src/types/search.d.ts +1 -16
  112. package/dist/types/src/types/search.d.ts.map +1 -1
  113. package/dist/types/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +102 -46
  115. package/src/SearchPlugin.tsx +12 -22
  116. package/src/capabilities/{app-graph-builder/app-graph-builder.ts → app-graph-builder.ts} +14 -19
  117. package/src/capabilities/index.ts +9 -3
  118. package/src/capabilities/operation-handler.ts +16 -0
  119. package/src/capabilities/react-surface.tsx +72 -0
  120. package/src/components/SearchResultStack/SearchResultStack.tsx +118 -0
  121. package/src/components/SearchResultStack/index.ts +5 -0
  122. package/src/components/index.ts +2 -0
  123. package/src/constants.ts +4 -2
  124. package/src/containers/SearchArticle/SearchArticle.stories.tsx +79 -0
  125. package/src/containers/SearchArticle/SearchArticle.tsx +60 -0
  126. package/src/containers/SearchArticle/index.ts +5 -0
  127. package/src/containers/SearchDialog/SearchDialog.stories.tsx +108 -0
  128. package/src/containers/SearchDialog/SearchDialog.tsx +67 -94
  129. package/src/containers/SearchDialog/index.ts +1 -3
  130. package/src/containers/index.ts +1 -4
  131. package/src/hooks/sync.test.ts +4 -4
  132. package/src/hooks/sync.ts +11 -8
  133. package/src/hooks/useGlobalSearch.tsx +3 -3
  134. package/src/hooks/useSearchResults.ts +2 -2
  135. package/src/hooks/useWebSearch.ts +6 -6
  136. package/src/index.ts +2 -2
  137. package/src/meta.ts +25 -7
  138. package/src/operations/index.ts +7 -0
  139. package/src/operations/open-search.ts +24 -0
  140. package/src/plugin.ts +11 -0
  141. package/src/search/exa.test.ts +6 -6
  142. package/src/search/exa.ts +6 -6
  143. package/src/testing.ts +7 -0
  144. package/src/translations.ts +10 -9
  145. package/src/types/SearchOperation.ts +20 -0
  146. package/src/types/index.ts +2 -1
  147. package/src/types/search.ts +1 -19
  148. package/src/vite-env.d.ts +10 -0
  149. package/dist/lib/browser/SearchDialog-E6336HCX.mjs +0 -110
  150. package/dist/lib/browser/SearchDialog-E6336HCX.mjs.map +0 -7
  151. package/dist/lib/browser/SearchMain-24ZNJB24.mjs +0 -100
  152. package/dist/lib/browser/SearchMain-24ZNJB24.mjs.map +0 -7
  153. package/dist/lib/browser/SpaceMain-IGCYHL7R.mjs +0 -154
  154. package/dist/lib/browser/SpaceMain-IGCYHL7R.mjs.map +0 -7
  155. package/dist/lib/browser/app-graph-builder-NUJ2FOVQ.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-HRIWTRJV.mjs +0 -22
  157. package/dist/lib/browser/chunk-HRIWTRJV.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-I7YWQSUZ.mjs +0 -26
  159. package/dist/lib/browser/chunk-I7YWQSUZ.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-NB4JZIOE.mjs.map +0 -7
  161. package/dist/lib/browser/index.mjs +0 -105
  162. package/dist/lib/browser/index.mjs.map +0 -7
  163. package/dist/lib/browser/meta.json +0 -1
  164. package/dist/lib/browser/operation-resolver-QEGN4ZKN.mjs +0 -26
  165. package/dist/lib/browser/operation-resolver-QEGN4ZKN.mjs.map +0 -7
  166. package/dist/lib/browser/react-surface-FLO4YTFP.mjs +0 -73
  167. package/dist/lib/browser/react-surface-FLO4YTFP.mjs.map +0 -7
  168. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  169. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  170. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  171. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  172. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  173. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  174. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  175. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  176. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  177. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  178. package/dist/types/src/containers/SearchMain/SearchMain.d.ts +0 -6
  179. package/dist/types/src/containers/SearchMain/SearchMain.d.ts.map +0 -1
  180. package/dist/types/src/containers/SearchMain/index.d.ts +0 -3
  181. package/dist/types/src/containers/SearchMain/index.d.ts.map +0 -1
  182. package/dist/types/src/containers/SpaceMain/SpaceMain.d.ts +0 -6
  183. package/dist/types/src/containers/SpaceMain/SpaceMain.d.ts.map +0 -1
  184. package/dist/types/src/containers/SpaceMain/index.d.ts +0 -3
  185. package/dist/types/src/containers/SpaceMain/index.d.ts.map +0 -1
  186. package/dist/types/src/types/action.d.ts +0 -16
  187. package/dist/types/src/types/action.d.ts.map +0 -1
  188. package/src/capabilities/app-graph-builder/index.ts +0 -7
  189. package/src/capabilities/operation-resolver/index.ts +0 -7
  190. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -24
  191. package/src/capabilities/react-surface/index.ts +0 -7
  192. package/src/capabilities/react-surface/react-surface.tsx +0 -72
  193. package/src/containers/SearchMain/SearchMain.tsx +0 -103
  194. package/src/containers/SearchMain/index.ts +0 -7
  195. package/src/containers/SpaceMain/SpaceMain.tsx +0 -180
  196. package/src/containers/SpaceMain/index.ts +0 -7
  197. package/src/types/action.tsx +0 -18
  198. /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
  199. /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
@@ -15,7 +15,7 @@ describe.skip('Search', () => {
15
15
  test.skip('contacts', { timeout: 60_000 }, async () => {
16
16
  const objects = await search({
17
17
  query: 'top executives at google',
18
- schema: [TestSchema.Person],
18
+ types: [TestSchema.Person],
19
19
  exaApiKey: EXA_API_KEY,
20
20
  });
21
21
 
@@ -25,7 +25,7 @@ describe.skip('Search', () => {
25
25
  test.skip('contacts projects and orgs', { timeout: 60_000 }, async () => {
26
26
  const objects = await search({
27
27
  query: 'top executives at google',
28
- schema: [TestSchema.Person, TestSchema.Project, TestSchema.Organization],
28
+ types: [TestSchema.Person, TestSchema.Project, TestSchema.Organization],
29
29
  exaApiKey: EXA_API_KEY,
30
30
  });
31
31
 
@@ -35,7 +35,7 @@ describe.skip('Search', () => {
35
35
  test('a19z org, projects they invest in and team', { timeout: 60_000 }, async () => {
36
36
  const objects = await search({
37
37
  query: 'a19z org, projects they invest in and team',
38
- schema: [TestSchema.Project, TestSchema.Organization, TestSchema.Person],
38
+ types: [TestSchema.Project, TestSchema.Organization, TestSchema.Person],
39
39
  exaApiKey: EXA_API_KEY,
40
40
  });
41
41
 
@@ -45,7 +45,7 @@ describe.skip('Search', () => {
45
45
  test('companies building CRDTs', { timeout: 60_000 }, async () => {
46
46
  const objects = await search({
47
47
  query: 'companies building CRDTs',
48
- schema: [TestSchema.Project, TestSchema.Organization, TestSchema.Person],
48
+ types: [TestSchema.Project, TestSchema.Organization, TestSchema.Person],
49
49
  exaApiKey: EXA_API_KEY,
50
50
  });
51
51
 
@@ -57,7 +57,7 @@ describe.skip('Search', () => {
57
57
  test('composer context-based search', { timeout: 60_000 }, async () => {
58
58
  const objects = await search({
59
59
  context: COMPOSER_DXOS_DOC,
60
- schema: [TestSchema.Project, TestSchema.Organization, TestSchema.Person],
60
+ types: [TestSchema.Project, TestSchema.Organization, TestSchema.Person],
61
61
  exaApiKey: EXA_API_KEY,
62
62
  });
63
63
 
@@ -67,7 +67,7 @@ describe.skip('Search', () => {
67
67
  test.only('edge architecture', { timeout: 60_000 }, async () => {
68
68
  const objects = await search({
69
69
  context: EDGE_ARCHITECTURE_DOC,
70
- schema: [TestSchema.Project, TestSchema.Organization, TestSchema.Person],
70
+ types: [TestSchema.Project, TestSchema.Organization, TestSchema.Person],
71
71
  exaApiKey: EXA_API_KEY,
72
72
  });
73
73
 
package/src/search/exa.ts CHANGED
@@ -9,16 +9,16 @@ import * as Schema from 'effect/Schema';
9
9
  import * as SchemaAST from 'effect/SchemaAST';
10
10
 
11
11
  import { type Entity, Key, Obj, type Type } from '@dxos/echo';
12
- import { ReferenceAnnotationId } from '@dxos/echo/internal';
13
12
  import { isEncodedReference } from '@dxos/echo-protocol';
13
+ import { ReferenceAnnotationId } from '@dxos/echo/internal';
14
14
  import { mapAst } from '@dxos/effect';
15
15
  import { deepMapValues, trim } from '@dxos/util';
16
16
 
17
- export type SearchOptions<Schema extends Schema.Schema.AnyNoContext> = {
17
+ export type SearchOptions<T extends Type.AnyEntity> = {
18
18
  query?: string;
19
19
  // TODO(dmaretskyi): How can we pass this through.
20
20
  context?: string;
21
- schema: Schema[];
21
+ types: T[];
22
22
  exaApiKey: string;
23
23
  liveCrawl?: boolean;
24
24
  };
@@ -32,8 +32,8 @@ export type SearchResult<T = unknown> = {
32
32
  };
33
33
 
34
34
  /** @deprecated Use MixedStreamParser */
35
- export const search = async <Schema extends Schema.Schema.AnyNoContext>(
36
- options: SearchOptions<Schema>,
35
+ export const search = async <T extends Type.AnyEntity>(
36
+ options: SearchOptions<T>,
37
37
  ): Promise<SearchResult<Entity.Unknown>> => {
38
38
  throw new Error('Not implemented');
39
39
  // assertArgument(options.query || options.context, "query or context", "query or context is required");
@@ -186,7 +186,7 @@ const sanitizeObjects = (entries: { data: any; schema: Type.AnyObj }[]) => {
186
186
 
187
187
  return entries
188
188
  .map((entry) => {
189
- idMap.set(entry.data.id, Key.ObjectId.random());
189
+ idMap.set(entry.data.id, Key.EntityId.random());
190
190
  entry.data.id = idMap.get(entry.data.id);
191
191
  return entry;
192
192
  })
package/src/testing.ts ADDED
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // Eager re-export of `SearchPlugin`. See `@dxos/plugin-testing/src/core.ts`
6
+ // for the rationale.
7
+ export * from './SearchPlugin';
@@ -3,21 +3,22 @@
3
3
  //
4
4
 
5
5
  import { type Resource } from '@dxos/react-ui';
6
+ import { translations as searchTranslations } from '@dxos/react-ui-search/translations';
6
7
 
7
- import { meta } from './meta';
8
+ import { meta } from '#meta';
8
9
 
9
10
  export const translations = [
11
+ ...searchTranslations,
10
12
  {
11
13
  'en-US': {
12
14
  [meta.id]: {
13
- 'plugin name': 'Search',
14
- 'search action label': 'Search spaces',
15
- 'search placeholder': 'Search…',
16
- 'search dialog title': 'Open',
17
- 'recently closed heading': 'Recently closed',
18
- 'pending results message': 'Searching…',
19
- 'empty results message': 'No matching objects',
20
- 'search label': 'Search',
15
+ 'plugin.name': 'Search',
16
+ 'search-action.label': 'Search spaces',
17
+ 'search.placeholder': 'Search…',
18
+ 'search-dialog.title': 'Search',
19
+ 'recently-closed.heading': 'Recently closed',
20
+ 'pending-results.message': 'Searching…',
21
+ 'search.label': 'Search',
21
22
  },
22
23
  },
23
24
  },
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // @import-as-namespace
6
+
7
+ import * as Schema from 'effect/Schema';
8
+
9
+ import { Operation } from '@dxos/compute';
10
+ import { DXN } from '@dxos/keys';
11
+
12
+ import { meta } from '#meta';
13
+
14
+ const makeKey = (name: string) => DXN.make(`${meta.id}.operation.${name}`);
15
+
16
+ export const OpenSearch = Operation.make({
17
+ meta: { key: makeKey('openSearch'), name: 'Open Search', icon: 'ph--magnifying-glass--regular' },
18
+ input: Schema.Void,
19
+ output: Schema.Void,
20
+ });
@@ -2,5 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './action';
6
5
  export type * from './search';
6
+
7
+ export * as SearchOperation from './SearchOperation';
@@ -2,22 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import type { Entity } from '@dxos/echo';
6
-
7
- export type SearchResult<T extends Entity.Unknown = Entity.Unknown> = {
8
- id: string;
9
-
10
- /**
11
- * Type kind: "contact", "project", "org", etc.
12
- */
13
- type?: string;
14
- label?: string;
15
- match?: RegExp;
16
- snippet?: string;
17
-
18
- /**
19
- * Icon id.
20
- */
21
- icon?: string;
22
- object?: T;
23
- };
5
+ export type { SearchResult } from '@dxos/react-ui-search';
@@ -0,0 +1,10 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ //
4
+ // Copyright 2026 DXOS.org
5
+ //
6
+
7
+ declare module '*.mdl?raw' {
8
+ const content: string;
9
+ export default content;
10
+ }
@@ -1,110 +0,0 @@
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
@@ -1,7 +0,0 @@
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
- }
@@ -1,100 +0,0 @@
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
@@ -1,7 +0,0 @@
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
- }
@@ -1,154 +0,0 @@
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