import { AimOutlined, EditOutlined, MinusCircleOutlined, PlusOutlined } from "@ant-design/icons"; import { AutoComplete, Button, Checkbox, Divider, Flex, Form, Input, InputNumber, Select, Space, Switch, } from "antd"; import TextArea from "antd/es/input/TextArea"; import { DefaultOptionType } from "antd/es/select"; import { FC, useEffect, useMemo } from "react"; import { useTranslation } from "react-i18next"; import Markdown from "react-markdown"; import { useDebounceCallback } from "usehooks-ts"; import { useShallow } from "zustand/react/shallow"; import { EditNode, EditTree, useWorkspace } from "../contexts/workspace-context"; import { GroupDef, ImportDef, isBoolType, isEnumType, isExprType, isFloatType, isIntType, isJsonType, isStringType, NodeModel, TreeGraphData, VarDef, } from "../misc/b3type"; import { checkNodeArgValue, checkOneof, getNodeArgRawType, isNodeArgArray, isNodeArgOptional, isValidVariableName, isVariadic, loadVarDef, parseExpr, usingGroups, usingVars, } from "../misc/b3util"; import { Hotkey, isMacos } from "../misc/keys"; import { mergeClassNames } from "../misc/util"; interface OptionType extends DefaultOptionType { value: string; } const TreeInspector: FC = () => { const workspace = useWorkspace( useShallow((state) => ({ editing: state.editing, editingTree: state.editingTree!, allFiles: state.allFiles, relative: state.relative, fileTree: state.fileTree, groupDefs: state.groupDefs, })) ); const { t } = useTranslation(); const [form] = Form.useForm(); // group defs const groupDefs: GroupDef[] = useMemo(() => { return workspace.groupDefs.map((v) => ({ name: v, value: workspace.editingTree.data.group.includes(v), })); }, [workspace.groupDefs, workspace.editingTree]); // auto complete for subtree const subtreeOptions = useMemo(() => { const options: OptionType[] = []; workspace.allFiles.forEach((file) => { const value = workspace.relative(file.path); const desc = ""; //fileNode.desc ? `(${fileNode.desc})` : ""; options.push({ label: `${value}${desc}`, value: value, }); }); options.sort((a, b) => a.value.localeCompare(b.value)); return options; }, [workspace.allFiles, workspace.fileTree]); // set form values useEffect(() => { const data = workspace.editingTree.data; loadVarDef(data.import); form.resetFields(); form.setFieldValue("name", data.name); form.setFieldValue("desc", data.desc); form.setFieldValue("export", data.export !== false); form.setFieldValue("firstid", data.firstid); form.setFieldValue("group", groupDefs); form.setFieldValue("declvar", data.declvar); form.setFieldValue("import", data.import); form.setFieldValue("subtree", data.subtree); }, [workspace.editingTree, groupDefs]); // eslint-disable-next-line @typescript-eslint/no-explicit-any const finish = (values: any) => { workspace.editing?.dispatch("updateTree", { data: { name: values.name, desc: values.desc, export: values.export, firstid: Number(values.firstid), group: (values.group as GroupDef[]) .map((v) => (v.value ? v.name : undefined)) .filter((v) => v) .sort(), declvar: (values.declvar as VarDef[]) .filter((v) => v && v.name) .sort((a, b) => a.name.localeCompare(b.name)), import: (values.import as ImportDef[]) .filter((v) => v && v.path) .sort((a, b) => a.path.localeCompare(b.path)) .map((v) => ({ path: v.path, vars: v.vars ?? [], })), }, } as EditTree); }; return ( <>
{t("tree.overview")}
<>