From 849885b5b361880f25d877b148b8ac640c45779e Mon Sep 17 00:00:00 2001 From: zahid Date: Wed, 19 Apr 2023 13:11:02 +0600 Subject: [PATCH 1/8] fix: redirect to /dashboard if auth user tries to access /login or /signup --- apps/web/pages/login.tsx | 11 +++++++++++ apps/web/pages/signup.tsx | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/apps/web/pages/login.tsx b/apps/web/pages/login.tsx index ca384369a..6abdd6aaf 100644 --- a/apps/web/pages/login.tsx +++ b/apps/web/pages/login.tsx @@ -1,4 +1,5 @@ import Head from "next/head"; +import { getUserFromToken } from "@documenso/lib/server"; import Login from "../components/login"; export default function LoginPage(props: any) { @@ -13,6 +14,16 @@ export default function LoginPage(props: any) { } export async function getServerSideProps(context: any) { + const user = await getUserFromToken(context.req, context.res); + if (user) + return { + redirect: { + source: "/login", + destination: "/dashboard", + permanent: false, + }, + }; + const ALLOW_SIGNUP = process.env.ALLOW_SIGNUP === "true"; return { diff --git a/apps/web/pages/signup.tsx b/apps/web/pages/signup.tsx index b59fd6e79..689444de9 100644 --- a/apps/web/pages/signup.tsx +++ b/apps/web/pages/signup.tsx @@ -1,5 +1,6 @@ import { NextPageContext } from "next"; import Head from "next/head"; +import { getUserFromToken } from "@documenso/lib/server"; import Signup from "../components/signup"; export default function SignupPage(props: { source: string }) { @@ -22,6 +23,16 @@ export async function getServerSideProps(context: any) { }, }; + const user = await getUserFromToken(context.req, context.res); + if (user) + return { + redirect: { + source: "/signup", + destination: "/dashboard", + permanent: false, + }, + }; + const signupSource: string = context.query["source"]; return { props: { From 81fd9ff7498df8306cf38d186f4ab6f5c253917c Mon Sep 17 00:00:00 2001 From: Mythie Date: Fri, 21 Apr 2023 23:43:54 +1000 Subject: [PATCH 2/8] fix: date field appears for all recipients Updates the signing endpoint to only apply changes to the Date field for the current signer. This is made possible through the addition of the `signedAt` column within the database. Resolves the issue with one signer filling the date for all recipients and also ensures that the date of signing on a document won't always be todays date after each recipient has signed. --- apps/web/pages/api/documents/[id]/sign.ts | 7 ++++++- .../migration.sql | 2 ++ packages/prisma/schema.prisma | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 packages/prisma/migrations/20230421134018_doc_214_add_signed_at_field/migration.sql diff --git a/apps/web/pages/api/documents/[id]/sign.ts b/apps/web/pages/api/documents/[id]/sign.ts index 537d7ee72..853dd3500 100644 --- a/apps/web/pages/api/documents/[id]/sign.ts +++ b/apps/web/pages/api/documents/[id]/sign.ts @@ -63,6 +63,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) { }, data: { signingStatus: SigningStatus.SIGNED, + signedAt: new Date(), }, }); @@ -86,7 +87,11 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) { where: { documentId: document.id, type: { in: [FieldType.DATE, FieldType.TEXT] }, + recipientId: { in: signedRecipients.map((r) => r.id) }, }, + include: { + Recipient: true, + } }); // Insert fields other than signatures @@ -98,7 +103,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) { month: "long", day: "numeric", year: "numeric", - }).format(new Date()) + }).format(field.Recipient?.signedAt ?? new Date()) : field.customText || "", field.positionX, field.positionY, diff --git a/packages/prisma/migrations/20230421134018_doc_214_add_signed_at_field/migration.sql b/packages/prisma/migrations/20230421134018_doc_214_add_signed_at_field/migration.sql new file mode 100644 index 000000000..619e059aa --- /dev/null +++ b/packages/prisma/migrations/20230421134018_doc_214_add_signed_at_field/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Recipient" ADD COLUMN "signedAt" TIMESTAMP(3); diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index e5fa887c3..d326bf5a2 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -92,6 +92,7 @@ model Recipient { name String @default("") @db.VarChar(255) token String expired DateTime? + signedAt DateTime? readStatus ReadStatus @default(NOT_OPENED) signingStatus SigningStatus @default(NOT_SIGNED) sendStatus SendStatus @default(NOT_SENT) From dc6217b14eabe74c073175a622ecb9b23a5b809d Mon Sep 17 00:00:00 2001 From: Subham Ray Date: Mon, 24 Apr 2023 19:16:56 +0530 Subject: [PATCH 3/8] feat(Documents Filter): Keep the URL and UI state in sync when status filter changes --- apps/web/pages/documents.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/web/pages/documents.tsx b/apps/web/pages/documents.tsx index eaad896a5..eea36a846 100644 --- a/apps/web/pages/documents.tsx +++ b/apps/web/pages/documents.tsx @@ -83,6 +83,20 @@ const DocumentsPage: NextPageWithLayout = (props: any) => { return filteredDocuments; } + function handleSetSelectedStatusFilter(status: any) { + router.replace( + { + pathname: router.pathname, + query: { filter: status.value }, + }, + undefined, + { + shallow: true, // Perform a shallow update, without reloading the page + } + ); + setSelectedStatusFilter(status); + } + function wasXDaysAgoOrLess(documentDate: Date, lastXDays: number): boolean { if (lastXDays < 0) return true; @@ -138,7 +152,7 @@ const DocumentsPage: NextPageWithLayout = (props: any) => { label="Status" options={statusFilters} value={selectedStatusFilter} - onChange={setSelectedStatusFilter} + onChange={handleSetSelectedStatusFilter} />