diff --git a/apps/web/pages/dashboard.tsx b/apps/web/pages/dashboard.tsx
index 63ad4068b..0af0942f9 100644
--- a/apps/web/pages/dashboard.tsx
+++ b/apps/web/pages/dashboard.tsx
@@ -30,19 +30,19 @@ const DashboardPage: NextPageWithLayout = (props: any) => {
name: "Draft",
stat: "0",
icon: DocumentIcon,
- link: "/documents?filter=draft",
+ link: "/documents?filter=DRAFT",
},
{
name: "Waiting for others",
stat: "0",
icon: UsersIcon,
- link: "/documents?filter=waiting_for_others",
+ link: "/documents?filter=PENDING",
},
{
name: "Completed",
stat: "0",
icon: CheckBadgeIcon,
- link: "/documents?filter=completed",
+ link: "/documents?filter=COMPLETED",
},
];
diff --git a/apps/web/pages/documents.tsx b/apps/web/pages/documents.tsx
index 91fc7e153..e665c8eb7 100644
--- a/apps/web/pages/documents.tsx
+++ b/apps/web/pages/documents.tsx
@@ -16,13 +16,33 @@ import { useRouter } from "next/router";
import { uploadDocument } from "@documenso/features";
import { DocumentStatus } from "@prisma/client";
import { Tooltip as ReactTooltip } from "react-tooltip";
-import { Button, IconButton } from "@documenso/ui";
-import Filter from "../components/filter";
+import { Button, IconButton, SelectBox } from "@documenso/ui";
+import { NextPageContext } from "next";
const DocumentsPage: NextPageWithLayout = (props: any) => {
const router = useRouter();
const [documents, setDocuments]: any[] = useState([]);
const [loading, setLoading] = useState(true);
+ const statusFilters = [
+ { label: "All", value: "ALL" },
+ { label: "Draft", value: "DRAFT" },
+ { label: "Pending", value: "PENDING" },
+ { label: "Completed", value: "COMPLETED" },
+ ];
+ const createdFilter = [
+ { label: "All Time", value: 0 },
+ { label: "Last 7 days", value: 7 },
+ { label: "Last 30 days", value: 30 },
+ { label: "Last 3 months", value: 90 },
+ { label: "Last 12 months", value: 66 },
+ ];
+
+ const [selectedStatusFilter, setSelectedStatusFilter] = useState(
+ statusFilters[0]
+ );
+ const [selectedCreatedFilter, setSelectedCreatedFilter] = useState(
+ createdFilter[0]
+ );
const getDocuments = async () => {
if (!documents.length) setLoading(true);
@@ -39,13 +59,46 @@ const DocumentsPage: NextPageWithLayout = (props: any) => {
};
useEffect(() => {
- getDocuments();
+ getDocuments().finally(() => {
+ setSelectedStatusFilter(
+ statusFilters.filter(
+ (status) => status.value === props.filter.toUpperCase()
+ )[0]
+ );
+ });
}, []);
function showDocument(documentId: number) {
router.push(`/documents/${documentId}/recipients`);
}
+ function filterDocumentes(documents: []): any {
+ let filteredDocuments = documents.filter(
+ (d: any) =>
+ d.status === selectedStatusFilter.value ||
+ selectedStatusFilter.value === "ALL"
+ );
+
+ filteredDocuments = filteredDocuments.filter((document: any) =>
+ wasXDaysAgoOrLess(new Date(document.created), selectedCreatedFilter.value)
+ );
+
+ return filteredDocuments;
+ }
+
+ function wasXDaysAgoOrLess(documentDate: Date, lastXDays: number): boolean {
+ const millisecondsInDay = 24 * 60 * 60 * 1000; // Number of milliseconds in a day
+ const today: Date = new Date(); // Today's date
+
+ // Calculate the difference between the two dates in days
+ const diffInDays = Math.floor(
+ (today.getTime() - documentDate.getTime()) / millisecondsInDay
+ );
+
+ // Check if the difference is letss or equal to lastXDays
+ return diffInDays <= lastXDays;
+ }
+
return (
<>
@@ -71,7 +124,28 @@ const DocumentsPage: NextPageWithLayout = (props: any) => {
-
+
+
+ {filterDocumentes(documents).length > 1
+ ? filterDocumentes(documents).length + " Documents"
+ : "1 Document"}
+
+
+
+
+
@@ -88,9 +162,8 @@ const DocumentsPage: NextPageWithLayout = (props: any) => {
-
{
- {documents.map((document: any, index: number) => (
- showDocument(document.id)}
- >
- |
- {document.title || "#" + document.id}
- |
-
- {document.Recipient.map((item: any) => (
-
- {item.sendStatus === "NOT_SENT" ? (
-
- {item.name
- ? item.name + " <" + item.email + ">"
- : item.email}
-
- ) : (
- ""
- )}
- {item.sendStatus === "SENT" &&
- item.readStatus !== "OPENED" ? (
-
+ {filterDocumentes(documents).map(
+ (document: any, index: number) => (
+ showDocument(document.id)}
+ >
+ |
+ {document.title || "#" + document.id}
+ |
+
+ {document.Recipient.map((item: any) => (
+
+ {item.sendStatus === "NOT_SENT" ? (
-
{item.name
? item.name + " <" + item.email + ">"
: item.email}
-
- ) : (
- ""
- )}
- {item.readStatus === "OPENED" &&
- item.signingStatus === "NOT_SIGNED" ? (
-
-
-
-
- {item.name
- ? item.name + " <" + item.email + ">"
- : item.email}
+ ) : (
+ ""
+ )}
+ {item.sendStatus === "SENT" &&
+ item.readStatus !== "OPENED" ? (
+
+
+
+ {item.name
+ ? item.name + " <" + item.email + ">"
+ : item.email}
+
-
- ) : (
- ""
- )}
- {item.signingStatus === "SIGNED" ? (
-
-
- {" "}
- {item.email}
+ ) : (
+ ""
+ )}
+ {item.readStatus === "OPENED" &&
+ item.signingStatus === "NOT_SIGNED" ? (
+
+
+
+
+ {item.name
+ ? item.name + " <" + item.email + ">"
+ : item.email}
+
-
- ) : (
- ""
- )}
-
- ))}
- {document.Recipient.length === 0 ? "-" : null}
-
-
-
- |
-
- {formatDocumentStatus(document.status)}
-
-
- {document.Recipient.filter(
- (r: any) => r.signingStatus === "SIGNED"
- ).length || 0}
- /{document.Recipient.length || 0}
-
-
- |
-
-
- {
- event.preventDefault();
- event.stopPropagation();
- router.push("/documents/" + document.id);
- }}
- >
- Edit
-
- {
- event.preventDefault();
- event.stopPropagation();
- router.push("/api/documents/" + document.id);
- }}
- >
- Download
-
- {
- event.preventDefault();
- event.stopPropagation();
- if (
- confirm(
- "Are you sure you want to delete this document"
- )
- ) {
- const documentsWithoutIndex = [...documents];
- const removedItem: any =
- documentsWithoutIndex.splice(index, 1);
- setDocuments(documentsWithoutIndex);
- fetch(`/api/documents/${document.id}`, {
- method: "DELETE",
- })
- .catch((err) => {
- documentsWithoutIndex.splice(
- index,
- 0,
- removedItem
- );
- setDocuments(documentsWithoutIndex);
+ ) : (
+ ""
+ )}
+ {item.signingStatus === "SIGNED" ? (
+
+
+ {" "}
+ {item.email}
+
+
+ ) : (
+ ""
+ )}
+
+ ))}
+ {document.Recipient.length === 0 ? "-" : null}
+
+
+
+ |
+
+ {formatDocumentStatus(document.status)}
+
+
+ {document.Recipient.filter(
+ (r: any) => r.signingStatus === "SIGNED"
+ ).length || 0}
+ /{document.Recipient.length || 0}
+
+
+ |
+
+
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ router.push("/documents/" + document.id);
+ }}
+ >
+ Edit
+
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ router.push("/api/documents/" + document.id);
+ }}
+ >
+ Download
+
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ if (
+ confirm(
+ "Are you sure you want to delete this document"
+ )
+ ) {
+ const documentsWithoutIndex = [
+ ...documents,
+ ];
+ const removedItem: any =
+ documentsWithoutIndex.splice(index, 1);
+ setDocuments(documentsWithoutIndex);
+ fetch(`/api/documents/${document.id}`, {
+ method: "DELETE",
})
- .then(() => {
- getDocuments();
- });
- }
- }}
- >
- , {document.name}
-
- |
-
- ))}
+ .catch((err) => {
+ documentsWithoutIndex.splice(
+ index,
+ 0,
+ removedItem
+ );
+ setDocuments(documentsWithoutIndex);
+ })
+ .then(() => {
+ getDocuments();
+ });
+ }
+ }}
+ >
+ , {document.name}
+
+ |
+
+ )
+ )}
@@ -352,6 +429,16 @@ function formatDocumentStatus(status: DocumentStatus) {
}
}
+export async function getServerSideProps(context: NextPageContext) {
+ const filter = context.query["filter"];
+
+ return {
+ props: {
+ filter: filter,
+ },
+ };
+}
+
DocumentsPage.getLayout = function getLayout(page: ReactElement) {
return
{page};
};