diff --git a/app/db/prisma/schema.prisma b/app/db/prisma/schema.prisma
index db2128d3..d3d246a3 100644
--- a/app/db/prisma/schema.prisma
+++ b/app/db/prisma/schema.prisma
@@ -302,7 +302,7 @@ model code_assign {
id_component_group String? @db.Uuid
id_page String? @db.Uuid
id String @id(map: "code_assign_id") @default(dbgenerated("gen_random_uuid()")) @db.Uuid
- code code @relation(fields: [id_code], references: [id], onDelete: NoAction, onUpdate: NoAction)
+ code code @relation(fields: [id_code], references: [id], onDelete: Cascade, onUpdate: NoAction)
component_group component_group? @relation(fields: [id_component_group], references: [id], onDelete: NoAction, onUpdate: NoAction)
page page? @relation(fields: [id_page], references: [id], onDelete: NoAction, onUpdate: NoAction)
}
diff --git a/app/web/src/nova/ed/logic/ed-sync.tsx b/app/web/src/nova/ed/logic/ed-sync.tsx
index c3495316..44c3b241 100644
--- a/app/web/src/nova/ed/logic/ed-sync.tsx
+++ b/app/web/src/nova/ed/logic/ed-sync.tsx
@@ -6,7 +6,7 @@ import { w } from "../../../utils/types/general";
import { Loading } from "../../../utils/ui/loading";
import { EmptySite, PG } from "./ed-global";
import { treeRebuild } from "./tree/build";
-import { evalCJS } from "../../view/logic/load-code";
+import { evalCJS } from "../../view/logic/load-code-new";
import { reloadPage } from "./ed-route";
import { loadSite } from "./ed-site";
diff --git a/app/web/src/nova/ed/panel/main/main.tsx b/app/web/src/nova/ed/panel/main/main.tsx
index 9eb1d44d..9ed21a55 100644
--- a/app/web/src/nova/ed/panel/main/main.tsx
+++ b/app/web/src/nova/ed/panel/main/main.tsx
@@ -4,6 +4,7 @@ import { View } from "../../../view/view";
import { EDGlobal, active } from "../../logic/ed-global";
import { compLoaded } from "../../logic/tree/build";
import { loadComponent } from "../../logic/tree/sync-walk";
+import { code } from "../popup/code/code";
export const EdMain = () => {
const p = useGlobal(EDGlobal, "EDITOR");
@@ -18,9 +19,10 @@ export const EdMain = () => {
>
{!!p.page.building &&
}
- {!p.page.building && (
+ {!p.page.building && code.mode !== "" && (
{
const p = useGlobal(EDGlobal, "EDITOR");
- const local = useLocal({ namePicker: false, codeAssign: false });
useEffect(() => {
(async () => {
- if (p.ui.popup.code.open) {
- const id_code = await p.sync.activity("site", {
- action: p.ui.popup.code.open ? "open" : "close",
- id: p.site.id,
- type: "code",
- name: p.ui.popup.code.name,
- });
+ if (code.mode === "new") {
+ if (p.ui.popup.code.open) {
+ const id_code = await p.sync.activity("site", {
+ action: p.ui.popup.code.open ? "open" : "close",
+ id: p.site.id,
+ type: "code",
+ name: p.ui.popup.code.name,
+ });
- if (id_code) {
- p.ui.popup.code.id = id_code;
- p.render();
+ if (id_code) {
+ p.ui.popup.code.id = id_code;
+ p.render();
+ }
}
+ p.ui.popup.code.init = true;
}
- p.ui.popup.code.init = true;
})();
}, [p.ui.popup.code.open]);
- const vscode_url = isLocalhost()
- ? "http://localhost:3000?"
- : "https://code.web.andromedia.co.id?tkn=prasi&";
+ useEffect(() => {
+ if (code.mode === "") {
+ db.code.findFirst({ where: { id_site: p.site.id } }).then((e) => {
+ code.mode = !!e ? "new" : "old";
+ p.render();
+ });
+ }
+ }, []);
return (
{
}
}}
>
-
-
-
-
{
- local.namePicker = false;
- p.ui.popup.code.name = e.name;
- p.ui.popup.code.id = "";
- p.render();
-
- const id_code = await p.sync.activity("site", {
- action: "open",
- id: p.site.id,
- type: "code",
- name: p.ui.popup.code.name,
- });
-
- if (id_code) {
- p.ui.popup.code.id = id_code;
- p.render();
- }
- }}
- />
- }
- popoverClassName="bg-white shadow-md"
- className={cx(
- "flex items-center px-2 w-[200px] hover:bg-blue-50 space-x-1",
- "cursor-pointer justify-between"
- )}
- open={local.namePicker}
- onOpenChange={(open) => {
- local.namePicker = open;
- local.render();
- }}
- >
-
-
-
-
-
-
- {p.ui.popup.code.name !== "site" &&
- p.ui.popup.code.name !== "SSR" && (
- <>
-
{
- if (
- prompt(
- "Are you sure want to delete this code?\ntype 'yes' to confirm:"
- ) === "yes"
- ) {
- await db.code.delete({
- where: { id: p.ui.popup.code.id },
- });
-
- codeName.list = codeName.list.filter(
- (e) => e.id !== p.ui.popup.code.id
- );
-
- p.ui.popup.code.name = codeName.list[0].name;
- p.ui.popup.code.id = codeName.list[0].id;
- p.render();
- }
- }}
- >
-
-
-
{
- local.codeAssign = open;
- local.render();
- }}
- backdrop={false}
- placement="bottom"
- popoverClassName="p-0 shadow-lg bg-white"
- content={
- {
- local.codeAssign = false;
- local.render();
- }}
- id_code={p.ui.popup.code.id}
- />
- }
- className="flex items-center border-l relative hover:bg-blue-50 cursor-pointer px-2 transition-all"
- >
-
-
- >
- )}
-
{
- p.ui.popup.code.show_log = !p.ui.popup.code.show_log;
- p.render();
- }}
- >
- {p.ui.popup.code.show_log && (
-
- )}
-
-
-
- {p.ui.popup.code.show_log && (
-
-
{p.ui.popup.code.log || "stdout is empty..."}
-
- )}
-
-
- {!p.ui.popup.code.open || !p.ui.popup.code.id ? (
-
- ) : (
- <>
-
-
- Loading VSCode...
-
- >
- )}
-
-
- {(local.namePicker || local.codeAssign) && (
+
+ {!code.mode &&
}
+ {code.mode === "new" &&
}
+ {code.mode === "old" && (
+
+
This site still using old code
{
- local.namePicker = false;
- local.codeAssign = false;
- local.render();
+ if (
+ confirm(
+ "Old code will not load, are you sure want to upgrade ?"
+ )
+ ) {
+ code.mode = "new";
+ p.ui.popup.code.open = false;
+ p.render();
+ }
}}
- >
- )}
-
+ className="border border-blue-500 cursor-pointer bg-blue-100 p-2 hover:bg-blue-200"
+ >
+ Upgrade to New Code Project
+
+
+ Warning: old code will not load once upgraded.
+
+
+ )}
);
};
+
+const CodeBody = () => {
+ const p = useGlobal(EDGlobal, "EDITOR");
+ const local = useLocal({ namePicker: false, codeAssign: false });
+
+ const vscode_url = isLocalhost()
+ ? "http://localhost:3000?"
+ : "https://code.web.andromedia.co.id?tkn=prasi&";
+
+ return (
+
+
+
{
+ local.namePicker = false;
+ p.ui.popup.code.name = e.name;
+ p.ui.popup.code.id = "";
+ p.render();
+
+ const id_code = await p.sync.activity("site", {
+ action: "open",
+ id: p.site.id,
+ type: "code",
+ name: p.ui.popup.code.name,
+ });
+
+ if (id_code) {
+ p.ui.popup.code.id = id_code;
+ p.render();
+ }
+ }}
+ />
+ }
+ popoverClassName="bg-white shadow-md"
+ className={cx(
+ "flex items-center px-2 w-[200px] hover:bg-blue-50 space-x-1",
+ "cursor-pointer justify-between"
+ )}
+ open={local.namePicker}
+ onOpenChange={(open) => {
+ local.namePicker = open;
+ local.render();
+ }}
+ >
+
+
+
+
+
+
+ {p.ui.popup.code.name !== "site" && p.ui.popup.code.name !== "SSR" && (
+ <>
+
{
+ if (
+ prompt(
+ "Are you sure want to delete this code?\ntype 'yes' to confirm:"
+ ) === "yes"
+ ) {
+ await db.code.delete({
+ where: { id: p.ui.popup.code.id },
+ });
+
+ codeName.list = codeName.list.filter(
+ (e) => e.id !== p.ui.popup.code.id
+ );
+
+ p.ui.popup.code.name = codeName.list[0].name;
+ p.ui.popup.code.id = codeName.list[0].id;
+ p.render();
+ }
+ }}
+ >
+
+
+
{
+ local.codeAssign = open;
+ local.render();
+ }}
+ backdrop={false}
+ placement="bottom"
+ popoverClassName="p-0 shadow-lg bg-white"
+ content={
+ {
+ local.codeAssign = false;
+ local.render();
+ }}
+ id_code={p.ui.popup.code.id}
+ />
+ }
+ className="flex items-center border-l relative hover:bg-blue-50 cursor-pointer px-2 transition-all"
+ >
+
+
+ >
+ )}
+
{
+ p.ui.popup.code.show_log = !p.ui.popup.code.show_log;
+ p.render();
+ }}
+ >
+ {p.ui.popup.code.show_log && (
+
+ )}
+
+
+
+ {p.ui.popup.code.show_log && (
+
+
{p.ui.popup.code.log || "stdout is empty..."}
+
+ )}
+
+
+ {!p.ui.popup.code.open || !p.ui.popup.code.id ? (
+
+ ) : (
+ <>
+
+
+ Loading VSCode...
+
+ >
+ )}
+
+
+ {(local.namePicker || local.codeAssign) && (
+
{
+ local.namePicker = false;
+ local.codeAssign = false;
+ local.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 18e8f3eb..d84a237c 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
@@ -1,8 +1,7 @@
import { NodeModel, RenderParams } from "@minoru/react-dnd-treeview";
-import { EDGlobal, EdMeta } from "../../../../logic/ed-global";
-import { useGlobal, useLocal } from "web-utils";
import { FC, useEffect } from "react";
-import { Tooltip } from "../../../../../../utils/ui/tooltip";
+import { useGlobal, useLocal } from "web-utils";
+import { EDGlobal, EdMeta } from "../../../../logic/ed-global";
export const EdTreeName = ({
node,
diff --git a/app/web/src/nova/view/logic/load-code.ts b/app/web/src/nova/view/logic/load-code-new.ts
similarity index 98%
rename from app/web/src/nova/view/logic/load-code.ts
rename to app/web/src/nova/view/logic/load-code-new.ts
index d8a4e2be..7d9ef45d 100644
--- a/app/web/src/nova/view/logic/load-code.ts
+++ b/app/web/src/nova/view/logic/load-code-new.ts
@@ -6,7 +6,7 @@ const codeMap = {
compGroup: {} as Record,
comp: {} as Record,
};
-export const vLoadCode = async (v: VG, forceLoad?: boolean) => {
+export const newLoadCode = async (v: VG, forceLoad?: boolean) => {
if (forceLoad) {
codeLoaded.clear();
v.status = "load-code";
diff --git a/app/web/src/nova/view/logic/load-code-old.ts b/app/web/src/nova/view/logic/load-code-old.ts
new file mode 100644
index 00000000..ed1ea730
--- /dev/null
+++ b/app/web/src/nova/view/logic/load-code-old.ts
@@ -0,0 +1,3 @@
+import { VG } from "./global";
+
+export const oldLoadCode = (v: VG) => {};
diff --git a/app/web/src/nova/view/view.tsx b/app/web/src/nova/view/view.tsx
index 6a5b5464..12e07e4f 100644
--- a/app/web/src/nova/view/view.tsx
+++ b/app/web/src/nova/view/view.tsx
@@ -4,11 +4,12 @@ import { IContent } from "../../utils/types/general";
import { Loading } from "../../utils/ui/loading";
import { ViewGlobal } from "./logic/global";
import { vInit } from "./logic/init";
-import { vLoadCode } from "./logic/load-code";
+import { newLoadCode } from "./logic/load-code-new";
import { VLoad, VLoadComponent } from "./logic/types";
import { VEntry } from "./render/entry";
import { ErrorBox } from "./render/meta/script/error-box";
import { IRoot } from "../../utils/types/root";
+import { oldLoadCode } from "./logic/load-code-old";
type ViewProp = {
load: VLoad;
@@ -17,6 +18,7 @@ type ViewProp = {
page_id: string;
api_url: string;
mode: "desktop" | "mobile";
+ code_mode?: "old" | "new";
layout?: { show: boolean };
isEditor?: boolean;
bind?: (arg: { render: () => void }) => void;
@@ -41,6 +43,7 @@ const BoxedView: FC = ({
layout,
page_id,
bind,
+ code_mode,
hover,
active,
hidden,
@@ -79,7 +82,11 @@ const BoxedView: FC = ({
}
if (v.status === "load-code" || v.status === "loading-code") {
- vLoadCode(v);
+ if (!code_mode || code_mode === "new") {
+ newLoadCode(v);
+ } else {
+ oldLoadCode(v);
+ }
if (v.status === "load-code" || v.status === "loading-code") {
return (
<>