@dxos/plugin-pipeline 0.8.4-main.3fbcb4aa9b → 0.8.4-main.43cb759274
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/LICENSE +102 -5
- package/PLUGIN.mdl +345 -0
- package/README.md +1 -1
- package/dist/lib/neutral/{PipelineContainer-7MK2SS76.mjs → PipelineArticle-6JIVXMYF.mjs} +4 -4
- package/dist/lib/neutral/PipelineArticle-6JIVXMYF.mjs.map +7 -0
- package/dist/lib/neutral/PipelinePlugin.mjs +12 -0
- package/dist/lib/neutral/PipelinePlugin.mjs.map +4 -4
- package/dist/lib/neutral/PipelinePlugin.workerd.mjs +16 -0
- package/dist/lib/neutral/PipelinePlugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/{PipelineProperties-RRPQ3V6I.mjs → PipelineProperties-JXY3AVOY.mjs} +43 -44
- package/dist/lib/neutral/PipelineProperties-JXY3AVOY.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +2 -2
- package/dist/lib/neutral/chunk-CYXDAAKN.mjs +35 -0
- package/dist/lib/neutral/chunk-CYXDAAKN.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +19 -22
- package/dist/lib/neutral/components/index.mjs.map +3 -3
- package/dist/lib/neutral/containers/index.mjs +3 -3
- package/dist/lib/neutral/containers/index.mjs.map +3 -3
- package/dist/lib/neutral/{create-object-ZJYFACOI.mjs → create-object-6Z4MMGX4.mjs} +3 -2
- package/dist/lib/neutral/create-object-6Z4MMGX4.mjs.map +7 -0
- package/dist/lib/neutral/hooks/index.mjs +5 -5
- 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-TW6TRMO6.mjs → react-surface-QG7QSZSS.mjs} +4 -4
- package/dist/lib/neutral/react-surface-QG7QSZSS.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +2 -1
- package/dist/lib/neutral/translations.mjs.map +3 -3
- package/dist/types/src/PipelinePlugin.d.ts.map +1 -1
- package/dist/types/src/PipelinePlugin.workerd.d.ts +4 -0
- package/dist/types/src/PipelinePlugin.workerd.d.ts.map +1 -0
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
- package/dist/types/src/components/PipelineComponent/PipelineColumn.d.ts.map +1 -1
- package/dist/types/src/components/PipelineComponent/PipelineComponent.d.ts.map +1 -1
- package/dist/types/src/components/PipelineComponent/PipelineComponent.stories.d.ts.map +1 -1
- package/dist/types/src/containers/PipelineArticle/PipelineArticle.d.ts +6 -0
- package/dist/types/src/containers/PipelineArticle/PipelineArticle.d.ts.map +1 -0
- package/dist/types/src/containers/{PipelineContainer/PipelineContainer.stories.d.ts → PipelineArticle/PipelineArticle.stories.d.ts} +1 -1
- package/dist/types/src/containers/PipelineArticle/PipelineArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/PipelineArticle/index.d.ts +2 -0
- package/dist/types/src/containers/PipelineArticle/index.d.ts.map +1 -0
- package/dist/types/src/containers/PipelineProperties/PipelineProperties.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +1 -1
- package/dist/types/src/containers/index.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/src/translations.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +46 -45
- package/src/PipelinePlugin.tsx +6 -0
- package/src/PipelinePlugin.workerd.ts +16 -0
- package/src/capabilities/create-object.ts +2 -1
- package/src/capabilities/react-surface.tsx +3 -3
- package/src/components/PipelineComponent/PipelineColumn.tsx +20 -30
- package/src/components/PipelineComponent/PipelineComponent.stories.tsx +2 -4
- package/src/components/PipelineComponent/PipelineComponent.tsx +1 -1
- package/src/containers/{PipelineContainer/PipelineContainer.stories.tsx → PipelineArticle/PipelineArticle.stories.tsx} +11 -16
- package/src/containers/{PipelineContainer/PipelineContainer.tsx → PipelineArticle/PipelineArticle.tsx} +2 -2
- package/src/containers/PipelineArticle/index.ts +5 -0
- package/src/containers/PipelineProperties/PipelineProperties.tsx +53 -56
- package/src/containers/index.ts +1 -1
- package/src/hooks/usePipelineBoardModel.ts +5 -5
- package/src/meta.ts +19 -6
- package/src/translations.ts +2 -1
- package/src/vite-env.d.ts +10 -0
- package/dist/lib/neutral/PipelineContainer-7MK2SS76.mjs.map +0 -7
- package/dist/lib/neutral/PipelineProperties-RRPQ3V6I.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ULB5DKWO.mjs +0 -21
- package/dist/lib/neutral/chunk-ULB5DKWO.mjs.map +0 -7
- package/dist/lib/neutral/create-object-ZJYFACOI.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-TW6TRMO6.mjs.map +0 -7
- package/dist/types/src/containers/PipelineContainer/PipelineContainer.d.ts +0 -6
- package/dist/types/src/containers/PipelineContainer/PipelineContainer.d.ts.map +0 -1
- package/dist/types/src/containers/PipelineContainer/PipelineContainer.stories.d.ts.map +0 -1
- package/dist/types/src/containers/PipelineContainer/index.d.ts +0 -2
- package/dist/types/src/containers/PipelineContainer/index.d.ts.map +0 -1
- package/src/containers/PipelineContainer/index.ts +0 -5
|
@@ -7,15 +7,15 @@ 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 {
|
|
10
|
+
import { EID, Filter, JsonSchema, Obj, Query, type QueryAST, Ref, Scope, Tag, type Type } from '@dxos/echo';
|
|
11
11
|
import { type JsonPath, type Mutable } from '@dxos/echo/internal';
|
|
12
|
-
import {
|
|
12
|
+
import { useObject, useQuery } from '@dxos/react-client/echo';
|
|
13
13
|
import { IconButton, type ThemedClassName, useAsyncEffect, useTranslation } from '@dxos/react-ui';
|
|
14
14
|
import { Form, ViewEditor } from '@dxos/react-ui-form';
|
|
15
15
|
import { List } from '@dxos/react-ui-list';
|
|
16
16
|
import { type ProjectionModel, ViewModel } from '@dxos/schema';
|
|
17
17
|
import { Pipeline } from '@dxos/types';
|
|
18
|
-
import { mx, osTranslations
|
|
18
|
+
import { mx, osTranslations } from '@dxos/ui-theme';
|
|
19
19
|
import { arrayMove } from '@dxos/util';
|
|
20
20
|
|
|
21
21
|
import { meta } from '#meta';
|
|
@@ -34,19 +34,16 @@ export type PipelinePropertiesProps = ThemedClassName<{
|
|
|
34
34
|
*/
|
|
35
35
|
export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesProps) => {
|
|
36
36
|
const { t } = useTranslation(meta.id);
|
|
37
|
-
const
|
|
37
|
+
const db = Obj.getDatabase(pipeline);
|
|
38
38
|
const [expandedId, setExpandedId] = useState<string>();
|
|
39
39
|
const [columns, updateColumns] = useObject(pipeline, 'columns');
|
|
40
|
-
const column = useMemo(
|
|
41
|
-
() => columns.find((column) => column.view.dxn.toString() === expandedId),
|
|
42
|
-
[columns, expandedId],
|
|
43
|
-
);
|
|
40
|
+
const column = useMemo(() => columns.find((column) => column.view.uri === expandedId), [columns, expandedId]);
|
|
44
41
|
const [view, updateView] = useObject(column?.view);
|
|
45
|
-
const [
|
|
42
|
+
const [type, setType] = useState<Type.AnyEntity>();
|
|
46
43
|
const projectionRef = useRef<ProjectionModel>(null);
|
|
47
|
-
const tags = useQuery(
|
|
44
|
+
const tags = useQuery(db, Filter.type(Tag.Tag));
|
|
48
45
|
const types = useTypeOptions({
|
|
49
|
-
|
|
46
|
+
db,
|
|
50
47
|
annotation: {
|
|
51
48
|
location: ['database', 'runtime'],
|
|
52
49
|
kind: ['user'],
|
|
@@ -54,15 +51,15 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
54
51
|
});
|
|
55
52
|
|
|
56
53
|
useAsyncEffect(async () => {
|
|
57
|
-
if (!view?.query || !
|
|
54
|
+
if (!view?.query || !db) {
|
|
58
55
|
return;
|
|
59
56
|
}
|
|
60
57
|
|
|
61
|
-
const
|
|
62
|
-
if (
|
|
63
|
-
|
|
58
|
+
const foundType = await resolveSchemaWithRegistry(db, view.query.ast);
|
|
59
|
+
if (foundType && foundType !== type) {
|
|
60
|
+
setType(() => foundType);
|
|
64
61
|
}
|
|
65
|
-
}, [
|
|
62
|
+
}, [db, view, type]);
|
|
66
63
|
|
|
67
64
|
const handleMove = useCallback(
|
|
68
65
|
(fromIndex: number, toIndex: number) =>
|
|
@@ -73,32 +70,36 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
73
70
|
);
|
|
74
71
|
|
|
75
72
|
const handleQueryChanged = useCallback(
|
|
76
|
-
async (newQuery: QueryAST.Query, target?:
|
|
77
|
-
if (!view || !
|
|
73
|
+
async (newQuery: QueryAST.Query, target?: EID.EID) => {
|
|
74
|
+
if (!view || !db) {
|
|
78
75
|
return;
|
|
79
76
|
}
|
|
80
77
|
|
|
81
|
-
const queue = target
|
|
82
|
-
const query = queue
|
|
78
|
+
const queue = target;
|
|
79
|
+
const query = queue
|
|
80
|
+
? Query.fromAst(newQuery).from([
|
|
81
|
+
Scope.feed(`dxn:queue:data:${EID.getSpaceId(queue)}:${EID.getEntityId(queue)}`),
|
|
82
|
+
])
|
|
83
|
+
: Query.fromAst(newQuery);
|
|
83
84
|
updateView((view) => {
|
|
84
85
|
view.query.ast = query.ast as Mutable<typeof query.ast>;
|
|
85
86
|
});
|
|
86
|
-
const
|
|
87
|
-
if (!
|
|
87
|
+
const newType = await resolveSchemaWithRegistry(db, query.ast);
|
|
88
|
+
if (!newType) {
|
|
88
89
|
return;
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
const newView = ViewModel.make({
|
|
92
93
|
query,
|
|
93
|
-
jsonSchema:
|
|
94
|
+
jsonSchema: newType.jsonSchema,
|
|
94
95
|
});
|
|
95
96
|
updateView((view) => {
|
|
96
97
|
view.projection = Obj.getSnapshot(newView).projection as Mutable<typeof view.projection>;
|
|
97
98
|
});
|
|
98
99
|
|
|
99
|
-
|
|
100
|
+
setType(() => newType);
|
|
100
101
|
},
|
|
101
|
-
[view, updateView,
|
|
102
|
+
[db, view, updateView, type],
|
|
102
103
|
);
|
|
103
104
|
|
|
104
105
|
const handleColumnValuesChanged = useCallback(
|
|
@@ -118,14 +119,12 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
118
119
|
);
|
|
119
120
|
|
|
120
121
|
const handleToggleField = useCallback((column: Pipeline.Column) => {
|
|
121
|
-
setExpandedId((prevExpandedId) =>
|
|
122
|
-
prevExpandedId === column.view.dxn.toString() ? undefined : column.view.dxn.toString(),
|
|
123
|
-
);
|
|
122
|
+
setExpandedId((prevExpandedId) => (prevExpandedId === column.view.uri ? undefined : column.view.uri));
|
|
124
123
|
}, []);
|
|
125
124
|
|
|
126
125
|
const handleDelete = useCallback(
|
|
127
126
|
async (column: Pipeline.Column) => {
|
|
128
|
-
if (column.view.
|
|
127
|
+
if (column.view.uri === expandedId) {
|
|
129
128
|
setExpandedId(undefined);
|
|
130
129
|
}
|
|
131
130
|
|
|
@@ -134,20 +133,20 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
134
133
|
updateColumns((columns) => {
|
|
135
134
|
columns.splice(index, 1);
|
|
136
135
|
});
|
|
137
|
-
|
|
136
|
+
db?.remove(viewToRemove);
|
|
138
137
|
},
|
|
139
|
-
[expandedId, columns, updateColumns,
|
|
138
|
+
[expandedId, columns, updateColumns, db],
|
|
140
139
|
);
|
|
141
140
|
|
|
142
141
|
const handleAdd = useCallback(() => {
|
|
143
|
-
if (!
|
|
142
|
+
if (!db) {
|
|
144
143
|
return;
|
|
145
144
|
}
|
|
146
145
|
const newView = ViewModel.make({
|
|
147
146
|
query: Query.select(Filter.nothing()),
|
|
148
147
|
jsonSchema: JsonSchema.toJsonSchema(Schema.Struct({})),
|
|
149
148
|
});
|
|
150
|
-
|
|
149
|
+
db.add(newView);
|
|
151
150
|
updateColumns((columns) => {
|
|
152
151
|
columns.push({
|
|
153
152
|
name: '',
|
|
@@ -157,7 +156,7 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
157
156
|
});
|
|
158
157
|
});
|
|
159
158
|
setExpandedId(newView.id);
|
|
160
|
-
}, [
|
|
159
|
+
}, [db, updateColumns]);
|
|
161
160
|
|
|
162
161
|
return (
|
|
163
162
|
<div className={mx('py-form-padding overflow-y-auto', classNames)}>
|
|
@@ -166,7 +165,7 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
166
165
|
<List.Root<Pipeline.Column>
|
|
167
166
|
items={columns}
|
|
168
167
|
isItem={Schema.is(Pipeline.Column)}
|
|
169
|
-
getId={(column) => column.view.
|
|
168
|
+
getId={(column) => column.view.uri}
|
|
170
169
|
onMove={handleMove}
|
|
171
170
|
>
|
|
172
171
|
{({ items: columns }) => (
|
|
@@ -174,12 +173,12 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
174
173
|
<div role='list' className={mx(listGrid)}>
|
|
175
174
|
{columns.map((column) => (
|
|
176
175
|
<List.Item<Pipeline.Column>
|
|
177
|
-
key={column.view.
|
|
176
|
+
key={column.view.uri}
|
|
178
177
|
item={column}
|
|
179
178
|
classNames={listItemGrid}
|
|
180
|
-
aria-expanded={expandedId === column.view.
|
|
179
|
+
aria-expanded={expandedId === column.view.uri}
|
|
181
180
|
>
|
|
182
|
-
<div className={mx(
|
|
181
|
+
<div className={mx(listItemGrid, 'dx-hover rounded-xs cursor-pointer min-h-10')}>
|
|
183
182
|
<List.ItemDragHandle />
|
|
184
183
|
<List.ItemTitle onClick={() => handleToggleField(column)}>
|
|
185
184
|
{column.name || t('untitled-view.title')}
|
|
@@ -194,15 +193,11 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
194
193
|
iconOnly
|
|
195
194
|
variant='ghost'
|
|
196
195
|
label={t('toggle-expand.label', { ns: osTranslations })}
|
|
197
|
-
icon={
|
|
198
|
-
expandedId === column.view.dxn.toString()
|
|
199
|
-
? 'ph--caret-down--regular'
|
|
200
|
-
: 'ph--caret-right--regular'
|
|
201
|
-
}
|
|
196
|
+
icon={expandedId === column.view.uri ? 'ph--caret-down--regular' : 'ph--caret-right--regular'}
|
|
202
197
|
onClick={() => handleToggleField(column)}
|
|
203
198
|
/>
|
|
204
199
|
</div>
|
|
205
|
-
{expandedId === column.view.
|
|
200
|
+
{expandedId === column.view.uri && column?.view.target && (
|
|
206
201
|
<div className='col-span-5 my-2 border border-separator rounded-md'>
|
|
207
202
|
<Form.Root
|
|
208
203
|
schema={ColumnFormSchema}
|
|
@@ -213,18 +208,20 @@ export const PipelineProperties = ({ classNames, pipeline }: PipelinePropertiesP
|
|
|
213
208
|
<Form.FieldSet />
|
|
214
209
|
</Form.Content>
|
|
215
210
|
</Form.Root>
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
211
|
+
{type && (
|
|
212
|
+
<ViewEditor
|
|
213
|
+
ref={projectionRef}
|
|
214
|
+
mode='tag'
|
|
215
|
+
readonly
|
|
216
|
+
type={type}
|
|
217
|
+
view={column.view.target}
|
|
218
|
+
registry={db?.graph.registry}
|
|
219
|
+
db={db}
|
|
220
|
+
tags={tags}
|
|
221
|
+
types={types}
|
|
222
|
+
onQueryChanged={handleQueryChanged}
|
|
223
|
+
/>
|
|
224
|
+
)}
|
|
228
225
|
</div>
|
|
229
226
|
)}
|
|
230
227
|
</List.Item>
|
package/src/containers/index.ts
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
|
|
5
5
|
import { type ComponentType, lazy } from 'react';
|
|
6
6
|
|
|
7
|
-
export const
|
|
7
|
+
export const PipelineArticle: ComponentType<any> = lazy(() => import('./PipelineArticle'));
|
|
8
8
|
export const PipelineProperties: ComponentType<any> = lazy(() => import('./PipelineProperties'));
|
|
@@ -27,7 +27,7 @@ export const usePipelineBoardModel = (
|
|
|
27
27
|
const columnAtomFamily = Atom.family<string, Atom.Atom<Pipeline.Column | undefined>>((viewKey: string) =>
|
|
28
28
|
Atom.make((get) => {
|
|
29
29
|
const columns = get(columnsAtom);
|
|
30
|
-
return columns.find((c) => c.view.
|
|
30
|
+
return columns.find((c) => c.view.uri === viewKey);
|
|
31
31
|
}),
|
|
32
32
|
);
|
|
33
33
|
|
|
@@ -52,14 +52,14 @@ export const usePipelineBoardModel = (
|
|
|
52
52
|
);
|
|
53
53
|
|
|
54
54
|
return {
|
|
55
|
-
getColumnId: (data) => (data as Pipeline.Column).view.
|
|
55
|
+
getColumnId: (data) => (data as Pipeline.Column).view.uri,
|
|
56
56
|
getItemId: (data) => (data as Obj.Unknown).id,
|
|
57
57
|
isColumn: (obj: unknown): obj is Pipeline.Column => Schema.is(Pipeline.Column)(obj),
|
|
58
58
|
isItem: (obj: unknown): obj is Obj.Unknown => Obj.isObject(obj),
|
|
59
59
|
columns: columnsAtom,
|
|
60
|
-
items: (column) => itemsAtomFamily(column.view.
|
|
60
|
+
items: (column) => itemsAtomFamily(column.view.uri),
|
|
61
61
|
getColumns: () => [...registry.get(columnsAtom)],
|
|
62
|
-
getItems: (column) => registry.get(itemsAtomFamily(column.view.
|
|
62
|
+
getItems: (column) => registry.get(itemsAtomFamily(column.view.uri)) ?? [],
|
|
63
63
|
};
|
|
64
64
|
}, [pipeline, registry]);
|
|
65
65
|
|
|
@@ -68,7 +68,7 @@ const emptyColumnsAtom = Atom.make(() => [] as Pipeline.Column[]);
|
|
|
68
68
|
const emptyItemsAtom = Atom.make(() => [] as Obj.Unknown[]);
|
|
69
69
|
|
|
70
70
|
const emptyPipelineModel: BoardModel<Pipeline.Column, Obj.Unknown> = {
|
|
71
|
-
getColumnId: (data) => (data as Pipeline.Column).view.
|
|
71
|
+
getColumnId: (data) => (data as Pipeline.Column).view.uri,
|
|
72
72
|
getItemId: (data) => (data as Obj.Unknown).id,
|
|
73
73
|
isColumn: (obj: unknown): obj is Pipeline.Column => Schema.is(Pipeline.Column)(obj),
|
|
74
74
|
isItem: (obj): obj is Obj.Unknown => Obj.isObject(obj),
|
package/src/meta.ts
CHANGED
|
@@ -2,18 +2,31 @@
|
|
|
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',
|
|
12
|
+
author: 'DXOS',
|
|
11
13
|
description: trim`
|
|
12
|
-
|
|
13
|
-
|
|
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.
|
|
14
26
|
`,
|
|
15
27
|
icon: 'ph--path--regular',
|
|
16
28
|
iconHue: 'purple',
|
|
17
29
|
source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline',
|
|
30
|
+
spec: 'PLUGIN.mdl',
|
|
18
31
|
tags: ['labs'],
|
|
19
|
-
};
|
|
32
|
+
});
|
package/src/translations.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Type } from '@dxos/echo';
|
|
1
2
|
import { type Resource } from '@dxos/react-ui';
|
|
2
3
|
import { Pipeline } from '@dxos/types';
|
|
3
4
|
//
|
|
@@ -9,7 +10,7 @@ import { meta } from '#meta';
|
|
|
9
10
|
export const translations = [
|
|
10
11
|
{
|
|
11
12
|
'en-US': {
|
|
12
|
-
[Pipeline.Pipeline
|
|
13
|
+
[Type.getTypename(Pipeline.Pipeline)]: {
|
|
13
14
|
'typename.label': 'Pipeline',
|
|
14
15
|
'typename.label_zero': 'Pipelines',
|
|
15
16
|
'typename.label_one': 'Pipeline',
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/PipelineContainer/PipelineContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useEffect } from 'react';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { Surface, useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport {\n AppSurface,\n OBJECT_ACTIONS_CONTRIBUTION_ID,\n OBJECT_ACTIONS_CONTRIBUTION_PRIORITY,\n useObjectMenuItems,\n} from '@dxos/app-toolkit/ui';\nimport { Panel } from '@dxos/react-ui';\nimport { linkedSegment } from '@dxos/react-ui-attention';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { useMenu } from '@dxos/react-ui-menu';\nimport { type Pipeline } from '@dxos/types';\n\nimport { type ItemProps, PipelineComponent } from '#components';\nimport { usePipelineBoardModel } from '#hooks';\n\nconst PIPELINE_ITEM = 'PipelineItem';\n\nexport type PipelineContainerProps = AppSurface.ObjectArticleProps<Pipeline.Pipeline>;\n\nexport const PipelineContainer = ({ role, subject: pipeline, attendableId }: PipelineContainerProps) => {\n const registry = useCapability(Capabilities.AtomRegistry);\n const model = usePipelineBoardModel(pipeline, registry);\n const { invokePromise } = useOperationInvoker();\n const { hasAttention } = useAttention(attendableId);\n\n const handleColumnAdd = useCallback(\n () =>\n invokePromise(LayoutOperation.UpdateCompanion, {\n subject: linkedSegment('settings'),\n }),\n [invokePromise],\n );\n\n return (\n <PipelineComponent.Root Item={PipelineItem} onAddColumn={handleColumnAdd}>\n <Panel.Root role={role}>\n <Panel.Toolbar asChild>\n <PipelineComponent.Toolbar disabled={!hasAttention} />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <PipelineComponent.Content asChild model={model}>\n <PipelineComponent.Columns pipeline={pipeline} />\n </PipelineComponent.Content>\n </Panel.Content>\n </Panel.Root>\n </PipelineComponent.Root>\n );\n};\n\nconst PipelineItem = ({ item, projectionModel }: ItemProps) => {\n const menu = useMenu(PIPELINE_ITEM);\n const items = useObjectMenuItems(item);\n\n useEffect(() => {\n menu.addMenuItems({\n id: OBJECT_ACTIONS_CONTRIBUTION_ID,\n mode: 'additive',\n priority: OBJECT_ACTIONS_CONTRIBUTION_PRIORITY,\n items,\n });\n\n return () => menu.removeMenuItems(OBJECT_ACTIONS_CONTRIBUTION_ID);\n }, [menu, items]);\n\n return (\n <Surface.Surface\n type={AppSurface.Card}\n data={{\n subject: item,\n projection: projectionModel,\n }}\n limit={1}\n />\n );\n};\n"],
|
|
5
|
-
"mappings": ";AAIA,OAAOA,SAASC,aAAaC,iBAAiB;AAE9C,SAASC,oBAAoB;AAC7B,SAASC,SAASC,eAAeC,2BAA2B;AAC5D,SAASC,uBAAuB;AAChC,SACEC,YACAC,gCACAC,sCACAC,0BACK;AACP,SAASC,aAAa;AACtB,SAASC,qBAAqB;AAC9B,SAASC,oBAAoB;AAC7B,SAASC,eAAe;AAGxB,SAAyBC,yBAAyB;AAClD,SAASC,6BAA6B;AAEtC,IAAMC,gBAAgB;AAIf,IAAMC,oBAAoB,CAAC,EAAEC,MAAMC,SAASC,UAAUC,aAAY,MAA0B;AACjG,QAAMC,WAAWnB,cAAcF,aAAasB,YAAY;AACxD,QAAMC,QAAQT,sBAAsBK,UAAUE,QAAAA;AAC9C,QAAM,EAAEG,cAAa,IAAKrB,oBAAAA;AAC1B,QAAM,EAAEsB,aAAY,IAAKd,aAAaS,YAAAA;AAEtC,QAAMM,kBAAkB5B,YACtB,MACE0B,cAAcpB,gBAAgBuB,iBAAiB;IAC7CT,SAASR,cAAc,UAAA;EACzB,CAAA,GACF;IAACc;GAAc;AAGjB,SACE,sBAAA,cAACX,kBAAkBe,MAAI;IAACC,MAAMC;IAAcC,aAAaL;KACvD,sBAAA,cAACjB,MAAMmB,MAAI;IAACX;KACV,sBAAA,cAACR,MAAMuB,SAAO;IAACC,SAAAA;KACb,sBAAA,cAACpB,kBAAkBmB,SAAO;IAACE,UAAU,CAACT;OAExC,sBAAA,cAAChB,MAAM0B,SAAO;IAACF,SAAAA;KACb,sBAAA,cAACpB,kBAAkBsB,SAAO;IAACF,SAAAA;IAAQV;KACjC,sBAAA,cAACV,kBAAkBuB,SAAO;IAACjB;;AAMvC;AAEA,IAAMW,eAAe,CAAC,EAAEO,MAAMC,gBAAe,MAAa;AACxD,QAAMC,OAAO3B,QAAQG,aAAAA;AACrB,QAAMyB,QAAQhC,mBAAmB6B,IAAAA;AAEjCtC,YAAU,MAAA;AACRwC,SAAKE,aAAa;MAChBC,IAAIpC;MACJqC,MAAM;MACNC,UAAUrC;MACViC;IACF,CAAA;AAEA,WAAO,MAAMD,KAAKM,gBAAgBvC,8BAAAA;EACpC,GAAG;IAACiC;IAAMC;GAAM;AAEhB,SACE,sBAAA,cAACvC,QAAQA,SAAO;IACd6C,MAAMzC,WAAW0C;IACjBC,MAAM;MACJ9B,SAASmB;MACTY,YAAYX;IACd;IACAY,OAAO;;AAGb;",
|
|
6
|
-
"names": ["React", "useCallback", "useEffect", "Capabilities", "Surface", "useCapability", "useOperationInvoker", "LayoutOperation", "AppSurface", "OBJECT_ACTIONS_CONTRIBUTION_ID", "OBJECT_ACTIONS_CONTRIBUTION_PRIORITY", "useObjectMenuItems", "Panel", "linkedSegment", "useAttention", "useMenu", "PipelineComponent", "usePipelineBoardModel", "PIPELINE_ITEM", "PipelineContainer", "role", "subject", "pipeline", "attendableId", "registry", "AtomRegistry", "model", "invokePromise", "hasAttention", "handleColumnAdd", "UpdateCompanion", "Root", "Item", "PipelineItem", "onAddColumn", "Toolbar", "asChild", "disabled", "Content", "Columns", "item", "projectionModel", "menu", "items", "addMenuItems", "id", "mode", "priority", "removeMenuItems", "type", "Card", "data", "projection", "limit"]
|
|
7
|
-
}
|
|
@@ -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 { DXN, Filter, JsonSchema, Obj, Query, type QueryAST, Ref, Tag } from '@dxos/echo';\nimport { type JsonPath, type Mutable } from '@dxos/echo/internal';\nimport { getSpace, 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, subtleHover } 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 space = getSpace(pipeline);\n const [expandedId, setExpandedId] = useState<string>();\n const [columns, updateColumns] = useObject(pipeline, 'columns');\n const column = useMemo(\n () => columns.find((column) => column.view.dxn.toString() === expandedId),\n [columns, expandedId],\n );\n const [view, updateView] = useObject(column?.view);\n const [schema, setSchema] = useState<Schema.Schema.AnyNoContext>(() => Schema.Struct({}));\n const projectionRef = useRef<ProjectionModel>(null);\n const tags = useQuery(space?.db, Filter.type(Tag.Tag));\n const types = useTypeOptions({\n space,\n annotation: {\n location: ['database', 'runtime'],\n kind: ['user'],\n },\n });\n\n useAsyncEffect(async () => {\n if (!view?.query || !space) {\n return;\n }\n\n const foundSchema = await resolveSchemaWithRegistry(space.db.schemaRegistry, view.query.ast);\n if (foundSchema && foundSchema !== schema) {\n setSchema(() => foundSchema);\n }\n }, [space, view, schema]);\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?: string) => {\n if (!view || !space) {\n return;\n }\n\n const queue = target && DXN.tryParse(target) ? target : undefined;\n const query = queue ? Query.fromAst(newQuery).from({ queues: [queue] }) : Query.fromAst(newQuery);\n updateView((view) => {\n view.query.ast = query.ast as Mutable<typeof query.ast>;\n });\n const newSchema = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);\n if (!newSchema) {\n return;\n }\n\n const newView = ViewModel.make({\n query,\n jsonSchema: JsonSchema.toJsonSchema(newSchema),\n });\n updateView((view) => {\n view.projection = Obj.getSnapshot(newView).projection as Mutable<typeof view.projection>;\n });\n\n setSchema(() => newSchema);\n },\n [view, updateView, schema],\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) =>\n prevExpandedId === column.view.dxn.toString() ? undefined : column.view.dxn.toString(),\n );\n }, []);\n\n const handleDelete = useCallback(\n async (column: Pipeline.Column) => {\n if (column.view.dxn.toString() === 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 space?.db.remove(viewToRemove);\n },\n [expandedId, columns, updateColumns, space],\n );\n\n const handleAdd = useCallback(() => {\n if (!space) {\n return;\n }\n const newView = ViewModel.make({\n query: Query.select(Filter.nothing()),\n jsonSchema: JsonSchema.toJsonSchema(Schema.Struct({})),\n });\n space.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 }, [space, 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.dxn.toString()}\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.dxn.toString()}\n item={column}\n classNames={listItemGrid}\n aria-expanded={expandedId === column.view.dxn.toString()}\n >\n <div className={mx(subtleHover, listItemGrid, '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={\n expandedId === column.view.dxn.toString()\n ? 'ph--caret-down--regular'\n : 'ph--caret-right--regular'\n }\n onClick={() => handleToggleField(column)}\n />\n </div>\n {expandedId === column.view.dxn.toString() && 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 <ViewEditor\n ref={projectionRef}\n mode='tag'\n readonly\n schema={schema}\n view={column.view.target}\n registry={space?.db.schemaRegistry}\n db={space?.db}\n tags={tags}\n types={types}\n onQueryChanged={handleQueryChanged}\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", "DXN", "Filter", "JsonSchema", "Obj", "Query", "Ref", "Tag", "getSpace", "useObject", "useQuery", "IconButton", "useAsyncEffect", "useTranslation", "Form", "ViewEditor", "List", "ViewModel", "Pipeline", "mx", "osTranslations", "subtleHover", "arrayMove", "meta", "listGrid", "listItemGrid", "ColumnFormSchema", "Column", "pipe", "mutable", "pick", "PipelineProperties", "classNames", "pipeline", "t", "id", "space", "expandedId", "setExpandedId", "columns", "updateColumns", "column", "find", "view", "dxn", "toString", "updateView", "schema", "setSchema", "Struct", "projectionRef", "tags", "db", "type", "types", "annotation", "location", "kind", "query", "foundSchema", "schemaRegistry", "ast", "handleMove", "fromIndex", "toIndex", "handleQueryChanged", "newQuery", "target", "queue", "tryParse", "undefined", "fromAst", "from", "queues", "newSchema", "newView", "make", "jsonSchema", "toJsonSchema", "projection", "getSnapshot", "handleColumnValuesChanged", "newValues", "changed", "columnIndex", "findIndex", "c", "cols", "name", "handleToggleField", "prevExpandedId", "handleDelete", "index", "l", "viewToRemove", "load", "splice", "remove", "handleAdd", "select", "nothing", "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", "values", "onValuesChanged", "Content", "FieldSet", "ref", "mode", "readonly", "registry", "onQueryChanged"]
|
|
7
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// src/meta.ts
|
|
2
|
-
import { trim } from "@dxos/util";
|
|
3
|
-
var meta = {
|
|
4
|
-
id: "org.dxos.plugin.pipeline",
|
|
5
|
-
name: "Pipelines",
|
|
6
|
-
description: trim`
|
|
7
|
-
Pipelines for organizing tasks, milestones, and deliverables.
|
|
8
|
-
Track progress across multiple pipelines and coordinate team activities in a structured environment.
|
|
9
|
-
`,
|
|
10
|
-
icon: "ph--path--regular",
|
|
11
|
-
iconHue: "purple",
|
|
12
|
-
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline",
|
|
13
|
-
tags: [
|
|
14
|
-
"labs"
|
|
15
|
-
]
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export {
|
|
19
|
-
meta
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=chunk-ULB5DKWO.mjs.map
|
|
@@ -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 description: trim`\n Pipelines for organizing tasks, milestones, and deliverables.\n Track progress across multiple pipelines and coordinate team activities in a structured environment.\n `,\n icon: 'ph--path--regular',\n iconHue: 'purple',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline',\n tags: ['labs'],\n};\n"],
|
|
5
|
-
"mappings": ";AAKA,SAASA,YAAY;AAEd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaJ;;;;EAIbK,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,MAAM;IAAC;;AACT;",
|
|
6
|
-
"names": ["trim", "meta", "id", "name", "description", "icon", "iconHue", "source", "tags"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/create-object.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { Pipeline } from '@dxos/types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Pipeline.Pipeline.typename,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Pipeline.make(props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n hidden: true,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
|
|
5
|
-
"mappings": ";AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAClC,SAASC,gBAAgB;AAEzB,IAAA,wBAAeJ,WAAWK,WACjBC,kBAAW,aAAA;AAChB,SAAON,WAAWO,YAAYJ,kBAAkBK,mBAAmB;IACjEC,IAAIL,SAASA,SAASM;IACtBC,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAMC,SAASX,SAASY,KAAKJ,KAAAA;AAC7B,aAAO,OAAOX,UAAUgB,OAAOf,eAAegB,WAAW;QACvDH;QACAI,QAAQN,QAAQM;QAChBC,QAAQ;QACRC,cAAcR,QAAQQ;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Operation", "SpaceOperation", "SpaceCapabilities", "Pipeline", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "typename", "createObject", "props", "options", "gen", "object", "make", "invoke", "AddObject", "target", "hidden", "targetNodeId"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/react-surface.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport React from 'react';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { InvocationTraceContainer } from '@dxos/devtools';\nimport { Obj } from '@dxos/echo';\nimport { Panel } from '@dxos/react-ui';\nimport { Pipeline } from '@dxos/types';\n\nimport { PipelineContainer, PipelineProperties } from '#containers';\n\nexport default Capability.makeModule(() =>\n Effect.succeed(\n Capability.contributes(Capabilities.ReactSurface, [\n Surface.create({\n id: 'root',\n filter: AppSurface.object(AppSurface.Article, Pipeline.Pipeline),\n component: ({ data, role }) => (\n <PipelineContainer role={role} subject={data.subject} attendableId={data.attendableId} />\n ),\n }),\n Surface.create({\n id: 'companion.invocations',\n filter: AppSurface.allOf(\n AppSurface.literal(AppSurface.Article, 'invocations'),\n AppSurface.companion(AppSurface.Article, Pipeline.Pipeline),\n ),\n component: ({ data, role }) => {\n const db = Obj.getDatabase(data.companionTo);\n // TODO(wittjosiah): Filter the invocations to those relevant to the project.\n return (\n <Panel.Root role={role} className='dx-document'>\n <Panel.Content asChild>\n <InvocationTraceContainer db={db} detailAxis='block' />\n </Panel.Content>\n </Panel.Root>\n );\n },\n }),\n Surface.create({\n id: 'object-properties',\n filter: AppSurface.object(AppSurface.ObjectProperties, Pipeline.Pipeline),\n component: ({ data }) => <PipelineProperties pipeline={data.subject} />,\n }),\n ]),\n ),\n);\n"],
|
|
5
|
-
"mappings": ";AAIA,YAAYA,YAAY;AACxB,OAAOC,WAAW;AAElB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,eAAe;AACxB,SAASC,kBAAkB;AAC3B,SAASC,gCAAgC;AACzC,SAASC,WAAW;AACpB,SAASC,aAAa;AACtB,SAASC,gBAAgB;AAEzB,SAASC,mBAAmBC,0BAA0B;AAEtD,IAAA,wBAAeR,WAAWS,WAAW,MAC5BC,eACLV,WAAWW,YAAYZ,aAAaa,cAAc;EAChDX,QAAQY,OAAO;IACbC,IAAI;IACJC,QAAQb,WAAWc,OAAOd,WAAWe,SAASX,SAASA,QAAQ;IAC/DY,WAAW,CAAC,EAAEC,MAAMC,KAAI,MACtB,sBAAA,cAACb,mBAAAA;MAAkBa;MAAYC,SAASF,KAAKE;MAASC,cAAcH,KAAKG;;EAE7E,CAAA;EACArB,QAAQY,OAAO;IACbC,IAAI;IACJC,QAAQb,WAAWqB,MACjBrB,WAAWsB,QAAQtB,WAAWe,SAAS,aAAA,GACvCf,WAAWuB,UAAUvB,WAAWe,SAASX,SAASA,QAAQ,CAAA;IAE5DY,WAAW,CAAC,EAAEC,MAAMC,KAAI,MAAE;AACxB,YAAMM,KAAKtB,IAAIuB,YAAYR,KAAKS,WAAW;AAE3C,aACE,sBAAA,cAACvB,MAAMwB,MAAI;QAACT;QAAYU,WAAU;SAChC,sBAAA,cAACzB,MAAM0B,SAAO;QAACC,SAAAA;SACb,sBAAA,cAAC7B,0BAAAA;QAAyBuB;QAAQO,YAAW;;IAIrD;EACF,CAAA;EACAhC,QAAQY,OAAO;IACbC,IAAI;IACJC,QAAQb,WAAWc,OAAOd,WAAWgC,kBAAkB5B,SAASA,QAAQ;IACxEY,WAAW,CAAC,EAAEC,KAAI,MAAO,sBAAA,cAACX,oBAAAA;MAAmB2B,UAAUhB,KAAKE;;EAC9D,CAAA;CACD,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "React", "Capabilities", "Capability", "Surface", "AppSurface", "InvocationTraceContainer", "Obj", "Panel", "Pipeline", "PipelineContainer", "PipelineProperties", "makeModule", "succeed", "contributes", "ReactSurface", "create", "id", "filter", "object", "Article", "component", "data", "role", "subject", "attendableId", "allOf", "literal", "companion", "db", "getDatabase", "companionTo", "Root", "className", "Content", "asChild", "detailAxis", "ObjectProperties", "pipeline"]
|
|
7
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { AppSurface } from '@dxos/app-toolkit/ui';
|
|
3
|
-
import { type Pipeline } from '@dxos/types';
|
|
4
|
-
export type PipelineContainerProps = AppSurface.ObjectArticleProps<Pipeline.Pipeline>;
|
|
5
|
-
export declare const PipelineContainer: ({ role, subject: pipeline, attendableId }: PipelineContainerProps) => React.JSX.Element;
|
|
6
|
-
//# sourceMappingURL=PipelineContainer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineContainer.d.ts","sourceRoot":"","sources":["../../../../../src/containers/PipelineContainer/PipelineContainer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAKtD,OAAO,EACL,UAAU,EAIX,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAEtF,eAAO,MAAM,iBAAiB,8CAA+C,sBAAsB,sBA4BlG,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineContainer.stories.d.ts","sourceRoot":"","sources":["../../../../../src/containers/PipelineContainer/PipelineContainer.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjE,OAAO,KAAK,MAAM,OAAO,CAAC;AA4C1B,QAAA,MAAM,IAAI;;;;;QAyKN,MAAM;QACN,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAE0B,CAAC;eAE5B,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/containers/PipelineContainer/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAC"}
|