@dxos/plugin-pipeline 0.9.0 → 0.9.1-staging.ee54ba693a

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 (75) hide show
  1. package/dist/lib/neutral/{PipelineArticle-6JIVXMYF.mjs → PipelineArticle-DG4TCEML.mjs} +2 -2
  2. package/dist/lib/neutral/{PipelineArticle-6JIVXMYF.mjs.map → PipelineArticle-DG4TCEML.mjs.map} +2 -2
  3. package/dist/lib/neutral/PipelinePlugin.mjs +4 -6
  4. package/dist/lib/neutral/PipelinePlugin.mjs.map +4 -4
  5. package/dist/lib/neutral/PipelinePlugin.node.mjs +2 -4
  6. package/dist/lib/neutral/PipelinePlugin.node.mjs.map +3 -3
  7. package/dist/lib/neutral/{PipelineProperties-JZQYG2CN.mjs → PipelineProperties-LDD4P4RA.mjs} +28 -55
  8. package/dist/lib/neutral/PipelineProperties-LDD4P4RA.mjs.map +7 -0
  9. package/dist/lib/neutral/capabilities/index.mjs +2 -4
  10. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  11. package/dist/lib/neutral/chunk-RHSONY5F.mjs +44 -0
  12. package/dist/lib/neutral/chunk-RHSONY5F.mjs.map +7 -0
  13. package/dist/lib/neutral/components/index.mjs +11 -9
  14. package/dist/lib/neutral/components/index.mjs.map +3 -3
  15. package/dist/lib/neutral/containers/index.mjs +2 -2
  16. package/dist/lib/neutral/{create-object-6Z4MMGX4.mjs → create-object-B4FHAFWY.mjs} +1 -2
  17. package/dist/lib/neutral/{create-object-6Z4MMGX4.mjs.map → create-object-B4FHAFWY.mjs.map} +3 -3
  18. package/dist/lib/neutral/index.mjs +1 -1
  19. package/dist/lib/neutral/meta.json +1 -1
  20. package/dist/lib/neutral/meta.mjs +1 -1
  21. package/dist/lib/neutral/plugin.mjs +1 -1
  22. package/dist/lib/neutral/{react-surface-QG7QSZSS.mjs → react-surface-G6WO2XOI.mjs} +2 -21
  23. package/dist/lib/neutral/react-surface-G6WO2XOI.mjs.map +7 -0
  24. package/dist/lib/neutral/translations.mjs +4 -7
  25. package/dist/lib/neutral/translations.mjs.map +3 -3
  26. package/dist/types/dx.config.d.ts +28 -0
  27. package/dist/types/dx.config.d.ts.map +1 -0
  28. package/dist/types/src/PipelinePlugin.d.ts.map +1 -1
  29. package/dist/types/src/PipelinePlugin.node.d.ts.map +1 -1
  30. package/dist/types/src/capabilities/create-object.d.ts +1 -7
  31. package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
  32. package/dist/types/src/capabilities/index.d.ts +2 -8
  33. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  34. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  35. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  36. package/dist/types/src/components/PipelineComponent/PipelineComponent.d.ts +1 -1
  37. package/dist/types/src/components/PipelineComponent/PipelineComponent.d.ts.map +1 -1
  38. package/dist/types/src/components/PipelineComponent/PipelineComponent.stories.d.ts +6 -12
  39. package/dist/types/src/components/PipelineComponent/PipelineComponent.stories.d.ts.map +1 -1
  40. package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts +8 -27
  41. package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts.map +1 -1
  42. package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts +3 -5
  43. package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts.map +1 -1
  44. package/dist/types/src/containers/PipelineProperties/PipelineProperties.stories.d.ts +130 -0
  45. package/dist/types/src/containers/PipelineProperties/PipelineProperties.stories.d.ts.map +1 -0
  46. package/dist/types/src/meta.d.ts +32 -2
  47. package/dist/types/src/meta.d.ts.map +1 -1
  48. package/dist/types/src/translations.d.ts +6 -12
  49. package/dist/types/src/translations.d.ts.map +1 -1
  50. package/dist/types/tsconfig.tsbuildinfo +1 -1
  51. package/dx.config.ts +32 -0
  52. package/package.json +45 -44
  53. package/src/PipelinePlugin.node.ts +1 -2
  54. package/src/PipelinePlugin.test.ts +3 -5
  55. package/src/PipelinePlugin.tsx +2 -3
  56. package/src/capabilities/create-object.ts +0 -1
  57. package/src/capabilities/index.ts +0 -1
  58. package/src/capabilities/react-surface.tsx +1 -22
  59. package/src/components/PipelineComponent/PipelineColumn.tsx +10 -13
  60. package/src/components/PipelineComponent/PipelineComponent.tsx +2 -2
  61. package/src/containers/PipelineArticle/PipelineArticle.stories.tsx +5 -10
  62. package/src/containers/PipelineArticle/PipelineArticle.tsx +1 -1
  63. package/src/containers/PipelineProperties/PipelineProperties.stories.tsx +145 -0
  64. package/src/containers/PipelineProperties/PipelineProperties.tsx +65 -89
  65. package/src/meta.ts +2 -25
  66. package/src/translations.ts +8 -10
  67. package/dist/lib/neutral/PipelineProperties-JZQYG2CN.mjs.map +0 -7
  68. package/dist/lib/neutral/app-graph-builder-ZLGRWRJU.mjs +0 -44
  69. package/dist/lib/neutral/app-graph-builder-ZLGRWRJU.mjs.map +0 -7
  70. package/dist/lib/neutral/chunk-CYXDAAKN.mjs +0 -35
  71. package/dist/lib/neutral/chunk-CYXDAAKN.mjs.map +0 -7
  72. package/dist/lib/neutral/react-surface-QG7QSZSS.mjs.map +0 -7
  73. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -6
  74. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  75. package/src/capabilities/app-graph-builder.ts +0 -40
package/dx.config.ts ADDED
@@ -0,0 +1,32 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Config2 } from '@dxos/app-framework/config';
6
+ import { trim } from '@dxos/util';
7
+
8
+ export default Config2.make({
9
+ plugin: {
10
+ key: 'org.dxos.plugin.pipeline',
11
+ name: 'Pipelines',
12
+ author: 'DXOS',
13
+ description: trim`
14
+ A multi-column Kanban-style pipeline plugin for DXOS Composer.
15
+ Each Pipeline holds an ordered set of Columns; each Column is backed by a ViewModel whose query
16
+ can select any ECHO object type — messages, contacts, documents, or custom types — from the active space.
17
+
18
+ Columns are fully configurable through the Settings companion panel, where users can add, rename,
19
+ reorder, and delete columns and edit the underlying query and projection for each column.
20
+ Objects can be dragged between columns and the full pipeline state, including column order and
21
+ per-column item order, persists collaboratively via ECHO.
22
+
23
+ A built-in Research template scaffolds a four-column pipeline wired to the Mailbox, Contacts,
24
+ Organizations, and Notes objects in the space, providing an out-of-the-box CRM-style workflow.
25
+ Pipeline articles also expose Invocations and Automation companion tabs for AI-driven automation.
26
+ `,
27
+ source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline',
28
+ icon: { key: 'ph--path--regular', hue: 'purple' },
29
+ spec: 'PLUGIN.mdl',
30
+ tags: ['labs'],
31
+ },
32
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-pipeline",
3
- "version": "0.9.0",
3
+ "version": "0.9.1-staging.ee54ba693a",
4
4
  "description": "Pipeline plugin for Composer",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -81,6 +81,7 @@
81
81
  "types": "dist/types/src/index.d.ts",
82
82
  "files": [
83
83
  "dist",
84
+ "dx.config.ts",
84
85
  "src",
85
86
  "PLUGIN.mdl"
86
87
  ],
@@ -88,57 +89,57 @@
88
89
  "@radix-ui/react-compose-refs": "1.1.1",
89
90
  "@radix-ui/react-context": "1.1.1",
90
91
  "@radix-ui/react-slot": "1.1.2",
91
- "effect": "3.21.3",
92
- "@dxos/app-toolkit": "0.9.0",
93
- "@dxos/compute": "0.9.0",
94
- "@dxos/echo": "0.9.0",
95
- "@dxos/echo-query": "0.9.0",
96
- "@dxos/devtools": "0.9.0",
97
- "@dxos/app-framework": "0.9.0",
98
- "@dxos/effect": "0.9.0",
99
- "@dxos/keys": "0.9.0",
100
- "@dxos/log": "0.9.0",
101
- "@dxos/plugin-client": "0.9.0",
102
- "@dxos/plugin-graph": "0.9.0",
103
- "@dxos/plugin-markdown": "0.9.0",
104
- "@dxos/plugin-inbox": "0.9.0",
105
- "@dxos/react-client": "0.9.0",
106
- "@dxos/react-ui-attention": "0.9.0",
107
- "@dxos/react-ui-form": "0.9.0",
108
- "@dxos/react-ui-list": "0.9.0",
109
- "@dxos/plugin-space": "0.9.0",
110
- "@dxos/react-ui-menu": "0.9.0",
111
- "@dxos/react-ui-mosaic": "0.9.0",
112
- "@dxos/schema": "0.9.0",
113
- "@dxos/react-ui-stack": "0.9.0",
114
- "@dxos/types": "0.9.0",
115
- "@dxos/util": "0.9.0"
92
+ "effect": "3.21.4",
93
+ "@dxos/app-framework": "0.9.1-staging.ee54ba693a",
94
+ "@dxos/app-toolkit": "0.9.1-staging.ee54ba693a",
95
+ "@dxos/client": "0.9.1-staging.ee54ba693a",
96
+ "@dxos/compute": "0.9.1-staging.ee54ba693a",
97
+ "@dxos/devtools": "0.9.1-staging.ee54ba693a",
98
+ "@dxos/echo-query": "0.9.1-staging.ee54ba693a",
99
+ "@dxos/effect": "0.9.1-staging.ee54ba693a",
100
+ "@dxos/log": "0.9.1-staging.ee54ba693a",
101
+ "@dxos/plugin-graph": "0.9.1-staging.ee54ba693a",
102
+ "@dxos/keys": "0.9.1-staging.ee54ba693a",
103
+ "@dxos/plugin-client": "0.9.1-staging.ee54ba693a",
104
+ "@dxos/plugin-inbox": "0.9.1-staging.ee54ba693a",
105
+ "@dxos/plugin-markdown": "0.9.1-staging.ee54ba693a",
106
+ "@dxos/plugin-space": "0.9.1-staging.ee54ba693a",
107
+ "@dxos/react-ui-attention": "0.9.1-staging.ee54ba693a",
108
+ "@dxos/react-client": "0.9.1-staging.ee54ba693a",
109
+ "@dxos/react-ui-list": "0.9.1-staging.ee54ba693a",
110
+ "@dxos/react-ui-menu": "0.9.1-staging.ee54ba693a",
111
+ "@dxos/react-ui-form": "0.9.1-staging.ee54ba693a",
112
+ "@dxos/react-ui-mosaic": "0.9.1-staging.ee54ba693a",
113
+ "@dxos/echo": "0.9.1-staging.ee54ba693a",
114
+ "@dxos/schema": "0.9.1-staging.ee54ba693a",
115
+ "@dxos/types": "0.9.1-staging.ee54ba693a",
116
+ "@dxos/util": "0.9.1-staging.ee54ba693a"
116
117
  },
117
118
  "devDependencies": {
118
119
  "@effect-atom/atom-react": "^0.5.0",
119
- "@types/react": "~19.2.7",
120
+ "@types/react": "~19.2.17",
120
121
  "@types/react-dom": "~19.2.3",
121
- "react": "~19.2.3",
122
- "react-dom": "~19.2.3",
122
+ "react": "~19.2.7",
123
+ "react-dom": "~19.2.7",
123
124
  "vite": "^8.0.16",
124
- "@dxos/plugin-inbox": "0.9.0",
125
- "@dxos/plugin-preview": "0.9.0",
126
- "@dxos/plugin-attention": "0.9.0",
127
- "@dxos/plugin-theme": "0.9.0",
128
- "@dxos/echo-client": "0.9.0",
129
- "@dxos/random": "0.9.0",
130
- "@dxos/plugin-testing": "0.9.0",
131
- "@dxos/react-ui": "0.9.0",
132
- "@dxos/ui-theme": "0.9.0",
133
- "@dxos/storybook-utils": "0.9.0"
125
+ "@dxos/echo-client": "0.9.1-staging.ee54ba693a",
126
+ "@dxos/plugin-attention": "0.9.1-staging.ee54ba693a",
127
+ "@dxos/plugin-preview": "0.9.1-staging.ee54ba693a",
128
+ "@dxos/plugin-testing": "0.9.1-staging.ee54ba693a",
129
+ "@dxos/plugin-inbox": "0.9.1-staging.ee54ba693a",
130
+ "@dxos/plugin-theme": "0.9.1-staging.ee54ba693a",
131
+ "@dxos/storybook-utils": "0.9.1-staging.ee54ba693a",
132
+ "@dxos/random": "0.9.1-staging.ee54ba693a",
133
+ "@dxos/react-ui": "0.9.1-staging.ee54ba693a",
134
+ "@dxos/ui-theme": "0.9.1-staging.ee54ba693a"
134
135
  },
135
136
  "peerDependencies": {
136
137
  "@effect-atom/atom-react": "^0.5.0",
137
- "effect": "3.21.3",
138
- "react": "~19.2.3",
139
- "react-dom": "~19.2.3",
140
- "@dxos/react-ui": "0.9.0",
141
- "@dxos/ui-theme": "0.9.0"
138
+ "effect": "3.21.4",
139
+ "react": "~19.2.7",
140
+ "react-dom": "~19.2.7",
141
+ "@dxos/react-ui": "0.9.1-staging.ee54ba693a",
142
+ "@dxos/ui-theme": "0.9.1-staging.ee54ba693a"
142
143
  },
143
144
  "publishConfig": {
144
145
  "access": "public"
@@ -6,11 +6,10 @@ import { Plugin } from '@dxos/app-framework';
6
6
  import { AppPlugin } from '@dxos/app-toolkit';
7
7
  import { Pipeline } from '@dxos/types';
8
8
 
9
- import { AppGraphBuilder, CreateObject } from '#capabilities';
9
+ import { CreateObject } from '#capabilities';
10
10
  import { meta } from '#meta';
11
11
 
12
12
  export const PipelinePlugin = Plugin.define(meta).pipe(
13
- AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),
14
13
  AppPlugin.addCreateObjectModule({ activate: CreateObject }),
15
14
  AppPlugin.addSchemaModule({ schema: [Pipeline.Pipeline] }),
16
15
  Plugin.make,
@@ -11,7 +11,7 @@ import { PipelinePlugin } from '#plugin';
11
11
 
12
12
  import { meta } from './meta';
13
13
 
14
- const moduleId = (name: string) => `${meta.id}.module.${name}`;
14
+ const moduleId = (name: string) => `${meta.profile.key}.module.${name}`;
15
15
 
16
16
  describe('PipelinePlugin', () => {
17
17
  test('modules activate on the expected events', async ({ expect }) => {
@@ -19,9 +19,7 @@ describe('PipelinePlugin', () => {
19
19
  plugins: [ClientPlugin({}), PipelinePlugin()],
20
20
  });
21
21
 
22
- // After autoStart: AppGraphBuilder, CreateObject, schema all auto-cascade.
23
- expect(harness.manager.getActive()).toEqual(
24
- expect.arrayContaining([moduleId('AppGraphBuilder'), moduleId('CreateObject'), moduleId('schema')]),
25
- );
22
+ // After autoStart: CreateObject and schema auto-cascade.
23
+ expect(harness.manager.getActive()).toEqual(expect.arrayContaining([moduleId('CreateObject'), moduleId('schema')]));
26
24
  });
27
25
  });
@@ -6,7 +6,7 @@ import { Plugin } from '@dxos/app-framework';
6
6
  import { AppPlugin } from '@dxos/app-toolkit';
7
7
  import { Pipeline } from '@dxos/types';
8
8
 
9
- import { AppGraphBuilder, CreateObject, ReactSurface } from '#capabilities';
9
+ import { CreateObject, ReactSurface } from '#capabilities';
10
10
  import { meta } from '#meta';
11
11
  import { translations } from '#translations';
12
12
 
@@ -14,13 +14,12 @@ import { translations } from '#translations';
14
14
  import pluginSpec from '../PLUGIN.mdl?raw';
15
15
 
16
16
  export const PipelinePlugin = Plugin.define(meta).pipe(
17
- AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),
18
17
  AppPlugin.addCreateObjectModule({ activate: CreateObject }),
19
18
  AppPlugin.addSchemaModule({ schema: [Pipeline.Pipeline] }),
20
19
  AppPlugin.addSurfaceModule({ activate: ReactSurface }),
21
20
  AppPlugin.addTranslationsModule({ translations }),
22
21
  AppPlugin.addPluginAssetModule({
23
- asset: { pluginId: meta.id, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },
22
+ asset: { pluginId: meta.profile.key, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },
24
23
  }),
25
24
  Plugin.make,
26
25
  );
@@ -21,7 +21,6 @@ export default Capability.makeModule(
21
21
  return yield* Operation.invoke(SpaceOperation.AddObject, {
22
22
  object,
23
23
  target: options.target,
24
- hidden: true,
25
24
  targetNodeId: options.targetNodeId,
26
25
  });
27
26
  }),
@@ -4,6 +4,5 @@
4
4
 
5
5
  import { Capability } from '@dxos/app-framework';
6
6
 
7
- export const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));
8
7
  export const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));
9
8
  export const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));
@@ -8,9 +8,6 @@ import React from 'react';
8
8
  import { Capabilities, Capability } from '@dxos/app-framework';
9
9
  import { Surface } from '@dxos/app-framework/ui';
10
10
  import { AppSurface } from '@dxos/app-toolkit/ui';
11
- import { InvocationTraceContainer } from '@dxos/devtools';
12
- import { Obj } from '@dxos/echo';
13
- import { Panel } from '@dxos/react-ui';
14
11
  import { Pipeline } from '@dxos/types';
15
12
 
16
13
  import { PipelineArticle, PipelineProperties } from '#containers';
@@ -25,28 +22,10 @@ export default Capability.makeModule(() =>
25
22
  <PipelineArticle role={role} subject={data.subject} attendableId={data.attendableId} />
26
23
  ),
27
24
  }),
28
- Surface.create({
29
- id: 'companion.invocations',
30
- filter: AppSurface.allOf(
31
- AppSurface.literal(AppSurface.Article, 'invocations'),
32
- AppSurface.companion(AppSurface.Article, Pipeline.Pipeline),
33
- ),
34
- component: ({ data, role }) => {
35
- const db = Obj.getDatabase(data.companionTo);
36
- // TODO(wittjosiah): Filter the invocations to those relevant to the project.
37
- return (
38
- <Panel.Root role={role} className='dx-document'>
39
- <Panel.Content asChild>
40
- <InvocationTraceContainer db={db} detailAxis='block' />
41
- </Panel.Content>
42
- </Panel.Root>
43
- );
44
- },
45
- }),
46
25
  Surface.create({
47
26
  id: 'objectProperties',
48
27
  filter: AppSurface.object(AppSurface.ObjectProperties, Pipeline.Pipeline),
49
- component: ({ data }) => <PipelineProperties pipeline={data.subject} />,
28
+ component: ({ data }) => <PipelineProperties subject={data.subject} />,
50
29
  }),
51
30
  ]),
52
31
  ),
@@ -8,8 +8,8 @@ import React, { forwardRef, useMemo, useRef, useState } from 'react';
8
8
  import { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';
9
9
  import { Filter, Obj, Query, Type } from '@dxos/echo';
10
10
  import { useObject } from '@dxos/react-client/echo';
11
- import { Panel, Toolbar, useAsyncEffect, useTranslation } from '@dxos/react-ui';
12
- import { Card } from '@dxos/react-ui';
11
+ import { Panel, useAsyncEffect, useTranslation } from '@dxos/react-ui';
12
+ import { Card, Icon, IconButton } from '@dxos/react-ui';
13
13
  import { Menu } from '@dxos/react-ui-menu';
14
14
  import { Board, Focus, Mosaic, type MosaicTileProps } from '@dxos/react-ui-mosaic';
15
15
  import { ProjectionModel, createEchoChangeCallback } from '@dxos/schema';
@@ -29,7 +29,7 @@ export type PipelineColumnProps = Pick<MosaicTileProps<Pipeline.Column>, 'classN
29
29
 
30
30
  // TODO(wittjosiah): Support item DnD reordering (ordering needs to be stored on the view presentation collection).
31
31
  export const PipelineColumn = ({ data: column, location, classNames, debug }: PipelineColumnProps) => {
32
- const { t } = useTranslation(meta.id);
32
+ const { t } = useTranslation(meta.profile.key);
33
33
  const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);
34
34
  // Subscribe to the view target for reactivity.
35
35
  const [viewSnapshot] = useObject(column.view);
@@ -88,7 +88,7 @@ export const PipelineColumn = ({ data: column, location, classNames, debug }: Pi
88
88
  <Panel.Toolbar asChild>
89
89
  <Board.Column.Header
90
90
  classNames='_opacity-10'
91
- label={column.name || t('untitled-view.title')}
91
+ label={column.name || t('untitled-column.title')}
92
92
  dragHandleRef={setDragHandle}
93
93
  />
94
94
  </Panel.Toolbar>
@@ -125,20 +125,17 @@ const ItemTile = forwardRef<HTMLDivElement, ItemTileProps>(
125
125
  <Focus.Item asChild>
126
126
  <Card.Root classNames={classNames} ref={composedRef}>
127
127
  <Card.Header>
128
- <Card.Icon icon={icon} />
128
+ <Card.Block>
129
+ <Icon icon={icon} />
130
+ </Card.Block>
129
131
  <Card.Title>{Obj.getLabel(data, { fallback: 'typename' })}</Card.Title>
130
132
  {/* TODO(wittjosiah): Reconcile with Card.Menu. */}
131
- <Card.IconBlock>
133
+ <Card.Block end>
132
134
  <Menu.Trigger asChild>
133
- <Toolbar.IconButton
134
- iconOnly
135
- variant='ghost'
136
- icon='ph--dots-three-vertical--regular'
137
- label='Actions'
138
- />
135
+ <IconButton iconOnly variant='ghost' icon='ph--dots-three-vertical--regular' label='Actions' />
139
136
  </Menu.Trigger>
140
137
  <Menu.Content />
141
- </Card.IconBlock>
138
+ </Card.Block>
142
139
  </Card.Header>
143
140
  <Card.Body>
144
141
  <Item {...itemProps} />
@@ -112,7 +112,7 @@ PipelineColumns.displayName = PIPELINE_COLUMNS_NAME;
112
112
  const PIPELINE_TOOLBAR_NAME = 'Pipeline.Toolbar';
113
113
 
114
114
  export const PipelineToolbar = composable<HTMLDivElement, ToolbarRootProps>(({ children, ...props }, forwardedRef) => {
115
- const { t } = useTranslation(meta.id);
115
+ const { t } = useTranslation(meta.profile.key);
116
116
  const { onAddColumn } = usePipeline(PIPELINE_TOOLBAR_NAME);
117
117
 
118
118
  return (
@@ -137,4 +137,4 @@ export const PipelineComponent = {
137
137
 
138
138
  export { usePipeline };
139
139
 
140
- export type { ItemProps, PipelineContextValue, PipelineRootProps, PipelineContentProps, PipelineColumnsProps };
140
+ export type { ItemProps, PipelineColumnsProps, PipelineContentProps, PipelineContextValue, PipelineRootProps };
@@ -4,12 +4,10 @@
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import * as Effect from 'effect/Effect';
7
- import * as Layer from 'effect/Layer';
8
7
  import React from 'react';
9
8
 
10
9
  import { withPluginManager } from '@dxos/app-framework/testing';
11
10
  import { Collection, Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Scope, Tag, View } from '@dxos/echo';
12
- import { createFeedServiceLayer } from '@dxos/echo-client';
13
11
  import { ClientPlugin } from '@dxos/plugin-client/plugin';
14
12
  import { initializeIdentity } from '@dxos/plugin-client/testing';
15
13
  import { InboxPlugin } from '@dxos/plugin-inbox/plugin';
@@ -17,7 +15,6 @@ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
17
15
  import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
18
16
  import { random } from '@dxos/random';
19
17
  import { useDatabase, useQuery } from '@dxos/react-client/echo';
20
- import { translations as stackTranslations } from '@dxos/react-ui-stack/translations';
21
18
  import { withLayout } from '@dxos/react-ui/testing';
22
19
  import { ViewModel } from '@dxos/schema';
23
20
  import { createObjectFactory } from '@dxos/schema/testing';
@@ -42,7 +39,9 @@ const DefaultStory = () => {
42
39
  return (
43
40
  <div className='grow grid grid-cols-[1fr_350px] overflow-hidden h-full w-full'>
44
41
  <PipelineArticle role='article' subject={pipeline} attendableId='test' />
45
- <PipelineProperties pipeline={pipeline} classNames='border-s border-separator' />
42
+ <div className='overflow-y-auto border-is border-separator'>
43
+ <PipelineProperties subject={pipeline} />
44
+ </div>
46
45
  </div>
47
46
  );
48
47
  };
@@ -200,11 +199,7 @@ const meta = {
200
199
  }),
201
200
  );
202
201
  }
203
- }).pipe(
204
- Effect.provide(
205
- Layer.merge(Database.layer(personalSpace.db), createFeedServiceLayer(personalSpace.queues)),
206
- ),
207
- );
202
+ }).pipe(Effect.provide(Database.layer(personalSpace.db)));
208
203
  }),
209
204
  }),
210
205
  InboxPlugin(),
@@ -214,7 +209,7 @@ const meta = {
214
209
  ],
215
210
  parameters: {
216
211
  layout: 'fullscreen',
217
- translations: [...translations, ...stackTranslations],
212
+ translations,
218
213
  },
219
214
  } satisfies Meta<typeof PipelineArticle>;
220
215
 
@@ -73,7 +73,7 @@ const PipelineItem = ({ item, projectionModel }: ItemProps) => {
73
73
 
74
74
  return (
75
75
  <Surface.Surface
76
- type={AppSurface.Card}
76
+ type={AppSurface.CardContent}
77
77
  data={{
78
78
  subject: item,
79
79
  projection: projectionModel,
@@ -0,0 +1,145 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import React from 'react';
8
+
9
+ import { withPluginManager } from '@dxos/app-framework/testing';
10
+ import { Collection, Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Scope, Tag, View } from '@dxos/echo';
11
+ import { ClientPlugin } from '@dxos/plugin-client/plugin';
12
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
13
+ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
14
+ import { corePlugins } from '@dxos/plugin-testing';
15
+ import { random } from '@dxos/random';
16
+ import { useQuery, useSpaces } from '@dxos/react-client/echo';
17
+ import { ObjectProperties } from '@dxos/react-ui-form';
18
+ import { translations as formTranslations } from '@dxos/react-ui-form/translations';
19
+ import { Loading, withLayout, withTheme } from '@dxos/react-ui/testing';
20
+ import { ViewModel } from '@dxos/schema';
21
+ import { createObjectFactory } from '@dxos/schema/testing';
22
+ import { Message, Organization, Person, Pipeline, Task } from '@dxos/types';
23
+
24
+ import { translations } from '#translations';
25
+
26
+ import { PipelineProperties } from './PipelineProperties';
27
+
28
+ random.seed(0);
29
+
30
+ const DefaultStory = () => {
31
+ const [space] = useSpaces();
32
+ const pipelines = useQuery(space?.db, Filter.type(Pipeline.Pipeline));
33
+ const pipeline = pipelines.find((pipeline) => (pipeline.columns?.length ?? 0) > 0);
34
+ if (!pipeline) {
35
+ return <Loading data={{ pipelines: pipelines.length }} />;
36
+ }
37
+
38
+ return (
39
+ <ObjectProperties object={pipeline}>
40
+ <PipelineProperties subject={pipeline} />
41
+ </ObjectProperties>
42
+ );
43
+ };
44
+
45
+ const meta = {
46
+ title: 'plugins/plugin-pipeline/containers/PipelineProperties',
47
+ render: DefaultStory,
48
+ decorators: [
49
+ withTheme(),
50
+ withLayout({ layout: 'column' }),
51
+ withPluginManager({
52
+ plugins: [
53
+ ...corePlugins(),
54
+ ClientPlugin({
55
+ types: [
56
+ Tag.Tag,
57
+ Feed.Feed,
58
+ Pipeline.Pipeline,
59
+ View.View,
60
+ Collection.Collection,
61
+ Organization.Organization,
62
+ Task.Task,
63
+ Person.Person,
64
+ Message.Message,
65
+ ],
66
+ onClientInitialized: Effect.fnUntraced(function* ({ client }) {
67
+ const { personalSpace } = yield* initializeIdentity(client);
68
+
69
+ yield* Effect.gen(function* () {
70
+ const tag = yield* Database.add(Tag.make({ label: 'important', hue: 'green' }));
71
+ const tagUri = Obj.getURI(tag);
72
+
73
+ // Create a view for Contacts.
74
+ const personView = ViewModel.make({
75
+ query: Query.select(Filter.type(Person.Person)),
76
+ jsonSchema: JsonSchema.toJsonSchema(Person.Person),
77
+ });
78
+
79
+ // Create a view for Organizations.
80
+ const organizationView = ViewModel.make({
81
+ query: Query.select(Filter.type(Organization.Organization)).select(Filter.tag(tagUri)),
82
+ jsonSchema: JsonSchema.toJsonSchema(Organization.Organization),
83
+ });
84
+
85
+ // Create a view for Tasks.
86
+ const taskView = ViewModel.make({
87
+ query: Query.select(Filter.type(Task.Task)).select(Filter.tag(tagUri)),
88
+ jsonSchema: JsonSchema.toJsonSchema(Task.Task),
89
+ });
90
+
91
+ // Create a feed for Messages.
92
+ const messageFeed = yield* Database.add(Feed.make({ name: 'Messages' }));
93
+ const messageView = ViewModel.make({
94
+ query: Query.select(Filter.type(Message.Message)).from(Scope.feed(Obj.getURI(messageFeed))),
95
+ jsonSchema: JsonSchema.toJsonSchema(Message.Message),
96
+ });
97
+
98
+ // Create pipeline with columns.
99
+ const pipeline = Pipeline.make({
100
+ columns: [
101
+ {
102
+ name: 'Contacts',
103
+ view: Ref.make(personView),
104
+ order: [],
105
+ },
106
+ {
107
+ name: 'Organizations',
108
+ view: Ref.make(organizationView),
109
+ order: [],
110
+ },
111
+ {
112
+ name: 'Tasks',
113
+ view: Ref.make(taskView),
114
+ order: [],
115
+ },
116
+ {
117
+ name: 'Messages',
118
+ view: Ref.make(messageView),
119
+ order: [],
120
+ },
121
+ ],
122
+ });
123
+ yield* Database.add(pipeline);
124
+
125
+ // Generate sample Contacts.
126
+ const factory = createObjectFactory(personalSpace.db, random as any);
127
+ yield* Effect.promise(() => factory([{ type: Person.Person, count: 12 }]));
128
+ }).pipe(Effect.provide(Database.layer(personalSpace.db)));
129
+ }),
130
+ }),
131
+ PreviewPlugin(),
132
+ ],
133
+ }),
134
+ ],
135
+ parameters: {
136
+ layout: 'fullscreen',
137
+ translations: [...translations, ...formTranslations],
138
+ },
139
+ } satisfies Meta<typeof PipelineProperties>;
140
+
141
+ export default meta;
142
+
143
+ type Story = StoryObj<typeof meta>;
144
+
145
+ export const Default: Story = {};