diff --git a/src/components/inspector.tsx b/src/components/inspector.tsx index 5e4b11a..781e5af 100644 --- a/src/components/inspector.tsx +++ b/src/components/inspector.tsx @@ -12,9 +12,10 @@ import { Space, Switch, } from "antd"; +import useFormInstance from "antd/es/form/hooks/useFormInstance"; import TextArea from "antd/es/input/TextArea"; import { DefaultOptionType } from "antd/es/select"; -import { FC, useEffect, useMemo } from "react"; +import { FC, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import Markdown from "react-markdown"; import { useDebounceCallback } from "usehooks-ts"; @@ -54,6 +55,86 @@ interface OptionType extends DefaultOptionType { value: string; } +interface VarDefItem extends VarDef { + count?: number; +} + +interface VarDefItemProps { + id: number; + disabled?: boolean; + value?: VarDefItem; + onChange?: (vardef: VarDefItem) => void; + onRemove?: (index: number | number[]) => void; +} + +const VarDefItem: FC = ({ id, value, onChange, onRemove, disabled }) => { + const { t } = useTranslation(); + const form = useFormInstance(); + const [name, setName] = useState(value?.name ?? ""); + const [desc, setDesc] = useState(value?.desc ?? ""); + const { editing } = useWorkspace( + useShallow((state) => ({ + editing: state.editing, + })) + ); + + const onSubmit = () => { + onChange?.({ name, desc }); + form.submit(); + }; + + return ( + + +
editing?.dispatch("clickVar", name)} + > + + {value?.count ?? 0} +
+ setName(e.target.value)} + /> + setDesc(e.target.value)} + /> +
+ {!disabled && ( + { + onRemove?.(id); + form.submit(); + }} + /> + )} + {disabled &&
} + + ); +}; + const TreeInspector: FC = () => { const workspace = useWorkspace( useShallow((state) => ({ @@ -141,10 +222,33 @@ const TreeInspector: FC = () => { form.setFieldValue("export", workspace.editingTree.export !== false); form.setFieldValue("firstid", workspace.editingTree.firstid); form.setFieldValue("group", groupDefs); - form.setFieldValue("declvar", workspace.editingTree.declvar); - form.setFieldValue("import", workspace.editingTree.import); - form.setFieldValue("subtree", workspace.editingTree.subtree); - }, [workspace.editingTree, groupDefs]); + form.setFieldValue( + "declvar", + workspace.editingTree.declvar.map((v) => ({ + name: v.name, + desc: v.desc, + count: usingCount[v.name] ?? 0, + })) + ); + form.setFieldValue( + "import", + workspace.editingTree.import.map((entry) => ({ + path: entry.path, + vars: entry.vars.map((v) => ({ + name: v.name, + count: usingCount[v.name] ?? 0, + })), + })) + ); + form.setFieldValue( + "subtree", + workspace.editingTree.subtree.map((v) => ({ + name: v.name, + desc: v.desc, + count: usingCount[v.name] ?? 0, + })) + ); + }, [workspace.editingTree, groupDefs, usingCount]); // eslint-disable-next-line @typescript-eslint/no-explicit-any const finish = (values: any) => { @@ -153,19 +257,22 @@ const TreeInspector: FC = () => { desc: values.desc, export: values.export, firstid: Number(values.firstid), - group: (values.group as GroupDef[]) - .map((v) => (v.value ? v.name : "")) + group: Array.from(new Set((values.group as GroupDef[]).map((v) => (v.value ? v.name : "")))) .filter((v) => v) .sort((a, b) => a.localeCompare(b)), declvar: (values.declvar as VarDef[]) .filter((v) => v && v.name) + .map((v) => ({ + name: v.name, + desc: v.desc, + })) .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 ?? [], + vars: (v.vars ?? []).map((v1) => ({ name: v1.name, desc: v1.desc })), })), } as EditTree); }; @@ -240,80 +347,31 @@ const TreeInspector: FC = () => { {(fields, { add, remove }, { errors }) => (
- {fields.map((item) => { - const vardef = workspace.editingTree.declvar[item.name] as VarDef | undefined; - return ( - - - - - vardef && workspace.editing?.dispatch("clickVar", vardef.name) - } - > - - - {usingCount[vardef?.name ?? ""] ?? 0} - -
- } - placeholder={t("tree.vars.name")} - onBlur={form.submit} - /> - - - - - - { - remove(item.name); - form.submit(); - }} - /> - - ); - })} + {fields.map((item) => ( + + + + ))} { {(fields) => (
- {fields.map((item, idx) => { - const vardef = workspace.editingTree.subtree[item.name] as VarDef | undefined; - return ( - - - -
- vardef && workspace.editing?.dispatch("clickVar", vardef.name) - } - > - - - {usingCount[vardef?.name ?? ""] ?? 0} - -
-
- - - - - - -
-
- ); - })} + {fields.map((item) => ( + + + + ))}
)}
@@ -456,77 +454,11 @@ const TreeInspector: FC = () => { {(vars) => (
- {vars.map((v, idx) => { - const entry = workspace.editingTree.import[item.name] as - | ImportDef - | undefined; - const vardef = entry?.vars[v.name] as VarDef | undefined; - return ( - - - -
- vardef && - workspace.editing?.dispatch("clickVar", vardef.name) - } - > - - - {usingCount[vardef?.name ?? ""] ?? 0} - -
-
- - - - - - -
-
- ); - })} + {vars.map((v) => ( + + + + ))}
)}