From 08e5acd0b2dfc41ed31654b9d66a96deabc2eaf4 Mon Sep 17 00:00:00 2001 From: Catalin Pit Date: Fri, 26 Jun 2026 14:25:26 +0300 Subject: [PATCH] chore: improve document preference form's default settings and reset functionality --- .../forms/document-preferences-form.tsx | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/apps/remix/app/components/forms/document-preferences-form.tsx b/apps/remix/app/components/forms/document-preferences-form.tsx index ee552d043..57716cbc5 100644 --- a/apps/remix/app/components/forms/document-preferences-form.tsx +++ b/apps/remix/app/components/forms/document-preferences-form.tsx @@ -11,10 +11,10 @@ import { isValidLanguageCode, SUPPORTED_LANGUAGE_CODES, SUPPORTED_LANGUAGES } fr import { TIME_ZONES } from '@documenso/lib/constants/time-zones'; import type { TDefaultRecipients } from '@documenso/lib/types/default-recipients'; import { ZDefaultRecipientsSchema } from '@documenso/lib/types/default-recipients'; -import { type TDocumentMetaDateFormat, ZDocumentMetaTimezoneSchema } from '@documenso/lib/types/document-meta'; -import { isPersonalLayout } from '@documenso/lib/utils/organisations'; +import { type TDocumentMetaDateFormat, ZDocumentMetaDateFormatSchema } from '@documenso/lib/types/document-meta'; +import { generateDefaultOrganisationSettings, isPersonalLayout } from '@documenso/lib/utils/organisations'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; -import { extractTeamSignatureSettings } from '@documenso/lib/utils/teams'; +import { extractTeamSignatureSettings, generateDefaultTeamSettings } from '@documenso/lib/utils/teams'; import { DocumentSignatureSettingsTooltip } from '@documenso/ui/components/document/document-signature-settings-tooltip'; import { ExpirationPeriodPicker } from '@documenso/ui/components/document/expiration-period-picker'; import { ReminderSettingsPicker } from '@documenso/ui/components/document/reminder-settings-picker'; @@ -38,11 +38,11 @@ import { zodResolver } from '@hookform/resolvers/zod'; import { msg, t } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; -import type { TeamGlobalSettings } from '@prisma/client'; -import { DocumentVisibility, OrganisationType, type RecipientRole } from '@prisma/client'; +import { DocumentVisibility, OrganisationType, type RecipientRole, type TeamGlobalSettings } from '@prisma/client'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; +import { DocumentPreferencesResetDialog } from '~/components/dialogs/document-preferences-reset-dialog'; import { useOptionalCurrentTeam } from '~/providers/team'; import { DefaultRecipientsMultiSelectCombobox } from '../general/default-recipients-multiselect-combobox'; @@ -93,6 +93,26 @@ export type DocumentPreferencesFormProps = { onFormSubmit: (data: TDocumentPreferencesFormSchema) => Promise; }; +const getDocumentPreferencesFormValues = (settings: SettingsSubset): TDocumentPreferencesFormSchema => { + const parsedDocumentDateFormat = ZDocumentMetaDateFormatSchema.safeParse(settings.documentDateFormat); + + return { + documentVisibility: settings.documentVisibility, + documentLanguage: isValidLanguageCode(settings.documentLanguage) ? settings.documentLanguage : null, + documentTimezone: settings.documentTimezone, + documentDateFormat: parsedDocumentDateFormat.success ? parsedDocumentDateFormat.data : null, + includeSenderDetails: settings.includeSenderDetails, + includeSigningCertificate: settings.includeSigningCertificate, + includeAuditLog: settings.includeAuditLog, + signatureTypes: extractTeamSignatureSettings({ ...settings }), + defaultRecipients: settings.defaultRecipients ? ZDefaultRecipientsSchema.parse(settings.defaultRecipients) : null, + delegateDocumentOwnership: settings.delegateDocumentOwnership, + aiFeaturesEnabled: settings.aiFeaturesEnabled, + envelopeExpirationPeriod: settings.envelopeExpirationPeriod ?? null, + reminderSettings: settings.reminderSettings ?? null, + }; +}; + export const DocumentPreferencesForm = ({ settings, onFormSubmit, @@ -113,7 +133,7 @@ export const DocumentPreferencesForm = ({ documentVisibility: z.nativeEnum(DocumentVisibility).nullable(), documentLanguage: z.enum(SUPPORTED_LANGUAGE_CODES).nullable(), documentTimezone: z.string().nullable(), - documentDateFormat: ZDocumentMetaTimezoneSchema.nullable(), + documentDateFormat: ZDocumentMetaDateFormatSchema.nullable(), includeSenderDetails: z.boolean().nullable(), includeSigningCertificate: z.boolean().nullable(), includeAuditLog: z.boolean().nullable(), @@ -127,26 +147,27 @@ export const DocumentPreferencesForm = ({ reminderSettings: ZEnvelopeReminderSettings.nullable(), }); + const defaultValues = getDocumentPreferencesFormValues(settings); + const defaultSettings = canInherit ? generateDefaultTeamSettings() : generateDefaultOrganisationSettings(); + const baseResetValues = getDocumentPreferencesFormValues(defaultSettings); + const resetValues = { + ...baseResetValues, + aiFeaturesEnabled: isAiFeaturesConfigured ? baseResetValues.aiFeaturesEnabled : defaultValues.aiFeaturesEnabled, + }; + const form = useForm({ - defaultValues: { - documentVisibility: settings.documentVisibility, - documentLanguage: isValidLanguageCode(settings.documentLanguage) ? settings.documentLanguage : null, - documentTimezone: settings.documentTimezone, - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - documentDateFormat: settings.documentDateFormat as TDocumentMetaDateFormat | null, - includeSenderDetails: settings.includeSenderDetails, - includeSigningCertificate: settings.includeSigningCertificate, - includeAuditLog: settings.includeAuditLog, - signatureTypes: extractTeamSignatureSettings({ ...settings }), - defaultRecipients: settings.defaultRecipients ? ZDefaultRecipientsSchema.parse(settings.defaultRecipients) : null, - delegateDocumentOwnership: settings.delegateDocumentOwnership, - aiFeaturesEnabled: settings.aiFeaturesEnabled, - envelopeExpirationPeriod: settings.envelopeExpirationPeriod ?? null, - reminderSettings: settings.reminderSettings ?? null, - }, + defaultValues, resolver: zodResolver(ZDocumentPreferencesFormSchema), }); + const currentValues = form.watch(); + const isResetDisabled = !form.formState.isDirty && JSON.stringify(currentValues) === JSON.stringify(resetValues); + + const handleResetToDefaults = async () => { + await onFormSubmit(resetValues); + form.reset(resetValues); + }; + return (
@@ -760,6 +781,14 @@ export const DocumentPreferencesForm = ({ +