@@ -29,8 +29,7 @@ import PlayArrowIcon from "@mui/icons-material/PlayArrow";
2929import Stack from "@mui/material/Stack" ;
3030import Button from "@mui/material/Button" ;
3131import CircleIcon from "@mui/icons-material/Circle" ;
32- import ViewComfyIcon from "@mui/icons-material/ViewComfy" ;
33-
32+ import CheckCircleIcon from "@mui/icons-material/CheckCircle" ;
3433import Grid from "@mui/material/Grid" ;
3534
3635import Moveable from "react-moveable" ;
@@ -47,6 +46,8 @@ import { useNodesStateSynced } from "../lib/nodes";
4746import { MyMonaco } from "./MyMonaco" ;
4847import { useApolloClient } from "@apollo/client" ;
4948import { CanvasContextMenu } from "./CanvasContextMenu" ;
49+ import ToolBox , { ToolTypes } from "./Toolbox" ;
50+ import styles from "./canvas.style.js" ;
5051
5152const nanoid = customAlphabet ( nolookalikes , 10 ) ;
5253
@@ -89,7 +90,8 @@ const ScopeNode = memo<Props>(({ data, id, isConnectable }) => {
8990 sx = { {
9091 width : "100%" ,
9192 height : "100%" ,
92- border : "1px solid black" ,
93+ border : "solid 1px #d6dee6" ,
94+ borderRadius : "4px" ,
9395 } }
9496 className = "custom-drag-handle"
9597 >
@@ -200,18 +202,24 @@ function ResultBlock({ pod, id }) {
200202 { pod . result . html ? (
201203 < div dangerouslySetInnerHTML = { { __html : pod . result . html } } > </ div >
202204 ) : (
203- pod . result . text && (
204- < Box >
205- < Box sx = { { display : "flex" } } bgcolor = "lightgray" >
206- Result: [{ pod . result . count } ]:
207- </ Box >
208- < Box >
209- < Box component = "pre" whiteSpace = "pre-wrap" >
210- { pod . result . text }
205+ < >
206+ { ! pod . error && (
207+ < Box
208+ color = "rgb(0, 183, 87)"
209+ sx = { {
210+ padding : "6px" ,
211+ zIndex : 200 ,
212+ } }
213+ >
214+ < Box sx = { styles [ "result-status__success" ] } >
215+ < CheckCircleIcon
216+ style = { { marginTop : "5px" } }
217+ fontSize = "inherit"
218+ />
211219 </ Box >
212220 </ Box >
213- </ Box >
214- )
221+ ) }
222+ </ >
215223 ) }
216224 { pod . result . image && (
217225 < img
@@ -221,30 +229,33 @@ function ResultBlock({ pod, id }) {
221229 ) }
222230 </ Box >
223231 ) }
224- { pod . stdout && (
225- < Box overflow = "scroll" border = "1px" >
226- { /* TODO separate stdout and stderr */ }
227- < Box bgcolor = "lightgray" > Stdout</ Box >
228- < Box whiteSpace = "pre-wrap" fontSize = "sm" >
232+
233+ { pod . running && < CircularProgress /> }
234+ < Box overflow = "scroll" maxHeight = "145px" border = "1px" >
235+ { /* <Box bgcolor="lightgray">Error</Box> */ }
236+ { pod . stdout && (
237+ < Box whiteSpace = "pre-wrap" sx = { { fontSize : 10 } } >
229238 < Ansi > { pod . stdout } </ Ansi >
230239 </ Box >
231- </ Box >
232- ) }
233- { pod . running && < CircularProgress /> }
234- { pod . error && (
235- < Box overflow = "scroll" border = "1px" >
236- < Box bgcolor = "lightgray" > Error</ Box >
237- < Box color = "red" > { pod . error . evalue } </ Box >
238- { pod . error . stacktrace && (
239- < Box >
240- < Box > StackTrace</ Box >
241- < Box whiteSpace = "pre-wrap" fontSize = "small" >
242- < Ansi > { pod . error . stacktrace . join ( "\n" ) } </ Ansi >
243- </ Box >
240+ ) }
241+ { pod ?. result ?. text && pod ?. result ?. count > 0 && (
242+ < Box sx = { { display : "flex" , fontSize : 10 , flexDirection : "row" , alignItems : 'center' } } >
243+ < Box > Result[{ pod . result . count } ]:</ Box >
244+ < Box component = "pre" whiteSpace = "pre-wrap" >
245+ { pod . result . text }
244246 </ Box >
245- ) }
246- </ Box >
247- ) }
247+ </ Box >
248+ ) }
249+ { pod ?. error && < Box color = "red" > { pod ?. error ?. evalue } </ Box > }
250+ { pod ?. error ?. stacktrace && (
251+ < Box >
252+ < Box > StackTrace</ Box >
253+ < Box whiteSpace = "pre-wrap" sx = { { fontSize : 10 } } >
254+ < Ansi > { pod . error . stacktrace . join ( "\n" ) } </ Ansi >
255+ </ Box >
256+ </ Box >
257+ ) }
258+ </ Box >
248259 </ Box >
249260 ) ;
250261}
@@ -260,7 +271,9 @@ const CodeNode = memo<Props>(({ data, id, isConnectable }) => {
260271 translate : [ 0 , 0 ] ,
261272 } ) ;
262273 // right, bottom
263- const [ layout , setLayout ] = useState ( "right" ) ;
274+ const [ layout , setLayout ] = useState ( "bottom" ) ;
275+ const isRightLayout = layout === "right" ;
276+ const [ isEditorBlur , setIsEditorBlur ] = useState ( true ) ;
264277 const { setNodes } = useReactFlow ( ) ;
265278 // const selected = useStore(store, (state) => state.selected);
266279 const setSelected = useStore ( store , ( state ) => state . setSelected ) ;
@@ -270,24 +283,46 @@ const CodeNode = memo<Props>(({ data, id, isConnectable }) => {
270283 const showResult = useStore (
271284 store ,
272285 ( state ) =>
273- state . pods [ id ] . running ||
274- state . pods [ id ] . result ||
275- state . pods [ id ] . error ||
276- state . pods [ id ] . stdout ||
277- state . pods [ id ] . stderr
286+ state . pods [ id ] ? .running ||
287+ state . pods [ id ] ? .result ||
288+ state . pods [ id ] ? .error ||
289+ state . pods [ id ] ? .stdout ||
290+ state . pods [ id ] ? .stderr
278291 ) ;
292+ const nodesMap = useStore ( store , ( state ) => state . ydoc . getMap < Node > ( "pods" ) ) ;
293+ const apolloClient = useApolloClient ( ) ;
294+ const deletePod = useStore ( store , ( state ) => state . deletePod ) ;
295+ const deleteNodeById = ( id ) => {
296+ deletePod ( apolloClient , { id : id , toDelete : [ ] } ) ;
297+ nodesMap . delete ( id ) ;
298+ } ;
299+ const runToolBoxTask = ( type , data ) => {
300+ switch ( type ) {
301+ case ToolTypes . delete :
302+ deleteNodeById ( id ) ;
303+ break ;
304+ case ToolTypes . play :
305+ wsRun ( data . id ) ;
306+ break ;
307+ case ToolTypes . layout :
308+ setLayout ( layout === "bottom" ? "right" : "bottom" ) ;
309+ break ;
310+ }
311+ } ;
279312
280313 useEffect ( ( ) => {
281314 setTarget ( ref . current ) ;
282315 } , [ ] ) ;
283- // if (!pod) return <Box>ERROR</Box> ;
316+ if ( ! pod ) return null ;
284317 return (
285318 < Box
286319 sx = { {
287- border : "solid 1px black" ,
320+ border : "solid 1px #d6dee6" ,
321+ borderRadius : "4px" ,
288322 width : "100%" ,
289323 height : "100%" ,
290- backgroundColor : "white" ,
324+ backgroundColor : "rgb(244, 246, 248)" ,
325+ borderColor : isEditorBlur ? "#d6dee6" : "#3182ce" ,
291326 } }
292327 ref = { ref }
293328 >
@@ -316,45 +351,9 @@ const CodeNode = memo<Props>(({ data, id, isConnectable }) => {
316351 isConnectable = { isConnectable }
317352 />
318353 { /* The header of code pods. */ }
319- < Box
320- className = "custom-drag-handle"
321- bgcolor = { "rgb(225,225,225)" }
322- sx = { { display : "flex" } }
323- >
324- { /* Code: {data?.label} */ }
325- { /* pod */ }
326- < Box sx = { { display : "flex" , flexGrow : 1 } } >
327- < IconButton size = "small" >
328- < CircleIcon sx = { { color : "red" } } fontSize = "inherit" />
329- </ IconButton >
330- </ Box >
331- < Box sx = { { display : "flex" } } >
332- < Box sx = { { display : "flex" } } >
333- < Tooltip title = "Run (shift-enter)" >
334- < IconButton
335- size = "small"
336- sx = { { color : "green" } }
337- onClick = { ( ) => {
338- wsRun ( id ) ;
339- } }
340- >
341- < PlayArrowIcon fontSize = "inherit" />
342- </ IconButton >
343- </ Tooltip >
344- </ Box >
345- < Box sx = { { display : "flex" } } >
346- < Tooltip title = "Change layout" >
347- < IconButton
348- size = "small"
349- onClick = { ( ) => {
350- setLayout ( layout === "bottom" ? "right" : "bottom" ) ;
351- } }
352- >
353- < ViewComfyIcon fontSize = "inherit" />
354- </ IconButton >
355- </ Tooltip >
356- </ Box >
357- </ Box >
354+ < Box className = "custom-drag-handle" >
355+ < Box sx = { styles [ "pod-index" ] } > [{ pod . index } ]</ Box >
356+ < ToolBox data = { { id } } onRunTask = { runToolBoxTask } > </ ToolBox >
358357 </ Box >
359358 < Box
360359 sx = { {
@@ -378,21 +377,31 @@ const CodeNode = memo<Props>(({ data, id, isConnectable }) => {
378377 ) ;
379378 } }
380379 >
381- < MyMonaco id = { id } gitvalue = "" />
380+ < MyMonaco
381+ id = { id }
382+ gitvalue = ""
383+ onBlur = { ( ) => {
384+ setIsEditorBlur ( true ) ;
385+ } }
386+ onFocus = { ( ) => {
387+ setIsEditorBlur ( false ) ;
388+ } }
389+ />
382390 { showResult && (
383391 < Box
384392 className = "nowheel"
385393 sx = { {
394+ border : "solid 1px #d6dee6" ,
395+ borderRadius : "4px" ,
386396 position : "absolute" ,
387- top : layout === "right" ? 0 : "100%" ,
388- left : layout === "right" ? "100%" : 0 ,
389- maxHeight : "100%" ,
390- maxWidth : "100%" ,
391- minWidth : "100px" ,
392- overflow : "scroll" ,
397+ top : isRightLayout ? 0 : "100%" ,
398+ left : isRightLayout ? "100%" : 0 ,
399+ maxHeight : "158px" ,
400+ minWidth : isRightLayout ? "200px" : "100%" ,
401+ boxSizing : "border-box" ,
393402 backgroundColor : "white" ,
394- border : "solid 1px blue" ,
395403 zIndex : 100 ,
404+ padding : "0 10px" ,
396405 } }
397406 >
398407 < ResultBlock pod = { pod } id = { id } />
@@ -564,7 +573,7 @@ export function Canvas() {
564573 addPod ( apolloClient , {
565574 id,
566575 parent : "ROOT" ,
567- index : 0 ,
576+ index : nodesMap . size + 1 ,
568577 type : type === "code" ? "CODE" : "DECK" ,
569578 lang : "python" ,
570579 x : position . x ,
0 commit comments