From 286be55e1d1910b119820147fdc5f0ca7ffecaf5 Mon Sep 17 00:00:00 2001 From: Rizky Date: Wed, 25 Oct 2023 15:54:47 +0700 Subject: [PATCH] fix site --- app/srv/ws/sync/actions/site_group.ts | 3 + app/web/package.json | 1 + app/web/src/render/ed/logic/ed-route.ts | 13 +- app/web/src/render/ed/logic/ed-sync.tsx | 17 ++ .../src/render/ed/panel/popup/site-user.tsx | 165 ++++++++++++++++-- app/web/src/render/ed/panel/popup/site.tsx | 80 +++++++-- bun.lockb | Bin 293080 -> 305416 bytes 7 files changed, 246 insertions(+), 33 deletions(-) diff --git a/app/srv/ws/sync/actions/site_group.ts b/app/srv/ws/sync/actions/site_group.ts index c195ade4..1c2f5f79 100644 --- a/app/srv/ws/sync/actions/site_group.ts +++ b/app/srv/ws/sync/actions/site_group.ts @@ -15,6 +15,9 @@ export const site_group = async function (this: SyncConnection) { name: true, domain: true, }, + where: { + is_deleted: false, + }, }, }, }); diff --git a/app/web/package.json b/app/web/package.json index 8d23d7f0..9170137d 100644 --- a/app/web/package.json +++ b/app/web/package.json @@ -52,6 +52,7 @@ "react-dnd": "^16.0.1", "react-dom": "18.2.0", "react-is": "^18.2.0", + "react-select": "^5.7.7", "react-use-error-boundary": "^3.0.0", "react-virtuoso": "^4.6.2", "safe-stable-stringify": "^2.4.3", diff --git a/app/web/src/render/ed/logic/ed-route.ts b/app/web/src/render/ed/logic/ed-route.ts index 023dedfd..9df21c44 100644 --- a/app/web/src/render/ed/logic/ed-route.ts +++ b/app/web/src/render/ed/logic/ed-route.ts @@ -21,9 +21,16 @@ export const edRoute = async (p: PG) => { !p.page.cur.snapshot || !p.page.list[p.page.cur.id] ) { - if (p.page.cur.snapshot && p.page.list[p.page.cur.id]) { - console.log("loading page from cache"); - } else { + let loadFromServer = true; + if (p.page.list[params.page_id]) { + const cur = p.page.list[params.page_id]; + p.page.cur = cur.page; + p.page.doc = cur.doc; + loadFromServer = false; + treeRebuild(p); + } + + if (loadFromServer) { p.status = "loading"; const page = await p.sync.page.load(params.page_id); diff --git a/app/web/src/render/ed/logic/ed-sync.tsx b/app/web/src/render/ed/logic/ed-sync.tsx index 4988f6d5..b6df6bb6 100644 --- a/app/web/src/render/ed/logic/ed-sync.tsx +++ b/app/web/src/render/ed/logic/ed-sync.tsx @@ -17,6 +17,23 @@ export const edInitSync = (p: PG) => { p.user.id = session.data.user.id; p.user.username = session.data.user.username; + if (p.sync) { + if (!params.page_id && params.site_id) { + db.page + .findFirst({ + where: { + is_deleted: false, + is_default_layout: false, + id_site: params.site_id, + }, + select: { id: true }, + }) + .then((e) => { + if (e) navigate(`/ed/${params.site_id}/${e.id}`); + }); + return false; + } + } if (!p.sync) { clientStartSync({ user_id: session.data.user.id, diff --git a/app/web/src/render/ed/panel/popup/site-user.tsx b/app/web/src/render/ed/panel/popup/site-user.tsx index 4e36e163..9778e982 100644 --- a/app/web/src/render/ed/panel/popup/site-user.tsx +++ b/app/web/src/render/ed/panel/popup/site-user.tsx @@ -1,20 +1,161 @@ +import { ReactNode } from "react"; import { Popover } from "../../../../utils/ui/popover"; +import { Placement } from "@floating-ui/react"; +import Select from "react-select"; +import { useLocal } from "web-utils"; + +const user = { + loading: null as null | Promise, + all: [] as { id: string; username: string }[], +}; +export const EdPopUser = ({ + users, + children, + placement = "right", + onDel, + onAdd, +}: { + users: { id: string; username: string }[]; + children: ReactNode; + placement?: Placement; + onAdd?: (u: { id: string; username: string }) => void | Promise; + onDel?: (u: { id: string; username: string }) => void | Promise; +}) => { + const local = useLocal( + { + menuOpen: false, + index: {} as Record, + }, + async () => { + if (!user.loading) { + user.loading = new Promise(async (done) => { + const res = await db.user.findMany({ + select: { + id: true, + username: true, + }, + }); + if (res) { + user.all = res; + } + local.render(); + done(); + }); + } else { + await user.loading; + local.render(); + } + } + ); + + local.index = {}; + if (users) { + for (const r of users) { + local.index[r.id] = r; + } + } -export const EdPopUser = (users: { id: string; username: string }[]) => { return ( - -
-
- {users.map((user) => ( -
-
- -
-
{user.username}
+ +
+
Existing user:
+
+ {users.map((user) => ( +
+
{user.username}
+ {onDel && ( +
{ + onDel(user); + }} + dangerouslySetInnerHTML={{ + __html: ``, + }} + >
+ )} +
+ ))}
- ))} + {user.all.length > 0 && onAdd && ( +