@dxos/plugin-pipeline 0.8.3-main.ef1bc66f44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +13 -0
  3. package/dist/lib/browser/PipelineContainer-TRO66W6L.mjs +216 -0
  4. package/dist/lib/browser/PipelineContainer-TRO66W6L.mjs.map +7 -0
  5. package/dist/lib/browser/PipelineSettings-EBR3UU5C.mjs +212 -0
  6. package/dist/lib/browser/PipelineSettings-EBR3UU5C.mjs.map +7 -0
  7. package/dist/lib/browser/app-graph-builder-NKUZQ6A7.mjs +64 -0
  8. package/dist/lib/browser/app-graph-builder-NKUZQ6A7.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-J5YNPKHT.mjs +28 -0
  10. package/dist/lib/browser/chunk-J5YNPKHT.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-XDHJKK7D.mjs +42 -0
  12. package/dist/lib/browser/chunk-XDHJKK7D.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +108 -0
  14. package/dist/lib/browser/index.mjs.map +7 -0
  15. package/dist/lib/browser/meta.json +1 -0
  16. package/dist/lib/browser/react-surface-CH2SUJTQ.mjs +56 -0
  17. package/dist/lib/browser/react-surface-CH2SUJTQ.mjs.map +7 -0
  18. package/dist/lib/browser/types/index.mjs +10 -0
  19. package/dist/lib/browser/types/index.mjs.map +7 -0
  20. package/dist/types/src/PipelinePlugin.d.ts +3 -0
  21. package/dist/types/src/PipelinePlugin.d.ts.map +1 -0
  22. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  23. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  24. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  25. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  26. package/dist/types/src/capabilities/index.d.ts +4 -0
  27. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  28. package/dist/types/src/capabilities/operation-resolver/index.d.ts +2 -0
  29. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  30. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  31. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  32. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  33. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  34. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  35. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  36. package/dist/types/src/components/PipelineColumn.d.ts +10 -0
  37. package/dist/types/src/components/PipelineColumn.d.ts.map +1 -0
  38. package/dist/types/src/components/PipelineComponent.d.ts +38 -0
  39. package/dist/types/src/components/PipelineComponent.d.ts.map +1 -0
  40. package/dist/types/src/components/PipelineComponent.stories.d.ts +42 -0
  41. package/dist/types/src/components/PipelineComponent.stories.d.ts.map +1 -0
  42. package/dist/types/src/components/PipelineContainer.d.ts +7 -0
  43. package/dist/types/src/components/PipelineContainer.d.ts.map +1 -0
  44. package/dist/types/src/components/PipelineContainer.stories.d.ts +56 -0
  45. package/dist/types/src/components/PipelineContainer.stories.d.ts.map +1 -0
  46. package/dist/types/src/components/PipelineSettings.d.ts +12 -0
  47. package/dist/types/src/components/PipelineSettings.d.ts.map +1 -0
  48. package/dist/types/src/components/index.d.ts +5 -0
  49. package/dist/types/src/components/index.d.ts.map +1 -0
  50. package/dist/types/src/index.d.ts +3 -0
  51. package/dist/types/src/index.d.ts.map +1 -0
  52. package/dist/types/src/meta.d.ts +3 -0
  53. package/dist/types/src/meta.d.ts.map +1 -0
  54. package/dist/types/src/templates/index.d.ts +2 -0
  55. package/dist/types/src/templates/index.d.ts.map +1 -0
  56. package/dist/types/src/templates/research.d.ts +4 -0
  57. package/dist/types/src/templates/research.d.ts.map +1 -0
  58. package/dist/types/src/templates/templates.d.ts +4 -0
  59. package/dist/types/src/templates/templates.d.ts.map +1 -0
  60. package/dist/types/src/translations.d.ts +31 -0
  61. package/dist/types/src/translations.d.ts.map +1 -0
  62. package/dist/types/src/types/PipelineAction.d.ts +25 -0
  63. package/dist/types/src/types/PipelineAction.d.ts.map +1 -0
  64. package/dist/types/src/types/index.d.ts +3 -0
  65. package/dist/types/src/types/index.d.ts.map +1 -0
  66. package/dist/types/tsconfig.tsbuildinfo +1 -0
  67. package/package.json +98 -0
  68. package/src/PipelinePlugin.tsx +46 -0
  69. package/src/capabilities/app-graph-builder/app-graph-builder.ts +51 -0
  70. package/src/capabilities/app-graph-builder/index.ts +7 -0
  71. package/src/capabilities/index.ts +7 -0
  72. package/src/capabilities/operation-resolver/index.ts +5 -0
  73. package/src/capabilities/operation-resolver/operation-resolver.ts +29 -0
  74. package/src/capabilities/react-surface/index.ts +7 -0
  75. package/src/capabilities/react-surface/react-surface.tsx +50 -0
  76. package/src/components/PipelineColumn.tsx +145 -0
  77. package/src/components/PipelineComponent.stories.tsx +204 -0
  78. package/src/components/PipelineComponent.tsx +103 -0
  79. package/src/components/PipelineContainer.stories.tsx +226 -0
  80. package/src/components/PipelineContainer.tsx +57 -0
  81. package/src/components/PipelineSettings.tsx +230 -0
  82. package/src/components/index.ts +11 -0
  83. package/src/index.ts +6 -0
  84. package/src/meta.ts +19 -0
  85. package/src/templates/index.ts +5 -0
  86. package/src/templates/research.ts +71 -0
  87. package/src/templates/templates.ts +11 -0
  88. package/src/translations.ts +38 -0
  89. package/src/types/PipelineAction.ts +29 -0
  90. package/src/types/index.ts +6 -0
package/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ MIT License
2
+ Copyright (c) 2022 DXOS
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+
6
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # @dxos/plugin-pipeline
2
+
3
+ ## DXOS Resources
4
+
5
+ - [Website](https://dxos.org)
6
+ - [Developer Documentation](https://docs.dxos.org)
7
+ - Talk to us on [Discord](https://dxos.org/discord)
8
+
9
+ ## Contributions
10
+
11
+ Your ideas, issues, and code are most welcome. Please take a look at our [community code of conduct](https://github.com/dxos/dxos/blob/main/CODE_OF_CONDUCT.md), the [issue guide](https://github.com/dxos/dxos/blob/main/CONTRIBUTING.md#submitting-issues), and the [PR contribution guide](https://github.com/dxos/dxos/blob/main/CONTRIBUTING.md#submitting-prs).
12
+
13
+ License: [MIT](./LICENSE) Copyright 2023 © DXOS
@@ -0,0 +1,216 @@
1
+ import {
2
+ meta
3
+ } from "./chunk-J5YNPKHT.mjs";
4
+
5
+ // src/components/PipelineContainer.tsx
6
+ import React3, { useCallback } from "react";
7
+ import { useOperationInvoker } from "@dxos/app-framework/react";
8
+ import { Surface } from "@dxos/app-framework/react";
9
+ import { Obj as Obj2 } from "@dxos/echo";
10
+ import { ATTENDABLE_PATH_SEPARATOR, DeckOperation } from "@dxos/plugin-deck/types";
11
+ import { useAttention } from "@dxos/react-ui-attention";
12
+ import { Layout } from "@dxos/react-ui-mosaic";
13
+
14
+ // src/components/PipelineComponent.tsx
15
+ import { createContext } from "@radix-ui/react-context";
16
+ import React2 from "react";
17
+ import { useObject as useObject2 } from "@dxos/react-client/echo";
18
+ import { Toolbar, useTranslation as useTranslation2 } from "@dxos/react-ui";
19
+ import { Stack } from "@dxos/react-ui-stack";
20
+
21
+ // src/components/PipelineColumn.tsx
22
+ import { useComposedRefs } from "@radix-ui/react-compose-refs";
23
+ import React, { forwardRef, useMemo, useRef, useState } from "react";
24
+ import { Obj, Query, Type } from "@dxos/echo";
25
+ import { getQueryTarget, resolveSchemaWithRegistry } from "@dxos/plugin-space";
26
+ import { Filter, getSpace, isSpace, useObject, useQuery } from "@dxos/react-client/echo";
27
+ import { useAsyncEffect, useTranslation } from "@dxos/react-ui";
28
+ import { Card, Focus, Mosaic } from "@dxos/react-ui-mosaic";
29
+ import { ProjectionModel, createEchoChangeCallback } from "@dxos/schema";
30
+ var PIPELINE_COLUMN_NAME = "PipelineColumn";
31
+ var PipelineColumn = ({ column }) => {
32
+ const { t } = useTranslation(meta.id);
33
+ const [viewSnapshot] = useObject(column.view);
34
+ const view = column.view.target;
35
+ const space = getSpace(view);
36
+ const { Item } = usePipeline(PIPELINE_COLUMN_NAME);
37
+ const [schema, setSchema] = useState();
38
+ const query = useMemo(() => {
39
+ if (!view) {
40
+ return Query.select(Filter.nothing());
41
+ } else {
42
+ return Query.fromAst(JSON.parse(JSON.stringify(viewSnapshot?.query.ast)));
43
+ }
44
+ }, [
45
+ JSON.stringify(viewSnapshot?.query.ast)
46
+ ]);
47
+ useAsyncEffect(async () => {
48
+ if (!query || !space) {
49
+ return;
50
+ }
51
+ const schema2 = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);
52
+ setSchema(() => schema2);
53
+ }, [
54
+ space,
55
+ query
56
+ ]);
57
+ const queryTarget = getQueryTarget(query.ast, space);
58
+ const items = useQuery(queryTarget, query);
59
+ const sortedItems = useMemo(() => {
60
+ return isSpace(queryTarget) ? items : [
61
+ ...items.reverse()
62
+ ];
63
+ }, [
64
+ queryTarget,
65
+ items
66
+ ]);
67
+ const projectionModel = useMemo(() => {
68
+ if (!schema || !view) {
69
+ return void 0;
70
+ }
71
+ const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : Type.toJsonSchema(schema);
72
+ const change = createEchoChangeCallback(view, Type.isMutable(schema) ? schema : void 0);
73
+ return new ProjectionModel({
74
+ view,
75
+ baseSchema: jsonSchema,
76
+ change
77
+ });
78
+ }, [
79
+ schema,
80
+ view
81
+ ]);
82
+ const Tile = useMemo(() => {
83
+ return /* @__PURE__ */ forwardRef((props, ref) => /* @__PURE__ */ React.createElement(ItemTile, {
84
+ ...props,
85
+ ref,
86
+ itemProps: {
87
+ item: props.data,
88
+ projectionModel
89
+ }
90
+ }));
91
+ }, [
92
+ Item,
93
+ projectionModel
94
+ ]);
95
+ if (!view) {
96
+ return null;
97
+ }
98
+ return /* @__PURE__ */ React.createElement(Focus.Group, {
99
+ asChild: true
100
+ }, /* @__PURE__ */ React.createElement("div", {
101
+ className: "grid bs-full card-default-width overflow-hidden grid-rows-[min-content_1fr] density-fine border border-separator rounded-md bg-deckSurface"
102
+ }, /* @__PURE__ */ React.createElement(Card.Toolbar, null, /* @__PURE__ */ React.createElement(Card.DragHandle, null), /* @__PURE__ */ React.createElement(Card.Title, null, column.name ?? t("untitled view title")), /* @__PURE__ */ React.createElement(Card.Menu, null)), /* @__PURE__ */ React.createElement(Mosaic.Container, {
103
+ asChild: true,
104
+ axis: "vertical",
105
+ withFocus: true
106
+ }, /* @__PURE__ */ React.createElement(Mosaic.Viewport, {
107
+ axis: "vertical",
108
+ padding: true
109
+ }, /* @__PURE__ */ React.createElement(Mosaic.Stack, {
110
+ axis: "vertical",
111
+ items: sortedItems,
112
+ getId: (item) => item.id,
113
+ Tile
114
+ })))));
115
+ };
116
+ PipelineColumn.displayName = PIPELINE_COLUMN_NAME;
117
+ var ITEM_TILE_NAME = "ItemTile";
118
+ var ItemTile = /* @__PURE__ */ forwardRef(({ classNames, data, location, debug, itemProps }, forwardedRef) => {
119
+ const rootRef = useRef(null);
120
+ const composedRef = useComposedRefs(rootRef, forwardedRef);
121
+ const { Item } = usePipeline(ITEM_TILE_NAME);
122
+ return /* @__PURE__ */ React.createElement(Mosaic.Tile, {
123
+ asChild: true,
124
+ id: data.id,
125
+ data,
126
+ location,
127
+ debug
128
+ }, /* @__PURE__ */ React.createElement(Focus.Group, {
129
+ asChild: true
130
+ }, /* @__PURE__ */ React.createElement(Card.Root, {
131
+ classNames,
132
+ ref: composedRef
133
+ }, /* @__PURE__ */ React.createElement(Card.Toolbar, null, /* @__PURE__ */ React.createElement(Card.DragHandle, null), /* @__PURE__ */ React.createElement(Card.Title, null, Obj.getLabel(data)), /* @__PURE__ */ React.createElement(Card.Menu, null)), /* @__PURE__ */ React.createElement(Card.Content, null, /* @__PURE__ */ React.createElement(Item, itemProps)))));
134
+ });
135
+ ItemTile.displayName = ITEM_TILE_NAME;
136
+
137
+ // src/components/PipelineComponent.tsx
138
+ var itemNoOp = ({ item }) => /* @__PURE__ */ React2.createElement("span", null, item.id);
139
+ var PIPELINE_ROOT = "Pipeline.Root";
140
+ var [PipelineRoot, usePipeline] = createContext(PIPELINE_ROOT, {
141
+ Item: itemNoOp
142
+ });
143
+ PipelineRoot.displayName = PIPELINE_ROOT;
144
+ var PIPELINE_CONTENT_NAME = "Pipeline.Content";
145
+ var PipelineContent = ({ pipeline }) => {
146
+ const [columns] = useObject2(pipeline, "columns");
147
+ return /* @__PURE__ */ React2.createElement(Stack, {
148
+ orientation: "horizontal",
149
+ size: "contain",
150
+ rail: false
151
+ }, columns.map((column) => {
152
+ return /* @__PURE__ */ React2.createElement(PipelineColumn, {
153
+ key: column.view.dxn.toString(),
154
+ column
155
+ });
156
+ }));
157
+ };
158
+ PipelineContent.displayName = PIPELINE_CONTENT_NAME;
159
+ var PIPELINE_TOOLBAR_NAME = "Pipeline.Toolbar";
160
+ var PipelineToolbar = (props) => {
161
+ const { t } = useTranslation2(meta.id);
162
+ const { onAddColumn } = usePipeline(PIPELINE_TOOLBAR_NAME);
163
+ return /* @__PURE__ */ React2.createElement(Toolbar.Root, props, /* @__PURE__ */ React2.createElement(Toolbar.IconButton, {
164
+ icon: "ph--plus--regular",
165
+ iconOnly: true,
166
+ label: t("add column label"),
167
+ onClick: onAddColumn
168
+ }));
169
+ };
170
+ PipelineToolbar.displayName = PIPELINE_TOOLBAR_NAME;
171
+ var PipelineComponent = {
172
+ Root: PipelineRoot,
173
+ Content: PipelineContent,
174
+ Toolbar: PipelineToolbar
175
+ };
176
+
177
+ // src/components/PipelineContainer.tsx
178
+ var PipelineContainer = ({ role, subject: pipeline }) => {
179
+ const { invokePromise } = useOperationInvoker();
180
+ const attendableId = Obj2.getDXN(pipeline).toString();
181
+ const { hasAttention } = useAttention(attendableId);
182
+ const handleColumnAdd = useCallback(() => invokePromise(DeckOperation.ChangeCompanion, {
183
+ primary: attendableId,
184
+ companion: `${attendableId}${ATTENDABLE_PATH_SEPARATOR}settings`
185
+ }), [
186
+ invokePromise,
187
+ attendableId
188
+ ]);
189
+ return /* @__PURE__ */ React3.createElement(Layout.Main, {
190
+ role,
191
+ toolbar: true
192
+ }, /* @__PURE__ */ React3.createElement(PipelineComponent.Root, {
193
+ Item: PipelineItem,
194
+ onAddColumn: handleColumnAdd
195
+ }, /* @__PURE__ */ React3.createElement(PipelineComponent.Toolbar, {
196
+ disabled: !hasAttention
197
+ }), /* @__PURE__ */ React3.createElement(PipelineComponent.Content, {
198
+ pipeline
199
+ })));
200
+ };
201
+ var PipelineItem = ({ item, projectionModel }) => {
202
+ return /* @__PURE__ */ React3.createElement(Surface, {
203
+ role: "card--content",
204
+ data: {
205
+ subject: item,
206
+ projection: projectionModel
207
+ },
208
+ limit: 1
209
+ });
210
+ };
211
+ var PipelineContainer_default = PipelineContainer;
212
+ export {
213
+ PipelineContainer,
214
+ PipelineContainer_default as default
215
+ };
216
+ //# sourceMappingURL=PipelineContainer-TRO66W6L.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/PipelineContainer.tsx", "../../../src/components/PipelineComponent.tsx", "../../../src/components/PipelineColumn.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { type SurfaceComponentProps, useOperationInvoker } from '@dxos/app-framework/react';\nimport { Surface } from '@dxos/app-framework/react';\nimport { Obj } from '@dxos/echo';\nimport { ATTENDABLE_PATH_SEPARATOR, DeckOperation } from '@dxos/plugin-deck/types';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { Layout } from '@dxos/react-ui-mosaic';\nimport { type Pipeline as PipelineType } from '@dxos/types';\n\nimport { type ItemProps, PipelineComponent } from './PipelineComponent';\n\nexport type PipelineContainerProps = SurfaceComponentProps<PipelineType.Pipeline>;\n\nexport const PipelineContainer = ({ role, subject: pipeline }: PipelineContainerProps) => {\n const { invokePromise } = useOperationInvoker();\n const attendableId = Obj.getDXN(pipeline).toString();\n const { hasAttention } = useAttention(attendableId);\n\n const handleColumnAdd = useCallback(\n () =>\n invokePromise(DeckOperation.ChangeCompanion, {\n primary: attendableId,\n companion: `${attendableId}${ATTENDABLE_PATH_SEPARATOR}settings`,\n }),\n [invokePromise, attendableId],\n );\n\n return (\n <Layout.Main role={role} toolbar>\n <PipelineComponent.Root Item={PipelineItem} onAddColumn={handleColumnAdd}>\n <PipelineComponent.Toolbar disabled={!hasAttention} />\n <PipelineComponent.Content pipeline={pipeline} />\n </PipelineComponent.Root>\n </Layout.Main>\n );\n};\n\nconst PipelineItem = ({ item, projectionModel }: ItemProps) => {\n return (\n <Surface\n role='card--content'\n data={{\n subject: item,\n projection: projectionModel,\n }}\n limit={1}\n />\n );\n};\n\nexport default PipelineContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type FC } from 'react';\n\nimport { type Obj } from '@dxos/echo';\nimport { useObject } from '@dxos/react-client/echo';\nimport { Toolbar, type ToolbarRootProps, useTranslation } from '@dxos/react-ui';\nimport { Stack } from '@dxos/react-ui-stack';\nimport { type ProjectionModel } from '@dxos/schema';\nimport { type Pipeline as PipelineType } 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\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 // onAddItem?: (schema: Schema.Schema.AnyNoContext) => void;\n onAddColumn?: () => void;\n};\n\n//\n// Root\n//\n\ntype PipelineRootProps = PipelineContextValue;\n\nconst PIPELINE_ROOT = 'Pipeline.Root';\n\nconst [PipelineRoot, usePipeline] = createContext<PipelineContextValue>(PIPELINE_ROOT, {\n Item: itemNoOp,\n});\n\nPipelineRoot.displayName = PIPELINE_ROOT;\n\n//\n// Content\n//\n\nconst PIPELINE_CONTENT_NAME = 'Pipeline.Content';\n\ntype PipelineContentProps = {\n pipeline: PipelineType.Pipeline;\n};\n\nconst PipelineContent = ({ pipeline }: PipelineContentProps) => {\n const [columns] = useObject(pipeline, 'columns');\n\n return (\n <Stack orientation='horizontal' size='contain' rail={false}>\n {columns.map((column) => {\n return <PipelineColumn key={column.view.dxn.toString()} column={column} />;\n })}\n </Stack>\n );\n};\n\nPipelineContent.displayName = PIPELINE_CONTENT_NAME;\n\n//\n// Toolbar\n//\n\nconst PIPELINE_TOOLBAR_NAME = 'Pipeline.Toolbar';\n\nexport const PipelineToolbar = (props: ToolbarRootProps) => {\n const { t } = useTranslation(meta.id);\n const { onAddColumn } = usePipeline(PIPELINE_TOOLBAR_NAME);\n\n return (\n <Toolbar.Root {...props}>\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 Toolbar: PipelineToolbar,\n};\n\nexport { usePipeline };\n\nexport type { ItemProps, PipelineContextValue, PipelineRootProps };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport type * as Schema from 'effect/Schema';\nimport React, { forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Query, Type } from '@dxos/echo';\nimport { getQueryTarget, resolveSchemaWithRegistry } from '@dxos/plugin-space';\nimport { Filter, getSpace, isSpace, useObject, useQuery } from '@dxos/react-client/echo';\nimport { useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Card, 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 = {\n column: Pipeline.Column;\n};\n\n// TODO(thure): Duplicates a lot of the same boilerplate as Kanban columns; is there an opportunity to DRY these out?\n// TODO(wittjosiah): Support column DnD reordering.\n// TODO(wittjosiah): Support item DnD reordering (ordering needs to be stored on the view presentation collection).\nexport const PipelineColumn = ({ column }: PipelineColumnProps) => {\n const { t } = useTranslation(meta.id);\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) {\n return;\n }\n\n const schema = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);\n setSchema(() => schema);\n }, [space, query]);\n\n const queryTarget = getQueryTarget(query.ast, space);\n const items = useQuery(queryTarget, query);\n const sortedItems = useMemo(() => {\n // TODO(burdon): Hack to reverse queue.\n return isSpace(queryTarget) ? items : [...items.reverse()];\n }, [queryTarget, items]);\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 : Type.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 Tile = useMemo(() => {\n return forwardRef<HTMLDivElement, Pick<MosaicTileProps<Obj.Unknown>, 'classNames' | 'location' | 'data' | 'debug'>>(\n (props, ref) => <ItemTile {...props} ref={ref} itemProps={{ item: props.data, projectionModel }} />,\n );\n }, [Item, projectionModel]);\n\n if (!view) {\n return null;\n }\n\n return (\n <Focus.Group asChild>\n <div className='grid bs-full card-default-width overflow-hidden grid-rows-[min-content_1fr] density-fine border border-separator rounded-md bg-deckSurface'>\n <Card.Toolbar>\n <Card.DragHandle />\n <Card.Title>{column.name ?? t('untitled view title')}</Card.Title>\n <Card.Menu />\n </Card.Toolbar>\n <Mosaic.Container asChild axis='vertical' withFocus>\n <Mosaic.Viewport axis='vertical' padding>\n <Mosaic.Stack axis='vertical' items={sortedItems} getId={(item) => item.id} Tile={Tile} />\n </Mosaic.Viewport>\n </Mosaic.Container>\n </div>\n </Focus.Group>\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\n return (\n <Mosaic.Tile asChild id={data.id} data={data} location={location} debug={debug}>\n <Focus.Group asChild>\n <Card.Root classNames={classNames} ref={composedRef}>\n <Card.Toolbar>\n <Card.DragHandle />\n <Card.Title>{Obj.getLabel(data)}</Card.Title>\n <Card.Menu />\n </Card.Toolbar>\n <Card.Content>\n <Item {...itemProps} />\n </Card.Content>\n </Card.Root>\n </Focus.Group>\n </Mosaic.Tile>\n );\n },\n);\n\nItemTile.displayName = ITEM_TILE_NAME;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useOperationInvoker", "Surface", "Obj", "ATTENDABLE_PATH_SEPARATOR", "DeckOperation", "useAttention", "Layout", "createContext", "React", "useObject", "Toolbar", "useTranslation", "Stack", "useComposedRefs", "React", "forwardRef", "useMemo", "useRef", "useState", "Obj", "Query", "Type", "getQueryTarget", "resolveSchemaWithRegistry", "Filter", "getSpace", "isSpace", "useObject", "useQuery", "useAsyncEffect", "useTranslation", "Card", "Focus", "Mosaic", "ProjectionModel", "createEchoChangeCallback", "PIPELINE_COLUMN_NAME", "PipelineColumn", "column", "t", "useTranslation", "meta", "id", "viewSnapshot", "useObject", "view", "target", "space", "getSpace", "Item", "usePipeline", "schema", "setSchema", "useState", "query", "useMemo", "Query", "select", "Filter", "nothing", "fromAst", "JSON", "parse", "stringify", "ast", "useAsyncEffect", "resolveSchemaWithRegistry", "db", "schemaRegistry", "queryTarget", "getQueryTarget", "items", "useQuery", "sortedItems", "isSpace", "reverse", "projectionModel", "undefined", "jsonSchema", "Type", "isMutable", "toJsonSchema", "change", "createEchoChangeCallback", "ProjectionModel", "baseSchema", "Tile", "forwardRef", "props", "ref", "ItemTile", "itemProps", "item", "data", "Focus", "Group", "asChild", "div", "className", "Card", "Toolbar", "DragHandle", "Title", "name", "Menu", "Mosaic", "Container", "axis", "withFocus", "Viewport", "padding", "Stack", "getId", "displayName", "ITEM_TILE_NAME", "classNames", "location", "debug", "forwardedRef", "rootRef", "useRef", "composedRef", "useComposedRefs", "Root", "Obj", "getLabel", "Content", "itemNoOp", "item", "React", "span", "id", "PIPELINE_ROOT", "PipelineRoot", "usePipeline", "createContext", "Item", "displayName", "PIPELINE_CONTENT_NAME", "PipelineContent", "pipeline", "columns", "useObject", "Stack", "orientation", "size", "rail", "map", "column", "PipelineColumn", "key", "view", "dxn", "toString", "PIPELINE_TOOLBAR_NAME", "PipelineToolbar", "props", "t", "useTranslation", "meta", "onAddColumn", "Toolbar", "Root", "IconButton", "icon", "iconOnly", "label", "onClick", "PipelineComponent", "Content", "PipelineContainer", "role", "subject", "pipeline", "invokePromise", "useOperationInvoker", "attendableId", "Obj", "getDXN", "toString", "hasAttention", "useAttention", "handleColumnAdd", "useCallback", "DeckOperation", "ChangeCompanion", "primary", "companion", "ATTENDABLE_PATH_SEPARATOR", "React", "Layout", "Main", "toolbar", "PipelineComponent", "Root", "Item", "PipelineItem", "onAddColumn", "Toolbar", "disabled", "Content", "item", "projectionModel", "Surface", "data", "projection", "limit"]
7
+ }
@@ -0,0 +1,212 @@
1
+ import {
2
+ meta
3
+ } from "./chunk-J5YNPKHT.mjs";
4
+
5
+ // src/components/PipelineSettings.tsx
6
+ import * as Schema from "effect/Schema";
7
+ import React, { useCallback, useMemo, useRef, useState } from "react";
8
+ import { DXN, Filter, Obj, Query, Ref, Tag, Type } from "@dxos/echo";
9
+ import { useTypeOptions } from "@dxos/plugin-space";
10
+ import { resolveSchemaWithRegistry } from "@dxos/plugin-space";
11
+ import { getSpace, useQuery } from "@dxos/react-client/echo";
12
+ import { IconButton, useAsyncEffect, useTranslation } from "@dxos/react-ui";
13
+ import { Form, ViewEditor } from "@dxos/react-ui-form";
14
+ import { List } from "@dxos/react-ui-list";
15
+ import { View } from "@dxos/schema";
16
+ import { Pipeline, Task } from "@dxos/types";
17
+ import { inputTextLabel, mx, osTranslations, subtleHover } from "@dxos/ui-theme";
18
+ import { arrayMove } from "@dxos/util";
19
+ var listGrid = "grid grid-cols-[min-content_1fr_min-content_min-content_min-content]";
20
+ var listItemGrid = "grid grid-cols-subgrid col-span-5";
21
+ var ColumnFormSchema = Pipeline.Column.pipe(Schema.mutable, Schema.pick("name"));
22
+ var PipelineObjectSettings = ({ classNames, pipeline }) => {
23
+ const { t } = useTranslation(meta.id);
24
+ const space = getSpace(pipeline);
25
+ const [expandedId, setExpandedId] = useState();
26
+ const column = useMemo(() => pipeline.columns.find((column2) => column2.view.dxn.toString() === expandedId), [
27
+ pipeline.columns,
28
+ expandedId
29
+ ]);
30
+ const view = column?.view.target;
31
+ const [schema, setSchema] = useState(() => Schema.Struct({}));
32
+ const projectionRef = useRef(null);
33
+ const tags = useQuery(space?.db, Filter.type(Tag.Tag));
34
+ const types = useTypeOptions({
35
+ space,
36
+ annotation: {
37
+ location: [
38
+ "database",
39
+ "runtime"
40
+ ],
41
+ kind: [
42
+ "user"
43
+ ],
44
+ registered: [
45
+ "registered",
46
+ "unregistered"
47
+ ]
48
+ }
49
+ });
50
+ useAsyncEffect(async () => {
51
+ if (!view?.query || !space) {
52
+ return;
53
+ }
54
+ const foundSchema = await resolveSchemaWithRegistry(space.db.schemaRegistry, view.query.ast);
55
+ if (foundSchema && foundSchema !== schema) {
56
+ setSchema(() => foundSchema);
57
+ }
58
+ }, [
59
+ space,
60
+ view,
61
+ schema
62
+ ]);
63
+ const handleMove = useCallback((fromIndex, toIndex) => Obj.change(pipeline, (p) => {
64
+ arrayMove(p.columns, fromIndex, toIndex);
65
+ }), [
66
+ pipeline
67
+ ]);
68
+ const handleQueryChanged = useCallback(async (newQuery, target) => {
69
+ if (!view || !space) {
70
+ return;
71
+ }
72
+ const queue = target && DXN.tryParse(target) ? target : void 0;
73
+ const query = queue ? Query.fromAst(newQuery).options({
74
+ queues: [
75
+ queue
76
+ ]
77
+ }) : Query.fromAst(newQuery);
78
+ Obj.change(view, (v) => {
79
+ v.query.ast = query.ast;
80
+ });
81
+ const newSchema = await resolveSchemaWithRegistry(space.db.schemaRegistry, query.ast);
82
+ if (!newSchema) {
83
+ return;
84
+ }
85
+ const newView = View.make({
86
+ query,
87
+ jsonSchema: Type.toJsonSchema(newSchema)
88
+ });
89
+ Obj.change(view, (v) => {
90
+ v.projection = Obj.getSnapshot(newView).projection;
91
+ });
92
+ setSchema(() => newSchema);
93
+ }, [
94
+ view,
95
+ schema
96
+ ]);
97
+ const handleToggleField = useCallback((column2) => {
98
+ setExpandedId((prevExpandedId) => prevExpandedId === column2.view.dxn.toString() ? void 0 : column2.view.dxn.toString());
99
+ }, []);
100
+ const handleDelete = useCallback(async (column2) => {
101
+ if (column2.view.dxn.toString() === expandedId) {
102
+ setExpandedId(void 0);
103
+ }
104
+ const index = pipeline.columns.findIndex((l) => l === column2);
105
+ const viewToRemove = await column2.view.load();
106
+ Obj.change(pipeline, (p) => {
107
+ p.columns.splice(index, 1);
108
+ });
109
+ space?.db.remove(viewToRemove);
110
+ }, [
111
+ expandedId,
112
+ pipeline.columns,
113
+ space
114
+ ]);
115
+ const handleAdd = useCallback(() => {
116
+ const newView = View.make({
117
+ query: Query.select(Filter.type(Task.Task)),
118
+ jsonSchema: Type.toJsonSchema(Task.Task)
119
+ });
120
+ Obj.change(pipeline, (p) => {
121
+ p.columns.push({
122
+ name: "Tasks",
123
+ // Type assertion needed due to QueryAST type variance.
124
+ view: Ref.make(newView),
125
+ order: []
126
+ });
127
+ });
128
+ setExpandedId(newView.id);
129
+ }, [
130
+ pipeline
131
+ ]);
132
+ const handleColumnSave = useCallback((values) => {
133
+ if (column) {
134
+ const columnIndex = pipeline.columns.findIndex((c) => c === column);
135
+ Obj.change(pipeline, (p) => {
136
+ p.columns[columnIndex].name = values.name;
137
+ });
138
+ }
139
+ }, [
140
+ column,
141
+ pipeline
142
+ ]);
143
+ return /* @__PURE__ */ React.createElement("div", {
144
+ role: "none",
145
+ className: mx("plb-cardSpacingBlock overflow-y-auto", classNames)
146
+ }, /* @__PURE__ */ React.createElement("h2", {
147
+ className: mx(inputTextLabel)
148
+ }, t("views label")), /* @__PURE__ */ React.createElement(List.Root, {
149
+ items: pipeline.columns,
150
+ isItem: Schema.is(Pipeline.Column),
151
+ getId: (column2) => column2.view.dxn.toString(),
152
+ onMove: handleMove
153
+ }, ({ items: columns }) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", {
154
+ role: "list",
155
+ className: mx(listGrid)
156
+ }, columns.map((column2) => /* @__PURE__ */ React.createElement(List.Item, {
157
+ key: column2.view.dxn.toString(),
158
+ item: column2,
159
+ classNames: listItemGrid,
160
+ "aria-expanded": expandedId === column2.view.dxn.toString()
161
+ }, /* @__PURE__ */ React.createElement("div", {
162
+ role: "none",
163
+ className: mx(subtleHover, listItemGrid, "rounded-sm cursor-pointer min-bs-10")
164
+ }, /* @__PURE__ */ React.createElement(List.ItemDragHandle, null), /* @__PURE__ */ React.createElement(List.ItemTitle, {
165
+ onClick: () => handleToggleField(column2)
166
+ }, column2.name), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
167
+ label: t("delete view label"),
168
+ autoHide: false,
169
+ onClick: () => handleDelete(column2),
170
+ "data-testid": "view.delete"
171
+ }), /* @__PURE__ */ React.createElement(IconButton, {
172
+ iconOnly: true,
173
+ variant: "ghost",
174
+ label: t("toggle expand label", {
175
+ ns: osTranslations
176
+ }),
177
+ icon: expandedId === column2.view.dxn.toString() ? "ph--caret-down--regular" : "ph--caret-right--regular",
178
+ onClick: () => handleToggleField(column2)
179
+ })), expandedId === column2.view.dxn.toString() && view && /* @__PURE__ */ React.createElement("div", {
180
+ role: "none",
181
+ className: "col-span-5 mlb-2 border border-separator rounded-md"
182
+ }, /* @__PURE__ */ React.createElement(Form.Root, {
183
+ schema: ColumnFormSchema,
184
+ values: column2,
185
+ autoSave: true,
186
+ onSave: handleColumnSave
187
+ }, /* @__PURE__ */ React.createElement(Form.Content, null, /* @__PURE__ */ React.createElement(Form.FieldSet, null))), /* @__PURE__ */ React.createElement(ViewEditor, {
188
+ ref: projectionRef,
189
+ mode: "tag",
190
+ readonly: true,
191
+ schema,
192
+ view,
193
+ registry: space?.db.schemaRegistry,
194
+ tags,
195
+ types,
196
+ onQueryChanged: handleQueryChanged
197
+ }))))))), /* @__PURE__ */ React.createElement("div", {
198
+ role: "none",
199
+ className: "mlb-cardSpacingBlock"
200
+ }, /* @__PURE__ */ React.createElement(IconButton, {
201
+ icon: "ph--plus--regular",
202
+ label: t("add view label"),
203
+ onClick: handleAdd,
204
+ classNames: "is-full"
205
+ })));
206
+ };
207
+ var PipelineSettings_default = PipelineObjectSettings;
208
+ export {
209
+ PipelineObjectSettings,
210
+ PipelineSettings_default as default
211
+ };
212
+ //# sourceMappingURL=PipelineSettings-EBR3UU5C.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/PipelineSettings.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 { DXN, Filter, Obj, Query, type QueryAST, Ref, Tag, Type } from '@dxos/echo';\nimport { type Mutable } from '@dxos/echo/internal';\nimport { useTypeOptions } from '@dxos/plugin-space';\nimport { resolveSchemaWithRegistry } from '@dxos/plugin-space';\nimport { getSpace, 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, View } from '@dxos/schema';\nimport { Pipeline, Task } from '@dxos/types';\nimport { inputTextLabel, 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\n// TODO(burdon): Standardize Object/Plugin settings.\nexport type PipelineObjectSettingsProps = ThemedClassName<{\n pipeline: Pipeline.Pipeline;\n}>;\n\n/**\n * Supports editing the pipeline view.\n */\nexport const PipelineObjectSettings = ({ classNames, pipeline }: PipelineObjectSettingsProps) => {\n const { t } = useTranslation(meta.id);\n const space = getSpace(pipeline);\n const [expandedId, setExpandedId] = useState<string>();\n const column = useMemo(\n () => pipeline.columns.find((column) => column.view.dxn.toString() === expandedId),\n [pipeline.columns, expandedId],\n );\n const view = column?.view.target;\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 registered: ['registered', 'unregistered'],\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 Obj.change(pipeline, (p) => {\n arrayMove(p.columns, fromIndex, toIndex);\n }),\n [pipeline],\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).options({ queues: [queue] }) : Query.fromAst(newQuery);\n Obj.change(view, (v) => {\n v.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 = View.make({\n query,\n jsonSchema: Type.toJsonSchema(newSchema),\n });\n Obj.change(view, (v) => {\n v.projection = Obj.getSnapshot(newView).projection as Mutable<typeof v.projection>;\n });\n\n setSchema(() => newSchema);\n },\n [view, schema],\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 = pipeline.columns.findIndex((l) => l === column);\n const viewToRemove = await column.view.load();\n Obj.change(pipeline, (p) => {\n p.columns.splice(index, 1);\n });\n space?.db.remove(viewToRemove);\n },\n [expandedId, pipeline.columns, space],\n );\n\n const handleAdd = useCallback(() => {\n const newView = View.make({\n query: Query.select(Filter.type(Task.Task)),\n jsonSchema: Type.toJsonSchema(Task.Task),\n });\n Obj.change(pipeline, (p) => {\n p.columns.push({\n name: 'Tasks',\n // Type assertion needed due to QueryAST type variance.\n view: Ref.make(newView) as (typeof p.columns)[number]['view'],\n order: [],\n });\n });\n setExpandedId(newView.id);\n }, [pipeline]);\n\n const handleColumnSave = useCallback(\n (values: Schema.Schema.Type<typeof ColumnFormSchema>) => {\n if (column) {\n const columnIndex = pipeline.columns.findIndex((c) => c === column);\n Obj.change(pipeline, (p) => {\n p.columns[columnIndex].name = values.name;\n });\n }\n },\n [column, pipeline],\n );\n\n return (\n <div role='none' className={mx('plb-cardSpacingBlock overflow-y-auto', classNames)}>\n <h2 className={mx(inputTextLabel)}>{t('views label')}</h2>\n\n <List.Root<Pipeline.Column>\n items={pipeline.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 role='none' className={mx(subtleHover, listItemGrid, 'rounded-sm cursor-pointer min-bs-10')}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleToggleField(column)}>{column.name}</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() && view && (\n <div role='none' className='col-span-5 mlb-2 border border-separator rounded-md'>\n <Form.Root schema={ColumnFormSchema} values={column} autoSave onSave={handleColumnSave}>\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={view}\n registry={space?.db.schemaRegistry}\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 role='none' className='mlb-cardSpacingBlock'>\n <IconButton icon='ph--plus--regular' label={t('add view label')} onClick={handleAdd} classNames='is-full' />\n </div>\n </div>\n );\n};\n\nexport default PipelineObjectSettings;\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "React", "useCallback", "useMemo", "useRef", "useState", "DXN", "Filter", "Obj", "Query", "Ref", "Tag", "Type", "useTypeOptions", "resolveSchemaWithRegistry", "getSpace", "useQuery", "IconButton", "useAsyncEffect", "useTranslation", "Form", "ViewEditor", "List", "View", "Pipeline", "Task", "inputTextLabel", "mx", "osTranslations", "subtleHover", "arrayMove", "listGrid", "listItemGrid", "ColumnFormSchema", "Pipeline", "Column", "pipe", "mutable", "pick", "PipelineObjectSettings", "classNames", "pipeline", "t", "useTranslation", "meta", "id", "space", "getSpace", "expandedId", "setExpandedId", "useState", "column", "useMemo", "columns", "find", "view", "dxn", "toString", "target", "schema", "setSchema", "Struct", "projectionRef", "useRef", "tags", "useQuery", "db", "Filter", "type", "Tag", "types", "useTypeOptions", "annotation", "location", "kind", "registered", "useAsyncEffect", "query", "foundSchema", "resolveSchemaWithRegistry", "schemaRegistry", "ast", "handleMove", "useCallback", "fromIndex", "toIndex", "Obj", "change", "p", "arrayMove", "handleQueryChanged", "newQuery", "queue", "DXN", "tryParse", "undefined", "Query", "fromAst", "options", "queues", "v", "newSchema", "newView", "View", "make", "jsonSchema", "Type", "toJsonSchema", "projection", "getSnapshot", "handleToggleField", "prevExpandedId", "handleDelete", "index", "findIndex", "l", "viewToRemove", "load", "splice", "remove", "handleAdd", "select", "Task", "push", "name", "Ref", "order", "handleColumnSave", "values", "columnIndex", "c", "div", "role", "className", "mx", "h2", "inputTextLabel", "List", "Root", "items", "isItem", "is", "getId", "onMove", "map", "Item", "key", "item", "aria-expanded", "subtleHover", "ItemDragHandle", "ItemTitle", "onClick", "ItemDeleteButton", "label", "autoHide", "data-testid", "IconButton", "iconOnly", "variant", "ns", "osTranslations", "icon", "Form", "autoSave", "onSave", "Content", "FieldSet", "ViewEditor", "ref", "mode", "readonly", "registry", "onQueryChanged"]
7
+ }
@@ -0,0 +1,64 @@
1
+ import {
2
+ meta
3
+ } from "./chunk-J5YNPKHT.mjs";
4
+
5
+ // src/capabilities/app-graph-builder/app-graph-builder.ts
6
+ import * as Effect from "effect/Effect";
7
+ import { Capability, Common } from "@dxos/app-framework";
8
+ import { ATTENDABLE_PATH_SEPARATOR, PLANK_COMPANION_TYPE } from "@dxos/plugin-deck/types";
9
+ import { GraphBuilder } from "@dxos/plugin-graph";
10
+ import { Pipeline } from "@dxos/types";
11
+ var app_graph_builder_default = Capability.makeModule(Effect.fnUntraced(function* () {
12
+ const extensions = yield* Effect.all([
13
+ GraphBuilder.createTypeExtension({
14
+ id: `${meta.id}/triggers`,
15
+ type: Pipeline.Pipeline,
16
+ connector: (pipeline, get) => {
17
+ const nodeId = pipeline.id;
18
+ return Effect.succeed([
19
+ {
20
+ id: [
21
+ nodeId,
22
+ "invocations"
23
+ ].join(ATTENDABLE_PATH_SEPARATOR),
24
+ type: PLANK_COMPANION_TYPE,
25
+ data: "invocations",
26
+ properties: {
27
+ label: [
28
+ "project invocations label",
29
+ {
30
+ ns: meta.id
31
+ }
32
+ ],
33
+ icon: "ph--clock-countdown--regular",
34
+ disposition: "hidden"
35
+ }
36
+ },
37
+ {
38
+ id: [
39
+ nodeId,
40
+ "automation"
41
+ ].join(ATTENDABLE_PATH_SEPARATOR),
42
+ type: PLANK_COMPANION_TYPE,
43
+ data: "automation",
44
+ properties: {
45
+ label: [
46
+ "project automation label",
47
+ {
48
+ ns: meta.id
49
+ }
50
+ ],
51
+ icon: "ph--lightning--regular",
52
+ disposition: "hidden"
53
+ }
54
+ }
55
+ ]);
56
+ }
57
+ })
58
+ ]);
59
+ return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);
60
+ }));
61
+ export {
62
+ app_graph_builder_default as default
63
+ };
64
+ //# sourceMappingURL=app-graph-builder-NKUZQ6A7.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-builder/app-graph-builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { ATTENDABLE_PATH_SEPARATOR, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { GraphBuilder } from '@dxos/plugin-graph';\nimport { Pipeline } from '@dxos/types';\n\nimport { meta } from '../../meta';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* Effect.all([\n GraphBuilder.createTypeExtension({\n id: `${meta.id}/triggers`,\n type: Pipeline.Pipeline,\n connector: (pipeline, get) => {\n const nodeId = pipeline.id;\n return Effect.succeed([\n {\n id: [nodeId, 'invocations'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'invocations',\n properties: {\n label: ['project invocations label', { ns: meta.id }],\n icon: 'ph--clock-countdown--regular',\n disposition: 'hidden',\n },\n },\n {\n id: [nodeId, 'automation'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'automation',\n properties: {\n label: ['project automation label', { ns: meta.id }],\n icon: 'ph--lightning--regular',\n disposition: 'hidden',\n },\n },\n ]);\n },\n }),\n ]);\n\n return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);\n }),\n);\n"],
5
+ "mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,2BAA2BC,4BAA4B;AAChE,SAASC,oBAAoB;AAC7B,SAASC,gBAAgB;AAIzB,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,aAAa,OAAcC,WAAI;IACnCC,aAAaC,oBAAoB;MAC/BC,IAAI,GAAGC,KAAKD,EAAE;MACdE,MAAMC,SAASA;MACfC,WAAW,CAACC,UAAUC,QAAAA;AACpB,cAAMC,SAASF,SAASL;AACxB,eAAcQ,eAAQ;UACpB;YACER,IAAI;cAACO;cAAQ;cAAeE,KAAKC,yBAAAA;YACjCR,MAAMS;YACNC,MAAM;YACNC,YAAY;cACVC,OAAO;gBAAC;gBAA6B;kBAAEC,IAAId,KAAKD;gBAAG;;cACnDgB,MAAM;cACNC,aAAa;YACf;UACF;UACA;YACEjB,IAAI;cAACO;cAAQ;cAAcE,KAAKC,yBAAAA;YAChCR,MAAMS;YACNC,MAAM;YACNC,YAAY;cACVC,OAAO;gBAAC;gBAA4B;kBAAEC,IAAId,KAAKD;gBAAG;;cAClDgB,MAAM;cACNC,aAAa;YACf;UACF;SACD;MACH;IACF,CAAA;GACD;AAED,SAAOxB,WAAWyB,YAAYC,OAAO1B,WAAW2B,iBAAiBxB,UAAAA;AACnE,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "Common", "ATTENDABLE_PATH_SEPARATOR", "PLANK_COMPANION_TYPE", "GraphBuilder", "Pipeline", "Capability", "makeModule", "fnUntraced", "extensions", "all", "GraphBuilder", "createTypeExtension", "id", "meta", "type", "Pipeline", "connector", "pipeline", "get", "nodeId", "succeed", "join", "ATTENDABLE_PATH_SEPARATOR", "PLANK_COMPANION_TYPE", "data", "properties", "label", "ns", "icon", "disposition", "contributes", "Common", "AppGraphBuilder"]
7
+ }
@@ -0,0 +1,28 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/meta.ts
8
+ import { trim } from "@dxos/util";
9
+ var meta = {
10
+ id: "dxos.org/plugin/pipeline",
11
+ name: "Pipelines",
12
+ description: trim`
13
+ Pipeline management workspace for organizing tasks, milestones, and deliverables.
14
+ Track progress across multiple pipelines and coordinate team activities in a structured environment.
15
+ `,
16
+ icon: "ph--check-square-offset--regular",
17
+ iconHue: "purple",
18
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-pipeline",
19
+ tags: [
20
+ "labs"
21
+ ]
22
+ };
23
+
24
+ export {
25
+ __export,
26
+ meta
27
+ };
28
+ //# sourceMappingURL=chunk-J5YNPKHT.mjs.map