@dxos/plugin-pipeline 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 (169) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +345 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/PipelineArticle-6JIVXMYF.mjs +69 -0
  5. package/dist/lib/neutral/PipelineArticle-6JIVXMYF.mjs.map +7 -0
  6. package/dist/lib/neutral/PipelinePlugin.mjs +38 -0
  7. package/dist/lib/neutral/PipelinePlugin.mjs.map +7 -0
  8. package/dist/lib/neutral/PipelinePlugin.node.mjs +21 -0
  9. package/dist/lib/neutral/PipelinePlugin.node.mjs.map +7 -0
  10. package/dist/lib/neutral/PipelinePlugin.workerd.mjs +16 -0
  11. package/dist/lib/neutral/PipelinePlugin.workerd.mjs.map +7 -0
  12. package/dist/lib/{browser/PipelineObjectSettings-D36OYVHW.mjs → neutral/PipelineProperties-JXY3AVOY.mjs} +58 -73
  13. package/dist/lib/neutral/PipelineProperties-JXY3AVOY.mjs.map +7 -0
  14. package/dist/lib/neutral/app-graph-builder-ZLGRWRJU.mjs +44 -0
  15. package/dist/lib/neutral/app-graph-builder-ZLGRWRJU.mjs.map +7 -0
  16. package/dist/lib/neutral/capabilities/index.mjs +11 -0
  17. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  18. package/dist/lib/neutral/chunk-CYXDAAKN.mjs +35 -0
  19. package/dist/lib/neutral/chunk-CYXDAAKN.mjs.map +7 -0
  20. package/dist/lib/neutral/components/index.mjs +203 -0
  21. package/dist/lib/neutral/components/index.mjs.map +7 -0
  22. package/dist/lib/neutral/containers/index.mjs +9 -0
  23. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  24. package/dist/lib/neutral/create-object-6Z4MMGX4.mjs +26 -0
  25. package/dist/lib/neutral/create-object-6Z4MMGX4.mjs.map +7 -0
  26. package/dist/lib/neutral/hooks/index.mjs +70 -0
  27. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  28. package/dist/lib/neutral/index.mjs +7 -0
  29. package/dist/lib/neutral/meta.json +1 -0
  30. package/dist/lib/neutral/meta.mjs +7 -0
  31. package/dist/lib/neutral/meta.mjs.map +7 -0
  32. package/dist/lib/neutral/plugin.mjs +11 -0
  33. package/dist/lib/neutral/plugin.mjs.map +7 -0
  34. package/dist/lib/{browser/react-surface-ZGQVH4VX.mjs → neutral/react-surface-QG7QSZSS.mjs} +15 -26
  35. package/dist/lib/neutral/react-surface-QG7QSZSS.mjs.map +7 -0
  36. package/dist/lib/neutral/translations.mjs +39 -0
  37. package/dist/lib/neutral/translations.mjs.map +7 -0
  38. package/dist/lib/neutral/types/index.mjs +1 -0
  39. package/dist/lib/neutral/types/index.mjs.map +7 -0
  40. package/dist/types/src/PipelinePlugin.d.ts +1 -0
  41. package/dist/types/src/PipelinePlugin.d.ts.map +1 -1
  42. package/dist/types/src/PipelinePlugin.node.d.ts +4 -0
  43. package/dist/types/src/PipelinePlugin.node.d.ts.map +1 -0
  44. package/dist/types/src/PipelinePlugin.test.d.ts +2 -0
  45. package/dist/types/src/PipelinePlugin.test.d.ts.map +1 -0
  46. package/dist/types/src/PipelinePlugin.workerd.d.ts +4 -0
  47. package/dist/types/src/PipelinePlugin.workerd.d.ts.map +1 -0
  48. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  49. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  50. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  51. package/dist/types/src/capabilities/index.d.ts +9 -3
  52. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  53. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  54. package/dist/types/src/components/{PipelineColumn.d.ts → PipelineComponent/PipelineColumn.d.ts} +4 -4
  55. package/dist/types/src/components/PipelineComponent/PipelineColumn.d.ts.map +1 -0
  56. package/dist/types/src/components/PipelineComponent/PipelineComponent.d.ts +53 -0
  57. package/dist/types/src/components/PipelineComponent/PipelineComponent.d.ts.map +1 -0
  58. package/dist/types/src/components/PipelineComponent/PipelineComponent.stories.d.ts +62 -0
  59. package/dist/types/src/components/PipelineComponent/PipelineComponent.stories.d.ts.map +1 -0
  60. package/dist/types/src/components/PipelineComponent/index.d.ts +3 -0
  61. package/dist/types/src/components/PipelineComponent/index.d.ts.map +1 -0
  62. package/dist/types/src/components/index.d.ts +0 -1
  63. package/dist/types/src/components/index.d.ts.map +1 -1
  64. package/dist/types/src/containers/PipelineArticle/PipelineArticle.d.ts +6 -0
  65. package/dist/types/src/containers/PipelineArticle/PipelineArticle.d.ts.map +1 -0
  66. package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts +76 -0
  67. package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts.map +1 -0
  68. package/dist/types/src/containers/PipelineArticle/index.d.ts +2 -0
  69. package/dist/types/src/containers/PipelineArticle/index.d.ts.map +1 -0
  70. package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts +11 -0
  71. package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts.map +1 -0
  72. package/dist/types/src/containers/PipelineProperties/index.d.ts +2 -0
  73. package/dist/types/src/containers/PipelineProperties/index.d.ts.map +1 -0
  74. package/dist/types/src/containers/index.d.ts +2 -2
  75. package/dist/types/src/containers/index.d.ts.map +1 -1
  76. package/dist/types/src/hooks/usePipelineBoardModel.d.ts.map +1 -1
  77. package/dist/types/src/index.d.ts +0 -1
  78. package/dist/types/src/index.d.ts.map +1 -1
  79. package/dist/types/src/meta.d.ts +1 -1
  80. package/dist/types/src/meta.d.ts.map +1 -1
  81. package/dist/types/src/plugin.d.ts +3 -0
  82. package/dist/types/src/plugin.d.ts.map +1 -0
  83. package/dist/types/src/templates/research.d.ts.map +1 -1
  84. package/dist/types/src/translations.d.ts +44 -25
  85. package/dist/types/src/translations.d.ts.map +1 -1
  86. package/dist/types/src/types/index.d.ts +0 -2
  87. package/dist/types/src/types/index.d.ts.map +1 -1
  88. package/dist/types/tsconfig.tsbuildinfo +1 -1
  89. package/package.json +103 -58
  90. package/src/PipelinePlugin.node.ts +19 -0
  91. package/src/PipelinePlugin.test.ts +27 -0
  92. package/src/PipelinePlugin.tsx +12 -30
  93. package/src/PipelinePlugin.workerd.ts +16 -0
  94. package/src/capabilities/app-graph-builder.ts +40 -0
  95. package/src/capabilities/create-object.ts +30 -0
  96. package/src/capabilities/index.ts +5 -3
  97. package/src/capabilities/{react-surface/react-surface.tsx → react-surface.tsx} +16 -15
  98. package/src/components/PipelineComponent/PipelineColumn.tsx +154 -0
  99. package/src/components/{PipelineComponent.stories.tsx → PipelineComponent/PipelineComponent.stories.tsx} +21 -21
  100. package/src/components/{PipelineComponent.tsx → PipelineComponent/PipelineComponent.tsx} +22 -13
  101. package/src/components/PipelineComponent/index.ts +6 -0
  102. package/src/components/index.ts +0 -1
  103. package/src/containers/{PipelineContainer/PipelineContainer.stories.tsx → PipelineArticle/PipelineArticle.stories.tsx} +43 -47
  104. package/src/containers/{PipelineContainer/PipelineContainer.tsx → PipelineArticle/PipelineArticle.tsx} +14 -17
  105. package/src/containers/PipelineArticle/index.ts +5 -0
  106. package/src/containers/{PipelineObjectSettings/PipelineObjectSettings.tsx → PipelineProperties/PipelineProperties.tsx} +72 -75
  107. package/src/containers/PipelineProperties/index.ts +5 -0
  108. package/src/containers/index.ts +2 -2
  109. package/src/hooks/usePipelineBoardModel.ts +6 -6
  110. package/src/index.ts +0 -1
  111. package/src/meta.ts +19 -6
  112. package/src/plugin.ts +9 -0
  113. package/src/templates/research.ts +8 -7
  114. package/src/translations.ts +24 -22
  115. package/src/types/index.ts +0 -3
  116. package/src/vite-env.d.ts +10 -0
  117. package/dist/lib/browser/PipelineContainer-2ZYSZATA.mjs +0 -320
  118. package/dist/lib/browser/PipelineContainer-2ZYSZATA.mjs.map +0 -7
  119. package/dist/lib/browser/PipelineObjectSettings-D36OYVHW.mjs.map +0 -7
  120. package/dist/lib/browser/app-graph-builder-NUJB33F7.mjs +0 -65
  121. package/dist/lib/browser/app-graph-builder-NUJB33F7.mjs.map +0 -7
  122. package/dist/lib/browser/chunk-N6FZHYWT.mjs +0 -42
  123. package/dist/lib/browser/chunk-N6FZHYWT.mjs.map +0 -7
  124. package/dist/lib/browser/chunk-QWNKLHBY.mjs +0 -28
  125. package/dist/lib/browser/chunk-QWNKLHBY.mjs.map +0 -7
  126. package/dist/lib/browser/index.mjs +0 -109
  127. package/dist/lib/browser/index.mjs.map +0 -7
  128. package/dist/lib/browser/meta.json +0 -1
  129. package/dist/lib/browser/react-surface-ZGQVH4VX.mjs.map +0 -7
  130. package/dist/lib/browser/types/index.mjs +0 -10
  131. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
  132. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
  133. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
  134. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -2
  135. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  136. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  137. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  138. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  139. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  140. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  141. package/dist/types/src/components/PipelineColumn.d.ts.map +0 -1
  142. package/dist/types/src/components/PipelineComponent.d.ts +0 -47
  143. package/dist/types/src/components/PipelineComponent.d.ts.map +0 -1
  144. package/dist/types/src/components/PipelineComponent.stories.d.ts +0 -42
  145. package/dist/types/src/components/PipelineComponent.stories.d.ts.map +0 -1
  146. package/dist/types/src/containers/PipelineContainer/PipelineContainer.d.ts +0 -6
  147. package/dist/types/src/containers/PipelineContainer/PipelineContainer.d.ts.map +0 -1
  148. package/dist/types/src/containers/PipelineContainer/PipelineContainer.stories.d.ts +0 -56
  149. package/dist/types/src/containers/PipelineContainer/PipelineContainer.stories.d.ts.map +0 -1
  150. package/dist/types/src/containers/PipelineContainer/index.d.ts +0 -3
  151. package/dist/types/src/containers/PipelineContainer/index.d.ts.map +0 -1
  152. package/dist/types/src/containers/PipelineObjectSettings/PipelineObjectSettings.d.ts +0 -11
  153. package/dist/types/src/containers/PipelineObjectSettings/PipelineObjectSettings.d.ts.map +0 -1
  154. package/dist/types/src/containers/PipelineObjectSettings/index.d.ts +0 -3
  155. package/dist/types/src/containers/PipelineObjectSettings/index.d.ts.map +0 -1
  156. package/dist/types/src/types/PipelineAction.d.ts +0 -25
  157. package/dist/types/src/types/PipelineAction.d.ts.map +0 -1
  158. package/src/capabilities/app-graph-builder/app-graph-builder.ts +0 -51
  159. package/src/capabilities/app-graph-builder/index.ts +0 -7
  160. package/src/capabilities/operation-resolver/index.ts +0 -5
  161. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -29
  162. package/src/capabilities/react-surface/index.ts +0 -7
  163. package/src/components/PipelineColumn.tsx +0 -133
  164. package/src/containers/PipelineContainer/index.ts +0 -7
  165. package/src/containers/PipelineObjectSettings/index.ts +0 -7
  166. package/src/types/PipelineAction.ts +0 -29
  167. /package/dist/lib/{browser/types → neutral}/index.mjs.map +0 -0
  168. /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
  169. /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
@@ -4,33 +4,33 @@
4
4
 
5
5
  import { RegistryContext } from '@effect-atom/atom-react';
6
6
  import { type Meta, type StoryObj } from '@storybook/react-vite';
7
- import React, { useCallback, useContext, useEffect } from 'react';
7
+ import React, { useCallback, useContext, useEffect, useMemo } from 'react';
8
8
 
9
- import { Filter, Ref } from '@dxos/client/echo';
10
- import { JsonSchema, Obj, Query } from '@dxos/echo';
11
- import { Collection, View } from '@dxos/echo';
12
- import { faker } from '@dxos/random';
9
+ import { Collection, Filter, JsonSchema, Obj, Query, Ref, Type, View } from '@dxos/echo';
10
+ import { random } from '@dxos/random';
13
11
  import { useQuery } from '@dxos/react-client/echo';
14
12
  import { useClientStory, withClientProvider } from '@dxos/react-client/testing';
15
- import { withLayout, withTheme } from '@dxos/react-ui/testing';
16
13
  import { Form, omitId } from '@dxos/react-ui-form';
17
14
  import { withMosaic } from '@dxos/react-ui-mosaic/testing';
15
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
18
16
  import { ViewModel } from '@dxos/schema';
19
17
  import { createObjectFactory } from '@dxos/schema/testing';
20
18
  import { withRegistry } from '@dxos/storybook-utils';
21
19
  import { Person, Pipeline } from '@dxos/types';
22
20
 
23
- import { usePipelineBoardModel } from '../hooks';
24
- import { translations } from '../translations';
21
+ import { usePipelineBoardModel } from '#hooks';
22
+ import { translations } from '#translations';
25
23
 
26
24
  import { type ItemProps, PipelineComponent } from './PipelineComponent';
27
25
 
28
26
  const StorybookProjectItem = ({ item, projectionModel }: ItemProps) => {
27
+ const personSchema = useMemo(() => omitId(Type.getSchema(Person.Person)), []);
28
+
29
29
  if (Obj.instanceOf(Person.Person, item)) {
30
30
  const contact = item as Obj.OfShape<Person.Person>;
31
31
 
32
32
  return (
33
- <Form.Root schema={omitId(Person.Person)} projection={projectionModel} values={contact} autoSave>
33
+ <Form.Root schema={personSchema} projection={projectionModel} values={contact} autoSave>
34
34
  <Form.Viewport>
35
35
  <Form.Content>
36
36
  <Form.FieldSet />
@@ -62,10 +62,10 @@ const DefaultStory = () => {
62
62
  fields: ['fullName'],
63
63
  });
64
64
 
65
- Obj.change(pipeline, (p) => {
66
- p.columns.push({
65
+ Obj.update(pipeline, (pipeline) => {
66
+ pipeline.columns.push({
67
67
  name: 'New Contacts',
68
- view: Ref.make(view) as (typeof p.columns)[number]['view'],
68
+ view: Ref.make(view) as (typeof pipeline.columns)[number]['view'],
69
69
  order: [],
70
70
  });
71
71
  });
@@ -106,10 +106,10 @@ const MutationsStory = () => {
106
106
  fields: ['fullName'],
107
107
  });
108
108
 
109
- Obj.change(pipeline, (p) => {
110
- p.columns.push({
109
+ Obj.update(pipeline, (pipeline) => {
110
+ pipeline.columns.push({
111
111
  name: 'New Contacts',
112
- view: Ref.make(view) as (typeof p.columns)[number]['view'],
112
+ view: Ref.make(view) as (typeof pipeline.columns)[number]['view'],
113
113
  order: [],
114
114
  });
115
115
  });
@@ -123,19 +123,19 @@ const MutationsStory = () => {
123
123
  }
124
124
 
125
125
  const interval = setInterval(() => {
126
- const factory = createObjectFactory(space.db, faker as any);
126
+ const factory = createObjectFactory(space.db, random as any);
127
127
  const p = Math.random();
128
128
 
129
129
  if (p < 0.4) {
130
130
  // Append to the name
131
- const contactToAdjust = faker.helpers.arrayElement(contacts);
132
- Obj.change(contactToAdjust, (c) => {
133
- c.fullName = (c.fullName ?? '') + ' X';
131
+ const contactToAdjust = random.helpers.arrayElement(contacts);
132
+ Obj.update(contactToAdjust, (contactToAdjust) => {
133
+ contactToAdjust.fullName = (contactToAdjust.fullName ?? '') + ' X';
134
134
  });
135
135
  return;
136
136
  } else if (p < 0.7 && contacts.length > 1) {
137
137
  // Remove a contact (30% chance, but only if we have more than 1)
138
- const contactToRemove = faker.helpers.arrayElement(contacts);
138
+ const contactToRemove = random.helpers.arrayElement(contacts);
139
139
  space.db.remove(contactToRemove);
140
140
  } else {
141
141
  // Add a new contact (30% chance)
@@ -193,7 +193,7 @@ const meta = {
193
193
  );
194
194
 
195
195
  // Generate random contacts.
196
- const factory = createObjectFactory(space.db, faker as any);
196
+ const factory = createObjectFactory(space.db, random as any);
197
197
  await factory([{ type: Person.Person, count: 12 }]);
198
198
  },
199
199
  }),
@@ -4,15 +4,17 @@
4
4
 
5
5
  import { useAtomValue } from '@effect-atom/atom-react';
6
6
  import { createContext } from '@radix-ui/react-context';
7
+ import { Slot } from '@radix-ui/react-slot';
7
8
  import React, { type FC, type PropsWithChildren } from 'react';
8
9
 
9
10
  import { Obj } from '@dxos/echo';
10
11
  import { Toolbar, type ToolbarRootProps, useTranslation } from '@dxos/react-ui';
12
+ import { composable, composableProps, slottable } from '@dxos/react-ui';
11
13
  import { Board, type BoardModel, useBoard, useEventHandlerAdapter } from '@dxos/react-ui-mosaic';
12
14
  import { type ProjectionModel } from '@dxos/schema';
13
15
  import { type Pipeline } from '@dxos/types';
14
16
 
15
- import { meta } from '../meta';
17
+ import { meta } from '#meta';
16
18
 
17
19
  import { PipelineColumn } from './PipelineColumn';
18
20
 
@@ -59,10 +61,17 @@ type PipelineContentProps = PropsWithChildren<{
59
61
  model: BoardModel<Pipeline.Column, Obj.Unknown>;
60
62
  }>;
61
63
 
62
- const PipelineContent = ({ model, children, ...props }: PipelineContentProps) => (
63
- <Board.Root {...props} model={model}>
64
- {children}
65
- </Board.Root>
64
+ const PipelineContent = slottable<HTMLDivElement, PipelineContentProps>(
65
+ ({ asChild, model, children, ...props }, forwardedRef) => {
66
+ const Comp = asChild ? Slot : 'div';
67
+ return (
68
+ <Board.Root model={model}>
69
+ <Comp {...composableProps(props)} ref={forwardedRef}>
70
+ {children}
71
+ </Comp>
72
+ </Board.Root>
73
+ );
74
+ },
66
75
  );
67
76
 
68
77
  PipelineContent.displayName = PIPELINE_CONTENT_NAME;
@@ -77,7 +86,7 @@ type PipelineColumnsProps = {
77
86
  pipeline: Pipeline.Pipeline;
78
87
  };
79
88
 
80
- const PipelineColumns = ({ pipeline }: PipelineColumnsProps) => {
89
+ const PipelineColumns = composable<HTMLDivElement, PipelineColumnsProps>(({ pipeline, ...props }) => {
81
90
  const { model } = useBoard(PIPELINE_COLUMNS_NAME);
82
91
  const columns = useAtomValue(model.columns);
83
92
  const eventHandler = useEventHandlerAdapter<Pipeline.Column, Obj.Unknown>({
@@ -88,11 +97,11 @@ const PipelineColumns = ({ pipeline }: PipelineColumnsProps) => {
88
97
  get: (data) => data as unknown as Obj.Unknown,
89
98
  make: (object) => object as unknown as Pipeline.Column,
90
99
  canDrop: ({ source }) => model.isColumn(source.data),
91
- onChange: (mutate) => Obj.change(pipeline, (p) => mutate(p.columns)),
100
+ onChange: (mutate) => Obj.update(pipeline, (pipeline) => mutate(pipeline.columns)),
92
101
  });
93
102
 
94
- return <Board.Content id='pipeline' eventHandler={eventHandler} Tile={PipelineColumn} />;
95
- };
103
+ return <Board.Content {...props} id='pipeline' eventHandler={eventHandler} Tile={PipelineColumn} />;
104
+ });
96
105
 
97
106
  PipelineColumns.displayName = PIPELINE_COLUMNS_NAME;
98
107
 
@@ -102,16 +111,16 @@ PipelineColumns.displayName = PIPELINE_COLUMNS_NAME;
102
111
 
103
112
  const PIPELINE_TOOLBAR_NAME = 'Pipeline.Toolbar';
104
113
 
105
- export const PipelineToolbar = (props: ToolbarRootProps) => {
114
+ export const PipelineToolbar = composable<HTMLDivElement, ToolbarRootProps>(({ children, ...props }, forwardedRef) => {
106
115
  const { t } = useTranslation(meta.id);
107
116
  const { onAddColumn } = usePipeline(PIPELINE_TOOLBAR_NAME);
108
117
 
109
118
  return (
110
- <Toolbar.Root {...props}>
111
- <Toolbar.IconButton icon='ph--plus--regular' iconOnly label={t('add column label')} onClick={onAddColumn} />
119
+ <Toolbar.Root {...composableProps(props)} ref={forwardedRef}>
120
+ <Toolbar.IconButton icon='ph--plus--regular' iconOnly label={t('add-column.label')} onClick={onAddColumn} />
112
121
  </Toolbar.Root>
113
122
  );
114
- };
123
+ });
115
124
 
116
125
  PipelineToolbar.displayName = PIPELINE_TOOLBAR_NAME;
117
126
 
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './PipelineColumn';
6
+ export * from './PipelineComponent';
@@ -2,5 +2,4 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './PipelineColumn';
6
5
  export * from './PipelineComponent';
@@ -8,28 +8,27 @@ import * as Layer from 'effect/Layer';
8
8
  import React from 'react';
9
9
 
10
10
  import { withPluginManager } from '@dxos/app-framework/testing';
11
- import { Filter, Ref } from '@dxos/client/echo';
12
- import { Database, Feed, JsonSchema, Obj, Query, Tag } from '@dxos/echo';
13
- import { Collection, View } from '@dxos/echo';
11
+ import { Collection, Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Scope, Tag, View } from '@dxos/echo';
14
12
  import { createFeedServiceLayer } from '@dxos/echo-db';
15
- import { ClientPlugin } from '@dxos/plugin-client';
16
- import { InboxPlugin } from '@dxos/plugin-inbox';
17
- import { PreviewPlugin } from '@dxos/plugin-preview';
13
+ import { ClientPlugin } from '@dxos/plugin-client/plugin';
14
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
15
+ import { InboxPlugin } from '@dxos/plugin-inbox/plugin';
16
+ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
18
17
  import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
19
- import { faker } from '@dxos/random';
18
+ import { random } from '@dxos/random';
20
19
  import { useDatabase, useQuery } from '@dxos/react-client/echo';
21
- import { withLayout, withTheme } from '@dxos/react-ui/testing';
22
- import { translations as stackTranslations } from '@dxos/react-ui-stack';
20
+ import { translations as stackTranslations } from '@dxos/react-ui-stack/translations';
21
+ import { withLayout } from '@dxos/react-ui/testing';
23
22
  import { ViewModel } from '@dxos/schema';
24
23
  import { createObjectFactory } from '@dxos/schema/testing';
25
24
  import { Message, Organization, Person, Pipeline, Task } from '@dxos/types';
26
25
 
27
- import { translations } from '../../translations';
28
- import PipelineObjectSettings from '../PipelineObjectSettings';
26
+ import { translations } from '#translations';
29
27
 
30
- import { PipelineContainer } from './PipelineContainer';
28
+ import PipelineProperties from '../PipelineProperties';
29
+ import { PipelineArticle } from './PipelineArticle';
31
30
 
32
- faker.seed(0);
31
+ random.seed(0);
33
32
 
34
33
  const DefaultStory = () => {
35
34
  const db = useDatabase();
@@ -42,17 +41,16 @@ const DefaultStory = () => {
42
41
 
43
42
  return (
44
43
  <div className='grow grid grid-cols-[1fr_350px] overflow-hidden h-full w-full'>
45
- <PipelineContainer role='article' subject={pipeline} />
46
- <PipelineObjectSettings pipeline={pipeline} classNames='border-s border-separator' />
44
+ <PipelineArticle role='article' subject={pipeline} attendableId='test' />
45
+ <PipelineProperties pipeline={pipeline} classNames='border-s border-separator' />
47
46
  </div>
48
47
  );
49
48
  };
50
49
 
51
50
  const meta = {
52
- title: 'plugins/plugin-pipeline/containers/PipelineContainer',
51
+ title: 'plugins/plugin-pipeline/containers/PipelineArticle',
53
52
  render: DefaultStory,
54
53
  decorators: [
55
- withTheme(),
56
54
  withLayout({ layout: 'fullscreen' }),
57
55
  withPluginManager({
58
56
  plugins: [
@@ -71,14 +69,11 @@ const meta = {
71
69
  Message.Message,
72
70
  ],
73
71
  onClientInitialized: Effect.fnUntraced(function* ({ client }) {
74
- yield* Effect.promise(() => client.halo.createIdentity());
75
- yield* Effect.promise(() => client.spaces.waitUntilReady());
76
- const space = client.spaces.default;
77
- yield* Effect.promise(() => space.waitUntilReady());
72
+ const { personalSpace } = yield* initializeIdentity(client);
78
73
 
79
74
  yield* Effect.gen(function* () {
80
75
  const tag = yield* Database.add(Tag.make({ label: 'important', hue: 'green' }));
81
- const tagDxn = Obj.getDXN(tag).toString();
76
+ const tagUri = Obj.getURI(tag);
82
77
 
83
78
  // Create a view for Contacts.
84
79
  const personView = ViewModel.make({
@@ -88,13 +83,13 @@ const meta = {
88
83
 
89
84
  // Create a view for Organizations.
90
85
  const organizationView = ViewModel.make({
91
- query: Query.select(Filter.type(Organization.Organization)).select(Filter.tag(tagDxn)),
86
+ query: Query.select(Filter.type(Organization.Organization)).select(Filter.tag(tagUri)),
92
87
  jsonSchema: JsonSchema.toJsonSchema(Organization.Organization),
93
88
  });
94
89
 
95
90
  // Create a view for Tasks.
96
91
  const taskView = ViewModel.make({
97
- query: Query.select(Filter.type(Task.Task)).select(Filter.tag(tagDxn)),
92
+ query: Query.select(Filter.type(Task.Task)).select(Filter.tag(tagUri)),
98
93
  jsonSchema: JsonSchema.toJsonSchema(Task.Task),
99
94
  });
100
95
 
@@ -108,18 +103,15 @@ const meta = {
108
103
  const messageFeed = yield* Database.add(Feed.make({ name: 'Messages' }));
109
104
  const messages = Array.from({ length: 20 }).map(() =>
110
105
  Obj.make(Message.Message, {
111
- created: faker.date.recent().toISOString(),
106
+ created: random.date.recent().toISOString(),
112
107
  sender: { role: 'user' },
113
- blocks: [{ _tag: 'text' as const, text: faker.lorem.sentences(2) }],
108
+ blocks: [{ _tag: 'text' as const, text: random.lorem.sentences(2) }],
114
109
  }),
115
110
  );
116
111
  yield* Feed.append(messageFeed, messages);
117
112
 
118
- const messageQueueDxn = Feed.getQueueDxn(messageFeed)!.toString();
119
113
  const messageView = ViewModel.make({
120
- query: Query.select(Filter.type(Message.Message)).from({
121
- queues: [messageQueueDxn],
122
- }),
114
+ query: Query.select(Filter.type(Message.Message)).from(Scope.feed(Obj.getURI(messageFeed))),
123
115
  jsonSchema: JsonSchema.toJsonSchema(Message.Message),
124
116
  });
125
117
 
@@ -127,9 +119,9 @@ const meta = {
127
119
  const taskFeed = yield* Database.add(Feed.make({ name: 'Tasks' }));
128
120
  const feedTasks = Array.from({ length: 10 }).map(() =>
129
121
  Obj.make(Task.Task, {
130
- title: faker.lorem.sentence(),
131
- status: faker.helpers.arrayElement(['todo', 'in-progress', 'done']) as any,
132
- priority: faker.helpers.arrayElement(['low', 'medium', 'high']) as any,
122
+ title: random.lorem.sentence(),
123
+ status: random.helpers.arrayElement(['todo', 'in-progress', 'done']) as any,
124
+ priority: random.helpers.arrayElement(['low', 'medium', 'high']) as any,
133
125
  }),
134
126
  );
135
127
  yield* Feed.append(taskFeed, feedTasks);
@@ -171,12 +163,12 @@ const meta = {
171
163
  yield* Database.add(
172
164
  Obj.make(Organization.Organization, {
173
165
  [Obj.Meta]: {
174
- tags: faker.datatype.boolean() ? [tagDxn] : [],
166
+ tags: random.datatype.boolean() ? [tagUri] : [],
175
167
  },
176
- name: faker.company.name(),
177
- website: faker.internet.url(),
178
- description: faker.lorem.paragraph(),
179
- image: faker.image.url(),
168
+ name: random.company.name(),
169
+ website: random.internet.url(),
170
+ description: random.lorem.paragraph(),
171
+ image: random.image.url(),
180
172
  }),
181
173
  );
182
174
  }
@@ -186,29 +178,33 @@ const meta = {
186
178
  yield* Database.add(
187
179
  Obj.make(Task.Task, {
188
180
  [Obj.Meta]: {
189
- tags: faker.datatype.boolean() ? [tagDxn] : [],
181
+ tags: random.datatype.boolean() ? [tagUri] : [],
190
182
  },
191
- title: faker.lorem.sentence(),
192
- status: faker.helpers.arrayElement(['todo', 'in-progress', 'done']) as any,
193
- priority: faker.helpers.arrayElement(['low', 'medium', 'high']) as any,
183
+ title: random.lorem.sentence(),
184
+ status: random.helpers.arrayElement(['todo', 'in-progress', 'done']) as any,
185
+ priority: random.helpers.arrayElement(['low', 'medium', 'high']) as any,
194
186
  }),
195
187
  );
196
188
  }
197
189
 
198
190
  // Generate sample Contacts.
199
- const factory = createObjectFactory(space.db, faker as any);
191
+ const factory = createObjectFactory(personalSpace.db, random as any);
200
192
  yield* Effect.promise(() => factory([{ type: Person.Person, count: 12 }]));
201
193
 
202
194
  // Generate sample Projects.
203
195
  for (const _ of Array.from({ length: 20 })) {
204
196
  yield* Database.add(
205
197
  Pipeline.make({
206
- name: faker.commerce.productName(),
207
- description: faker.lorem.sentence(),
198
+ name: random.commerce.productName(),
199
+ description: random.lorem.sentence(),
208
200
  }),
209
201
  );
210
202
  }
211
- }).pipe(Effect.provide(Layer.merge(Database.layer(space.db), createFeedServiceLayer(space.queues))));
203
+ }).pipe(
204
+ Effect.provide(
205
+ Layer.merge(Database.layer(personalSpace.db), createFeedServiceLayer(personalSpace.queues)),
206
+ ),
207
+ );
212
208
  }),
213
209
  }),
214
210
  InboxPlugin(),
@@ -220,7 +216,7 @@ const meta = {
220
216
  layout: 'fullscreen',
221
217
  translations: [...translations, ...stackTranslations],
222
218
  },
223
- } satisfies Meta<typeof PipelineContainer>;
219
+ } satisfies Meta<typeof PipelineArticle>;
224
220
 
225
221
  export default meta;
226
222
 
@@ -5,52 +5,49 @@
5
5
  import React, { useCallback, useEffect } from 'react';
6
6
 
7
7
  import { Capabilities } from '@dxos/app-framework';
8
- import { useCapability } from '@dxos/app-framework/ui';
9
- import { useOperationInvoker } from '@dxos/app-framework/ui';
10
- import { Surface } from '@dxos/app-framework/ui';
8
+ import { Surface, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';
9
+ import { LayoutOperation } from '@dxos/app-toolkit';
11
10
  import {
11
+ AppSurface,
12
12
  OBJECT_ACTIONS_CONTRIBUTION_ID,
13
13
  OBJECT_ACTIONS_CONTRIBUTION_PRIORITY,
14
- type SurfaceComponentProps,
15
14
  useObjectMenuItems,
16
15
  } from '@dxos/app-toolkit/ui';
17
- import { Obj } from '@dxos/echo';
18
- import { ATTENDABLE_PATH_SEPARATOR, DeckOperation } from '@dxos/plugin-deck/types';
19
16
  import { Panel } from '@dxos/react-ui';
17
+ import { linkedSegment } from '@dxos/react-ui-attention';
20
18
  import { useAttention } from '@dxos/react-ui-attention';
21
19
  import { useMenu } from '@dxos/react-ui-menu';
22
20
  import { type Pipeline } from '@dxos/types';
23
21
 
24
- import { type ItemProps, PipelineComponent } from '../../components';
25
- import { usePipelineBoardModel } from '../../hooks';
22
+ import { type ItemProps, PipelineComponent } from '#components';
23
+ import { usePipelineBoardModel } from '#hooks';
26
24
 
27
25
  const PIPELINE_ITEM = 'PipelineItem';
28
26
 
29
- export type PipelineContainerProps = SurfaceComponentProps<Pipeline.Pipeline>;
27
+ export type PipelineArticleProps = AppSurface.ObjectArticleProps<Pipeline.Pipeline>;
30
28
 
31
- export const PipelineContainer = ({ role, subject: pipeline }: PipelineContainerProps) => {
29
+ export const PipelineArticle = ({ role, subject: pipeline, attendableId }: PipelineArticleProps) => {
32
30
  const registry = useCapability(Capabilities.AtomRegistry);
33
31
  const model = usePipelineBoardModel(pipeline, registry);
34
32
  const { invokePromise } = useOperationInvoker();
35
- const attendableId = Obj.getDXN(pipeline).toString();
36
33
  const { hasAttention } = useAttention(attendableId);
37
34
 
38
35
  const handleColumnAdd = useCallback(
39
36
  () =>
40
- invokePromise(DeckOperation.ChangeCompanion, {
41
- companion: `${attendableId}${ATTENDABLE_PATH_SEPARATOR}settings`,
37
+ invokePromise(LayoutOperation.UpdateCompanion, {
38
+ subject: linkedSegment('settings'),
42
39
  }),
43
- [invokePromise, attendableId],
40
+ [invokePromise],
44
41
  );
45
42
 
46
43
  return (
47
44
  <PipelineComponent.Root Item={PipelineItem} onAddColumn={handleColumnAdd}>
48
- <Panel.Root role={role} className='dx-article'>
45
+ <Panel.Root role={role}>
49
46
  <Panel.Toolbar asChild>
50
47
  <PipelineComponent.Toolbar disabled={!hasAttention} />
51
48
  </Panel.Toolbar>
52
49
  <Panel.Content asChild>
53
- <PipelineComponent.Content model={model}>
50
+ <PipelineComponent.Content asChild model={model}>
54
51
  <PipelineComponent.Columns pipeline={pipeline} />
55
52
  </PipelineComponent.Content>
56
53
  </Panel.Content>
@@ -76,7 +73,7 @@ const PipelineItem = ({ item, projectionModel }: ItemProps) => {
76
73
 
77
74
  return (
78
75
  <Surface.Surface
79
- role='card--content'
76
+ type={AppSurface.Card}
80
77
  data={{
81
78
  subject: item,
82
79
  projection: projectionModel,
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export { PipelineArticle as default } from './PipelineArticle';