@sqlrooms/canvas 0.25.0-rc.0 → 0.26.0-rc.1
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/README.md +1 -1
- package/dist/Canvas.js +3 -3
- package/dist/Canvas.js.map +1 -1
- package/dist/CanvasSlice.d.ts +145 -600
- package/dist/CanvasSlice.d.ts.map +1 -1
- package/dist/CanvasSlice.js +49 -51
- package/dist/CanvasSlice.js.map +1 -1
- package/dist/nodes/CanvasNodeContainer.js +1 -1
- package/dist/nodes/CanvasNodeContainer.js.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasSlice.d.ts","sourceRoot":"","sources":["../src/CanvasSlice.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"CanvasSlice.d.ts","sourceRoot":"","sources":["../src/CanvasSlice.ts"],"names":[],"mappings":"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"}
|
package/dist/CanvasSlice.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createId } from '@paralleldrive/cuid2';
|
|
2
|
-
import {
|
|
2
|
+
import { createAiSlice, createDefaultAiTools, createDefaultAiInstructions, } from '@sqlrooms/ai';
|
|
3
3
|
import { escapeId } from '@sqlrooms/duckdb';
|
|
4
4
|
import { createSlice, useBaseRoomShellStore, } from '@sqlrooms/room-shell';
|
|
5
5
|
import { createVegaChartTool } from '@sqlrooms/vega';
|
|
@@ -51,40 +51,38 @@ export const CanvasEdgeSchema = z.object({
|
|
|
51
51
|
source: z.string(),
|
|
52
52
|
target: z.string(),
|
|
53
53
|
});
|
|
54
|
-
export const CanvasSliceConfig = z
|
|
55
|
-
.object({
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
y: z.number(),
|
|
60
|
-
zoom: z.number(),
|
|
61
|
-
}),
|
|
62
|
-
nodes: z.array(CanvasNodeSchema).default([]),
|
|
63
|
-
edges: z.array(CanvasEdgeSchema).default([]),
|
|
54
|
+
export const CanvasSliceConfig = z.object({
|
|
55
|
+
viewport: z.object({
|
|
56
|
+
x: z.number(),
|
|
57
|
+
y: z.number(),
|
|
58
|
+
zoom: z.number(),
|
|
64
59
|
}),
|
|
65
|
-
|
|
66
|
-
.
|
|
67
|
-
|
|
60
|
+
nodes: z.array(CanvasNodeSchema).default([]),
|
|
61
|
+
edges: z.array(CanvasEdgeSchema).default([]),
|
|
62
|
+
});
|
|
63
|
+
export function createDefaultCanvasConfig(props) {
|
|
68
64
|
return {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
...props,
|
|
74
|
-
},
|
|
75
|
-
...createDefaultAiConfig({}),
|
|
65
|
+
viewport: { x: 0, y: 0, zoom: 1 },
|
|
66
|
+
nodes: [],
|
|
67
|
+
edges: [],
|
|
68
|
+
...props,
|
|
76
69
|
};
|
|
77
70
|
}
|
|
78
71
|
export function createCanvasSlice(props) {
|
|
79
72
|
return createSlice((set, get, store) => ({
|
|
80
73
|
...createAiSlice({
|
|
81
|
-
|
|
82
|
-
|
|
74
|
+
getInstructions: () => {
|
|
75
|
+
return createDefaultAiInstructions(store);
|
|
76
|
+
},
|
|
77
|
+
tools: {
|
|
78
|
+
...createDefaultAiTools(store),
|
|
83
79
|
chart: createVegaChartTool(),
|
|
84
|
-
...props.
|
|
80
|
+
...props.ai?.tools,
|
|
85
81
|
},
|
|
82
|
+
...props.ai,
|
|
86
83
|
})(set, get, store),
|
|
87
84
|
canvas: {
|
|
85
|
+
config: createDefaultCanvasConfig(props.config),
|
|
88
86
|
isAssistantOpen: false,
|
|
89
87
|
sqlResults: {},
|
|
90
88
|
setAssistantOpen: (isAssistantOpen) => {
|
|
@@ -94,12 +92,12 @@ export function createCanvasSlice(props) {
|
|
|
94
92
|
},
|
|
95
93
|
async initialize() {
|
|
96
94
|
// Execute SQL nodes in topological order based on edges
|
|
97
|
-
const nodes = get().config.
|
|
98
|
-
const edges = get().config.
|
|
95
|
+
const nodes = get().canvas.config.nodes;
|
|
96
|
+
const edges = get().canvas.config.edges;
|
|
99
97
|
const order = topoSortAll(nodes, edges);
|
|
100
98
|
// Execute SQL nodes sequentially to ensure parents finish before children
|
|
101
99
|
for (const nodeId of order) {
|
|
102
|
-
const node = findNodeById(get().config.
|
|
100
|
+
const node = findNodeById(get().canvas.config.nodes, nodeId);
|
|
103
101
|
if (!node || !isSqlData(node.data))
|
|
104
102
|
continue;
|
|
105
103
|
const sqlText = node.data.sql || '';
|
|
@@ -114,7 +112,7 @@ export function createCanvasSlice(props) {
|
|
|
114
112
|
const newId = createId();
|
|
115
113
|
set((state) => produce(state, (draft) => {
|
|
116
114
|
const parent = parentId
|
|
117
|
-
? findNodeById(draft.config.
|
|
115
|
+
? findNodeById(draft.canvas.config.nodes, parentId)
|
|
118
116
|
: undefined;
|
|
119
117
|
const position = initialPosition
|
|
120
118
|
? initialPosition
|
|
@@ -124,8 +122,8 @@ export function createCanvasSlice(props) {
|
|
|
124
122
|
y: parent.position.y,
|
|
125
123
|
}
|
|
126
124
|
: {
|
|
127
|
-
x: draft.config.
|
|
128
|
-
y: draft.config.
|
|
125
|
+
x: draft.canvas.config.viewport.x + 100,
|
|
126
|
+
y: draft.canvas.config.viewport.y + 100,
|
|
129
127
|
};
|
|
130
128
|
const firstTable = draft.db.tables.find((t) => t.table.schema === 'main');
|
|
131
129
|
const getInitialSqlForNewSqlNode = () => {
|
|
@@ -142,9 +140,9 @@ export function createCanvasSlice(props) {
|
|
|
142
140
|
? `SELECT * FROM ${firstTable.table.table}`
|
|
143
141
|
: `SELECT 1`;
|
|
144
142
|
};
|
|
145
|
-
const newSqlTitle = getUniqueSqlTitle(draft.config.
|
|
143
|
+
const newSqlTitle = getUniqueSqlTitle(draft.canvas.config.nodes, 'Query');
|
|
146
144
|
const initialSql = getInitialSqlForNewSqlNode();
|
|
147
|
-
draft.config.
|
|
145
|
+
draft.canvas.config.nodes.push({
|
|
148
146
|
id: newId,
|
|
149
147
|
position,
|
|
150
148
|
width: DEFAULT_NODE_WIDTH,
|
|
@@ -162,7 +160,7 @@ export function createCanvasSlice(props) {
|
|
|
162
160
|
}),
|
|
163
161
|
});
|
|
164
162
|
if (parentId) {
|
|
165
|
-
draft.config.
|
|
163
|
+
draft.canvas.config.edges.push({
|
|
166
164
|
id: `${parentId}-${newId}`,
|
|
167
165
|
source: parentId,
|
|
168
166
|
target: newId,
|
|
@@ -172,8 +170,8 @@ export function createCanvasSlice(props) {
|
|
|
172
170
|
return newId;
|
|
173
171
|
},
|
|
174
172
|
executeDownstreamFrom: async (nodeId) => {
|
|
175
|
-
const allNodes = get().config.
|
|
176
|
-
const allEdges = get().config.
|
|
173
|
+
const allNodes = get().canvas.config.nodes;
|
|
174
|
+
const allEdges = get().canvas.config.edges;
|
|
177
175
|
const downstreamOrder = topoSortDownstream(nodeId, allNodes, allEdges);
|
|
178
176
|
for (const childId of downstreamOrder) {
|
|
179
177
|
const child = findNodeById(allNodes, childId);
|
|
@@ -188,24 +186,24 @@ export function createCanvasSlice(props) {
|
|
|
188
186
|
},
|
|
189
187
|
addEdge: (connection) => {
|
|
190
188
|
set((state) => produce(state, (draft) => {
|
|
191
|
-
draft.config.
|
|
189
|
+
draft.canvas.config.edges = addEdge(connection, draft.canvas.config.edges);
|
|
192
190
|
}));
|
|
193
191
|
},
|
|
194
192
|
updateNode: (nodeId, updater) => {
|
|
195
193
|
set((state) => produce(state, (draft) => {
|
|
196
|
-
const node = findNodeById(draft.config.
|
|
194
|
+
const node = findNodeById(draft.canvas.config.nodes, nodeId);
|
|
197
195
|
if (node) {
|
|
198
196
|
node.data = updater(node.data);
|
|
199
197
|
}
|
|
200
198
|
}));
|
|
201
199
|
},
|
|
202
200
|
renameNode: async (nodeId, newTitle) => {
|
|
203
|
-
const node = findNodeById(get().config.
|
|
201
|
+
const node = findNodeById(get().canvas.config.nodes, nodeId);
|
|
204
202
|
if (!node)
|
|
205
203
|
throw new Error('Node not found');
|
|
206
204
|
if (!isSqlData(node.data)) {
|
|
207
205
|
set((state) => produce(state, (draft) => {
|
|
208
|
-
const dnode = findNodeById(draft.config.
|
|
206
|
+
const dnode = findNodeById(draft.canvas.config.nodes, nodeId);
|
|
209
207
|
if (dnode)
|
|
210
208
|
dnode.data.title = newTitle;
|
|
211
209
|
}));
|
|
@@ -215,7 +213,7 @@ export function createCanvasSlice(props) {
|
|
|
215
213
|
if (prevTitle === newTitle)
|
|
216
214
|
return;
|
|
217
215
|
// Ensure title uniqueness among SQL nodes by adjusting to a unique variant
|
|
218
|
-
const uniqueTitle = getUniqueSqlTitle(get().config.
|
|
216
|
+
const uniqueTitle = getUniqueSqlTitle(get().canvas.config.nodes, newTitle, nodeId);
|
|
219
217
|
const connector = await get().db.getConnector();
|
|
220
218
|
await connector.query(`CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`);
|
|
221
219
|
const result = get().canvas.sqlResults[nodeId];
|
|
@@ -225,7 +223,7 @@ export function createCanvasSlice(props) {
|
|
|
225
223
|
await connector.query(`ALTER TABLE ${oldTableName} RENAME TO ${escapeId(uniqueTitle)}`);
|
|
226
224
|
const newQualified = `${CANVAS_SCHEMA_NAME}.${escapeId(uniqueTitle)}`;
|
|
227
225
|
set((state) => produce(state, (draft) => {
|
|
228
|
-
const dnode = findNodeById(draft.config.
|
|
226
|
+
const dnode = findNodeById(draft.canvas.config.nodes, nodeId);
|
|
229
227
|
if (dnode)
|
|
230
228
|
dnode.data.title = uniqueTitle;
|
|
231
229
|
const r = draft.canvas.sqlResults[nodeId];
|
|
@@ -238,7 +236,7 @@ export function createCanvasSlice(props) {
|
|
|
238
236
|
},
|
|
239
237
|
deleteNode: (nodeId) => {
|
|
240
238
|
const current = get();
|
|
241
|
-
const node = findNodeById(current.config.
|
|
239
|
+
const node = findNodeById(current.canvas.config.nodes, nodeId);
|
|
242
240
|
let tableToDrop;
|
|
243
241
|
if (node && isSqlData(node.data)) {
|
|
244
242
|
const title = node.data.title || 'result';
|
|
@@ -249,13 +247,13 @@ export function createCanvasSlice(props) {
|
|
|
249
247
|
: `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;
|
|
250
248
|
}
|
|
251
249
|
set((state) => produce(state, (draft) => {
|
|
252
|
-
draft.config.
|
|
253
|
-
draft.config.
|
|
250
|
+
draft.canvas.config.nodes = draft.canvas.config.nodes.filter((n) => n.id !== nodeId);
|
|
251
|
+
draft.canvas.config.edges = draft.canvas.config.edges.filter((e) => e.source !== nodeId && e.target !== nodeId);
|
|
254
252
|
// Clear stored result for the node
|
|
255
253
|
delete draft.canvas.sqlResults[nodeId];
|
|
256
|
-
if (draft.config.
|
|
257
|
-
draft.config.
|
|
258
|
-
draft.config.
|
|
254
|
+
if (draft.canvas.config.nodes.length === 0) {
|
|
255
|
+
draft.canvas.config.viewport.x = 0;
|
|
256
|
+
draft.canvas.config.viewport.y = 0;
|
|
259
257
|
}
|
|
260
258
|
}));
|
|
261
259
|
if (tableToDrop) {
|
|
@@ -274,21 +272,21 @@ export function createCanvasSlice(props) {
|
|
|
274
272
|
},
|
|
275
273
|
applyNodeChanges: (changes) => {
|
|
276
274
|
set((state) => produce(state, (draft) => {
|
|
277
|
-
draft.config.
|
|
275
|
+
draft.canvas.config.nodes = applyNodeChanges(changes, draft.canvas.config.nodes);
|
|
278
276
|
}));
|
|
279
277
|
},
|
|
280
278
|
applyEdgeChanges: (changes) => {
|
|
281
279
|
set((state) => produce(state, (draft) => {
|
|
282
|
-
draft.config.
|
|
280
|
+
draft.canvas.config.edges = applyEdgeChanges(changes, draft.canvas.config.edges);
|
|
283
281
|
}));
|
|
284
282
|
},
|
|
285
283
|
setViewport: (viewport) => {
|
|
286
284
|
set((state) => produce(state, (draft) => {
|
|
287
|
-
draft.config.
|
|
285
|
+
draft.canvas.config.viewport = viewport;
|
|
288
286
|
}));
|
|
289
287
|
},
|
|
290
288
|
executeSqlNodeQuery: async (nodeId, opts) => {
|
|
291
|
-
const node = findNodeById(get().config.
|
|
289
|
+
const node = findNodeById(get().canvas.config.nodes, nodeId);
|
|
292
290
|
if (!node || !isSqlData(node.data))
|
|
293
291
|
return;
|
|
294
292
|
const sql = node.data.sql || '';
|
package/dist/CanvasSlice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasSlice.js","sourceRoot":"","sources":["../src/CanvasSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n AiSliceConfig,\n AiSliceState,\n createAiSlice,\n createDefaultAiConfig,\n} from '@sqlrooms/ai';\nimport {escapeId} from '@sqlrooms/duckdb';\nimport {\n BaseRoomConfig,\n createSlice,\n RoomShellSliceState,\n useBaseRoomShellStore,\n} from '@sqlrooms/room-shell';\nimport {createVegaChartTool} from '@sqlrooms/vega';\nimport type {Viewport, XYPosition} from '@xyflow/react';\nimport {\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n Connection,\n type EdgeChange,\n type NodeChange,\n} from '@xyflow/react';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {findNodeById, topoSortAll, topoSortDownstream} from './dag';\n\nconst DEFAULT_NODE_WIDTH = 800;\nconst DEFAULT_NODE_HEIGHT = 600;\nconst CANVAS_SCHEMA_NAME = 'canvas';\n\nexport const CanvasNodeTypes = z.enum(['sql', 'vega']);\nexport type CanvasNodeTypes = z.infer<typeof CanvasNodeTypes>;\n\nexport const CanvasNodeData = z.discriminatedUnion('type', [\n z.object({\n title: z.string().default('Untitled'),\n type: z.literal('sql'),\n sql: z.string().optional(),\n }),\n z.object({\n title: z.string().default('Untitled'),\n type: z.literal('vega'),\n sql: z.string().optional(),\n vegaSpec: z.any().optional(),\n }),\n]);\nexport type CanvasNodeData = z.infer<typeof CanvasNodeData>;\n\ntype SqlData = Extract<CanvasNodeData, {type: 'sql'}>;\nfunction isSqlData(data: CanvasNodeData): data is SqlData {\n return data.type === 'sql';\n}\n\nfunction getUniqueSqlTitle(\n nodes: CanvasNodeSchema[],\n baseTitle: string,\n excludeNodeId?: string,\n): string {\n const existing = new Set(\n nodes\n .filter((n) => n.type === 'sql' && n.id !== (excludeNodeId || ''))\n .map((n) => n.data.title || ''),\n );\n if (!existing.has(baseTitle)) return baseTitle;\n let counter = 1;\n while (existing.has(`${baseTitle} ${counter}`)) counter += 1;\n return `${baseTitle} ${counter}`;\n}\n\nexport const CanvasNodeSchema = z.object({\n id: z.string(),\n position: z.object({x: z.number(), y: z.number()}),\n type: CanvasNodeTypes,\n data: CanvasNodeData,\n width: z.number(),\n height: z.number(),\n});\nexport type CanvasNodeSchema = z.infer<typeof CanvasNodeSchema>;\n\nexport const CanvasEdgeSchema = z.object({\n id: z.string(),\n source: z.string(),\n target: z.string(),\n});\nexport type CanvasEdgeSchema = z.infer<typeof CanvasEdgeSchema>;\n\nexport type SqlNodeQueryResult =\n | {status: 'idle'}\n | {status: 'loading'}\n | {status: 'error'; error: string}\n | {status: 'success'; tableName: string; lastQueryStatement: string};\n\nexport const CanvasSliceConfig = z\n .object({\n canvas: z.object({\n viewport: z.object({\n x: z.number(),\n y: z.number(),\n zoom: z.number(),\n }),\n nodes: z.array(CanvasNodeSchema).default([]),\n edges: z.array(CanvasEdgeSchema).default([]),\n }),\n })\n .merge(AiSliceConfig);\nexport type CanvasSliceConfig = z.infer<typeof CanvasSliceConfig>;\n\nexport type CanvasSliceState = AiSliceState & {\n canvas: {\n isAssistantOpen: boolean;\n sqlResults: Record<string, SqlNodeQueryResult>;\n initialize: () => Promise<void>;\n setViewport: (viewport: Viewport) => void;\n setAssistantOpen: (isAssistantOpen: boolean) => void;\n addNode: (params: {\n parentId?: string;\n nodeType?: CanvasNodeTypes;\n initialPosition?: XYPosition;\n }) => string;\n executeDownstreamFrom: (nodeId: string) => Promise<void>;\n renameNode: (nodeId: string, newTitle: string) => Promise<void>;\n updateNode: (\n nodeId: string,\n updater: (data: CanvasNodeData) => CanvasNodeData,\n ) => void;\n deleteNode: (nodeId: string) => void;\n applyNodeChanges: (changes: NodeChange<CanvasNodeSchema>[]) => void;\n applyEdgeChanges: (changes: EdgeChange<CanvasEdgeSchema>[]) => void;\n addEdge: (edge: Connection) => void;\n executeSqlNodeQuery: (\n nodeId: string,\n opts?: {cascade?: boolean},\n ) => Promise<void>;\n };\n};\n\nexport function createDefaultCanvasConfig(\n props: Partial<CanvasSliceConfig['canvas']> = {},\n): CanvasSliceConfig {\n return {\n canvas: {\n viewport: {x: 0, y: 0, zoom: 1},\n nodes: [],\n edges: [],\n ...props,\n },\n ...createDefaultAiConfig({}),\n };\n}\n\nexport function createCanvasSlice<\n PC extends BaseRoomConfig & CanvasSliceConfig,\n>(props: Parameters<typeof createAiSlice<PC>>[0]) {\n return createSlice<PC, CanvasSliceState>((set, get, store) => ({\n ...createAiSlice({\n ...props,\n customTools: {\n chart: createVegaChartTool(),\n ...props.customTools,\n },\n })(set, get, store),\n canvas: {\n isAssistantOpen: false,\n sqlResults: {},\n setAssistantOpen: (isAssistantOpen) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.isAssistantOpen = isAssistantOpen;\n }),\n );\n },\n\n async initialize() {\n // Execute SQL nodes in topological order based on edges\n const nodes = get().config.canvas.nodes;\n const edges = get().config.canvas.edges;\n\n const order = topoSortAll(nodes, edges);\n\n // Execute SQL nodes sequentially to ensure parents finish before children\n for (const nodeId of order) {\n const node = findNodeById(get().config.canvas.nodes, nodeId);\n if (!node || !isSqlData(node.data)) continue;\n const sqlText = node.data.sql || '';\n if (!sqlText.trim()) continue;\n // Await ensures table creation completes before children execute\n await get().canvas.executeSqlNodeQuery(nodeId, {cascade: false});\n }\n\n await get().db.refreshTableSchemas();\n },\n\n addNode: ({\n parentId,\n nodeType = 'sql',\n initialPosition,\n }: {\n parentId?: string;\n nodeType?: CanvasNodeTypes;\n initialPosition?: XYPosition;\n }) => {\n const newId = createId();\n set((state) =>\n produce(state, (draft) => {\n const parent = parentId\n ? findNodeById(draft.config.canvas.nodes, parentId)\n : undefined;\n const position: XYPosition = initialPosition\n ? initialPosition\n : parent\n ? {\n x: parent.position.x + parent.width + 100,\n y: parent.position.y,\n }\n : {\n x: draft.config.canvas.viewport.x + 100,\n y: draft.config.canvas.viewport.y + 100,\n };\n const firstTable = draft.db.tables.find(\n (t) => t.table.schema === 'main',\n );\n\n const getInitialSqlForNewSqlNode = () => {\n if (parent && isSqlData(parent.data)) {\n const parentResults = draft.canvas.sqlResults[parent.id];\n const parentTitle = parent.data.title || 'Query';\n const fallbackParentTable = `${CANVAS_SCHEMA_NAME}.${escapeId(parentTitle)}`;\n const parentTableName =\n parentResults && parentResults.status === 'success'\n ? parentResults.tableName\n : fallbackParentTable;\n return `SELECT * FROM ${parentTableName}`;\n }\n return firstTable\n ? `SELECT * FROM ${firstTable.table.table}`\n : `SELECT 1`;\n };\n\n const newSqlTitle = getUniqueSqlTitle(\n draft.config.canvas.nodes,\n 'Query',\n );\n const initialSql = getInitialSqlForNewSqlNode();\n\n draft.config.canvas.nodes.push({\n id: newId,\n position,\n width: DEFAULT_NODE_WIDTH,\n height: DEFAULT_NODE_HEIGHT,\n type: nodeType,\n data: (nodeType === 'sql'\n ? {\n title: newSqlTitle,\n type: 'sql',\n sql: initialSql,\n }\n : {\n title: 'Chart',\n type: 'vega',\n }) as CanvasNodeData,\n });\n if (parentId) {\n draft.config.canvas.edges.push({\n id: `${parentId}-${newId}`,\n source: parentId,\n target: newId,\n });\n }\n }),\n );\n return newId;\n },\n\n executeDownstreamFrom: async (nodeId: string) => {\n const allNodes = get().config.canvas.nodes;\n const allEdges = get().config.canvas.edges;\n const downstreamOrder = topoSortDownstream(nodeId, allNodes, allEdges);\n for (const childId of downstreamOrder) {\n const child = findNodeById(allNodes, childId);\n if (!child || !isSqlData(child.data)) continue;\n const text = child.data.sql || '';\n if (!text.trim()) continue;\n await get().canvas.executeSqlNodeQuery(childId, {cascade: false});\n }\n await get().db.refreshTableSchemas();\n },\n\n addEdge: (connection) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.edges = addEdge(\n connection,\n draft.config.canvas.edges,\n );\n }),\n );\n },\n\n updateNode: (nodeId, updater) => {\n set((state) =>\n produce(state, (draft) => {\n const node = findNodeById(draft.config.canvas.nodes, nodeId);\n if (node) {\n node.data = updater(node.data as CanvasNodeData);\n }\n }),\n );\n },\n\n renameNode: async (nodeId: string, newTitle: string) => {\n const node = findNodeById(get().config.canvas.nodes, nodeId);\n if (!node) throw new Error('Node not found');\n if (!isSqlData(node.data)) {\n set((state) =>\n produce(state, (draft) => {\n const dnode = findNodeById(draft.config.canvas.nodes, nodeId);\n if (dnode) dnode.data.title = newTitle;\n }),\n );\n return;\n }\n\n const prevTitle = node.data.title || 'result';\n if (prevTitle === newTitle) return;\n\n // Ensure title uniqueness among SQL nodes by adjusting to a unique variant\n const uniqueTitle = getUniqueSqlTitle(\n get().config.canvas.nodes,\n newTitle,\n nodeId,\n );\n\n const connector = await get().db.getConnector();\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`,\n );\n\n const result = get().canvas.sqlResults[nodeId];\n const oldTableName =\n result && result.status === 'success'\n ? result.tableName\n : `${CANVAS_SCHEMA_NAME}.${escapeId(prevTitle)}`;\n\n await connector.query(\n `ALTER TABLE ${oldTableName} RENAME TO ${escapeId(uniqueTitle)}`,\n );\n\n const newQualified = `${CANVAS_SCHEMA_NAME}.${escapeId(uniqueTitle)}`;\n set((state) =>\n produce(state, (draft) => {\n const dnode = findNodeById(draft.config.canvas.nodes, nodeId);\n if (dnode) dnode.data.title = uniqueTitle;\n const r = draft.canvas.sqlResults[nodeId];\n if (r && r.status === 'success') r.tableName = newQualified;\n }),\n );\n\n await get().db.refreshTableSchemas();\n\n // Recompute children since upstream table name changed\n await get().canvas.executeDownstreamFrom(nodeId);\n },\n\n deleteNode: (nodeId) => {\n const current = get();\n const node = findNodeById(current.config.canvas.nodes, nodeId);\n let tableToDrop: string | undefined;\n if (node && isSqlData(node.data)) {\n const title = node.data.title || 'result';\n const res = current.canvas.sqlResults[nodeId];\n tableToDrop =\n res && res.status === 'success'\n ? res.tableName\n : `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.nodes = draft.config.canvas.nodes.filter(\n (n) => n.id !== nodeId,\n );\n draft.config.canvas.edges = draft.config.canvas.edges.filter(\n (e) => e.source !== nodeId && e.target !== nodeId,\n );\n // Clear stored result for the node\n delete draft.canvas.sqlResults[nodeId];\n if (draft.config.canvas.nodes.length === 0) {\n draft.config.canvas.viewport.x = 0;\n draft.config.canvas.viewport.y = 0;\n }\n }),\n );\n\n if (tableToDrop) {\n (async () => {\n try {\n const connector = await get().db.getConnector();\n await connector.query(`DROP TABLE IF EXISTS ${tableToDrop}`);\n await get().db.refreshTableSchemas();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\n '[canvas.deleteNode] Failed to drop table for node',\n nodeId,\n e,\n );\n }\n })();\n }\n },\n\n applyNodeChanges: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.nodes = applyNodeChanges(\n changes,\n draft.config.canvas.nodes,\n );\n }),\n );\n },\n\n applyEdgeChanges: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.edges = applyEdgeChanges(\n changes,\n draft.config.canvas.edges,\n );\n }),\n );\n },\n\n setViewport: (viewport) => {\n set((state) =>\n produce(state, (draft) => {\n draft.config.canvas.viewport = viewport;\n }),\n );\n },\n\n executeSqlNodeQuery: async (\n nodeId: string,\n opts?: {cascade?: boolean},\n ) => {\n const node = findNodeById(get().config.canvas.nodes, nodeId);\n if (!node || !isSqlData(node.data)) return;\n const sql = node.data.sql || '';\n const title = node.data.title || 'result';\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {status: 'loading'};\n }),\n );\n\n try {\n // Validate it's a single select\n const parsed = await get().db.sqlSelectToJson(sql);\n if (parsed.error) {\n throw new Error(\n parsed.error_message || 'Not a valid SELECT statement',\n );\n }\n\n // Create schema and table\n const connector = await get().db.getConnector();\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`,\n );\n\n const tableName = `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;\n await connector.query(\n `CREATE OR REPLACE TABLE ${tableName} AS ${sql}`,\n );\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {\n status: 'success',\n tableName,\n lastQueryStatement: sql,\n };\n }),\n );\n\n // Cascade execution to downstream SQL nodes (topologically) unless disabled\n if (opts?.cascade !== false) {\n await get().canvas.executeDownstreamFrom(nodeId);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {\n status: 'error',\n error: message,\n };\n }),\n );\n }\n },\n },\n }));\n}\n\n// Types to integrate with room-shell selector\nexport type RoomConfigWithCanvas = BaseRoomConfig & CanvasSliceConfig;\nexport type RoomShellSliceStateWithCanvas =\n RoomShellSliceState<RoomConfigWithCanvas> & CanvasSliceState;\n\nexport function useStoreWithCanvas<T>(\n selector: (state: RoomShellSliceStateWithCanvas) => T,\n): T {\n return useBaseRoomShellStore<\n BaseRoomConfig & CanvasSliceConfig,\n RoomShellSliceState<RoomConfigWithCanvas>,\n T\n >((state) => selector(state as unknown as RoomShellSliceStateWithCanvas));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CanvasSlice.js","sourceRoot":"","sources":["../src/CanvasSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {createId} from '@paralleldrive/cuid2';\nimport {\n AiSliceState,\n createAiSlice,\n createDefaultAiTools,\n createDefaultAiInstructions,\n} from '@sqlrooms/ai';\nimport {escapeId} from '@sqlrooms/duckdb';\nimport {\n BaseRoomConfig,\n createSlice,\n RoomShellSliceState,\n useBaseRoomShellStore,\n} from '@sqlrooms/room-shell';\nimport {createVegaChartTool} from '@sqlrooms/vega';\nimport type {Viewport, XYPosition} from '@xyflow/react';\nimport {\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n Connection,\n type EdgeChange,\n type NodeChange,\n} from '@xyflow/react';\nimport {produce} from 'immer';\nimport {z} from 'zod';\nimport {findNodeById, topoSortAll, topoSortDownstream} from './dag';\n\nconst DEFAULT_NODE_WIDTH = 800;\nconst DEFAULT_NODE_HEIGHT = 600;\nconst CANVAS_SCHEMA_NAME = 'canvas';\n\nexport const CanvasNodeTypes = z.enum(['sql', 'vega']);\nexport type CanvasNodeTypes = z.infer<typeof CanvasNodeTypes>;\n\nexport const CanvasNodeData = z.discriminatedUnion('type', [\n z.object({\n title: z.string().default('Untitled'),\n type: z.literal('sql'),\n sql: z.string().optional(),\n }),\n z.object({\n title: z.string().default('Untitled'),\n type: z.literal('vega'),\n sql: z.string().optional(),\n vegaSpec: z.any().optional(),\n }),\n]);\nexport type CanvasNodeData = z.infer<typeof CanvasNodeData>;\n\ntype SqlData = Extract<CanvasNodeData, {type: 'sql'}>;\nfunction isSqlData(data: CanvasNodeData): data is SqlData {\n return data.type === 'sql';\n}\n\nfunction getUniqueSqlTitle(\n nodes: CanvasNodeSchema[],\n baseTitle: string,\n excludeNodeId?: string,\n): string {\n const existing = new Set(\n nodes\n .filter((n) => n.type === 'sql' && n.id !== (excludeNodeId || ''))\n .map((n) => n.data.title || ''),\n );\n if (!existing.has(baseTitle)) return baseTitle;\n let counter = 1;\n while (existing.has(`${baseTitle} ${counter}`)) counter += 1;\n return `${baseTitle} ${counter}`;\n}\n\nexport const CanvasNodeSchema = z.object({\n id: z.string(),\n position: z.object({x: z.number(), y: z.number()}),\n type: CanvasNodeTypes,\n data: CanvasNodeData,\n width: z.number(),\n height: z.number(),\n});\nexport type CanvasNodeSchema = z.infer<typeof CanvasNodeSchema>;\n\nexport const CanvasEdgeSchema = z.object({\n id: z.string(),\n source: z.string(),\n target: z.string(),\n});\nexport type CanvasEdgeSchema = z.infer<typeof CanvasEdgeSchema>;\n\nexport type SqlNodeQueryResult =\n | {status: 'idle'}\n | {status: 'loading'}\n | {status: 'error'; error: string}\n | {status: 'success'; tableName: string; lastQueryStatement: string};\n\nexport const CanvasSliceConfig = z.object({\n viewport: z.object({\n x: z.number(),\n y: z.number(),\n zoom: z.number(),\n }),\n nodes: z.array(CanvasNodeSchema).default([]),\n edges: z.array(CanvasEdgeSchema).default([]),\n});\nexport type CanvasSliceConfig = z.infer<typeof CanvasSliceConfig>;\n\nexport type CanvasSliceState = AiSliceState & {\n canvas: {\n config: CanvasSliceConfig;\n isAssistantOpen: boolean;\n sqlResults: Record<string, SqlNodeQueryResult>;\n initialize: () => Promise<void>;\n setViewport: (viewport: Viewport) => void;\n setAssistantOpen: (isAssistantOpen: boolean) => void;\n addNode: (params: {\n parentId?: string;\n nodeType?: CanvasNodeTypes;\n initialPosition?: XYPosition;\n }) => string;\n executeDownstreamFrom: (nodeId: string) => Promise<void>;\n renameNode: (nodeId: string, newTitle: string) => Promise<void>;\n updateNode: (\n nodeId: string,\n updater: (data: CanvasNodeData) => CanvasNodeData,\n ) => void;\n deleteNode: (nodeId: string) => void;\n applyNodeChanges: (changes: NodeChange<CanvasNodeSchema>[]) => void;\n applyEdgeChanges: (changes: EdgeChange<CanvasEdgeSchema>[]) => void;\n addEdge: (edge: Connection) => void;\n executeSqlNodeQuery: (\n nodeId: string,\n opts?: {cascade?: boolean},\n ) => Promise<void>;\n };\n};\n\nexport function createDefaultCanvasConfig(\n props?: Partial<CanvasSliceConfig>,\n): CanvasSliceConfig {\n return {\n viewport: {x: 0, y: 0, zoom: 1},\n nodes: [],\n edges: [],\n ...props,\n };\n}\n\nexport function createCanvasSlice<\n PC extends BaseRoomConfig = BaseRoomConfig,\n>(props: {\n config?: Partial<CanvasSliceConfig>;\n ai?: Partial<Parameters<typeof createAiSlice<PC>>[0]>;\n}) {\n return createSlice<PC, CanvasSliceState>((set, get, store) => ({\n ...createAiSlice({\n getInstructions: () => {\n return createDefaultAiInstructions(store);\n },\n tools: {\n ...createDefaultAiTools(store),\n chart: createVegaChartTool(),\n ...props.ai?.tools,\n },\n ...props.ai,\n })(set, get, store),\n canvas: {\n config: createDefaultCanvasConfig(props.config),\n isAssistantOpen: false,\n sqlResults: {},\n setAssistantOpen: (isAssistantOpen) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.isAssistantOpen = isAssistantOpen;\n }),\n );\n },\n\n async initialize() {\n // Execute SQL nodes in topological order based on edges\n const nodes = get().canvas.config.nodes;\n const edges = get().canvas.config.edges;\n\n const order = topoSortAll(nodes, edges);\n\n // Execute SQL nodes sequentially to ensure parents finish before children\n for (const nodeId of order) {\n const node = findNodeById(get().canvas.config.nodes, nodeId);\n if (!node || !isSqlData(node.data)) continue;\n const sqlText = node.data.sql || '';\n if (!sqlText.trim()) continue;\n // Await ensures table creation completes before children execute\n await get().canvas.executeSqlNodeQuery(nodeId, {cascade: false});\n }\n\n await get().db.refreshTableSchemas();\n },\n\n addNode: ({\n parentId,\n nodeType = 'sql',\n initialPosition,\n }: {\n parentId?: string;\n nodeType?: CanvasNodeTypes;\n initialPosition?: XYPosition;\n }) => {\n const newId = createId();\n set((state) =>\n produce(state, (draft) => {\n const parent = parentId\n ? findNodeById(draft.canvas.config.nodes, parentId)\n : undefined;\n const position: XYPosition = initialPosition\n ? initialPosition\n : parent\n ? {\n x: parent.position.x + parent.width + 100,\n y: parent.position.y,\n }\n : {\n x: draft.canvas.config.viewport.x + 100,\n y: draft.canvas.config.viewport.y + 100,\n };\n const firstTable = draft.db.tables.find(\n (t) => t.table.schema === 'main',\n );\n\n const getInitialSqlForNewSqlNode = () => {\n if (parent && isSqlData(parent.data)) {\n const parentResults = draft.canvas.sqlResults[parent.id];\n const parentTitle = parent.data.title || 'Query';\n const fallbackParentTable = `${CANVAS_SCHEMA_NAME}.${escapeId(parentTitle)}`;\n const parentTableName =\n parentResults && parentResults.status === 'success'\n ? parentResults.tableName\n : fallbackParentTable;\n return `SELECT * FROM ${parentTableName}`;\n }\n return firstTable\n ? `SELECT * FROM ${firstTable.table.table}`\n : `SELECT 1`;\n };\n\n const newSqlTitle = getUniqueSqlTitle(\n draft.canvas.config.nodes,\n 'Query',\n );\n const initialSql = getInitialSqlForNewSqlNode();\n\n draft.canvas.config.nodes.push({\n id: newId,\n position,\n width: DEFAULT_NODE_WIDTH,\n height: DEFAULT_NODE_HEIGHT,\n type: nodeType,\n data: (nodeType === 'sql'\n ? {\n title: newSqlTitle,\n type: 'sql',\n sql: initialSql,\n }\n : {\n title: 'Chart',\n type: 'vega',\n }) as CanvasNodeData,\n });\n if (parentId) {\n draft.canvas.config.edges.push({\n id: `${parentId}-${newId}`,\n source: parentId,\n target: newId,\n });\n }\n }),\n );\n return newId;\n },\n\n executeDownstreamFrom: async (nodeId: string) => {\n const allNodes = get().canvas.config.nodes;\n const allEdges = get().canvas.config.edges;\n const downstreamOrder = topoSortDownstream(nodeId, allNodes, allEdges);\n for (const childId of downstreamOrder) {\n const child = findNodeById(allNodes, childId);\n if (!child || !isSqlData(child.data)) continue;\n const text = child.data.sql || '';\n if (!text.trim()) continue;\n await get().canvas.executeSqlNodeQuery(childId, {cascade: false});\n }\n await get().db.refreshTableSchemas();\n },\n\n addEdge: (connection) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.edges = addEdge(\n connection,\n draft.canvas.config.edges,\n );\n }),\n );\n },\n\n updateNode: (nodeId, updater) => {\n set((state) =>\n produce(state, (draft) => {\n const node = findNodeById(draft.canvas.config.nodes, nodeId);\n if (node) {\n node.data = updater(node.data as CanvasNodeData);\n }\n }),\n );\n },\n\n renameNode: async (nodeId: string, newTitle: string) => {\n const node = findNodeById(get().canvas.config.nodes, nodeId);\n if (!node) throw new Error('Node not found');\n if (!isSqlData(node.data)) {\n set((state) =>\n produce(state, (draft) => {\n const dnode = findNodeById(draft.canvas.config.nodes, nodeId);\n if (dnode) dnode.data.title = newTitle;\n }),\n );\n return;\n }\n\n const prevTitle = node.data.title || 'result';\n if (prevTitle === newTitle) return;\n\n // Ensure title uniqueness among SQL nodes by adjusting to a unique variant\n const uniqueTitle = getUniqueSqlTitle(\n get().canvas.config.nodes,\n newTitle,\n nodeId,\n );\n\n const connector = await get().db.getConnector();\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`,\n );\n\n const result = get().canvas.sqlResults[nodeId];\n const oldTableName =\n result && result.status === 'success'\n ? result.tableName\n : `${CANVAS_SCHEMA_NAME}.${escapeId(prevTitle)}`;\n\n await connector.query(\n `ALTER TABLE ${oldTableName} RENAME TO ${escapeId(uniqueTitle)}`,\n );\n\n const newQualified = `${CANVAS_SCHEMA_NAME}.${escapeId(uniqueTitle)}`;\n set((state) =>\n produce(state, (draft) => {\n const dnode = findNodeById(draft.canvas.config.nodes, nodeId);\n if (dnode) dnode.data.title = uniqueTitle;\n const r = draft.canvas.sqlResults[nodeId];\n if (r && r.status === 'success') r.tableName = newQualified;\n }),\n );\n\n await get().db.refreshTableSchemas();\n\n // Recompute children since upstream table name changed\n await get().canvas.executeDownstreamFrom(nodeId);\n },\n\n deleteNode: (nodeId) => {\n const current = get();\n const node = findNodeById(current.canvas.config.nodes, nodeId);\n let tableToDrop: string | undefined;\n if (node && isSqlData(node.data)) {\n const title = node.data.title || 'result';\n const res = current.canvas.sqlResults[nodeId];\n tableToDrop =\n res && res.status === 'success'\n ? res.tableName\n : `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;\n }\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.nodes = draft.canvas.config.nodes.filter(\n (n) => n.id !== nodeId,\n );\n draft.canvas.config.edges = draft.canvas.config.edges.filter(\n (e) => e.source !== nodeId && e.target !== nodeId,\n );\n // Clear stored result for the node\n delete draft.canvas.sqlResults[nodeId];\n if (draft.canvas.config.nodes.length === 0) {\n draft.canvas.config.viewport.x = 0;\n draft.canvas.config.viewport.y = 0;\n }\n }),\n );\n\n if (tableToDrop) {\n (async () => {\n try {\n const connector = await get().db.getConnector();\n await connector.query(`DROP TABLE IF EXISTS ${tableToDrop}`);\n await get().db.refreshTableSchemas();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\n '[canvas.deleteNode] Failed to drop table for node',\n nodeId,\n e,\n );\n }\n })();\n }\n },\n\n applyNodeChanges: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.nodes = applyNodeChanges(\n changes,\n draft.canvas.config.nodes,\n );\n }),\n );\n },\n\n applyEdgeChanges: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.edges = applyEdgeChanges(\n changes,\n draft.canvas.config.edges,\n );\n }),\n );\n },\n\n setViewport: (viewport) => {\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.config.viewport = viewport;\n }),\n );\n },\n\n executeSqlNodeQuery: async (\n nodeId: string,\n opts?: {cascade?: boolean},\n ) => {\n const node = findNodeById(get().canvas.config.nodes, nodeId);\n if (!node || !isSqlData(node.data)) return;\n const sql = node.data.sql || '';\n const title = node.data.title || 'result';\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {status: 'loading'};\n }),\n );\n\n try {\n // Validate it's a single select\n const parsed = await get().db.sqlSelectToJson(sql);\n if (parsed.error) {\n throw new Error(\n parsed.error_message || 'Not a valid SELECT statement',\n );\n }\n\n // Create schema and table\n const connector = await get().db.getConnector();\n await connector.query(\n `CREATE SCHEMA IF NOT EXISTS ${CANVAS_SCHEMA_NAME}`,\n );\n\n const tableName = `${CANVAS_SCHEMA_NAME}.${escapeId(title)}`;\n await connector.query(\n `CREATE OR REPLACE TABLE ${tableName} AS ${sql}`,\n );\n\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {\n status: 'success',\n tableName,\n lastQueryStatement: sql,\n };\n }),\n );\n\n // Cascade execution to downstream SQL nodes (topologically) unless disabled\n if (opts?.cascade !== false) {\n await get().canvas.executeDownstreamFrom(nodeId);\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n set((state) =>\n produce(state, (draft) => {\n draft.canvas.sqlResults[nodeId] = {\n status: 'error',\n error: message,\n };\n }),\n );\n }\n },\n },\n }));\n}\n\n// Types to integrate with room-shell selector\nexport type RoomConfigWithCanvas = BaseRoomConfig & CanvasSliceConfig;\nexport type RoomShellSliceStateWithCanvas =\n RoomShellSliceState<RoomConfigWithCanvas> & CanvasSliceState;\n\nexport function useStoreWithCanvas<T>(\n selector: (state: RoomShellSliceStateWithCanvas) => T,\n): T {\n return useBaseRoomShellStore<\n BaseRoomConfig & CanvasSliceConfig,\n RoomShellSliceState<RoomConfigWithCanvas>,\n T\n >((state) => selector(state as unknown as RoomShellSliceStateWithCanvas));\n}\n"]}
|
|
@@ -18,7 +18,7 @@ const PROMPT_PLACEHOLDER = {
|
|
|
18
18
|
*/
|
|
19
19
|
export const CanvasNodeContainer = ({ id, className, headerRight, children }) => {
|
|
20
20
|
const renameNode = useStoreWithCanvas((s) => s.canvas.renameNode);
|
|
21
|
-
const node = useStoreWithCanvas((s) => s.config.
|
|
21
|
+
const node = useStoreWithCanvas((s) => s.canvas.config.nodes.find((n) => n.id === id));
|
|
22
22
|
const title = node?.data.title;
|
|
23
23
|
const onTitleChange = useCallback(async (v) => {
|
|
24
24
|
await renameNode(id, v);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasNodeContainer.js","sourceRoot":"","sources":["../../src/nodes/CanvasNodeContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {QueryControls} from '@sqlrooms/ai';\nimport {\n Button,\n EditableText,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@sqlrooms/ui';\nimport {Handle, NodeResizer, Position} from '@xyflow/react';\nimport {PlusIcon, SparklesIcon} from 'lucide-react';\nimport {FC, PropsWithChildren, ReactNode, useCallback} from 'react';\nimport {useStoreWithCanvas} from '../CanvasSlice';\nimport {AddNodePopover} from './AddNodePopover';\n\nconst PROMPT_PLACEHOLDER = {\n sql: 'What would you like to learn about the data?',\n vega: 'How would you like to visualize the data?',\n default: 'What would you like to do?',\n};\n\n/**\n * Container applied to every canvas node. Provides resizing, connection handles,\n * and a standard \"add child\" affordance that creates downstream nodes.\n * Also renders an optional shared header with editable title and customizable right-side content.\n */\nexport const CanvasNodeContainer: FC<\n PropsWithChildren<{\n id: string;\n className?: string;\n /** Right-side header content (e.g. buttons, badges). */\n headerRight?: ReactNode;\n }>\n> = ({id, className, headerRight, children}) => {\n const renameNode = useStoreWithCanvas((s) => s.canvas.renameNode);\n const node = useStoreWithCanvas((s) =>\n s.config.
|
|
1
|
+
{"version":3,"file":"CanvasNodeContainer.js","sourceRoot":"","sources":["../../src/nodes/CanvasNodeContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {QueryControls} from '@sqlrooms/ai';\nimport {\n Button,\n EditableText,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@sqlrooms/ui';\nimport {Handle, NodeResizer, Position} from '@xyflow/react';\nimport {PlusIcon, SparklesIcon} from 'lucide-react';\nimport {FC, PropsWithChildren, ReactNode, useCallback} from 'react';\nimport {useStoreWithCanvas} from '../CanvasSlice';\nimport {AddNodePopover} from './AddNodePopover';\n\nconst PROMPT_PLACEHOLDER = {\n sql: 'What would you like to learn about the data?',\n vega: 'How would you like to visualize the data?',\n default: 'What would you like to do?',\n};\n\n/**\n * Container applied to every canvas node. Provides resizing, connection handles,\n * and a standard \"add child\" affordance that creates downstream nodes.\n * Also renders an optional shared header with editable title and customizable right-side content.\n */\nexport const CanvasNodeContainer: FC<\n PropsWithChildren<{\n id: string;\n className?: string;\n /** Right-side header content (e.g. buttons, badges). */\n headerRight?: ReactNode;\n }>\n> = ({id, className, headerRight, children}) => {\n const renameNode = useStoreWithCanvas((s) => s.canvas.renameNode);\n const node = useStoreWithCanvas((s) =>\n s.canvas.config.nodes.find((n) => n.id === id),\n );\n const title = node?.data.title;\n const onTitleChange = useCallback(\n async (v: string) => {\n await renameNode(id, v);\n },\n [id, renameNode],\n );\n const setAssistantOpen = useStoreWithCanvas((s) => s.canvas.setAssistantOpen);\n return (\n <div\n className={cn(\n `bg-background relative flex h-full w-full rounded-md border shadow-sm`,\n className,\n )}\n >\n <NodeResizer minWidth={200} minHeight={200} />\n <div className=\"flex h-full min-h-0 w-full flex-col items-center\">\n {(title !== undefined || headerRight) && (\n <div className=\"flex w-full items-center justify-between gap-2 border-b px-3 py-2\">\n <EditableText\n className=\"text-sm font-medium\"\n value={title ?? ''}\n onChange={(v) => onTitleChange?.(v)}\n />\n <div className=\"flex items-center gap-2\">{headerRight}</div>\n </div>\n )}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"default\"\n className=\"h-8 w-8 -translate-y-1/2 rounded-full\"\n >\n <SparklesIcon className=\"h-4 w-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"max-h-[50vh] w-[400px] overflow-auto\">\n <QueryControls\n placeholder={`✨ ${PROMPT_PLACEHOLDER[node?.type ?? 'default']}`}\n onRun={() => {\n setAssistantOpen(true);\n }}\n />\n </PopoverContent>\n </Popover>\n <div className=\"w-full flex-1 overflow-auto\">{children}</div>\n </div>\n <AddNodePopover className=\"absolute -right-10 top-1/2\" parentId={id}>\n <Button\n variant=\"default\"\n className=\"h-8 w-8 -translate-y-1/2 rounded-full\"\n title=\"Add child node\"\n >\n <PlusIcon className=\"h-4 w-4\" />\n </Button>\n </AddNodePopover>\n <Handle type=\"source\" position={Position.Right} />\n <Handle type=\"target\" position={Position.Left} />\n </div>\n );\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/canvas",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0-rc.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -19,17 +19,17 @@
|
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@paralleldrive/cuid2": "^2.2.2",
|
|
22
|
-
"@sqlrooms/ai": "0.
|
|
23
|
-
"@sqlrooms/data-table": "0.
|
|
24
|
-
"@sqlrooms/duckdb": "0.
|
|
25
|
-
"@sqlrooms/room-shell": "0.
|
|
26
|
-
"@sqlrooms/sql-editor": "0.
|
|
27
|
-
"@sqlrooms/ui": "0.
|
|
28
|
-
"@sqlrooms/vega": "0.
|
|
29
|
-
"@xyflow/react": "^12.
|
|
30
|
-
"immer": "^10.1.
|
|
22
|
+
"@sqlrooms/ai": "0.26.0-rc.1",
|
|
23
|
+
"@sqlrooms/data-table": "0.26.0-rc.1",
|
|
24
|
+
"@sqlrooms/duckdb": "0.26.0-rc.1",
|
|
25
|
+
"@sqlrooms/room-shell": "0.26.0-rc.1",
|
|
26
|
+
"@sqlrooms/sql-editor": "0.26.0-rc.1",
|
|
27
|
+
"@sqlrooms/ui": "0.26.0-rc.1",
|
|
28
|
+
"@sqlrooms/vega": "0.26.0-rc.1",
|
|
29
|
+
"@xyflow/react": "^12.8.5",
|
|
30
|
+
"immer": "^10.1.3",
|
|
31
31
|
"lucide-react": "^0.474.0",
|
|
32
|
-
"zod": "^3.25.
|
|
32
|
+
"zod": "^3.25.76"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"react": ">=18",
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"typecheck": "tsc --noEmit",
|
|
43
43
|
"typedoc": "typedoc"
|
|
44
44
|
},
|
|
45
|
-
"gitHead": "
|
|
46
|
-
}
|
|
45
|
+
"gitHead": "803cf5fa875f7099746a48db15a3111aee5c0359"
|
|
46
|
+
}
|