diff --git a/app/srv/ws/sync/actions/code_edit.ts b/app/srv/ws/sync/actions/code_edit.ts index 2a80f33e..260567d2 100644 --- a/app/srv/ws/sync/actions/code_edit.ts +++ b/app/srv/ws/sync/actions/code_edit.ts @@ -72,6 +72,8 @@ export const code_edit: SAction["code"]["edit"] = async function ( const res = parseJs(adv.get("js")) || false; if (res) { mitem.set("script", res); + } else { + mitem.delete("script"); } } } diff --git a/app/web/src/nova/ed/panel/popup/script/scope/scope.tsx b/app/web/src/nova/ed/panel/popup/script/scope/scope.tsx index 484d5628..7e50ffdd 100644 --- a/app/web/src/nova/ed/panel/popup/script/scope/scope.tsx +++ b/app/web/src/nova/ed/panel/popup/script/scope/scope.tsx @@ -20,10 +20,16 @@ export const declareScope = (p: PG, meta: IMeta, monaco: Monaco) => { map_childs(p, metas, entry, paths); let cur = active.comp_id ? active.comp_id : "page"; - const import_map = extract_import_map(cur, paths, meta, p, monaco); + const { import_map, parent_id } = extract_import_map( + cur, + paths, + meta, + p, + monaco + ); gen_content(cur, p, paths, import_map, monaco); - return import_map[active.item_id]; + return import_map[parent_id]; }; const gen_content = ( @@ -38,6 +44,18 @@ const gen_content = ( let idx = 0; let last_import = ""; for (const m of path) { + if (!added.has(m.item.id) && m.item.adv?.js) { + added.add(m.item.id); + const content = last_import + ? `\ +${last_import} +/** IMPORT MODULE **/ +${m.item.adv.js}` + : m.item.adv.js; + + addScope(p, monaco, `file:///${cur}_${m.item.id}_src_src.tsx`, content); + } + if (!import_map[m.item.id]) { if (idx === 0) { break; @@ -45,16 +63,6 @@ const gen_content = ( } else { last_import = import_map[m.item.id]; } - if (!added.has(m.item.id) && m.item.adv?.js) { - added.add(m.item.id); - const content = `\ -${last_import} -/** IMPORT MODULE **/ -${m.item.adv.js} -`; - - addScope(p, monaco, `file:///${cur}_${m.item.id}_src_src.tsx`, content); - } idx++; } } @@ -68,18 +76,23 @@ const extract_import_map = ( monaco: Monaco ) => { const added = new Set(); - + let parent_id = ""; const import_map = {} as Record; for (const path of paths) { const imports = new Set(); if (path.map((e) => e.item.id).includes(meta.item.id)) { let i = 0; - for (const meta of path) { - if (!added.has(meta.item.id)) { - added.add(meta.item.id); + let prev_m = null as any; + for (const m of path) { + if (m.item.id === meta.item.id) { + if (prev_m) parent_id = prev_m.item.id; + } + prev_m = m; + if (!added.has(m.item.id)) { + added.add(m.item.id); - const ex = extractExport(p, meta); + const ex = extractExport(p, m); for (const [k, v] of Object.entries(ex)) { let src = ""; @@ -110,13 +123,13 @@ ${src}` ); } - import_map[meta.item.id] = [...imports].join("\n"); + import_map[m.item.id] = [...imports].join("\n"); } i++; } } } - return import_map; + return { import_map, parent_id }; }; const comp_map = {} as Record< @@ -167,6 +180,7 @@ const map_childs = ( ); jprop = comp_map[meta.item.component.id]; + //todo: comp prop src: import from page scope for (const path of jprop.paths) { for (const m of path) { if (!jprop.exports[m.item.id]) { diff --git a/app/web/src/nova/vi/render/script/eval-prop.tsx b/app/web/src/nova/vi/render/script/eval-prop.tsx index b6d10c8f..f3027977 100644 --- a/app/web/src/nova/vi/render/script/eval-prop.tsx +++ b/app/web/src/nova/vi/render/script/eval-prop.tsx @@ -32,7 +32,20 @@ export const viEvalProps = ( const id = prop.content?.id; if (id) { const meta = vi.meta[id]; - return ; + if ( + meta.mitem && + prop.jsxCalledBy !== (meta.item.originalId || meta.item.id) + ) { + meta.mitem + .get("component") + ?.get("props") + ?.get(name) + ?.set( + "jsxCalledBy", + meta.item.originalId || meta.item.id + ); + } + return ; } return null; }, diff --git a/app/web/src/utils/types/item.ts b/app/web/src/utils/types/item.ts index 679c8063..99339f43 100644 --- a/app/web/src/utils/types/item.ts +++ b/app/web/src/utils/types/item.ts @@ -1,5 +1,4 @@ import { TypedArray, TypedMap } from "yjs-types"; -import { parseJs } from "../../../../srv/ws/sync/editor/parser/parse-js"; import { BasicItem, MBasicItem, MetaItem } from "./meta"; import { FNAdv, FNComponent, FNLayout, FNLinkTag } from "./meta-fn"; import { MSection } from "./section"; diff --git a/app/web/src/utils/types/meta-fn.ts b/app/web/src/utils/types/meta-fn.ts index f4e8a78e..c1510a11 100644 --- a/app/web/src/utils/types/meta-fn.ts +++ b/app/web/src/utils/types/meta-fn.ts @@ -30,6 +30,7 @@ export type FNCompDef = { valueBuilt: any; gen?: string; genBuilt?: string; + jsxCalledBy?: string; content?: IItem; visible?: string; meta?: FNCompMeta;