@dxos/plugin-pipeline 0.8.4-main.effb148878 → 0.8.4-staging.60fe92afc8
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/PLUGIN.mdl +345 -0
- package/dist/lib/neutral/PipelinePlugin.mjs +12 -0
- package/dist/lib/neutral/PipelinePlugin.mjs.map +4 -4
- package/dist/lib/neutral/{PipelineProperties-NFNEU3NR.mjs → PipelineProperties-JZQYG2CN.mjs} +9 -11
- package/dist/lib/neutral/PipelineProperties-JZQYG2CN.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +1 -1
- package/dist/lib/neutral/{chunk-OVZ2ASS7.mjs → chunk-CYXDAAKN.mjs} +6 -4
- package/dist/lib/neutral/chunk-CYXDAAKN.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +4 -8
- package/dist/lib/neutral/components/index.mjs.map +3 -3
- package/dist/lib/neutral/containers/index.mjs +1 -1
- package/dist/lib/neutral/hooks/index.mjs +3 -4
- package/dist/lib/neutral/hooks/index.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-4W5YLCHT.mjs → react-surface-QG7QSZSS.mjs} +2 -2
- package/dist/lib/neutral/{react-surface-4W5YLCHT.mjs.map → react-surface-QG7QSZSS.mjs.map} +1 -1
- package/dist/types/src/PipelinePlugin.d.ts.map +1 -1
- package/dist/types/src/components/PipelineComponent/PipelineColumn.d.ts.map +1 -1
- package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts.map +1 -1
- package/dist/types/src/hooks/usePipelineBoardModel.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +43 -44
- package/src/PipelinePlugin.tsx +6 -0
- package/src/capabilities/react-surface.tsx +1 -1
- package/src/components/PipelineComponent/PipelineColumn.tsx +4 -13
- package/src/containers/PipelineArticle/PipelineArticle.stories.tsx +3 -6
- package/src/containers/PipelineProperties/PipelineProperties.tsx +21 -22
- package/src/hooks/usePipelineBoardModel.ts +3 -4
- package/src/meta.ts +5 -4
- package/src/vite-env.d.ts +10 -0
- package/dist/lib/neutral/PipelineProperties-NFNEU3NR.mjs.map +0 -7
- package/dist/lib/neutral/chunk-OVZ2ASS7.mjs.map +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-pipeline",
|
|
3
|
-
"version": "0.8.4-
|
|
3
|
+
"version": "0.8.4-staging.60fe92afc8",
|
|
4
4
|
"description": "Pipeline plugin for Composer",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
"types": "./dist/types/src/index.d.ts",
|
|
67
67
|
"default": "./dist/lib/neutral/index.mjs"
|
|
68
68
|
},
|
|
69
|
+
"./assets/PLUGIN.mdl": "./PLUGIN.mdl",
|
|
69
70
|
"./plugin": {
|
|
70
71
|
"source": "./src/plugin.ts",
|
|
71
72
|
"types": "./dist/types/src/plugin.d.ts",
|
|
@@ -80,40 +81,38 @@
|
|
|
80
81
|
"types": "dist/types/src/index.d.ts",
|
|
81
82
|
"files": [
|
|
82
83
|
"dist",
|
|
83
|
-
"src"
|
|
84
|
+
"src",
|
|
85
|
+
"PLUGIN.mdl"
|
|
84
86
|
],
|
|
85
87
|
"dependencies": {
|
|
86
88
|
"@radix-ui/react-compose-refs": "1.1.1",
|
|
87
89
|
"@radix-ui/react-context": "1.1.1",
|
|
88
90
|
"@radix-ui/react-slot": "1.1.2",
|
|
89
|
-
"effect": "3.
|
|
90
|
-
"@dxos/app-
|
|
91
|
-
"@dxos/
|
|
92
|
-
"@dxos/
|
|
93
|
-
"@dxos/
|
|
94
|
-
"@dxos/
|
|
95
|
-
"@dxos/devtools": "0.8.4-
|
|
96
|
-
"@dxos/
|
|
97
|
-
"@dxos/
|
|
98
|
-
"@dxos/
|
|
99
|
-
"@dxos/
|
|
100
|
-
"@dxos/plugin-
|
|
101
|
-
"@dxos/plugin-
|
|
102
|
-
"@dxos/plugin-
|
|
103
|
-
"@dxos/plugin-
|
|
104
|
-
"@dxos/
|
|
105
|
-
"@dxos/react-
|
|
106
|
-
"@dxos/
|
|
107
|
-
"@dxos/react-ui-
|
|
108
|
-
"@dxos/react-ui-
|
|
109
|
-
"@dxos/
|
|
110
|
-
"@dxos/react-ui-
|
|
111
|
-
"@dxos/react-ui-
|
|
112
|
-
"@dxos/
|
|
113
|
-
"@dxos/
|
|
114
|
-
"@dxos/types": "0.8.4-main.effb148878",
|
|
115
|
-
"@dxos/util": "0.8.4-main.effb148878",
|
|
116
|
-
"@dxos/schema": "0.8.4-main.effb148878"
|
|
91
|
+
"effect": "3.21.3",
|
|
92
|
+
"@dxos/app-toolkit": "0.8.4-staging.60fe92afc8",
|
|
93
|
+
"@dxos/compute": "0.8.4-staging.60fe92afc8",
|
|
94
|
+
"@dxos/app-framework": "0.8.4-staging.60fe92afc8",
|
|
95
|
+
"@dxos/echo": "0.8.4-staging.60fe92afc8",
|
|
96
|
+
"@dxos/echo-query": "0.8.4-staging.60fe92afc8",
|
|
97
|
+
"@dxos/devtools": "0.8.4-staging.60fe92afc8",
|
|
98
|
+
"@dxos/keys": "0.8.4-staging.60fe92afc8",
|
|
99
|
+
"@dxos/log": "0.8.4-staging.60fe92afc8",
|
|
100
|
+
"@dxos/plugin-graph": "0.8.4-staging.60fe92afc8",
|
|
101
|
+
"@dxos/effect": "0.8.4-staging.60fe92afc8",
|
|
102
|
+
"@dxos/plugin-client": "0.8.4-staging.60fe92afc8",
|
|
103
|
+
"@dxos/plugin-inbox": "0.8.4-staging.60fe92afc8",
|
|
104
|
+
"@dxos/plugin-space": "0.8.4-staging.60fe92afc8",
|
|
105
|
+
"@dxos/plugin-markdown": "0.8.4-staging.60fe92afc8",
|
|
106
|
+
"@dxos/react-client": "0.8.4-staging.60fe92afc8",
|
|
107
|
+
"@dxos/react-ui-attention": "0.8.4-staging.60fe92afc8",
|
|
108
|
+
"@dxos/react-ui-form": "0.8.4-staging.60fe92afc8",
|
|
109
|
+
"@dxos/react-ui-menu": "0.8.4-staging.60fe92afc8",
|
|
110
|
+
"@dxos/react-ui-mosaic": "0.8.4-staging.60fe92afc8",
|
|
111
|
+
"@dxos/schema": "0.8.4-staging.60fe92afc8",
|
|
112
|
+
"@dxos/react-ui-stack": "0.8.4-staging.60fe92afc8",
|
|
113
|
+
"@dxos/react-ui-list": "0.8.4-staging.60fe92afc8",
|
|
114
|
+
"@dxos/types": "0.8.4-staging.60fe92afc8",
|
|
115
|
+
"@dxos/util": "0.8.4-staging.60fe92afc8"
|
|
117
116
|
},
|
|
118
117
|
"devDependencies": {
|
|
119
118
|
"@effect-atom/atom-react": "^0.5.0",
|
|
@@ -121,25 +120,25 @@
|
|
|
121
120
|
"@types/react-dom": "~19.2.3",
|
|
122
121
|
"react": "~19.2.3",
|
|
123
122
|
"react-dom": "~19.2.3",
|
|
124
|
-
"vite": "^8.0.
|
|
125
|
-
"@dxos/echo-
|
|
126
|
-
"@dxos/plugin-attention": "0.8.4-
|
|
127
|
-
"@dxos/plugin-inbox": "0.8.4-
|
|
128
|
-
"@dxos/plugin-preview": "0.8.4-
|
|
129
|
-
"@dxos/plugin-
|
|
130
|
-
"@dxos/
|
|
131
|
-
"@dxos/
|
|
132
|
-
"@dxos/
|
|
133
|
-
"@dxos/ui-theme": "0.8.4-
|
|
134
|
-
"@dxos/plugin-
|
|
123
|
+
"vite": "^8.0.16",
|
|
124
|
+
"@dxos/echo-client": "0.8.4-staging.60fe92afc8",
|
|
125
|
+
"@dxos/plugin-attention": "0.8.4-staging.60fe92afc8",
|
|
126
|
+
"@dxos/plugin-inbox": "0.8.4-staging.60fe92afc8",
|
|
127
|
+
"@dxos/plugin-preview": "0.8.4-staging.60fe92afc8",
|
|
128
|
+
"@dxos/plugin-testing": "0.8.4-staging.60fe92afc8",
|
|
129
|
+
"@dxos/react-ui": "0.8.4-staging.60fe92afc8",
|
|
130
|
+
"@dxos/storybook-utils": "0.8.4-staging.60fe92afc8",
|
|
131
|
+
"@dxos/random": "0.8.4-staging.60fe92afc8",
|
|
132
|
+
"@dxos/ui-theme": "0.8.4-staging.60fe92afc8",
|
|
133
|
+
"@dxos/plugin-theme": "0.8.4-staging.60fe92afc8"
|
|
135
134
|
},
|
|
136
135
|
"peerDependencies": {
|
|
137
136
|
"@effect-atom/atom-react": "^0.5.0",
|
|
138
|
-
"effect": "3.
|
|
137
|
+
"effect": "3.21.3",
|
|
139
138
|
"react": "~19.2.3",
|
|
140
139
|
"react-dom": "~19.2.3",
|
|
141
|
-
"@dxos/ui
|
|
142
|
-
"@dxos/
|
|
140
|
+
"@dxos/react-ui": "0.8.4-staging.60fe92afc8",
|
|
141
|
+
"@dxos/ui-theme": "0.8.4-staging.60fe92afc8"
|
|
143
142
|
},
|
|
144
143
|
"publishConfig": {
|
|
145
144
|
"access": "public"
|
package/src/PipelinePlugin.tsx
CHANGED
|
@@ -10,12 +10,18 @@ import { AppGraphBuilder, CreateObject, ReactSurface } from '#capabilities';
|
|
|
10
10
|
import { meta } from '#meta';
|
|
11
11
|
import { translations } from '#translations';
|
|
12
12
|
|
|
13
|
+
// eslint-disable-next-line import/no-relative-packages
|
|
14
|
+
import pluginSpec from '../PLUGIN.mdl?raw';
|
|
15
|
+
|
|
13
16
|
export const PipelinePlugin = Plugin.define(meta).pipe(
|
|
14
17
|
AppPlugin.addAppGraphModule({ activate: AppGraphBuilder }),
|
|
15
18
|
AppPlugin.addCreateObjectModule({ activate: CreateObject }),
|
|
16
19
|
AppPlugin.addSchemaModule({ schema: [Pipeline.Pipeline] }),
|
|
17
20
|
AppPlugin.addSurfaceModule({ activate: ReactSurface }),
|
|
18
21
|
AppPlugin.addTranslationsModule({ translations }),
|
|
22
|
+
AppPlugin.addPluginAssetModule({
|
|
23
|
+
asset: { pluginId: meta.id, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },
|
|
24
|
+
}),
|
|
19
25
|
Plugin.make,
|
|
20
26
|
);
|
|
21
27
|
|
|
@@ -44,7 +44,7 @@ export default Capability.makeModule(() =>
|
|
|
44
44
|
},
|
|
45
45
|
}),
|
|
46
46
|
Surface.create({
|
|
47
|
-
id: '
|
|
47
|
+
id: 'objectProperties',
|
|
48
48
|
filter: AppSurface.object(AppSurface.ObjectProperties, Pipeline.Pipeline),
|
|
49
49
|
component: ({ data }) => <PipelineProperties pipeline={data.subject} />,
|
|
50
50
|
}),
|
|
@@ -3,12 +3,10 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { useComposedRefs } from '@radix-ui/react-compose-refs';
|
|
6
|
-
import * as Function from 'effect/Function';
|
|
7
|
-
import * as Option from 'effect/Option';
|
|
8
6
|
import React, { forwardRef, useMemo, useRef, useState } from 'react';
|
|
9
7
|
|
|
10
8
|
import { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';
|
|
11
|
-
import {
|
|
9
|
+
import { Filter, Obj, Query, Type } from '@dxos/echo';
|
|
12
10
|
import { useObject } from '@dxos/react-client/echo';
|
|
13
11
|
import { Panel, Toolbar, useAsyncEffect, useTranslation } from '@dxos/react-ui';
|
|
14
12
|
import { Card } from '@dxos/react-ui';
|
|
@@ -54,7 +52,7 @@ export const PipelineColumn = ({ data: column, location, classNames, debug }: Pi
|
|
|
54
52
|
return;
|
|
55
53
|
}
|
|
56
54
|
|
|
57
|
-
const type = await resolveSchemaWithRegistry(db
|
|
55
|
+
const type = await resolveSchemaWithRegistry(db, query.ast);
|
|
58
56
|
setType(() => type);
|
|
59
57
|
}, [db, query]);
|
|
60
58
|
|
|
@@ -119,14 +117,7 @@ const ItemTile = forwardRef<HTMLDivElement, ItemTileProps>(
|
|
|
119
117
|
const rootRef = useRef<HTMLDivElement>(null);
|
|
120
118
|
const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);
|
|
121
119
|
const { Item } = usePipeline(ITEM_TILE_NAME);
|
|
122
|
-
const icon =
|
|
123
|
-
Obj.getType(data),
|
|
124
|
-
Option.fromNullable,
|
|
125
|
-
Option.map(Type.getSchema),
|
|
126
|
-
Option.flatMap(Annotation.IconAnnotation.get),
|
|
127
|
-
Option.map(({ icon }) => icon),
|
|
128
|
-
Option.getOrElse(() => 'ph--circle-dashed--regular'),
|
|
129
|
-
);
|
|
120
|
+
const icon = Obj.getIcon(data)?.icon ?? 'ph--circle-dashed--regular';
|
|
130
121
|
|
|
131
122
|
return (
|
|
132
123
|
<Menu.Root>
|
|
@@ -137,7 +128,7 @@ const ItemTile = forwardRef<HTMLDivElement, ItemTileProps>(
|
|
|
137
128
|
<Card.Icon icon={icon} />
|
|
138
129
|
<Card.Title>{Obj.getLabel(data, { fallback: 'typename' })}</Card.Title>
|
|
139
130
|
{/* TODO(wittjosiah): Reconcile with Card.Menu. */}
|
|
140
|
-
<Card.IconBlock
|
|
131
|
+
<Card.IconBlock>
|
|
141
132
|
<Menu.Trigger asChild>
|
|
142
133
|
<Toolbar.IconButton
|
|
143
134
|
iconOnly
|
|
@@ -8,8 +8,8 @@ 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 { Collection, Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Tag, View } from '@dxos/echo';
|
|
12
|
-
import { createFeedServiceLayer } from '@dxos/echo-
|
|
11
|
+
import { Collection, Database, Feed, Filter, JsonSchema, Obj, Query, Ref, Scope, Tag, View } from '@dxos/echo';
|
|
12
|
+
import { createFeedServiceLayer } from '@dxos/echo-client';
|
|
13
13
|
import { ClientPlugin } from '@dxos/plugin-client/plugin';
|
|
14
14
|
import { initializeIdentity } from '@dxos/plugin-client/testing';
|
|
15
15
|
import { InboxPlugin } from '@dxos/plugin-inbox/plugin';
|
|
@@ -110,11 +110,8 @@ const meta = {
|
|
|
110
110
|
);
|
|
111
111
|
yield* Feed.append(messageFeed, messages);
|
|
112
112
|
|
|
113
|
-
const messageQueueDxn = Feed.getQueueUri(messageFeed)!;
|
|
114
113
|
const messageView = ViewModel.make({
|
|
115
|
-
query: Query.select(Filter.type(Message.Message)).from(
|
|
116
|
-
feeds: [messageQueueDxn],
|
|
117
|
-
}),
|
|
114
|
+
query: Query.select(Filter.type(Message.Message)).from(Scope.feed(Obj.getURI(messageFeed))),
|
|
118
115
|
jsonSchema: JsonSchema.toJsonSchema(Message.Message),
|
|
119
116
|
});
|
|
120
117
|
|
|
@@ -7,8 +7,9 @@ import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
|
7
7
|
|
|
8
8
|
import { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';
|
|
9
9
|
import { useTypeOptions } from '@dxos/app-toolkit/ui';
|
|
10
|
-
import {
|
|
11
|
-
import { type
|
|
10
|
+
import { EID, Filter, JsonSchema, Obj, Query, type QueryAST, Ref, Scope, Tag, type Type } from '@dxos/echo';
|
|
11
|
+
import { type Mutable } from '@dxos/echo/Obj';
|
|
12
|
+
import { SchemaEx } from '@dxos/effect';
|
|
12
13
|
import { useObject, useQuery } from '@dxos/react-client/echo';
|
|
13
14
|
import { IconButton, type ThemedClassName, useAsyncEffect, useTranslation } from '@dxos/react-ui';
|
|
14
15
|
import { Form, ViewEditor } from '@dxos/react-ui-form';
|
|
@@ -55,7 +56,7 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
55
56
|
return;
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
const foundType = await resolveSchemaWithRegistry(db
|
|
59
|
+
const foundType = await resolveSchemaWithRegistry(db, view.query.ast);
|
|
59
60
|
if (foundType && foundType !== type) {
|
|
60
61
|
setType(() => foundType);
|
|
61
62
|
}
|
|
@@ -70,17 +71,17 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
70
71
|
);
|
|
71
72
|
|
|
72
73
|
const handleQueryChanged = useCallback(
|
|
73
|
-
async (newQuery: QueryAST.Query, target?:
|
|
74
|
+
async (newQuery: QueryAST.Query, target?: EID.EID) => {
|
|
74
75
|
if (!view || !db) {
|
|
75
76
|
return;
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
const queue = target;
|
|
79
|
-
const query = queue ? Query.fromAst(newQuery).from(
|
|
80
|
+
const query = queue ? Query.fromAst(newQuery).from([Scope.feed(String(queue))]) : Query.fromAst(newQuery);
|
|
80
81
|
updateView((view) => {
|
|
81
82
|
view.query.ast = query.ast as Mutable<typeof query.ast>;
|
|
82
83
|
});
|
|
83
|
-
const newType = await resolveSchemaWithRegistry(db
|
|
84
|
+
const newType = await resolveSchemaWithRegistry(db, query.ast);
|
|
84
85
|
if (!newType) {
|
|
85
86
|
return;
|
|
86
87
|
}
|
|
@@ -100,8 +101,8 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
100
101
|
|
|
101
102
|
const handleColumnValuesChanged = useCallback(
|
|
102
103
|
(column: Pipeline.Column) =>
|
|
103
|
-
(newValues: { name?: string }, { changed }: { changed: Record<JsonPath, boolean> }) => {
|
|
104
|
-
if (changed['name' as JsonPath]) {
|
|
104
|
+
(newValues: { name?: string }, { changed }: { changed: Record<SchemaEx.JsonPath, boolean> }) => {
|
|
105
|
+
if (changed['name' as SchemaEx.JsonPath]) {
|
|
105
106
|
const columnIndex = columns.findIndex((c) => c === column);
|
|
106
107
|
if (columnIndex === -1) {
|
|
107
108
|
return;
|
|
@@ -204,20 +205,18 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
204
205
|
<Form.FieldSet />
|
|
205
206
|
</Form.Content>
|
|
206
207
|
</Form.Root>
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
/>
|
|
220
|
-
)}
|
|
208
|
+
<ViewEditor
|
|
209
|
+
ref={projectionRef}
|
|
210
|
+
mode='tag'
|
|
211
|
+
readonly
|
|
212
|
+
type={type}
|
|
213
|
+
view={column.view.target}
|
|
214
|
+
registry={db?.graph.registry}
|
|
215
|
+
db={db}
|
|
216
|
+
tags={tags}
|
|
217
|
+
types={types}
|
|
218
|
+
onQueryChanged={handleQueryChanged}
|
|
219
|
+
/>
|
|
221
220
|
</div>
|
|
222
221
|
)}
|
|
223
222
|
</List.Item>
|
|
@@ -8,7 +8,6 @@ import { useMemo } from 'react';
|
|
|
8
8
|
|
|
9
9
|
import { getQueryTarget } from '@dxos/app-toolkit/query';
|
|
10
10
|
import { Obj, Query } from '@dxos/echo';
|
|
11
|
-
import { AtomObj, AtomQuery } from '@dxos/echo-atom';
|
|
12
11
|
import { getSpace, isSpace } from '@dxos/react-client/echo';
|
|
13
12
|
import { type BoardModel } from '@dxos/react-ui-mosaic';
|
|
14
13
|
import { Pipeline } from '@dxos/types';
|
|
@@ -23,7 +22,7 @@ export const usePipelineBoardModel = (
|
|
|
23
22
|
}
|
|
24
23
|
|
|
25
24
|
const space = getSpace(pipeline);
|
|
26
|
-
const columnsAtom =
|
|
25
|
+
const columnsAtom = Obj.atomProperty(pipeline, 'columns');
|
|
27
26
|
const columnAtomFamily = Atom.family<string, Atom.Atom<Pipeline.Column | undefined>>((viewKey: string) =>
|
|
28
27
|
Atom.make((get) => {
|
|
29
28
|
const columns = get(columnsAtom);
|
|
@@ -37,7 +36,7 @@ export const usePipelineBoardModel = (
|
|
|
37
36
|
if (column == null) {
|
|
38
37
|
return [];
|
|
39
38
|
}
|
|
40
|
-
const viewSnapshot = get(
|
|
39
|
+
const viewSnapshot = get(Obj.atom(column.view));
|
|
41
40
|
if (!viewSnapshot?.query?.ast) {
|
|
42
41
|
return [];
|
|
43
42
|
}
|
|
@@ -46,7 +45,7 @@ export const usePipelineBoardModel = (
|
|
|
46
45
|
if (!queryTarget) {
|
|
47
46
|
return [];
|
|
48
47
|
}
|
|
49
|
-
const raw = get(
|
|
48
|
+
const raw = get(queryTarget.query(query).atom);
|
|
50
49
|
return isSpace(queryTarget) ? raw : [...raw].reverse();
|
|
51
50
|
}),
|
|
52
51
|
);
|
package/src/meta.ts
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Plugin } from '@dxos/app-framework';
|
|
6
|
+
import { DXN } from '@dxos/keys';
|
|
6
7
|
import { trim } from '@dxos/util';
|
|
7
8
|
|
|
8
|
-
export const meta
|
|
9
|
-
|
|
9
|
+
export const meta = Plugin.makeMeta({
|
|
10
|
+
key: DXN.make('org.dxos.plugin.pipeline'),
|
|
10
11
|
name: 'Pipelines',
|
|
11
12
|
author: 'DXOS',
|
|
12
13
|
description: trim`
|
|
@@ -28,4 +29,4 @@ export const meta: Plugin.Meta = {
|
|
|
28
29
|
source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline',
|
|
29
30
|
spec: 'PLUGIN.mdl',
|
|
30
31
|
tags: ['labs'],
|
|
31
|
-
};
|
|
32
|
+
});
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/PipelineProperties/PipelineProperties.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';\nimport { useTypeOptions } from '@dxos/app-toolkit/ui';\nimport { EchoURI, Filter, JsonSchema, Obj, Query, type QueryAST, Ref, Tag, type Type } from '@dxos/echo';\nimport { type JsonPath, type Mutable } from '@dxos/echo/internal';\nimport { useObject, useQuery } from '@dxos/react-client/echo';\nimport { IconButton, type ThemedClassName, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Form, ViewEditor } from '@dxos/react-ui-form';\nimport { List } from '@dxos/react-ui-list';\nimport { type ProjectionModel, ViewModel } from '@dxos/schema';\nimport { Pipeline } from '@dxos/types';\nimport { mx, osTranslations } from '@dxos/ui-theme';\nimport { arrayMove } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nconst listGrid = 'grid grid-cols-[min-content_1fr_min-content_min-content_min-content]';\nconst listItemGrid = 'grid grid-cols-subgrid col-span-5';\n\nconst ColumnFormSchema = Pipeline.Column.pipe(Schema.mutable, Schema.pick('name'));\n\nexport type PipelinePropertiesProps = ThemedClassName<{\n pipeline: Pipeline.Pipeline;\n}>;\n\n/**\n * Supports editing the pipeline view.\n */\nexport const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesProps) => {\n const { t } = useTranslation(meta.id);\n const db = Obj.getDatabase(pipeline);\n const [expandedId, setExpandedId] = useState<string>();\n const [columns, updateColumns] = useObject(pipeline, 'columns');\n const column = useMemo(() => columns.find((column) => column.view.uri === expandedId), [columns, expandedId]);\n const [view, updateView] = useObject(column?.view);\n const [type, setType] = useState<Type.AnyEntity>();\n const projectionRef = useRef<ProjectionModel>(null);\n const tags = useQuery(db, Filter.type(Tag.Tag));\n const types = useTypeOptions({\n db,\n annotation: {\n location: ['database', 'runtime'],\n kind: ['user'],\n },\n });\n\n useAsyncEffect(async () => {\n if (!view?.query || !db) {\n return;\n }\n\n const foundType = await resolveSchemaWithRegistry(db.schemaRegistry, view.query.ast);\n if (foundType && foundType !== type) {\n setType(() => foundType);\n }\n }, [db, view, type]);\n\n const handleMove = useCallback(\n (fromIndex: number, toIndex: number) =>\n updateColumns((columns) => {\n arrayMove(columns, fromIndex, toIndex);\n }),\n [updateColumns],\n );\n\n const handleQueryChanged = useCallback(\n async (newQuery: QueryAST.Query, target?: EchoURI.EchoURI) => {\n if (!view || !db) {\n return;\n }\n\n const queue = target;\n const query = queue ? Query.fromAst(newQuery).from({ feeds: [queue] }) : Query.fromAst(newQuery);\n updateView((view) => {\n view.query.ast = query.ast as Mutable<typeof query.ast>;\n });\n const newType = await resolveSchemaWithRegistry(db.schemaRegistry, query.ast);\n if (!newType) {\n return;\n }\n\n const newView = ViewModel.make({\n query,\n jsonSchema: newType.jsonSchema,\n });\n updateView((view) => {\n view.projection = Obj.getSnapshot(newView).projection as Mutable<typeof view.projection>;\n });\n\n setType(() => newType);\n },\n [db, view, updateView, type],\n );\n\n const handleColumnValuesChanged = useCallback(\n (column: Pipeline.Column) =>\n (newValues: { name?: string }, { changed }: { changed: Record<JsonPath, boolean> }) => {\n if (changed['name' as JsonPath]) {\n const columnIndex = columns.findIndex((c) => c === column);\n if (columnIndex === -1) {\n return;\n }\n updateColumns((cols) => {\n cols[columnIndex].name = newValues.name ?? '';\n });\n }\n },\n [columns, updateColumns],\n );\n\n const handleToggleField = useCallback((column: Pipeline.Column) => {\n setExpandedId((prevExpandedId) => (prevExpandedId === column.view.uri ? undefined : column.view.uri));\n }, []);\n\n const handleDelete = useCallback(\n async (column: Pipeline.Column) => {\n if (column.view.uri === expandedId) {\n setExpandedId(undefined);\n }\n\n const index = columns.findIndex((l) => l === column);\n const viewToRemove = await column.view.load();\n updateColumns((columns) => {\n columns.splice(index, 1);\n });\n db?.remove(viewToRemove);\n },\n [expandedId, columns, updateColumns, db],\n );\n\n const handleAdd = useCallback(() => {\n if (!db) {\n return;\n }\n const newView = ViewModel.make({\n query: Query.select(Filter.nothing()),\n jsonSchema: JsonSchema.toJsonSchema(Schema.Struct({})),\n });\n db.add(newView);\n updateColumns((columns) => {\n columns.push({\n name: '',\n // Type assertion needed due to QueryAST type variance.\n view: Ref.make(newView) as (typeof columns)[number]['view'],\n order: [],\n });\n });\n setExpandedId(newView.id);\n }, [db, updateColumns]);\n\n return (\n <div className={mx('py-form-padding overflow-y-auto', classNames)}>\n <h2 className='text-sm text-description py-1'>{t('views.label')}</h2>\n\n <List.Root<Pipeline.Column>\n items={columns}\n isItem={Schema.is(Pipeline.Column)}\n getId={(column) => column.view.uri}\n onMove={handleMove}\n >\n {({ items: columns }) => (\n <>\n <div role='list' className={mx(listGrid)}>\n {columns.map((column) => (\n <List.Item<Pipeline.Column>\n key={column.view.uri}\n item={column}\n classNames={listItemGrid}\n aria-expanded={expandedId === column.view.uri}\n >\n <div className={mx(listItemGrid, 'dx-hover rounded-xs cursor-pointer min-h-10')}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleToggleField(column)}>\n {column.name || t('untitled-view.title')}\n </List.ItemTitle>\n <List.ItemDeleteButton\n label={t('delete-view.label')}\n autoHide={false}\n onClick={() => handleDelete(column)}\n data-testid='view.delete'\n />\n <IconButton\n iconOnly\n variant='ghost'\n label={t('toggle-expand.label', { ns: osTranslations })}\n icon={expandedId === column.view.uri ? 'ph--caret-down--regular' : 'ph--caret-right--regular'}\n onClick={() => handleToggleField(column)}\n />\n </div>\n {expandedId === column.view.uri && column?.view.target && (\n <div className='col-span-5 my-2 border border-separator rounded-md'>\n <Form.Root\n schema={ColumnFormSchema}\n values={column}\n onValuesChanged={handleColumnValuesChanged(column)}\n >\n <Form.Content>\n <Form.FieldSet />\n </Form.Content>\n </Form.Root>\n {type && (\n <ViewEditor\n ref={projectionRef}\n mode='tag'\n readonly\n type={type}\n view={column.view.target}\n registry={db?.schemaRegistry}\n db={db}\n tags={tags}\n types={types}\n onQueryChanged={handleQueryChanged}\n />\n )}\n </div>\n )}\n </List.Item>\n ))}\n </div>\n </>\n )}\n </List.Root>\n\n <div className='my-form-padding'>\n <IconButton icon='ph--plus--regular' label={t('add-view.label')} onClick={handleAdd} classNames='w-full' />\n </div>\n </div>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Schema", "React", "useCallback", "useMemo", "useRef", "useState", "resolveSchemaWithRegistry", "useTypeOptions", "Filter", "JsonSchema", "Obj", "Query", "Ref", "Tag", "useObject", "useQuery", "IconButton", "useAsyncEffect", "useTranslation", "Form", "ViewEditor", "List", "ViewModel", "Pipeline", "mx", "osTranslations", "arrayMove", "meta", "listGrid", "listItemGrid", "ColumnFormSchema", "Column", "pipe", "mutable", "pick", "PipelineProperties", "classNames", "pipeline", "t", "id", "db", "getDatabase", "expandedId", "setExpandedId", "columns", "updateColumns", "column", "find", "view", "uri", "updateView", "type", "setType", "projectionRef", "tags", "types", "annotation", "location", "kind", "query", "foundType", "schemaRegistry", "ast", "handleMove", "fromIndex", "toIndex", "handleQueryChanged", "newQuery", "target", "queue", "fromAst", "from", "feeds", "newType", "newView", "make", "jsonSchema", "projection", "getSnapshot", "handleColumnValuesChanged", "newValues", "changed", "columnIndex", "findIndex", "c", "cols", "name", "handleToggleField", "prevExpandedId", "undefined", "handleDelete", "index", "l", "viewToRemove", "load", "splice", "remove", "handleAdd", "select", "nothing", "toJsonSchema", "Struct", "add", "push", "order", "div", "className", "h2", "Root", "items", "isItem", "is", "getId", "onMove", "role", "map", "Item", "key", "item", "aria-expanded", "ItemDragHandle", "ItemTitle", "onClick", "ItemDeleteButton", "label", "autoHide", "data-testid", "iconOnly", "variant", "ns", "icon", "schema", "values", "onValuesChanged", "Content", "FieldSet", "ref", "mode", "readonly", "registry", "onQueryChanged"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/meta.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\nexport const meta: Plugin.Meta = {\n id: 'org.dxos.plugin.pipeline',\n name: 'Pipelines',\n author: 'DXOS',\n description: trim`\n A multi-column Kanban-style pipeline plugin for DXOS Composer.\n Each Pipeline holds an ordered set of Columns; each Column is backed by a ViewModel whose query\n can select any ECHO object type — messages, contacts, documents, or custom types — from the active space.\n\n Columns are fully configurable through the Settings companion panel, where users can add, rename,\n reorder, and delete columns and edit the underlying query and projection for each column.\n Objects can be dragged between columns and the full pipeline state, including column order and\n per-column item order, persists collaboratively via ECHO.\n\n A built-in Research template scaffolds a four-column pipeline wired to the Mailbox, Contacts,\n Organizations, and Notes objects in the space, providing an out-of-the-box CRM-style workflow.\n Pipeline articles also expose Invocations and Automation companion tabs for AI-driven automation.\n `,\n icon: 'ph--path--regular',\n iconHue: 'purple',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline',\n spec: 'PLUGIN.mdl',\n tags: ['labs'],\n};\n"],
|
|
5
|
-
"mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,QAAQ;EACRC,aAAaL;;;;;;;;;;;;;;EAcbM,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,MAAM;EACNC,MAAM;IAAC;;AACT;",
|
|
6
|
-
"names": ["trim", "meta", "id", "name", "author", "description", "icon", "iconHue", "source", "spec", "tags"]
|
|
7
|
-
}
|