import { useRef } from "react"; // @ts-ignore import ArrowsHorizontal from "~icons/tabler/arrows-horizontal.jsx"; // @ts-ignore import Help from "~icons/tabler/question-mark.jsx"; import Tooltip from "../../Tooltip"; import NodeGroupParameter from "./NodeGroupParameter"; const BOOLEAN = ""; const MODEL_TRAINING_INPUT_MAPPING = ""; const MODEL_INFERENCE_INPUT_MAPPING = ""; const MODEL_OUTPUT_MAPPING = ""; function ParamName({ name, doc }: { name: string; doc: string }) { const help = doc && ( ); return (
{name.replace(/_/g, " ")} {help}
); } function Input({ value, onChange, inputRef, }: { value: string; onChange: (value: string, options?: { delay: number }) => void; inputRef?: React.Ref; }) { return ( onChange(evt.currentTarget.value, { delay: 2 })} onBlur={(evt) => onChange(evt.currentTarget.value, { delay: 0 })} onKeyDown={(evt) => evt.code === "Enter" && onChange(evt.currentTarget.value, { delay: 0 })} /> ); } type Bindings = { [key: string]: { df: string; column: string; }; }; function getModelBindings( data: any, variant: "training input" | "inference input" | "output", ): string[] { function bindingsOfModel(m: any): string[] { switch (variant) { case "training input": return [...m.inputs, ...m.loss_inputs.filter((i: string) => !m.outputs.includes(i))]; case "inference input": return m.inputs; case "output": return m.outputs; } } const bindings = new Set(); const inputs = data?.input_metadata?.value ?? data?.input_metadata ?? []; for (const input of inputs) { const other = input.other ?? {}; for (const e of Object.values(other) as any[]) { if (e.type === "model") { for (const b of bindingsOfModel(e.model)) { bindings.add(b); } } } } const list = [...bindings]; list.sort(); return list; } function parseJsonOrEmpty(json: string): object { try { const j = JSON.parse(json); if (j !== null && typeof j === "object") { return j; } } catch (e) {} return {}; } function ModelMapping({ value, onChange, data, variant }: any) { const dfsRef = useRef({} as { [binding: string]: HTMLSelectElement | null }); const columnsRef = useRef( {} as { [binding: string]: HTMLSelectElement | HTMLInputElement | null }, ); const v: any = parseJsonOrEmpty(value); v.map ??= {}; const dfs: { [df: string]: string[] } = {}; const inputs = data?.input_metadata?.value ?? data?.input_metadata ?? []; for (const input of inputs) { if (!input.dataframes) continue; const dataframes = input.dataframes as { [df: string]: { columns: string[] }; }; for (const [df, { columns }] of Object.entries(dataframes)) { dfs[df] = columns; } } const bindings = getModelBindings(data, variant); function getMap() { const map: Bindings = {}; for (const binding of bindings) { const df = dfsRef.current[binding]?.value ?? ""; const column = columnsRef.current[binding]?.value ?? ""; if (df.length || column.length) { map[binding] = { df, column }; } } return map; } return ( {bindings.length > 0 ? ( bindings.map((binding: string) => ( )) ) : ( )}
{binding} {variant === "output" ? ( { columnsRef.current[binding] = el; }} value={v.map?.[binding]?.column} onChange={(column, options) => { const map = getMap(); // At this point the has not been updated yet. We use the value from the event. const df = dfsRef.current[binding]?.value ?? ""; map[binding] ??= { df, column }; map[binding].column = column; onChange(JSON.stringify({ map }), options); }} /> ) : ( )}
no bindings
); } interface NodeParameterProps { name: string; value: any; meta: any; data: any; setParam: (name: string, value: any, options: UpdateOptions) => void; } export type UpdateOptions = { delay?: number }; function findDocs(docs: any, parameter: string) { for (const sec of docs) { if (sec.kind === "parameters") { for (const p of sec.value) { if (p.name === parameter) { return p.description; } } } } } export default function NodeParameter({ name, value, meta, data, setParam }: NodeParameterProps) { const doc = findDocs(data.meta?.value?.doc ?? [], name); function onChange(value: any, opts?: UpdateOptions) { setParam(meta.name, value, opts || {}); } return meta?.type?.format === "collapsed" ? ( ) : meta?.type?.format === "textarea" ? (