mirror of
https://github.com/documenso/documenso.git
synced 2026-07-11 05:25:08 +10:00
4f346d3c2d
Adds a CANCELLED envelope status that privileged members (owner or team admin/manager) can move a pending document into. Sending recipient notifications via a background job while retaining the document in the dashboard as proof of distribution. Includes a dedicated Cancelled tab, single and bulk cancel actions, the ENVELOPE_CANCELLED mutability guard, and e2e coverage for permissions and visibility.
58 lines
2.1 KiB
TypeScript
58 lines
2.1 KiB
TypeScript
import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
|
|
import { msg } from '@lingui/core/macro';
|
|
import { useLingui } from '@lingui/react';
|
|
import { Bird, CheckCircle2, XCircle } from 'lucide-react';
|
|
import { match } from 'ts-pattern';
|
|
|
|
export type DocumentsTableEmptyStateProps = { status: ExtendedDocumentStatus };
|
|
|
|
export const DocumentsTableEmptyState = ({ status }: DocumentsTableEmptyStateProps) => {
|
|
const { _ } = useLingui();
|
|
|
|
const {
|
|
title,
|
|
message,
|
|
icon: Icon,
|
|
} = match(status)
|
|
.with(ExtendedDocumentStatus.COMPLETED, () => ({
|
|
title: msg`Nothing to do`,
|
|
message: msg`There are no completed documents yet. Documents that you have created or received will appear here once completed.`,
|
|
icon: CheckCircle2,
|
|
}))
|
|
.with(ExtendedDocumentStatus.DRAFT, () => ({
|
|
title: msg`No active drafts`,
|
|
message: msg`There are no active drafts at the current moment. You can upload a document to start drafting.`,
|
|
icon: CheckCircle2,
|
|
}))
|
|
.with(ExtendedDocumentStatus.CANCELLED, () => ({
|
|
title: msg`Nothing cancelled`,
|
|
message: msg`There are no cancelled documents. Documents you cancel will remain here as a record that they were distributed.`,
|
|
icon: XCircle,
|
|
}))
|
|
.with(ExtendedDocumentStatus.ALL, () => ({
|
|
title: msg`We're all empty`,
|
|
message: msg`You have not yet created or received any documents. To create a document please upload one.`,
|
|
icon: Bird,
|
|
}))
|
|
.otherwise(() => ({
|
|
title: msg`Nothing to do`,
|
|
message: msg`All documents have been processed. Any new documents that are sent or received will show here.`,
|
|
icon: CheckCircle2,
|
|
}));
|
|
|
|
return (
|
|
<div
|
|
className="flex h-60 flex-col items-center justify-center gap-y-4 text-muted-foreground/60"
|
|
data-testid="empty-document-state"
|
|
>
|
|
<Icon className="h-12 w-12" strokeWidth={1.5} />
|
|
|
|
<div className="text-center">
|
|
<h3 className="font-semibold text-lg">{_(title)}</h3>
|
|
|
|
<p className="mt-2 max-w-[60ch]">{_(message)}</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|