2024-11-14 21:37:42 +11:00
|
|
|
import { useMemo } from 'react';
|
|
|
|
|
2024-11-05 11:52:54 +11:00
|
|
|
import { useLingui } from '@lingui/react';
|
2025-01-02 15:33:37 +11:00
|
|
|
import { Trans } from '@lingui/react/macro';
|
2025-03-03 14:49:28 +11:00
|
|
|
import { RecipientRole } from '@prisma/client';
|
2025-01-28 15:18:12 +11:00
|
|
|
import { P, match } from 'ts-pattern';
|
2024-11-05 11:52:54 +11:00
|
|
|
|
2024-11-08 00:33:48 +09:00
|
|
|
import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles';
|
2024-02-01 18:45:02 -05:00
|
|
|
|
2023-12-02 09:38:24 +11:00
|
|
|
import { Button, Section, Text } from '../components';
|
2023-09-27 15:34:16 +10:00
|
|
|
import { TemplateDocumentImage } from './template-document-image';
|
2023-09-26 15:39:34 +10:00
|
|
|
|
2023-08-07 23:10:27 +10:00
|
|
|
export interface TemplateDocumentInviteProps {
|
|
|
|
inviterName: string;
|
|
|
|
inviterEmail: string;
|
|
|
|
documentName: string;
|
|
|
|
signDocumentLink: string;
|
|
|
|
assetBaseUrl: string;
|
2024-02-01 18:45:02 -05:00
|
|
|
role: RecipientRole;
|
2024-04-19 13:45:33 +03:00
|
|
|
selfSigner: boolean;
|
2024-08-20 05:41:19 +00:00
|
|
|
isTeamInvite: boolean;
|
|
|
|
teamName?: string;
|
feat: add global settings for teams (#1391)
## Description
This PR introduces global settings for teams. At the moment, it allows
team admins to configure the following:
* The default visibility of the documents uploaded to the team account
* Whether to include the document owner (sender) details when sending
emails to the recipients.
### Include Sender Details
If the Sender Details setting is enabled, the emails sent by the team
will include the sender's name:
> "Example User" on behalf of "Example Team" has invited you to sign
"document.pdf"
Otherwise, the email will say:
> "Example Team" has invited you to sign "document.pdf"
### Default Document Visibility
This new option allows users to set the default visibility for the
documents uploaded to the team account. It can have the following
values:
* Everyone
* Manager and above
* Admins only
If the default document visibility isn't set, the document will be set
to the role of the user who created the document:
* If a user with the "User" role creates a document, the document's
visibility is set to "Everyone".
* Manager role -> "Manager and above"
* Admin role -> "Admins only"
Otherwise, if there is a default document visibility value, it uses that
value.
#### Gotcha
To avoid issues, the `document owner` and the `recipient` can access the
document irrespective of their role. For example:
* If a team member with the role "Member" uploads a document and the
default document visibility is "Admins", only the document owner and
admins can access the document.
* Similar to the other scenarios.
* If an admin uploads a document and the default document visibility is
"Admins", the recipient can access the document.
* The admins have access to all the documents.
* Managers have access to documents with the visibility set to
"Everyone" and "Manager and above"
* Members have access only to the documents with the visibility set to
"Everyone".
## Testing Performed
Tested it locally.
2024-11-08 13:50:49 +02:00
|
|
|
includeSenderDetails?: boolean;
|
2023-08-07 23:10:27 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
export const TemplateDocumentInvite = ({
|
|
|
|
inviterName,
|
|
|
|
documentName,
|
|
|
|
signDocumentLink,
|
|
|
|
assetBaseUrl,
|
2024-02-01 18:45:02 -05:00
|
|
|
role,
|
2024-04-19 13:45:33 +03:00
|
|
|
selfSigner,
|
2024-08-20 05:41:19 +00:00
|
|
|
isTeamInvite,
|
|
|
|
teamName,
|
feat: add global settings for teams (#1391)
## Description
This PR introduces global settings for teams. At the moment, it allows
team admins to configure the following:
* The default visibility of the documents uploaded to the team account
* Whether to include the document owner (sender) details when sending
emails to the recipients.
### Include Sender Details
If the Sender Details setting is enabled, the emails sent by the team
will include the sender's name:
> "Example User" on behalf of "Example Team" has invited you to sign
"document.pdf"
Otherwise, the email will say:
> "Example Team" has invited you to sign "document.pdf"
### Default Document Visibility
This new option allows users to set the default visibility for the
documents uploaded to the team account. It can have the following
values:
* Everyone
* Manager and above
* Admins only
If the default document visibility isn't set, the document will be set
to the role of the user who created the document:
* If a user with the "User" role creates a document, the document's
visibility is set to "Everyone".
* Manager role -> "Manager and above"
* Admin role -> "Admins only"
Otherwise, if there is a default document visibility value, it uses that
value.
#### Gotcha
To avoid issues, the `document owner` and the `recipient` can access the
document irrespective of their role. For example:
* If a team member with the role "Member" uploads a document and the
default document visibility is "Admins", only the document owner and
admins can access the document.
* Similar to the other scenarios.
* If an admin uploads a document and the default document visibility is
"Admins", the recipient can access the document.
* The admins have access to all the documents.
* Managers have access to documents with the visibility set to
"Everyone" and "Manager and above"
* Members have access only to the documents with the visibility set to
"Everyone".
## Testing Performed
Tested it locally.
2024-11-08 13:50:49 +02:00
|
|
|
includeSenderDetails,
|
2023-08-07 23:10:27 +10:00
|
|
|
}: TemplateDocumentInviteProps) => {
|
2024-11-05 11:52:54 +11:00
|
|
|
const { _ } = useLingui();
|
|
|
|
|
2024-11-08 00:33:48 +09:00
|
|
|
const { actionVerb } = RECIPIENT_ROLES_DESCRIPTION[role];
|
2024-02-01 18:45:02 -05:00
|
|
|
|
2024-11-14 21:37:42 +11:00
|
|
|
const rejectDocumentLink = useMemo(() => {
|
|
|
|
const url = new URL(signDocumentLink);
|
|
|
|
url.searchParams.set('reject', 'true');
|
|
|
|
return url.toString();
|
2025-01-28 15:18:12 +11:00
|
|
|
}, [signDocumentLink]);
|
2024-11-14 21:37:42 +11:00
|
|
|
|
2023-08-07 23:10:27 +10:00
|
|
|
return (
|
2023-12-02 09:38:24 +11:00
|
|
|
<>
|
2023-09-26 15:39:34 +10:00
|
|
|
<TemplateDocumentImage className="mt-6" assetBaseUrl={assetBaseUrl} />
|
2023-09-22 12:27:54 +00:00
|
|
|
|
|
|
|
<Section>
|
2023-08-07 23:10:27 +10:00
|
|
|
<Text className="text-primary mx-auto mb-0 max-w-[80%] text-center text-lg font-semibold">
|
2025-01-28 15:18:12 +11:00
|
|
|
{match({ selfSigner, isTeamInvite, includeSenderDetails, teamName })
|
|
|
|
.with({ selfSigner: true }, () => (
|
|
|
|
<Trans>
|
|
|
|
Please {_(actionVerb).toLowerCase()} your document
|
|
|
|
<br />"{documentName}"
|
|
|
|
</Trans>
|
|
|
|
))
|
|
|
|
.with({ isTeamInvite: true, includeSenderDetails: true, teamName: P.string }, () => (
|
|
|
|
<Trans>
|
|
|
|
{inviterName} on behalf of "{teamName}" has invited you to{' '}
|
|
|
|
{_(actionVerb).toLowerCase()}
|
|
|
|
<br />"{documentName}"
|
|
|
|
</Trans>
|
|
|
|
))
|
|
|
|
.with({ isTeamInvite: true, teamName: P.string }, () => (
|
|
|
|
<Trans>
|
|
|
|
{teamName} has invited you to {_(actionVerb).toLowerCase()}
|
|
|
|
<br />"{documentName}"
|
|
|
|
</Trans>
|
|
|
|
))
|
|
|
|
.otherwise(() => (
|
|
|
|
<Trans>
|
|
|
|
{inviterName} has invited you to {_(actionVerb).toLowerCase()}
|
|
|
|
<br />"{documentName}"
|
|
|
|
</Trans>
|
|
|
|
))}
|
2023-08-07 23:10:27 +10:00
|
|
|
</Text>
|
|
|
|
|
|
|
|
<Text className="my-1 text-center text-base text-slate-400">
|
2024-11-08 00:33:48 +09:00
|
|
|
{match(role)
|
|
|
|
.with(RecipientRole.SIGNER, () => <Trans>Continue by signing the document.</Trans>)
|
|
|
|
.with(RecipientRole.VIEWER, () => <Trans>Continue by viewing the document.</Trans>)
|
|
|
|
.with(RecipientRole.APPROVER, () => <Trans>Continue by approving the document.</Trans>)
|
|
|
|
.with(RecipientRole.CC, () => '')
|
2025-02-01 03:31:18 +00:00
|
|
|
.with(RecipientRole.ASSISTANT, () => (
|
|
|
|
<Trans>Continue by assisting with the document.</Trans>
|
|
|
|
))
|
2024-11-08 00:33:48 +09:00
|
|
|
.exhaustive()}
|
2023-08-07 23:10:27 +10:00
|
|
|
</Text>
|
|
|
|
|
|
|
|
<Section className="mb-6 mt-8 text-center">
|
2024-11-14 21:37:42 +11:00
|
|
|
<Button
|
|
|
|
className="mr-4 inline-flex items-center justify-center rounded-lg bg-red-500 px-6 py-3 text-center text-sm font-medium text-black no-underline"
|
|
|
|
href={rejectDocumentLink}
|
|
|
|
>
|
|
|
|
<Trans>Reject Document</Trans>
|
|
|
|
</Button>
|
|
|
|
|
2023-08-07 23:10:27 +10:00
|
|
|
<Button
|
|
|
|
className="bg-documenso-500 inline-flex items-center justify-center rounded-lg px-6 py-3 text-center text-sm font-medium text-black no-underline"
|
|
|
|
href={signDocumentLink}
|
|
|
|
>
|
2024-11-08 00:33:48 +09:00
|
|
|
{match(role)
|
|
|
|
.with(RecipientRole.SIGNER, () => <Trans>Sign Document</Trans>)
|
|
|
|
.with(RecipientRole.VIEWER, () => <Trans>View Document</Trans>)
|
|
|
|
.with(RecipientRole.APPROVER, () => <Trans>Approve Document</Trans>)
|
|
|
|
.with(RecipientRole.CC, () => '')
|
2025-02-01 03:31:18 +00:00
|
|
|
.with(RecipientRole.ASSISTANT, () => <Trans>Assist Document</Trans>)
|
2024-11-08 00:33:48 +09:00
|
|
|
.exhaustive()}
|
2023-08-07 23:10:27 +10:00
|
|
|
</Button>
|
|
|
|
</Section>
|
|
|
|
</Section>
|
2023-12-02 09:38:24 +11:00
|
|
|
</>
|
2023-08-07 23:10:27 +10:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default TemplateDocumentInvite;
|