import { useReactFlow } from "@xyflow/react"; import { useState } from "react"; import React from "react"; import Markdown from "react-markdown"; import LynxKiteNode from "./LynxKiteNode"; import Table from "./Table"; function toMD(v: any): string { if (typeof v === "string") { return v; } if (Array.isArray(v)) { return v.map(toMD).join("\n\n"); } return JSON.stringify(v); } type OpenState = { [name: string]: boolean }; function NodeWithTableView(props: any) { const reactFlow = useReactFlow(); const [open, setOpen] = useState((props.data?.params?._tables_open ?? {}) as OpenState); const display = props.data.display?.value; const single = display?.dataframes && Object.keys(display?.dataframes).length === 1; const dfs = Object.entries(display?.dataframes || {}); dfs.sort(); function setParam(name: string, newValue: any) { reactFlow.updateNodeData(props.id, (prevData: any) => ({ ...prevData, params: { ...prevData.data.params, [name]: newValue }, })); } function toggleTable(name: string) { setOpen((prevOpen: OpenState) => { const newOpen = { ...prevOpen, [name]: !prevOpen[name] }; setParam("_tables_open", newOpen); return newOpen; }); } return ( <> {display && [ dfs.map(([name, df]: [string, any]) => ( {!single && (
toggleTable(name)}> {name}
)} {(single || open[name]) && (df.data.length > 1 ? ( ) : df.data.length ? (
{df.columns.map((c: string, i: number) => (
{c}
{toMD(df.data[0][i])}
))}
) : ( JSON.stringify(df.data) ))} )), Object.entries(display.others || {}).map(([name, o]) => ( <>
toggleTable(name)}> {name}
{open[name] &&
{(o as any).toString()}
} )), ]} ); } export default LynxKiteNode(NodeWithTableView);