diff --git a/app/web/src/nova/ed/panel/popup/page/page-popup.tsx b/app/web/src/nova/ed/panel/popup/page/page-popup.tsx
index f96b9cb0..7b44e41f 100644
--- a/app/web/src/nova/ed/panel/popup/page/page-popup.tsx
+++ b/app/web/src/nova/ed/panel/popup/page/page-popup.tsx
@@ -1,6 +1,7 @@
import {
Tree as DNDTree,
DndProvider,
+ NodeModel,
TreeMethods,
getBackendOptions,
} from "@minoru/react-dnd-treeview";
@@ -68,7 +69,14 @@ export const EdPopPage = () => {
pagePicker.ref = ref;
}
}}
- className={cx("absolute inset-[5%] bg-white flex")}
+ className={cx(
+ "absolute inset-[5%] bg-white flex",
+ css`
+ .dropping {
+ background: #efefff;
+ }
+ `
+ )}
>
{pagePicker.status === "loading" && (
@@ -92,10 +100,49 @@ export const EdPopPage = () => {
}}
tree={pagePicker.tree}
rootId={"page-root"}
- onDrop={() => {}}
+ onDrop={async (newTree: NodeModel
[], 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={() => <>>}
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}
/>
diff --git a/app/web/src/nova/ed/panel/popup/page/page-reload.ts b/app/web/src/nova/ed/panel/popup/page/page-reload.ts
index d29ddf9f..87ad9c97 100644
--- a/app/web/src/nova/ed/panel/popup/page/page-reload.ts
+++ b/app/web/src/nova/ed/panel/popup/page/page-reload.ts
@@ -37,6 +37,7 @@ export const reloadPagePicker = async (p: PG) => {
id: "root",
parent: "page-root",
text: "pages",
+ droppable: true,
data: { id: "root", name: "pages", type: "folder" },
});
@@ -45,6 +46,7 @@ export const reloadPagePicker = async (p: PG) => {
id: page.id,
parent: page.id_folder || "root",
text: page.name,
+ droppable: false,
data: {
id: page.id,
name: page.name,
diff --git a/app/web/src/nova/ed/panel/popup/page/page-tree.tsx b/app/web/src/nova/ed/panel/popup/page/page-tree.tsx
index d6bd1dba..a7bba1ed 100644
--- a/app/web/src/nova/ed/panel/popup/page/page-tree.tsx
+++ b/app/web/src/nova/ed/panel/popup/page/page-tree.tsx
@@ -205,13 +205,13 @@ export const edPageTreeRender: NodeRender = (
};
const Name: FC<{ name: string }> = ({ name }) => {
- if (name.startsWith("layout::")) {
+ if (name.startsWith("layout:")) {
return (
LAYOUT
-
{name.substring("layout::".length)}
+
{name.substring("layout:".length)}
);
}