diff --git a/app/web/src/nova/ed/logic/tree/sync-walk.tsx b/app/web/src/nova/ed/logic/tree/sync-walk.tsx
index 68eb0603..d9c98176 100644
--- a/app/web/src/nova/ed/logic/tree/sync-walk.tsx
+++ b/app/web/src/nova/ed/logic/tree/sync-walk.tsx
@@ -5,7 +5,7 @@ import { MContent } from "../../../../utils/types/general";
import { IItem, MItem } from "../../../../utils/types/item";
import { FNCompDef, FNComponent } from "../../../../utils/types/meta-fn";
import { MSection } from "../../../../utils/types/section";
-import { EdMeta, PG } from "../ed-global";
+import { EdMeta, PG, active } from "../ed-global";
import { loadCompSnapshot } from "./sync-walk-comp";
import {
ensureMItemProps,
@@ -154,6 +154,7 @@ export const syncWalkMap = (
ref_ids = {};
}
const old_id = item.id;
+
mapItem(mcomp, item, ref_ids);
item.originalId = item.id;
item.id = old_id;
diff --git a/app/web/src/nova/ed/panel/header/mid/add-item.tsx b/app/web/src/nova/ed/panel/header/mid/add-item.tsx
index b037fa4e..405c65b7 100644
--- a/app/web/src/nova/ed/panel/header/mid/add-item.tsx
+++ b/app/web/src/nova/ed/panel/header/mid/add-item.tsx
@@ -33,7 +33,8 @@ export const EdAddItem = () => {
if (mitem) {
if (meta.item.type === 'text'
|| (meta.item.type === 'item' && meta.item.component?.id)) {
- const parent = getMetaById(p, meta.parent_item.id);
+ const parent_id = meta.parent_item.id;
+ const parent = getMetaById(p, parent_id === 'root' ? meta.item.id : parent_id);
if (!parent) {
alert('Failed to add text!');
} else {
diff --git a/app/web/src/nova/ed/panel/header/mid/add-text.tsx b/app/web/src/nova/ed/panel/header/mid/add-text.tsx
index 2b032b57..b26f0fca 100644
--- a/app/web/src/nova/ed/panel/header/mid/add-text.tsx
+++ b/app/web/src/nova/ed/panel/header/mid/add-text.tsx
@@ -35,7 +35,8 @@ export const EdAddText = () => {
if (mitem) {
if (meta.item.type === 'text'
|| (meta.item.type === 'item' && meta.item.component?.id)) {
- const parent = getMetaById(p, meta.parent_item.id);
+ const parent_id = meta.parent_item.id;
+ const parent = getMetaById(p, parent_id === 'root' ? meta.item.id : parent_id);
if (!parent) {
alert('Failed to add text!');
} else {
diff --git a/app/web/src/nova/ed/panel/main/main.tsx b/app/web/src/nova/ed/panel/main/main.tsx
index 629690b3..07d008cb 100644
--- a/app/web/src/nova/ed/panel/main/main.tsx
+++ b/app/web/src/nova/ed/panel/main/main.tsx
@@ -42,49 +42,104 @@ export const EdMain = () => {
bind={({ render }) => {
p.page.render = render;
}}
- hidden={(item) => {
- if (item.hidden) return true;
+ hidden={(meta) => {
+ if (meta.item.hidden) return true
return false;
}}
hover={{
- get(item) {
- return active.hover_id === item.id;
+ get(meta) {
+ const item = meta.item;
+
+ if (item.originalId === active.hover_id || item.id === active.hover_id)
+ return true;
+
+ return false
},
- set(id) {
- active.hover_id = id;
+ set(meta) {
+
+ if (meta.parent_mcomp) {
+ const id = meta.parent_mcomp.mitem.get('id');
+
+ if (active.instance.item_id !== id) {
+ const original_id = meta.parent_mcomp.mitem.get('originalId');
+
+ if (active.comp_id && original_id) {
+ active.item_id = original_id;
+ } else if (id) {
+ active.item_id = id;
+ }
+
+ p.render();
+ p.page.render();
+ return;
+ }
+ }
+
+ if (active.comp_id) {
+ if (meta.item.originalId) {
+ active.hover_id = meta.item.originalId;
+ } else {
+ console.error('Failed to hover, original id not found');
+ }
+ } else {
+ active.hover_id = meta.item.id
+ }
+
p.render();
p.page.render();
},
}}
active={{
- get(item) {
- return active.item_id === item.id;
+ get(meta) {
+ const item = meta.item;
+
+ if (item.originalId === active.item_id || item.id === active.item_id)
+ return true;
+
+ return false
},
- set(id) {
- active.item_id = id;
+ set(meta) {
+ if (meta.parent_mcomp) {
+ const id = meta.parent_mcomp.mitem.get('id');
- const meta = getMetaById(p, id);
- if (meta.item.type === 'text') {
- setTimeout(async () => {
- await waitUntil(() => document.querySelector(`.v-text-${id}`))
- const vtext = document.querySelector(`.v-text-${id}`) as HTMLInputElement;
- if (vtext)
- vtext.focus()
- })
+ if (active.instance.item_id !== id) {
+ const original_id = meta.parent_mcomp.mitem.get('originalId');
+
+ if (active.comp_id && original_id) {
+ active.item_id = original_id;
+ } else if (id) {
+ active.item_id = id;
+ }
+
+ p.render();
+ p.page.render();
+ return;
+ }
}
+
+ if (active.comp_id) {
+ if (meta.item.originalId) {
+ active.item_id = meta.item.originalId;
+ } else {
+ console.error('Failed to select, original id not found');
+ }
+ } else {
+ active.item_id = meta.item.id
+ }
+
p.render();
p.page.render();
},
- text(item, className) {
+ text(meta) {
+ const { item } = meta;
if (active.text.id !== item.id) {
active.text.id = item.id;
- active.text.content = item.html;
+ active.text.content = item.html || "";
}
-
return
{
meta.mitem.set('html', active.text.content)
}
}}
- dangerouslySetInnerHTML={{ __html: item.html }}>
+ dangerouslySetInnerHTML={{ __html: item.html || "" }}>
}
}}
/>
diff --git a/app/web/src/nova/ed/panel/tree/node/item/action/del.tsx b/app/web/src/nova/ed/panel/tree/node/item/action/del.tsx
index a0807c71..afec2c67 100644
--- a/app/web/src/nova/ed/panel/tree/node/item/action/del.tsx
+++ b/app/web/src/nova/ed/panel/tree/node/item/action/del.tsx
@@ -1,15 +1,18 @@
import { IContent } from "../../../../../../../utils/types/general";
import { PG } from "../../../../../logic/ed-global";
-import { treeRebuild } from "../../../../../logic/tree/build";
+import { getMetaById, treeRebuild } from "../../../../../logic/tree/build";
export const edActionDelete = async (p: PG, item: IContent) => {
- const mitem = p.page.meta[item.id].mitem;
- if (mitem) {
- mitem.parent.forEach((e, k) => {
- if (e == mitem) {
- mitem.parent.delete(k);
- }
- });
- await treeRebuild(p);
+ const meta = getMetaById(p, item.id);
+ if (meta) {
+ const mitem = meta.mitem;
+ if (mitem) {
+ mitem.parent.forEach((e, k) => {
+ if (e == mitem) {
+ mitem.parent.delete(k);
+ }
+ });
+ await treeRebuild(p);
+ }
}
};
diff --git a/app/web/src/nova/ed/panel/tree/node/item/name.tsx b/app/web/src/nova/ed/panel/tree/node/item/name.tsx
index d8a60aa6..d0b81ebf 100644
--- a/app/web/src/nova/ed/panel/tree/node/item/name.tsx
+++ b/app/web/src/nova/ed/panel/tree/node/item/name.tsx
@@ -74,7 +74,7 @@ export const EdTreeName = ({
) : (
- {/*
{item.id}
*/}
+
{item.id} - {item.originalId}
)}
diff --git a/app/web/src/nova/ed/panel/tree/node/key-map.tsx b/app/web/src/nova/ed/panel/tree/node/key-map.tsx
index 19ca45b4..8604d89e 100644
--- a/app/web/src/nova/ed/panel/tree/node/key-map.tsx
+++ b/app/web/src/nova/ed/panel/tree/node/key-map.tsx
@@ -156,18 +156,22 @@ export const treeItemKeyMap = (p: PG, prm: RenderParams, item: IContent) => {
if (e.key === "Backspace" || e.key === "Delete") {
let last = "";
let found = null as HTMLInputElement | null;
- p.page.meta[item.id].parent_item.mitem?.get("childs")?.forEach((e) => {
- if (e.get("id") === item.id) {
+
+ const meta = getMetaById(p, item.id);
+ if (meta) {
+ meta.parent_item.mitem?.get("childs")?.forEach((e) => {
+ if (e.get("id") === item.id) {
+ found = document.querySelector(`.tree-${last}`);
+ }
+ if (!found) {
+ last = e.get("id");
+ }
+ });
+
+ if (!found) {
+ last = meta.parent_item.mitem?.get("id") || "";
found = document.querySelector(`.tree-${last}`);
}
- if (!found) {
- last = e.get("id");
- }
- });
-
- if (!found) {
- last = p.page.meta[item.id].parent_item.mitem?.get("id") || "";
- found = document.querySelector(`.tree-${last}`);
}
edActionDelete(p, item);
diff --git a/app/web/src/nova/view/logic/global.ts b/app/web/src/nova/view/logic/global.ts
index fe95d931..3ec72975 100644
--- a/app/web/src/nova/view/logic/global.ts
+++ b/app/web/src/nova/view/logic/global.ts
@@ -20,17 +20,17 @@ export const ViewGlobal = {
api: null as any,
},
view: {
- hidden: undefined as undefined | ((item: IContent) => boolean),
+ hidden: undefined as undefined | ((meta: EdMeta) => boolean),
active: undefined as
| undefined
| {
- get: (item: IContent) => boolean;
- set: (id: string) => void;
- text?: (item: IText) => ReactNode
+ get: (meta: EdMeta) => boolean;
+ set: (meta: EdMeta) => void;
+ text?: (meta: EdMeta) => ReactNode
},
hover: undefined as
| undefined
- | { get: (item: IContent) => boolean; set: (id: string) => void },
+ | { get: (meta: EdMeta) => boolean; set: (meta: EdMeta) => void },
},
};
diff --git a/app/web/src/nova/view/render/meta/children.tsx b/app/web/src/nova/view/render/meta/children.tsx
index 639cba4a..82afb3dc 100644
--- a/app/web/src/nova/view/render/meta/children.tsx
+++ b/app/web/src/nova/view/render/meta/children.tsx
@@ -1,39 +1,40 @@
import { FC, Fragment, ReactNode } from "react";
import { useGlobal } from "web-utils";
-import { IItem } from "../../../../utils/types/item";
-import { ISection } from "../../../../utils/types/section";
-import { IText } from "../../../../utils/types/text";
+import { EdMeta } from "../../../ed/logic/ed-global";
import { ViewGlobal } from "../../logic/global";
import { ViewMeta } from "./meta";
-export const ViewMetaChildren: FC<{ item: IItem | IText | ISection, className?: string }> = ({
- item,
+export const ViewMetaChildren: FC<{
+ meta: EdMeta,
+ className?: string
+}> = ({
+ meta,
className
}) => {
- const v = useGlobal(ViewGlobal, "VIEW");
- const children: Record = {};
-
- if (item.type !== "text") {
- for (const child of item.childs) {
- if (child.id) {
- children[child.id] = ();
+ const v = useGlobal(ViewGlobal, "VIEW");
+ const children: Record = {};
+ const item = meta.item;
+ if (item.type !== "text") {
+ for (const child of item.childs) {
+ if (child.id) {
+ children[child.id] = ();
+ }
+ }
+ } else {
+ if (item.id) {
+ if (v.view.active?.text && v.view.active?.get(meta)) {
+ children[item.id] =
+ {v.view.active.text(meta)}
+ ;
+ } else {
+ children[item.id] =
+ ;
+ }
}
}
- } else {
- if (item.id) {
- if (v.view.active?.text && v.view.active?.get(item)) {
- children[item.id] =
- {v.view.active.text(item)}
- ;
- } else {
- children[item.id] =
- ;
- }
- }
- }
- return <>{Object.values(children)}>;
-};
+ return <>{item.id}{Object.values(children)}>;
+ };
diff --git a/app/web/src/nova/view/render/meta/meta.tsx b/app/web/src/nova/view/render/meta/meta.tsx
index 2615e669..fc798ca5 100644
--- a/app/web/src/nova/view/render/meta/meta.tsx
+++ b/app/web/src/nova/view/render/meta/meta.tsx
@@ -24,7 +24,7 @@ export const ViewMeta: FC<{ id: string; scopeIndex?: Record }> = ({
}
if (item.hidden && v.view.hidden) {
- if (v.view.hidden(item)) {
+ if (v.view.hidden(meta)) {
return null;
}
}
diff --git a/app/web/src/nova/view/render/meta/render.tsx b/app/web/src/nova/view/render/meta/render.tsx
index 8d6e7482..9c2622f1 100644
--- a/app/web/src/nova/view/render/meta/render.tsx
+++ b/app/web/src/nova/view/render/meta/render.tsx
@@ -14,17 +14,17 @@ export const ViewMetaRender: FC<{
const item = meta.item;
if (meta.is_layout && !v.layout.show) {
- return ;
+ return ;
}
if (!className) {
_className = produceCSS(item, {
mode: v.mode,
- hover: v.view.hover ? v.view.hover.get(item) : undefined,
- active: v.view.active ? v.view.active.get(item) : undefined,
+ hover: v.view.hover ? v.view.hover.get(meta) : undefined,
+ active: v.view.active ? v.view.active.get(meta) : undefined,
});
}
-
+
return (
{
- e.stopPropagation();
- e.preventDefault();
- v.view.hover?.set(item.id);
- }
+ e.stopPropagation();
+ e.preventDefault();
+ v.view.hover?.set(meta);
+ }
: props?.onPointerOver
}
onClick={
v.view.active
? (e) => {
- e.stopPropagation();
- e.preventDefault();
- v.view.active?.set(item.id);
- }
+ e.stopPropagation();
+ e.preventDefault();
+ v.view.active?.set(meta);
+ }
: props?.onClick
}
>
-
+
);
};
diff --git a/app/web/src/nova/view/render/meta/script.tsx b/app/web/src/nova/view/render/meta/script.tsx
index d7a14575..7d54855e 100644
--- a/app/web/src/nova/view/render/meta/script.tsx
+++ b/app/web/src/nova/view/render/meta/script.tsx
@@ -23,10 +23,10 @@ export const ViewMetaScript: FC<{
const w = window as any;
const className = produceCSS(item, {
mode: v.mode,
- hover: v.view.hover ? v.view.hover.get(item) : undefined,
- active: v.view.active ? v.view.active.get(item) : undefined,
+ hover: v.view.hover ? v.view.hover.get(meta) : undefined,
+ active: v.view.active ? v.view.active.get(meta) : undefined,
});
- const children = ;
+ const children = ;
let args = {};
if (js && meta) {
@@ -86,14 +86,14 @@ export const ViewMetaScript: FC<{
? (e: any) => {
e.stopPropagation();
e.preventDefault();
- v.view.hover?.set(item.id);
+ v.view.hover?.set(meta);
}
: undefined,
onClick: v.view.active
? (e: any) => {
e.stopPropagation();
e.preventDefault();
- v.view.active?.set(item.id);
+ v.view.active?.set(meta);
}
: undefined,
},
diff --git a/app/web/src/nova/view/view.tsx b/app/web/src/nova/view/view.tsx
index 1881ed9b..42578ef2 100644
--- a/app/web/src/nova/view/view.tsx
+++ b/app/web/src/nova/view/view.tsx
@@ -1,8 +1,7 @@
import { FC, ReactNode, Suspense } from "react";
import { useGlobal } from "web-utils";
-import { IContent } from "../../utils/types/general";
-import { IText } from "../../utils/types/text";
import { Loading } from "../../utils/ui/loading";
+import { EdMeta } from "../ed/logic/ed-global";
import { ViewGlobal } from "./logic/global";
import { vInit } from "./logic/init";
import { newLoadCode } from "./logic/load-code-new";
@@ -22,12 +21,12 @@ type ViewProp = {
layout?: { show: boolean };
isEditor?: boolean;
bind?: (arg: { render: () => void }) => void;
- hidden?: (item: IContent) => boolean;
- hover?: { get: (item: IContent) => boolean; set: (id: string) => void };
+ hidden?: (item: EdMeta) => boolean;
+ hover?: { get: (item: EdMeta) => boolean; set: (meta: EdMeta) => void };
active?: {
- get: (item: IContent) => boolean;
- set: (id: string) => void;
- text?: (item: IText, className: string) => ReactNode
+ get: (item: EdMeta) => boolean;
+ set: (item: EdMeta) => void;
+ text?: (item: EdMeta) => ReactNode
};
};