import { Tree as DNDTree, DragPreviewRender, NodeModel, PlaceholderRender, TreeMethods, } from "@minoru/react-dnd-treeview"; import { FC } from "react"; import { useGlobal, useLocal } from "web-utils"; import { EDGlobal, IMeta, active } from "../../logic/ed-global"; import { DEPTH_WIDTH } from "./node/item/indent"; import { expandTreeHook } from "./node/item/indent-hook"; import { canDrop, nodeOnDrop } from "./node/on-drop"; import { nodeRender } from "./node/render"; import { doTreeSearch } from "./search"; export const EdTreeBody = () => { const p = useGlobal(EDGlobal, "EDITOR"); const local = useLocal({ tree: null as TreeMethods | null, comp_id: "" }); const TypedTree = DNDTree; active.hover.renderTree = local.render; expandTreeHook(p, local); if (active.comp_id && local.comp_id !== active.comp_id) { local.comp_id = active.comp_id; const ref = p.comp.list[active.comp_id]; if (ref) { p.comp.tree = ref.tree; } } let tree: NodeModel[] = []; if (p.ui.tree.search) { tree = doTreeSearch(p); } else { if (!!active.comp_id) { tree = p.comp.tree; } else { tree = p.page.tree; } } if (tree.length === 0) return (
— No Item —
{active.comp_id && (
{ e.stopPropagation(); e.preventDefault(); if (active.comp_id) { active.comp_id = active.instance.comp_id || ""; active.item_id = active.instance.item_id || ""; active.instance.comp_id = ""; active.instance.item_id = ""; p.render(); } }} > Close Component
)}
); return ( <> { local.tree = el; }} sort={false} dropTargetOffset={10} render={nodeRender} onDrop={(tree, options) => nodeOnDrop(p, tree, options)} canDrop={(_, args) => { if (!args.dragSource?.data?.item) return false; return canDrop(p, args); }} dragPreviewRender={DragPreview} placeholderRender={(node, params) => ( )} /> ); }; const treeClasses = { container: "flex flex-col flex-1", dropTarget: "drop-target", placeholder: "placeholder", draggingSource: css` opacity: 0.3; cursor: not-allowed; `, }; export const DragPreview: DragPreviewRender = (props) => { const item = props.item; return (
{item.text}
); }; export const Placeholder: FC<{ node: Parameters>[0]; params: Parameters>[1]; }> = ({ params }) => { return (
); };