This commit is contained in:
Rizky 2024-03-24 13:19:20 +07:00
parent 7a50709df5
commit 0a31f78dd1
2 changed files with 50 additions and 12 deletions

View File

@ -295,6 +295,7 @@ export const EdSidePropInstance: FC<{ meta: IMeta }> = ({ meta }) => {
{type === "option" && ( {type === "option" && (
<EdPropInstanceOptions <EdPropInstanceOptions
mprop={mprop} mprop={mprop}
meta={meta}
cprop={cprop} cprop={cprop}
name={name} name={name}
labelClick={labelClick} labelClick={labelClick}

View File

@ -3,7 +3,7 @@ import { useGlobal, useLocal } from "web-utils";
import { apiProxy } from "../../../../../base/load/api/api-proxy"; import { apiProxy } from "../../../../../base/load/api/api-proxy";
import { dbProxy } from "../../../../../base/load/db/db-proxy"; import { dbProxy } from "../../../../../base/load/db/db-proxy";
import { FMCompDef, FNCompDef } from "../../../../../utils/types/meta-fn"; import { FMCompDef, FNCompDef } from "../../../../../utils/types/meta-fn";
import { EDGlobal } from "../../../logic/ed-global"; import { EDGlobal, IMeta } from "../../../logic/ed-global";
import { treeRebuild } from "../../../logic/tree/build"; import { treeRebuild } from "../../../logic/tree/build";
import { EdPropLabel } from "./prop-label"; import { EdPropLabel } from "./prop-label";
import { ChevronDown } from "../../tree/node/item/indent"; import { ChevronDown } from "../../tree/node/item/indent";
@ -13,14 +13,20 @@ type MetaOption = {
label: string; label: string;
value: any; value: any;
options?: MetaOption[]; options?: MetaOption[];
reload?: string[];
};
const config = {
opt: {} as Record<string, () => void>,
}; };
export const EdPropInstanceOptions: FC<{ export const EdPropInstanceOptions: FC<{
meta: IMeta;
name: string; name: string;
mprop: FMCompDef; mprop: FMCompDef;
cprop: FNCompDef; cprop: FNCompDef;
labelClick?: React.MouseEventHandler<HTMLDivElement> | undefined; labelClick?: React.MouseEventHandler<HTMLDivElement> | undefined;
}> = ({ name, mprop, cprop, labelClick }) => { }> = ({ name, mprop, cprop, labelClick, meta }) => {
const prop = mprop.toJSON() as FNCompDef; const prop = mprop.toJSON() as FNCompDef;
const local = useLocal({ const local = useLocal({
codeEditing: false, codeEditing: false,
@ -37,6 +43,13 @@ export const EdPropInstanceOptions: FC<{
let metaOptions: MetaOption[] = []; let metaOptions: MetaOption[] = [];
config.opt[name] = () => {
local.metaFn = null;
local.loaded = null;
local.loading = false;
local.render();
};
if (cprop.meta?.options || cprop.meta?.optionsBuilt) { if (cprop.meta?.options || cprop.meta?.optionsBuilt) {
if (!local.loaded) { if (!local.loaded) {
try { try {
@ -45,14 +58,24 @@ export const EdPropInstanceOptions: FC<{
if (!p.script.api) p.script.api = apiProxy(p.site.config.api_url); if (!p.script.api) p.script.api = apiProxy(p.site.config.api_url);
} }
const args = { const arg = {
...window.exports, ...window.exports,
db: p.script.db, db: p.script.db,
api: p.script.api, api: p.script.api,
}; };
if (meta.item.script?.props) {
for (const [k, v] of Object.entries(meta.item.script?.props)) {
eval(`arg.${k} = ${v.value}`);
}
} else if (meta.item.component) {
for (const [k, v] of Object.entries(meta.item.component.props)) {
eval(`arg.${k} = ${v.valueBuilt}`);
}
}
eval(` eval(`
${Object.entries(args) ${Object.entries(arg)
.map((e) => `const ${e[0]} = args["${e[0]}"]`) .map((e) => `const ${e[0]} = arg["${e[0]}"]`)
.join(";\n")} .join(";\n")}
const resOpt = ${cprop.meta.optionsBuilt || cprop.meta.options}; const resOpt = ${cprop.meta.optionsBuilt || cprop.meta.options};
if (typeof resOpt === 'function') local.metaFn = resOpt; if (typeof resOpt === 'function') local.metaFn = resOpt;
@ -87,7 +110,7 @@ else metaOptions = resOpt;
} }
}, [evalue]); }, [evalue]);
const onChange = (val: string) => { const onChange = (val: string, item: MetaOption | undefined) => {
mprop.doc?.transact(() => { mprop.doc?.transact(() => {
mprop.set("value", val); mprop.set("value", val);
mprop.set("valueBuilt", val); mprop.set("valueBuilt", val);
@ -95,6 +118,16 @@ else metaOptions = resOpt;
treeRebuild(p); treeRebuild(p);
p.render(); p.render();
setTimeout(() => {
if (item?.reload) {
for (const name of item.reload) {
if (config.opt[name]) {
config.opt[name]();
}
}
}
});
}; };
let mode = cprop.meta?.option_mode; let mode = cprop.meta?.option_mode;
@ -117,7 +150,10 @@ else metaOptions = resOpt;
value={evalue} value={evalue}
className="flex-1 border-l outline-none" className="flex-1 border-l outline-none"
onChange={(ev) => { onChange={(ev) => {
onChange(`"${ev.currentTarget.value}"`); onChange(
`"${ev.currentTarget.value}"`,
metaOptions.find((e) => e.value === ev.currentTarget.value)
);
}} }}
> >
{Array.isArray(metaOptions) && {Array.isArray(metaOptions) &&
@ -145,7 +181,7 @@ else metaOptions = resOpt;
: "bg-blue-700 text-white border-blue-700" : "bg-blue-700 text-white border-blue-700"
)} )}
onClick={() => { onClick={() => {
onChange(`"${item.value}"`); onChange(`"${item.value}"`, item);
}} }}
> >
{item.label} {item.label}
@ -192,7 +228,7 @@ else metaOptions = resOpt;
idx={idx} idx={idx}
val={val} val={val}
onChange={(val) => { onChange={(val) => {
onChange(JSON.stringify(val)); onChange(JSON.stringify(val), item);
local.render(); local.render();
}} }}
/> />
@ -203,6 +239,7 @@ else metaOptions = resOpt;
return ( return (
<SingleCheckbox <SingleCheckbox
key={idx}
item={child} item={child}
idx={idx} idx={idx}
depth={1} depth={1}
@ -210,7 +247,7 @@ else metaOptions = resOpt;
onChange={(newval) => { onChange={(newval) => {
found.checked = newval; found.checked = newval;
onChange(JSON.stringify(val)); onChange(JSON.stringify(val), child);
local.render(); local.render();
}} }}
/> />
@ -266,7 +303,7 @@ const SingleCheckbox = ({
idx: number; idx: number;
depth?: number; depth?: number;
val: any[]; val: any[];
onChange: (val: MetaOption[]) => void; onChange: (val: MetaOption[], item: MetaOption) => void;
}) => { }) => {
const is_check = !!val.find((e) => { const is_check = !!val.find((e) => {
if (!item.options) { if (!item.options) {
@ -341,7 +378,7 @@ const SingleCheckbox = ({
val.push(item.value); val.push(item.value);
} }
} }
onChange(val); onChange(val, item);
}} }}
> >
{!is_check ? unchecked : checked} {!is_check ? unchecked : checked}