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.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import { I18nProvider } from '@lingui/react';
|
||||
|
||||
import type { RenderOptions } from '@documenso/email/render';
|
||||
import { render } from '@documenso/email/render';
|
||||
|
||||
import { getI18nInstance } from '../client-only/providers/i18n.server';
|
||||
@@ -11,14 +12,13 @@ import {
|
||||
|
||||
export const renderEmailWithI18N = async (
|
||||
component: React.ReactElement,
|
||||
options?: {
|
||||
plainText?: boolean;
|
||||
options?: RenderOptions & {
|
||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
||||
lang?: SupportedLanguageCodes | (string & {});
|
||||
},
|
||||
) => {
|
||||
try {
|
||||
const providedLang = options?.lang;
|
||||
const { lang: providedLang, ...otherOptions } = options ?? {};
|
||||
|
||||
const lang = isValidLanguageCode(providedLang) ? providedLang : APP_I18N_OPTIONS.sourceLang;
|
||||
|
||||
@@ -26,9 +26,7 @@ export const renderEmailWithI18N = async (
|
||||
|
||||
i18n.activate(lang);
|
||||
|
||||
return render(<I18nProvider i18n={i18n}>{component}</I18nProvider>, {
|
||||
plainText: options?.plainText,
|
||||
});
|
||||
return render(<I18nProvider i18n={i18n}>{component}</I18nProvider>, otherOptions);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
throw new Error('Failed to render email');
|
||||
|
||||
13
packages/lib/utils/team-global-settings-to-branding.ts
Normal file
13
packages/lib/utils/team-global-settings-to-branding.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import type { TeamGlobalSettings } from '@documenso/prisma/client';
|
||||
|
||||
import { NEXT_PUBLIC_WEBAPP_URL } from '../constants/app';
|
||||
|
||||
export const teamGlobalSettingsToBranding = (teamGlobalSettings: TeamGlobalSettings) => {
|
||||
return {
|
||||
...teamGlobalSettings,
|
||||
brandingLogo:
|
||||
teamGlobalSettings.brandingEnabled && teamGlobalSettings.brandingLogo
|
||||
? `${NEXT_PUBLIC_WEBAPP_URL()}/api/branding/logo/team/${teamGlobalSettings.teamId}`
|
||||
: '',
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user