wip page drag

This commit is contained in:
Rizky 2023-11-28 13:26:27 +07:00
parent e7d52b8294
commit be9c54ecc7
3 changed files with 54 additions and 5 deletions

View File

@ -1,6 +1,7 @@
import { import {
Tree as DNDTree, Tree as DNDTree,
DndProvider, DndProvider,
NodeModel,
TreeMethods, TreeMethods,
getBackendOptions, getBackendOptions,
} from "@minoru/react-dnd-treeview"; } from "@minoru/react-dnd-treeview";
@ -68,7 +69,14 @@ export const EdPopPage = () => {
pagePicker.ref = ref; pagePicker.ref = ref;
} }
}} }}
className={cx("absolute inset-[5%] bg-white flex")} className={cx(
"absolute inset-[5%] bg-white flex",
css`
.dropping {
background: #efefff;
}
`
)}
> >
<div className="relative flex flex-1 items-stretch text-[14px] overflow-auto"> <div className="relative flex flex-1 items-stretch text-[14px] overflow-auto">
{pagePicker.status === "loading" && ( {pagePicker.status === "loading" && (
@ -92,10 +100,49 @@ export const EdPopPage = () => {
}} }}
tree={pagePicker.tree} tree={pagePicker.tree}
rootId={"page-root"} rootId={"page-root"}
onDrop={() => {}} onDrop={async (newTree: NodeModel<PageItem>[], opt) => {
pagePicker.tree = newTree;
p.render();
if (!opt.dragSource?.droppable) {
await db.page.update({
where: {
id: opt.dragSourceId as string,
},
data: {
id_folder: (opt.dropTargetId === "root" ||
!opt.dropTargetId
? null
: opt.dropTargetId) as string,
},
select: { id: true },
});
} else {
await db.page_folder.update({
where: {
id: opt.dragSourceId as string,
},
data: {
parent_id: (opt.dropTargetId === "ROOT" ||
!opt.dropTargetId
? null
: opt.dropTargetId) as string,
},
select: {
id: true,
},
});
}
reloadPagePicker(p);
}}
dragPreviewRender={() => <></>} dragPreviewRender={() => <></>}
canDrag={() => true} canDrag={() => true}
classes={{ root: "flex-1" }} canDrop={(tree, opt) => {
if (opt.dropTarget?.data?.type === "page") return false;
if (opt.dropTargetId === "page-root") return false;
return true;
}}
classes={{ root: "flex-1", dropTarget: "dropping" }}
render={edPageTreeRender} render={edPageTreeRender}
/> />
</DndProvider> </DndProvider>

View File

@ -37,6 +37,7 @@ export const reloadPagePicker = async (p: PG) => {
id: "root", id: "root",
parent: "page-root", parent: "page-root",
text: "pages", text: "pages",
droppable: true,
data: { id: "root", name: "pages", type: "folder" }, data: { id: "root", name: "pages", type: "folder" },
}); });
@ -45,6 +46,7 @@ export const reloadPagePicker = async (p: PG) => {
id: page.id, id: page.id,
parent: page.id_folder || "root", parent: page.id_folder || "root",
text: page.name, text: page.name,
droppable: false,
data: { data: {
id: page.id, id: page.id,
name: page.name, name: page.name,

View File

@ -205,13 +205,13 @@ export const edPageTreeRender: NodeRender<PageItem> = (
}; };
const Name: FC<{ name: string }> = ({ name }) => { const Name: FC<{ name: string }> = ({ name }) => {
if (name.startsWith("layout::")) { if (name.startsWith("layout:")) {
return ( return (
<div className="flex items-center"> <div className="flex items-center">
<div className="border border-green-600 text-green-600 mr-1 font-mono text-[8px] px-1 bg-white "> <div className="border border-green-600 text-green-600 mr-1 font-mono text-[8px] px-1 bg-white ">
LAYOUT LAYOUT
</div> </div>
<div>{name.substring("layout::".length)}</div> <div>{name.substring("layout:".length)}</div>
</div> </div>
); );
} }