From 8aad89ffd8d440317aee62233a09adae4814b616 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 14:16:19 +0800 Subject: [PATCH 01/11] chore: add readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 09315d6de..e6a000511 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ UNDB is a no-code platform that can also serve as a Backend as a Service (BaaS).
Website | Documentation | - Discord | + Discord | Roadmap
From 5c34f93d68617b874ad4dc2d61ed1a8829448f23 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 14:46:02 +0800 Subject: [PATCH 02/11] feat: redirect to page --- apps/backend/src/modules/auth/auth.ts | 33 ++++++++++++------- .../src/routes/(auth)/login/+page.svelte | 13 ++++++-- .../src/routes/(auth)/signup/+page.svelte | 12 +++++-- .../routes/(authed)/{ => (space)}/+layout.gql | 0 .../(authed)/{ => (space)}/+layout.svelte | 0 .../src/routes/(authed)/(space)/+layout.ts | 15 +++++++++ .../(authed)/{ => (space)}/+page.svelte | 0 .../account/profile/+layout.svelte | 0 .../account/profile/+page.svelte | 0 .../{ => (space)}/account/token/+page.svelte | 0 .../{ => (space)}/bases/[baseId]/+layout.gql | 0 .../bases/[baseId]/+layout.svelte | 0 .../{ => (space)}/bases/[baseId]/+layout.ts | 0 .../{ => (space)}/bases/[baseId]/+page.svelte | 0 .../bases/[baseId]/setting/+layout.svelte | 0 .../bases/[baseId]/setting/+page.svelte | 0 .../{ => (space)}/settings/+layout.gql | 0 .../{ => (space)}/settings/+layout.ts | 0 .../{ => (space)}/settings/+page.svelte | 0 .../{ => (space)}/t/[tableId]/+layout.gql | 0 .../{ => (space)}/t/[tableId]/+layout.svelte | 0 .../{ => (space)}/t/[tableId]/+layout.ts | 0 .../t/[tableId]/[[viewId]]/+layout.svelte | 0 .../t/[tableId]/[[viewId]]/+page.svelte | 0 .../[shareId]/+layout.gql | 0 .../[shareId]/+layout.svelte | 0 .../create-from-template/[shareId]/+layout.ts | 0 .../[shareId]/+page.svelte | 18 ++++++++-- apps/frontend/src/routes/(authed)/+layout.ts | 13 +++----- 29 files changed, 76 insertions(+), 28 deletions(-) rename apps/frontend/src/routes/(authed)/{ => (space)}/+layout.gql (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/+layout.svelte (100%) create mode 100644 apps/frontend/src/routes/(authed)/(space)/+layout.ts rename apps/frontend/src/routes/(authed)/{ => (space)}/+page.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/account/profile/+layout.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/account/profile/+page.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/account/token/+page.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/bases/[baseId]/+layout.gql (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/bases/[baseId]/+layout.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/bases/[baseId]/+layout.ts (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/bases/[baseId]/+page.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/bases/[baseId]/setting/+layout.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/bases/[baseId]/setting/+page.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/settings/+layout.gql (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/settings/+layout.ts (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/settings/+page.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/t/[tableId]/+layout.gql (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/t/[tableId]/+layout.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/t/[tableId]/+layout.ts (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/t/[tableId]/[[viewId]]/+layout.svelte (100%) rename apps/frontend/src/routes/(authed)/{ => (space)}/t/[tableId]/[[viewId]]/+page.svelte (100%) rename apps/frontend/src/routes/{ => (authed)}/(template)/create-from-template/[shareId]/+layout.gql (100%) rename apps/frontend/src/routes/{ => (authed)}/(template)/create-from-template/[shareId]/+layout.svelte (100%) rename apps/frontend/src/routes/{ => (authed)}/(template)/create-from-template/[shareId]/+layout.ts (100%) rename apps/frontend/src/routes/{ => (authed)}/(template)/create-from-template/[shareId]/+page.svelte (95%) diff --git a/apps/backend/src/modules/auth/auth.ts b/apps/backend/src/modules/auth/auth.ts index bdd39c8fb..c8074cb0c 100644 --- a/apps/backend/src/modules/auth/auth.ts +++ b/apps/backend/src/modules/auth/auth.ts @@ -173,21 +173,30 @@ export class Auth { const oauth = container.resolve(OAuth) return new Elysia() .use(oauth.route()) - .get("/api/me", (ctx) => { - const store = executionContext.getStore() - const user = store?.user - if (!user?.userId) { - return ctx.redirect("/login") - } + .get( + "/api/me", + (ctx) => { + const store = executionContext.getStore() + const user = store?.user + const redirect = ctx.query.redirect + if (!user?.userId) { + return ctx.redirect("/login" + (redirect ? `?redirect=${redirect}` : "")) + } - if (env.UNDB_VERIFY_EMAIL && !user.emailVerified && user.email) { - return ctx.redirect(`/verify-email`, 301) - } + if (env.UNDB_VERIFY_EMAIL && !user.emailVerified && user.email) { + return ctx.redirect(`/verify-email`, 301) + } - const member = store?.member + const member = store?.member - return { user: omit(user, ["emailVerified"]), member } - }) + return { user: omit(user, ["emailVerified"]), member } + }, + { + query: t.Object({ + redirect: t.Optional(t.String()), + }), + }, + ) .post( "/api/signup", async (ctx) => { diff --git a/apps/frontend/src/routes/(auth)/login/+page.svelte b/apps/frontend/src/routes/(auth)/login/+page.svelte index 35b676417..4366278cc 100644 --- a/apps/frontend/src/routes/(auth)/login/+page.svelte +++ b/apps/frontend/src/routes/(auth)/login/+page.svelte @@ -30,6 +30,7 @@ let loginError = false $: invitationId = $page.url.searchParams.get("invitationId") + $: redirect = $page.url.searchParams.get("redirect") $: showBanner = !!invitationId @@ -49,7 +50,11 @@ loginError = false }, async onSuccess(data, variables, context) { - await goto("/") + if (redirect) { + await goto(redirect) + } else { + await goto("/") + } }, async onError(error, variables, context) { loginError = true @@ -202,7 +207,11 @@
Don't have an account? - Sign up + {#if redirect} + Sign up + {:else} + Sign up + {/if}
diff --git a/apps/frontend/src/routes/(auth)/signup/+page.svelte b/apps/frontend/src/routes/(auth)/signup/+page.svelte index 1408b8e2a..1f5407d04 100644 --- a/apps/frontend/src/routes/(auth)/signup/+page.svelte +++ b/apps/frontend/src/routes/(auth)/signup/+page.svelte @@ -37,6 +37,7 @@ type SignupSchema = z.infer $: invitationId = $page.url.searchParams.get("invitationId") + $: redirect = $page.url.searchParams.get("redirect") $: showBanner = !!invitationId @@ -60,7 +61,11 @@ signupError = false }, async onSuccess(data, variables, context) { - await goto("/") + if (redirect) { + await goto(redirect) + } else { + await goto("/") + } }, onError(error, variables, context) { signupError = true @@ -238,8 +243,9 @@ Already have an account? {#if invitationId} Sign in - {:else} - Sign in + {:else if redirect} + Sign in + {:else} Sign in {/if}
{#if !invitationId} diff --git a/apps/frontend/src/routes/(authed)/+layout.gql b/apps/frontend/src/routes/(authed)/(space)/+layout.gql similarity index 100% rename from apps/frontend/src/routes/(authed)/+layout.gql rename to apps/frontend/src/routes/(authed)/(space)/+layout.gql diff --git a/apps/frontend/src/routes/(authed)/+layout.svelte b/apps/frontend/src/routes/(authed)/(space)/+layout.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/+layout.svelte rename to apps/frontend/src/routes/(authed)/(space)/+layout.svelte diff --git a/apps/frontend/src/routes/(authed)/(space)/+layout.ts b/apps/frontend/src/routes/(authed)/(space)/+layout.ts new file mode 100644 index 000000000..b7b0b5d04 --- /dev/null +++ b/apps/frontend/src/routes/(authed)/(space)/+layout.ts @@ -0,0 +1,15 @@ +import { GetIndexQueryStore } from "$houdini" +import type { LayoutLoad } from "./$types" + +export const ssr = false + +export const load: LayoutLoad = async (event) => { + event.depends("undb:tables") + + const indexDataStore = new GetIndexQueryStore() + await indexDataStore.fetch({ event, policy: "NetworkOnly" }) + + return { + indexDataStore, + } +} diff --git a/apps/frontend/src/routes/(authed)/+page.svelte b/apps/frontend/src/routes/(authed)/(space)/+page.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/+page.svelte rename to apps/frontend/src/routes/(authed)/(space)/+page.svelte diff --git a/apps/frontend/src/routes/(authed)/account/profile/+layout.svelte b/apps/frontend/src/routes/(authed)/(space)/account/profile/+layout.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/account/profile/+layout.svelte rename to apps/frontend/src/routes/(authed)/(space)/account/profile/+layout.svelte diff --git a/apps/frontend/src/routes/(authed)/account/profile/+page.svelte b/apps/frontend/src/routes/(authed)/(space)/account/profile/+page.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/account/profile/+page.svelte rename to apps/frontend/src/routes/(authed)/(space)/account/profile/+page.svelte diff --git a/apps/frontend/src/routes/(authed)/account/token/+page.svelte b/apps/frontend/src/routes/(authed)/(space)/account/token/+page.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/account/token/+page.svelte rename to apps/frontend/src/routes/(authed)/(space)/account/token/+page.svelte diff --git a/apps/frontend/src/routes/(authed)/bases/[baseId]/+layout.gql b/apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/+layout.gql similarity index 100% rename from apps/frontend/src/routes/(authed)/bases/[baseId]/+layout.gql rename to apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/+layout.gql diff --git a/apps/frontend/src/routes/(authed)/bases/[baseId]/+layout.svelte b/apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/+layout.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/bases/[baseId]/+layout.svelte rename to apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/+layout.svelte diff --git a/apps/frontend/src/routes/(authed)/bases/[baseId]/+layout.ts b/apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/+layout.ts similarity index 100% rename from apps/frontend/src/routes/(authed)/bases/[baseId]/+layout.ts rename to apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/+layout.ts diff --git a/apps/frontend/src/routes/(authed)/bases/[baseId]/+page.svelte b/apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/+page.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/bases/[baseId]/+page.svelte rename to apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/+page.svelte diff --git a/apps/frontend/src/routes/(authed)/bases/[baseId]/setting/+layout.svelte b/apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/setting/+layout.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/bases/[baseId]/setting/+layout.svelte rename to apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/setting/+layout.svelte diff --git a/apps/frontend/src/routes/(authed)/bases/[baseId]/setting/+page.svelte b/apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/setting/+page.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/bases/[baseId]/setting/+page.svelte rename to apps/frontend/src/routes/(authed)/(space)/bases/[baseId]/setting/+page.svelte diff --git a/apps/frontend/src/routes/(authed)/settings/+layout.gql b/apps/frontend/src/routes/(authed)/(space)/settings/+layout.gql similarity index 100% rename from apps/frontend/src/routes/(authed)/settings/+layout.gql rename to apps/frontend/src/routes/(authed)/(space)/settings/+layout.gql diff --git a/apps/frontend/src/routes/(authed)/settings/+layout.ts b/apps/frontend/src/routes/(authed)/(space)/settings/+layout.ts similarity index 100% rename from apps/frontend/src/routes/(authed)/settings/+layout.ts rename to apps/frontend/src/routes/(authed)/(space)/settings/+layout.ts diff --git a/apps/frontend/src/routes/(authed)/settings/+page.svelte b/apps/frontend/src/routes/(authed)/(space)/settings/+page.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/settings/+page.svelte rename to apps/frontend/src/routes/(authed)/(space)/settings/+page.svelte diff --git a/apps/frontend/src/routes/(authed)/t/[tableId]/+layout.gql b/apps/frontend/src/routes/(authed)/(space)/t/[tableId]/+layout.gql similarity index 100% rename from apps/frontend/src/routes/(authed)/t/[tableId]/+layout.gql rename to apps/frontend/src/routes/(authed)/(space)/t/[tableId]/+layout.gql diff --git a/apps/frontend/src/routes/(authed)/t/[tableId]/+layout.svelte b/apps/frontend/src/routes/(authed)/(space)/t/[tableId]/+layout.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/t/[tableId]/+layout.svelte rename to apps/frontend/src/routes/(authed)/(space)/t/[tableId]/+layout.svelte diff --git a/apps/frontend/src/routes/(authed)/t/[tableId]/+layout.ts b/apps/frontend/src/routes/(authed)/(space)/t/[tableId]/+layout.ts similarity index 100% rename from apps/frontend/src/routes/(authed)/t/[tableId]/+layout.ts rename to apps/frontend/src/routes/(authed)/(space)/t/[tableId]/+layout.ts diff --git a/apps/frontend/src/routes/(authed)/t/[tableId]/[[viewId]]/+layout.svelte b/apps/frontend/src/routes/(authed)/(space)/t/[tableId]/[[viewId]]/+layout.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/t/[tableId]/[[viewId]]/+layout.svelte rename to apps/frontend/src/routes/(authed)/(space)/t/[tableId]/[[viewId]]/+layout.svelte diff --git a/apps/frontend/src/routes/(authed)/t/[tableId]/[[viewId]]/+page.svelte b/apps/frontend/src/routes/(authed)/(space)/t/[tableId]/[[viewId]]/+page.svelte similarity index 100% rename from apps/frontend/src/routes/(authed)/t/[tableId]/[[viewId]]/+page.svelte rename to apps/frontend/src/routes/(authed)/(space)/t/[tableId]/[[viewId]]/+page.svelte diff --git a/apps/frontend/src/routes/(template)/create-from-template/[shareId]/+layout.gql b/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+layout.gql similarity index 100% rename from apps/frontend/src/routes/(template)/create-from-template/[shareId]/+layout.gql rename to apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+layout.gql diff --git a/apps/frontend/src/routes/(template)/create-from-template/[shareId]/+layout.svelte b/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+layout.svelte similarity index 100% rename from apps/frontend/src/routes/(template)/create-from-template/[shareId]/+layout.svelte rename to apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+layout.svelte diff --git a/apps/frontend/src/routes/(template)/create-from-template/[shareId]/+layout.ts b/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+layout.ts similarity index 100% rename from apps/frontend/src/routes/(template)/create-from-template/[shareId]/+layout.ts rename to apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+layout.ts diff --git a/apps/frontend/src/routes/(template)/create-from-template/[shareId]/+page.svelte b/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+page.svelte similarity index 95% rename from apps/frontend/src/routes/(template)/create-from-template/[shareId]/+page.svelte rename to apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+page.svelte index f7e4d4a2e..a77477c3a 100644 --- a/apps/frontend/src/routes/(template)/create-from-template/[shareId]/+page.svelte +++ b/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+page.svelte @@ -24,9 +24,21 @@ let { shareId } = $page.params let store = data.store - let spaces = $store.data?.spaces ?? [] - let space = $store.data?.space - let template = $store.data?.template + $: spaces = $store.data?.spaces ?? [] + $: space = $store.data?.space + $: template = $store.data?.template + + $: console.log(spaces, space, template) + $: if (space) { + form.reset({ + data: { + shareId, + targetSpaceId: space.id, + name: template?.name, + includeData: true, + }, + }) + } const createFromTemplateMutation = createMutation({ mutationFn: trpc.base.createFromTemplate.mutate, diff --git a/apps/frontend/src/routes/(authed)/+layout.ts b/apps/frontend/src/routes/(authed)/+layout.ts index 81fd39293..23b3d588f 100644 --- a/apps/frontend/src/routes/(authed)/+layout.ts +++ b/apps/frontend/src/routes/(authed)/+layout.ts @@ -1,22 +1,19 @@ -import { GetIndexQueryStore } from "$houdini" import { redirect } from "@sveltejs/kit" import type { LayoutLoad } from "./$types" export const ssr = false export const load: LayoutLoad = async (event) => { - const me = await event.fetch("/api/me") + const redirectURL = encodeURIComponent(event.url.pathname) + + const search = new URLSearchParams({ redirect: redirectURL }) + + const me = await event.fetch("/api/me?" + search.toString()) if (me.redirected) { throw redirect(301, me.url) } - event.depends("undb:tables") - - const indexDataStore = new GetIndexQueryStore() - await indexDataStore.fetch({ event, policy: "NetworkOnly" }) - return { me: await me.json(), - indexDataStore, } } From fb77c88f39d8d5771c8bba467f5a5680785d487a Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 14:55:56 +0800 Subject: [PATCH 03/11] chore: remove logs --- .../(template)/create-from-template/[shareId]/+page.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+page.svelte b/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+page.svelte index a77477c3a..6a8b0ed27 100644 --- a/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+page.svelte +++ b/apps/frontend/src/routes/(authed)/(template)/create-from-template/[shareId]/+page.svelte @@ -28,7 +28,6 @@ $: space = $store.data?.space $: template = $store.data?.template - $: console.log(spaces, space, template) $: if (space) { form.reset({ data: { From ea13c2c5dc5f965230bd2f3271295acd53baec3b Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 15:19:24 +0800 Subject: [PATCH 04/11] fix: fix create space error --- .../src/lib/components/blocks/space/space-dropdown.svelte | 4 +++- apps/frontend/src/routes/(authed)/(space)/+layout.svelte | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/lib/components/blocks/space/space-dropdown.svelte b/apps/frontend/src/lib/components/blocks/space/space-dropdown.svelte index 987a98d7f..73b07033d 100644 --- a/apps/frontend/src/lib/components/blocks/space/space-dropdown.svelte +++ b/apps/frontend/src/lib/components/blocks/space/space-dropdown.svelte @@ -38,6 +38,7 @@ async onSuccess(data, variables, context) { await fetch(`/api/spaces/${data}/goto`) await goto("/") + createOpen = false await invalidateAll() }, }) @@ -54,6 +55,7 @@ SPA: true, dataType: "json", invalidateAll: false, + validators: zodClient(createSpaceCommand), onSubmit(input) { validateForm() }, @@ -138,7 +140,7 @@ Name - + This is your space name. diff --git a/apps/frontend/src/routes/(authed)/(space)/+layout.svelte b/apps/frontend/src/routes/(authed)/(space)/+layout.svelte index 2b95f72eb..6c1eb9f37 100644 --- a/apps/frontend/src/routes/(authed)/(space)/+layout.svelte +++ b/apps/frontend/src/routes/(authed)/(space)/+layout.svelte @@ -53,7 +53,8 @@ $: role.set(member?.role ?? null) - $: if (tables && tables?.length !== 0 && !$page.params.tableId && $page.route.id === "/(authed)") { + $: console.log(tables, $page.params.tableId, $page.route.id) + $: if (tables && tables?.length !== 0 && !$page.params.tableId && $page.route.id === "/(authed)/(space)") { goto(`/t/${tables[0]?.id}`, { replaceState: true }) } $: if (!tables.length && bases.length) { From 83886b364f797736ad8a55b12517858aec57d77e Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 15:21:00 +0800 Subject: [PATCH 05/11] fix: fix setting active --- apps/frontend/src/lib/components/blocks/nav/nav-tools.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/lib/components/blocks/nav/nav-tools.svelte b/apps/frontend/src/lib/components/blocks/nav/nav-tools.svelte index 1cf442cf3..b037f7fe9 100644 --- a/apps/frontend/src/lib/components/blocks/nav/nav-tools.svelte +++ b/apps/frontend/src/lib/components/blocks/nav/nav-tools.svelte @@ -40,7 +40,7 @@ From 11ef765b3aa778880cbedb56358b0ac8351b487b Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 15:21:35 +0800 Subject: [PATCH 06/11] chore: remove logs --- apps/frontend/src/routes/(authed)/(space)/+layout.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/frontend/src/routes/(authed)/(space)/+layout.svelte b/apps/frontend/src/routes/(authed)/(space)/+layout.svelte index 6c1eb9f37..984fd6234 100644 --- a/apps/frontend/src/routes/(authed)/(space)/+layout.svelte +++ b/apps/frontend/src/routes/(authed)/(space)/+layout.svelte @@ -53,7 +53,6 @@ $: role.set(member?.role ?? null) - $: console.log(tables, $page.params.tableId, $page.route.id) $: if (tables && tables?.length !== 0 && !$page.params.tableId && $page.route.id === "/(authed)/(space)") { goto(`/t/${tables[0]?.id}`, { replaceState: true }) } From c613ccd6b123433fd37a38a967ebce7d52b44110 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 15:41:56 +0800 Subject: [PATCH 07/11] fix: fix share view params --- apps/backend/package.json | 4 ++-- apps/frontend/package.json | 4 ++-- .../t/[tableId]/[[viewId]]/+page.svelte | 4 ++-- bun.lockb | Bin 606408 -> 607080 bytes package.json | 2 +- packages/persistence/package.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/backend/package.json b/apps/backend/package.json index 60a86e78a..21a2638fa 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -8,8 +8,8 @@ "build:docker": "bun build --compile src/index.ts --target=bun --packages=external --sourcemap --outfile undb" }, "dependencies": { - "@aws-sdk/client-s3": "^3.635.0", - "@aws-sdk/s3-request-presigner": "^3.635.0", + "@aws-sdk/client-s3": "^3.637.0", + "@aws-sdk/s3-request-presigner": "^3.637.0", "@elysiajs/cors": "^1.1.0", "@elysiajs/cron": "^1.1.0", "@elysiajs/html": "^1.1.0", diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 9aae07c3a..2e00d9b7a 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -21,7 +21,7 @@ "@svelte-put/shortcut": "^3.1.1", "@sveltejs/adapter-static": "^3.0.4", "@sveltejs/kit": "^2.5.24", - "@sveltejs/vite-plugin-svelte": "^3.1.1", + "@sveltejs/vite-plugin-svelte": "^3.1.2", "@tanstack/eslint-plugin-query": "^5.52.0", "@types/eslint": "^8.56.11", "@types/lodash.unzip": "^3.4.9", @@ -56,7 +56,7 @@ "rollup-plugin-visualizer": "^5.12.0", "safe-flat": "^2.1.0", "svelte": "^4.2.18", - "svelte-check": "^3.8.5", + "svelte-check": "^3.8.6", "svelte-headless-table": "^0.18.2", "svelte-jsoneditor": "^0.23.8", "svelte-persisted-store": "^0.11.0", diff --git a/apps/frontend/src/routes/(share)/s/b/[shareId]/t/[tableId]/[[viewId]]/+page.svelte b/apps/frontend/src/routes/(share)/s/b/[shareId]/t/[tableId]/[[viewId]]/+page.svelte index 064e4cf18..9cb8a01d9 100644 --- a/apps/frontend/src/routes/(share)/s/b/[shareId]/t/[tableId]/[[viewId]]/+page.svelte +++ b/apps/frontend/src/routes/(share)/s/b/[shareId]/t/[tableId]/[[viewId]]/+page.svelte @@ -8,7 +8,7 @@ import { createQuery } from "@tanstack/svelte-query" import { Records, type IRecordsDTO } from "@undb/table" import { onMount, type ComponentType } from "svelte" - import { derived, writable, } from "svelte/store" + import { derived, writable } from "svelte/store" import { queryParam } from "sveltekit-search-params" let RecordDetailSheet: ComponentType @@ -31,7 +31,7 @@ queryFn: () => trpc.shareData.records.query({ shareId: $page.params.shareId, - tableId: $page.params.tableId, + tableId: $table.id.value, viewId: $viewId, q: $q, }), diff --git a/bun.lockb b/bun.lockb index 3220401568a83c2ce0cb1d5695bdb70b893d3791..36a28096155c420ef8e1677c8a3c1bbed9964391 100755 GIT binary patch delta 89734 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%0A`MLi-$CKF%Ly%U^KvzoWQ3Y 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

wyDf>hoz2o?Jk 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 z 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 diff --git a/package.json b/package.json index d83cd6b39..0becfa00c 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "prepare": "husky || echo 1" }, "devDependencies": { - "drizzle-kit": "^0.24.0", + "drizzle-kit": "^0.24.1", "husky": "^9.1.5", "lint-staged": "^15.2.9", "npm-run-all2": "^6.2.2", diff --git a/packages/persistence/package.json b/packages/persistence/package.json index b14634a68..24a13b744 100644 --- a/packages/persistence/package.json +++ b/packages/persistence/package.json @@ -5,7 +5,7 @@ "type": "module", "devDependencies": { "@types/bun": "latest", - "drizzle-kit": "^0.24.0" + "drizzle-kit": "^0.24.1" }, "peerDependencies": { "typescript": "^5.0.0" From 2ea202dcef6c9f47ab9b872661039f0814d34c94 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 16:21:15 +0800 Subject: [PATCH 08/11] fix: fix bug --- .../blocks/grid-view/editable-cell/reference-cell.svelte | 3 +++ .../blocks/reference/foreign-records-picker-dropdown.svelte | 1 - packages/persistence/src/abstract-qb.visitor.ts | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/lib/components/blocks/grid-view/editable-cell/reference-cell.svelte b/apps/frontend/src/lib/components/blocks/grid-view/editable-cell/reference-cell.svelte index 20c287b3d..fc0f377e2 100644 --- a/apps/frontend/src/lib/components/blocks/grid-view/editable-cell/reference-cell.svelte +++ b/apps/frontend/src/lib/components/blocks/grid-view/editable-cell/reference-cell.svelte @@ -16,6 +16,9 @@ $: selected = writable(value) let hasValue = Array.isArray(value) && value.length > 0 + + $: selected, (hasValue = Array.isArray(value) && value.length > 0) + $: hasValueReactive = Array.isArray($selected) && $selected.length > 0 $: if (hasValue && !hasValueReactive) { hasValue = hasValueReactive diff --git a/apps/frontend/src/lib/components/blocks/reference/foreign-records-picker-dropdown.svelte b/apps/frontend/src/lib/components/blocks/reference/foreign-records-picker-dropdown.svelte index 432d2544c..15e717693 100644 --- a/apps/frontend/src/lib/components/blocks/reference/foreign-records-picker-dropdown.svelte +++ b/apps/frontend/src/lib/components/blocks/reference/foreign-records-picker-dropdown.svelte @@ -5,7 +5,6 @@ import { readable, writable } from "svelte/store" import { ReferenceField, TableCreator } from "@undb/table" import Button from "$lib/components/ui/button/button.svelte" - import { Skeleton } from "$lib/components/ui/skeleton" import { LoaderCircleIcon } from "lucide-svelte" export let isSelected = false diff --git a/packages/persistence/src/abstract-qb.visitor.ts b/packages/persistence/src/abstract-qb.visitor.ts index d59e5e159..76d557615 100644 --- a/packages/persistence/src/abstract-qb.visitor.ts +++ b/packages/persistence/src/abstract-qb.visitor.ts @@ -75,6 +75,7 @@ export abstract class AbstractQBVisitor implements IAbastractQBVisitor, ISpec spec.accept(v) v.setIsNot(false) + this.addCond(v.cond) return this } From 88cb482e7acb8a78bcb68ceb974363836f8d52b1 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 17:26:56 +0800 Subject: [PATCH 09/11] feat: date op is empty --- .../record/record-query-spec-creator-visitor.ts | 2 ++ .../src/record/record-spec-reference-visitor.ts | 2 ++ .../src/record/record.filter-visitor.ts | 5 +++++ .../src/record/record.mutate-visitor.ts | 4 ++++ .../abstract-date-field.condition.ts | 6 ++++++ .../abstract-date-value.specification.ts | 16 +++++++++++++++- .../date-field/date-field-value.visitor.ts | 2 ++ .../string-field-value.specification.ts | 10 +++++----- 8 files changed, 41 insertions(+), 6 deletions(-) diff --git a/packages/persistence/src/record/record-query-spec-creator-visitor.ts b/packages/persistence/src/record/record-query-spec-creator-visitor.ts index 7e75a20b7..722e65285 100644 --- a/packages/persistence/src/record/record-query-spec-creator-visitor.ts +++ b/packages/persistence/src/record/record-query-spec-creator-visitor.ts @@ -1,4 +1,5 @@ import { + DateIsEmpty, ID_TYPE, JsonContains, LongTextEqual, @@ -106,6 +107,7 @@ export class RecordQuerySpecCreatorVisitor implements IRecordVisitor { urlEqual(s: UrlEqual): void {} attachmentEqual(s: AttachmentEqual): void {} attachmentEmpty(s: AttachmentEmpty): void {} + dateIsEmpty(spec: DateIsEmpty): void {} dateEqual(spec: DateEqual): void {} jsonEqual(spec: JsonEqual): void {} jsonContains(spec: JsonContains): void {} diff --git a/packages/persistence/src/record/record-spec-reference-visitor.ts b/packages/persistence/src/record/record-spec-reference-visitor.ts index 37d169620..668b1c200 100644 --- a/packages/persistence/src/record/record-spec-reference-visitor.ts +++ b/packages/persistence/src/record/record-spec-reference-visitor.ts @@ -6,6 +6,7 @@ import { DateEqual, DateIsAfter, DateIsBefore, + DateIsEmpty, DateIsSameDay, DateIsToday, DateIsTomorrow, @@ -75,6 +76,7 @@ export class RecordSpecReferenceVisitor implements IRecordVisitor { dateIsYesterday(spec: DateIsTomorrow): void {} dateIsBefore(spec: DateIsBefore): void {} dateIsAfter(spec: DateIsAfter): void {} + dateIsEmpty(spec: DateIsEmpty): void {} userEqual(spec: UserEqual): void userEqual(spec: UserEqual): void {} userEmpty(spec: UserEmpty): void diff --git a/packages/persistence/src/record/record.filter-visitor.ts b/packages/persistence/src/record/record.filter-visitor.ts index 8dbdde899..92aaf05d6 100644 --- a/packages/persistence/src/record/record.filter-visitor.ts +++ b/packages/persistence/src/record/record.filter-visitor.ts @@ -1,5 +1,6 @@ import { NotImplementException } from "@undb/domain" import { + DateIsEmpty, JsonContains, LongTextEqual, SelectField, @@ -90,6 +91,10 @@ export class RecordFilterVisitor extends AbstractQBVisitor implements jsonEmpty(spec: JsonEmpty): void { this.addCond(this.eb.eb(this.getFieldId(spec), "is", null)) } + dateIsEmpty(spec: DateIsEmpty): void { + const cond = this.eb.eb(this.getFieldId(spec), "is", null) + this.addCond(cond) + } dateEqual(spec: DateEqual): void { this.addCond(this.eb.eb(this.getFieldId(spec), "=", spec.date?.toISOString() ?? null)) } diff --git a/packages/persistence/src/record/record.mutate-visitor.ts b/packages/persistence/src/record/record.mutate-visitor.ts index 2082106ff..35cc61a37 100644 --- a/packages/persistence/src/record/record.mutate-visitor.ts +++ b/packages/persistence/src/record/record.mutate-visitor.ts @@ -1,6 +1,7 @@ import { getCurrentUserId, mustGetCurrentSpaceId } from "@undb/context/server" import type { ISpecification, ISpecVisitor } from "@undb/domain" import { + DateIsEmpty, ID_TYPE, JsonContains, LongTextEqual, @@ -81,6 +82,9 @@ export class RecordMutateVisitor extends AbstractQBMutationVisitor implements IR jsonEmpty(spec: JsonEmpty): void { this.setData(spec.fieldId.value, null) } + dateIsEmpty(spec: DateIsEmpty): void { + this.setData(spec.fieldId.value, null) + } dateEqual(spec: DateEqual): void { this.setData(spec.fieldId.value, spec.date?.getTime() ?? null) } diff --git a/packages/table/src/modules/schema/fields/variants/abstractions/abstract-date-field.condition.ts b/packages/table/src/modules/schema/fields/variants/abstractions/abstract-date-field.condition.ts index 1e2bab1a3..9893f7534 100644 --- a/packages/table/src/modules/schema/fields/variants/abstractions/abstract-date-field.condition.ts +++ b/packages/table/src/modules/schema/fields/variants/abstractions/abstract-date-field.condition.ts @@ -11,6 +11,7 @@ import type { FieldId } from "../../field-id.vo" import { DateIsAfter, DateIsBefore, + DateIsEmpty, DateIsSameDay, DateIsToday, DateIsTomorrow, @@ -54,6 +55,9 @@ export function createAbstractDateFieldCondition( z.object({ op: z.literal("is_not_before"), value: dateValue }).merge(base), z.object({ op: z.literal("is_after"), value: dateValue }).merge(base), z.object({ op: z.literal("is_not_after"), value: dateValue }).merge(base), + + z.object({ op: z.literal("is_empty"), value: z.undefined() }).merge(base), + z.object({ op: z.literal("is_not_empty"), value: z.undefined() }).merge(base), ]) } @@ -80,3 +84,5 @@ export const createAbstractDateConditionMather = ( .with({ op: "is_after_tomorrow" }, () => new DateIsAfter(endOfTomorrow(), fieldId)) .with({ op: "is_after_yesterday" }, () => new DateIsAfter(endOfYesterday(), fieldId)) .with({ op: "is_not_after" }, ({ value }) => new DateIsAfter(new Date(value), fieldId).not()) + .with({ op: "is_empty" }, () => new DateIsEmpty(fieldId)) + .with({ op: "is_not_empty" }, () => new DateIsEmpty(fieldId).not()) diff --git a/packages/table/src/modules/schema/fields/variants/abstractions/abstract-date-value.specification.ts b/packages/table/src/modules/schema/fields/variants/abstractions/abstract-date-value.specification.ts index a1d205a0e..d27e5ea55 100644 --- a/packages/table/src/modules/schema/fields/variants/abstractions/abstract-date-value.specification.ts +++ b/packages/table/src/modules/schema/fields/variants/abstractions/abstract-date-value.specification.ts @@ -4,7 +4,7 @@ import { isToday } from "date-fns/isToday" import type { IRecordVisitor, RecordDO } from "../../../../records" import { RecordComositeSpecification } from "../../../../records/record/record.composite-specification" import type { FieldId } from "../../field-id.vo" -import { startOfToday } from "date-fns/startOfToday" +import { DateFieldValue } from "../date-field" export class DateIsSameDay extends RecordComositeSpecification { constructor( @@ -120,3 +120,17 @@ export class DateIsAfter extends RecordComositeSpecification { return Ok(undefined) } } + +export class DateIsEmpty extends RecordComositeSpecification { + isSatisfiedBy(t: RecordDO): boolean { + throw new Error("Method not implemented.") + } + mutate(t: RecordDO): Result { + t.values.setValue(this.fieldId, new DateFieldValue(null)) + return Ok(t) + } + accept(v: IRecordVisitor): Result { + v.dateIsEmpty(this) + return Ok(undefined) + } +} diff --git a/packages/table/src/modules/schema/fields/variants/date-field/date-field-value.visitor.ts b/packages/table/src/modules/schema/fields/variants/date-field/date-field-value.visitor.ts index af3c05c6e..ac9a2f7fc 100644 --- a/packages/table/src/modules/schema/fields/variants/date-field/date-field-value.visitor.ts +++ b/packages/table/src/modules/schema/fields/variants/date-field/date-field-value.visitor.ts @@ -1,6 +1,8 @@ +import type { DateIsEmpty } from "../abstractions/abstract-date-value.specification" import type { IAbstractDateFieldValueVisitor } from "../abstractions/abstract-date-value.visitor" import type { DateEqual } from "./date-field.specification" export interface IDateFieldValueVisitor extends IAbstractDateFieldValueVisitor { dateEqual(spec: DateEqual): void + dateIsEmpty(spec: DateIsEmpty): void } diff --git a/packages/table/src/modules/schema/fields/variants/string-field/string-field-value.specification.ts b/packages/table/src/modules/schema/fields/variants/string-field/string-field-value.specification.ts index d02662ba9..001467fdb 100644 --- a/packages/table/src/modules/schema/fields/variants/string-field/string-field-value.specification.ts +++ b/packages/table/src/modules/schema/fields/variants/string-field/string-field-value.specification.ts @@ -34,7 +34,7 @@ export class StringContains extends RecordComositeSpecification { } isSatisfiedBy(t: RecordDO): boolean { const value = t.getValue(this.fieldId) - return value.mapOr(false, (v) => v instanceof StringFieldValue && v.value.includes(this.value)) + return value.mapOr(false, (v) => v instanceof StringFieldValue && !!v.value?.includes(this.value)) } mutate(t: RecordDO): Result { throw new Error("Method not implemented.") @@ -54,7 +54,7 @@ export class StringStartsWith extends RecordComositeSpecification { } isSatisfiedBy(t: RecordDO): boolean { const value = t.getValue(this.fieldId) - return value.mapOr(false, (v) => v instanceof StringFieldValue && v.value.startsWith(this.value)) + return value.mapOr(false, (v) => v instanceof StringFieldValue && !!v.value?.startsWith(this.value)) } mutate(t: RecordDO): Result { throw new Error("Method not implemented.") @@ -74,7 +74,7 @@ export class StringEndsWith extends RecordComositeSpecification { } isSatisfiedBy(t: RecordDO): boolean { const value = t.getValue(this.fieldId) - return value.mapOr(false, (v) => v instanceof StringFieldValue && v.value.endsWith(this.value)) + return value.mapOr(false, (v) => v instanceof StringFieldValue && !!v.value?.endsWith(this.value)) } mutate(t: RecordDO): Result { throw new Error("Method not implemented.") @@ -111,7 +111,7 @@ export class StringMin extends RecordComositeSpecification { } isSatisfiedBy(t: RecordDO): boolean { const value = t.getValue(this.fieldId) - return value.mapOr(false, (v) => v instanceof StringFieldValue && v.value.length >= this.min) + return value.mapOr(false, (v) => v instanceof StringFieldValue && (v.value?.length ?? 0) >= this.min) } mutate(t: RecordDO): Result { throw new Error("Method not implemented.") @@ -131,7 +131,7 @@ export class StringMax extends RecordComositeSpecification { } isSatisfiedBy(t: RecordDO): boolean { const value = t.getValue(this.fieldId) - return value.mapOr(false, (v) => v instanceof StringFieldValue && v.value.length <= this.max) + return value.mapOr(false, (v) => v instanceof StringFieldValue && (v.value?.length ?? 0) <= this.max) } mutate(t: RecordDO): Result { throw new Error("Method not implemented.") From a3aff5ac7d9f0f2782255baab7f90987ec76c127 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Fri, 23 Aug 2024 17:30:04 +0800 Subject: [PATCH 10/11] fix: fix date filter --- .../src/record/record.filter-visitor.ts | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/packages/persistence/src/record/record.filter-visitor.ts b/packages/persistence/src/record/record.filter-visitor.ts index 92aaf05d6..77edd6580 100644 --- a/packages/persistence/src/record/record.filter-visitor.ts +++ b/packages/persistence/src/record/record.filter-visitor.ts @@ -96,7 +96,7 @@ export class RecordFilterVisitor extends AbstractQBVisitor implements this.addCond(cond) } dateEqual(spec: DateEqual): void { - this.addCond(this.eb.eb(this.getFieldId(spec), "=", spec.date?.toISOString() ?? null)) + this.addCond(this.eb.eb(this.getFieldId(spec), "=", spec.date?.getTime() ?? null)) } attachmentEqual(s: AttachmentEqual): void { throw new Error("Method not implemented.") @@ -137,35 +137,27 @@ export class RecordFilterVisitor extends AbstractQBVisitor implements this.addCond(cond) } dateIsBefore(spec: DateIsBefore): void { - const cond = this.eb.eb(this.getFieldId(spec), "<", startOfDay(spec.date).toISOString()) + const cond = this.eb.eb(this.getFieldId(spec), "<", startOfDay(spec.date).getTime()) this.addCond(cond) } dateIsAfter(spec: DateIsAfter): void { - const cond = this.eb.eb(this.getFieldId(spec), ">", endOfDay(spec.date).toISOString()) + const cond = this.eb.eb(this.getFieldId(spec), ">", endOfDay(spec.date).getTime()) this.addCond(cond) } dateIsTomorrow(spec: DateIsTomorrow): void { - const cond = this.eb.between(this.getFieldId(spec), startOfTomorrow().toISOString(), endOfTomorrow().toISOString()) + const cond = this.eb.between(this.getFieldId(spec), startOfTomorrow().getTime(), endOfTomorrow().getTime()) this.addCond(cond) } dateIsYesterday(spec: DateIsTomorrow): void { - const cond = this.eb.between( - this.getFieldId(spec), - startOfYesterday().toISOString(), - endOfYesterday().toISOString(), - ) + const cond = this.eb.between(this.getFieldId(spec), startOfYesterday().getTime(), endOfYesterday().getTime()) this.addCond(cond) } dateIsToday(spec: DateIsToday): void { - const cond = this.eb.between(this.getFieldId(spec), startOfToday().toISOString(), endOfToday().toISOString()) + const cond = this.eb.between(this.getFieldId(spec), startOfToday().getTime(), endOfToday().getTime()) this.addCond(cond) } dateIsSameDate(spec: DateIsSameDay): void { - const cond = this.eb.between( - this.getFieldId(spec), - startOfDay(spec.date).toISOString(), - endOfDay(spec.date).toISOString(), - ) + const cond = this.eb.between(this.getFieldId(spec), startOfDay(spec.date).getTime(), endOfDay(spec.date).getTime()) this.addCond(cond) } idEqual(spec: IdEqual): void { From 125571cc857ce94b00f6387477399f8eeeec21f7 Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Fri, 23 Aug 2024 09:30:51 +0000 Subject: [PATCH 11/11] Prepare release v1.0.0-40 --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2e46b444..ce237e1d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ # Changelog +## v1.0.0-40 + + +### 🩹 Fixes + +- Fix date filter ([a3aff5a](https://github.com/undb-io/undb/commit/a3aff5a)) + +### ❤️ Contributors + +- Nichenqin ([@nichenqin](http://github.com/nichenqin)) + ## v1.0.0-39 diff --git a/package.json b/package.json index 17822206e..1d975c496 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "undb", - "version": "1.0.0-39", + "version": "1.0.0-40", "private": true, "scripts": { "build": "NODE_ENV=production bun --bun turbo build",