diff --git a/app/srv/ws/sync/actions/code_edit.ts b/app/srv/ws/sync/actions/code_edit.ts index e122d50a..02fade45 100644 --- a/app/srv/ws/sync/actions/code_edit.ts +++ b/app/srv/ws/sync/actions/code_edit.ts @@ -38,7 +38,11 @@ export const code_edit: SAction["code"]["edit"] = async function ( const mitem = findId(root, item_id); if (mitem) { - const adv = mitem.get("adv"); + let adv = mitem.get("adv"); + if (!adv) { + mitem.set("adv", new Y.Map() as any); + adv = mitem.get("adv"); + } if (adv) { const res = await transform(`render(${src})`, { @@ -48,10 +52,13 @@ export const code_edit: SAction["code"]["edit"] = async function ( minify: true, sourcemap: "inline", }); + doc?.transact(() => { - adv.set(mode, src); - if (mode === "js") { - adv.set("jsBuilt", res.code); + if (adv) { + adv.set(mode, src); + if (mode === "js") { + adv.set("jsBuilt", res.code); + } } }); } diff --git a/app/srv/ws/sync/actions/comp_load.ts b/app/srv/ws/sync/actions/comp_load.ts index 37c87985..7a7c2574 100644 --- a/app/srv/ws/sync/actions/comp_load.ts +++ b/app/srv/ws/sync/actions/comp_load.ts @@ -1,7 +1,10 @@ import { EComp } from "../../../../web/src/nova/ed/logic/ed-global"; +import { genMeta } from "../../../../web/src/nova/vi/meta/meta"; +import { IItem } from "../../../../web/src/utils/types/item"; import { DComp } from "../../../../web/src/utils/types/root"; import { SAction } from "../actions"; import { loadComponent, userSyncComponent } from "../editor/load-component"; +import { parseJs } from "../editor/parser/parse-js"; import { docs } from "../entity/docs"; import { snapshot } from "../entity/snapshot"; import { gzipAsync } from "../entity/zlib"; @@ -32,8 +35,30 @@ export const comp_load: SAction["comp"]["load"] = async function ( const snap = snapshot.get("comp", id); if (snap) { + const meta = {}; + const item = docs.comp[id].doc + .getMap("map") + .get("root") + ?.toJSON() as IItem; + + genMeta( + { + comps: {}, + meta, + on: { + visit(meta) { + if (typeof meta.item.adv?.js === "string") { + meta.scope.def = parseJs(meta); + } + }, + }, + }, + { item } + ); + result[id] = { id, + meta, snapshot: await gzipAsync(snap.bin), }; } diff --git a/app/srv/ws/sync/actions/page_load.ts b/app/srv/ws/sync/actions/page_load.ts index 1eb7f1ce..51c57454 100644 --- a/app/srv/ws/sync/actions/page_load.ts +++ b/app/srv/ws/sync/actions/page_load.ts @@ -229,8 +229,10 @@ const scanMeta = async (doc: DPage, sync: SyncConnection) => { meta, on: { visit(meta) { - if (typeof meta.item.adv?.js === "string") { - meta.scope.def = parseJs(meta); + if (!meta.parent?.comp_id) { + if (typeof meta.item.adv?.js === "string") { + meta.scope.def = parseJs(meta); + } } }, }, @@ -242,7 +244,23 @@ const scanMeta = async (doc: DPage, sync: SyncConnection) => { const comps: EPage["comps"] = {}; for (const [id, snap] of Object.entries(msnap)) { - comps[id] = { id, snapshot: await gzipAsync(snap.bin) }; + const meta = {}; + genMeta( + { + comps: {}, + meta, + on: { + visit(meta) { + if (typeof meta.item.adv?.js === "string") { + meta.scope.def = parseJs(meta); + } + }, + }, + }, + { item: mcomps[id].comp } + ); + + comps[id] = { id, meta, snapshot: await gzipAsync(snap.bin) }; } return { meta: simplifyMeta(meta), comps, entry }; diff --git a/app/web/src/nova/ed/logic/ed-global.ts b/app/web/src/nova/ed/logic/ed-global.ts index 3c214f1a..e470f18b 100644 --- a/app/web/src/nova/ed/logic/ed-global.ts +++ b/app/web/src/nova/ed/logic/ed-global.ts @@ -56,6 +56,7 @@ const EmptyPage = { const EmptyComp = { id: "", + meta: {} as Record, snapshot: null as null | Uint8Array, }; diff --git a/app/web/src/nova/ed/panel/main/main-per-item.tsx b/app/web/src/nova/ed/panel/main/main-per-item.tsx index c401cc69..d2ec10ec 100644 --- a/app/web/src/nova/ed/panel/main/main-per-item.tsx +++ b/app/web/src/nova/ed/panel/main/main-per-item.tsx @@ -25,7 +25,7 @@ export const mainPerItemVisit = ( meta: MPIVParam[0], parts: MPIVParam[1] ) => { - if ((meta.item as IContent).type === "text" && !meta.item.adv?.jsBuilt) { + if ((meta.item as IContent).type === "text" && !meta.item.adv?.js) { parts.props.spellCheck = false; parts.props.contentEditable = true; if (meta.parent?.comp_id) { diff --git a/app/web/src/nova/ed/panel/popup/script/pop-script.tsx b/app/web/src/nova/ed/panel/popup/script/pop-script.tsx index 0400fb5a..b8657e9c 100644 --- a/app/web/src/nova/ed/panel/popup/script/pop-script.tsx +++ b/app/web/src/nova/ed/panel/popup/script/pop-script.tsx @@ -25,7 +25,6 @@ export const EdPopScript = () => { if (script.type === "item") { delete p.script.init_local_effect[active.item_id]; - treeRebuild(p, { note: "script-close" }); } p.render(); 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 db45b4b1..75934ed3 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 @@ -98,7 +98,7 @@ export const EdTreeName = ({ ) : (
- {/*
{node.id} - {item.originalId}
*/} +
{node.id} - {item.originalId}
)} diff --git a/app/web/src/nova/vi/render/parts.tsx b/app/web/src/nova/vi/render/parts.tsx index c5552839..991be30b 100644 --- a/app/web/src/nova/vi/render/parts.tsx +++ b/app/web/src/nova/vi/render/parts.tsx @@ -25,7 +25,7 @@ export const viParts = (meta: IMeta, arg?: ViParts) => { }; let shouldRenderChild = true; - if (content.type === "text" && !item.adv?.jsBuilt) { + if (content.type === "text" && !item.adv?.js) { props.dangerouslySetInnerHTML = { __html: item.html || "" }; shouldRenderChild = false; } diff --git a/app/web/src/nova/vi/render/script/eval-script.tsx b/app/web/src/nova/vi/render/script/eval-script.tsx index bb5c44d1..afc8ad01 100644 --- a/app/web/src/nova/vi/render/script/eval-script.tsx +++ b/app/web/src/nova/vi/render/script/eval-script.tsx @@ -34,7 +34,7 @@ export const viEvalScript = ( if (!meta.script) { meta.script = { result: null, - Local: createViLocal(meta, scope, vi.script?.init_local_effect), + Local: createViLocal(vi.meta, meta, scope, vi.script?.init_local_effect), PassProp: createViPassProp(vi, meta, scope), }; } diff --git a/app/web/src/nova/vi/render/script/local.tsx b/app/web/src/nova/vi/render/script/local.tsx index 9ed20782..1a513321 100644 --- a/app/web/src/nova/vi/render/script/local.tsx +++ b/app/web/src/nova/vi/render/script/local.tsx @@ -1,8 +1,9 @@ -import { ReactNode, useEffect, useRef, useState } from "react"; +import { ReactNode, useEffect, useRef } from "react"; import { IMeta } from "../../../ed/logic/ed-global"; import { updatePropScope } from "./eval-prop"; export const createViLocal = ( + metas: Record, meta: IMeta, scope: any, init_local_effect: any @@ -32,10 +33,24 @@ export const createViLocal = ( } useEffect(() => { - let should_run = !init_local_effect[meta.item.id]; + let id = meta.item.id; + if (meta.parent?.instance_id) { + const parent_meta = metas[meta.parent?.instance_id]; + if (parent_meta && parent_meta.instances) { + for (const [k, v] of Object.entries( + parent_meta.instances[meta.parent.instance_id] + )) { + if (v === meta.item.id) { + id = k; + break; + } + } + } + } + let should_run = !init_local_effect[id]; if (should_run) { if (typeof init_local_effect === "object") { - init_local_effect[meta.item.id] = true; + init_local_effect[id] = true; } const fn = async () => { if (arg.effect) {