@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.
- package/dist/lib/neutral/{PipelineArticle-6JIVXMYF.mjs → PipelineArticle-DG4TCEML.mjs} +2 -2
- package/dist/lib/neutral/{PipelineArticle-6JIVXMYF.mjs.map → PipelineArticle-DG4TCEML.mjs.map} +2 -2
- package/dist/lib/neutral/PipelinePlugin.mjs +4 -6
- package/dist/lib/neutral/PipelinePlugin.mjs.map +4 -4
- package/dist/lib/neutral/PipelinePlugin.node.mjs +2 -4
- package/dist/lib/neutral/PipelinePlugin.node.mjs.map +3 -3
- package/dist/lib/neutral/{PipelineProperties-JZQYG2CN.mjs → PipelineProperties-LDD4P4RA.mjs} +28 -55
- package/dist/lib/neutral/PipelineProperties-LDD4P4RA.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +2 -4
- package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
- package/dist/lib/neutral/chunk-RHSONY5F.mjs +44 -0
- package/dist/lib/neutral/chunk-RHSONY5F.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +11 -9
- package/dist/lib/neutral/components/index.mjs.map +3 -3
- package/dist/lib/neutral/containers/index.mjs +2 -2
- package/dist/lib/neutral/{create-object-6Z4MMGX4.mjs → create-object-B4FHAFWY.mjs} +1 -2
- package/dist/lib/neutral/{create-object-6Z4MMGX4.mjs.map → create-object-B4FHAFWY.mjs.map} +3 -3
- package/dist/lib/neutral/index.mjs +1 -1
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +1 -1
- package/dist/lib/neutral/{react-surface-QG7QSZSS.mjs → react-surface-G6WO2XOI.mjs} +2 -21
- package/dist/lib/neutral/react-surface-G6WO2XOI.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +4 -7
- package/dist/lib/neutral/translations.mjs.map +3 -3
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/PipelinePlugin.d.ts.map +1 -1
- package/dist/types/src/PipelinePlugin.node.d.ts.map +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -7
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +2 -8
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/PipelineComponent/PipelineComponent.d.ts +1 -1
- package/dist/types/src/components/PipelineComponent/PipelineComponent.d.ts.map +1 -1
- package/dist/types/src/components/PipelineComponent/PipelineComponent.stories.d.ts +6 -12
- package/dist/types/src/components/PipelineComponent/PipelineComponent.stories.d.ts.map +1 -1
- package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts +8 -27
- package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts +3 -5
- package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts.map +1 -1
- package/dist/types/src/containers/PipelineProperties/PipelineProperties.stories.d.ts +130 -0
- package/dist/types/src/containers/PipelineProperties/PipelineProperties.stories.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +32 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +6 -12
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +32 -0
- package/package.json +45 -44
- package/src/PipelinePlugin.node.ts +1 -2
- package/src/PipelinePlugin.test.ts +3 -5
- package/src/PipelinePlugin.tsx +2 -3
- package/src/capabilities/create-object.ts +0 -1
- package/src/capabilities/index.ts +0 -1
- package/src/capabilities/react-surface.tsx +1 -22
- package/src/components/PipelineComponent/PipelineColumn.tsx +10 -13
- package/src/components/PipelineComponent/PipelineComponent.tsx +2 -2
- package/src/containers/PipelineArticle/PipelineArticle.stories.tsx +5 -10
- package/src/containers/PipelineArticle/PipelineArticle.tsx +1 -1
- package/src/containers/PipelineProperties/PipelineProperties.stories.tsx +145 -0
- package/src/containers/PipelineProperties/PipelineProperties.tsx +65 -89
- package/src/meta.ts +2 -25
- package/src/translations.ts +8 -10
- package/dist/lib/neutral/PipelineProperties-JZQYG2CN.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-ZLGRWRJU.mjs +0 -44
- package/dist/lib/neutral/app-graph-builder-ZLGRWRJU.mjs.map +0 -7
- package/dist/lib/neutral/chunk-CYXDAAKN.mjs +0 -35
- package/dist/lib/neutral/chunk-CYXDAAKN.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-QG7QSZSS.mjs.map +0 -7
- package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -6
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
- 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.
|
|
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.
|
|
92
|
-
"@dxos/app-
|
|
93
|
-
"@dxos/
|
|
94
|
-
"@dxos/
|
|
95
|
-
"@dxos/
|
|
96
|
-
"@dxos/devtools": "0.9.
|
|
97
|
-
"@dxos/
|
|
98
|
-
"@dxos/effect": "0.9.
|
|
99
|
-
"@dxos/
|
|
100
|
-
"@dxos/
|
|
101
|
-
"@dxos/
|
|
102
|
-
"@dxos/plugin-
|
|
103
|
-
"@dxos/plugin-
|
|
104
|
-
"@dxos/plugin-
|
|
105
|
-
"@dxos/
|
|
106
|
-
"@dxos/react-ui-attention": "0.9.
|
|
107
|
-
"@dxos/react-
|
|
108
|
-
"@dxos/react-ui-list": "0.9.
|
|
109
|
-
"@dxos/
|
|
110
|
-
"@dxos/react-ui-
|
|
111
|
-
"@dxos/react-ui-mosaic": "0.9.
|
|
112
|
-
"@dxos/
|
|
113
|
-
"@dxos/
|
|
114
|
-
"@dxos/types": "0.9.
|
|
115
|
-
"@dxos/util": "0.9.
|
|
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.
|
|
120
|
+
"@types/react": "~19.2.17",
|
|
120
121
|
"@types/react-dom": "~19.2.3",
|
|
121
|
-
"react": "~19.2.
|
|
122
|
-
"react-dom": "~19.2.
|
|
122
|
+
"react": "~19.2.7",
|
|
123
|
+
"react-dom": "~19.2.7",
|
|
123
124
|
"vite": "^8.0.16",
|
|
124
|
-
"@dxos/
|
|
125
|
-
"@dxos/plugin-
|
|
126
|
-
"@dxos/plugin-
|
|
127
|
-
"@dxos/plugin-
|
|
128
|
-
"@dxos/
|
|
129
|
-
"@dxos/
|
|
130
|
-
"@dxos/
|
|
131
|
-
"@dxos/
|
|
132
|
-
"@dxos/ui
|
|
133
|
-
"@dxos/
|
|
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.
|
|
138
|
-
"react": "~19.2.
|
|
139
|
-
"react-dom": "~19.2.
|
|
140
|
-
"@dxos/react-ui": "0.9.
|
|
141
|
-
"@dxos/ui-theme": "0.9.
|
|
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 {
|
|
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.
|
|
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:
|
|
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
|
});
|
package/src/PipelinePlugin.tsx
CHANGED
|
@@ -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 {
|
|
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.
|
|
22
|
+
asset: { pluginId: meta.profile.key, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },
|
|
24
23
|
}),
|
|
25
24
|
Plugin.make,
|
|
26
25
|
);
|
|
@@ -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
|
|
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,
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
133
|
+
<Card.Block end>
|
|
132
134
|
<Menu.Trigger asChild>
|
|
133
|
-
<
|
|
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.
|
|
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.
|
|
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,
|
|
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
|
-
<
|
|
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
|
|
212
|
+
translations,
|
|
218
213
|
},
|
|
219
214
|
} satisfies Meta<typeof PipelineArticle>;
|
|
220
215
|
|
|
@@ -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 = {};
|