@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
package/dist/lib/neutral/{PipelineProperties-RRPQ3V6I.mjs → PipelineProperties-JXY3AVOY.mjs}
RENAMED
|
@@ -3,14 +3,14 @@ import * as Schema from "effect/Schema";
|
|
|
3
3
|
import React, { useCallback, useMemo, useRef, useState } from "react";
|
|
4
4
|
import { resolveSchemaWithRegistry } from "@dxos/app-toolkit/query";
|
|
5
5
|
import { useTypeOptions } from "@dxos/app-toolkit/ui";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { EID, Filter, JsonSchema, Obj, Query, Ref, Scope, Tag } from "@dxos/echo";
|
|
7
|
+
import { useObject, useQuery } from "@dxos/react-client/echo";
|
|
8
8
|
import { IconButton, useAsyncEffect, useTranslation } from "@dxos/react-ui";
|
|
9
9
|
import { Form, ViewEditor } from "@dxos/react-ui-form";
|
|
10
10
|
import { List } from "@dxos/react-ui-list";
|
|
11
11
|
import { ViewModel } from "@dxos/schema";
|
|
12
12
|
import { Pipeline } from "@dxos/types";
|
|
13
|
-
import { mx, osTranslations
|
|
13
|
+
import { mx, osTranslations } from "@dxos/ui-theme";
|
|
14
14
|
import { arrayMove } from "@dxos/util";
|
|
15
15
|
import { meta } from "#meta";
|
|
16
16
|
var listGrid = "grid grid-cols-[min-content_1fr_min-content_min-content_min-content]";
|
|
@@ -18,19 +18,19 @@ var listItemGrid = "grid grid-cols-subgrid col-span-5";
|
|
|
18
18
|
var ColumnFormSchema = Pipeline.Column.pipe(Schema.mutable, Schema.pick("name"));
|
|
19
19
|
var PipelineProperties = ({ classNames, pipeline }) => {
|
|
20
20
|
const { t } = useTranslation(meta.id);
|
|
21
|
-
const
|
|
21
|
+
const db = Obj.getDatabase(pipeline);
|
|
22
22
|
const [expandedId, setExpandedId] = useState();
|
|
23
23
|
const [columns, updateColumns] = useObject(pipeline, "columns");
|
|
24
|
-
const column = useMemo(() => columns.find((column2) => column2.view.
|
|
24
|
+
const column = useMemo(() => columns.find((column2) => column2.view.uri === expandedId), [
|
|
25
25
|
columns,
|
|
26
26
|
expandedId
|
|
27
27
|
]);
|
|
28
28
|
const [view, updateView] = useObject(column?.view);
|
|
29
|
-
const [
|
|
29
|
+
const [type, setType] = useState();
|
|
30
30
|
const projectionRef = useRef(null);
|
|
31
|
-
const tags = useQuery(
|
|
31
|
+
const tags = useQuery(db, Filter.type(Tag.Tag));
|
|
32
32
|
const types = useTypeOptions({
|
|
33
|
-
|
|
33
|
+
db,
|
|
34
34
|
annotation: {
|
|
35
35
|
location: [
|
|
36
36
|
"database",
|
|
@@ -42,17 +42,17 @@ var PipelineProperties = ({ classNames, pipeline }) => {
|
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
44
|
useAsyncEffect(async () => {
|
|
45
|
-
if (!view?.query || !
|
|
45
|
+
if (!view?.query || !db) {
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
50
|
-
|
|
48
|
+
const foundType = await resolveSchemaWithRegistry(db, view.query.ast);
|
|
49
|
+
if (foundType && foundType !== type) {
|
|
50
|
+
setType(() => foundType);
|
|
51
51
|
}
|
|
52
52
|
}, [
|
|
53
|
-
|
|
53
|
+
db,
|
|
54
54
|
view,
|
|
55
|
-
|
|
55
|
+
type
|
|
56
56
|
]);
|
|
57
57
|
const handleMove = useCallback((fromIndex, toIndex) => updateColumns((columns2) => {
|
|
58
58
|
arrayMove(columns2, fromIndex, toIndex);
|
|
@@ -60,34 +60,33 @@ var PipelineProperties = ({ classNames, pipeline }) => {
|
|
|
60
60
|
updateColumns
|
|
61
61
|
]);
|
|
62
62
|
const handleQueryChanged = useCallback(async (newQuery, target) => {
|
|
63
|
-
if (!view || !
|
|
63
|
+
if (!view || !db) {
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
|
-
const queue = target
|
|
67
|
-
const query = queue ? Query.fromAst(newQuery).from(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
]
|
|
71
|
-
}) : Query.fromAst(newQuery);
|
|
66
|
+
const queue = target;
|
|
67
|
+
const query = queue ? Query.fromAst(newQuery).from([
|
|
68
|
+
Scope.feed(`dxn:queue:data:${EID.getSpaceId(queue)}:${EID.getEntityId(queue)}`)
|
|
69
|
+
]) : Query.fromAst(newQuery);
|
|
72
70
|
updateView((view2) => {
|
|
73
71
|
view2.query.ast = query.ast;
|
|
74
72
|
});
|
|
75
|
-
const
|
|
76
|
-
if (!
|
|
73
|
+
const newType = await resolveSchemaWithRegistry(db, query.ast);
|
|
74
|
+
if (!newType) {
|
|
77
75
|
return;
|
|
78
76
|
}
|
|
79
77
|
const newView = ViewModel.make({
|
|
80
78
|
query,
|
|
81
|
-
jsonSchema:
|
|
79
|
+
jsonSchema: newType.jsonSchema
|
|
82
80
|
});
|
|
83
81
|
updateView((view2) => {
|
|
84
82
|
view2.projection = Obj.getSnapshot(newView).projection;
|
|
85
83
|
});
|
|
86
|
-
|
|
84
|
+
setType(() => newType);
|
|
87
85
|
}, [
|
|
86
|
+
db,
|
|
88
87
|
view,
|
|
89
88
|
updateView,
|
|
90
|
-
|
|
89
|
+
type
|
|
91
90
|
]);
|
|
92
91
|
const handleColumnValuesChanged = useCallback((column2) => (newValues, { changed }) => {
|
|
93
92
|
if (changed["name"]) {
|
|
@@ -104,10 +103,10 @@ var PipelineProperties = ({ classNames, pipeline }) => {
|
|
|
104
103
|
updateColumns
|
|
105
104
|
]);
|
|
106
105
|
const handleToggleField = useCallback((column2) => {
|
|
107
|
-
setExpandedId((prevExpandedId) => prevExpandedId === column2.view.
|
|
106
|
+
setExpandedId((prevExpandedId) => prevExpandedId === column2.view.uri ? void 0 : column2.view.uri);
|
|
108
107
|
}, []);
|
|
109
108
|
const handleDelete = useCallback(async (column2) => {
|
|
110
|
-
if (column2.view.
|
|
109
|
+
if (column2.view.uri === expandedId) {
|
|
111
110
|
setExpandedId(void 0);
|
|
112
111
|
}
|
|
113
112
|
const index = columns.findIndex((l) => l === column2);
|
|
@@ -115,22 +114,22 @@ var PipelineProperties = ({ classNames, pipeline }) => {
|
|
|
115
114
|
updateColumns((columns2) => {
|
|
116
115
|
columns2.splice(index, 1);
|
|
117
116
|
});
|
|
118
|
-
|
|
117
|
+
db?.remove(viewToRemove);
|
|
119
118
|
}, [
|
|
120
119
|
expandedId,
|
|
121
120
|
columns,
|
|
122
121
|
updateColumns,
|
|
123
|
-
|
|
122
|
+
db
|
|
124
123
|
]);
|
|
125
124
|
const handleAdd = useCallback(() => {
|
|
126
|
-
if (!
|
|
125
|
+
if (!db) {
|
|
127
126
|
return;
|
|
128
127
|
}
|
|
129
128
|
const newView = ViewModel.make({
|
|
130
129
|
query: Query.select(Filter.nothing()),
|
|
131
130
|
jsonSchema: JsonSchema.toJsonSchema(Schema.Struct({}))
|
|
132
131
|
});
|
|
133
|
-
|
|
132
|
+
db.add(newView);
|
|
134
133
|
updateColumns((columns2) => {
|
|
135
134
|
columns2.push({
|
|
136
135
|
name: "",
|
|
@@ -141,7 +140,7 @@ var PipelineProperties = ({ classNames, pipeline }) => {
|
|
|
141
140
|
});
|
|
142
141
|
setExpandedId(newView.id);
|
|
143
142
|
}, [
|
|
144
|
-
|
|
143
|
+
db,
|
|
145
144
|
updateColumns
|
|
146
145
|
]);
|
|
147
146
|
return /* @__PURE__ */ React.createElement("div", {
|
|
@@ -151,18 +150,18 @@ var PipelineProperties = ({ classNames, pipeline }) => {
|
|
|
151
150
|
}, t("views.label")), /* @__PURE__ */ React.createElement(List.Root, {
|
|
152
151
|
items: columns,
|
|
153
152
|
isItem: Schema.is(Pipeline.Column),
|
|
154
|
-
getId: (column2) => column2.view.
|
|
153
|
+
getId: (column2) => column2.view.uri,
|
|
155
154
|
onMove: handleMove
|
|
156
155
|
}, ({ items: columns2 }) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", {
|
|
157
156
|
role: "list",
|
|
158
157
|
className: mx(listGrid)
|
|
159
158
|
}, columns2.map((column2) => /* @__PURE__ */ React.createElement(List.Item, {
|
|
160
|
-
key: column2.view.
|
|
159
|
+
key: column2.view.uri,
|
|
161
160
|
item: column2,
|
|
162
161
|
classNames: listItemGrid,
|
|
163
|
-
"aria-expanded": expandedId === column2.view.
|
|
162
|
+
"aria-expanded": expandedId === column2.view.uri
|
|
164
163
|
}, /* @__PURE__ */ React.createElement("div", {
|
|
165
|
-
className: mx(
|
|
164
|
+
className: mx(listItemGrid, "dx-hover rounded-xs cursor-pointer min-h-10")
|
|
166
165
|
}, /* @__PURE__ */ React.createElement(List.ItemDragHandle, null), /* @__PURE__ */ React.createElement(List.ItemTitle, {
|
|
167
166
|
onClick: () => handleToggleField(column2)
|
|
168
167
|
}, column2.name || t("untitled-view.title")), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
|
|
@@ -176,22 +175,22 @@ var PipelineProperties = ({ classNames, pipeline }) => {
|
|
|
176
175
|
label: t("toggle-expand.label", {
|
|
177
176
|
ns: osTranslations
|
|
178
177
|
}),
|
|
179
|
-
icon: expandedId === column2.view.
|
|
178
|
+
icon: expandedId === column2.view.uri ? "ph--caret-down--regular" : "ph--caret-right--regular",
|
|
180
179
|
onClick: () => handleToggleField(column2)
|
|
181
|
-
})), expandedId === column2.view.
|
|
180
|
+
})), expandedId === column2.view.uri && column2?.view.target && /* @__PURE__ */ React.createElement("div", {
|
|
182
181
|
className: "col-span-5 my-2 border border-separator rounded-md"
|
|
183
182
|
}, /* @__PURE__ */ React.createElement(Form.Root, {
|
|
184
183
|
schema: ColumnFormSchema,
|
|
185
184
|
values: column2,
|
|
186
185
|
onValuesChanged: handleColumnValuesChanged(column2)
|
|
187
|
-
}, /* @__PURE__ */ React.createElement(Form.Content, null, /* @__PURE__ */ React.createElement(Form.FieldSet, null))), /* @__PURE__ */ React.createElement(ViewEditor, {
|
|
186
|
+
}, /* @__PURE__ */ React.createElement(Form.Content, null, /* @__PURE__ */ React.createElement(Form.FieldSet, null))), type && /* @__PURE__ */ React.createElement(ViewEditor, {
|
|
188
187
|
ref: projectionRef,
|
|
189
188
|
mode: "tag",
|
|
190
189
|
readonly: true,
|
|
191
|
-
|
|
190
|
+
type,
|
|
192
191
|
view: column2.view.target,
|
|
193
|
-
registry:
|
|
194
|
-
db
|
|
192
|
+
registry: db?.graph.registry,
|
|
193
|
+
db,
|
|
195
194
|
tags,
|
|
196
195
|
types,
|
|
197
196
|
onQueryChanged: handleQueryChanged
|
|
@@ -207,4 +206,4 @@ var PipelineProperties = ({ classNames, pipeline }) => {
|
|
|
207
206
|
export {
|
|
208
207
|
PipelineProperties as default
|
|
209
208
|
};
|
|
210
|
-
//# sourceMappingURL=PipelineProperties-
|
|
209
|
+
//# sourceMappingURL=PipelineProperties-JXY3AVOY.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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 { EID, Filter, JsonSchema, Obj, Query, type QueryAST, Ref, Scope, 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, 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?: EID.EID) => {\n if (!view || !db) {\n return;\n }\n\n const queue = target;\n const query = queue\n ? Query.fromAst(newQuery).from([\n Scope.feed(`dxn:queue:data:${EID.getSpaceId(queue)}:${EID.getEntityId(queue)}`),\n ])\n : Query.fromAst(newQuery);\n updateView((view) => {\n view.query.ast = query.ast as Mutable<typeof query.ast>;\n });\n const newType = await resolveSchemaWithRegistry(db, 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?.graph.registry}\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", "EID", "Filter", "JsonSchema", "Obj", "Query", "Ref", "Scope", "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", "ast", "handleMove", "fromIndex", "toIndex", "handleQueryChanged", "newQuery", "target", "queue", "fromAst", "from", "feed", "getSpaceId", "getEntityId", "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", "graph", "onQueryChanged"]
|
|
7
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/capabilities/index.ts
|
|
2
2
|
import { Capability } from "@dxos/app-framework";
|
|
3
3
|
var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../app-graph-builder-ZLGRWRJU.mjs"));
|
|
4
|
-
var CreateObject = Capability.lazy("CreateObject", () => import("../create-object-
|
|
5
|
-
var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-
|
|
4
|
+
var CreateObject = Capability.lazy("CreateObject", () => import("../create-object-6Z4MMGX4.mjs"));
|
|
5
|
+
var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-QG7QSZSS.mjs"));
|
|
6
6
|
export {
|
|
7
7
|
AppGraphBuilder,
|
|
8
8
|
CreateObject,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/meta.ts
|
|
2
|
+
import { Plugin } from "@dxos/app-framework";
|
|
3
|
+
import { DXN } from "@dxos/keys";
|
|
4
|
+
import { trim } from "@dxos/util";
|
|
5
|
+
var meta = Plugin.makeMeta({
|
|
6
|
+
key: DXN.make("org.dxos.plugin.pipeline"),
|
|
7
|
+
name: "Pipelines",
|
|
8
|
+
author: "DXOS",
|
|
9
|
+
description: trim`
|
|
10
|
+
A multi-column Kanban-style pipeline plugin for DXOS Composer.
|
|
11
|
+
Each Pipeline holds an ordered set of Columns; each Column is backed by a ViewModel whose query
|
|
12
|
+
can select any ECHO object type — messages, contacts, documents, or custom types — from the active space.
|
|
13
|
+
|
|
14
|
+
Columns are fully configurable through the Settings companion panel, where users can add, rename,
|
|
15
|
+
reorder, and delete columns and edit the underlying query and projection for each column.
|
|
16
|
+
Objects can be dragged between columns and the full pipeline state, including column order and
|
|
17
|
+
per-column item order, persists collaboratively via ECHO.
|
|
18
|
+
|
|
19
|
+
A built-in Research template scaffolds a four-column pipeline wired to the Mailbox, Contacts,
|
|
20
|
+
Organizations, and Notes objects in the space, providing an out-of-the-box CRM-style workflow.
|
|
21
|
+
Pipeline articles also expose Invocations and Automation companion tabs for AI-driven automation.
|
|
22
|
+
`,
|
|
23
|
+
icon: "ph--path--regular",
|
|
24
|
+
iconHue: "purple",
|
|
25
|
+
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline",
|
|
26
|
+
spec: "PLUGIN.mdl",
|
|
27
|
+
tags: [
|
|
28
|
+
"labs"
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
meta
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=chunk-CYXDAAKN.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/meta.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { DXN } from '@dxos/keys';\nimport { trim } from '@dxos/util';\n\nexport const meta = Plugin.makeMeta({\n key: DXN.make('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": ";AAIA,SAASA,cAAc;AACvB,SAASC,WAAW;AACpB,SAASC,YAAY;AAEd,IAAMC,OAAOH,OAAOI,SAAS;EAClCC,KAAKJ,IAAIK,KAAK,0BAAA;EACdC,MAAM;EACNC,QAAQ;EACRC,aAAaP;;;;;;;;;;;;;;EAcbQ,MAAM;EACNC,SAAS;EACTC,QAAQ;EACRC,MAAM;EACNC,MAAM;IAAC;;AACT,CAAA;",
|
|
6
|
+
"names": ["Plugin", "DXN", "trim", "meta", "makeMeta", "key", "make", "name", "author", "description", "icon", "iconHue", "source", "spec", "tags"]
|
|
7
|
+
}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
// src/components/PipelineComponent/PipelineColumn.tsx
|
|
2
2
|
import { useComposedRefs } from "@radix-ui/react-compose-refs";
|
|
3
|
-
import * as Function from "effect/Function";
|
|
4
|
-
import * as Option from "effect/Option";
|
|
5
3
|
import React2, { forwardRef, useMemo, useRef, useState } from "react";
|
|
6
4
|
import { resolveSchemaWithRegistry } from "@dxos/app-toolkit/query";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { Filter, Obj as Obj2, Query, Type } from "@dxos/echo";
|
|
6
|
+
import { useObject } from "@dxos/react-client/echo";
|
|
9
7
|
import { Panel, Toolbar as Toolbar2, useAsyncEffect, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
10
8
|
import { Card } from "@dxos/react-ui";
|
|
11
9
|
import { Menu } from "@dxos/react-ui-menu";
|
|
@@ -20,8 +18,8 @@ import { Slot } from "@radix-ui/react-slot";
|
|
|
20
18
|
import React from "react";
|
|
21
19
|
import { Obj } from "@dxos/echo";
|
|
22
20
|
import { Toolbar, useTranslation } from "@dxos/react-ui";
|
|
21
|
+
import { composable, composableProps, slottable } from "@dxos/react-ui";
|
|
23
22
|
import { Board, useBoard, useEventHandlerAdapter } from "@dxos/react-ui-mosaic";
|
|
24
|
-
import { composable, composableProps, slottable } from "@dxos/ui-theme";
|
|
25
23
|
import { meta } from "#meta";
|
|
26
24
|
var itemNoOp = ({ item }) => /* @__PURE__ */ React.createElement("span", null, item.id);
|
|
27
25
|
var PIPELINE_ROOT = "Pipeline.Root";
|
|
@@ -92,9 +90,9 @@ var PipelineColumn = ({ data: column, location, classNames, debug }) => {
|
|
|
92
90
|
const [dragHandle, setDragHandle] = useState(null);
|
|
93
91
|
const [viewSnapshot] = useObject(column.view);
|
|
94
92
|
const view = column.view.target;
|
|
95
|
-
const
|
|
93
|
+
const db = view && Obj2.getDatabase(view);
|
|
96
94
|
const { Item } = usePipeline(PIPELINE_COLUMN_NAME);
|
|
97
|
-
const [
|
|
95
|
+
const [type, setType] = useState();
|
|
98
96
|
const query = useMemo(() => {
|
|
99
97
|
if (!view) {
|
|
100
98
|
return Query.select(Filter.nothing());
|
|
@@ -105,28 +103,27 @@ var PipelineColumn = ({ data: column, location, classNames, debug }) => {
|
|
|
105
103
|
JSON.stringify(viewSnapshot?.query.ast)
|
|
106
104
|
]);
|
|
107
105
|
useAsyncEffect(async () => {
|
|
108
|
-
if (!query || !
|
|
106
|
+
if (!query || !db) {
|
|
109
107
|
return;
|
|
110
108
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
109
|
+
const type2 = await resolveSchemaWithRegistry(db, query.ast);
|
|
110
|
+
setType(() => type2);
|
|
113
111
|
}, [
|
|
114
|
-
|
|
112
|
+
db,
|
|
115
113
|
query
|
|
116
114
|
]);
|
|
117
115
|
const projectionModel = useMemo(() => {
|
|
118
|
-
if (!
|
|
116
|
+
if (!type || !view) {
|
|
119
117
|
return void 0;
|
|
120
118
|
}
|
|
121
|
-
const
|
|
122
|
-
const change = createEchoChangeCallback(view, Type.isMutable(schema) ? schema : void 0);
|
|
119
|
+
const change = createEchoChangeCallback(view, Type.getDatabase(type) != null ? type : void 0);
|
|
123
120
|
return new ProjectionModel({
|
|
124
121
|
view,
|
|
125
|
-
baseSchema: jsonSchema,
|
|
122
|
+
baseSchema: type.jsonSchema,
|
|
126
123
|
change
|
|
127
124
|
});
|
|
128
125
|
}, [
|
|
129
|
-
|
|
126
|
+
type,
|
|
130
127
|
view
|
|
131
128
|
]);
|
|
132
129
|
const PipelineTile = useMemo(() => {
|
|
@@ -171,7 +168,7 @@ var ItemTile = /* @__PURE__ */ forwardRef(({ classNames, data, location, debug,
|
|
|
171
168
|
const rootRef = useRef(null);
|
|
172
169
|
const composedRef = useComposedRefs(rootRef, forwardedRef);
|
|
173
170
|
const { Item } = usePipeline(ITEM_TILE_NAME);
|
|
174
|
-
const icon =
|
|
171
|
+
const icon = Obj2.getIcon(data)?.icon ?? "ph--circle-dashed--regular";
|
|
175
172
|
return /* @__PURE__ */ React2.createElement(Menu.Root, null, /* @__PURE__ */ React2.createElement(Mosaic.Tile, {
|
|
176
173
|
asChild: true,
|
|
177
174
|
id: data.id,
|
|
@@ -183,18 +180,18 @@ var ItemTile = /* @__PURE__ */ forwardRef(({ classNames, data, location, debug,
|
|
|
183
180
|
}, /* @__PURE__ */ React2.createElement(Card.Root, {
|
|
184
181
|
classNames,
|
|
185
182
|
ref: composedRef
|
|
186
|
-
}, /* @__PURE__ */ React2.createElement(Card.
|
|
183
|
+
}, /* @__PURE__ */ React2.createElement(Card.Header, null, /* @__PURE__ */ React2.createElement(Card.Icon, {
|
|
187
184
|
icon
|
|
188
|
-
}), /* @__PURE__ */ React2.createElement(Card.Title, null, Obj2.getLabel(data
|
|
189
|
-
|
|
190
|
-
}, /* @__PURE__ */ React2.createElement(Menu.Trigger, {
|
|
185
|
+
}), /* @__PURE__ */ React2.createElement(Card.Title, null, Obj2.getLabel(data, {
|
|
186
|
+
fallback: "typename"
|
|
187
|
+
})), /* @__PURE__ */ React2.createElement(Card.IconBlock, null, /* @__PURE__ */ React2.createElement(Menu.Trigger, {
|
|
191
188
|
asChild: true
|
|
192
189
|
}, /* @__PURE__ */ React2.createElement(Toolbar2.IconButton, {
|
|
193
190
|
iconOnly: true,
|
|
194
191
|
variant: "ghost",
|
|
195
192
|
icon: "ph--dots-three-vertical--regular",
|
|
196
193
|
label: "Actions"
|
|
197
|
-
})), /* @__PURE__ */ React2.createElement(Menu.Content, null))), /* @__PURE__ */ React2.createElement(Card.
|
|
194
|
+
})), /* @__PURE__ */ React2.createElement(Menu.Content, null))), /* @__PURE__ */ React2.createElement(Card.Body, null, /* @__PURE__ */ React2.createElement(Item, itemProps))))));
|
|
198
195
|
});
|
|
199
196
|
ItemTile.displayName = ITEM_TILE_NAME;
|
|
200
197
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/PipelineComponent/PipelineColumn.tsx", "../../../../src/components/PipelineComponent/PipelineComponent.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport * as Function from 'effect/Function';\nimport * as Option from 'effect/Option';\nimport type * as Schema from 'effect/Schema';\nimport React, { forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';\nimport { Annotation, JsonSchema, Obj, Query, Type } from '@dxos/echo';\nimport { Filter, getSpace, useObject } from '@dxos/react-client/echo';\nimport { Panel, Toolbar, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\nimport { Menu } from '@dxos/react-ui-menu';\nimport { Board, Focus, Mosaic, type MosaicTileProps } from '@dxos/react-ui-mosaic';\nimport { ProjectionModel, createEchoChangeCallback } from '@dxos/schema';\nimport { type Pipeline } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nimport { type ItemProps, usePipeline } from './PipelineComponent';\n\n//\n// PipelineColumn\n//\n\nconst PIPELINE_COLUMN_NAME = 'PipelineColumn';\n\nexport type PipelineColumnProps = Pick<MosaicTileProps<Pipeline.Column>, 'classNames' | 'location' | 'data' | 'debug'>;\n\n// TODO(wittjosiah): Support item DnD reordering (ordering needs to be stored on the view presentation collection).\nexport const PipelineColumn = ({ data: column, location, classNames, debug }: PipelineColumnProps) => {\n const { t } = useTranslation(meta.id);\n const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);\n // Subscribe to the view target for reactivity.\n const [viewSnapshot] = useObject(column.view);\n const view = column.view.target;\n const space = getSpace(view);\n const { Item } = usePipeline(PIPELINE_COLUMN_NAME);\n const [schema, setSchema] = useState<Schema.Schema.AnyNoContext>();\n const query = useMemo(() => {\n if (!view) {\n return Query.select(Filter.nothing());\n } else {\n // NOTE: Snapshot is required to prevent signal read in prohibited scope.\n // TODO(wittjosiah): Without stringify, filter.filters remains a proxied array.\n return Query.fromAst(JSON.parse(JSON.stringify(viewSnapshot?.query.ast)));\n }\n }, [JSON.stringify(viewSnapshot?.query.ast)]);\n\n useAsyncEffect(async () => {\n if (!query || !space?.db) {\n return;\n }\n\n const schema = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);\n setSchema(() => schema);\n }, [space, query]);\n\n const projectionModel = useMemo(() => {\n if (!schema || !view) {\n return undefined;\n }\n\n // For mutable schemas (EchoSchema), use the live jsonSchema reference for reactivity.\n const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : JsonSchema.toJsonSchema(schema);\n const change = createEchoChangeCallback(view, Type.isMutable(schema) ? schema : undefined);\n return new ProjectionModel({ view, baseSchema: jsonSchema, change });\n }, [schema, view]);\n\n const PipelineTile = useMemo(() => {\n return forwardRef<HTMLDivElement, Pick<MosaicTileProps<Obj.Unknown>, 'classNames' | 'location' | 'data' | 'debug'>>(\n (props, ref) => <ItemTile {...props} itemProps={{ item: props.data, projectionModel }} ref={ref} />,\n );\n }, [projectionModel]);\n\n if (!view) {\n return null;\n }\n\n return (\n <Panel.Root asChild>\n <Board.Column.Root\n debug={debug}\n data={column}\n location={location}\n classNames={classNames}\n dragHandle={dragHandle}\n >\n <Panel.Toolbar asChild>\n <Board.Column.Header\n classNames='_opacity-10'\n label={column.name || t('untitled-view.title')}\n dragHandleRef={setDragHandle}\n />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Board.Column.Body data={column} Tile={PipelineTile} />\n </Panel.Content>\n </Board.Column.Root>\n </Panel.Root>\n );\n};\n\nPipelineColumn.displayName = PIPELINE_COLUMN_NAME;\n\n//\n// ItemTile\n//\n\nconst ITEM_TILE_NAME = 'ItemTile';\n\ntype ItemTileProps = Pick<MosaicTileProps<Obj.Unknown>, 'classNames' | 'location' | 'data' | 'debug'> & {\n itemProps: ItemProps;\n};\n\nconst ItemTile = forwardRef<HTMLDivElement, ItemTileProps>(\n ({ classNames, data, location, debug, itemProps }, forwardedRef) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const { Item } = usePipeline(ITEM_TILE_NAME);\n const icon = Function.pipe(\n Obj.getSchema(data),\n Option.fromNullable,\n Option.flatMap(Annotation.IconAnnotation.get),\n Option.map(({ icon }) => icon),\n Option.getOrElse(() => 'ph--placeholder--regular'),\n );\n\n return (\n <Menu.Root>\n <Mosaic.Tile asChild id={data.id} data={data} location={location} debug={debug}>\n <Focus.Item asChild>\n <Card.Root classNames={classNames} ref={composedRef}>\n <Card.Toolbar>\n <Card.Icon icon={icon} />\n <Card.Title>{Obj.getLabel(data)}</Card.Title>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Card.IconBlock padding>\n <Menu.Trigger asChild>\n <Toolbar.IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label='Actions'\n />\n </Menu.Trigger>\n <Menu.Content />\n </Card.IconBlock>\n </Card.Toolbar>\n <Card.Content>\n <Item {...itemProps} />\n </Card.Content>\n </Card.Root>\n </Focus.Item>\n </Mosaic.Tile>\n </Menu.Root>\n );\n },\n);\n\nItemTile.displayName = ITEM_TILE_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type FC, type PropsWithChildren } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { Toolbar, type ToolbarRootProps, useTranslation } from '@dxos/react-ui';\nimport { Board, type BoardModel, useBoard, useEventHandlerAdapter } from '@dxos/react-ui-mosaic';\nimport { type ProjectionModel } from '@dxos/schema';\nimport { type Pipeline } from '@dxos/types';\nimport { composable, composableProps, slottable } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { PipelineColumn } from './PipelineColumn';\n\ntype ItemProps = {\n item: Obj.Unknown;\n projectionModel?: ProjectionModel;\n};\n\nconst itemNoOp = ({ item }: ItemProps) => <span>{item.id}</span>;\n\n//\n// Root\n//\n\ntype PipelineContextValue = {\n Item: FC<ItemProps>;\n // TODO(wittjosiah): Support adding items.\n // If the created item doesn't match the current query, it will not be visible.\n // TODO(wittjosiah): onAddItem?: (schema: Schema.Schema.AnyNoContext) => void;\n onAddColumn?: () => void;\n};\n\ntype PipelineRootProps = PropsWithChildren<PipelineContextValue>;\n\nconst PIPELINE_ROOT = 'Pipeline.Root';\n\nconst [PipelineRootContext, usePipeline] = createContext<PipelineContextValue>(PIPELINE_ROOT, {\n Item: itemNoOp,\n});\n\nconst PipelineRoot = ({ children, ...contextValue }: PipelineRootProps) => (\n <PipelineRootContext {...contextValue}>{children}</PipelineRootContext>\n);\n\nPipelineRoot.displayName = PIPELINE_ROOT;\n\n//\n// Content\n//\n\nconst PIPELINE_CONTENT_NAME = 'Pipeline.Content';\n\ntype PipelineContentProps = PropsWithChildren<{\n model: BoardModel<Pipeline.Column, Obj.Unknown>;\n}>;\n\nconst PipelineContent = slottable<HTMLDivElement, PipelineContentProps>(\n ({ asChild, model, children, ...props }, forwardedRef) => {\n const Comp = asChild ? Slot : 'div';\n return (\n <Board.Root model={model}>\n <Comp {...composableProps(props)} ref={forwardedRef}>\n {children}\n </Comp>\n </Board.Root>\n );\n },\n);\n\nPipelineContent.displayName = PIPELINE_CONTENT_NAME;\n\n//\n// Columns\n//\n\nconst PIPELINE_COLUMNS_NAME = 'Pipeline.Columns';\n\ntype PipelineColumnsProps = {\n pipeline: Pipeline.Pipeline;\n};\n\nconst PipelineColumns = composable<HTMLDivElement, PipelineColumnsProps>(({ pipeline, ...props }) => {\n const { model } = useBoard(PIPELINE_COLUMNS_NAME);\n const columns = useAtomValue(model.columns);\n const eventHandler = useEventHandlerAdapter<Pipeline.Column, Obj.Unknown>({\n id: pipeline.id,\n // TODO(wittjosiah): Cast because columns array is readonly.\n items: columns as any,\n getId: model.getColumnId,\n get: (data) => data as unknown as Obj.Unknown,\n make: (object) => object as unknown as Pipeline.Column,\n canDrop: ({ source }) => model.isColumn(source.data),\n onChange: (mutate) => Obj.update(pipeline, (pipeline) => mutate(pipeline.columns)),\n });\n\n return <Board.Content {...props} id='pipeline' eventHandler={eventHandler} Tile={PipelineColumn} />;\n});\n\nPipelineColumns.displayName = PIPELINE_COLUMNS_NAME;\n\n//\n// Toolbar\n//\n\nconst PIPELINE_TOOLBAR_NAME = 'Pipeline.Toolbar';\n\nexport const PipelineToolbar = composable<HTMLDivElement, ToolbarRootProps>(({ children, ...props }, forwardedRef) => {\n const { t } = useTranslation(meta.id);\n const { onAddColumn } = usePipeline(PIPELINE_TOOLBAR_NAME);\n\n return (\n <Toolbar.Root {...composableProps(props)} ref={forwardedRef}>\n <Toolbar.IconButton icon='ph--plus--regular' iconOnly label={t('add-column.label')} onClick={onAddColumn} />\n </Toolbar.Root>\n );\n});\n\nPipelineToolbar.displayName = PIPELINE_TOOLBAR_NAME;\n\n//\n// Project\n//\n\nexport const PipelineComponent = {\n Root: PipelineRoot,\n Content: PipelineContent,\n Columns: PipelineColumns,\n Toolbar: PipelineToolbar,\n};\n\nexport { usePipeline };\n\nexport type { ItemProps, PipelineContextValue, PipelineRootProps, PipelineContentProps, PipelineColumnsProps };\n"],
|
|
5
|
-
"mappings": ";AAIA,SAASA,uBAAuB;AAChC,
|
|
6
|
-
"names": ["useComposedRefs", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport React, { forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { resolveSchemaWithRegistry } from '@dxos/app-toolkit/query';\nimport { Filter, Obj, Query, Type } from '@dxos/echo';\nimport { useObject } from '@dxos/react-client/echo';\nimport { Panel, Toolbar, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui';\nimport { Menu } from '@dxos/react-ui-menu';\nimport { Board, Focus, Mosaic, type MosaicTileProps } from '@dxos/react-ui-mosaic';\nimport { ProjectionModel, createEchoChangeCallback } from '@dxos/schema';\nimport { type Pipeline } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nimport { type ItemProps, usePipeline } from './PipelineComponent';\n\n//\n// PipelineColumn\n//\n\nconst PIPELINE_COLUMN_NAME = 'PipelineColumn';\n\nexport type PipelineColumnProps = Pick<MosaicTileProps<Pipeline.Column>, 'classNames' | 'location' | 'data' | 'debug'>;\n\n// TODO(wittjosiah): Support item DnD reordering (ordering needs to be stored on the view presentation collection).\nexport const PipelineColumn = ({ data: column, location, classNames, debug }: PipelineColumnProps) => {\n const { t } = useTranslation(meta.id);\n const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);\n // Subscribe to the view target for reactivity.\n const [viewSnapshot] = useObject(column.view);\n const view = column.view.target;\n const db = view && Obj.getDatabase(view);\n const { Item } = usePipeline(PIPELINE_COLUMN_NAME);\n const [type, setType] = useState<Type.AnyEntity>();\n const query = useMemo(() => {\n if (!view) {\n return Query.select(Filter.nothing());\n } else {\n // NOTE: Snapshot is required to prevent signal read in prohibited scope.\n // TODO(wittjosiah): Without stringify, filter.filters remains a proxied array.\n return Query.fromAst(JSON.parse(JSON.stringify(viewSnapshot?.query.ast)));\n }\n }, [JSON.stringify(viewSnapshot?.query.ast)]);\n\n useAsyncEffect(async () => {\n if (!query || !db) {\n return;\n }\n\n const type = await resolveSchemaWithRegistry(db, query.ast);\n setType(() => type);\n }, [db, query]);\n\n const projectionModel = useMemo(() => {\n if (!type || !view) {\n return undefined;\n }\n\n // Use the live jsonSchema reference for reactivity.\n const change = createEchoChangeCallback(view, Type.getDatabase(type) != null ? type : undefined);\n return new ProjectionModel({ view, baseSchema: type.jsonSchema, change });\n }, [type, view]);\n\n const PipelineTile = useMemo(() => {\n return forwardRef<HTMLDivElement, Pick<MosaicTileProps<Obj.Unknown>, 'classNames' | 'location' | 'data' | 'debug'>>(\n (props, ref) => <ItemTile {...props} itemProps={{ item: props.data, projectionModel }} ref={ref} />,\n );\n }, [projectionModel]);\n\n if (!view) {\n return null;\n }\n\n return (\n <Panel.Root asChild>\n <Board.Column.Root\n debug={debug}\n data={column}\n location={location}\n classNames={classNames}\n dragHandle={dragHandle}\n >\n <Panel.Toolbar asChild>\n <Board.Column.Header\n classNames='_opacity-10'\n label={column.name || t('untitled-view.title')}\n dragHandleRef={setDragHandle}\n />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <Board.Column.Body data={column} Tile={PipelineTile} />\n </Panel.Content>\n </Board.Column.Root>\n </Panel.Root>\n );\n};\n\nPipelineColumn.displayName = PIPELINE_COLUMN_NAME;\n\n//\n// ItemTile\n//\n\nconst ITEM_TILE_NAME = 'ItemTile';\n\ntype ItemTileProps = Pick<MosaicTileProps<Obj.Unknown>, 'classNames' | 'location' | 'data' | 'debug'> & {\n itemProps: ItemProps;\n};\n\nconst ItemTile = forwardRef<HTMLDivElement, ItemTileProps>(\n ({ classNames, data, location, debug, itemProps }, forwardedRef) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs<HTMLDivElement>(rootRef, forwardedRef);\n const { Item } = usePipeline(ITEM_TILE_NAME);\n const icon = Obj.getIcon(data)?.icon ?? 'ph--circle-dashed--regular';\n\n return (\n <Menu.Root>\n <Mosaic.Tile asChild id={data.id} data={data} location={location} debug={debug}>\n <Focus.Item asChild>\n <Card.Root classNames={classNames} ref={composedRef}>\n <Card.Header>\n <Card.Icon icon={icon} />\n <Card.Title>{Obj.getLabel(data, { fallback: 'typename' })}</Card.Title>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Card.IconBlock>\n <Menu.Trigger asChild>\n <Toolbar.IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label='Actions'\n />\n </Menu.Trigger>\n <Menu.Content />\n </Card.IconBlock>\n </Card.Header>\n <Card.Body>\n <Item {...itemProps} />\n </Card.Body>\n </Card.Root>\n </Focus.Item>\n </Mosaic.Tile>\n </Menu.Root>\n );\n },\n);\n\nItemTile.displayName = ITEM_TILE_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, { type FC, type PropsWithChildren } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { Toolbar, type ToolbarRootProps, useTranslation } from '@dxos/react-ui';\nimport { composable, composableProps, slottable } from '@dxos/react-ui';\nimport { Board, type BoardModel, useBoard, useEventHandlerAdapter } from '@dxos/react-ui-mosaic';\nimport { type ProjectionModel } from '@dxos/schema';\nimport { type Pipeline } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nimport { PipelineColumn } from './PipelineColumn';\n\ntype ItemProps = {\n item: Obj.Unknown;\n projectionModel?: ProjectionModel;\n};\n\nconst itemNoOp = ({ item }: ItemProps) => <span>{item.id}</span>;\n\n//\n// Root\n//\n\ntype PipelineContextValue = {\n Item: FC<ItemProps>;\n // TODO(wittjosiah): Support adding items.\n // If the created item doesn't match the current query, it will not be visible.\n // TODO(wittjosiah): onAddItem?: (schema: Schema.Schema.AnyNoContext) => void;\n onAddColumn?: () => void;\n};\n\ntype PipelineRootProps = PropsWithChildren<PipelineContextValue>;\n\nconst PIPELINE_ROOT = 'Pipeline.Root';\n\nconst [PipelineRootContext, usePipeline] = createContext<PipelineContextValue>(PIPELINE_ROOT, {\n Item: itemNoOp,\n});\n\nconst PipelineRoot = ({ children, ...contextValue }: PipelineRootProps) => (\n <PipelineRootContext {...contextValue}>{children}</PipelineRootContext>\n);\n\nPipelineRoot.displayName = PIPELINE_ROOT;\n\n//\n// Content\n//\n\nconst PIPELINE_CONTENT_NAME = 'Pipeline.Content';\n\ntype PipelineContentProps = PropsWithChildren<{\n model: BoardModel<Pipeline.Column, Obj.Unknown>;\n}>;\n\nconst PipelineContent = slottable<HTMLDivElement, PipelineContentProps>(\n ({ asChild, model, children, ...props }, forwardedRef) => {\n const Comp = asChild ? Slot : 'div';\n return (\n <Board.Root model={model}>\n <Comp {...composableProps(props)} ref={forwardedRef}>\n {children}\n </Comp>\n </Board.Root>\n );\n },\n);\n\nPipelineContent.displayName = PIPELINE_CONTENT_NAME;\n\n//\n// Columns\n//\n\nconst PIPELINE_COLUMNS_NAME = 'Pipeline.Columns';\n\ntype PipelineColumnsProps = {\n pipeline: Pipeline.Pipeline;\n};\n\nconst PipelineColumns = composable<HTMLDivElement, PipelineColumnsProps>(({ pipeline, ...props }) => {\n const { model } = useBoard(PIPELINE_COLUMNS_NAME);\n const columns = useAtomValue(model.columns);\n const eventHandler = useEventHandlerAdapter<Pipeline.Column, Obj.Unknown>({\n id: pipeline.id,\n // TODO(wittjosiah): Cast because columns array is readonly.\n items: columns as any,\n getId: model.getColumnId,\n get: (data) => data as unknown as Obj.Unknown,\n make: (object) => object as unknown as Pipeline.Column,\n canDrop: ({ source }) => model.isColumn(source.data),\n onChange: (mutate) => Obj.update(pipeline, (pipeline) => mutate(pipeline.columns)),\n });\n\n return <Board.Content {...props} id='pipeline' eventHandler={eventHandler} Tile={PipelineColumn} />;\n});\n\nPipelineColumns.displayName = PIPELINE_COLUMNS_NAME;\n\n//\n// Toolbar\n//\n\nconst PIPELINE_TOOLBAR_NAME = 'Pipeline.Toolbar';\n\nexport const PipelineToolbar = composable<HTMLDivElement, ToolbarRootProps>(({ children, ...props }, forwardedRef) => {\n const { t } = useTranslation(meta.id);\n const { onAddColumn } = usePipeline(PIPELINE_TOOLBAR_NAME);\n\n return (\n <Toolbar.Root {...composableProps(props)} ref={forwardedRef}>\n <Toolbar.IconButton icon='ph--plus--regular' iconOnly label={t('add-column.label')} onClick={onAddColumn} />\n </Toolbar.Root>\n );\n});\n\nPipelineToolbar.displayName = PIPELINE_TOOLBAR_NAME;\n\n//\n// Project\n//\n\nexport const PipelineComponent = {\n Root: PipelineRoot,\n Content: PipelineContent,\n Columns: PipelineColumns,\n Toolbar: PipelineToolbar,\n};\n\nexport { usePipeline };\n\nexport type { ItemProps, PipelineContextValue, PipelineRootProps, PipelineContentProps, PipelineColumnsProps };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useComposedRefs", "React", "forwardRef", "useMemo", "useRef", "useState", "resolveSchemaWithRegistry", "Filter", "Obj", "Query", "Type", "useObject", "Panel", "Toolbar", "useAsyncEffect", "useTranslation", "Card", "Menu", "Board", "Focus", "Mosaic", "ProjectionModel", "createEchoChangeCallback", "meta", "useAtomValue", "createContext", "Slot", "React", "Obj", "Toolbar", "useTranslation", "composable", "composableProps", "slottable", "Board", "useBoard", "useEventHandlerAdapter", "meta", "itemNoOp", "item", "span", "id", "PIPELINE_ROOT", "PipelineRootContext", "usePipeline", "createContext", "Item", "PipelineRoot", "children", "contextValue", "displayName", "PIPELINE_CONTENT_NAME", "PipelineContent", "slottable", "asChild", "model", "props", "forwardedRef", "Comp", "Slot", "Board", "Root", "composableProps", "ref", "PIPELINE_COLUMNS_NAME", "PipelineColumns", "composable", "pipeline", "useBoard", "columns", "useAtomValue", "eventHandler", "useEventHandlerAdapter", "items", "getId", "getColumnId", "get", "data", "make", "object", "canDrop", "source", "isColumn", "onChange", "mutate", "Obj", "update", "Content", "Tile", "PipelineColumn", "PIPELINE_TOOLBAR_NAME", "PipelineToolbar", "t", "useTranslation", "meta", "onAddColumn", "Toolbar", "IconButton", "icon", "iconOnly", "label", "onClick", "PipelineComponent", "Columns", "PIPELINE_COLUMN_NAME", "PipelineColumn", "data", "column", "location", "classNames", "debug", "t", "useTranslation", "meta", "id", "dragHandle", "setDragHandle", "useState", "viewSnapshot", "useObject", "view", "target", "db", "Obj", "getDatabase", "Item", "usePipeline", "type", "setType", "query", "useMemo", "Query", "select", "Filter", "nothing", "fromAst", "JSON", "parse", "stringify", "ast", "useAsyncEffect", "resolveSchemaWithRegistry", "projectionModel", "undefined", "change", "createEchoChangeCallback", "Type", "ProjectionModel", "baseSchema", "jsonSchema", "PipelineTile", "forwardRef", "props", "ref", "React", "ItemTile", "itemProps", "item", "Panel", "Root", "asChild", "Board", "Column", "Toolbar", "Header", "label", "name", "dragHandleRef", "Content", "Body", "Tile", "displayName", "ITEM_TILE_NAME", "forwardedRef", "rootRef", "useRef", "composedRef", "useComposedRefs", "icon", "getIcon", "Menu", "Mosaic", "Focus", "Card", "Icon", "Title", "getLabel", "fallback", "IconBlock", "Trigger", "IconButton", "iconOnly", "variant"]
|
|
7
7
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// src/containers/index.ts
|
|
2
2
|
import { lazy } from "react";
|
|
3
|
-
var
|
|
4
|
-
var PipelineProperties = lazy(() => import("../PipelineProperties-
|
|
3
|
+
var PipelineArticle = lazy(() => import("../PipelineArticle-6JIVXMYF.mjs"));
|
|
4
|
+
var PipelineProperties = lazy(() => import("../PipelineProperties-JXY3AVOY.mjs"));
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
PipelineArticle,
|
|
7
7
|
PipelineProperties
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/containers/index.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const
|
|
5
|
-
"mappings": ";AAIA,SAA6BA,YAAY;AAElC,IAAMC,
|
|
6
|
-
"names": ["lazy", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const PipelineArticle: ComponentType<any> = lazy(() => import('./PipelineArticle'));\nexport const PipelineProperties: ComponentType<any> = lazy(() => import('./PipelineProperties'));\n"],
|
|
5
|
+
"mappings": ";AAIA,SAA6BA,YAAY;AAElC,IAAMC,kBAAsCD,KAAK,MAAM,OAAO,iCAAA,CAAA;AAC9D,IAAME,qBAAyCF,KAAK,MAAM,OAAO,oCAAA,CAAA;",
|
|
6
|
+
"names": ["lazy", "PipelineArticle", "PipelineProperties"]
|
|
7
7
|
}
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import { Capability } from "@dxos/app-framework";
|
|
4
4
|
import { Operation } from "@dxos/compute";
|
|
5
|
+
import { Type } from "@dxos/echo";
|
|
5
6
|
import { SpaceOperation } from "@dxos/plugin-space";
|
|
6
7
|
import { SpaceCapabilities } from "@dxos/plugin-space";
|
|
7
8
|
import { Pipeline } from "@dxos/types";
|
|
8
9
|
var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
9
10
|
return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
|
|
10
|
-
id: Pipeline.Pipeline
|
|
11
|
+
id: Type.getTypename(Pipeline.Pipeline),
|
|
11
12
|
createObject: (props, options) => Effect.gen(function* () {
|
|
12
13
|
const object = Pipeline.make(props);
|
|
13
14
|
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
@@ -22,4 +23,4 @@ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* ()
|
|
|
22
23
|
export {
|
|
23
24
|
create_object_default as default
|
|
24
25
|
};
|
|
25
|
-
//# sourceMappingURL=create-object-
|
|
26
|
+
//# sourceMappingURL=create-object-6Z4MMGX4.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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 { Type } from '@dxos/echo';\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: Type.getTypename(Pipeline.Pipeline),\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,YAAY;AACrB,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAClC,SAASC,gBAAgB;AAEzB,IAAA,wBAAeL,WAAWM,WACjBC,kBAAW,aAAA;AAChB,SAAOP,WAAWQ,YAAYJ,kBAAkBK,mBAAmB;IACjEC,IAAIR,KAAKS,YAAYN,SAASA,QAAQ;IACtCO,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAMC,SAASX,SAASY,KAAKJ,KAAAA;AAC7B,aAAO,OAAOZ,UAAUiB,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", "Type", "SpaceOperation", "SpaceCapabilities", "Pipeline", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "getTypename", "createObject", "props", "options", "gen", "object", "make", "invoke", "AddObject", "target", "hidden", "targetNodeId"]
|
|
7
|
+
}
|